Repository: foone/3DMMForever Branch: main Commit: a8a408510f87 Files: 3693 Total size: 82.7 MB Directory structure: gitextract_i4l4y5ip/ ├── .clang-format ├── .gitattributes ├── .github/ │ └── workflows/ │ ├── build.yml │ └── clang-format-check.yml ├── .gitignore ├── .notes/ │ └── removed_files.txt ├── .vscode/ │ └── settings.json ├── CMakeLists.txt ├── CMakePresets.json ├── CODE_OF_CONDUCT.md ├── Dockerfile ├── FILETREE.TXT ├── FONTS.md ├── LICENSE ├── NEWTRD.TXT ├── README.md ├── SUPPORT.md ├── TRD.TXT ├── audioman/ │ └── audioman.cpp ├── bren/ │ ├── brenfun.cpp │ ├── bwld.cpp │ ├── inc/ │ │ ├── actor.h │ │ ├── angles.h │ │ ├── animate.h │ │ ├── blockops.h │ │ ├── brassert.h │ │ ├── brdiag.h │ │ ├── bren.h │ │ ├── brender.h │ │ ├── brerr.h │ │ ├── brfile.h │ │ ├── brfont.h │ │ ├── brhton.h │ │ ├── brlimits.h │ │ ├── brmem.h │ │ ├── bwld.h │ │ ├── camera.h │ │ ├── colour.h │ │ ├── compiler.h │ │ ├── custsupt.h │ │ ├── fixed.h │ │ ├── fmt.h │ │ ├── fmtproto.h │ │ ├── fwpextra.h │ │ ├── fwproto.h │ │ ├── g386ifix.h │ │ ├── hton.h │ │ ├── light.h │ │ ├── material.h │ │ ├── matrix.h │ │ ├── model.h │ │ ├── mscifix.h │ │ ├── pixelmap.h │ │ ├── pool.h │ │ ├── position.h │ │ ├── qhton.h │ │ ├── quantize.h │ │ ├── quat.h │ │ ├── scalar.h │ │ ├── scale.h │ │ ├── tmap.h │ │ ├── transfrm.h │ │ ├── traverse.h │ │ ├── vecfns.h │ │ ├── vector.h │ │ ├── wtcifix.h │ │ ├── zbmp.h │ │ └── zbproto.h │ ├── makefile │ ├── material.cpp │ ├── stderr.c │ ├── stdfile.c │ ├── stdmem.c │ ├── tmap.cpp │ └── zbmp.cpp ├── cmake/ │ ├── ExtractVersion.cmake │ ├── FindAudioMan.cmake │ ├── FindBRender.cmake │ ├── FindCCache.cmake │ ├── FindClangTidy.cmake │ └── TargetChompSources.cmake ├── content-files/ │ ├── 3dmovie.ms │ ├── actor.3th │ ├── actresl.3th │ ├── bkgds.3cn │ ├── bkgds.3th │ ├── makefile │ ├── mtrl.3th │ ├── mtrls.3cn │ ├── prop.3th │ ├── snds.3cn │ ├── sound.3th │ ├── tbox.3th │ ├── tdfs.3cn │ └── tmpls.3cn ├── docker-compose.yaml ├── elib/ │ ├── wind/ │ │ ├── brfmmxr.lib │ │ ├── brfwmxr.lib │ │ └── brzbmxr.lib │ └── wins/ │ ├── brfmmxr.lib │ ├── brfwmxr.lib │ └── brzbmxr.lib ├── inc/ │ ├── actor.h │ ├── ape.h │ ├── assert.chh │ ├── balloons.chh │ ├── biopage.chh │ ├── bkgd.h │ ├── body.h │ ├── browser.h │ ├── buildgob.h │ ├── esl.h │ ├── helpbook.h │ ├── helpres.h │ ├── helptops.h │ ├── kidgs.chh │ ├── kidgsdef.h │ ├── kidsanim.h │ ├── modl.h │ ├── movie.h │ ├── msnd.h │ ├── mtrl.h │ ├── popup.h │ ├── portf.h │ ├── pos3.chh │ ├── projmain.h │ ├── scene.h │ ├── scnsort.h │ ├── sharedef.h │ ├── sharutil.chh │ ├── sitobren.h │ ├── soc.h │ ├── socdef.h │ ├── socdefn.h │ ├── socres.h │ ├── socutil.h │ ├── splot.h │ ├── srec.h │ ├── stdiodef.h │ ├── stdiopos.chh │ ├── stdioscb.h │ ├── studio.h │ ├── tagl.h │ ├── tagman.h │ ├── tatr.h │ ├── tbox.h │ ├── tdf.h │ ├── tdfmake.h │ ├── tdt.h │ ├── tgob.h │ ├── tmpl.h │ ├── utest.h │ ├── utestres.h │ └── version.h ├── kauai/ │ ├── doc/ │ │ ├── chomp.doc │ │ ├── chunk.txt │ │ ├── file.txt │ │ ├── glossary.txt │ │ ├── groups.txt │ │ ├── kauai.doc │ │ └── mem.txt │ ├── elib/ │ │ ├── wind/ │ │ │ └── audiod.lib │ │ ├── wins/ │ │ │ └── audios.lib │ │ ├── winud/ │ │ │ └── audiod.lib │ │ └── winus/ │ │ └── audios.lib │ ├── makefile │ ├── makefile.def │ ├── makefile.kmk │ ├── makefile.rul │ ├── src/ │ │ ├── appb.cpp │ │ ├── appb.h │ │ ├── appbmac.cpp │ │ ├── appbwin.cpp │ │ ├── audioman.h │ │ ├── base.cpp │ │ ├── base.h │ │ ├── chcm.cpp │ │ ├── chcm.h │ │ ├── chse.cpp │ │ ├── chse.h │ │ ├── chtrans.h │ │ ├── chunk.cpp │ │ ├── chunk.h │ │ ├── clip.cpp │ │ ├── clip.h │ │ ├── clok.cpp │ │ ├── clok.h │ │ ├── cmd.cpp │ │ ├── cmd.h │ │ ├── codec.cpp │ │ ├── codec.h │ │ ├── codkauai.cpp │ │ ├── codkpri.h │ │ ├── crf.cpp │ │ ├── crf.h │ │ ├── csapi.h │ │ ├── ctl.cpp │ │ ├── ctl.h │ │ ├── cursor.cpp │ │ ├── cursor.h │ │ ├── debug.h │ │ ├── dlg.cpp │ │ ├── dlg.h │ │ ├── dlgmac.cpp │ │ ├── dlgwin.cpp │ │ ├── docb.cpp │ │ ├── docb.h │ │ ├── file.cpp │ │ ├── file.h │ │ ├── filemac.cpp │ │ ├── filewin.cpp │ │ ├── fni.h │ │ ├── fnimac.cpp │ │ ├── fniwin.cpp │ │ ├── frame.h │ │ ├── frame.rc │ │ ├── framedef.h │ │ ├── frameres.h │ │ ├── ft.cpp │ │ ├── ft.rc │ │ ├── ftres.h │ │ ├── gfx.cpp │ │ ├── gfx.h │ │ ├── gfxmac.cpp │ │ ├── gfxwin.cpp │ │ ├── gob.cpp │ │ ├── gob.h │ │ ├── gobmac.cpp │ │ ├── gobwin.cpp │ │ ├── groups.cpp │ │ ├── groups.h │ │ ├── groups2.cpp │ │ ├── kcd2_386.c │ │ ├── kcdc_386.c │ │ ├── keys.h │ │ ├── kiddef.h │ │ ├── kidframe.h │ │ ├── kidhelp.cpp │ │ ├── kidhelp.h │ │ ├── kidspace.cpp │ │ ├── kidspace.h │ │ ├── kidworld.cpp │ │ ├── kidworld.h │ │ ├── lex.cpp │ │ ├── lex.h │ │ ├── mac.h │ │ ├── makefile │ │ ├── mbmp.cpp │ │ ├── mbmp.h │ │ ├── mbmpgui.cpp │ │ ├── mdev2pri.h │ │ ├── memmac.cpp │ │ ├── memwin.cpp │ │ ├── menu.h │ │ ├── menumac.cpp │ │ ├── menuwin.cpp │ │ ├── midi.cpp │ │ ├── midi.h │ │ ├── mididev.cpp │ │ ├── mididev.h │ │ ├── mididev2.cpp │ │ ├── mididev2.h │ │ ├── mssio.cpp │ │ ├── mssio.h │ │ ├── pic.cpp │ │ ├── pic.h │ │ ├── picmac.cpp │ │ ├── picwin.cpp │ │ ├── region.cpp │ │ ├── region.h │ │ ├── rtxt.cpp │ │ ├── rtxt.h │ │ ├── rtxt2.cpp │ │ ├── scrcom.cpp │ │ ├── scrcom.h │ │ ├── scrcomg.cpp │ │ ├── scrcomg.h │ │ ├── screxe.cpp │ │ ├── screxe.h │ │ ├── screxeg.cpp │ │ ├── screxeg.h │ │ ├── sndam.cpp │ │ ├── sndam.h │ │ ├── sndampri.h │ │ ├── sndm.cpp │ │ ├── sndm.h │ │ ├── spell.cpp │ │ ├── spell.h │ │ ├── stream.cpp │ │ ├── stream.h │ │ ├── stub.cpp │ │ ├── test.cpp │ │ ├── text.cpp │ │ ├── text.h │ │ ├── textdoc.cpp │ │ ├── textdoc.h │ │ ├── ut.cpp │ │ ├── util.cpp │ │ ├── util.h │ │ ├── utilcopy.cpp │ │ ├── utilcopy.h │ │ ├── utilerro.cpp │ │ ├── utilerro.h │ │ ├── utilglob.cpp │ │ ├── utilglob.h │ │ ├── utilint.cpp │ │ ├── utilint.h │ │ ├── utilmc.asm │ │ ├── utilmem.cpp │ │ ├── utilmem.h │ │ ├── utilrnd.cpp │ │ ├── utilrnd.h │ │ ├── utilstr.cpp │ │ ├── utilstr.h │ │ ├── video.cpp │ │ └── video.h │ └── tools/ │ ├── chdoc.cpp │ ├── chdoc.h │ ├── ched.cpp │ ├── ched.h │ ├── ched.rc │ ├── chedres.h │ ├── chelp.cpp │ ├── chelp.h │ ├── chelp.rc │ ├── chelpdmp.cpp │ ├── chelpexp.cpp │ ├── chelpexp.h │ ├── chelpres.h │ ├── chgrp.cpp │ ├── chhex.cpp │ ├── chmbmp.cpp │ ├── chmerge.cpp │ ├── chomp.cpp │ ├── chomp.h │ ├── chpic.cpp │ ├── chtop.cpp │ ├── chtxt.cpp │ ├── kpack.cpp │ ├── makefile │ └── mkmbmp.cpp ├── makefile ├── makefile.kmk ├── makefile.rul ├── setvars.bat ├── src/ │ ├── building/ │ │ ├── backstag.cht │ │ ├── bkshdw.seq │ │ ├── bkstgbag.seq │ │ ├── bldghd.cht │ │ ├── building.cht │ │ ├── cursors.cht │ │ ├── entstate.txt │ │ ├── iddoor.seq │ │ ├── imagin.cht │ │ ├── inspirat.cht │ │ ├── lobby.cht │ │ ├── login.cht │ │ ├── makefile │ │ ├── melproj1.seq │ │ ├── music.cht │ │ ├── mzbkstag.seq │ │ ├── mzbkstg.seq │ │ ├── mzinsp.seq │ │ ├── mzlobby.seq │ │ ├── mzpack.seq │ │ ├── mzroller.seq │ │ ├── mzstudio.seq │ │ ├── mzthea.seq │ │ ├── mzthea4.seq │ │ ├── navbars.cht │ │ ├── palette.cht │ │ ├── pbm/ │ │ │ ├── backstag/ │ │ │ │ ├── backstg1.pbm │ │ │ │ ├── backstg2.pbm │ │ │ │ ├── bag1.pbm │ │ │ │ ├── bag10.pbm │ │ │ │ ├── bag11.pbm │ │ │ │ ├── bag12.pbm │ │ │ │ ├── bag13.pbm │ │ │ │ ├── bag14.pbm │ │ │ │ ├── bag15.pbm │ │ │ │ ├── bag16.pbm │ │ │ │ ├── bag17.pbm │ │ │ │ ├── bag18.pbm │ │ │ │ ├── bag19.pbm │ │ │ │ ├── bag2.pbm │ │ │ │ ├── bag20.pbm │ │ │ │ ├── bag3.pbm │ │ │ │ ├── bag4.pbm │ │ │ │ ├── bag5.pbm │ │ │ │ ├── bag6.pbm │ │ │ │ ├── bag7.pbm │ │ │ │ ├── bag8.pbm │ │ │ │ ├── bag9.pbm │ │ │ │ ├── bk1insp.pbm │ │ │ │ ├── bk1proj.pbm │ │ │ │ ├── bk1stud.pbm │ │ │ │ ├── bk2ltdr1.pbm │ │ │ │ ├── bk2ltdr2.pbm │ │ │ │ ├── bk2map.pbm │ │ │ │ ├── bk2quit.pbm │ │ │ │ ├── bk2rtdr1.pbm │ │ │ │ ├── bk2rtdr2.pbm │ │ │ │ ├── door47.pbm │ │ │ │ ├── door48.pbm │ │ │ │ ├── door49.pbm │ │ │ │ ├── door50.pbm │ │ │ │ ├── door51.pbm │ │ │ │ ├── door52.pbm │ │ │ │ ├── door53.pbm │ │ │ │ ├── door54.pbm │ │ │ │ ├── door55.pbm │ │ │ │ ├── door56.pbm │ │ │ │ ├── door57.pbm │ │ │ │ ├── door58.pbm │ │ │ │ ├── door59.pbm │ │ │ │ ├── door60.pbm │ │ │ │ ├── door61.pbm │ │ │ │ ├── door62.pbm │ │ │ │ ├── door63.pbm │ │ │ │ ├── door64.pbm │ │ │ │ ├── evcell1.pbm │ │ │ │ ├── evcell10.pbm │ │ │ │ ├── evcell11.pbm │ │ │ │ ├── evcell12.pbm │ │ │ │ ├── evcell2.pbm │ │ │ │ ├── evcell3.pbm │ │ │ │ ├── evcell4.pbm │ │ │ │ ├── evcell5.pbm │ │ │ │ ├── evcell6.pbm │ │ │ │ ├── evcell7.pbm │ │ │ │ ├── evcell8.pbm │ │ │ │ ├── evcell9.pbm │ │ │ │ ├── gopmz1.pbm │ │ │ │ ├── gopmz10.pbm │ │ │ │ ├── gopmz11.pbm │ │ │ │ ├── gopmz12.pbm │ │ │ │ ├── gopmz13.pbm │ │ │ │ ├── gopmz14.pbm │ │ │ │ ├── gopmz15.pbm │ │ │ │ ├── gopmz16.pbm │ │ │ │ ├── gopmz17.pbm │ │ │ │ ├── gopmz18.pbm │ │ │ │ ├── gopmz19.pbm │ │ │ │ ├── gopmz2.pbm │ │ │ │ ├── gopmz20.pbm │ │ │ │ ├── gopmz21.pbm │ │ │ │ ├── gopmz22.pbm │ │ │ │ ├── gopmz23.pbm │ │ │ │ ├── gopmz24.pbm │ │ │ │ ├── gopmz25.pbm │ │ │ │ ├── gopmz26.pbm │ │ │ │ ├── gopmz27.pbm │ │ │ │ ├── gopmz28.pbm │ │ │ │ ├── gopmz29.pbm │ │ │ │ ├── gopmz3.pbm │ │ │ │ ├── gopmz30.pbm │ │ │ │ ├── gopmz31.pbm │ │ │ │ ├── gopmz32.pbm │ │ │ │ ├── gopmz33.pbm │ │ │ │ ├── gopmz34.pbm │ │ │ │ ├── gopmz35.pbm │ │ │ │ ├── gopmz36.pbm │ │ │ │ ├── gopmz37.pbm │ │ │ │ ├── gopmz38.pbm │ │ │ │ ├── gopmz39.pbm │ │ │ │ ├── gopmz4.pbm │ │ │ │ ├── gopmz40.pbm │ │ │ │ ├── gopmz41.pbm │ │ │ │ ├── gopmz42.pbm │ │ │ │ ├── gopmz43.pbm │ │ │ │ ├── gopmz44.pbm │ │ │ │ ├── gopmz45.pbm │ │ │ │ ├── gopmz46.pbm │ │ │ │ ├── gopmz47.pbm │ │ │ │ ├── gopmz48.pbm │ │ │ │ ├── gopmz49.pbm │ │ │ │ ├── gopmz5.pbm │ │ │ │ ├── gopmz50.pbm │ │ │ │ ├── gopmz51.pbm │ │ │ │ ├── gopmz52.pbm │ │ │ │ ├── gopmz53.pbm │ │ │ │ ├── gopmz54.pbm │ │ │ │ ├── gopmz55.pbm │ │ │ │ ├── gopmz56.pbm │ │ │ │ ├── gopmz57.pbm │ │ │ │ ├── gopmz58.pbm │ │ │ │ ├── gopmz59.pbm │ │ │ │ ├── gopmz6.pbm │ │ │ │ ├── gopmz60.pbm │ │ │ │ ├── gopmz61.pbm │ │ │ │ ├── gopmz62.pbm │ │ │ │ ├── gopmz63.pbm │ │ │ │ ├── gopmz64.pbm │ │ │ │ ├── gopmz65.pbm │ │ │ │ ├── gopmz66.pbm │ │ │ │ ├── gopmz67.pbm │ │ │ │ ├── gopmz68.pbm │ │ │ │ ├── gopmz69.pbm │ │ │ │ ├── gopmz7.pbm │ │ │ │ ├── gopmz70.pbm │ │ │ │ ├── gopmz71.pbm │ │ │ │ ├── gopmz72.pbm │ │ │ │ ├── gopmz73.pbm │ │ │ │ ├── gopmz74.pbm │ │ │ │ ├── gopmz8.pbm │ │ │ │ ├── gopmz9.pbm │ │ │ │ ├── gostu1.pbm │ │ │ │ ├── gostu10.pbm │ │ │ │ ├── gostu11.pbm │ │ │ │ ├── gostu12.pbm │ │ │ │ ├── gostu13.pbm │ │ │ │ ├── gostu14.pbm │ │ │ │ ├── gostu15.pbm │ │ │ │ ├── gostu16.pbm │ │ │ │ ├── gostu17.pbm │ │ │ │ ├── gostu18.pbm │ │ │ │ ├── gostu19.pbm │ │ │ │ ├── gostu2.pbm │ │ │ │ ├── gostu20.pbm │ │ │ │ ├── gostu21.pbm │ │ │ │ ├── gostu22.pbm │ │ │ │ ├── gostu23.pbm │ │ │ │ ├── gostu24.pbm │ │ │ │ ├── gostu25.pbm │ │ │ │ ├── gostu26.pbm │ │ │ │ ├── gostu27.pbm │ │ │ │ ├── gostu28.pbm │ │ │ │ ├── gostu29.pbm │ │ │ │ ├── gostu3.pbm │ │ │ │ ├── gostu30.pbm │ │ │ │ ├── gostu31.pbm │ │ │ │ ├── gostu32.pbm │ │ │ │ ├── gostu33.pbm │ │ │ │ ├── gostu34.pbm │ │ │ │ ├── gostu35.pbm │ │ │ │ ├── gostu36.pbm │ │ │ │ ├── gostu37.pbm │ │ │ │ ├── gostu38.pbm │ │ │ │ ├── gostu39.pbm │ │ │ │ ├── gostu4.pbm │ │ │ │ ├── gostu40.pbm │ │ │ │ ├── gostu41.pbm │ │ │ │ ├── gostu42.pbm │ │ │ │ ├── gostu43.pbm │ │ │ │ ├── gostu44.pbm │ │ │ │ ├── gostu45.pbm │ │ │ │ ├── gostu46.pbm │ │ │ │ ├── gostu47.pbm │ │ │ │ ├── gostu48.pbm │ │ │ │ ├── gostu49.pbm │ │ │ │ ├── gostu5.pbm │ │ │ │ ├── gostu50.pbm │ │ │ │ ├── gostu51.pbm │ │ │ │ ├── gostu52.pbm │ │ │ │ ├── gostu53.pbm │ │ │ │ ├── gostu54.pbm │ │ │ │ ├── gostu55.pbm │ │ │ │ ├── gostu56.pbm │ │ │ │ ├── gostu57.pbm │ │ │ │ ├── gostu58.pbm │ │ │ │ ├── gostu59.pbm │ │ │ │ ├── gostu6.pbm │ │ │ │ ├── gostu60.pbm │ │ │ │ ├── gostu61.pbm │ │ │ │ ├── gostu62.pbm │ │ │ │ ├── gostu63.pbm │ │ │ │ ├── gostu64.pbm │ │ │ │ ├── gostu65.pbm │ │ │ │ ├── gostu66.pbm │ │ │ │ ├── gostu67.pbm │ │ │ │ ├── gostu68.pbm │ │ │ │ ├── gostu69.pbm │ │ │ │ ├── gostu7.pbm │ │ │ │ ├── gostu8.pbm │ │ │ │ ├── gostu9.pbm │ │ │ │ ├── idmz1.pbm │ │ │ │ ├── idmz10.pbm │ │ │ │ ├── idmz11.pbm │ │ │ │ ├── idmz12.pbm │ │ │ │ ├── idmz13.pbm │ │ │ │ ├── idmz14.pbm │ │ │ │ ├── idmz15.pbm │ │ │ │ ├── idmz16.pbm │ │ │ │ ├── idmz17.pbm │ │ │ │ ├── idmz18.pbm │ │ │ │ ├── idmz19.pbm │ │ │ │ ├── idmz2.pbm │ │ │ │ ├── idmz20.pbm │ │ │ │ ├── idmz21.pbm │ │ │ │ ├── idmz22.pbm │ │ │ │ ├── idmz23.pbm │ │ │ │ ├── idmz24.pbm │ │ │ │ ├── idmz25.pbm │ │ │ │ ├── idmz26.pbm │ │ │ │ ├── idmz27.pbm │ │ │ │ ├── idmz28.pbm │ │ │ │ ├── idmz29.pbm │ │ │ │ ├── idmz3.pbm │ │ │ │ ├── idmz30.pbm │ │ │ │ ├── idmz31.pbm │ │ │ │ ├── idmz32.pbm │ │ │ │ ├── idmz33.pbm │ │ │ │ ├── idmz34.pbm │ │ │ │ ├── idmz35.pbm │ │ │ │ ├── idmz36.pbm │ │ │ │ ├── idmz37.pbm │ │ │ │ ├── idmz38.pbm │ │ │ │ ├── idmz39.pbm │ │ │ │ ├── idmz4.pbm │ │ │ │ ├── idmz40.pbm │ │ │ │ ├── idmz41.pbm │ │ │ │ ├── idmz42.pbm │ │ │ │ ├── idmz43.pbm │ │ │ │ ├── idmz44.pbm │ │ │ │ ├── idmz45.pbm │ │ │ │ ├── idmz46.pbm │ │ │ │ ├── idmz47.pbm │ │ │ │ ├── idmz48.pbm │ │ │ │ ├── idmz49.pbm │ │ │ │ ├── idmz5.pbm │ │ │ │ ├── idmz50.pbm │ │ │ │ ├── idmz51.pbm │ │ │ │ ├── idmz52.pbm │ │ │ │ ├── idmz53.pbm │ │ │ │ ├── idmz54.pbm │ │ │ │ ├── idmz55.pbm │ │ │ │ ├── idmz56.pbm │ │ │ │ ├── idmz57.pbm │ │ │ │ ├── idmz58.pbm │ │ │ │ ├── idmz59.pbm │ │ │ │ ├── idmz6.pbm │ │ │ │ ├── idmz60.pbm │ │ │ │ ├── idmz61.pbm │ │ │ │ ├── idmz62.pbm │ │ │ │ ├── idmz63.pbm │ │ │ │ ├── idmz64.pbm │ │ │ │ ├── idmz65.pbm │ │ │ │ ├── idmz66.pbm │ │ │ │ ├── idmz67.pbm │ │ │ │ ├── idmz68.pbm │ │ │ │ ├── idmz69.pbm │ │ │ │ ├── idmz7.pbm │ │ │ │ ├── idmz8.pbm │ │ │ │ ├── idmz9.pbm │ │ │ │ ├── lpcell1.pbm │ │ │ │ ├── lpcell10.pbm │ │ │ │ ├── lpcell11.pbm │ │ │ │ ├── lpcell12.pbm │ │ │ │ ├── lpcell2.pbm │ │ │ │ ├── lpcell3.pbm │ │ │ │ ├── lpcell4.pbm │ │ │ │ ├── lpcell5.pbm │ │ │ │ ├── lpcell6.pbm │ │ │ │ ├── lpcell7.pbm │ │ │ │ ├── lpcell8.pbm │ │ │ │ ├── lpcell9.pbm │ │ │ │ ├── pdoor54.pbm │ │ │ │ ├── pdoor55.pbm │ │ │ │ ├── pdoor56.pbm │ │ │ │ ├── pdoor57.pbm │ │ │ │ ├── pdoor58.pbm │ │ │ │ ├── pdoor59.pbm │ │ │ │ ├── pdoor60.pbm │ │ │ │ ├── pdoor61.pbm │ │ │ │ ├── pdoor62.pbm │ │ │ │ ├── pdoor63.pbm │ │ │ │ ├── pdoor64.pbm │ │ │ │ ├── pdoor65.pbm │ │ │ │ ├── pdoor66.pbm │ │ │ │ ├── pdoor67.pbm │ │ │ │ ├── pdoor68.pbm │ │ │ │ ├── pdoor69.pbm │ │ │ │ ├── sdoor49.pbm │ │ │ │ ├── sdoor50.pbm │ │ │ │ ├── sdoor51.pbm │ │ │ │ ├── sdoor52.pbm │ │ │ │ ├── sdoor53.pbm │ │ │ │ ├── sdoor54.pbm │ │ │ │ ├── sdoor55.pbm │ │ │ │ ├── sdoor56.pbm │ │ │ │ ├── sdoor57.pbm │ │ │ │ ├── sdoor58.pbm │ │ │ │ ├── sdoor59.pbm │ │ │ │ ├── sdoor60.pbm │ │ │ │ ├── sdoor61.pbm │ │ │ │ ├── sdoor62.pbm │ │ │ │ ├── sdoor63.pbm │ │ │ │ ├── sdoor64.pbm │ │ │ │ ├── shdw1.pbm │ │ │ │ ├── shdw10.pbm │ │ │ │ ├── shdw11.pbm │ │ │ │ ├── shdw12.pbm │ │ │ │ ├── shdw13.pbm │ │ │ │ ├── shdw14.pbm │ │ │ │ ├── shdw15.pbm │ │ │ │ ├── shdw16.pbm │ │ │ │ ├── shdw17.pbm │ │ │ │ ├── shdw18.pbm │ │ │ │ ├── shdw19.pbm │ │ │ │ ├── shdw2.pbm │ │ │ │ ├── shdw20.pbm │ │ │ │ ├── shdw21.pbm │ │ │ │ ├── shdw22.pbm │ │ │ │ ├── shdw23.pbm │ │ │ │ ├── shdw24.pbm │ │ │ │ ├── shdw25.pbm │ │ │ │ ├── shdw26.pbm │ │ │ │ ├── shdw27.pbm │ │ │ │ ├── shdw28.pbm │ │ │ │ ├── shdw29.pbm │ │ │ │ ├── shdw3.pbm │ │ │ │ ├── shdw30.pbm │ │ │ │ ├── shdw31.pbm │ │ │ │ ├── shdw32.pbm │ │ │ │ ├── shdw33.pbm │ │ │ │ ├── shdw34.pbm │ │ │ │ ├── shdw4.pbm │ │ │ │ ├── shdw5.pbm │ │ │ │ ├── shdw6.pbm │ │ │ │ ├── shdw7.pbm │ │ │ │ ├── shdw8.pbm │ │ │ │ ├── shdw9.pbm │ │ │ │ ├── speak1.pbm │ │ │ │ ├── speak10.pbm │ │ │ │ ├── speak11.pbm │ │ │ │ ├── speak12.pbm │ │ │ │ ├── speak13.pbm │ │ │ │ ├── speak14.pbm │ │ │ │ ├── speak15.pbm │ │ │ │ ├── speak16.pbm │ │ │ │ ├── speak17.pbm │ │ │ │ ├── speak18.pbm │ │ │ │ ├── speak19.pbm │ │ │ │ ├── speak2.pbm │ │ │ │ ├── speak20.pbm │ │ │ │ ├── speak3.pbm │ │ │ │ ├── speak4.pbm │ │ │ │ ├── speak5.pbm │ │ │ │ ├── speak6.pbm │ │ │ │ ├── speak7.pbm │ │ │ │ ├── speak8.pbm │ │ │ │ ├── speak9.pbm │ │ │ │ ├── tbth5_1.pbm │ │ │ │ ├── tbth5_10.pbm │ │ │ │ ├── tbth5_11.pbm │ │ │ │ ├── tbth5_12.pbm │ │ │ │ ├── tbth5_13.pbm │ │ │ │ ├── tbth5_14.pbm │ │ │ │ ├── tbth5_15.pbm │ │ │ │ ├── tbth5_16.pbm │ │ │ │ ├── tbth5_17.pbm │ │ │ │ ├── tbth5_18.pbm │ │ │ │ ├── tbth5_19.pbm │ │ │ │ ├── tbth5_2.pbm │ │ │ │ ├── tbth5_20.pbm │ │ │ │ ├── tbth5_3.pbm │ │ │ │ ├── tbth5_4.pbm │ │ │ │ ├── tbth5_5.pbm │ │ │ │ ├── tbth5_6.pbm │ │ │ │ ├── tbth5_7.pbm │ │ │ │ ├── tbth5_8.pbm │ │ │ │ ├── tbth5_9.pbm │ │ │ │ ├── tbth6_1.pbm │ │ │ │ ├── tbth6_10.pbm │ │ │ │ ├── tbth6_11.pbm │ │ │ │ ├── tbth6_12.pbm │ │ │ │ ├── tbth6_13.pbm │ │ │ │ ├── tbth6_14.pbm │ │ │ │ ├── tbth6_15.pbm │ │ │ │ ├── tbth6_16.pbm │ │ │ │ ├── tbth6_17.pbm │ │ │ │ ├── tbth6_18.pbm │ │ │ │ ├── tbth6_19.pbm │ │ │ │ ├── tbth6_2.pbm │ │ │ │ ├── tbth6_20.pbm │ │ │ │ ├── tbth6_21.pbm │ │ │ │ ├── tbth6_22.pbm │ │ │ │ ├── tbth6_23.pbm │ │ │ │ ├── tbth6_24.pbm │ │ │ │ ├── tbth6_25.pbm │ │ │ │ ├── tbth6_26.pbm │ │ │ │ ├── tbth6_27.pbm │ │ │ │ ├── tbth6_28.pbm │ │ │ │ ├── tbth6_29.pbm │ │ │ │ ├── tbth6_3.pbm │ │ │ │ ├── tbth6_30.pbm │ │ │ │ ├── tbth6_31.pbm │ │ │ │ ├── tbth6_32.pbm │ │ │ │ ├── tbth6_33.pbm │ │ │ │ ├── tbth6_34.pbm │ │ │ │ ├── tbth6_4.pbm │ │ │ │ ├── tbth6_5.pbm │ │ │ │ ├── tbth6_6.pbm │ │ │ │ ├── tbth6_7.pbm │ │ │ │ ├── tbth6_8.pbm │ │ │ │ └── tbth6_9.pbm │ │ │ ├── help/ │ │ │ │ ├── balln1.pbm │ │ │ │ ├── balln1b.pbm │ │ │ │ ├── balln1c.pbm │ │ │ │ ├── balln2.pbm │ │ │ │ ├── balln3.pbm │ │ │ │ ├── border1.pbm │ │ │ │ ├── border2.pbm │ │ │ │ ├── chk1off.pbm │ │ │ │ ├── chk1on.pbm │ │ │ │ ├── chk2off.pbm │ │ │ │ ├── chk2on.pbm │ │ │ │ ├── chkdn.pbm │ │ │ │ ├── gizmo.pbm │ │ │ │ ├── gizmo2.pbm │ │ │ │ ├── pic1016.pbm │ │ │ │ ├── pic1016d.pbm │ │ │ │ ├── pic1016r.pbm │ │ │ │ ├── pic1020.pbm │ │ │ │ ├── pic1020d.pbm │ │ │ │ ├── pic1020r.pbm │ │ │ │ ├── squishy1.pbm │ │ │ │ ├── squishy2.pbm │ │ │ │ ├── squishy3.pbm │ │ │ │ ├── tooltip.pbm │ │ │ │ ├── tooltop.pbm │ │ │ │ └── vo.pbm │ │ │ ├── imagin/ │ │ │ │ ├── 68-78001.pbm │ │ │ │ ├── 68-78002.pbm │ │ │ │ ├── 68-78003.pbm │ │ │ │ ├── 68-78004.pbm │ │ │ │ ├── 68-78005.pbm │ │ │ │ ├── 68-78006.pbm │ │ │ │ ├── 68-78007.pbm │ │ │ │ ├── 68-78008.pbm │ │ │ │ ├── 68-78009.pbm │ │ │ │ ├── 68-78010.pbm │ │ │ │ ├── 8-106001.pbm │ │ │ │ ├── 8-106002.pbm │ │ │ │ ├── 8-106003.pbm │ │ │ │ ├── 8-106004.pbm │ │ │ │ ├── 8-106005.pbm │ │ │ │ ├── 8-106006.pbm │ │ │ │ ├── 8-106007.pbm │ │ │ │ ├── 8-106008.pbm │ │ │ │ ├── 8-106009.pbm │ │ │ │ ├── 8-106010.pbm │ │ │ │ ├── 8-106011.pbm │ │ │ │ ├── 8-106012.pbm │ │ │ │ ├── 8-106013.pbm │ │ │ │ ├── 8-106014.pbm │ │ │ │ ├── 8-106015.pbm │ │ │ │ ├── 8-106016.pbm │ │ │ │ ├── 8-106017.pbm │ │ │ │ ├── 8-106018.pbm │ │ │ │ ├── 8-106019.pbm │ │ │ │ ├── 8-106020.pbm │ │ │ │ ├── 8-106021.pbm │ │ │ │ ├── 8-106022.pbm │ │ │ │ ├── 8-106023.pbm │ │ │ │ ├── 8-106024.pbm │ │ │ │ ├── 8-106025.pbm │ │ │ │ ├── 8-106026.pbm │ │ │ │ ├── 8-106027.pbm │ │ │ │ ├── 8-106028.pbm │ │ │ │ ├── 8-106029.pbm │ │ │ │ ├── 8-106030.pbm │ │ │ │ ├── 8-106031.pbm │ │ │ │ ├── 8-106032.pbm │ │ │ │ ├── 8-106033.pbm │ │ │ │ ├── 8-106034.pbm │ │ │ │ ├── 8-106035.pbm │ │ │ │ ├── back1.pbm │ │ │ │ ├── back2.pbm │ │ │ │ ├── back3.pbm │ │ │ │ ├── back4.pbm │ │ │ │ ├── back5.pbm │ │ │ │ ├── cell1.pbm │ │ │ │ ├── cell10.pbm │ │ │ │ ├── cell100.pbm │ │ │ │ ├── cell101.pbm │ │ │ │ ├── cell102.pbm │ │ │ │ ├── cell103.pbm │ │ │ │ ├── cell104.pbm │ │ │ │ ├── cell105.pbm │ │ │ │ ├── cell106.pbm │ │ │ │ ├── cell107.pbm │ │ │ │ ├── cell108.pbm │ │ │ │ ├── cell109.pbm │ │ │ │ ├── cell11.pbm │ │ │ │ ├── cell12.pbm │ │ │ │ ├── cell13.pbm │ │ │ │ ├── cell14.pbm │ │ │ │ ├── cell15.pbm │ │ │ │ ├── cell16.pbm │ │ │ │ ├── cell17.pbm │ │ │ │ ├── cell18.pbm │ │ │ │ ├── cell19.pbm │ │ │ │ ├── cell2.pbm │ │ │ │ ├── cell20.pbm │ │ │ │ ├── cell21.pbm │ │ │ │ ├── cell22.pbm │ │ │ │ ├── cell23.pbm │ │ │ │ ├── cell24.pbm │ │ │ │ ├── cell25.pbm │ │ │ │ ├── cell26.pbm │ │ │ │ ├── cell27.pbm │ │ │ │ ├── cell28.pbm │ │ │ │ ├── cell29.pbm │ │ │ │ ├── cell3.pbm │ │ │ │ ├── cell30.pbm │ │ │ │ ├── cell31.pbm │ │ │ │ ├── cell32.pbm │ │ │ │ ├── cell33.pbm │ │ │ │ ├── cell34.pbm │ │ │ │ ├── cell35.pbm │ │ │ │ ├── cell36.pbm │ │ │ │ ├── cell37.pbm │ │ │ │ ├── cell38.pbm │ │ │ │ ├── cell39.pbm │ │ │ │ ├── cell4.pbm │ │ │ │ ├── cell40.pbm │ │ │ │ ├── cell41.pbm │ │ │ │ ├── cell42.pbm │ │ │ │ ├── cell43.pbm │ │ │ │ ├── cell44.pbm │ │ │ │ ├── cell45.pbm │ │ │ │ ├── cell46.pbm │ │ │ │ ├── cell47.pbm │ │ │ │ ├── cell48.pbm │ │ │ │ ├── cell49.pbm │ │ │ │ ├── cell5.pbm │ │ │ │ ├── cell50.pbm │ │ │ │ ├── cell51.pbm │ │ │ │ ├── cell52.pbm │ │ │ │ ├── cell53.pbm │ │ │ │ ├── cell54.pbm │ │ │ │ ├── cell55.pbm │ │ │ │ ├── cell56.pbm │ │ │ │ ├── cell57.pbm │ │ │ │ ├── cell58.pbm │ │ │ │ ├── cell59.pbm │ │ │ │ ├── cell6.pbm │ │ │ │ ├── cell60.pbm │ │ │ │ ├── cell61.pbm │ │ │ │ ├── cell62.pbm │ │ │ │ ├── cell63.pbm │ │ │ │ ├── cell64.pbm │ │ │ │ ├── cell65.pbm │ │ │ │ ├── cell66.pbm │ │ │ │ ├── cell67.pbm │ │ │ │ ├── cell68.pbm │ │ │ │ ├── cell69.pbm │ │ │ │ ├── cell7.pbm │ │ │ │ ├── cell70.pbm │ │ │ │ ├── cell71.pbm │ │ │ │ ├── cell72.pbm │ │ │ │ ├── cell73.pbm │ │ │ │ ├── cell74.pbm │ │ │ │ ├── cell75.pbm │ │ │ │ ├── cell76.pbm │ │ │ │ ├── cell77.pbm │ │ │ │ ├── cell78.pbm │ │ │ │ ├── cell79.pbm │ │ │ │ ├── cell8.pbm │ │ │ │ ├── cell80.pbm │ │ │ │ ├── cell81.pbm │ │ │ │ ├── cell82.pbm │ │ │ │ ├── cell83.pbm │ │ │ │ ├── cell84.pbm │ │ │ │ ├── cell85.pbm │ │ │ │ ├── cell86.pbm │ │ │ │ ├── cell87.pbm │ │ │ │ ├── cell88.pbm │ │ │ │ ├── cell89.pbm │ │ │ │ ├── cell9.pbm │ │ │ │ ├── cell90.pbm │ │ │ │ ├── cell91.pbm │ │ │ │ ├── cell92.pbm │ │ │ │ ├── cell93.pbm │ │ │ │ ├── cell94.pbm │ │ │ │ ├── cell95.pbm │ │ │ │ ├── cell96.pbm │ │ │ │ ├── cell97.pbm │ │ │ │ ├── cell98.pbm │ │ │ │ ├── cell99.pbm │ │ │ │ ├── closet.pbm │ │ │ │ ├── closet2.pbm │ │ │ │ ├── imagin1.pbm │ │ │ │ ├── imagin2.pbm │ │ │ │ ├── imagin3.pbm │ │ │ │ ├── imagin4.pbm │ │ │ │ ├── imagin5.pbm │ │ │ │ └── imagquit.pbm │ │ │ ├── inspirat/ │ │ │ │ ├── actarm1.pbm │ │ │ │ ├── actarm2.pbm │ │ │ │ ├── actarm3.pbm │ │ │ │ ├── actarm4.pbm │ │ │ │ ├── actarm5.pbm │ │ │ │ ├── bigarm1.pbm │ │ │ │ ├── bigarm2.pbm │ │ │ │ ├── bigarm3.pbm │ │ │ │ ├── bigarm4.pbm │ │ │ │ ├── bigarm5.pbm │ │ │ │ ├── cancel1.pbm │ │ │ │ ├── cancel2.pbm │ │ │ │ ├── cmrarm1.pbm │ │ │ │ ├── cmrarm2.pbm │ │ │ │ ├── cmrarm3.pbm │ │ │ │ ├── cmrarm4.pbm │ │ │ │ ├── cmrarm5.pbm │ │ │ │ ├── inspir1.pbm │ │ │ │ ├── inspir2.pbm │ │ │ │ ├── inspir3.pbm │ │ │ │ ├── inspir4.pbm │ │ │ │ ├── lpmz1.pbm │ │ │ │ ├── lpmz10.pbm │ │ │ │ ├── lpmz11.pbm │ │ │ │ ├── lpmz12.pbm │ │ │ │ ├── lpmz13.pbm │ │ │ │ ├── lpmz14.pbm │ │ │ │ ├── lpmz15.pbm │ │ │ │ ├── lpmz16.pbm │ │ │ │ ├── lpmz17.pbm │ │ │ │ ├── lpmz18.pbm │ │ │ │ ├── lpmz19.pbm │ │ │ │ ├── lpmz2.pbm │ │ │ │ ├── lpmz20.pbm │ │ │ │ ├── lpmz21.pbm │ │ │ │ ├── lpmz22.pbm │ │ │ │ ├── lpmz23.pbm │ │ │ │ ├── lpmz24.pbm │ │ │ │ ├── lpmz25.pbm │ │ │ │ ├── lpmz26.pbm │ │ │ │ ├── lpmz27.pbm │ │ │ │ ├── lpmz28.pbm │ │ │ │ ├── lpmz29.pbm │ │ │ │ ├── lpmz3.pbm │ │ │ │ ├── lpmz30.pbm │ │ │ │ ├── lpmz31.pbm │ │ │ │ ├── lpmz32.pbm │ │ │ │ ├── lpmz33.pbm │ │ │ │ ├── lpmz34.pbm │ │ │ │ ├── lpmz35.pbm │ │ │ │ ├── lpmz36.pbm │ │ │ │ ├── lpmz37.pbm │ │ │ │ ├── lpmz38.pbm │ │ │ │ ├── lpmz39.pbm │ │ │ │ ├── lpmz4.pbm │ │ │ │ ├── lpmz40.pbm │ │ │ │ ├── lpmz41.pbm │ │ │ │ ├── lpmz42.pbm │ │ │ │ ├── lpmz43.pbm │ │ │ │ ├── lpmz44.pbm │ │ │ │ ├── lpmz45.pbm │ │ │ │ ├── lpmz46.pbm │ │ │ │ ├── lpmz47.pbm │ │ │ │ ├── lpmz5.pbm │ │ │ │ ├── lpmz6.pbm │ │ │ │ ├── lpmz7.pbm │ │ │ │ ├── lpmz8.pbm │ │ │ │ ├── lpmz9.pbm │ │ │ │ ├── muscarm1.pbm │ │ │ │ ├── muscarm2.pbm │ │ │ │ ├── muscarm3.pbm │ │ │ │ ├── muscarm4.pbm │ │ │ │ ├── muscarm5.pbm │ │ │ │ ├── scnarm1.pbm │ │ │ │ ├── scnarm2.pbm │ │ │ │ ├── scnarm3.pbm │ │ │ │ ├── scnarm4.pbm │ │ │ │ ├── scnarm5.pbm │ │ │ │ ├── splot.pbm │ │ │ │ ├── splot0.pbm │ │ │ │ ├── splot2_1.pbm │ │ │ │ ├── splot2_2.pbm │ │ │ │ ├── splot2_3.pbm │ │ │ │ ├── splot2_4.pbm │ │ │ │ ├── splot2_5.pbm │ │ │ │ ├── splot3_1.pbm │ │ │ │ ├── splot3_2.pbm │ │ │ │ ├── splot3_3.pbm │ │ │ │ ├── splot3_4.pbm │ │ │ │ ├── splot3_5.pbm │ │ │ │ ├── splot4_1.pbm │ │ │ │ ├── splot4_2.pbm │ │ │ │ ├── splot4_3.pbm │ │ │ │ ├── splot4_4.pbm │ │ │ │ ├── splot4_5.pbm │ │ │ │ ├── splot5_1.pbm │ │ │ │ ├── splot5_2.pbm │ │ │ │ ├── splot5_3.pbm │ │ │ │ ├── splot5_4.pbm │ │ │ │ ├── splot5_5.pbm │ │ │ │ ├── spltarm1.pbm │ │ │ │ ├── spltarm2.pbm │ │ │ │ ├── spltarm3.pbm │ │ │ │ ├── spltarm4.pbm │ │ │ │ ├── spltarm5.pbm │ │ │ │ ├── sq2mz1.pbm │ │ │ │ ├── sq2mz10.pbm │ │ │ │ ├── sq2mz100.pbm │ │ │ │ ├── sq2mz101.pbm │ │ │ │ ├── sq2mz102.pbm │ │ │ │ ├── sq2mz103.pbm │ │ │ │ ├── sq2mz104.pbm │ │ │ │ ├── sq2mz105.pbm │ │ │ │ ├── sq2mz106.pbm │ │ │ │ ├── sq2mz107.pbm │ │ │ │ ├── sq2mz108.pbm │ │ │ │ ├── sq2mz109.pbm │ │ │ │ ├── sq2mz11.pbm │ │ │ │ ├── sq2mz110.pbm │ │ │ │ ├── sq2mz111.pbm │ │ │ │ ├── sq2mz112.pbm │ │ │ │ ├── sq2mz113.pbm │ │ │ │ ├── sq2mz114.pbm │ │ │ │ ├── sq2mz115.pbm │ │ │ │ ├── sq2mz116.pbm │ │ │ │ ├── sq2mz117.pbm │ │ │ │ ├── sq2mz118.pbm │ │ │ │ ├── sq2mz119.pbm │ │ │ │ ├── sq2mz12.pbm │ │ │ │ ├── sq2mz120.pbm │ │ │ │ ├── sq2mz121.pbm │ │ │ │ ├── sq2mz122.pbm │ │ │ │ ├── sq2mz123.pbm │ │ │ │ ├── sq2mz124.pbm │ │ │ │ ├── sq2mz125.pbm │ │ │ │ ├── sq2mz126.pbm │ │ │ │ ├── sq2mz127.pbm │ │ │ │ ├── sq2mz128.pbm │ │ │ │ ├── sq2mz129.pbm │ │ │ │ ├── sq2mz13.pbm │ │ │ │ ├── sq2mz130.pbm │ │ │ │ ├── sq2mz131.pbm │ │ │ │ ├── sq2mz132.pbm │ │ │ │ ├── sq2mz133.pbm │ │ │ │ ├── sq2mz134.pbm │ │ │ │ ├── sq2mz135.pbm │ │ │ │ ├── sq2mz136.pbm │ │ │ │ ├── sq2mz137.pbm │ │ │ │ ├── sq2mz138.pbm │ │ │ │ ├── sq2mz139.pbm │ │ │ │ ├── sq2mz14.pbm │ │ │ │ ├── sq2mz140.pbm │ │ │ │ ├── sq2mz141.pbm │ │ │ │ ├── sq2mz142.pbm │ │ │ │ ├── sq2mz143.pbm │ │ │ │ ├── sq2mz144.pbm │ │ │ │ ├── sq2mz145.pbm │ │ │ │ ├── sq2mz146.pbm │ │ │ │ ├── sq2mz147.pbm │ │ │ │ ├── sq2mz148.pbm │ │ │ │ ├── sq2mz149.pbm │ │ │ │ ├── sq2mz15.pbm │ │ │ │ ├── sq2mz150.pbm │ │ │ │ ├── sq2mz151.pbm │ │ │ │ ├── sq2mz152.pbm │ │ │ │ ├── sq2mz153.pbm │ │ │ │ ├── sq2mz154.pbm │ │ │ │ ├── sq2mz155.pbm │ │ │ │ ├── sq2mz156.pbm │ │ │ │ ├── sq2mz157.pbm │ │ │ │ ├── sq2mz158.pbm │ │ │ │ ├── sq2mz159.pbm │ │ │ │ ├── sq2mz16.pbm │ │ │ │ ├── sq2mz160.pbm │ │ │ │ ├── sq2mz161.pbm │ │ │ │ ├── sq2mz162.pbm │ │ │ │ ├── sq2mz163.pbm │ │ │ │ ├── sq2mz164.pbm │ │ │ │ ├── sq2mz165.pbm │ │ │ │ ├── sq2mz166.pbm │ │ │ │ ├── sq2mz167.pbm │ │ │ │ ├── sq2mz168.pbm │ │ │ │ ├── sq2mz169.pbm │ │ │ │ ├── sq2mz17.pbm │ │ │ │ ├── sq2mz170.pbm │ │ │ │ ├── sq2mz171.pbm │ │ │ │ ├── sq2mz172.pbm │ │ │ │ ├── sq2mz173.pbm │ │ │ │ ├── sq2mz174.pbm │ │ │ │ ├── sq2mz175.pbm │ │ │ │ ├── sq2mz176.pbm │ │ │ │ ├── sq2mz177.pbm │ │ │ │ ├── sq2mz178.pbm │ │ │ │ ├── sq2mz179.pbm │ │ │ │ ├── sq2mz18.pbm │ │ │ │ ├── sq2mz180.pbm │ │ │ │ ├── sq2mz181.pbm │ │ │ │ ├── sq2mz182.pbm │ │ │ │ ├── sq2mz183.pbm │ │ │ │ ├── sq2mz184.pbm │ │ │ │ ├── sq2mz185.pbm │ │ │ │ ├── sq2mz186.pbm │ │ │ │ ├── sq2mz187.pbm │ │ │ │ ├── sq2mz188.pbm │ │ │ │ ├── sq2mz189.pbm │ │ │ │ ├── sq2mz19.pbm │ │ │ │ ├── sq2mz190.pbm │ │ │ │ ├── sq2mz191.pbm │ │ │ │ ├── sq2mz192.pbm │ │ │ │ ├── sq2mz193.pbm │ │ │ │ ├── sq2mz194.pbm │ │ │ │ ├── sq2mz195.pbm │ │ │ │ ├── sq2mz196.pbm │ │ │ │ ├── sq2mz197.pbm │ │ │ │ ├── sq2mz198.pbm │ │ │ │ ├── sq2mz199.pbm │ │ │ │ ├── sq2mz2.pbm │ │ │ │ ├── sq2mz20.pbm │ │ │ │ ├── sq2mz200.pbm │ │ │ │ ├── sq2mz201.pbm │ │ │ │ ├── sq2mz21.pbm │ │ │ │ ├── sq2mz22.pbm │ │ │ │ ├── sq2mz23.pbm │ │ │ │ ├── sq2mz24.pbm │ │ │ │ ├── sq2mz25.pbm │ │ │ │ ├── sq2mz26.pbm │ │ │ │ ├── sq2mz27.pbm │ │ │ │ ├── sq2mz28.pbm │ │ │ │ ├── sq2mz29.pbm │ │ │ │ ├── sq2mz3.pbm │ │ │ │ ├── sq2mz30.pbm │ │ │ │ ├── sq2mz31.pbm │ │ │ │ ├── sq2mz32.pbm │ │ │ │ ├── sq2mz33.pbm │ │ │ │ ├── sq2mz34.pbm │ │ │ │ ├── sq2mz35.pbm │ │ │ │ ├── sq2mz36.pbm │ │ │ │ ├── sq2mz37.pbm │ │ │ │ ├── sq2mz38.pbm │ │ │ │ ├── sq2mz39.pbm │ │ │ │ ├── sq2mz4.pbm │ │ │ │ ├── sq2mz40.pbm │ │ │ │ ├── sq2mz41.pbm │ │ │ │ ├── sq2mz42.pbm │ │ │ │ ├── sq2mz43.pbm │ │ │ │ ├── sq2mz44.pbm │ │ │ │ ├── sq2mz45.pbm │ │ │ │ ├── sq2mz46.pbm │ │ │ │ ├── sq2mz47.pbm │ │ │ │ ├── sq2mz48.pbm │ │ │ │ ├── sq2mz49.pbm │ │ │ │ ├── sq2mz5.pbm │ │ │ │ ├── sq2mz50.pbm │ │ │ │ ├── sq2mz51.pbm │ │ │ │ ├── sq2mz52.pbm │ │ │ │ ├── sq2mz53.pbm │ │ │ │ ├── sq2mz54.pbm │ │ │ │ ├── sq2mz55.pbm │ │ │ │ ├── sq2mz56.pbm │ │ │ │ ├── sq2mz57.pbm │ │ │ │ ├── sq2mz58.pbm │ │ │ │ ├── sq2mz59.pbm │ │ │ │ ├── sq2mz6.pbm │ │ │ │ ├── sq2mz60.pbm │ │ │ │ ├── sq2mz61.pbm │ │ │ │ ├── sq2mz62.pbm │ │ │ │ ├── sq2mz63.pbm │ │ │ │ ├── sq2mz64.pbm │ │ │ │ ├── sq2mz65.pbm │ │ │ │ ├── sq2mz66.pbm │ │ │ │ ├── sq2mz67.pbm │ │ │ │ ├── sq2mz68.pbm │ │ │ │ ├── sq2mz69.pbm │ │ │ │ ├── sq2mz7.pbm │ │ │ │ ├── sq2mz70.pbm │ │ │ │ ├── sq2mz71.pbm │ │ │ │ ├── sq2mz72.pbm │ │ │ │ ├── sq2mz73.pbm │ │ │ │ ├── sq2mz74.pbm │ │ │ │ ├── sq2mz75.pbm │ │ │ │ ├── sq2mz76.pbm │ │ │ │ ├── sq2mz77.pbm │ │ │ │ ├── sq2mz78.pbm │ │ │ │ ├── sq2mz79.pbm │ │ │ │ ├── sq2mz8.pbm │ │ │ │ ├── sq2mz80.pbm │ │ │ │ ├── sq2mz81.pbm │ │ │ │ ├── sq2mz82.pbm │ │ │ │ ├── sq2mz83.pbm │ │ │ │ ├── sq2mz84.pbm │ │ │ │ ├── sq2mz85.pbm │ │ │ │ ├── sq2mz86.pbm │ │ │ │ ├── sq2mz87.pbm │ │ │ │ ├── sq2mz88.pbm │ │ │ │ ├── sq2mz89.pbm │ │ │ │ ├── sq2mz9.pbm │ │ │ │ ├── sq2mz90.pbm │ │ │ │ ├── sq2mz91.pbm │ │ │ │ ├── sq2mz92.pbm │ │ │ │ ├── sq2mz93.pbm │ │ │ │ ├── sq2mz94.pbm │ │ │ │ ├── sq2mz95.pbm │ │ │ │ ├── sq2mz96.pbm │ │ │ │ ├── sq2mz97.pbm │ │ │ │ ├── sq2mz98.pbm │ │ │ │ ├── sq2mz99.pbm │ │ │ │ ├── sq3mz1.pbm │ │ │ │ ├── sq3mz10.pbm │ │ │ │ ├── sq3mz11.pbm │ │ │ │ ├── sq3mz12.pbm │ │ │ │ ├── sq3mz13.pbm │ │ │ │ ├── sq3mz14.pbm │ │ │ │ ├── sq3mz15.pbm │ │ │ │ ├── sq3mz16.pbm │ │ │ │ ├── sq3mz17.pbm │ │ │ │ ├── sq3mz18.pbm │ │ │ │ ├── sq3mz19.pbm │ │ │ │ ├── sq3mz2.pbm │ │ │ │ ├── sq3mz20.pbm │ │ │ │ ├── sq3mz21.pbm │ │ │ │ ├── sq3mz22.pbm │ │ │ │ ├── sq3mz23.pbm │ │ │ │ ├── sq3mz24.pbm │ │ │ │ ├── sq3mz25.pbm │ │ │ │ ├── sq3mz26.pbm │ │ │ │ ├── sq3mz27.pbm │ │ │ │ ├── sq3mz28.pbm │ │ │ │ ├── sq3mz29.pbm │ │ │ │ ├── sq3mz3.pbm │ │ │ │ ├── sq3mz30.pbm │ │ │ │ ├── sq3mz31.pbm │ │ │ │ ├── sq3mz32.pbm │ │ │ │ ├── sq3mz4.pbm │ │ │ │ ├── sq3mz5.pbm │ │ │ │ ├── sq3mz6.pbm │ │ │ │ ├── sq3mz7.pbm │ │ │ │ ├── sq3mz8.pbm │ │ │ │ ├── sq3mz9.pbm │ │ │ │ ├── sq4mz1.pbm │ │ │ │ ├── sq4mz10.pbm │ │ │ │ ├── sq4mz11.pbm │ │ │ │ ├── sq4mz12.pbm │ │ │ │ ├── sq4mz13.pbm │ │ │ │ ├── sq4mz14.pbm │ │ │ │ ├── sq4mz15.pbm │ │ │ │ ├── sq4mz16.pbm │ │ │ │ ├── sq4mz17.pbm │ │ │ │ ├── sq4mz18.pbm │ │ │ │ ├── sq4mz19.pbm │ │ │ │ ├── sq4mz2.pbm │ │ │ │ ├── sq4mz20.pbm │ │ │ │ ├── sq4mz21.pbm │ │ │ │ ├── sq4mz22.pbm │ │ │ │ ├── sq4mz23.pbm │ │ │ │ ├── sq4mz24.pbm │ │ │ │ ├── sq4mz25.pbm │ │ │ │ ├── sq4mz26.pbm │ │ │ │ ├── sq4mz27.pbm │ │ │ │ ├── sq4mz28.pbm │ │ │ │ ├── sq4mz29.pbm │ │ │ │ ├── sq4mz3.pbm │ │ │ │ ├── sq4mz30.pbm │ │ │ │ ├── sq4mz4.pbm │ │ │ │ ├── sq4mz5.pbm │ │ │ │ ├── sq4mz6.pbm │ │ │ │ ├── sq4mz7.pbm │ │ │ │ ├── sq4mz8.pbm │ │ │ │ ├── sq4mz9.pbm │ │ │ │ ├── toolbox1.pbm │ │ │ │ ├── toolbox2.pbm │ │ │ │ ├── toolboxd.pbm │ │ │ │ ├── toolbx.pbm │ │ │ │ └── toolbxs.pbm │ │ │ ├── lobby/ │ │ │ │ ├── fork217.pbm │ │ │ │ ├── l1mz10.pbm │ │ │ │ ├── l1mz100.pbm │ │ │ │ ├── l1mz101.pbm │ │ │ │ ├── l1mz102.pbm │ │ │ │ ├── l1mz103.pbm │ │ │ │ ├── l1mz104.pbm │ │ │ │ ├── l1mz105.pbm │ │ │ │ ├── l1mz106.pbm │ │ │ │ ├── l1mz107.pbm │ │ │ │ ├── l1mz108.pbm │ │ │ │ ├── l1mz109.pbm │ │ │ │ ├── l1mz11.pbm │ │ │ │ ├── l1mz110.pbm │ │ │ │ ├── l1mz111.pbm │ │ │ │ ├── l1mz112.pbm │ │ │ │ ├── l1mz113.pbm │ │ │ │ ├── l1mz114.pbm │ │ │ │ ├── l1mz115.pbm │ │ │ │ ├── l1mz116.pbm │ │ │ │ ├── l1mz117.pbm │ │ │ │ ├── l1mz118.pbm │ │ │ │ ├── l1mz119.pbm │ │ │ │ ├── l1mz12.pbm │ │ │ │ ├── l1mz120.pbm │ │ │ │ ├── l1mz121.pbm │ │ │ │ ├── l1mz122.pbm │ │ │ │ ├── l1mz123.pbm │ │ │ │ ├── l1mz124.pbm │ │ │ │ ├── l1mz125.pbm │ │ │ │ ├── l1mz126.pbm │ │ │ │ ├── l1mz127.pbm │ │ │ │ ├── l1mz128.pbm │ │ │ │ ├── l1mz129.pbm │ │ │ │ ├── l1mz13.pbm │ │ │ │ ├── l1mz130.pbm │ │ │ │ ├── l1mz131.pbm │ │ │ │ ├── l1mz132.pbm │ │ │ │ ├── l1mz133.pbm │ │ │ │ ├── l1mz134.pbm │ │ │ │ ├── l1mz135.pbm │ │ │ │ ├── l1mz136.pbm │ │ │ │ ├── l1mz137.pbm │ │ │ │ ├── l1mz138.pbm │ │ │ │ ├── l1mz139.pbm │ │ │ │ ├── l1mz14.pbm │ │ │ │ ├── l1mz140.pbm │ │ │ │ ├── l1mz141.pbm │ │ │ │ ├── l1mz142.pbm │ │ │ │ ├── l1mz143.pbm │ │ │ │ ├── l1mz144.pbm │ │ │ │ ├── l1mz145.pbm │ │ │ │ ├── l1mz146.pbm │ │ │ │ ├── l1mz147.pbm │ │ │ │ ├── l1mz148.pbm │ │ │ │ ├── l1mz149.pbm │ │ │ │ ├── l1mz15.pbm │ │ │ │ ├── l1mz150.pbm │ │ │ │ ├── l1mz151.pbm │ │ │ │ ├── l1mz152.pbm │ │ │ │ ├── l1mz153.pbm │ │ │ │ ├── l1mz154.pbm │ │ │ │ ├── l1mz155.pbm │ │ │ │ ├── l1mz156.pbm │ │ │ │ ├── l1mz157.pbm │ │ │ │ ├── l1mz158.pbm │ │ │ │ ├── l1mz159.pbm │ │ │ │ ├── l1mz16.pbm │ │ │ │ ├── l1mz160.pbm │ │ │ │ ├── l1mz161.pbm │ │ │ │ ├── l1mz162.pbm │ │ │ │ ├── l1mz163.pbm │ │ │ │ ├── l1mz164.pbm │ │ │ │ ├── l1mz165.pbm │ │ │ │ ├── l1mz166.pbm │ │ │ │ ├── l1mz167.pbm │ │ │ │ ├── l1mz168.pbm │ │ │ │ ├── l1mz169.pbm │ │ │ │ ├── l1mz17.pbm │ │ │ │ ├── l1mz170.pbm │ │ │ │ ├── l1mz171.pbm │ │ │ │ ├── l1mz172.pbm │ │ │ │ ├── l1mz173.pbm │ │ │ │ ├── l1mz174.pbm │ │ │ │ ├── l1mz175.pbm │ │ │ │ ├── l1mz176.pbm │ │ │ │ ├── l1mz177.pbm │ │ │ │ ├── l1mz178.pbm │ │ │ │ ├── l1mz179.pbm │ │ │ │ ├── l1mz18.pbm │ │ │ │ ├── l1mz180.pbm │ │ │ │ ├── l1mz181.pbm │ │ │ │ ├── l1mz182.pbm │ │ │ │ ├── l1mz183.pbm │ │ │ │ ├── l1mz184.pbm │ │ │ │ ├── l1mz185.pbm │ │ │ │ ├── l1mz186.pbm │ │ │ │ ├── l1mz187.pbm │ │ │ │ ├── l1mz188.pbm │ │ │ │ ├── l1mz189.pbm │ │ │ │ ├── l1mz19.pbm │ │ │ │ ├── l1mz190.pbm │ │ │ │ ├── l1mz191.pbm │ │ │ │ ├── l1mz192.pbm │ │ │ │ ├── l1mz193.pbm │ │ │ │ ├── l1mz194.pbm │ │ │ │ ├── l1mz195.pbm │ │ │ │ ├── l1mz196.pbm │ │ │ │ ├── l1mz197.pbm │ │ │ │ ├── l1mz198.pbm │ │ │ │ ├── l1mz199.pbm │ │ │ │ ├── l1mz20.pbm │ │ │ │ ├── l1mz200.pbm │ │ │ │ ├── l1mz201.pbm │ │ │ │ ├── l1mz202.pbm │ │ │ │ ├── l1mz203.pbm │ │ │ │ ├── l1mz204.pbm │ │ │ │ ├── l1mz205.pbm │ │ │ │ ├── l1mz206.pbm │ │ │ │ ├── l1mz207.pbm │ │ │ │ ├── l1mz208.pbm │ │ │ │ ├── l1mz209.pbm │ │ │ │ ├── l1mz21.pbm │ │ │ │ ├── l1mz210.pbm │ │ │ │ ├── l1mz211.pbm │ │ │ │ ├── l1mz212.pbm │ │ │ │ ├── l1mz213.pbm │ │ │ │ ├── l1mz214.pbm │ │ │ │ ├── l1mz215.pbm │ │ │ │ ├── l1mz216.pbm │ │ │ │ ├── l1mz217.pbm │ │ │ │ ├── l1mz218.pbm │ │ │ │ ├── l1mz219.pbm │ │ │ │ ├── l1mz22.pbm │ │ │ │ ├── l1mz220.pbm │ │ │ │ ├── l1mz221.pbm │ │ │ │ ├── l1mz222.pbm │ │ │ │ ├── l1mz223.pbm │ │ │ │ ├── l1mz224.pbm │ │ │ │ ├── l1mz225.pbm │ │ │ │ ├── l1mz226.pbm │ │ │ │ ├── l1mz227.pbm │ │ │ │ ├── l1mz228.pbm │ │ │ │ ├── l1mz229.pbm │ │ │ │ ├── l1mz23.pbm │ │ │ │ ├── l1mz230.pbm │ │ │ │ ├── l1mz231.pbm │ │ │ │ ├── l1mz232.pbm │ │ │ │ ├── l1mz233.pbm │ │ │ │ ├── l1mz234.pbm │ │ │ │ ├── l1mz235.pbm │ │ │ │ ├── l1mz236.pbm │ │ │ │ ├── l1mz237.pbm │ │ │ │ ├── l1mz238.pbm │ │ │ │ ├── l1mz239.pbm │ │ │ │ ├── l1mz24.pbm │ │ │ │ ├── l1mz240.pbm │ │ │ │ ├── l1mz241.pbm │ │ │ │ ├── l1mz242.pbm │ │ │ │ ├── l1mz243.pbm │ │ │ │ ├── l1mz244.pbm │ │ │ │ ├── l1mz245.pbm │ │ │ │ ├── l1mz246.pbm │ │ │ │ ├── l1mz247.pbm │ │ │ │ ├── l1mz248.pbm │ │ │ │ ├── l1mz249.pbm │ │ │ │ ├── l1mz25.pbm │ │ │ │ ├── l1mz250.pbm │ │ │ │ ├── l1mz251.pbm │ │ │ │ ├── l1mz252.pbm │ │ │ │ ├── l1mz253.pbm │ │ │ │ ├── l1mz254.pbm │ │ │ │ ├── l1mz255.pbm │ │ │ │ ├── l1mz256.pbm │ │ │ │ ├── l1mz257.pbm │ │ │ │ ├── l1mz258.pbm │ │ │ │ ├── l1mz259.pbm │ │ │ │ ├── l1mz26.pbm │ │ │ │ ├── l1mz260.pbm │ │ │ │ ├── l1mz27.pbm │ │ │ │ ├── l1mz28.pbm │ │ │ │ ├── l1mz29.pbm │ │ │ │ ├── l1mz30.pbm │ │ │ │ ├── l1mz31.pbm │ │ │ │ ├── l1mz32.pbm │ │ │ │ ├── l1mz33.pbm │ │ │ │ ├── l1mz34.pbm │ │ │ │ ├── l1mz35.pbm │ │ │ │ ├── l1mz36.pbm │ │ │ │ ├── l1mz37.pbm │ │ │ │ ├── l1mz38.pbm │ │ │ │ ├── l1mz39.pbm │ │ │ │ ├── l1mz40.pbm │ │ │ │ ├── l1mz41.pbm │ │ │ │ ├── l1mz42.pbm │ │ │ │ ├── l1mz43.pbm │ │ │ │ ├── l1mz44.pbm │ │ │ │ ├── l1mz45.pbm │ │ │ │ ├── l1mz46.pbm │ │ │ │ ├── l1mz47.pbm │ │ │ │ ├── l1mz48.pbm │ │ │ │ ├── l1mz49.pbm │ │ │ │ ├── l1mz50.pbm │ │ │ │ ├── l1mz51.pbm │ │ │ │ ├── l1mz52.pbm │ │ │ │ ├── l1mz53.pbm │ │ │ │ ├── l1mz54.pbm │ │ │ │ ├── l1mz55.pbm │ │ │ │ ├── l1mz56.pbm │ │ │ │ ├── l1mz57.pbm │ │ │ │ ├── l1mz58.pbm │ │ │ │ ├── l1mz59.pbm │ │ │ │ ├── l1mz6.pbm │ │ │ │ ├── l1mz60.pbm │ │ │ │ ├── l1mz61.pbm │ │ │ │ ├── l1mz62.pbm │ │ │ │ ├── l1mz63.pbm │ │ │ │ ├── l1mz64.pbm │ │ │ │ ├── l1mz65.pbm │ │ │ │ ├── l1mz66.pbm │ │ │ │ ├── l1mz67.pbm │ │ │ │ ├── l1mz68.pbm │ │ │ │ ├── l1mz69.pbm │ │ │ │ ├── l1mz7.pbm │ │ │ │ ├── l1mz70.pbm │ │ │ │ ├── l1mz71.pbm │ │ │ │ ├── l1mz72.pbm │ │ │ │ ├── l1mz73.pbm │ │ │ │ ├── l1mz74.pbm │ │ │ │ ├── l1mz75.pbm │ │ │ │ ├── l1mz76.pbm │ │ │ │ ├── l1mz77.pbm │ │ │ │ ├── l1mz78.pbm │ │ │ │ ├── l1mz79.pbm │ │ │ │ ├── l1mz8.pbm │ │ │ │ ├── l1mz80.pbm │ │ │ │ ├── l1mz81.pbm │ │ │ │ ├── l1mz82.pbm │ │ │ │ ├── l1mz83.pbm │ │ │ │ ├── l1mz84.pbm │ │ │ │ ├── l1mz85.pbm │ │ │ │ ├── l1mz86.pbm │ │ │ │ ├── l1mz87.pbm │ │ │ │ ├── l1mz88.pbm │ │ │ │ ├── l1mz89.pbm │ │ │ │ ├── l1mz9.pbm │ │ │ │ ├── l1mz90.pbm │ │ │ │ ├── l1mz91.pbm │ │ │ │ ├── l1mz92.pbm │ │ │ │ ├── l1mz93.pbm │ │ │ │ ├── l1mz94.pbm │ │ │ │ ├── l1mz95.pbm │ │ │ │ ├── l1mz96.pbm │ │ │ │ ├── l1mz97.pbm │ │ │ │ ├── l1mz98.pbm │ │ │ │ ├── l1mz99.pbm │ │ │ │ ├── l3mz1.pbm │ │ │ │ ├── l3mz10.pbm │ │ │ │ ├── l3mz11.pbm │ │ │ │ ├── l3mz12.pbm │ │ │ │ ├── l3mz13.pbm │ │ │ │ ├── l3mz14.pbm │ │ │ │ ├── l3mz15.pbm │ │ │ │ ├── l3mz16.pbm │ │ │ │ ├── l3mz17.pbm │ │ │ │ ├── l3mz18.pbm │ │ │ │ ├── l3mz19.pbm │ │ │ │ ├── l3mz2.pbm │ │ │ │ ├── l3mz20.pbm │ │ │ │ ├── l3mz21.pbm │ │ │ │ ├── l3mz22.pbm │ │ │ │ ├── l3mz23.pbm │ │ │ │ ├── l3mz24.pbm │ │ │ │ ├── l3mz25.pbm │ │ │ │ ├── l3mz26.pbm │ │ │ │ ├── l3mz27.pbm │ │ │ │ ├── l3mz28.pbm │ │ │ │ ├── l3mz29.pbm │ │ │ │ ├── l3mz3.pbm │ │ │ │ ├── l3mz30.pbm │ │ │ │ ├── l3mz31.pbm │ │ │ │ ├── l3mz32.pbm │ │ │ │ ├── l3mz33.pbm │ │ │ │ ├── l3mz34.pbm │ │ │ │ ├── l3mz35.pbm │ │ │ │ ├── l3mz36.pbm │ │ │ │ ├── l3mz37.pbm │ │ │ │ ├── l3mz38.pbm │ │ │ │ ├── l3mz39.pbm │ │ │ │ ├── l3mz4.pbm │ │ │ │ ├── l3mz40.pbm │ │ │ │ ├── l3mz41.pbm │ │ │ │ ├── l3mz42.pbm │ │ │ │ ├── l3mz43.pbm │ │ │ │ ├── l3mz44.pbm │ │ │ │ ├── l3mz45.pbm │ │ │ │ ├── l3mz46.pbm │ │ │ │ ├── l3mz47.pbm │ │ │ │ ├── l3mz48.pbm │ │ │ │ ├── l3mz49.pbm │ │ │ │ ├── l3mz5.pbm │ │ │ │ ├── l3mz50.pbm │ │ │ │ ├── l3mz51.pbm │ │ │ │ ├── l3mz52.pbm │ │ │ │ ├── l3mz53.pbm │ │ │ │ ├── l3mz54.pbm │ │ │ │ ├── l3mz55.pbm │ │ │ │ ├── l3mz56.pbm │ │ │ │ ├── l3mz57.pbm │ │ │ │ ├── l3mz58.pbm │ │ │ │ ├── l3mz59.pbm │ │ │ │ ├── l3mz6.pbm │ │ │ │ ├── l3mz60.pbm │ │ │ │ ├── l3mz61.pbm │ │ │ │ ├── l3mz62.pbm │ │ │ │ ├── l3mz63.pbm │ │ │ │ ├── l3mz64.pbm │ │ │ │ ├── l3mz65.pbm │ │ │ │ ├── l3mz66.pbm │ │ │ │ ├── l3mz67.pbm │ │ │ │ ├── l3mz68.pbm │ │ │ │ ├── l3mz69.pbm │ │ │ │ ├── l3mz7.pbm │ │ │ │ ├── l3mz70.pbm │ │ │ │ ├── l3mz8.pbm │ │ │ │ ├── l3mz9.pbm │ │ │ │ ├── lipsk157.pbm │ │ │ │ ├── lipsk158.pbm │ │ │ │ ├── lipsk159.pbm │ │ │ │ ├── lipsk160.pbm │ │ │ │ ├── lipsk161.pbm │ │ │ │ ├── lipsk162.pbm │ │ │ │ ├── lipsk163.pbm │ │ │ │ ├── lipsk164.pbm │ │ │ │ ├── lipsk165.pbm │ │ │ │ ├── lipsk166.pbm │ │ │ │ ├── lipsk167.pbm │ │ │ │ ├── lipsk168.pbm │ │ │ │ ├── lipsk169.pbm │ │ │ │ ├── lipsk170.pbm │ │ │ │ ├── lipsk171.pbm │ │ │ │ ├── lipsk172.pbm │ │ │ │ ├── lipsk173.pbm │ │ │ │ ├── lipsk174.pbm │ │ │ │ ├── lipsk175.pbm │ │ │ │ ├── lipsk176.pbm │ │ │ │ ├── lipsk177.pbm │ │ │ │ ├── lipsk178.pbm │ │ │ │ ├── lipsk179.pbm │ │ │ │ ├── lob2door.pbm │ │ │ │ ├── lob2map.pbm │ │ │ │ ├── lob2quit.pbm │ │ │ │ ├── lob2snak.pbm │ │ │ │ ├── lob2wait.pbm │ │ │ │ ├── lobby.pbm │ │ │ │ ├── lobby1.pbm │ │ │ │ ├── lobby1x.pbm │ │ │ │ └── lobby2.pbm │ │ │ ├── login/ │ │ │ │ └── login.pbm │ │ │ ├── projects/ │ │ │ │ ├── mel1.pbm │ │ │ │ ├── mel10.pbm │ │ │ │ ├── mel100.pbm │ │ │ │ ├── mel101.pbm │ │ │ │ ├── mel102.pbm │ │ │ │ ├── mel103.pbm │ │ │ │ ├── mel104.pbm │ │ │ │ ├── mel105.pbm │ │ │ │ ├── mel106.pbm │ │ │ │ ├── mel107.pbm │ │ │ │ ├── mel108.pbm │ │ │ │ ├── mel109.pbm │ │ │ │ ├── mel11.pbm │ │ │ │ ├── mel110.pbm │ │ │ │ ├── mel111.pbm │ │ │ │ ├── mel112.pbm │ │ │ │ ├── mel113.pbm │ │ │ │ ├── mel114.pbm │ │ │ │ ├── mel115.pbm │ │ │ │ ├── mel116.pbm │ │ │ │ ├── mel117.pbm │ │ │ │ ├── mel118.pbm │ │ │ │ ├── mel119.pbm │ │ │ │ ├── mel12.pbm │ │ │ │ ├── mel120.pbm │ │ │ │ ├── mel121.pbm │ │ │ │ ├── mel122.pbm │ │ │ │ ├── mel123.pbm │ │ │ │ ├── mel124.pbm │ │ │ │ ├── mel125.pbm │ │ │ │ ├── mel126.pbm │ │ │ │ ├── mel127.pbm │ │ │ │ ├── mel128.pbm │ │ │ │ ├── mel129.pbm │ │ │ │ ├── mel13.pbm │ │ │ │ ├── mel130.pbm │ │ │ │ ├── mel131.pbm │ │ │ │ ├── mel132.pbm │ │ │ │ ├── mel133.pbm │ │ │ │ ├── mel134.pbm │ │ │ │ ├── mel135.pbm │ │ │ │ ├── mel136.pbm │ │ │ │ ├── mel137.pbm │ │ │ │ ├── mel138.pbm │ │ │ │ ├── mel139.pbm │ │ │ │ ├── mel14.pbm │ │ │ │ ├── mel140.pbm │ │ │ │ ├── mel141.pbm │ │ │ │ ├── mel142.pbm │ │ │ │ ├── mel143.pbm │ │ │ │ ├── mel144.pbm │ │ │ │ ├── mel145.pbm │ │ │ │ ├── mel146.pbm │ │ │ │ ├── mel147.pbm │ │ │ │ ├── mel148.pbm │ │ │ │ ├── mel149.pbm │ │ │ │ ├── mel15.pbm │ │ │ │ ├── mel150.pbm │ │ │ │ ├── mel151.pbm │ │ │ │ ├── mel152.pbm │ │ │ │ ├── mel153.pbm │ │ │ │ ├── mel154.pbm │ │ │ │ ├── mel155.pbm │ │ │ │ ├── mel156.pbm │ │ │ │ ├── mel157.pbm │ │ │ │ ├── mel158.pbm │ │ │ │ ├── mel159.pbm │ │ │ │ ├── mel16.pbm │ │ │ │ ├── mel160.pbm │ │ │ │ ├── mel161.pbm │ │ │ │ ├── mel162.pbm │ │ │ │ ├── mel163.pbm │ │ │ │ ├── mel164.pbm │ │ │ │ ├── mel165.pbm │ │ │ │ ├── mel166.pbm │ │ │ │ ├── mel167.pbm │ │ │ │ ├── mel168.pbm │ │ │ │ ├── mel169.pbm │ │ │ │ ├── mel17.pbm │ │ │ │ ├── mel170.pbm │ │ │ │ ├── mel171.pbm │ │ │ │ ├── mel172.pbm │ │ │ │ ├── mel173.pbm │ │ │ │ ├── mel174.pbm │ │ │ │ ├── mel175.pbm │ │ │ │ ├── mel176.pbm │ │ │ │ ├── mel177.pbm │ │ │ │ ├── mel178.pbm │ │ │ │ ├── mel179.pbm │ │ │ │ ├── mel18.pbm │ │ │ │ ├── mel180.pbm │ │ │ │ ├── mel181.pbm │ │ │ │ ├── mel182.pbm │ │ │ │ ├── mel183.pbm │ │ │ │ ├── mel19.pbm │ │ │ │ ├── mel2.pbm │ │ │ │ ├── mel20.pbm │ │ │ │ ├── mel21.pbm │ │ │ │ ├── mel22.pbm │ │ │ │ ├── mel23.pbm │ │ │ │ ├── mel24.pbm │ │ │ │ ├── mel25.pbm │ │ │ │ ├── mel26.pbm │ │ │ │ ├── mel27.pbm │ │ │ │ ├── mel28.pbm │ │ │ │ ├── mel29.pbm │ │ │ │ ├── mel3.pbm │ │ │ │ ├── mel30.pbm │ │ │ │ ├── mel301.pbm │ │ │ │ ├── mel302.pbm │ │ │ │ ├── mel303.pbm │ │ │ │ ├── mel304.pbm │ │ │ │ ├── mel305.pbm │ │ │ │ ├── mel306.pbm │ │ │ │ ├── mel307.pbm │ │ │ │ ├── mel308.pbm │ │ │ │ ├── mel309.pbm │ │ │ │ ├── mel31.pbm │ │ │ │ ├── mel310.pbm │ │ │ │ ├── mel311.pbm │ │ │ │ ├── mel312.pbm │ │ │ │ ├── mel313.pbm │ │ │ │ ├── mel314.pbm │ │ │ │ ├── mel315.pbm │ │ │ │ ├── mel316.pbm │ │ │ │ ├── mel317.pbm │ │ │ │ ├── mel318.pbm │ │ │ │ ├── mel319.pbm │ │ │ │ ├── mel32.pbm │ │ │ │ ├── mel320.pbm │ │ │ │ ├── mel321.pbm │ │ │ │ ├── mel322.pbm │ │ │ │ ├── mel323.pbm │ │ │ │ ├── mel324.pbm │ │ │ │ ├── mel325.pbm │ │ │ │ ├── mel326.pbm │ │ │ │ ├── mel33.pbm │ │ │ │ ├── mel34.pbm │ │ │ │ ├── mel35.pbm │ │ │ │ ├── mel36.pbm │ │ │ │ ├── mel37.pbm │ │ │ │ ├── mel38.pbm │ │ │ │ ├── mel39.pbm │ │ │ │ ├── mel4.pbm │ │ │ │ ├── mel40.pbm │ │ │ │ ├── mel41.pbm │ │ │ │ ├── mel42.pbm │ │ │ │ ├── mel43.pbm │ │ │ │ ├── mel44.pbm │ │ │ │ ├── mel45.pbm │ │ │ │ ├── mel46.pbm │ │ │ │ ├── mel47.pbm │ │ │ │ ├── mel48.pbm │ │ │ │ ├── mel49.pbm │ │ │ │ ├── mel5.pbm │ │ │ │ ├── mel50.pbm │ │ │ │ ├── mel51.pbm │ │ │ │ ├── mel52.pbm │ │ │ │ ├── mel53.pbm │ │ │ │ ├── mel54.pbm │ │ │ │ ├── mel55.pbm │ │ │ │ ├── mel56.pbm │ │ │ │ ├── mel57.pbm │ │ │ │ ├── mel58.pbm │ │ │ │ ├── mel59.pbm │ │ │ │ ├── mel6.pbm │ │ │ │ ├── mel60.pbm │ │ │ │ ├── mel61.pbm │ │ │ │ ├── mel62.pbm │ │ │ │ ├── mel63.pbm │ │ │ │ ├── mel64.pbm │ │ │ │ ├── mel65.pbm │ │ │ │ ├── mel66.pbm │ │ │ │ ├── mel67.pbm │ │ │ │ ├── mel68.pbm │ │ │ │ ├── mel69.pbm │ │ │ │ ├── mel7.pbm │ │ │ │ ├── mel70.pbm │ │ │ │ ├── mel71.pbm │ │ │ │ ├── mel72.pbm │ │ │ │ ├── mel73.pbm │ │ │ │ ├── mel74.pbm │ │ │ │ ├── mel75.pbm │ │ │ │ ├── mel76.pbm │ │ │ │ ├── mel77.pbm │ │ │ │ ├── mel78.pbm │ │ │ │ ├── mel79.pbm │ │ │ │ ├── mel8.pbm │ │ │ │ ├── mel80.pbm │ │ │ │ ├── mel81.pbm │ │ │ │ ├── mel82.pbm │ │ │ │ ├── mel83.pbm │ │ │ │ ├── mel84.pbm │ │ │ │ ├── mel85.pbm │ │ │ │ ├── mel86.pbm │ │ │ │ ├── mel87.pbm │ │ │ │ ├── mel88.pbm │ │ │ │ ├── mel89.pbm │ │ │ │ ├── mel9.pbm │ │ │ │ ├── mel90.pbm │ │ │ │ ├── mel91.pbm │ │ │ │ ├── mel92.pbm │ │ │ │ ├── mel93.pbm │ │ │ │ ├── mel94.pbm │ │ │ │ ├── mel95.pbm │ │ │ │ ├── mel96.pbm │ │ │ │ ├── mel97.pbm │ │ │ │ ├── mel98.pbm │ │ │ │ ├── mel99.pbm │ │ │ │ ├── melcy1.pbm │ │ │ │ ├── melcy10.pbm │ │ │ │ ├── melcy11.pbm │ │ │ │ ├── melcy12.pbm │ │ │ │ ├── melcy13.pbm │ │ │ │ ├── melcy14.pbm │ │ │ │ ├── melcy15.pbm │ │ │ │ ├── melcy16.pbm │ │ │ │ ├── melcy17.pbm │ │ │ │ ├── melcy18.pbm │ │ │ │ ├── melcy19.pbm │ │ │ │ ├── melcy2.pbm │ │ │ │ ├── melcy20.pbm │ │ │ │ ├── melcy3.pbm │ │ │ │ ├── melcy4.pbm │ │ │ │ ├── melcy5.pbm │ │ │ │ ├── melcy6.pbm │ │ │ │ ├── melcy7.pbm │ │ │ │ ├── melcy8.pbm │ │ │ │ ├── melcy9.pbm │ │ │ │ ├── pr2doors.pbm │ │ │ │ ├── prj1cart.pbm │ │ │ │ ├── prj1mon1.pbm │ │ │ │ ├── prj1mon2.pbm │ │ │ │ ├── prj2map.pbm │ │ │ │ ├── prj2quit.pbm │ │ │ │ ├── project1.pbm │ │ │ │ ├── project2.pbm │ │ │ │ ├── project3.pbm │ │ │ │ ├── project4.pbm │ │ │ │ ├── tvlan1.pbm │ │ │ │ ├── tvlan10.pbm │ │ │ │ ├── tvlan11.pbm │ │ │ │ ├── tvlan12.pbm │ │ │ │ ├── tvlan13.pbm │ │ │ │ ├── tvlan14.pbm │ │ │ │ ├── tvlan15.pbm │ │ │ │ ├── tvlan2.pbm │ │ │ │ ├── tvlan3.pbm │ │ │ │ ├── tvlan4.pbm │ │ │ │ ├── tvlan5.pbm │ │ │ │ ├── tvlan6.pbm │ │ │ │ ├── tvlan7.pbm │ │ │ │ ├── tvlan8.pbm │ │ │ │ ├── tvlan9.pbm │ │ │ │ ├── tvran1.pbm │ │ │ │ ├── tvran10.pbm │ │ │ │ ├── tvran11.pbm │ │ │ │ ├── tvran12.pbm │ │ │ │ ├── tvran13.pbm │ │ │ │ ├── tvran14.pbm │ │ │ │ ├── tvran15.pbm │ │ │ │ ├── tvran2.pbm │ │ │ │ ├── tvran3.pbm │ │ │ │ ├── tvran4.pbm │ │ │ │ ├── tvran5.pbm │ │ │ │ ├── tvran6.pbm │ │ │ │ ├── tvran7.pbm │ │ │ │ ├── tvran8.pbm │ │ │ │ └── tvran9.pbm │ │ │ ├── snackbar/ │ │ │ │ ├── cyc46.pbm │ │ │ │ ├── cyc47.pbm │ │ │ │ ├── cyc48.pbm │ │ │ │ ├── cyc49.pbm │ │ │ │ ├── cyc50.pbm │ │ │ │ ├── cyc51.pbm │ │ │ │ ├── cyc52.pbm │ │ │ │ ├── cyc53.pbm │ │ │ │ ├── cyc54.pbm │ │ │ │ ├── cyc55.pbm │ │ │ │ ├── cyc56.pbm │ │ │ │ ├── cyc57.pbm │ │ │ │ ├── cyc58.pbm │ │ │ │ ├── cyc59.pbm │ │ │ │ ├── cyc60.pbm │ │ │ │ ├── mczee1.pbm │ │ │ │ ├── mczee10.pbm │ │ │ │ ├── mczee100.pbm │ │ │ │ ├── mczee101.pbm │ │ │ │ ├── mczee102.pbm │ │ │ │ ├── mczee103.pbm │ │ │ │ ├── mczee104.pbm │ │ │ │ ├── mczee105.pbm │ │ │ │ ├── mczee106.pbm │ │ │ │ ├── mczee107.pbm │ │ │ │ ├── mczee108.pbm │ │ │ │ ├── mczee109.pbm │ │ │ │ ├── mczee11.pbm │ │ │ │ ├── mczee110.pbm │ │ │ │ ├── mczee111.pbm │ │ │ │ ├── mczee112.pbm │ │ │ │ ├── mczee113.pbm │ │ │ │ ├── mczee114.pbm │ │ │ │ ├── mczee115.pbm │ │ │ │ ├── mczee116.pbm │ │ │ │ ├── mczee117.pbm │ │ │ │ ├── mczee118.pbm │ │ │ │ ├── mczee119.pbm │ │ │ │ ├── mczee12.pbm │ │ │ │ ├── mczee120.pbm │ │ │ │ ├── mczee121.pbm │ │ │ │ ├── mczee122.pbm │ │ │ │ ├── mczee123.pbm │ │ │ │ ├── mczee124.pbm │ │ │ │ ├── mczee125.pbm │ │ │ │ ├── mczee126.pbm │ │ │ │ ├── mczee127.pbm │ │ │ │ ├── mczee128.pbm │ │ │ │ ├── mczee129.pbm │ │ │ │ ├── mczee13.pbm │ │ │ │ ├── mczee130.pbm │ │ │ │ ├── mczee131.pbm │ │ │ │ ├── mczee132.pbm │ │ │ │ ├── mczee133.pbm │ │ │ │ ├── mczee134.pbm │ │ │ │ ├── mczee135.pbm │ │ │ │ ├── mczee136.pbm │ │ │ │ ├── mczee137.pbm │ │ │ │ ├── mczee138.pbm │ │ │ │ ├── mczee139.pbm │ │ │ │ ├── mczee14.pbm │ │ │ │ ├── mczee140.pbm │ │ │ │ ├── mczee141.pbm │ │ │ │ ├── mczee142.pbm │ │ │ │ ├── mczee143.pbm │ │ │ │ ├── mczee144.pbm │ │ │ │ ├── mczee145.pbm │ │ │ │ ├── mczee146.pbm │ │ │ │ ├── mczee147.pbm │ │ │ │ ├── mczee15.pbm │ │ │ │ ├── mczee16.pbm │ │ │ │ ├── mczee17.pbm │ │ │ │ ├── mczee18.pbm │ │ │ │ ├── mczee19.pbm │ │ │ │ ├── mczee2.pbm │ │ │ │ ├── mczee20.pbm │ │ │ │ ├── mczee21.pbm │ │ │ │ ├── mczee22.pbm │ │ │ │ ├── mczee23.pbm │ │ │ │ ├── mczee24.pbm │ │ │ │ ├── mczee25.pbm │ │ │ │ ├── mczee26.pbm │ │ │ │ ├── mczee27.pbm │ │ │ │ ├── mczee28.pbm │ │ │ │ ├── mczee29.pbm │ │ │ │ ├── mczee3.pbm │ │ │ │ ├── mczee30.pbm │ │ │ │ ├── mczee31.pbm │ │ │ │ ├── mczee32.pbm │ │ │ │ ├── mczee33.pbm │ │ │ │ ├── mczee34.pbm │ │ │ │ ├── mczee35.pbm │ │ │ │ ├── mczee36.pbm │ │ │ │ ├── mczee37.pbm │ │ │ │ ├── mczee38.pbm │ │ │ │ ├── mczee39.pbm │ │ │ │ ├── mczee4.pbm │ │ │ │ ├── mczee40.pbm │ │ │ │ ├── mczee41.pbm │ │ │ │ ├── mczee42.pbm │ │ │ │ ├── mczee43.pbm │ │ │ │ ├── mczee44.pbm │ │ │ │ ├── mczee45.pbm │ │ │ │ ├── mczee46.pbm │ │ │ │ ├── mczee47.pbm │ │ │ │ ├── mczee48.pbm │ │ │ │ ├── mczee49.pbm │ │ │ │ ├── mczee5.pbm │ │ │ │ ├── mczee50.pbm │ │ │ │ ├── mczee51.pbm │ │ │ │ ├── mczee52.pbm │ │ │ │ ├── mczee53.pbm │ │ │ │ ├── mczee54.pbm │ │ │ │ ├── mczee55.pbm │ │ │ │ ├── mczee56.pbm │ │ │ │ ├── mczee57.pbm │ │ │ │ ├── mczee58.pbm │ │ │ │ ├── mczee59.pbm │ │ │ │ ├── mczee6.pbm │ │ │ │ ├── mczee60.pbm │ │ │ │ ├── mczee61.pbm │ │ │ │ ├── mczee62.pbm │ │ │ │ ├── mczee63.pbm │ │ │ │ ├── mczee64.pbm │ │ │ │ ├── mczee65.pbm │ │ │ │ ├── mczee66.pbm │ │ │ │ ├── mczee67.pbm │ │ │ │ ├── mczee68.pbm │ │ │ │ ├── mczee69.pbm │ │ │ │ ├── mczee7.pbm │ │ │ │ ├── mczee70.pbm │ │ │ │ ├── mczee71.pbm │ │ │ │ ├── mczee72.pbm │ │ │ │ ├── mczee73.pbm │ │ │ │ ├── mczee74.pbm │ │ │ │ ├── mczee75.pbm │ │ │ │ ├── mczee76.pbm │ │ │ │ ├── mczee77.pbm │ │ │ │ ├── mczee78.pbm │ │ │ │ ├── mczee79.pbm │ │ │ │ ├── mczee8.pbm │ │ │ │ ├── mczee80.pbm │ │ │ │ ├── mczee81.pbm │ │ │ │ ├── mczee82.pbm │ │ │ │ ├── mczee83.pbm │ │ │ │ ├── mczee84.pbm │ │ │ │ ├── mczee85.pbm │ │ │ │ ├── mczee86.pbm │ │ │ │ ├── mczee87.pbm │ │ │ │ ├── mczee88.pbm │ │ │ │ ├── mczee89.pbm │ │ │ │ ├── mczee9.pbm │ │ │ │ ├── mczee90.pbm │ │ │ │ ├── mczee91.pbm │ │ │ │ ├── mczee92.pbm │ │ │ │ ├── mczee93.pbm │ │ │ │ ├── mczee94.pbm │ │ │ │ ├── mczee95.pbm │ │ │ │ ├── mczee96.pbm │ │ │ │ ├── mczee97.pbm │ │ │ │ ├── mczee98.pbm │ │ │ │ ├── mczee99.pbm │ │ │ │ └── snackbr2.pbm │ │ │ ├── splash/ │ │ │ │ ├── homelogo.pbm │ │ │ │ └── splash.pbm │ │ │ ├── street/ │ │ │ │ ├── mask.pbm │ │ │ │ ├── mca001.pbm │ │ │ │ ├── street1.pbm │ │ │ │ ├── street2.pbm │ │ │ │ └── street3.pbm │ │ │ ├── studio/ │ │ │ │ ├── box1.pbm │ │ │ │ ├── box2.pbm │ │ │ │ ├── box3.pbm │ │ │ │ ├── box4.pbm │ │ │ │ ├── box5.pbm │ │ │ │ ├── box6.pbm │ │ │ │ ├── buttns1.pbm │ │ │ │ ├── buttns1a.pbm │ │ │ │ ├── buttns1b.pbm │ │ │ │ ├── buttns2.pbm │ │ │ │ ├── buttns3.pbm │ │ │ │ ├── cyc1.pbm │ │ │ │ ├── cyc10.pbm │ │ │ │ ├── cyc11.pbm │ │ │ │ ├── cyc12.pbm │ │ │ │ ├── cyc13.pbm │ │ │ │ ├── cyc14.pbm │ │ │ │ ├── cyc15.pbm │ │ │ │ ├── cyc16.pbm │ │ │ │ ├── cyc17.pbm │ │ │ │ ├── cyc18.pbm │ │ │ │ ├── cyc19.pbm │ │ │ │ ├── cyc2.pbm │ │ │ │ ├── cyc20.pbm │ │ │ │ ├── cyc21.pbm │ │ │ │ ├── cyc22.pbm │ │ │ │ ├── cyc23.pbm │ │ │ │ ├── cyc24.pbm │ │ │ │ ├── cyc25.pbm │ │ │ │ ├── cyc26.pbm │ │ │ │ ├── cyc27.pbm │ │ │ │ ├── cyc28.pbm │ │ │ │ ├── cyc29.pbm │ │ │ │ ├── cyc3.pbm │ │ │ │ ├── cyc30.pbm │ │ │ │ ├── cyc31.pbm │ │ │ │ ├── cyc32.pbm │ │ │ │ ├── cyc33.pbm │ │ │ │ ├── cyc34.pbm │ │ │ │ ├── cyc35.pbm │ │ │ │ ├── cyc36.pbm │ │ │ │ ├── cyc37.pbm │ │ │ │ ├── cyc38.pbm │ │ │ │ ├── cyc39.pbm │ │ │ │ ├── cyc4.pbm │ │ │ │ ├── cyc40.pbm │ │ │ │ ├── cyc41.pbm │ │ │ │ ├── cyc42.pbm │ │ │ │ ├── cyc43.pbm │ │ │ │ ├── cyc44.pbm │ │ │ │ ├── cyc45.pbm │ │ │ │ ├── cyc46.pbm │ │ │ │ ├── cyc47.pbm │ │ │ │ ├── cyc48.pbm │ │ │ │ ├── cyc49.pbm │ │ │ │ ├── cyc5.pbm │ │ │ │ ├── cyc50.pbm │ │ │ │ ├── cyc51.pbm │ │ │ │ ├── cyc52.pbm │ │ │ │ ├── cyc53.pbm │ │ │ │ ├── cyc54.pbm │ │ │ │ ├── cyc55.pbm │ │ │ │ ├── cyc56.pbm │ │ │ │ ├── cyc57.pbm │ │ │ │ ├── cyc58.pbm │ │ │ │ ├── cyc59.pbm │ │ │ │ ├── cyc6.pbm │ │ │ │ ├── cyc60.pbm │ │ │ │ ├── cyc61.pbm │ │ │ │ ├── cyc62.pbm │ │ │ │ ├── cyc63.pbm │ │ │ │ ├── cyc64.pbm │ │ │ │ ├── cyc65.pbm │ │ │ │ ├── cyc66.pbm │ │ │ │ ├── cyc67.pbm │ │ │ │ ├── cyc68.pbm │ │ │ │ ├── cyc7.pbm │ │ │ │ ├── cyc8.pbm │ │ │ │ ├── cyc9.pbm │ │ │ │ ├── mczee1.pbm │ │ │ │ ├── mczee10.pbm │ │ │ │ ├── mczee100.pbm │ │ │ │ ├── mczee101.pbm │ │ │ │ ├── mczee102.pbm │ │ │ │ ├── mczee103.pbm │ │ │ │ ├── mczee104.pbm │ │ │ │ ├── mczee105.pbm │ │ │ │ ├── mczee106.pbm │ │ │ │ ├── mczee107.pbm │ │ │ │ ├── mczee108.pbm │ │ │ │ ├── mczee109.pbm │ │ │ │ ├── mczee11.pbm │ │ │ │ ├── mczee110.pbm │ │ │ │ ├── mczee111.pbm │ │ │ │ ├── mczee112.pbm │ │ │ │ ├── mczee113.pbm │ │ │ │ ├── mczee114.pbm │ │ │ │ ├── mczee115.pbm │ │ │ │ ├── mczee116.pbm │ │ │ │ ├── mczee117.pbm │ │ │ │ ├── mczee118.pbm │ │ │ │ ├── mczee119.pbm │ │ │ │ ├── mczee12.pbm │ │ │ │ ├── mczee120.pbm │ │ │ │ ├── mczee121.pbm │ │ │ │ ├── mczee122.pbm │ │ │ │ ├── mczee123.pbm │ │ │ │ ├── mczee124.pbm │ │ │ │ ├── mczee125.pbm │ │ │ │ ├── mczee126.pbm │ │ │ │ ├── mczee127.pbm │ │ │ │ ├── mczee128.pbm │ │ │ │ ├── mczee129.pbm │ │ │ │ ├── mczee13.pbm │ │ │ │ ├── mczee130.pbm │ │ │ │ ├── mczee131.pbm │ │ │ │ ├── mczee132.pbm │ │ │ │ ├── mczee133.pbm │ │ │ │ ├── mczee134.pbm │ │ │ │ ├── mczee135.pbm │ │ │ │ ├── mczee136.pbm │ │ │ │ ├── mczee137.pbm │ │ │ │ ├── mczee138.pbm │ │ │ │ ├── mczee14.pbm │ │ │ │ ├── mczee15.pbm │ │ │ │ ├── mczee16.pbm │ │ │ │ ├── mczee17.pbm │ │ │ │ ├── mczee18.pbm │ │ │ │ ├── mczee19.pbm │ │ │ │ ├── mczee2.pbm │ │ │ │ ├── mczee20.pbm │ │ │ │ ├── mczee21.pbm │ │ │ │ ├── mczee22.pbm │ │ │ │ ├── mczee23.pbm │ │ │ │ ├── mczee24.pbm │ │ │ │ ├── mczee25.pbm │ │ │ │ ├── mczee26.pbm │ │ │ │ ├── mczee27.pbm │ │ │ │ ├── mczee28.pbm │ │ │ │ ├── mczee29.pbm │ │ │ │ ├── mczee3.pbm │ │ │ │ ├── mczee30.pbm │ │ │ │ ├── mczee31.pbm │ │ │ │ ├── mczee32.pbm │ │ │ │ ├── mczee33.pbm │ │ │ │ ├── mczee34.pbm │ │ │ │ ├── mczee35.pbm │ │ │ │ ├── mczee36.pbm │ │ │ │ ├── mczee37.pbm │ │ │ │ ├── mczee38.pbm │ │ │ │ ├── mczee39.pbm │ │ │ │ ├── mczee4.pbm │ │ │ │ ├── mczee40.pbm │ │ │ │ ├── mczee41.pbm │ │ │ │ ├── mczee42.pbm │ │ │ │ ├── mczee43.pbm │ │ │ │ ├── mczee44.pbm │ │ │ │ ├── mczee45.pbm │ │ │ │ ├── mczee46.pbm │ │ │ │ ├── mczee47.pbm │ │ │ │ ├── mczee48.pbm │ │ │ │ ├── mczee49.pbm │ │ │ │ ├── mczee5.pbm │ │ │ │ ├── mczee50.pbm │ │ │ │ ├── mczee51.pbm │ │ │ │ ├── mczee52.pbm │ │ │ │ ├── mczee53.pbm │ │ │ │ ├── mczee54.pbm │ │ │ │ ├── mczee55.pbm │ │ │ │ ├── mczee56.pbm │ │ │ │ ├── mczee57.pbm │ │ │ │ ├── mczee58.pbm │ │ │ │ ├── mczee59.pbm │ │ │ │ ├── mczee6.pbm │ │ │ │ ├── mczee60.pbm │ │ │ │ ├── mczee61.pbm │ │ │ │ ├── mczee62.pbm │ │ │ │ ├── mczee63.pbm │ │ │ │ ├── mczee64.pbm │ │ │ │ ├── mczee65.pbm │ │ │ │ ├── mczee66.pbm │ │ │ │ ├── mczee67.pbm │ │ │ │ ├── mczee68.pbm │ │ │ │ ├── mczee69.pbm │ │ │ │ ├── mczee7.pbm │ │ │ │ ├── mczee70.pbm │ │ │ │ ├── mczee71.pbm │ │ │ │ ├── mczee72.pbm │ │ │ │ ├── mczee73.pbm │ │ │ │ ├── mczee74.pbm │ │ │ │ ├── mczee75.pbm │ │ │ │ ├── mczee76.pbm │ │ │ │ ├── mczee77.pbm │ │ │ │ ├── mczee78.pbm │ │ │ │ ├── mczee79.pbm │ │ │ │ ├── mczee8.pbm │ │ │ │ ├── mczee80.pbm │ │ │ │ ├── mczee81.pbm │ │ │ │ ├── mczee82.pbm │ │ │ │ ├── mczee83.pbm │ │ │ │ ├── mczee84.pbm │ │ │ │ ├── mczee85.pbm │ │ │ │ ├── mczee86.pbm │ │ │ │ ├── mczee87.pbm │ │ │ │ ├── mczee88.pbm │ │ │ │ ├── mczee89.pbm │ │ │ │ ├── mczee9.pbm │ │ │ │ ├── mczee90.pbm │ │ │ │ ├── mczee91.pbm │ │ │ │ ├── mczee92.pbm │ │ │ │ ├── mczee93.pbm │ │ │ │ ├── mczee94.pbm │ │ │ │ ├── mczee95.pbm │ │ │ │ ├── mczee96.pbm │ │ │ │ ├── mczee97.pbm │ │ │ │ ├── mczee98.pbm │ │ │ │ ├── mczee99.pbm │ │ │ │ ├── mzstd1.pbm │ │ │ │ ├── mzstd10.pbm │ │ │ │ ├── mzstd100.pbm │ │ │ │ ├── mzstd101.pbm │ │ │ │ ├── mzstd102.pbm │ │ │ │ ├── mzstd103.pbm │ │ │ │ ├── mzstd104.pbm │ │ │ │ ├── mzstd105.pbm │ │ │ │ ├── mzstd106.pbm │ │ │ │ ├── mzstd107.pbm │ │ │ │ ├── mzstd108.pbm │ │ │ │ ├── mzstd109.pbm │ │ │ │ ├── mzstd11.pbm │ │ │ │ ├── mzstd110.pbm │ │ │ │ ├── mzstd111.pbm │ │ │ │ ├── mzstd112.pbm │ │ │ │ ├── mzstd113.pbm │ │ │ │ ├── mzstd114.pbm │ │ │ │ ├── mzstd115.pbm │ │ │ │ ├── mzstd116.pbm │ │ │ │ ├── mzstd117.pbm │ │ │ │ ├── mzstd118.pbm │ │ │ │ ├── mzstd119.pbm │ │ │ │ ├── mzstd12.pbm │ │ │ │ ├── mzstd120.pbm │ │ │ │ ├── mzstd121.pbm │ │ │ │ ├── mzstd122.pbm │ │ │ │ ├── mzstd123.pbm │ │ │ │ ├── mzstd124.pbm │ │ │ │ ├── mzstd125.pbm │ │ │ │ ├── mzstd126.pbm │ │ │ │ ├── mzstd127.pbm │ │ │ │ ├── mzstd128.pbm │ │ │ │ ├── mzstd129.pbm │ │ │ │ ├── mzstd13.pbm │ │ │ │ ├── mzstd130.pbm │ │ │ │ ├── mzstd131.pbm │ │ │ │ ├── mzstd132.pbm │ │ │ │ ├── mzstd133.pbm │ │ │ │ ├── mzstd134.pbm │ │ │ │ ├── mzstd135.pbm │ │ │ │ ├── mzstd136.pbm │ │ │ │ ├── mzstd137.pbm │ │ │ │ ├── mzstd138.pbm │ │ │ │ ├── mzstd139.pbm │ │ │ │ ├── mzstd14.pbm │ │ │ │ ├── mzstd140.pbm │ │ │ │ ├── mzstd141.pbm │ │ │ │ ├── mzstd142.pbm │ │ │ │ ├── mzstd143.pbm │ │ │ │ ├── mzstd144.pbm │ │ │ │ ├── mzstd145.pbm │ │ │ │ ├── mzstd146.pbm │ │ │ │ ├── mzstd147.pbm │ │ │ │ ├── mzstd148.pbm │ │ │ │ ├── mzstd149.pbm │ │ │ │ ├── mzstd15.pbm │ │ │ │ ├── mzstd150.pbm │ │ │ │ ├── mzstd151.pbm │ │ │ │ ├── mzstd152.pbm │ │ │ │ ├── mzstd153.pbm │ │ │ │ ├── mzstd154.pbm │ │ │ │ ├── mzstd155.pbm │ │ │ │ ├── mzstd156.pbm │ │ │ │ ├── mzstd157.pbm │ │ │ │ ├── mzstd158.pbm │ │ │ │ ├── mzstd159.pbm │ │ │ │ ├── mzstd16.pbm │ │ │ │ ├── mzstd160.pbm │ │ │ │ ├── mzstd161.pbm │ │ │ │ ├── mzstd162.pbm │ │ │ │ ├── mzstd163.pbm │ │ │ │ ├── mzstd164.pbm │ │ │ │ ├── mzstd165.pbm │ │ │ │ ├── mzstd166.pbm │ │ │ │ ├── mzstd167.pbm │ │ │ │ ├── mzstd168.pbm │ │ │ │ ├── mzstd169.pbm │ │ │ │ ├── mzstd17.pbm │ │ │ │ ├── mzstd170.pbm │ │ │ │ ├── mzstd171.pbm │ │ │ │ ├── mzstd172.pbm │ │ │ │ ├── mzstd173.pbm │ │ │ │ ├── mzstd174.pbm │ │ │ │ ├── mzstd175.pbm │ │ │ │ ├── mzstd176.pbm │ │ │ │ ├── mzstd177.pbm │ │ │ │ ├── mzstd178.pbm │ │ │ │ ├── mzstd179.pbm │ │ │ │ ├── mzstd18.pbm │ │ │ │ ├── mzstd180.pbm │ │ │ │ ├── mzstd181.pbm │ │ │ │ ├── mzstd182.pbm │ │ │ │ ├── mzstd183.pbm │ │ │ │ ├── mzstd184.pbm │ │ │ │ ├── mzstd185.pbm │ │ │ │ ├── mzstd186.pbm │ │ │ │ ├── mzstd187.pbm │ │ │ │ ├── mzstd188.pbm │ │ │ │ ├── mzstd189.pbm │ │ │ │ ├── mzstd19.pbm │ │ │ │ ├── mzstd190.pbm │ │ │ │ ├── mzstd191.pbm │ │ │ │ ├── mzstd192.pbm │ │ │ │ ├── mzstd193.pbm │ │ │ │ ├── mzstd194.pbm │ │ │ │ ├── mzstd195.pbm │ │ │ │ ├── mzstd196.pbm │ │ │ │ ├── mzstd197.pbm │ │ │ │ ├── mzstd198.pbm │ │ │ │ ├── mzstd199.pbm │ │ │ │ ├── mzstd2.pbm │ │ │ │ ├── mzstd20.pbm │ │ │ │ ├── mzstd200.pbm │ │ │ │ ├── mzstd201.pbm │ │ │ │ ├── mzstd202.pbm │ │ │ │ ├── mzstd203.pbm │ │ │ │ ├── mzstd204.pbm │ │ │ │ ├── mzstd205.pbm │ │ │ │ ├── mzstd206.pbm │ │ │ │ ├── mzstd207.pbm │ │ │ │ ├── mzstd208.pbm │ │ │ │ ├── mzstd209.pbm │ │ │ │ ├── mzstd21.pbm │ │ │ │ ├── mzstd210.pbm │ │ │ │ ├── mzstd211.pbm │ │ │ │ ├── mzstd212.pbm │ │ │ │ ├── mzstd213.pbm │ │ │ │ ├── mzstd214.pbm │ │ │ │ ├── mzstd215.pbm │ │ │ │ ├── mzstd216.pbm │ │ │ │ ├── mzstd22.pbm │ │ │ │ ├── mzstd23.pbm │ │ │ │ ├── mzstd24.pbm │ │ │ │ ├── mzstd25.pbm │ │ │ │ ├── mzstd26.pbm │ │ │ │ ├── mzstd27.pbm │ │ │ │ ├── mzstd28.pbm │ │ │ │ ├── mzstd29.pbm │ │ │ │ ├── mzstd3.pbm │ │ │ │ ├── mzstd30.pbm │ │ │ │ ├── mzstd31.pbm │ │ │ │ ├── mzstd32.pbm │ │ │ │ ├── mzstd33.pbm │ │ │ │ ├── mzstd34.pbm │ │ │ │ ├── mzstd35.pbm │ │ │ │ ├── mzstd36.pbm │ │ │ │ ├── mzstd37.pbm │ │ │ │ ├── mzstd38.pbm │ │ │ │ ├── mzstd39.pbm │ │ │ │ ├── mzstd4.pbm │ │ │ │ ├── mzstd40.pbm │ │ │ │ ├── mzstd41.pbm │ │ │ │ ├── mzstd42.pbm │ │ │ │ ├── mzstd43.pbm │ │ │ │ ├── mzstd44.pbm │ │ │ │ ├── mzstd45.pbm │ │ │ │ ├── mzstd46.pbm │ │ │ │ ├── mzstd47.pbm │ │ │ │ ├── mzstd48.pbm │ │ │ │ ├── mzstd49.pbm │ │ │ │ ├── mzstd5.pbm │ │ │ │ ├── mzstd50.pbm │ │ │ │ ├── mzstd51.pbm │ │ │ │ ├── mzstd52.pbm │ │ │ │ ├── mzstd53.pbm │ │ │ │ ├── mzstd54.pbm │ │ │ │ ├── mzstd55.pbm │ │ │ │ ├── mzstd56.pbm │ │ │ │ ├── mzstd57.pbm │ │ │ │ ├── mzstd58.pbm │ │ │ │ ├── mzstd59.pbm │ │ │ │ ├── mzstd6.pbm │ │ │ │ ├── mzstd60.pbm │ │ │ │ ├── mzstd61.pbm │ │ │ │ ├── mzstd62.pbm │ │ │ │ ├── mzstd63.pbm │ │ │ │ ├── mzstd64.pbm │ │ │ │ ├── mzstd65.pbm │ │ │ │ ├── mzstd66.pbm │ │ │ │ ├── mzstd67.pbm │ │ │ │ ├── mzstd68.pbm │ │ │ │ ├── mzstd69.pbm │ │ │ │ ├── mzstd7.pbm │ │ │ │ ├── mzstd70.pbm │ │ │ │ ├── mzstd71.pbm │ │ │ │ ├── mzstd72.pbm │ │ │ │ ├── mzstd73.pbm │ │ │ │ ├── mzstd74.pbm │ │ │ │ ├── mzstd75.pbm │ │ │ │ ├── mzstd76.pbm │ │ │ │ ├── mzstd77.pbm │ │ │ │ ├── mzstd78.pbm │ │ │ │ ├── mzstd79.pbm │ │ │ │ ├── mzstd8.pbm │ │ │ │ ├── mzstd80.pbm │ │ │ │ ├── mzstd81.pbm │ │ │ │ ├── mzstd82.pbm │ │ │ │ ├── mzstd83.pbm │ │ │ │ ├── mzstd84.pbm │ │ │ │ ├── mzstd85.pbm │ │ │ │ ├── mzstd86.pbm │ │ │ │ ├── mzstd87.pbm │ │ │ │ ├── mzstd88.pbm │ │ │ │ ├── mzstd89.pbm │ │ │ │ ├── mzstd9.pbm │ │ │ │ ├── mzstd90.pbm │ │ │ │ ├── mzstd91.pbm │ │ │ │ ├── mzstd92.pbm │ │ │ │ ├── mzstd93.pbm │ │ │ │ ├── mzstd94.pbm │ │ │ │ ├── mzstd95.pbm │ │ │ │ ├── mzstd96.pbm │ │ │ │ ├── mzstd97.pbm │ │ │ │ ├── mzstd98.pbm │ │ │ │ ├── mzstd99.pbm │ │ │ │ ├── st1tbx.pbm │ │ │ │ ├── st2doors.pbm │ │ │ │ ├── st2exit.pbm │ │ │ │ ├── st2map.pbm │ │ │ │ ├── studio1.pbm │ │ │ │ ├── studio1b.pbm │ │ │ │ ├── studio2.pbm │ │ │ │ ├── studio3.pbm │ │ │ │ ├── studio4.pbm │ │ │ │ ├── tv1.pbm │ │ │ │ ├── tv10.pbm │ │ │ │ ├── tv11.pbm │ │ │ │ ├── tv12.pbm │ │ │ │ ├── tv13.pbm │ │ │ │ ├── tv14.pbm │ │ │ │ ├── tv15.pbm │ │ │ │ ├── tv16.pbm │ │ │ │ ├── tv17.pbm │ │ │ │ ├── tv18.pbm │ │ │ │ ├── tv19.pbm │ │ │ │ ├── tv2.pbm │ │ │ │ ├── tv20.pbm │ │ │ │ ├── tv21.pbm │ │ │ │ ├── tv22.pbm │ │ │ │ ├── tv23.pbm │ │ │ │ ├── tv24.pbm │ │ │ │ ├── tv25.pbm │ │ │ │ ├── tv3.pbm │ │ │ │ ├── tv4.pbm │ │ │ │ ├── tv5.pbm │ │ │ │ ├── tv6.pbm │ │ │ │ ├── tv7.pbm │ │ │ │ ├── tv8.pbm │ │ │ │ └── tv9.pbm │ │ │ ├── theatre/ │ │ │ │ ├── bkleft.pbm │ │ │ │ ├── bkright.pbm │ │ │ │ ├── ldoor49.pbm │ │ │ │ ├── ldoor50.pbm │ │ │ │ ├── ldoor51.pbm │ │ │ │ ├── ldoor52.pbm │ │ │ │ ├── ldoor53.pbm │ │ │ │ ├── left.pbm │ │ │ │ ├── leftdr.pbm │ │ │ │ ├── play1.pbm │ │ │ │ ├── play2.pbm │ │ │ │ ├── rewind1.pbm │ │ │ │ ├── rewind2.pbm │ │ │ │ ├── right.pbm │ │ │ │ ├── rightdr.pbm │ │ │ │ ├── th2door.pbm │ │ │ │ ├── the1dark.pbm │ │ │ │ ├── the2map.pbm │ │ │ │ ├── the2quit.pbm │ │ │ │ ├── the3map.pbm │ │ │ │ ├── the3quit.pbm │ │ │ │ ├── the4map.pbm │ │ │ │ ├── the4quit.pbm │ │ │ │ ├── theatre1.pbm │ │ │ │ ├── theatre2.pbm │ │ │ │ ├── theatre3.pbm │ │ │ │ ├── theatre4.pbm │ │ │ │ ├── thr1_1.pbm │ │ │ │ ├── thr1_10.pbm │ │ │ │ ├── thr1_11.pbm │ │ │ │ ├── thr1_12.pbm │ │ │ │ ├── thr1_13.pbm │ │ │ │ ├── thr1_14.pbm │ │ │ │ ├── thr1_15.pbm │ │ │ │ ├── thr1_16.pbm │ │ │ │ ├── thr1_17.pbm │ │ │ │ ├── thr1_18.pbm │ │ │ │ ├── thr1_19.pbm │ │ │ │ ├── thr1_2.pbm │ │ │ │ ├── thr1_20.pbm │ │ │ │ ├── thr1_21.pbm │ │ │ │ ├── thr1_22.pbm │ │ │ │ ├── thr1_23.pbm │ │ │ │ ├── thr1_24.pbm │ │ │ │ ├── thr1_25.pbm │ │ │ │ ├── thr1_26.pbm │ │ │ │ ├── thr1_27.pbm │ │ │ │ ├── thr1_28.pbm │ │ │ │ ├── thr1_29.pbm │ │ │ │ ├── thr1_3.pbm │ │ │ │ ├── thr1_30.pbm │ │ │ │ ├── thr1_31.pbm │ │ │ │ ├── thr1_32.pbm │ │ │ │ ├── thr1_33.pbm │ │ │ │ ├── thr1_34.pbm │ │ │ │ ├── thr1_35.pbm │ │ │ │ ├── thr1_36.pbm │ │ │ │ ├── thr1_37.pbm │ │ │ │ ├── thr1_38.pbm │ │ │ │ ├── thr1_39.pbm │ │ │ │ ├── thr1_4.pbm │ │ │ │ ├── thr1_40.pbm │ │ │ │ ├── thr1_41.pbm │ │ │ │ ├── thr1_42.pbm │ │ │ │ ├── thr1_43.pbm │ │ │ │ ├── thr1_44.pbm │ │ │ │ ├── thr1_45.pbm │ │ │ │ ├── thr1_46.pbm │ │ │ │ ├── thr1_47.pbm │ │ │ │ ├── thr1_48.pbm │ │ │ │ ├── thr1_49.pbm │ │ │ │ ├── thr1_5.pbm │ │ │ │ ├── thr1_50.pbm │ │ │ │ ├── thr1_51.pbm │ │ │ │ ├── thr1_52.pbm │ │ │ │ ├── thr1_53.pbm │ │ │ │ ├── thr1_54.pbm │ │ │ │ ├── thr1_55.pbm │ │ │ │ ├── thr1_56.pbm │ │ │ │ ├── thr1_57.pbm │ │ │ │ ├── thr1_58.pbm │ │ │ │ ├── thr1_6.pbm │ │ │ │ ├── thr1_7.pbm │ │ │ │ ├── thr1_8.pbm │ │ │ │ ├── thr1_9.pbm │ │ │ │ ├── thr2a1.pbm │ │ │ │ ├── thr2a10.pbm │ │ │ │ ├── thr2a11.pbm │ │ │ │ ├── thr2a12.pbm │ │ │ │ ├── thr2a13.pbm │ │ │ │ ├── thr2a2.pbm │ │ │ │ ├── thr2a3.pbm │ │ │ │ ├── thr2a4.pbm │ │ │ │ ├── thr2a5.pbm │ │ │ │ ├── thr2a6.pbm │ │ │ │ ├── thr2a7.pbm │ │ │ │ ├── thr2a8.pbm │ │ │ │ ├── thr2a9.pbm │ │ │ │ ├── thr2b1.pbm │ │ │ │ ├── thr2b10.pbm │ │ │ │ ├── thr2b11.pbm │ │ │ │ ├── thr2b12.pbm │ │ │ │ ├── thr2b13.pbm │ │ │ │ ├── thr2b14.pbm │ │ │ │ ├── thr2b15.pbm │ │ │ │ ├── thr2b16.pbm │ │ │ │ ├── thr2b17.pbm │ │ │ │ ├── thr2b18.pbm │ │ │ │ ├── thr2b19.pbm │ │ │ │ ├── thr2b2.pbm │ │ │ │ ├── thr2b20.pbm │ │ │ │ ├── thr2b21.pbm │ │ │ │ ├── thr2b22.pbm │ │ │ │ ├── thr2b23.pbm │ │ │ │ ├── thr2b24.pbm │ │ │ │ ├── thr2b25.pbm │ │ │ │ ├── thr2b26.pbm │ │ │ │ ├── thr2b27.pbm │ │ │ │ ├── thr2b28.pbm │ │ │ │ ├── thr2b29.pbm │ │ │ │ ├── thr2b3.pbm │ │ │ │ ├── thr2b4.pbm │ │ │ │ ├── thr2b5.pbm │ │ │ │ ├── thr2b6.pbm │ │ │ │ ├── thr2b7.pbm │ │ │ │ ├── thr2b8.pbm │ │ │ │ ├── thr2b9.pbm │ │ │ │ ├── thr2d1.pbm │ │ │ │ ├── thr2d10.pbm │ │ │ │ ├── thr2d11.pbm │ │ │ │ ├── thr2d12.pbm │ │ │ │ ├── thr2d13.pbm │ │ │ │ ├── thr2d14.pbm │ │ │ │ ├── thr2d15.pbm │ │ │ │ ├── thr2d16.pbm │ │ │ │ ├── thr2d17.pbm │ │ │ │ ├── thr2d18.pbm │ │ │ │ ├── thr2d19.pbm │ │ │ │ ├── thr2d2.pbm │ │ │ │ ├── thr2d20.pbm │ │ │ │ ├── thr2d21.pbm │ │ │ │ ├── thr2d22.pbm │ │ │ │ ├── thr2d3.pbm │ │ │ │ ├── thr2d4.pbm │ │ │ │ ├── thr2d5.pbm │ │ │ │ ├── thr2d6.pbm │ │ │ │ ├── thr2d7.pbm │ │ │ │ ├── thr2d8.pbm │ │ │ │ ├── thr2d9.pbm │ │ │ │ ├── thr2e1.pbm │ │ │ │ ├── thr2e10.pbm │ │ │ │ ├── thr2e11.pbm │ │ │ │ ├── thr2e12.pbm │ │ │ │ ├── thr2e13.pbm │ │ │ │ ├── thr2e14.pbm │ │ │ │ ├── thr2e15.pbm │ │ │ │ ├── thr2e16.pbm │ │ │ │ ├── thr2e17.pbm │ │ │ │ ├── thr2e18.pbm │ │ │ │ ├── thr2e19.pbm │ │ │ │ ├── thr2e2.pbm │ │ │ │ ├── thr2e20.pbm │ │ │ │ ├── thr2e21.pbm │ │ │ │ ├── thr2e3.pbm │ │ │ │ ├── thr2e4.pbm │ │ │ │ ├── thr2e5.pbm │ │ │ │ ├── thr2e6.pbm │ │ │ │ ├── thr2e7.pbm │ │ │ │ ├── thr2e8.pbm │ │ │ │ ├── thr2e9.pbm │ │ │ │ ├── thr2f1.pbm │ │ │ │ ├── thr2f10.pbm │ │ │ │ ├── thr2f11.pbm │ │ │ │ ├── thr2f12.pbm │ │ │ │ ├── thr2f13.pbm │ │ │ │ ├── thr2f14.pbm │ │ │ │ ├── thr2f15.pbm │ │ │ │ ├── thr2f16.pbm │ │ │ │ ├── thr2f17.pbm │ │ │ │ ├── thr2f18.pbm │ │ │ │ ├── thr2f19.pbm │ │ │ │ ├── thr2f2.pbm │ │ │ │ ├── thr2f20.pbm │ │ │ │ ├── thr2f21.pbm │ │ │ │ ├── thr2f22.pbm │ │ │ │ ├── thr2f23.pbm │ │ │ │ ├── thr2f24.pbm │ │ │ │ ├── thr2f25.pbm │ │ │ │ ├── thr2f26.pbm │ │ │ │ ├── thr2f27.pbm │ │ │ │ ├── thr2f28.pbm │ │ │ │ ├── thr2f29.pbm │ │ │ │ ├── thr2f3.pbm │ │ │ │ ├── thr2f30.pbm │ │ │ │ ├── thr2f31.pbm │ │ │ │ ├── thr2f32.pbm │ │ │ │ ├── thr2f33.pbm │ │ │ │ ├── thr2f34.pbm │ │ │ │ ├── thr2f35.pbm │ │ │ │ ├── thr2f4.pbm │ │ │ │ ├── thr2f5.pbm │ │ │ │ ├── thr2f6.pbm │ │ │ │ ├── thr2f7.pbm │ │ │ │ ├── thr2f8.pbm │ │ │ │ ├── thr2f9.pbm │ │ │ │ ├── thr4_1.pbm │ │ │ │ ├── thr4_10.pbm │ │ │ │ ├── thr4_11.pbm │ │ │ │ ├── thr4_12.pbm │ │ │ │ ├── thr4_13.pbm │ │ │ │ ├── thr4_14.pbm │ │ │ │ ├── thr4_15.pbm │ │ │ │ ├── thr4_16.pbm │ │ │ │ ├── thr4_17.pbm │ │ │ │ ├── thr4_18.pbm │ │ │ │ ├── thr4_19.pbm │ │ │ │ ├── thr4_2.pbm │ │ │ │ ├── thr4_20.pbm │ │ │ │ ├── thr4_21.pbm │ │ │ │ ├── thr4_22.pbm │ │ │ │ ├── thr4_23.pbm │ │ │ │ ├── thr4_24.pbm │ │ │ │ ├── thr4_25.pbm │ │ │ │ ├── thr4_26.pbm │ │ │ │ ├── thr4_27.pbm │ │ │ │ ├── thr4_28.pbm │ │ │ │ ├── thr4_29.pbm │ │ │ │ ├── thr4_3.pbm │ │ │ │ ├── thr4_30.pbm │ │ │ │ ├── thr4_31.pbm │ │ │ │ ├── thr4_32.pbm │ │ │ │ ├── thr4_33.pbm │ │ │ │ ├── thr4_34.pbm │ │ │ │ ├── thr4_35.pbm │ │ │ │ ├── thr4_36.pbm │ │ │ │ ├── thr4_37.pbm │ │ │ │ ├── thr4_38.pbm │ │ │ │ ├── thr4_39.pbm │ │ │ │ ├── thr4_4.pbm │ │ │ │ ├── thr4_40.pbm │ │ │ │ ├── thr4_41.pbm │ │ │ │ ├── thr4_42.pbm │ │ │ │ ├── thr4_43.pbm │ │ │ │ ├── thr4_44.pbm │ │ │ │ ├── thr4_45.pbm │ │ │ │ ├── thr4_46.pbm │ │ │ │ ├── thr4_47.pbm │ │ │ │ ├── thr4_48.pbm │ │ │ │ ├── thr4_49.pbm │ │ │ │ ├── thr4_5.pbm │ │ │ │ ├── thr4_50.pbm │ │ │ │ ├── thr4_51.pbm │ │ │ │ ├── thr4_52.pbm │ │ │ │ ├── thr4_53.pbm │ │ │ │ ├── thr4_54.pbm │ │ │ │ ├── thr4_6.pbm │ │ │ │ ├── thr4_7.pbm │ │ │ │ ├── thr4_8.pbm │ │ │ │ ├── thr4_9.pbm │ │ │ │ ├── thrcy1.pbm │ │ │ │ ├── thrcy10.pbm │ │ │ │ ├── thrcy11.pbm │ │ │ │ ├── thrcy12.pbm │ │ │ │ ├── thrcy13.pbm │ │ │ │ ├── thrcy14.pbm │ │ │ │ ├── thrcy15.pbm │ │ │ │ ├── thrcy16.pbm │ │ │ │ ├── thrcy17.pbm │ │ │ │ ├── thrcy18.pbm │ │ │ │ ├── thrcy19.pbm │ │ │ │ ├── thrcy2.pbm │ │ │ │ ├── thrcy20.pbm │ │ │ │ ├── thrcy21.pbm │ │ │ │ ├── thrcy22.pbm │ │ │ │ ├── thrcy23.pbm │ │ │ │ ├── thrcy24.pbm │ │ │ │ ├── thrcy25.pbm │ │ │ │ ├── thrcy26.pbm │ │ │ │ ├── thrcy27.pbm │ │ │ │ ├── thrcy28.pbm │ │ │ │ ├── thrcy3.pbm │ │ │ │ ├── thrcy4.pbm │ │ │ │ ├── thrcy5.pbm │ │ │ │ ├── thrcy6.pbm │ │ │ │ ├── thrcy7.pbm │ │ │ │ ├── thrcy8.pbm │ │ │ │ ├── thrcy9.pbm │ │ │ │ └── thumb.pbm │ │ │ ├── ticket/ │ │ │ │ ├── foo.pbm │ │ │ │ ├── mczee1.pbm │ │ │ │ ├── mczee10.pbm │ │ │ │ ├── mczee100.pbm │ │ │ │ ├── mczee101.pbm │ │ │ │ ├── mczee102.pbm │ │ │ │ ├── mczee103.pbm │ │ │ │ ├── mczee104.pbm │ │ │ │ ├── mczee105.pbm │ │ │ │ ├── mczee106.pbm │ │ │ │ ├── mczee107.pbm │ │ │ │ ├── mczee108.pbm │ │ │ │ ├── mczee109.pbm │ │ │ │ ├── mczee11.pbm │ │ │ │ ├── mczee110.pbm │ │ │ │ ├── mczee111.pbm │ │ │ │ ├── mczee112.pbm │ │ │ │ ├── mczee113.pbm │ │ │ │ ├── mczee114.pbm │ │ │ │ ├── mczee115.pbm │ │ │ │ ├── mczee116.pbm │ │ │ │ ├── mczee117.pbm │ │ │ │ ├── mczee118.pbm │ │ │ │ ├── mczee119.pbm │ │ │ │ ├── mczee12.pbm │ │ │ │ ├── mczee120.pbm │ │ │ │ ├── mczee121.pbm │ │ │ │ ├── mczee122.pbm │ │ │ │ ├── mczee123.pbm │ │ │ │ ├── mczee124.pbm │ │ │ │ ├── mczee125.pbm │ │ │ │ ├── mczee126.pbm │ │ │ │ ├── mczee127.pbm │ │ │ │ ├── mczee128.pbm │ │ │ │ ├── mczee129.pbm │ │ │ │ ├── mczee13.pbm │ │ │ │ ├── mczee130.pbm │ │ │ │ ├── mczee131.pbm │ │ │ │ ├── mczee132.pbm │ │ │ │ ├── mczee133.pbm │ │ │ │ ├── mczee134.pbm │ │ │ │ ├── mczee135.pbm │ │ │ │ ├── mczee136.pbm │ │ │ │ ├── mczee137.pbm │ │ │ │ ├── mczee138.pbm │ │ │ │ ├── mczee139.pbm │ │ │ │ ├── mczee14.pbm │ │ │ │ ├── mczee140.pbm │ │ │ │ ├── mczee141.pbm │ │ │ │ ├── mczee142.pbm │ │ │ │ ├── mczee143.pbm │ │ │ │ ├── mczee144.pbm │ │ │ │ ├── mczee145.pbm │ │ │ │ ├── mczee146.pbm │ │ │ │ ├── mczee147.pbm │ │ │ │ ├── mczee148.pbm │ │ │ │ ├── mczee149.pbm │ │ │ │ ├── mczee15.pbm │ │ │ │ ├── mczee150.pbm │ │ │ │ ├── mczee151.pbm │ │ │ │ ├── mczee152.pbm │ │ │ │ ├── mczee153.pbm │ │ │ │ ├── mczee154.pbm │ │ │ │ ├── mczee155.pbm │ │ │ │ ├── mczee156.pbm │ │ │ │ ├── mczee157.pbm │ │ │ │ ├── mczee158.pbm │ │ │ │ ├── mczee159.pbm │ │ │ │ ├── mczee16.pbm │ │ │ │ ├── mczee160.pbm │ │ │ │ ├── mczee161.pbm │ │ │ │ ├── mczee162.pbm │ │ │ │ ├── mczee163.pbm │ │ │ │ ├── mczee164.pbm │ │ │ │ ├── mczee165.pbm │ │ │ │ ├── mczee166.pbm │ │ │ │ ├── mczee167.pbm │ │ │ │ ├── mczee168.pbm │ │ │ │ ├── mczee169.pbm │ │ │ │ ├── mczee17.pbm │ │ │ │ ├── mczee170.pbm │ │ │ │ ├── mczee171.pbm │ │ │ │ ├── mczee172.pbm │ │ │ │ ├── mczee173.pbm │ │ │ │ ├── mczee174.pbm │ │ │ │ ├── mczee175.pbm │ │ │ │ ├── mczee176.pbm │ │ │ │ ├── mczee177.pbm │ │ │ │ ├── mczee178.pbm │ │ │ │ ├── mczee179.pbm │ │ │ │ ├── mczee18.pbm │ │ │ │ ├── mczee180.pbm │ │ │ │ ├── mczee181.pbm │ │ │ │ ├── mczee182.pbm │ │ │ │ ├── mczee183.pbm │ │ │ │ ├── mczee184.pbm │ │ │ │ ├── mczee185.pbm │ │ │ │ ├── mczee186.pbm │ │ │ │ ├── mczee187.pbm │ │ │ │ ├── mczee188.pbm │ │ │ │ ├── mczee189.pbm │ │ │ │ ├── mczee19.pbm │ │ │ │ ├── mczee190.pbm │ │ │ │ ├── mczee191.pbm │ │ │ │ ├── mczee192.pbm │ │ │ │ ├── mczee193.pbm │ │ │ │ ├── mczee194.pbm │ │ │ │ ├── mczee195.pbm │ │ │ │ ├── mczee196.pbm │ │ │ │ ├── mczee197.pbm │ │ │ │ ├── mczee198.pbm │ │ │ │ ├── mczee199.pbm │ │ │ │ ├── mczee2.pbm │ │ │ │ ├── mczee20.pbm │ │ │ │ ├── mczee200.pbm │ │ │ │ ├── mczee201.pbm │ │ │ │ ├── mczee202.pbm │ │ │ │ ├── mczee203.pbm │ │ │ │ ├── mczee204.pbm │ │ │ │ ├── mczee205.pbm │ │ │ │ ├── mczee206.pbm │ │ │ │ ├── mczee207.pbm │ │ │ │ ├── mczee208.pbm │ │ │ │ ├── mczee209.pbm │ │ │ │ ├── mczee21.pbm │ │ │ │ ├── mczee210.pbm │ │ │ │ ├── mczee211.pbm │ │ │ │ ├── mczee212.pbm │ │ │ │ ├── mczee213.pbm │ │ │ │ ├── mczee214.pbm │ │ │ │ ├── mczee215.pbm │ │ │ │ ├── mczee216.pbm │ │ │ │ ├── mczee217.pbm │ │ │ │ ├── mczee218.pbm │ │ │ │ ├── mczee219.pbm │ │ │ │ ├── mczee22.pbm │ │ │ │ ├── mczee220.pbm │ │ │ │ ├── mczee221.pbm │ │ │ │ ├── mczee222.pbm │ │ │ │ ├── mczee223.pbm │ │ │ │ ├── mczee224.pbm │ │ │ │ ├── mczee225.pbm │ │ │ │ ├── mczee226.pbm │ │ │ │ ├── mczee227.pbm │ │ │ │ ├── mczee228.pbm │ │ │ │ ├── mczee229.pbm │ │ │ │ ├── mczee23.pbm │ │ │ │ ├── mczee230.pbm │ │ │ │ ├── mczee231.pbm │ │ │ │ ├── mczee232.pbm │ │ │ │ ├── mczee233.pbm │ │ │ │ ├── mczee234.pbm │ │ │ │ ├── mczee235.pbm │ │ │ │ ├── mczee236.pbm │ │ │ │ ├── mczee237.pbm │ │ │ │ ├── mczee238.pbm │ │ │ │ ├── mczee239.pbm │ │ │ │ ├── mczee24.pbm │ │ │ │ ├── mczee240.pbm │ │ │ │ ├── mczee241.pbm │ │ │ │ ├── mczee242.pbm │ │ │ │ ├── mczee243.pbm │ │ │ │ ├── mczee244.pbm │ │ │ │ ├── mczee245.pbm │ │ │ │ ├── mczee246.pbm │ │ │ │ ├── mczee247.pbm │ │ │ │ ├── mczee248.pbm │ │ │ │ ├── mczee249.pbm │ │ │ │ ├── mczee25.pbm │ │ │ │ ├── mczee250.pbm │ │ │ │ ├── mczee251.pbm │ │ │ │ ├── mczee252.pbm │ │ │ │ ├── mczee253.pbm │ │ │ │ ├── mczee254.pbm │ │ │ │ ├── mczee255.pbm │ │ │ │ ├── mczee256.pbm │ │ │ │ ├── mczee257.pbm │ │ │ │ ├── mczee258.pbm │ │ │ │ ├── mczee259.pbm │ │ │ │ ├── mczee26.pbm │ │ │ │ ├── mczee260.pbm │ │ │ │ ├── mczee261.pbm │ │ │ │ ├── mczee262.pbm │ │ │ │ ├── mczee263.pbm │ │ │ │ ├── mczee264.pbm │ │ │ │ ├── mczee265.pbm │ │ │ │ ├── mczee266.pbm │ │ │ │ ├── mczee267.pbm │ │ │ │ ├── mczee268.pbm │ │ │ │ ├── mczee269.pbm │ │ │ │ ├── mczee27.pbm │ │ │ │ ├── mczee270.pbm │ │ │ │ ├── mczee271.pbm │ │ │ │ ├── mczee272.pbm │ │ │ │ ├── mczee273.pbm │ │ │ │ ├── mczee274.pbm │ │ │ │ ├── mczee275.pbm │ │ │ │ ├── mczee276.pbm │ │ │ │ ├── mczee277.pbm │ │ │ │ ├── mczee278.pbm │ │ │ │ ├── mczee279.pbm │ │ │ │ ├── mczee28.pbm │ │ │ │ ├── mczee280.pbm │ │ │ │ ├── mczee281.pbm │ │ │ │ ├── mczee282.pbm │ │ │ │ ├── mczee283.pbm │ │ │ │ ├── mczee284.pbm │ │ │ │ ├── mczee285.pbm │ │ │ │ ├── mczee286.pbm │ │ │ │ ├── mczee29.pbm │ │ │ │ ├── mczee3.pbm │ │ │ │ ├── mczee30.pbm │ │ │ │ ├── mczee31.pbm │ │ │ │ ├── mczee32.pbm │ │ │ │ ├── mczee33.pbm │ │ │ │ ├── mczee34.pbm │ │ │ │ ├── mczee35.pbm │ │ │ │ ├── mczee36.pbm │ │ │ │ ├── mczee37.pbm │ │ │ │ ├── mczee38.pbm │ │ │ │ ├── mczee39.pbm │ │ │ │ ├── mczee4.pbm │ │ │ │ ├── mczee40.pbm │ │ │ │ ├── mczee41.pbm │ │ │ │ ├── mczee42.pbm │ │ │ │ ├── mczee43.pbm │ │ │ │ ├── mczee44.pbm │ │ │ │ ├── mczee45.pbm │ │ │ │ ├── mczee46.pbm │ │ │ │ ├── mczee47.pbm │ │ │ │ ├── mczee48.pbm │ │ │ │ ├── mczee49.pbm │ │ │ │ ├── mczee5.pbm │ │ │ │ ├── mczee50.pbm │ │ │ │ ├── mczee51.pbm │ │ │ │ ├── mczee52.pbm │ │ │ │ ├── mczee53.pbm │ │ │ │ ├── mczee54.pbm │ │ │ │ ├── mczee55.pbm │ │ │ │ ├── mczee56.pbm │ │ │ │ ├── mczee57.pbm │ │ │ │ ├── mczee58.pbm │ │ │ │ ├── mczee59.pbm │ │ │ │ ├── mczee6.pbm │ │ │ │ ├── mczee60.pbm │ │ │ │ ├── mczee61.pbm │ │ │ │ ├── mczee62.pbm │ │ │ │ ├── mczee63.pbm │ │ │ │ ├── mczee64.pbm │ │ │ │ ├── mczee65.pbm │ │ │ │ ├── mczee66.pbm │ │ │ │ ├── mczee67.pbm │ │ │ │ ├── mczee68.pbm │ │ │ │ ├── mczee69.pbm │ │ │ │ ├── mczee7.pbm │ │ │ │ ├── mczee70.pbm │ │ │ │ ├── mczee71.pbm │ │ │ │ ├── mczee72.pbm │ │ │ │ ├── mczee73.pbm │ │ │ │ ├── mczee74.pbm │ │ │ │ ├── mczee75.pbm │ │ │ │ ├── mczee76.pbm │ │ │ │ ├── mczee77.pbm │ │ │ │ ├── mczee78.pbm │ │ │ │ ├── mczee79.pbm │ │ │ │ ├── mczee8.pbm │ │ │ │ ├── mczee80.pbm │ │ │ │ ├── mczee81.pbm │ │ │ │ ├── mczee82.pbm │ │ │ │ ├── mczee83.pbm │ │ │ │ ├── mczee84.pbm │ │ │ │ ├── mczee85.pbm │ │ │ │ ├── mczee86.pbm │ │ │ │ ├── mczee87.pbm │ │ │ │ ├── mczee88.pbm │ │ │ │ ├── mczee89.pbm │ │ │ │ ├── mczee9.pbm │ │ │ │ ├── mczee90.pbm │ │ │ │ ├── mczee91.pbm │ │ │ │ ├── mczee92.pbm │ │ │ │ ├── mczee93.pbm │ │ │ │ ├── mczee94.pbm │ │ │ │ ├── mczee95.pbm │ │ │ │ ├── mczee96.pbm │ │ │ │ ├── mczee97.pbm │ │ │ │ ├── mczee98.pbm │ │ │ │ ├── mczee99.pbm │ │ │ │ ├── tbth1_1.pbm │ │ │ │ ├── tbth1_10.pbm │ │ │ │ ├── tbth1_11.pbm │ │ │ │ ├── tbth1_12.pbm │ │ │ │ ├── tbth1_13.pbm │ │ │ │ ├── tbth1_14.pbm │ │ │ │ ├── tbth1_15.pbm │ │ │ │ ├── tbth1_16.pbm │ │ │ │ ├── tbth1_17.pbm │ │ │ │ ├── tbth1_18.pbm │ │ │ │ ├── tbth1_19.pbm │ │ │ │ ├── tbth1_2.pbm │ │ │ │ ├── tbth1_20.pbm │ │ │ │ ├── tbth1_21.pbm │ │ │ │ ├── tbth1_22.pbm │ │ │ │ ├── tbth1_3.pbm │ │ │ │ ├── tbth1_4.pbm │ │ │ │ ├── tbth1_5.pbm │ │ │ │ ├── tbth1_6.pbm │ │ │ │ ├── tbth1_7.pbm │ │ │ │ ├── tbth1_8.pbm │ │ │ │ ├── tbth1_9.pbm │ │ │ │ ├── tbth4_1.pbm │ │ │ │ ├── tbth4_10.pbm │ │ │ │ ├── tbth4_11.pbm │ │ │ │ ├── tbth4_12.pbm │ │ │ │ ├── tbth4_13.pbm │ │ │ │ ├── tbth4_14.pbm │ │ │ │ ├── tbth4_15.pbm │ │ │ │ ├── tbth4_16.pbm │ │ │ │ ├── tbth4_17.pbm │ │ │ │ ├── tbth4_18.pbm │ │ │ │ ├── tbth4_19.pbm │ │ │ │ ├── tbth4_2.pbm │ │ │ │ ├── tbth4_20.pbm │ │ │ │ ├── tbth4_21.pbm │ │ │ │ ├── tbth4_22.pbm │ │ │ │ ├── tbth4_23.pbm │ │ │ │ ├── tbth4_24.pbm │ │ │ │ ├── tbth4_25.pbm │ │ │ │ ├── tbth4_26.pbm │ │ │ │ ├── tbth4_27.pbm │ │ │ │ ├── tbth4_3.pbm │ │ │ │ ├── tbth4_4.pbm │ │ │ │ ├── tbth4_5.pbm │ │ │ │ ├── tbth4_6.pbm │ │ │ │ ├── tbth4_7.pbm │ │ │ │ ├── tbth4_8.pbm │ │ │ │ ├── tbth4_9.pbm │ │ │ │ ├── tbth5_1.pbm │ │ │ │ ├── tbth5_10.pbm │ │ │ │ ├── tbth5_11.pbm │ │ │ │ ├── tbth5_12.pbm │ │ │ │ ├── tbth5_13.pbm │ │ │ │ ├── tbth5_14.pbm │ │ │ │ ├── tbth5_15.pbm │ │ │ │ ├── tbth5_16.pbm │ │ │ │ ├── tbth5_17.pbm │ │ │ │ ├── tbth5_18.pbm │ │ │ │ ├── tbth5_19.pbm │ │ │ │ ├── tbth5_2.pbm │ │ │ │ ├── tbth5_20.pbm │ │ │ │ ├── tbth5_21.pbm │ │ │ │ ├── tbth5_22.pbm │ │ │ │ ├── tbth5_23.pbm │ │ │ │ ├── tbth5_24.pbm │ │ │ │ ├── tbth5_25.pbm │ │ │ │ ├── tbth5_26.pbm │ │ │ │ ├── tbth5_27.pbm │ │ │ │ ├── tbth5_3.pbm │ │ │ │ ├── tbth5_4.pbm │ │ │ │ ├── tbth5_5.pbm │ │ │ │ ├── tbth5_6.pbm │ │ │ │ ├── tbth5_7.pbm │ │ │ │ ├── tbth5_8.pbm │ │ │ │ ├── tbth5_9.pbm │ │ │ │ ├── ticket1.pbm │ │ │ │ ├── ticket2.pbm │ │ │ │ ├── tik1drs.pbm │ │ │ │ ├── tik2cam.pbm │ │ │ │ ├── tik2cans.pbm │ │ │ │ ├── tkmz1.pbm │ │ │ │ ├── tkmz10.pbm │ │ │ │ ├── tkmz11.pbm │ │ │ │ ├── tkmz12.pbm │ │ │ │ ├── tkmz13.pbm │ │ │ │ ├── tkmz14.pbm │ │ │ │ ├── tkmz15.pbm │ │ │ │ ├── tkmz16.pbm │ │ │ │ ├── tkmz17.pbm │ │ │ │ ├── tkmz18.pbm │ │ │ │ ├── tkmz19.pbm │ │ │ │ ├── tkmz2.pbm │ │ │ │ ├── tkmz20.pbm │ │ │ │ ├── tkmz21.pbm │ │ │ │ ├── tkmz22.pbm │ │ │ │ ├── tkmz23.pbm │ │ │ │ ├── tkmz24.pbm │ │ │ │ ├── tkmz25.pbm │ │ │ │ ├── tkmz26.pbm │ │ │ │ ├── tkmz27.pbm │ │ │ │ ├── tkmz28.pbm │ │ │ │ ├── tkmz29.pbm │ │ │ │ ├── tkmz3.pbm │ │ │ │ ├── tkmz30.pbm │ │ │ │ ├── tkmz31.pbm │ │ │ │ ├── tkmz32.pbm │ │ │ │ ├── tkmz33.pbm │ │ │ │ ├── tkmz34.pbm │ │ │ │ ├── tkmz35.pbm │ │ │ │ ├── tkmz36.pbm │ │ │ │ ├── tkmz37.pbm │ │ │ │ ├── tkmz38.pbm │ │ │ │ ├── tkmz39.pbm │ │ │ │ ├── tkmz4.pbm │ │ │ │ ├── tkmz40.pbm │ │ │ │ ├── tkmz41.pbm │ │ │ │ ├── tkmz42.pbm │ │ │ │ ├── tkmz43.pbm │ │ │ │ ├── tkmz44.pbm │ │ │ │ ├── tkmz45.pbm │ │ │ │ ├── tkmz46.pbm │ │ │ │ ├── tkmz47.pbm │ │ │ │ ├── tkmz48.pbm │ │ │ │ ├── tkmz49.pbm │ │ │ │ ├── tkmz5.pbm │ │ │ │ ├── tkmz50.pbm │ │ │ │ ├── tkmz51.pbm │ │ │ │ ├── tkmz52.pbm │ │ │ │ ├── tkmz53.pbm │ │ │ │ ├── tkmz54.pbm │ │ │ │ ├── tkmz55.pbm │ │ │ │ ├── tkmz56.pbm │ │ │ │ ├── tkmz57.pbm │ │ │ │ ├── tkmz58.pbm │ │ │ │ ├── tkmz59.pbm │ │ │ │ ├── tkmz6.pbm │ │ │ │ ├── tkmz60.pbm │ │ │ │ ├── tkmz61.pbm │ │ │ │ ├── tkmz62.pbm │ │ │ │ ├── tkmz63.pbm │ │ │ │ ├── tkmz64.pbm │ │ │ │ ├── tkmz65.pbm │ │ │ │ ├── tkmz66.pbm │ │ │ │ ├── tkmz67.pbm │ │ │ │ ├── tkmz68.pbm │ │ │ │ ├── tkmz69.pbm │ │ │ │ ├── tkmz7.pbm │ │ │ │ ├── tkmz70.pbm │ │ │ │ ├── tkmz71.pbm │ │ │ │ ├── tkmz72.pbm │ │ │ │ ├── tkmz73.pbm │ │ │ │ ├── tkmz74.pbm │ │ │ │ ├── tkmz75.pbm │ │ │ │ ├── tkmz8.pbm │ │ │ │ ├── tkmz9.pbm │ │ │ │ ├── tkwait1.pbm │ │ │ │ ├── tkwait10.pbm │ │ │ │ ├── tkwait11.pbm │ │ │ │ ├── tkwait12.pbm │ │ │ │ ├── tkwait13.pbm │ │ │ │ ├── tkwait14.pbm │ │ │ │ ├── tkwait15.pbm │ │ │ │ ├── tkwait16.pbm │ │ │ │ ├── tkwait17.pbm │ │ │ │ ├── tkwait18.pbm │ │ │ │ ├── tkwait19.pbm │ │ │ │ ├── tkwait2.pbm │ │ │ │ ├── tkwait20.pbm │ │ │ │ ├── tkwait21.pbm │ │ │ │ ├── tkwait22.pbm │ │ │ │ ├── tkwait23.pbm │ │ │ │ ├── tkwait24.pbm │ │ │ │ ├── tkwait25.pbm │ │ │ │ ├── tkwait26.pbm │ │ │ │ ├── tkwait27.pbm │ │ │ │ ├── tkwait28.pbm │ │ │ │ ├── tkwait29.pbm │ │ │ │ ├── tkwait3.pbm │ │ │ │ ├── tkwait30.pbm │ │ │ │ ├── tkwait31.pbm │ │ │ │ ├── tkwait32.pbm │ │ │ │ ├── tkwait33.pbm │ │ │ │ ├── tkwait34.pbm │ │ │ │ ├── tkwait35.pbm │ │ │ │ ├── tkwait36.pbm │ │ │ │ ├── tkwait37.pbm │ │ │ │ ├── tkwait38.pbm │ │ │ │ ├── tkwait39.pbm │ │ │ │ ├── tkwait4.pbm │ │ │ │ ├── tkwait40.pbm │ │ │ │ ├── tkwait5.pbm │ │ │ │ ├── tkwait6.pbm │ │ │ │ ├── tkwait7.pbm │ │ │ │ ├── tkwait8.pbm │ │ │ │ └── tkwait9.pbm │ │ │ └── waiting/ │ │ │ └── waiting.pbm │ │ ├── portfol.cht │ │ ├── prdoor.seq │ │ ├── prjmon1.seq │ │ ├── prjmon2.seq │ │ ├── projects.cht │ │ ├── snackbar.cht │ │ ├── snackbar.seq │ │ ├── sound/ │ │ │ ├── backstag/ │ │ │ │ └── bakstage.mid │ │ │ ├── imagin/ │ │ │ │ ├── closet.mid │ │ │ │ └── coaster.mid │ │ │ ├── inspirat/ │ │ │ │ └── ideas.mid │ │ │ ├── lobby/ │ │ │ │ ├── fader.mid │ │ │ │ └── lobby.mid │ │ │ ├── login/ │ │ │ │ └── tag.mid │ │ │ ├── projects/ │ │ │ │ └── project.mid │ │ │ ├── snackbar/ │ │ │ │ └── snack.mid │ │ │ ├── splash/ │ │ │ │ └── splash.mid │ │ │ ├── studio/ │ │ │ │ └── studio.mid │ │ │ ├── theatre/ │ │ │ │ └── theater.mid │ │ │ └── ticket/ │ │ │ ├── boothjam.mid │ │ │ └── jamloop.mid │ │ ├── stdoor.seq │ │ ├── street.cht │ │ ├── studiobg.cht │ │ ├── studiobx.seq │ │ ├── studiotv.seq │ │ ├── theatre.cht │ │ ├── ticket.cht │ │ ├── ticket.seq │ │ ├── ticket1.seq │ │ └── waiting.cht │ ├── engine/ │ │ ├── actor.cpp │ │ ├── actredit.cpp │ │ ├── actrsave.cpp │ │ ├── actrsnd.cpp │ │ ├── bkgd.cpp │ │ ├── body.cpp │ │ ├── makefile │ │ ├── modl.cpp │ │ ├── movie.cpp │ │ ├── msnd.cpp │ │ ├── mtrl.cpp │ │ ├── scene.cpp │ │ ├── srec.cpp │ │ ├── tagl.cpp │ │ ├── tagman.cpp │ │ ├── tbox.cpp │ │ ├── tdf.cpp │ │ ├── tdt.cpp │ │ └── tmpl.cpp │ ├── help/ │ │ ├── actorbio.cht │ │ ├── app.cht │ │ ├── basics.cht │ │ ├── bio.cht │ │ ├── bkhowto.cht │ │ ├── bktips.cht │ │ ├── bktocbas.cht │ │ ├── bktools.cht │ │ ├── booktpc.cht │ │ ├── easelhp.cht │ │ ├── errors.cht │ │ ├── gadget1.cht │ │ ├── gadget2.cht │ │ ├── gadget3.cht │ │ ├── gadget4.cht │ │ ├── gadget5.cht │ │ ├── gadget6.cht │ │ ├── guidhelp.cht │ │ ├── help.cht │ │ ├── htactors.cht │ │ ├── htalerts.cht │ │ ├── htscenes.cht │ │ ├── htsounds.cht │ │ ├── htwords.cht │ │ ├── logo.cht │ │ ├── makefile │ │ ├── prjalert.cht │ │ ├── prjintro.cht │ │ ├── prjtips.cht │ │ ├── project1.cht │ │ ├── project2.cht │ │ ├── project3.cht │ │ ├── project4.cht │ │ ├── project5.cht │ │ ├── project6.cht │ │ ├── toolhelp.cht │ │ ├── tooltips.cht │ │ └── topics1.cht │ ├── helpaud/ │ │ ├── helpaud.cht │ │ ├── makefile │ │ ├── wcbasics.cht │ │ ├── wcgdelgo.cht │ │ ├── wchowto.cht │ │ ├── wcproj.cht │ │ ├── wctoolhp.cht │ │ └── wctooltp.cht │ ├── makefile │ ├── shared/ │ │ ├── bio.cht │ │ ├── biopage.cht │ │ ├── cursors/ │ │ │ ├── actions2.cur │ │ │ ├── crs1018.cur │ │ │ ├── crs128.cur │ │ │ ├── crs142.cur │ │ │ ├── crs143.cur │ │ │ ├── default.cur │ │ │ ├── down.cur │ │ │ ├── hotspot.cur │ │ │ ├── left.cur │ │ │ ├── right.cur │ │ │ ├── turn1.cur │ │ │ ├── turnarnd.cur │ │ │ ├── turnleft.cur │ │ │ ├── turnrigt.cur │ │ │ └── up.cur │ │ ├── cursors.cht │ │ ├── makefile │ │ ├── map.chh │ │ ├── map.cht │ │ ├── pbm/ │ │ │ ├── back.pbm │ │ │ ├── backc.pbm │ │ │ ├── biopage.pbm │ │ │ ├── biopanel.pbm │ │ │ ├── blank.pbm │ │ │ ├── cancel.pbm │ │ │ ├── cancelc.pbm │ │ │ ├── control.pbm │ │ │ ├── fwd.pbm │ │ │ ├── fwdc.pbm │ │ │ ├── map/ │ │ │ │ └── mapback.pbm │ │ │ ├── page01.pbm │ │ │ ├── page02.pbm │ │ │ ├── page03.pbm │ │ │ ├── page04.pbm │ │ │ ├── page05.pbm │ │ │ ├── page06.pbm │ │ │ ├── page07.pbm │ │ │ ├── page08.pbm │ │ │ ├── page09.pbm │ │ │ ├── page10.pbm │ │ │ ├── page11.pbm │ │ │ ├── page12.pbm │ │ │ ├── page13.pbm │ │ │ ├── page14.pbm │ │ │ ├── page15.pbm │ │ │ ├── page16.pbm │ │ │ ├── page17.pbm │ │ │ ├── page18.pbm │ │ │ ├── page19.pbm │ │ │ ├── page20.pbm │ │ │ ├── page21.pbm │ │ │ ├── page22.pbm │ │ │ ├── page23.pbm │ │ │ ├── page24.pbm │ │ │ ├── page25.pbm │ │ │ ├── page26.pbm │ │ │ ├── page27.pbm │ │ │ ├── page28.pbm │ │ │ ├── page29.pbm │ │ │ ├── page30.pbm │ │ │ ├── page31.pbm │ │ │ ├── page32.pbm │ │ │ ├── page33.pbm │ │ │ ├── page34.pbm │ │ │ ├── page35.pbm │ │ │ ├── page36.pbm │ │ │ ├── page37.pbm │ │ │ ├── page38.pbm │ │ │ ├── page39.pbm │ │ │ ├── page40.pbm │ │ │ └── page41.pbm │ │ ├── portbmp.cht │ │ ├── sharecd.cht │ │ ├── shared.cht │ │ ├── sharhelp.cht │ │ └── util.cht │ └── studio/ │ ├── ape.cpp │ ├── bmp/ │ │ └── splash.mid │ ├── browser.cht │ ├── browser.cpp │ ├── cur/ │ │ ├── action2.cur │ │ ├── actions.cur │ │ ├── actions2.cur │ │ ├── attachso.cur │ │ ├── copy.cur │ │ ├── copypath.cur │ │ ├── copytext.cur │ │ ├── costume.cur │ │ ├── creatbox.cur │ │ ├── cur00001.cur │ │ ├── cur00002.cur │ │ ├── cur00003.cur │ │ ├── cursor1.cur │ │ ├── cursor2.cur │ │ ├── cursor3.cur │ │ ├── cursor4.cur │ │ ├── cursor5.cur │ │ ├── cursor6.cur │ │ ├── cursor7.cur │ │ ├── cursor8.cur │ │ ├── cursors.rc │ │ ├── cutactor.cur │ │ ├── cutext.cur │ │ ├── default.cur │ │ ├── fontextc.cur │ │ ├── hotspot.cur │ │ ├── hotspot2.cur │ │ ├── ibeam.cur │ │ ├── left.cur │ │ ├── listen.cur │ │ ├── normaliz.cur │ │ ├── nukeactr.cur │ │ ├── nukscen.cur │ │ ├── nuktext.cur │ │ ├── objectin.cur │ │ ├── paste.cur │ │ ├── pastepat.cur │ │ ├── pastepth.cur │ │ ├── pastetex.cur │ │ ├── removaft.cur │ │ ├── removbef.cur │ │ ├── repositi.cur │ │ ├── resizete.cur │ │ ├── resource.h │ │ ├── rotatex.cur │ │ ├── rotatey.cur │ │ ├── rotatez.cur │ │ ├── selected.cur │ │ ├── sizevenl.cur │ │ ├── squashst.cur │ │ ├── tboxfall.cur │ │ ├── tboxhor.cur │ │ ├── tboxrise.cur │ │ ├── tboxvert.cur │ │ ├── textback.cur │ │ ├── turnarnd.cur │ │ ├── turnleft.cur │ │ ├── turnrigh.cur │ │ ├── turnrigt.cur │ │ └── wait.cur │ ├── cursors.cht │ ├── easels.cht │ ├── esl.cpp │ ├── gadget.cht │ ├── gadgpers.cht │ ├── helpbook.cht │ ├── helpctrl.cht │ ├── helpres.cht │ ├── hlpbkper.cht │ ├── makefile │ ├── mminstal.cpp │ ├── mminstal.h │ ├── popdn.cht │ ├── popup.cpp │ ├── popups.cht │ ├── portf.cpp │ ├── projmain.cht │ ├── scnsort.cpp │ ├── sectools.cht │ ├── splot.cpp │ ├── stdiobrw.cpp │ ├── stdiocrs.h │ ├── stdioscb.cht │ ├── stdioscb.cpp │ ├── stdiosnd.cht │ ├── studio.cht │ ├── studio.cpp │ ├── tatr.cpp │ ├── tbbasics.cht │ ├── tbguidhp.cht │ ├── tbhtactr.cht │ ├── tbhtscen.cht │ ├── tbhtsoun.cht │ ├── tbhtword.cht │ ├── tblogowz.cht │ ├── tbproj1.cht │ ├── tbproj2.cht │ ├── tbproj3.cht │ ├── tbproj4.cht │ ├── tbproj5.cht │ ├── tbproj6.cht │ ├── tgob.cpp │ ├── tooltips.h │ ├── utest.cht │ ├── utest.cpp │ ├── utest.rc │ ├── utest.rc2 │ ├── utestgst.cht │ └── utestscb.cpp ├── tools/ │ ├── makefile │ ├── mktmap.cpp │ ├── pbmtobmp.cpp │ ├── sitobren.cpp │ └── tdfmake.cpp └── version.def ================================================ FILE CONTENTS ================================================ ================================================ FILE: .clang-format ================================================ --- BasedOnStyle: Microsoft # The order of includes is very important, so don't sort them! SortIncludes: Never ================================================ FILE: .gitattributes ================================================ *.avi binary *.bmp binary *.ico binary *.chk binary ================================================ FILE: .github/workflows/build.yml ================================================ name: build on: push jobs: compile: name: Compile project runs-on: windows-latest steps: - name: Check out repository code uses: actions/checkout@v3 - name: Install VCVars shell: pwsh run: Install-Module -Name VCVars -Force - name: Compile shell: pwsh run: | pushvc (invoke-vcvars -TargetArch x86 -HostArch AMD64) cmake --preset x86:msvc:debug cmake --build build - name: Upload Artifact uses: actions/upload-artifact@v3 with: name: 3D-Movie-Maker path: build/ ================================================ FILE: .github/workflows/clang-format-check.yml ================================================ name: clang-format Check on: [push, pull_request] jobs: formatting-check: name: Formatting Check runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Run clang-format style check for C/C++/Protobuf programs. uses: jidicula/clang-format-action@v4.6.2 with: clang-format-version: '14' check-path: '.' ================================================ FILE: .gitignore ================================================ obj/ ._.DS_Store .DS_Store out/ .vs/ dist/ build/ # Files generated during build, so they're ignored to keep them out of git elib/wind/bren.lib elib/wins/bren.lib kauai/src/kcd2_386.h kauai/src/kcdc_386.h ================================================ FILE: .notes/removed_files.txt ================================================ Other files removed: ./OBJ/WIND/ENGINE.LIB ./OBJ/WINS/ENGINE.LIB ./kauai/ELIB/WINUD/AUDIOD.LIB ./kauai/ELIB/WIND/AUDIOD.LIB ./kauai/ELIB/WINUS/AUDIOS.LIB ./kauai/ELIB/WINS/AUDIOS.LIB ./SETUP/TOOLS/INC/MSSETUP.LIB ./DKIT/LIBDKIT.LIB ./ELIB/WIND/BRZBMXR.LIB ./ELIB/WIND/BREN.LIB ./ELIB/WIND/BRFMMXR.LIB ./ELIB/WIND/BRFWMXR.LIB ./ELIB/WINS/BRZBMXR.LIB ./ELIB/WINS/BREN.LIB ./ELIB/WINS/BRFMMXR.LIB ./ELIB/WINS/BRFWMXR.LIB ./BREN/OBJ/WIND/BREN.LIB ./BREN/OBJ/WINS/BREN.LIB ./cd12/OBJ/WIND/ENGINE.LIB ./cd12/OBJ/WINS/ENGINE.LIB ./cd12/SETUP/TOOLS/INC/MSSETUP.LIB ./cd12/DKIT/LIBDKIT.LIB ./cd12/ELIB/WIND/BRZBMXR.LIB ./cd12/ELIB/WIND/BREN.LIB ./cd12/ELIB/WIND/BRFMMXR.LIB ./cd12/ELIB/WIND/BRFWMXR.LIB ./cd12/ELIB/WINS/BRZBMXR.LIB ./cd12/ELIB/WINS/BREN.LIB ./cd12/ELIB/WINS/BRFMMXR.LIB ./cd12/ELIB/WINS/BRFWMXR.LIB ./cd12/BREN/OBJ/WIND/BREN.LIB ./cd12/BREN/OBJ/WINS/BREN.LIB ./cd3/SETUP/MSSETUP.DLL ./cd3/SETUP/3DMSETUP.DLL ./cd3/PSS/IMGWALK.DLL ./cd3/MMCAT/VER.DLL ./cd3/MMCAT/VBRUN300.DLL ./SETUP/D/3DMSETUP.DLL ./cd12/SETUP/TOOLS/U/MSSETUP.DLL ./cd12/SETUP/TOOLS/UD/MSSETUP.DLL ./cd12/SETUP/TOOLS/DD/MSSETUP.DLL ./cd12/SETUP/TOOLS/D/MSSETUP.DLL ./cd12/SETUP/BIN/PSS/IMGWALK.DLL ./cd12/SETUP/BIN/MMCAT/VER.DLL ./cd12/SETUP/BIN/MMCAT/VBRUN300.DLL ./cd12/SETUP/U/3DMSETUP.DLL ./cd12/SETUP/Z/3DMSETUP.DLL ./cd12/SETUP/UD/3DMSETUP.DLL ./cd12/SETUP/D/3DMSETUP.DLL ================================================ FILE: .vscode/settings.json ================================================ { "files.associations": { "W95INST.C": "cpp", "STDFILE.C": "cpp", "STDMEM.C": "cpp" } } ================================================ FILE: CMakeLists.txt ================================================ cmake_minimum_required(VERSION 3.22) project(3DMMForever LANGUAGES CXX C VERSION 0.2) list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") set(CMAKE_CXX_STANDARD 14) if(MSVC) #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /permissive-") # permissive forces C++14 const char* as default for literals # this flag re-enables the auto-conversion for the microsoft compiler set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zc:strictStrings-") endif() include(CMakeDependentOption) include(TargetChompSources) find_package(AudioMan) find_package(BRender REQUIRED) # Options option(BUILD_PACKAGES "Build packages for 3DMM" ON) cmake_dependent_option(3DMM_PACKAGE_WIX "Generate an MSI via WiX" ON "BUILD_PACKAGES AND DEFINED ENV{WIX}" OFF) cmake_dependent_option(3DMM_PACKAGE_ZIP "Generate a portable ZIP" ON "BUILD_PACKAGES" OFF) # Optional Tools find_package(ClangTidy) find_package(CCache) if (TARGET CCache::CCache AND NOT CMAKE_CXX_COMPILER_LAUNCHER) get_property(CMAKE_CXX_COMPILER_LAUNCHER TARGET CCache::CCache PROPERTY IMPORTED_LOCATION) get_property(CMAKE_C_COMPILER_LAUNCHER TARGET CCache::CCache PROPERTY IMPORTED_LOCATION) endif() # TODO: Enable this when the #if (TARGET Clang::Tidy AND NOT CMAKE_CXX_CLANG_TIDY) # get_property(CMAKE_CXX_CLANG_TIDY TARGET Clang::Tidy PROPERTY IMPORTED_LOCATION) #endif() # Local Tooling add_compile_definitions( $<$:WIN> $<$:IN_80386> $<$:DEBUG> ) if (NOT CMAKE_SIZEOF_VOID_P EQUAL 4) message(FATAL_ERROR "Cannot compile for 64-bit yet") endif() # NOTE: kcdc-386 and kcd2-386 prevent cross compiling at this time. add_executable(kcdc-386 EXCLUDE_FROM_ALL) target_sources(kcdc-386 PRIVATE "${PROJECT_SOURCE_DIR}/kauai/src/kcdc_386.c") target_include_directories(kcdc-386 PRIVATE $) add_executable(kcd2-386 EXCLUDE_FROM_ALL) target_sources(kcd2-386 PRIVATE "${PROJECT_SOURCE_DIR}/kauai/src/kcd2_386.c") target_include_directories(kcd2-386 PRIVATE $) if (NOT TARGET 3DMMForever::AudioMan) add_library(audioman) add_library(3DMMForever::AudioMan ALIAS audioman) target_include_directories(audioman PUBLIC "${PROJECT_SOURCE_DIR}/kauai/src" ) target_sources(audioman PRIVATE "${PROJECT_SOURCE_DIR}/audioman/audioman.cpp" ) endif() add_executable(chelp WIN32 EXCLUDE_FROM_ALL) target_sources(chelp PRIVATE "${PROJECT_SOURCE_DIR}/kauai/tools/chtop.cpp" "${PROJECT_SOURCE_DIR}/kauai/tools/chelp.cpp" "${PROJECT_SOURCE_DIR}/kauai/tools/chelpexp.cpp" "${PROJECT_SOURCE_DIR}/kauai/tools/chelp.rc" ) target_include_directories(chelp PRIVATE $) target_link_libraries(chelp PRIVATE $) # Kauai test applications add_executable(ft WIN32 EXCLUDE_FROM_ALL) target_sources(ft PRIVATE "${PROJECT_SOURCE_DIR}/kauai/src/test.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/ft.rc" "${PROJECT_SOURCE_DIR}/kauai/src/ft.cpp" ) target_link_libraries(ft PRIVATE kauai) add_executable(ut EXCLUDE_FROM_ALL) target_sources(ut PRIVATE "${PROJECT_SOURCE_DIR}/kauai/src/ut.cpp" ) target_link_libraries(ut PRIVATE kauai) add_executable(chomp EXCLUDE_FROM_ALL) target_sources(chomp PRIVATE "${PROJECT_SOURCE_DIR}/kauai/tools/chomp.cpp") target_include_directories(chomp PRIVATE $) target_link_libraries(chomp PRIVATE $) # Chunk Editor add_executable(ched WIN32 EXCLUDE_FROM_ALL) target_sources(ched PRIVATE "${PROJECT_SOURCE_DIR}/kauai/tools/ched.rc" "${PROJECT_SOURCE_DIR}/kauai/tools/chdoc.cpp" "${PROJECT_SOURCE_DIR}/kauai/tools/ched.cpp" "${PROJECT_SOURCE_DIR}/kauai/tools/chgrp.cpp" "${PROJECT_SOURCE_DIR}/kauai/tools/chhex.cpp" "${PROJECT_SOURCE_DIR}/kauai/tools/chmbmp.cpp" "${PROJECT_SOURCE_DIR}/kauai/tools/chpic.cpp" "${PROJECT_SOURCE_DIR}/kauai/tools/chtxt.cpp" ) target_link_libraries(ched PRIVATE kauai) # mkmbmp add_executable(mkmbmp EXCLUDE_FROM_ALL) target_sources(mkmbmp PRIVATE "${PROJECT_SOURCE_DIR}/kauai/tools/mkmbmp.cpp" ) target_link_libraries(mkmbmp PRIVATE kauai) # kpack add_executable(kpack EXCLUDE_FROM_ALL) target_sources(kpack PRIVATE "${PROJECT_SOURCE_DIR}/kauai/tools/kpack.cpp" ) target_link_libraries(kpack PRIVATE kauai) # chmerge add_executable(chmerge EXCLUDE_FROM_ALL) target_sources(chmerge PRIVATE "${PROJECT_SOURCE_DIR}/kauai/tools/chmerge.cpp" ) target_link_libraries(chmerge PRIVATE kauai) # chelpdmp add_executable(chelpdmp EXCLUDE_FROM_ALL) target_sources(chelpdmp PRIVATE "${PROJECT_SOURCE_DIR}/kauai/tools/chelpdmp.cpp" "${PROJECT_SOURCE_DIR}/kauai/tools/chelpexp.cpp" ) target_link_libraries(chelpdmp PRIVATE kauai) # These are only here to ensure configure is rerun when dependencies are generated. # This is file(GLOB building-chunk-sources CONFIGURE_DEPENDS "${PROJECT_SOURCE_DIR}/src/building/*.cht") file(GLOB studio-chunk-sources CONFIGURE_DEPENDS "${PROJECT_SOURCE_DIR}/src/studio/*.cht") add_custom_command( OUTPUT "${PROJECT_BINARY_DIR}/generated/kauai/src/kcdc_386.h" COMMAND cmake -E make_directory "${PROJECT_BINARY_DIR}/generated/kauai/src" COMMAND kcdc-386 "${PROJECT_BINARY_DIR}/generated/kauai/src/kcdc_386.h" COMMENT "Generating kcdc_386.h" VERBATIM ) add_custom_command( OUTPUT "${PROJECT_BINARY_DIR}/generated/kauai/src/kcd2_386.h" COMMAND cmake -E make_directory "${PROJECT_BINARY_DIR}/generated/kauai/src" COMMAND kcd2-386 "${PROJECT_BINARY_DIR}/generated/kauai/src/kcd2_386.h" COMMENT "Generating kcd2_386.h" VERBATIM ) add_compile_options($<$:/wd4430>) add_library(kauai) target_include_directories( kauai PUBLIC "${PROJECT_SOURCE_DIR}/kauai/src" "$") target_sources(kauai PRIVATE "${PROJECT_BINARY_DIR}/generated/kauai/src/kcdc_386.h" "${PROJECT_BINARY_DIR}/generated/kauai/src/kcd2_386.h" "${PROJECT_SOURCE_DIR}/kauai/src/appb.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/base.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/chcm.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/chse.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/chunk.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/clip.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/clok.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/cmd.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/codec.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/codkauai.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/crf.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/ctl.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/cursor.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/dlg.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/docb.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/file.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/frame.rc" "${PROJECT_SOURCE_DIR}/kauai/src/gfx.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/gob.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/groups.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/groups2.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/kidhelp.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/kidspace.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/kidworld.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/lex.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/mbmp.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/mbmpgui.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/midi.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/mididev.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/mididev2.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/mssio.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/pic.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/region.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/rtxt.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/rtxt2.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/scrcom.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/scrcomg.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/screxe.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/screxeg.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/sndam.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/sndm.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/spell.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/stream.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/text.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/textdoc.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/util.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/utilcopy.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/utilerro.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/utilglob.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/utilint.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/utilmem.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/utilrnd.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/utilstr.cpp" "${PROJECT_SOURCE_DIR}/kauai/src/video.cpp" # Windows implementations $<$:${PROJECT_SOURCE_DIR}/kauai/src/appbwin.cpp> $<$:${PROJECT_SOURCE_DIR}/kauai/src/dlgwin.cpp> $<$:${PROJECT_SOURCE_DIR}/kauai/src/filewin.cpp> $<$:${PROJECT_SOURCE_DIR}/kauai/src/fniwin.cpp> $<$:${PROJECT_SOURCE_DIR}/kauai/src/gfxwin.cpp> $<$:${PROJECT_SOURCE_DIR}/kauai/src/memwin.cpp> $<$:${PROJECT_SOURCE_DIR}/kauai/src/menuwin.cpp> $<$:${PROJECT_SOURCE_DIR}/kauai/src/picwin.cpp> $<$:${PROJECT_SOURCE_DIR}/kauai/src/gobwin.cpp> # Stubs for Visual C++ 2.1 CRT functions "${PROJECT_SOURCE_DIR}/kauai/src/stub.cpp" ) target_compile_definitions(kauai PUBLIC _LPCVOID_DEFINED STRICT) target_link_libraries(kauai PUBLIC 3DMMForever::AudioMan $<$:Msacm32> $<$:Vfw32> $<$:Winmm> $<$:mpr>) add_library(brender) target_sources(brender PRIVATE "${PROJECT_SOURCE_DIR}/bren/bwld.cpp" "${PROJECT_SOURCE_DIR}/bren/stderr.c" "${PROJECT_SOURCE_DIR}/bren/stdfile.c" "${PROJECT_SOURCE_DIR}/bren/stdmem.c" "${PROJECT_SOURCE_DIR}/bren/tmap.cpp" "${PROJECT_SOURCE_DIR}/bren/zbmp.cpp" ) target_include_directories(brender PUBLIC "${PROJECT_SOURCE_DIR}/BREN/INC") target_link_libraries(brender PUBLIC kauai BRender::Libraries) add_library(engine) target_sources(engine PRIVATE "${PROJECT_SOURCE_DIR}/src/engine/actor.cpp" "${PROJECT_SOURCE_DIR}/src/engine/actredit.cpp" "${PROJECT_SOURCE_DIR}/src/engine/actrsave.cpp" "${PROJECT_SOURCE_DIR}/src/engine/actrsnd.cpp" "${PROJECT_SOURCE_DIR}/src/engine/bkgd.cpp" "${PROJECT_SOURCE_DIR}/src/engine/body.cpp" "${PROJECT_SOURCE_DIR}/src/engine/modl.cpp" "${PROJECT_SOURCE_DIR}/src/engine/movie.cpp" "${PROJECT_SOURCE_DIR}/src/engine/msnd.cpp" "${PROJECT_SOURCE_DIR}/src/engine/mtrl.cpp" "${PROJECT_SOURCE_DIR}/src/engine/scene.cpp" "${PROJECT_SOURCE_DIR}/src/engine/srec.cpp" "${PROJECT_SOURCE_DIR}/src/engine/tagl.cpp" "${PROJECT_SOURCE_DIR}/src/engine/tagman.cpp" "${PROJECT_SOURCE_DIR}/src/engine/tbox.cpp" "${PROJECT_SOURCE_DIR}/src/engine/tdf.cpp" "${PROJECT_SOURCE_DIR}/src/engine/tdt.cpp" "${PROJECT_SOURCE_DIR}/src/engine/tmpl.cpp" ) target_include_directories(engine PUBLIC $) target_link_libraries(engine PUBLIC kauai brender) # On non-windows WIN32 is a no-op add_executable(studio WIN32) target_sources(studio PRIVATE "${PROJECT_SOURCE_DIR}/src/studio/ape.cpp" "${PROJECT_SOURCE_DIR}/src/studio/browser.cpp" "${PROJECT_SOURCE_DIR}/src/studio/esl.cpp" "${PROJECT_SOURCE_DIR}/src/studio/mminstal.cpp" "${PROJECT_SOURCE_DIR}/src/studio/popup.cpp" "${PROJECT_SOURCE_DIR}/src/studio/portf.cpp" "${PROJECT_SOURCE_DIR}/src/studio/scnsort.cpp" "${PROJECT_SOURCE_DIR}/src/studio/splot.cpp" "${PROJECT_SOURCE_DIR}/src/studio/stdiobrw.cpp" "${PROJECT_SOURCE_DIR}/src/studio/stdioscb.cpp" "${PROJECT_SOURCE_DIR}/src/studio/studio.cpp" "${PROJECT_SOURCE_DIR}/src/studio/tatr.cpp" "${PROJECT_SOURCE_DIR}/src/studio/tgob.cpp" "${PROJECT_SOURCE_DIR}/src/studio/utest.cpp" "${PROJECT_SOURCE_DIR}/src/studio/utest.rc" "${PROJECT_SOURCE_DIR}/src/studio/utest.rc2" ) target_include_directories(studio PUBLIC $ "${PROJECT_SOURCE_DIR}/src") target_chomp_sources(studio "${PROJECT_SOURCE_DIR}/src/studio/utest.cht" "${PROJECT_SOURCE_DIR}/src/studio/studio.cht" "${PROJECT_SOURCE_DIR}/src/building/bldghd.cht" "${PROJECT_SOURCE_DIR}/src/building/building.cht" "${PROJECT_SOURCE_DIR}/src/helpaud/helpaud.cht" "${PROJECT_SOURCE_DIR}/src/help/help.cht" "${PROJECT_SOURCE_DIR}/src/shared/shared.cht" "${PROJECT_SOURCE_DIR}/src/shared/sharecd.cht") target_link_libraries(studio PRIVATE engine) set_property(TARGET studio PROPERTY OUTPUT_NAME 3dmovie) target_link_options(studio BEFORE PRIVATE $<$:/MANIFESTUAC:NO>) target_link_options(studio BEFORE PRIVATE $<$,$>:/NODEFAULTLIB:libcmt.lib>) set_property( TARGET studio PROPERTY 3DMM_SAMPLES ${studio-samples} "${PROJECT_SOURCE_DIR}/cd3/SAMPLES/BONGO.3MM" "${PROJECT_SOURCE_DIR}/cd3/SAMPLES/BOOOOOO.3MM" "${PROJECT_SOURCE_DIR}/cd3/SAMPLES/CITYTOUR.3MM" "${PROJECT_SOURCE_DIR}/cd3/SAMPLES/GRAVEYRD.3MM" "${PROJECT_SOURCE_DIR}/cd3/SAMPLES/HAUNTED.3MM" "${PROJECT_SOURCE_DIR}/cd3/SAMPLES/HOSPITAL.3MM" "${PROJECT_SOURCE_DIR}/cd3/SAMPLES/JUNGLE.3MM" "${PROJECT_SOURCE_DIR}/cd3/SAMPLES/MESSAGE.3MM" "${PROJECT_SOURCE_DIR}/cd3/SAMPLES/SPACE.3MM" "${PROJECT_SOURCE_DIR}/cd3/SAMPLES/SPROG.3MM" "${PROJECT_SOURCE_DIR}/cd3/SAMPLES/TERROR.3MM" "${PROJECT_SOURCE_DIR}/cd3/SAMPLES/THEBOOK.3MM" "${PROJECT_SOURCE_DIR}/cd3/SAMPLES/THELODGE.3MM" "${PROJECT_SOURCE_DIR}/cd3/SAMPLES/THETHIEF.3MM" "${PROJECT_SOURCE_DIR}/cd3/SAMPLES/VENUS31.3MM" "${PROJECT_SOURCE_DIR}/cd3/SAMPLES/WHERE.3MM" ) # Please pay attention to the ending / in each DIRECTORY declaration. It # affects the destination! install(TARGETS studio RUNTIME DESTINATION .) # HACK(bruxisma): This is due to UTEST.CHT not generating 3DMOVIE.CHK # Renaming it to 3DMOVIE.CHT would resolve this. install(FILES $,EXCLUDE,.+UTEST[.]chk$> DESTINATION "Microsoft Kids/3D Movie Maker") install(FILES $,INCLUDE,.+UTEST[.]chk$> RENAME 3dmovie.chk DESTINATION "Microsoft Kids/3D Movie Maker") install(FILES $ DESTINATION "Microsoft Kids/Users/Melanie") install(DIRECTORY "${PROJECT_SOURCE_DIR}/cd9/" DESTINATION "Microsoft Kids/3D Movie Maker") # CPack must be included *last*, which is antithetical to how most CMake # Modules work. We can set all variables for all packaging regardless of # whether they're supported. This way we can just swap out what is added to # `CPACK_GENERATOR` # DO NOT CHANGE THIS. EVER. Generated manually via uuidgen. This needs to be # the same so that user's can automatically upgrade via MSI set(CPACK_WIX_UPGRADE_GUID 01c5fef4-82b5-4194-aaf3-bd0247004941) # Change this as needed. set(CPACK_WIX_PROPERTY_ARPURLINFOABOUT https://github.com/foone/3DMMForever) if (BUILD_PACKAGES) add_custom_target(dist DEPENDS $) foreach (generator IN ITEMS ZIP WIX) if (3DMM_PACKAGE_${generator}) list(APPEND CPACK_GENERATOR ${generator}) endif() endforeach() include(CPack) endif() ================================================ FILE: CMakePresets.json ================================================ { "version": 3, "configurePresets": [ { "name": "base", "hidden": true, "generator": "Ninja", "binaryDir": "${sourceDir}/build", "installDir": "${sourceDir}/dist" }, { "name": "msvc:base", "inherits": "base", "hidden": true, "cacheVariables": { "CMAKE_CXX_COMPILER": "cl" }, "condition": { "type": "equals", "lhs": "${hostSystemName}", "rhs": "Windows" } }, { "name": "msvc:x86:base", "inherits": "msvc:base", "hidden": true, "architecture": { "value": "x86", "strategy": "external" } }, { "displayName": "MSVC x86 Release", "name": "x86:msvc:release", "inherits": "msvc:x86:base", "cacheVariables": { "CMAKE_BUILD_TYPE": "Release" } }, { "displayName": "MSVC x86 Debug", "name": "x86:msvc:debug", "inherits": "msvc:x86:base", "cacheVariables": { "CMAKE_BUILD_TYPE": "Debug" } }, { "displayName": "MSVC x86 RelWithDebInfo", "name": "x86:msvc:relwithdebinfo", "inherits": "msvc:x86:base", "cacheVariables": { "CMAKE_BUILD_TYPE": "RelWithDebInfo" } }, { "displayName": "MSVC x86 MinSizeRel", "name": "x86:msvc:minsizerel", "inherits": "msvc:x86:base", "cacheVariables": { "CMAKE_BUILD_TYPE": "MinSizeRel" } } ] } ================================================ FILE: CODE_OF_CONDUCT.md ================================================ # Microsoft Open Source Code of Conduct This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). Resources: - [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/) - [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) - Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns ================================================ FILE: Dockerfile ================================================ # escape=` FROM mcr.microsoft.com/windows/servercore:ltsc2019 ADD https://aka.ms/vs/17/release/vs_buildtools.exe C:\TEMP\vs_buildtools.exe RUN C:\TEMP\vs_buildtools.exe --quiet --wait --norestart --nocache ` --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended ` --remove Microsoft.VisualStudio.Component.Windows10SDK.10240 ` --remove Microsoft.VisualStudio.Component.Windows10SDK.10586 ` --remove Microsoft.VisualStudio.Component.Windows10SDK.14393 ` --remove Microsoft.VisualStudio.Component.Windows81SDK ` || IF "%ERRORLEVEL%"=="3010" EXIT 0s RUN rmdir /S /Q C:\\TEMP RUN setx /M PATH "%PATH%;C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\MSBuild\Current\Bin" RUN setx /M PATH "%PATH%;C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin" SHELL ["powershell"] RUN Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) RUN Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force RUN Install-Module -Name VCVars -Force RUN pushvc (invoke-vcvars -TargetArch x86 -HostArch AMD64) RUN choco install ninja -y ENTRYPOINT [ "C:\\Program Files (x86)\\Microsoft Visual Studio\\2022\\BuildTools\\Common7\\Tools\\VsDevCmd.bat", "&&", "cmd.exe" ] ================================================ FILE: FILETREE.TXT ================================================ -------------- File Hierarchy -------------- Please update this file if you change the files that Socrates needs to run. c:\ // drive letter doesn't matter mskids\ utest.exe // can really be anywhere on hard drive 3dmovie\ mhole2.avi logn1.avi 05logn4.avi logn06.avi two.avi backstag.avi proj1.avi proj2.avi proj3.avi proj4.avi proj5.avi mtrls.3cn tmpls.3cn snds.3cn bkgds.3cn tdfs.3cn 3dmovie.chk building.chk studio.chk shared.chk help.chk helpaud.chk bkgds.3th actor.3th actresl.3th mtrl.3th tbox.3th sound.3th prop.3th Notes ----- (no notes at this time) ================================================ FILE: FONTS.md ================================================ # Font files These font file binaries were removed from the directory structure given the challenges around font licensing. It should be relatively straightforward to write a batch file to hydrate these files in some form from a typical Windows machine or from other locations. ``` ./cd3/SETUP/COMICBD.TTF ./cd3/SETUP/COMIC.TTF ./SETUP/BIN/COMICBD.TTF ./SETUP/BIN/COMIC.TTF ./cd12/SETUP/BIN/COMICBD.TTF ./cd12/SETUP/BIN/COMIC.TTF ``` ================================================ FILE: LICENSE ================================================ MIT License Copyright (c) Microsoft Corporation. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE ================================================ FILE: NEWTRD.TXT ================================================ SOCRATES TRD SETUP: -------------- tbd EXE: --------- Everything in the EXE Spec: *ZD* KIDSPACE: --------- **IN GENERAL** - modals (eg. portfolio, map, quit alert, etc) are not testable - they should pause whatever's going on in the background but they don't - NO graphics are final. - Freebies not done - some temp ones are in there - no actor bio pages - Palette flash at start of street scene is a known problem STARTUP/TICKET CHOICES ---------------------- - added temp screen prompting for new user information. Use this screen to set new user flag; the screen itself is not testable. - There is a hot key for bringing up the map at the ticket, this is for development purposes only and is not testable. McZEE's PACKING SEQUENCE AND TRIP TO IMAGINOPOLIS ------------------------------------------------- - AVI now plays, still not final though. - EXIT button not implemented now (will move inside AVI) TICKET BOOTH ------------ - ZD for navigation and choices. - The palette and audio are not ZD. - Hot keys are testable. - Choices leading through the lobby and the theater are ZD for pass through navigation. LOBBY ----- - ZD for navigation, choices. - Hot keys are testable. THEATER ------- - script and code are *ZD* - Hot keys are testable, 'cept after loading a movie. - ZD for pass through navigation. - known palette bugs in theatre after playing a movie. Navigating away from an open movie will lose memory (choose "Stop Watching Movies") BACKSTAGE --------- - ZD for navigation and choices. - quality of AVIs is moderate. - Hot keys are testable. STUDIO ------ - No animation for toolbox opening up (yet) - Clicking on the toolbox to go to the tools is done - launching to the tools the first time invokes the McZee intro in front of the tools. The shift of the tools after the animation is expected; the tools background isn't final (the graphic is off-centered a couple of pixels) IDEAS ROOM ---------- - The navigation and choices are testable. - Splot machine - *ZD*. Talent book - testable - Hot keys are testable. PROJECTS ROOM ------------- - Testable, not ZD - no animation for logos/movie technique monitors - no animation after choosing tvs - palette problem on entering tools is known PROJECTS: ------------------- LOGO - done SNIPPET VIEWER - testable (not ZD), but no snippet movies are available yet. - AVIs are placeholders - no alert when you switch in the middle of a snippet CONTENT: (All content should be line itemed) ----------------- BACKGROUNDS tbd ACTORS tbd SOUNDS tbd 3-D FONTS *ZD* STUDIO SCENE TOOLS: --------------------------------------- SCENE BROWSER *ZD* CAMERA ANGLES *ZD* SCENE SORTER *ZD* TRANSITIONS *ZD* WAIT UNTIL THE END OF A SOUND *ZD* WAIT UNTIL MOUSE CLICK *ZD* DON'T WAIT *ZD* STUDIO ACTOR AND PROP TOOLS: ---------------------------------------------------------- ACTOR BROWSER *ZD* PROP BROWSER *ZD* ACTOR ROLL CALL - Visual Display, *ZD* - Rollover help *ZD* - Which actors displayed *ZD* - Application of selection *ZD* PROP ROLL CALL (includes prop actors and spletters) - Visual Display, *ZD* - Rollover help *ZD* - Which actors displayed *ZD* - Application of selection *ZD* 3D WORDS EASEL - *ZD*, except transmogrifier and import are not implemented COSTUME CHANGER EASEL - *ZD* SIZE *ZD* SIZE EVENLY *ZD* SQUASH AND STRETCH *ZD* CHANGE BACK *ZD* ROTATE *ZD* TURN LEFT OR RIGHT *ZD* TIP FORWARDS OR BACKWARDS *ZD* TIP SIDE TO SIDE *ZD* CHANGE BACK *ZD* SYNCHRONIZE *ZD* REPOSITION *ZD* SELECT *ZD* ACTION BROWSER *ZD* RECORD SAME ACTION *ZD* REPLACE PART OF PATH *ZD* FALL THROUGH GROUND *ZD* UP AND DOWN *ZD* TALENT BOOK STUDIO SOUND TOOLS: ----------------------------------------- (** Note: Recorded/Imported sounds will be removed whenever the movie is saved unless they are a part of the current movie - awaiting pm decision) (Audioman not final, but bugs may be entered against any zd items below) SOUNDER TOOL ACTORS *ZD* BACKGROUNDS *ZD* MATCHER TOOL ACTORS *ZD* LOOPER TOOL ACTORS *ZD* BACKGROUNDS *ZD* SOUND EFFECT BROWSER SOUND PREVIEW *ZD* ACTOR SOUNDS *ZD* BACKGROUND SOUNDS *ZD* IMPORT *ZD* SPEECH BROWSER SOUND PREVIEW *ZD* SOUND RECORD EASEL Testable RATDOG ACTOR SOUNDS *ZD* BACKGROUND SOUNDS *ZD* IMPORT *ZD* MUSIC BROWSER SOUND PREVIEW *ZD* BACKGROUND PLAY ONE TIME *ZD* BACKGROUND PLAY AGAIN AND AGAIN *ZD* IMPORT *ZD* LISTENER *ZD* TWO SECOND CUTOFF ON FRAME PLAY *ZD* STUDIO WORD TOOLS: ---------------------------------------- STORYBOX INSERTION POINT *ZD* LETTERS (font?) testable, not ZD STYLES testable, not ZD LETTER SIZE testable, not ZD LETTER COLOR *ZD* BACKGROUND COLOR *ZD* SCROLLING (OR NON-SCROLLING) WORDS *ZD* STUDIO MASTER TOOLS: ------------------------------------------ CAST LIST PROP LIST FRAME SLIDER *ZD* SCENE SLIDER *ZD* PLAY/STOP *ZD* VOLUME CONTROL UNDO/REDO *ZD* CUT, COPY, AND PASTE *ZD* GET RID OF EVERYTHING BEFORE *ZD* GET RID OF EVERYTHING AFTER *ZD* GET RID OF THE ENTIRE SCENE *ZD* GET RID OF THE ACTOR STORYBOX *ZD* COPY PATH *ZD* PASTE *ZD* COPY *ZD* CUT *ZD* PORTFOLIO OPEN *ZD* NEW SAVE SAVE AS *ZD* AUTOSAVE HELP MACHINE - new graphics; placeholders for voice on/off - page to page navigation not ZD (broken) - topic layout is chaotic - volume control works but doesn't play preview sound MAP - all places and jumps work - exit not ZD - cancel works - volume control works - logo + snippet jumps land in projects room without starting projects EXIT *ZD* OTHER STUFF: ---------------------------- CONTENT CONVERSION HOT KEYS *ZD, except Help book* STUDIO UI SOUNDS *ZD* <"bingo" used as placeholder for missing content> ================================================ FILE: README.md ================================================ # 3DMMForever _Making 3D Movie Maker accessible to all and preserving it for generations to come._ ![3D Movie Maker](img/3dmovie.jpg?raw=true) ## Goals Our mission is to create a version of the original 3D Movie Maker software with these goals in mind: - Includes the original feature set, 640x480 UI, kidspace, and graphics. - Builds with modern open source tools. - Runs on multiple additional platforms including MacOS and Linux. - Ensure movie files produced in 3DMMForever can play in the original 3DMM. - Reduced quality is OK. - Ensure movie files produced with the original 3DMM can playback in true form. - Integrates [v3dmm](https://twitter.com/Foone/status/1307750230679412736). - Enhancements remain light and preserve backwards compatibility. - Heavier enhnacements will be reserved for [3DMMPlus](#3dmmplus). ## About Released by Microsoft in 1995, 3D Movie Maker (3DMM) is a creativity program originally designed for kids that allows users to create 3D animated movies through a simple user interface using a wide assortment of included scenes, 3D models, sounds and music. Users can place, animate and otherwise manipulate 3D models using simple mouse movements and drags. They can also record and import their own sound files. Finished movies can be saved and shared with others. The program also includes a "kidspace" in the form a movie theater that can be navigated around where a user can find movie making tutorials, and inspiration. In May 2022, Microsoft released the original source code of 3DMM under the [MIT license](LICENSE) as open source. Which is how 3DMMForever became possible! ## Build instructions CMake 3.23 and Visual Studio 2022 are required. To setup an environment quickly, one can install [VCVars](https://github.com/bruxisma/VCVars) for powershell and use ```console $ pushvc (invoke-vcvars -TargetArch x86 -HostArch AMD64) ``` to enable the environment. (To remove the environment simply call `popvc` afterwards As of right now it's only safe to target x86, which means using a cross compiler environment in conjunction with CMake. Using Ninja is an option via configure presets: ```console $ cmake --preset x86:msvc:debug $ cmake --build build ``` This should generate the `3dmovie.exe` file with little to no issue as long as your environment is setup correctly. The CMake project *does not* currently setup a correct install, nor does it show files inside of visual studio correctly (This will be added later) ### Known Issues - Compilation of `SITOBREN.EXE` is disabled - This requires the SoftImage SDK "DKIT" to compile ## Contributing 3DMMForever and 3DMMPlus will not be possible without an enthusiastic open source developer community backing it. We're working on a set of contribution guidelines that we will be using going forward. ## 3DMMPlus 3DMMPlus is a future fork of 3DMMForever that will be created when we've finished the porting work to MacOS and Linux. The sky will be the limit with 3DMMPlus! Our mission will be to create a heavily enhanced version of 3DMM that: - Has a flexible full color UI that looks great at modern resolutions. - Has a modern full color 3D renderer with lightning, shading, moveable camera, and more. - Produces a new enhanced file type. - Can import 3MM files and play them back as they were originally created. - Maintains a strong consideration for and familiarity with the original 3DMM’s UI decisions and approach. ## Legal stuff The following sections have been carried over from the original 3D Movie Maker [GitHub repository](https://github.com/microsoft/Microsoft-3D-Movie-Maker) released by Microsoft in May 2022. ### Code cleanup This code was restored from the Microsoft corporate archives and cleared for release. - Developer names and aliases were removed, with the exception of current employees who worked on the original release who consented to keeping their names in place - The archive consisted of several CDs, some of which were for alternate builds or products, and have been excluded - The code does not build with today's engineering tools, and is released as-is. ### Trademarks This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party's policies. This repo includes a build from 1995 of BRender from Argonaut software. Approval to open source BRender as MIT was given in an email from Jez San, former CEO of Argonaut. Other versions of BRender exist at https://github.com/foone/BRender-v1.3.2 and https://github.com/foone/BRender-1997 Thanks to Jez and the whole BRender team for their hard work on this amazing engine. A full historical list of BRender contributors is available at https://github.com/foone/BRender-v1.3.2/blob/main/README.md This repo does NOT include the SoftImage SDK "./DKIT" from 1992. Jez also offered this interesting BRender anecdote in an email: ``` When Sam Littlewood designed BRender, he didn’t write the code. And then document it. The way most things were built at the time. First, he wrote the manual. The full documentation That served as the spec. Then the coding started. ``` ================================================ FILE: SUPPORT.md ================================================ # No support This project has been open sourced to share this fun product from another era. However, this repository is not supported. A community may develop around a fork to modernize this project. ================================================ FILE: TRD.TXT ================================================ Test Release Document for Socrates --------------------- Last updated: 4/27/95 --------------------- Status options: --------------- waiting for xxx = not implemented because of a dependency not done = ready to implement but not implemented yet not yet reviewed = implemented but code has not been reviewed zd = zero defect, code is reviewed and ready to test not ready for testing = self-explanatory, "NOTE:" required to elaborate Formatting notes: ----------------- So that this file can be viewed with aribitrary tab stops, tabs should appear only at the beginning of a line. Alignment after non-tab characters should be accomplished using spaces. Any item in the "status" column should be defined above in "Status options." For additional information, add a "NOTE:" comment on the line below the main line-item. Try very hard to keep line-items short enough to fit on one line. Product wide failure handling UI error messages waiting for spec actor.cpp ((*****)) actor oom & file i/o zd scene.cpp (seanse) Scene functionality zd movie.cpp (seanse) Movie functionality zd tbox.cpp (seanse) Textbox functionality zd Backgrounds and Camera Views bkgd.cpp ((*****)): Background RGB and Z buffers zd Light sources zd Cameras zd Switching backgrounds zd Switching views zd Switching palettes ((*****)) zd NOTE: only HH-Lab background uses it scene.cpp (seanse): Camera change events zd Scene change events zd Materials and Texture Maps tmap.cpp ((*****)) Load texmap from chunky file not yet reviewed Save texmap to chunky file not yet reviewed Import texmap from PIX not yet reviewed Import texmap from BMP (peted) not yet reviewed mtrl.cpp ((*****)) Shade table management zd Load MTRL (stock material) from chunky file zd Save MTRL to chunky file zd Load CMTL (custom material) from chunky file zd tmpl.cpp ((*****)) Manage default costume and custom materials for actors zd body.cpp ((*****)) Attach and remove stock and custom materials to body parts zd actor.cpp ((*****)) Manage costume change events zd Models - the actual shape of the body parts modl.cpp ((*****)) Load model from chunky file zd Save model to chunky file zd Import model from DAT zd tmpl.cpp ((*****)) Loads models based on the current action and tells body to attach them zd body.cpp ((*****)) Attaches models to body parts zd Rendering zbmp.cpp ((*****)) Load Z-buffer from chunky file zd Draw Z-buffer into gpt, clipping to regn zd bwld.cpp ((*****)) Manage BRender actor hierarchy, including cameras and all actors zd Manage background RGB and Z buffer zd Render into working RGB and Z buffer zd Dirty region management zd 2-D Actor Pick zd Half and quarter-resolution rendering zd Prerender static actors not done Other performance improvements not done Actor Templates tmpl.cpp ((*****)) Read TMPL from chunky file zd Set default costume zd Get custom costume zd Set models and matrices based on action zd 3-D Text actors zd (see section below) Accessories (optional hats and hammers) not done 3-D Text tdf.cpp ((*****)) Code zd tdt.cpp ((*****)) Code zd Spletter Easel script (seanse) not yet reviewed Spletter Easel code ((*****)) not done tdfmake.exe (font authoring tool) ((*****)) not yet reviewed Costume Changer Easel Scripting (seanse) not yet reviewed Code (*****) not done Content Conversion - Tools to bring designer's data into Socrates. See Materials and Texture Maps sitobren.cpp (peted) Actor conversion NOTE: no final actors have been received from the content production staff; if problems appear in existing actors, let NVarma and PeteD know, but don't report a bug. Hierarchy/mesh data not reviewed Basic non-texture-mapped materials not reviewed Texture-mapped materials waiting for spec Background conversion not reviewed NOTE: HH-Lab background should be completely correct, except that it has no overhead view yet. Text Boxes tbox.cpp (seanse) Load/Save text boxes in documents zd Cut/Copy/Paste entire text boxes zd Cut/Copy/Paste text in text boxes zd Undo/Redo text box edits zd Text box background color zd Text box foreground color zd External clipboard support zd Sound tools Scripting (seanse) not done Code (*****/******) not done Sound recording Easel script (seanse) not done Sound recording Easel code (******) not done Scenes - Scene level functionality. scene.cpp (seanse) Load scene in document zd Save scene in document zd Scene chopper zd Scene chopper - backwards zd Scene nuker zd Transitions (seanse/(*****)) zd Pauses zd Undo/Redo for scene edits zd Sound not done. Movies - Movie level functionality. movie.cpp* (seanse) Load movie document zd Save movie document zd Roll-call management zd Actor - Actor manipulations: actor.cpp ((*****)) Static/non-static April spec changes zd Orientation during placement drag zd Path orientation (single & multi point) zd Ground zero zd Add new actor from rolls zd Add actor from rollcall (not present in scene) zd Add actor from rollcall (out of view) zd Initial Actor orientation (*******) zd Initial Actor position/scale (*******) not done Static & non-static Actions zd Path Compose zd Path Recording and Rerecording zd Path Tweaking zd Motion Fill zd Floating zd Freezing zd Transformers zd Squash/Stretch zd Normalize zd Rotate zd Grow/Shrink zd Costumes zd Subpaths (including attribute inheritance) zd Sooner/Later tool zd Sound not done Cut Actor (forwards & back for scene chop) zd actrsave.cpp ((*****)) Save actor to document zd Load actor from document zd Manage actor's tags zd actredit.cpp* ((*****)/seanse) Cut Actor zd Copy Actor zd Paste Actor zd Copy Route zd Paste Route zd actredit.cpp (seanse/*****) Undo/redo for actors zd Studio Master Controls stdioscb.[cpp,cht] (*****) Frame/scene scrollbars, buttons zd Frame/scene counters, name, fps zd Tag Manager - references to content on CD tagman.cpp ((*****)) Search all drives for content sources zd Report missing CD (and retry) zd Read objects from content sources zd Read objects from user document (sidNil tags) zd Ctrl, Shift, Hot Keys (Stest only) Ctrl drag (Tweak) zd Ctrl N (new movie) not done Ctrl O (open movie) not done Ctrl Q (quit) zd Ctrl S (save) zd Ctrl X (Cut) zd Shift Ctrl X (end of scene cut) not done Shift Cut Tool (end of scene cut) zd Ctrl C (Copy) zd Shift Ctrl C (end of scene copy) not done Shift Copy Tool (end of scene copy) zd Ctrl V (Paste) zd Ctrl Z (Undo) not done Ctrl esc (Chicago) zd Ctrl esc-esc (Chicago) zd Ctrl motion-fill, Create Path (starting cel) zd Shift during mousedown drag zd Shift motion fill (freeze) zd Shift new textbox (square) not done f1 (open help book) not done F9 Toggle x-y, y-z not done UP, DOWN arrows while recording not done alt-tab zd Socrates exe stuff and Win95 ((*****)) waiting for spec Maintain "HomeDirectory" entry in registry not done Determine current user name not done Find or Create user directory not done Maintain "MSKidsDirectory" entry in registry not done Maintain user preferences in registry not done Resolution Switch to/from 640x480 not done mda: "ChangeResolution" entry in registry? waiting for spec mda: "RunInWindow" entry in registry? waiting for spec Read version and PID resources and put in string table so about box can read 'em not done Utest stuff (User Interface behaviour) [seanse] NOTE: THE FOLLOWING AREAS ARE FOR UI TESTING ONLY! BECAUSE THESE ARE 'zd' DOES NOT IMPLY THE CODE BEHIND THE UI IS 'zd'. Primary Tools: Covers behave as a radio group zd Settings browser zd Actors browser zd Props browser not done Spletters browser zd Sound Efx browser not done Music browser not done Recorded browser not done Text box create not done Settings Secondary Tools: Scene sorter (peted) not done Camera browser zd Scene pauses zd Actors Secondary Tools: Costume Easel not done Sizer popup zd Rotate popup zd Sooner/Later zd Compose tool zd Select tool zd Action browser not done Same action tool zd Rerecord button zd Respect ground button zd X/Y button zd Actor biographies not done Tools behave as radio group not done (actions mess this up) Sounds Secondary Tools: Attach to cell not done Play once not done Looping not done Listen not done Texts Secondary Tools: Edit/Select tool zd Font popup not done Style popup not done Size popup not done Text color popup not done Background color popup not done Scroll type popup zd Scrollbars: Frame Fwd/Back zd Frame Thumbnail zd Frame Counter zd Scene Fwd/Back zd Scene Thumbnail zd Scene Counter zd Play: zd Volume Control: not done Undo/Redo: zd Cut/Copy/Paste: Chop Fwd zd Chop Back zd Scene nuke zd Actor/Tbox nuke zd Copy route zd Paste zd Copy zd Cut zd Portfolio: Open zd New zd Save zd Save As zd Map: not done Help book: not done Other: Tooltips not done Leveling zd Open file dialog not done Ctrl, Shift, Hot Keys (Utest only) Ctrl drag (Tweak) zd Ctrl N (new movie) not done Ctrl O (open movie) not done Ctrl Q (quit) not done Ctrl S (save) not done Ctrl X (Cut) not done Shift Ctrl X (end of scene cut) not done Shift Cut Tool (end of scene cut) not done Ctrl C (Copy) not done Shift Ctrl C (end of scene copy) not done Shift Copy Tool (end of scene copy) not done Ctrl V (Paste) not done Ctrl Z (Undo) not done Ctrl esc (Chicago) zd Ctrl esc-esc (Chicago) zd Ctrl motion-fill, Create Path (starting cel) zd Shift during mousedown drag zd Shift motion fill (freeze) zd Shift new textbox (square) CUT FROM PRODUCT f1 (open help book) not done F9 Toggle x-y, y-z not done UP, DOWN arrows while recording not done alt-tab zd Utest stuff (Code Specific to the studio): NOTE: IF SOMETHING IS NOT LISTED HERE, IT IS NOT STUDIO SPECIFIC AND YOU SHOULD REFER TO THE 'ENGINE' LISTING TO FIND ITS STATUS. Primary Tools: Settings browser not yet reviewed Actors browser not yet reviewed Props browser not yet reviewed Spletters browser not yet reviewed Sound Efx browser not done Music browser not done Recorded browser not done Text box create browser zd Settings Secondary Tools: Scene sorter (peted) not yet reviewed Camera browser not yet reviewed Actors Secondary Tools: Costume Easel not yet reviewed Actor tool popups zd Action browser selection not yet reviewed (*NOTE: Selection is temporarily object verb) Action browser cel cycling not done Action browser preview not done Actor biographies not done Texts Secondary Tools: Font popup not done Style popup not done Size popup not done Text color popup not done Background color popup not done Scroll type popup zd Scrollbars: Frame Fwd/Back zd Frame Thumbnail zd Frame Counter zd Scene Fwd/Back zd Scene Thumbnail zd Scene Counter zd Portfolio: Open not yet reviewed New not yet reviewed Save not yet reviewed Save As not yet reviewed Map: not done Help book: not done Other: Open file dialog not done Chunky tools Note: These are all authoring/editing tools and not part of Socrates. All Kauai (framework) functionality is also owned by shonk. ched.exe (shonk) Chunky editor not yet reviewed chomp.exe (shonk) Chunky compiler not yet reviewed chelp.exe (shonk) Chunky help editor not yet reviewed ================================================ FILE: audioman/audioman.cpp ================================================ // Implementation of the AudioMan library. // Created for 3DMMForever. // FIXME: This is a nonworking stub. The game will still function, but sound effects will be missing. #include #include #include "audioman.h" STDAPI AllocSoundFromStream(LPSOUND FAR *ppSound, LPSTREAM pStream, BOOL fSpooled, LPCACHECONFIG lpCacheConfig) { return E_NOTIMPL; } STDAPI AllocSoundFromFile(LPSOUND FAR *ppSound, char FAR *szFileName, DWORD dwOffset, BOOL fSpooled, LPCACHECONFIG lpCacheConfig) { return E_NOTIMPL; } STDAPI AllocSoundFromMemory(LPSOUND FAR *ppSound, LPBYTE lpFileData, DWORD dwSize) { return E_NOTIMPL; } STDAPI_(LPMIXER) GetAudioManMixer(void) { return NULL; } STDAPI AllocTrimFilter(LPSOUND FAR *ppSound, LPSOUND pSoundSrc) { return E_NOTIMPL; } STDAPI AllocBiasFilter(LPSOUND FAR *ppSound, LPSOUND pSoundSrc) { return E_NOTIMPL; } STDAPI AllocLoopFilter(LPSOUND FAR *ppSound, LPSOUND pSoundSrc, DWORD dwLoops) { return E_NOTIMPL; } STDAPI AllocConvertFilter(LPSOUND FAR *ppSound, LPSOUND pSoundSrc, LPWAVEFORMATEX lpwfx) { return E_NOTIMPL; } STDAPI SoundToFileAsWave(LPSOUND pSound, char FAR *pAbsFilePath) { return E_NOTIMPL; } STDAPI_(int) DetectLeaks(BOOL fDebugOut, BOOL fMessageBox) { return 0; } ================================================ FILE: bren/brenfun.cpp ================================================ // Temporary brender code #include "frame.h" #include "bren.h" ASSERTNAME extern br_material test_materials[]; extern int test_materials_count; br_camera camera_data = { NULL, BR_CAMERA_PERSPECTIVE, BR_ANGLE_DEG(45), /* 45 degree field of view */ BR_SCALAR(1.0), /* Hither */ BR_SCALAR(100.0), /* Yon */ BR_SCALAR(16.0 / 9.0), /* Aspect ratio */ }; br_material texmap = { "texmap", BR_COLOUR_RGB(255, 255, 255), /* colour */ {255}, /* opacity */ BR_UFRACTION(0.05), /* ka */ BR_UFRACTION(0.30), /* kd */ BR_UFRACTION(0.99), /* ks */ BR_SCALAR(20), /* power */ BR_MATF_MAP_COLOUR | BR_MATF_LIGHT | BR_MATF_GOURAUD, /* flags */ 0, 0, /* shift up/down */ 0, 63, /* index base/range */ }; static bool FLoadModel(char *szFileName, br_model **pmdl) { *pmdl = BrModelLoad(szFileName); if (*pmdl == NULL) return fFalse; else BrModelAdd(*pmdl); return fTrue; } // create some objects void BREN::CreateFunStuff(void) { int i; br_pixelmap *pm; br_pixelmap *shade; // BrBegin(); // BrZbBegin(); obs_z = BR_SCALAR(5.0); /* * Add materials to system */ for (i = 0; i < test_materials_count; i++) BrMaterialAdd(test_materials + i); shade = BrPixelmapLoad("shade.tab"); BrTableAdd(shade); /* Tell renderer about shading table */ pm = BrPixelmapLoad("jupiter.pix"); BrMapAdd(pm); /* Tell renderer about texture map */ texmap.index_shade = shade; texmap.colour_map = pm; BrMaterialAdd(&texmap); /* Tell renderer about material */ // Load all the models if (!FLoadModel("iceman.dat", &modlMain)) MessageBox(NULL, "Could not load iceman.dat", "ERROR", MB_OK); if (!FLoadModel("torus.dat", &modlChild)) MessageBox(NULL, "Could not load torus.dat", "ERROR", MB_OK); if (!FLoadModel("cube.dat", &modlCube)) MessageBox(NULL, "Could not load cube.dat", "ERROR", MB_OK); /* * Create the world */ // actrWorld = BrActorAllocate(BR_ACTOR_NONE,NULL); _pbactWorld = BrActorAllocate(BR_ACTOR_NONE, NULL); _pbactCamera = BrActorAdd(_pbactWorld, BrActorAllocate(BR_ACTOR_CAMERA, &camera_data)); // actrCamera->t.type = BR_TRANSFORM_MATRIX34; // BrMatrix34Translate(&actrCamera->t.t.mat, BR_SCALAR(0.0), BR_SCALAR(20.0), // BR_SCALAR(0.0)); /* * Test shape and child */ actrMain = BrActorAdd(_pbactWorld, BrActorAllocate(BR_ACTOR_MODEL, NULL)); actrMain->model = modlMain; // actrMain->material = BrMaterialFind("texmap"); actrChild = BrActorAdd(actrMain, BrActorAllocate(BR_ACTOR_MODEL, NULL)); actrChild->t.type = BR_TRANSFORM_MATRIX34; BrMatrix34Translate(&actrChild->t.t.mat, BR_SCALAR(1.5), BR_SCALAR(0.0), BR_SCALAR(0.0)); actrChild->model = modlChild; /* * Spinning shape driven by a quaternion */ actrQuat = BrActorAdd(_pbactWorld, BrActorAllocate(BR_ACTOR_MODEL, NULL)); actrQuat->model = modlCube; actrQuat->t.type = BR_TRANSFORM_QUAT; BrVector3SetInt(&actrQuat->t.t.quat.t, -2, 0, 0); /* * Spinning shape driven by euler angles */ actrEuler = BrActorAdd(_pbactWorld, BrActorAllocate(BR_ACTOR_MODEL, NULL)); actrEuler->model = modlCube; actrEuler->t.type = BR_TRANSFORM_EULER; actrEuler->t.t.euler.e.order = BR_EULER_YXZ_R; BrVector3SetInt(&actrEuler->t.t.euler.t, -4, 0, 0); /* * Initialise angles */ actrEuler->t.t.euler.e.a = 0; actrEuler->t.t.euler.e.b = 0; actrEuler->t.t.euler.e.c = 0; /* * Some useful transforms for later */ BrMatrix34Identity(&Rotation); BrMatrix34Identity(&ObsRotation); } #define MSCALE BR_SCALAR(0.05) void BREN::ChangeScene(WPARAM mouseFlags, LPARAM coords) { static UINT old_mouse_x; static UINT old_mouse_y; WORD mouse_x = LOWORD(coords) - old_mouse_x; WORD mouse_y = HIWORD(coords) - old_mouse_y; br_matrix34 tmpmat; /* * Mouse control */ if (mouse_x != 0 || mouse_y != 0) { if (mouseFlags & MK_LBUTTON) { if (mouseFlags & MK_RBUTTON) { /* * Move actrCamera in/out */ obs_z += BR_MUL(BR_SCALAR(mouse_y), MSCALE); } else { /* * Drag object around */ pos_x += BR_MUL(BR_SCALAR(mouse_x), MSCALE); pos_y -= BR_MUL(BR_SCALAR(mouse_y), MSCALE); } } else if (mouseFlags & MK_RBUTTON) { /* * Rotate actrCamera via rolling ball interface */ BrMatrix34RollingBall(&tmpmat, (br_int_16)-mouse_x, mouse_y, 800); BrMatrix34Pre(&ObsRotation, &tmpmat); } else { /* * Rotate object via rolling ball interface */ BrMatrix34RollingBall(&tmpmat, mouse_x, (br_int_16)-mouse_y, 200); BrMatrix34Post(&Rotation, &tmpmat); } } old_mouse_x = LOWORD(coords); old_mouse_y = HIWORD(coords); /* * Modify scene according to controls */ BrMatrix34Translate(&_pbactCamera->t.t.mat, obs_x, obs_y, obs_z); BrMatrix34Post(&_pbactCamera->t.t.mat, &ObsRotation); /* * test shape spun with mouse */ BrMatrix34Translate(&actrMain->t.t.mat, pos_x, pos_y, pos_z); BrMatrix34Pre(&actrMain->t.t.mat, &Rotation); /* * Convert angles to a quaternion for second shape */ BrEulerToQuat(&actrQuat->t.t.quat.q, &actrEuler->t.t.euler.e); /* * Roll angles around */ actrEuler->t.t.euler.e.a += BR_ANGLE_DEG(3); actrEuler->t.t.euler.e.b += BR_ANGLE_DEG(5); actrEuler->t.t.euler.e.c += BR_ANGLE_DEG(7); } ================================================ FILE: bren/bwld.cpp ================================================ /*************************************************************************** bwld.cpp: BRender world class Primary Author: ****** Review Status: REVIEWED - any changes to this file must be reviewed! To improve performance, BWLD can render into a reduced area, then enlarge the resulting image at display time. _fHalfX reduces the horizontal resolution by half, and _fHalfY reduces the vertical resolution by half. Both modes can be used together to render 1/4 as many pixels. _rcBuffer is the area being rendered into; _rcView is the area to copy _rcBuffer into (with stretching, if necessary). _pregnDirtyWorking and _pregnDirtyScreen are in _rcBuffer's coordinate system. However, in MarkRenderedRegn, _pregnDirtyScreen is briefly enlarged to _rcView's coordinate system, since the gob will be drawn at full view resolution. ***************************************************************************/ #include "bren.h" // REVIEW *****: _pgptStretch is completely unused...remove it! ASSERTNAME RTCLASS(BWLD) const long kcbitPixelRGB = 8; // RGB buffers are 8 bits deep const long kcbPixelRGB = 1; const long kcbitPixelZ = 16; // Z buffers are 16 bits deep const long kcbPixelZ = 2; bool BWLD::_fBRenderInited = fFalse; /*************************************************************************** Allocate a new BRender world ***************************************************************************/ PBWLD BWLD::PbwldNew(long dxp, long dyp, bool fHalfX, bool fHalfY) { AssertIn(dxp, 1, ksuMax); // BPMP's width and height are ushorts AssertIn(dyp, 1, ksuMax); Assert(dxp % 2 == 0, "dxp should be even"); Assert(dyp % 2 == 0, "dyp should be even"); PBWLD pbwld; pbwld = NewObj BWLD; if (pbwld == pvNil || !pbwld->_FInit(dxp, dyp, fHalfX, fHalfY)) { ReleasePpo(&pbwld); return pvNil; } AssertPo(pbwld, 0); return pbwld; } /*************************************************************************** Initialize the BWLD ***************************************************************************/ bool BWLD::_FInit(long dxp, long dyp, bool fHalfX, bool fHalfY) { AssertBaseThis(0); AssertIn(dxp, 1, ksuMax); // BPMP's width and height are ushorts AssertIn(dyp, 1, ksuMax); if (!_fBRenderInited) { BrBegin(); BrZbBegin(BR_PMT_INDEX_8, BR_PMT_DEPTH_16); _fBRenderInited = fTrue; } _rcView.Set(0, 0, dxp, dyp); if (!_FInitBuffers(dxp, dyp, fHalfX, fHalfY)) return fFalse; // Create the world and initial camera _bactWorld.type = BR_ACTOR_NONE; _bactWorld.t.type = BR_TRANSFORM_MATRIX34; BrMatrix34Identity(&_bactWorld.t.t.mat); _bactWorld.identifier = (char *)this; _bactCamera.type = BR_ACTOR_CAMERA; _bactCamera.t.type = BR_TRANSFORM_MATRIX34; _bactCamera.type_data = &_bcam; _bcam.type = BR_CAMERA_PERSPECTIVE; // Note that the aspect ratio of the view is specified rather than the // ratio of the buffer so that even when rendering into a reduced // buffer, the actors come out right when stretched to _rcView in Draw(). _bcam.aspect = BR_SCALAR((double)_rcView.Dxp() / (double)_rcView.Dyp()); BrActorAdd(&_bactWorld, &_bactCamera); // Set up dirty region stuff _pregnDirtyWorking = REGN::PregnNew(&_rcBuffer); if (pvNil == _pregnDirtyWorking) return fFalse; _pregnDirtyScreen = REGN::PregnNew(pvNil); if (pvNil == _pregnDirtyScreen) return fFalse; BrZbSetRenderBoundsCallback(_ActorRendered); return fTrue; } /*************************************************************************** Initialize or reinitialize members that depend on the values of _fHalfX and _fHalfY. This function gets called by _FInit, and again every time FSetHalfMode is called. ***************************************************************************/ bool BWLD::_FInitBuffers(long dxp, long dyp, bool fHalfX, bool fHalfY) { AssertBaseThis(0); AssertIn(dxp, 1, ksuMax); // BPMP's width and height are ushorts AssertIn(dyp, 1, ksuMax); _fHalfX = fHalfX; _fHalfY = fHalfY; if (_fHalfX) dxp /= 2; if (_fHalfY) dyp /= 2; _rcBuffer.Set(0, 0, dxp, dyp); ReleasePpo(&_pzbmpBackground); _pzbmpBackground = ZBMP::PzbmpNew(dxp, dyp); if (pvNil == _pzbmpBackground) return fFalse; // Set up the working Z-buffer ReleasePpo(&_pzbmpWorking); _pzbmpWorking = ZBMP::PzbmpNew(dxp, dyp); if (pvNil == _pzbmpWorking) return fFalse; Assert(kcbitPixelZ == 16, "change _bpmpZ.type"); _bpmpZ.type = BR_PMT_DEPTH_16; _bpmpZ.row_bytes = (short)LwMul(dxp, kcbPixelZ); _bpmpZ.width = (ushort)dxp; _bpmpZ.height = (ushort)dyp; _bpmpZ.origin_x = dxp / 2; _bpmpZ.origin_y = dyp / 2; _bpmpZ.pixels = _pzbmpWorking->Prgb(); // Set up background RGB buffer ReleasePpo(&_pgptBackground); _pgptBackground = GPT::PgptNewOffscreen(&_rcBuffer, kcbitPixelRGB); if (pvNil == _pgptBackground) return fFalse; // Set up the working RGB buffer if (pvNil != _pgptWorking) { _pgptWorking->Unlock(); ReleasePpo(&_pgptWorking); } _pgptWorking = GPT::PgptNewOffscreen(&_rcBuffer, kcbitPixelRGB); if (pvNil == _pgptWorking) return fFalse; Assert(kcbitPixelRGB == 8, "change _bpmpRGB.type"); _bpmpRGB.type = BR_PMT_INDEX_8; _bpmpRGB.row_bytes = (short)LwMul(dxp, kcbPixelRGB); _bpmpRGB.width = (ushort)dxp; _bpmpRGB.height = (ushort)dyp; _bpmpRGB.origin_x = dxp / 2; _bpmpRGB.origin_y = dyp / 2; _bpmpRGB.pixels = _pgptWorking->PrgbLockPixels(); // If in _fHalfY and not _fHalfX, allocated a _rcView-sized buffer // for faster blitting -- see Draw() ReleasePpo(&_pgptStretch); if (!_fHalfX && _fHalfY) { _pgptStretch = GPT::PgptNewOffscreen(&_rcView, kcbitPixelRGB); if (pvNil == _pgptStretch) return fFalse; } return fTrue; } /*************************************************************************** Destructor for BWLD ***************************************************************************/ BWLD::~BWLD(void) { AssertBaseThis(0); if (pvNil != _pgptWorking) { _pgptWorking->Unlock(); ReleasePpo(&_pgptWorking); } ReleasePpo(&_pgptStretch); ReleasePpo(&_pgptBackground); ReleasePpo(&_pzbmpWorking); ReleasePpo(&_pzbmpBackground); ReleasePpo(&_pregnDirtyWorking); ReleasePpo(&_pregnDirtyScreen); ReleasePpo(&_pcrf); } /*************************************************************************** Change reduced rendering mode ***************************************************************************/ bool BWLD::FSetHalfMode(bool fHalfX, bool fHalfY) { AssertThis(0); if (FPure(_fHalfX) == FPure(fHalfX) && FPure(_fHalfY) == FPure(fHalfY)) return fTrue; bool fHalfXSave = _fHalfX; bool fHalfYSave = _fHalfY; RC rcBufferSave = _rcBuffer; PGPT pgptWorkingSave = _pgptWorking; PGPT pgptStretchSave = _pgptStretch; PGPT pgptBackgroundSave = _pgptBackground; BPMP bpmpRGBSave = _bpmpRGB; PZBMP pzbmpWorkingSave = _pzbmpWorking; PZBMP pzbmpBackgroundSave = _pzbmpBackground; BPMP bpmpZSave = _bpmpZ; _pgptWorking = pvNil; _pgptStretch = pvNil; _pgptBackground = pvNil; _pzbmpWorking = pvNil; _pzbmpBackground = pvNil; if (!_FInitBuffers(_rcView.Dxp(), _rcView.Dyp(), fHalfX, fHalfY)) goto LFail; if (pvNil != _pcrf) { // Reload the background at the new resolution if (!FSetBackground(_pcrf, _ctgRGB, _cnoRGB, _ctgZ, _cnoZ)) goto LFail; } if (pvNil != pgptWorkingSave) { pgptWorkingSave->Unlock(); ReleasePpo(&pgptWorkingSave); } ReleasePpo(&pgptStretchSave); ReleasePpo(&pgptBackgroundSave); ReleasePpo(&pzbmpWorkingSave); ReleasePpo(&pzbmpBackgroundSave); AssertThis(0); return fTrue; LFail: // Get rid of newly allocated buffers if (pvNil != _pgptWorking) { _pgptWorking->Unlock(); ReleasePpo(&_pgptWorking); } ReleasePpo(&_pgptStretch); ReleasePpo(&_pgptBackground); ReleasePpo(&_pzbmpWorking); ReleasePpo(&_pzbmpBackground); // restore everything _fHalfX = fHalfXSave; _fHalfY = fHalfYSave; _rcBuffer = rcBufferSave; _bpmpZ = bpmpZSave; _bpmpRGB = bpmpRGBSave; _pgptWorking = pgptWorkingSave; _pgptStretch = pgptStretchSave; _pgptBackground = pgptBackgroundSave; _pzbmpWorking = pzbmpWorkingSave; _pzbmpBackground = pzbmpBackgroundSave; AssertThis(0); return fFalse; } /*************************************************************************** Completely close BRender, freeing all data structures that BRender knows about. This invalidates all MODLs and MTRLs in existence. ***************************************************************************/ void BWLD::CloseBRender(void) { if (_fBRenderInited) { BrZbEnd(); BrEnd(); _fBRenderInited = fFalse; } } /*************************************************************************** Copy pvSrc into pvDst, skipping every other short. This is called by FSetBackground for each row in a ZBMP when _fHalfX is fTrue. ***************************************************************************/ inline void SqueezePb(void *pvSrc, void *pvDst, long cbSrc) { AssertIn(cbSrc, 0, kcbMax); Assert(cbSrc % (LwMul(2, kcbPixelZ)) == 0, "cbSrc is not aligned"); AssertPvCb(pvSrc, cbSrc); AssertPvCb(pvDst, cbSrc / 2); Assert(size(short) == kcbPixelZ, 0); short *pswSrc = (short *)pvSrc; short *pswDst = (short *)pvDst; while (cbSrc != 0) { *pswDst++ = *pswSrc++; pswSrc++; cbSrc -= LwMul(2, kcbPixelZ); } } /*************************************************************************** Load bitmaps from the given chunks into _pgptBackground and _pzbmpBackground. ***************************************************************************/ bool BWLD::FSetBackground(PCRF pcrf, CTG ctgRGB, CNO cnoRGB, CTG ctgZ, CNO cnoZ) { AssertThis(0); AssertPo(pcrf, 0); PMBMP pmbmpNew; PZBMP pzbmpNew; pmbmpNew = (PMBMP)pcrf->PbacoFetch(ctgRGB, cnoRGB, MBMP::FReadMbmp); if (pvNil == pmbmpNew) return fFalse; pzbmpNew = (PZBMP)pcrf->PbacoFetch(ctgZ, cnoZ, ZBMP::FReadZbmp); if (pvNil == pzbmpNew) { ReleasePpo(&pmbmpNew); return fFalse; } // It's nice to cache these bitmaps if we can, but they should be // tossed first when memory gets tight because they take up a lot // of space, they're pretty fast to reload, and they are reloaded // at a time when it's okay for a pause (between scenes/views). pmbmpNew->SetCrep(crepTossFirst); pzbmpNew->SetCrep(crepTossFirst); if (_fHalfX || _fHalfY) { // Need to squeeze pmbmpNew and pzbmpNew into _pgptBackground // and _pzbmpBackground. For pmbmpNew, it is drawn into a // full-size buffer, then reduced with CopyPixels. For the // ZBMP, it is necessary to reduce it in code here. PGPT pgptFull; long yp; byte *pbSrc; byte *pbDst; long cbRowSrc; long cbRowDst; pgptFull = GPT::PgptNewOffscreen(&_rcView, kcbitPixelRGB); if (pvNil == _pgptBackground) { ReleasePpo(&pmbmpNew); ReleasePpo(&pzbmpNew); return fFalse; } GNV gnvFull(pgptFull); GNV gnvHalf(_pgptBackground); gnvFull.DrawMbmp(pmbmpNew, 0, 0); ReleasePpo(&pmbmpNew); gnvHalf.CopyPixels(&gnvFull, &_rcView, &_rcBuffer); ReleasePpo(&pgptFull); pbSrc = pzbmpNew->Prgb(); pbDst = _pzbmpBackground->Prgb(); cbRowSrc = pzbmpNew->CbRow(); cbRowDst = _pzbmpBackground->CbRow(); Assert(cbRowSrc - cbRowDst == (_fHalfX ? cbRowDst : 0), "bad src/dest width ratio"); for (yp = 0; yp < _rcBuffer.Dyp(); yp++) { if (_fHalfX) SqueezePb(pbSrc, pbDst, cbRowSrc); else CopyPb(pbSrc, pbDst, cbRowSrc); pbSrc += cbRowSrc; if (_fHalfY) pbSrc += cbRowSrc; // skip rows in source pbDst += cbRowDst; } ReleasePpo(&pzbmpNew); } else // not in half mode { GNV gnv(_pgptBackground); gnv.DrawMbmp(pmbmpNew, 0, 0); ReleasePpo(&pmbmpNew); ReleasePpo(&_pzbmpBackground); _pzbmpBackground = pzbmpNew; } // entire working buffer is dirty because of background change _pregnDirtyWorking->SetRc(&_rcBuffer); _fWorldChanged = fTrue; // Keep a reference to the background, in case we change to/from // halfmode and need to reload it. pcrf->AddRef(); ReleasePpo(&_pcrf); _pcrf = pcrf; _ctgRGB = ctgRGB; _cnoRGB = cnoRGB; _ctgZ = ctgZ; _cnoZ = cnoZ; return fTrue; } /*************************************************************************** Change the camera matrix ***************************************************************************/ void BWLD::SetCamera(BMAT34 *pbmat34, BRS zrHither, BRS zrYon, BRA aFov) { AssertThis(0); AssertVarMem(pbmat34); Assert(zrYon > zrHither, "Yon must be further than hither"); _bactCamera.t.t.mat = *pbmat34; _bcam.hither_z = zrHither; _bcam.yon_z = zrYon; _bcam.field_of_view = aFov; // entire working buffer is dirty because of camera change _pregnDirtyWorking->SetRc(&_rcBuffer); } /*************************************************************************** Get the camera matrix ***************************************************************************/ void BWLD::GetCamera(BMAT34 *pbmat34, BRS *pzrHither, BRS *pzrYon, BRA *paFov) { AssertThis(0); AssertVarMem(pbmat34); AssertNilOrVarMem(pzrHither); AssertNilOrVarMem(pzrYon); AssertNilOrVarMem(paFov); *pbmat34 = _bactCamera.t.t.mat; if (pvNil != pzrHither) *pzrHither = _bcam.hither_z; if (pvNil != pzrYon) *pzrYon = _bcam.yon_z; if (pvNil != paFov) *paFov = _bcam.field_of_view; } /*************************************************************************** Render the world. First, notify all BODYs that we're about to render, so they can clear their _pregn's. Then clean the RGB and Z working buffers, since they're probably dirty from the last render. Update some regions, and render everything. ***************************************************************************/ void BWLD::Render(void) { AssertThis(0); PBACT pbact; RC rc; if (!_fWorldChanged) return; // Note that we only call pfnbeginrend on immediate children of // the world, because that will hit all the BODYs in Socrates. if (pvNil != _pfnbeginrend) { for (pbact = _bactWorld.children; pvNil != pbact; pbact = pbact->next) { // BODY roots are BR_ACTOR_NONE if (pbact->type == BR_ACTOR_NONE) _pfnbeginrend(pbact); } } _CleanWorkingBuffers(); // Now the working buffer is clean, but we should mark everything that // we just cleaned in _CleanWorkingBuffers as dirty in the screen buffer // so that the background shows through where actors used to be. // In most cases, _pregnDirtyScreen is empty now, so it's tempting to // just SwapVars the two regions. But if Render() was called but Draw() // never was (as when you press play then stop playing before the end of // the movie), _pregnDirtyScreen may have some stuff still to copy. So // we have to merge (union) _pregnDirtyWorking into _pregnDirtyScreen, // then clear _pregnDirtyWorking. _pregnDirtyScreen->FUnion(_pregnDirtyWorking); _pregnDirtyWorking->SetRc(pvNil); // Render the scene. This will add stuff to _pregnDirtyWorking BrZbSceneRender(&_bactWorld, &_bactCamera, &_bpmpRGB, &_bpmpZ); for (pbact = _bactWorld.children; pvNil != pbact; pbact = pbact->next) { // BODY roots are BR_ACTOR_NONE if (pbact->type == BR_ACTOR_NONE && pvNil != _pfngetrect) { _pfngetrect(pbact, &rc); _pregnDirtyWorking->FUnionRc(&rc); } } // Everything dirty in working buffer is dirty on screen too _pregnDirtyScreen->FUnion(_pregnDirtyWorking); _fWorldChanged = fFalse; } /*************************************************************************** "Prerender" the world. That is, render the world, then copy it into the background buffers ***************************************************************************/ void BWLD::Prerender(void) { AssertThis(0); GNV gnvBackground(_pgptBackground); GNV gnvWorking(_pgptWorking); Render(); _pzbmpWorking->Draw((byte *)_pzbmpBackground->Prgb(), _pzbmpBackground->CbRow(), _rcBuffer.Dyp(), 0, 0, &_rcBuffer, pvNil); // Need to detach _pzbmpBackground from the CRF so when we unprerender, // a fresh copy of the ZBMP is fetched _pzbmpBackground->Detach(); gnvBackground.CopyPixels(&gnvWorking, &_rcBuffer, &_rcBuffer); // Need to ensure that the current contents of _pgptWorking (just the // prerenderable actors) go into _pgptBackground GPT::Flush(); } /*************************************************************************** "Un-Prerender" the world. That is, restore the background bitmaps to the way they were before prerendering any actors ***************************************************************************/ void BWLD::Unprerender(void) { AssertThis(0); // Ignore error...you'll just get weird visual effects and an error // will be reported elsewhere FSetBackground(_pcrf, _ctgRGB, _cnoRGB, _ctgZ, _cnoZ); } /*************************************************************************** Copy _pregnDirtyWorking from background Z and RGB buffers to working Z and RGB buffers. ***************************************************************************/ void BWLD::_CleanWorkingBuffers(void) { AssertThis(0); REGSC regsc; long yp; long xpLeft; RC rcRegnBounds; RC rcClippedRegnBounds; byte *pbSrc; byte *pbDst; long cbRowCopy; RC rc; long cbRowSrc, cbRowDst; if (_pregnDirtyWorking->FEmpty(&rcRegnBounds)) return; if (!rcClippedRegnBounds.FIntersect(&rcRegnBounds, &_rcBuffer)) return; // Clean the Z buffer _pzbmpBackground->Draw((byte *)_bpmpZ.pixels, _bpmpZ.row_bytes, _bpmpZ.height, 0, 0, &rcClippedRegnBounds, _pregnDirtyWorking); // Clean the RGB buffer regsc.Init(_pregnDirtyWorking, &rcClippedRegnBounds); yp = rcClippedRegnBounds.ypTop; cbRowSrc = _pgptBackground->CbRow(); pbSrc = _pgptBackground->PrgbLockPixels() + LwMul(yp, cbRowSrc) + rcClippedRegnBounds.xpLeft; cbRowDst = _pgptWorking->CbRow(); pbDst = _pgptWorking->PrgbLockPixels() + LwMul(yp, cbRowDst) + rcClippedRegnBounds.xpLeft; for (; yp < rcClippedRegnBounds.ypBottom; yp++) { while (regsc.XpCur() < klwMax) { xpLeft = regsc.XpCur(); cbRowCopy = regsc.XpFetch() - xpLeft; regsc.XpFetch(); CopyPb(pbSrc + xpLeft, pbDst + xpLeft, cbRowCopy); } pbSrc += cbRowSrc; pbDst += cbRowDst; regsc.ScanNext(1); } _pgptWorking->Unlock(); _pgptBackground->Unlock(); } /*************************************************************************** Callback for when a BACT is rendered. Need to union with dirty region. ***************************************************************************/ void BWLD::_ActorRendered(PBACT pbact, PBMDL pbmdl, PBMTL pbmtl, br_uint_8 bStyle, br_matrix4 *pbmat4ModelToScreen, br_int_32 bounds[4]) { AssertVarMem(pbact); PBACT pbactT = pbact; PBWLD pbwld; RC rc(bounds[0], bounds[1], bounds[2] + 1, bounds[3] + 1); while (pbactT->parent != pvNil) pbactT = pbactT->parent; pbwld = (PBWLD)pbactT->identifier; AssertPo(pbwld, 0); if (pvNil != pbwld->_pfnbactrend) pbwld->_pfnbactrend(pbact, &rc); // call client callback } /*************************************************************************** Mark the region that has been rendered (and needs to be copied to the screen) ***************************************************************************/ void BWLD::MarkRenderedRegn(PGOB pgob, long dxp, long dyp) { AssertThis(0); AssertPo(pgob, 0); _pregnDirtyScreen->Scale((_fHalfX ? 2 : 1), 1, (_fHalfY ? 2 : 1), 1); _pregnDirtyScreen->Offset(dxp, dyp); vpappb->MarkRegn(_pregnDirtyScreen, pgob); _pregnDirtyScreen->SetRc(pvNil); // screen is clean } /*************************************************************************** Draw the BWLD's working RGB buffer into pgnv. The movie engine should have called BWLD::MarkRenderedRegn before calling this, so only _pregnDirtyScreen's bits will be copied. ***************************************************************************/ void BWLD::Draw(PGNV pgnv, RC *prcClip, long dxp, long dyp) { AssertThis(0); AssertPo(pgnv, 0); AssertVarMem(prcClip); RC rc; GNV gnvTemp(_pgptWorking); rc.OffsetCopy(&_rcView, -dxp, -dyp); pgnv->CopyPixels(&gnvTemp, &_rcBuffer, &rc); } /*************************************************************************** Add an actor to the world ***************************************************************************/ void BWLD::AddActor(BACT *pbact) { AssertThis(0); AssertVarMem(pbact); BrActorAdd(&_bactWorld, pbact); } /*************************************************************************** Filter callback proc for FClickedActor(). Saves pbact if it's the closest one hit so far. ***************************************************************************/ int BWLD::_FFilter(BACT *pbact, PBMDL pbmdl, PBMTL pbmtl, BVEC3 *pbvec3RayPos, BVEC3 *pbvec3RayDir, BRS dzpNear, BRS dzpFar, void *pvData) { AssertVarMem(pbact); AssertVarMem(pbvec3RayPos); AssertVarMem(pbvec3RayDir); PBWLD pbwld = (PBWLD)pvData; AssertPo(pbwld, 0); if (dzpNear < pbwld->_dzpClosestClicked) { pbwld->_pbactClosestClicked = pbact; pbwld->_dzpClosestClicked = dzpNear; } return fFalse; // fFalse means keep searching } /*************************************************************************** Call pfnCallback for each actor under the point (xp, yp) ***************************************************************************/ void BWLD::IterateActorsInPt(br_pick2d_cbfn *pfnCallback, void *pvArg, long xp, long yp) { AssertThis(0); // Convert to _rcBuffer coordinates: if (_fHalfX) xp /= 2; if (_fHalfY) yp /= 2; xp -= _bpmpRGB.origin_x; yp -= _bpmpRGB.origin_y; BrScenePick2D(&_bactWorld, &_bactCamera, &_bpmpRGB, xp, yp, pfnCallback, pvArg); } /*************************************************************************** If an actor is under (xp, yp), function returns fTrue and **pbact is the actor. If no actor is under (xp, yp), function returns fFalse. ***************************************************************************/ bool BWLD::FClickedActor(long xp, long yp, BACT **ppbact) { AssertThis(0); AssertVarMem(ppbact); _pbactClosestClicked = pvNil; _dzpClosestClicked = BR_SCALAR_MAX; IterateActorsInPt(BWLD::_FFilter, this, xp, yp); if (pvNil != _pbactClosestClicked) { *ppbact = _pbactClosestClicked; return fTrue; } // nothing was clicked TrashVar(ppbact); return fFalse; } #ifdef DEBUG /*************************************************************************** Assert the validity of the BWLD. ***************************************************************************/ void BWLD::AssertValid(ulong grf) { BWLD_PAR::AssertValid(fobjAllocated); AssertPo(_pgptWorking, 0); AssertPo(_pgptBackground, 0); AssertPo(_pzbmpWorking, 0); AssertPo(_pzbmpBackground, 0); AssertPo(_pregnDirtyWorking, 0); AssertPo(_pregnDirtyScreen, 0); AssertNilOrPo(_pcrf, 0); if (!_fHalfX && _fHalfY) AssertPo(_pgptStretch, 0); else Assert(pvNil == _pgptStretch, "don't need _pgptStretch!"); } /*************************************************************************** Mark memory used by the BWLD ***************************************************************************/ void BWLD::MarkMem(void) { AssertThis(0); BWLD_PAR::MarkMem(); MarkMemObj(_pgptWorking); MarkMemObj(_pgptBackground); MarkMemObj(_pzbmpWorking); MarkMemObj(_pzbmpBackground); MarkMemObj(_pregnDirtyWorking); MarkMemObj(_pregnDirtyScreen); MarkMemObj(_pcrf); MarkMemObj(_pgptStretch); } /****************************************************************************** FWriteBmp Writes the current rendered buffer out to the given file Arguments: PFNI pfni -- the name of the file Returns: fTrue if the file could be written successfully ************************************************************ PETED ***********/ bool BWLD::FWriteBmp(PFNI pfni) { AssertPo(pfni, 0); bool fRet; RC rc; fRet = FWriteBitmap(pfni, _pgptWorking->PrgbLockPixels(&rc), GPT::PglclrGetPalette(), _rcBuffer.Dxp(), _rcBuffer.Dyp()); _pgptWorking->Unlock(); return fRet; } #endif // DEBUG ================================================ FILE: bren/inc/actor.h ================================================ /* * Copyright (c) 1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: actor.h 1.14 1995/05/25 13:37:23 sam Exp $ * $Locker: $ * * Definitons for an Actor */ #ifndef _ACTOR_H_ #define _ACTOR_H_ #ifdef __cplusplus extern "C" { #endif /** ** Definition of base actor structure **/ /* * Basic types of actor */ enum { BR_ACTOR_NONE, BR_ACTOR_MODEL, BR_ACTOR_LIGHT, BR_ACTOR_CAMERA, _BR_ACTOR_RESERVED, BR_ACTOR_BOUNDS, BR_ACTOR_BOUNDS_CORRECT, BR_ACTOR_CLIP_PLANE, BR_ACTOR_MAX }; /* * Render styles - an actor inherits it's style from the most _distant_ * ancestor included in this traversal that does not have default set * (unlike model & material which are inherited from the nearest ancestor) */ enum { BR_RSTYLE_DEFAULT, BR_RSTYLE_NONE, BR_RSTYLE_POINTS, BR_RSTYLE_EDGES, BR_RSTYLE_FACES, BR_RSTYLE_BOUNDING_POINTS, BR_RSTYLE_BOUNDING_EDGES, BR_RSTYLE_BOUNDING_FACES, BR_RSTYLE_MAX }; /* * The actor structure */ typedef struct br_actor { /* * Doubly linked list of siblings * br_actor can be used as br_simple_node */ struct br_actor *next; struct br_actor **prev; /* * First in list of children, or NULL if none * br_actor.children can be used as br_simple_list */ struct br_actor *children; /* * Parent, or NULL, if no higher parent */ struct br_actor *parent; /* * Depth of actor from furthest ancestor */ br_uint_16 depth; /* * Type of actor */ br_uint_8 type; /* * Optional name of actor */ char *identifier; /* * Reference to model associated with this actor, NULL will inherit * from parent (root inherits default_model) */ br_model *model; /* * Default material for model - NULL will inherit from parent. Root * inherits default material */ br_material *material; /* * Render style for actor, and all it's decendants if not BR_RSTYLE_DEFAULT */ br_uint_8 render_style; /* * Postiton of this actor within parent space */ br_transform t; /* * Reference to any type specific data block */ void *type_data; } br_actor; #ifdef __cplusplus }; #endif #endif ================================================ FILE: bren/inc/angles.h ================================================ /* * Copyright (c) 1992,1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: angles.h 1.9 1995/05/25 13:37:24 sam Exp $ * $Locker: $ * */ #ifndef _ANGLES_H_ #define _ANGLES_H_ #ifdef __cplusplus extern "C" { #endif /* * Angles are alway 0.16 fixed point */ typedef br_fixed_luf br_angle; #define BR_ANGLE_DEG(deg) ((br_angle)((deg)*182)) #define BR_ANGLE_RAD(rad) ((br_angle)((rad)*10430)) #if BASED_FIXED #define BrAngleToDegree(a) BR_MUL((a), BR_SCALAR(360.0)) #define BrDegreeToAngle(d) ((br_angle)BR_MULDIV((d), BR_SCALAR(1.0), BR_SCALAR(360.0))) #define BrAngleToRadian(a) BR_MUL((a), BR_SCALAR(2.0 * PI)) #define BrRadianToAngle(r) ((br_angle)(BR_MUL((r), BR_SCALAR(0.5 / PI)))) #define BrDegreeToRadian(d) (BR_MULDIV((d), BR_SCALAR(PI), BR_SCALAR(180.0))) #define BrRadianToDegree(r) (BR_MUL((r), BR_SCALAR(180.0 / PI))) #define BrAngleToScalar(a) ((br_scalar)(a)) #define BrScalarToAngle(s) ((br_angle)(s)) #define BR_SIN(a) BrFixedSin(a) #define BR_COS(a) BrFixedCos(a) #define BR_ASIN(a) BrFixedASin(a) #define BR_ACOS(a) BrFixedACos(a) #define BR_ATAN2(a, b) BrFixedATan2(a, b) #define BR_ATAN2FAST(a, b) BrFixedATan2Fast(a, b) #endif #if BASED_FLOAT #define BrAngleToDegree(a) ((a) * (180.0 / 32768.0)) #define BrDegreeToAngle(d) ((br_angle)((d) * (32768.0 / 180.0))) #define BrAngleToRadian(a) ((a) * (PI / 32768.0)) #define BrRadianToAngle(r) ((br_angle)((r) * (32768.0 / PI))) #define BrDegreeToRadian(d) ((d) * (PI / 180.0)) #define BrRadianToDegree(r) ((r) * (180.0 / PI)) #define BrAngleToScalar(a) ((a) * (1.0 / (float)BR_ONE_LS)) #define BrScalarToAngle(s) ((br_angle)((s) * (float)BR_ONE_LS)) #define BR_SIN(a) sin(BrAngleToRadian(a)) #define BR_COS(a) cos(BrAngleToRadian(a)) #define BR_ASIN(a) BrRadianToAngle(asin(a)) #define BR_ACOS(a) BrRadianToAngle(acos(a)) #define BR_ATAN2(a, b) BrRadianToAngle(atan2((a), (b))) #define BR_ATAN2FAST(a, b) RBradianToAngle(atan2((a), (b))) #endif /* * Fields that go into br_euler.order */ enum { BR_EULER_FIRST = 0x03, BR_EULER_FIRST_X = 0x00, BR_EULER_FIRST_Y = 0x01, BR_EULER_FIRST_Z = 0x02, BR_EULER_PARITY = 0x04, BR_EULER_PARITY_EVEN = 0x00, BR_EULER_PARITY_ODD = 0x04, BR_EULER_REPEAT = 0x08, BR_EULER_REPEAT_NO = 0x00, BR_EULER_REPEAT_YES = 0x08, BR_EULER_FRAME = 0x10, BR_EULER_FRAME_STATIC = 0x00, BR_EULER_FRAME_ROTATING = 0x10 }; /* * Various possible orders */ #define BR_EULER_ORDER(a, p, r, f) (BR_EULER_FIRST_##a | BR_EULER_PARITY_##p | BR_EULER_REPEAT_##r | BR_EULER_FRAME_##f) enum { BR_EULER_XYZ_S = BR_EULER_ORDER(X, EVEN, NO, STATIC), BR_EULER_XYX_S = BR_EULER_ORDER(X, EVEN, YES, STATIC), BR_EULER_XZY_S = BR_EULER_ORDER(X, ODD, NO, STATIC), BR_EULER_XZX_S = BR_EULER_ORDER(X, ODD, YES, STATIC), BR_EULER_YZX_S = BR_EULER_ORDER(Y, EVEN, NO, STATIC), BR_EULER_YZY_S = BR_EULER_ORDER(Y, EVEN, YES, STATIC), BR_EULER_YXZ_S = BR_EULER_ORDER(Y, ODD, NO, STATIC), BR_EULER_YXY_S = BR_EULER_ORDER(Y, ODD, YES, STATIC), BR_EULER_ZXY_S = BR_EULER_ORDER(Z, EVEN, NO, STATIC), BR_EULER_ZXZ_S = BR_EULER_ORDER(Z, EVEN, YES, STATIC), BR_EULER_ZYX_S = BR_EULER_ORDER(Z, ODD, NO, STATIC), BR_EULER_ZYZ_S = BR_EULER_ORDER(Z, ODD, YES, STATIC), BR_EULER_ZYX_R = BR_EULER_ORDER(X, EVEN, NO, ROTATING), BR_EULER_XYX_R = BR_EULER_ORDER(X, EVEN, YES, ROTATING), BR_EULER_YZX_R = BR_EULER_ORDER(X, ODD, NO, ROTATING), BR_EULER_XZX_R = BR_EULER_ORDER(X, ODD, YES, ROTATING), BR_EULER_XZY_R = BR_EULER_ORDER(Y, EVEN, NO, ROTATING), BR_EULER_YZY_R = BR_EULER_ORDER(Y, EVEN, YES, ROTATING), BR_EULER_ZXY_R = BR_EULER_ORDER(Y, ODD, NO, ROTATING), BR_EULER_YXY_R = BR_EULER_ORDER(Y, ODD, YES, ROTATING), BR_EULER_YXZ_R = BR_EULER_ORDER(Z, EVEN, NO, ROTATING), BR_EULER_ZXZ_R = BR_EULER_ORDER(Z, EVEN, YES, ROTATING), BR_EULER_XYZ_R = BR_EULER_ORDER(Z, ODD, NO, ROTATING), BR_EULER_ZYZ_R = BR_EULER_ORDER(Z, ODD, YES, ROTATING) }; /* * A triple of euler angles and a description of how they are to * be applied - loosely based on - * "Euler Angle Convertion" Ken Shoemake, Graphics Gems IV pp. 222 */ typedef struct br_euler { br_angle a; br_angle b; br_angle c; br_uint_8 order; } br_euler; #ifdef __cplusplus }; #endif #endif ================================================ FILE: bren/inc/animate.h ================================================ /* * Copyright (c) 1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: animate.h 1.3 1995/02/22 21:36:55 sam Exp $ * $Locker: $ * * Definitons for a p3d Animate */ #ifndef _ANIMATE_H_ #define _ANIMATE_H_ #ifdef __cplusplus extern "C" { #endif typedef struct br_animation { br_matrix4 matrix; } br_animation; #ifdef __cplusplus }; #endif #endif ================================================ FILE: bren/inc/blockops.h ================================================ /* * Copyright (c) 1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: blockops.h 1.6 1995/02/22 21:36:56 sam Exp $ * $Locker: $ * * Memory operations, block fill, block copy etc. Thse are local to the * library becuase some compiler's versions are not that good. */ #if defined(__WATCOMC__) /* * Inline block operations for Watcom C */ void BrIBlockFill(void *dest_ptr, int value, int dwords); #pragma aux BrIBlockFill = "rep stosd" parm[edi][eax][ecx]; void BrIBlockCopy(void *dest_ptr, void *src_ptr, int dwords); #pragma aux BrIBlockCopy = "rep movsd" parm[edi][esi][ecx]; /* Inline copy near block to far block */ void BrIFarBlockCopy(void __far *dest_ptr, void *src_ptr, int dwords); #pragma aux BrIFarBlockCopy = "push es" \ "mov es,dx" \ "rep movsd" \ "pop es" parm[dx edi][esi][ecx]; #define BrBlockFill(d, v, c) BrIBlockFill(d, v, c) #define BrBlockCopy(d, s, c) BrIBlockCopy(d, s, c) #define BrFarBlockCopy(d, s, c) BrIFarBlockCopy(d, s, c) #endif ================================================ FILE: bren/inc/brassert.h ================================================ /* * Copyright (c) 1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: brassert.h 1.3 1995/02/22 21:36:57 sam Exp $ * $Locker: $ * * Assertion macros * * ASSERT() is for internal checks * UASSERT() is for user checks */ /* * This file should _NOT_ have checks for single inclusion - * it is legitimate to re-include it with DEBUG or PARANOID set diffently */ #undef ASSERT #if DEBUG #define ASSERT(e) ((void)((e) || (_BrAssert(#e, __FILE__, __LINE__), 1))) #else #define ASSERT(ignore) ((void)0) #endif #undef UASSERT #if PARANOID #define UASSERT(e) ((void)((e) || (_BrUAssert(#e, __FILE__, __LINE__), 1))) #else #define UASSERT(ignore) ((void)0) #endif ================================================ FILE: bren/inc/brdiag.h ================================================ /* * Copyright (c) 1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: brdiag.h 1.1 1995/07/28 18:57:13 sam Exp $ * $Locker: $ * * Brender's interface to diagnostic handling */ #ifndef _BRDIAG_H_ #define _BRDIAG_H_ #ifdef __cplusplus extern "C" { #endif /* * Instance of an error handler */ typedef void BR_CALLBACK br_diag_warning_cbfn(char *message); typedef void BR_CALLBACK br_diag_failure_cbfn(char *message); typedef struct br_diaghandler { char *identifier; br_diag_warning_cbfn *warning; br_diag_failure_cbfn *failure; } br_diaghandler; /* * For backwards compatibility */ typedef struct br_errorhandler { char *identifier; br_diag_warning_cbfn *message; br_diag_failure_cbfn *error; } br_errorhandler; /** ** Macros for diagnostic generation **/ /* * Report message and exit - should not return to application */ #define BR_FAILURE(s) BrFailure(s) #define BR_FAILURE0(s) BrFailure(s) #define BR_FAILURE1(s, a) BrFailure(s, a) #define BR_FAILURE2(s, a, b) BrFail(s, a, b) #define BR_FAILURE3(s, a, b, c) BrFailure(s, a, b, c) #define BR_FAILURE4(s, a, b, c, d) BrFailure(s, a, b, c, d) #define BR_FAILURE5(s, a, b, c, d, e) BrFailure(s, a, b, c, d, e) #define BR_FAILURE6(s, a, b, c, d, e, f) BrFailure(s, a, b, c, d, e, f) /* * Report message and continue */ #define BR_WARNING(s) BrWarning(s) #define BR_WARNING0(s) BrWarning(s) #define BR_WARNING1(s, a) BrWarning(s, a) #define BR_WARNING2(s, a, b) BrWarning(s, a, b) #define BR_WARNING3(s, a, b, c) BrWarning(s, a, b, c) #define BR_WARNING4(s, a, b, c, d) BrWarning(s, a, b, c, d) #define BR_WARNING5(s, a, b, c, d, e) BrWarning(s, a, b, c, d, e) #define BR_WARNING6(s, a, b, c, d, e, f) BrWarning(s, a, b, c, d, e, f) /* * Report message and exit, including source file and line number */ #define BR_FATAL(s) BrFatal(__FILE__, __LINE__, s) #define BR_FATAL0(s) BrFatal(__FILE__, __LINE__, s) #define BR_FATAL1(s, a) BrFatal(__FILE__, __LINE__, s, a) #define BR_FATAL2(s, a, b) BrFatal(__FILE__, __LINE__, s, a, b) #define BR_FATAL3(s, a, b, c) BrFatal(__FILE__, __LINE__, s, a, b, c) #define BR_FATAL4(s, a, b, c, d) BrFatal(__FILE__, __LINE__, s, a, b, c, d) #define BR_FATAL5(s, a, b, c, d, e) BrFatal(__FILE__, __LINE__, s, a, b, c, d, e) #define BR_FATAL6(s, a, b, c, d, e, f) BrFatal(__FILE__, __LINE__, s, a, b, c, d, e, f) /* * Backwards compatibility */ #define BR_ERROR(s) BrFailure(s) #define BR_ERROR0(s) BrFailure(s) #define BR_ERROR1(s, a) BrFailure(s, a) #define BR_ERROR2(s, a, b) BrFailure(s, a, b) #define BR_ERROR3(s, a, b, c) BrFailure(s, a, b, c) #define BR_ERROR4(s, a, b, c, d) BrFailure(s, a, b, c, d) #define BR_ERROR5(s, a, b, c, d, e) BrFailure(s, a, b, c, d, e) #define BR_ERROR6(s, a, b, c, d, e, f) BrFailure(s, a, b, c, d, e, f) #ifdef __cplusplus }; #endif #endif ================================================ FILE: bren/inc/bren.h ================================================ /*************************************************************************** bren.h: Main include file for BRender files Primary Author: ****** Review Status: REVIEWED - any changes to this file must be reviewed! ***************************************************************************/ #ifndef BREN_H #define BREN_H #include "kidframe.h" #include "brender.h" typedef br_actor BACT; typedef br_model BMDL; typedef br_light BLIT; typedef br_camera BCAM; typedef br_material BMTL; typedef br_pixelmap BPMP; typedef br_matrix34 BMAT34; typedef br_bounds BRB; typedef br_vertex BRV; typedef br_face BRFC; typedef br_face BRF; typedef br_colour BRCLR; typedef br_transform BRXFM; typedef br_euler BREUL; typedef br_matrix4 BMAT4; typedef br_matrix23 BMAT23; typedef BACT *PBACT; typedef BMDL *PBMDL; typedef BLIT *PBLIT; typedef BCAM *PBCAM; typedef BMTL *PBMTL; typedef BPMP *PBPMP; typedef BMAT34 *PBMAT34; typedef BMAT4 *PBMAT4; typedef BMAT23 *PBMAT23; typedef br_scalar BRS; typedef br_angle BRA; typedef br_fraction BRFR; typedef br_ufraction BRUFR; typedef br_vector3 BVEC3; typedef br_vector4 BVEC4; #define BrsMac2 BR_MAC2 #define BrsSub BR_SUB #define BrsMul BR_MUL #define BrsAdd BR_ADD #define BrsAbs BR_ABS #define BrsRcp BR_RCP const BRS rZero = BR_SCALAR(0.0); const BRS rOne = BR_SCALAR(1.0); const BRS rTwo = BR_SCALAR(2.0); const BRS rFour = BR_SCALAR(4.0); const BRS rOneHalf = BR_SCALAR(0.5); const BRS rEps = BR_SCALAR_EPSILON; const BRS rDivMin = 0x03; // Smallest br_scalar for which BrsRcp() does not overflow const BRS rFractMax = rOne - rEps; const BRS krQuarter = BR_SCALAR(0.25); const BRS krHalf = BR_SCALAR(0.5); const BRS krPi = BR_SCALAR(PI); const BRS krTwoPi = BR_SCALAR(2.0 * PI); const BRS krThreePi = BR_SCALAR(3.0 * PI); const BRS krHalfPi = BR_SCALAR(0.5 * PI); const BVEC3 vec3X = {rOne, rZero, rZero}; const BVEC3 vec3Y = {rZero, rOne, rZero}; const BVEC3 vec3Z = {rZero, rZero, rOne}; const BRFR frNil = BR_FRACTION(0.0); const BRA aNil = BR_ANGLE_DEG(0); const BRA aZero = BR_ANGLE_DEG(0); #define kctgZbmp 'ZBMP' struct BCB // bounding cuboid...same shape as br_bounds { BRS xrMin; BRS yrMin; BRS zrMin; BRS xrMax; BRS yrMax; BRS zrMax; }; const BOM kbomBcb = 0xfff00000; inline bool FBrEmptyBcb(BCB *pbcb) { return !(pbcb->xrMin || pbcb->yrMin || pbcb->zrMin || pbcb->xrMax || pbcb->yrMax || pbcb->zrMax); } const BOM kbomBrs = 0xc0000000; // br_scalar const BOM kbomBrv = 0xffd50000; // br_vertex const BOM kbomBrf = 0x555c15c0; // br_face const BOM kbomBmat34 = 0xffffff00; #if BASED_FIXED inline BRS BrsHalf(BRS r) { return r >> 1; } inline BRFR ScalarToFraction(BRS r) { return (br_fraction)((r >> 1) | ((r & 0x8000) >> 8)); } inline BRS BrsAbsMax3(BRS r1, BRS r2, BRS r3) { return (BRS)(LwMax(LwMax(LwAbs((long)r1), LwAbs((long)r2)), LwAbs((long)r3))); } inline BRS BrsDiv(BRS r1, BRS r2) // Safety net: Prevent ovfl on division of integers { if (r2 >= rOne || r2 < -rOne || LwAbs((long)r1) < LwAbs((long)r2)) return BR_DIV(r1, r2); // Most common case in SocRates (by far) if (LwAbs((long)r2) < rDivMin) return ((r1 > 0 == r2 > 0) ? BR_SCALAR_MAX : BR_SCALAR_MIN); BRS rRcp = BR_RCP(r2); ulong lwT = (((ulong)BR_ABS(r1)) >> 16) * (((ulong)BR_ABS(rRcp)) >> 16); if (lwT < 65536) return (BRS)BR_MUL(r1, rRcp); return ((r1 > 0 == r2 > 0) ? BR_SCALAR_MAX : BR_SCALAR_MIN); } #endif // BASED_FIXED // fixed.h additions // Round by adding half the desired rounding precision, and masking off the // remaining precision #define BR_ROUND(s, p) ((br_scalar)(BR_ADD((s), (0x01 << (p))) & ~((br_scalar)((0x01 << ((p) + 1)) - 1)))) // colour.h additions // Color conversion: straight RGB to RGB and RGB to grey #define BR_DK_TO_BR(dk) BR_COLOUR_RGB((byte)((dk).r * 256.0), (byte)((dk).g * 256.0), (byte)((dk).b * 256.0)) #define BR_DKRGB_TO_FRGRAY(dk) BrScalarToUFraction(BrFloatToScalar(((dk).r * 0.30 + (dk).g * 0.59 + (dk).b * 0.11))) // angles.h additions // REVIEW peted: temporary BR_ACOS until we get a fixed Brender #ifdef BR_ACOS #undef BR_ACOS #endif // BR_ACOS #define BR_ACOS(a) BrRadianToAngle(BrFloatToScalar(acos(BrScalarToFloat(a)))) #include "zbmp.h" #include "bwld.h" #include "tmap.h" #endif //! BREN_H ================================================ FILE: bren/inc/brender.h ================================================ /* * Copyright (c) 1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: brender.h 1.17 1995/03/01 16:08:11 sam Exp $ * $Locker: sam $ * * Master include file for BRender * */ #ifndef _BRENDER_H_ #define _BRENDER_H_ #ifdef __cplusplus extern "C" { #endif #ifndef _COMPILER_H_ #include "compiler.h" #endif #ifndef _BRLIMITS_H_ #include "brlimits.h" #endif #ifndef _FIXED_H_ #include "fixed.h" #endif #ifndef _SCALAR_H_ #include "scalar.h" #endif #ifndef _COLOUR_H_ #include "colour.h" #endif #ifndef _MATRIX_H_ #include "matrix.h" #endif #ifndef _VECTOR_H_ #include "vector.h" #endif #ifndef _ANGLES_H_ #include "angles.h" #endif #ifndef _QUAT_H_ #include "quat.h" #endif #ifndef _TRANSFRM_H_ #include "transfrm.h" #endif #ifndef _PIXELMAP_H_ #include "pixelmap.h" #endif #ifndef _BRFONT_H_ #include "brfont.h" #endif #ifndef _MATERIAL_H_ #include "material.h" #endif #ifndef _MODEL_H_ #include "model.h" #endif #ifndef _ACTOR_H_ #include "actor.h" #endif #ifndef _CAMERA_H_ #include "camera.h" #endif #ifndef _LIGHT_H_ #include "light.h" #endif #ifndef _POOL_H_ #include "pool.h" #endif #ifndef _CUSTSUPT_H_ #include "custsupt.h" #endif #ifndef _BRFILE_H_ #include "brfile.h" #endif #ifndef _BRMEM_H_ #include "brmem.h" #endif #ifndef _BRDIAG_H_ #include "brdiag.h" #endif #ifndef _BRERR_H_ #include "brerr.h" #endif #ifndef _FMT_H_ #include "fmt.h" #endif /* * Function prototypes */ #ifndef _FWPROTO_H_ #include "fwproto.h" #endif #ifndef _ZBPROTO_H_ #include "zbproto.h" #endif #ifndef _FWPEXTRA_H_ #include "fwpextra.h" #endif /* * Inline functions */ #ifndef _NO_PROTOTYPES #ifndef _NO_VECTOR_MACROS #ifndef _VECFNS_H_ #include "vecfns.h" #endif #endif #endif #ifdef __cplusplus }; #endif #endif ================================================ FILE: bren/inc/brerr.h ================================================ /* * Copyright (c) 1993-1995 Argonaut Technologies Limited. All rights reserved. * * $Id: fwiproto.h 1.27 1995/06/30 16:01:14 sam Exp $ * $Locker: sam $ * * Error type */ #ifndef _BRERR_H_ #define _BRERR_H_ #ifdef __cplusplus extern "C" { #endif /* * Error types are 32 bit integers, broken into three fields - * * Class Subclass Number * * 33222222 22221111 1111110000000000 * 10987654 32109876 5432109876543210 * * A value of zero is reserved to indiciate no error */ typedef br_uint_32 br_error; #ifdef __cplusplus }; #endif #endif ================================================ FILE: bren/inc/brfile.h ================================================ /* * Copyright (c) 1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: brfile.h 1.7 1995/02/22 21:36:59 sam Exp $ * $Locker: $ * * Brender's interface to file IO */ #ifndef _BRFILE_H_ #define _BRFILE_H_ #ifdef __cplusplus extern "C" { #endif typedef int BR_CALLBACK br_mode_test_cbfn(br_uint_8 *magics, br_size_t n_magics); /* * Interface to filesystem */ typedef br_uint_32 BR_CALLBACK brfile_attributes_cbfn(void); typedef void *BR_CALLBACK brfile_open_read_cbfn(char *name, br_size_t n_magics, br_mode_test_cbfn *mode_test, int *mode_result); typedef void *BR_CALLBACK brfile_open_write_cbfn(char *name, int text); typedef void BR_CALLBACK brfile_close_cbfn(void *f); typedef int BR_CALLBACK brfile_eof_cbfn(void *f); typedef int BR_CALLBACK brfile_getchr_cbfn(void *f); typedef void BR_CALLBACK brfile_putchr_cbfn(int c, void *f); typedef br_size_t BR_CALLBACK brfile_read_cbfn(void *buf, br_size_t size, unsigned int nelems, void *f); typedef br_size_t BR_CALLBACK brfile_write_cbfn(void *buf, br_size_t size, unsigned int nelems, void *f); typedef br_size_t BR_CALLBACK brfile_getline_cbfn(char *buf, br_size_t buf_len, void *f); typedef void BR_CALLBACK brfile_putline_cbfn(char *buf, void *f); typedef void BR_CALLBACK brfile_advance_cbfn(br_size_t count, void *f); typedef struct br_filesystem { char *identifier; /* * Inquire about attributes of file system */ brfile_attributes_cbfn *attributes; /* * Locate and open a file, and then grab 'n_magics' bytes * from the front of the file and pass them to a an 'identify' * function that returns the mode of the file * * Returns file handle, or NULL if open failed * * Stores open mode through mode_result if not NULL */ brfile_open_read_cbfn *open_read; /* * Open a file for writing, possibly with text translation * * Returns fil handle, or NULL if open failed */ brfile_open_write_cbfn *open_write; /* * Close an opened file */ brfile_close_cbfn *close; /* * Find out if at end of file */ brfile_eof_cbfn *eof; /* * Read and write single characters */ brfile_getchr_cbfn *getchr; brfile_putchr_cbfn *putchr; /* * Read and write blocks */ brfile_read_cbfn *read; brfile_write_cbfn *write; /* * Read and write lines of text, excluding any line terminators * Will only be used if text translation is in use */ brfile_getline_cbfn *getline; brfile_putline_cbfn *putline; /* * Advance bytes through stream * * Will not be invoked if text translation is in use */ brfile_advance_cbfn *advance; } br_filesystem; /* * Bitmask returned by fs->attributes */ enum br_filesystem_attributes { BR_FS_ATTR_READABLE = 0x0001, BR_FS_ATTR_WRITEABLE = 0x0002, BR_FS_ATTR_HAS_TEXT = 0x0004, BR_FS_ATTR_HAS_BINARY = 0x0008, BR_FS_ATTR_HAS_ADVANCE = 0x0010 }; /* * Possible values returner by open_read identify callback */ enum br_filesystem_identify { BR_FS_MODE_BINARY, BR_FS_MODE_TEXT, BR_FS_MODE_UNKNOWN }; /* * Maximum number of magic bytes that can be requested on open_read */ #define BR_MAX_FILE_MAGICS 16 /* * Returned by filesys->getchr at end of file */ #define BR_EOF (-1) #ifdef __cplusplus }; #endif #endif ================================================ FILE: bren/inc/brfont.h ================================================ /* * Copyright (c) 1992,1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: brfont.h 1.4 1995/03/29 16:42:55 sam Exp $ * $Locker: $ * */ #ifndef _BRFONT_H_ #define _BRFONT_H_ #ifdef __cplusplus extern "C" { #endif typedef struct br_font { br_uint_32 flags; br_uint_16 glyph_x; br_uint_16 glyph_y; br_int_16 spacing_x; br_int_16 spacing_y; br_int_8 *width; br_uint_16 *encoding; br_uint_8 *glyphs; } br_font; /* * Flags */ #define BR_FONTF_PROPORTIONAL 1 /* * Default fonts that are available in framework */ extern struct br_font *BrFontFixed3x5; extern struct br_font *BrFontProp4x6; extern struct br_font *BrFontProp7x9; #ifdef __cplusplus }; #endif #endif ================================================ FILE: bren/inc/brhton.h ================================================ /* * Copyright (c) 1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: brhton.h 1.7 1995/05/25 13:37:25 sam Exp $ * $Locker: $ * * Converting 'network' (big endian) byte order to host order * * This is a private implemenation - some platforms do not provide * this functionality. For those that do, this file should define * the operations in terms of the platform specific API */ #ifndef _BRHTON_H_ #define _BRHTON_H_ #ifdef __cplusplus extern "C" { #endif /* * Mac is in network order already - little endian * * XXX SANE format */ #if defined(__MPW__) || defined(__THINKC__) typedef float br_float; #define BrHtoNL(x) (x) #define BrNtoHL(x) (x) #define BrHtoNS(x) (x) #define BrNtoHS(x) (x) #define BrHtoNF(x) (x) #define BrNtoHF(x) (x) #define BR_ENDIAN_BIG 1 #define BR_ENDIAN_LITTLE 0 #endif /* * PC is little-endian */ #if defined(__GNUC__) || defined(__WATCOMC__) || defined(__ZTC__) || defined(__PROTONC__) || defined(__HIGHC__) || \ defined(__BORLANDC__) || defined(__IBMC__) || defined(_MSC_VER) #define BrNtoHL(x) BrSwap32(x) #define BrHtoNL(x) BrSwap32(x) #define BrNtoHS(x) BrSwap16(x) #define BrHtoNS(x) BrSwap16(x) #define BrHtoNF(x) BrSwapFloat(x) #define BrNtoHF(x) BrSwapFloat(x) #define BR_ENDIAN_BIG 0 #define BR_ENDIAN_LITTLE 1 #endif #ifdef __cplusplus }; #endif #endif ================================================ FILE: bren/inc/brlimits.h ================================================ /* * Copyright (c) 1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: brlimits.h 1.5 1995/02/22 21:37:01 sam Exp $ * $Locker: $ * * Various limits imposed by the renderer */ #ifndef _BRLIMITS_H_ #define _BRLIMITS_H_ #ifdef __cplusplus extern "C" { #endif /* * Maximum length of an item's name */ #define BR_MAX_NAME 256 /* * Maximum number of active lights */ #define BR_MAX_LIGHTS 16 /* * Maximum number of active clip planes */ #define BR_MAX_CLIP_PLANES 6 /* * Maximum number of resource classes */ #define BR_MAX_RESOURCE_CLASSES 256 /* * Maximum depth of camera in hierachy */ #define MAX_CAMERA_DEPTH 16 #ifdef __cplusplus }; #endif #endif ================================================ FILE: bren/inc/brmem.h ================================================ /* * Copyright (c) 1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: brmem.h 1.13 1995/05/25 13:37:26 sam Exp $ * $Locker: sam $ * * Brender's interface to memory allocation */ #ifndef _BRMEM_H_ #define _BRMEM_H_ #ifdef __cplusplus extern "C" { #endif /* * Instance of a memory allocator */ typedef void *BR_CALLBACK brmem_allocate_cbfn(br_size_t size, br_uint_8 type); typedef void BR_CALLBACK brmem_free_cbfn(void *block); typedef br_size_t BR_CALLBACK brmem_inquire_cbfn(br_uint_8 type); typedef struct br_allocator { char *identifier; /* * Allocate a new chunk of memory - must return the new pointer * or handle the error itself */ brmem_allocate_cbfn *allocate; /* * Release previously allocated block */ brmem_free_cbfn *free; /* * Inquire as to the amount of memeory available for a given type */ brmem_inquire_cbfn *inquire; } br_allocator; /* * Classes of resource that brender allocates * * Valid values are 1 to 255 */ enum br_memory_classes { /* * System classes */ BR_MEMORY_SCRATCH = 1, BR_MEMORY_PIXELMAP, BR_MEMORY_PIXELS, BR_MEMORY_VERTICES, BR_MEMORY_FACES, BR_MEMORY_GROUPS, BR_MEMORY_MODEL, BR_MEMORY_MATERIAL, BR_MEMORY_MATERIAL_INDEX, BR_MEMORY_ACTOR, BR_MEMORY_PREPARED_VERTICES, BR_MEMORY_PREPARED_FACES, BR_MEMORY_LIGHT, BR_MEMORY_CAMERA, BR_MEMORY_BOUNDS, BR_MEMORY_CLIP_PLANE, BR_MEMORY_STRING, BR_MEMORY_REGISTRY, BR_MEMORY_TRANSFORM, BR_MEMORY_RESOURCE_CLASS, BR_MEMORY_FILE, BR_MEMORY_ANCHOR, BR_MEMORY_POOL, BR_MEMORY_RENDER_MATERIAL, BR_MEMORY_DATAFILE, BR_MEMORY_IMAGE, BR_MEMORY_IMAGE_ARENA, BR_MEMORY_IMAGE_SECTIONS, BR_MEMORY_IMAGE_NAMES, BR_MEMORY_EXCEPTION_HANDLER, /* * Application classes */ BR_MEMORY_APPLICATION = 0x80, /* * User defined classed are BR_MEMORY_APPLICATION + 1 ... 127 */ BR_MEMORY_MAX = 256 }; /* * A resource class structure */ typedef void BR_CALLBACK br_resourcefree_cbfn(void *res, br_uint_8 res_class, br_size_t size); typedef struct br_resource_class { char *identifier; br_uint_8 res_class; br_resourcefree_cbfn *free_cb; } br_resource_class; #ifdef __cplusplus }; #endif #endif ================================================ FILE: bren/inc/bwld.h ================================================ /*************************************************************************** bwld.h: BRender world class Primary Author: ****** Review Status: REVIEWED - any changes to this file must be reviewed! BASE ---> BWLD ***************************************************************************/ #ifndef BWLD_H #define BWLD_H // Callback function per BACT when it's rendered, passing the 2D bounds typedef void FNBACTREND(PBACT pbact, RC *prc); typedef FNBACTREND *PFNBACTREND; // Callback function per root BACT when we begin rendering typedef void FNBEGINREND(PBACT pbact); typedef FNBEGINREND *PFNBEGINREND; // Callback function per root BACT to get the rendered rectangle typedef void FNGETRECT(PBACT pbact, RC *prc); typedef FNGETRECT *PFNGETRECT; /**************************************** The BRender world class ****************************************/ typedef class BWLD *PBWLD; #define BWLD_PAR BASE #define kclsBWLD 'BWLD' class BWLD : public BWLD_PAR { RTCLASS_DEC ASSERT MARKMEM protected: static bool _fBRenderInited; // Whether BrBegin() has been called RC _rcBuffer; // Bounds of the rendering space RC _rcView; // Bounds of view BACT _bactWorld; // The world root actor BACT _bactCamera; // The camera actor BCAM _bcam; // The camera data PGPT _pgptBackground; // Background RGB bitmap PGPT _pgptWorking; // RGB working buffer to render into PGPT _pgptStretch; // Stretched working buffer (if _fhalfY) BPMP _bpmpRGB; // BRender wrapper around _pgptWorking PZBMP _pzbmpBackground; // Background Z-buffer PZBMP _pzbmpWorking; // Working Z-buffer to render into BPMP _bpmpZ; // BRender wrapper around _pzbmpWorking PREGN _pregnDirtyWorking; // Rgn to copy from bkgd to working buffer PREGN _pregnDirtyScreen; // Rgn to copy from working buffer to screen bool _fHalfX; // Render at half horizontal resolution bool _fHalfY; // Render at half vertical resolution bool _fWorldChanged; // Need to rerender? PFNBEGINREND _pfnbeginrend; // Callback to each actor before rendering PFNBACTREND _pfnbactrend; // Callback when an actor is rendered PFNGETRECT _pfngetrect; // Callback to get an actor's bounding rect PBACT _pbactClosestClicked; // The closest actor that has been clicked BRS _dzpClosestClicked; // Distance of the closest clicked actor // Keep reference to last background in case we switch to/from halfmode: PCRF _pcrf; CTG _ctgRGB; CNO _cnoRGB; CTG _ctgZ; CNO _cnoZ; protected: BWLD(void) { } bool _FInit(long dxp, long dyp, bool fHalfX, bool fHalfY); bool _FInitBuffers(long dxp, long dyp, bool fHalfX, bool fHalfY); void _CleanWorkingBuffers(void); static int BR_CALLBACK _FFilter(BACT *pbact, PBMDL pbmdl, PBMTL pbmtl, BVEC3 *pbvec3RayPos, BVEC3 *pbvec3RayDir, BRS dzpNear, BRS dzpFar, void *pbwld); static void BR_CALLBACK _ActorRendered(PBACT pbact, PBMDL pbmdl, PBMTL pbmtl, br_uint_8 bStyle, br_matrix4 *pbmat4ModelToScreen, br_int_32 bounds[4]); public: // Constructors and destructors static PBWLD PbwldNew(long dxp, long dyp, bool fHalfX = fFalse, bool fhalfY = fFalse); ~BWLD(); static void CloseBRender(void); // Dirtying the BRender world and bitmap void MarkDirty(void) { _fWorldChanged = fTrue; } void MarkRenderedRegn(PGOB pgob, long dxp, long dyp); // Background stuff bool FSetBackground(PCRF pcrf, CTG ctgRGB, CNO cnoRGB, CTG ctgZ, CNO cnoZ); void SetCamera(BMAT34 *pbmat34, BRS zrHither, BRS zrYon, BRA aFov); void GetCamera(BMAT34 *pbmat34, BRS *pzrHither = pvNil, BRS *pzrYon = pvNil, BRA *paFov = pvNil); // Actor stuff void AddActor(BACT *pbact); bool FClickedActor(long xp, long yp, BACT **ppbact); void IterateActorsInPt(br_pick2d_cbfn *pfnCallback, void *pvArg, long xp, long yp); void SetBeginRenderCallback(PFNBEGINREND pfnbeginrend) { _pfnbeginrend = pfnbeginrend; } void SetActorRenderedCallback(PFNBACTREND pfnbactrend) { _pfnbactrend = pfnbactrend; } void SetGetRcCallback(PFNGETRECT pfngetrect) { _pfngetrect = pfngetrect; } // Rendering stuff bool FSetHalfMode(bool fHalfX, bool fHalfY); bool FHalfX(void) { return _fHalfX; } bool FHalfY(void) { return _fHalfY; } void Render(void); void Prerender(void); void Unprerender(void); void Draw(PGNV pgnv, RC *prcClip, long dxp, long dyp); #ifdef DEBUG bool FWriteBmp(PFNI pfni); #endif // DEBUG }; #endif BWLD_H ================================================ FILE: bren/inc/camera.h ================================================ /* * Copyright (c) 1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: camera.h 1.4 1995/05/25 13:37:27 sam Exp $ * $Locker: $ * * Definitons for a camera */ #ifndef _CAMERA_H_ #define _CAMERA_H_ #ifdef __cplusplus extern "C" { #endif enum { BR_CAMERA_PARALLEL, BR_CAMERA_PERSPECTIVE_FOV, BR_CAMERA_PERSPECTIVE_WHD }; /* * Backwards compatibility */ #define BR_CAMERA_PERSPECTIVE BR_CAMERA_PERSPECTIVE_FOV typedef struct br_camera { /* * Optional identifier */ char *identifier; /* * Type of camera */ br_uint_8 type; /* * Field of view * (BR_CAMERA_PERSPECTIVE_FOV only) */ br_angle field_of_view; /* * Front and back of view volume in view coordinates */ br_scalar hither_z; br_scalar yon_z; /* * Aspect ratio of viewport * (BR_CAMERA_PERSPECTIVE_FOV only) */ br_scalar aspect; /* * Width and height of projection surface * (BR_CAMERA_PERSPECTIVE_WHD and BR_CAMERA_PARALLEL only) */ br_scalar width; br_scalar height; /* * Distance of projection plane from center of projection * (BR_CAMERA_PERSPECTIVE_WHD only) */ br_scalar distance; } br_camera; #ifdef __cplusplus }; #endif #endif ================================================ FILE: bren/inc/colour.h ================================================ /* * Copyright (c) 1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: colour.h 1.3 1995/02/22 21:37:03 sam Exp $ * $Locker: $ * * Colour type and macros * */ #ifndef _COLOUR_H_ #define _COLOUR_H_ #ifdef __cplusplus extern "C" { #endif typedef unsigned long int br_colour; #define BR_COLOUR_RGB(r, g, b) ((((unsigned int)(r)) << 16) | (((unsigned int)(g)) << 8) | ((unsigned int)(b))) #define BR_COLOUR_RGBA(r, g, b, a) \ ((((unsigned int)(a))<<24) |\ ((((unsigned int)(r))<<16) |\ (((unsigned int)(g))<<8) |\ ((unsigned int)(b))) #define BR_ALPHA(c) ((c >> 24) & 0xFF) #define BR_RED(c) ((c >> 16) & 0xFF) #define BR_GRN(c) ((c >> 8) & 0xFF) #define BR_BLU(c) ((c)&0xFF) #ifdef __cplusplus }; #endif #endif ================================================ FILE: bren/inc/compiler.h ================================================ /* * Copyright (c) 1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: compiler.h 1.20 1995/05/25 13:37:28 sam Exp $ * $Locker: sam $ * * Misc host compiler configuration (types & special declarators etc.) */ #ifndef _COMPILER_H_ #define _COMPILER_H_ #ifdef __cplusplus extern "C" { #endif /* * Fixed bitsize integers */ typedef signed long br_int_32; typedef unsigned long br_uint_32; typedef signed short br_int_16; typedef unsigned short br_uint_16; typedef signed char br_int_8; typedef unsigned char br_uint_8; /* * Generic size type (in case target environment does not have size_t) */ typedef unsigned int br_size_t; /* * Boolean type */ typedef int br_boolean; #define BR_TRUE 1 #define BR_FALSE 0 #define BR_BOOLEAN(a) ((a) != 0) /** ** Compiler specific declarations ** * * BR_PUBLIC_ENTRY are the declarators for public entry points into the library * * BR_CALLBACK are the declarators for function pointers to callbacks * * BR_ASM_DATA is the declarator for data that is shared with ASM files * * BR_ASM_CALL is the declarator for function declarations that are ASM functions * called from C * * BR_ASM_CALLBACK is the declarator for function definitions that are C functions * called from ASM * * BR_SUFFIX_HOST is a string used for banners/titles etc * * br_framebuffer_ptr is a type used for pointing at the pixels of a frame buffer * * BR_HAS_FAR is !0 if language supports __far pointers */ /* * WATCOM C/C++ 32 */ #if defined(__WATCOMC__) /* * Use the current default calling convention */ #if defined(__TARGET_MSC__) #define stricmp _stricmp #define strnicmp _strnicmp #define memccpy _memccpy #pragma aux __cdecl "_*" parm caller[] modify[eax ecx edx]; #define BR_PUBLIC_ENTRY __cdecl #define BR_CALLBACK __cdecl #else #define BR_PUBLIC_ENTRY #define BR_CALLBACK #endif #ifdef __cplusplus #define BR_ASM_DATA #define BR_ASM_DATA_EXTRA(x) #else #define BR_ASM_DATA __cdecl #endif #define BR_ASM_CALL __cdecl #define BR_ASM_CALLBACK __cdecl #define BR_SUFFIX_HOST "-WTC" #define BR_HAS_FAR 1 /* * Stop unreferenced variables producing a warning * Things like "rcsid" and unused fucntion arguments */ #pragma off(unreferenced); /* * Zortech C++ */ #elif defined(__ZTC__) #define BR_PUBLIC_ENTRY __cdecl #define BR_CALLBACK __cdecl #define BR_ASM_DATA __cdecl #define BR_ASM_CALL __cdecl #define BR_ASM_CALLBACK __cdecl #define BR_SUFFIX_HOST "-ZTC" #define BR_HAS_FAR 1 /* * GNU C */ #elif defined(__GNUC__) #define BR_PUBLIC_ENTRY #define BR_CALLBACK #define BR_ASM_DATA #define BR_ASM_CALL #define BR_ASM_CALLBACK #define BR_SUFFIX_HOST "-GCC" #define BR_HAS_FAR 0 /* * Apple MPW C */ #elif defined(__MPW__) #define BR_PUBLIC_ENTRY #define BR_CALLBACK #define BR_ASM_DATA #define BR_ASM_CALL #define BR_ASM_CALLBACK #define BR_SUFFIX_HOST "-MPW" #define BR_HAS_FAR 0 /* * Intel Proton */ #elif defined(__PROTONC__) #define BR_PUBLIC_ENTRY __cdecl #define BR_CALLBACK __cdecl #define BR_ASM_DATA __cdecl #define BR_ASM_CALL __cdecl #define BR_ASM_CALLBACK __cdecl #define BR_SUFFIX_HOST "-PROTON" #define BR_HAS_FAR 1 /* * Microsoft Visual C++ */ #elif defined(_MSC_VER) #define BR_PUBLIC_ENTRY __cdecl #define BR_CALLBACK __cdecl #define BR_ASM_DATA __cdecl #define BR_ASM_CALL __cdecl #define BR_ASM_CALLBACK __cdecl #define BR_SUFFIX_HOST "-VISUALC" #define BR_HAS_FAR 0 /* * Metaware High-C Version 1 */ #elif defined(__HIGHC_V1__) #pragma On(Align_members) #define BR_PUBLIC_ENTRY #define BR_CALLBACK #define BR_ASM_DATA #define BR_ASM_CALL #define BR_ASM_CALLBACK #define BR_SUFFIX_HOST "-HIGHC1" #define BR_HAS_FAR 0 #define stricmp _stricmp /* * Metaware High-C Version 3 */ #elif defined(__HIGHC__) #pragma Align_members(4) #define BR_PUBLIC_ENTRY #define BR_CALLBACK #define BR_ASM_DATA #define BR_ASM_CALL #define BR_ASM_CALLBACK #define BR_SUFFIX_HOST "-HIGHC3" #define BR_HAS_FAR 0 #define stricmp _stricmp /* * Borland BC 4 */ #elif defined(__BORLANDC__) #define BR_PUBLIC_ENTRY #define BR_CALLBACK #define BR_ASM_DATA __cdecl #define BR_ASM_CALL __cdecl #define BR_ASM_CALLBACK __cdecl #define BR_SUFFIX_HOST "-BORLAND" #define BR_HAS_FAR 0 /* * IBM CSet++ */ #elif defined(__IBMC__) #define BR_PUBLIC_ENTRY _System #define BR_CALLBACK _System #define BR_ASM_DATA #define BR_ASM_CALL _System #define BR_ASM_CALLBACK _System #define BR_SUFFIX_HOST "-CSET" #define BR_HAS_FAR 0 #endif #if defined(__H2INC__) /* * Avoid some tokens that masm chokes on */ #define type _type #define a _a #define b _b #define c _c #define width _width #define end _end /* * Supress compiler specific declarators */ #undef BR_CALLBACK #undef BR_ASM_DATA #undef BR_ASM_CALL #undef BR_ASM_CALLBACK #define BR_CALLBACK #define BR_ASM_DATA #define BR_ASM_CALL #define BR_ASM_CALLBACK #endif #if DEBUG #define BR_SUFFIX_DEBUG "-DEBUG" #else #define BR_SUFFIX_DEBUG "" #endif /* * Macros for producing banners & copyright messages */ #define BR_BANNER(title, year, revision) \ do \ { \ static char _revision[] = revision; \ fprintf(stderr, title); \ fwrite(_revision + 10, 1, sizeof(_revision) - 12, stderr); \ fprintf(stderr, "Copyright (C) " year " by Argonaut Technologies Limited\n"); \ } while (0); /* * Useful macro for sizing an array */ #define BR_ASIZE(a) (sizeof(a) / sizeof((a)[0])) #ifdef __cplusplus }; #endif #endif ================================================ FILE: bren/inc/custsupt.h ================================================ /* * Copyright (c) 1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: custsupt.h 1.2 1995/02/22 21:37:05 sam Exp $ * $Locker: $ * * Definitions for support routines available during render callbacks * */ #ifndef _CUSTSUPT_H_ #define _CUSTSUPT_H_ #ifdef __cplusplus extern "C" { #endif /* * Outcode bits */ #define OUTCODE_LEFT 0x00000001 #define OUTCODE_RIGHT 0x00000002 #define OUTCODE_TOP 0x00000004 #define OUTCODE_BOTTOM 0x00000008 #define OUTCODE_HITHER 0x00000010 #define OUTCODE_YON 0x00000020 #define OUTCODE_USER 0x00000040 #define OUTCODE_USER_ALL 0x00000FC0 #define OUTCODES_ALL 0x00000FFF #define OUTCODE_N_LEFT 0x00010000 #define OUTCODE_N_RIGHT 0x00020000 #define OUTCODE_N_TOP 0x00040000 #define OUTCODE_N_BOTTOM 0x00080000 #define OUTCODE_N_HITHER 0x00100000 #define OUTCODE_N_YON 0x00200000 #define OUTCODE_N_USER 0x00400000 #define OUTCODE_N_USER_ALL 0x0FC00000 #define OUTCODES_NOT 0x0FFF0000 /* * Values for on screen test */ enum { OSC_REJECT, OSC_PARTIAL, OSC_ACCEPT }; #ifdef __cplusplus }; #endif #endif ================================================ FILE: bren/inc/fixed.h ================================================ /* * Copyright (c) 1992,1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: fixed.h 1.17 1995/02/22 21:37:06 sam Exp $ * $Locker: $ */ #ifndef _FIXED_H_ #define _FIXED_H_ #ifdef __cplusplus extern "C" { #endif #ifndef INLINE_FIXED #define INLINE_FIXED 1 #endif /* * Fixed point types */ typedef long br_fixed_ls; /* Long Signed fixed 15.16 */ typedef short br_fixed_lsf; /* Long Signed fraction 0.15 */ typedef unsigned long br_fixed_lu; /* Long unsigned fixed 16.16 */ typedef unsigned short br_fixed_luf; /* Long unsigned fixed fraction 0.16 */ typedef short br_fixed_ss; /* Short Signed fixed 7.8 */ typedef char br_fixed_ssf; /* Short Signed fraction 0.7 */ typedef unsigned short br_fixed_su; /* Short unsigned fixed 8.8 */ typedef unsigned char br_fixed_suf; /* Short unsigned fixed fraction 0.8 */ /* * 1 in various fixed point forms */ #define BR_ONE_LS (1 << 16) #define BR_ONE_LSF (1 << 15) #define BR_ONE_LU (1 << 16) #define BR_ONE_LUF (1 << 16) #define BR_ONE_SS (1 << 8) #define BR_ONE_SSF (1 << 7) #define BR_ONE_SU (1 << 8) #define BR_ONE_SUF (1 << 8) #define BrIntToFixed(i) ((i) << 16) #define BrFixedToInt(i) ((i) >> 16) #define BrFloatToFixed(f) ((br_scalar)((f) * (float)BR_ONE_LS)) #define BrFixedToFloat(s) ((s) * (1.0 / (float)BR_ONE_LS)) #ifdef __cplusplus }; #endif #endif ================================================ FILE: bren/inc/fmt.h ================================================ /* * Copyright (c) 1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: fmt.h 1.5 1995/02/22 21:37:06 sam Exp $ * $Locker: $ * * Definitions for foreign file format support */ #ifndef _FMT_H_ #define _FMT_H_ #ifdef __cplusplus extern "C" { #endif /* * Type of things to load from file */ enum { BR_FMT_MODELS = 0x0001, /* Create model definitions from file */ BR_FMT_ACTORS = 0x0002, /* Create actor */ BR_FMT_LIGHTS = 0x0004, /* Create lights instances */ BR_FMT_CAMERAS = 0x0008, /* Create cameras instances */ BR_FMT_MATERIALS = 0x0010 /* Create materials */ }; /* * Interchange structure for passing to file format loaders * * XXX Not yet used by anything */ typedef struct br_fmt_results { /* * pointers to tables of each loaded allocated by BrFMTxxxLoad() */ br_model *models; br_model *materials; br_model *lights; br_model *cameras; br_model *actors; /* * Size of each allocated array */ int nmodels; int nmaterials; int nlights; int ncameras; int nactors; } br_fmt_results; #ifndef _FMTPROTO_H_ #include "fmtproto.h" #endif #ifdef __cplusplus }; #endif #endif ================================================ FILE: bren/inc/fmtproto.h ================================================ /* * Copyright (c) 1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: fmtproto.h 1.8 1995/05/30 16:57:38 sam Exp $ * $Locker: $ * * Function prototypes for foreign file format support */ #ifndef _FMTPROTO_H_ #define _FMTPROTO_H_ #ifdef __cplusplus extern "C" { #endif /* * Eric Haines' NFF format */ br_model *BR_PUBLIC_ENTRY BrFmtNFFLoad(char *name); /* * 3D Studio .ASC files */ br_uint_32 BR_PUBLIC_ENTRY BrFmtASCLoad(char *name, br_model **mtable, br_uint_16 max_models); /* * Script files */ br_uint_32 BR_PUBLIC_ENTRY BrFmtScriptMaterialLoadMany(char *filename, br_material **materials, br_uint_16 num); br_material *BR_PUBLIC_ENTRY BrFmtScriptMaterialLoad(char *filename); br_uint_32 BR_PUBLIC_ENTRY BrFmtScriptMaterialSaveMany(char *filename, br_material **materials, br_uint_16 num); br_uint_32 BR_PUBLIC_ENTRY BrFmtScriptMaterialSave(char *filename, br_material *ptr); /* * Windows .BMP files */ br_pixelmap *BR_PUBLIC_ENTRY BrFmtBMPLoad(char *name, br_uint_32 flags); /* * .TGA files */ br_pixelmap *BR_PUBLIC_ENTRY BrFmtTGALoad(char *name, br_uint_32 flags); /* * .GIF files */ br_pixelmap *BR_PUBLIC_ENTRY BrFmtGIFLoad(char *name, br_uint_32 flags); /* * .IFF/.LBM files */ br_pixelmap *BR_PUBLIC_ENTRY BrFmtIFFLoad(char *name, br_uint_32 flags); #ifdef __cplusplus }; #endif #endif ================================================ FILE: bren/inc/fwpextra.h ================================================ ================================================ FILE: bren/inc/fwproto.h ================================================ /* * Copyright (c) 1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: fwproto.h 1.42 1995/06/30 16:08:49 sam Exp $ * $Locker: sam $ * * Function prototypes for brender framework */ #ifndef _FWPROTO_H_ #define _FWPROTO_H_ #ifdef __cplusplus extern "C" { #endif #ifndef _NO_PROTOTYPES /** ** Fixed Point **/ /* result = abs(a) */ br_fixed_ls BR_ASM_CALL BrFixedAbs(br_fixed_ls a); /* result = a*b */ br_fixed_ls BR_ASM_CALL BrFixedMul(br_fixed_ls a, br_fixed_ls b); /* result = a*b + c*d */ br_fixed_ls BR_ASM_CALL BrFixedMac2(br_fixed_ls a, br_fixed_ls b, br_fixed_ls c, br_fixed_ls d); /* result = a*b + c*d + e*f */ br_fixed_ls BR_ASM_CALL BrFixedMac3(br_fixed_ls a, br_fixed_ls b, br_fixed_ls c, br_fixed_ls d, br_fixed_ls e, br_fixed_ls f); /* result = a*b + c*d + e*f + g*h */ br_fixed_ls BR_ASM_CALL BrFixedMac4(br_fixed_ls a, br_fixed_ls b, br_fixed_ls c, br_fixed_ls d, br_fixed_ls e, br_fixed_ls f, br_fixed_ls g, br_fixed_ls h); /* result = a*a */ br_fixed_ls BR_ASM_CALL BrFixedSqr(br_fixed_ls a); /* result = a*a + b*b */ br_fixed_ls BR_ASM_CALL BrFixedSqr2(br_fixed_ls a, br_fixed_ls b); /* result = a*a + b*b + c*c */ br_fixed_ls BR_ASM_CALL BrFixedSqr3(br_fixed_ls a, br_fixed_ls b, br_fixed_ls c); /* result = a*a + b*b + c*c + d*d */ br_fixed_ls BR_ASM_CALL BrFixedSqr4(br_fixed_ls a, br_fixed_ls b, br_fixed_ls c, br_fixed_ls d); /* result = sqrt(a*a + b*b) */ br_fixed_ls BR_ASM_CALL BrFixedLength2(br_fixed_ls a, br_fixed_ls b); /* result = sqrt(a*a + b*b + c*c) */ br_fixed_ls BR_ASM_CALL BrFixedLength3(br_fixed_ls a, br_fixed_ls b, br_fixed_ls c); /* result = sqrt(a*a + b*b + c*c + d*d) */ br_fixed_ls BR_ASM_CALL BrFixedLength4(br_fixed_ls a, br_fixed_ls b, br_fixed_ls c, br_fixed_ls d); /* result = 1/sqrt(a*a + b*b) (low precision) */ br_fixed_ls BR_ASM_CALL BrFixedRLength2(br_fixed_ls a, br_fixed_ls b); /* result = 1/sqrt(a*a + b*b + c*c) (low precision) */ br_fixed_ls BR_ASM_CALL BrFixedRLength3(br_fixed_ls a, br_fixed_ls b, br_fixed_ls c); /* result = 1/sqrt(a*a + b*b + c*c + d*d) (low precision) */ br_fixed_ls BR_ASM_CALL BrFixedRLength4(br_fixed_ls a, br_fixed_ls b, br_fixed_ls c, br_fixed_ls d); /* result = a/b */ br_fixed_ls BR_ASM_CALL BrFixedDiv(br_fixed_ls a, br_fixed_ls b); /* result = a/b * 2^31 */ br_fixed_ls BR_ASM_CALL BrFixedDivF(br_fixed_ls a, br_fixed_ls b); /* result = a/b (rounded towards 0) */ br_fixed_ls BR_ASM_CALL BrFixedDivR(br_fixed_ls a, br_fixed_ls b); /* result = a*b/c */ br_fixed_ls BR_ASM_CALL BrFixedMulDiv(br_fixed_ls a, br_fixed_ls b, br_fixed_ls c); /* result = (a*b + c*d)/e */ br_fixed_ls BR_ASM_CALL BrFixedMac2Div(br_fixed_ls a, br_fixed_ls b, br_fixed_ls c, br_fixed_ls d, br_fixed_ls e); /* result = (a*b + c*d + e*f)/g */ br_fixed_ls BR_ASM_CALL BrFixedMac3Div(br_fixed_ls a, br_fixed_ls b, br_fixed_ls c, br_fixed_ls d, br_fixed_ls e, br_fixed_ls f, br_fixed_ls g); /* result = (a*b + c*d + e*f + g*h)/i */ br_fixed_ls BR_ASM_CALL BrFixedMac4Div(br_fixed_ls a, br_fixed_ls b, br_fixed_ls c, br_fixed_ls d, br_fixed_ls e, br_fixed_ls f, br_fixed_ls g, br_fixed_ls h, br_fixed_ls i); /* result = 1.0/a */ br_fixed_ls BR_ASM_CALL BrFixedRcp(br_fixed_ls a); /* * Various combinations whith fractions */ /* result = a*b + c*d - a & c are fractions */ br_fixed_ls BR_ASM_CALL BrFixedFMac2(br_fixed_lsf a, br_fixed_ls b, br_fixed_lsf c, br_fixed_ls d); /* result = a*b + c*d + e*f - a,c & e are fractions */ br_fixed_ls BR_ASM_CALL BrFixedFMac3(br_fixed_lsf a, br_fixed_ls b, br_fixed_lsf c, br_fixed_ls d, br_fixed_lsf e, br_fixed_ls f); /* result = a*b + c*d + e*f + g*h (a,c,e,g are fractions) */ br_fixed_ls BR_ASM_CALL BrFixedFMac4(br_fixed_ls a, br_fixed_ls b, br_fixed_ls c, br_fixed_ls d, br_fixed_ls e, br_fixed_ls f, br_fixed_ls g, br_fixed_ls h); /* * Misc. support functions */ br_fixed_ls BR_ASM_CALL BrFixedSin(br_angle a); br_fixed_ls BR_ASM_CALL BrFixedCos(br_angle a); br_angle BR_ASM_CALL BrFixedASin(br_fixed_ls s); br_angle BR_ASM_CALL BrFixedACos(br_fixed_ls c); br_angle BR_ASM_CALL BrFixedATan2(br_fixed_ls x, br_fixed_ls y); br_angle BR_ASM_CALL BrFixedATan2Fast(br_fixed_ls x, br_fixed_ls y); br_fixed_ls BR_PUBLIC_ENTRY BrFixedSqrt(br_fixed_ls a); br_fixed_ls BR_PUBLIC_ENTRY BrFixedPow(br_fixed_ls a, br_fixed_ls b); /* * Integer sqrt functions */ br_uint_32 BR_ASM_CALL BrSqrt(br_uint_32 a); br_uint_32 BR_ASM_CALL BrFastSqrt(br_uint_32 a); br_uint_32 BR_ASM_CALL BrFastRSqrt(br_uint_32 a); /* * Optional inline fixed point maths */ #ifndef NO_PROTOTYPES #if INLINE_FIXED #ifdef __GNUC__ #include "g386ifix.h" #endif #ifdef __WATCOMC__ #include "wtcifix.h" #endif #ifdef _MSC_VER #include "mscifix.h" #endif #endif #endif /* * Setup */ void BR_PUBLIC_ENTRY BrBegin(void); void BR_PUBLIC_ENTRY BrEnd(void); /* * XXX - All the Add/Remove/Find/Count/Enum calls could ( when !(DEBUG | PARANOID)) * be #defined in terms of the core Registry fns. with appropriate casts. */ /* * Material Handling */ br_material *BR_PUBLIC_ENTRY BrMaterialAdd(br_material *material); br_material *BR_PUBLIC_ENTRY BrMaterialRemove(br_material *material); br_material *BR_PUBLIC_ENTRY BrMaterialFind(char *pattern); typedef br_material *BR_CALLBACK br_material_find_cbfn(char *name); br_material_find_cbfn *BR_PUBLIC_ENTRY BrMaterialFindHook(br_material_find_cbfn *hook); br_uint_32 BR_PUBLIC_ENTRY BrMaterialAddMany(br_material **items, int n); br_uint_32 BR_PUBLIC_ENTRY BrMaterialRemoveMany(br_material **items, int n); br_uint_32 BR_PUBLIC_ENTRY BrMaterialFindMany(char *pattern, br_material **items, int max); br_uint_32 BR_PUBLIC_ENTRY BrMaterialCount(char *pattern); typedef br_uint_32 BR_CALLBACK br_material_enum_cbfn(br_material *item, void *arg); br_uint_32 BR_PUBLIC_ENTRY BrMaterialEnum(char *pattern, br_material_enum_cbfn *callback, void *arg); void BR_PUBLIC_ENTRY BrMaterialUpdate(br_material *material, br_uint_16 flags); br_material *BR_PUBLIC_ENTRY BrMaterialAllocate(char *name); void BR_PUBLIC_ENTRY BrMaterialFree(br_material *m); /* * Model Handling */ br_model *BR_PUBLIC_ENTRY BrModelAdd(br_model *model); br_model *BR_PUBLIC_ENTRY BrModelRemove(br_model *model); br_model *BR_PUBLIC_ENTRY BrModelFind(char *pattern); typedef br_model *BR_CALLBACK br_model_find_cbfn(char *name); br_model_find_cbfn *BR_PUBLIC_ENTRY BrModelFindHook(br_model_find_cbfn *hook); br_uint_32 BR_PUBLIC_ENTRY BrModelAddMany(br_model **items, int n); br_uint_32 BR_PUBLIC_ENTRY BrModelRemoveMany(br_model **items, int n); br_uint_32 BR_PUBLIC_ENTRY BrModelFindMany(char *pattern, br_model **items, int max); br_uint_32 BR_PUBLIC_ENTRY BrModelCount(char *pattern); typedef br_uint_32 BR_CALLBACK br_model_enum_cbfn(br_model *item, void *arg); br_uint_32 BR_PUBLIC_ENTRY BrModelEnum(char *pattern, br_model_enum_cbfn *callback, void *arg); void BR_PUBLIC_ENTRY BrModelUpdate(br_model *model, br_uint_16 flags); void BR_PUBLIC_ENTRY BrModelApplyMap(br_model *model, int map_type, br_matrix34 *xform); br_matrix34 *BR_PUBLIC_ENTRY BrModelFitMap(br_model *model, int axis_0, int axis_1, br_matrix34 *transform); br_model *BR_PUBLIC_ENTRY BrModelAllocate(char *name, int nvertices, int nfaces); void BR_PUBLIC_ENTRY BrModelFree(br_model *m); /* * Texture handling */ br_pixelmap *BR_PUBLIC_ENTRY BrMapAdd(br_pixelmap *pixelmap); br_pixelmap *BR_PUBLIC_ENTRY BrMapRemove(br_pixelmap *pixelmap); br_pixelmap *BR_PUBLIC_ENTRY BrMapFind(char *pattern); typedef br_pixelmap *BR_CALLBACK br_map_find_cbfn(char *name); br_map_find_cbfn *BR_PUBLIC_ENTRY BrMapFindHook(br_map_find_cbfn *hook); br_uint_32 BR_PUBLIC_ENTRY BrMapAddMany(br_pixelmap **items, int n); br_uint_32 BR_PUBLIC_ENTRY BrMapRemoveMany(br_pixelmap **items, int n); br_uint_32 BR_PUBLIC_ENTRY BrMapFindMany(char *pattern, br_pixelmap **items, int max); br_uint_32 BR_PUBLIC_ENTRY BrMapCount(char *pattern); typedef br_uint_32 BR_CALLBACK br_map_enum_cbfn(br_pixelmap *item, void *arg); br_uint_32 BR_PUBLIC_ENTRY BrMapEnum(char *pattern, br_map_enum_cbfn *callback, void *arg); void BR_PUBLIC_ENTRY BrMapUpdate(br_pixelmap *item, br_uint_16 flags); /* * Table handling */ br_pixelmap *BR_PUBLIC_ENTRY BrTableAdd(br_pixelmap *pixelmap); br_pixelmap *BR_PUBLIC_ENTRY BrTableRemove(br_pixelmap *pixelmap); br_pixelmap *BR_PUBLIC_ENTRY BrTableFind(char *pattern); typedef br_pixelmap *BR_CALLBACK br_table_find_cbfn(char *name); br_table_find_cbfn *BR_PUBLIC_ENTRY BrTableFindHook(br_table_find_cbfn *hook); br_uint_32 BR_PUBLIC_ENTRY BrTableAddMany(br_pixelmap **items, int n); br_uint_32 BR_PUBLIC_ENTRY BrTableRemoveMany(br_pixelmap **items, int n); br_uint_32 BR_PUBLIC_ENTRY BrTableFindMany(char *pattern, br_pixelmap **items, int max); br_uint_32 BR_PUBLIC_ENTRY BrTableCount(char *pattern); typedef br_uint_32 BR_CALLBACK br_table_enum_cbfn(br_pixelmap *item, void *arg); br_uint_32 BR_PUBLIC_ENTRY BrTableEnum(char *pattern, br_table_enum_cbfn *callback, void *arg); void BR_PUBLIC_ENTRY BrTableUpdate(br_pixelmap *item, br_uint_16 flags); /* * Resource class handling */ br_resource_class *BR_PUBLIC_ENTRY BrResClassAdd(br_resource_class *pixelmap); br_resource_class *BR_PUBLIC_ENTRY BrResClassRemove(br_resource_class *pixelmap); br_resource_class *BR_PUBLIC_ENTRY BrResClassFind(char *pattern); typedef br_resource_class *BR_CALLBACK br_resclass_find_cbfn(char *name); br_resclass_find_cbfn *BR_PUBLIC_ENTRY BrResClassFindHook(br_resclass_find_cbfn *hook); br_uint_32 BR_PUBLIC_ENTRY BrResClassAddMany(br_resource_class **items, int n); br_uint_32 BR_PUBLIC_ENTRY BrResClassRemoveMany(br_resource_class **items, int n); br_uint_32 BR_PUBLIC_ENTRY BrResClassFindMany(char *pattern, br_resource_class **items, int max); br_uint_32 BR_PUBLIC_ENTRY BrResClassCount(char *pattern); typedef br_uint_32 BR_CALLBACK br_resclass_enum_cbfn(br_resource_class *item, void *arg); br_uint_32 BR_PUBLIC_ENTRY BrResClassEnum(char *pattern, br_resclass_enum_cbfn *callback, void *arg); /* * Actor Handling */ typedef br_uint_32 BR_CALLBACK br_actor_enum_cbfn(br_actor *mat, void *arg); br_uint_32 BR_PUBLIC_ENTRY BrActorEnum(br_actor *parent, br_actor_enum_cbfn *callback, void *arg); br_actor *BR_PUBLIC_ENTRY BrActorAdd(br_actor *parent, br_actor *a); br_actor *BR_PUBLIC_ENTRY BrActorRemove(br_actor *a); void BR_PUBLIC_ENTRY BrActorRelink(br_actor *parent, br_actor *actor); br_uint_8 BR_PUBLIC_ENTRY BrActorToActorMatrix34(br_matrix34 *m, br_actor *a, br_actor *b); void BR_PUBLIC_ENTRY BrActorToScreenMatrix4(br_matrix4 *m, br_actor *a, br_actor *camera); br_actor *BR_PUBLIC_ENTRY BrActorAllocate(br_uint_8 actor_type, void *type_data); void BR_PUBLIC_ENTRY BrActorFree(br_actor *a); br_uint_32 BR_PUBLIC_ENTRY BrActorSearchMany(br_actor *root, char *pattern, br_actor **actors, int max); br_actor *BR_PUBLIC_ENTRY BrActorSearch(br_actor *root, char *pattern); br_bounds *BR_PUBLIC_ENTRY BrActorToBounds(br_bounds *b, br_actor *ap); br_matrix34 *BR_PUBLIC_ENTRY BrBoundsToMatrix34(br_matrix34 *mat, br_bounds *bounds); /* * Pixelmap management */ br_pixelmap *BR_PUBLIC_ENTRY BrPixelmapAllocate(br_uint_8 type, br_uint_16 w, br_uint_16 h, void *pixels, int flags); br_pixelmap *BR_PUBLIC_ENTRY BrPixelmapAllocateSub(br_pixelmap *pm, br_uint_16 x, br_uint_16 y, br_uint_16 w, br_uint_16 h); void BR_PUBLIC_ENTRY BrPixelmapFree(br_pixelmap *pm); br_pixelmap *BR_PUBLIC_ENTRY BrPixelmapMatch(br_pixelmap *src, br_uint_8 match_type); br_pixelmap *BR_PUBLIC_ENTRY BrPixelmapClone(br_pixelmap *src); br_uint_16 BR_PUBLIC_ENTRY BrPixelmapPixelSize(br_pixelmap *pm); br_uint_16 BR_PUBLIC_ENTRY BrPixelmapChannels(br_pixelmap *pm); /* * Pixelmap operations */ void BR_PUBLIC_ENTRY BrPixelmapFill(br_pixelmap *dst, br_uint_32 colour); void BR_PUBLIC_ENTRY BrPixelmapRectangle(br_pixelmap *dst, br_int_16 x, br_int_16 y, br_uint_16 w, br_uint_16 h, br_uint_32 colour); void BR_PUBLIC_ENTRY BrPixelmapRectangle2(br_pixelmap *dst, br_int_16 x, br_int_16 y, br_uint_16 w, br_uint_16 h, br_uint_32 colour1, br_uint_32 colour2); void BR_PUBLIC_ENTRY BrPixelmapRectangleCopy(br_pixelmap *dst, br_int_16 dx, br_int_16 dy, br_pixelmap *src, br_int_16 sx, br_int_16 sy, br_uint_16 w, br_uint_16 h); void BR_PUBLIC_ENTRY BrPixelmapRectangleFill(br_pixelmap *dst, br_int_16 x, br_int_16 y, br_uint_16 w, br_uint_16 h, br_uint_32 colour); void BR_PUBLIC_ENTRY BrPixelmapDirtyRectangleCopy(br_pixelmap *dst, br_pixelmap *src, br_int_16 x, br_int_16 y, br_uint_16 w, br_uint_16 h); void BR_PUBLIC_ENTRY BrPixelmapDirtyRectangleFill(br_pixelmap *dst, br_int_16 x, br_int_16 y, br_uint_16 w, br_uint_16 h, br_uint_32 colour); void BR_PUBLIC_ENTRY BrPixelmapPixelSet(br_pixelmap *dst, br_int_16 x, br_int_16 y, br_uint_32 colour); br_uint_32 BR_PUBLIC_ENTRY BrPixelmapPixelGet(br_pixelmap *dst, br_int_16 x, br_int_16 y); void BR_PUBLIC_ENTRY BrPixelmapCopy(br_pixelmap *dst, br_pixelmap *src); void BR_PUBLIC_ENTRY BrPixelmapLine(br_pixelmap *dst, br_int_16 x1, br_int_16 y1, br_int_16 x2, br_int_16 y2, br_uint_32 colour); void BR_PUBLIC_ENTRY BrPixelmapText(br_pixelmap *dst, br_int_16 x, br_int_16 y, br_uint_32 colour, br_font *font, char *text); void BR_PUBLIC_ENTRY BrPixelmapTextF(br_pixelmap *dst, br_int_16 x, br_int_16 y, br_uint_32 colour, br_font *font, char *fmt, ...); void BR_PUBLIC_ENTRY BrPixelmapCopyBits(br_pixelmap *dst, br_int_16 x, br_int_16 y, br_uint_8 *src, br_uint_16 s_stride, br_uint_16 start_bit, br_uint_16 end_bit, br_uint_16 nrows, br_uint_32 colour); br_uint_16 BR_PUBLIC_ENTRY BrPixelmapTextWidth(br_pixelmap *dst, br_font *font, char *text); br_uint_16 BR_PUBLIC_ENTRY BrPixelmapTextHeight(br_pixelmap *dst, br_font *font); void BR_PUBLIC_ENTRY BrPixelmapDoubleBuffer(br_pixelmap *dst, br_pixelmap *src); /* * Backwards compatibility */ #define BrPixelmapPlot BrPixelmapPixelSet /* * File operations */ br_model *BR_PUBLIC_ENTRY BrModelLoad(char *filename); br_uint_32 BR_PUBLIC_ENTRY BrModelSave(char *filename, br_model *model); br_uint_32 BR_PUBLIC_ENTRY BrModelLoadMany(char *filename, br_model **models, br_uint_16 num); br_uint_32 BR_PUBLIC_ENTRY BrModelSaveMany(char *filename, br_model **models, br_uint_16 num); br_material *BR_PUBLIC_ENTRY BrMaterialLoad(char *filename); br_uint_32 BR_PUBLIC_ENTRY BrMaterialSave(char *filename, br_material *material); br_uint_32 BR_PUBLIC_ENTRY BrMaterialLoadMany(char *filename, br_material **materials, br_uint_16 num); br_uint_32 BR_PUBLIC_ENTRY BrMaterialSaveMany(char *filename, br_material **materials, br_uint_16 num); br_pixelmap *BR_PUBLIC_ENTRY BrPixelmapLoad(char *filename); br_uint_32 BR_PUBLIC_ENTRY BrPixelmapSave(char *filename, br_pixelmap *pixelmap); br_uint_32 BR_PUBLIC_ENTRY BrPixelmapLoadMany(char *filename, br_pixelmap **pixelmaps, br_uint_16 num); br_uint_32 BR_PUBLIC_ENTRY BrPixelmapSaveMany(char *filename, br_pixelmap **pixelmaps, br_uint_16 num); br_actor *BR_PUBLIC_ENTRY BrActorLoad(char *filename); br_uint_32 BR_PUBLIC_ENTRY BrActorSave(char *filename, br_actor *actor); br_uint_32 BR_PUBLIC_ENTRY BrActorLoadMany(char *filename, br_actor **actors, br_uint_16 num); br_uint_32 BR_PUBLIC_ENTRY BrActorSaveMany(char *filename, br_actor **actors, br_uint_16 num); /* * Lights */ void BR_PUBLIC_ENTRY BrLightEnable(br_actor *l); void BR_PUBLIC_ENTRY BrLightDisable(br_actor *l); /* * Environment */ br_actor *BR_PUBLIC_ENTRY BrEnvironmentSet(br_actor *a); /* * Clip planes */ void BR_PUBLIC_ENTRY BrClipPlaneEnable(br_actor *cp); void BR_PUBLIC_ENTRY BrClipPlaneDisable(br_actor *cp); /* * 3x4 Matrix ops. */ void BR_PUBLIC_ENTRY BrMatrix34Copy(br_matrix34 *A, br_matrix34 *b); void BR_PUBLIC_ENTRY BrMatrix34Mul(br_matrix34 *A, br_matrix34 *B, br_matrix34 *C); void BR_PUBLIC_ENTRY BrMatrix34Pre(br_matrix34 *mat, br_matrix34 *A); void BR_PUBLIC_ENTRY BrMatrix34Post(br_matrix34 *mat, br_matrix34 *A); void BR_PUBLIC_ENTRY BrMatrix34Identity(br_matrix34 *mat); void BR_PUBLIC_ENTRY BrMatrix34RotateX(br_matrix34 *mat, br_angle rx); void BR_PUBLIC_ENTRY BrMatrix34PreRotateX(br_matrix34 *mat, br_angle rx); void BR_PUBLIC_ENTRY BrMatrix34PostRotateX(br_matrix34 *mat, br_angle rx); void BR_PUBLIC_ENTRY BrMatrix34RotateY(br_matrix34 *mat, br_angle ry); void BR_PUBLIC_ENTRY BrMatrix34PreRotateY(br_matrix34 *mat, br_angle ry); void BR_PUBLIC_ENTRY BrMatrix34PostRotateY(br_matrix34 *mat, br_angle ry); void BR_PUBLIC_ENTRY BrMatrix34RotateZ(br_matrix34 *mat, br_angle rz); void BR_PUBLIC_ENTRY BrMatrix34PreRotateZ(br_matrix34 *mat, br_angle rz); void BR_PUBLIC_ENTRY BrMatrix34PostRotateZ(br_matrix34 *mat, br_angle rz); void BR_PUBLIC_ENTRY BrMatrix34Rotate(br_matrix34 *mat, br_angle r, br_vector3 *axis); void BR_PUBLIC_ENTRY BrMatrix34PreRotate(br_matrix34 *mat, br_angle r, br_vector3 *axis); void BR_PUBLIC_ENTRY BrMatrix34PostRotate(br_matrix34 *mat, br_angle r, br_vector3 *axis); void BR_PUBLIC_ENTRY BrMatrix34Translate(br_matrix34 *mat, br_scalar x, br_scalar y, br_scalar z); void BR_PUBLIC_ENTRY BrMatrix34PreTranslate(br_matrix34 *mat, br_scalar x, br_scalar y, br_scalar z); void BR_PUBLIC_ENTRY BrMatrix34PostTranslate(br_matrix34 *mat, br_scalar x, br_scalar y, br_scalar z); void BR_PUBLIC_ENTRY BrMatrix34Scale(br_matrix34 *mat, br_scalar sx, br_scalar sy, br_scalar sz); void BR_PUBLIC_ENTRY BrMatrix34PreScale(br_matrix34 *mat, br_scalar sx, br_scalar sy, br_scalar sz); void BR_PUBLIC_ENTRY BrMatrix34PostScale(br_matrix34 *mat, br_scalar sx, br_scalar sy, br_scalar sz); void BR_PUBLIC_ENTRY BrMatrix34ShearX(br_matrix34 *mat, br_scalar sy, br_scalar sz); void BR_PUBLIC_ENTRY BrMatrix34PreShearX(br_matrix34 *mat, br_scalar sy, br_scalar sz); void BR_PUBLIC_ENTRY BrMatrix34PostShearX(br_matrix34 *mat, br_scalar sy, br_scalar sz); void BR_PUBLIC_ENTRY BrMatrix34ShearY(br_matrix34 *mat, br_scalar sx, br_scalar sz); void BR_PUBLIC_ENTRY BrMatrix34PreShearY(br_matrix34 *mat, br_scalar sx, br_scalar sz); void BR_PUBLIC_ENTRY BrMatrix34PostShearY(br_matrix34 *mat, br_scalar sx, br_scalar sz); void BR_PUBLIC_ENTRY BrMatrix34ShearZ(br_matrix34 *mat, br_scalar sx, br_scalar sy); void BR_PUBLIC_ENTRY BrMatrix34PreShearZ(br_matrix34 *mat, br_scalar sx, br_scalar sy); void BR_PUBLIC_ENTRY BrMatrix34PostShearZ(br_matrix34 *mat, br_scalar sx, br_scalar sy); void BR_PUBLIC_ENTRY BrMatrix34ApplyV(br_vector3 *A, br_vector3 *B, br_matrix34 *C); void BR_PUBLIC_ENTRY BrMatrix34ApplyP(br_vector3 *A, br_vector3 *B, br_matrix34 *C); void BR_PUBLIC_ENTRY BrMatrix34Apply(br_vector3 *A, br_vector4 *B, br_matrix34 *C); void BR_PUBLIC_ENTRY BrMatrix34TApplyV(br_vector3 *A, br_vector3 *B, br_matrix34 *C); void BR_PUBLIC_ENTRY BrMatrix34TApplyP(br_vector3 *A, br_vector3 *B, br_matrix34 *C); void BR_PUBLIC_ENTRY BrMatrix34TApply(br_vector4 *A, br_vector4 *B, br_matrix34 *C); br_scalar BR_PUBLIC_ENTRY BrMatrix34Inverse(br_matrix34 *out, br_matrix34 *in); void BR_PUBLIC_ENTRY BrMatrix34LPInverse(br_matrix34 *A, br_matrix34 *B); void BR_PUBLIC_ENTRY BrMatrix34LPNormalise(br_matrix34 *A, br_matrix34 *B); void BR_PUBLIC_ENTRY BrMatrix34RollingBall(br_matrix34 *mat, int dx, int dy, int radius); /* * 4x4 Matrix ops. */ void BR_PUBLIC_ENTRY BrMatrix4Copy(br_matrix4 *A, br_matrix4 *B); void BR_PUBLIC_ENTRY BrMatrix4Mul(br_matrix4 *A, br_matrix4 *B, br_matrix4 *C); void BR_PUBLIC_ENTRY BrMatrix4Identity(br_matrix4 *mat); void BR_PUBLIC_ENTRY BrMatrix4Scale(br_matrix4 *mat, br_scalar sx, br_scalar sy, br_scalar sz); br_scalar BR_PUBLIC_ENTRY BrMatrix4Inverse(br_matrix4 *A, br_matrix4 *B); void BR_PUBLIC_ENTRY BrMatrix4Adjoint(br_matrix4 *A, br_matrix4 *B); br_scalar BR_PUBLIC_ENTRY BrMatrix4Determinant(br_matrix4 *mat); void BR_PUBLIC_ENTRY BrMatrix4Perspective(br_matrix4 *mat, br_angle field_of_view, br_scalar aspect, br_scalar hither, br_scalar yon); void BR_PUBLIC_ENTRY BrMatrix4ApplyV(br_vector4 *A, br_vector3 *B, br_matrix4 *C); void BR_PUBLIC_ENTRY BrMatrix4ApplyP(br_vector4 *A, br_vector3 *B, br_matrix4 *C); void BR_PUBLIC_ENTRY BrMatrix4Apply(br_vector4 *A, br_vector4 *B, br_matrix4 *C); void BR_PUBLIC_ENTRY BrMatrix4TApplyV(br_vector4 *A, br_vector3 *B, br_matrix4 *C); void BR_PUBLIC_ENTRY BrMatrix4TApplyP(br_vector4 *A, br_vector3 *B, br_matrix4 *C); void BR_PUBLIC_ENTRY BrMatrix4TApply(br_vector4 *A, br_vector4 *B, br_matrix4 *C); void BR_PUBLIC_ENTRY BrMatrix4Pre34(br_matrix4 *A, br_matrix34 *B); void BR_PUBLIC_ENTRY BrMatrix4Copy34(br_matrix4 *A, br_matrix34 *B); void BR_PUBLIC_ENTRY BrMatrix34Copy4(br_matrix34 *A, br_matrix4 *B); /** ** 2D Vectors **/ void BR_PUBLIC_ENTRY BrVector2Copy(br_vector2 *v1, br_vector2 *v2); void BR_PUBLIC_ENTRY BrVector2Set(br_vector2 *v1, br_scalar s1, br_scalar s2); void BR_PUBLIC_ENTRY BrVector2SetInt(br_vector2 *v1, int i1, int i2); void BR_PUBLIC_ENTRY BrVector2SetFloat(br_vector2 *v1, float f1, float f2); void BR_PUBLIC_ENTRY BrVector2Negate(br_vector2 *v1, br_vector2 *v2); void BR_PUBLIC_ENTRY BrVector2Add(br_vector2 *v1, br_vector2 *v2, br_vector2 *v3); void BR_PUBLIC_ENTRY BrVector2Accumulate(br_vector2 *v1, br_vector2 *v2); void BR_PUBLIC_ENTRY BrVector2Sub(br_vector2 *v1, br_vector2 *v2, br_vector2 *v3); void BR_PUBLIC_ENTRY BrVector2Scale(br_vector2 *v1, br_vector2 *v2, br_scalar s); void BR_PUBLIC_ENTRY BrVector2InvScale(br_vector2 *v1, br_vector2 *v2, br_scalar s); br_scalar BR_PUBLIC_ENTRY BrVector2Dot(br_vector2 *v1, br_vector2 *v2); br_scalar BR_PUBLIC_ENTRY BrVector2Length(br_vector2 *v1); br_scalar BR_PUBLIC_ENTRY BrVector2LengthSquared(br_vector2 *v1); /** ** 3D VECTORS **/ void BR_PUBLIC_ENTRY BrVector3Copy(br_vector3 *v1, br_vector2 *v2); void BR_PUBLIC_ENTRY BrVector3Set(br_vector3 *v1, br_scalar s1, br_scalar s2, br_scalar s3); void BR_PUBLIC_ENTRY BrVector3SetInt(br_vector3 *v1, int i1, int i2, int i3); void BR_PUBLIC_ENTRY BrVector3SetFloat(br_vector3 *v1, float f1, float f2, float f3); void BR_PUBLIC_ENTRY BrVector3Negate(br_vector3 *v1, br_vector3 *v2); void BR_PUBLIC_ENTRY BrVector3Add(br_vector3 *v1, br_vector3 *v2, br_vector3 *v3); void BR_PUBLIC_ENTRY BrVector3Accumulate(br_vector3 *v1, br_vector3 *v2); void BR_PUBLIC_ENTRY BrVector3Sub(br_vector3 *v1, br_vector3 *v2, br_vector3 *v3); void BR_PUBLIC_ENTRY BrVector3Scale(br_vector3 *v1, br_vector3 *v2, br_scalar s); void BR_PUBLIC_ENTRY BrVector3InvScale(br_vector3 *v1, br_vector3 *v2, br_scalar s); br_scalar BR_PUBLIC_ENTRY BrVector3Dot(br_vector3 *v1, br_vector3 *v2); void BR_PUBLIC_ENTRY BrVector3Cross(br_vector3 *v1, br_vector3 *v2, br_vector3 *v3); br_scalar BR_PUBLIC_ENTRY BrVector3Length(br_vector3 *v1); br_scalar BR_PUBLIC_ENTRY BrVector3LengthSquared(br_vector3 *v1); void BR_PUBLIC_ENTRY BrVector3Normalise(br_vector3 *v1, br_vector3 *v2); void BR_PUBLIC_ENTRY BrVector3NormaliseQuick(br_vector3 *v1, br_vector3 *v2); void BR_PUBLIC_ENTRY BrVector3NormaliseLP(br_vector3 *v1, br_vector3 *v2); /* * 2D vectors */ void BR_PUBLIC_ENTRY BrVector2Normalise(br_vector2 *v1, br_vector2 *v2); /** ** 4D Vectors **/ br_scalar BR_PUBLIC_ENTRY BrVector4Dot(br_vector4 *v1, br_vector4 *v2); void BR_PUBLIC_ENTRY BrVector4Copy(br_vector4 *v1, br_vector4 *v2); /* * Euler Angles */ br_matrix34 *BR_PUBLIC_ENTRY BrEulerToMatrix34(br_matrix34 *mat, br_euler *euler); br_euler *BR_PUBLIC_ENTRY BrMatrix34ToEuler(br_euler *euler, br_matrix34 *mat); br_matrix4 *BR_PUBLIC_ENTRY BrEulerToMatrix4(br_matrix4 *mat, br_euler *src); br_euler *BR_PUBLIC_ENTRY BrMatrix4ToEuler(br_euler *dest, br_matrix4 *mat); br_quat *BR_PUBLIC_ENTRY BrEulerToQuat(br_quat *quat, br_euler *euler); br_euler *BR_PUBLIC_ENTRY BrQuatToEuler(br_euler *euler, br_quat *quat); /* * Quaternions */ br_quat *BR_PUBLIC_ENTRY BrQuatMul(br_quat *q, br_quat *l, br_quat *r); br_quat *BR_PUBLIC_ENTRY BrQuatNormalise(br_quat *q, br_quat *qq); br_quat *BR_PUBLIC_ENTRY BrQuatInvert(br_quat *q, br_quat *qq); br_quat *BR_PUBLIC_ENTRY BrQuatSlerp(br_quat *q, br_quat *l, br_quat *r, br_scalar t, br_int_16 spins); br_matrix34 *BR_PUBLIC_ENTRY BrQuatToMatrix34(br_matrix34 *mat, br_quat *q); br_quat *BR_PUBLIC_ENTRY BrMatrix34ToQuat(br_quat *q, br_matrix34 *mat); br_matrix4 *BR_PUBLIC_ENTRY BrQuatToMatrix4(br_matrix4 *mat, br_quat *q); br_quat *BR_PUBLIC_ENTRY BrMatrix4ToQuat(br_quat *q, br_matrix4 *mat); /* * Block pool allocator */ br_pool *BR_PUBLIC_ENTRY BrPoolAllocate(int block_size, int chunk_size, br_uint_8 mem_type); void BR_PUBLIC_ENTRY BrPoolFree(br_pool *pool); void *BR_PUBLIC_ENTRY BrPoolBlockAllocate(struct br_pool *pool); void BR_PUBLIC_ENTRY BrPoolBlockFree(struct br_pool *pool, void *block); void BR_PUBLIC_ENTRY BrPoolEmpty(struct br_pool *pool); /* * Transforms */ void BR_PUBLIC_ENTRY BrTransformToMatrix34(br_matrix34 *mat, br_transform *xform); void BR_PUBLIC_ENTRY BrMatrix34ToTransform(br_transform *xform, br_matrix34 *mat); void BR_PUBLIC_ENTRY BrTransformToTransform(br_transform *dest, br_transform *src); void BR_PUBLIC_ENTRY BrMatrix34PreTransform(br_matrix34 *mat, br_transform *xform); void BR_PUBLIC_ENTRY BrMatrix34PostTransform(br_matrix34 *mat, br_transform *xform); void BR_PUBLIC_ENTRY BrMatrix4PreTransform(br_matrix4 *mat, br_transform *xform); /* * 2x3 Matrix ops. */ void BR_PUBLIC_ENTRY BrMatrix23Copy(br_matrix23 *A, br_matrix23 *b); void BR_PUBLIC_ENTRY BrMatrix23Mul(br_matrix23 *A, br_matrix23 *B, br_matrix23 *C); void BR_PUBLIC_ENTRY BrMatrix23Pre(br_matrix23 *mat, br_matrix23 *A); void BR_PUBLIC_ENTRY BrMatrix23Post(br_matrix23 *mat, br_matrix23 *A); void BR_PUBLIC_ENTRY BrMatrix23Identity(br_matrix23 *mat); void BR_PUBLIC_ENTRY BrMatrix23Rotate(br_matrix23 *mat, br_angle rz); void BR_PUBLIC_ENTRY BrMatrix23PreRotate(br_matrix23 *mat, br_angle rz); void BR_PUBLIC_ENTRY BrMatrix23PostRotate(br_matrix23 *mat, br_angle rz); void BR_PUBLIC_ENTRY BrMatrix23Translate(br_matrix23 *mat, br_scalar x, br_scalar y); void BR_PUBLIC_ENTRY BrMatrix23PreTranslate(br_matrix23 *mat, br_scalar x, br_scalar y); void BR_PUBLIC_ENTRY BrMatrix23PostTranslate(br_matrix23 *mat, br_scalar x, br_scalar y); void BR_PUBLIC_ENTRY BrMatrix23Scale(br_matrix23 *mat, br_scalar sx, br_scalar sy); void BR_PUBLIC_ENTRY BrMatrix23PreScale(br_matrix23 *mat, br_scalar sx, br_scalar sy); void BR_PUBLIC_ENTRY BrMatrix23PostScale(br_matrix23 *mat, br_scalar sx, br_scalar sy); void BR_PUBLIC_ENTRY BrMatrix23ShearX(br_matrix23 *mat, br_scalar sy); void BR_PUBLIC_ENTRY BrMatrix23PreShearX(br_matrix23 *mat, br_scalar sy); void BR_PUBLIC_ENTRY BrMatrix23PostShearX(br_matrix23 *mat, br_scalar sy); void BR_PUBLIC_ENTRY BrMatrix23ShearY(br_matrix23 *mat, br_scalar sx); void BR_PUBLIC_ENTRY BrMatrix23PreShearY(br_matrix23 *mat, br_scalar sx); void BR_PUBLIC_ENTRY BrMatrix23PostShearY(br_matrix23 *mat, br_scalar sx); void BR_PUBLIC_ENTRY BrMatrix23ApplyV(br_vector2 *A, br_vector2 *B, br_matrix23 *C); void BR_PUBLIC_ENTRY BrMatrix23ApplyP(br_vector2 *A, br_vector2 *B, br_matrix23 *C); void BR_PUBLIC_ENTRY BrMatrix23TApplyV(br_vector2 *A, br_vector2 *B, br_matrix23 *C); void BR_PUBLIC_ENTRY BrMatrix23TApplyP(br_vector2 *A, br_vector2 *B, br_matrix23 *C); br_scalar BR_PUBLIC_ENTRY BrMatrix23Inverse(br_matrix23 *out, br_matrix23 *in); void BR_PUBLIC_ENTRY BrMatrix23LPInverse(br_matrix23 *A, br_matrix23 *B); void BR_PUBLIC_ENTRY BrMatrix23LPNormalise(br_matrix23 *A, br_matrix23 *B); /* * Backwards compatibility */ #define BrMatrix34Transform BrTransformToMatrix34 #define BrTransformTransfer BrTransformToTransform /* * Picking */ typedef int BR_CALLBACK br_pick2d_cbfn(br_actor *a, br_model *model, br_material *material, br_vector3 *ray_pos, br_vector3 *ray_dir, br_scalar t_near, br_scalar t_far, void *arg); int BR_PUBLIC_ENTRY BrScenePick2D(br_actor *world, br_actor *camera, br_pixelmap *viewport, int pick_x, int pick_y, br_pick2d_cbfn *callback, void *arg); typedef int BR_CALLBACK br_pick3d_cbfn(br_actor *a, br_model *model, br_material *material, br_matrix34 *transform, br_bounds *bounds, void *arg); int BR_PUBLIC_ENTRY BrScenePick3D(br_actor *world, br_actor *actor, br_bounds *bounds, br_pick3d_cbfn *callback, void *arg); typedef int BR_CALLBACK br_modelpick2d_cbfn(br_model *model, br_material *material, br_vector3 *ray_pos, br_vector3 *ray_dir, br_scalar t, int face, int edge, int vertex, br_vector3 *p, br_vector2 *map, void *arg); int BR_PUBLIC_ENTRY BrModelPick2D(br_model *model, br_material *material, br_vector3 *ray_pos, br_vector3 *ray_dir, br_scalar t_near, br_scalar t_far, br_modelpick2d_cbfn *callback, void *arg); /* * Custom calback support */ br_uint_8 BR_PUBLIC_ENTRY BrOnScreenCheck(br_bounds *bounds); br_uint_8 BR_PUBLIC_ENTRY BrOriginToScreenXY(br_vector2 *screen); br_uint_32 BR_PUBLIC_ENTRY BrOriginToScreenXYZO(br_vector3 *screen); br_uint_8 BR_PUBLIC_ENTRY BrPointToScreenXY(br_vector2 *screen, br_vector3 *point); br_uint_32 BR_PUBLIC_ENTRY BrPointToScreenXYZO(br_vector3 *screen, br_vector3 *point); void BR_PUBLIC_ENTRY BrPointToScreenXYMany(br_vector2 *screens, br_vector3 *points, br_uint_32 npoints); void BR_PUBLIC_ENTRY BrPointToScreenXYZOMany(br_vector3 *screens, br_uint_32 *outcodes, br_vector3 *points, br_uint_32 npoints); void BR_PUBLIC_ENTRY BrSceneModelLight(br_model *model, br_material *default_material, br_actor *root, br_actor *a); /* * Byte swapping */ typedef float br_float; br_uint_32 BR_PUBLIC_ENTRY BrSwap32(br_uint_32 l); br_uint_16 BR_PUBLIC_ENTRY BrSwap16(br_uint_16 s); br_float BR_PUBLIC_ENTRY BrSwapFloat(br_float f); void *BR_PUBLIC_ENTRY BrSwapBlock(void *block, int count, int size); /* * Misc. support */ typedef int BR_CALLBACK br_qsort_cbfn(const void *, const void *); void BR_PUBLIC_ENTRY BrQsort(void *basep, unsigned int nelems, unsigned int size, br_qsort_cbfn *comp); /* * Diagnostic generation */ void BR_PUBLIC_ENTRY BrFailure(char *s, ...); void BR_PUBLIC_ENTRY BrWarning(char *s, ...); void BR_PUBLIC_ENTRY BrFatal(char *name, int line, char *s, ...); void BR_PUBLIC_ENTRY _BrAssert(char *condition, char *file, unsigned line); void BR_PUBLIC_ENTRY _BrUAssert(char *condition, char *file, unsigned line); /* * Set new handlers */ br_diaghandler *BR_PUBLIC_ENTRY BrDiagHandlerSet(br_diaghandler *newdh); br_filesystem *BR_PUBLIC_ENTRY BrFilesystemSet(br_filesystem *newfs); br_allocator *BR_PUBLIC_ENTRY BrAllocatorSet(br_allocator *newal); /* * Backwards compatibility */ #define BrErrorHandlerSet BrDiagHandlerSet /* * Generic file IO */ br_uint_32 BR_PUBLIC_ENTRY BrFileAttributes(void); void *BR_PUBLIC_ENTRY BrFileOpenRead(char *name, br_size_t n_magics, br_mode_test_cbfn *mode_test, int *mode_result); void *BR_PUBLIC_ENTRY BrFileOpenWrite(char *name, int text); void BR_PUBLIC_ENTRY BrFileClose(void *f); int BR_PUBLIC_ENTRY BrFileEof(void *f); int BR_PUBLIC_ENTRY BrFileGetChar(void *f); void BR_PUBLIC_ENTRY BrFilePutChar(int c, void *f); int BR_PUBLIC_ENTRY BrFileRead(void *buf, int size, int n, void *f); int BR_PUBLIC_ENTRY BrFileWrite(void *buf, int size, int n, void *f); int BR_PUBLIC_ENTRY BrFileGetLine(char *buf, br_size_t buf_len, void *f); void BR_PUBLIC_ENTRY BrFilePutLine(char *buf, void *f); void BR_PUBLIC_ENTRY BrFileAdvance(long int count, void *f); int BR_PUBLIC_ENTRY BrFilePrintf(void *f, char *fmt, ...); /* * Data file output type (one of BR_FS_MODE_xxx) */ int BR_PUBLIC_ENTRY BrWriteModeSet(int text); /* * Generic memory allocation */ void *BR_PUBLIC_ENTRY BrMemAllocate(br_size_t size, br_uint_8 type); void BR_PUBLIC_ENTRY BrMemFree(void *block); br_size_t BR_PUBLIC_ENTRY BrMemInquire(br_uint_8 type); char *BR_PUBLIC_ENTRY BrMemStrDup(char *str); void *BR_PUBLIC_ENTRY BrMemCalloc(int nelems, br_size_t size, br_uint_8 type); /* * Resource allocation */ void *BR_PUBLIC_ENTRY BrResAllocate(void *vparent, br_size_t size, int res_class); void BR_PUBLIC_ENTRY BrResFree(void *vres); char *BR_PUBLIC_ENTRY BrResStrDup(void *vparent, char *str); void *BR_PUBLIC_ENTRY BrResAdd(void *vparent, void *vres); void *BR_PUBLIC_ENTRY BrResRemove(void *vres); br_uint_8 BR_PUBLIC_ENTRY BrResClass(void *vres); br_uint_32 BR_PUBLIC_ENTRY BrResSize(void *vres); br_uint_32 BR_PUBLIC_ENTRY BrResSizeTotal(void *vres); typedef br_uint_32 BR_CALLBACK br_resenum_cbfn(void *vres, void *arg); br_uint_32 BR_PUBLIC_ENTRY BrResChildEnum(void *vres, br_resenum_cbfn *callback, void *arg); /* * Block operations */ void BR_ASM_CALL BrBlockFill(void *dest_ptr, int value, int dwords); void BR_ASM_CALL BrBlockCopy(void *dest_ptr, void *src_ptr, int dwords); #if BR_HAS_FAR void BR_ASM_CALL BrFarBlockCopy(void __far *dest_ptr, void *src_ptr, int dwords); #endif /* * Scratchpad buffer allocation - Currenty, only one allocation * may be outstanding at any time */ void *BR_PUBLIC_ENTRY BrScratchAllocate(br_size_t size); void BR_PUBLIC_ENTRY BrScratchFree(void *scratch); br_size_t BR_PUBLIC_ENTRY BrScratchInquire(void); void BR_PUBLIC_ENTRY BrScratchFlush(void); /* * Utility "FindFailed" callbacks that can be used to automaticaly load * models/materials/maps/tables from the filesystem */ br_pixelmap *BR_CALLBACK BrMapFindFailedLoad(char *name); br_pixelmap *BR_CALLBACK BrTableFindFailedLoad(char *name); br_model *BR_CALLBACK BrModelFindFailedLoad(char *name); br_material *BR_CALLBACK BrMaterialFindFailedLoad(char *name); /* * Backwards comaptibility */ #define BrModelPrepare BrModelUpdate #define BrMaterialPrepare BrMaterialUpdate #define BrMapPrepare BrMapUpdate #define BrTablePrepare BrTableUpdate /* * Error retrieval */ br_error BR_PUBLIC_ENTRY BrGetLastError(void **valuep); #endif /* _NO_PROTOTYPES */ #ifdef __cplusplus }; #endif #endif ================================================ FILE: bren/inc/g386ifix.h ================================================ /* * Copyright (c) 1992,1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: g386ifix.h 1.6 1995/02/22 21:37:10 sam Exp $ * $Locker: $ * * Inline fixed point maths for GNU-C (386) */ /* * Old version using inline functions */ #if 0 __inline static const long IFixedMul(long a, long b) { register long __r; __asm ( "imull %2\n" "shrdl $16,%%edx,%%eax\n" : "=a" (__r) : "0" (a), "rm" (b) : "eax", "edx", "cc"); return __r; } __inline static const long IFixedDiv(long a, long b) { register long __r; __asm ( "movl %%eax,%%edx\n" "shll $16,%%eax\n" "sarl $16,%%edx\n" "idivl %2\n" : "=a" (__r) /* outputs */ : "0" (a), "rm" (b) /* inputs */ : "eax", "edx", "cc" /* uses */ ); return __r; } __inline static const long IFixedDivR(long a, long b) { register long __r; __asm ( "cdq\n" "xchg %%edx,%%eax\n" "shrdl $16,%%edx,%%eax\n" "sarl $16,%%edx\n" "idivl %2\n" : "=a" (__r) : "0" (a), "rm" (b) : "eax", "edx", "cc"); return __r; } __inline static const long IFixedDivF(long a, long b) { register long __r; __asm ( "xorl %%eax,%%eax\n" "sarl $1,%%edx\n" "rcrl $1,%%eax\n" "divl %2\n" : "=a" (__r) : "d" (a), "rm" (b) : "eax", "edx", "cc"); return __r; } __inline static const long IFixedRcp(long a) { register long __r; __asm ( "movl $1,%%edx\n" "xorl %%eax,%%eax\n" "idivl %1\n" : "=a" (__r) : "rm" (a) : "eax", "edx", "cc"); return __r; } __inline static const long IFixedMulDiv(long a, long b, long c) { register long __r; __asm ( "imull %2\n" "idivl %3\n" : "=a" (__r) : "0" (a), "rm" (b), "rm" (c) : "eax", "edx", "cc"); return __r; } __inline static const long IFixedMac2( long a, long b, long c, long d) { register long __r; __asm ( "imull %2\n" "movl %%eax,%%ebx\n" "movl %%edx,%%ecx\n" "movl %3,%%eax\n" "imull %4\n" "addl %%ebx,%%eax\n" "adcl %%ecx,%%edx\n" "shrdl $16,%%edx,%%eax\n" : "=a" (__r) : "0" (a), "rm" (b), "rm" (c), "rm" (d) : "eax", "ebx", "ecx", "edx", "cc"); return __r; } __inline static const long IFixedMac3( long a, long b, long c, long d, long e, long f) { register long __r; __asm ( "imull %2\n" "movl %%eax,%%ebx\n" "movl %%edx,%%ecx\n" "movl %3,%%eax\n" "imull %4\n" "addl %%eax,%%ebx\n" "adcl %%edx,%%ecx\n" "movl %5,%%eax\n" "imull %6\n" "addl %%ebx,%%eax\n" "adcl %%ecx,%%edx\n" "shrdl $16,%%edx,%%eax\n" : "=a" (__r) : "0" (a), "rm" (b), "rm" (c), "rm" (d), "rm" (e), "rm" (f) : "eax", "ebx", "ecx", "edx", "cc"); return __r; } __inline static const long IFixedMac4( long a, long b, long c, long d, long e, long f, long g, long h) { register long __r; __asm ( "imull %2\n" "movl %%eax,%%ebx\n" "movl %%edx,%%ecx\n" "movl %3,%%eax\n" "imull %4\n" "addl %%eax,%%ebx\n" "adcl %%edx,%%ecx\n" "movl %5,%%eax\n" "imull %6\n" "addl %%eax,%%ebx\n" "adcl %%edx,%%ecx\n" "movl %7,%%eax\n" "imull %8\n" "addl %%ebx,%%eax\n" "adcl %%ecx,%%edx\n" "shrdl $16,%%edx,%%eax\n" : "=a" (__r) : "0" (a), "rm" (b), "rm" (c), "rm" (d), "rm" (e), "rm" (f), "rm" (g), "rm" (h) : "eax", "ebx", "ecx", "edx", "cc"); return __r; } __inline static const long IFixedSqr(long a) { __asm ( "imull %%eax\n" "shrdl $16,%%edx,%%eax\n" : "=a" (a) : "0" (a) : "eax", "edx", "cc"); return a; } __inline static const long IFixedSqr2(long a, long b) { register long __r; __asm ( "imull %%eax\n" "movl %%eax,%%ebx\n" "movl %%edx,%%ecx\n" "movl %2,%%eax\n" "imull %%eax\n" "addl %%ebx,%%eax\n" "adcl %%ecx,%%edx\n" "shrdl $16,%%edx,%%eax\n" : "=a" (__r) : "0" (a), "rm" (b) : "eax", "ebx", "ecx", "edx", "cc"); return __r; } __inline static const long IFixedSqr3( long a, long b,long c) { register long __r; __asm ( "imull %%eax\n" "movl %%eax,%%ebx\n" "movl %%edx,%%ecx\n" "movl %2,%%eax\n" "imull %%eax\n" "addl %%eax,%%ebx\n" "adcl %%edx,%%ecx\n" "movl %3,%%eax\n" "imull %%eax\n" "addl %%ebx,%%eax\n" "adcl %%ecx,%%edx\n" "shrdl $16,%%edx,%%eax\n" : "=a" (__r) : "0" (a), "rm" (b), "rm" (c) : "eax", "ebx", "ecx", "edx", "cc"); return __r; } __inline static const long IFixedSqr4( long a, long b, long c, long d) { register long __r; __asm ( "imull %%eax\n" "movl %%eax,%%ebx\n" "movl %%edx,%%ecx\n" "movl %2,%%eax\n" "imull %%eax\n" "addl %%eax,%%ebx\n" "adcl %%edx,%%ecx\n" "movl %3,%%eax\n" "imull %%eax\n" "addl %%eax,%%ebx\n" "adcl %%edx,%%ecx\n" "movl %4,%%eax\n" "imull %%eax\n" "addl %%ebx,%%eax\n" "adcl %%ecx,%%edx\n" "shrdl $16,%%edx,%%eax\n" : "=a" (__r) : "0" (a), "rm" (b), "rm" (c), "rm" (d) : "eax", "ebx", "ecx", "edx", "cc"); return __r; } #define BrFixedMul(a, b) IFixedMul(a, b) #define BrFixedMac2(a, b, c, d) IFixedMac2(a, b, c, d) #define BrFixedMac3(a, b, c, d, e, f) IFixedMac3(a, b, c, d, e, f) #define BrFixedMac4(a, b, c, d, e, f, g, h) IFixedMac4(a, b, c, d, e, f, g, h) #define BrFixedDiv(a, b) IFixedDiv(a, b) #define BrFixedDivR(a, b) IFixedDivR(a, b) #define BrFixedDivF(a, b) IFixedDivF(a, b) #define BrFixedMulDiv(a, b, c) IFixedMulDiv(a, b, c) #define BrFixedRcp(a) IFixedRcp(a) #define BrFixedSqr(a) IFixedSqr(a) #define BrFixedSqr2(a, b) IFixedSqr2(a, b) #define BrFixedSqr3(a, b, c) IFixedSqr3(a, b, c) #define BrFixedSqr4(a, b, c, d) IFixedSqr4(a, b, c, d) #endif /* * New version using direct expansion */ #if 0 #define BrFixedMul(__a, __b) \ ({ \ long __r; \ \ __asm(" imull %2\n" \ " shrdl $16,%%edx,%%eax\n" \ : "=a"(__r) \ : "0"((long)(__a)), "rm"((long)(__b)) \ : "edx", "cc"); \ \ __r; \ }) #define BrFixedDiv(__a, __b) \ ({ \ register long __r; \ \ __asm(" movl %%eax,%%edx\n" \ " shll $16,%%eax\n" \ " sarl $16,%%edx\n" \ " idivl %2\n" \ : "=a"(__r) \ : "a"((long)(__a)), "rm"((long)(__b)) \ : "edx", "cc"); \ \ __r; \ }) #define BrFixedMulDiv(__a, __b, __c) \ ({ \ register long __r; \ \ __asm("imull %2\n" \ "idivl %3\n" \ : "=a"(__r) \ : "0"((long)(__a)), "rm"((long)(__b)), "rm"((long)(__c)) \ : "edx", "cc"); \ \ __r; \ }) #define BrFixedMac2(__a, __b, __c, __d) \ ({ \ register long __r; \ \ __asm("imull %2\n" \ "movl %%eax,%%ebx\n" \ "movl %%edx,%%ecx\n" \ \ "movl %3,%%eax\n" \ "imull %4\n" \ "addl %%ebx,%%eax\n" \ "adcl %%ecx,%%edx\n" \ "shrdl $16,%%edx,%%eax\n" \ : "=a"(__r) \ : "0"((long)(__a)), "rm"((long)(__b)), "rm"((long)(__c)), "rm"((long)(__d)) \ : "ebx", "ecx", "edx", "cc"); \ \ __r; \ }) #define BrFixedMac3(__a, __b, __c, __d, __e, __f) \ ({ \ register long __r; \ \ __asm("imull %2\n" \ "movl %%eax,%%ebx\n" \ "movl %%edx,%%ecx\n" \ \ "movl %3,%%eax\n" \ "imull %4\n" \ "addl %%eax,%%ebx\n" \ "adcl %%edx,%%ecx\n" \ \ "movl %5,%%eax\n" \ "imull %6\n" \ "addl %%ebx,%%eax\n" \ "adcl %%ecx,%%edx\n" \ \ "shrdl $16,%%edx,%%eax\n" \ : "=a"(__r) \ : "0"((long)(__a)), "rm"((long)(__b)), "rm"((long)(__c)), "rm"((long)(__d)), "rm"((long)(__e)), \ "rm"((long)(__f)) \ : "ebx", "ecx", "edx", "cc"); \ \ __r; \ }) #define BrFixedMac4(__a, __b, __c, __d, __e, __f, __g, __h) \ ({ \ register long __r; \ \ __asm("imull %2\n" \ "movl %%eax,%%ebx\n" \ "movl %%edx,%%ecx\n" \ \ "movl %3,%%eax\n" \ "imull %4\n" \ "addl %%eax,%%ebx\n" \ "adcl %%edx,%%ecx\n" \ \ "movl %5,%%eax\n" \ "imull %6\n" \ "addl %%eax,%%ebx\n" \ "adcl %%edx,%%ecx\n" \ \ "movl %7,%%eax\n" \ "imull %8\n" \ "addl %%ebx,%%eax\n" \ "adcl %%ecx,%%edx\n" \ \ "shrdl $16,%%edx,%%eax\n" \ : "=a"(__r) \ : "0"((long)(__a)), "rm"((long)(__b)), "rm"((long)(__c)), "rm"((long)(__d)), "rm"((long)(__e)), \ "rm"((long)(__f)), "rm"((long)(__g)), "rm"((long)(__h)) \ : "ebx", "ecx", "edx", "cc"); \ \ __r; \ }) #endif ================================================ FILE: bren/inc/hton.h ================================================ /* * Copyright (c) 1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: hton.h 1.2 1995/02/22 21:37:11 sam Exp $ * $Locker: $ * * Converting 'network' (little endian) byte order to host order * */ #ifndef _HTON_H_ #define _HTON_H_ #ifdef __cplusplus extern "C" { #endif /* * Mac is in network order already */ #if defined(__MPW__) || defined(__THINKC__) #define htonl(x) (x) #define ntohl(x) (x) #define htons(x) (x) #define ntohs(x) (x) typedef float net_float; #define htonf(x) (x) #define ntohf(x) (x) #endif /* * PC is big-endian */ #if defined(__GNUC__) || defined(__WATCOMC__) || defined(__ZTC__) long bswapl(long l); short bswaps(short s); float bswapf(float f); #define ntohl(x) bswapl(x) #define htonl(x) bswapl(x) #define ntohs(x) bswaps(x) #define htons(x) bswaps(x) typedef float net_float; #define htonf(x) bswapf(x) #define ntohf(x) bswapf(x) #endif #ifdef __cplusplus }; #endif #endif ================================================ FILE: bren/inc/light.h ================================================ /* * Copyright (c) 1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: light.h 1.6 1995/05/25 13:37:32 sam Exp $ * $Locker: $ * * Definitons for a light */ #ifndef _LIGHT_H_ #define _LIGHT_H_ #ifdef __cplusplus extern "C" { #endif enum { /* * Type of light */ BR_LIGHT_TYPE = 0x0003, BR_LIGHT_POINT = 0x0000, BR_LIGHT_DIRECT = 0x0001, BR_LIGHT_SPOT = 0x0002, /* * Flag idicating that caluculations are done in view space */ BR_LIGHT_VIEW = 0x0004 }; typedef struct br_light { /* * Optional identifier */ char *identifier; /* * Type of light */ br_uint_8 type; /* * Colour of light (if renderer supports it) */ br_colour colour; /* * Attenuation of light with distance - constant, linear, and quadratic * l & q only apply to point and spot lights */ br_scalar attenuation_c; br_scalar attenuation_l; br_scalar attenuation_q; /* * Cone angles for spot light */ br_angle cone_outer; br_angle cone_inner; } br_light; #ifdef __cplusplus }; #endif #endif ================================================ FILE: bren/inc/material.h ================================================ /* * Copyright (c) 1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: material.h 1.19 1995/05/25 13:37:32 sam Exp $ * $Locker: $ * * Describes the appearance of a material than can be applied to a surface */ #ifndef _MATERIAL_H_ #define _MATERIAL_H_ #ifdef __cplusplus extern "C" { #endif typedef struct br_material { char *identifier; br_colour colour; br_uint_8 opacity; br_ufraction ka; br_ufraction kd; br_ufraction ks; /* * Specular power */ br_scalar power; /* * Controls how texture is rendered */ br_uint_32 flags; /* * 2x3 transform applied to model U,V */ br_matrix23 map_transform; /* * The direct index ramp base and range */ br_uint_8 index_base; br_uint_8 index_range; /* * Pointers to colour map */ br_pixelmap *colour_map; /* * Pointers to tables */ br_pixelmap *screendoor; /* Screen door opacity */ br_pixelmap *index_shade; /* Index shading */ br_pixelmap *index_blend; /* Index blending */ /* * Private fields */ br_uint_8 prep_flags; void *rptr; } br_material; /* * Bits for br_material->flags */ enum { BR_MATF_LIGHT = 0x00000001, BR_MATF_PRELIT = 0x00000002, BR_MATF_SMOOTH = 0x00000004, BR_MATF_ENVIRONMENT_I = 0x00000008, BR_MATF_ENVIRONMENT_L = 0x00000010, BR_MATF_PERSPECTIVE = 0x00000020, BR_MATF_DECAL = 0x00000040, BR_MATF_I_FROM_U = 0x00000080, BR_MATF_I_FROM_V = 0x00000100, BR_MATF_U_FROM_I = 0x00000200, BR_MATF_V_FROM_I = 0x00000400, BR_MATF_ALWAYS_VISIBLE = 0x00000800, BR_MATF_TWO_SIDED = 0x00001000, BR_MATF_FORCE_Z_0 = 0x00002000, BR_MATF_DITHER = 0x00004000 #if 0 BR_MATF_CUSTOM = 0x00008000 #endif }; /* * Backwards compatibility */ #define BR_MATF_GOURAUD BR_MATF_SMOOTH #define BR_MATF_MAP_COLOUR 0 /* * Flags to BrMaterialUpdate() */ enum { BR_MATU_MAP_TRANSFORM = 0x0001, BR_MATU_RENDERING = 0x0002, BR_MATU_LIGHTING = 0x0004, BR_MATU_COLOURMAP = 0x0008, BR_MATU_ALL = 0x7fff }; /* * Flags to BrMapUpdate() */ enum { BR_MAPU_ALL = 0x7fff }; /* * Flags to BrTableUpdate() */ enum { BR_TABU_ALL = 0x7fff }; #ifdef __cplusplus }; #endif #endif ================================================ FILE: bren/inc/matrix.h ================================================ /* * Copyright (c) 1992,1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: matrix.h 1.3 1995/02/22 21:37:13 sam Exp $ * $Locker: $ * * Structrures describing matrices */ #ifndef _MATRIX_H_ #define _MATRIX_H_ #ifdef __cplusplus extern "C" { #endif typedef struct br_matrix4 { br_scalar m[4][4]; } br_matrix4; typedef struct br_matrix34 { br_scalar m[4][3]; } br_matrix34; typedef struct br_matrix23 { br_scalar m[3][2]; } br_matrix23; #ifdef __cplusplus }; #endif #endif ================================================ FILE: bren/inc/model.h ================================================ /* * Copyright (c) 1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: model.h 1.19 1995/05/25 13:37:34 sam Exp $ * $Locker: $ * * In-memory structures for models, both public and private areas */ #ifndef _MODEL_H_ #define _MODEL_H_ #ifdef __cplusplus extern "C" { #endif typedef struct br_vertex { br_vector3 p; /* Point in model space */ br_vector2 map; /* Mapping coordinates */ /* * Index for prelit models */ br_uint_8 index; /* * true colour for pre-lit models */ br_uint_8 red; br_uint_8 grn; br_uint_8 blu; /* * Private fields */ br_uint_16 r; br_fvector3 n; /* Surface normal at vertex */ } br_vertex; typedef struct br_face { br_uint_16 vertices[3]; /* Vertices around face */ br_uint_16 edges[3]; /* Edges around face */ br_material *material; /* Face material (or NULL) */ br_uint_16 smoothing; /* Controls if shared edges are smooth */ br_uint_8 flags; /* Bits 0,1 and 2 denote internal edges */ br_uint_8 _pad0; br_fvector3 n; /* Plane equation of face */ br_scalar d; } br_face; /* * Bits for face flags */ enum { BR_FACEF_COPLANAR_0 = 0x01, /* The face adjoining edge 0 is coplanar with this face */ BR_FACEF_COPLANAR_1 = 0x02, /* "" 1 "" */ BR_FACEF_COPLANAR_2 = 0x04 /* "" 1 "" */ }; typedef struct br_face_group { br_material *material; /* Group material (or NULL) */ br_face *faces; /* faces in group */ br_uint_16 nfaces; /* Number of faces in a group */ } br_face_group; typedef struct br_vertex_group { br_material *material; /* Group material (or NULL) */ br_vertex *vertices; /* vertices in group */ br_uint_16 nvertices; /* Number of vertices in a group */ } br_vertex_group; /* * Callback function type for custom models */ struct br_actor; struct br_model; struct br_material; typedef void BR_CALLBACK br_model_custom_cbfn(struct br_actor *actor, struct br_model *model, struct br_material *material, br_uint_8 style, int on_screen, br_matrix34 *model_to_view, br_matrix4 *model_to_screen); typedef struct br_model { char *identifier; br_vertex *vertices; br_face *faces; br_uint_16 nvertices; br_uint_16 nfaces; /* * Offset of model's pivot point (where it attaches to parent) */ br_vector3 pivot; /* * Flags describing what is allowed in ModelPrepare() */ br_uint_16 flags; /* * Application call */ br_model_custom_cbfn *custom; /* * Application defined data - untouched by system */ void *user; /* * Generated by ModelUpdate */ /* * Bounding radius of model from origin */ br_scalar radius; /* * Axis-aligned box that bound model in model coords */ br_bounds bounds; /* * Vertices and faces that have been sorted * into groups, removing conflicts at material boundaries * and smoothign groups */ br_uint_16 nprepared_vertices; br_uint_16 nprepared_faces; br_face *prepared_faces; br_vertex *prepared_vertices; /* * Groups of faces and vertices, by material */ br_uint_16 nface_groups; br_uint_16 nvertex_groups; br_face_group *face_groups; br_vertex_group *vertex_groups; /* * Upper limit on the face->edges[] entries */ br_uint_16 nedges; /* * Pointers to tables that map prepared face and vertex indexes * back to original face index * * Only generated if BR_MODF_GENERATE_TAGS is set */ br_uint_16 *face_tags; br_uint_16 *vertex_tags; /* * Private fields */ br_uint_32 prep_flags; br_uint_16 *smooth_strings; void *rptr; } br_model; /* * Bits for br_model->flags */ enum { BR_MODF_DONT_WELD = 0x0001, /* Vertices with same x,y,z cannot be merged */ BR_MODF_KEEP_ORIGINAL = 0x0002, /* Don't release model->faces/vertices during ModelUpdate() */ BR_MODF_GENERATE_TAGS = 0x0004, /* Allocate and fill in the face and vertex tag structures */ BR_MODF_QUICK_UPDATE = 0x0010, /* ModelUpdate is fast - but may produce slower models */ BR_MODF_CUSTOM = 0x0020, /* Invoke custom callback for this model */ BR_MODF_PREPREPARED = 0x0040 /* Model structure is pre-prepared - update performs no work */ }; /* * Flags to BrModelUpdate() */ enum { BR_MODU_NORMALS = 0x0001, BR_MODU_EDGES = 0x0002, BR_MODU_RADIUS = 0x0004, BR_MODU_GROUPS = 0x0008, BR_MODU_BOUNDING_BOX = 0x0010, BR_MODU_MATERIALS = 0x0020, BR_MODU_ALL = 0x7fff }; /* * Backwards compatibility */ #define BR_MPREP_NORMALS BR_MODU_NORMALS #define BR_MPREP_EDGES BR_MODU_EDGES #define BR_MPREP_RADIUS BR_MODU_RADIUS #define BR_MPREP_GROUPS BR_MODU_GROUPS #define BR_MPREP_BOUNDING_BOX BR_MODU_BOUNDING_BOX #define BR_MPREP_ALL BR_MODU_ALL /* * Values for BrModelApplyMap() */ enum br_apply_map_types { BR_APPLYMAP_PLANE, BR_APPLYMAP_SPHERE, BR_APPLYMAP_CYLINDER, BR_APPLYMAP_DISC, BR_APPLYMAP_NONE }; /* * Axis values for BrModelFitMap() */ enum br_fitmap_axis { BR_FITMAP_PLUS_X, BR_FITMAP_PLUS_Y, BR_FITMAP_PLUS_Z, BR_FITMAP_MINUS_X, BR_FITMAP_MINUS_Y, BR_FITMAP_MINUS_Z }; #ifdef __cplusplus }; #endif #endif /* * Local Variables: * tab-width: 4 * End: */ ================================================ FILE: bren/inc/mscifix.h ================================================ /* * Copyright (c) 1992,1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: mscifix.h 1.2 1995/02/22 21:37:15 sam Exp $ * $Locker: $ * * Inline fixed point ops for Microsoft Visual C++ * */ ================================================ FILE: bren/inc/pixelmap.h ================================================ /* * Copyright (c) 1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: pixelmap.h 1.15 1995/06/30 16:08:58 sam Exp $ * $Locker: sam $ * * A stopgap 2D pixelmap structure for brender. This should really be the * pixelmap data type from the underlying 2D system (whatever that will * be) * * Used for input (maps) and output (render buffer) */ #ifndef _PIXELMAP_H_ #define _PIXELMAP_H_ #ifdef __cplusplus extern "C" { #endif /* * Various types of pixel */ enum { /* * Each pixel is an index into a colour map */ BR_PMT_INDEX_1, BR_PMT_INDEX_2, BR_PMT_INDEX_4, BR_PMT_INDEX_8, /* * True colour RGB */ BR_PMT_RGB_555, /* 16 bits per pixel */ BR_PMT_RGB_565, /* 16 bits per pixel */ BR_PMT_RGB_888, /* 24 bits per pixel */ BR_PMT_RGBX_888, /* 32 bits per pixel */ BR_PMT_RGBA_8888, /* 32 bits per pixel */ /* * YUV */ BR_PMT_YUYV_8888, /* YU YV YU YV ... */ BR_PMT_YUV_888, /* * Depth */ BR_PMT_DEPTH_16, BR_PMT_DEPTH_32, /* * Opacity */ BR_PMT_ALPHA_8, /* * Opacity + Index */ BR_PMT_INDEXA_88, /* * Bump maps */ BR_PMT_NORMAL_INDEX_8, BR_PMT_NORMAL_XYZ, /* * Wrong way around 15 bit true colour */ BR_PMT_BGR_555, }; /* * pixelmap flags */ enum { /* * No direct access to pixels */ BR_PMF_NO_ACCESS = 0x01, BR_PMF_LINEAR = 0x02, BR_PMF_ROW_WHOLEPIXELS = 0x04 }; typedef struct br_pixelmap { /* * Optional identifier (when maps used as textures/tables etc.) */ char *identifier; /* * pointer to raw pixel data */ void *pixels; br_uint_32 _reserved0; /* * Optional pixel map when pixels are indexed. */ struct br_pixelmap *map; /* * Byte difference between pixels at same column of adjacent rows */ br_int_16 row_bytes; /* * Type of pixels */ br_uint_8 type; /* * Flags */ br_uint_8 flags; /* * top left visible region in pixels from pixel at 'pixel' pointer */ br_uint_16 base_x; br_uint_16 base_y; /* * Width and height of bitmap in pixels */ br_uint_16 width; br_uint_16 height; /* * Local origin for any graphics system rendering into map, relative * to 'base' */ br_int_16 origin_x; br_int_16 origin_y; /* * Device pointer - if pixelmap originated from a device */ void *context; } br_pixelmap; /* * Flags to BrPixelMapAllocate */ enum br_pixelmap_allocate_flags { BR_PMAF_INVERTED = 0x0001, /* Setup pixelmap so that 0th scanline is at high memory */ BR_PMAF_NORMAL = 0x0000 /* Setup pixelmap so that 0th scanline is at low memory */ }; /* * Channel flags */ enum br_pixelmap_channel_mask { BR_PMCHAN_INDEX = 0x0001, BR_PMCHAN_RGB = 0x0002, BR_PMCHAN_DEPTH = 0x0004, BR_PMCHAN_ALPHA = 0x0008, BR_PMCHAN_YUV = 0x0010 }; /* * Matching pixelmap types */ enum br_pmmatch_type { BR_PMMATCH_OFFSCREEN, BR_PMMATCH_DEPTH_16, BR_PMMATCH_MAX }; #ifdef __cplusplus }; #endif #endif ================================================ FILE: bren/inc/pool.h ================================================ /* * Copyright (c) 1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: pool.h 1.7 1995/02/22 21:37:18 sam Exp $ * $Locker: $ * * Fixed size block pools */ #ifndef _POOL_H_ #define _POOL_H_ #ifdef __cplusplus extern "C" { #endif #define BR_POOL_DEBUG 0 #define BR_POOL_ALIGN 7 typedef struct br_pool_block { struct br_pool_block *next; } br_pool_block; typedef struct br_pool { br_pool_block *free; br_uint_32 block_size; br_uint_32 chunk_size; int mem_type; #if BR_POOL_DEBUG br_uint_32 max_count; br_uint_32 count; #endif } br_pool; /* * Speedup macros */ #if 0 #if !POOL_DEBUG br_pool_block *__bp; /* Hmm, this global is not optimizer friendly */ #define BrPoolAllocate(pool) \ (void *)(((pool)->free ? 0 : BrPoolAddChunk(pool)), (__bp = (pool)->free), ((pool)->free = __bp->next, __bp)) #define BrPoolFree(pool, bp) ((bp)->next = (pool)->free, (pool)->free = (bp)) #endif #endif #ifdef __cplusplus }; #endif #endif ================================================ FILE: bren/inc/position.h ================================================ /* * Copyright (c) 1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: position.h 1.3 1995/02/22 21:37:19 sam Exp $ * $Locker: $ * * Structure descibing a position in 3D space - used for actors */ #ifndef _POSITION_H_ #define _POSITION_H_ #ifdef __cplusplus extern "C" { #endif /* * Type of actor position */ enum p3d_actor_position_type { P3D_POSITION_IDENTITY, P3D_POSITION_TRANSFORM, P3D_POSITION_EULER, P3D_POSITION_QUATERNION, P3D_POSITION_TRANSLATION, P3D_POSITION_LOOK_UP }; struct p3d_position { /* * Type of position */ uint_16 t; /* * Union of the various means of describing a position */ union { /* * General matrix - (XXX Should also have affine (3x4)) */ struct p3d_transform transform; /* * Euler angles and translation */ struct { struct p3d_euler e; point3 t; } euler; /* * Unit quaternion and translation */ struct { struct p3d_quaternion q; point3 t; } quaternion; /* * Lookat vector, up vector and translation */ struct { vector3 look; vector3 up; point3 t; } look; /* * Just a translation */ struct { point3 t; } translation; } p; }; #ifdef __cplusplus }; #endif #endif ================================================ FILE: bren/inc/qhton.h ================================================ /* * Copyright (c) 1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: qhton.h 1.2 1995/02/22 21:37:20 sam Exp $ * $Locker: $ * * Converting 'network' (little endian) byte order to host order * * This is a private implemenation - some platforms do not provide * this functionality. For those that do, this file should define * the operations in terms of the platform specific API */ #ifndef _QHTON_H_ #define _QHTON_H_ #ifdef __cplusplus extern "C" { #endif /* * Mac is in network order already * * XXX SANE format */ #if defined(__MPW__) || defined(__THINKC__) #define HTONL(x) (x) #define NTOHL(x) (x) #define HTONS(x) (x) #define NTOHS(x) (x) typedef float net_float; #define HTONF(x) (x) #define NTOHF(x) (x) #endif /* * PC is big-endian */ #if defined(__GNUC__) || defined(__WATCOMC__) || defined(__ZTC__) long bswapl(long l); short bswaps(short s); float bswapf(float f); #define NTOHL(x) bswapl(x) #define HTONL(x) bswapl(x) #define NTOHS(x) bswaps(x) #define HTONS(x) bswaps(x) typedef float net_float; #define HTONF(x) bswapf(x) #define NTOHF(x) bswapf(x) #endif #ifdef __cplusplus }; #endif #endif ================================================ FILE: bren/inc/quantize.h ================================================ /* * Copyright (c) 1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: quantize.h 1.2 1995/02/22 21:37:21 sam Exp $ * $Locker: $ * * Definitons for image quantizing */ void BR_PUBLIC_ENTRY BrQuantBegin(void); void BR_PUBLIC_ENTRY BrQuantEnd(void); /* * add array of rgb values to quantizer */ void BR_PUBLIC_ENTRY BrQuantAddColours(br_uint_8 *colours, br_uint_32 size); /* * make optimum palette */ void BR_PUBLIC_ENTRY BrQuantMakePalette(int base, int num_entries, br_pixelmap *palette); /* * given palette with base and num_entries, setup internal map */ void BR_PUBLIC_ENTRY BrQuantPrepareMapping(int base, int num_entries, br_pixelmap *palette); /* * get index values for array of rgb values */ void BR_PUBLIC_ENTRY BrQuantMapColours(int base, br_uint_8 *colours, br_uint_8 *mapped_colours, int size); ================================================ FILE: bren/inc/quat.h ================================================ /* * Copyright (c) 1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: quat.h 1.5 1995/02/22 21:37:21 sam Exp $ * $Locker: $ * * Type descibing a unit quaternion */ #ifndef _QUAT_H_ #define _QUAT_H_ #ifdef __cplusplus extern "C" { #endif typedef struct br_quat { br_scalar x; br_scalar y; br_scalar z; br_scalar w; } br_quat; #define BR_QUAT(x, y, z, w) \ { \ BR_SCALAR(x), BR_SCALAR(y), BR_SCALAR(z), BR_SCALAR(w) \ } #ifdef __cplusplus }; #endif #endif ================================================ FILE: bren/inc/scalar.h ================================================ /* * Copyright (c) 1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: scalar.h 1.20 1995/05/25 13:37:37 sam Exp $ * $Locker: $ * * Scalar type * * External defines: * * BASED_FIXED * True if system is based on signed 16.16 fixed point * * BASED_FLOAT * True if system is based on 32 bit floating point * * One of these must be defined and the appropriate libraries must be used */ #ifndef _SCALAR_H_ #define _SCALAR_H_ #ifdef __cplusplus extern "C" { #endif #if !defined(BASED_FIXED) #define BASED_FIXED 0 #endif #if !defined(BASED_FLOAT) #define BASED_FLOAT 0 #endif #if !BASED_FIXED && !BASED_FLOAT #undef BASED_FLOAT #define BASED_FLOAT 0 #undef BASED_FIXED #define BASED_FIXED 1 #endif /** ** Basic types - either fixed or float **/ #if BASED_FIXED /* * Reference an external symbol to make sure * the right library is linked */ extern int _BR_Fixed_Point_Scalar; /* * Fixed base types */ typedef br_fixed_ls br_scalar; typedef br_fixed_lsf br_fraction; typedef br_fixed_luf br_ufraction; #define BR_SCALAR_EPSILON 0x0001 #define BR_SCALAR_MAX 0x7fffffff #define BR_SCALAR_MIN 0x80000000 /* * Macros for static initialisation */ #define BR_SCALAR(x) ((br_scalar)(BR_ONE_LS * (x))) #define BR_FRACTION(x) ((br_fraction)((BR_ONE_LSF * (x)) >= BR_ONE_LSF ? BR_ONE_LSF - 1 : BR_ONE_LSF * (x))) #define BR_UFRACTION(x) ((br_ufraction)((BR_ONE_LUF * (x)) >= BR_ONE_LUF ? BR_ONE_LUF - 1 : BR_ONE_LUF * (x))) /* * Macros for type conversion */ #define BrFloatToScalar(f) ((br_scalar)((f) * (float)BR_ONE_LS)) #define BrScalarToFloat(s) ((s) / (float)BR_ONE_LS) #define BrIntToScalar(i) ((br_scalar)((i) * (int)BR_ONE_LS)) #define BrScalarToInt(s) ((s) / (int)BR_ONE_LS) #define BrFixedToScalar(f) (f) #define BrScalarToFixed(s) (s) #define BrFractionToScalar(f) ((br_scalar)((f)*2)) #define BrScalarToFraction(s) ((br_fraction)((s) / 2)) #define BrUFractionToScalar(f) ((br_scalar)(f)) #define BrScalarToUFraction(s) ((br_ufraction)(s)) /* * Various arithmetic operations */ #define BR_ADD(a, b) ((a) + (b)) #define BR_SUB(a, b) ((a) - (b)) #define BR_MUL(a, b) BrFixedMul(a, b) #define BR_SQR(a) BrFixedSqr(a) #define BR_ABS(a) BrFixedAbs(a) #define BR_DIV(a, b) BrFixedDiv(a, b) #define BR_DIVR(a, b) BrFixedDivR(a, b) #define BR_MULDIV(a, b, c) BrFixedMulDiv(a, b, c) #define BR_RCP(a) BrFixedRcp(a) #define BR_CONST_MUL(a, b) ((a) * (b)) #define BR_CONST_DIV(a, b) ((a) / (b)) #define BR_MAC2(a, b, c, d) BrFixedMac2(a, b, c, d) #define BR_MAC3(a, b, c, d, e, f) BrFixedMac3(a, b, c, d, e, f) #define BR_MAC4(a, b, c, d, e, f, g, h) BrFixedMac4(a, b, c, d, e, f, g, h) #define BR_MAC2DIV(a, b, c, d, e) BrFixedMac2Div(a, b, c, d, e) #define BR_MAC3DIV(a, b, c, d, e, f, g) BrFixedMac3Div(a, b, c, d, e, f, g) #define BR_MAC4DIV(a, b, c, d, e, f, g, h, i) BrFixedMac4Div(a, b, c, d, e, f, g, h, i) #define BR_SQR2(a, b) BrFixedSqr2(a, b) #define BR_SQR3(a, b, c) BrFixedSqr3(a, b, c) #define BR_SQR4(a, b, c, d) BrFixedSqr4(a, b, c, d) #define BR_FMAC2(a, b, c, d) BrFixedFMac2(a, b, c, d) #define BR_FMAC3(a, b, c, d, e, f) BrFixedFMac3(a, b, c, d, e, f) #define BR_FMAC4(a, b, c, d, e, f, g, h) BrFixedFMac4(a, b, c, d, e, f, g, h) #define BR_LENGTH2(a, b) BrFixedLength2(a, b) #define BR_LENGTH3(a, b, c) BrFixedLength3(a, b, c) #define BR_LENGTH4(a, b, c, d) BrFixedLength4(a, b, c, d) #define BR_RLENGTH2(a, b) BrFixedRLength2(a, b) #define BR_RLENGTH3(a, b, c) BrFixedRLength3(a, b, c) #define BR_RLENGTH4(a, b, c, d) BrFixedRLength4(a, b, c, d) #define BR_POW(a, b) BrFixedPow((a), (b)) #define BR_SQRT(a) BrFixedSqrt(a) #endif #if BASED_FLOAT /* * Reference an external symbol to make sure * the right library is linked */ extern int _BR_Floating_Point_Scalar; /* * Floating point base types */ typedef float br_scalar; typedef float br_fraction; typedef float br_ufraction; #define BR_SCALAR_EPSILON 1.192092896e-7f #define BR_SCALAR_MAX 3.402823466e+38f #define BR_SCALAR_MIN (-3.402823466e+38f) /* * Macros for static initialisation */ #define BR_SCALAR(x) ((br_scalar)(x)) #define BR_FRACTION(x) ((br_fraction)(x)) #define BR_UFRACTION(x) ((br_ufraction)(x)) /* * Macros for type conversion */ #define BrFloatToScalar(f) (f) #define BrScalarToFloat(c) (c) #define BrIntToScalar(i) ((br_scalar)(i)) #define BrScalarToInt(s) ((int)(s)) #define BrFixedToScalar(f) ((br_scalar)((f) / (float)BR_ONE_LS)) #define BrScalarToFixed(s) (br_fixed_ls)((s) * (br_scalar)BR_ONE_LS) #define BrFractionToScalar(f) (f) #define BrScalarToFraction(s) (s) #define BrUFractionToScalar(f) (f) #define BrScalarToUFraction(s) (s) #ifndef _NO_PROTOTYPES #if defined(_MSC_VER) && !defined(__H2INC__) #include #elif defined(__IBMC__) #include #else double fabs(double); double fabs(double); double sqrt(double); double cos(double); double sin(double); double acos(double); double asin(double); double atan2(double, double); #endif #endif /* * Various arithmetic operations */ #define BR_ADD(a, b) ((a) + (b)) #define BR_SUB(a, b) ((a) - (b)) #define BR_MUL(a, b) ((a) * (b)) #define BR_SQR(a) ((a) * (a)) #define BR_ABS(a) fabs(a) #define BR_DIV(a, b) ((a) / (b)) #define BR_DIVR(a, b) ((a) / (b)) #define BR_MULDIV(a, b, c) ((a) * (b) / (c)) #define BR_RCP(a) (1.0 / (a)) #define BR_CONST_MUL(a, b) ((a) * (b)) #define BR_CONST_DIV(a, b) ((a) / (b)) #define BR_MAC2(a, b, c, d) ((a) * (b) + (c) * (d)) #define BR_MAC3(a, b, c, d, e, f) ((a) * (b) + (c) * (d) + (e) * (f)) #define BR_MAC4(a, b, c, d, e, f, g, h) ((a) * (b) + (c) * (d) + (e) * (f) + (g) * (h)) #define BR_MAC2DIV(a, b, c, d, e) (((a) * (b) + (c) * (d)) / e) #define BR_MAC3DIV(a, b, c, d, e, f, g) (((a) * (b) + (c) * (d) + (e) * (f)) / g) #define BR_MAC4DIV(a, b, c, d, e, f, g, h, i) (((a) * (b) + (c) * (d) + (e) * (f) + (g) * (h)) / i) #define BR_SQR2(a, b) ((a) * (a) + (b) * (b)) #define BR_SQR3(a, b, c) ((a) * (a) + (b) * (b) + (c) * (c)) #define BR_SQR4(a, b, c, d) ((a) * (a) + (b) * (b) + (c) * (c) + (d) * (d)) #define BR_FMAC2(a, b, c, d) ((a) * (b) + (c) * (d)) #define BR_FMAC3(a, b, c, d, e, f) ((a) * (b) + (c) * (d) + (e) * (f)) #define BR_FMAC4(a, b, c, d, e, f, g, h) ((a) * (b) + (c) * (d) + (e) * (f) + (g) * (h)) #define BR_LENGTH2(a, b) sqrt((a) * (a) + (b) * (b)) #define BR_LENGTH3(a, b, c) sqrt((a) * (a) + (b) * (b) + (c) * (c)) #define BR_LENGTH4(a, b, c, d) sqrt((a) * (a) + (b) * (b) + (c) * (c) + (d) * (d)) #define BR_RLENGTH2(a, b) (1.0 / sqrt((a) * (a) + (b) * (b))) #define BR_RLENGTH3(a, b, c) (1.0 / sqrt((a) * (a) + (b) * (b) + (c) * (c))) #define BR_RLENGTH4(a, b, c, d) (1.0 / sqrt((a) * (a) + (b) * (b) + (c) * (c) + (d) * (d))) #define BR_POW(a, b) pow((a), (b)) #define BR_SQRT(a) sqrt(a) #endif /* * Make sure PI is defined */ #ifndef PI #define PI 3.14159265358979323846 #endif #ifdef __cplusplus }; #endif #endif ================================================ FILE: bren/inc/scale.h ================================================ /* * Copyright (c) 1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: scale.h 1.2 1995/02/22 21:37:23 sam Exp $ * $Locker: $ * * Definitons for image scaling */ void BR_PUBLIC_ENTRY BrScaleBegin(void); void BR_PUBLIC_ENTRY BrScaleEnd(void); /* * scale pixelmap src to new_x,new_y with filter width fwidth * src must be BR_PMT_RGB_888 */ br_pixelmap *BR_PUBLIC_ENTRY BrPixelmapScale(br_pixelmap *src, br_uint_32 new_x, br_uint_32 new_y, float fwidth); ================================================ FILE: bren/inc/tmap.h ================================================ /************************************************************************* Texture map (TMAP) This manages I/O and caching for BPMPs *************************************************************************/ #ifndef TMAP_H #define TMAP_H const CTG kctgTmap = 'TMAP'; const CTG kctgTxxf = 'TXXF'; // tmap on file struct TMAPF { short bo; short osk; short cbRow; byte type; byte grftmap; short xpLeft; short ypTop; short dxp; short dyp; short xpOrigin; short ypOrigin; // void *rgb; // pixels follow immediately after TMAPF }; const ulong kbomTmapf = 0x54555000; /* A TeXture XransForm on File */ typedef struct _txxff { short bo; // byte order short osk; // OS kind BMAT23 bmat23; } TXXFF, *PTXXFF; const BOM kbomTxxff = 0x5FFF0000; // REVIEW *****: should TMAPs have shade table chunks under them, or // is the shade table a global animal? Right now it's global. /**************************************** The TMAP class ****************************************/ typedef class TMAP *PTMAP; #define TMAP_PAR BACO #define kclsTMAP 'TMAP' class TMAP : public TMAP_PAR { RTCLASS_DEC ASSERT MARKMEM protected: BPMP _bpmp; bool _fImported; // if fTrue, BRender allocated the pixels // if fFalse, we allocated the pixels protected: TMAP(void) { } // can't instantiate directly; must use PtmapRead #ifdef NOT_YET_REVIEWED void TMAP::_SortInverseTable(byte *prgb, long cbRgb, BRCLR brclrLo, BRCLR brclrHi); #endif // NOT_YET_REVIEWED public: ~TMAP(void); // REVIEW *****(peted): MBMP's ...Read function just takes a PBLCK; this // is more like the FRead... function, just without the BACO stuff. Why // the difference? // Addendum: to enable compiling 'TMAP' chunks, I added an FWrite that does // take just a PBLCK. Should this be necessary for PtmapRead in the future, // it's a simple matter of extracting the code in PtmapRead that is needed, // like I did for FWrite. static PTMAP PtmapRead(PCFL pcfl, CTG ctg, CNO cno); bool FWrite(PCFL pcfl, CTG ctg, CNO *pcno); // a chunky resource reader for a TMAP static bool FReadTmap(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb); // Given a BPMP (a Brender br_pixelmap), create a TMAP static PTMAP PtmapNewFromBpmp(BPMP *pbpmp); // Give back the bpmp for this TMAP BPMP *Pbpmp(void) { return &_bpmp; } // Reads a .bmp file. static PTMAP PtmapReadNative(FNI *pfni, PGL pglclr = pvNil); // Writes a standalone TMAP-chunk file (not a .chk) bool FWriteTmapChkFile(PFNI pfniDst, bool fCompress, PMSNK pmsnkErr = pvNil); // Creates a TMAP from the width, height, and an array of bytes static PTMAP PtmapNew(byte *prgbPixels, long dxWidth, long dxHeight); // Some useful file methods long CbOnFile(void) { return (size(TMAPF) + LwMul(_bpmp.row_bytes, _bpmp.height)); } bool FWrite(PBLCK pblck); #ifdef NOT_YET_REVIEWED // Useful shade-table type method byte *PrgbBuildInverseTable(void); #endif // NOT_YET_REVIEWED }; #endif // TMAP_H ================================================ FILE: bren/inc/transfrm.h ================================================ /* * Copyright (c) 1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: transfrm.h 1.11 1995/02/22 21:37:24 sam Exp $ * $Locker: $ * * Structure describing an affine transform from one coordinate space * to another */ #ifndef _TRANSFRM_H_ #define _TRANSFRM_H_ #ifdef __cplusplus extern "C" { #endif /* * Type of actor position */ enum { BR_TRANSFORM_MATRIX34, BR_TRANSFORM_MATRIX34_LP, BR_TRANSFORM_QUAT, BR_TRANSFORM_EULER, BR_TRANSFORM_LOOK_UP, BR_TRANSFORM_TRANSLATION, BR_TRANSFORM_IDENTITY, BR_TRANSFORM_MAX }; typedef struct br_transform { /* * Type of position */ br_uint_16 type; /* * Union of the various means of describing a transform - * these are explicity arrranged so that any exlicit transform * will always be available as br_transform.t.translate */ union { /* * Affine 3x4 matrix */ br_matrix34 mat; /* * Euler angles and translation */ struct { br_euler e; br_scalar _pad[7]; br_vector3 t; } euler; /* * Unit quaternion and translation */ struct { br_quat q; br_scalar _pad[5]; br_vector3 t; } quat; /* * Lookat vector, up vector and translation */ struct { br_vector3 look; br_vector3 up; br_scalar _pad[3]; br_vector3 t; } look_up; /* * Just a translation */ struct { br_scalar _pad[9]; br_vector3 t; } translate; } t; } br_transform; #ifdef __cplusplus }; #endif #endif ================================================ FILE: bren/inc/traverse.h ================================================ /* * Copyright (c) 1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: traverse.h 1.2 1995/02/22 21:37:24 sam Exp $ * $Locker: $ * * Definitons for an traversals */ #ifndef _TRAVERSE_H_ #define _TRAVERSE_H_ #ifdef __cplusplus extern "C" { #endif /* * The system traversal types */ enum { BR_TRAVERSE_RENDER = 0x0001, BR_TRAVERSE_UPDATE = 0x0002, BR_TRAVERSE_COLLIDE = 0x0004, BR_TRAVERSE_PICK = 0x0008, BR_TRAVERSE_FIND = 0x0010, BR_TRAVERSE_BOUNDS = 0x0020, /* * Starting point for user defined values */ BR_TRAVERSE_USER_0 = 0x0100, }; /* * Return flags from actor.traverse callback */ enum { BR_TRAVERSE_ACTOR = 0x0001, BR_TRAVERSE_CHILDREN = 0x0002, }; #ifdef __cplusplus }; #endif #endif ================================================ FILE: bren/inc/vecfns.h ================================================ /* * Copyright (c) 1992,1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: vecfns.h 1.11 1995/06/30 16:09:04 sam Exp $ * $Locker: $ * * Inline versions of the vector operations (could do compiler specific * versions for compilers that support inline, ie: gcc) */ #ifndef _VECFNS_H_ #define _VECFNS_H_ #ifdef __cplusplus extern "C" { #endif /** ** 2D VECTORS **/ /* * v1=v2 */ #define BrVector2Copy(v1, v2) \ do \ { \ (v1)->v[0] = (v2)->v[0]; \ (v1)->v[1] = (v2)->v[1]; \ } while (0) /* * v1=(s1,s2) */ #define BrVector2Set(v1, s1, s2) \ do \ { \ (v1)->v[0] = s1; \ (v1)->v[1] = s2; \ } while (0) #define BrVector2SetInt(v1, i1, i2) \ do \ { \ (v1)->v[0] = BrIntToScalar(i1); \ (v1)->v[1] = BrIntToScalar(i2); \ } while (0) #define BrVector2SetFloat(v1, f1, f2) \ do \ { \ (v1)->v[0] = BrFloatToScalar(f1); \ (v1)->v[1] = BrFloatToScalar(f2); \ } while (0) /* * v1=-v2 */ #define BrVector2Negate(v1, v2) \ do \ { \ (v1)->v[0] = -(v2)->v[0]; \ (v1)->v[1] = -(v2)->v[1]; \ } while (0) /* * v1=v2+v3 */ #define BrVector2Add(v1, v2, v3) \ do \ { \ (v1)->v[0] = (v2)->v[0] + (v3)->v[0]; \ (v1)->v[1] = (v2)->v[1] + (v3)->v[1]; \ } while (0) /* * v1+=v2 */ #define BrVector2Accumulate(v1, v2) \ do \ { \ (v1)->v[0] += (v2)->v[0]; \ (v1)->v[1] += (v2)->v[1]; \ } while (0) /* * v1+=v2*scalar */ #define BrVector2AccumulateScale(v1, v2, s) \ do \ { \ (v1)->v[0] += BR_MUL((v2)->v[0], (s)); \ (v1)->v[1] += BR_MUL((v2)->v[1], (s)); \ } while (0) /* * v1=v2-v3 */ #define BrVector2Sub(v1, v2, v3) \ do \ { \ (v1)->v[0] = (v2)->v[0] - (v3)->v[0]; \ (v1)->v[1] = (v2)->v[1] - (v3)->v[1]; \ } while (0) /* * v1=v2*scalar */ #define BrVector2Scale(v1, v2, s) \ do \ { \ (v1)->v[0] = BR_MUL((v2)->v[0], (s)); \ (v1)->v[1] = BR_MUL((v2)->v[1], (s)); \ } while (0) /* * v1=v2/scalar */ #define BrVector2InvScale(v1, v2, s) \ do \ { \ (v1)->v[0] = BR_DIV((v2)->v[0], (s)); \ (v1)->v[1] = BR_DIV((v2)->v[1], (s)); \ } while (0) /* * = v1.v2 */ #define BrVector2Dot(v1, v2) BR_MAC2((v1)->v[0], (v2)->v[0], (v1)->v[1], (v2)->v[1]) /* * = |v1| */ #define BrVector2Length(v1) BR_LENGTH2((v1)->v[0], (v1)->v[1]) /* * = |v1| * |v1| */ #define BrVector2LengthSquared(v1) BR_SQR2((v1)->v[0], (v1)->v[1]) /** ** 3D VECTORS **/ /* * v1=v2 */ #define BrVector3Copy(v1, v2) \ do \ { \ (v1)->v[0] = (v2)->v[0]; \ (v1)->v[1] = (v2)->v[1]; \ (v1)->v[2] = (v2)->v[2]; \ } while (0) /* * v1=(s1,s2,s3) */ #define BrVector3Set(v1, s1, s2, s3) \ do \ { \ (v1)->v[0] = (s1); \ (v1)->v[1] = (s2); \ (v1)->v[2] = (s3); \ } while (0) #define BrVector3SetInt(v1, i1, i2, i3) \ do \ { \ (v1)->v[0] = BrIntToScalar(i1); \ (v1)->v[1] = BrIntToScalar(i2); \ (v1)->v[2] = BrIntToScalar(i3); \ } while (0) /* * v1=-v2 */ #define BrVector3Negate(v1, v2) \ do \ { \ (v1)->v[0] = -(v2)->v[0]; \ (v1)->v[1] = -(v2)->v[1]; \ (v1)->v[2] = -(v2)->v[2]; \ } while (0) /* * v1=v2+v3 */ #define BrVector3Add(v1, v2, v3) \ do \ { \ (v1)->v[0] = (v2)->v[0] + (v3)->v[0]; \ (v1)->v[1] = (v2)->v[1] + (v3)->v[1]; \ (v1)->v[2] = (v2)->v[2] + (v3)->v[2]; \ } while (0) /* * v1+=v2 */ #define BrVector3Accumulate(v1, v2) \ do \ { \ (v1)->v[0] += (v2)->v[0]; \ (v1)->v[1] += (v2)->v[1]; \ (v1)->v[2] += (v2)->v[2]; \ } while (0) /* * v1+=v2*scalar */ #define BrVector3AccumulateScale(v1, v2, s) \ do \ { \ (v1)->v[0] += BR_MUL((v2)->v[0], (s)); \ (v1)->v[1] += BR_MUL((v2)->v[1], (s)); \ (v1)->v[2] += BR_MUL((v2)->v[2], (s)); \ } while (0) /* * v1=v2-v3 */ #define BrVector3Sub(v1, v2, v3) \ do \ { \ (v1)->v[0] = (v2)->v[0] - (v3)->v[0]; \ (v1)->v[1] = (v2)->v[1] - (v3)->v[1]; \ (v1)->v[2] = (v2)->v[2] - (v3)->v[2]; \ } while (0) /* * v1=v2*scalar */ #define BrVector3Scale(v1, v2, s) \ do \ { \ (v1)->v[0] = BR_MUL((v2)->v[0], (s)); \ (v1)->v[1] = BR_MUL((v2)->v[1], (s)); \ (v1)->v[2] = BR_MUL((v2)->v[2], (s)); \ } while (0) /* * v1=v2/scalar */ #define BrVector3InvScale(v1, v2, s) \ do \ { \ (v1)->v[0] = BR_DIV((v2)->v[0], (s)); \ (v1)->v[1] = BR_DIV((v2)->v[1], (s)); \ (v1)->v[2] = BR_DIV((v2)->v[2], (s)); \ } while (0) /* * = v1.v2 */ #define BrVector3Dot(v1, v2) BR_MAC3((v1)->v[0], (v2)->v[0], (v1)->v[1], (v2)->v[1], (v1)->v[2], (v2)->v[2]) /* * v1 = v2 x v3 */ #define BrVector3Cross(v1, v2, v3) \ do \ { \ (v1)->v[0] = BR_MUL((v2)->v[1], (v3)->v[2]) - BR_MUL((v2)->v[2], (v3)->v[1]); \ (v1)->v[1] = BR_MUL((v2)->v[2], (v3)->v[0]) - BR_MUL((v2)->v[0], (v3)->v[2]); \ (v1)->v[2] = BR_MUL((v2)->v[0], (v3)->v[1]) - BR_MUL((v2)->v[1], (v3)->v[0]); \ } while (0) /* * = |v1| */ #define BrVector3Length(v1) BR_LENGTH3((v1)->v[0], (v1)->v[1], (v1)->v[2]) /* * = |v1| * |v1| */ #define BrVector3LengthSquared(v1) BR_SQR3((v1)->v[0], (v1)->v[1], (v1)->v[2]) /* * v1 = v2/|v2| */ #define BrVector3Normalise(v1, v2) \ do \ { \ br_scalar _scale; \ _scale = BR_LENGTH3((v2)->v[0], (v2)->v[1], (v2)->v[2]); \ if (_scale > (BR_SCALAR_EPSILON * 2)) \ { \ _scale = BR_RCP(_scale); \ (v1)->v[0] = BR_MUL((v2)->v[0], _scale); \ (v1)->v[1] = BR_MUL((v2)->v[1], _scale); \ (v1)->v[2] = BR_MUL((v2)->v[2], _scale); \ } \ else \ { \ (v1)->v[0] = BR_FRACTION(1.0); \ (v1)->v[1] = BR_FRACTION(0.0); \ (v1)->v[2] = BR_FRACTION(0.0); \ } \ } while (0) /* * v1 = v2/|v2| */ #define BrVector3NormaliseQuick(v1, v2) \ do \ { \ br_scalar _scale; \ _scale = BR_RCP(BR_LENGTH3((v2)->v[0], (v2)->v[1], (v2)->v[2])); \ BrVector3Scale(v1, v2, _scale); \ } while (0) /* * v1 = v2/|v2| (low precision) */ #define BrVector3NormaliseLP(v1, v2) \ do \ { \ br_scalar _scale; \ _scale = BR_RCP(BR_LENGTH3((v2)->v[0], (v2)->v[1], (v2)->v[2])); \ BrVector3Scale(v1, v2, _scale); \ } while (0) /* * 4D Vectors */ /* * = v1.v2 */ #define BrVector4Dot(v1, v2) \ BR_MAC4((v1)->v[0], (v2)->v[0], (v1)->v[1], (v2)->v[1], (v1)->v[2], (v2)->v[2], (v1)->v[3], (v2)->v[3]) /* * v1=v2 */ #define BrVector4Copy(v1, v2) \ do \ { \ (v1)->v[0] = (v2)->v[0]; \ (v1)->v[1] = (v2)->v[1]; \ (v1)->v[2] = (v2)->v[2]; \ (v1)->v[3] = (v2)->v[3]; \ } while (0) /* * v1 = v2/|v2| */ #define BrVector2Normalise(v1, v2) \ do \ { \ br_scalar _scale; \ _scale = BR_LENGTH2((v2)->v[0], (v2)->v[1]); \ if (_scale > (BR_SCALAR_EPSILON * 2)) \ { \ _scale = BR_RCP(_scale); \ (v1)->v[0] = BR_MUL((v2)->v[0], _scale); \ (v1)->v[1] = BR_MUL((v2)->v[1], _scale); \ } \ else \ { \ (v1)->v[0] = BR_FRACTION(1.0); \ (v1)->v[1] = BR_FRACTION(0.0); \ } \ } while (0) #ifdef __cplusplus }; #endif #endif ================================================ FILE: bren/inc/vector.h ================================================ /* * Copyright (c) 1992,1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: vector.h 1.9 1995/06/30 16:09:07 sam Exp $ * $Locker: $ * * Vector types */ #ifndef _VECTOR_H_ #define _VECTOR_H_ #ifdef __cplusplus extern "C" { #endif /* * Vector types */ typedef struct br_vector2 { br_scalar v[2]; } br_vector2; typedef struct br_vector3 { br_scalar v[3]; } br_vector3; typedef struct br_vector4 { br_scalar v[4]; } br_vector4; /* * Integer vectors (used for integer bounding boxes) */ typedef struct br_vector2i { br_int_32 v[2]; } br_vector2i; typedef struct br_vector3i { br_int_32 v[3]; } br_vector3i; typedef struct br_vector4i { br_int_32 v[4]; } br_vector4i; /* * Fraction vector types */ typedef struct br_fvector2 { br_fraction v[2]; } br_fvector2; typedef struct br_fvector3 { br_fraction v[3]; } br_fvector3; typedef struct br_fvector4 { br_fraction v[4]; } br_fvector4; /* * General structures for describing an axis aligned bounds */ typedef struct br_bounds2 { br_vector2 min; /* Minimum corner */ br_vector2 max; /* Maximum corner */ } br_bounds2; typedef struct br_bounds3 { br_vector3 min; /* Minimum corner */ br_vector3 max; /* Maximum corner */ } br_bounds3; typedef struct br_bounds4 { br_vector4 min; /* Minimum corner */ br_vector4 max; /* Maximum corner */ } br_bounds4; /* * Integer bounding boxes */ typedef struct br_bounds2i { br_vector2i min; /* Minimum corner */ br_vector2i max; /* Maximum corner */ } br_bounds2i; typedef struct br_bounds3i { br_vector3i min; /* Minimum corner */ br_vector3i max; /* Maximum corner */ } br_bounds3i; typedef struct br_bounds4i { br_vector4i min; /* Minimum corner */ br_vector4i max; /* Maximum corner */ } br_bounds4i; /* * Backwards compatibility */ typedef struct br_bounds3 br_bounds; /* * Macros for static initialisation */ #define BR_VECTOR2(a, b) \ { \ BR_SCALAR(a), BR_SCALAR(b) \ } #define BR_VECTOR3(a, b, c) \ { \ BR_SCALAR(a), BR_SCALAR(b), BR_SCALAR(c) \ } #define BR_VECTOR4(a, b, c, d) \ { \ BR_SCALAR(a), BR_SCALAR(b), BR_SCALAR(c), BR_SCALAR(d) \ } #define BR_FVECTOR2(a, b) \ { \ BR_FRACTION(a), BR_FRACTION(b) \ } #define BR_FVECTOR3(a, b, c) \ { \ BR_FRACTION(a), BR_FRACTION(b), BR_FRACTION(c) \ } #define BR_FVECTOR4(a, b, c, d) \ { \ BR_FRACTION(a), BR_FRACTION(b), BR_FRACTION(c), BR_FRACTION(d) \ } #ifdef __cplusplus }; #endif #endif ================================================ FILE: bren/inc/wtcifix.h ================================================ /* * Copyright (c) 1992,1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: wtcifix.h 1.6 1995/02/22 21:37:27 sam Exp $ * $Locker: $ * * Inline fixed point ops for Watcom C * */ long IFixedMul(long a, long b); #pragma aux IFixedMul = "imul ebx" \ "shrd eax,edx,16" parm nomemory[eax][ebx] modify nomemory[edx]; long IFixedDiv(long a, long b); #pragma aux IFixedDiv = "mov eax,edx" \ "shl eax,16" \ "sar edx,16" \ "idiv ebx" parm nomemory[edx][ebx] modify nomemory[eax]; long IFixedDivR(long a, long b); #pragma aux IFixedDivR = "cdq" \ "xchg edx,eax" \ "shrd eax,edx,16" \ "sar edx,16" \ "idiv ebx" parm nomemory[eax][ebx] modify nomemory[edx]; long IFixedDivF(long a, long b); #pragma aux IFixedDivF = "xor eax,eax" \ "sar edx,1" \ "rcr eax,1" \ "div ebx" parm nomemory[edx][ebx] modify nomemory[eax]; long IFixedRcp(long a); #pragma aux IFixedRcp = "mov edx,1" \ "xor eax,eax" \ "idiv ebx" parm nomemory[ebx] modify nomemory[eax edx]; long IFixedMulDiv(long a, long b, long c); #pragma aux IFixedMulDiv = "imul ebx" \ "idiv ecx" parm nomemory[eax][ebx][ecx] modify nomemory[edx]; long IFixedMac2(long a, long b, long c, long d); #pragma aux IFixedMac2 = "imul edx" \ "shrd eax,edx,16" \ "xchg ecx,eax" \ "imul ebx" \ "shrd eax,edx,16" \ "add eax,ecx" parm nomemory[eax][edx][ecx][ebx] modify nomemory; long IFixedMac3(long a, long b, long c, long d, long e, long f); #pragma aux IFixedMac3 = "imul edx" \ "shrd eax,edx,16" \ "xchg ecx,eax" \ "imul ebx" \ "shrd eax,edx,16" \ "add ecx,eax" \ "mov eax,esi" \ "imul edi" \ "shrd eax,edx,16" \ "add eax,ecx" parm nomemory[eax][edx][ecx][ebx][esi][edi] modify nomemory; long IFixedFMac2(short a, long b, short c, long d); #pragma aux IFixedFMac2 = "cwde" \ "imul edx" \ "shrd eax,edx,15" \ "xchg ecx,eax" \ "cwde" \ "imul ebx" \ "shrd eax,edx,15" \ "add eax,ecx" parm nomemory[ax][edx][cx][ebx] modify nomemory; long IFixedFMac3(short a, long b, short c, long d, short e, long f); #pragma aux IFixedFMac3 = "cwde" \ "imul edx" \ "shrd eax,edx,15" \ "xchg ecx,eax" \ "cwde" \ "imul ebx" \ "shrd eax,edx,15" \ "add ecx,eax" \ "mov eax,esi" \ "cwde" \ "imul edi" \ "shrd eax,edx,15" \ "add eax,ecx" parm nomemory[ax][edx][cx][ebx][si][edi] modify nomemory; long IFixedSqr(long a); #pragma aux IFixedSqr = "imul eax" \ "shrd eax,edx,16" parm nomemory[eax] modify nomemory[edx]; long IFixedSqr2(long a, long b); #pragma aux IFixedSqr2 = "imul eax" \ "xchg ebx,eax" \ "mov ecx,edx" \ "imul eax" \ "add eax,ebx" \ "adc edx,ecx" \ "shrd eax,edx,16" parm nomemory[eax][ebx] modify nomemory[eax ebx ecx edx]; long IFixedSqr3(long a, long b, long c); #pragma aux IFixedSqr3 = "imul eax" \ "xchg ebx,eax" \ "mov ecx,edx" \ "imul eax" \ "add ebx,eax" \ "adc ecx,edx" \ "mov eax,esi" \ "imul eax" \ "add eax,ebx" \ "adc edx,ecx" \ "shrd eax,edx,16" parm nomemory[eax][ebx][esi] modify nomemory[eax ebx ecx edx]; long IFixedSqr4(long a, long b, long c, long d); #pragma aux IFixedSqr4 = "imul eax" \ "xchg ebx,eax" \ "mov ecx,edx" \ "imul eax" \ "add ebx,eax" \ "adc ecx,edx" \ "mov eax,esi" \ "imul eax" \ "add ebx,eax" \ "adc ecx,edx" \ "mov eax,edi" \ "imul eax" \ "add eax,ebx" \ "adc edx,ecx" \ "shrd eax,edx,16" parm nomemory[eax][ebx][esi][edi] modify nomemory[eax ebx ecx edx]; #define BrFixedMul(a, b) IFixedMul(a, b) #define BrFixedMac2(a, b, c, d) IFixedMac2(a, b, c, d) #define BrFixedMac3(a, b, c, d, e, f) IFixedMac3(a, b, c, d, e, f) #define BrFixedMac4(a, b, c, d, e, f, g, h) (IFixedMac2(a, b, c, d) + IFixedMac2(e, f, g, h)) #define BrFixedDiv(a, b) IFixedDiv(a, b) #define BrFixedDivR(a, b) IFixedDivR(a, b) #define BrFixedDivF(a, b) IFixedDivF(a, b) #define BrFixedMulDiv(a, b, c) IFixedMulDiv(a, b, c) #define BrFixedRcp(a) IFixedRcp(a) #define BrFixedSqr(a) IFixedSqr(a) #define BrFixedSqr2(a, b) IFixedSqr2(a, b) #define BrFixedSqr3(a, b, c) IFixedSqr3(a, b, c) #define BrFixedSqr4(a, b, c, d) IFixedSqr4(a, b, c, d) #define BrFixedFMac2(a, b, c, d) IFixedFMac2(a, b, c, d) #define BrFixedFMac3(a, b, c, d, e, f) IFixedFMac3(a, b, c, d, e, f) #define BrFixedFMac4(a, b, c, d, e, f, g, h) (IFixedFMac2(a, b, c, d) + IFixedFMac2(e, f, g, h)) ================================================ FILE: bren/inc/zbmp.h ================================================ /************************************************************************* zbmp.h: Z-buffer Bitmap Class Primary Author: ****** Review Status: REVIEWED - any changes to this file must be reviewed! BASE ---> BACO ---> ZBMP *************************************************************************/ #ifndef ZBMP_H #define ZBMP_H #define kcbPixelZbmp 2 // Z-buffers are 2 bytes per pixel (16 bit) // ZBMP on file struct ZBMPF { short bo; short osk; short xpLeft; short ypTop; short dxp; short dyp; // void *rgb; // pixels follow immediately after ZBMPF }; const ulong kbomZbmpf = 0x55500000; /**************************************** ZBMP class ****************************************/ typedef class ZBMP *PZBMP; #define ZBMP_PAR BACO #define kclsZBMP 'ZBMP' class ZBMP : public ZBMP_PAR { RTCLASS_DEC ASSERT MARKMEM protected: RC _rc; // bounding rectangle of ZBMP long _cbRow; // bytes per row long _cb; // count of bytes in Z buffer byte *_prgb; // Z buffer ZBMP(void) { } public: static PZBMP PzbmpNew(long dxp, long dyp); static PZBMP PzbmpNewFromBpmp(BPMP *pbpmp); static PZBMP PzbmpRead(PBLCK pblck); static bool FReadZbmp(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb); ~ZBMP(void); byte *Prgb(void) { return _prgb; } long CbRow(void) { return _cbRow; } void Draw(byte *prgbPixels, long cbRow, long dyp, long xpRef, long ypRef, RC *prcClip = pvNil, PREGN pregnClip = pvNil); void DrawHalf(byte *prgbPixels, long cbRow, long dyp, long xpRef, long ypRef, RC *prcClip = pvNil, PREGN pregnClip = pvNil); bool FWrite(PCFL pcfl, CTG ctg, CNO *pcno); }; #endif ZBMP_H ================================================ FILE: bren/inc/zbproto.h ================================================ /* * Copyright (c) 1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: zbproto.h 1.8 1995/02/22 21:37:28 sam Exp $ * $Locker: $ * * Function prototypes for Z buffer renderer */ #ifndef _ZBPROTO_H_ #define _ZBPROTO_H_ #ifdef __cplusplus extern "C" { #endif #define BR_BOUNDS_MIN_X 0 #define BR_BOUNDS_MIN_Y 1 #define BR_BOUNDS_MAX_X 2 #define BR_BOUNDS_MAX_Y 3 /* * Callback function invoked when an actor is * rendered */ typedef void BR_CALLBACK br_renderbounds_cbfn(br_actor *actor, br_model *model, br_material *material, br_uint_8 style, br_matrix4 *model_to_screen, br_int_32 bounds[4]); #ifndef _NO_PROTOTYPES void BR_PUBLIC_ENTRY BrZbBegin(br_uint_8 colour_type, br_uint_8 depth_type); void BR_PUBLIC_ENTRY BrZbEnd(void); void BR_PUBLIC_ENTRY BrZbSceneRenderBegin(br_actor *world, br_actor *camera, br_pixelmap *colour_buffer, br_pixelmap *depth_buffer); void BR_PUBLIC_ENTRY BrZbSceneRenderAdd(br_actor *tree); void BR_PUBLIC_ENTRY BrZbSceneRenderEnd(void); /* * Wrapper that inokes above therr calls in order */ void BR_PUBLIC_ENTRY BrZbSceneRender(br_actor *world, br_actor *camera, br_pixelmap *colour_buffer, br_pixelmap *depth_buffer); /* * Used within custom model callbacks to render other models */ void BR_PUBLIC_ENTRY BrZbModelRender(br_actor *actor, br_model *model, br_material *material, br_uint_8 style, int on_screen, int use_custom); br_renderbounds_cbfn *BR_PUBLIC_ENTRY BrZbSetRenderBoundsCallback(br_renderbounds_cbfn *new_cbfn); #ifdef __cplusplus }; #endif #endif #endif ================================================ FILE: bren/makefile ================================================ #---bren.mak !IFNDEF MAKEFILE_BREN MAKEFILE_BREN = 1 !INCLUDE $(KAUAI_ROOT)\makefile.def #BREN SOURCE DIRECTORIES BREN_SRC_DIR = $(SOC_ROOT)\bren #BREN OBJ DIRECTORIES BREN_OBJ_ROOT_DIR = $(BREN_SRC_DIR)\obj BREN_OBJ_DIR = $(BREN_OBJ_ROOT_DIR)\$(BLD_TYPE_DIR) SOC_OBJ_DIR = $(SOC_ROOT)\obj\$(BLD_TYPE_DIR) !IF "$(LOCAL_BUILD)" == "1" BREN_TGT_DIR = !ELSE # LOCAL_BUILD BREN_TGT_DIR = $(BREN_OBJ_DIR)^\ !ENDIF # !LOCAL_BUILD BREN_TARGETS =\ $(BREN_TGT_DIR)bwld.obj\ $(BREN_TGT_DIR)stderr.obj\ $(BREN_TGT_DIR)stdfile.obj\ $(BREN_TGT_DIR)stdmem.obj\ $(BREN_TGT_DIR)tmap.obj\ $(BREN_TGT_DIR)zbmp.obj #-Compile rules------------------------------------------------------------- PROGRAM_DATABASE = $(BREN_TGT_DIR)soc.pdb PRECOMPILED_HEADER = $(BREN_TGT_DIR)soc.pch CPPEXTRA = /Zi /Fd$(PROGRAM_DATABASE) /Fp$(PRECOMPILED_HEADER) SRC_DIR=$(BREN_SRC_DIR) OBJ_DIR=$(BREN_OBJ_DIR) TGT_NAME=Brender !INCLUDE $(SOC_ROOT)\makefile.rul #-Targets------------------------------------------------------------------- ALL_BREN = $(BREN_TGT_DIR)bren.lib $(SOC_ROOT)\elib\$(BLD_TYPE_DIR)\bren.lib ALL_TARGETS_ROOT = $(ALL_TARGETS_ROOT) $(ALL_BREN) CLEAN_BREN = CLEAN_BREN_OBJ CLEAN_TARGETS_ROOT = $(CLEAN_TARGETS_ROOT) $(CLEAN_BREN) !IF "$(LOCAL_BUILD)" != "1" !IF "$(LOCAL_BUILD)" != "0" ALL: $(BREN_OBJ_DIR) $(ALL_BREN) CLEAN: $(CLEAN_BREN) ALL !ENDIF # LOCAL_BUILD != 0 $(BREN_OBJ_DIR) : @echo Making Directories $(BREN_OBJ_DIR)... if not exist $(BREN_OBJ_ROOT_DIR)/nul mkdir $(BREN_OBJ_ROOT_DIR) if not exist $(BREN_OBJ_DIR)/nul mkdir $(BREN_OBJ_DIR) !ENDIF # !LOCAL_BUILD CLEAN_BREN_OBJ: @echo <nul^ DEL /q dummy.nul ) 2>nul < #include #include #include "brender.h" static void BR_CALLBACK BrStdioWarning(char *message) { MessageBox(0, message, "BRender Warning", MB_OK); } static void BR_CALLBACK BrStdioError(char *message) { MessageBox(0, message, "BRender Fatal Error", MB_OK); exit(10); } /* * ErrorHandler structure */ br_diaghandler BrStdioDiagHandler = { "Stdio DiagHandler", BrStdioWarning, BrStdioError, }; /* * Override default */ br_diaghandler *_BrDefaultDiagHandler = &BrStdioDiagHandler; ================================================ FILE: bren/stdfile.c ================================================ /* * Copyright (c) 1993 Argonaut Software Ltd. All rights reserved. * * $Id: stdfile.c 1.5 1994/11/29 18:20:34 sam Exp $ * $Locker: sam $ * * Default file handler that uses */ #include #include #include #include #include "brender.h" /* * Access functions for stdio */ static br_uint_32 BR_CALLBACK BrStdioAttributes(void) { return BR_FS_ATTR_READABLE | BR_FS_ATTR_WRITEABLE | BR_FS_ATTR_HAS_TEXT | BR_FS_ATTR_HAS_BINARY | BR_FS_ATTR_HAS_ADVANCE; } /* * Open a file for reading * * Use BRENDER_PATH to locate the file if necessary * * Having found the file, invoke a supplied callback, (if present) * to find out if the file is text, binary, or unknown * * Text mode files are primarily used for debugging but it can be * useful to allow hand editting of input data * * Return a void * file handle ('FILE *' cast to 'void *') or NULL * if open failed */ void *BR_CALLBACK BrStdioOpenRead(char *name, br_size_t n_magics, br_mode_test_cbfn *identify, int *mode_result) { FILE *fh; char *br_path; char try_name[FILENAME_MAX + 1], *cp; br_uint_8 magics[BR_MAX_FILE_MAGICS]; int open_mode = BR_FS_MODE_BINARY; /* * Try the current directory */ strncpy(try_name, name, FILENAME_MAX); if ((fh = fopen(try_name, "rb")) == NULL) { /* * If that fails, and if a drive or a * directory were specified, don't search along path */ if (strchr(name, ':') || strchr(name, '/') || strchr(name, '\\')) return NULL; /* * For each element of the path, if it exists */ if ((br_path = getenv("BRENDER_PATH")) == NULL) return NULL; while (*br_path) { /* * Take characters until next seperator or terminator */ cp = try_name; while (*br_path != ';' && *br_path != '\0') *cp++ = *br_path++; if (*br_path == ';') br_path++; /* * Add a directory seperator if none */ if (cp != try_name && (*(cp - 1) != ':' && *(cp - 1) != '/' && *(cp - 1) != '\\')) *cp++ = '/'; strcpy(cp, name); if (fh = fopen(try_name, "rb")) break; } if (fh == NULL) return NULL; } /* * Now have an open file, try and grab the first bytes from it */ if (fread(magics, 1, n_magics, fh) != n_magics) { /* * Could not read all the required data, close and punt */ fclose(fh); return NULL; } /* * Try and identify the file */ if (identify) open_mode = identify(magics, n_magics); if (mode_result) *mode_result = open_mode; /* * Reopen file with it's new identity (or abandon if unknown identity) */ switch (open_mode) { case BR_FS_MODE_TEXT: fh = freopen(try_name, "rt", fh); break; case BR_FS_MODE_BINARY: fh = freopen(try_name, "rb", fh); break; case BR_FS_MODE_UNKNOWN: fclose(fh); fh = NULL; break; default: BR_ERROR1("BrStdFileOpenRead: invalid open_mode %d", open_mode); } return fh; } /* * Open a file for writing, overwrites any existing file of the same name * * Return a void * file handle ('FILE *' cast to 'void *') or NULL * if open failed */ static void *BR_CALLBACK BrStdioOpenWrite(char *name, int mode) { FILE *fh = NULL; fh = fopen(name, (mode == BR_FS_MODE_TEXT) ? "wt" : "wb"); return fh; } /* * Close an open file */ static void BR_CALLBACK BrStdioClose(void *f) { fclose((FILE *)f); } /* * Test EOF */ static int BR_CALLBACK BrStdioEof(void *f) { return feof((FILE *)f); } /* * Read one character from file */ static int BR_CALLBACK BrStdioGetChar(void *f) { return getc((FILE *)f); } /* * Write one character to file */ static void BR_CALLBACK BrStdioPutChar(int c, void *f) { putc(c, (FILE *)f); } /* * Read a block from a file */ static br_size_t BR_CALLBACK BrStdioRead(void *buf, br_size_t size, unsigned int n, void *f) { return fread(buf, size, n, (FILE *)f); } /* * Write a block to a file */ static br_size_t BR_CALLBACK BrStdioWrite(void *buf, br_size_t size, unsigned int n, void *f) { return fwrite(buf, size, n, (FILE *)f); } /* * Read a line of text from stdin and trim any terminators * * Return length of line */ static br_size_t BR_CALLBACK BrStdioGetLine(char *buf, br_size_t buf_len, void *f) { br_size_t l; if (fgets(buf, buf_len, (FILE *)f) == NULL) return 0; l = strlen(buf); if (l > 0 && buf[l - 1] == '\n') buf[--l] = '\0'; return l; } /* * Write a line to text file, followed by newline */ void BR_CALLBACK BrStdioPutLine(char *buf, void *f) { fputs(buf, (FILE *)f); putc('\n', (FILE *)f); } /* * Advance N bytes through a binary stream */ static void BR_CALLBACK BrStdioAdvance(br_size_t count, void *f) { fseek((FILE *)f, (long int)count, SEEK_CUR); } /* * Filesystem structure */ br_filesystem BrStdioFilesystem = { "Standard IO", /* identifier */ BrStdioAttributes, /* attributes */ BrStdioOpenRead, /* open_read */ BrStdioOpenWrite, /* openwrite */ BrStdioClose, /* close */ BrStdioEof, /* eof */ BrStdioGetChar, /* getchar */ BrStdioPutChar, /* putchar */ BrStdioRead, /* read */ BrStdioWrite, /* write */ BrStdioGetLine, /* getline */ BrStdioPutLine, /* putline */ BrStdioAdvance, /* advance */ }; /* * Override global variable s.t. the default filesystem will be stdio */ br_filesystem *_BrDefaultFilesystem = &BrStdioFilesystem; ================================================ FILE: bren/stdmem.c ================================================ /* * Copyright (c) 1993 Argonaut Software Ltd. All rights reserved. * * $Id: stdmem.c 1.3 1994/11/07 01:39:20 sam Exp $ * $Locker: $ * * Default memory handler that uses malloc()/free() from C library */ #include #include #include #include #include "brender.h" #ifdef DEBUG static long _cb = 0; // Total memory allocated by BRender #endif /* * Glue functions for malloc()/free() */ static void *BR_CALLBACK BrStdlibAllocate(br_size_t size, br_uint_8 type) { void *m; long cbAlloc = size; #ifdef DEBUG cbAlloc += sizeof(long); #endif // DEBUG m = (void *)GlobalAlloc(GMEM_FIXED, cbAlloc); if (m == NULL) return NULL; #ifdef DEBUG *(long *)m = size; _cb += size; m = (char *)m + sizeof(long); #endif return m; } static void BR_CALLBACK BrStdlibFree(void *mem) { #ifdef DEBUG void *pmemReal = (char *)mem - sizeof(long); long size = *(long *)pmemReal; _cb -= size; mem = pmemReal; #endif // DEBUG GlobalFree((HGLOBAL)mem); } static br_size_t BR_CALLBACK BrStdlibInquire(br_uint_8 type) { return 0; } /* * Allocator structure */ br_allocator BrStdlibAllocator = { "malloc", BrStdlibAllocate, BrStdlibFree, BrStdlibInquire, }; /* * Override global variable s.t. this is the default allocator */ br_allocator *_BrDefaultAllocator = &BrStdlibAllocator; ================================================ FILE: bren/tmap.cpp ================================================ /*************************************************************************** Texture map (br_pixmap wrapper) class ***************************************************************************/ #include "bren.h" ASSERTNAME RTCLASS(TMAP) /*************************************************************************** A PFNRPO to read TMAP objects. ***************************************************************************/ bool TMAP::FReadTmap(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb) { AssertPo(pcrf, 0); AssertPo(pblck, 0); AssertNilOrVarMem(ppbaco); AssertVarMem(pcb); PTMAP ptmap; *pcb = pblck->Cb(fTrue); if (pvNil == ppbaco) return fTrue; ptmap = PtmapRead(pcrf->Pcfl(), ctg, cno); if (pvNil == ptmap) { TrashVar(ppbaco); TrashVar(pcb); return fFalse; } AssertPo(ptmap, 0); *ppbaco = ptmap; return fTrue; } /*************************************************************************** Read a TMAP from a chunk ***************************************************************************/ PTMAP TMAP::PtmapRead(PCFL pcfl, CTG ctg, CNO cno) { TMAPF tmapf; BLCK blck; TMAP *ptmap; ptmap = NewObj TMAP; if (pvNil == ptmap) goto LFail; if (!pcfl->FFind(ctg, cno, &blck) || !blck.FUnpackData()) goto LFail; if (!blck.FReadRgb(&tmapf, size(TMAPF), 0)) goto LFail; if (kboCur != tmapf.bo) SwapBytesBom(&tmapf, kbomTmapf); Assert(kboCur == tmapf.bo, "bad TMAPF"); ptmap->_bpmp.identifier = (char *)ptmap; // to get TMAP from a (BPMP *) if (!FAllocPv((void **)&ptmap->_bpmp.pixels, LwMul(tmapf.cbRow, tmapf.dyp), fmemClear, mprNormal)) { goto LFail; } ptmap->_bpmp.map = pvNil; ptmap->_bpmp.row_bytes = tmapf.cbRow; ptmap->_bpmp.type = tmapf.type; ptmap->_bpmp.flags = tmapf.grftmap; ptmap->_bpmp.base_x = tmapf.xpLeft; ptmap->_bpmp.base_y = tmapf.ypTop; ptmap->_bpmp.width = tmapf.dxp; ptmap->_bpmp.height = tmapf.dyp; ptmap->_bpmp.origin_x = tmapf.xpOrigin; ptmap->_bpmp.origin_y = tmapf.ypOrigin; if (!blck.FReadRgb(ptmap->_bpmp.pixels, LwMul(tmapf.cbRow, tmapf.dyp), size(TMAPF))) { goto LFail; } return ptmap; LFail: ReleasePpo(&ptmap); return pvNil; } /*************************************************************************** Create a TMAP from a BRender BPMP...used only for importing PIX's ***************************************************************************/ PTMAP TMAP::PtmapNewFromBpmp(BPMP *pbpmp) { PTMAP ptmap; ptmap = NewObj TMAP; if (pvNil == ptmap) return pvNil; ptmap->_bpmp = *pbpmp; ptmap->_bpmp.identifier = (char *)ptmap; pbpmp->identifier = (char *)ptmap; ptmap->_fImported = fTrue; return ptmap; } /*************************************************************************** destructor ***************************************************************************/ TMAP::~TMAP(void) { if (_fImported) { // REVIEW *****: this crashes BRender...why? // BrMemFree(_bpmp.pixels); } else FreePpv((void **)&_bpmp.pixels); } /*************************************************************************** Write a TMAP to a chunk ***************************************************************************/ bool TMAP::FWrite(PCFL pcfl, CTG ctg, CNO *pcno) { AssertThis(0); BLCK blck; if (!pcfl->FAdd(size(TMAPF) + LwMul(_bpmp.row_bytes, _bpmp.height), ctg, pcno, &blck)) { return fFalse; } return FWrite(&blck); } /*************************************************************************** Write a TMAP to the given FLO ***************************************************************************/ bool TMAP::FWrite(PBLCK pblck) { TMAPF tmapf; tmapf.bo = kboCur; tmapf.osk = koskCur; tmapf.cbRow = _bpmp.row_bytes; tmapf.type = _bpmp.type; tmapf.grftmap = _bpmp.flags; tmapf.xpLeft = _bpmp.base_x; tmapf.ypTop = _bpmp.base_y; tmapf.dxp = _bpmp.width; tmapf.dyp = _bpmp.height; tmapf.xpOrigin = _bpmp.origin_x; tmapf.ypOrigin = _bpmp.origin_y; if (!pblck->FWriteRgb(&tmapf, size(TMAPF), 0)) return fFalse; if (!pblck->FWriteRgb(_bpmp.pixels, LwMul(tmapf.cbRow, tmapf.dyp), size(TMAPF))) { return fFalse; } return fTrue; } #ifdef WIN #define CALCDIST(bRed1, bGreen1, bBlue1, bRed2, bGreen2, bBlue2) \ (((bRed1) - (bRed2)) * ((bRed1) - (bRed2)) + ((bGreen1) - (bGreen2)) * ((bGreen1) - (bGreen2)) + \ ((bBlue1) - (bBlue2)) * ((bBlue1) - (bBlue2))) /* * PtmapReadNative -- Creates a TMAP object, reading the data from a .BMP file * * input: * pfni -- the FNI to read the data from * pglclr -- the colors to map to. * * output: * returns the pointer to the new TMAP */ PTMAP TMAP::PtmapReadNative(FNI *pfni, PGL pglclr) { byte *prgb = pvNil; PTMAP ptmap = pvNil; long dxp, dyp; bool fUpsideDown; long iclrBest, igl; long iprgb; long dist, min; CLR clr, clrSrc; PGL pglclrSrc; PGL pglCache; AssertPo(pfni, 0); if (FReadBitmap(pfni, &prgb, &pglclrSrc, &dxp, &dyp, &fUpsideDown)) { Assert(!fUpsideDown, 0); AssertPo(pglclrSrc, 0); if (pglclr != pvNil) { AssertIn(pglclr->IvMac(), 0, 257); // // Do a closest color match // pglCache = GL::PglNew(size(long), pglclrSrc->IvMac()); if (pglCache != pvNil) { iclrBest = ivNil; for (igl = 0; igl < pglclrSrc->IvMac(); igl++) { AssertDo(pglCache->FAdd(&iclrBest), "Ensured by creation"); } } for (iprgb = 0; iprgb < (dxp * dyp); iprgb++) { if (pglCache != pvNil) { pglCache->Get(prgb[iprgb], &iclrBest); if (iclrBest != ivNil) { prgb[iprgb] = (BYTE)iclrBest; continue; } } pglclrSrc->Get(prgb[iprgb], &clrSrc); iclrBest = ivNil; min = klwMax; for (igl = 0; igl < pglclr->IvMac(); igl++) { pglclr->Get(igl, &clr); dist = CALCDIST(clrSrc.bRed, clrSrc.bGreen, clrSrc.bBlue, clr.bRed, clr.bGreen, clr.bBlue); if (dist <= min) { min = dist; iclrBest = igl; } } if (iclrBest != ivNil) { AssertIn(iclrBest, 0, pglclr->IvMac()); if (pglCache != pvNil) { pglCache->Put(prgb[iprgb], &iclrBest); } prgb[iprgb] = (BYTE)iclrBest; } } ReleasePpo(&pglCache); } ReleasePpo(&pglclrSrc); ptmap = TMAP::PtmapNew(prgb, dxp, dyp); } return ptmap; } #endif // WIN #ifdef MAC PTMAP TMAP::PtmapReadNative(FNI *pfni) { RawRtn(); // REVIEW peted: NYI return pvNil; } #endif // MAC /* * PtmapNew -- Given pixel data and attributes, creates a new TMAP with * the given information. * * input: * prgbPixels -- the actual pixels for the TMAP * pbmh -- The bitmap header from the .BMP file * * output: * returns the pointer to the new TMAP */ PTMAP TMAP::PtmapNew(byte *prgbPixels, long dxp, long dyp) { PTMAP ptmap; Assert(dxp <= ksuMax, "bitmap too wide"); Assert(dyp <= ksuMax, "bitmap too high"); if ((ptmap = NewObj TMAP) != pvNil) { ptmap->_fImported = fFalse; ptmap->_bpmp.identifier = (char *)ptmap; ptmap->_bpmp.pixels = prgbPixels; ptmap->_bpmp.map = pvNil; ptmap->_bpmp.row_bytes = (br_int_16)dxp; ptmap->_bpmp.type = BR_PMT_INDEX_8; ptmap->_bpmp.flags = BR_PMF_LINEAR; ptmap->_bpmp.base_x = ptmap->_bpmp.base_y = 0; ptmap->_bpmp.width = (br_uint_16)dxp; ptmap->_bpmp.height = (br_uint_16)dyp; ptmap->_bpmp.origin_x = ptmap->_bpmp.origin_y = 0; } AssertPo(ptmap, 0); return ptmap; } /****************************************************************************** FWriteTmapChkFile Writes a stand-alone file with a TMAP chunk in it. The file can be later read in by the CHCM class with the FILE command. Arguments: PFNI pfniDst -- FNI indicating the name of the output file bool fCompress -- fTrue if the chunk date is to be compressed PMSNK pmsnkErr -- optional message sink to direct errors to Returns: fTrue if the file was written successfully ************************************************************ PETED ***********/ bool TMAP::FWriteTmapChkFile(PFNI pfniDst, bool fCompress, PMSNK pmsnkErr) { AssertThis(0); AssertPo(pfniDst, ffniFile); AssertNilOrPo(pmsnkErr, 0); bool fRet = fFalse; long lwSig; PSZ pszErr = pvNil; FLO flo; if (pvNil == (flo.pfil = FIL::PfilCreate(pfniDst))) { pszErr = PszLit("Couldn't create destination file\n"); goto LFail; } flo.fp = size(long); flo.cb = CbOnFile(); if (fCompress) { BLCK blck; if (!blck.FSetTemp(flo.cb) || !FWrite(&blck)) { pszErr = PszLit("allocation failure\n"); goto LFail; } if (!blck.FPackData()) lwSig = klwSigUnpackedFile; else { lwSig = klwSigPackedFile; flo.cb = blck.Cb(fTrue); } if (!flo.pfil->FWriteRgb(&lwSig, size(long), 0) || !blck.FWriteToFlo(&flo, fTrue)) { pszErr = PszLit("writing to destination file failed\n"); goto LFail; } } else { lwSig = klwSigUnpackedFile; if (!flo.pfil->FWriteRgb(&lwSig, size(long), 0) || !FWriteFlo(&flo)) { pszErr = PszLit("writing to destination file failed\n"); goto LFail; } } fRet = fTrue; LFail: if (pszErr != pvNil && pmsnkErr != pvNil) pmsnkErr->ReportLine(pszErr); if (!fRet && pvNil != flo.pfil) flo.pfil->SetTemp(); ReleasePpo(&flo.pfil); return fRet; } #ifdef NOT_YET_REVIEWED byte *TMAP::PrgbBuildInverseTable(void) { byte *prgb, *prgbT, iclr; long cbRgb; if (_pbpmp->type != BR_PMT_RGB_888) return pvNil; if (!FAllocPv((void **)&prgb, cbRgb = _pbpmp->height, fmemNil, mprNormal)) return pvNil; for (prgbT = prgb, iclr = 0; iclr < cbRgb; prgbT++, iclr++) *prgbT = iclr; _SortInverseTable(prgb, cbRgb, BR_COLOUR_RGB(0, 0, 0), BR_COLOUR_RGB(0xFF, 0xFF, 0xFF)); return prgb; } void TMAP::_SortInverseTable(byte *prgb, long cbRgb, BRCLR brclrLo, BRCLR brclrHi) { long cbRgb1 = 0, cbRgb2 = 0; byte *prgb2, *prgbRead, bT; BRCLR brclrPivot = brclrLo + (brclrHi - brclrLo) / 2; BRCLR *pbrclr; prgb2 = prgb + cbRgb; prgbRead = prgb; while (cbRgb--) { pbrclr = 0; // pbrclr from index *prgb; if (*pbrclr <= brclrPivot) { prgbRead++; cbRgb1++; } else { bT = *prgb2; *--prgb2 = *prgbRead; *prgbRead = bT; cbRgb2++; } } if (cbRgb1 > 1) _SortInverseTable(prgb, cbRgb1, brclrLo, brclrPivot); if (cbRgb2 > 1) _SortInverseTable(prgb2, cbRgb2, brclrPivot + 1, brclrHi); } #endif // NOT_YET_REVIEWED #ifdef DEBUG /*************************************************************************** Assert the validity of the TMAP. ***************************************************************************/ void TMAP::AssertValid(ulong grf) { TMAP_PAR::AssertValid(fobjAllocated); if (!_fImported) AssertPvCb(_bpmp.pixels, LwMul(_bpmp.row_bytes, _bpmp.height)); } /*************************************************************************** Mark memory used by the TMAP. ***************************************************************************/ void TMAP::MarkMem(void) { AssertThis(0); TMAP_PAR::MarkMem(); if (!_fImported) MarkPv(_bpmp.pixels); } #endif // DEBUG ================================================ FILE: bren/zbmp.cpp ================================================ /*************************************************************************** zbmp.cpp: Z-buffer bitmap class Primary Author: ****** Review Status: REVIEWED - any changes to this file must be reviewed! ***************************************************************************/ #include "bren.h" ASSERTNAME RTCLASS(ZBMP) /*************************************************************************** Create a ZBMP of all 0xff's ***************************************************************************/ PZBMP ZBMP::PzbmpNew(long dxp, long dyp) { AssertIn(dxp, 1, klwMax); AssertIn(dyp, 1, klwMax); PZBMP pzbmp; pzbmp = NewObj ZBMP; if (pvNil == pzbmp) goto LFail; pzbmp->_rc.Set(0, 0, dxp, dyp); pzbmp->_cbRow = LwMul(dxp, kcbPixelZbmp); pzbmp->_cb = LwMul(dyp, pzbmp->_cbRow); if (!FAllocPv((void **)&pzbmp->_prgb, pzbmp->_cb, fmemNil, mprNormal)) goto LFail; FillPb(pzbmp->_prgb, pzbmp->_cb, 0xff); AssertPo(pzbmp, 0); return pzbmp; LFail: ReleasePpo(&pzbmp); return pvNil; } /*************************************************************************** Create a ZBMP from a BPMP. For authoring use only. ***************************************************************************/ PZBMP ZBMP::PzbmpNewFromBpmp(BPMP *pbpmp) { AssertVarMem(pbpmp); PZBMP pzbmp; pzbmp = PzbmpNew(pbpmp->width, pbpmp->height); if (pvNil == pzbmp) return pvNil; CopyPb(pbpmp->pixels, pzbmp->_prgb, pzbmp->_cb); return pzbmp; } /*************************************************************************** Chunky resource reader for ZBMP ***************************************************************************/ bool ZBMP::FReadZbmp(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb) { AssertPo(pcrf, 0); AssertPo(pblck, 0); AssertNilOrVarMem(ppbaco); AssertVarMem(pcb); ZBMP *pzbmp; *pcb = pblck->Cb(fTrue); // estimate ZBMP size if (pvNil == ppbaco) return fTrue; if (!pblck->FUnpackData()) goto LFail; *pcb = pblck->Cb(); pzbmp = PzbmpRead(pblck); if (pvNil == pzbmp) { LFail: TrashVar(ppbaco); TrashVar(pcb); return fFalse; } AssertPo(pzbmp, 0); *ppbaco = pzbmp; *pcb = size(ZBMP) + pzbmp->_cb; return fTrue; } /*************************************************************************** Read a ZBMP from a BLCK. ***************************************************************************/ PZBMP ZBMP::PzbmpRead(PBLCK pblck) { AssertPo(pblck, 0); PZBMP pzbmp; ZBMPF zbmpf; if (!pblck->FUnpackData()) return pvNil; pzbmp = NewObj ZBMP; if (pvNil == pzbmp) goto LFail; if (!pblck->FReadRgb(&zbmpf, size(ZBMPF), 0)) goto LFail; pzbmp->_rc.Set(zbmpf.xpLeft, zbmpf.ypTop, zbmpf.xpLeft + zbmpf.dxp, zbmpf.ypTop + zbmpf.dyp); pzbmp->_cbRow = LwMul(pzbmp->_rc.Dxp(), kcbPixelZbmp); pzbmp->_cb = LwMul(pzbmp->_rc.Dyp(), pzbmp->_cbRow); if (pblck->Cb() != size(ZBMPF) + pzbmp->_cb) goto LFail; if (!FAllocPv((void **)&pzbmp->_prgb, pzbmp->_cb, fmemNil, mprNormal)) goto LFail; if (!pblck->FReadRgb(pzbmp->_prgb, pzbmp->_cb, size(ZBMPF))) goto LFail; AssertPo(pzbmp, 0); return pzbmp; LFail: Warn("Couldn't load ZBMP"); ReleasePpo(&pzbmp); return pvNil; } /*************************************************************************** Destructor ***************************************************************************/ ZBMP::~ZBMP(void) { AssertBaseThis(0); FreePpv((void **)&_prgb); } /*************************************************************************** Draw the ZBMP into prgbPixels ***************************************************************************/ void ZBMP::Draw(byte *prgbPixels, long cbRow, long dyp, long xpRef, long ypRef, RC *prcClip, PREGN pregnClip) { AssertThis(0); AssertPvCb(prgbPixels, LwMul(cbRow, dyp)); AssertNilOrVarMem(prcClip); AssertNilOrVarMem(pregnClip); long yp; long cbRowCopy; byte *pbSrc; byte *pbDst; REGSC regsc; RC rcZbmp = _rc; RC rcRegnBounds; RC rcClippedRegnBounds; long xpLeft, xpRight; // Translate the zbmp's rc into coordinate system of prgbPixels' rc rcZbmp.Offset(xpRef, ypRef); if (pvNil == pregnClip) { if (pvNil == prcClip) return; if (!rcClippedRegnBounds.FIntersect(&rcZbmp, prcClip)) return; regsc.InitRc(prcClip, &rcClippedRegnBounds); } else { if (pregnClip->FEmpty(&rcRegnBounds)) return; if (!rcClippedRegnBounds.FIntersect(&rcZbmp, &rcRegnBounds)) return; if (pvNil != prcClip && !rcClippedRegnBounds.FIntersect(prcClip)) return; regsc.Init(pregnClip, &rcClippedRegnBounds); } for (yp = rcClippedRegnBounds.ypTop; yp < rcClippedRegnBounds.ypBottom; yp++) { while (regsc.XpCur() < klwMax) { xpLeft = regsc.XpCur() + rcClippedRegnBounds.xpLeft; xpRight = regsc.XpFetch() + rcClippedRegnBounds.xpLeft; AssertIn(xpLeft, rcClippedRegnBounds.xpLeft, rcClippedRegnBounds.xpRight + 1); AssertIn(xpRight, rcClippedRegnBounds.xpLeft, rcClippedRegnBounds.xpRight + 1); regsc.XpFetch(); cbRowCopy = LwMul(kcbPixelZbmp, xpRight - xpLeft); pbSrc = _prgb + LwMul(yp, _cbRow) + LwMul(kcbPixelZbmp, xpLeft); pbDst = prgbPixels + LwMul(yp, cbRow) + LwMul(kcbPixelZbmp, xpLeft); CopyPb(pbSrc, pbDst, cbRowCopy); } regsc.ScanNext(1); } } /*************************************************************************** Draw the ZBMP into prgbPixels, squashing the clip region vertically by two (for BWLD's "half mode") ***************************************************************************/ void ZBMP::DrawHalf(byte *prgbPixels, long cbRow, long dyp, long xpRef, long ypRef, RC *prcClip, PREGN pregnClip) { AssertThis(0); AssertPvCb(prgbPixels, LwMul(cbRow, dyp / 2)); AssertNilOrVarMem(prcClip); AssertNilOrVarMem(pregnClip); long yp; long cbRowCopy; byte *pbSrc; byte *pbDst; REGSC regsc; RC rcZbmp = _rc; RC rcRegnBounds; RC rcClippedRegnBounds; long xpLeft, xpRight; rcZbmp.ypBottom *= 2; // Translate the zbmp's rc into coordinate system of prgbPixels' rc rcZbmp.Offset(xpRef, ypRef); if (pvNil == pregnClip) { if (pvNil == prcClip) return; if (!rcClippedRegnBounds.FIntersect(&rcZbmp, prcClip)) return; regsc.InitRc(prcClip, &rcClippedRegnBounds); } else { if (pregnClip->FEmpty(&rcRegnBounds)) return; if (!rcClippedRegnBounds.FIntersect(&rcZbmp, &rcRegnBounds)) return; if (pvNil != prcClip && !rcClippedRegnBounds.FIntersect(prcClip)) return; regsc.Init(pregnClip, &rcClippedRegnBounds); } for (yp = rcClippedRegnBounds.ypTop; yp < rcClippedRegnBounds.ypBottom; yp += 2) { while (regsc.XpCur() < klwMax) { xpLeft = regsc.XpCur() + rcClippedRegnBounds.xpLeft; xpRight = regsc.XpFetch() + rcClippedRegnBounds.xpLeft; AssertIn(xpLeft, rcClippedRegnBounds.xpLeft, rcClippedRegnBounds.xpRight + 1); AssertIn(xpRight, rcClippedRegnBounds.xpLeft, rcClippedRegnBounds.xpRight + 1); regsc.XpFetch(); cbRowCopy = LwMul(kcbPixelZbmp, xpRight - xpLeft); pbSrc = _prgb + LwMul(yp / 2, _cbRow) + LwMul(kcbPixelZbmp, xpLeft); pbDst = prgbPixels + LwMul(yp / 2, cbRow) + LwMul(kcbPixelZbmp, xpLeft); CopyPb(pbSrc, pbDst, cbRowCopy); } regsc.ScanNext(2); } } /*************************************************************************** Write the ZBMP ***************************************************************************/ bool ZBMP::FWrite(PCFL pcfl, CTG ctg, CNO *pcno) { AssertThis(0); AssertPo(pcfl, 0); AssertVarMem(pcno); ZBMPF zbmpf; BLCK blck; zbmpf.bo = kboCur; zbmpf.osk = koskCur; zbmpf.xpLeft = (short)_rc.xpLeft; zbmpf.ypTop = (short)_rc.ypTop; zbmpf.dxp = (short)_rc.Dxp(); zbmpf.dyp = (short)_rc.Dyp(); if (!pcfl->FAdd(size(ZBMPF) + _cb, ctg, pcno, &blck)) return fFalse; if (!blck.FWriteRgb(&zbmpf, size(ZBMPF), 0)) return fFalse; if (!blck.FWriteRgb(_prgb, _cb, size(ZBMPF))) return fFalse; return fTrue; } #ifdef DEBUG /*************************************************************************** Assert the validity of the ZBMP. ***************************************************************************/ void ZBMP::AssertValid(ulong grf) { ZBMP_PAR::AssertValid(fobjAllocated); AssertPvCb(_prgb, _cb); Assert(_cbRow == LwMul(_rc.Dxp(), kcbPixelZbmp), "bad _cbRow"); Assert(_cb == LwMul(_rc.Dyp(), _cbRow), "bad _cb"); } /*************************************************************************** Mark memory used by the ZBMP ***************************************************************************/ void ZBMP::MarkMem(void) { AssertThis(0); ZBMP_PAR::MarkMem(); MarkPv(_prgb); } #endif // DEBUG ================================================ FILE: cmake/ExtractVersion.cmake ================================================ include_guard(GLOBAL) #[[ This is used to extract a version variable from nearly every executable in existence. How these are used is up to the user. ]] function(extract_version output) cmake_parse_arguments(ARG "" "OPTION;REGEX;COMMAND;DOC" "" ${ARGN}) unset(version-output) unset(version-check) if (NOT ARG_OPTION) set(ARG_OPTION "--version") endif() if (NOT ARG_REGEX) set(ARG_REGEX "[^0-9]*([0-9]+)[.]([0-9]+)?[.]?([0-9]+)?[.]?([0-9]+)?.*") endif() if (ARG_COMMAND AND NOT DEFINED ${output}) execute_process( COMMAND "${ARG_COMMAND}" "${ARG_OPTION}" OUTPUT_VARIABLE version-output OUTPUT_STRIP_TRAILING_WHITESPACE ENCODING UTF-8) if (version-output) string(REGEX MATCH "${ARG_REGEX}" version-check "${version-output}") endif() if (version-check) string(JOIN "." ${output} ${CMAKE_MATCH_1} ${CMAKE_MATCH_2} ${CMAKE_MATCH_3} ${CMAKE_MATCH_4}) set(${output} "${${output}}" CACHE STRING "${ARG_DOC}" FORCE) endif() endif() endfunction() ================================================ FILE: cmake/FindAudioMan.cmake ================================================ include(FindPackageHandleStandardArgs) find_library(${CMAKE_FIND_PACKAGE_NAME}_LIBRARY NAMES AUDIOS PATHS "${PROJECT_SOURCE_DIR}/kauai/elib/wins" NO_DEFAULT_PATH NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_SYSTEM_PATH NO_CMAKE_FIND_ROOT_PATH) find_package_handle_standard_args(${CMAKE_FIND_PACKAGE_NAME} REQUIRED_VARS ${CMAKE_FIND_PACKAGE_NAME}_LIBRARY) if (${CMAKE_FIND_PACKAGE_NAME}_FOUND AND NOT TARGET 3DMMForever::AudioMan) add_library(3DMMForever::AudioMan STATIC IMPORTED) set_property(TARGET 3DMMForever::AudioMan PROPERTY IMPORTED_LOCATION "${${CMAKE_FIND_PACKAGE_NAME}_LIBRARY}") # Precompiled AudioMan library does not support SafeSEH target_link_options(3DMMForever::AudioMan INTERFACE $<$:/SAFESEH:NO> ) mark_as_advanced(${CMAKE_FIND_PACKAGE_NAME}_LIBRARY) endif() ================================================ FILE: cmake/FindBRender.cmake ================================================ include(FindPackageHandleStandardArgs) # This is technically bad form because we aren't "finding" anything, however if # there is ever any hope to eventually port 3DMM to "not Windows", there needs # to be a shim of some kind for slotting in other possible releases of BRender. # # This file can be expanded *properly* at a later date. # TODO: Keep in mind the NO_<...>_PATH stuff should be removed if 3DMMForever # starts to support external versions of BRender foreach (name IN ITEMS BRFMMXR BRFWMXR BRZBMXR) foreach (cfg IN ITEMS DEBUG RELEASE RELWITHDEBINFO MINSIZEREL) set(variable ${CMAKE_FIND_PACKAGE_NAME}_${name}_${cfg}_LIBRARY) set(suffix "s") if (${cfg} STREQUAL "DEBUG") set(suffix "d") endif() find_library(${variable} NAMES ${name} PATHS "${PROJECT_SOURCE_DIR}/elib/win${suffix}" NO_DEFAULT_PATH NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_SYSTEM_PATH NO_CMAKE_FIND_ROOT_PATH) list(APPEND ${CMAKE_FIND_PACKAGE_NAME}_LIBRARIES ${variable}) endforeach() endforeach() find_package_handle_standard_args(${CMAKE_FIND_PACKAGE_NAME} REQUIRED_VARS ${${CMAKE_FIND_PACKAGE_NAME}_LIBRARIES}) if (${CMAKE_FIND_PACKAGE_NAME}_FOUND AND NOT TARGET BRender::Libraries) add_library(BRender::Libraries INTERFACE IMPORTED) foreach (library IN ITEMS BRFMMXR BRFWMXR BRZBMXR) add_library(BRender::${library} STATIC IMPORTED) set_target_properties(BRender::${library} PROPERTIES IMPORTED_LOCATION_RELEASE ${${CMAKE_FIND_PACKAGE_NAME}_${library}_RELEASE_LIBRARY} IMPORTED_LOCATION_RELWITHDEBINFO ${${CMAKE_FIND_PACKAGE_NAME}_${library}_RELWITHDEBINFO_LIBRARY} IMPORTED_LOCATION_MINSIZEREL ${${CMAKE_FIND_PACKAGE_NAME}_${library}_MINSIZEREL_LIBRARY} IMPORTED_LOCATION_DEBUG ${${CMAKE_FIND_PACKAGE_NAME}_${library}_DEBUG_LIBRARY}) target_link_libraries(BRender::Libraries INTERFACE BRender::${library}) mark_as_advanced( ${CMAKE_FIND_PACKAGE_NAME}_${library}_RELEASE_LIBRARY ${CMAKE_FIND_PACKAGE_NAME}_${library}_DEBUG_LIBRARY) endforeach() # TODO(bruxisma): This needs to be enforce ONLY when targetin Visual Studio # 2015 or later target_link_libraries(BRender::BRFWMXR INTERFACE $<$:legacy_stdio_definitions>) # Precompiled BRender libraries do not support SafeSEH target_link_options(BRender::BRFWMXR INTERFACE $<$:/SAFESEH:NO> ) endif() ================================================ FILE: cmake/FindCCache.cmake ================================================ include(FindPackageHandleStandardArgs) include(ExtractVersion) find_program(CCache_EXECUTABLE NAMES ccache) extract_version(CCache_VERSION COMMAND "${CCache_EXECUTABLE}" DOC "ccache version") find_package_handle_standard_args(CCache REQUIRED_VARS CCache_EXECUTABLE VERSION_VAR CCache_VERSION) if (CCache_FOUND AND NOT TARGET CCache::CCache) add_executable(CCache::CCache IMPORTED) set_target_properties(CCache::CCache PROPERTIES IMPORTED_LOCATION "${CCache_EXECUTABLE}" VERSION "${CCache_VERSION}") mark_as_advanced(CCache_EXECUTABLE CCache_VERSION) endif() ================================================ FILE: cmake/FindClangTidy.cmake ================================================ include(FindPackageHandleStandardArgs) include(ExtractVersion) find_program(ClangTidy_EXECUTABLE NAMES clang-tidy) extract_version(ClangTidy_VERSION COMMAND "${ClangTidy_EXECUTABLE}") find_package_handle_standard_args(ClangTidy REQUIRED_VARS ClangTidy_EXECUTABLE VERSION_VAR ClangTidy_VERSION) if (ClangTidy_FOUND AND NOT TARGET Clang::Tidy) add_executable(Clang::Tidy IMPORTED) set_target_properties(Clang::Tidy PROPERTIES IMPORTED_LOCATION "${ClangTidy_EXECUTABLE}" VERSION "${ClangTidy_VERSION}") mark_as_advanced(ClangTidy_EXECUTABLE ClangTidy_VERSION) endif() ================================================ FILE: cmake/TargetChompSources.cmake ================================================ include_guard(GLOBAL) # any values after ${target} are treated as sources function(target_chomp_sources target) # We cannot use $ because we are not generating binary # targets 😢 set(is-msvc $) set(include-directories $) set(compile-definitions $) string(CONCAT include-directories $< $: -I$,$-I> >) string(CONCAT compile-definitions $< $: -D$,$-D> >) foreach(source IN LISTS ARGN) cmake_path(GET source FILENAME filename) cmake_path(REPLACE_EXTENSION filename LAST_ONLY ".chk" OUTPUT_VARIABLE output) # Because of how files are laid out, we need to do the following line twice # but operate on the resulting path cmake_path(GET source PARENT_PATH parent) target_include_directories(${target} PRIVATE ${parent}) cmake_path(GET parent PARENT_PATH parent) target_include_directories(${target} PRIVATE ${parent}) set(output "${CMAKE_CURRENT_BINARY_DIR}/chomp/${target}/${output}") set(processed "${CMAKE_CURRENT_BINARY_DIR}/chomp/${target}/${filename}.i") add_custom_command( OUTPUT "${processed}" COMMAND "${CMAKE_CXX_COMPILER}" "$<${is-msvc}:/nologo>" "$<${is-msvc}:/E>" "$<${is-msvc}:/TP>" "${include-directories}" "${compile-definitions}" "${source}" > "${processed}" IMPLICIT_DEPENDS CXX "${source}" MAIN_DEPENDENCY "${source}" COMMENT "Preprocessing ${source}" COMMAND_EXPAND_LISTS USES_TERMINAL VERBATIM) add_custom_command( OUTPUT "${output}" COMMAND chomp /c "${processed}" "${output}" COMMENT "Chompin' ${processed}" MAIN_DEPENDENCY "${processed}" WORKING_DIRECTORY "${parent}" COMMAND_EXPAND_LISTS VERBATIM) set_property(TARGET "${target}" APPEND PROPERTY CHOMPED_CHUNKS "${output}") endforeach() add_custom_target(${target}-chomp-chunks DEPENDS $) add_dependencies(${target} ${target}-chomp-chunks) endfunction() ================================================ FILE: content-files/bkgds.3cn ================================================ [File too large to display: 28.6 MB] ================================================ FILE: content-files/makefile ================================================ TARGETS = 3dmovie.chk building.chk bldghd.chk help.chk helpaud.chk shared.chk \ studio.chk sharecd.chk !IF EXIST($(SOC_ROOT)\obj\wind\building.chk) TARGETS = $(TARGETS) buildingd.chk !ENDIF !IF EXIST($(SOC_ROOT)\obj\wind\bldghd.chk) TARGETS = $(TARGETS) bldghdd.chk !ENDIF !IF EXIST($(SOC_ROOT)\obj\wind\help.chk) TARGETS = $(TARGETS) helpd.chk !ENDIF !IF EXIST($(SOC_ROOT)\obj\wind\helpaud.chk) TARGETS = $(TARGETS) helpaudd.chk !ENDIF !IF EXIST($(SOC_ROOT)\obj\wind\shared.chk) TARGETS = $(TARGETS) sharedd.chk !ENDIF !IF EXIST($(SOC_ROOT)\obj\wind\sharecd.chk) TARGETS = $(TARGETS) sharecdd.chk !ENDIF !IF EXIST($(SOC_ROOT)\obj\wind\studio.chk) TARGETS = $(TARGETS) studiod.chk !ENDIF all: $(TARGETS) # # Update 3dmovie.chk when either the SHIP or DEBUG version has changed; if # they're both out of date, go with the SHIP version (most of the time, they'll # be the same, and it's more complicated than it's worth to try to get the # most-recent one out of those two; if it's *really* important, then just run # the makefile twice...the genuine most-recent version will get copied the # second time around, if it was the DEBUG version). # 3dmovie.chk : $(SOC_ROOT)\obj\wind\3dmovie.chk $(SOC_ROOT)\obj\wins\3dmovie.chk if "%s" == "$?" copy %s $@ if not "%s" == "$?" copy $(SOC_ROOT)\obj\wins\3dmovie.chk $@ # SHIP versions of .chk files -- Must exist building.chk : $(SOC_ROOT)\obj\wins\building.chk copy $? $@ bldghd.chk : $(SOC_ROOT)\obj\wins\bldghd.chk copy $? $@ help.chk : $(SOC_ROOT)\obj\wins\help.chk copy $? $@ helpaud.chk : $(SOC_ROOT)\obj\wins\helpaud.chk copy $? $@ shared.chk : $(SOC_ROOT)\obj\wins\shared.chk copy $? $@ sharecd.chk : $(SOC_ROOT)\obj\wins\sharecd.chk copy $? $@ studio.chk : $(SOC_ROOT)\obj\wins\studio.chk copy $? $@ # DEBUG versions of .chk files -- Optional buildingd.chk : $(SOC_ROOT)\obj\wind\building.chk copy $? $@ bldghdd.chk : $(SOC_ROOT)\obj\wind\bldghd.chk copy $? $@ helpd.chk : $(SOC_ROOT)\obj\wind\help.chk copy $? $@ helpaudd.chk : $(SOC_ROOT)\obj\wind\helpaud.chk copy $? $@ sharedd.chk : $(SOC_ROOT)\obj\wind\shared.chk copy $? $@ sharecdd.chk : $(SOC_ROOT)\obj\wind\sharecd.chk copy $? $@ studiod.chk : $(SOC_ROOT)\obj\wind\studio.chk copy $? $@ ================================================ FILE: content-files/snds.3cn ================================================ [File too large to display: 10.8 MB] ================================================ FILE: content-files/tmpls.3cn ================================================ [File too large to display: 30.5 MB] ================================================ FILE: docker-compose.yaml ================================================ version: "3.9" services: 3dmmforever-build: image: 3dmmforever-build container_name: 3dmmforever-build build: . volumes: - .:C:\3d working_dir: C:\3d command: > C:\\Program Files (x86)\\Microsoft Visual Studio\\2022\\BuildTools\\Common7\\Tools\\VsDevCmd.bat && cmake --preset x86:msvc:debug && cmake --build build && cmake --install build ================================================ FILE: inc/actor.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /******************************************************************* Actor class Primary Author : ***** Review Status: Reviewed BASE -------> ACTR Each actor has a unique route which is defined by one or more nodes, and which may be a concatenation of one or more subroutes. Each actor also has an event list describing events which happen at a specified time and point along the route. A point may coincide with a node or lie between nodes. *******************************************************************/ #ifndef ACTOR_H #define ACTOR_H // // XYZ : A point in x,y,z along an actor's RouTE. // struct XYZ { BRS dxr; BRS dyr; BRS dzr; bool operator==(XYZ &xyz) { return ((dxr == xyz.dxr) && (dyr == xyz.dyr) && (dzr == xyz.dzr)); } bool operator!=(XYZ &xyz) { return ((dxr != xyz.dxr) || (dyr != xyz.dyr) || (dzr != xyz.dzr)); } }; typedef XYZ *PXYZ; const BOM kbomXyz = 0xfc000000; // // A RouTE is a general list (GL) of Route PoinTs(RPT) // A Subroute is a contiguous section of a route. // struct RPT { XYZ xyz; BRS dwr; // Distance from this node to the next node on the route }; const BOM kbomRpt = 0xff000000; const long knfrmInvalid = klwMax; // invalid frame state. Regenerate correct state const long kcrptGrow = 32; // quantum growth for rpt const long kcsmmGrow = 2; // quantum growth for smm const long kctagSndGrow = 2; // quantum growth for tagSnd const long smmNil = -1; // Not motion match sound const BRS kdwrNil = BR_SCALAR(-1.0); // flags use of template cel stepsize const BRS kzrDefault = BR_SCALAR(-25.0); // initial default z position const BRS kdwrMax = BR_SCALAR(32767.0); // large BRS value const ulong kdtsThreshRte = (kdtsSecond >> 2) + (kdtsSecond >> 1); // time threshhold before record in place const BRS kdwrThreshRte = BR_SCALAR(2.0); // distance threshhold before entering record mode const long kcaevInit = 10; const BRS kdwrFast = BR_SCALAR(3.0); // delta world coord change for fast mouse move const BRS krOriWeightMin = BR_SCALAR(0.1); // orientation weighting for slow mouse move const BRS krAngleMin = BR_SCALAR(0.1); // Min angle impacting amount of forward movement on placement const BRS krAngleMinRcp = BR_RCP(krAngleMin); const BRS krAngleMax = BR_SCALAR(0.4); // Max angle impacting amount of forward movement on placement const BRS krScaleMinFactor = (BR_SCALAR(0.1)); // Min scaling between Brender update const auto krScaleMaxFactor = BrsDiv(rOne, krScaleMinFactor); // Max scaling between Brender update const auto krScaleMin = (BR_SCALAR(0.25)); // Min scaling const auto krScaleMax = (BR_SCALAR(10.0)); // Max scaling const auto krPullMin = krScaleMin; const auto krPullMax = BrsDiv(rOne, krPullMin); #define aridNil ivNil // Angle valid flags enum { fbraRotateX = factnRotateX, fbraRotateY = factnRotateY, fbraRotateZ = factnRotateZ }; // Normalize flags enum { fnormSize = 1, fnormRotate = 2 }; // Mouse Actor flags enum { fmafNil = 0, fmafFreeze = 0x01, // freeze cels fmafGround = 0x02, // respect ground level fmafOrient = 0x04, // orient actor during move fmafEntireScene = 0x08, // position over entire scene, vs subroute only fmafEntireSubrte = 0x10 // position over entire subroute }; struct RTEL // RouTE Location - a function of space and time { int irpt; // The preceding node for the given point BRS dwrOffset; // Absolute linear distance beyond node irpt long dnfrm; // Delta frame number (ie, time) at this point bool operator==(RTEL &rtel) { return (irpt == rtel.irpt && dwrOffset == rtel.dwrOffset && dnfrm == rtel.dnfrm); } bool operator!=(RTEL &rtel) { return (irpt != rtel.irpt || dwrOffset != rtel.dwrOffset || dnfrm != rtel.dnfrm); } bool operator<=(RTEL &rtel) { return (irpt < rtel.irpt || (irpt == rtel.irpt && (dwrOffset < rtel.dwrOffset || (dwrOffset == rtel.dwrOffset && dnfrm <= rtel.dnfrm)))); } bool operator>=(RTEL &rtel) { return (irpt > rtel.irpt || (irpt == rtel.irpt && (dwrOffset > rtel.dwrOffset || (dwrOffset == rtel.dwrOffset && dnfrm >= rtel.dnfrm)))); } bool operator<(RTEL &rtel) { return (irpt < rtel.irpt || (irpt == rtel.irpt && (dwrOffset < rtel.dwrOffset || (dwrOffset == rtel.dwrOffset && dnfrm < rtel.dnfrm)))); } bool operator>(RTEL &rtel) { return (irpt > rtel.irpt || (irpt == rtel.irpt && (dwrOffset > rtel.dwrOffset || (dwrOffset == rtel.dwrOffset && dnfrm > rtel.dnfrm)))); } }; // Actor EVents are stored in a GG (general group) // Fixed part of the GG: struct AEV { long aet; // Actor Event Type long nfrm; // Absolute frame number (* Only valid < current event) RTEL rtel; // RouTE Location for this event }; // Additional event parameters (in the GG) typedef AEV *PAEV; // // Actor level Event Types which live in a GG. // The fixed part of a GG entry is an actor event (aev) // The variable part is documented in the following comments // enum AET { aetAdd, // Add Actor onstage: aevadd - internal (no api) aetActn, // Animate Actor : aevactn aetCost, // Set Costume : aevcost aetRotF, // Transform Actor rotate: BMAT34 aetPull, // Transform Actor Pull : aevpull aetSize, // Transform Actor size uniformly : BRS aetSnd, // Play a sound : aevsnd aetMove, // Translate the path at this point : XYZ aetFreeze, // Freeze (or Un) Actor : long aetTweak, // Path tweak : XYZ aetStep, // Force step size (eg, float, wait) : BRS aetRem, // Remove an actor from the stage : nil aetRotH, // Single frame rotation : BMAT34 aetLim }; const BOM kbomAet = 0xc0000000; const BOM kbomAev = 0xff000000; // // Variable part of the Actor EVent GG: // struct AEVPULL // Squash/stretch { BRS rScaleX; BRS rScaleY; BRS rScaleZ; }; const BOM kbomAevpull = 0xfc000000; // Every subroute is normalized. The normalization translation is // stored in the Add Event // ** nfrmPrev valid for nfrmSub <= _nfrmCur only (optimization) struct AEVADD { BRS dxr; // Translation in x for this subroute BRS dyr; // Translation in y for this subroute BRS dzr; // Translation in z for this subroute BRA xa; // Single point orientation BRA ya; // Single point orientation BRA za; // Single point orientation }; const BOM kbomAevadd = 0xffc00000 | kbomBmat34 >> 10; struct AEVACTN { long anid; long celn; // starting cel of action }; const BOM kbomAevactn = 0xf0000000; struct AEVCOST { long ibset; // body part set long cmid; // costume ID (for custom costumes) tribool fCmtl; // vs fMtrl TAG tag; }; const BOM kbomAevcost = 0xfc000000 | (kbomTag >> 6); struct AEVSND { tribool fLoop; // loop count tribool fQueue; // queued sound long vlm; // volume long celn; // motion match : ivNil if not long sty; // sound type tribool fNoSound; // no sound CHID chid; // user sound requires chid TAG tag; }; const BOM kbomAevsnd = 0xfff00000 | (kbomTag >> 12); const BOM kbomAevsize = 0xc0000000; const BOM kbomAevfreeze = 0xc0000000; const BOM kbomAevstep = 0xc0000000; const BOM kbomAevmove = kbomXyz; const BOM kbomAevtweak = kbomXyz; const BOM kbomAevrot = kbomBmat34; // Separate ggaev variable portion sizes #define kcbVarAdd (size(AEVADD)) #define kcbVarActn (size(AEVACTN)) #define kcbVarCost (size(AEVCOST)) #define kcbVarRot (size(BMAT34)) #define kcbVarSize (size(BRS)) #define kcbVarPull (size(AEVPULL)) #define kcbVarSnd (size(AEVSND)) #define kcbVarFreeze (size(long)) #define kcbVarMove (size(XYZ)) #define kcbVarTweak (size(XYZ)) #define kcbVarStep (size(BRS)) #define kcbVarZero (0) // Actor Event Flags enum { faetNil = 0, faetAdd = 1 << aetAdd, faetActn = 1 << aetActn, faetCost = 1 << aetCost, faetRotF = 1 << aetRotF, faetPull = 1 << aetPull, faetSize = 1 << aetSize, faetFreeze = 1 << aetFreeze, faetTweak = 1 << aetTweak, faetStep = 1 << aetStep, faetRem = 1 << aetRem, faetMove = 1 << aetMove, faetRotH = 1 << aetRotH }; // // Because rotations are non-abelian, cumulative rotations are stored // in a BMAT34. It would not be correct to multiply (xa,ya,za) values // treating x,y,z independently. // // Bmat34Fwd does NOT include the path portion of the orientation. // Bmat34Cur includes all current angular rotation - path rotation is NOT post // applied to this. // // Careful: The task is complicated by the fact that users can apply single // frame and frame forward orientations in the same frame and must not see the // actor jump in angle when choosing between the two methods of editing. // struct XFRM { BMAT34 bmat34Fwd; // Rotation fwd : path rotation post applied to this AEVPULL aevpull; // Stretching (pulling) constants BRS rScaleStep; // Uniform scaling to be applied to step size BMAT34 bmat34Cur; // <> Single frame & static segment rotation BRA xaPath; // Path portion of the current frame's rotation BRA yaPath; // Path portion of the current frame's rotation BRA zaPath; // Path portion of the current frame's rotation }; // // Current action Motion Match Sounds // Aev & Aevsnd grouped together form a gl // Not to be saved with a movie // struct SMM { AEV aev; // event for the sound AEVSND aevsnd; }; // // Default hilite colors // #define kiclrNormalHilite 108 #define kiclrTimeFreezeHilite 43 /*********************************************** Actor Class ***********************************************/ typedef class ACTR *PACTR; #define ACTR_PAR BASE #define kclsACTR 'ACTR' class ACTR : public ACTR_PAR { RTCLASS_DEC ASSERT MARKMEM protected: // Components of an actor // Note: In addition to these components, any complete actor must // have either fLifeDirty set or _nfrmLast current. // Note: _tagTmpl cannot be derived from _ptmpl PGG _pggaev; // GG pointer to Actor EVent list PGL _pglrpt; // GL pointer to actor's route TMPL *_ptmpl; // Actor body & action list template BODY *_pbody; // Actor's body TAG _tagTmpl; // Note: The sid cannot be queried at save time TAG _tagSnd; // Sound (played on entrance) SCEN *_pscen; // Underlying scene XYZ _dxyzFullRte; // Origin of the route long _nfrmFirst; // klwMax -or- First frame : Set when event created long _arid; // Unique id assigned to this actor. ulong _grfactn; // Cached current grfactn // Frame Dependent State Information XYZ _dxyzRte; //_dxyzFullRte + _dxyzSubRte : Set when Add processed XYZ _dxyzSubRte; // Subpath translation : Set when Add processed bool _fOnStage : 1; // Versus Brender hidden. Set by Add, Rem only bool _fFrozen : 1; // Path offset > 0 but not moving bool _fLifeDirty : 1; // Set if _nfrmLast requires recomputation bool _fPrerendered : 1; // Set if actor is prerendered bool _fUseBmat34Cur : 1; //_xfrm.bmat34Cur last used in orienting actor BRS _dwrStep; // Current step size in use long _anidCur; // Current action in template long _ccelCur; // Cached cel count. Retrieving this was hi profile. long _celnCur; // Current cell long _nfrmCur; // Current frame number : Set by FGotoFrame long _nfrmLast; // Latest known frame for this actor. long _iaevCur; // Current event in event list long _iaevFrmMin; // First event in current frame long _iaevActnCur; // Event defining current action long _iaevAddCur; // Most recent add (useful for Compose) RTEL _rtelCur; // Current location on route (excludes tweak info) XYZ _xyzCur; // Last point displayed (may be tweak modified) XFRM _xfrm; // Current transformation PGL _pglsmm; // Current action motion match sounds // Path Recording State Information RTEL _rtelInsert; // Joining information ulong _tsInsert; // Starting time of route recording bool _fModeRecord : 1; // Record a route mode bool _fRejoin : 1; // Rerecord is extending a subpath from the end bool _fPathInserted : 1; // More path inserted bool _fTimeFrozen : 1; // Is the actor frozen wrt time? long _dnfrmGap; // Frames between subroutes XYZ _dxyzRaw; // Raw mouse movement from previous frame // // Protected functions // ACTR(void); bool _FInit(TAG *ptmplTag); // Constructor allocation & file I/O void _InitXfrmRot(BMAT34 *pbmat34); // Initialize rotation only void _InitXfrm(void); // Initialize rotation & scaling bool _FCreateGroups(void); void _InitState(void); void _GetNewOrigin(BRS *pxr, BRS *pyr, BRS *pzr); void _SetStateRewound(void); bool _FQuickBackupToFrm(long nfrm, bool *pfQuickMethodValid); bool _FGetRtelBack(RTEL *prtel, bool fUpdateStateVar); bool _FDoFrm(bool fPositionBody, bool *pfPositionDirty, bool *pfSoundInFrame = pvNil); bool _FGetStatic(long anid, bool *pfStatic); bool _FIsDoneAevSub(long iaev, RTEL rtel); bool _FIsAddNow(long iaev); bool _FGetDwrPlay(BRS *pdwr); // Step size if playing bool _FGetDwrRecord(BRS *pdwr); // Step size if recording bool _FDoAevCur(void); bool _FDoAevCore(long iaev); bool _FDoAetVar(long aet, void *pvVar, long cbVar); bool _FEnqueueSnd(long iaev); bool _FEnqueueSmmInMsq(void); bool _FInsertSmm(long iaev); bool _FRemoveAevMm(long anid); bool _FAddAevDefMm(long anid); bool _FAddDoAev(long aetNew, long kcbNew, void *pvVar); void _MergeAev(long iaevFirst, long iaevLast, long *piaevNew = pvNil); bool _FFreeze(void); // insert freeze event bool _FUnfreeze(void); // insert unfreeze event void _Hide(void); bool _FInsertGgRpt(long irpt, RPT *prpt, BRS dwrPrior = rZero); bool _FAddAevFromPrev(long iaevLim, ulong grfaet); bool _FAddAevFromLater(void); bool _FFindNextAevAet(long aet, long iaevCur, long *piaevAdd); bool _FFindPrevAevAet(long aet, long iaevCur, long *piaevAdd); void _FindAevLastSub(long iaevAdd, long iaevLim, long *piaevLast); void _DeleteFwdCore(bool fDeleteAll, bool *pfAlive = pvNil, long iaevCur = ivNil); bool _FDeleteEntireSubrte(void); void _DelAddFrame(long iaevAdd, long iaevLim); void _UpdateXyzRte(void); bool _FInsertAev(long iaev, long cbNew, void *pvVar, void *paev, bool fUpdateState = fTrue); void _RemoveAev(long iaev, bool fUpdateState = fTrue); void _PrepXfrmFill(long aet, void *pvVar, long cbVar, long iaevMin, long iaevCmp = ivNil, ulong grfaet = faetNil); void _PrepActnFill(long iaevMin, long anidPrev, long anidNew, ulong grfaet); void _PrepCostFill(long iaevMin, AEVCOST *paevcost); void _AdjustAevForRteIns(long irptAdjust, long iaevMin); void _AdjustAevForRteDel(long irptAdjust, long iaevMin); bool _FInsertStop(void); void _CalcRteOrient(BMAT34 *pbmat34, BRA *pxa = pvNil, BRA *pya = pvNil, BRA *pza = pvNil, ulong *pgrfbra = pvNil); void _ApplyRotFromVec(XYZ *pxyz, BMAT34 *pbmat34, BRA *pxa = pvNil, BRA *pya = pvNil, BRA *pza = pvNil, ulong *grfbra = pvNil); void _SaveCurPathOrien(void); void _LoadAddOrien(AEVADD *paevadd, bool fNoReset = fFalse); BRA _BraAvgAngle(BRA a1, BRA a2, BRS rw); void _UpdateXyzTan(XYZ *pxyz, long irptTan, long rw); void _AdvanceRtel(BRS dwrStep, RTEL *prtel, long iaevCur, long nfrmCur, bool *pfEndRoute); void _GetXyzFromRtel(RTEL *prtel, PXYZ pxyz); void _GetXyzOnLine(PXYZ pxyzFirst, PXYZ pxyzSecond, BRS dwrOffset, PXYZ pxyz); void _PositionBody(PXYZ pxyz); void _MatrixRotUpdate(XYZ *pxyz, BMAT34 *pbmat34); void _TruncateSubRte(long irptDelLim); bool _FComputeLifetime(long *pnfrmLast = pvNil); bool _FIsStalled(long iaevFirst, RTEL *prtel, long *piaevLast = pvNil); void _RestoreFromUndo(PACTR pactrRestore); bool _FDupCopy(PACTR pactrSrc, PACTR pactrDest); bool _FWriteTmpl(PCFL pcfl, CNO cno); bool _FReadActor(PCFL pcfl, CNO cno); bool _FReadRoute(PCFL pcfl, CNO cno); bool _FReadEvents(PCFL pcfl, CNO cno); static void _SwapBytesPggaev(PGG pggaev); bool _FOpenTags(PCRF pcrf); static bool _FIsIaevTag(PGG pggaev, long iaev, PTAG *pptag, PAEV *pqaev = pvNil); void _CloseTags(void); public: ~ACTR(void); static PACTR PactrNew(TAG *ptagTmpl); void SetPscen(SCEN *pscen); void SetArid(long arid) { AssertBaseThis(0); _arid = arid; } void SetLifeDirty(void) { AssertBaseThis(0); _fLifeDirty = fTrue; } PSCEN Pscen(void) { AssertThis(0); return _pscen; } // ActrSave Routines static PACTR PactrRead(PCRF pcrf, CNO cno); // Construct from a document bool FWrite(PCFL pcfl, CNO cno, CNO cnoScene); // Write to a document static PGL PgltagFetch(PCFL pcfl, CNO cno, bool *pfError); static bool FAdjustAridOnFile(PCFL pcfl, CNO cno, long darid); // Visibility void Hilite(void); void Unhilite(void) { AssertBaseThis(0); _pbody->Unhilite(); } void Hide(void) { AssertBaseThis(0); _pbody->Hide(); } void Show(void) { AssertBaseThis(0); _pbody->Show(); } bool FIsInView(void) { AssertBaseThis(0); return _pbody->FIsInView(); } void GetCenter(long *pxp, long *pyp) { AssertBaseThis(0); _pbody->GetCenter(pxp, pyp); } void GetRcBounds(RC *prc) { AssertBaseThis(0); _pbody->GetRcBounds(prc); } void SetPrerendered(bool fPrerendered) { AssertBaseThis(0); _fPrerendered = fPrerendered; } bool FPrerendered(void) { AssertBaseThis(0); return _fPrerendered; } // Actor Information long Arid(void) { AssertBaseThis(0); return (_arid); } bool FOnStage(void) { AssertBaseThis(0); return (_fOnStage); } bool FIsMyBody(BODY *pbody) { AssertBaseThis(0); return pbody == _pbody; } bool FIsMyTmpl(TMPL *ptmpl) { AssertBaseThis(0); return _ptmpl == ptmpl; } bool FIsModeRecord(void) { AssertBaseThis(0); return FPure(_fModeRecord); } bool FIsRecordValid(BRS dxr, BRS dyr, BRS dzr, ulong tsCurrent); PTMPL Ptmpl(void) { AssertBaseThis(0); return _ptmpl; } PBODY Pbody(void) { AssertBaseThis(0); return _pbody; } long AnidCur(void) { AssertBaseThis(0); return _anidCur; } long CelnCur(void) { AssertBaseThis(0); return _celnCur; } bool FFrozen(void) { AssertBaseThis(0); return _fFrozen; } bool FGetLifetime(long *pnfrmFirst, long *pnfrmLast); // allows nil ptrs bool FPtIn(long xp, long yp, long *pibset); void GetTagTmpl(PTAG ptag) { AssertBaseThis(0); *ptag = _tagTmpl; } void GetName(PSTN pstn); bool FChangeTagTmpl(PTAG ptagTmplNew); bool FTimeFrozen(void) { AssertBaseThis(0); return _fTimeFrozen; } void SetTimeFreeze(bool fTimeFrozen) { AssertBaseThis(0); _fTimeFrozen = fTimeFrozen; } bool FIsPropBrws(void) { AssertThis(0); return FPure(_ptmpl->FIsProp() || _ptmpl->FIsTdt()); } bool FIsTdt(void) { AssertThis(0); return FPure(_ptmpl->FIsTdt()); } bool FMustRender(long nfrmRenderLast); void GetXyzWorld(BRS *pxr, BRS *pyr, BRS *pzr); // Animation bool FGotoFrame(long nfrm, bool *pfSoundInFrame = pvNil); // Prepare for display at frame nfrm bool FReplayFrame(long grfscen); // Replay a frame. // Event Editing bool FAddOnStageCore(void); bool FSetActionCore(long anid, long celn, bool fFreeze); bool FRemFromStageCore(void); bool FSetCostumeCore(long ibsetClicked, TAG *ptag, long cmid, tribool fCustom); bool FSetStep(BRS dwrStep); bool FRotate(BRA xa, BRA ya, BRA za, bool fFromHereFwd); bool FNormalizeCore(ulong grfnorm); void SetAddOrient(BRA xa, BRA ya, BRA za, ulong grfbra, XYZ *pdxyz = pvNil); bool FScale(BRS rScaleStep); bool FPull(BRS rScaleX, BRS rScaleY, BRS rScaleZ); void DeleteFwdCore(bool fDeleteAll, bool *pfAlive = pvNil, long iaevCur = ivNil); void DeleteBackCore(bool *pfAlive = pvNil); bool FSoonerLater(long dnfrm); // ActrEdit Routines bool FDup(PACTR *ppactr, bool fReset = fFalse); // Duplicate everything void Restore(PACTR pactr); bool FCreateUndo(PACTR pactr, bool fSndUndo = fFalse, PSTN pstn = pvNil); // Create undo object void Reset(void); bool FAddOnStage(void); // add actor to the stage, w/Undo bool FSetAction(long anid, long celn, bool fFreeze, PACTR *ppactrDup = pvNil); bool FSetCostume(long ibset, TAG *ptag, long cmid, tribool fCustom); bool FRemFromStage(void); // add event: rem actor from stage, w/Undo bool FCopy(PACTR *ppactr, bool fEntireScene = fFalse); // Duplicate actor from this frame on bool FCopyRte(PACTR *ppactr, bool fEntireScene = fFalse); // Duplicate path from this frame on bool FPasteRte(PACTR pactr); // Paste from clipboard from this frame on bool FNormalize(ulong grfnorm); bool FPaste(long nfrm, SCEN *pscen); bool FDelete(bool *pfAlive, bool fDeleteAll); // ActrSnd Routines bool FSetSnd(PTAG ptag, tribool fLoop, tribool fQueue, tribool fActnCel, long vlm, long sty); bool FSetSndCore(PTAG ptag, tribool fLoop, tribool fQueue, tribool fActnCel, long vlm, long sty); bool FSetVlmSnd(long sty, bool fMotionMatch, long vlm); // Set the volume of a sound bool FQuerySnd(long sty, bool fMotionMatch, PGL *pglTagSnd, long *pvlm, bool *pfLoop); bool FDeleteSndCore(long sty, bool fMotionMatch); bool FSoundInFrm(void); bool FResolveAllSndTags(CNO cnoScen); // Route Definition void SetTsInsert(ulong tsCurrent) { AssertBaseThis(0); _tsInsert = tsCurrent; } bool FBeginRecord(ulong tsCurrent, bool fReplace, PACTR pactrRestore); bool FRecordMove(BRS dxr, BRS dyr, BRS dzr, ulong grfmaf, ulong tsCurrent, bool *pfLonger, bool *pfStep, PACTR pactrRestore); bool FEndRecord(bool fReplace, PACTR pactrRestore); bool FTweakRoute(BRS dxr, BRS dyr, BRS dzr, ulong grfmaf = fmafNil); bool FMoveRoute(BRS dxr, BRS dyr, BRS dzr, bool *pfMoved = pvNil, ulong grfmaf = fmafNil); }; // // Actor document for clipping // typedef class ACLP *PACLP; #define ACLP_PAR DOCB #define kclsACLP 'ACLP' class ACLP : public ACLP_PAR { RTCLASS_DEC MARKMEM ASSERT protected: PACTR _pactr; bool _fRteOnly; STN _stnName; ACLP(void) { } public: // // Constructors and destructors // static PACLP PaclpNew(PACTR pactr, bool fRteOnly, bool fEndScene = fFalse); ~ACLP(void); // // Pasting function // bool FPaste(PMVIE pmvie); bool FRouteOnly(void) { return _fRteOnly; } }; #endif //! ACTOR_H ================================================ FILE: inc/ape.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** ape.h: Actor preview entity Primary Author: ****** Review Status: REVIEWED - any changes to this file must be reviewed! BASE ---> CMH ---> GOB ---> APE ***************************************************************************/ #ifndef APE_H #define APE_H // APE tool types enum { aptNil = 0, aptIncCmtl, // Increment CMTL aptIncAccessory, // Increment Accessory aptGms, // Material (MTRL or CMTL) aptLim }; // Generic material spec struct GMS { bool fValid; // if fFalse, ignore this GMS bool fMtrl; // if fMtrl is fTrue, tagMtrl is valid. Else cmid is valid long cmid; TAG tagMtrl; }; // Actor preview entity tool struct APET { long apt; GMS gms; }; /**************************************** Actor preview entity class ****************************************/ typedef class APE *PAPE; #define APE_PAR GOB #define kclsAPE 'APE' class APE : public APE_PAR { RTCLASS_DEC ASSERT MARKMEM CMD_MAP_DEC(APE) protected: PBWLD _pbwld; // BRender world to draw actor in PTMPL _ptmpl; // Template (or TDT) of the actor being previewed PBODY _pbody; // Body of the actor being previewed APET _apet; // Currently selected tool PGL _pglgms; // What materials are attached to what body part sets long _celn; // Current cel of action CLOK _clok; // To time cel cycling BLIT _blit; // BRender light data BACT _bact; // BRender light actor long _anid; // Current action ID long _iview; // Current camera view bool _fCycleCels; // If cycling cels PRCA _prca; // resource source (for cursors) long _ibsetOnlyAcc; // ibset of accessory, if only one (else ivNil) protected: APE(PGCB pgcb) : GOB(pgcb), _clok(CMH::HidUnique()) { } bool _FInit(PTMPL ptmpl, PCOST pcost, long anid, bool fCycleCels, PRCA prca); void _InitView(void); void _SetScale(void); void _UpdateView(void); bool _FApplyGms(GMS *pgms, long ibset); bool _FIncCmtl(GMS *pgms, long ibset, bool fNextAccessory); long _CmidNext(long ibset, long icmidCur, bool fNextAccessory); public: static PAPE PapeNew(PGCB pgcb, PTMPL ptmpl, PCOST pcost, long anid, bool fCycleCels, PRCA prca = pvNil); ~APE(); void SetToolMtrl(PTAG ptagMtrl); void SetToolCmtl(long cmid); void SetToolIncCmtl(void); void SetToolIncAccessory(void); bool FSetAction(long anid); bool FCmdNextCel(PCMD pcmd); void SetCustomView(BRA xa, BRA ya, BRA za); void ChangeView(void); virtual void Draw(PGNV pgnv, RC *prcClip); virtual bool FCmdMouseMove(PCMD_MOUSE pcmd); virtual bool FCmdTrackMouse(PCMD_MOUSE pcmd); bool FChangeTdt(PSTN pstn, long tdts, PTAG ptagTdf); bool FSetTdtMtrl(PTAG ptagMtrl); bool FGetTdtMtrlCno(CNO *pcno); void GetTdtInfo(PSTN pstn, long *ptdts, PTAG ptagTdf); long Anid(void) { return _anid; } long Celn(void) { return _celn; } void SetCycleCels(bool fOn); bool FIsCycleCels(void) { return _fCycleCels; } bool FDisplayCel(long celn); long Cbset(void) { return _pbody->Cbset(); } // Returns fTrue if a material was applied to this ibset bool FGetMaterial(long ibset, tribool *pfMtrl, long *pcmid, TAG *ptagMtrl); }; #endif APE_H ================================================ FILE: inc/assert.chh ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /***************************************************************************** * * ASSERT.CHH * * Copyright (C) Microsoft Corporation 1995. * All Rights reserved. * ****************************************************************************** * * Module Intent * * Contains ASSERT macros used for debugging chunky files. Note: the * expression passed to the ASSERT macro is thrown away in the non-debug * build, but the expression passed to the VERIFY macro is executed in the * non-debug build. * e.g. ASSERT(.next == 0); * e.g. VERIFY(Launch("Notepad.exe")); * * A DEBUGCMD(cmd); macro is also provided. This is equivalent to: * #ifdef DEBUG * cmd; * #endif // DEBUG * and is provided mainly to wrap Print and PrintStr commands. In non-debug * builds, the DEBUGCMD and its argument are both thrown away. * ****************************************************************************** * * Revision History: Created 5/31/95 by *****. * * 06/02/95 ***** Added DEBUGCMD macro; renamed file from ASSERT.H to * ASSERT.CHH. * *****************************************************************************/ #ifndef ASSERT_CHH #define ASSERT_CHH /***************************************************************************** * * * Macros * * * *****************************************************************************/ #ifdef DEBUG #define ASSERT(f) \ If (!(f)); \ AlertStr("Assertion failed: ", __FILE__, ", line ", NumToStr(__LINE__,"")); \ End #define VERIFY(f) \ If (!(f)); \ AlertStr("Assertion failed: ", __FILE__, ", line ", NumToStr(__LINE__,"")); \ End #define DEBUGCMD(cmd) cmd #else // NOT DEBUG #define ASSERT(f) #define VERIFY(f) f #define DEBUGCMD(cmd) #endif // DEBUG #endif // ASSERT_CHH ================================================ FILE: inc/balloons.chh ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // ----------------------------------------------------- // Help balloon and control definitions // ----------------------------------------------------- #ifndef BALLOONS_CHH #define BALLOONS_CHH // misc defs, balloons, objects, etc. #define kgobBalloon1 0x00016001 #define kgobBalloonAlert 0x00016002 #define kgobBalloonBlank 0x00016003 #define kgobBalloonBorder1 0x00016004 #define kgobHelpCheck 0x00016005 #define kgobBalloonTip 0x00016006 #define kgobBalloon1d 0x00016007 #define kgobBalloon1e 0x00016008 #define kgobBalloon1a 0x00016009 #define kgobVoiceOver 0x0001600a #define kgobBookTitle 0x0001600b #define kgobBalloonLabel 0x0001600c #define kgobBalloonToolTip 0x0001600d #define gobBalloonToolTip 0x0001600d #define kgobBalloonToolTopic 0x0001600e #define kgobBalloonPageLeft 0x0001600f #define kgobBalloonPageRight 0x00016010 #define kgobHelpBookToolTopics 0x00016011 #define kgobBalloonHowtoSeq 0x00016012 #define kgobBalloonProject 0x00016013 #define kgobBalloonGuideHelp 0x00016014 #define kgobCalloutBalloon0 0x00016015 #define kgobCalloutBalloon1 0x00016016 #define kgobCalloutBalloon2 0x00016017 #define kgobCalloutBalloon3 0x00016018 #define kgobCalloutBalloon4 0x00016019 #define kgobCalloutBalloon5 0x0001601a #define kgobCalloutBalloon6 0x0001601b #define kgobCalloutBalloon7 0x0001601c #define kgobCalloutBalloon8 0x0001601d #define kgobCalloutBalloonP 0x0001601e #define kgobCalloutBalloonAO 0x0001601f #define kgobCalloutHTBalloon0 0x00016020 #define kgobCalloutHTBalloon1 0x00016021 #define kgobCalloutHTBalloon2 0x00016022 #define kgobCalloutHTBalloon3 0x00016023 #define kgobCalloutHTBalloon4 0x00016024 #define kgobCalloutHTBalloon5 0x00016025 #define kgobCalloutHTBalloon6 0x00016026 #define kgobCalloutHTBalloon7 0x00016027 #define kgobCalloutHTBalloon8 0x00016028 #define kgobCalloutHTBalloonP 0x00016029 #define kgobQueryTopics 0x0001602a #define kgobBalloonToolTipAO 0x0001602b #define kgobBalloonHotHelp 0x0001602c #define kgobBalloonHotGadgetHelp 0x0001602d #define kgobBalloonToolTip2 0x0001602e #define kgobEaselBalloon4 0x0001602f #define kgobEaselBalloon6 0x00016030 #define kgobEaselBalloon2 0x00016031 #define kgobEaselBalloonP 0x00016032 // objects #define kgobHelpSquishy 0x00016100 #define _gobHelpSquishy 0x00016100 #define kgobTipKey 0x00016101 #define _gobTipKey 0x00016101 #define kgobTipGem 0x00016102 #define _gobTipGem 0x00016102 #define kgobOkButton 0x00016103 #define kgobQuestionButton 0x00016104 #define kgobCancelButton 0x00016105 #endif ================================================ FILE: inc/biopage.chh ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // file to build the actor bio pages #define kgobBioPage 0x00015100 #define kgobBioBook 0x00015101 #define kgobBioActors 0x00015102 #define kgobBioCancel 0x00015103 #define kgobBioFwd 0x00015104 #define kgobBioBack 0x00015105 #define kgobBlankBalloon 0x00015106 #define kgobPopTip 0x00015107 #define kgobBioPanel 0x00015108 #define kgobBioHolder 0x00015109 #define kgobBioResizable 0x0001510a #define kgobBioPageHolder 0x0001510b #define ktpcBioPage1 0x00015201 #define ktpcBioPage2 0x00015202 #define ktpcBioPage3 0x00015203 #define ktpcBioPage4 0x00015204 #define ktpcBioPage5 0x00015205 #define ktpcBioPage6 0x00015206 #define ktpcBioPage7 0x00015207 #define ktpcBioPage8 0x00015208 #define ktpcBioPage9 0x00015209 #define ktpcBioPage10 0x0001520a #define ktpcBioPage11 0x0001520b #define ktpcBioPage12 0x0001520c #define ktpcBioPage13 0x0001520d #define ktpcBioPage14 0x0001520e #define ktpcBioPage15 0x0001520f #define ktpcBioPage16 0x00015210 #define ktpcBioPage17 0x00015211 #define ktpcBioPage18 0x00015212 #define ktpcBioPage19 0x00015213 #define ktpcBioPage20 0x00015214 #define ktpcBioPage21 0x00015215 #define ktpcBioPage22 0x00015216 #define ktpcBioPage23 0x00015217 #define ktpcBioPage24 0x00015218 #define ktpcBioPage25 0x00015219 #define ktpcBioPage26 0x0001521a #define ktpcBioPage27 0x0001521b #define ktpcBioPage28 0x0001521c #define ktpcBioPage29 0x0001521d #define ktpcBioPage30 0x0001521e #define ktpcBioPage31 0x0001521f #define ktpcBioPage32 0x00015220 #define ktpcBioPage33 0x00015221 #define ktpcBioPage34 0x00015222 #define ktpcBioPage35 0x00015223 #define ktpcBioPage36 0x00015224 #define ktpcBioPage37 0x00015225 #define ktpcBioPage38 0x00015226 #define ktpcBioPage39 0x00015227 #define ktpcBioPage40 0x00015228 #define ktpcBioPage41 0x00015229 #define ktpcBioPage42 0x0001522a #define ktpcBioPage43 0x0001522b #define ktpcBioPage44 0x0001522c #define ktpcBioPageNum 0x0001522d #define kidBioTipScript 0x0001522e // script tip invocation runs #define ktpcBioTip001 0x00015301 #define ktipbio1 0x00015302 #define ktipbio2 0x00015303 #define ktipbio3 0x00015304 #define ktipbio4 0x00015305 #define ktipbio5 0x00015306 #define ktipbio6 0x00015307 #define ktipbio7 0x00015308 #define ktipbio8 0x00015309 #define ktipbio9 0x0001530a #define ktipbio10 0x0001530b #define ktipbio11 0x0001530c #define ktipbio12 0x0001530d #define ktipbio13 0x0001530e #define ktipbio14 0x0001530f #define ktipbio15 0x00015310 #define ktipbio16 0x00015311 #define ktipbio17 0x00015312 #define ktipbio18 0x00015313 #define ktipbio19 0x00015314 #define ktipbio20 0x00015315 #define ktipbio21 0x00015316 #define ktipbio22 0x00015317 #define ktipbio23 0x00015318 #define ktipbio24 0x00015319 #define ktipbio25 0x0001531a #define ktipbio26 0x0001531b #define ktipbio27 0x0001531c #define ktipbio28 0x0001531d #define ktipbio29 0x0001531e #define ktipbio30 0x0001531f #define ktipbio31 0x00015320 #define ktipbio32 0x00015321 #define ktipbio33 0x00015322 #define ktipbio34 0x00015323 #define ktipbio35 0x00015324 #define ktipbio36 0x00015325 #define ktipbio37 0x00015326 #define ktipbio38 0x00015327 #define ktipbio39 0x00015328 #define ktipbio40 0x00015329 #define ktipbio41 0x0001532a #define ktipbio42 0x0001532b #define ktipbio43 0x0001532c #define ktipbio44 0x0001532d #define ktipbio45 0x0001532e #define ktipbio46 0x0001532f #define ktipbio47 0x00015330 #define ktipbio48 0x00015331 #define ktipbio49 0x00015332 #define ktipbio50 0x00015333 #define ktipbio51 0x00015334 #define ktipbio52 0x00015335 #define ktipbio53 0x00015336 #define ktipbio54 0x00015337 #define ktipbio55 0x00015338 #define ktipbio56 0x00015339 #define ktipbio57 0x0001533a #define ktipbio58 0x0001533b #define ktipbio59 0x0001533c #define ktipbio60 0x0001533d #define ktipbio61 0x0001533e #define ktipbio62 0x0001533f #define ktipbio63 0x00015340 #define ktipbio64 0x00015341 #define ktipbio65 0x00015342 #define ktipbio66 0x00015343 #define ktipbio67 0x00015344 #define ktipbio68 0x00015345 #define ktipbio69 0x00015346 #define ktipbio70 0x00015347 #define ktipbio71 0x00015348 #define ktipbio72 0x00015349 #define ktipbio73 0x0001534a #define ktipbio74 0x0001534b #define ktipbio75 0x0001534c #define ktipbio76 0x0001534d #define ktipbio77 0x0001534e #define ktipbio78 0x0001534f #define ktipbio79 0x00015350 #define ktipbio80 0x00015351 #define ktipbio81 0x00015352 #define ktipbio82 0x00015353 #define ktipbio83 0x00015354 #define ktipbio84 0x00015355 #define ktipbio85 0x00015356 #define ktipbio86 0x00015357 #define ktipbio87 0x00015358 #define ktipbio88 0x00015359 #define ktipbio89 0x0001535a #define ktipbio90 0x0001535b #define ktipbio91 0x0001535c #define ktipbio92 0x0001535d #define ktipbio93 0x0001535e #define ktipbio94 0x0001535f #define ktipbio95 0x00015360 #define ktipbio96 0x00015361 #define ktipbio97 0x00015362 #define ktipbio98 0x00015363 #define ktipbio99 0x00015364 #define ktipbio100 0x00015365 #define ktipbio101 0x00015366 #define ktipbio102 0x00015367 #define ktipbio103 0x00015368 #define ktipbio104 0x00015369 #define ktipbio105 0x0001536a #define ktipbio106 0x0001536b #define ktipbio107 0x0001536c #define ktipbio108 0x0001536d #define ktipbio109 0x0001536e #define ktipbio110 0x0001536f #define ktipbio111 0x00015370 #define ktipbio112 0x00015371 #define ktipbio113 0x00015372 #define ktipbio114 0x00015373 #define ktipbio115 0x00015374 #define ktipbio116 0x00015375 #define ktipbio117 0x00015376 #define ktipbio118 0x00015377 #define ktipbio119 0x00015378 #define ktipbio120 0x00015379 #define ktipbio121 0x0001537a #define ktipbio122 0x0001537b #define ktipbio123 0x0001537c #define ktipbio124 0x0001537d #define ktipbio125 0x0001537e #define ktipbio126 0x0001537f #define ktipbio127 0x00015380 #define ktipbio128 0x00015381 #define ktipbio129 0x00015382 #define ktipbio130 0x00015383 #define ktipbio131 0x00015384 #define ktipbio132 0x00015385 #define ktipbio133 0x00015386 #define ktipbio134 0x00015387 #define ktipbio135 0x00015388 #define ktipbio136 0x00015389 #define ktipbio137 0x0001538a #define ktipbio138 0x0001538b #define ktipbio139 0x0001538c #define ktipbio140 0x0001538d #define ktipbio141 0x0001538e #define ktipbio142 0x0001538f #define ktipbio143 0x00015390 #define ktipbio144 0x00015391 #define ktipbio145 0x00015392 #define ktipbio146 0x00015393 #define ktipbio147 0x00015394 #define ktipbio148 0x00015395 #define ktipbio149 0x00015396 #define ktipbio150 0x00015397 #define ktipbio151 0x00015398 #define ktipbio152 0x00015399 #define ktipbio153 0x0001539a #define ktipbio154 0x0001539b #define ktipbio155 0x0001539c #define ktipbio156 0x0001539d #define ktipbio157 0x0001539e #define ktipbio158 0x0001539f #define ktipbio159 0x000153a0 #define ktipbio160 0x000153a1 #define ktipbio161 0x000153a2 #define ktipbio162 0x000153a3 #define ktipbio163 0x000153a4 #define ktipbio164 0x000153a5 #define ktipbio165 0x000153a6 #define ktipbio166 0x000153a7 #define ktipbio167 0x000153a8 #define ktipbio168 0x000153a9 #define kxpBioPageLeft 215 #define kypBioPageTop 58 #define kxpBioPageRight 422 #define kypBioPageBottom 407 #define kxpBioPageNumLeft 282 #define kypBioPageNumTop 424 #define kxpBioPageNumRight 344 #define kypBioPageNumBottom 451 // the following tools assume 0,0 reg points #define kxpBioCancel 511 #define kypBioCancel 415 #define kxpBioBack 229 #define kypBioBack 410 #define kxpBioFwd 339 #define kypBioFwd 410 // String ID for page numbering #define kstidBioPageNum 100 // waves for bio pages #define kwavBio1 0x00010040 #define kwavBio2 0x00010041 #define kwavBio3 0x00010042 #define kwavBio4 0x00010043 #define kwavFoundBio 0x00010044 #define kwavBioAlreadyFound 0x00010045 #define kwavOpenBio 0x00010046 /********************************************************************** The following define the interface to the Bio book **********************************************************************/ // The following is the mapping from internal page # to // displayed page number. This may change to allow sorting // for international versions... just make sure there's 40 of these! #define BIO_PAGE_ORDER 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20, \ 21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46 #define NUM_BIOPAGES 41 #define fBIO_AVAIL( x ) \ ((x > 31) ? ( ::fBio2 & (1<<(x&31)) ) : ( ::fBio1 & (1<<(x&31)) )) // all found = 41 = 32 + 9 , eg. ffffffffff:0000001ff #define fBIO_FOUNDALL() \ ((GetProp( kpridUserData0 ) == 0xffffffff) && ((GetProp( kpridUserData1 ) & 0x000001ff )==0x000001ff )) // init the bio pages - always have page #1 loaded, hence the |1 bit // write back at INIT to make sure TOC is set. #define BIO_INIT() \ ::fBio1 = GetProp( kpridUserData0 )|1;\ ::fBio2 = GetProp( kpridUserData1 );\ SetProp( kpridUserData0, ::fBio1 ); #define BIO_MARKFOUND( x1 ) \ __t = 1<< (x1 & 31); \ If (x1 > 31 ); \ ::fBio2 |= __t; \ SetProp( kpridUserData1, ::fBio2 );\ Else; \ ::fBio1 |= __t; \ SetProp( kpridUserData0, ::fBio1 );\ End; #define BIO_CREATEBOOK( __nPage, __fControls, __kgobPar )\ ::nBioPage = __nPage;\ ::fBioCtrl = __fControls;\ CreateChildGob( __kgobPar, kgobBioPage, kgobBioPage ) #define BIO_GETPAGE() \ ::nBioPage #define BIO_SETPAGE( x )\ ::nBioPage = x; ================================================ FILE: inc/bkgd.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** bkgd.h: Background class Primary Author: ****** Review Status: REVIEWED - any changes to this file must be reviewed! BASE ---> BACO ---> BKGD ***************************************************************************/ #ifndef BKGD_H #define BKGD_H /**************************************** Background on file ****************************************/ struct BKGDF { short bo; short osk; byte bIndexBase; byte bPad; short swPad; }; const BOM kbomBkgdf = 0x50000000; /**************************************** Specifies a light's kind, position, orientation, and brightness ****************************************/ struct LITE { BMAT34 bmat34; BRS rIntensity; long lt; // light type }; const BOM kbomLite = 0xfffffff0; /**************************************** Specifies a camera for a view ****************************************/ typedef union _apos { struct { BRS xrPlace; // Initial Actor Placement point BRS yrPlace; BRS zrPlace; }; BVEC3 bvec3Actor; } APOS; struct CAM { short bo; short osk; BRS zrHither; // Hither (near) plane BRS zrYon; // Yon (far) plane BRA aFov; // Field of view short swPad; APOS apos; BMAT34 bmat34Cam; // Camera view matrix // APOS rgapos[]; }; const BOM kbomCamOld = 0x5f4fc000; const BOM kbomCam = BomField( kbomSwapShort, BomField(kbomSwapShort, BomField(kbomSwapLong, BomField(kbomSwapLong, BomField(kbomSwapShort, BomField(kbomLeaveShort, BomField(kbomSwapLong, BomField(kbomSwapLong, BomField(kbomSwapLong, 0))))))))); // Note that CAM is too big for a complete kbomCam. To SwapBytes one, // SwapBytesBom the cam, then SwapBytesRgLw from bmat34Cam on. /**************************************** Background Default Sound ****************************************/ struct BDS { short bo; short osk; long vlm; bool fLoop; TAG tagSnd; }; const BOM kbomBds = 0x5f000000 | kbomTag >> 8; /**************************************** The background class ****************************************/ typedef class BKGD *PBKGD; #define BKGD_PAR BACO #define kclsBKGD 'BKGD' class BKGD : public BKGD_PAR { RTCLASS_DEC ASSERT MARKMEM protected: BACT *_prgbactLight; // array of light br_actors BLIT *_prgblitLight; // array of light data long _cbactLight; // count of lights bool _fLites; // lights are on bool _fLeaveLitesOn; // Don't turn out the lights long _ccam; // count of cameras in this background long _icam; // current camera BMAT34 _bmat34Mouse; // camera matrix for mouse model BRA _braRotY; // Y rotation of current camera CNO _cnoSnd; // background sound STN _stn; // name of this background PGL _pglclr; // palette for this background byte _bIndexBase; // first index for palette long _iaposLast; // Last placement point we used long _iaposNext; // Next placement point to use PGL _pglapos; // actor placement point(s) for current view BRS _xrPlace; BRS _yrPlace; BRS _zrPlace; BDS _bds; // background default sound BRS _xrCam; // camera position in worldspace BRS _yrCam; BRS _zrCam; protected: bool _FInit(PCFL pcfl, CTG ctg, CNO cno); long _Ccam(PCFL pcfl, CTG ctg, CNO cno); void _SetupLights(PGL pgllite); public: static bool FAddTagsToTagl(PTAG ptagBkgd, PTAGL ptagl); static bool FCacheToHD(PTAG ptagBkgd); static bool FReadBkgd(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb); ~BKGD(void); void GetName(PSTN pstn); void TurnOnLights(PBWLD pbwld); void TurnOffLights(void); bool FLeaveLitesOn(void) { return _fLeaveLitesOn; } void SetFLeaveLitesOn(bool fLeaveLitesOn) { _fLeaveLitesOn = fLeaveLitesOn; } long Ccam(void) { return _ccam; } // count of cameras in background long Icam(void) { return _icam; } // currently selected camera bool FSetCamera(PBWLD pbwld, long icam); // change camera to icam void GetMouseMatrix(BMAT34 *pbmat34); BRA BraRotYCamera(void) { return _braRotY; } void GetActorPlacePoint(BRS *pxr, BRS *pyr, BRS *pzr); void ReuseActorPlacePoint(void); void GetDefaultSound(PTAG ptagSnd, long *pvlm, bool *pfLoop) { *ptagSnd = _bds.tagSnd; *pvlm = _bds.vlm; *pfLoop = _bds.fLoop; } bool FGetPalette(PGL *ppglclr, long *piclrMin); void GetCameraPos(BRS *pxr, BRS *pyr, BRS *pzr); #ifdef DEBUG // Authoring only. Writes a special file with the given place info. bool FWritePlaceFile(BRS xrPlace, BRS yrPlace, BRS zrPlace); #endif // DEBUG }; #endif BKGD_H ================================================ FILE: inc/body.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /************************************************************************* body.h: Body class Primary Author: ****** Review Status: REVIEWED - any changes to this file must be reviewed! BASE ---> BODY *************************************************************************/ #ifndef BODY_H #define BODY_H /**************************************** The BODY class ****************************************/ typedef class BODY *PBODY; #define BODY_PAR BASE #define kclsBODY 'BODY' class BODY : public BODY_PAR { RTCLASS_DEC ASSERT MARKMEM protected: static BMTL *_pbmtlHilite; // hilight material static BODY *_pbodyClosestClicked; static long _dzpClosestClicked; static BACT *_pbactClosestClicked; BACT *_prgbact; // array of BACTs PGL _pglibset; // body part set IDs long _cbset; // count of body part sets PCMTL *_prgpcmtl; // array of PCMTLs -- one per body part set long _cbactPart; // count of model body parts in body long _cactHidden; // for Show() / Hide() PBWLD _pbwld; // world that body lives in RC _rcBounds; // bounds of body after last render RC _rcBoundsLastVis; // bounds of body last time it was visible bool _fFound; // is the actor found under the mouse? long _ibset; // which body part got hit. protected: BODY(void) { } // can't instantiate directly; must use PbodyNew void _DestroyShape(void); bool _FInit(PGL pglibactPar, PGL pglibset); bool _FInitShape(PGL pglibactPar, PGL pglibset); PBACT _PbactRoot(void) // ptr to root BACT { return _prgbact; } PBACT _PbactHilite(void) // ptr to hilite BACT { return _prgbact + 1; } // skip root BACT PBACT _PbactPart(long ipart) // ptr to ipart'th body part { return _prgbact + 1 + 1 + ipart; } // skip root and hilite BACTs long _Cbact(void) // count in _prgbact { return 1 + 1 + _cbactPart; } // root, hilite, and body part BACTs long _Ibset(long ipart) // body part set that this part belongs to { return *(short *)_pglibset->QvGet(ipart); } void _RemoveMaterial(long ibset); // Callbacks from BRender: static int BR_CALLBACK _FFilterSearch(BACT *pbact, PBMDL pbmdl, PBMTL pbmtl, BVEC3 *pbvec3RayPos, BVEC3 *pbvec3RayDir, BRS dzpNear, BRS dzpFar, void *pvArg); static void _BactRendered(PBACT pbact, RC *prc); static void _PrepareToRender(PBACT pbact); static void _GetRc(PBACT pbact, RC *prc); public: static PBODY PbodyNew(PGL pglibactPar, PGL pglibset); static PBODY PbodyFromBact(BACT *pbact, long *pibset = pvNil); static PBODY PbodyClicked(long xp, long yp, PBWLD pbwld, long *pibset = pvNil); ~BODY(void); PBODY PbodyDup(void); void Restore(PBODY pbodyDup); static int BR_CALLBACK _FFilter(BACT *pbact, PBMDL pbmdl, PBMTL pbmtl, BVEC3 *pbvec3RayPos, BVEC3 *pbvec3RayDir, BRS dzpNear, BRS dzpFar, void *pv); bool FChangeShape(PGL pglibactPar, PGL pglibset); void SetBwld(PBWLD pbwld) { _pbwld = pbwld; } void Show(void); void Hide(void); void Hilite(void); void Unhilite(void); static void SetHiliteColor(long iclr); void LocateOrient(BRS xr, BRS yr, BRS zr, BMAT34 *pbmat34); void SetPartModel(long ibact, MODL *pmodl); void SetPartMatrix(long ibact, BMAT34 *pbmat34); void SetPartSetMtrl(long ibset, MTRL *pmtrl); void SetPartSetCmtl(CMTL *pcmtl); void GetPartSetMaterial(long ibset, bool *pfMtrl, MTRL **ppmtrl, CMTL **ppcmtl); long Cbset() { return _cbset; } void GetBcbBounds(BCB *pbcb, bool fWorld = fFalse); void GetRcBounds(RC *prc); void GetCenter(long *pxp, long *pyp); void GetPosition(BRS *pxr, BRS *pyr, BRS *pzr); bool FPtInBody(long xp, long yp, long *pibset); bool FIsInView(void); }; /**************************************** The COST class, which is used to save and restore a BODY's entire costume for unwinding purposes ****************************************/ typedef class COST *PCOST; #define COST_PAR BASE #define kclsCOST 'COST' class COST : public COST_PAR { RTCLASS_DEC ASSERT MARKMEM private: long _cbset; // count of body part sets in _prgpo BASE **_prgpo; // array of MTRLs and CMTLs private: void _Clear(void); // release _prgpo and material references public: COST(void); ~COST(void); bool FGet(PBODY pbody); // read and store BODY's costume // replace BODY's costume with this one void Set(PBODY pbody, bool fAllowDifferentShape = fFalse); }; #endif // !BODY_H ================================================ FILE: inc/browser.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /************************************************************** Browser Class Author : ***** Review Status: Reviewed Studio Independent Browsers: BASE --> CMH --> GOK --> BRWD (Browser display class) BRWD --> BRWL (Browser list class; chunky based) BRWD --> BRWT (Browser text class) BRWD --> BRWL --> BRWN (Browser named list class) Studio Dependent Browsers: BRWD --> BRWR (Roll call class) BRWD --> BRWT --> BRWA (Browser action class) BRWD --> BRWL --> BRWP (Browser prop/actor class) BRWD --> BRWL --> BRWB (Browser background class) BRWD --> BRWL --> BRWC (Browser camera class) BRWD --> BRWL --> BRWN --> BRWM (Browser music class) BRWD --> BRWL --> BRWN --> BRWM --> BRWI (Browser import sound class) Note: An "frm" refers to the displayed frames on any page. A "thum" is a generic Browser Thumbnail, which may be a chid, cno, cnoPar, gob, stn, etc. A browser will display, over multiple pages, as many browser entities as there are thum's. ***************************************************************/ #ifndef BRWD_H #define BRWD_H const long kcmhlBrowser = 0x11000; // nice medium level for the Browser const long kcbMaxCrm = 300000; const long kdwTotalPhysLim = 10240000; // 10MB heuristic const long kdwAvailPhysLim = 1024000; // 1MB heuristic const auto kBrwsScript = (kstDefault << 16) | kchidBrowserDismiss; /************************************ Browser Context CLass Optional context to carry over between successive instantiations of the same browser *************************************/ #define BRCN_PAR BASE #define kclsBRCN 'BRCN' typedef class BRCN *PBRCN; class BRCN : public BRCN_PAR { RTCLASS_DEC ASSERT MARKMEM protected: BRCN(void){}; public: long brwdid; long ithumPageFirst; }; /************************************ Browser ThumbFile Cki Struct *************************************/ struct TFC { short bo; short osk; union { struct { CTG ctg; CNO cno; }; struct { ulong grfontMask; ulong grfont; }; struct { CTG ctg; CHID chid; }; }; }; const BOM kbomTfc = 0x5f000000; /************************************ Browser Display Class *************************************/ #define BRWD_PAR GOK #define kclsBRWD 'BRWD' #define brwdidNil ivNil typedef class BRWD *PBRWD; class BRWD : public BRWD_PAR { RTCLASS_DEC ASSERT MARKMEM CMD_MAP_DEC(BRWD) protected: long _kidFrmFirst; // kid of first frame long _kidControlFirst; // kid of first control button long _dxpFrmOffset; // x inset of thumb in frame long _dypFrmOffset; // y inset of thumb in frame long _sidDefault; // default sid long _thumDefault; // default thum PBRCN _pbrcn; // context carryover long _idsFont; // string id of Font long _kidThumOverride; // projects may override one thum gobid long _ithumOverride; // projects may override one thum gobid PTGOB _ptgobPage; // for page numbers PSTDIO _pstdio; // Display State variables long _cthumCD; // Non-user content long _ithumSelect; // Hilited frame long _ithumPageFirst; // Index to thd of first frame on current page long _cfrmPageCur; // Number of visible thumbnails per current page long _cfrm; // Total frames possible per page long _cthumScroll; // #items to scroll on fwd/back. default ivNil -> page scrolling bool _fWrapScroll; // Wrap around. Default = fTrue; bool _fNoRepositionSel; // Don't reposition selection : default = fFalse; protected: void _SetScrollState(void); long _CfrmCalc(void); static bool _FBuildGcb(GCB *pgcb, long kidPar, long kidBrws); bool _FInitGok(PRCA prca, long kidGlass); void _SetVarForOverride(void); virtual long _Cthum(void) { AssertThis(0); return 0; } virtual bool _FSetThumFrame(long ithum, PGOB pgobPar) { AssertThis(0); return fFalse; } virtual bool _FClearHelp(long ifrm) { return fTrue; } virtual void _ReleaseThumFrame(long ifrm) { } virtual long _IthumFromThum(long thum, long sid) { return thum; } virtual void _GetThumFromIthum(long ithum, void *pThumSelect, long *psid); virtual void _ApplySelection(long thumSelect, long sid) { } virtual void _ProcessSelection(void) { } virtual bool _FUpdateLists() { return fTrue; } virtual void _SetCbPcrmMin(void) { } void _CalcIthumPageFirst(void); bool _FIsIthumOverride(long ithum) { return FPure(ithum == _ithumOverride); } PGOB _PgobFromIfrm(long ifrm); long _KidThumFromIfrm(long ifrm); void _UnhiliteCurFrm(void); bool _FHiliteFrm(long ifrmSelect); void _InitStateVars(PCMD pcmd, PSTDIO pstdio, bool fWrapScroll, long cthumScroll); void _InitFromData(PCMD pcmd, long ithumSelect, long ithumDisplay); virtual void _CacheContext(void); public: // // Constructors and destructors // BRWD(PGCB pgcb) : BRWD_PAR(pgcb) { _ithumOverride = -1; _kidThumOverride = -1; } ~BRWD(void); static PBRWD PbrwdNew(PRCA prca, long kidPar, long kidBrwd); void Init(PCMD pcmd, long ithumSelect, long ithumDisplay, PSTDIO pstdio, bool fWrapScroll = fTrue, long cthumScroll = ivNil); bool FDraw(void); bool FCreateAllTgob(void); // For any text based browsers // // Command Handlers // Selection does not exit the browser // bool FCmdFwd(PCMD pcmd); // Page fwd bool FCmdBack(PCMD pcmd); // Page back bool FCmdSelect(PCMD pcmd); bool FCmdSelectThum(PCMD pcmd); // Set viewing page virtual void Release(void); virtual bool FCmdCancel(PCMD pcmd); // See brwb virtual bool FCmdDel(PCMD pcmd) { return fTrue; } // See brwm virtual bool FCmdOk(PCMD pcmd); virtual bool FCmdFile(PCMD pcmd) { return fTrue; } // See brwm virtual bool FCmdChangeCel(PCMD pcmd) { return fTrue; } // See brwa }; /************************************ Browser List Context CLass Optional context to carry over between successive instantiations of the same browser *************************************/ #define BRCNL_PAR BRCN #define kclsBRCNL 'brcl' typedef class BRCNL *PBRCNL; class BRCNL : public BRCNL_PAR { RTCLASS_DEC ASSERT MARKMEM protected: ~BRCNL(void); public: long cthumCD; CKI ckiRoot; PGL pglthd; PGST pgst; PCRM pcrm; }; // // Thumbnail descriptors : one per thumbnail // const long kglstnGrow = 5; const long kglthdGrow = 10; struct THD { union { TAG tag; // TAG pointing to content struct { long lwFill1; // sid long lwFill2; // pcrf ulong grfontMask; ulong grfont; }; struct { long lwFill1; long lwFill2; CTG ctg; CHID chid; // CHID of CD content }; }; CNO cno; // GOKD cno CHID chidThum; // GOKD's parent's CHID (relative to GOKD parent's parent) long ithd; // Original index for this THD, before sorting (used to // retrieve proper STN for the BRWN-derived browsers) }; /* Browser Content List Base -- create one of these when you want a list of a specific kind of content and you don't care about the names. */ #define BCL_PAR BASE typedef class BCL *PBCL; #define kclsBCL 'BCL' class BCL : public BCL_PAR { RTCLASS_DEC ASSERT MARKMEM protected: CTG _ctgRoot; CNO _cnoRoot; CTG _ctgContent; bool _fDescend; PGL _pglthd; protected: BCL(void) { _pglthd = pvNil; } ~BCL(void) { ReleasePpo(&_pglthd); } bool _FInit(PCRM pcrm, CKI *pckiRoot, CTG ctgContent, PGL pglthd); bool _FAddGokdToThd(PCFL pcfl, long sid, CKI *pcki); bool _FAddFileToThd(PCFL pcfl, long sid); bool _FBuildThd(PCRM pcrm); virtual bool _FAddGokdToThd(PCFL pcfl, long sid, KID *pkid); public: static PBCL PbclNew(PCRM pcrm, CKI *pckiRoot, CTG ctgContent, PGL pglthd = pvNil, bool fOnlineOnly = fFalse); PGL Pglthd(void) { return _pglthd; } void GetThd(long ithd, THD *pthd) { _pglthd->Get(ithd, pthd); } long IthdMac(void) { return _pglthd->IvMac(); } }; /* Browser Content List with Strings -- create one of these when you need to browse content by name */ #define BCLS_PAR BCL typedef class BCLS *PBCLS; #define kclsBCLS 'BCLS' class BCLS : public BCLS_PAR { RTCLASS_DEC ASSERT MARKMEM protected: PGST _pgst; protected: BCLS(void) { _pgst = pvNil; } ~BCLS(void) { ReleasePpo(&_pgst); } bool _FInit(PCRM pcrm, CKI *pckiRoot, CTG ctgContent, PGST pgst, PGL pglthd); bool _FSetNameGst(PCFL pcfl, CTG ctg, CNO cno); virtual bool _FAddGokdToThd(PCFL pcfl, long sid, KID *pkid); public: static PBCLS PbclsNew(PCRM pcrm, CKI *pckiRoot, CTG ctgContent, PGL pglthd = pvNil, PGST pgst = pvNil, bool fOnlineOnly = fFalse); PGST Pgst(void) { return _pgst; } }; /************************************ Browser List Class Derived from the Display Class *************************************/ #define BRWL_PAR BRWD #define kclsBRWL 'BRWL' typedef class BRWL *PBRWL; // Browser Selection Flags // This specifies what the sorting is based on enum BWS { kbwsIndex = 1, kbwsChid = 2, kbwsCnoRoot = 3, // defaults to CnoRoot if ctg of Par is ctgNil kbwsLim }; class BRWL : public BRWL_PAR { RTCLASS_DEC ASSERT MARKMEM protected: bool _fEnableAccel; // Thumnail descriptor lists PCRM _pcrm; // Chunky resource manager PGL _pglthd; // Thumbnail descriptor gl PGST _pgst; // Chunk name // Browser Search (List) parameters BWS _bws; // Selection type flag bool _fSinglePar; // Single parent search CKI _ckiRoot; // Grandparent cno=cnoNil => global search CTG _ctgContent; // Parent protected: // BRWL List bool _FInitNew(PCMD pcmd, BWS bws, long ThumSelect, CKI ckiRoot, CTG ctgContent); bool _FCreateBuildThd(CKI ckiRoot, CTG ctgContent, bool fBuildGl = fTrue); virtual bool _FGetContent(PCRM pcrm, CKI *pcki, CTG ctg, bool fBuildGl); virtual long _Cthum(void) { AssertThis(0); return _pglthd->IvMac(); } virtual bool _FSetThumFrame(long ithd, PGOB pgobPar); virtual bool _FUpdateLists() { return fTrue; } // Eg, to include user sounds // BRWL util void _SortThd(void); virtual void _GetThumFromIthum(long ithum, void *pThumSelect, long *psid); virtual void _ReleaseThumFrame(long ifrm); virtual long _IthumFromThum(long thum, long sid); virtual void _CacheContext(void); virtual void _SetCbPcrmMin(void); public: // // Constructors and destructors // BRWL(PGCB pgcb) : BRWL_PAR(pgcb) { } ~BRWL(void); static PBRWL PbrwlNew(PRCA prca, long kidPar, long kidBrwl); virtual bool FInit(PCMD pcmd, BWS bws, long ThumSelect, long sidSelect, CKI ckiRoot, CTG ctgContent, PSTDIO pstdio, PBRCNL pbrcnl = pvNil, bool fWrapScroll = fTrue, long cthumScroll = ivNil); }; /************************************ Browser Text Class Derived from the Display Class *************************************/ #define BRWT_PAR BRWD #define kclsBRWT 'BRWT' typedef class BRWT *PBRWT; class BRWT : public BRWT_PAR { RTCLASS_DEC ASSERT MARKMEM protected: PGST _pgst; bool _fEnableAccel; virtual long _Cthum(void) { AssertThis(0); return _pgst->IvMac(); } virtual bool _FSetThumFrame(long istn, PGOB pgobPar); virtual void _ReleaseThumFrame(long ifrm) { } // No gob to release public: // // Constructors and destructors // BRWT(PGCB pgcb) : BRWT_PAR(pgcb) { _idsFont = idsNil; } ~BRWT(void); static PBRWT PbrwtNew(PRCA prca, long kidPar, long kidBrwt); void SetGst(PGST pgst); bool FInit(PCMD pcmd, long thumSelect, long thumDisplay, PSTDIO pstdio, bool fWrapScroll = fTrue, long cthumScroll = ivNil); }; /************************************ Browser Named List Class Derived from the Browser List Class *************************************/ #define BRWN_PAR BRWL #define kclsBRWN 'BRWN' typedef class BRWN *PBRWN; class BRWN : public BRWN_PAR { RTCLASS_DEC protected: virtual bool _FGetContent(PCRM pcrm, CKI *pcki, CTG ctg, bool fBuildGl); virtual long _Cthum(void) { return _pglthd->IvMac(); } virtual bool _FSetThumFrame(long ithd, PGOB pgobPar); virtual void _ReleaseThumFrame(long ifrm); public: // // Constructors and destructors // BRWN(PGCB pgcb) : BRWN_PAR(pgcb) { } ~BRWN(void){}; virtual bool FInit(PCMD pcmd, BWS bws, long ThumSelect, long sidSelect, CKI ckiRoot, CTG ctgContent, PSTDIO pstdio, PBRCNL pbrcnl = pvNil, bool fWrapScroll = fTrue, long cthumScroll = ivNil); virtual bool FCmdOk(PCMD pcmd); }; /************************************ Studio Specific Browser Classes *************************************/ /************************************ Browser Action Class Derived from the Browser Text Class Actions are separately classed for previews *************************************/ #define BRWA_PAR BRWT #define kclsBRWA 'BRWA' typedef class BRWA *PBRWA; class BRWA : public BRWA_PAR { RTCLASS_DEC ASSERT MARKMEM protected: long _celnStart; // Starting cel number PAPE _pape; // Actor Preview Entity void _ProcessSelection(void); // Action Preview virtual void _ApplySelection(long thumSelect, long sid); public: // // Constructors and destructors // BRWA(PGCB pgcb) : BRWA_PAR(pgcb) { _idsFont = idsActionFont; _celnStart = 0; } ~BRWA(void) { } static PBRWA PbrwaNew(PRCA prca); bool FBuildApe(PACTR pactr); bool FBuildGst(PSCEN pscen); virtual bool FCmdChangeCel(PCMD pcmd); }; /************************************ Browser Prop & Actor Class Derived from the Browser List Class *************************************/ #define BRWP_PAR BRWL #define kclsBRWP 'BRWP' typedef class BRWP *PBRWP; class BRWP : public BRWP_PAR { RTCLASS_DEC protected: virtual void _ApplySelection(long thumSelect, long sid); public: // // Constructors and destructors // BRWP(PGCB pgcb) : BRWP_PAR(pgcb) { } ~BRWP(void){}; static PBRWP PbrwpNew(PRCA prca, long kidGlass); }; /************************************ Browser Background Class Derived from the Browser List Class *************************************/ #define BRWB_PAR BRWL #define kclsBRWB 'BRWB' typedef class BRWB *PBRWB; class BRWB : public BRWB_PAR { RTCLASS_DEC protected: virtual void _ApplySelection(long thumSelect, long sid); public: // // Constructors and destructors // BRWB(PGCB pgcb) : BRWB_PAR(pgcb) { } ~BRWB(void){}; static PBRWB PbrwbNew(PRCA prca); virtual bool FCmdCancel(PCMD pcmd); }; /************************************ Browser Camera Class Derived from the Browser List Class *************************************/ #define BRWC_PAR BRWL #define kclsBRWC 'BRWC' typedef class BRWC *PBRWC; class BRWC : public BRWC_PAR { RTCLASS_DEC protected: virtual void _ApplySelection(long thumSelect, long sid); virtual void _SetCbPcrmMin(void) { } public: // // Constructors and destructors // BRWC(PGCB pgcb) : BRWC_PAR(pgcb) { } ~BRWC(void){}; static PBRWC PbrwcNew(PRCA prca); virtual bool FCmdCancel(PCMD pcmd); }; /************************************ Browser Music Class (midi, speech & fx) Derived from the Browser Named List Class *************************************/ #define BRWM_PAR BRWN #define kclsBRWM 'brwm' typedef class BRWM *PBRWM; class BRWM : public BRWM_PAR { RTCLASS_DEC protected: long _sty; // Identifies type of sound PCRF _pcrf; // NOT created here (autosave or BRWI file) virtual void _ApplySelection(long thumSelect, long sid); virtual bool _FUpdateLists(); // By all entries in pcrf of correct type void _ProcessSelection(void); // Sound Preview bool _FAddThd(STN *pstn, CKI *pcki); bool _FSndListed(CNO cno, long *pithd = pvNil); public: // // Constructors and destructors // BRWM(PGCB pgcb) : BRWM_PAR(pgcb) { _idsFont = idsSoundFont; } ~BRWM(void){}; static PBRWM PbrwmNew(PRCA prca, long kidGlass, long sty, PSTDIO pstdio); virtual bool FCmdFile(PCMD pcmd); // Upon portfolio completion virtual bool FCmdDel(PCMD pcmd); // Delete user sound }; /************************************ Browser Import Sound Class Derived from the Browser List Class Note: Inherits pgst from the list class *************************************/ #define BRWI_PAR BRWM #define kclsBRWI 'BRWI' typedef class BRWI *PBRWI; class BRWI : public BRWI_PAR { RTCLASS_DEC ASSERT MARKMEM protected: // The following are already handled by BRWM // virtual void _ProcessSelection(void); virtual void _ApplySelection(long thumSelect, long sid); public: // // Constructors and destructors // BRWI(PGCB pgcb) : BRWI_PAR(pgcb) { _idsFont = idsSoundFont; } ~BRWI(void); static PBRWI PbrwiNew(PRCA prca, long kidGlass, long sty); bool FInit(PCMD pcmd, CKI cki, PSTDIO pstdio); }; /************************************ Browser Roll Call Class Derived from the Display Class *************************************/ #define BRWR_PAR BRWD #define kclsBRWR 'BRWR' typedef class BRWR *PBRWR; class BRWR : public BRWR_PAR { RTCLASS_DEC ASSERT MARKMEM protected: CTG _ctg; PCRM _pcrm; // Chunky resource manager bool _fApplyingSel; protected: virtual long _Cthum(void); virtual bool _FSetThumFrame(long istn, PGOB pgobPar); virtual void _ReleaseThumFrame(long ifrm); virtual void _ApplySelection(long thumSelect, long sid); virtual void _ProcessSelection(void); virtual bool _FClearHelp(long ifrm); long _IaridFromIthum(long ithum, long iaridFirst = 0); long _IthumFromArid(long arid); public: // // Constructors and destructors // BRWR(PGCB pgcb) : BRWR_PAR(pgcb) { _fApplyingSel = fFalse; _idsFont = idsRollCallFont; } ~BRWR(void); static PBRWR PbrwrNew(PRCA prca, long kid); void Init(PCMD pcmd, long thumSelect, long thumDisplay, PSTDIO pstdio, bool fWrapScroll = fTrue, long cthumScroll = ivNil); bool FInit(PCMD pcmd, CTG ctg, long ithumDisplay, PSTDIO pstdio); bool FUpdate(long arid, PSTDIO pstdio); bool FApplyingSel(void) { AssertBaseThis(0); return _fApplyingSel; } }; const long kglcmgGrow = 8; struct CMG // Gokd Cno Map { CNO cnoTmpl; // Content cno CNO cnoGokd; // Thumbnail gokd cno }; /************************************ Fne for Thumbnails Enumerates current product first *************************************/ #define FNET_PAR BASE #define kclsFNET 'FNET' typedef class FNET *PFNET; class FNET : public FNET_PAR { RTCLASS_DEC protected: bool _fInitMSKDir; FNE _fne; FNE _fneDir; FNI _fniDirMSK; FNI _fniDir; FNI _fniDirProduct; bool _fInited; protected: bool _FNextFni(FNI *pfni, long *psid); public: // // Constructors and destructors // FNET(void) : FNET_PAR() { _fInited = fFalse; } ~FNET(void){}; bool FInit(void); bool FNext(FNI *pfni, long *psid = pvNil); }; #endif ================================================ FILE: inc/buildgob.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /***************************************************************************** * * BUILDGOB.H * * Copyright (C) Microsoft Corporation 1995. * All Rights reserved. * ****************************************************************************** * * Module Intent * * Contains all of the kids for the Building place gobs. * ****************************************************************************** * * Revision History: Pulled out of soc\src\building\socdefn.h 06/08/95. * *****************************************************************************/ #ifndef BUILDGOB_H #define BUILDGOB_H /***************************************************************************** * * * Constants * * * *****************************************************************************/ // ----------------------------------------------------- // Building Location Definitions // ----------------------------------------------------- #define kgobLogin 0x00010200 #define kgobCloset 0x00010280 #define kgobImagin 0x00010300 #define kgobStreet 0x00010400 #define kgobTicket1 0x00010500 // Far away view of ticket booth #define kgobTicket2 0x00010580 // Zoomed view of ticket booth #define kgobLobby1 0x00010600 // Front view of lobby #define kgobLobby2 0x00010700 // Back wall of lobby #define kgobSnackBar 0x00010800 #define kgobWaiting 0x00010900 #define kgobTheatre1 0x00010c00 // Front view of theatre #define kgobTheatre2 0x00010d00 // Back wall of theatre #define kgobTheatre3 0x00010e00 // Front Left view of theatre #define kgobTheatre4 0x00010f00 // Front Right view of theatre #define kgobBackstage1 0x00011000 // Front view of backstage area #define kgobBackstage2 0x00011100 // Back wall of backstage area #define kgobInspiration1 0x00011400 // Front view of ideas room #define kgobInspiration2 0x00011500 // Back wall of ideas room #define kgobInspiration3 0x00011600 // Left wall of ideas room #define kgobInspiration4 0x00011700 // Right wall of ideas room #define kgobStudio1 0x00011800 // Front view of studio #define kgobStudio2 0x00011900 // Back wall of studio #define kgobStudio3 0x00011a00 // Left wall of studio #define kgobStudio4 0x00011b00 // Right wall of studio #define kgobProjects1 0x00011c00 // Front view of projects room #define kgobProjects2 0x00011d00 // Back wall of projects room #define kgobProjects3 0x00011e00 // Left wall of projects room #define kgobProjects4 0x00011f00 // Right wall of projects room #endif // !BUILDGOB_H ================================================ FILE: inc/esl.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** esl.h: Easel classes Primary Author: ****** Review Status: REVIEWED - any changes to this file must be reviewed! BASE ---> CMH ---> GOB ---> GOK ---> ESL (generic easel) | +---> ESLT (text easel) | +---> ESLC (costume easel) | +---> ESLL (listener easel) | +---> ESLR (sound recording easel) ***************************************************************************/ #ifndef ESL_H #define ESL_H // Function to build a GCB to construct a child under a parent bool FBuildGcb(PGCB pgcb, long kidParent, long kidChild); // Function to set a GOK to a different state void SetGokState(long kid, long st); /***************************** The generic easel class *****************************/ typedef class ESL *PESL; #define ESL_PAR GOK #define kclsESL 'ESL' class ESL : public ESL_PAR { RTCLASS_DEC ASSERT MARKMEM CMD_MAP_DEC(ESL) protected: ESL(PGCB pgcb) : GOK(pgcb) { } bool _FInit(PRCA prca, long kidEasel); virtual bool _FAcceptChanges(bool *pfDismissEasel) { return fTrue; } public: static PESL PeslNew(PRCA prca, long kidParent, long hidEasel); ~ESL(void); bool FCmdDismiss(PCMD pcmd); // Handles both OK and Cancel }; typedef class ESLT *PESLT; // SNE needs this /**************************************** Spletter Name Editor class. It's derived from EDSL, which is a Kauai single-line edit control ****************************************/ typedef class SNE *PSNE; #define SNE_PAR EDSL #define kclsSNE 'SNE' class SNE : public SNE_PAR { RTCLASS_DEC ASSERT MARKMEM protected: PESLT _peslt; // easel to notify when text changes protected: SNE(PEDPAR pedpar) : EDSL(pedpar) { } public: static PSNE PsneNew(PEDPAR pedpar, PESLT peslt, PSTN pstnInit); virtual bool FReplace(achar *prgch, long cchIns, long ich1, long ich2, long gin); }; /**************************************** The text easel class ****************************************/ typedef class ESLT *PESLT; #define ESLT_PAR ESL #define kclsESLT 'ESLT' class ESLT : public ESLT_PAR { RTCLASS_DEC ASSERT MARKMEM CMD_MAP_DEC(ESLT) protected: PMVIE _pmvie; // Movie that this TDT is in PACTR _pactr; // Actor of this TDT, or pvNil for new TDT PAPE _pape; // Actor Preview Entity PSNE _psne; // Spletter Name Editor PRCA _prca; // Resource source for cursors PSFL _psflMtrl; PBCL _pbclMtrl; PSFL _psflTdf; PBCL _pbclTdf; PSFL _psflTdts; protected: ESLT(PGCB pgcb) : ESL(pgcb) { } bool _FInit(PRCA prca, long kidEasel, PMVIE pmvie, PACTR pactr, PSTN pstnNew, long tdtsNew, PTAG ptagTdfNew); virtual bool _FAcceptChanges(bool *pfDismissEasel); public: static PESLT PesltNew(PRCA prca, PMVIE pmvie, PACTR pactr, PSTN pstnNew = pvNil, long tdtsNew = tdtsNil, PTAG ptagTdfNew = pvNil); ~ESLT(void); bool FCmdRotate(PCMD pcmd); bool FCmdTransmogrify(PCMD pcmd); bool FCmdStartPopup(PCMD pcmd); bool FCmdSetFont(PCMD pcmd); bool FCmdSetShape(PCMD pcmd); bool FCmdSetColor(PCMD pcmd); bool FTextChanged(PSTN pstn); }; /******************************************** The actor easel (costume changer) class ********************************************/ typedef class ESLA *PESLA; #define ESLA_PAR ESL #define kclsESLA 'ESLA' class ESLA : public ESLA_PAR { RTCLASS_DEC ASSERT MARKMEM CMD_MAP_DEC(ESLA) protected: PMVIE _pmvie; // Movie that this actor is in PACTR _pactr; // The actor that is being edited PAPE _pape; // Actor Preview Entity PEDSL _pedsl; // Single-line edit control (for actor's name) protected: ESLA(PGCB pgcb) : ESL(pgcb) { } bool _FInit(PRCA prca, long kidEasel, PMVIE pmvie, PACTR pactr); virtual bool _FAcceptChanges(bool *pfDismissEasel); public: static PESLA PeslaNew(PRCA prca, PMVIE pmvie, PACTR pactr); ~ESLA(void); bool FCmdRotate(PCMD pcmd); bool FCmdTool(PCMD pcmd); }; /**************************************** Listener sound class ****************************************/ typedef class LSND *PLSND; #define LSND_PAR BASE #define kclsLSND 'LSND' class LSND : public LSND_PAR { RTCLASS_DEC ASSERT MARKMEM protected: PGL _pgltag; // PGL in case of chained sounds long _vlm; // Initial volume long _vlmNew; // User can redefine with slider bool _fLoop; // Looping sound long _objID; // Owner's object ID long _sty; // Sound type long _kidVol; // Kid of volume slider long _kidIcon; // Kid of sound-type icon long _kidEditBox; // Kid of sound-name box bool _fMatcher; // Whether this is a motion-matched sound public: LSND(void) { _pgltag = pvNil; } ~LSND(void); bool FInit(long sty, long kidVol, long kidIcon, long kidEditBox, PGL *ppgltag, long vlm, bool fLoop, long objID, bool fMatcher); bool FValidSnd(void); void SetVlmNew(long vlmNew) { _vlmNew = vlmNew; } void Play(void); bool FChanged(long *pvlmNew, bool *pfNuked); }; /**************************************** The listener easel class ****************************************/ typedef class ESLL *PESLL; #define ESLL_PAR ESL #define kclsESLL 'ESLL' class ESLL : public ESLL_PAR { RTCLASS_DEC ASSERT MARKMEM CMD_MAP_DEC(ESLL) protected: PMVIE _pmvie; // Movie that these sounds are in PSCEN _pscen; // Scene that these sounds are in PACTR _pactr; // Actor that sounds are attached to (or pvNil) LSND _lsndSpeech; LSND _lsndSfx; LSND _lsndMidi; LSND _lsndSpeechMM; LSND _lsndSfxMM; protected: ESLL(PGCB pgcb) : ESL(pgcb) { } bool _FInit(PRCA prca, long kidEasel, PMVIE pmvie, PACTR pactr); virtual bool _FAcceptChanges(bool *pfDismissEasel); public: static PESLL PesllNew(PRCA prca, PMVIE pmvie, PACTR pactr); ~ESLL(void); bool FCmdVlm(PCMD pcmd); bool FCmdPlay(PCMD pcmd); }; /**************************************** The sound recording easel class ****************************************/ typedef class ESLR *PESLR; #define ESLR_PAR ESL #define kclsESLR 'ESLR' class ESLR : public ESLR_PAR { RTCLASS_DEC ASSERT MARKMEM CMD_MAP_DEC(ESLR) protected: PMVIE _pmvie; // The movie to insert sound into bool _fSpeech; // Recording Speech or SFX? PEDSL _pedsl; // Single-line edit control for sound name PSREC _psrec; // Sound recording object CLOK _clok; // Clock to limit sound length bool _fRecording; // Are we recording right now? bool _fPlaying; // Are we playing back the recording? ulong _tsStartRec; // Time at which we started recording protected: ESLR(PGCB pgcb) : ESL(pgcb), _clok(HidUnique()) { } bool _FInit(PRCA prca, long kidEasel, PMVIE pmvie, bool fSpeech, PSTN pstnNew); virtual bool _FAcceptChanges(bool *pfDismissEasel); void _UpdateMeter(void); public: static PESLR PeslrNew(PRCA prca, PMVIE pmvie, bool fSpeech, PSTN pstnNew); ~ESLR(void); bool FCmdRecord(PCMD pcmd); bool FCmdPlay(PCMD pcmd); bool FCmdUpdateMeter(PCMD pcmd); }; #endif ESL_H ================================================ FILE: inc/helpbook.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // defines for the help book #ifndef HELPBOOK_H #define HELPBOOK_H // cursors #define crsArrow1 0x00001001 #define crsHand1 0x00001002 // waves #define wavBingo 0x00001003 #define kidResPal 0x00001004 #define kcnoHelpMainWav 0x00001010 #define kcnoHelpNextWav 0x00001011 #define kcnoHelpBackWav 0x00001012 // objects #define kgobHelpBookPersistent 0x00003001 #define kgobHelpBookParent 0x00003002 #define kgobHelpBookGizmo 0x00003003 #define kgobHelpBookFill 0x00003004 #define kgobHelpBookFillPar 0x00003005 #define kgobHelpBookPrimary1 0x00003006 #define kgobHelpBookPrimary2 0x00003007 #define kgobHelpBookPrimary3 0x00003008 #define kgobHelpBookPrimary4 0x00003009 #define kgobHelpBookPrimary5 0x00003010 #define kgobHelpBookVolume 0x00003011 #define kgobHelpBookVoice 0x00003012 #define kgobHelpBookPageFwd 0x00003013 #define kgobHelpBookPageBack 0x00003014 #define kgobHelpBookCancel 0x00003015 #define kgobHelpBookHowSub 0x00003016 #define kgobHelpHowButton1 0x00003017 #define kgobHelpHowButton2 0x00003018 #define kgobHelpHowButton3 0x00003019 #define kgobHelpHowButton4 0x00003020 #define kgobHelpHowButton5 0x00003021 #define kgobHelpHowButton6 0x00003022 #define kgobHelpBookStyle 0x00003023 #define kgobHelpBookBkgd 0x00003024 #define kgobHelpBookPageLeft 0x00003025 #define kgobHelpBookPageRight 0x00003026 #define kgobHelpBookPageNum 0x00003027 #define kgobHelpBookVolumeSlider 0x00003028 #define kgobHelpBookVolumePath 0x00003029 #define kgobHelpTitlePar 0x00003045 #define ktpcBookToolTopics 0x2000015A #define kidHelpBookHowTo 0x2000015B #define kidHelpBookBasics 0x2000015C #define ktpcQuerySave 0x20000160 #define kgobQuerySave 0x20000161 #define ktpcQuerySaveWithCancel 0x20000162 #define kgobQuerySaveWithCancel 0x20000163 #define ktpcQueryQuit 0x20000164 #define kgobQueryQuit 0x20000165 #define ktpcQueryExitStudio 0x20000166 #define kgobQueryExitStudio 0x20000167 #define ktpcQuerySoundDelete 0x20000168 #define kgobQuerySoundDelete 0x20000169 #define ktpcQueryCD 0x2000016A #define kgobQueryCD 0x2000016B #define ktpcQueryOverwrite 0x2000016C #define kgobQueryOverwrite 0x2000016D #define ktpcQueryPurgeSounds 0x2000016E #define kgobQueryPurgeSounds 0x2000016F // string ids #define stidMaxPage 2 #define stidCurrPage 1 // positions of help book controls #define kxpHelpBookCancel 479 #define kypHelpBookCancel 403 #define kxpregHelpBookCancel 25 #define kypregHelpBookCancel 0 #define kxpHelpBookPageFwd 364 #define kypHelpBookPageFwd 412 #define kxpregHelpBookPageFwd 0 #define kypregHelpBookPageFwd 0 #define kxpHelpBookPageBack 241 #define kypHelpBookPageBack 412 #define kxpregHelpBookPageBack 25 #define kypregHelpBookPageBack 0 #define kxpHelpBookSlider 57 #define kypHelpBookSlider 245 #define kdxpHelpBookSlider 11 #define kdypHelpBookSlider 67 #define kdypHelpBookSliderTotal 74 #define kmaxVolume 0x00010000 #define kxpHelpBookVoice 163 #define kypHelpBookVoice 404 #define kxpregHelpBookVoice 25 #define kypregHelpBookVoice 0 #define kxpPageNumLeft 280 #define kypPageNumTop 428 #define kxpPageNumRight 360 #define kypPageNumBot 443 // fill width inside help book #define kFillLeft 70 #define kFillTop 79 #define kFillRight 571 #define kFillBot 420 // page positions inside help book fill #define kLeftPageL 100 #define kLeftPageL2 178 // when the how to section is present #define kLeftPageR 546 #define kTopPage 130 #define kBottomPage 390 #define kxpHelpTitle 312 #define kypHelpTitle 90 #define kzpHelpTitle 600 #define kTitleLeft -240 #define kTitleTop 0 #define kTitleRight 240 #define kTitleBottom 60 #endif // !HELPBOOK_H ================================================ FILE: inc/helpres.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // // Ids for each mbmp per gob within the studio // // REVIEW: these are currently the same ID's as the tools. Conflicts? // // The tools are different visuals from the ones actually used in the studio // for the following reason(s) // // 1. the tools may need to be treated different visually - ie. grayed out // like in Creative Writer. A wash may not cut it this time // // 2. We can always name the mbmp's in the studio to these names if necessary // // CAVEAT: This list must keep up to date with the real studio graphics (for now) // and kid/mbmp IDs! // #define mbmpStudio 0x20000 #define mbmpPalette 0x20001 #define mbmpBackground 0x20002 #define mbmpSettingsCover 0x20005 #define mbmpActorsCover 0x20006 #define mbmpSoundsCover 0x20007 #define mbmpTextsCover 0x20008 #define mbmpScrollbarsCover 0x2000B #define mbmpPlaysCover 0x2000C #define mbmpUndosCover 0x2000D #define mbmpBooksCover 0x2000E #define mbmpDoors 0x2000F #define mbmpSettingsBackground 0x20010 #define mbmpActorsBackground 0x20011 #define mbmpSoundsBackground 0x20012 #define mbmpTextsBackground 0x20013 #define mbmpSettingsCameras 0x20014 #define mbmpActorsSelect 0x20015 #define mbmpActorsBiography 0x20016 #define mbmpActorsCompose 0x20017 #define mbmpActorsCostume 0x20018 #define mbmpActorsNormalizeRot 0x20019 #define mbmpBrwsAction 0x2001A #define mbmpActorsRecordMode 0x2001B #define mbmpActorsRotateX 0x2001C #define mbmpActorsRotateY 0x2001D #define mbmpActorsRotateZ 0x2001E #define mbmpActorsSooner 0x2001F #define mbmpActorsSquash 0x20020 #define mbmpActorsShrink 0x20021 #define mbmpActorsXY 0x20022 #define mbmpActorsXZ 0x20023 #define mbmpActorsGround 0x20024 #define mbmpSoundsMixer 0x20025 #define mbmpSoundsPlayOnce 0x20026 #define mbmpSoundsListen 0x20027 #define mbmpSoundsRecord 0x20028 #define mbmpSoundsLooping 0x20029 #define mbmpSoundsAttachToCell 0x2002A #define mbmpSoundsClear 0x2002B #define mbmpTextsBkgdColor 0x2002C #define mbmpTextsFontShape 0x2002D #define mbmpTextsFontColor 0x2002E #define mbmpTextsFont 0x2002F #define mbmpTextsSelect 0x20030 #define mbmpTextsScroll 0x20031 #define mbmpTextsFontSize 0x20032 #define mbmpTextsStory 0x20033 #define mbmpBook 0x20034 #define mbmpMap 0x20035 #define mbmpCutCopyPaste 0x20036 #define mbmpUndo 0x20037 #define mbmpVolumeSlider 0x20038 #define mbmpPlay 0x20039 #define mbmpSceneSorter 0x2003A #define mbmpPortfolio 0x2003C #define mbmpExit 0x2003D #define mbmpBrwsBackground 0x2003E #define mbmpBrwsActor 0x2003F #define mbmpBrwsProp 0x20040 #define mbmpSettingsBrowser 0x20042 #define mbmpBrwsBkSound 0x20043 #define mbmpBrwsFXSound 0x20044 #define mbmpBrwsMusSound 0x20045 #define mbmpTextsCreate 0x20046 #define mbmpPortsBackground 0x20047 #define mbmpPortsPortfolio 0x20048 #define mbmpPortsNew 0x20049 #define mbmpPortsSave 0x2004A #define mbmpPausesMouse 0x2004C #define mbmpPausesClear 0x2004D #define mbmpPausesSound 0x2004E #define mbmpCCPBackground 0x2004F #define mbmpCCPSceneChopFwd 0x20050 #define mbmpCCPSceneNuke 0x20051 #define mbmpCCPActorNuke 0x20052 #define mbmpCCPCopyRoute 0x20053 #define mbmpCCPPaste 0x20054 #define mbmpCCPCopy 0x20055 #define mbmpCCPCut 0x20056 #define mbmpGenericCancel 0x20058 #define mbmpGenericOk 0x20059 #define mbmpGenericPageFwd 0x2005A #define mbmpGenericPageBack 0x2005B #define mbmpBrowserCancel 0x2005C #define mbmpBrowserOk 0x2005D #define mbmpBrowserPageFwd 0x2005E #define mbmpBrowserPageBack 0x2005F #define mbmpBrowserFrame 0x20060 // Next 0x100 are reserved #define mbmpBrowserFrameLim 0x2015F #define mbmpCameraFrame 0x20160 #define mbmpWorkspace 0x20161 #define mbmpBackground1 0x20162 #define mbmpBackground2 0x20163 #define mbmpBackground3 0x20164 #define mbmpBackground4 0x20165 #define mbmpCCPSceneChopBack 0x20166 #define mbmpActorsContinue 0x20167 #define mbmpActorsRotate 0x20168 #define mbmpActorsTransform 0x20169 #define mbmpRotateBackground 0x2016A #define mbmpTransformBackground 0x2016B #define mbmpScrollBackground 0x2016C #define mbmpTextsScrollType 0x2016D #define mbmpBrowserObj 0x2016E #define mbmpBrowserThumb 0x20170 // Next 0x100 are reserved #define mbmpBrowserThumbLim 0X2026F #define mbmpActorsRotateNorm 0x20270 #define mbmpActorsTransformNorm 0x20271 #define mbmpBrwsSceneFrame 0x20273 // CNO for Scene browser frame #define mbmpBrwsActorFrame 0x20275 // CNO for Actor browser frame #define mbmpBrwsMaterial 0x20276 #define mbmpBrwsCMaterial 0x20277 #define mbmpBrwsThreeD 0x20278 #define mbmpBrwsFonts 0x20279 #define mbmpBrwsForeColor 0x2027A #define mbmpBrwsBackColor 0x2027B #define mbmpBrwsTextSize 0x2027C #define mbmpActorsBrowser 0x2027D // the button itself #define mbmpActorsPropBrowser 0x2027E // the button itself #define mbmpActorsSpletters 0x2027F // the button itself #define mbmpSoundsEfxBrowser 0x20281 // the button itself #define mbmpSoundsMicBrowser 0x20282 // the button itself #define mbmpSoundsMusicBrowser 0x20283 // the button itself #define mbmpPlayStop 0x20284 #define mbmpSceneChoices 0x20285 #define mbmpVolumeControl 0x20286 #define mbmpForward 0x20287 #define mbmpForwardEnd 0x20288 #define mbmpRewind 0x20289 #define mbmpRewindEnd 0x2028A #define mbmpNukeIcon 0x2028B #define mbmpSoundRecord 0x2028C #define mbmpSoundPlay 0x2028D #define mbmpCostChangeIcon 0x2028E #define mbmpSceneSlider 0x2028F #define mbmpFrameSlider 0x20290 #define mbmpSOTransition1 0x20291 #define mbmpSOTransition2 0x20292 #define mbmpSOTransition3 0x20293 #define mbmpSOTransition4 0x20294 #define mbmpRecordMic 0x20295 #define mbmpPortfolioOpen 0x20296 #define mbmpPortfolioSaveAs 0x20297 #define mbmpCCPRemoveBefore 0x20298 #define mbmpCCPRemoveAfter 0x20299 #define mbmpCCPRemoveScene 0x2029A #define mbmpCCPRemoveObject 0x2029B #define mbmpActorActions 0x2029C #define mbmpLeannCancel 0x2029D #define mbmpLeannOk 0x2029E #define mbmpFOScrolling 0x2029F #define mbmpFONonScrolling 0x202A0 #define mbmpHandCursor 0x202A1 #define mbmpWordBoxCursor 0x202A2 #define mbmpCutWordBox 0x202A3 ////////// temporary #define helppic1016_bmp 0x202B0 #define helppic1016d_bmp 0x202B1 #define helppic1016r_bmp 0x202B2 #define helppic1020_bmp 0x202B3 #define helppic1020d_bmp 0x202B4 #define helppic1020r_bmp 0x202B5 #define mbmpOkButton_bmp 0x202B6 #define mbmpOkButtond_bmp 0x202B7 #define mbmpOkButtonr_bmp 0x202B8 #define mbmpQstButton_bmp 0x202B9 #define mbmpQstButtond_bmp 0x202BA #define mbmpQstButtonr_bmp 0x202BB #define mbmpRedo 0x202BC #define mbmpNukeSound 0x202BD ================================================ FILE: inc/helptops.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ #ifndef HELPTOPS_H #define HELPTOPS_H // All the help topics for projects, guidehelp, helpbook...etc. //////////////////////////////Help topics // logo wizard topics #define ktpcLogo00 0x20005200 #define ktpcLogo01 0x20005201 #define ktpcLogo02 0x20005202 #define ktpcLogo03 0x20005203 #define ktpcLogo04 0x20005204 #define ktpcLogo05 0x20005205 #define ktpcLogo06 0x20005206 #define ktpcLogo07 0x20005207 #define ktpcLogo08 0x20005208 #define ktpcLogo09 0x20005209 #define ktpcLogo0A 0x2000520a #define ktpcLogo0B 0x2000520b #define ktpcLogo0C 0x2000520c #define ktpcLogo0D 0x2000520d #define ktpcLogo0E 0x2000520e #define ktpcLogo11 0x2000520f #define ktpcLogo12 0x20005210 #define ktpcLogo5C 0x20005211 // how to scene topics #define ktpcHowToScenes00 0x20005215 #define ktpcHowToScenes01 0x20005216 #define ktpcHowToScenes02 0x20005217 #define ktpcHowToScenes03 0x20005218 #define ktpcHowToScenes04 0x20005219 // 01 #define ktpcHowToScenes05 0x2000521A #define ktpcHowToScenes06 0x2000521B #define ktpcHowToScenes07 0x2000521C // 02 #define ktpcHowToScenes08 0x2000521D #define ktpcHowToScenes09 0x2000521E // 03 #define ktpcHowToScenes0A 0x2000521F #define ktpcHowToScenes0B 0x20005220 // 04 #define ktpcHowToScenes0C 0x20005221 // 05 #define ktpcHowToScenes0D 0x20005222 #define ktpcHowToScenes0E 0x20005223 #define ktpcHowToScenes0F 0x20005224 // 06 #define ktpcHowToScenes10 0x20005225 #define ktpcHowToScenes11 0x20005226 #define ktpcHowToScenes12 0x20005227 // 07 #define ktpcHowToScenes13 0x20005228 #define ktpcHowToScenes14 0x20005229 // 08 #define ktpcHowToScenes15 0x2000522A #define ktpcHowToScenes16 0x2000522B // 09 #define ktpcHowToScenes17 0x2000522C #define ktpcHowToScenes18 0x2000522D #define ktpcHowToScenes19 0x2000522E // 10 #define ktpcHowToScenes1A 0x2000522F #define ktpcHowToScenes1B 0x20005230 #define ktpcHowToScenes1C 0x20005231 #define ktpcHowToScenes1D 0x20005232 // 11 #define ktpcHowToScenes1E 0x20000233 #define ktpcHowToScenes1F 0x20005234 #define ktpcHowToScenes20 0x20005235 #define ktpcHowToScenes21 0x20005236 // 12 #define ktpcHowToScenes22 0x20005237 #define ktpcHowToScenes23 0x20005238 #define ktpcHowToScenes24 0x20005239 #define ktpcHowToScenes25 0x2000523A // 13 #define ktpcHowToScenes26 0x2000523B // 14 #define ktpcHowToScenes27 0x2000523C #define ktpcHowToScenes28 0x2000523D #define ktpcHowToScenes29 0x2000523E #define ktpcHowToScenes2A 0x2000523F #define ktpcHowToScenes2B 0x20005240 #define ktpcHowToScenes2C 0x20005241 #define ktpcHowToScenes2D 0x20005242 #define ktpcHowToScenes2E 0x20005243 #define ktpcHowToScenes2F 0x20005244 #define ktpcHowToScenes30 0x20005245 #define ktpcHowToScenes31 0x20005246 #define ktpcHowToScenes44 0x20005247 #define ktpcHowToScenes45 0x20005248 #define ktpcHowToScenes46 0x20005249 #define ktpcHowToScenes49 0x2000524A #define ktpcHowToScenes51 0x2000524B #define ktpcHowToScenes32 0x2000524C #define ktpcHowToScenes33 0x2000524D #define ktpcHowToScenes34 0x2000524E #define ktpcHowToScenes35 0x2000524F #define ktpcHowToScenes36 0x20005250 #define ktpcHowToScenes37 0x20005251 #define ktpcHowToScenes38 0x20005252 #define ktpcHowToScenes39 0x20005253 #define ktpcHowToScenes3A 0x20005254 #define ktpcHowToScenes3B 0x20005255 #define ktpcHowToScenes5C 0x20005256 // project alerts #define ktpcDeviation 0x20005270 #define ktpcExitHelp 0x20005271 #define ktpcUserQuitsHelp 0x20005272 #define ktpcUserIdle 0x20005273 #define ktpcProjectCancel 0x20005274 #define ktpcNewMovie 0x20005275 // Projects Intro #define Audio_only___Long_Intro 0x20005280 #define Would_you_like_to 0x20005281 #define Audio_only___The_Project_Gad 0x20005282 #define ktpcPrjIntro03 0x20005283 // How to alerts #define No_Scene 0x20005288 #define No_Actor 0x20005289 #define No_Word_Box 0x2000528A #define No_Undo 0x2000528B // guide help #define CO__To_see_the_scenes 0x20005290 #define CO__Click_the_scene_you_want 0x20005291 #define CO___then_click_the_camera 0x20005292 #define CO__Click_Actors 0x20005293 #define CO__When_you_re_ready 0x20005294 #define CO__Click_the_actor_you_want 0x20005295 #define CO__Click_where_you_want_to 0x20005296 #define CO__To_make_an_actor_move 0x20005297 #define CO__Click_the_actor 0x20005298 #define CO__Click_the_action_you 0x20005299 #define CO__Drag_the_actor 0x2000529A #define CO__To_see_what_your 0x2000529B #define CO__If_you_want_to_save 0x2000529C #define Tip__Choose_Start_Position 0x2000529D #define Def_Drag 0x2000529E #define Tip___Change_Start_Position 0x2000529F #define Tip___Freezing_Action 0x200052A0 #define Tip___Move_Up 0x200052A1 #define Tip___Move_Down 0x200052A2 #define Tip___Move_Up_Down 0x200052A3 #define Tip___Path_through 0x200052A4 #define ktpcGuideHelp10 0x200052A5 #define Def___camera_angle 0x200052A6 // How to actors #define ktpcHowToActors00 0x200052C0 #define ktpcHowToActors01 0x200052C1 #define ktpcHowToActors02 0x200052C2 #define ktpcHowToActors03 0x200052C3 #define ktpcHowToActors04 0x200052C4 #define ktpcHowToActors05 0x200052C5 #define ktpcHowToActors06 0x200052C6 #define ktpcHowToActors07 0x200052C7 #define ktpcHowToActors08 0x200052C8 #define ktpcHowToActors09 0x200052C9 #define ktpcHowToActors0A 0x200052CA #define ktpcHowToActors0B 0x200052CB #define ktpcHowToActors0C 0x200052CC #define ktpcHowToActors0D 0x200052CD #define ktpcHowToActors0E 0x200052CE #define ktpcHowToActors0F 0x200052CF #define ktpcHowToActors10 0x200052D0 #define ktpcHowToActors11 0x200052D1 #define ktpcHowToActors12 0x200052D2 #define ktpcHowToActors13 0x200052D3 #define ktpcHowToActors14 0x200052D4 #define ktpcHowToActors15 0x200052D5 #define ktpcHowToActors16 0x200052D6 #define ktpcHowToActors17 0x200052D7 #define ktpcHowToActors18 0x200052D8 #define ktpcHowToActors19 0x200052D9 #define ktpcHowToActors1A 0x200052DA #define ktpcHowToActors1B 0x200052DB #define ktpcHowToActors1C 0x200052DC #define ktpcHowToActors1D 0x200052DD #define ktpcHowToActors1E 0x200052DE #define ktpcHowToActors1F 0x200052DF #define ktpcHowToActors20 0x200052E0 #define ktpcHowToActors21 0x200052E1 #define ktpcHowToActors22 0x200052E2 #define ktpcHowToActors23 0x200052E3 #define ktpcHowToActors24 0x200052E4 #define ktpcHowToActors25 0x200052E5 #define ktpcHowToActors26 0x200052E6 #define ktpcHowToActors27 0x200052E7 #define ktpcHowToActors28 0x200052E8 #define ktpcHowToActors29 0x200052E9 #define ktpcHowToActors2A 0x200052EA #define ktpcHowToActors2B 0x200052EB #define ktpcHowToActors2C 0x200052EC #define ktpcHowToActors2D 0x200052ED #define ktpcHowToActors2E 0x200052EE #define ktpcHowToActors2F 0x200052EF #define ktpcHowToActors30 0x200052F0 #define ktpcHowToActors31 0x200052F1 #define ktpcHowToActors32 0x200052F2 #define ktpcHowToActors33 0x200052F3 #define ktpcHowToActors34 0x200052F4 #define ktpcHowToActors35 0x200052F5 #define ktpcHowToActors36 0x200052F6 #define ktpcHowToActors37 0x200052F7 #define ktpcHowToActors38 0x200052F8 #define ktpcHowToActors39 0x200052F9 #define ktpcHowToActors3A 0x200052FA #define ktpcHowToActors3B 0x200052FB #define ktpcHowToActors3C 0x200052FC #define ktpcHowToActors3D 0x200052FD #define ktpcHowToActors3E 0x200052FE #define ktpcHowToActors3F 0x200052FF #define ktpcHowToActors40 0x20005300 #define ktpcHowToActors41 0x20005301 #define ktpcHowToActors42 0x20005302 #define ktpcHowToActors43 0x20005303 #define ktpcHowToActors44 0x20005304 #define ktpcHowToActors45 0x20005305 #define ktpcHowToActors46 0x20005306 #define ktpcHowToActors47 0x20005307 #define ktpcHowToActors48 0x20005308 #define ktpcHowToActors49 0x20005309 #define ktpcHowToActors4A 0x2000530A #define ktpcHowToActors4B 0x2000530B #define ktpcHowToActors4C 0x2000530C #define ktpcHowToActors4D 0x2000530D #define ktpcHowToActors4E 0x2000530E #define ktpcHowToActors4F 0x2000530F #define ktpcHowToActors50 0x20005310 #define ktpcHowToActors51 0x20005311 #define ktpcHowToActors52 0x20005312 #define ktpcHowToActors53 0x20005313 #define ktpcHowToActors54 0x20005314 #define ktpcHowToActors55 0x20005315 #define ktpcHowToActors56 0x20005316 #define ktpcHowToActors57 0x20005317 #define ktpcHowToActors58 0x20005318 #define ktpcHowToActors59 0x20005319 #define ktpcHowToActors5A 0x2000531A #define ktpcHowToActors5B 0x2000531B #define ktpcHowToActors5C 0x2000531C #define ktpcHowToActors5D 0x2000531D #define ktpcHowToActors5E 0x2000531E #define ktpcHowToActors5F 0x2000531F #define ktpcHowToActors60 0x20005320 #define ktpcHowToActors61 0x20005321 #define ktpcHowToActors62 0x20005322 #define ktpcHowToActors63 0x20005323 #define ktpcHowToActors64 0x20005324 #define ktpcHowToActors65 0x20005325 #define ktpcHowToActors66 0x20005326 #define ktpcHowToActors67 0x20005327 #define ktpcHowToActors68 0x20005328 #define ktpcHowToActors69 0x20005329 #define ktpcHowToActors6A 0x2000532A #define ktpcHowToActors6B 0x2000532B #define ktpcHowToActors6C 0x2000532C #define ktpcHowToActors6D 0x2000532D #define ktpcHowToActors6E 0x2000532E #define ktpcHowToActors6F 0x2000532F #define ktpcHowToActors70 0x20005330 #define ktpcHowToActors71 0x20005331 #define ktpcHowToActors72 0x20005332 #define ktpcHowToActors73 0x20005333 #define ktpcHowToActors74 0x20005334 #define ktpcHowToActors75 0x20005335 #define ktpcHowToActors76 0x20005336 #define ktpcHowToActors77 0x20005337 #define ktpcHowToActors78 0x20005338 #define ktpcHowToActors79 0x20005339 #define ktpcHowToActors7A 0x2000533A #define ktpcHowToActors7B 0x2000533B #define ktpcHowToActors7C 0x2000533C #define ktpcHowToActors7D 0x2000533D #define ktpcHowToActors7E 0x2000533E #define ktpcHowToActors7F 0x2000533F #define ktpcHowToActors80 0x20005340 #define ktpcHowToActors81 0x20005341 #define ktpcHowToActors82 0x20005342 #define ktpcHowToActors83 0x20005343 #define ktpcHowToActors84 0x20005344 #define ktpcHowToActors85 0x20005345 #define ktpcHowToActors86 0x20005346 #define ktpcHowToActors87 0x20005347 #define ktpcHowToActors88 0x20005348 #define ktpcHowToActors89 0x20005349 #define ktpcHowToActors8A 0x2000534A #define ktpcHowToActors8B 0x2000534B #define ktpcHowToActors8C 0x2000534C #define ktpcHowToActors8D 0x2000534D #define ktpcHowToActors8E 0x2000534E #define ktpcHowToActors8F 0x2000534F #define ktpcHowToActors90 0x20005350 #define ktpcHowToActors91 0x20005351 #define ktpcHowToActors92 0x20005352 #define ktpcHowToActors93 0x20005353 #define ktpcHowToActors94 0x20005354 // How to words #define ktpcHowToWords00 0x20005640 #define ktpcHowToWords01 0x20005641 #define ktpcHowToWords02 0x20005642 #define ktpcHowToWords03 0x20005643 #define ktpcHowToWords04 0x20005644 #define ktpcHowToWords05 0x20005645 #define ktpcHowToWords06 0x20005646 #define ktpcHowToWords07 0x20005647 #define ktpcHowToWords08 0x20005648 #define ktpcHowToWords09 0x20005649 #define ktpcHowToWords0A 0x2000564A #define ktpcHowToWords0B 0x2000564B #define ktpcHowToWords0C 0x2000564C #define ktpcHowToWords0D 0x2000564D #define ktpcHowToWords0E 0x2000564E #define ktpcHowToWords0F 0x2000564F #define ktpcHowToWords10 0x20005650 #define ktpcHowToWords11 0x20005651 #define ktpcHowToWords12 0x20005652 #define ktpcHowToWords13 0x20005653 #define ktpcHowToWords14 0x20005654 #define ktpcHowToWords15 0x20005655 #define ktpcHowToWords16 0x20005656 #define ktpcHowToWords17 0x20005657 #define ktpcHowToWords18 0x20005658 #define ktpcHowToWords19 0x20005659 #define ktpcHowToWords1A 0x2000565A #define ktpcHowToWords1B 0x2000565B #define ktpcHowToWords1C 0x2000565C #define ktpcHowToWords1D 0x2000565D #define ktpcHowToWords1E 0x2000565E #define ktpcHowToWords1F 0x2000565F #define ktpcHowToWords20 0x20005660 #define ktpcHowToWords21 0x20005661 #define ktpcHowToWords22 0x20005662 #define ktpcHowToWords23 0x20005663 #define ktpcHowToWords24 0x20005664 #define ktpcHowToWords25 0x20005665 #define ktpcHowToWords26 0x20005666 #define ktpcHowToWords27 0x20005667 #define ktpcHowToWords28 0x20005668 #define ktpcHowToWords29 0x20005669 #define ktpcHowToWords2A 0x2000566A #define ktpcHowToWords2B 0x2000566B #define ktpcHowToWords2C 0x2000566C #define ktpcHowToWords2D 0x2000566D #define ktpcHowToWords2E 0x2000566E #define ktpcHowToWords2F 0x2000566F #define ktpcHowToWords31 0x20005670 #define ktpcHowToWords32 0x20005671 #define ktpcHowToWords33 0x20005672 #define ktpcHowToWords34 0x20005673 #define ktpcHowToWords35 0x20005674 #define ktpcHowToWords36 0x20005675 #define ktpcHowToWords37 0x20005676 #define ktpcHowToWords38 0x20005677 #define ktpcHowToWords39 0x20005678 #define ktpcHowToWords3A 0x20005679 #define ktpcHowToWords3B 0x2000567A #define ktpcHowToWords3C 0x2000567B #define ktpcHowToWords3D 0x2000567C #define ktpcHowToWords3E 0x2000567D #define ktpcHowToWords3F 0x2000567E #define ktpcHowToWords40 0x2000567F #define ktpcHowToWords41 0x20005680 #define ktpcHowToWords42 0x20005681 #define ktpcHowToWords43 0x20005682 #define ktpcHowToWords44 0x20005683 #define ktpcHowToWords45 0x20005684 #define ktpcHowToWords46 0x20005685 #define ktpcHowToWords47 0x20005686 #define ktpcHowToWords48 0x20005687 #define ktpcHowToWords49 0x20005688 #define ktpcHowToWords4A 0x20005689 #define ktpcHowToWords50 0x2000568A #define ktpcHowToWords51 0x2000568B #define ktpcHowToWords52 0x2000568C #define ktpcHowToWords64 0x2000568D #define ktpcHowToWords66 0x2000568E #define ktpcHowToWords67 0x2000568F #define ktpcHowToWords30 0x20005690 #define ktpcHowToWords4B 0x20005691 // How to sounds #define ktpcHowToSounds00 0x20005380 #define ktpcHowToSounds01 0x20005381 #define ktpcHowToSounds02 0x20005382 #define ktpcHowToSounds03 0x20005383 #define ktpcHowToSounds04 0x20005384 // 1 #define ktpcHowToSounds05 0x20005385 #define ktpcHowToSounds06 0x20005386 #define ktpcHowToSounds07 0x20005387 #define ktpcHowToSounds08 0x20005388 // 2 #define ktpcHowToSounds09 0x20005389 #define ktpcHowToSounds0A 0x2000538A #define ktpcHowToSounds0B 0x2000538B #define ktpcHowToSounds0C 0x2000538C // 3 #define ktpcHowToSounds0D 0x2000538D #define ktpcHowToSounds0E 0x2000538E #define ktpcHowToSounds0F 0x2000538F // 4 #define ktpcHowToSounds10 0x20005390 #define ktpcHowToSounds11 0x20005391 #define ktpcHowToSounds12 0x20005392 // 5 #define ktpcHowToSounds13 0x20005393 #define ktpcHowToSounds14 0x20005394 #define ktpcHowToSounds15 0x20005395 // 6 #define ktpcHowToSounds16 0x20005396 #define ktpcHowToSounds17 0x20005397 #define ktpcHowToSounds18 0x20005398 // 7 #define ktpcHowToSounds19 0x20005399 #define ktpcHowToSounds1A 0x2000539A #define ktpcHowToSounds1B 0x2000539B #define ktpcHowToSounds1C 0x2000539C // 8 #define ktpcHowToSounds1D 0x2000539D #define ktpcHowToSounds1E 0x2000539E #define ktpcHowToSounds1F 0x2000539F // 9 #define ktpcHowToSounds20 0x200053A0 #define ktpcHowToSounds21 0x200053A1 #define ktpcHowToSounds22 0x200053A2 // 10 #define ktpcHowToSounds23 0x200053A3 #define ktpcHowToSounds24 0x200053A4 #define ktpcHowToSounds25 0x200053A5 // 11 #define ktpcHowToSounds26 0x200053A6 #define ktpcHowToSounds2E 0x200053A7 #define ktpcHowToSounds44 0x200053A8 #define ktpcHowToSounds51 0x200053A9 #define ktpcHowToSounds52 0x200053AA #define ktpcHowToSounds60 0x200053AB #define ktpcHowToSounds61 0x200053AC #define ktpcHowToSounds62 0x200053AD #define ktpcHowToSounds63 0x200053AE #define ktpcHowToSounds69 0x200053AF #define ktpcHowToSounds73 0x200053B0 #define ktpcHowToSounds74 0x200053B1 #define ktpcHowToSounds76 0x200053B2 #define ktpcHowToSounds77 0x200053B3 #define ktpcHowToSounds27 0x200053B4 #define ktpcHowToSounds28 0x200053B5 #define ktpcHowToSounds29 0x200053B6 #define ktpcHowToSounds2A 0x200053B7 #define ktpcHowToSounds2C 0x200053B8 #define ktpcHowToSounds2D 0x200053B9 // Project 3 *WARNING 200053C0 thru 200053FF are use above** #define To_play_this_movie__click 0x20005400 #define To_see_the_steps_for_changing 0x20005401 #define Why__Actions__when_viewed 0x20005402 #define I_created_the_first_part 0x20005403 #define CO__To_change_Nakita_s_act 0x20005404 #define CO__Click_Nakita 0x20005405 #define CO__Click_Run_Scared 0x20005406 #define CO__Then_click_OK 0x20005407 #define CO__Presto___The_new_action 0x20005408 #define CO__Click_the_button_below 0x20005409 #define To_see_the_steps_for_adding 0x2000540A #define Why__There_are_two_ways_to 0x2000540B #define CO__To_play_the_movie_so 0x2000540C #define Why__Frame_Slider 0x2000540D #define CO__To_find_Nakita_s_line 0x2000540E #define CO__Click_Speech 0x2000540F #define CO__Click__A_rat 0x20005410 #define Tip__Undo 0x20005411 #define CO__Now_click_Nakita 0x20005412 #define CO__To_see_the_steps_for 0x20005413 #define Why_Each_action_moves 0x20005414 #define CO__Click_the_button_below_to 0x20005415 #define CO__To_add_an_action 0x20005416 #define CO__Click_Actions 0x20005417 #define CO__Click_yell 0x20005418 #define CO__Click_Nakita_Then_hold 0x20005419 #define CO__To_see_the_steps 0x2000541A #define Why__Some_actions_need 0x2000541B #define CO__To_rewind_the_movie_to 0x2000541C #define CO__Click__Wait_up__Wanda 0x2000541D #define Congratulations 0x2000541E #define Tip___Another_movie 0x2000541F #define CO__To_see_the_movie_from 0x20005420 #define IDLE__Remember_to_get 0x20005421 #define CO__To_play_the_new_ending 0x20005422 #define Tip___If_you_rewind_too_far 0x20005423 #define Tip__Mean 0x20005424 // Project 1 #define ktpc1Project00 0x20005430 #define ktpc1Project01 0x20005431 #define ktpc1Project02 0x20005432 #define ktpc1Project03 0x20005433 #define ktpc1Project04 0x20005434 #define ktpc1Project05 0x20005435 #define ktpc1Project06 0x20005436 #define ktpc1Project07 0x20005437 #define ktpc1Project08 0x20005438 #define ktpc1Project09 0x20005439 #define ktpc1Project0A 0x2000543A #define ktpc1Project0B 0x2000543B #define ktpc1Project0C 0x2000543C #define ktpc1Project0D 0x2000543D #define ktpc1Project0E 0x2000543E #define ktpc1Project0F 0x2000543F #define ktpc1Project10 0x20005440 #define ktpc1Project11 0x20005441 #define ktpc1Project12 0x20005442 #define ktpc1Project13 0x20005443 #define ktpc1Project14 0x20005444 #define ktpc1Project15 0x20005445 #define ktpc1Project16 0x20005446 #define ktpc1Project17 0x20005447 #define ktpc1Project18 0x20005448 #define ktpc1Project19 0x20005449 #define ktpc1Project1A 0x2000544A #define ktpc1Project1B 0x2000544B #define ktpc1Project1C 0x2000544C #define ktpc1Project1D 0x2000544D #define ktpc1Project1E 0x2000544E #define ktpc1Project1F 0x2000544F #define ktpc1Project20 0x20005450 #define ktpc1Project21 0x20005451 #define ktpc1Project22 0x20005452 #define ktpc1Project23 0x20005453 #define ktpc1Project24 0x20005454 #define ktpc1Project25 0x20005455 #define ktpc1Project26 0x20005456 #define ktpc1Project27 0x20005457 #define ktpc1Project28 0x20005458 #define ktpc1Project29 0x20005459 #define ktpc1Project2A 0x2000545A #define ktpc1Project2B 0x2000545B #define ktpc1Project2C 0x2000545C #define ktpc1Project2D 0x2000545D #define ktpc1Project2E 0x2000545E #define ktpc1Project2F 0x2000545F #define ktpc1Project30 0x20005460 #define ktpc1Project31 0x20005461 #define ktpc1Project32 0x20005462 #define ktpc1Project33 0x20005463 // Project 2 #define ktpc2Project00 0x20005470 #define ktpc2Project01 0x20005471 #define ktpc2Project02 0x20005472 #define ktpc2Project03 0x20005473 #define ktpc2Project04 0x20005474 #define ktpc2Project05 0x20005475 #define ktpc2Project06 0x20005476 #define ktpc2Project07 0x20005477 #define ktpc2Project08 0x20005478 #define ktpc2Project09 0x20005479 #define ktpc2Project0A 0x2000547A #define ktpc2Project0B 0x2000547B #define ktpc2Project0C 0x2000547C #define ktpc2Project0D 0x2000547D #define ktpc2Project0E 0x2000547E #define ktpc2Project0F 0x2000547F #define ktpc2Project10 0x20005480 #define ktpc2Project11 0x20005481 #define ktpc2Project12 0x20005482 #define ktpc2Project13 0x20005483 #define ktpc2Project14 0x20005484 #define ktpc2Project15 0x20005485 #define ktpc2Project16 0x20005486 #define ktpc2Project17 0x20005487 #define ktpc2Project18 0x20005488 #define ktpc2Project19 0x20005489 #define ktpc2Project1A 0x2000548A #define ktpc2Project1B 0x2000548B #define ktpc2Project1C 0x2000548C #define ktpc2Project1D 0x2000548D #define ktpc2Project1E 0x2000548E #define ktpc2Project1F 0x2000548F #define ktpc2Project20 0x20005490 #define ktpc2Project21 0x20005491 #define ktpc2Project22 0x20005492 #define ktpc2Project23 0x20005493 #define ktpc2Project24 0x20005494 #define ktpc2Project25 0x20005495 #define ktpc2Project26 0x20005496 #define ktpc2Project27 0x20005497 #define ktpc2Project28 0x20005498 #define ktpc2Project29 0x20005499 #define ktpc2Project2A 0x2000549A #define ktpc2Project2B 0x2000549B #define ktpc2Project2C 0x2000549C #define ktpc2Project2D 0x2000549D #define ktpc2Project2E 0x2000549E #define ktpc2Project2F 0x2000549F #define ktpc2Project30 0x200054A0 #define ktpc2Project31 0x200054A1 // Project 4 #define ktpc4Project00 0x200054B0 #define ktpc4Project01 0x200054B1 #define ktpc4Project02 0x200054B2 #define ktpc4Project03 0x200054B3 #define ktpc4Project04 0x200054B4 #define ktpc4Project05 0x200054B5 #define ktpc4Project06 0x200054B6 #define ktpc4Project07 0x200054B7 #define ktpc4Project08 0x200054B8 #define ktpc4Project09 0x200054B9 #define ktpc4Project0A 0x200054BA #define ktpc4Project0B 0x200054BB #define ktpc4Project0C 0x200054BC #define ktpc4Project0D 0x200054BD #define ktpc4Project0E 0x200054BE #define ktpc4Project0F 0x200054BF #define ktpc4Project10 0x200054C0 #define ktpc4Project11 0x200054C1 #define ktpc4Project12 0x200054C2 #define ktpc4Project13 0x200054C3 #define ktpc4Project14 0x200054C4 #define ktpc4Project15 0x200054C5 #define ktpc4Project16 0x200054C6 #define ktpc4Project17 0x200054C7 #define ktpc4Project18 0x200054C8 #define ktpc4Project19 0x200054C9 #define ktpc4Project1A 0x200054CA #define ktpc4Project1B 0x200054CB #define ktpc4Project1C 0x200054CC #define ktpc4Project1D 0x200054CD #define ktpc4Project1E 0x200054CE #define ktpc4Project1F 0x200054CF #define ktpc4Project20 0x200054D0 #define ktpc4Project21 0x200054D1 #define ktpc4Project22 0x200054D2 #define ktpc4Project23 0x200054D3 #define ktpc4Project24 0x200054D4 #define ktpc4Project25 0x200054D5 #define ktpc4Project26 0x200054D6 #define ktpc4Project27 0x200054D7 #define ktpc4Project28 0x200054D8 #define ktpc4Project29 0x200054D9 #define ktpc4Project2A 0x200054DA #define ktpc4Project2B 0x200054DB #define ktpc4Project2C 0x200054DC #define ktpc4Project2D 0x200054DD #define ktpc4Project2E 0x200054DE #define ktpc4Project2F 0x200054DF #define ktpc4Project30 0x200054E0 #define ktpc4Project31 0x200054E1 #define ktpc4Project32 0x200054E2 #define ktpc4Project33 0x200054E3 #define ktpc4Project34 0x200054E4 #define ktpc4Project35 0x200054E5 #define ktpc4Project36 0x200054E6 #define ktpc4Project37 0x200054E7 #define ktpc4Project38 0x200054E8 #define ktpc4Project39 0x200054E9 #define ktpc4Project3A 0x200054EA #define ktpc4Project3B 0x200054EB #define ktpc4Project3C 0x200054EC #define ktpc4Project3D 0x200054ED #define ktpc4Project3E 0x200054EE #define ktpc4Project3F 0x200054EF // Project 5 #define ktpc5Project00 0x200054F0 #define ktpc5Project01 0x200054F1 #define ktpc5Project02 0x200054F2 #define ktpc5Project03 0x200054F3 #define ktpc5Project04 0x200054F4 #define ktpc5Project05 0x200054F5 #define ktpc5Project06 0x200054F6 #define ktpc5Project07 0x200054F7 #define ktpc5Project08 0x200054F8 #define ktpc5Project09 0x200054F9 #define ktpc5Project0A 0x200054FA #define ktpc5Project0B 0x200054FB #define ktpc5Project0C 0x200054FC #define ktpc5Project0D 0x200054FD #define ktpc5Project0E 0x200054FE #define ktpc5Project0F 0x200054FF #define ktpc5Project10 0x20005500 #define ktpc5Project11 0x20005501 #define ktpc5Project12 0x20005502 #define ktpc5Project13 0x20005503 #define ktpc5Project14 0x20005504 #define ktpc5Project15 0x20005505 #define ktpc5Project16 0x20005506 #define ktpc5Project17 0x20005507 #define ktpc5Project18 0x20005508 #define ktpc5Project19 0x20005509 #define ktpc5Project1A 0x2000550A #define ktpc5Project1B 0x2000550B #define ktpc5Project1C 0x2000550C #define ktpc5Project1D 0x2000550D #define ktpc5Project1E 0x2000550E #define ktpc5Project1F 0x2000550F #define ktpc5Project20 0x20005510 #define ktpc5Project21 0x20005511 #define ktpc5Project22 0x20005512 #define ktpc5Project23 0x20005513 #define ktpc5Project24 0x20005514 #define ktpc5Project25 0x20005515 #define ktpc5Project26 0x20005516 #define ktpc5Project27 0x20005517 #define ktpc5Project28 0x20005518 #define ktpc5Project29 0x20005519 #define ktpc5Project2A 0x2000551A #define ktpc5Project2B 0x2000551B #define ktpc5Project2C 0x2000551C #define ktpc5Project2D 0x2000551D #define ktpc5Project2E 0x2000551E #define ktpc5Project2F 0x2000551F #define ktpc5Project30 0x20005520 #define ktpc5Project31 0x20005521 #define ktpc5Project32 0x20005522 #define ktpc5Project33 0x20005523 #define ktpc5Project34 0x20005524 #define ktpc5Project35 0x20005525 #define ktpc5Project36 0x20005526 #define ktpc5Project37 0x20005527 #define ktpc5Project38 0x20005528 #define ktpc5Project39 0x20005529 #define ktpc5Project3A 0x2000552A #define ktpc5Project3B 0x2000552B #define ktpc5Project3C 0x2000552C #define ktpc5Project3D 0x2000552D #define ktpc5Project3E 0x2000552E #define ktpc5Project3F 0x2000552F #define ktpc5Project40 0x20005530 #define ktpc5Project41 0x20005531 #define ktpc5Project42 0x20005532 #define ktpc5Project43 0x20005533 #define ktpc5Project44 0x20005534 #define ktpc5Project45 0x20005535 #define ktpc5Project46 0x20005536 #define ktpc5Project47 0x20005537 #define ktpc5Project48 0x20005538 #define ktpc5Project49 0x20005539 #define ktpc5Project4A 0x2000553A #define ktpc5Project4B 0x2000553B #define ktpc5Project4C 0x2000553C #define ktpc5Project4D 0x2000553D #define ktpc5Project4E 0x2000553E #define ktpc5Project4F 0x2000553F #define ktpc5Project50 0x20005540 #define ktpc5Project51 0x20005541 // easel help #define ktpcEaselHelp00 0x20005600 // scene organizer #define ktpcEaselHelp01 0x20005601 #define ktpcEaselHelp02 0x20005602 #define ktpcEaselHelp03 0x20005603 #define ktpcEaselHelp04 0x20005604 #define ktpcEaselHelp05 0x20005605 #define ktpcEaselHelp06 0x20005606 #define ktpcEaselHelp07 0x20005607 #define ktpcEaselHelp08 0x20005608 #define ktpcEaselHelp09 0x20005609 #define ktpcEaselHelp0A 0x2000560A #define ktpcEaselHelp0B 0x2000560B // 3D words #define ktpcEaselHelp0C 0x2000560C #define ktpcEaselHelp0D 0x2000560D #define ktpcEaselHelp0E 0x2000560E #define ktpcEaselHelp0F 0x2000560F #define ktpcEaselHelp10 0x20005610 #define ktpcEaselHelp11 0x20005611 #define ktpcEaselHelp12 0x20005612 #define ktpcEaselHelp13 0x20005613 // listener browser #define ktpcEaselHelp14 0x20005614 #define ktpcEaselHelp15 0x20005615 // costume changer #define ktpcEaselHelp16 0x20005616 #define ktpcEaselHelp17 0x20005617 #define ktpcEaselHelp18 0x20005618 #define ktpcEaselHelp19 0x20005619 // sound effects #define ktpcEaselHelp1A 0x2000561A #define ktpcEaselHelp1B 0x2000561B #define ktpcEaselHelp1C 0x2000561C #define ktpcEaselHelp1D 0x2000561D #define ktpcEaselHelp1E 0x2000561E // record your own #define ktpcEaselHelp1F 0x2000561F #define ktpcEaselHelp20 0x20005620 #define ktpcEaselHelp21 0x20005621 #define ktpcEaselHelp22 0x20005622 #define ktpcEaselHelp23 0x20005623 #define ktpcEaselHelp24 0x20005624 // speech browser #define ktpcEaselHelp25 0x20005625 #define ktpcEaselHelp26 0x20005626 #define ktpcEaselHelp27 0x20005627 #define ktpcEaselHelp28 0x20005628 #define ktpcEaselHelp29 0x20005629 // music browser #define ktpcEaselHelp2A 0x2000562A #define ktpcEaselHelp2B 0x2000562B #define ktpcEaselHelp2C 0x2000562C #define ktpcEaselHelp2D 0x2000562D // action browser #define ktpcEaselHelp2E 0x2000562E #define ktpcEaselHelp2F 0x2000562F #define ktpcEaselHelp30 0x20005630 #define ktpcEaselHelp31 0x20005631 #define ktpcEaselHelp32 0x20005632 #define ktpcEaselHelp33 0x20005633 #define ktpcEaselHelp34 0x20005634 #define ktpcEaselHelp35 0x20005635 #define ktpcEaselHelp36 0x20005636 #define ktpcEaselHelp37 0x20005637 #define ktpcEaselHelp38 0x20005638 #define ktpcEaselHelp39 0x20005639 #define ktpcEaselHelp3A 0x2000563A #define ktpcEaselHelp3B 0x2000563B #define kttRecordEaselCancel 0x2000563E #define kttRecordEaselOk 0x2000563F #define ktpcEaselHelp3F 0x20005695 // WARNING: 0X20005640 - 0X20005691 is used above // project 6 #define ktpc6Project00 0x200056A0 #define ktpc6Project01 0x200056A1 #define ktpc6Project02 0x200056A2 #define ktpc6Project03 0x200056A3 #define ktpc6Project04 0x200056A4 #define ktpc6Project05 0x200056A5 #define ktpc6Project06 0x200056A6 #define ktpc6Project07 0x200056A7 #define ktpc6Project08 0x200056A8 #define ktpc6Project09 0x200056A9 #define ktpc6Project0A 0x200056AA #define ktpc6Project0B 0x200056AB #define ktpc6Project0C 0x200056AC #define ktpc6Project0D 0x200056AD #define ktpc6Project0E 0x200056AE #define ktpc6Project0F 0x200056AF #define ktpc6Project10 0x200056B0 #define ktpc6Project11 0x200056B1 #define ktpc6Project12 0x200056B2 #define ktpc6Project13 0x200056B3 #define ktpc6Project14 0x200056B4 #define ktpc6Project15 0x200056B5 #define ktpc6Project16 0x200056B6 #define ktpc6Project17 0x200056B7 #define ktpc6Project18 0x200056B8 #define ktpc6Project19 0x200056B9 #define ktpc6Project1A 0x200056BA #define ktpc6Project1B 0x200056BB #define ktpc6Project1C 0x200056BC #define ktpc6Project1D 0x200056BD #define ktpc6Project1E 0x200056BE #define ktpc6Project1F 0x200056BF #define ktpc6Project20 0x200056C0 #define ktpc6Project21 0x200056C1 #define ktpc6Project22 0x200056C2 #define ktpc6Project23 0x200056C3 #define ktpc6Project24 0x200056C4 #define ktpc6Project25 0x200056C5 #define ktpc6Project26 0x200056C6 #define ktpc6Project27 0x200056C7 #define ktpc6Project28 0x200056C8 #define ktpc6Project29 0x200056C9 #define ktpc6Project2A 0x200056CA #define ktpc6Project2B 0x200056CB #define ktpc6Project2C 0x200056CC #define ktpc6Project2D 0x200056CD #define ktpc6Project4F 0x200056CE #define ktpc6Project2E 0x200056CF // help book basics #define ktpcBasics00 0x200056E0 #define ktpcBasics01 0x200056E1 #define ktpcBasics02 0x200056E2 #define ktpcBasics03 0x200056E3 #define ktpcBasics04 0x200056E4 #define ktpcBasics05 0x200056E5 #define ktpcBasics06 0x200056E6 #define ktpcBasics07 0x200056E7 #define ktpcBasics08 0x200056E8 #define ktpcBasics09 0x200056E9 #define ktpcBasics0A 0x200056EA #define ktpcBasics0B 0x200056EB #define ktpcBasics0C 0x200056EC #define ktpcBasics0D 0x200056ED #define ktpcBasics0E 0x200056EE #define ktpcBasics0F 0x200056EF #define ktpcBasics10 0x200056F0 // gadget 1 text--projects are in order and sequence, don't // change or bad things can(and will) happen #define ktpc1Gadget00 0x20005700 #define ktpc1Gadget01 0x20005701 #define ktpc1Gadget02 0x20005702 #define ktpc1Gadget03 0x20005703 #define ktpc1Gadget04 0x20005704 #define ktpc1Gadget05 0x20005705 #define ktpc1Gadget06 0x20005706 #define ktpc1Gadget07 0x20005707 // gadget 3 text #define ktpc3Gadget00 0x20005708 #define ktpc3Gadget01 0x20005709 #define ktpc3Gadget02 0x2000570A #define ktpc3Gadget03 0x2000570B #define ktpc3Gadget04 0x2000570C #define ktpc3Gadget05 0x2000570D // gadget 2 text #define ktpc2Gadget00 0x2000570E #define ktpc2Gadget01 0x2000570F #define ktpc2Gadget02 0x20005710 #define ktpc2Gadget03 0x20005711 // gadget 6 text #define ktpc6Gadget00 0x20005712 #define ktpc6Gadget01 0x20005713 #define ktpc6Gadget02 0x20005714 #define ktpc6Gadget03 0x20005715 #define ktpc6Gadget04 0x20005716 #define ktpc6Gadget05 0x20005717 #define ktpc6Gadget06 0x20005718 // gadget 5 text #define ktpc5Gadget00 0x20005719 #define ktpc5Gadget01 0x2000571A #define ktpc5Gadget02 0x2000571B #define ktpc5Gadget03 0x2000571C #define ktpc5Gadget04 0x2000571D #define ktpc5Gadget05 0x2000571E #define ktpc5Gadget06 0x2000571F #define ktpc5Gadget07 0x20005720 #define ktpc5Gadget08 0x20005721 #define ktpc5Gadget09 0x20005722 #define ktpc5Gadget0A 0x20005723 // gadget 4 text #define ktpc4Gadget00 0x20005724 #define ktpc4Gadget01 0x20005725 #define ktpc4Gadget02 0x20005726 #define ktpc4Gadget03 0x20005727 #define ktpc4Gadget04 0x20005728 #define ktpc4Gadget07 0x20005729 #define ktpcGadgetTextStart ktpc1Gadget00 #define ktpcGadgetTextEnd ktpc4Gadget07 // error help #define ktpcercOomHq 0x20005800 #define ktpcercOomPv 0x20005801 #define ktpcercOomNew 0x20005802 #define ktpcercFileGeneral 0x20005803 #define ktpcercFilePerm 0x20005804 #define ktpcercFileOpen 0x20005805 #define ktpcercFileCreate 0x20005806 #define ktpcercFileSwapNames 0x20005807 #define ktpcercFileRename 0x20005808 #define ktpcercFniGeneral 0x20005809 #define ktpcercFniDelete 0x2000580A #define ktpcercFniRename 0x2000580B #define ktpcercFniMismatch 0x2000580C #define ktpcercFniHidden 0x2000580D #define ktpcercFniDirCreate 0x2000580E #define ktpcercFneGeneral 0x2000580F #define ktpcercCflOpen 0x20005810 #define ktpcercCflCreate 0x20005811 #define ktpcercCflSave 0x20005812 #define ktpcercCflSaveCopy 0x20005813 #define ktpcercCrfCantLoad 0x20005814 #define ktpcercSndmCantInit 0x20005815 #define ktpcercSndmPartialInit 0x20005816 #define ktpcercOomGdi 0x20005817 #define ktpcercGfxCantDraw 0x20005818 #define ktpcercGfxCantSetFont 0x20005819 #define ktpcercGfxNoFontList 0x2000581A #define ktpcercGfxCantSetPalette 0x2000581B #define ktpcercDlgCantGetArgs 0x2000581C #define ktpcercDlgCantFind 0x2000581D #define ktpcercDlgOom 0x2000581E #define ktpcercCantSave 0x2000581F #define ktpcercRtxdTooMuchText 0x20005820 #define ktpcercRtxdReadFailed 0x20005821 #define ktpcercRtxdSaveFailed 0x20005822 #define ktpcercCantOpenVideo 0x20005823 #define ktpcercMbmpCantOpenBitmap 0x20005824 #define ktpcercSocSaveFailure 0x20005825 #define ktpcercSocPlaceActor 0x20005826 #define ktpcercSocSceneSwitch 0x20005827 #define ktpcercSocSceneChop 0x20005828 #define ktpcercSocBadFile 0x20005829 #define ktpcercSocNoTboxSelected 0x2000582A #define ktpcercSocNoActrSelected 0x2000582B #define ktpcercSocNotUndoable 0x2000582C #define ktpcercSocNoScene 0x2000582D #define ktpcercSocBadVersion 0x2000582E #define ktpcercSocNothingToPaste 0x2000582F #define ktpcercSocBadFrameSlider 0x20005830 #define ktpcercSocGotoFrameFailure 0x20005831 #define ktpcercSocDeleteBackFailure 0x20005832 #define ktpcercSocActionNotApplicable 0x20005833 #define ktpcercSocCannotPasteThatHere 0x20005834 #define ktpcercSocNoModlForChar 0x20005835 #define ktpcercSocNameTooLong 0x20005836 #define ktpcercSocTboxTooSmall 0x20005837 #define ktpcercSocNoThumbnails 0x20005838 #define ktpcercSocTdtTooLong 0x20005839 #define ktpcercSocBadTdf 0x2000583A #define ktpcercSocNoActrMidi 0x2000583B #define ktpcercSocNoImportRollCall 0x2000583C #define ktpcercSocNoNukeRollCall 0x2000583D #define ktpcercSocSceneSortError 0x2000583E #define ktpcercSocCantInitSceneSort 0x2000583F #define ktpcercSocCantInitSplot 0x20005840 #define ktpcercSocNoWaveIn 0x20005841 #define ktpcercSocWaveInProblems 0x20005842 #define ktpcercSocPortfolioFailed 0x20005843 #define ktpcercSocCantInitStudio 0x20005844 #define ktpcercSoc3DWordCreate 0x20005845 #define ktpcercSoc3DWordChange 0x20005846 #define ktpcercSocWaveSaveFailure 0x20005847 #define ktpcercSocNoSoundName 0x20005848 #define ktpcercSndamWaveDeviceBusy 0x20005849 #define ktpcercSocNoKidSndsInMovie 0x2000584A #define ktpcercSocCreatedUserDir 0x2000584B #define ktpcercSocMissingMelanieDoc 0x2000584C #define ktpcercSocCantLoadMelanieDoc 0x2000584D #define ktpcercSocBadSceneSound 0x2000584E #define ktpcercSocBadSoundFile 0x2000584F #define ktpcercSocNoDefaultFont 0x20005850 #define ktpcercSocCantCacheTag 0x20005851 #define ktpcercSocInvalidFilename 0x20005852 #define ktpcercSocCantGoToStudio 0x20005853 #define ktpcercSocCantGoToMap 0x20005854 #define ktpcercSndMidiDeviceBusy 0x20005855 #define ktpcercSocGenericError 0x20005856 #define ktpcercSocNoSndOnPaste 0x20005857 #define ktpcercSocCantCopyMsnd 0x20005858 // *If you add anything below this line you need to notify leannp about it so she can make a help topic for it* //////////////////////////////////// Waves // logo wizard #define kwavLogo00 0x00075000 #define kwavLogo01 0x00075001 #define kwavLogo02 0x00075002 #define kwavLogo03 0x00075004 #define kwavLogo04 0x00075005 #define kwavLogo05 0x00075006 #define kwavLogo06 0x00075007 #define kwavLogo07 0x00075008 #define kwavLogo08 0x00075009 #define kwavLogo09 0x0007500A #define kwavLogo0A 0x0007500B #define kwavLogo0B 0x0007500C #define kwavLogo0C 0x0007500D #define kwavLogo11 0x0007500E #define kwavLogo12 0x0007500F // how to scenes #define kwavHTScenes00 0x00075030 #define kwavHTScenes01 0x00075031 #define kwavHTScenes02 0x00075032 #define kwavHTScenes03 0x00075033 #define kwavHTScenes04 0x00075034 #define kwavHTScenes05 0x00075035 #define kwavHTScenes06 0x00075036 #define kwavHTScenes07 0x00075037 #define kwavHTScenes08 0x00075038 #define kwavHTScenes09 0x00075039 #define kwavHTScenes0A 0x0007503A #define kwavHTScenes0B 0x0007503B #define kwavHTScenes0C 0x0007503C #define kwavHTScenes0D 0x0007503D #define kwavHTScenes0E 0x0007503F #define kwavHTScenes0F 0x00075040 #define kwavHTScenes10 0x00075041 #define kwavHTScenes11 0x00075042 #define kwavHTScenes12 0x00075043 #define kwavHTScenes13 0x00075044 #define kwavHTScenes14 0x00075045 #define kwavHTScenes15 0x00075046 #define kwavHTScenes16 0x00075047 #define kwavHTScenes17 0x00075048 #define kwavHTScenes18 0x00075049 #define kwavHTScenes19 0x0007504A #define kwavHTScenes1A 0x0007504B #define kwavHTScenes1B 0x0007504C #define kwavHTScenes1C 0x0007504D #define kwavHTScenes1D 0x0007504E #define kwavHTScenes1E 0x0007504F #define kwavHTScenes1F 0x00075050 #define kwavHTScenes20 0x00075051 #define kwavHTScenes21 0x00075052 #define kwavHTScenes22 0x00075053 #define kwavHTScenes23 0x00075054 #define kwavHTScenes24 0x00075055 #define kwavHTScenes25 0x00075056 #define kwavHTScenes26 0x00075057 #define kwavHTScenes27 0x00075058 #define kwavHTScenes28 0x00075059 #define kwavHTScenes29 0x0007505A #define kwavHTScenes2A 0x0007505B #define kwavHTScenes2B 0x0007505C #define kwavHTScenes2C 0x0007505D #define kwavHTScenes2D 0x0007505E #define kwavHTScenes2E 0x0007505F #define kwavHTScenes2F 0x00075060 #define kwavHTScenes30 0x00075061 #define kwavHTScenes31 0x00075062 #define kwavHTScenes44 0x00075063 #define kwavHTScenes45 0x00075064 #define kwavHTScenes46 0x00075065 #define kwavHTScenes49 0x00075066 #define kwavHTScenes51 0x00075067 #define kwavHTScenes32 0x00075068 #define kwavHTScenes34 0x00075069 #define kwavHTScenes35 0x0007506A #define kwavHTScenes36 0x0007506B #define kwavHTScenes37 0x0007506C #define kwavHTScenes38 0x0007506D #define kwavHTScenes39 0x0007506E #define kwavHTScenes3A 0x0007506F #define kwavHTScenes3B 0x00075070 // guide help68 #define kwavGuideHelp00 0x00075090 #define kwavGuideHelp01 0x00075091 #define kwavGuideHelp02 0x00075092 #define kwavGuideHelp03 0x00075093 #define kwavGuideHelp04 0x00075094 #define kwavGuideHelp05 0x00075095 #define kwavGuideHelp06 0x00075096 #define kwavGuideHelp07 0x00075097 #define kwavGuideHelp08 0x00075098 #define kwavGuideHelp09 0x00075099 #define kwavGuideHelp0A 0x0007509A #define kwavGuideHelp0B 0x0007509B #define kwavGuideHelp0C 0x0007509C #define kwavGuideHelp0D 0x0007509D #define kwavGuideHelp0E 0x0007509E #define kwavGuideHelp0F 0x0007509F #define kwavGuideHelp59 0x000750A0 #define kwavGuideHelp5C 0x000750A1 #define kwavGuideHelp5D 0x000750A2 #define kwavGuideHelp10 0x000750A3 // Project alerts #define kwavPrjAlert00 0x000750B0 #define kwavPrjAlert01 0x000750B1 #define kwavPrjAlert02 0x000750B2 #define kwavPrjAlert03 0x000750B3 #define kwavPrjAlert04 0x000750B4 #define kwavPrjAlert05 0x000750B5 // How to alerts #define kwavHTAlert00 0x000750C0 #define kwavHTAlert01 0x000750C1 #define kwavHTAlert02 0x000750C2 // Projects Intro #define kwavPrjIntro00 0x000750C8 #define kwavPrjIntro01 0x000750C9 #define kwavPrjIntro02 0x000750CA #define kwavPrjIntro03 0x000750CB // How to Actors #define kwavHTActors00 0x000750D0 #define kwavHTActors01 0x000750D1 #define kwavHTActors02 0x000750D2 #define kwavHTActors03 0x000750D3 #define kwavHTActors04 0x000750D4 #define kwavHTActors05 0x000750D5 #define kwavHTActors06 0x000750D6 #define kwavHTActors07 0x000750D7 #define kwavHTActors08 0x000750D8 #define kwavHTActors09 0x000750D9 #define kwavHTActors0A 0x000750DA #define kwavHTActors0B 0x000750DB #define kwavHTActors0C 0x000750DC #define kwavHTActors0D 0x000750DD #define kwavHTActors0E 0x000750DE #define kwavHTActors0F 0x000750DF #define kwavHTActors10 0x000750E0 #define kwavHTActors11 0x000750E1 #define kwavHTActors12 0x000750E2 #define kwavHTActors13 0x000750E3 #define kwavHTActors14 0x000750E4 #define kwavHTActors15 0x000750E5 #define kwavHTActors16 0x000750E6 #define kwavHTActors17 0x000750E7 #define kwavHTActors18 0x000750E8 #define kwavHTActors19 0x000750E9 #define kwavHTActors1A 0x000750EA #define kwavHTActors1B 0x000750EB #define kwavHTActors1C 0x000750EC #define kwavHTActors1D 0x000750ED #define kwavHTActors1E 0x000750EE #define kwavHTActors1F 0x000750EF #define kwavHTActors20 0x000750F0 #define kwavHTActors21 0x000750F1 #define kwavHTActors22 0x000750F2 #define kwavHTActors23 0x000750F3 #define kwavHTActors24 0x000750F4 #define kwavHTActors25 0x000750F5 #define kwavHTActors26 0x000750F6 #define kwavHTActors27 0x000750F7 #define kwavHTActors28 0x000750F8 #define kwavHTActors29 0x000750F9 #define kwavHTActors2A 0x000750FA #define kwavHTActors2B 0x000750FB #define kwavHTActors2C 0x000750FC #define kwavHTActors2D 0x000750FD #define kwavHTActors2E 0x000750FE #define kwavHTActors2F 0x000750FF #define kwavHTActors30 0x00075100 #define kwavHTActors31 0x00075101 #define kwavHTActors32 0x00075102 #define kwavHTActors33 0x00075103 #define kwavHTActors34 0x00075104 #define kwavHTActors35 0x00075105 #define kwavHTActors36 0x00075106 #define kwavHTActors37 0x00075107 #define kwavHTActors38 0x00075108 #define kwavHTActors39 0x00075109 #define kwavHTActors3A 0x0007510A #define kwavHTActors3B 0x0007510B #define kwavHTActors3C 0x0007510C #define kwavHTActors3D 0x0007510D #define kwavHTActors3E 0x0007510E #define kwavHTActors3F 0x0007510F #define kwavHTActors40 0x00075110 #define kwavHTActors41 0x00075111 #define kwavHTActors42 0x00075112 #define kwavHTActors43 0x00075113 #define kwavHTActors44 0x00075114 #define kwavHTActors45 0x00075115 #define kwavHTActors46 0x00075116 #define kwavHTActors47 0x00075117 #define kwavHTActors48 0x00075118 #define kwavHTActors49 0x00075119 #define kwavHTActors4A 0x0007511A #define kwavHTActors4B 0x0007511B #define kwavHTActors4C 0x0007511C #define kwavHTActors4D 0x0007511D #define kwavHTActors4E 0x0007511E #define kwavHTActors4F 0x0007511F #define kwavHTActors50 0x00075120 #define kwavHTActors51 0x00075121 #define kwavHTActors52 0x00075122 #define kwavHTActors53 0x00075123 #define kwavHTActors54 0x00075124 #define kwavHTActors55 0x00075125 #define kwavHTActors56 0x00075126 #define kwavHTActors57 0x00075127 #define kwavHTActors58 0x00075128 #define kwavHTActors59 0x00075129 #define kwavHTActors5A 0x0007512A #define kwavHTActors5B 0x0007512B #define kwavHTActors5C 0x0007512C #define kwavHTActors5D 0x0007512D #define kwavHTActors5E 0x0007512E #define kwavHTActors5F 0x0007512F #define kwavHTActors60 0x00075130 #define kwavHTActors61 0x00075131 #define kwavHTActors62 0x00075132 #define kwavHTActors63 0x00075133 #define kwavHTActors64 0x00075134 #define kwavHTActors65 0x00075135 #define kwavHTActors66 0x00075136 #define kwavHTActors67 0x00075137 #define kwavHTActors68 0x00075138 #define kwavHTActors69 0x00075139 #define kwavHTActors6A 0x0007513A #define kwavHTActors6B 0x0007513B #define kwavHTActors6C 0x0007513C #define kwavHTActors6D 0x0007513D #define kwavHTActors6E 0x0007513E #define kwavHTActors6F 0x0007513F #define kwavHTActors70 0x00075140 #define kwavHTActors71 0x00075141 #define kwavHTActors72 0x00075142 #define kwavHTActors73 0x00075143 #define kwavHTActors74 0x00075144 #define kwavHTActors75 0x00075145 #define kwavHTActors76 0x00075146 #define kwavHTActors77 0x00075147 #define kwavHTActors78 0x00075148 #define kwavHTActors79 0x00075149 #define kwavHTActors7A 0x0007514A #define kwavHTActors7B 0x0007514B #define kwavHTActors7C 0x0007514C #define kwavHTActors7D 0x0007514D #define kwavHTActors7E 0x0007514E #define kwavHTActors7F 0x0007514F #define kwavHTActors80 0x00075150 #define kwavHTActors81 0x00075151 #define kwavHTActors82 0x00075152 #define kwavHTActors83 0x00075153 #define kwavHTActors84 0x00075154 #define kwavHTActors85 0x00075155 #define kwavHTActors86 0x00075156 #define kwavHTActors87 0x00075157 #define kwavHTActors88 0x00075158 #define kwavHTActors89 0x00075159 #define kwavHTActors8A 0x0007515A #define kwavHTActors8B 0x0007515B #define kwavHTActors8C 0x0007515C #define kwavHTActors8D 0x0007515D #define kwavHTActors8E 0x0007515E #define kwavHTActors8F 0x0007515F #define kwavHTActors90 0x00075160 #define kwavHTActors91 0x00075161 #define kwavHTActors92 0x00075162 #define kwavHTActors93 0x00075163 #define kwavHTActors94 0x00075164 // How to Words #define kwavHTWords00 0x00075170 #define kwavHTWords01 0x00075171 #define kwavHTWords02 0x00075172 #define kwavHTWords03 0x00075173 #define kwavHTWords04 0x00075174 #define kwavHTWords05 0x00075175 #define kwavHTWords06 0x00075176 #define kwavHTWords07 0x00075177 #define kwavHTWords08 0x00075178 #define kwavHTWords09 0x00075179 #define kwavHTWords0A 0x0007517A #define kwavHTWords0B 0x0007517B #define kwavHTWords0C 0x0007517C #define kwavHTWords0D 0x0007517D #define kwavHTWords0E 0x0007517E #define kwavHTWords0F 0x0007517F #define kwavHTWords10 0x00075180 #define kwavHTWords11 0x00075181 #define kwavHTWords12 0x00075182 #define kwavHTWords13 0x00075183 #define kwavHTWords14 0x00075184 #define kwavHTWords15 0x00075185 #define kwavHTWords16 0x00075186 #define kwavHTWords17 0x00075187 #define kwavHTWords18 0x00075188 #define kwavHTWords19 0x00075189 #define kwavHTWords1A 0x0007518A #define kwavHTWords1B 0x0007518B #define kwavHTWords1C 0x0007518C #define kwavHTWords1D 0x0007518D #define kwavHTWords1E 0x0007518E #define kwavHTWords1F 0x0007518F #define kwavHTWords20 0x00075190 #define kwavHTWords21 0x00075191 #define kwavHTWords22 0x00075192 #define kwavHTWords23 0x00075193 #define kwavHTWords24 0x00075194 #define kwavHTWords25 0x00075195 #define kwavHTWords26 0x00075196 #define kwavHTWords27 0x00075197 #define kwavHTWords28 0x00075198 #define kwavHTWords29 0x00075199 #define kwavHTWords2A 0x0007519A #define kwavHTWords2B 0x0007519B #define kwavHTWords2C 0x0007519C #define kwavHTWords2D 0x0007519D #define kwavHTWords2E 0x0007519E #define kwavHTWords2F 0x0007519F #define kwavHTWords30 0x000751A0 #define kwavHTWords31 0x000751A1 #define kwavHTWords32 0x000751A2 #define kwavHTWords33 0x000751A3 #define kwavHTWords34 0x000751A4 #define kwavHTWords35 0x000751A5 #define kwavHTWords36 0x000751A6 #define kwavHTWords37 0x000751A7 #define kwavHTWords38 0x000751A8 #define kwavHTWords39 0x000751A9 #define kwavHTWords3A 0x000751AA #define kwavHTWords3B 0x000751AB #define kwavHTWords3C 0x000751AC #define kwavHTWords3D 0x000751AD #define kwavHTWords3E 0x000751AE #define kwavHTWords3F 0x000751AF #define kwavHTWords40 0x000751B0 #define kwavHTWords41 0x000751B1 #define kwavHTWords42 0x000751B2 #define kwavHTWords43 0x000751B3 #define kwavHTWords44 0x000751B4 #define kwavHTWords45 0x000751B5 #define kwavHTWords46 0x000751B6 #define kwavHTWords47 0x000751B7 #define kwavHTWords48 0x000751B8 #define kwavHTWords49 0x000751B9 #define kwavHTWords4A 0x000751BA #define kwavHTWords50 0x000751BB #define kwavHTWords51 0x000751BC #define kwavHTWords52 0x000751BD #define kwavHTWords64 0x000751BE #define kwavHTWords66 0x000751BF #define kwavHTWords67 0x000751C0 // How to Souncs #define kwavHTSounds00 0x00075200 #define kwavHTSounds01 0x00075201 #define kwavHTSounds02 0x00075202 #define kwavHTSounds03 0x00075203 #define kwavHTSounds04 0x00075204 #define kwavHTSounds05 0x00075205 #define kwavHTSounds06 0x00075206 #define kwavHTSounds07 0x00075207 #define kwavHTSounds08 0x00075208 #define kwavHTSounds09 0x00075209 #define kwavHTSounds0A 0x0007520A #define kwavHTSounds0B 0x0007520B #define kwavHTSounds0C 0x0007520C #define kwavHTSounds0D 0x0007520D #define kwavHTSounds0E 0x0007520E #define kwavHTSounds0F 0x0007520F #define kwavHTSounds10 0x00075210 #define kwavHTSounds11 0x00075211 #define kwavHTSounds12 0x00075212 #define kwavHTSounds13 0x00075213 #define kwavHTSounds14 0x00075214 #define kwavHTSounds15 0x00075215 #define kwavHTSounds16 0x00075216 #define kwavHTSounds17 0x00075217 #define kwavHTSounds18 0x00075218 #define kwavHTSounds19 0x00075219 #define kwavHTSounds1A 0x0007521A #define kwavHTSounds1B 0x0007521B #define kwavHTSounds1C 0x0007521C #define kwavHTSounds1D 0x0007521D #define kwavHTSounds1E 0x0007521E #define kwavHTSounds1F 0x0007521F #define kwavHTSounds20 0x00075220 #define kwavHTSounds21 0x00075221 #define kwavHTSounds22 0x00075222 #define kwavHTSounds23 0x00075223 #define kwavHTSounds24 0x00075224 #define kwavHTSounds25 0x00075225 #define kwavHTSounds26 0x00075226 #define kwavHTSounds2E 0x00075227 #define kwavHTSounds44 0x00075228 #define kwavHTSounds51 0x00075229 #define kwavHTSounds52 0x0007522A #define kwavHTSounds60 0x0007522B #define kwavHTSounds61 0x0007522C #define kwavHTSounds62 0x0007522D #define kwavHTSounds63 0x0007522E #define kwavHTSounds69 0x0007522F #define kwavHTSounds73 0x00075230 #define kwavHTSounds74 0x00075231 #define kwavHTSounds76 0x00075232 #define kwavHTSounds77 0x00075233 #define kwavHTSounds27 0x00075234 #define kwavHTSounds28 0x00075235 #define kwavHTSounds29 0x00075236 #define kwavHTSounds2A 0x00075237 #define kwavHTSounds2C 0x00075238 #define kwavHTSounds2D 0x00075239 // Project 3 #define kwav3Project00 0x00075250 #define kwav3Project01 0x00075251 #define kwav3Project02 0x00075252 #define kwav3Project03 0x00075253 #define kwav3Project04 0x00075254 #define kwav3Project05 0x00075255 #define kwav3Project06 0x00075256 #define kwav3Project07 0x00075257 #define kwav3Project08 0x00075258 #define kwav3Project09 0x00075259 #define kwav3Project0A 0x0007525A #define kwav3Project0B 0x0007525B #define kwav3Project0C 0x0007525C #define kwav3Project0D 0x0007525D #define kwav3Project0E 0x0007525E #define kwav3Project0F 0x0007525F #define kwav3Project10 0x00075260 #define kwav3Project11 0x00075261 #define kwav3Project12 0x00075262 #define kwav3Project13 0x00075263 #define kwav3Project14 0x00075264 #define kwav3Project15 0x00075265 #define kwav3Project16 0x00075266 #define kwav3Project17 0x00075267 #define kwav3Project18 0x00075268 #define kwav3Project19 0x00075269 #define kwav3Project1A 0x0007526A #define kwav3Project1B 0x0007526B #define kwav3Project1C 0x0007526C #define kwav3Project1D 0x0007526D #define kwav3Project1E 0x0007526E #define kwav3Project1F 0x0007526F #define kwav3Project20 0x000752A0 #define kwav3Project21 0x000752A1 #define kwav3Project22 0x000752A2 #define kwav3Project23 0x000752A3 // Project 1 #define kwav1Project00 0x00075270 #define kwav1Project01 0x00075271 #define kwav1Project02 0x00075272 #define kwav1Project03 0x00075273 #define kwav1Project04 0x00075274 #define kwav1Project05 0x00075275 #define kwav1Project06 0x00075276 #define kwav1Project07 0x00075277 #define kwav1Project08 0x00075278 #define kwav1Project09 0x00075279 #define kwav1Project0A 0x0007527A #define kwav1Project0B 0x0007527B #define kwav1Project0C 0x0007527C #define kwav1Project0D 0x0007527D #define kwav1Project0E 0x0007527E #define kwav1Project0F 0x0007527F #define kwav1Project10 0x00075280 #define kwav1Project11 0x00075281 #define kwav1Project12 0x00075282 #define kwav1Project13 0x00075283 #define kwav1Project14 0x00075284 #define kwav1Project15 0x00075285 #define kwav1Project16 0x00075286 #define kwav1Project17 0x00075287 #define kwav1Project18 0x00075288 #define kwav1Project19 0x00075289 #define kwav1Project1A 0x0007528A #define kwav1Project1B 0x0007528B #define kwav1Project1C 0x0007528C #define kwav1Project1D 0x0007528D #define kwav1Project1E 0x0007528E #define kwav1Project1F 0x0007528F #define kwav1Project20 0x00075290 #define kwav1Project21 0x00075291 #define kwav1Project22 0x00075292 #define kwav1Project23 0x00075293 #define kwav1Project24 0x00075294 #define kwav1Project25 0x00075295 #define kwav1Project26 0x00075296 #define kwav1Project27 0x00075297 #define kwav1Project28 0x00075298 #define kwav1Project29 0x00075299 #define kwav1Project2A 0x0007529A #define kwav1Project2B 0x0007529B #define kwav1Project2C 0x0007529C #define kwav1Project2D 0x0007529D #define kwav1Project2E 0x0007529E #define kwav1Project2F 0x0007529F #define kwav1Project30 0x000752AA #define kwav1Project31 0x000752AB // Project 2 #define kwav2Project00 0x000752B0 #define kwav2Project01 0x000752B1 #define kwav2Project02 0x000752B2 #define kwav2Project03 0x000752B3 #define kwav2Project04 0x000752B4 #define kwav2Project05 0x000752B5 #define kwav2Project06 0x000752B6 #define kwav2Project07 0x000752B7 #define kwav2Project08 0x000752B8 #define kwav2Project09 0x000752B9 #define kwav2Project0A 0x000752BA #define kwav2Project0B 0x000752BB #define kwav2Project0C 0x000752BC #define kwav2Project0D 0x000752BD #define kwav2Project0E 0x000752BE #define kwav2Project0F 0x000752BF #define kwav2Project10 0x000752C0 #define kwav2Project11 0x000752C1 #define kwav2Project12 0x000752C2 #define kwav2Project13 0x000752C3 #define kwav2Project14 0x000752C4 #define kwav2Project15 0x000752C5 #define kwav2Project16 0x000752C6 #define kwav2Project17 0x000752C7 #define kwav2Project18 0x000752C8 #define kwav2Project19 0x000752C9 #define kwav2Project1A 0x000752CA #define kwav2Project1B 0x000752CB #define kwav2Project1C 0x000752CC #define kwav2Project1D 0x000752CD #define kwav2Project1E 0x000752CE #define kwav2Project1F 0x000752CF #define kwav2Project20 0x000752D0 #define kwav2Project21 0x000752D1 #define kwav2Project22 0x000752D2 #define kwav2Project23 0x000752D3 #define kwav2Project24 0x000752D4 #define kwav2Project25 0x000752D5 #define kwav2Project26 0x000752D6 #define kwav2Project27 0x000752D7 #define kwav2Project28 0x000752D8 #define kwav2Project29 0x000752D9 #define kwav2Project2A 0x000752DA #define kwav2Project2B 0x000752DB #define kwav2Project2C 0x000752DC #define kwav2Project2D 0x000752DD #define kwav2Project2E 0x000752DE #define kwav2Project2F 0x000752DF #define kwav2Project30 0x000752E0 // Project 4 #define kwav4Project00 0x000752F0 #define kwav4Project01 0x000752F1 #define kwav4Project02 0x000752F2 #define kwav4Project03 0x000752F3 #define kwav4Project04 0x000752F4 #define kwav4Project05 0x000752F5 #define kwav4Project06 0x000752F6 #define kwav4Project07 0x000752F7 #define kwav4Project08 0x000752F8 #define kwav4Project09 0x000752F9 #define kwav4Project0A 0x000752FA #define kwav4Project0B 0x000752FB #define kwav4Project0C 0x000752FC #define kwav4Project0D 0x000752FD #define kwav4Project0E 0x000752FE #define kwav4Project0F 0x000752FF #define kwav4Project10 0x00075300 #define kwav4Project11 0x00075301 #define kwav4Project12 0x00075302 #define kwav4Project13 0x00075303 #define kwav4Project14 0x00075304 #define kwav4Project15 0x00075305 #define kwav4Project16 0x00075306 #define kwav4Project17 0x00075307 #define kwav4Project18 0x00075308 #define kwav4Project19 0x00075309 #define kwav4Project1A 0x0007530A #define kwav4Project1B 0x0007530B #define kwav4Project1C 0x0007530C #define kwav4Project1D 0x0007530D #define kwav4Project1E 0x0007530E #define kwav4Project1F 0x0007530F #define kwav4Project20 0x00075310 #define kwav4Project21 0x00075311 #define kwav4Project22 0x00075312 #define kwav4Project23 0x00075313 #define kwav4Project24 0x00075314 #define kwav4Project25 0x00075315 #define kwav4Project26 0x00075316 #define kwav4Project27 0x00075317 #define kwav4Project28 0x00075318 #define kwav4Project29 0x00075319 #define kwav4Project2A 0x0007531A #define kwav4Project2B 0x0007531B #define kwav4Project2C 0x0007531C #define kwav4Project2D 0x0007531D #define kwav4Project2E 0x0007531E #define kwav4Project2F 0x0007531F #define kwav4Project30 0x00075320 #define kwav4Project31 0x00075321 #define kwav4Project32 0x00075322 #define kwav4Project33 0x00075323 #define kwav4Project34 0x00075324 #define kwav4Project35 0x00075325 #define kwav4Project36 0x00075326 #define kwav4Project37 0x00075327 #define kwav4Project38 0x00075328 #define kwav4Project39 0x00075329 #define kwav4Project3A 0x0007532A #define kwav4Project3B 0x0007532B #define kwav4Project3C 0x0007532C #define kwav4Project3D 0x0007532D #define kwav4Project3E 0x0007532E #define kwav4Project3F 0x0007532F // Project 5 #define kwav5Project00 0x00075330 #define kwav5Project01 0x00075331 #define kwav5Project02 0x00075332 #define kwav5Project03 0x00075333 #define kwav5Project04 0x00075334 #define kwav5Project05 0x00075335 #define kwav5Project06 0x00075336 #define kwav5Project07 0x00075337 #define kwav5Project08 0x00075338 #define kwav5Project09 0x00075339 #define kwav5Project0A 0x0007533A #define kwav5Project0B 0x0007533B #define kwav5Project0C 0x0007533C #define kwav5Project0D 0x0007533D #define kwav5Project0E 0x0007533E #define kwav5Project0F 0x0007533F #define kwav5Project10 0x00075340 #define kwav5Project11 0x00075341 #define kwav5Project12 0x00075342 #define kwav5Project13 0x00075343 #define kwav5Project14 0x00075344 #define kwav5Project15 0x00075345 #define kwav5Project16 0x00075346 #define kwav5Project17 0x00075347 #define kwav5Project18 0x00075348 #define kwav5Project19 0x00075349 #define kwav5Project1A 0x0007534A #define kwav5Project1B 0x0007534B #define kwav5Project1C 0x0007534C #define kwav5Project1D 0x0007534D #define kwav5Project1E 0x0007534E #define kwav5Project1F 0x0007534F #define kwav5Project20 0x00075350 #define kwav5Project21 0x00075351 #define kwav5Project22 0x00075352 #define kwav5Project23 0x00075353 #define kwav5Project24 0x00075354 #define kwav5Project25 0x00075355 #define kwav5Project26 0x00075356 #define kwav5Project27 0x00075357 #define kwav5Project28 0x00075358 #define kwav5Project29 0x00075359 #define kwav5Project2A 0x0007535A #define kwav5Project2B 0x0007535B #define kwav5Project2C 0x0007535C #define kwav5Project2D 0x0007535D #define kwav5Project2E 0x0007535E #define kwav5Project2F 0x0007535F #define kwav5Project30 0x00075360 #define kwav5Project31 0x00075361 #define kwav5Project32 0x00075362 #define kwav5Project33 0x00075363 #define kwav5Project34 0x00075364 #define kwav5Project35 0x00075365 #define kwav5Project36 0x00075366 #define kwav5Project37 0x00075367 #define kwav5Project38 0x00075368 #define kwav5Project39 0x00075369 #define kwav5Project3A 0x0007536A #define kwav5Project3B 0x0007536B #define kwav5Project3C 0x0007536C #define kwav5Project3D 0x0007536D #define kwav5Project3E 0x0007536E #define kwav5Project3F 0x0007536F #define kwav5Project40 0x00075370 #define kwav5Project41 0x00075381 #define kwav5Project42 0x00075382 #define kwav5Project43 0x00075383 #define kwav5Project44 0x00075384 #define kwav5Project45 0x00075385 #define kwav5Project46 0x00075386 #define kwav5Project47 0x00075387 #define kwav5Project48 0x00075388 #define kwav5Project49 0x00075389 #define kwav5Project4A 0x0007538A #define kwav5Project4B 0x0007538B #define kwav5Project4C 0x0007538C #define kwav5Project4D 0x0007538D #define kwav5Project4E 0x0007538E #define kwav5Project4F 0x0007538F #define kwav5Project50 0x00075390 #define kwav5Project51 0x00075391 // easel help #define kwavEaselHelp00 0x00075400 #define kwavEaselHelp01 0x00075401 #define kwavEaselHelp02 0x00075402 #define kwavEaselHelp03 0x00075403 #define kwavEaselHelp04 0x00075404 #define kwavEaselHelp05 0x00075405 #define kwavEaselHelp06 0x00075406 #define kwavEaselHelp07 0x00075407 #define kwavEaselHelp08 0x00075408 #define kwavEaselHelp09 0x00075409 #define kwavEaselHelp0A 0x0007540A #define kwavEaselHelp0B 0x0007540B #define kwavEaselHelp0C 0x0007540C #define kwavEaselHelp0D 0x0007540D #define kwavEaselHelp0E 0x0007540E #define kwavEaselHelp0F 0x0007540F #define kwavEaselHelp10 0x00075410 #define kwavEaselHelp11 0x00075411 #define kwavEaselHelp12 0x00075412 #define kwavEaselHelp13 0x00075413 #define kwavEaselHelp14 0x00075414 #define kwavEaselHelp15 0x00075415 #define kwavEaselHelp16 0x00075416 #define kwavEaselHelp17 0x00075417 #define kwavEaselHelp18 0x00075418 #define kwavEaselHelp19 0x00075419 #define kwavEaselHelp1A 0x0007541A #define kwavEaselHelp1B 0x0007541B #define kwavEaselHelp1C 0x0007541C #define kwavEaselHelp1D 0x0007541D #define kwavEaselHelp1E 0x0007541E #define kwavEaselHelp1F 0x0007541F #define kwavEaselHelp20 0x00075420 #define kwavEaselHelp21 0x00075421 #define kwavEaselHelp22 0x00075422 #define kwavEaselHelp23 0x00075423 #define kwavEaselHelp24 0x00075424 #define kwavEaselHelp25 0x00075425 #define kwavEaselHelp26 0x00075426 #define kwavEaselHelp27 0x00075427 #define kwavEaselHelp28 0x00075428 #define kwavEaselHelp29 0x00075429 #define kwavEaselHelp2A 0x0007542A #define kwavEaselHelp2B 0x0007542B #define kwavEaselHelp2C 0x0007542C #define kwavEaselHelp2D 0x0007542D #define kwavEaselHelp2E 0x0007542E #define kwavEaselHelp2F 0x0007542F #define kwavEaselHelp30 0x00075430 #define kwavEaselHelp31 0x00075431 #define kwavEaselHelp3E 0x00075432 // project 6 #define kwav6Project00 0x00075440 #define kwav6Project01 0x00075441 #define kwav6Project02 0x00075442 #define kwav6Project03 0x00075443 #define kwav6Project04 0x00075444 #define kwav6Project05 0x00075445 #define kwav6Project06 0x00075446 #define kwav6Project07 0x00075447 #define kwav6Project08 0x00075448 #define kwav6Project09 0x00075449 #define kwav6Project0A 0x0007544A #define kwav6Project0B 0x0007544B #define kwav6Project0C 0x0007544C #define kwav6Project0D 0x0007544D #define kwav6Project0E 0x0007544E #define kwav6Project0F 0x0007544F #define kwav6Project10 0x00075450 #define kwav6Project11 0x00075451 #define kwav6Project12 0x00075452 #define kwav6Project13 0x00075453 #define kwav6Project14 0x00075454 #define kwav6Project15 0x00075455 #define kwav6Project16 0x00075456 #define kwav6Project17 0x00075457 #define kwav6Project18 0x00075458 #define kwav6Project19 0x00075459 #define kwav6Project1A 0x0007545A #define kwav6Project1B 0x0007545B #define kwav6Project1C 0x0007545C #define kwav6Project1D 0x0007545D #define kwav6Project1E 0x0007545E #define kwav6Project1F 0x0007545F #define kwav6Project20 0x00075460 #define kwav6Project21 0x00075461 #define kwav6Project22 0x00075462 #define kwav6Project23 0x00075463 #define kwav6Project24 0x00075464 #define kwav6Project25 0x00075465 #define kwav6Project26 0x00075466 #define kwav6Project27 0x00075467 #define kwav6Project28 0x00075468 #define kwav6Project29 0x00075469 #define kwav6Project2A 0x0007546A #define kwav6Project2B 0x0007546B #define kwav6Project2C 0x0007546C #define kwav6Project2D 0x0007546D #define kwav6Project4F 0x0007546E // help book basics #define kwavBasics00 0x00075480 #define kwavBasics01 0x00075481 #define kwavBasics02 0x00075482 #define kwavBasics03 0x00075483 #define kwavBasics04 0x00075484 #define kwavBasics05 0x00075485 #define kwavBasics06 0x00075486 #define kwavBasics07 0x00075487 #define kwavBasics08 0x00075488 #define kwavBasics09 0x00075489 #define kwavBasics0A 0x0007548A #define kwavBasics0B 0x0007548B #define kwavBasics0C 0x0007548C #define kwavBasics0D 0x0007548D #define kwavBasics0E 0x0007548E #define kwavBasics0F 0x0007548F #define kwavBasics10 0x00075490 // toolhelp waves #define kwavToolHelp00 0x00075500 #define kwavToolHelp01 0x00075501 #define kwavToolHelp02 0x00075502 #define kwavToolHelp03 0x00075503 #define kwavToolHelp04 0x00075504 #define kwavToolHelp05 0x00075505 #define kwavToolHelp06 0x00075506 #define kwavToolHelp07 0x00075507 #define kwavToolHelp08 0x00075508 #define kwavToolHelp09 0x00075509 #define kwavToolHelp0A 0x0007550A #define kwavToolHelp0B 0x0007550B #define kwavToolHelp0C 0x0007550C #define kwavToolHelp0D 0x0007550D #define kwavToolHelp0E 0x0007550E #define kwavToolHelp0F 0x0007550F #define kwavToolHelp10 0x00075510 #define kwavToolHelp11 0x00075511 #define kwavToolHelp12 0x00075512 #define kwavToolHelp13 0x00075513 #define kwavToolHelp14 0x00075514 #define kwavToolHelp15 0x00075515 #define kwavToolHelp16 0x00075516 #define kwavToolHelp17 0x00075517 #define kwavToolHelp18 0x00075518 #define kwavToolHelp19 0x00075519 #define kwavToolHelp1A 0x0007551A #define kwavToolHelp1B 0x0007551B #define kwavToolHelp1C 0x0007551C #define kwavToolHelp1D 0x0007551D #define kwavToolHelp1E 0x0007551E #define kwavToolHelp1F 0x0007551F #define kwavToolHelp20 0x00075520 #define kwavToolHelp21 0x00075521 #define kwavToolHelp22 0x00075522 #define kwavToolHelp23 0x00075523 #define kwavToolHelp24 0x00075524 #define kwavToolHelp25 0x00075525 #define kwavToolHelp26 0x00075526 #define kwavToolHelp27 0x00075527 #define kwavToolHelp28 0x00075528 #define kwavToolHelp29 0x00075529 #define kwavToolHelp2A 0x0007552A #define kwavToolHelp2B 0x0007552B #define kwavToolHelp2C 0x0007552C #define kwavToolHelp2D 0x0007552D #define kwavToolHelp2E 0x0007552E #define kwavToolHelp2F 0x0007552F #define kwavToolHelp30 0x00075530 #define kwavToolHelp31 0x00075531 #define kwavToolHelp32 0x00075532 #define kwavToolHelp33 0x00075533 #define kwavToolHelp34 0x00075534 #define kwavToolHelp35 0x00075535 #define kwavToolHelp36 0x00075536 #define kwavToolHelp37 0x00075537 #define kwavToolHelp38 0x00075538 #define kwavToolHelp39 0x00075539 #define kwavToolHelp3A 0x0007553A #define kwavToolHelp3B 0x0007553B #define kwavToolHelp3C 0x0007553C #define kwavToolHelp3D 0x0007553D #define kwavToolHelp3E 0x0007553E #define kwavToolHelp3F 0x0007553F #define kwavToolHelp40 0x00075540 #define kwavToolHelp41 0x00075541 #define kwavToolHelp42 0x00075542 #define kwavToolHelp43 0x00075543 #define kwavToolHelp47 0x00075547 #define kwavToolHelp48 0x00075548 #define kwavToolHelp7B 0x00075549 // project tool tips #define kwavPrjTips00 0x00075550 #define kwavPrjTips01 0x00075551 #define kwavPrjTips02 0x00075552 #define kwavPrjTips03 0x00075553 #define kwavPrjTips04 0x00075554 #define kwavPrjTips05 0x00075555 #define kwavPrjTips06 0x00075556 #define kwavPrjTips07 0x00075557 // tooltips #define kwavToolTips00 0x00076000 #define kwavToolTips01 0x00076001 #define kwavToolTips02 0x00076002 #define kwavToolTips03 0x00076003 #define kwavToolTips04 0x00076004 #define kwavToolTips05 0x00076005 #define kwavToolTips06 0x00076006 #define kwavToolTips07 0x00076007 #define kwavToolTips08 0x00076008 #define kwavToolTips09 0x00076009 #define kwavToolTips0A 0x0007600A #define kwavToolTips0B 0x0007600B #define kwavToolTips0C 0x0007600C #define kwavToolTips0D 0x0007600D #define kwavToolTips0E 0x0007600E #define kwavToolTips0F 0x0007600F #define kwavToolTips10 0x00076010 #define kwavToolTips11 0x00076011 #define kwavToolTips12 0x00076012 #define kwavToolTips13 0x00076013 #define kwavToolTips14 0x00076014 #define kwavToolTips15 0x00076015 #define kwavToolTips16 0x00076016 #define kwavToolTips17 0x00076017 #define kwavToolTips18 0x00076018 #define kwavToolTips19 0x00076019 #define kwavToolTips1A 0x0007601A #define kwavToolTips1B 0x0007601B #define kwavToolTips1C 0x0007601C #define kwavToolTips1D 0x0007601D #define kwavToolTips1E 0x0007601E #define kwavToolTips1F 0x0007601F #define kwavToolTips20 0x00076020 #define kwavToolTips21 0x00076021 #define kwavToolTips22 0x00076022 #define kwavToolTips23 0x00076023 #define kwavToolTips24 0x00076024 #define kwavToolTips25 0x00076025 #define kwavToolTips26 0x00076026 #define kwavToolTips27 0x00076027 #define kwavToolTips28 0x00076028 #define kwavToolTips29 0x00076029 #define kwavToolTips2A 0x0007602A #define kwavToolTips2B 0x0007602B #define kwavToolTips2C 0x0007602C #define kwavToolTips2D 0x0007602D #define kwavToolTips2E 0x0007602E #define kwavToolTips2F 0x0007602F #define kwavToolTips30 0x00076030 #define kwavToolTips31 0x00076031 #define kwavToolTips32 0x00076032 #define kwavToolTips33 0x00076033 #define kwavToolTips34 0x00076034 #define kwavToolTips35 0x00076035 #define kwavToolTips36 0x00076036 #define kwavToolTips37 0x00076037 #define kwavToolTips38 0x00076038 #define kwavToolTips39 0x00076039 #define kwavToolTips3A 0x0007603A #define kwavToolTips3B 0x0007603B #define kwavToolTips3C 0x0007603C #define kwavToolTips3D 0x0007603D #define kwavToolTips3E 0x0007603E #define kwavToolTips3F 0x0007603F #define kwavToolTips40 0x00076040 #define kwavToolTips41 0x00076041 #define kwavToolTips42 0x00076042 #define kwavToolTips43 0x00076043 #define kwavToolTips44 0x00076044 #define kwavToolTips45 0x00076045 #define kwavToolTips46 0x00076046 #define kwavToolTips47 0x00076047 #define kwavToolTips48 0x00076048 #define kwavToolTips49 0x00076049 #define kwavToolTips52 0x0007604A #define kwavToolTips53 0x0007604B #define kwavToolTips54 0x0007604C #define kwavToolTips55 0x0007604D #define kwavToolTips56 0x0007604E #define kwavToolTips57 0x0007604F #define kwavToolTips58 0x00076050 #define kwavToolTips59 0x00076051 #define kwavToolTips5A 0x00076052 #define kwavToolTips5B 0x00076053 #define kwavToolTips5C 0x00076054 #define kwavToolTips5D 0x00076055 #define kwavToolTips5E 0x00076056 // for help book tooltips #define kwavHelpBook1 0x00076057 #define kwavHelpBook2 0x00076058 #define kwavHelpBook3 0x00076059 #define kwavHelpBook4 0x0007605A #define kwavHelpBook5 0x0007605B // help book defines // help book labels - these are help topics #define labBookTOC 0x00012180 #define labBookBasics 0x00012181 #define labBookHowTo 0x00012182 #define labBookTools 0x00012183 #define labBookTips 0x00012184 #define labBookHowTo1 0x00012185 #define labBookHowTo2 0x00012186 #define labBookHowTo3 0x00012187 #define labBookHowTo4 0x00012188 #define labBookHowTo5 0x00012189 #define labBookHowTo6 0x0001218a // titles for the sections of the help book - these are help topics #define tpcTitle1 0x000121a0 #define tpcTitle2 0x000121a1 #define tpcTitle3 0x000121a2 #define tpcTitle4 0x000121a3 #define tpcTitle5 0x000121a4 #define tpcTitle6 0x000121a5 #define tpcTitle7 0x000121a6 #define tpcTitle8 0x000121a7 #define tpcTitle9 0x000121a8 #define tpcTitle10 0x000121a9 #define tpcPageNumber 0x000121aa #define tpcTitle9a 0x000121ab #define tpcTitle9b 0x000121ac #define tpcTitle9c 0x000121ad #define tpcTitle9d 0x000121ae // rollover tooltips for the help book + controls - help topics #define ttBookCancel 0x0001703b #define ttBookPageFwd 0x0001703c #define ttBookPageBack 0x0001703d #define ttBookVolume 0x0001703e #define ttBookVoice 0x0001703f // rollover tooltips for the gadget #define ttVolumeControl 0x00017033 #define ttNextMovie 0x00017034 #define ttPreviousMovie 0x00017035 #define ttPlayButton 0x00017036 #define ttHowButton 0x00017037 #define ttCloseButton 0x00017038 #define ttMelanieOnOff 0x00017039 #define ttWhyButton 0x0001703a // Definitions for the help book pages, MUST BE SEQUENTIAL!!! #define ktpcBook1TOC 0x20000105 #define ktpcBook2Basics 0x20000106 #define ktpcBook2Basics2 0x20000107 #define ktpcBook3HowTo1 0x20000108 #define ktpcBook3HowTo2 0x20000109 #define ktpcBook4HowTo1 0x2000010a #define ktpcBook4HowTo2 0x2000010b #define ktpcBook4HowTo3 0x2000010c #define ktpcBook4HowTo4 0x2000010d #define ktpcBook5HowTo1 0x2000010e #define ktpcBook6HowTo1 0x2000010f #define ktpcBook6HowTo2 0x20000110 #define ktpcBook6HowTo3 0x20000111 #define ktpcBook7HowTo1 0x20000112 #define ktpcBook7HowTo2 0x20000113 #define ktpcBook7HowTo3 0x20000114 #define ktpcBook8HowTo1 0x20000115 #define ktpcBook8HowTo2 0x20000116 #define ktpcBook8HowTo3 0x20000117 #define ktpcBook8HowTo4 0x20000118 #define ktpcBookSceneTools1 0x20000119 #define ktpcBookActorTools1 0x2000011a #define ktpcBookActorTools2 0x2000011b #define ktpcBookActorTools3 0x2000011c #define ktpcBookActorTools4 0x2000011d #define ktpcBookActorTools5 0x2000011e #define ktpcBookSoundTools1 0x2000011f #define ktpcBookSoundTools2 0x20000120 #define ktpcBookWordTools1 0x20000121 #define ktpcBookWordTools2 0x20000122 #define ktpcBookWordTools3 0x20000123 #define ktpcBookMasterTools1 0x20000124 #define ktpcBookMasterTools2 0x20000125 #define ktpcBookMasterTools3 0x20000126 #define ktpcBookMasterTools4 0x20000127 #define ktpcBookMasterTools5 0x20000128 #define ktpcBookMasterTools6 0x20000129 #define ktpcBook10Tips 0x2000012a #define ktpcBook10Tips2 0x2000012b #define ktpcBook10Tips3 0x2000012c #define ktpcBook10Tips4 0x2000012d #define ktpcBook10Tips5 0x2000012e #define ktpcBook10Tips6 0x2000012f #define ktpcBook10Tips9 0x20000130 #define ktpcBook10Tips10 0x20000131 #define ktpcBook10Tips11 0x20000132 #define ktpcBook10Tips13 0x20000133 #define ktpcBook10Tips14 0x20000134 #define ktpcBook10Tips15 0x20000135 #define ktpcBook10Tips16 0x20000136 #define ktpcBook10Tips17 0x20000137 #define ktpcBook10Tips18 0x20000138 // define first and last topics in book #define ktpcBookStart ktpcBook1TOC #define ktpcBookEnd ktpcBook10Tips18 // help topic ids #define thCameraAngles 0x00017040 #define thSceneChoices 0x00017041 #define thSceneOrganizer 0x00017042 #define thSceneSlider 0x00017043 #define thNew 0x00017044 #define thActors 0x00017045 #define thOpen 0x00017046 #define thProps 0x00017047 #define thLivingWords 0x00017048 #define thCostumeChanger 0x00017049 #define thSizeTools 0x0001704a #define thSizeEvenly 0x0001704b #define thSquashStretch 0x0001704c #define thChangeBackSize 0x0001704d #define thRotateTools 0x0001704e #define thTurnLeftRight 0x0001704f #define thTipForwardsBackwards 0x00017050 #define thTipSideToSide 0x00017051 #define thChangeBackRotate 0x00017052 #define thSynchronize 0x00017053 #define thReposition 0x00017054 #define thSelect 0x00017055 #define thActions 0x00017056 #define thRecordSameAction 0x00017057 #define thReplacePartofPath 0x00017058 #define thFallThroughGround 0x00017059 #define thUpandDown 0x0001705a #define thTalentBook 0x0001705b #define thActorList 0x0001705c #define thPropList 0x0001705d #define thSave 0x0001705e #define thSoundEffects 0x0001705f #define thSpeech 0x00017060 #define thMusic 0x00017061 #define thPlayOneTime 0x00017062 #define thPlayAgainAgain 0x00017063 #define thActionMatcher 0x00017064 #define thListener 0x00017065 #define thSaveAs 0x00017066 #define thWordBox 0x00017067 #define thInsertion_Point 0x00017068 #define thLetters 0x00017069 #define thStyles 0x0001706a #define thLetterSize 0x0001706b #define thLetterColor 0x0001706c #define thBackground_Color 0x0001706d #define thScrolling_NonScrolling 0x0001706e #define thScrolling 0x0001706f #define thStory 0x00017070 #define thFrameSlider 0x00017071 #define thWaitUntilMouseClick 0x00017072 #define thWaitUntilSound 0x00017073 #define thDontWait 0x00017074 #define thPlayStop 0x00017075 #define thVolumeControl 0x00017076 #define thUndoRedo 0x00017077 #define thCutCopyPaste 0x00017078 #define thGetRidofEverythingBefore 0x00017079 #define thGetRidofEverythingAfter 0x0001707a #define thGetRidEntireScene 0x0001707b #define thGetRid3DObject 0x0001707c #define thGetRidWordBox 0x0001707d #define thCopyPath 0x0001707e #define thPaste 0x0001707f #define thCopy 0x00017080 #define thCut 0x00017081 #define thPortfolio 0x00017082 #define thExit 0x00017083 #define Tip___Undo 0x00017084 #define Def___frame 0x00017085 #define Tip___Change_Camera_Angle 0x00017086 #define thHelp 0x00017087 #define thMap 0x00017088 #define Tip___Moving_Scene_to_Scene 0x00017089 #define Key___New 0x0001708a #define Tip___Reposition 0x0001708b #define Tip___Animating 0x0001708c #define Key___Open 0x0001708d #define Def___Size_Tools 0x0001708e #define Def___Rotate_Tools 0x0001708f #define Def___drag 0x00017090 #define Def___Drag 0x00017091 #define Def___Go_to_the_place 0x00017092 #define Def___rewind 0x00017093 #define Def___Play_button 0x00017094 #define Tip___Reposition_One_Frame 0x00017095 #define Tip___Select_Object_Behind 0x00017096 #define Tip___Select_Object_Out_of_View 0x00017097 #define Tip___Change_Starting_Position 0x00017098 #define Tip___Freezing_an_Action 0x00017099 #define Def___Turn_on 0x0001709a #define Key___Replace_Part_Path 0x0001709b #define Tip___Move_Near_Far_Up 0x0001709c #define Tip___Move_Near_Far_Down 0x0001709d #define Key___Up_Down 0x0001709e #define Key___Save 0x0001709f #define Tip___Play_continuously 0x000170a0 #define Tip___Attach_Action 0x000170a1 #define Tip___Remove_Sound 0x000170a2 #define Tip___Pause_Sound 0x000170a3 #define Tip___Pause_Click 0x000170a4 #define Tip___Typing_hints 0x000170a5 #define Tip___Remove_word_box 0x000170a6 #define Def___scroll 0x000170a7 #define Tip___Remove_pause 0x000170a8 #define Tip___Individual_Sounds 0x000170a9 #define Key___Undo 0x000170aa #define Def___Cut_Copy_Paste 0x000170ab #define Def___Move_to_scene 0x000170ac #define Tip___Moving_around 0x000170ad #define Key___Paste 0x000170ae #define Tip___Copy_until_end_of_scene 0x000170af #define Tip___Cut_until_end_of_scene 0x000170b0 #define Key___Exit 0x000170b1 #define Key___Help 0x000170b2 #define Tip___Stop_sound 0x000170b3 #define Def___Choose_sound 0x000170b4 #define Def___portfolio 0x000170b5 #define Tip___How_many_sounds 0x000170b6 #define Tip___Chaining_sounds 0x000170b7 #define Def___Import 0x000170b8 #define Def___transitions 0x000170b9 #define Tip___Reposition_Entire_Path 0x000170ba #define thNonScrolling 0x000170bb #define Tip___Move_Up_or_Down_3 0x000170bc #define Tip___Path_through_ground 0x000170bd #define thRemoveSound 0x000170be #define Tip___Change_direction 0x00017bf #define Tip___Add_frames 0x00017c0 #define Key___Map 0x00017c1 #define Tip___Making_words_scroll 0x00017c2 // nonfound stuff #define thMouseClick 0x000170c4 #define GetRidWordBox 0x000170c5 #define HT_ChooseFirstScene1 0x000170c6 #define HT_AssignAction1 0x000170c7 #define HT_ChooseActor1 0x000170c8 #endif // !HELPTOPS_H ================================================ FILE: inc/kidgs.chh ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // Module: KIDGS.CHH // // Purpose: Cool defines for making chomp text into something readable // // Comments: // // #define the following to turn this stuff ON or OFF // // PACKALL --> pack all files // NONAMES --> don't put names in for chunks defined using these macros // SKIP --> kidspace animations eg. OBJECT()'s --- will slip if this is defined // // #ifndef KIDSGS_CHH #define KIDSGS_CHH #include "assert.chh" #include "kidgsdef.h" // ------ -------- ------ -------- ------ -------- ------ -------- #ifdef PACKALL #define __PACK PACK #else #define __PACK #endif // ------ -------- ------ -------- ------ -------- ------ -------- #ifdef NAMES #define __NAME(x) x #else #define __NAME(...) #endif // ------ -------- ------ -------- ------ -------- ------ -------- #ifdef DEBUG #define Debug(x) x #else #define Debug(x) #endif // ------ -------- ------ -------- ------ -------- ------ -------- #ifndef fTrue #define fTrue 1 #endif // ------ -------- ------ -------- ------ -------- ------ -------- #ifndef fFalse #define fFalse 0 #endif // --------------------------------------------------------- // the following chids get affected by the state the gob is in // the default state for a gob is 1 which means chids // not referenced in the CUME are determined as follows: // hiword = state loword = chid // // e.g. for a mouse rollon in state 2 KAUAI looks at chid // 0x000200011 (0x0002=state 0x0011 = rollon) // --------------------------------------------------------- // The following are relative chids ie. the state is the highword // combine these with the state defn's to make the real chid // --------------------------------------------------------- #define kchidCreate 0x0000 #define kchidClick 0x0001 // Mouse tracking button states/ representations #define krepDefault kchidUpOff #define krepMouseUpOff kchidUpOff #define krepMouseUpOn kchidUpOn #define krepMouseDnOff kchidDownOff #define krepMouseDnOn kchidDownOn #define krepEnterAnimation kchidTransBase #define krepRollOn kchidUpOffOn #define krepRollOff kchidUpOnOff #define krepMouseDn kchidUpDownOn #define krepClicked kchidDownUpOn #define krepDragOff kchidDownOnOff #define krepDragOn kchidDownOffOn #define krepDrop kchidDownUpOff // --------------------------------------------------------- // the following are bit masks for the CUME entry // --------------------------------------------------------- #define fgrfstNil 0x00000001 #define fgrfst1 0x00000002 #define fgrfst2 0x00000004 #define fgrfst3 0x00000008 #define fgrfst4 0x00000010 #define fgrfst5 0x00000020 #define fgrfst6 0x00000040 #define fgrfst7 0x00000080 #define fgrfst8 0x00000100 #define fgrfst9 0x00000200 #define fgrfst10 0x00000400 #define fgrfst11 0x00000800 #define fgrfst12 0x00001000 #define fgrfst13 0x00002000 #define fgrfst14 0x00004000 #define fgrfst15 0x00008000 #define fgrfst16 0x00010000 #define fgrfst17 0x00020000 #define fgrfst18 0x00040000 #define fgrfst19 0x00080000 #define fgrfst20 0x00100000 #define fgrfst21 0x00200000 #define fgrfst22 0x00400000 #define fgrfst23 0x00800000 #define fgrfst24 0x01000000 #define fgrfst25 0x02000000 #define fgrfst26 0x04000000 #define fgrfst27 0x08000000 #define fgrfst28 0x10000000 #define fgrfst29 0x20000000 #define fgrfst30 0x40000000 #define fgrfst31 0x80000000 #define fgrfstAll 0xffffffff #define fgrfstNone 0x00000000 // "types" of Gobs #define kgokkNormal gokkNil #define kgokkRectHit gokkRectangle #if (gokkRectangle | gokkNoHitThis) == 3 #define kgokkRectNoHit 3 #else #error Can't define kgokkRectNoHit #endif #if (gokkRectangle | gokkNoHitKids) == 5 #define kgokkRectNoKids 5 #else #error Can't define kgokkRectNoKids #endif // the following is the type used for GOKD's created with OBJECT() macros // --------------------------------------------------------- // Macro required to initialize variables and stuff. // --- these parms _df* are used to provide unique cno's // for various classes of chunks eg. _dfmbmp for MBMP // --------------------------------------------------------- #define STARTCHUNKY \ SET _dfmbmp = 10 \ SET _dfscr = 10 \ SET _dfanm = 10 \ SET _dffill = 10 \ SET _curgok = 10 \ SET _dfmask = 10 \ SET _dftile = 10 \ SET _dfwave = 10 \ SET _dfmidi = 10 \ SET _dfvid = 10 #define STARTCHUNKS(x) \ SET _dfmbmp = x \ SET _dfscr = x \ SET _dfanm = x \ SET _dffill = x \ SET _curgok = x \ SET _dfmask = x \ SET _dftile = x \ SET _dfwave = x \ SET _dfmidi = x \ SET _dfvid = x // safe macros to access name of "last" XXXX created #define LAST_MBMP _dfmbmp #define LAST_SCRIPT _dfscr #define LAST_ANIM _dfanm #define LAST_FILL _dffill #define LAST_GOKD _curgok #define LAST_MASK _dfmask #define LAST_TILE _dftile #define LAST_WAVE _dfwave #define LAST_MIDI _dfmidi #define LAST_VIDEO _dfvid // --------------------------------------------------------- // The following are for defining standalone chunks ie. // not dependent or adopted to the previous GOKD // --------------------------------------------------------- #define SCRIPTCHUNK( _szName, _cno ) \ CHUNK( kctgScript, _cno, __NAME(_szName ) ) \ SCRIPT #define MBMPCHUNK( _szFilename, _cno, _iTrans, _xpReg, _ypReg ) \ CHUNK( kctgMbmp, _cno, __NAME(_szFilename ) ) \ __PACK \ BITMAP( _iTrans, _xpReg, _ypReg ) _szFilename \ ENDCHUNK #define PALETTECHUNK( _szName, _cno, _szFilename ) \ CHUNK( kctgColorTable, _cno, __NAME( _szName ) ) \ __PACK \ PALETTE _szFilename \ ENDCHUNK #define TILECHUNK( _szName, _cno ) \ CHUNK( kctgTile, _cno, __NAME( _szName )) \ __PACK \ SHORT BO OSK #define TILEDEF( _dzpLeftBorder, _dzpRightBorder, _dzpLeft, _dzpLeftFlex, _dzpLeftInc, \ _dzpMid, _dzpRightFlex, _dzpRightInc, _dzpRight ) \ SHORT _dzpLeftBorder _dzpRightBorder _dzpLeft _dzpLeftFlex _dzpLeftInc \ _dzpMid _dzpRightFlex _dzpRightInc _dzpRight #define CURSORCHUNK( _szFilename, _cno) \ CHUNK( kctgCursor, _cno, __NAME( _szFilename )) \ __PACK \ CURSOR _szFilename \ ENDCHUNK #define FILLCHUNK( _szName, _chid, _xpLeft, _ypTop, _xpRight, _ypBottom, _kacrFore, _kacrBack ) \ SET _dffill++ \ CHUNK( kctgFill, _dffill, __NAME( _szName )) \ __PACK \ LONG BO OSK _xpLeft _ypTop _xpRight _ypBottom \ LONG _kacrFore _kacrBack #define PATTERN( _b1, _b2, _b3, _b4, _b5, _b6, _b7, _b8 ) \ BYTE MacWin(_b1 _b2 _b3 _b4 _b5 _b6 _b7 _b8, \ _b4 _b3 _b2 _b1 _b8 _b7 _b6 _b5) // --------------------------------------------------------- // some useful patterns // --------------------------------------------------------- #define PATTERN_SOLID PATTERN(0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff) #define PATTERN_BLANK PATTERN(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00) #define PATTERN_100 PATTERN(0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff) #define PATTERN_75 PATTERN(0xbb, 0xee, 0xbb, 0xee, 0xbb, 0xee, 0xbb, 0xee) #define PATTERN_50 PATTERN(0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55) #define PATTERN_50X PATTERN(0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa ) #define PATTERN_25 PATTERN(0xcc, 0xcc, 0x33, 0x33, 0xcc, 0xcc, 0x33, 0x33) #define PATTERN_0 PATTERN(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00) #define HELP_SCRIPT( _cno ) \ CHUNK( kctgScript, _cno, __NAME( #_cno ))\ SCRIPT // --------------------------------------------------------- // usage: GOBCHUNK(..) // { POSITION }... // DEFAULT_POSITION // { ACTION }... // ENDCHUNK // --------------------------------------------------------- #define GOBCHUNK( _szName, _cno, _kgokk ) \ SET _curgok = _cno \ CHUNK( kctgGokd, _cno, __NAME( _szName )) \ __PACK \ SHORT BO OSK LONG _kgokk // --------------------------------------------------------- // the following define positioning info for a GOB // Note: DEFAULT_POSITION is required. // --------------------------------------------------------- #define POSITION( _kidPar, _xp, _yp, _zp ) \ LONG _kidPar _xp _yp _zp #define DEFAULT_POSITION( _xp, _yp, _zp ) \ LONG kidNil _xp _yp _zp // --------------------------------------------------------- // the following is used in a GOKD to map the modifier keys // global state button state to cursor tooltip id script // chid and/or command id (CID) to post. Whew! // --------------------------------------------------------- #define ACTION( _grfcustMask, _grfcust, _grfState, _cnoCrs, _chidScript, _cid, _cnoTopic ) \ LONG _grfcustMask _grfcust _grfState _cnoCrs _chidScript _cid _cnoTopic #define ACTION_NOTHING( _cnoCrs ) \ ACTION( fcustNil, fcustNil, fgrfstAll, _cnoCrs, chidNil, cidNil, cnoNil ) #define ACTION_CLICKSCRIPT( _cnoCrs ) \ ACTION( fcustNil, fcustNil, fgrfstAll, _cnoCrs, kchidClick, cidNil, cnoNil ) // --------------------------------------------------------- // constants for color fills and any other color references // --------------------------------------------------------- #define Transparent 0xffffffff #define Palette( _i ) BYTE MacWin( 0xfe 0 0 _i, _i 0 0 0xfe ) LONG #define Invert BYTE MacWin( 0x00 0x00 0x00 0xff, 0xff 0x00 0x00 0x00 ) LONG #define Rgb( _r, _g, _b) BYTE MacWin(0x01 _r _g _b, _b _g _r 0x01) LONG // --------------------------------------------------------- // The following is used to combine "button" state with // subid to get the proper "childid" or chid. // --------------------------------------------------------- #define CHID( st, ch ) \ SET _st = st \ SET _st <<= 16 \ SET _st += ch \ _st #define CHID0( st ) \ st #define CHID1( st )\ SET _st = 0x10000\ SET _st |= st \ _st // --------------------------------------------------------- // Macros for child representations (MBMPS FILLS etc) // everything preceded by "CHILD_" adopts itself to the // last declared GOKD. // --------------------------------------------------------- #define CHILD_SCRIPT( _szName, _kchid )\ SET _dfscr++ \ CHUNK( kctgScript, _dfscr, __NAME( _szName ) ) \ PARENT( kctgGokd, _curgok, _kchid )\ SCRIPT // --------------------------------------------------------- // transparent rectangle.. actually a FILL // --------------------------------------------------------- #define REP_RECT( _chid, _szName, _xpLeft, _ypTop, _xpRight, _ypBottom ) \ SET _dffill++ \ CHUNK( kctgFill, _dffill, __NAME( _szName) ) \ __PACK \ PARENT( kctgGokd, _curgok, _chid ) \ LONG BO OSK _xpLeft _ypTop _xpRight _ypBottom \ LONG Transparent Transparent \ PATTERN_BLANK \ ENDCHUNK // --------------------------------------------------------- // color and pattern fill // use: REP_FILL(...) PATTERN(....) ENDCHUNK // --------------------------------------------------------- #define REP_FILL( _chid, _szName, _xpLeft, _ypTop, _xpRight, _ypBottom, _fore, _back ) \ SET _dffill++ \ CHUNK( kctgFill, _dffill, __NAME( _szName ) ) \ __PACK \ PARENT( kctgGokd _curgok _chid ) \ LONG BO OSK _xpLeft _ypTop _xpRight _ypBottom \ LONG _fore _back // --------------------------------------------------------- // Bitmap representations // --------------------------------------------------------- #define REP_MBMPREG( _chid, _szFilename, _xpReg, _ypReg ) \ SET _dfmbmp++ \ CHUNK( kctgMbmp, _dfmbmp, __NAME( _szFilename ) ) \ __PACK \ PARENT( kctgGokd, _curgok, _chid ) \ BITMAP( kiTrans, _xpReg, _ypReg ) _szFilename\ ENDCHUNK #define REP_MBMP( _chid, _szFilename ) \ SET _dfmbmp++ \ CHUNK( kctgMbmp, _dfmbmp, __NAME( _szFilename ) ) \ __PACK \ PARENT( kctgGokd, _curgok, _chid ) \ BITMAP( kiTrans, 0, 0 ) _szFilename\ ENDCHUNK #define REP_PPMBMP( _chid, _szFilename ) \ SET _dfmbmp++ \ CHUNK( kctgMbmp, _dfmbmp, __NAME( _szFilename ) ) \ PARENT( kctgGokd, _curgok, _chid ) \ PACKEDFILE _szFilename \ ENDCHUNK // --------------------------------------------------------- // Mask representations (just like bitmaps except they don't // show and are used only for hit tests) // --------------------------------------------------------- #define REP_MASK( _chid, _szFilename, _xpReg, _ypReg ) \ SET _dfmask++ \ CHUNK( kctgMask, _dfmask, __NAME( _szFilename ) ) \ __PACK \ PARENT( kctgGokd, _curgok, _chid ) \ MASK( kiTrans, _xpReg, _ypReg ) _szFilename\ ENDCHUNK #define REP_WAVE( _chid, _szFilename ) \ SET _dfwave++ \ CHUNK( kctgWave, _dfwave, __NAME( _szFilename ) ) \ __PACK \ PARENT( kctgGokd, _curgok, _chid ) \ FILE _szFilename \ ENDCHUNK #define REP_MIDI( _chid, _szFilename ) \ SET _dfmidi++ \ CHUNK( kctgMidi, _dfmidi, __NAME( _szFilename ) ) \ __PACK \ PARENT( kctgGokd, _curgok, _chid ) \ MIDI _szFilename \ ENDCHUNK // --------------------------------------------------------- // Animation representations // --------------------------------------------------------- #define REP_ANIM( _chid, _szName ) \ SET _dfanm++ \ CHUNK( kctgAnimation, _dfanm, __NAME( _szName ) ) \ PARENT( kctgGokd, _curgok, _chid ) \ SCRIPT #define ANIMATION( _cno, _szName ) \ CHUNK( kctgAnimation, _cno, __NAME( _szName ) ) \ SCRIPT // --------------------------------------------------------- // Bitmap TILE representations // Use: CHILD_TILE( ...) // TILEDEF( horz opts) // TILEDEF(vert opts) ENDCHUNK // ENDCHUNK // --------------------------------------------------------- #define REP_TILE( _chid, _szName, _mbmp, _xpReg, _ypReg ) \ SET _dftile++ \ SET _dfmbmp++ \ CHUNK( kctgMbmp, _dfmbmp, __NAME( _mbmp ) ) \ __PACK \ BITMAP( kiTrans, _xpReg, _ypReg ) _mbmp \ ENDCHUNK \ CHUNK( kctgTile, _dftile, __NAME( _szName ) ) \ __PACK \ PARENT( kctgGokd, _curgok, _chid ) \ CHILD( kctgMbmp, _dfmbmp, 0 ) \ SHORT BO OSK #define REP_VIDEO( _chid, _szFilename, _fWindowed ) \ SET _dfvid++ \ CHUNK( kctgVideo, _dfvid, __NAME( _szFilename ) ) \ __PACK \ PARENT( kctgGokd, _curgok, _chid ) \ BYTE _fWindowed \ STN _szFilename \ ENDCHUNK // --------------------------------------------------------- // The following Adopt the last chunk of type 'foo' to their // most recent GOKD using the appropriate CHID. // --------------------------------------------------------- #define ADOPT_MASK( _cno, _chid ) \ ADOPT( kctgGokd, _curgok, kctgMask, _cno, _chid ) #define ADOPT_MBMP( _cno, _chid ) \ ADOPT( kctgGokd, _curgok, kctgMbmp, _cno, _chid ) #define ADOPT_TILE( _cno, _chid ) \ ADOPT( kctgGokd, _curgok, kctgTile, _cno, _chid ) #define ADOPT_FILL( _cno, _chid ) \ ADOPT( kctgGokd, _curgok, kctgFill, _cno, _chid ) #define ADOPT_ANIM( _cno, _chid ) \ ADOPT( kctgGokd, _curgok, kctgAnimation, _cno, _chid ) #define ADOPT_SCRIPT( _cno, _chid ) \ ADOPT( kctgGokd, _curgok, kctgScript, _cno, _chid ) #define ADOPT_WAVE( _cno, _chid ) \ ADOPT( kctgGokd, _curgok, kctgWave, _cno, _chid ) #define ADOPT_MIDI( _cno, _chid ) \ ADOPT( kctgGokd, _curgok, kctgMidi, _cno, _chid ) // --------------------------------------------------------- // syntatic sweetness // --------------------------------------------------------- #define CREATE_SCRIPT( _szName ) \ REP_ANIM( CHID1( krepEnterAnimation ), __NAME( _szName )) #define CREATE_SCRIPTST( _szName, _kstState ) \ REP_ANIM( CHID( _kstState, krepEnterAnimation ), _szName ) #define CREATE_ANIM( _szName ) \ REP_ANIM( CHID1( krepEnterAnimation ), _szName) #define CREATE_ANIMST( _szName, _kstState ) \ REP_ANIM( CHID( _kstState, krepEnterAnimation ), _szName ) #define CLICK_SCRIPT( _szName ) \ CHILD_SCRIPT( _szName, CHID1( kchidClick ) ) #define CLICK_SCRIPTST( _szName, _kstState ) \ CHILD_SCRIPT( _szName, CHID( _kstState, kchidClick )) #define IRISVAL( _xp, _yp, _kdir ) \ SET _foo = _xp \ SET _foo <<= 15 \ SET _foo |= _yp \ SET _foo <<= 2 \ SET _foo |= _kdir \ _foo // --------------------------------------------------------- // default object - no tooltip, fire script 'kchidClick' when activated // --------------------------------------------------------- #define OBJECT( _szName, _cnoGokd, _zp, _cnoCursor ) \ SET _curgok = _cnoGokd \ CHUNK( kctgGokd, _cnoGokd, __NAME( _szName) ) \ __PACK \ SHORT BO OSK LONG gokkNil \ DEFAULT_POSITION( 0, 0, _zp ) \ ACTION( fcustNil, fcustNil, fgrfstAll, _cnoCursor, CHID1( kchidClick), cidNil, cnoNil ) \ ENDCHUNK #define OBJECTREG( _szName, _cnoGokd, _xp, _yp, _zp, _cnoCursor ) \ SET _curgok = _cnoGokd \ CHUNK( kctgGokd, _cnoGokd, __NAME( _szName ) ) \ __PACK \ SHORT BO OSK LONG gokkNil \ DEFAULT_POSITION( _xp, _yp, _zp ) \ ACTION( fcustNil, fcustNil, fgrfstAll, _cnoCursor, CHID1( kchidClick), cidNil, cnoNil ) \ ENDCHUNK #define OBJECTTT( _szName, _cnoGokd, _zp, _cnoCursor, _cnoToolTip ) \ SET _curgok = _cnoGokd \ CHUNK( kctgGokd, _cnoGokd, __NAME( _szName ) ) \ __PACK \ SHORT BO OSK LONG gokkNil \ DEFAULT_POSITION( 0, 0, _zp ) \ ACTION( fcustNil, fcustNil, fgrfstAll, _cnoCursor, CHID1( kchidClick), cidNil, _cnoToolTip ) \ ENDCHUNK #define OBJECTTTREG( _szName, _cnoGokd, _zp, _cnoCursor, _cnoToolTip, _regx, _regy ) \ SET _curgok = _cnoGokd \ CHUNK( kctgGokd, _cnoGokd, __NAME( _szName ) ) \ __PACK \ SHORT BO OSK LONG gokkNil \ DEFAULT_POSITION( _regx, _regy, _zp ) \ ACTION( fcustNil, fcustNil, fgrfstAll, _cnoCursor, CHID1( kchidClick), cidNil, _cnoToolTip) \ ENDCHUNK #define OBJECTCID( _szName, _cnoGokd, _zp, _cnoCursor, _cnoToolTip, _cid ) \ SET _curgok = _cnoGokd \ CHUNK( kctgGokd, _cnoGokd, __NAME( _szName ) ) \ __PACK \ SHORT BO OSK LONG gokkNil \ DEFAULT_POSITION( 0, 0, _zp ) \ ACTION( fcustNil, fcustNil, fgrfstAll, _cnoCursor, CHID1( kchidClick), _cid, _cnoToolTip ) \ ENDCHUNK #define OBJECTTY( _szName, _cnoGokd, _zp, _cnoCursor, _gokkType ) \ SET _curgok = _cnoGokd \ CHUNK( kctgGokd, _cnoGokd, __NAME( _szName ) ) \ __PACK \ SHORT BO OSK LONG _gokkType \ DEFAULT_POSITION( 0, 0, _zp ) \ ACTION( fcustNil, fcustNil, fgrfstAll, _cnoCursor, chidNil, cidNil, cnoNil ) \ ENDCHUNK // hmm... let's not pack the WAVE files for now. #define WAVE_CHUNK( _szFilename, _cnoWave ) \ CHUNK( kctgWave, _cnoWave, __NAME( _szFilename )) \ FILE _szFilename \ ENDCHUNK #define MIDI_CHUNK( _szFilename, _cnoMidi ) \ CHUNK( kctgMidi, _cnoMidi, __NAME( _szFilename )) \ __PACK \ MIDI _szFilename \ ENDCHUNK #define HELP_MBMP( _cno, _szFilename ) \ CHUNK( 'MBMP', _cno, __NAME(#_cno) ) \ PACK BITMAP( 0, 0, 0 ) _szFilename \ ENDCHUNK #endif // !KIDGS_CHH ================================================ FILE: inc/kidgsdef.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // // KIDGSDEF.H --- Cool defines for commonly used // information between code and script. // // File is named kidgs, because it's a Glen-Sean // wrapper around kidspace to make scripting a bit // easier :-) // #ifndef KIDGSDEF_H #define KIDGSDEF_H #include "kiddef.h" #include "framedef.h" #include "kidsanim.h" // --------------------------------------------------------- // the default transparent color index for bitmaps and masks // --------------------------------------------------------- #define kiTrans 0x00 // --------------------------------------------------------- // cno of script to run when the application is started // --------------------------------------------------------- #define kcnoStartApp 0 // --------------------------------------------------------- // The following are child id constants // --------------------------------------------------------- // predefined script child id's (utility values) #define kchidScript0 0x0020 #define kchidScript1 0x0021 #define kchidScript2 0x0022 #define kchidScript3 0x0023 #define kchidScript4 0x0024 #define kchidScript5 0x0025 #define kchidScript6 0x0026 #define kchidScript7 0x0027 #define kchidScript8 0x0028 #define kchidScript9 0x0029 #define kchidScript10 0x002A #define kchidScript11 0x002B // --------------------------------------------------------- // The following are constants for the state portion of the // above. State 0 is an undefined state. // --------------------------------------------------------- #define kstNil 0x0000 #define kst1 0x0001 #define kst2 0x0002 #define kst3 0x0003 #define kst4 0x0004 #define kst5 0x0005 #define kst6 0x0006 #define kst7 0x0007 #define kst8 0x0008 #define kst9 0x0009 #define kst10 0x000A #define kst11 0x000b #define kst12 0x000c #define kst13 0x000d #define kst14 0x000e #define kst15 0x000f #define kst16 0x0010 #define kst17 0x0011 #define kst18 0x0012 #define kst19 0x0013 #define kst20 0x0014 #define kst21 0x0015 #define kst22 0x0016 #define kst23 0x0017 #define kst24 0x0018 #define kst25 0x0019 #define kst26 0x001a #define kst27 0x001b #define kst28 0x001c #define kst29 0x001d #define kst30 0x001e #define kst31 0x001f #define kst32 0x0020 // Nil runtime Gob ID #define kidNil 0 #endif // !KIDGSDEF_H ================================================ FILE: inc/kidsanim.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // KIDSANIM.H --- Cool defines for cell animations. // --------------------------------------------------------- // Cell animation child ids // absolute so they don't overlap; utility // --------------------------------------------------------- #define kcellNull 0x0000003f #define kcell1 0x00000040 #define kcell2 0x00000041 #define kcell3 0x00000042 #define kcell4 0x00000043 #define kcell5 0x00000044 #define kcell6 0x00000045 #define kcell7 0x00000046 #define kcell8 0x00000047 #define kcell9 0x00000048 #define kcell10 0x00000049 #define kcell11 0x0000004a #define kcell12 0x0000004b #define kcell13 0x0000004c #define kcell14 0x0000004d #define kcell15 0x0000004e #define kcell16 0x0000004f #define kcell17 0x00000050 #define kcell18 0x00000051 #define kcell19 0x00000052 #define kcell20 0x00000053 #define kcell21 0x00000054 #define kcell22 0x00000055 #define kcell23 0x00000056 #define kcell24 0x00000057 #define kcell25 0x00000058 #define kcell26 0x00000059 #define kcell27 0x0000005a #define kcell28 0x0000005b #define kcell29 0x0000005c #define kcell30 0x0000005d #define kcell31 0x0000005e #define kcell32 0x0000005f #define kcell33 0x00000060 #define kcell34 0x00000061 #define kcell35 0x00000062 #define kcell36 0x00000063 #define kcell37 0x00000064 #define kcell38 0x00000065 #define kcell39 0x00000066 #define kcell40 0x00000067 #define kcell41 0x00000068 #define kcell42 0x00000069 #define kcell43 0x0000006a #define kcell44 0x0000006b #define kcell45 0x0000006c #define kcell46 0x0000006d #define kcell47 0x0000006e #define kcell48 0x0000006f #define kcell49 0x00000070 #define kcell50 0x00000071 #define kcell51 0x00000072 #define kcell52 0x00000073 #define kcell53 0x00000074 #define kcell54 0x00000075 #define kcell55 0x00000076 #define kcell56 0x00000077 #define kcell57 0x00000078 #define kcell58 0x00000079 #define kcell59 0x0000007a #define kcell60 0x0000007b #define kcell61 0x0000007c #define kcell62 0x0000007d #define kcell63 0x0000007e #define kcell64 0x0000007f #define kcell65 0x00000080 #define kcell66 0x00000081 #define kcell67 0x00000082 #define kcell68 0x00000083 #define kcell69 0x00000084 #define kcell70 0x00000085 #define kcell71 0x00000086 #define kcell72 0x00000087 #define kcell73 0x00000088 #define kcell74 0x00000089 #define kcell75 0x0000008a #define kcell76 0x0000008b #define kcell77 0x0000008c #define kcell78 0x0000008d #define kcell79 0x0000008e #define kcell80 0x0000008f #define kcell81 0x00000090 #define kcell82 0x00000091 #define kcell83 0x00000092 #define kcell84 0x00000093 #define kcell85 0x00000094 #define kcell86 0x00000095 #define kcell87 0x00000096 #define kcell88 0x00000097 #define kcell89 0x00000098 #define kcell90 0x00000099 #define kcell91 0x0000009a #define kcell92 0x0000009b #define kcell93 0x0000009c #define kcell94 0x0000009d #define kcell95 0x0000009e #define kcell96 0x0000009f #define kcell97 0x000000a0 #define kcell98 0x000000a1 #define kcell99 0x000000a2 #define kcell100 0x000000a3 #define kcell101 0x000000a4 #define kcell102 0x000000a5 #define kcell103 0x000000a6 #define kcell104 0x000000a7 #define kcell105 0x000000a8 #define kcell106 0x000000a9 #define kcell107 0x000000aa #define kcell108 0x000000ab #define kcell109 0x000000ac #define kcell110 0x000000ad #define kcell111 0x000000ae #define kcell112 0x000000af #define kcell113 0x000000b0 #define kcell114 0x000000b1 #define kcell115 0x000000b2 #define kcell116 0x000000b3 #define kcell117 0x000000b4 #define kcell118 0x000000b5 #define kcell119 0x000000b6 #define kcell120 0x000000b7 #define kcell121 0x000000b8 #define kcell122 0x000000b9 #define kcell123 0x000000ba #define kcell124 0x000000bb #define kcell125 0x000000bc #define kcell126 0x000000bd #define kcell127 0x000000be #define kcell128 0x000000bf #define kcell129 0x000000c0 #define kcell130 0x000000c1 #define kcell131 0x000000c2 #define kcell132 0x000000c3 #define kcell133 0x000000c4 #define kcell134 0x000000c5 #define kcell135 0x000000c6 #define kcell136 0x000000c7 #define kcell137 0x000000c8 #define kcell138 0x000000c9 #define kcell139 0x000000ca #define kcell140 0x000000cb #define kcell141 0x000000cc #define kcell142 0x000000cd #define kcell143 0x000000ce #define kcell144 0x000000cf #define kcell145 0x000000d0 #define kcell146 0x000000d1 #define kcell147 0x000000d2 #define kcell148 0x000000d3 #define kcell149 0x000000d4 #define kcell150 0x000000d5 #define kcell151 0x000000d6 #define kcell152 0x000000d7 #define kcell153 0x000000d8 #define kcell154 0x000000d9 #define kcell155 0x000000da #define kcell156 0x000000db #define kcell157 0x000000dc #define kcell158 0x000000dd #define kcell159 0x000000de #define kcell160 0x000000df #define kcell161 0x000000e0 #define kcell162 0x000000e1 #define kcell163 0x000000e2 #define kcell164 0x000000e3 #define kcell165 0x000000e4 #define kcell166 0x000000e5 #define kcell167 0x000000e6 #define kcell168 0x000000e7 #define kcell169 0x000000e8 #define kcell170 0x000000e9 #define kcell171 0x000000ea #define kcell172 0x000000eb #define kcell173 0x000000ec #define kcell174 0x000000ed #define kcell175 0x000000ee #define kcell176 0x000000ef #define kcell177 0x000000f0 #define kcell178 0x000000f1 #define kcell179 0x000000f2 #define kcell180 0x000000f3 #define kcell181 0x000000f4 #define kcell182 0x000000f5 #define kcell183 0x000000f6 #define kcell184 0x000000f7 #define kcell185 0x000000f8 #define kcell186 0x000000f9 #define kcell187 0x000000fa #define kcell188 0x000000fb #define kcell189 0x000000fc #define kcell190 0x000000fd #define kcell191 0x000000fe #define kcell192 0x000000ff #define kcell193 0x00000100 #define kcell194 0x00000101 #define kcell195 0x00000102 #define kcell196 0x00000103 #define kcell197 0x00000104 #define kcell198 0x00000105 #define kcell199 0x00000106 #define kcell200 0x00000107 #define kcell201 0x00000108 #define kcell202 0x00000109 #define kcell203 0x0000010a #define kcell204 0x0000010b #define kcell205 0x0000010c #define kcell206 0x0000010d #define kcell207 0x0000010e #define kcell208 0x0000010f #define kcell209 0x00000110 #define kcell210 0x00000111 #define kcell211 0x00000112 #define kcell212 0x00000113 #define kcell213 0x00000114 #define kcell214 0x00000115 #define kcell215 0x00000116 #define kcell216 0x00000117 #define kcell217 0x00000118 #define kcell218 0x00000119 #define kcell219 0x0000011a #define kcell220 0x0000011b #define kcell221 0x0000011c #define kcell222 0x0000011d #define kcell223 0x0000011e #define kcell224 0x0000011f #define kcell225 0x00000120 #define kcell226 0x00000121 #define kcell227 0x00000122 #define kcell228 0x00000123 #define kcell229 0x00000124 #define kcell230 0x00000125 #define kcell231 0x00000126 #define kcell232 0x00000127 #define kcell233 0x00000128 #define kcell234 0x00000129 #define kcell235 0x0000012a #define kcell236 0x0000012b #define kcell237 0x0000012c #define kcell238 0x0000012d #define kcell239 0x0000012e #define kcell240 0x0000012f #define kcell241 0x00000130 #define kcell242 0x00000131 #define kcell243 0x00000132 #define kcell244 0x00000133 #define kcell245 0x00000134 #define kcell246 0x00000135 #define kcell247 0x00000136 #define kcell248 0x00000137 #define kcell249 0x00000138 #define kcell250 0x00000139 #define kcell251 0x0000013a #define kcell252 0x0000013b #define kcell253 0x0000013c #define kcell254 0x0000013d #define kcell255 0x0000013e #define kcell256 0x0000013f #define kcell257 0x00000140 #define kcell258 0x00000141 #define kcell259 0x00000142 #define kcell260 0x00000143 #define kcell261 0x00000144 #define kcell262 0x00000145 #define kcell263 0x00000146 #define kcell264 0x00000147 #define kcell265 0x00000148 #define kcell266 0x00000149 #define kcell267 0x0000014a #define kcell268 0x0000014b #define kcell269 0x0000014c #define kcell270 0x0000014d #define kcell271 0x0000014e #define kcell272 0x0000014f #define kcell273 0x00000150 #define kcell274 0x00000151 #define kcell275 0x00000152 #define kcell276 0x00000153 #define kcell277 0x00000154 #define kcell278 0x00000155 #define kcell279 0x00000156 #define kcell280 0x00000157 #define kcell281 0x00000158 #define kcell282 0x00000159 #define kcell283 0x0000015a #define kcell284 0x0000015b #define kcell285 0x0000015c #define kcell286 0x0000015d #define kcell287 0x0000015e #define kcell288 0x0000015f #define kcell289 0x00000160 #define kcell290 0x00000161 #define kcell291 0x00000162 #define kcell292 0x00000163 #define kcell293 0x00000164 #define kcell294 0x00000165 #define kcell295 0x00000166 #define kcell296 0x00000167 #define kcell297 0x00000168 #define kcell298 0x00000169 #define kcell299 0x0000016a #define kcell300 0x0000016b #define kcell301 0x0000016c #define kcell302 0x0000016d #define kcell303 0x0000016e #define kcell304 0x0000016f #define kcell305 0x00000170 #define kcell306 0x00000171 #define kcell307 0x00000172 #define kcell308 0x00000173 #define kcell309 0x00000174 #define kcell310 0x00000175 #define kcell311 0x00000176 #define kcell312 0x00000177 #define kcell313 0x00000178 #define kcell314 0x00000179 #define kcell315 0x0000017a #define kcell316 0x0000017b #define kcell317 0x0000017c #define kcell318 0x0000017d #define kcell319 0x0000017e #define kcell320 0x0000017f #define kcell321 0x00000180 #define kcell322 0x00000181 #define kcell323 0x00000182 #define kcell324 0x00000183 #define kcell325 0x00000184 #define kcell326 0x00000185 #define kcell327 0x00000186 #define kcell328 0x00000187 #define kcell329 0x00000188 #define kcell330 0x00000189 #define kcell331 0x0000018a #define kcell332 0x0000018b #define kcell333 0x0000018c #define kcell334 0x0000018d #define kcell335 0x0000018e #define kcell336 0x0000018f #define kcell337 0x00000190 #define kcell338 0x00000191 #define kcell339 0x00000192 #define kcell340 0x00000193 #define kcell341 0x00000194 #define kcell342 0x00000195 #define kcell343 0x00000196 #define kcell344 0x00000197 #define kcell345 0x00000198 #define kcell346 0x00000199 #define kcell347 0x0000019a #define kcell348 0x0000019b #define kcell349 0x0000019c #define kcell350 0x0000019d #define kcell351 0x0000019e #define kcell352 0x0000019f #define kcell353 0x000001a0 #define kcell354 0x000001a1 #define kcell355 0x000001a2 #define kcell356 0x000001a3 #define kcell357 0x000001a4 #define kcell358 0x000001a5 #define kcell359 0x000001a6 #define kcell360 0x000001a7 #define kcell361 0x000001a8 #define kcell362 0x000001a9 #define kcell363 0x000001aa #define kcell364 0x000001ab #define kcell365 0x000001ac #define kcell366 0x000001ad #define kcell367 0x000001ae #define kcell368 0x000001af #define kcell369 0x000001b0 #define kcell370 0x000001b1 #define kcell371 0x000001b2 #define kcell372 0x000001b3 #define kcell373 0x000001b4 #define kcell374 0x000001b5 #define kcell375 0x000001b6 #define kcell376 0x000001b7 #define kcell377 0x000001b8 #define kcell378 0x000001b9 #define kcell379 0x000001ba #define kcell380 0x000001bb #define kcell381 0x000001bc #define kcell382 0x000001bd #define kcell383 0x000001be #define kcell384 0x000001bf #define kcell385 0x000001c0 #define kcell386 0x000001c1 #define kcell387 0x000001c2 #define kcell388 0x000001c3 #define kcell389 0x000001c4 #define kcell390 0x000001c5 #define kcell391 0x000001c6 #define kcell392 0x000001c7 #define kcell393 0x000001c8 #define kcell394 0x000001c9 #define kcell395 0x000001ca #define kcell396 0x000001cb #define kcell397 0x000001cc #define kcell398 0x000001cd #define kcell399 0x000001ce #define kcell400 0x000001cf #define kcell401 0x000001d0 #define kcell402 0x000001d1 #define kcell403 0x000001d2 #define kcell404 0x000001d3 #define kcell405 0x000001d4 #define kcell406 0x000001d5 #define kcell407 0x000001d6 #define kcell408 0x000001d7 #define kcell409 0x000001d8 #define kcell410 0x000001d9 #define kcell411 0x000001da #define kcell412 0x000001db #define kcell413 0x000001dc #define kcell414 0x000001dd #define kcell415 0x000001de #define kcell416 0x000001df #define kcell417 0x000001e0 #define kcell418 0x000001e1 #define kcell419 0x000001e2 #define kcell420 0x000001e3 #define kcell421 0x000001e4 #define kcell422 0x000001e5 #define kcell423 0x000001e6 #define kcell424 0x000001e7 #define kcell425 0x000001e8 #define kcell426 0x000001e9 #define kcell427 0x000001ea #define kcell428 0x000001eb #define kcell429 0x000001ec #define kcell430 0x000001ed #define kcell431 0x000001ee #define kcell432 0x000001ef #define kcell433 0x000001f0 #define kcell434 0x000001f1 #define kcell435 0x000001f2 #define kcell436 0x000001f3 #define kcell437 0x000001f4 #define kcell438 0x000001f5 #define kcell439 0x000001f6 #define kcell440 0x000001f7 #define kcell441 0x000001f8 #define kcell442 0x000001f9 #define kcell443 0x000001fa #define kcell444 0x000001fb #define kcell445 0x000001fc #define kcell446 0x000001fd #define kcell447 0x000001fe #define kcell448 0x000001ff #define kcell449 0x00000200 #define kcell450 0x00000201 #define kcell451 0x00000202 #define kcell452 0x00000203 #define kcell453 0x00000204 #define kcell454 0x00000205 #define kcell455 0x00000206 #define kcell456 0x00000207 #define kcell457 0x00000208 #define kcell458 0x00000209 #define kcell459 0x0000020a #define kcell460 0x0000020b #define kcell461 0x0000020c #define kcell462 0x0000020d #define kcell463 0x0000020e #define kcell464 0x0000020f #define kcell465 0x00000210 #define kcell466 0x00000211 #define kcell467 0x00000212 #define kcell468 0x00000213 #define kcell469 0x00000214 #define kcell470 0x00000215 #define kcell471 0x00000216 #define kcell472 0x00000217 #define kcell473 0x00000218 #define kcell474 0x00000219 #define kcell475 0x0000021a #define kcell476 0x0000021b #define kcell477 0x0000021c #define kcell478 0x0000021d #define kcell479 0x0000021e #define kcell480 0x0000021f #define kcell481 0x00000220 #define kcell482 0x00000221 #define kcell483 0x00000222 #define kcell484 0x00000223 #define kcell485 0x00000224 #define kcell486 0x00000225 #define kcell487 0x00000226 #define kcell488 0x00000227 #define kcell489 0x00000228 #define kcell490 0x00000229 #define kcell491 0x0000022a #define kcell492 0x0000022b #define kcell493 0x0000022c #define kcell494 0x0000022d #define kcell495 0x0000022e #define kcell496 0x0000022f #define kcell497 0x00000230 #define kcell498 0x00000231 #define kcell499 0x00000232 #define kcell500 0x00000233 #define kcell501 0x00000234 #define kcell502 0x00000235 #define kcell503 0x00000236 #define kcell504 0x00000237 #define kcell505 0x00000238 #define kcell506 0x00000239 #define kcell507 0x0000023a #define kcell508 0x0000023b #define kcell509 0x0000023c #define kcell510 0x0000023d #define kcell511 0x0000023e #define kcell512 0x0000023f #define kcell513 0x00000240 #define kcell514 0x00000241 #define kcell515 0x00000242 #define kcell516 0x00000243 #define kcell517 0x00000244 #define kcell518 0x00000245 #define kcell519 0x00000246 #define kcell520 0x00000247 #define kcell521 0x00000248 #define kcell522 0x00000249 #define kcell523 0x0000024a #define kcell524 0x0000024b #define kcell525 0x0000024c #define kcell526 0x0000024d #define kcell527 0x0000024e #define kcell528 0x0000024f #define kcell529 0x00000250 #define kcell530 0x00000251 #define kcell531 0x00000252 #define kcell532 0x00000253 #define kcell533 0x00000254 #define kcell534 0x00000255 #define kcell535 0x00000256 #define kcell536 0x00000257 #define kcell537 0x00000258 #define kcell538 0x00000259 #define kcell539 0x0000025a #define kcell540 0x0000025b #define kcell541 0x0000025c #define kcell542 0x0000025d #define kcell543 0x0000025e #define kcell544 0x0000025f #define kcell545 0x00000260 #define kcell546 0x00000261 #define kcell547 0x00000262 #define kcell548 0x00000263 #define kcell549 0x00000264 #define kcell550 0x00000265 #define kcell551 0x00000266 #define kcell552 0x00000267 #define kcell553 0x00000268 #define kcell554 0x00000269 #define kcell555 0x0000026a #define kcell556 0x0000026b #define kcell557 0x0000026c #define kcell558 0x0000026d #define kcell559 0x0000026e #define kcell560 0x0000026f #define kcell561 0x00000270 #define kcell562 0x00000271 #define kcell563 0x00000272 #define kcell564 0x00000273 #define kcell565 0x00000274 #define kcell566 0x00000275 #define kcell567 0x00000276 #define kcell568 0x00000277 #define kcell569 0x00000278 #define kcell570 0x00000279 #define kcell571 0x0000027a #define kcell572 0x0000027b #define kcell573 0x0000027c #define kcell574 0x0000027d #define kcell575 0x0000027e #define kcell576 0x0000027f #define kcell577 0x00000280 #define kcell578 0x00000281 #define kcell579 0x00000282 #define kcell580 0x00000283 #define kcell581 0x00000284 #define kcell582 0x00000285 #define kcell583 0x00000286 #define kcell584 0x00000287 #define kcell585 0x00000288 #define kcell586 0x00000289 #define kcell587 0x0000028a #define kcell588 0x0000028b #define kcell589 0x0000028c #define kcell590 0x0000028d #define kcell591 0x0000028e #define kcell592 0x0000028f #define kcell593 0x00000290 #define kcell594 0x00000291 #define kcell595 0x00000292 #define kcell596 0x00000293 #define kcell597 0x00000294 #define kcell598 0x00000295 #define kcell599 0x00000296 #define kcell600 0x00000297 ================================================ FILE: inc/modl.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /************************************************************************* modl.h: Model class Primary Author: ****** Review Status: REVIEWED - any changes to this file must be reviewed! BASE ---> BACO ---> MODL *************************************************************************/ #ifndef MODL_H #define MODL_H // Model on file: struct MODLF { short bo; short osk; short cver; // count of vertices short cfac; // count of faces BRS rRadius; BRB brb; // bounds BVEC3 bvec3Pivot; // br_vertex rgbrv[]; // vertices // br_face rgbrf[]; // faces }; typedef MODLF *PMODLF; const BOM kbomModlf = 0x55fffff0; /**************************************** MODL: a wrapper for BRender models ****************************************/ typedef class MODL *PMODL; #define MODL_PAR BACO #define kclsMODL 'MODL' class MODL : public MODL_PAR { RTCLASS_DEC ASSERT MARKMEM protected: BMDL *_pbmdl; // BRender model data protected: MODL(void) { } bool _FInit(PBLCK pblck); bool _FPrelight(long cblit, BVEC3 *prgbvec3Light); public: static PMODL PmodlNew(long cbrv, BRV *prgbrv, long cbrf, BRF *prgbrf); static bool FReadModl(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb); static PMODL PmodlReadFromDat(FNI *pfni); static PMODL PmodlFromBmdl(PBMDL pbmdl); ~MODL(void); PBMDL Pbmdl(void) { return _pbmdl; } void AdjustTdfCharacter(void); bool FWrite(PCFL pcfl, CTG ctg, CNO cno); BRS Dxr(void) { return _pbmdl->bounds.max.v[0] - _pbmdl->bounds.min.v[0]; } BRS Dyr(void) { return _pbmdl->bounds.max.v[1] - _pbmdl->bounds.min.v[1]; } BRS Dzr(void) { return _pbmdl->bounds.max.v[2] - _pbmdl->bounds.min.v[2]; } }; #endif TMPL_H ================================================ FILE: inc/movie.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Status: All changes must be code reviewed. Movie Stuff A single view on a movie (MVU) DDG ---> MVU Callbacks to client (MCC) BASE ---> MCC A single movie (MVIE) DOCB ---> MVIE ***************************************************************************/ #ifndef MOVIE_H #define MOVIE_H // // Tools that can be "loaded" on the mouse cursor // enum { toolPlace, // (to position an actor when you first add it) toolCompose, toolAction, // action is in _anidTool if we're motion filling toolTweak, toolRotateX, toolRotateY, toolRotateZ, toolCostumeCmid, // cmid is in _cmidTool toolSquashStretch, toolSoonerLater, toolResize, toolNormalizeRot, toolCopyObject, toolCutObject, toolPasteObject, toolCopyRte, toolDefault, toolTboxMove, toolTboxUpDown, toolTboxLeftRight, toolTboxFalling, toolTboxRising, toolSceneNuke, toolIBeam, toolSceneChop, toolSceneChopBack, toolCutText, toolCopyText, toolPasteText, toolPasteRte, toolActorEasel, toolActorSelect, toolActorNuke, toolTboxPaintText, toolTboxFillBkgd, toolTboxStory, toolTboxCredit, toolNormalizeSize, toolRecordSameAction, toolSounder, toolLooper, toolMatcher, toolTboxFont, toolTboxStyle, toolTboxSize, toolListener, toolAddAFrame, toolFWAFrame, toolRWAFrame, toolComposeAll, toolUndo, // For playing UI Sound only toolRedo, // For playing UI Sound only toolFWAScene, // For playing UI Sound only toolRWAScene, // For playing UI Sound only toolLimMvie }; // // Used to tell the client the change the state of the undo UI // enum { undoDisabled = 1, undoUndo, undoRedo }; // // grfbrws flags // enum { fbrwsNil = 0, fbrwsProp = 1, // fTrue implies prop or 3d fbrwsTdt = 2 // fTrue means this is a 3-D Text object }; // // // A class for handling a single Movie view // // // // The class definition // #define MVU_PAR DDG typedef class MVU *PMVU; #define kclsMVU 'MVU' class MVU : public MVU_PAR { RTCLASS_DEC ASSERT MARKMEM CMD_MAP_DEC(MVU) protected: /* Make these static; we want to be able to set and restore without having an actual MVU, and they shouldn't be getting set per-MVU anyway */ static bool _fKbdDelayed; // fTrue == we have delayed the keyboard static long _dtsKbdDelay; // System keyboard delay before first repeat static long _dtsKbdRepeat; // System keyboard delay between repeats long _dxp; long _dyp; // width and height rendered area. bool _fTrackingMouse; // Is the mouse currently being tracked? long _xpPrev; // X location of the mouse. long _ypPrev; // Y location of the mouse. BRS _dzrPrev; // Z motion of the "mouse" (arrow keys) long _grfcust; // Options in effect when mouse was down. PCURS _pcursDefault; // Default cursor for when a tool is not applicable. PACTR _pactrListener; // Pactr of the actor being auditioned PACTR _pactrRestore; // Restore for actor recording long _anidTool; // Current selected action TAG _tagTool; // Tag associated with current tool. PTMPL _ptmplTool; // Template associated with the current tool. long _cmidTool; // Costume id associated with current tool. bool _fCyclingCels; // Are we cycling cels in toolRecord? long _tool; // Current tool loaded on cursor // REVIEW Seanse(SeanSe): MVIE should not be creating/mucking with actor undo // objects. V2.666 should revisit this issue and see if we can get ACTR to // do all its own undo objects (e.g. Growing over a long drag could become // a StartGrow/Grow/EndGrow sequence). This also effects _pactrRestore. PAUND _paund; // Actor undo object to save from mouse down to drag. ulong _tsLast; // Last time a cell was recorded. ulong _tsLastSample; // Last time mouse/kbd sampled RC _rcFrame; // Frame for creating a text box. BRS _rgrAxis[3][3]; // Conversion from mouse points to 3D points. bool _fRecordDefault; // fTrue = Record; fFalse = Rerecord bool _fPause : 1; // fTrue if pausing play until a click. bool _fTextMode : 1; // fTrue if Text boxes are active. bool _fRespectGround : 1; // fTrue if Y=0 is enforced. bool _fSetFRecordDefault : 1; // fTrue if using hotkeys to rerecord. bool _fMouseOn : 1; bool _fEntireScene : 1; // Does positioning effect the entire scene? bool _fMouseDownSeen; // Was the mouse depressed during a place. PACTR _pactrUndo; // Actor to use for undo object when roll-calling. ACR _acr; // Color for painting text. long _onn; // Font for text long _dypFont; // Font size for text ulong _grfont; // Font style for text long _lwLastTime; // State variable for the last time through. MVU(PDOCB pdocb, PGCB pgcb) : DDG(pdocb, pgcb) { } // // Clipboard support // bool _FCopySel(PDOCB *ppdocb, bool fRteOnly); void _ClearSel(void); bool _FPaste(PCLIP pclip); void _PositionActr(BRS dxrWld, BRS dyrWld, BRS dzrWld); void _MouseDown(CMD_MOUSE *pcmd); void _MouseDrag(CMD_MOUSE *pcmd); void _MouseUp(CMD_MOUSE *pcmd); void _ActorClicked(PACTR pactr, bool fDown); public: static void SlowKeyboardRepeat(void); static void RestoreKeyboardRepeat(void); // // Constructors and desctructors // static MVU *PmvuNew(PMVIE pmvie, PGCB pgcb, long dxy, long dyp); ~MVU(void); // // Accessor for getting the owning movie // PMVIE Pmvie() { return (PMVIE)_pdocb; } // // Command handlers // virtual bool FCmdTrackMouse(PCMD_MOUSE pcmd); virtual bool FCmdMouseMove(PCMD_MOUSE pcmd); virtual bool FCmdClip(CMD *pcmd); virtual bool FCmdUndo(PCMD pcmd); virtual bool FCloseDoc(bool fAssumeYes, bool fSaveDDG = fFalse); virtual bool FCmdSave(PCMD pcmd); bool FDoClip(long tool); bool FCmdIdle(CMD *pcmd); // Called whenever an idle loop is seen. bool FCmdRollOff(CMD *pcmd); // // View specific functions. // void SetTool(long tool); long Tool(void) { return _tool; } long AnidTool(void) { return _anidTool; } long CmidTool(void) { return _cmidTool; } PTAG PtagTool(void) { return &_tagTool; } void SetAnidTool(long anid) { _anidTool = anid; } void SetTagTool(PTAG ptag); void SetCmidTool(long cmid) { _cmidTool = cmid; } void StartPlaceActor(bool fEntireScene = fFalse); void EndPlaceActor(void); void WarpCursToCenter(void); void WarpCursToActor(PACTR pactr); void AdjustCursor(long xp, long yp); void MouseToWorld(BRS dxrMouse, BRS dyrMouse, BRS dzrMouse, BRS *pdxrWld, BRS *pdyrWld, BRS *pdzrWld, bool fRecord); void SetAxis(BRS rgrAxis[3][3]) { BltPb(rgrAxis, _rgrAxis, size(BRS) * 9); } void SetFRecordDefault(bool f) { _fRecordDefault = f; } void SetFRespectGround(bool f) { _fRespectGround = f; } bool FRecordDefault() { return _fRecordDefault; } void PauseUntilClick(bool fPause) { _fPause = fPause; } bool FPausing(void) { return _fPause; } bool FTextMode(void) { return _fTextMode; } bool FActrMode(void) { return !_fTextMode; } bool FRespectGround(void) { return _fRespectGround; } void SetActrUndo(PACTR pactr) { _pactrUndo = pactr; } void SetPaintAcr(ACR acr) { _acr = acr; } ACR AcrPaint(void) { return _acr; } void SetOnnTextCur(long onn) { _onn = onn; } long OnnTextCur(void) { return _onn; } void SetDypFontTextCur(long dypFont) { _dypFont = dypFont; } long DypFontTextCur(void) { return _dypFont; } void SetStyleTextCur(ulong grfont) { _grfont = grfont; } ulong GrfontStyleTextCur(void) { return _grfont; } // // Routines for communicating with the framework // void Draw(PGNV pgnv, RC *prcClip); }; // // // Movie Client Callbacks. Used for filling in // parameters for this movie, and for notifying // client of state changes. // // #define MCC_PAR BASE class MCC; typedef MCC *PMCC; #define kclsMCC 'MCC' class MCC : public MCC_PAR { protected: long _dxp; long _dyp; long _cbCache; public: MCC(long dxp, long dyp, long cbCache) { _dxp = dxp; _dyp = dyp; _cbCache = cbCache; } virtual long Dxp(void) { return _dxp; } // Width of the rendering area virtual long Dyp(void) { return _dyp; } // Height of the rendering area virtual long CbCache(void) { return _cbCache; } // Number of bytes to use for caching. virtual void SetCurs(long tool) { } // Sets the cursor based on the tool, may be pvNil. virtual void UpdateRollCall(void) { } // Tells the client to update its roll call. virtual void UpdateAction(void) { } // Tells the client to update its action menu. virtual void UpdateScrollbars(void) { } // Tells the client to update its scrollbars. virtual void PlayStopped(void) { } // Tells the client that playback was stopped internally. virtual void ChangeTool(long tool) { } // Tells the client that the tool was changed internally. virtual void SceneNuked(void) { } // Tells the client that a scene was nuked. virtual void SceneUnnuked(void) { } // Tells the client that a scene was nuked and now undone. virtual void ActorNuked(void) { } // Tells the client that an actor was nuked. virtual void EnableActorTools(void) { } // Tells the client that the first actor was added. virtual void EnableTboxTools(void) { } // Tells the client that the first textbox was added. virtual void TboxSelected(void) { } // Tells the client that a new text box was selected. virtual void ActorSelected(long arid) { } // Tells the client that an actor was selected virtual void ActorEasel(bool *pfActrChanged) { } // Lets client edit 3-D Text or costume virtual void SetUndo(long undo) { } // Tells the client the state of the undo buffer. virtual void SceneChange(void) { } // Tells the client that a different scene is the current one virtual void PauseType(WIT wit) { } // Tells the client of a new pause type for this frame. virtual void Recording(bool fRecording, bool fRecord) { } // Tells the client that the movie engine is recording or not. virtual void StartSoonerLater(void) { } // Tells the client that an actor is selected for sooner/latering. virtual void EndSoonerLater(void) { } // Tells the client that an actor is done for sooner/latering. virtual void NewActor(void) { } // Tells the client that an actor has just been placed. virtual void StartActionBrowser(void) { } // Tells the client to start up the action browser. virtual void StartListenerEasel(void) { } // Tells the client to start up the listener easel. virtual bool GetFniSave(FNI *pfni, long lFilterLabel, long lFilterExt, long lTitle, LPTSTR lpstrDefExt, PSTN pstnDefFileName) { return fFalse; } // Tells the client to start up the save portfolio. virtual void PlayUISound(long tool, long grfcust = 0) { } // Tells the client to play sound associated with use of tool. virtual void StopUISound(void) { } // Tells the client to stop sound associated with use of tools. virtual void UpdateTitle(PSTN pstnTitle) { } // Tells the client that the movie name has changed. virtual void EnableAccel(void) { } // Tells the client to enable keyboard accelerators. virtual void DisableAccel(void) { } // Tells the client to disable keyboard accelerators. virtual void GetStn(long ids, PSTN pstn) { } // Requests the client to fetch the given ids string. virtual long DypTextDef(void) { return vpappb->DypTextDef(); } virtual long DypTboxDef(void) { return 14; } virtual void SetSndFrame(bool fSoundInFrame) { } virtual bool FMinimized(void) { return fFalse; } virtual bool FQueryPurgeSounds(void) { return fFalse; } }; /* A SCENe Descriptor */ typedef struct _scend { /* The first fields are private...the client shouldn't change them, and in fact, generally shouldn't even look at them */ long imvied; // index of the MVIED for this scene CNO cno; // the CNO of this scene chunk CHID chid; // the original CHID PMBMP pmbmp; // pointer to thumbnail MBMP /* The client can read or write the following fields */ TRANS trans; // the transition that will occur after this scene bool fNuked : 1; // fTrue if this scene has been deleted } SCEND, *PSCEND; /* A MoVIE Descriptor */ typedef struct _mvied { PCRF pcrf; // the file this scene's movie is in CNO cno; // CNO of the MVIE chunk long aridLim; // _aridLim from the MVIE } MVIED, *PMVIED; /* A Composite MoVIe */ typedef struct _cmvi { PGL pglmvied; // GL of movie descriptors PGL pglscend; // GL of scene descriptors void Empty(void); #ifdef DEBUG void MarkMem(void); #endif } CMVI, *PCMVI; // // // Movie Class. // // const long kccamMax = 9; typedef class MVIE *PMVIE; #define MVIE_PAR DOCB #define kclsMVIE 'MVIE' class MVIE : public MVIE_PAR { RTCLASS_DEC MARKMEM ASSERT CMD_MAP_DEC(MVIE) protected: long _aridLim; // Highest actor id in use. PCRF _pcrfAutoSave; // CRF/CFL of auto save file. PFIL _pfilSave; // User's document CNO _cno; // CNO of movie in current file. STN _stnTitle; // Title of the movie PGST _pgstmactr; // GST of actors in the movie (for roll call) PSCEN _pscenOpen; // Index of current open scene. long _cscen; // Number of scenes in the movie. long _iscen; // Number of scene open in the movie. bool _fAutosaveDirty : 1; // Is the movie in memory different than disk bool _fFniSaveValid : 1; // Does _fniSave contain a file name. bool _fPlaying : 1; // Is the movie playing? bool _fScrolling : 1; // During playback only, are we scrolling textboxes bool _fPausing : 1; // Are we executing a pause. bool _fIdleSeen : 1; // fTrue if we have seen an idle since this was cleared. bool _fStopPlaying : 1; // Should we stop the movie playing bool _fSoundsEnabled : 1; // Should we play sounds or not. bool _fOldSoundsEnabled : 1; // Old value of above. bool _fDocClosing : 1; // Flags doc is to be closed bool _fGCSndsOnClose : 1; // Garbage collection of sounds on close bool _fReadOnly : 1; // Is the original file read-only? PBWLD _pbwld; // The brender world for this movie PMSQ _pmsq; // Message Sound Queue CLOK _clok; // Clock for playing the film ulong _tsStart; // Time last play started. long _cnfrm; // Number of frames since last play started. PMCC _pmcc; // Parameters and callbacks. WIT _wit; // Pausing type long _dts; // Number of clock ticks to pause. TRANS _trans; // Transition type to execute. long _vlmOrg; // original SNDM volume, before fadeout, if we are done with fadeout, then 0 #ifdef DEBUG bool _fWriteBmps; long _lwBmp; #endif // DEBUG PGL _pglclrThumbPalette; // Palette to use for thumbnail rendering. private: MVIE(void); PTAGL _PtaglFetch(void); // Returns a list of all tags used in movie bool _FCloseCurrentScene(void); // Closes and releases current scene, if any bool _FMakeCrfValid(void); // Makes sure there is a file to work with. bool _FUseTempFile(void); // Switches to using a temp file. void _MoveChids(CHID chid, bool fDown); // Move the chids of scenes in the movie. bool _FDoGarbageCollection(PCFL pcfl); // Remove unused chunks from movie. void _DoSndGarbageCollection(bool fPurgeAll); // Remove unused user sounds from movie bool _FDoMtrlTmplGC(PCFL pcfl); // Material and template garbage collection CHID _ChidScenNewSnd(void); // Choose an unused chid for a new scene child user sound CHID _ChidMvieNewSnd(void); // Choose an unused chid for a new movie child user sound void _SetTitle(PFNI pfni = pvNil); // Set the title of the movie based on given file name. bool _FIsChild(PCFL pcfl, CTG ctg, CNO cno); bool _FSetPfilSave(PFNI pfni); public: // // Begin client useable functions // #ifdef DEBUG void SetFWriteBmps(bool fWriteBmps) { if (fWriteBmps && !_fWriteBmps) _lwBmp = 0; _fWriteBmps = fWriteBmps; } bool FWriteBmps(void) { return _fWriteBmps; } #endif // DEBUG // // Getting views // PMVU PmvuCur(void); PMVU PmvuFirst(void); // // Create and Destroy // static PMVIE PmvieNew(bool fHalfMode, PMCC pmcc, FNI *pfni = pvNil, CNO cno = cnoNil); // Create a movie and read it if // pfni != pvNil static bool FReadRollCall(PCRF pcrf, CNO cno, PGST *ppgst, long *paridLim = pvNil); // reads roll call for a given movie void ForceSaveAs(void) { ReleasePpo(&_pfilSave); _fFniSaveValid = fFalse; } void Flush(void); bool FReadOnly(void) { return FPure(_fReadOnly); } ~MVIE(void); // // MCC maintenance // PMCC Pmcc(void) { return _pmcc; } // Accessor for getting to client callbacks. void SetMcc(PMCC pmcc) { ReleasePpo(&_pmcc); _pmcc = pmcc; _pmcc->AddRef(); } // // Title stuff // void GetName(PSTN pstnTitle); // Gets the title of the movie. PSTN PstnTitle(void) { return &_stnTitle; } void ResetTitle(void); // // Scene stuff // long Cscen(void) // Returns number of scenes in movie { return _cscen; } long Iscen(void) // Returns the current scene number { return _iscen; } bool FSwitchScen(long iscen); // Loads and returns pointer to scene iscen, // saving any current scene. bool FRemScen(long iscen); // Removes a scene from the movie, and undo bool FChangeCam(long camid); // Change the camera view in the scene. bool FInsTbox(RC *prc, bool fStory); // Insert a text box into the scene. bool FHideTbox(void); // Hide selected text box from the scene at this fram. bool FNukeTbox(void); // Remove selected text box from the scene. void SelectTbox(long itbox); // Select the itbox'th text box in the frame. void SetPaintAcr(ACR acr); // Sets color that painting will occur with. void SetOnnTextCur(long onn); // Sets font that text will be in void SetDypFontTextCur(long dypFont); // Sets font size that text will be in void SetStyleTextCur(ulong grfont); // Sets font style that text will be in bool FInsActr(PTAG ptag); // Insert an actor into the scene. bool FRemActr(void); // Remove selected actor from scene. bool FAddOnstage(long arid); // Bring this actor onto the stage. bool FRotateActr(BRA xa, BRA ya, BRA za, bool fFromHereFwd); // Rotate selected actor by degrees bool FSquashStretchActr(BRS brs); // Squash/Stretch selected actor bool FSoonerLaterActr(long nfrm); // Sooner/Later selected actor bool FScaleActr(BRS brs); // Scale selected actor bool FCostumeActr(long ibprt, PTAG ptag, long cmid, tribool fCustom); bool FAddScen(PTAG ptag); // Add a scene after the current one, or change // change bkgd if scene is empty bool FSetTransition(TRANS trans); // Set the transition type for the current scene. void Play(void); // Start/Stop a movie playing. bool FPause(WIT wit, long dts); // Insert a pause here. bool FAddToCmvi(PCMVI pcmvi, long *piscendIns); // Add this movie to the CMVI bool FSetCmvi(PCMVI pcmvi); // Re-build the movie from the CMVI bool _FAddMvieToRollCall(CNO cno, long aridMin); // Updates roll call for an imported movie bool _FInsertScend(PGL pglscend, long iscend, PSCEND pscend); // Insert an imported scene void _DeleteScend(PGL pglscend, long iscend); // Delete an imported scene bool _FAdoptMsndInMvie(PCFL pcfl, CNO cnoScen); // Adopt msnd chunks as children of the movie bool FAddBkgdSnd(PTAG ptag, tribool fLoop, tribool fQueue, long vlm = vlmNil, long sty = styNil); // Adds a sound bool FAddActrSnd(PTAG ptag, tribool fLoop, tribool fQueue, tribool fActnCel, long vlm, long sty); // Adds a sound // // Auto save stuff // bool FAutoSave(PFNI pfni = pvNil, bool fCleanRollCall = fFalse); // Save movie in temp file bool FSaveTagSnd(TAG *ptag) { return TAGM::FSaveTag(ptag, _pcrfAutoSave, fTrue); } bool FCopySndFileToMvie(PFIL pfil, long sty, CNO *pcno, PSTN pstn = pvNil); bool FVerifyVersion(PCFL pcfl, CNO *pcno = pvNil); bool FEnsureAutosave(PCRF *pcrf = pvNil); bool FCopyMsndFromPcfl(PCFL pcfl, CNO cnoSrc, CNO *pcnoDest); bool FResolveSndTag(PTAG ptag, CHID chid, CNO cnoScen = cnoNil, PCRF pcrf = pvNil); bool FChidFromUserSndCno(CNO cno, CHID *pchid); void SetDocClosing(bool fClose) { _fDocClosing = fClose; } bool FQueryDocClosing(void) { return _fDocClosing; } bool FQueryGCSndsOnClose(void) { return _fGCSndsOnClose; } bool FUnusedSndsUser(bool *pfHaveValid = pvNil); // // Roll call // bool FGetArid(long iarid, long *parid, PSTN pstn, long *pcactRef, PTAG ptagTmpl = pvNil); // return actors one by one bool FChooseArid(long arid); // user chose arid in roll call long AridSelected(void); bool FGetName(long arid, PSTN pstn); // Return the name of a specific actor. bool FNameActr(long arid, PSTN pstn); // Set the name of this actor. void ChangeActrTag(long arid, PTAG ptag); // Change an actor's TMPL tag long CmactrMac(void) { AssertThis(0); return _pgstmactr->IvMac(); } bool FIsPropBrwsIarid(long iarid); // Identify the roll call browser iarids bool FIsIaridTdt(long iarid); // 3d spletter // // Overridden DOCB functions // bool FGetFni(FNI *pfni); // For saving to a file bool FSave(long cid); // For saving to a file, (calls FGetFni and FSaveToFni) bool FSaveToFni(FNI *pfni, bool fSetFni); // For doing a Save As or Save PDMD PdmdNew(void); // Do not use! bool FGetFniSave(FNI *pfni); // For saving via the portfolio. // // Drawing stuff // void InvalViews(void); // Invalidates all views on the movie. void InvalViewsAndScb(void); // Invalidates all views of movie and scroll bars. void MarkViews(void); // Marks all views on the movie. TRANS Trans(void) { return _trans; } // Current transition in effect. void SetTrans(TRANS trans) { _trans = trans; } // Set transition void DoTrans(PGNV pgnvDst, PGNV pgnvSrc, RC *prcDst, RC *prcSrc); // Draw current transition into GNVs // // Sound stuff // bool FSoundsEnabled(void) { return (_fSoundsEnabled); } void SetFSoundsEnabled(bool f) { _fSoundsEnabled = f; } // // End client callable functions // // // Begin internal movie engine functions // // // Command handlers // bool FCmdAlarm(CMD *pcmd); // Called at timer expiration (playback). bool FCmdRender(CMD *pcmd); // Called to render a frame during playback. // // Automated test APIs // long LwQueryExists(long lwType, long lwId); // Called by other apps to find if an actor/tbox exists. long LwQueryLocation(long lwType, long lwId); // Called by other apps to find where actor/tbox exists. long LwSetMoviePos(long lwScene, long lwFrame); // Called by other apps to set the movie position. // // Scene stuff // PSCEN Pscen(void) { return _pscenOpen; } // The currently open scene. bool FInsScenCore(long iscen, SCEN *pscen); // Insert this scene as scene number. bool FNewScenInsCore(long iscen); // Inserts a blank scene before iscen bool FRemScenCore(long iscen); // Removes a scene from the movie bool FPasteActr(PACTR pactr); // Pastes an actor into current scene. bool FPasteActrPath(PACTR pactr); // Pastes the path onto selected actor. PMSQ Pmsq(void) { return _pmsq; } // Sound queue // // Runtime Pausing // void DoPause(WIT wit, long dts) // Make the movie pause during run. { _wit = wit; _dts = dts; } // // Material stuff // bool FInsertMtrl(PMTRL pmtrl, PTAG ptag); // Inserts a material into this movie. // // 3-D Text stuff // bool FInsTdt(PSTN pstn, long tdts, PTAG ptagTdf); // Inserts a TDT into this movie. bool FChangeActrTdt(PACTR pactr, PSTN pstn, long tdts, PTAG ptagTdf); // // Marking (overridden DOCB methods) // virtual bool FDirty(void) // Has the movie changed since last saved? { return _fAutosaveDirty || _fDirty; } virtual void SetDirty(bool fDirty = fTrue) // Mark the movie as changed. { _fAutosaveDirty = fDirty; } // // Roll call // bool FAddToRollCall(ACTR *pactr, PSTN pstn); // Add an actor to the roll call void RemFromRollCall(ACTR *pactr, bool fDelIfOnlyRef = fFalse); // Remove an actor from the roll call. void BuildActionMenu(void); // Called when the selected actor has changed. // // Overridden DOCB functions // PDDG PddgNew(PGCB pgcb); // For creating a view on a movie. bool FAddUndo(PMUNB pmunb); // Add an item to the undo list void ClearUndo(void); // // Accessors for MVUs only. // #ifdef DEBUG void SetFPlaying(bool f) { _fPlaying = f; if (!f) SetFWriteBmps(fFalse); } // Set the playing flag. #else // DEBUG void SetFPlaying(bool f) { _fPlaying = f; } // Set the playing flag. #endif // !DEBUG void SetFStopPlaying(bool f) { _fStopPlaying = f; } // INTERNAL USE ONLY bool FStopPlaying(void) { return (_fStopPlaying); } // INTERNAL USE ONLY bool FPlaying(void) { return _fPlaying; } // Query the playing flag. PCLOK Pclok() { return &_clok; } // For getting the clock for playing void SetFIdleSeen(bool fIdle) { _fIdleSeen = fIdle; } bool FIdleSeen(void) { return _fIdleSeen; } // // Accessor for getting to the Brender world. // PBWLD Pbwld(void) { return _pbwld; } // // Frame rate information // long Cnfrm(void) { return _cnfrm; } ulong TsStart(void) { return _tsStart; } // // Thumbnail stuff // PGL PglclrThumbPalette(void) { AssertThis(0); return _pglclrThumbPalette; } void SetThumbPalette(PGL pglclr) { ReleasePpo(&_pglclrThumbPalette); _pglclrThumbPalette = pglclr; pglclr->AddRef(); } }; #endif // !MOVIE_H ================================================ FILE: inc/msnd.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** msnd.h: Movie sound class Primary Authors: *****, ***** Status: Reviewed BASE ---> BACO ---> MSND BASE ---> CMH ---> MSQ NOTE: when the MSQ stops sounds, it does it based on sound class (scl) and not sound queue (sqn). This is slightly less efficient, because the SNDM must search all open sound queues for the given scl's when we stop sounds; however, the code is made much simpler, because the sqn is generated on the fly based on whether the sound is for an actor or background, the sty of the sound, and (in the case of actor sounds) the arid of the source of the sound. If we had to enumerate all sounds based on that information, we'd wind up calling into the SNDM a minimum of three times, plus three times for each actor; not only is the enumeration on this side inefficient (the MSQ would have to call into the MVIE to enumerate all the known actors), but the number of calls to SNDM gets to be huge! On top of all that, we'd probably wind up finding some bugs where a sound is still playing for an actor that's been deleted, and possibly fail to stop the sound properly (Murphy reigning strong in any software project). ***************************************************************************/ #ifndef MSND_H #define MSND_H // Sound types enum { styNil = 0, styUnused, // Retain. Existing content depends on subsequent values stySfx, stySpeech, styMidi, styLim }; // Sound-class-number constants const long sclNonLoop = 0; const long sclLoopWav = 1; const long sclLoopMidi = 2; #define vlmNil (-1) // Sound-queue-number constants enum { sqnActr = 0x10000000, sqnBkgd = 0x20000000, sqnLim }; #define ksqnStyShift 16; // Shift for the sqnsty // Sound Queue Delta times // Any sound times less than ksqdtimLong will be clocked & stopped const long kdtimOffMsq = 0; const long kdtimLongMsq = klwMax; const long kdtim2Msq = ((kdtimSecond * 2) * 10) / 12; // adjustment -> 2 seconds const long kSndSamplesPerSec = 22050; const long kSndBitsPerSample = 8; const long kSndBlockAlign = 1; const long kSndChannels = 1; /**************************************** Movie Sound on file ****************************************/ struct MSNDF { short bo; short osk; long sty; // sound type long vlmDefault; // default volume bool fInvalid; // Invalid flag }; const BOM kbomMsndf = 0x5FC00000; const CHID kchidSnd = 0; // Movie Sound sound/music // Function to stop all movie sounds. inline void StopAllMovieSounds(void) { vpsndm->StopAll(sqnNil, sclNonLoop); vpsndm->StopAll(sqnNil, sclLoopWav); vpsndm->StopAll(sqnNil, sclLoopMidi); } /**************************************** The Movie Sound class ****************************************/ typedef class MSND *PMSND; #define MSND_PAR BACO #define kclsMSND 'MSND' class MSND : public MSND_PAR { RTCLASS_DEC ASSERT MARKMEM protected: // these are inherent to the msnd CTG _ctgSnd; // CTG of the WAV or MIDI chunk CNO _cnoSnd; // CNO of the WAV or MIDI chunk PRCA _prca; // file that the WAV/MIDI lives in long _sty; // MIDI, speech, or sfx long _vlm; // Volume of the sound tribool _fNoSound; // Set if silent sound STN _stn; // Sound name bool _fInvalid; // Invalid flag protected: bool _FInit(PCFL pcfl, CTG ctg, CNO cno); public: static bool FReadMsnd(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb); static bool FGetMsndInfo(PCFL pcfl, CTG ctg, CNO cno, bool *pfInvalid = pvNil, long *psty = pvNil, long *pvlm = pvNil); static bool FCopyMidi(PFIL pfilSrc, PCFL pcflDest, CNO *pcno, PSTN pstn = pvNil); static bool FWriteMidi(PCFL pcflDest, PMIDS pmids, STN *pstnName, CNO *pcno); static bool FCopyWave(PFIL pfilSrc, PCFL pcflDest, long sty, CNO *pcno, PSTN pstn = pvNil); static bool FWriteWave(PFIL pfilSrc, PCFL pcflDest, long sty, STN *pstnName, CNO *pcno); ~MSND(void); static long SqnActr(long sty, long objID); static long SqnBkgd(long sty, long objID); long Scl(bool fLoop) { return (fLoop ? ((_sty == styMidi) ? sclLoopMidi : sclLoopWav) : sclNonLoop); } long SqnActr(long objID) { AssertThis(0); return SqnActr(_sty, objID); } long SqnBkgd(long objID) { AssertThis(0); return SqnBkgd(_sty, objID); } bool FInvalidate(void); bool FValid(void) { AssertBaseThis(0); return FPure(!_fInvalid); } PSTN Pstn(void) { AssertThis(0); return &_stn; } long Sty(void) { AssertThis(0); return _sty; } long Vlm(void) { AssertThis(0); return _vlm; } long Spr(long tool); // Return Priority tribool FNoSound(void) { AssertThis(0); return _fNoSound; } void Play(long objID, bool fLoop, bool fQueue, long vlm, long spr, bool fActr = fFalse, ulong dtsStart = 0); }; /**************************************** Movie Sound Queue (MSQ) Sounds to be played at one time. These are of all types, queues & classes ****************************************/ typedef class MSQ *PMSQ; #define MSQ_PAR CMH #define kclsMSQ 'MSQ' const long kcsqeGrow = 10; // quantum growth for sqe // Movie sound queue entry struct SQE { long objID; // Unique identifier (actor id, eg) bool fLoop; // Looping sound flag bool fQueue; // Queued sound long vlmMod; // Volume modification long spr; // Priority bool fActr; // Actor vs Scene (to generate unique class) PMSND pmsnd; // PMSND ulong dtsStart; // How far into the sound to start playing }; class MSQ : public MSQ_PAR { RTCLASS_DEC ASSERT MARKMEM CMD_MAP_DEC(MSQ) protected: PGL _pglsqe; // Sound queue entries long _dtim; // Time sound allowed to play PCLOK _pclok; public: MSQ(long hid) : MSQ_PAR(hid) { } ~MSQ(void); static PMSQ PmsqNew(void); bool FEnqueue(PMSND pmsnd, long objID, bool fLoop, bool fQueue, long vlm, long spr, bool fActr = fFalse, ulong dtsStart = 0, bool fLowPri = fFalse); void PlayMsq(void); // Destroys queue as it plays void FlushMsq(void); // Without playing the sounds bool FCmdAlarm(PCMD pcmd); // Sound on/off & duration control void SndOff(void) { AssertThis(0); _dtim = kdtimOffMsq; } void SndOnShort(void) { AssertThis(0); _dtim = kdtim2Msq; } void SndOnLong(void) { AssertThis(0); _dtim = kdtimLongMsq; } void StopAll(void) { if (pvNil != _pclok) _pclok->Stop(); StopAllMovieSounds(); } bool FPlaying(bool fLoop) { AssertThis(0); return (fLoop ? (vpsndm->FPlayingAll(sqnNil, sclLoopMidi) || vpsndm->FPlayingAll(sqnNil, sclLoopWav)) : vpsndm->FPlayingAll(sqnNil, sclNonLoop)); } // Save/Restore snd-on duration times long DtimSnd(void) { AssertThis(0); return _dtim; } void SndOnDtim(long dtim) { AssertThis(0); _dtim = dtim; } }; #endif MSND_H ================================================ FILE: inc/mtrl.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /************************************************************************* mtrl.h: Material and custom material classes Primary Author: ****** Review Status: REVIEWED - any changes to this file must be reviewed! BASE ---> BACO ---> MTRL BASE ---> BACO ---> CMTL *************************************************************************/ #ifndef MTRL_H #define MTRL_H // CMTL on File struct CMTLF { short bo; short osk; long ibset; // which body part set this CMTL attaches to }; const BOM kbomCmtlf = 0x5c000000; // material on file (MTRL chunk) struct MTRLF { short bo; // byte order short osk; // OS kind br_colour brc; // RGB color br_ufraction brufKa; // ambient component br_ufraction brufKd; // diffuse component br_ufraction brufKs; // specular component byte bIndexBase; // base of palette for this color byte cIndexRange; // count of entries in palette for this color BRS rPower; // specular exponent }; const BOM kbomMtrlf = 0x5D530000; /**************************************** The MTRL class. There are two kinds of MTRLs: solid-color MTRLs and texmap materials. Texmap MTRLs have TMAPs under the MTRL chunk with chid 0. ****************************************/ typedef class MTRL *PMTRL; #define MTRL_PAR BACO #define kclsMTRL 'MTRL' class MTRL : public MTRL_PAR { RTCLASS_DEC ASSERT MARKMEM protected: static PTMAP _ptmapShadeTable; // shade table for all MTRLs PBMTL _pbmtl; protected: MTRL(void) { _pbmtl = pvNil; } // can't instantiate directly; must use FReadMtrl bool _FInit(PCRF pcrf, CTG ctg, CNO cno); public: static bool FSetShadeTable(PCFL pcfl, CTG ctg, CNO cno); static PMTRL PmtrlNew(long iclrBase = ivNil, long cclr = ivNil); static bool FReadMtrl(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb); static PMTRL PmtrlNewFromPix(PFNI pfni); static PMTRL PmtrlNewFromBmp(PFNI pfni, PGL pglclr = pvNil); static PMTRL PmtrlFromBmtl(PBMTL pbmtl); ~MTRL(void); PTMAP Ptmap(void); PBMTL Pbmtl(void) { return _pbmtl; } bool FWrite(PCFL pcfl, CTG ctg, CNO *pcno); #ifdef DEBUG static void MarkShadeTable(void); #endif // DEBUG }; /**************************************** The CMTL (custom material) class This manages a set of materials to apply to a body part set ****************************************/ typedef class CMTL *PCMTL; #define CMTL_PAR BACO #define kclsCMTL 'CMTL' class CMTL : public CMTL_PAR { RTCLASS_DEC ASSERT MARKMEM protected: PMTRL *_prgpmtrl; // _cbprt PMTRLs, one per body part in this CMTL's set PMODL *_prgpmodl; // _cbprt PMODLs, one per body part in this CMTL's set long _cbprt; // count of body parts in this CMTL long _ibset; // body part set that this CMTL should be applied to protected: bool _FInit(PCRF pcrf, CTG ctg, CNO cno); CMTL(void) { } // can't instantiate directly; must use PcmtlRead public: static PCMTL PcmtlNew(long ibset, long cbprt, PMTRL *prgpmtrl); static bool FReadCmtl(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb); static bool FHasModels(PCFL pcfl, CTG ctg, CNO cno); static bool FEqualModels(PCFL pcfl, CNO cno1, CNO cno2); ~CMTL(void); PBMTL Pbmtl(long ibmtl); PMODL Pmodl(long imodl); long Ibset(void) { return _ibset; } long Cbprt(void) { return _cbprt; } bool FHasModels(void); }; #endif // !MTRL_H ================================================ FILE: inc/popup.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** popup.h: Popup menu classes Primary Author: ****** MPFNT: ****** Review Status: REVIEWED - any changes to this file must be reviewed! BASE ---> CMH ---> GOB ---> GOK ---> BRWD ---> BRWL ---> MP | +------> BRWT ---> MPFNT ***************************************************************************/ #ifndef POPUP_H #define POPUP_H /************************************ MP - Generic popup menu class *************************************/ #define MP_PAR BRWL #define kclsMP 'MP' typedef class MP *PMP; class MP : public MP_PAR { ASSERT MARKMEM RTCLASS_DEC CMD_MAP_DEC(MP) protected: long _cid; // cid to enqueue to apply selection PCMH _pcmh; // command handler to enqueue command to protected: virtual void _ApplySelection(long ithumSelect, long sid); virtual long _IthumFromThum(long thumSelect, long sidSelect); MP(PGCB pgcb) : MP_PAR(pgcb) { } bool _FInit(PRCA prca); public: static PMP PmpNew(long kidParent, long kidMenu, PRCA prca, PCMD pcmd, BWS bws, long ithumSelect, long sidSelect, CKI ckiRoot, CTG ctg, PCMH pcmh, long cid, bool fMoveTop); virtual bool FCmdSelIdle(PCMD pcmd); }; /************************************ MPFNT - Font popup menu class *************************************/ #define MPFNT_PAR BRWT #define kclsMPFNT 'mpft' typedef class MPFNT *PMPFNT; class MPFNT : public MPFNT_PAR { ASSERT MARKMEM RTCLASS_DEC CMD_MAP_DEC(MPFNT) protected: void _AdjustRc(long cthum, long cfrm); virtual void _ApplySelection(long ithumSelect, long sid); virtual bool _FSetThumFrame(long istn, PGOB pgobPar); MPFNT(PGCB pgcb) : MPFNT_PAR(pgcb) { } public: static PMPFNT PmpfntNew(PRCA prca, long kidParent, long kidMenu, PCMD pcmd, long ithumSelect, PGST pgst); virtual bool FCmdSelIdle(PCMD pcmd); }; #endif // POPUP_H ================================================ FILE: inc/portf.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Portfolio related includes. Primary Author: ****** Review Status: Not yet reviewed ***************************************************************************/ // Top level portoflio routines. bool FPortGetFniMovieOpen(FNI *pfni); bool FPortDisplayWithIds(FNI *pfni, bool fOpen, long lFilterLabel, long lFilterExt, long lTitle, LPTSTR lpstrDefExt, PSTN pstnDefFileName, FNI *pfniInitialDir, ulong grfPrevType, CNO cnoWave); bool FPortGetFniOpen(FNI *pfni, LPTSTR lpstrFilter, LPTSTR lpstrTitle, FNI *pfniInitialDir, ulong grfPrevType, CNO cnoWave); bool FPortGetFniSave(FNI *pfni, LPTSTR lpstrFilter, LPTSTR lpstrTitle, LPTSTR lpstrDefExt, PSTN pstnDefFileName, ulong grfPrevType, CNO cnoWave); UINT CALLBACK OpenHookProc(HWND hWnd, UINT msg, UINT wParam, LONG lParam); void OpenPreview(HWND hwnd, PGNV pgnvOff, RCS *prcsPreview); void RepaintPortfolio(HWND hwndCustom); static WNDPROC lpBtnProc; LRESULT CALLBACK SubClassBtnProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); static WNDPROC lpPreviewProc; LRESULT CALLBACK SubClassPreviewProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); static WNDPROC lpDlgProc; LRESULT CALLBACK SubClassDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); typedef struct dlginfo { bool fIsOpen; // fTrue if Open file, (ie not Save file) bool fDrawnBkgnd; // fTrue if portfolio background bitmap has been displayed. RCS rcsDlg; // Initial size of the portfolio common dlg window client area. ulong grfPrevType; // Bits for types of preview required, (eg movie, sound etc) == 0 if no preview CNO cnoWave; // Wave file cno for audio when portfolio is invoked. } DLGINFO; typedef DLGINFO *PDLGINFO; enum { fpfNil = 0x0000, fpfPortPrevMovie = 0x0001, fpfPortPrevSound = 0x0002, fpfPortPrevTexture = 0x0004 }; ================================================ FILE: inc/pos3.chh ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // New #defines for all positions // // Supersedes stdiopos.chh AND pos2.chh // GENERIC BROWSER ------------------------------------------------------------ #define kxpBrwsPageNumWidth 64 #define kypBrwsPageNumHeight 29 #define kxpregGenericCancel 0 #define kypregGenericCancel 48 #define kxpregGenericOk 0 #define kypregGenericOk 48 // ACTION BROWSER ------------------------------------------------------------ #define kxpBrwsAction 62 #define kypBrwsAction 100 #define kxpregBrwsAction 0 #define kypregBrwsAction 0 #define kxpBrwsActionPrevLeft 312 #define kypBrwsActionPrevTop 12 #define kxpBrwsActionPrevRight 496 #define kypBrwsActionPrevBottom 282 #define kxpBrwsActionBackCel 447 #define kypBrwsActionBackCel 290 #define kxpregBrwsActionBackCel 0 #define kypregBrwsActionBackCel 0 #define kxpBrwsActionFwdCel 475 #define kypBrwsActionFwdCel 290 #define kxpregBrwsActionFwdCel 0 #define kypregBrwsActionFwdCel 0 #define kxpregBrwsActionFrame 0 #define kypregBrwsActionFrame 0 #define kxpregBrwsActionPrev 0 #define kypregBrwsActionPrev 0 #define kdxpAction 516 #define kdypAction 372 #define kdxpActionLeft 15 #define kdxpActionRight 206 #define kdypActionTop 32 #define kdypActionBottom 57 #define kdxpActionSpacing 5 #define kdypActionSpacing 3 #define kdxpActionFrame 138 #define kdypActionFrame 25 #define kdxpActionFrameBorder 6 #define kdypActionFrameBorder 4 #define kxpActionPageFwd 204 #define kypActionPageFwd 320 #define kxpActionPageBack 54 #define kypActionPageBack 320 #define kxpActionPageNum 123 #define kypActionPageNum 330 #define kxpActionOk 431 #define kypActionOk 368 #define kxpActionCancel 381 #define kypActionCancel 368 // ACTOR BROWSER ------------------------------------------------------------ #define kxpBrwsActor 62 #define kypBrwsActor 47 #define kxpregBrwsActor 0 #define kypregBrwsActor 0 #define kdxpActor 516 #define kdypActor 372 #define kdxpActorLeft 30 #define kdxpActorRight 30 #define kdypActorTop 38 #define kdypActorBottom 58 #define kdxpActorSpacing 14 #define kdypActorSpacing 14 #define kdxpActorFrame 80 #define kdypActorFrame 80 #define kdxpActorFrameBorder 4 #define kdypActorFrameBorder 4 #define kxpActorPageFwd 304 #define kypActorPageFwd 322 #define kxpActorPageBack 155 #define kypActorPageBack 322 #define kxpActorPageNum 228 #define kypActorPageNum 332 #define kxpActorCancel 437 #define kypActorCancel 368 #define kxpregBrwsActorFrame 0 #define kypregBrwsActorFrame 0 // PROP BROWSER ------------------------------------------------------------ #define kxpBrwsProp 62 #define kypBrwsProp 47 #define kxpregBrwsProp 0 #define kypregBrwsProp 0 #define kdxpProp 516 #define kdypProp 372 #define kdxpPropLeft 30 #define kdxpPropRight 30 #define kdypPropTop 38 #define kdypPropBottom 58 #define kdxpPropSpacing 14 #define kdypPropSpacing 14 #define kdxpPropFrame 80 #define kdypPropFrame 80 #define kdxpPropFrameBorder 4 #define kdypPropFrameBorder 4 #define kxpPropPageFwd 304 #define kypPropPageFwd 322 #define kxpPropPageBack 155 #define kypPropPageBack 322 #define kxpPropPageNum 228 #define kypPropPageNum 332 #define kxpPropCancel 437 #define kypPropCancel 368 #define kxpregBrwsPropFrame 0 #define kypregBrwsPropFrame 0 // SETTINGS/SCENE BROWSER ------------------------------------------------------------ #define kxpBrwsBackground 320 #define kypBrwsBackground 418 #define kxpregBrwsBackground 258 #define kypregBrwsBackground 370 #define kdxpScene 516 #define kdypScene 372 #define kdxpSceneLeft 40 #define kdxpSceneRight 40 #define kdypSceneTop 40 #define kdypSceneBottom 58 #define kdxpSceneSpacing 14 #define kdypSceneSpacing 9 #define kdxpSceneFrame 136 #define kdypSceneFrame 78 #define kdxpSceneFrameBorder 4 #define kdypSceneFrameBorder 4 #define kxpScenePageFwd 303 #define kypScenePageFwd 320 #define kxpScenePageBack 155 #define kypScenePageBack 320 #define kxpScenePageNum 226 #define kypScenePageNum 330 #define kxpSceneCancel 437 #define kypSceneCancel 368 #define kxpregBrwsSceneFrame 0 #define kypregBrwsSceneFrame 0 // SETTINGS/SCENE BROWSER ------------------------------------------------------------ #define kxpBrwsCamera 62 #define kypBrwsCamera 100 #define kxpregBrwsCamera 0 #define kypregBrwsCamera 0 #define kdxpCamera 516 #define kdypCamera 372 #define kdxpCameraLeft 40 #define kdxpCameraRight 40 #define kdypCameraTop 40 #define kdypCameraBottom 58 #define kdxpCameraSpacing 14 #define kdypCameraSpacing 9 #define kdxpCameraFrame 136 #define kdypCameraFrame 78 #define kdxpCameraFrameBorder 4 #define kdypCameraFrameBorder 4 #define kxpCameraPageFwd 303 #define kypCameraPageFwd 320 #define kxpCameraPageBack 155 #define kypCameraPageBack 320 #define kxpCameraPageNum 226 #define kypCameraPageNum 330 #define kxpCameraCancel 437 #define kypCameraCancel 368 #define kxpregBrwsCameraFrame 0 #define kypregBrwsCameraFrame 0 // TEXT BROWSER --------------------------------------------------------------- #define kxpBrwsTextCreate 132 #define kypBrwsTextCreate 48 #define kxpregBrwsTextCreate 0 #define kypregBrwsTextCreate 0 #define kxpCTextsStory 42 #define kypCTextsStory 49 #define kxpregCTextsStory 0 #define kypregCTextsStory 0 #define kxpCTextsScroll 197 #define kypCTextsScroll 48 #define kxpregCTextsScroll 0 #define kypregCTextsScroll 0 #define kxpCTextsCancel 298 #define kypCTextsCancel 205 // SOUND: MUSIC, SOUNDFX and SPEECH BROWSERS --------------------------------- // all sound browsers use the following: music + stuff is bogus. #define kxpBrwsSoundsBackground 62 #define kypBrwsSoundsBackground 48 #define kxpregBrwsSoundsBackground 0 #define kypregBrwsSoundsBackground 0 #define kxpBrwsImportBackground 62 #define kypBrwsImportBackground 48 #define kxpregBrwsImportBackground 0 #define kypregBrwsImportBackground 0 #define kxpMusicBackground 62 #define kypMusicBackground 48 #define kxpregMusicBackground 0 #define kypregMusicBackground 0 #define kxpEfxBackground 62 #define kypEfxBackground 48 #define kxpregEfxBackground 0 #define kypregEfxBackground 0 #define kxpRecordingsBackground 62 #define kypRecordingsBackground 48 #define kxpregRecordingsBackground 0 #define kypregRecordingsBackground 0 #define kxpBrwsSoundsRecord 62 #define kypBrwsSoundsRecord 48 #define kxpregBrwsSoundsRecord 0 #define kypregBrwsSoundsRecord 0 #define kdxpSound 516 #define kdypSound 372 #define kdxpSoundLeft 31 #define kdxpSoundRight 31 #define kdypSoundTop 34 #define kdypSoundBottom 50 #define kdxpSoundSpacing 20 #define kdypSoundSpacing 3 #define kdxpSoundFrame 138 #define kdypSoundFrame 25 #define kdxpSoundFrameBorder 6 #define kdypSoundFrameBorder 4 #define kxpSoundPageFwd 303 #define kypSoundPageFwd 320 #define kxpSoundPageBack 154 #define kypSoundPageBack 320 #define kxpSoundPageNum 230 #define kypSoundPageNum 331 #define kxpSoundOk 437 #define kypSoundOk 368 #define kxpSoundCancel 387 #define kypSoundCancel 368 #define kxpBrowserRecord 54 #define kypBrowserRecord 368 #define kxpregBrowserRecord 25 #define kypregBrowserRecord 48 #define kxpBrowserImport 104 #define kypBrowserImport 368 #define kxpregBrowserImport 25 #define kypregBrowserImport 48 // Sound import browser #define kdxpImportFrame 138 #define kdypImportFrame 25 #define kdxpImportFrameBorder 6 #define kdypImportFrameBorder 4 #define kxpImportPageFwd 303 #define kypImportPageFwd 320 #define kxpImportPageBack 154 #define kypImportPageBack 320 #define kxpImportOk 437 #define kypImportOk 368 #define kxpImportCancel 387 #define kypImportCancel 368 #define kxpImportPageNum 230 #define kypImportPageNum 331 #define kxpImportPageNumWidth 64 #define kypImportPageNumHeight 29 // STUDIO MASTER CONTROLS --------------------------------------------------------------- #define kxpHelpAnchor 591 #define kypHelpAnchor 405 #define kxpregHelpAnchor 0 #define kypregHelpAnchor 0 #define kxpFps -10 #define kypFps 0 #define kxpPlay 314 #define kypPlay 414 #define kxpregPlay 13 #define kypregPlay 0 #define kdypVolumeSlider 35 // Height of volume slider #define kxpVolumeThumb 6 #define kypVolumeThumb 6 #define kxpregVolumeThumb 6 #define kypregVolumeThumb 6 #define kxpVolumeSlider 345 #define kypVolumeSlider 414 #define kxpregVolumeSlider 14 #define kypregVolumeSlider 0 #define kxpUndo 397 #define kypUndo 411 #define kxpregUndo 26 #define kypregUndo 0 #define kxpCutCopyPaste 450 #define kypCutCopyPaste 411 #define kxpregCutCopyPaste 26 #define kypregCutCopyPaste 0 #define kxpPortfolio 507 #define kypPortfolio 411 #define kxpregPortfolio 26 #define kypregPortfolio 0 #define kxpBook 560 #define kypBook 411 #define kxpregBook 26 #define kypregBook 0 #define kxpMap 613 #define kypMap 411 #define kxpregMap 26 #define kypregMap 0 #define kxpExit 597 #define kypExit 466 #define kxpregExit 13 #define kypregExit 0 #define kxpName 28 #define kypName 464 #define kxpregName 0 #define kypregName 0 // SCENE and FRAME SLIDERS --------------------------------------------------- #define kxpFrameBackground 0 #define kypFrameBackground 410 #define kxpregFrameBackground 0 #define kypregFrameBackground 0 #define kxpFrameFW 251 #define kypFrameFW 4 #define kxpregFrameFW 11 #define kypregFrameFW 0 #define kxpFrameFWEnd 273 #define kypFrameFWEnd 4 #define kxpregFrameFWEnd 11 #define kypregFrameFWEnd 0 #define kxpFrameRW 141 #define kypFrameRW 4 #define kxpregFrameRW 11 #define kypregFrameRW 0 #define kxpFrameRWEnd 119 #define kypFrameRWEnd 4 #define kxpregFrameRWEnd 11 #define kypregFrameRWEnd 0 #define kxpFrameScrollbar 151 #define kypFrameScrollbar 0 #define kxpregFrameScrollbar 0 #define kypregFrameScrollbar 0 #define kxpFrameThumb 0 #define kypFrameThumb 2 #define kxpregFrameThumb 0 #define kypregFrameThumb 0 #define kxpFrameTitle 2 #define kypFrameTitle 2 #define kxpregFrameTitle 0 #define kypregFrameTitle 0 #define kxpFrameText 55 #define kypFrameText 2 #define kxpregFrameText 0 #define kypregFrameText 0 #define kxpSceneBackground 0 #define kypSceneBackground 433 #define kxpregSceneBackground 0 #define kypregSceneBackground 0 #define kxpSceneFW 251 #define kypSceneFW 6 #define kxpregSceneFW 11 #define kypregSceneFW 0 #define kxpSceneFWEnd 273 #define kypSceneFWEnd 6 #define kxpregSceneFWEnd 11 #define kypregSceneFWEnd 0 #define kxpSceneRW 141 #define kypSceneRW 6 #define kxpregSceneRW 11 #define kypregSceneRW 0 #define kxpSceneRWEnd 119 #define kypSceneRWEnd 6 #define kxpregSceneRWEnd 11 #define kypregSceneRWEnd 0 #define kxpSceneScrollbar 151 #define kypSceneScrollbar 1 #define kxpregSceneScrollbar 0 #define kypregSceneScrollbar 0 #define kxpSceneThumb 0 #define kypSceneThumb 2 #define kxpregSceneThumb 0 #define kypregSceneThumb 0 #define kxpSceneTitle 2 #define kypSceneTitle 3 #define kxpregSceneTitle 0 #define kypregSceneTitle 0 #define kxpSceneText 55 #define kypSceneText 2 #define kxpregSceneText 0 #define kypregSceneText 0 // PORTFOLIO POPUP ----------------------------------------------------------- #define kxpPortsBackgroundLeft 477 #define kypPortsBackgroundTop 198 #define kxpPortsBackgroundRight 589 #define kypPortsBackgroundBottom 406 #define kxpPortsNew 0 #define kypPortsNew 52 #define kxpregPortsNew 0 #define kypregPortsNew 52 #define kxpPortsPortfolio 0 #define kypPortsPortfolio 104 #define kxpregPortsPortfolio 0 #define kypregPortsPortfolio 52 #define kxpPortsSave 0 #define kypPortsSave 156 #define kxpregPortsSave 0 #define kypregPortsSave 52 #define kxpPortsSaveAs 0 #define kypPortsSaveAs 208 #define kxpregPortsSaveAs 0 #define kypregPortsSaveAs 52 // CUT, COPY PASTE POPUP ----------------------------------------------------- #define kxpCCPBackgroundLeft 224 #define kypCCPBackgroundTop 354 #define kxpCCPBackgroundRight 470 #define kypCCPBackgroundBottom 406 #define kxpCCPCut 24 #define kypCCPCut 0 #define kxpregCCPCut 24 #define kypregCCPCut 0 #define kxpCCPCopy 73 #define kypCCPCopy 0 #define kxpregCCPCopy 24 #define kypregCCPCopy 0 #define kxpCCPCopyRoute 122 #define kypCCPCopyRoute 0 #define kxpregCCPCopyRoute 24 #define kypregCCPCopyRoute 0 #define kxpCCPPaste 171 #define kypCCPPaste 0 #define kxpregCCPPaste 24 #define kypregCCPPaste 0 #define kxpCCPActorNuke 220 #define kypCCPActorNuke 0 #define kxpregCCPActorNuke 24 #define kypregCCPActorNuke 0 // ROLL CALLS ---------------------------------------------------------------- #define kxpRollCallActorLeft 3 #define kypRollCallActorTop 98 #define kxpRollCallActorRight 46 #define kypRollCallActorBottom 411 #define kxpRollCallPropLeft 594 #define kypRollCallPropTop 98 #define kxpRollCallPropRight 640 #define kypRollCallPropBottom 411 #define kdxpRollCallActorBorderLeft 0 #define kdypRollCallActorBorderTop 0 #define kdypRollCallActorBorder 74 #define kdypRollCallActorSpacing 0 #define kdxpRollCallActorLeft 2 #define kdypRollCallActorTop 2 #define kdxpRollCallActorRight 38 #define kdypRollCallActorBottom 70 #define kxpRollCallActorPageUp 0 #define kypRollCallActorPageUp 296 #define kxpRollCallActorPageDown 20 #define kypRollCallActorPageDown 296 #define kdxpRollCallActorFrameBorder 0 #define kdypRollCallActorFrameBorder 0 #define kdxpRollCallPropBorderLeft 0 #define kdypRollCallPropBorderTop 0 #define kdypRollCallPropBorder 74 #define kdypRollCallPropSpacing 0 #define kdxpRollCallPropLeft 2 #define kdypRollCallPropTop 2 #define kdxpRollCallPropRight 38 #define kdypRollCallPropBottom 70 #define kxpRollCallPropPageUp 0 #define kypRollCallPropPageUp 296 #define kxpRollCallPropPageDown 20 #define kypRollCallPropPageDown 296 #define kdxpRollCallPropFrameBorder 0 #define kdypRollCallPropFrameBorder 0 #define kxpregRollCallActorBorder1 0 #define kypregRollCallActorBorder1 0 #define kxpregRollCallActorBorder2 0 #define kypregRollCallActorBorder2 0 #define kxpregRollCallActorBorder3 0 #define kypregRollCallActorBorder3 0 #define kxpregRollCallActorBorder4 0 #define kypregRollCallActorBorder4 0 #define kxpregRollCallPropBorder1 0 #define kypregRollCallPropBorder1 0 #define kxpregRollCallPropBorder2 0 #define kypregRollCallPropBorder2 0 #define kxpregRollCallPropBorder3 0 #define kypregRollCallPropBorder3 0 #define kxpregRollCallPropBorder4 0 #define kypregRollCallPropBorder4 0 #define kxpregRollCallActorUp 0 #define kypregRollCallActorUp 0 #define kxpregRollCallActorDown 0 #define kypregRollCallActorDown 0 #define kxpregRollCallPropUp 0 #define kypregRollCallPropUp 0 #define kxpregRollCallPropDown 0 #define kypregRollCallPropDown 0 // RECORDER EASEL ------------------------------------------------------------ #define kxpRecordBackground 202 #define kypRecordBackground 154 #define kxpRecordSoundLengthLeft 22 #define kypRecordSoundLengthTop 30 #define kxpRecordSoundLengthRight 214 #define kypRecordSoundLengthBottom 51 #define kxpRecordSoundNameLeft 123 #define kypRecordSoundNameTop 75 #define kxpRecordSoundNameRight 232 #define kypRecordSoundNameBottom 95 #define kxpRecordRecord 36 #define kypRecordRecord 165 #define kxpregRecordRecord 25 #define kypregRecordRecord 50 #define kxpRecordPlay 88 #define kypRecordPlay 165 #define kxpregRecordPlay 25 #define kypregRecordPlay 50 #define kxpRecordCancel 152 #define kypRecordCancel 165 #define kxpregRecordCancel 25 #define kypregRecordCancel 50 #define kxpRecordOk 202 #define kypRecordOk 165 #define kxpregRecordOk 25 #define kypregRecordOk 50 // SCENE BANK TOOLS ---------------------------------------------------------- #define kxpSettingsCover 49 #define kypSettingsCover 41 #define kxpregSettingsCover 49 #define kypregSettingsCover 41 #define kxpSettingsBrowser 51 #define kypSettingsBrowser 42 #define kxpregSettingsBrowser 33 #define kypregSettingsBrowser 41 #define kxpSettingsCameras 224 #define kypSettingsCameras 48 #define kxpregSettingsCameras 25 #define kypregSettingsCameras 46 #define kxpCCPSceneChopBack 281 #define kypCCPSceneChopBack 48 #define kxpregCCPSceneChopBack 25 #define kypregCCPSceneChopBack 46 #define kxpCCPSceneChopFwd 340 #define kypCCPSceneChopFwd 48 #define kxpregCCPSceneChopFwd 25 #define kypregCCPSceneChopFwd 46 #define kxpSceneSorter 415 #define kypSceneSorter 48 #define kxpregSceneSorter 25 #define kypregSceneSorter 46 // ACTOR BANK TOOLS ---------------------------------------------------------- // cover + primary tools #define kxpActorsCover 211 #define kypActorsCover 41 #define kxpregActorsCover 111 #define kypregActorsCover 41 #define kxpActorsBrowser 147 #define kypActorsBrowser 42 #define kxpregActorsBrowser 33 #define kypregActorsBrowser 41 #define kxpActorsPropBrowser 213 #define kypActorsPropBrowser 42 #define kxpregActorsPropBrowser 33 #define kypregActorsPropBrowser 41 #define kxpActorsSpletters 279 #define kypActorsSpletters 42 #define kxpregActorsSpletters 33 #define kypregActorsSpletters 41 // secondary tools #define kxpActorsCompose 66 #define kypActorsCompose 47 #define kxpregActorsCompose 25 #define kypregActorsCompose 46 #define kxpActorsActionBrowser 123 #define kypActorsActionBrowser 47 #define kxpregActorsActionBrowser 25 #define kypregActorsActionBrowser 46 #define kxpActorsContinue 180 #define kypActorsContinue 47 #define kxpregActorsContinue 25 #define kypregActorsContinue 46 #define kxpActorsCostume 236 #define kypActorsCostume 47 #define kxpregActorsCostume 25 #define kypregActorsCostume 46 #define kxpActorsRotate 293 #define kypActorsRotate 47 #define kxpregActorsRotate 25 #define kypregActorsRotate 46 #define kxpActorsXY 343 #define kypActorsXY 47 #define kxpregActorsXY 18 #define kypregActorsXY 46 #define kxpActorsGround 410 #define kypActorsGround 47 #define kxpregActorsGround 18 #define kypregActorsGround 46 #define kxpActorsTransform 460 #define kypActorsTransform 47 #define kxpregActorsTransform 25 #define kypregActorsTransform 46 #define kxpActorsSooner 517 #define kypActorsSooner 47 #define kxpregActorsSooner 25 #define kypregActorsSooner 46 #define kxpActorsBiography 574 #define kypActorsBiography 47 #define kxpregActorsBiography 25 #define kypregActorsBiography 46 #define kxpActorsSoonerButton 283 #define kypActorsSoonerButton 376 #define kxpregActorsSoonerButton 36 #define kypregActorsSoonerButton 0 #define kxpActorsLaterButton 356 #define kypActorsLaterButton 376 #define kxpregActorsLaterButton 36 #define kypregActorsLaterButton 0 // actor pop downs #define kxpTransformBackground 460 #define kypTransformBackground 227 #define kxpregTransformBackground 23 #define kypregTransformBackground 130 #define kxpActorsShrink 0 #define kypActorsShrink 42 #define kxpregActorsShrink 0 #define kypregActorsShrink 42 #define kxpActorsSquash 0 #define kypActorsSquash 86 #define kxpregActorsSquash 0 #define kypregActorsSquash 42 #define kxpActorsTransformNorm 0 #define kypActorsTransformNorm 130 #define kxpregActorsTransformNorm 0 #define kypregActorsTransformNorm 42 #define kxpRotateBackground 293 #define kypRotateBackground 271 #define kxpregRotateBackground 23 #define kypregRotateBackground 174 #define kxpActorsRotateX 46 #define kypActorsRotateX 21 #define kxpregActorsRotateX 46 #define kypregActorsRotateX 21 #define kxpActorsRotateY 46 #define kypActorsRotateY 65 #define kxpregActorsRotateY 46 #define kypregActorsRotateY 21 #define kxpActorsRotateZ 46 #define kypActorsRotateZ 109 #define kxpregActorsRotateZ 46 #define kypregActorsRotateZ 21 #define kxpActorsRotateNorm 46 #define kypActorsRotateNorm 153 #define kxpregActorsRotateNorm 46 #define kypregActorsRotateNorm 21 // SOUND TOOLS --------------------------------------------------------------- // covers + primary tools #define kxpSoundsCover 433 #define kypSoundsCover 41 #define kxpregSoundsCover 110 #define kypregSoundsCover 41 #define kxpSoundsEfxBrowser 367 #define kypSoundsEfxBrowser 42 #define kxpregSoundsEfxBrowser 33 #define kypregSoundsEfxBrowser 41 #define kxpSoundsMicBrowser 433 #define kypSoundsMicBrowser 42 #define kxpregSoundsMicBrowser 33 #define kypregSoundsMicBrowser 41 #define kxpSoundsMusicBrowser 499 #define kypSoundsMusicBrowser 42 #define kxpregSoundsMusicBrowser 33 #define kypregSoundsMusicBrowser 41 // secondary tools #define kxpSoundsPlayOnce 201 #define kypSoundsPlayOnce 47 #define kxpregSoundsPlayOnce 25 #define kypregSoundsPlayOnce 46 #define kxpSoundsLooping 259 #define kypSoundsLooping 47 #define kxpregSoundsLooping 25 #define kypregSoundsLooping 46 #define kxpSoundsListen 317 #define kypSoundsListen 47 #define kxpregSoundsListen 25 #define kypregSoundsListen 46 #define kxpSoundsAttachToCell 395 #define kypSoundsAttachToCell 47 #define kxpregSoundsAttachToCell 25 #define kypregSoundsAttachToCell 46 #define kxpPausesSound 446 #define kypPausesSound 47 #define kxpregPausesSound 18 #define kypregPausesSound 46 // WORD TOOLS ---------------------------------------------------------------- // word tools - primary bank #define kxpTextsCover 592 #define kypTextsCover 41 #define kxpregTextsCover 49 #define kypregTextsCover 41 #define kxpTextsCreate 593 #define kypTextsCreate 42 #define kxpregTextsCreate 33 #define kypregTextsCreate 41 // word tools - secondary bank #define kxpTextsSelect 137 #define kypTextsSelect 47 #define kxpregTextsSelect 25 #define kypregTextsSelect 46 #define kxpTextsFont 195 #define kypTextsFont 47 #define kxpregTextsFont 25 #define kypregTextsFont 46 #define kxpTextsFontShape 253 #define kypTextsFontShape 47 #define kxpregTextsFontShape 25 #define kypregTextsFontShape 46 #define kxpTextsFontSize 311 #define kypTextsFontSize 47 #define kxpregTextsFontSize 25 #define kypregTextsFontSize 46 #define kxpTextsFontColor 369 #define kypTextsFontColor 47 #define kxpregTextsFontColor 25 #define kypregTextsFontColor 46 #define kxpTextsBkgdColor 444 #define kypTextsBkgdColor 47 #define kxpregTextsBkgdColor 25 #define kypregTextsBkgdColor 46 #define kxpTextsScrollType 502 #define kypTextsScrollType 47 #define kxpregTextsScrollType 25 #define kypregTextsScrollType 46 // word tool popdowns #define kxpTextFontBackground 220 #define kypTextFontBackground 333 #define kxpregTextFontBackground 80 #define kypregTextFontBackground 236 #define kxpTextsScroll 0 #define kypTextsScroll 44 #define kxpregTextsScroll 0 #define kypregTextsScroll 44 #define kxpTextsStory 0 #define kypTextsStory 88 #define kxpregTextsStory 0 #define kypregTextsStory 44 #define kxpScrollBackgroundLeft 480 #define kypScrollBackgroundTop 100 #define kxpScrollBackgroundRight 526 #define kxpScrollBackgroundBottom 188 // Text formatting popdowns // Fonts #define kdxpTextFont 160 #define kdypTextFont 238 #define kxpTextFontLeft 172 #define kypTextFontTop 100 #define kxpTextFontRight 332 #define kypTextFontBottom 338 #define kdxpTextFontLeft 0 #define kdxpTextFontRight 0 #define kdypTextFontTop 0 #define kdypTextFontBottom 18 #define kdxpTextFontBorder 0 #define kdypTextFontBorder 0 #define kdxpTextFontSpacing 0 #define kdypTextFontSpacing 0 #define kdxpTextFontFrame 160 #define kdypTextFontFrame 22 #define kdxpTextFontFrameBorder 16 #define kdypTextFontFrameBorder 1 #define kxpTextFontPageDown 0 #define kypTextFontPageDown 219 #define kxpregTextFontPageDown 0 #define kypregTextFontPageDown 0 #define kxpTextFontPageUp 80 #define kypTextFontPageUp 219 #define kxpregTextFontPageUp 0 #define kypregTextFontPageUp 0 // // // Texts Style popdown // // #define kdxpTextStyle 170 #define kdypTextStyle 90 #define kxpTextStyleLeft 230 #define kypTextStyleTop 100 #define kxpTextStyleRight 390 #define kypTextStyleBottom 304 #define kdxpTextStyleLeft 0 #define kdxpTextStyleRight 0 #define kdypTextStyleTop 0 #define kdypTextStyleBottom 0 #define kdxpTextStyleBorder 0 #define kdypTextStyleBorder 0 #define kdxpTextStyleSpacing 0 #define kdypTextStyleSpacing 0 #define kdxpTextStyleFrame 160 #define kdypTextStyleFrame 22 #define kdxpTextStyleFrameBorder 16 #define kdypTextStyleFrameBorder 3 // 6 //#define kdypTextStyleFrameBorder 6 #define kxpTextStylePageDown 0 #define kypTextStylePageDown 157 #define kxpregTextStylePageDown 0 #define kypregTextStylePageDown 0 #define kxpTextStylePageUp 84 #define kypTextStylePageUp 157 #define kxpregTextStylePageUp 0 #define kypregTextStylePageUp 0 // // // Texts Size popdown // // #define kdxpTextSize 160 #define kdypTextSize 300 #define kxpTextSizeLeft 288 #define kypTextSizeTop 100 #define kxpTextSizeRight 448 #define kypTextSizeBottom 400 #define kdxpTextSizeLeft 0 #define kdxpTextSizeRight 0 #define kdypTextSizeTop 0 #define kdypTextSizeBottom 19 #define kdxpTextSizeBorder 15 #define kdypTextSizeBorder 0 #define kdxpTextSizeSpacing 0 #define kdypTextSizeSpacing 0 #define kdxpTextSizeFrame 160 #define kdypTextSizeFrame 40 #define kdxpTextSizeFrameBorder 16 #define kdypTextSizeFrameBorder 4 #define kxpTextSizePageDown 50 #define kypTextSizePageDown 133 #define kxpregTextSizePageDown 0 #define kypregTextSizePageDown 0 #define kxpTextSizePageUp 86 #define kypTextSizePageUp 133 #define kxpregTextSizePageUp 0 #define kypregTextSizePageUp 0 // // // Texts Color popdown // // #define kdxpTextColor 102 #define kdypTextColor 195 #define kxpTextColorLeft 346 #define kypTextColorTop 100 #define kxpTextColorRight 448 #define kypTextColorBottom 295 #define kdxpTextColorLeft 0 #define kdxpTextColorRight 0 #define kdypTextColorTop 0 #define kdypTextColorBottom 19 #define kdxpTextColorBorder 0 #define kdypTextColorBorder 0 #define kdxpTextColorSpacing 0 #define kdypTextColorSpacing 0 #define kdxpTextColorFrame 102 #define kdypTextColorFrame 22 #define kdxpTextColorFrameBorder 4 #define kdypTextColorFrameBorder 4 #define kxpTextColorPageDown 0 #define kypTextColorPageDown 176 #define kxpregTextColorPageDown 0 #define kypregTextColorPageDown 0 #define kxpTextColorPageUp 51 #define kypTextColorPageUp 176 #define kxpregTextColorPageUp 0 #define kypregTextColorPageUp 0 // // // Texts Background Color popdown // // #define kdxpTextBkgdColor 170 #define kdypTextBkgdColor 200 #define kxpTextBkgdColorLeft 421 #define kypTextBkgdColorTop 100 #define kxpTextBkgdColorRight 591 #define kypTextBkgdColorBottom 300 #define kdxpTextBkgdColorLeft 0 #define kdxpTextBkgdColorRight 0 #define kdypTextBkgdColorTop 0 #define kdypTextBkgdColorBottom 19 #define kdxpTextBkgdColorBorder 0 #define kdypTextBkgdColorBorder 0 #define kdxpTextBkgdColorSpacing 0 #define kdypTextBkgdColorSpacing 0 #define kdxpTextBkgdColorFrame 102 #define kdypTextBkgdColorFrame 22 #define kdxpTextBkgdColorFrameBorder 4 #define kdypTextBkgdColorFrameBorder 4 #define kxpTextBkgdColorPageDown 0 #define kypTextBkgdColorPageDown 179 #define kxpregTextBkgdColorPageDown 0 #define kypregTextBkgdColorPageDown 0 #define kxpTextBkgdColorPageUp 51 #define kypTextBkgdColorPageUp 179 #define kxpregTextBkgdColorPageUp 0 #define kypregTextBkgdColorPageUp 0 // MISCELLANOUS COVERS; DOORS ------------------------------------------------- #define kxpScrollbarsCover 181 #define kypScrollbarsCover 464 #define kxpregScrollbarsCover 181 #define kypregScrollbarsCover 54 #define kxpUndosCover 419 #define kypUndosCover 464 #define kxpregUndosCover 55 #define kypregUndosCover 54 #define kxpBooksCover 500 #define kypBooksCover 464 #define kxpregBooksCover 26 #define kypregBooksCover 54 #define kxpDoors 0 #define kypDoors 47 #define kxpregDoors 0 #define kypregDoors 0 // SPLETTERS EASEL ----------------------------------------------------------- #define kxpSpltPreviewFrameLeft 13 #define kypSpltPreviewFrameTop 13 #define kxpSpltPreviewFrameRight 505 #define kypSpltPreviewFrameBottom 251 #define kxpSpltEditBoxLeft 10 #define kypSpltEditBoxTop 322 #define kxpSpltEditBoxRight 508 #define kypSpltEditBoxBottom 356 #define kxpSpltBackground 320 #define kypSpltBackground 421 #define kxpregSpltBackground 259 #define kypregSpltBackground 364 #define kxpSpltTransmogrify 211 #define kypSpltTransmogrify 311 #define kxpregSpltTransmogrify 25 #define kypregSpltTransmogrify 46 #define kxpSpltTextures 161 #define kypSpltTextures 311 #define kxpregSpltTextures 25 #define kypregSpltTextures 46 #define kxpSpltFont 61 #define kypSpltFont 311 #define kxpregSpltFont 25 #define kypregSpltFont 46 #define kxpSpltShape 111 #define kypSpltShape 311 #define kxpregSpltShape 25 #define kypregSpltShape 46 #define kxpSpltRotate 284 #define kypSpltRotate 311 #define kxpregSpltRotate 25 #define kypregSpltRotate 46 #define kxpSpltImportTexture 334 #define kypSpltImportTexture 311 #define kxpregSpltImportTexture 25 #define kypregSpltImportTexture 46 #define kxpSpltCancel 407 #define kypSpltCancel 311 #define kxpregSpltCancel 25 #define kypregSpltCancel 46 #define kxpSpltOk 457 #define kypSpltOk 311 #define kxpregSpltOk 25 #define kypregSpltOk 46 // COSTUME CHANGER EASEL ----------------------------------------------------- // Costume changer easel #define kxpCostPreviewFrameLeft 10 #define kypCostPreviewFrameTop 9 #define kxpCostPreviewFrameRight 426 #define kypCostPreviewFrameBottom 239 #define kxpCostEditBoxLeft 8 #define kypCostEditBoxTop 315 #define kxpCostEditBoxRight 427 #define kypCostEditBoxBottom 339 #define kxpCostBackground 320 #define kypCostBackground 445 #define kxpregCostBackground 218 #define kypregCostBackground 345 #define kxpCostCostumes 57 #define kypCostCostumes 302 #define kxpregCostCostumes 25 #define kypregCostCostumes 46 #define kxpCostAccessories 141 #define kypCostAccessories 302 #define kxpregCostAccessories 25 #define kypregCostAccessories 46 #define kxpCostRotate 225 #define kypCostRotate 302 #define kxpregCostRotate 25 #define kypregCostRotate 46 #define kxpCostCancel 329 #define kypCostCancel 302 #define kxpregCostCancel 25 #define kypregCostCancel 46 #define kxpCostOk 379 #define kypCostOk 302 #define kxpregCostOk 25 #define kypregCostOk 46 // WORKSPACE + BACKGROUND DEFINITIONS // Workspace #define kxpWorkspace 48 #define kypWorkspace 100 #define kxpregWorkspace 0 #define kypregWorkspace 0 #define kxpSettingsBackground 0 #define kypSettingsBackground 47 #define kxpregSettingsBackground 0 #define kypregSettingsBackground 0 #define kxpActorsBackground 0 #define kypActorsBackground 47 #define kxpregActorsBackground 0 #define kypregActorsBackground 0 #define kxpSoundsBackground 0 #define kypSoundsBackground 47 #define kxpregSoundsBackground 0 #define kypregSoundsBackground 0 #define kxpTextsBackground 0 #define kypTextsBackground 47 #define kxpregTextsBackground 0 #define kypregTextsBackground 0 #define kxpBackground 0 #define kypBackground 0 #define kxpBackground1 0 #define kypBackground1 0 #define kxpregBackground1 0 #define kypregBackground1 0 #define kxpBackground2 0 #define kypBackground2 97 #define kxpregBackground2 0 #define kypregBackground2 0 #define kxpBackground3 592 #define kypBackground3 97 #define kxpregBackground3 0 #define kypregBackground3 0 #define kxpBackground4 0 #define kypBackground4 406 #define kxpregBackground4 0 #define kypregBackground4 0 // SCENE SORTER -------------------------------------------------------------- #define kxpSSorterBackground 320 #define kypSSorterBackground 413 #define kxpregSSorterBackground 300 #define kypregSSorterBackground 348 #define kxpSSorterFrame 0 #define kypSSorterFrame 0 #define kxpregSSorterFrame 0 #define kypregSSorterFrame 0 #define kxpSSorterThumbLeft 8 #define kypSSorterThumbTop 12 #define kxpSSorterThumbRight 151 #define kypSSorterThumbBottom 92 #define kxpTransition1 156 #define kypTransition1 11 #define kxpregTransition1 0 #define kypregTransition1 0 #define kxpTransition2 156 #define kypTransition2 33 #define kxpregTransition2 0 #define kypregTransition2 0 #define kxpTransition3 156 #define kypTransition3 55 #define kxpregTransition3 0 #define kypregTransition3 0 #define kxpTransition4 156 #define kypTransition4 77 #define kxpregTransition4 0 #define kypregTransition4 0 #define kxpSSorterScrollUp 597 #define kypSSorterScrollUp 21 #define kxpregSSorterScrollUp 17 #define kypregSSorterScrollUp 19 #define kxpSSorterScrollDn 597 #define kypSSorterScrollDn 292 #define kxpregSSorterScrollDn 17 #define kypregSSorterScrollDn 19 #define kxpSSorterCancel 490 #define kypSSorterCancel 344 #define kxpregSSorterCancel 25 #define kypregSSorterCancel 46 #define kxpSSorterOk 540 #define kypSSorterOk 344 #define kxpregSSorterOk 25 #define kypregSSorterOk 46 #define kxpSSorterHand 50 #define kypSSorterHand 298 #define kxpregSSorterHand 25 #define kypregSSorterHand 0 #define kxpSSorterNuke 105 #define kypSSorterNuke 298 #define kxpregSSorterNuke 25 #define kypregSSorterNuke 0 #define kxpSSorterOpen 160 #define kypSSorterOpen 298 #define kxpregSSorterOpen 25 #define kypregSSorterOpen 0 #define kdxpSSorter 600 #define kdypSSorter 350 #define kdxpSSorterLeft 10 #define kdxpSSorterRight 10 #define kdypSSorterTop 12 #define kdypSSorterBottom 56 #define kdxpSSorterBorder 0 #define kdypSSorterBorder 0 #define kdxpSSorterSpacing 8 #define kdypSSorterSpacing 15 #define kdxpSSorterFrame 185 #define kdypSSorterFrame 126 #define kdxpSSorterFrameBorder 0 #define kdypSSorterFrameBorder 0 // LISTENER EASEL ------------------------------------------------------------ #define kxpListenBackgroundActor 182 #define kypListenBackgroundActor 100 #define kxpregListenBackgroundActor 0 #define kypregListenBackgroundActor 0 #define kxpListenBackgroundBkgd 116 #define kypListenBackgroundBkgd 100 #define kxpregListenBackgroundBkgd 0 #define kypregListenBackgroundBkgd 0 #define kxpListenCancel 304 #define kypListenCancel 233 #define kxpregListenCancel 24 #define kypregListenCancel 50 #define kxpListenOk 354 #define kypListenOk 233 #define kxpregListenOk 24 #define kypregListenOk 50 #define kypListenVolFXMin 0 #define kypListenVolFXMax 108 #define kxpSliderThumb 5 #define kxpVolFXLeft 70 #define kypVolFXTop 20 #define kxpVolFXRight 120 #define kypVolFXBottom 138 #define kxpVolFXMMLeft 70 #define kypVolFXMMTop 20 #define kxpVolFXMMRight 120 #define kypVolFXMMBottom 138 #define kxpVolSpeechLeft 201 #define kypVolSpeechTop 20 #define kxpVolSpeechRight 251 #define kypVolSpeechBottom 138 #define kxpVolSpeechMMLeft 201 #define kypVolSpeechMMTop 20 #define kxpVolSpeechMMRight 251 #define kypVolSpeechMMBottom 138 #define kxpVolMidiLeft 332 #define kypVolMidiTop 20 #define kxpVolMidiRight 382 #define kypVolMidiBottom 138 #define kypListenVolSpeechMin 0 #define kypListenVolSpeechMax 108 // speech slider moves for actor sound browser #define kxpActorListenVolSpeech 337 #define kypActorListenVolSpeechMin 0 #define kypActorListenVolSpeechMax 108 #define kypListenVolMidiMin 0 #define kypListenVolMidiMax 108 #define kypListenVolSpeechMMMin 0 #define kypListenVolSpeechMMMax 108 #define kypListenVolFXMMMin 0 #define kypListenVolFXMMMax 108 #define kypSliderNukeSpeech 100 #define kypSliderNukeFX 100 #define kypSliderNukeMidi 100 #define kypSliderNukeSpeechMM 100 #define kypSliderNukeFXMM 100 // background nuke buttons #define kxpListenNukeFX 112 #define kypListenNukeFX 144 #define kxpregListenNukeFX 11 #define kypregListenNukeFX 20 #define kxpListenNukeSpeech 243 #define kypListenNukeSpeech 144 #define kxpregListenNukeSpeech 11 #define kypregListenNukeSpeech 20 #define kxpListenNukeMidi 374 #define kypListenNukeMidi 144 #define kxpregListenNukeMidi 11 #define kypregListenNukeMidi 20 #define kxpListenNukeSpeechMM 243 #define kypListenNukeSpeechMM 144 #define kxpregListenNukeSpeechMM 11 #define kypregListenNukeSpeechMM 20 #define kxpListenNukeFXMM 112 #define kypListenNukeFXMM 144 #define kxpregListenNukeFXMM 11 #define kypregListenNukeFXMM 20 // name boxes #define kxpListenEditBoxFX 12 #define kypListenEditBoxFX 150 #define kxpregListenEditBoxFX 0 #define kypregListenEditBoxFX 0 #define kxpListenEditBoxSpeech 143 #define kypListenEditBoxSpeech 150 #define kxpregListenEditBoxSpeech 0 #define kypregListenEditBoxSpeech 0 #define kxpListenEditBoxMidi 274 #define kypListenEditBoxMidi 150 #define kxpregListenEditBoxMidi 0 #define kypregListenEditBoxMidi 0 // icons for background listener easel #define kxpListenFXIcon 13 #define kypListenFXIcon 117 #define kxpregListenFXIcon 0 #define kypregListenFXIcon 0 #define kxpListenSpeechIcon 144 #define kypListenSpeechIcon 117 #define kxpregListenSpeechIcon 0 #define kypregListenSpeechIcon 0 #define kxpListenMidiIcon 275 #define kypListenMidiIcon 117 #define kxpregListenMidiIcon 0 #define kypregListenMidiIcon 0 // misc. #define kxpregListenerNuke 0 #define kypregListenerNuke 0 // nuke buttons for actor listeners (remember reg points) #define kxpActorListenNukeSpeech 240 #define kypActorListenNukeSpeech 143 #define kxpActorListenNukeFX 109 #define kypActorListenNukeFX 143 #define kxpActorListenNukeSpeechMM 240 #define kypActorListenNukeSpeechMM 143 #define kxpActorListenNukeFXMM 109 #define kypActorListenNukeFXMM 143 // actor edit box values #define kxpListenActorEditBoxSpeech 141 #define kypListenActorEditBoxSpeech 150 #define kxpListenActorEditBoxFX 10 #define kypListenActorEditBoxFX 150 #define kxpListenActorEditBoxSpeechMM 141 #define kypListenActorEditBoxSpeechMM 150 #define kxpListenActorEditBoxFXMM 10 #define kypListenActorEditBoxFXMM 150 // icons! #define kxpListenSpeechMMIcon 144 #define kypListenSpeechMMIcon 117 #define kxpregListenSpeechMMIcon 0 #define kypregListenSpeechMMIcon 0 #define kxpListenFXMMIcon 12 #define kypListenFXMMIcon 117 #define kxpregListenFXMMIcon 0 #define kypregListenFXMMIcon 0 #define kxpActorListenFXIcon 13 #define kypActorListenFXIcon 117 #define kxpActorListenSpeechIcon 144 #define kypActorListenSpeechIcon 117 // not used? #define kxpListenEditBoxSpeechMM 143 #define kypListenEditBoxSpeechMM 150 #define kxpregListenEditBoxSpeechMM 0 #define kypregListenEditBoxSpeechMM 0 #define kxpListenEditBoxFXMM 12 #define kypListenEditBoxFXMM 150 #define kxpregListenEditBoxFXMM 0 #define kypregListenEditBoxFXMM 0 // reused ok + cancel buttons repositioned for actor #define kxpListenActorOk 223 #define kypListenActorOk 233 #define kxpListenActorCancel 173 #define kypListenActorCancel 233 // SPLETTERS EASEL popups // // // Spletters Font popdown // // #define kdxpSpltsFont 144 #define kdypSpltsFont 132 #define kxpSpltsFontLeft 36 #define kypSpltsFontTop 132 #define kxpSpltsFontRight 186 #define kypSpltsFontBottom 264 #define kdxpSpltsFontLeft 0 #define kdxpSpltsFontRight 0 #define kdypSpltsFontTop 0 #define kdypSpltsFontBottom 17 #define kdxpSpltsFontBorder 0 #define kdypSpltsFontBorder 0 #define kdxpSpltsFontSpacing 0 #define kdypSpltsFontSpacing 0 #define kdxpSpltsFontFrame 144 #define kdypSpltsFontFrame 23 #define kdxpSpltsFontFrameBorder 3 #define kdypSpltsFontFrameBorder 3 #define kxpSpltsFontPageDown 72 #define kypSpltsFontPageDown 115 #define kxprSpltsFontPageDown 0 #define kyprSpltsFontPageDown 0 #define kxpSpltsFontPageUp 0 #define kypSpltsFontPageUp 115 #define kxprSpltsFontPageUp 0 #define kyprSpltsFontPageUp 0 // // // Spletters Shape popdown // // #define kdxpSpltsShape 46 #define kdypSpltsShape 194 #define kxpSpltsShapeLeft 88 #define kypSpltsShapeTop 72 #define kxpSpltsShapeRight 136 #define kypSpltsShapeBottom 264 #define kdxpSpltsShapeLeft 0 #define kdxpSpltsShapeRight 0 #define kdypSpltsShapeTop 0 #define kdypSpltsShapeBottom 18 #define kdxpSpltsShapeBorder 0 #define kdypSpltsShapeBorder 0 #define kdxpSpltsShapeSpacing 0 #define kdypSpltsShapeSpacing 0 #define kdxpSpltsShapeFrame 46 #define kdypSpltsShapeFrame 44 #define kdxpSpltsShapeFrameBorder 7 #define kdypSpltsShapeFrameBorder 7 #define kxpSpltsShapePageDown 0 #define kypSpltsShapePageDown 176 #define kxprSpltsShapePageDown 0 #define kyprSpltsShapePageDown 0 #define kxpSpltsShapePageUp 23 #define kypSpltsShapePageUp 176 #define kxprSpltsShapePageUp 0 #define kyprSpltsShapePageUp 0 // // // Spletters Color popdown // // #define kdxpSpltsColor 78 #define kdypSpltsColor 194 #define kxpSpltsColorLeft 136 #define kypSpltsColorTop 72 #define kxpSpltsColorRight 216 #define kypSpltsColorBottom 264 #define kdxpSpltsColorLeft 0 #define kdxpSpltsColorRight 0 #define kdypSpltsColorTop 0 #define kdypSpltsColorBottom 18 #define kdxpSpltsColorBorder 0 #define kdypSpltsColorBorder 0 #define kdxpSpltsColorSpacing 0 #define kdypSpltsColorSpacing 0 #define kdxpSpltsColorFrame 78 #define kdypSpltsColorFrame 44 #define kdxpSpltsColorFrameBorder 7 #define kdypSpltsColorFrameBorder 7 #define kxpSpltsColorPageDown 0 #define kypSpltsColorPageDown 176 #define kxprSpltsColorPageDown 0 #define kyprSpltsColorPageDown 0 #define kxpSpltsColorPageUp 39 #define kypSpltsColorPageUp 176 #define kxprSpltsColorPageUp 0 #define kyprSpltsColorPageUp 0 ================================================ FILE: inc/projmain.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ ////////////////////////////////////////////// // defines for projmain ////////////////////////////////////////////// #ifndef PROJMAIN_H #define PROJMAIN_H // the following are the file names of the project movies loaded into the workspace // localize at will... #define PROJECT1_MOVIENAME "DIALOGUE.3mm" #define PROJECT2_MOVIENAME "JOG.3mm" #define PROJECT3_MOVIENAME "SURPRISE.3mm" #define PROJECT4_MOVIENAME "MUMMY.3mm" #define PROJECT5_MOVIENAME "BONGO.3mm" #define PROJECT6_MOVIENAME "BRIDGE.3mm" // gadget objects #define kidGadgetPersistent 0x00003030 #define kidGadgetParent 0x00003031 #define kidGadgetBody 0x00003032 #define kidGadgetPlay 0x00003033 #define kidGadgetVolume 0x00003034 #define kidGadgetVoice 0x00003035 #define kidGadgetCancel 0x00003036 #define kidGadgetSelectorUp 0x00003037 #define kidGadgetSelectorNum 0x00003038 #define kidGadgetSelectorDown 0x00003039 #define kidGadgetAvi 0x0000303A #define kidGadgetWord 0x0000303B #define kidGadgetLockerFill 0x0000303C #define kidGadgetHow 0x0000303D #define kidGadgetWhy 0x0000303E #define kidGadgetLockerPict 0x0000303F #define kidGadgetAviFrame 0x00003040 #define kidGadgetVolumeThumb 0x00003041 #define kidGadgetAlertGlass 0x00003042 #define kidGadgetVolumePath 0x00003043 #define kidGadgetTextBox 0x00003044 #define kidGadgetStartUp 0x00003046 // 3045 is used in helpbook.h #define kidGadgetStartOk 0x00003047 // Instruction Ids #define EndTable 0 // not an instruction, just a marker #define InitState 1 #define MatchGoto 2 #define MatchDescGoto 3 #define MatchChildrenGoto 4 #define MatchAllGoto 5 #define IgnoreMatch 6 #define IgnoreChildren 7 #define IgnoreAll 8 #define BoolCondGoto 9 #define StateCondGoto 10 #define SpecialInstr 11 #define WaitEvent 12 #define JumpToState 13 #define EndState 14 #define MatchParentGoto 15 #define IgnoreParentMatch 16 // Special Instruction Ids #define QuitMM 1 #define QuitHelp 2 #define QuitGadgetHelp 3 #define SetHelpAlarm 4 #define ProjectsRoom 5 #define ResetTipDelay 6 #define ClearStudio 7 #define LoadProjectMovie 8 #define OpenDoorCovers 9 #define SetSceneAndFrame 10 #define SetBlinkingGadget 11 #define OpenAllDoors 12 #define ChangeToNextMovie 13 #define SimulateClick 14 #define SetBrowserItem 15 #define SetNextProject 16 // Parent States #define ParState2 0 #define ParState3 1 #define ParState4 2 #define ParState5 3 #define NotRel 0 #define NoHelpHere 0 #define PrevState -1 // Definitions of controls(parent object and table objects) #define kidSequenceParent 0x00030000 // logo wizard #define kidLogoWizard 0x00030001 // how to scenes #define kidHowToScenes01 0x00030002 #define kidHowToScenes02 0x00030003 #define kidHowToScenes03 0x00030004 #define kidHowToScenes04 0x00030005 #define kidHowToScenes05 0x00030006 #define kidHowToScenes06 0x00030007 #define kidHowToScenes07 0x00030008 #define kidHowToScenes08 0x00030009 #define kidHowToScenes09 0x0003000A #define kidHowToScenes10 0x0003000B #define kidHowToScenes11 0x0003000C #define kidHowToScenes12 0x0003000D #define kidHowToScenes13 0x0003000E #define kidHowToScenes14 0x0003000F #define kidHowToScenes15 0x00030010 // how to sounds #define kidHowToSounds01 0x00030020 #define kidHowToSounds02 0x00030021 #define kidHowToSounds03 0x00030022 #define kidHowToSounds04 0x00030023 #define kidHowToSounds05 0x00030024 #define kidHowToSounds06 0x00030025 #define kidHowToSounds07 0x00030026 #define kidHowToSounds08 0x00030027 #define kidHowToSounds09 0x00030028 #define kidHowToSounds10 0x00030029 #define kidHowToSounds11 0x0003002A #define kidHowToSounds12 0x0003002B // how to words #define kidHowToWords01 0x00030040 #define kidHowToWords02 0x00030041 #define kidHowToWords03 0x00030042 #define kidHowToWords04 0x00030043 #define kidHowToWords05 0x00030044 #define kidHowToWords06 0x00030045 #define kidHowToWords07 0x00030046 #define kidHowToWords08 0x00030047 #define kidHowToWords09 0x00030048 #define kidHowToWords10 0x00030049 #define kidHowToWords11 0x0003004A #define kidHowToWords12 0x0003004B #define kidHowToWords13 0x0003004C #define kidHowToWords14 0x0003004D #define kidHowToWords15 0x0003004E // how to actors #define kidHowToActors01 0x00030060 #define kidHowToActors02 0x00030061 #define kidHowToActors03 0x00030062 #define kidHowToActors04 0x00030063 #define kidHowToActors05 0x00030064 #define kidHowToActors06 0x00030065 #define kidHowToActors07 0x00030066 #define kidHowToActors08 0x00030067 #define kidHowToActors09 0x00030068 #define kidHowToActors10 0x00030069 #define kidHowToActors11 0x0003006A #define kidHowToActors12 0x0003006B #define kidHowToActors13 0x0003006C #define kidHowToActors14 0x0003006D #define kidHowToActors15 0x0003006E #define kidHowToActors16 0x0003006F #define kidHowToActors17 0x00030070 #define kidHowToActors18 0x00030071 #define kidHowToActors19 0x00030072 #define kidHowToActors20 0x00030073 #define kidHowToActors21 0x00030074 #define kidHowToActors22 0x00030075 #define kidHowToActors23 0x00030076 #define kidHowToActors24 0x00030077 #define kidHowToActors25 0x00030078 #define kidHowToActors26 0x00030079 #define kidHowToActors27 0x0003007A #define kidHowToActors28 0x0003007B // Project 1 #define kid1Project01 0x00030100 #define kid1Project02 0x00030101 #define kid1Project03 0x00030102 #define kid1Project04 0x00030103 #define kid1Project05 0x00030104 #define kid1Project06 0x00030105 #define kid1Project07 0x00030106 // Project 2 #define kid2Project01 0x00030200 #define kid2Project02 0x00030201 #define kid2Project03 0x00030202 #define kid2Project04 0x00030203 #define kid2Project05 0x00030204 #define kid2Project06 0x00030205 #define kid2Project07 0x00030206 // Project 3 #define kid3Project01 0x00030300 #define kid3Project02 0x00030301 #define kid3Project03 0x00030302 #define kid3Project04 0x00030303 #define kid3Project05 0x00030304 // Project 4 #define kid4Project01 0x00030400 #define kid4Project02 0x00030401 #define kid4Project03 0x00030402 #define kid4Project04 0x00030403 #define kid4Project05 0x00030404 // Project 5 #define kid5Project01 0x00030500 #define kid5Project02 0x00030501 #define kid5Project03 0x00030502 #define kid5Project04 0x00030503 #define kid5Project05 0x00030504 #define kid5Project06 0x00030505 #define kid5Project07 0x00030506 #define kid5Project08 0x00030507 #define kid5Project09 0x00030508 #define kid5Project10 0x00030509 // Project 6 #define kid6Project01 0x00030510 #define kid6Project02 0x00030511 #define kid6Project03 0x00030512 #define kid6Project04 0x00030513 #define kid6Project05 0x00030514 #define kid6Project06 0x00030515 // basics #define kidBasics01 0x00030520 #define kidBasics02 0x00030521 #define kidBasics03 0x00030522 #define kidBasics04 0x00030523 #define kidBasics05 0x00030524 #define kidBasics06 0x00030525 #define kidBasics07 0x00030526 #define kidBasics08 0x00030527 #define kidBasics09 0x00030528 // guidehelp #define kidGuideHelp 0x000305A0 // script for playing help sounds #define sclHelpSoundClass 999 #define ksclBldgSound 998 #define kidPlayHelpSounds 0x000305F0 #define kidPlayProjectSounds 0x000305F1 #define kidPlayLogoSounds 0x000305F2 #define kidPlayGuideSounds 0x000305F3 #define kidPlayToolTipSounds 0x000305F4 ////////////////////////////// control ids //#define kgobOkButton 0x00030100 #define kgobLogoWizard 0x00030600 #define kgobHowtoSequence 0x00030601 #define kgobHowToSequenceHot 0x00030602 #define kgobProject 0x00030603 #define kgobProjectHot 0x00030604 #define kgobGuideHelp 0x00030605 #define kgobGuideHelpHot 0x00030606 #define kgobGadgetText 0x00030607 /////////////////////////Filtering defines // for projmain #define kFltrMouse 1 #define kFltrClicked 2 #define kFltrKey 4 #define kFltrBrwOk 8 #define kFltrBrwCancel 16 #define kFltrBrwSelect 32 #define kFltrEslOk 64 #define kFltrEslCancel 128 #define kFltrEslClosing 256 #define kFltrActorIn 512 #define kFltrActorOut 1024 #define kFltrActorClicked 2048 #define kFltrScnSortOk 4096 #define kFltrScnSortCancel 8192 #define kFltrAlarmOff 16384 #define kFltrMoviePlaying 32768 #define kFltrTBoxClicked 65536 #define kFltrBrwVisible 131072 #define kFltrEslVisible 262144 #define kFltrScnSortVisible 524288 #define kFltrGadgetAviStop 1048576 #define kFltrScnSortSelect 2097152 #define kFltrActorClickedDown 4194304 #define kFltrMovieLoaded 8388608 #define kFltrModalClosed 16777216 #define kFltrSceneLoaded 33554432 #define kFltrPortfolioResult 67108864 #define kFltrMouseBoth 3 // message id #define cidParse 100100 #define cidHelpAlarmOff 100101 #define cidGadgetAviStop 100102 // string id's for movies #define stidMovie1 701 #define stidMovie2 702 #define stidMovie3 703 #define stidMovie4 704 #define stidMovie5 705 #define stidMovie6 706 // position of gadget controls #define kxpGdPlay 443 #define kypGdPlay 269 #define kxpregGdPlay 24 #define kypregGdPlay 34 #define kxpGdHow 443 #define kypGdHow 300 #define kxpregGdHow 24 #define kypregGdHow 0 #define kxpGdSelUp 419 #define kypGdSelUp 131 #define kxpregGdSelUp 0 #define kypregGdSelUp 0 #define kxpGdSelDn 419 #define kypGdSelDn 175 #define kxpregGdSelDn 0 #define kypregGdSelDn 0 #define kxpGdMovieNum 420 #define kypGdMovieNum 155 #define kxpregGdMovieNum 0 #define kypregGdMovieNum 0 #define kxpGdMelVoice 273 #define kypGdMelVoice 424 #define kxpregGdMelVoice 23 #define kypregGdMelVoice 43 #define kxpGdWhy 322 #define kypGdWhy 424 #define kxpregGdWhy 23 #define kypregGdWhy 43 #define kxpGdClose 371 #define kypGdClose 424 #define kxpregGdClose 23 #define kypregGdClose 43 #define kxpGadgetSlider 210 #define kypGadgetSlider 234 #define kdxpGadgetSlider 11 #define kdypGadgetSlider 91 #define kdypGadgetSliderTotal 98 // locker fill stuff #define kLockerFillLeft 247 #define kLockerFillTop 229 #define kLockerFillRight 397 #define kLockerFillBottom 371 // text box stuff #define kTextBoxFillLeft 5 #define kTextBoxFillTop 3 #define kTextBoxFillRight 167 #define kTextBoxFillBottom 43 // where to jump for each movie in projects(at start) // conversation #define Proj1Scene 0 #define Proj1Frame 48 // jog #define Proj2Scene 0 #define Proj2Frame 113 // graveyard - surprise! #define Proj3Scene 0 #define Proj3Frame 1 // mummy #define Proj4Scene 0 #define Proj4Frame 1 // bongo #define Proj5Scene 0 #define Proj5Frame 138 // bridge #define Proj6Scene 0 #define Proj6Frame 165 // Objects for browsers, what to point at // project 1 #define Prj1Action1 29 #define Prj1SoundsMic1 0x0000400f #define Prj1Camera1 5 #define Prj1SoundsMic2 0x00004009 #define Prj1Camera2 4 #define Prj1SoundsMic3 0x00004012 // project 3(2) #define Prj3Action1 3 #define Prj3SoundsMic1 0x0000400e #define Prj3Action2 32 #define Prj3SoundsMic2 0x00004016 // project 4(6) #define Prj4Action1 11 #define Prj4Prop1 0x00001011 #define Prj4Action2 5 #define Prj4Action3 25 // project 5 #define Prj5Action1 27 #define Prj5Action2 28 #define Prj5Action3 23 #define Prj5Camera1 2 #define Prj5Prop1 0x00001021 #define Prj5Action4 1 #define Prj5SoundsEfx1 0x00003210 #define Prj5Actor1 0x00002030 #define Prj5Action5 3 #define Prj5Action6 1 // project 6(4) #define Prj6SoundsMus1 0x0000505a #define Prj6SoundsMus2 0x0000505b #define Prj6SoundsMus3 0x0000505e #define Prj6SoundsMus4 0x00005064 #define Prj6SoundsEfx1 0x000032a3 #define Prj6SoundsEfx2 0x000032a2 // *maybe* #define #endif // !PROJMAIN_H ================================================ FILE: inc/scene.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** THIS IS A CODE REVIEWED FILE Basic scene classes: Scene (SCEN) BASE ---> SCEN Scene Actor Undo Object (SUNA) BASE ---> UNDB ---> MUNB ---> SUNA ***************************************************************************/ #ifndef SCEN_H #define SCEN_H // // Undo object for actor operations // typedef class SUNA *PSUNA; #define SUNA_PAR MUNB // Undo types enum { utAdd = 0x1, utDel, utRep, }; #define kclsSUNA 'SUNA' class SUNA : public SUNA_PAR { RTCLASS_DEC MARKMEM ASSERT protected: PACTR _pactr; long _ut; // Tells which type of undo this is. SUNA(void) { } public: static PSUNA PsunaNew(void); ~SUNA(void); void SetActr(PACTR pactr) { _pactr = pactr; } void SetType(long ut) { _ut = ut; } virtual bool FDo(PDOCB pdocb); virtual bool FUndo(PDOCB pdocb); }; // // Different reasons for pausing in a scene // enum WIT { witNil, witUntilClick, witUntilSnd, witForTime, witLim }; // // Functionality that can be turned off and on. If the bit // is set, it is disabled. // enum { fscenSounds = 0x1, fscenPauses = 0x2, fscenTboxes = 0x4, fscenActrs = 0x8, fscenPosition = 0x10, fscenAction = 0x20, fscenCams = 0x40, fscenAll = 0xFFFF }; typedef struct SSE *PSSE; typedef struct TAGC *PTAGC; typedef class SCEN *PSCEN; // // Notes: // // This assumes that struct SND contains at least, // - Everything necessary to play the sound. // // This assumes that struct TBOX contains at least, // - Everything necessary to display the text. // - Enumerating through text boxes in a scene is not necessary. // #define SCEN_PAR BASE #define kclsSCEN 'SCEN' class SCEN : public SCEN_PAR { RTCLASS_DEC MARKMEM ASSERT protected: typedef struct SEV *PSEV; // // These variables keep track of the internal frame numbers. // long _nfrmCur; // Current frame number long _nfrmLast; // Last frame number in scene. long _nfrmFirst; // First frame number in scene. // // Frames with events in them. This stuff works as follows. // _isevFrmLim is the index into the GG of a sev with nfrm > nCurFrm. // PGG _pggsevFrm; // List of events that occur in frames. long _isevFrmLim; // Next event to process. // // Global information // STN _stnName; // Name of this scene PGL _pglpactr; // List of actors in the scene. PGL _pglptbox; // List of text boxes in the scene. PGG _pggsevStart; // List of frame independent events. PMVIE _pmvie; // Movie this scene is a part of. PBKGD _pbkgd; // Background for this scene. ulong _grfscen; // Disabled functionality. PACTR _pactrSelected; // Currently selected actor, if any PTBOX _ptboxSelected; // Currently selected tbox, if any TRANS _trans; // Transition at the end of the scene. PMBMP _pmbmp; // The thumbnail for this scene. PSSE _psseBkgd; // Background scene sound (starts playing // at start time even if snd event is // earlier) long _nfrmSseBkgd; // Frame at which _psseBkgd starts TAG _tagBkgd; // Tag to current BKGD protected: SCEN(PMVIE pmvie); ~SCEN(void); // // Event stuff // bool _FPlaySev(PSEV psev, void *qvVar, ulong grfscen); // Plays a single scene event. bool _FUnPlaySev(PSEV psev, void *qvVar); // Undoes a single scene event. bool _FAddSev(PSEV psev, long cbVar, void *pvVar); // Adds scene event to the current frame. void _MoveBackFirstFrame(long nfrm); // // Dirtying stuff // void _MarkMovieDirty(void); void _DoPrerenderingWork(bool fStartNow); // Does any prerendering for _nfrmCur void _EndPrerendering(void); // Stops prerendering // // Make actors go to a specific frame // bool _FForceActorsToFrm(long nfrm, bool *pfSoundInFrame = pvNil); bool _FForceTboxesToFrm(long nfrm); // // Thumbnail routines // void _UpdateThumbnail(void); public: // // Create and destroy // static SCEN *PscenNew(PMVIE pmvie); // Returns pvNil if it fails. static SCEN *PscenRead(PMVIE pmvie, PCRF pcrf, CNO cno); // Returns pvNil if it fails. bool FWrite(PCRF pcrf, CNO *pcno); // Returns fFalse if it fails, else the cno written. static void Close(PSCEN *ppscen); // Public destructor void RemActrsFromRollCall(bool fDelIfOnlyRef = fFalse); // Removes actors from movie roll call. bool FAddActrsToRollCall(void); // Adds actors from movie roll call. // // Tag collection // static bool FAddTagsToTagl(PCFL pcfl, CNO cno, PTAGL ptagl); // // Frame functions // bool FPlayStartEvents(bool fActorsOnly = fFalse); // Play all one-time starting scene events. void InvalFrmRange(void); // Mark the frame count dirty bool FGotoFrm(long nfrm); // Jumps to an arbitrary frame. long Nfrm(void) // Returns the current frame number { return (_nfrmCur); } long NfrmFirst(void) // Returns the number of the first frame in the scene. { return (_nfrmFirst); } long NfrmLast(void) // Returns the number of the last frame in the scene. { return (_nfrmLast); } bool FReplayFrm(ulong grfscen); // Replay events in this scene. // // Undo accessor functions // void SetNfrmCur(long nfrm) { _nfrmCur = nfrm; } // // Edit functions // void SetMvie(PMVIE pmvie); // Sets the associated movie. void GetName(PSTN pstn) // Gets name of current scene. { *pstn = _stnName; } void SetNameCore(PSTN pstn) // Sets name of current scene. { _stnName = *pstn; } bool FSetName(PSTN pstn); // Sets name of current scene, and undo bool FChopCore(void); // Chops off the rest of the scene. bool FChop(void); // Chops off the rest of the scene and undo bool FChopBackCore(void); // Chops off the rest of the scene, backwards. bool FChopBack(void); // Chops off the rest of the scene, backwards, and undo. // // Transition functions // void SetTransitionCore(TRANS trans) // Set the final transition to be. { _trans = trans; } bool FSetTransition(TRANS trans); // Set the final transition to be and undo. TRANS Trans(void) { return _trans; } // Returns the transition setting. // These two operate a specific SCEN chunk rather than a SCEN in memory static bool FTransOnFile(PCRF pcrf, CNO cno, TRANS *ptrans); static bool FSetTransOnFile(PCRF pcrf, CNO cno, TRANS trans); // // State functions // void Disable(ulong grfscen) // Disables functionality. { _grfscen |= grfscen; } void Enable(ulong grfscen) // Enables functionality. { _grfscen &= ~grfscen; } long GrfScen(void) // Currently disabled functionality. { return _grfscen; } bool FIsEmpty(void); // Is the scene empty? // // Actor functions // bool FAddActrCore(ACTR *pactr); // Adds an actor to the scene at current frame. bool FAddActr(ACTR *pactr); // Adds an actor to the scene at current frame, and undo void RemActrCore(long arid); // Removes an actor from the scene. bool FRemActr(long arid); // Removes an actor from the scene, and undo PACTR PactrSelected(void) // Returns selected actor { return _pactrSelected; } void SelectActr(ACTR *pactr); // Sets the selected actor PACTR PactrFromPt(long xp, long yp, long *pibset); // Gets actor pointed at by the mouse. PGL PglRollCall(void) // Return a list of all actors in scene. { return (_pglpactr); } // Only to be used by the movie-class void HideActors(void); void ShowActors(void); PACTR PactrFromArid(long arid); // Finds a current actor in this scene. long Cactr(void) { return (_pglpactr == pvNil ? 0 : _pglpactr->IvMac()); } // // Sound functions // bool FAddSndCore(bool fLoop, bool fQueue, long vlm, long sty, long ctag, PTAG prgtag); // Adds a sound to the current frame. bool FAddSndCoreTagc(bool fLoop, bool fQueue, long vlm, long sty, long ctagc, PTAGC prgtagc); bool FAddSnd(PTAG ptag, bool fLoop, bool fQueue, long vlm, long sty); // Adds a sound to the current frame, and undo void RemSndCore(long sty); // Removes the sound from current frame. bool FRemSnd(long sty); // Removes the sound from current frame, and undo bool FGetSnd(long sty, bool *pfFound, PSSE *ppsse); // Allows for retrieval of sounds. void PlayBkgdSnd(void); bool FQuerySnd(long sty, PGL *pgltagSnd, long *pvlm, bool *pfLoop); void SetSndVlmCore(long sty, long vlmNew); void UpdateSndFrame(void); bool FResolveAllSndTags(CNO cnoScen); // // Text box functions // bool FAddTboxCore(PTBOX ptbox); // Adds a text box to the current frame. bool FAddTbox(PTBOX ptbox); // Adds a text box to the current frame. bool FRemTboxCore(PTBOX ptbox); // Removes a text box from the scene. bool FRemTbox(PTBOX ptbox); // Removes a text box from the scene. PTBOX PtboxFromItbox(long itbox); // Returns the ith tbox in this frame. PTBOX PtboxSelected(void) // Returns the tbox currently selected. { return _ptboxSelected; } void SelectTbox(PTBOX ptbox); // Selects this tbox. void HideTboxes(void); // Hides all text boxes. long Ctbox(void) { return (_pglptbox == pvNil ? 0 : _pglptbox->IvMac()); } // // Pause functions // bool FPauseCore(WIT *pwit, long *pdts); // Adds\Removes a pause to the current frame. bool FPause(WIT wit, long dts); // Adds\Removes a pause to the current frame, and undo // // Background functions // bool FSetBkgdCore(PTAG ptag, PTAG ptagOld); // Sets the background for this scene. bool FSetBkgd(PTAG ptag); // Sets the background for this scene, and undo BKGD *Pbkgd(void) { return _pbkgd; } // Gets the background for this scene. bool FChangeCamCore(long icam, long *picamOld); // Changes camera viewpoint at current frame. bool FChangeCam(long icam); // Changes camera viewpoint at current frame, and undo PMBMP PmbmpThumbnail(void); // Returns the thumbnail. bool FGetTagBkgd(PTAG ptag); // Returns the tag for the background for this scene // // Movie functions // PMVIE Pmvie() { return (_pmvie); } // Get the parent movie // // Mark scene as dirty // void MarkDirty(bool fDirty = fTrue); // Mark the scene as changed. // // Clipboard type functions // bool FPasteActrCore(PACTR pactr); // Pastes actor into current frame bool FPasteActr(PACTR pactr); // Pastes actor into current frame and undo // // Playing functions // bool FStartPlaying(void); // For special behavior when playback starts void StopPlaying(void); // Used to clean up after playback has stopped. }; #endif //! SCEN_H ================================================ FILE: inc/scnsort.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /****************************************************************************** Author: ****** Project: Socrates Review Status: Reviewed Include file for the scene sorter class ************************************************************ PETED ***********/ #ifndef SCNSORT_H #define SCNSORT_H #define SCRT_PAR GOK #define kclsSCRT 'SCRT' typedef class SCRT *PSCRT; class SCRT : public SCRT_PAR { RTCLASS_DEC ASSERT MARKMEM CMD_MAP_DEC(SCRT) protected: static const TRANS _mplwtrans[]; /* Obtained from the script */ long _kidFrameMin; // kid of first frame GOK in the easel long _kidScbtnsMin; // kid of the first scroll button (scroll up) long _cfrmPage; // number of frame GOKs on the easel long _cgokFrame; // number of pieces to a frame GOK /* Hidden from the script */ long _iscenCur; // currently selected scene long _iscenTop; // first scene visible in the browser long _iscenMac; // number of scenes PMVIE _pmvie; // pointer to movie we're editing CMVI _cmvi; // Composite movie bool _fError : 1, // Did an error occur during the easel? _fInited : 1; // Have I seen the cidSceneSortInit yet? PSTDIO _pstdio; // The STDIO that instantiated me protected: long _IscenFromKid(long kid) { AssertIn(kid, _kidFrameMin, _kidFrameMin + _cfrmPage * _cgokFrame + 1); return LwMin(_iscenMac, (_iscenTop + (kid - _kidFrameMin) / _cgokFrame)); } long _KidFromIscen(long iscen) { AssertIn(iscen, _iscenTop, _iscenTop + _cfrmPage); return (_kidFrameMin + (iscen - _iscenTop) * _cgokFrame); } void _EnableScroll(void); void _SetSelectionVis(bool fShow, bool fHideSel = fFalse); void _ErrorExit(void); bool _FResetThumbnails(bool fHideSel); bool _FResetTransition(PGOK pgokPar, TRANS trans); TRANS _TransFromLw(long lwTrans); long _LwFromTrans(TRANS trans); public: SCRT(PGCB pgcb); ~SCRT(void); static PSCRT PscrtNew(long hid, PMVIE pmvie, PSTDIO pstdio, PRCA prca); static bool FSceneSortMovie(long hid, PMVIE pmvie); /* Command API */ bool FCmdInit(PCMD pcmd); bool FCmdSelect(PCMD pcmd); bool FCmdInsert(PCMD pcmd); bool FCmdScroll(PCMD pcmd); bool FCmdNuke(PCMD pcmd); bool FCmdDismiss(PCMD pcmd); bool FCmdPortfolio(PCMD pcmd); bool FCmdTransition(PCMD pcmd); }; /****************************************************************************** GOMP class -- wraps an MBMP in a GOB for display in the Scene Sorter ************************************************************ PETED ***********/ #define GOMP_PAR GOB #define kclsGOMP 'GOMP' typedef class GOMP *PGOMP; class GOMP : public GOMP_PAR { RTCLASS_DEC ASSERT MARKMEM /* REVIEW peted: do I need to declare a command map? */ protected: PMBMP _pmbmp; public: GOMP(PGCB pgcb); ~GOMP(void) { AssertThis(0); ReleasePpo(&_pmbmp); } static PGOMP PgompNew(PGOB pgobPar, long hid); static PGOMP PgompFromHidScr(long hid); bool FSetMbmp(PMBMP pmbmp); /* Makes the GOMP invisible to mouse actions */ virtual bool FPtIn(long xp, long yp) { return fFalse; } virtual bool FPtInBounds(long xp, long yp) { return fFalse; } virtual void Draw(PGNV pgnv, RC *prcClip); }; #endif /* SCNSORT_H */ ================================================ FILE: inc/sharedef.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /***************************************************************************** * * SHAREDEF.H * * Copyright (C) Microsoft Corporation 1995. * All Rights reserved. * ****************************************************************************** * * Module Intent * * Contains definitions for shared objects (in src\shared.cht). Needs to be * included by modules that want to use shared cursors or the portfolio or * the map. * ****************************************************************************** * * Revision History: Created 06/26/95 by *****. * *****************************************************************************/ #ifndef SHAREDEF_H #define SHAREDEF_H /***************************************************************************** * * * Constants * * * *****************************************************************************/ // ----------------------------------------------------- // Shared constants. // ----------------------------------------------------- #define kmaxVolume 0x00010000 // Script to run in shared.chk to initialize utils. #define kcnoInitShared 0x00050001 // ----------------------------------------------------- // Cursor Definitions // ----------------------------------------------------- #define kcrsHand 0x00000001 #define kcrsHand1 0x00000001 // Different names in Studio, Building #define kcrsArrow 0x00000002 #define kcrsArrow1 0x00000002 // Different names in Studio, Building #define kcrsWand1 0x00000003 #define kcrsActionBrowser 0x00000003 // Different names in Studio, Building #define kcrsStar 0x00000004 #define kcrsLeft 0x00000005 #define kcrsRight 0x00000006 #define kcrsDown 0x00000007 #define kcrsUp 0x00000008 #define kcrsTurn1 0x00000009 // ----------------------------------------------------- // Shared Object Definitions // ----------------------------------------------------- #define kgobMapMain 0x00012000 #define kwavDing \ 0x00010004 // Wave file used when adjusting // master volume. #define kwavPortOpenMovie 0x00010005 #define kwavPortSaveMovie 0x00010006 #define kwavPortOpenSound 0x00010007 #define kwavMapObject 0x00010008 #define kwavMapOpen 0x00010009 // For error help #define kgobBalloonError 0x00016050 #define ktpcErrorScript 0x00016051 #define kgobErrorMessageGlass 0x00016052 #define kcnoErrorMessage 0x00016053 #endif // !SHAREDEF_H ================================================ FILE: inc/sharutil.chh ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // --------------------------------------------------------- // These 'routines' and macros are for Socrates to use via // the UTIL object // // Revisions: // // mm-dd-yy // ??-??-94 ***** - Created // 05-16-95 ***** - remove unimplemented hooks // 06/27/95 ***** - moved to soc\inc directory, // renamed sharutil.chh. // // --------------------------------------------------------- #ifndef SHARUTIL_CHH #define SHARUTIL_CHH // ----------------------------------------------------- // Utility object definition // ----------------------------------------------------- #define kgobUtil 0x00010000 // ----------------------------------------------------- // Transition time in 1/60 seconds // ----------------------------------------------------- #define kTransitionTime 60 // ----------------------------------------------------- // Util object ids // ----------------------------------------------------- #define kgobGlass1 0x0001010b #define kgobGlass0 0x0001010c // ----------------------------------------------------- // Hotkey definitions // ----------------------------------------------------- // // These flags are used to enable and disable particular hotkeys within the // building though they are overridden by the app cid to disable all hotkeys. // #define kflgKEYALL 0xffffffff #define kflgKEYNONE 0x00000000 #define kflgKEYMAP 0x00000001 #define kflgKEYQUIT 0x00000002 #define kflgKEYABOUT 0x00000004 #define kflgKEYPORTFOLIO 0x00000008 #define kflgKEYTOOLS 0x00000010 #define kflgLOADSTUDIO 0x00000020 #define kwavSplot 0x00010010 // ----------------------------------------------------- // These are the keys that are generally enabled in the building. // ----------------------------------------------------- #define kflgBuildingAll\ (kflgKEYABOUT | kflgKEYQUIT | kflgKEYMAP | kflgKEYPORTFOLIO | kflgKEYTOOLS | kflgLOADSTUDIO) #define kflgBuildingMin\ (kflgKEYQUIT) // --------------------------------------------------------- // Quit the application // --------------------------------------------------------- #define QUITAPP() \ EnqueueCid(cidQuit, 0, 0, 0, 0, 0); // --------------------------------------------------------- // Switch to the next place. // --------------------------------------------------------- #define NEXTPLACE(_kgobNext) \ RunScriptGob(kgobUtil, kchidScript1, _kgobNext, kst1) // --------------------------------------------------------- // New and improved Switch to the next place. // It includes a parameter to set the entry state at the next place. // I'll use this to migrate to th enew type of NEXTPLACE and then // remove the above define and rename this one to NEXTPLACE. // --------------------------------------------------------- #define NEXTPLACE1(_kgobNext, _state) \ RunScriptGob(kgobUtil, kchidScript1, _kgobNext, _state) //---------------------------------------------------------- // Wrappers for cidEnable/DisableAccel so we can keep track // of how many times they've been called and use absolutes // to enable and disable. // _fAbsolute means override the counting mechanism. //---------------------------------------------------------- #define ENABLEACCEL(_fAbsolute)\ DEBUGCMD( If (kgobUtil->cDisable <= 0 && !_fAbsolute));\ DEBUGCMD( PrintStr("Enable Accels takes disable count below 0."));\ DEBUGCMD( End);\ If (_fAbsolute);\ If (kgobUtil->cDisable >= 1);\ EnqueueCid(cidEnableAccel, 0, 0, 0, 0, 0);\ End;\ kgobUtil->cDisable = 0;\ Else;\ kgobUtil->cDisable--;\ If (kgobUtil->cDisable == 0);\ EnqueueCid(cidEnableAccel, 0, 0, 0, 0, 0);\ End;\ End #define DISABLEACCEL(_fAbsolute)\ DEBUGCMD( If (kgobUtil->cDisable >= 1 && !_fAbsolute));\ DEBUGCMD( PrintStr("Disable Accels takes disable count above 1."));\ DEBUGCMD( End);\ If (_fAbsolute);\ If (kgobUtil->cDisable <= 0);\ EnqueueCid(cidDisableAccel, 0, 0, 0, 0, 0);\ End;\ kgobUtil->cDisable = 1;\ Else;\ If (kgobUtil->cDisable == 0);\ EnqueueCid(cidDisableAccel, 0, 0, 0, 0, 0);\ End;\ kgobUtil->cDisable++;\ End; //---------------------------------------------------------- // Function to lock out hot spots. Disable hot keys too. //---------------------------------------------------------- #define DISABLEHOTSPOTS( _flgKeys )\ StartLongOp();\ RunScriptGob( kgobUtil, kchidScript3, _flgKeys ) //---------------------------------------------------------- // Function to enable hot spots. //---------------------------------------------------------- #define ENABLEHOTSPOTS( _flgKeys )\ EndLongOp( fTrue );\ If( FGobExists( kgobGlass0 ) );\ DestroyGob( kgobGlass0 );\ End;\ SETKEYS(_flgKeys) //---------------------------------------------------------- // Function to manage music. //---------------------------------------------------------- #define PLAYMIDI( _cnoMidi )\ RunScriptGob( kgobUtil, kchidScript4, _cnoMidi, fFalse ) #define PLAYMIDI_LOOP( _cnoMidi )\ RunScriptGob( kgobUtil, kchidScript4, _cnoMidi, fTrue ) // --------------------------------------------------------- // Returns gobid of global mondo parent daddy. // --------------------------------------------------------- #define SUPERPARENT() \ GidParGob( kgobUtil ) // --------------------------------------------------------- // Return the current place. // --------------------------------------------------------- #define GET_CURRENTPLACE() ::kgobCurrentPlace // --------------------------------------------------------- // Set the current place. // --------------------------------------------------------- #define SET_CURRENTPLACE(_kgob) \ ::kgobCurrentPlace = _kgob // --------------------------------------------------------- // Enable/disable hotkeys // --------------------------------------------------------- #define HOTKEYS( _enable, _disable ) \ RunScriptGob( kgobUtil, kchidScript6 ); // --------------------------------------------------------- // reference a global variable value // --------------------------------------------------------- #define GLOBAL(__x) \ (kgobUtil->__x) // --------------------------------------------------------- // Set a global variable value // --------------------------------------------------------- #define SETGLOBAL( __x, __y )\ kgobUtil->__x = (__y) // --------------------------------------------------------- // Hotkeys : Return, enable, disable or set absolutely all // --------------------------------------------------------- #define KEYSTATE() \ (GLOBAL( keys )) #define KEYENABLED( _flgkey ) \ ((GLOBAL( keys ) & _flgkey) == _flgkey) #define ENABLEKEYS( _flgKeys )\ __foo = GLOBAL( keys ) | _flgKeys; \ SETGLOBAL( keys, __foo ) #define SETKEYS( _flgKeys )\ SETGLOBAL( keys, _flgKeys ) #define DISABLEKEYS( _flgKeys )\ __foo = GLOBAL( keys ) & ~(_flgKeys); \ SETGLOBAL( keys, __foo ) // -------------------------------------------------------------- // Palette setting shortcut. Will perform a transition if req'd // -------------------------------------------------------------- #define SETPALETTE(_cnoPalNew) \ RunScriptGob(kgobUtil, kchidScript7, _cnoPalNew) // -------------------------------------------------------------- // Macro to play WAVE and display character close caption balloon. // w= wave chunk, t= help topic (prev. for hearing impaired baln) // -------------------------------------------------------------- #define VOICE( w, t )\ If( ::siiVoice );\ StopSound( ::siiVoice );\ End;\ ::siiVoice = PlaySoundThis(kctgWave, w, 0, 0x00010000, 1, 0, ksclBldgSound) // CreateHelpGob( GET_CURRENTPLACE(), t ) Was used for putting up hearing impaired balloon // -------------------------------------------------------------- // Macro to stop wave file audio invoked with the VOICE macro. // -------------------------------------------------------------- #define ENDVOICE()\ If( ::siiVoice );\ StopSound( ::siiVoice );\ ::siiVoice = 0;\ End; // DestroyGob( kgobVoiceOver ); Was used for destroying hearing impaired balloon // -------------------------------------------------------------- // Macro to load the studio tools. // _kgobReturn specifies where the studio should come back to when it // returns to the Building. // _project specifies which project the tools should be loaded with, if // any. Set to 0 to indicate no project. // -------------------------------------------------------------- #define LOADTOOLS(_kgobReturn, _kstReturn, _project)\ RunScriptGob(kgobUtil, kchidScript8, _kgobReturn, _kstReturn, _project); #define WAIT_FOR_TRANSITION()\ If( ::fTransition );\ Cell( 0, 0, 0, kTransitionTime );\ ::fTransition = fFalse;\ End #endif //!SHARUTIL_CHH ================================================ FILE: inc/sitobren.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ #ifndef SITOBREN_H #define SITOBREN_H #include #include "util.h" #include "soc.h" // Needs knowledge of Socrates data structs #include "tyModel.h" // API for SoftImage db lib #include "dkfilter.h" #include "tySceneT.h" #include "mssio.h" /* HASH_FIXED means use a fixed-length hash table; the implication is that the hash value will be a small number of bits, so that the table isn't too large. A variable-length hash table will allow for large numbers of bits in the hash value. */ #define HASH_FIXED 0 /* Generic hashed database structure */ typedef struct _hshdb { struct _hshdb *phshdbNext; uint luHash; } HSHDB, *PHSHDB; /* Brender Model DataBase structure */ typedef struct _bmdb { HSHDB hshdb; // hash DB header MODLF *pmodlf; // the file data long cbModlf; CHID chidBmdl; // BMDL child ID CNO cnoBmdl; // BMDL CNO char *pszName; // name of the BMDL PGL pglkidCmtl; // GL of CMTL parents' CNOs unsigned fFixWrap : 1, fSpherical : 1; } BMDB, *PBMDB; /* Brender MATrix34 DataBase structure */ typedef struct _bmatdb { HSHDB hshdb; int ixf; } BMATDB, *PBMATDB; /* Brender Model HieraRchy */ typedef struct _bmhr { MODLF *pmodlf; // the file data long cbModlf; BMAT34 bmat34; // XF MTRLF mtrlf; PSTN pstnMtrlFile; BRUFR brufrUOffset; // Material offsets BRUFR brufrVOffset; short uMinCrop; // Material cropping short uMaxCrop; short vMinCrop; short vMaxCrop; unsigned fMtrlf : 1, fCrop : 1, fAccessory : 1, fFixWrap : 1, fSpherical : 1; char *pszName; short ibps; struct _bmhr *pbmhrChild; struct _bmhr *pbmhrSibling; } BMHR, *PBMHR; /* A color range */ typedef struct _crng { long lwBase, lwRange; } CRNG; /* A CMTL descriptor */ typedef struct _cmtld { CNO cno; // the CMTL's CNO CHID chidCur; // the next CHID for the CMTL's children short ibps; // the body part set as specified in the .hrc file CHID chid; // the CHID of this CMTL } CMTLD, *PCMTLD; /* A TMAP descriptor */ typedef struct _tmapd { PSTN pstn; // the name of the TMAP long ccnoPar; // the number of MTRL parents long xp; // the size of the bitmap long yp; } TMAPD, *PTMAPD; enum { ttActor = ttLimChlx, // TMPL initialization ttActionS2B, // Define a single action for the TMPL ttBackgroundS2B, // Define a background ttCostume, // Define a costime for a TMPL ttPosition, // SoftImage POS_STATIC token ttInterest, // SoftImage INT_STATIC token ttNearCam, ttFarCam, ttFovCam, ttStatic, // SoftImage STATIC token ttCno, // Tokens for converter script cmd parms ttCalled, ttXRest, ttYRest, ttZRest, ttFilebase, ttFirst, ttLast, ttFlags, ttScale, ttSkip, ttSubmodel, ttBPS, ttLights, ttCameras, ttLength, ttStep, ttUseSets, ttNewActorPos, ttMaterials, ttFilename, ttFloat, // data type is floating point ttLimS2B }; typedef struct _s2btk { TOK tok; double fl; } S2BTK, *PS2BTK; typedef class S2BLX *PS2BLX; #define kclsS2BLX 's2bl' #define S2BLX_PAR LEXB class S2BLX : public S2BLX_PAR { RTCLASS_DEC ASSERT MARKMEM protected: long _ttCur; double _fl; protected: virtual void _ReadNumTok(PTOK ptok, achar ch, long lwBase, long cchMax); public: S2BLX(PFIL pfil, bool fUnionStrings = fTrue) : S2BLX_PAR(pfil, fUnionStrings) { } ~S2BLX(void) { } virtual bool FGetTok(PTOK ptok); bool FGetS2btk(PS2BTK ps2btk); void GetFni(PFNI pfni) { _pfil->GetFni(pfni); } bool FIsDigit(char ch) { return FPure(_GrfctCh(ch) & fctDec); } virtual bool FTextFromTt(long tt, PSTN pstn); bool FTextFromS2btk(PS2BTK ps2btk, PSTN pstn); }; #define CnoAdd(ccno) (_cnoCur = (((_cnoPar & 0x0FFFF0000) + 0x010000) | (_cnoCur & 0x0FFFF) + (ccno))) #define CnoNext() CnoAdd(1) /* Some useful helper functions */ PGL PglcrngFromPal(PGL pglclr); long LwcrngNearestBrclr(BRCLR brclr, PGL pglclr, PGL pglcrng); #if HASH_FIXED #define kcpbmdb 64 // must be a power of 2 #define kmskBmdb (kcpbmdb - 1) #define kcbrgpbmdb (size(PBMDB) * kcpbmdb) // #define an appropriate fixed-size polynomial here #else // HASH_FIXED #define kluCrcPoly 0xEDB88320L #define kluHashInit 0xFFFFFFFFL #endif // !HASH_FIXED #define kszLight "%s-light%d.1-0.sal" #define kszCam "%s-cam.1-%d.sac" #define kszBmp "%s-view.1-%d.bmp" #define kszZpic "%s-view.1-%d.Zpic" #define kszZbmp "%s-view.1-%d.Zbmp" #define kftgALite 'SAL' #define kftgACam 'SAC' #define kftgS2b 'S2B' #define kftgCht 'CHT' #define kftgInc 'H' #define kftgTmapChkFile 'CPF' #define kftgZpic 'ZPIC' #define kftgZbmp 'ZBMP' // Script parameter types enum { ptString = 0, ptLong, ptBRS, ptBRA, ptNil = -1 }; #define kcscrpMax 10 typedef struct _scrp { long pt; // parameter type long tt; // token for this parm char szErr[80]; } SCRP, *PSCRP; extern const SCRP rgscrpActor[]; extern const SCRP rgscrpAction[]; extern const SCRP rgscrpBackground[]; enum { kmdQuiet = 0, kmdHelpful, kmdVerbose }; enum { kmdbpsNone = 0, // ignore body part set info kmdbpsNumberedOnly, // keep only those nodes with body part set info kmdbpsAllMesh, // keep null nodes with body part set info, and all mesh nodes kmdbpsAllMeshNull, // keep all null and mesh nodes kmdbpsLim }; enum { fs2bNil = 0, kfs2bContinue = 1, kfs2bPreprocess = 2, kfs2bFixWrap = 4 }; typedef class S2B *PS2B; #define kclsS2B 'S2B' #define S2B_PAR BASE class S2B : public S2B_PAR { RTCLASS_DEC ASSERT MARKMEM NOCOPY(S2B) #ifdef DEBUG void AssertValidBmhr(PBMHR pbmhr); void MarkBmhr(PBMHR pbmhr); #endif // DEBUG protected: /* Used by script interpreter and chunk output code */ PS2BLX _ps2blx; // used to process script file CHSE _chse; // used to dump chunk text to output file CTG _ctgPar; // CTG and CNO of current parent CNO _cnoPar; CNO _cnoCur; // Current chunk number STN _stnT; // tmp buf for S2B to use S2BTK _s2btk; // current script token int _iZsign; // Z multiplier /* Used by TMPL-specific stuff */ STN _stnTmpl; STN _stnActn; CHID _chidActn; // Next available ACTN CHID CHID _chidBmdl; CHID _chidCmtl; short _ibpCur; // current body part # PGL _pglibactPar; PGL _pglbs; PGL _pglcmtld; PGG _pggcl; PGL _pglxf; PGL _pglibps; // list of body part sets to generate costumes for PGG _pggcm; PGG _pggtmapd; // list of TMAP chunks used by the current actor #if HASH_FIXED PBMDB *_prgpbmdb; // BMDL database // PBMATDB *_prgpbmatdb; // BMAT34 database #else /* HASH_FIXED */ PGL _pglpbmdb; // BMDL database PGL _pglpbmatdb; // XF database #endif /* !HASH_FIXED */ PBMHR _pbmhr; // BMDL hierarchy for current cel int _cMesh; // count of mesh nodes for current cel int _cFace; // count of all polygons (faces) for current cel CPS *_prgcps; /* Bitfields */ /* General items */ uint _mdVerbose : 2, _uRound : 4, _uRoundXF : 4; bool _fContinue : 1, _fPreprocess : 1, _fFixWrap : 1; /* TMPL-specific items */ bool _fMakeGlpi : 1, _fColorOnly : 1, _fMakeCostume : 1, _fCostumeOnly : 1; uint _mdBPS : 2; /* Useful data that doesn't wind up in chunks */ PGL _pglcrng; PGL _pglclr; protected: /* General script interpreter and chunk output stuff */ bool _FDoTtActor(bool *pfHaveActor); bool _FDoTtActionS2B(void); bool _FDoTtBackgroundS2B(void); bool _FDoTtCostume(void); bool _FReadCmdline(char *szResult, bool *pfGotTok, const SCRP rgscrp[], ...); void _DumpHeader(CTG ctg, CNO cno, PSTN pstnName, bool fPack); /* TMPL-specific stuff */ bool _FInitGlpiCost(bool fForceCost); bool _FProcessModel(Model *pmodel, BMAT34 bmat34Acc, PBMHR *ppbmhr, PSTN pstnSubmodel = pvNil, PBMHR pbmhrParent = pvNil, int cLevel = 0); PBMHR _PbmhrFromModel(Model *pmodel, BMAT34 *pbmat34, PBMHR *ppbmhr, PBMHR pbmhrParent, int ibps, bool fAccessory); BRS _BrsdwrFromModel(Model *pmodel, BRS rgbrsDwr[]); void _CopyVertices(DK_Vertex *vertices, void *pvDst, long cVertices); void _CopyFaces(DK_Polygon *polygons, void *pvDst, long cFaces, BRV rgbrv[], long cVertices); bool _FProcessBmhr(PBMHR *ppbmhr, short ibpPar = -1); bool _FEnsureOneRoot(PBMHR *ppbmhr); void _InitBmhr(PBMHR pbmhr); void _FlushTmplKids(void); bool _FModlfToBmdl(PMODLF pmodlf, PBMDL *ppbmdl); bool _FBmdlToModlf(PBMDL pbmdl, PMODLF *ppmodlf, long *pcb); bool _FSetCps(PBMHR pbmhr, CPS *pcps); bool _FChidFromModlf(PBMHR pbmhr, CHID *pchid, PBMDB *ppbmdb = pvNil); bool _FAddBmdlParent(PBMDB pbmdb, KID *pkid); bool _FInsertPhshdb(PHSHDB phshdb, PGL pglphshdb); bool _FIphshdbFromLuHash(uint luHash, long *piphshdb, PGL pglphshdb); PBMDB _PbmdbFindModlf(MODLF *pmodlf, long cbModlf, uint *pluHashList); void _InitCrcTable(void); uint _LuHashBytesNoTable(uint luHash, void *pv, long cb); uint _LuHashBytes(uint luHash, void *pv, long cb); bool _FImat34GetBmat34(BMAT34 *pbmat34, long *pimat34); void _DisposeBmhr(PBMHR *ppbmhr); bool _FDoBodyPart(PBMHR pbmhr, long ibp); void _ApplyBmdlXF(PBMHR pbmhr); void _TextureFileFromModel(Model *pmodel, PBMHR pbmhr, bool fWrapOnly = fFalse); bool _FTmapFromBmp(PBMHR pbmhr, CNO cnoPar, PSTN pstnMtrl); bool _FFlushTmaps(void); /* BKGD-specific stuff */ bool _FDumpLites(int cLite, PSTN stnBkgd); bool _FDumpCameras(int cCam, PSTN pstnBkgd, int iPalBase, int cPal); bool _FBvec3Read(PS2BLX ps2blx, BVEC3 *pbvec3, PS2BTK ps2btk); void _Bmat34FromVec3(BVEC3 *pbvec3, BMAT34 *pbmat34); void _ReadLite(PSTN pstnLite, LITE *plite); void _ReadCam(PSTN pstnCam, CAM *pcam, PGL *ppglapos); bool _FZbmpFromZpic(PSTN pstnBkgd, CNO cnoPar, int iCam, long dxp, long dyp, CAM *pcam); /* Brender-knowledgable utilities */ bool _FBrsFromS2btk(PS2BTK ps2btk, BRS *pbrs) { if (ps2btk->tok.tt == ttLong) *pbrs = BrIntToScalar(ps2btk->tok.lw); else if (ps2btk->tok.tt == ttFloat) *pbrs = BrFloatToScalar(ps2btk->fl); else return fFalse; return fTrue; } S2B(bool fSwapHand, uint mdVerbose, int iRound, int iRoundXF, achar *pszApp); ~S2B(void); public: static PS2B Ps2bNew(PFIL pfilSrc, bool fSwapHand, uint mdVerbose, int iRound, int iRoundXF, char *pszApp); bool FConvertSI(PMSNK pmsnkErr, PMSNK pmsnkDst, PFNI pfniInc = pvNil, ulong grfs2b = fs2bNil); }; #endif // !SITOBREN_H ================================================ FILE: inc/soc.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // // soc.h // // Author: Sean Selitrennikoff // // Date: August, 1994 // #ifndef SOC_H #define SOC_H #include "frame.h" #include "socdef.h" #include "socutil.h" #include "tagman.h" #include "tagl.h" #include "bren.h" #include "tmap.h" #include "modl.h" #include "mtrl.h" #include "body.h" #include "tmpl.h" #include "tdf.h" #include "tdt.h" #include "msnd.h" #include "srec.h" #include "actor.h" #include "scene.h" #include "movie.h" #include "bkgd.h" #include "tbox.h" #define kctgActn 'ACTN' #define kctgActr 'ACTR' #define kctgBds 'BDS ' #define kctgBkgd 'BKGD' #define kctgBmdl 'BMDL' #define kctgBpmp 'BPMP' #define kctgCam 'CAM ' #define kctgGgae 'GGAE' #define kctgGldc 'GLDC' // REVIEW *****: obsolete #define kctgGgcm 'GGCM' #define kctgGllt 'GLLT' #define kctgGlms 'GLMS' // motion-match sounds (under ACTN) #define kctgGgcl 'GGCL' #define kctgGlxf 'GLXF' #define kctgMsnd 'MSND' #define kctgMtrl 'MTRL' #define kctgCmtl 'CMTL' #define kctgMvie 'MVIE' #define kctgPath 'PATH' #define kctgPict 'PICT' #define kctgScen 'SCEN' #define kctgSnd 'SND ' #define kctgSoc 'SOC ' #define kctgTbox 'TBOX' #define kctgTdf 'TDF ' #define kctgTdt 'TDT ' #define kctgTmpl 'TMPL' #define kctgGlpi 'GLPI' #define kctgGlbs 'GLBS' #define kctgInfo 'INFO' #define kctgFrmGg 'GGFR' #define kctgStartGg 'GGST' #define kctgThumbMbmp 'THUM' #define kctgGltm 'GLTM' #define kctgGlbk 'GLBK' #define kctgGlcg 'GLCG' #define kctgBkth 'BKTH' // Background thumbnail #define kctgCath 'CATH' // Camera thumbnail #define kctgTmth 'TMTH' // Template thumbnail (non-prop) #define kctgPrth 'PRTH' // Prop thumbnail #define kctgAnth 'ANTH' // Action thumbnail #define kctgSvth 'SVTH' // Sounds (voice) thumbnail #define kctgSfth 'SFTH' // Sounds (FX) thumbnail #define kctgSmth 'SMTH' // Sounds (midi) thumbnail #define kctgMtth 'MTTH' // Materials thumbnail #define kctgCmth 'CMTH' // Custom materials thumbnail #define kctgTsth 'TSTH' // 3d shape thumbnail #define kctgTfth 'TFTH' // 3d font thumbnail #define kctgTcth 'TCTH' // Text color thumbnail #define kctgTbth 'TBTH' // Text background thumbnail #define kctgTzth 'TZTH' // Text size thumbnail #define kctgTyth 'TYTH' // Text style thumbnail #define khidMscb khidLimKidFrame #define khidMvieClock khidLimKidFrame + 1 #define khidRcd khidLimKidFrame + 2 #define khidMsq khidLimKidFrame + 3 #define khidMsqClock khidLimKidFrame + 4 // khidStudio khidLimKidFrame + 5 Defined in stdiodef.h #define kftgChunky MacWin('chnk', 'CHK') #define kftgContent MacWin('3con', '3CN') #define kftgThumbDesc MacWin('3thd', '3TH') #define kftg3mm MacWin('3mm', '3MM') #define kftgSocTemp MacWin('3tmp', '3TP') #define ksz3mm PszLit("3mm") // Global variables extern PTAGM vptagm; #endif !SOC_H ================================================ FILE: inc/socdef.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Socrates #defines that might get used by a source file for a tool, such as source files for the chunky compiler. This file should only contain #defines, and the values for the #defines should be constant values (no arithmetic). ***************************************************************************/ #ifndef SOCDEF_H #define SOCDEF_H #define BUG1866 #define BUG1870 #define BUG1888 #define BUG1899 #define BUG1906 #define BUG1907 #define BUG1929 #define BUG1932 #define BUG1959 #define BUG1960 #define BUG1961 #define BUG1973 #define kfps 6 // frames per second for playback and recording /*************************************************************************** Error codes ***************************************************************************/ /**************************************************** 100000 - 109999: Movie-engine-issued error codes ****************************************************/ // 100000 - 100099: general movie engine errors #define ercSocSaveFailure 100000 #define ercSocSceneSwitch 100002 #define ercSocSceneChop 100003 #define ercSocBadFile 100004 #define ercSocNoTboxSelected 100005 #define ercSocNoActrSelected 100006 #define ercSocNotUndoable 100007 #define ercSocNoScene 100008 #define ercSocBadVersion 100009 #define ercSocNothingToPaste 100010 #define ercSocBadFrameSlider 100011 #define ercSocGotoFrameFailure 100012 #define ercSocDeleteBackFailure 100013 #define ercSocActionNotApplicable 100014 #define ercSocCannotPasteThatHere 100015 #define ercSocNoModlForChar 100016 #define ercSocNameTooLong 100017 #define ercSocTboxTooSmall 100018 #define ercSocNoThumbnails 100019 #define ercSocTdtTooLong 100020 #define ercSocBadTdf 100021 #define ercSocNoActrMidi 100022 #define ercSocNoImportRollCall 100023 #define ercSocNoNukeRollCall 100024 #define ercSocSceneSortError 100025 #define ercSocCantInitSceneSort 100026 #define ercSocCantInitSplot 100027 #define ercSocNoWaveIn 100028 #define ercSocWaveInProblems 100029 #define ercSocPortfolioFailed 100030 #define ercSocCantInitStudio 100031 #define ercSoc3DWordCreate 100032 #define ercSoc3DWordChange 100033 #define ercSocWaveSaveFailure 100034 #define ercSocNoSoundName 100035 #define ercSocNoKidSndsInMovie 100036 #define ercSocCreatedUserDir 100037 #define ercSocMissingMelanieDoc 100038 #define ercSocCantLoadMelanieDoc 100039 #define ercSocBadSceneSound 100040 #define ercSocBadSoundFile 100041 #define ercSocNoDefaultFont 100042 #define ercSocCantCacheTag 100043 #define ercSocInvalidFilename 100044 #define ercSocNoSndOnPaste 100045 #define ercSocCantCopyMsnd 100046 // *If you add anything below this line you need to notify leannp about it so she can make a help topic for it* /*************************************************************************** String IDs ***************************************************************************/ // For kcnoGstApp: // REVIEW: should these (and other instances of string IDs) be kids...? */ #define idsNil (-1L) #define idsWindowTitle 0 #define idsProductLong 1 #define idsProductShort 2 #define idsDefaultUser 3 #define idsEngineCopyOf 4 #define idsEngineDefaultTitle 5 #define idsDefaultFont 6 #define idsUsersDir 12 #define idsWNetError 13 #define idsDefaultDypFont 14 #define idsPortfSaveMovieTitle 15 #define idsPortfOpenMovieTitle 16 #define idsPortfOpenSoundTitle 17 #define idsPortfOpenTextureTitle 18 #define idsPortfMovieFilterLabel 19 #define idsPortfMovieFilterExt 20 #define idsPortfSoundFilterLabel 21 #define idsPortfSoundMidiFilterExt 22 #define idsPortfSoundWaveFilterExt 23 #define idsPortfTextureFilterLabel 24 #define idsPortfTextureFilterExt 25 #define idsMelanie 26 #define idsOOM 27 #define idsExitStudio 28 #define idsSaveChangesBkp 29 #define idsConfirmExitBkp 30 #define idsDeleteSound 31 #define idsReplaceFile 32 #define idsPurgeSounds 33 /*************************************************************************** Chunk numbers ***************************************************************************/ #define kcnoGstTitles 0 #define kcnoGstError 1 #define kcnoGstMisc 2 #define kcnoGstAction 3 #define kcnoGstStudioFiles 4 #define kcnoGstBuildingFiles 5 #define kcnoGstApp 6 #define kcnoGstSharedFiles 7 #define kcnoGlcrInit 0 #define kcnoMbmpSplash 0 #define kcnoMbmpPortBackOpen 1 #define kcnoMbmpPortBtnOk 2 #define kcnoMbmpPortBtnOkSel 3 #define kcnoMbmpPortBtnCancel 4 #define kcnoMbmpPortBtnCancelSel 5 #define kcnoMbmpHomeLogo 6 #define kcnoMbmpPortBtnHome 7 #define kcnoMbmpPortBtnHomeSel 8 #define kcnoMbmpPortBackSave 9 #define kcnoMidiSplash 0 /*************************************************************************** Commands ***************************************************************************/ #define cidCopyRoute 44000 #define cidCopyTool 44001 #define cidCutTool 44002 #define cidPasteTool 44003 #define WM_QUERY_EXISTS 44004 #define WM_QUERY_LOCATION 44005 #define WM_SET_MOVIE_POS 44006 #define cidRender 44007 #define cidActorPlaced 44008 #define cidActorPlacedOutOfView 44009 #define cidActorClicked 44010 #define cidMviePlaying 44011 #define cidTboxClicked 44012 #define cidMovieGoto 44013 #define cidShiftCut 44014 #define cidShiftCopy 44015 #define cidActorClickedDown 44016 #define cidDeactivate 44017 #define cidSceneLoaded 44018 #endif // SOCDEF_H ================================================ FILE: inc/socdefn.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // ----------------------------------------------------- // #define'd values for US / Z Version of Socrates // ----------------------------------------------------- // ----------------------------------------------------- // the Place object descriptors // these values are typically the 'base' of the objects // within the place. // ----------------------------------------------------- #include // Shared objects -- cursors, map, portfolio. #include // ----------------------------------------------------- // Help balloon and control definitions // ----------------------------------------------------- #include #ifndef SOCDEFN_H #define SOCDEFN_H #define kgobInit 0x00012100 // Initialize globals // #define kgobPortfolio 0x00012200 // Portfolio object #define kgobMovie 0x00012300 // Movie viewer object // ----------------------------------------------------- // Definitions of objects within various places/objects // ----------------------------------------------------- #define kgobMcZeeRoller 0x00010301 #define kgobMcZeePacker 0x00010302 #define kgobStreetMcZee 0x00010401 #define kgobStreetMask 0x00010402 #define kgobTicket1Doors 0x00010501 #define kgobTicket1Waiter 0x00010502 #define kgobTicket2Exit 0x00010581 #define kgobTicket2Map 0x00010582 #define kgobTicket2McZee 0x00010583 #define kgobTicket2Cans 0x00010584 #define kgobTicket2Camera 0x00010585 #define kgobTic1m1 0x00010586 #define kgobTicketMcZeeAVI 0x00010587 #define kgobTicketMcZeeAVI2 0x00010588 #define kgobLobby1Poster1 0x00010601 #define kgobLobby1Poster2 0x00010602 #define kgobLobby1Poster3 0x00010603 #define kgobLobby1Poster4 0x00010604 #define kgobLobby1SnackSign 0x00010605 #define kgobLobby1Door 0x00010607 #define kgobLobby1McZee 0x00010608 #define kgobLobby1m1 0x00010609 #define kgobLobbyAVI 0x0001060a #define kgobLobby2Doors 0x00010703 #define kgobLobby2Exit 0x00010704 #define kgobLobby2Map 0x00010705 #define kgobLobby2m1 0x00010706 #define kgobLobby2m2 0x00010707 #define kgobLobby2m3 0x00010708 #define kgobSnackbarMczee 0x00010806 #define kgobLobby3m1 0x00010807 #define kgobLobby3m2 0x00010808 #define kgobWaitingCouch 0x00010901 #define kgobWaitingPicture 0x00010902 #define kgobInsp1McZee 0x00011401 #define kgobSplotMachine 0x00011402 #define kgobTalentBook 0x00011403 #define kgobIdea1m1 0x00011404 #define kgobIdea2m1 0x00011405 #define kgobIdea3m1 0x00011406 #define kgobIdea3m2 0x00011407 #define kgobIdea3m3 0x00011408 #define kgobIdea3m4 0x00011409 #define kgobIdea4m1 0x0001140a #define kgobIdea4m2 0x0001140b #define kgobIdea4m3 0x0001140c #define kgobIdeaMcZeeAVI1 0x0001140d #define kgobIdeaMcZeeAVI2 0x0001140e #define kgobIdeaMcZeeAVI3 0x0001140f #define kgobStudio1Tools 0x00011801 #define kgobStudio1McZee 0x00011802 #define kgobToolsIntroAVI 0x00011803 #define kgobStudio1TV 0x00011804 #define kgobStdo1m1 0x00011805 #define kgobStudio2Doors 0x00011901 #define kgobStudio2Exit 0x00011902 #define kgobStudio2Map 0x00011903 #define kgobStudio2ExitWord 0x00011904 #define kgobStdo4m1 0x00011905 #define kgobStdo4m2 0x00011906 #define kgobStdo4m3 0x00011907 #define kgobStdo4m4 0x00011908 #define kgobStdo3m1 0x00011909 #define kgobStdo3m2 0x0001190a #define kgobStdo3m3 0x0001190b #define kgobStdo2m1 0x0001190c #define kgobStdo2m2 0x0001190d #define kgobStdo2m3 0x0001190e #define kgobStdo2m4 0x0001190f #define kgobTheatre1LeftDoor 0x00010c01 #define kgobTheatre1RightDoor 0x00010c02 #define kgobTheatre1McZee 0x00010c03 #define kgobPlayButton 0x00010c04 #define kgobStopButton 0x00010c05 #define kgobRewindButton 0x00010c06 #define kgobVolumeButton 0x00010c07 #define kgobCountDn 0x00010c08 #define kgobMovieClickFilter 0x00010c09 #define kgobTheaterVolume 0x00010c0a #define kgobTheatre2Door 0x00010d01 #define kgobTheatre2Exit 0x00010d02 #define kgobTheatre2Map 0x00010d03 #define kgobTheater2m1 0x00010d04 #define kgobTheater2m2 0x00010d05 #define kgobTheater2m3 0x00010d06 #define kgobTheatre3Right 0x00010e01 #define kgobTheatre3Door 0x00010e02 #define kgobTheatre3Exit 0x00010e03 #define kgobTheatre3Map 0x00010e04 #define kgobTheatre4Left 0x00010f01 #define kgobTheatre4Door 0x00010f02 #define kgobTheatre4Exit 0x00010f03 #define kgobTheatre4Map 0x00010f04 #define kgobTheatre4McZee 0x00010f05 #define kgobThe4OpenDoor 0x00010f06 #define kgobBackstage1Insp 0x00011001 #define kgobBackstage1Studio 0x00011002 #define kgobBackstage1Proj 0x00011003 #define kgobIdeaDoor 0x00011004 #define kgobBackstage1Bag 0x00011005 #define kgobProjectDoor 0x00011006 #define kgobStudioDoor 0x00011007 #define kgobBackstage1Shadow 0x00011008 #define kgobBackstageMcZeeAVI 0x00011009 #define kgobBackstageMcZee 0x0001100a #define kgobBackstageMcZeeAVI1 0x0001100b #define kgobBackstageMcZeeAVI2 0x0001100c #define kgobBackstageMcZeeAVI3 0x0001100d #define kgobBackstageMcZeeAVI4 0x0001100e #define kgobBackstageMcZeeAVI5 0x0001100f #define kgobBackstageMcZeeAVI6 0x00011010 #define kgobBackstage2Left 0x00011103 #define kgobBackstage2Right 0x00011104 #define kgobBackstage2Exit 0x00011105 #define kgobBackstage2Map 0x00011106 #define kgobBackstage2m1 0x00011107 #define kgobBackstage2m2 0x00011108 #define kgobInsp2Doors 0x00011501 #define kgobInsp2Exit 0x00011502 #define kgobInsp2Map 0x00011503 #define kgobProj1Melanie 0x00011b01 #define kgobProj1Mon1 0x00011b02 #define kgobProj1Mon2 0x00011b03 #define kgobProj1Cart 0x00011b04 #define kgobFlyingLogos 0x00011b05 #define kgobMovieTech 0x00011b06 #define kgobPrjt1m1 0x00011b07 #define kgobMelAVI 0x00011b08 #define kgobProj2Doors 0x00011c01 #define kgobProj2Exit 0x00011c02 #define kgobProj2Map 0x00011c03 #define kgobPrjt2m1 0x00011c04 #define kgobPrjt2m2 0x00011c05 #define kgobPrjt2m3 0x00011c06 #define kgobPrjt2m4 0x00011c07 #define kgobPrjt2m5 0x00011c08 #define kgobPrjt4m1 0x00011c09 #define kgobPrjt4m2 0x00011c0a #define kgobPrjt4m3 0x00011c0b #define kgobPrjt4m4 0x00011c0c #define kgobTvViewL 0x00011c0d #define kgobTvViewR 0x00011c0e // Duplicate definition in shared\map.chh #define kgobMapHere 0x00012003 #define kgobTalentBookObj 0x00012204 #define kgobSplotMachineObj 0x00012205 #define kgobBSplot1 0x00012206 #define kgobBSplot2 0x00012207 #define kgobBSplot3 0x00012208 #define kgobBSplot4 0x00012209 #define kgobBSplot5 0x0001220a #define kgobBSplot6 0x0001220b #define kgobBSplot7 0x0001220c #define kgobSplotView 0x0001220d #define kgobSplotGlass 0x0001220e // ----------------------------------------------------- // Common object definitions // ----------------------------------------------------- #define kgobPortfolio 0x00010101 #define kgobPortIcon 0x00010102 #define kgobCarpetBag 0x00010105 #define kgobVolume 0x00010106 #define kgobSwitcher 0x00010107 #define kgobNavbarLeft 0x00010108 #define kgobNavbarRight 0x00010109 #define kgobNavbarDown 0x0001010a // ----------------------------------------------------- // Common object bit flag definitions (for Util) // ----------------------------------------------------- #define kflgPortfolio 0x00000001 #define kflgPortIcon 0x00000002 #define kflgMap 0x00000004 #define kflgCarpetBag 0x00000020 #define kflgVolume 0x00000040 #define kflgSwitcher 0x00000080 #define kflgNavbarLeft 0x00000100 #define kflgNavbarRight 0x00000200 #define kflgNavbarDown 0x00000400 // ----------------------------------------------------- // Palette Definition // ----------------------------------------------------- #define kpalSocBase 0x00010000 #define kpalImaginopolis 0x00010001 #define kpalSocTicket 0x00010002 #define kpalSocLobby 0x00010003 #define kpalSocTheatre 0x00010004 #define kpalSocBackstage 0x00010005 #define kpalSocInspiration 0x00010006 #define kpalSocStudio 0x00010007 #define kpalSocProjects 0x00010008 #define kpalSocStreet 0x00010009 // ----------------------------------------------------- // Sound definitions? Midi definitions? // ----------------------------------------------------- #define kwavSplash 0x00010001 #define kwavBingo 0x00010003 // 0x00010010 Reserved for sound // 0x00010030 definations in sharutil.chh. // ----------------------------------------------------- // help TOPIC definitions // ----------------------------------------------------- #define ktpcLoginGetName 0x00018540 #define ktpcLoginInst 0x00018541 #define ktpcLoginChoice 0x00018542 #define ktpcQuitAlert 0x00018543 #define ktpcYouHere 0x00018547 #define ktpcTicketChoices 0x00018548 #define ktpcSplashCredits 0x0001854e #define ktpcHelpAbout 0x0001854f #define ktpcInit 0x00018550 #define ktpcLobbyTip 0x00018551 #define ktpcTheatre1 0x00018552 #define ktpcTheatre2 0x00018553 #define ktpcBackstage 0x00018555 #define ktpcProject1 0x00018556 #define ktpcIdeas 0x00018557 #define ktpcSplotIdea 0x00018558 #define ktpcSplotIdea2 0x00018559 #define ktpcStudio1 0x0001855a // voice over help topics + waves #define ktpcVO04AA 0x00018000 #define ktpcVO5 0x00018001 #define ktpcVO6 0x00018002 #define ktpcVO6A 0x00018003 #define ktpcVO6B 0x00018004 #define ktpcVO6BB 0x00018005 #define ktpcVO6C 0x00018006 #define ktpcVO8 0x00018007 #define ktpcVO10 0x00018008 #define ktpcVO11C 0x00018009 #define ktpcVO11CC 0x0001800a #define ktpcVO11CCC 0x0001800b #define ktpcVO01A 0x0001800c #define ktpcVO16 0x0001800d #define ktpcVO17 0x0001800e #define ktpcVO28A 0x0001800f #define ktpcVO28B 0x00018010 #define ktpcVO28 0x00018011 #define ktpcVO31 0x00018012 #define ktpcVO32 0x00018013 #define ktpcVO32B 0x00018014 #define ktpc04_logn3 0x00018015 #define ktpcVO36 0x00018016 #define ktpcVO37 0x00018017 #define ktpcVO38 0x00018018 #define ktpcVO39 0x00018019 #define ktpcVO40 0x0001801a #define ktpcVO41 0x0001801b #define ktpcVO43 0x0001801c #define ktpcTBCY2 0x0001801e #define ktpcTBTH3 0x0001801f #define ktpcTKTBTH 0x00018020 #define ktpcVO54 0x00018021 #define ktpcVO56B 0x00018022 #define ktpcVO57A 0x00018023 #define ktpcVO58 0x00018024 #define ktpcVO59 0x00018025 #define ktpcVO60 0x00018026 #define ktpc21_thr1a 0x00018027 #define ktpcVO71A 0x00018028 #define ktpcVO74B 0x00018029 #define ktpcVO76 0x0001802a #define ktpcVO75D 0x0001802b #define ktpcVO79 0x0001802c #define ktpcVO80AA 0x0001802d #define ktpcVO80A 0x0001802e #define ktpcVO80B 0x0001802f #define ktpcVO83 0x00018030 #define ktpcVO86 0x00018031 #define ktpcVO91 0x00018032 #define ktpcVO93 0x00018033 #define ktpcVO93A 0x00018034 #define ktpcVO94 0x00018035 #define ktpcVO57 0x00018037 #define ktpcStd1B 0x00018038 #define ktpcVO57AA 0x0001803a #define ktpcStd1A 0x0001803b // These three MUST be consecutive! #define ktpcVO97A 0x0001803c // Used in Studio1 for Random McZee #define ktpcVO97B 0x0001803d // wait state. #define ktpcVO53 0x00018040 #define ktpc30_thr4 0x00018041 #define ktpcVO75 0x00018043 #define ktpcPrjt2A 0x00018044 #define ktpcVO40A 0x00018048 #define ktpcVO40E 0x00018049 #define kwavVO04AA 0x00018000 #define kwavVO5 0x00018001 #define kwavVO6 0x00018002 #define kwavVO6A 0x00018003 #define kwavVO6B 0x00018004 #define kwavVO6BB 0x00018005 #define kwavVO6C 0x00018006 #define kwavVO8 0x00018007 #define kwavVO10 0x00018008 #define kwavVO11C 0x00018009 #define kwavVO11CC 0x0001800a #define kwavVO11CCC 0x0001800b #define kwavVO01A 0x0001800c #define kwavVO16 0x0001800d #define kwavVO17 0x0001800e #define kwavVO28A 0x0001800f #define kwavVO28B 0x00018010 #define kwavVO28 0x00018011 #define kwavVO31 0x00018012 #define kwavVO32 0x00018013 #define kwavVO32B 0x00018014 #define kwav04_logn3 0x00018015 #define kwavVO37 0x00018017 #define kwavVO38 0x00018018 #define kwavVO39 0x00018019 #define kwavVO40 0x0001801a #define kwavVO41 0x0001801b #define kwavVO43 0x0001801c #define kwavTBCY2 0x0001801d #define kwavTBTH3 0x0001801f #define kwavTKTBTH 0x00018020 #define kwavVO56B 0x00018022 #define kwavVO57A 0x00018023 #define kwavVO58 0x00018024 #define kwavVO59 0x00018025 #define kwavVO60 0x00018026 #define kwav21_thr1a 0x00018027 #define kwavVO71A 0x00018028 #define kwavVO74B 0x00018029 #define kwavVO76 0x0001802a #define kwavVO75D 0x0001802b #define kwavVO79 0x0001802c #define kwavVO80AA 0x0001802d #define kwavVO80A 0x0001802e #define kwavVO80B 0x0001802f #define kwavVO83 0x00018030 #define kwavVO86 0x00018031 #define kwavIdea1a 0x00018032 #define kwavIdea1b 0x00018033 #define kwavIdea2 0x00018034 #define kwavIdea3 0x00018035 #define kwavIdea4 0x00018036 #define kwavVO94B 0x00018037 #define kwavVO57 0x00018039 #define kwavStd1B 0x0001803a #define kwavVO57AA 0x0001803c #define kwavVO292A 0x00018100 #define kwavVO86A 0x00018101 #define kwavVO86B 0x00018102 #define kwavStd1A 0x00018103 // These three MUST be consecutive! #define kwavVO97A 0x00018104 // Used in Studio1 for Random McZee #define kwavVO97B 0x00018105 // wait state. #define kwavVO53 0x00018106 #define kwav30_thr4 0x00018107 #define kwavVO75 0x00018108 #define kwavPrjt1 0x00018109 #define kwavPrjt2A 0x0001810a #define kwav21_thr1b 0x0001810d #define kwavStudioIntro 0x0001810e #define kwavVO54 0x0001810f #define kwavRollerCoaster 0x00018110 #define kwavTicketFar 0x00018111 #define kwavPrjtMonitor 0x00018112 #define kwavStudioTVPop 0x00018113 #define kwavBioCancel 0x00018114 #define kwavBioPopup 0x00018115 // music definitions //----------------------------------------------------- // Shared MIDI music definitions //----------------------------------------------------- #define kmidBackstage 0x00010011 #define kmidBoothjam 0x00010012 #define kmidCloset 0x00010013 #define kmidCoaster 0x00010014 #define kmidIdeas 0x00010015 #define kmidJamloop 0x00010016 #define kmidLobby 0x00010017 #define kmidProject 0x00010018 #define kmidSnack 0x00010019 #define kmidStudio 0x0001001a #define kmidTag 0x0001001b #define kmidTheatre 0x0001001c #define kmidRollerCoaster 0x0001001d #endif ================================================ FILE: inc/socres.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /******************************************************************* * * socres.h * * Copyright (C) Microsoft Corporation 1993. * All Rights reserved. * * * Description: Include file for application product id info * ******************************************************************/ // // RCDATA blocks // #define RC_PID_NUMBER 128 // NNNNNSSSXXXXXXX\0 #define RCDATA 10 ================================================ FILE: inc/socutil.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* * * socutil.h * * This file contains miscellaneous includes and definitions * that are global to the Socrates product. * */ #ifndef SOCUTIL_H #define SOCUTIL_H extern "C" { #include "brender.h" }; typedef class ACTR *PACTR; typedef class SCEN *PSCEN; typedef class MVIE *PMVIE; typedef class BKGD *PBKGD; typedef class TBOX *PTBOX; typedef class MVIEW *PMVIEW; typedef class STDIO *PSTDIO; // // // Class for undo items in a movie // // NOTE: All the "Set" functions are done automagically // in MVIE::FAddUndo(). // // typedef class MUNB *PMUNB; #define MUNB_PAR UNDB #define kclsMUNB 'MUNB' class MUNB : public MUNB_PAR { RTCLASS_DEC ASSERT protected: PMVIE _pmvie; long _iscen; long _nfrm; MUNB(void) { } public: void SetPmvie(PMVIE pmvie) { _pmvie = pmvie; } PMVIE Pmvie(void) { return _pmvie; } void SetIscen(long iscen) { _iscen = iscen; } long Iscen(void) { return _iscen; } void SetNfrm(long nfrm) { _nfrm = nfrm; } long Nfrm(void) { return _nfrm; } }; // // Undo object for actor operations // typedef class AUND *PAUND; #define AUND_PAR MUNB #define kclsAUND 'AUND' class AUND : public AUND_PAR { RTCLASS_DEC MARKMEM ASSERT protected: PACTR _pactr; long _arid; bool _fSoonerLater; bool _fSndUndo; long _nfrmLast; STN _stn; // actor's name AUND(void) { } public: static PAUND PaundNew(void); ~AUND(void); void SetPactr(PACTR pactr); void SetArid(long arid) { _arid = arid; } void SetSoonerLater(bool fSoonerLater) { _fSoonerLater = fSoonerLater; } void SetSndUndo(bool fSndUndo) { _fSndUndo = fSndUndo; } void SetNfrmLast(long nfrmLast) { _nfrmLast = nfrmLast; } void SetStn(PSTN pstn) { _stn = *pstn; } bool FSoonerLater(void) { return _fSoonerLater; }; bool FSndUndo(void) { return _fSndUndo; }; virtual bool FDo(PDOCB pdocb); virtual bool FUndo(PDOCB pdocb); }; // // Definition of transition types // enum TRANS { transNil = -1, transCut, transFadeToBlack, transFadeToWhite, transDissolve, transBlack, transLim }; #endif // SOCUTIL_H ================================================ FILE: inc/splot.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** splot.h: Splot machine class Primary Author: ****** Review Status: Reviewed ***************************************************************************/ #define SPLOT_PAR GOK typedef class SPLOT *PSPLOT; #define kclsSPLOT 'splt' class SPLOT : public SPLOT_PAR { RTCLASS_DEC ASSERT MARKMEM CMD_MAP_DEC(SPLOT) private: /* The movie */ PMVIE _pmvie; /* The lists of content */ PBCL _pbclBkgd; SFL _sflBkgd; PBCL _pbclCam; SFL _sflCam; PBCL _pbclActr; SFL _sflActr; PBCL _pbclProp; SFL _sflProp; PBCL _pbclSound; SFL _sflSound; /* Current selected content */ long _ithdBkgd; long _ithdCam; long _ithdActr; long _ithdProp; long _ithdSound; /* State of the SPLOT */ bool _fDirty; /* Miscellaneous stuff */ PGL _pglclrSav; SPLOT(PGCB pgcb) : SPLOT_PAR(pgcb) { _fDirty = fFalse; _pbclBkgd = _pbclCam = _pbclActr = _pbclProp = _pbclSound = pvNil; } public: ~SPLOT(void); static PSPLOT PsplotNew(long hidPar, long hid, PRCA prca); bool FCmdInit(PCMD pcmd); bool FCmdSplot(PCMD pcmd); bool FCmdUpdate(PCMD pcmd); bool FCmdDismiss(PCMD pcmd); PMVIE Pmvie(void) { return _pmvie; } }; ================================================ FILE: inc/srec.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** srec.h: Sound Recording class Primary Author: ****** (based on ***** original srec) Review Status: reviewed BASE ---> SREC ***************************************************************************/ #ifndef SREC_H #define SREC_H #include "audioman.h" /**************************************** RIFF Header helper class ****************************************/ #ifdef MAC #define RIFF_TAG 'RIFF' #define WAVE_TAG 'WAVE' #define FMT__TAG 'fmt ' #define DATA_TAG 'data' #define FACT_TAG 'fact' #else #define RIFF_TAG 'FFIR' // RIFF #define WAVE_TAG 'EVAW' // WAVE #define FMT__TAG ' tmf' // fmt_ #define DATA_TAG 'atad' // data #define FACT_TAG 'tcaf' // fact #endif #pragma pack(push, _SOCPACK_) #pragma pack(1) class RIFF { private: DWORD _dwRiffTag; DWORD _dwRiffLength; DWORD _dwWaveTag; DWORD _dwFmtTag; DWORD _dwFmtLength; WAVEFORMATEX _wfx; DWORD _dwDataTag; DWORD _dwDataLength; public: void Set(long cchan, long csampSec, long cbSample, DWORD dwLength) { _dwRiffTag = RIFF_TAG; _dwRiffLength = sizeof(RIFF) + dwLength; _dwWaveTag = WAVE_TAG; _dwFmtTag = FMT__TAG; _dwFmtLength = sizeof(WAVEFORMATEX); _wfx.wFormatTag = WAVE_FORMAT_PCM; _wfx.nChannels = (ushort)cchan; _wfx.nSamplesPerSec = csampSec; _wfx.nAvgBytesPerSec = csampSec * cbSample * cchan; _wfx.nBlockAlign = (ushort)cchan * (ushort)cbSample; _wfx.wBitsPerSample = (ushort)LwMul(8, cbSample); _wfx.cbSize = 0; _dwDataTag = DATA_TAG; _dwDataLength = dwLength; } LPWAVEFORMATEX PwfxGet() { return &_wfx; }; DWORD Cb() { return sizeof(RIFF) + _dwDataLength; }; }; #pragma pack(pop, _SOCPACK_) /**************************************** The sound recording class ****************************************/ typedef class SREC *PSREC; #define SREC_PAR BASE #define kclsSREC 'SREC' class SREC : public SREC_PAR { RTCLASS_DEC ASSERT MARKMEM protected: long _csampSec; // sampling rate (number of samples per second) long _cchan; // 1 = mono, 2 = stereo long _cbSample; // bytes per sample (1 = 8 bit, 2 = 16 bit, etc) ulong _dtsMax; // maximum length to record bool _fRecording; bool _fPlaying; bool _fHaveSound; // have you recorded a sound yet? bool _fBufferAdded; // have added record buffer HWAVEIN _hwavein; // handle to wavein device WAVEHDR _wavehdr; // wave hdr for buffer LPMIXER _pmixer; // pointer to Audioman Mixer LPCHANNEL _pchannel; // pointer to Audioman Channel LPSOUND _psnd; // psnd for current sound RIFF *_priff; // pointer to riff in memory bool _FOpenRecord(); bool _FCloseRecord(); static void _WaveInProc(HWAVEIN hwi, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2); protected: bool _FInit(long csampSec, long cchan, long cbSample, ulong dtsMax); void _UpdateStatus(void); public: static PSREC PsrecNew(long csampSec, long cchan, long cbSample, ulong dtsMax); ~SREC(void); bool FStart(void); bool FStop(void); bool FPlay(void); bool FRecording(void); bool FPlaying(void); bool FSave(PFNI pfni); bool FHaveSound(void) { return _fHaveSound; } }; #endif SREC_H ================================================ FILE: inc/stdiodef.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Defines for all the studio placing, cids, etc. *** USE SPACES FOR ALIGNMENT *** ***************************************************************************/ #ifndef STDIODEF_H #define STDIODEF_H // Define this flag to enable frame-per-second display code // #define SHOW_FPS #include "socdef.h" #include "utestres.h" // // Cache size needed for the studio // #define kcbStudioCache (256 * 1024) // // Tooltip delay. // // The time below is in 60ths of a second (see clok.h in kauai - // couldn't use kdtim... 'cause it's defined to be a const long ) #define kdtimToolTipDelay 90 // // Cids for script->code communication // #define cidXYAxis 50000 #define cidXZAxis 50001 #define cidRecordPath 50002 #define cidRerecordPath 50003 #define cidSetTool 50004 #define cidPlay 50005 #define cidNewScene 50006 #define cidRespectGround 50009 #define cidPauseUntilClick 50010 #define cidPauseForSound 50011 #define cidClearPause 50012 #define cidBrowserFwd 50013 #define cidBrowserBack 50014 #define cidBrowserCancel 50015 #define cidBrowserOk 50016 #define cidBrowserSelect 50017 #define cidBrowserReady 50018 #define cidBrowserPreview 50019 #define cidBrowserSelectThum 50020 #define cidFrameScrollbar 50021 #define cidSceneScrollbar 50022 #define cidSooner 50023 #define cidLater 50024 #define cidEaselTransmogrify 50025 #define cidEaselRotate 50026 #define cidEaselCancel 50027 #define cidEaselOk 50028 #define cidNewSpletter 50029 #define cidSceneSortInit 50030 #define cidSceneSortSelect 50031 #define cidSceneSortInsert 50032 #define cidSceneSortScroll 50033 #define cidSceneSortNuke 50034 #define cidSceneSortOk 50035 #define cidSceneSortCancel 50036 #define cidSceneSortPortfolio 50037 #define cidSceneSortTransition 50038 #define cidSSorterNuke 50039 #define cidSSorterHand 50040 #define cidSSorterSelect 50041 #define cidApeSetAction 50042 #define cidApeNextCel 50043 #define cidEaselKey 50044 #define cidStartScroll 50045 #define cidEaselImport 50046 #define cidEaselTexture 50047 #define cidEaselShape 50048 #define cidEaselFont 50049 #define cidEaselSetFont 50050 #define cidEaselSetShape 50051 #define cidEaselSetColor 50052 #define cidEaselClosing 50053 #define cidEaselAccessories 50054 #define cidTextFont 50055 #define cidTextStyle 50056 #define cidTextSize 50057 #define cidTextColor 50058 #define cidTextBkgdColor 50059 #define cidLoadStudio 50060 #define cidLoadBuilding 50061 #define cidTextSetColor 50062 #define cidTextSetBkgdColor 50063 #define cidTheaterOpen 50064 #define cidTheaterLoad 50065 #define cidTheaterPlay 50066 #define cidTheaterStop 50067 #define cidTheaterRewind 50068 #define cidTheaterClose 50069 #define cidBrowserImport 50070 #define cidEaselVol 50071 #define cidEaselPlay 50072 #define cidListenVolSet 50073 #define cidLaunchImport 50074 #define cidPortfolioFile 50075 #define cidEaselRecord 50076 #define cidEaselCostumes 50077 #define cidTextSetFont 50078 #define cidTextSetSize 50079 #define cidPortfolioOpen 50080 #define cidPortfolioSave 50081 #define cidPortfolioClosed 50082 #define cidSplotInit 50083 #define cidSplotDo 50084 #define cidSplotUpdate 50085 #define cidSplotOk 50086 #define cidSplotCancel 50087 #define cidOpenSoundRecord 50088 #define cidRecordSetLength 50089 #define cidLoadProjectMovie 50090 #define cidPortfolioClear 50091 #define cidBrowserChangeCel 50092 #define cidDisableAccel 50093 #define cidEnableAccel 50094 #define cidInvokeSplot 50095 #define cidBrowserDel 50096 #define cidTextSetStyle 50097 #define cidProjectMovieLoaded 50098 #define cidBrowserVisible 50099 #define cidTheaterOpenCompleted 50100 #define cidTheaterLoadCompleted 50101 #define cidEaselVisible 50102 #define cidSoundsEnabled 50103 #define cidCreateTbox 50104 #define cidExitStudio 50105 #define cidModalTopicClosed 50106 #define cidLoadStudioFailed 50107 #define cidActorEaselOpen 50108 #define cidListenerEaselOpen 50109 #define cidLoadStudioDoc 50110 #define cidPortfolioResult 50111 #define cidFrameThumb 50112 #define cidSceneThumb 50113 #define cidQuerySaveDocResult 50114 // Misc Studio Strings #define idsBrowserPage 0 #define idsSoundFont 7 #define idsActionFont 8 #define idsListenFont 9 #define idsRollCallFont 10 #define idsBrwsPageFont 11 #define idsTboxDypFont 12 #define idsStudioFont 13 #define idsMovieNameDypFont 29 // // String Registry Entries // #define kstidActor 0x00500 // Thru 504 #define kstidProp 0x00510 // Thru 514 #define kstidQuerySave 0x00525 #define kstidQueryCD 0x00526 #define kstidQuerySoundDelete 0x00527 #define kstidQueryOverwrite 0x00528 #define kstidGenericError 0x00529 // // Ids for each gob within the studio // #define kidStudio 0x20000 #define kidPalette 0x20001 #define kidBackground 0x20002 #define kidSettingsCover 0x20005 #define kidActorsCover 0x20006 #define kidSoundsCover 0x20007 #define kidTextsCover 0x20008 #define kidScrollbarsCover 0x2000B #define kidUndosCover 0x2000D #define kidBooksCover 0x2000E #define kidDoors 0x2000F #define kidSettingsBackground 0x20010 #define kidActorsBackground 0x20011 #define kidSoundsBackground 0x20012 #define kidTextsBackground 0x20013 #define kidSettingsCameras 0x20014 #define kidActorsSelect 0x20015 #define kidActorsBiography 0x20016 #define kidActorsCompose 0x20017 #define kidActorsCostume 0x20018 #define kidActorsNormalizeRot 0x20019 #define kidBrwsAction 0x2001A #define kidActorsRecordMode 0x2001B #define kidActorsRotateX 0x2001C #define kidActorsRotateY 0x2001D #define kidActorsRotateZ 0x2001E #define kidActorsSooner 0x2001F #define kidActorsSquash 0x20020 #define kidActorsShrink 0x20021 #define kidActorsXY 0x20022 #define kidActorsXZ 0x20023 #define kidActorsGround 0x20024 #define kidSoundsMixer 0x20025 #define kidSoundsPlayOnce 0x20026 #define kidSoundsListen 0x20027 #define kidSoundsRecord 0x20028 #define kidSoundsLooping 0x20029 #define kidSoundsAttachToCell 0x2002A #define kidSoundsClear 0x2002B #define kidTextsBkgdColor 0x2002C #define kidTextsFontShape 0x2002D #define kidTextsFontColor 0x2002E #define kidTextsFont 0x2002F #define kidTextsSelect 0x20030 #define kidTextsScroll 0x20031 #define kidTextsFontSize 0x20032 #define kidTextsStory 0x20033 #define kidBook 0x20034 #define kidMap 0x20035 #define kidCutCopyPaste 0x20036 #define kidUndo 0x20037 #define kidVolumeSlider 0x20038 #define kidPlay 0x20039 #define kidSceneSorter 0x2003A #define kidPortfolio 0x2003C #define kidExit 0x2003D #define kidBrwsBackground 0x2003E #define kidBrwsActor 0x2003F #define kidBrwsProp 0x20040 #define kidBrwsThreeD 0x20041 #define kidSettingsBrowser 0x20042 #define kidBrwsMidi 0x20043 #define kidBrwsFX 0x20044 #define kidBrwsSpeech 0x20045 #define kidTextsCreate 0x20046 #define kidPortsBackground 0x20047 #define kidPortsPortfolio 0x20048 #define kidPortsNew 0x20049 #define kidPortsSave 0x2004A #define kidPausesMouse 0x2004C #define kidPausesClear 0x2004D #define kidPausesSound 0x2004E #define kidCCPBackground 0x2004F #define kidCCPSceneChopFwd 0x20050 #define kidCCPSceneNuke 0x20051 #define kidCCPActorNuke 0x20052 #define kidCCPCopyRoute 0x20053 #define kidCCPPaste 0x20054 #define kidCCPCopy 0x20055 #define kidCCPCut 0x20056 #define kidGenericCancel 0x20058 #define kidGenericOk 0x20059 #define kidGenericPageFwd 0x2005A #define kidGenericPageBack 0x2005B #define kidCameraFrame 0x2005C #define kidWorkspace 0x2005D #define kidBackground1 0x2005E #define kidBackground2 0x2005F #define kidBackground3 0x20060 #define kidBackground4 0x20061 #define kidCCPSceneChopBack 0x20062 #define kidActorsContinue 0x20063 #define kidActorsRotate 0x20064 #define kidActorsTransform 0x20065 #define kidRotateBackground 0x20066 #define kidTransformBackground 0x20067 #define kidScrollBackground 0x20068 #define kidTextsScrollType 0x20069 #define kidBrowserObj 0x2006A #define kidActorsRotateNorm 0x2006B #define kidActorsTransformNorm 0x2006C #define kidBrwsSceneFrame 0x2006D // CNO for Scene browser frame #define kidBrwsActorFrame 0x2006E // CNO for Actor browser frame #define kidBrwsMaterial 0x2006F #define kidBrwsCMaterial 0x20070 #define kidBrwsFonts 0x20071 #define kidBrwsForeColor 0x20072 #define kidBrwsBackColor 0x20073 #define kidBrwsTextSize 0x20074 #define kidActorsBrowser 0x20075 // the button itself #define kidActorsPropBrowser 0x20076 // the button itself #define kidActorsSpletters 0x20077 // the button itself #define kidSoundsEfxBrowser 0x20078 // the button itself #define kidSoundsMicBrowser 0x20079 // the button itself #define kidSoundsMusicBrowser 0x2007A // the button itself #define kidActorsActionBrowser 0x2007B // the button itself #define kidBrwsCamera 0x2007C #define kidBrwsCameraFrame 0x2007D // CNO for Camera browser frame #define kidBrwsPropFrame 0x2007E // CNO for Camera browser frame #define kidBrwsActionFrame 0x2007F // CNO for Camera browser frame #define kidBrwsActionPrev 0x20080 // The action preview frame. #define kidGenericGlass 0x20081 // Covers all the tools to protect them from clicks #define kidFrameBackground 0x20082 #define kidFrameTitle 0x20083 #define kidFrameText 0x20084 #define kidFrameFW 0x20085 #define kidFrameFWEnd 0x20086 #define kidFrameRW 0x20087 #define kidFrameRWEnd 0x20088 #define kidFrameScrollbar 0x20089 #define kidFrameThumb 0x2008A #define kidSceneBackground 0x2008B #define kidSceneTitle 0x2008C #define kidSceneText 0x2008D #define kidSceneFW 0x2008E #define kidSceneFWEnd 0x2008F #define kidSceneRW 0x20090 #define kidSceneRWEnd 0x20091 #define kidSceneScrollbar 0x20092 #define kidSceneThumb 0x20093 #define kidName 0x20094 #define kidPortsSaveAs 0x20095 #define kidRollCallActor 0x20096 #define kidRollCallProp 0x20097 #define kidCCPTboxNuke 0x20098 #define kidFps 0x20099 #define kidActorsSoonerButton 0x2009B #define kidActorsLaterButton 0x2009C #define kidBrwsRollCall 0x2009D #define kidSpltBackground 0x2009E #define kidSpltTransmogrify 0x2009F #define kidSpltTextures 0x200A0 #define kidSpltShape 0x200A1 #define kidSpltRotate 0x200A2 #define kidSpltImportTexture 0x200A3 #define kidSpltCancel 0x200A4 #define kidSpltOk 0x200A5 #define kidSpltPreviewFrame 0x200A6 #define kidSpltFont 0x200A7 #define kidCostBackground 0x200A8 #define kidCostCostumes 0x200A9 #define kidCostRotate 0x200AA #define kidCostAccessories 0x200AB #define kidCostCancel 0x200AC #define kidCostOk 0x200AD #define kidCostPreviewFrame 0x200AE /* Scene sorter */ #define kidSSorterBackground 0x200AF #define khidSceneSorter 0x200B0 #define kidSSorterOpen 0x200B1 #define kidSSorterScrollUp 0x200B2 #define kidSSorterScrollDn 0x200B3 #define kidSSorterCancel 0x200B4 #define kidSSorterOk 0x200B5 #define kidSSorterHand 0x200B6 /* NOTE: the thumb kids *must* be immediately before the frame kids; they are used in reverse order, starting at kidSSorterFrame - 1 */ #define kidSceneSortThumbMin 0x200B7 // Next 0x20 are reserved #define kidSSorterFrame 0x200D7 // Next 0x40 are reserved #define kidSSorterNuke 0x20117 #define kidTransition1 0x20118 #define kidTransition2 0x20119 #define kidTransition3 0x2011A #define kidTransition4 0x2011B #define kidSSorterThumbFrame 0x2011C #define kidBrwsTextCreate 0x2011D #define kidCTextsStory 0x2011E #define kidCTextsScroll 0x2011F #define kidSpltEditBox 0x20121 #define kidCostEditBox 0x20123 #define kidSpltGlass 0x20124 #define kidCostGlass 0x20125 #define kidSettingsGlass 0x20126 #define kidCameraGlass 0x20127 #define kidActorGlass 0x20128 #define kidPropGlass 0x20129 #define kidActionGlass 0x2012A #define kidFXGlass 0x2012B #define kidMidiGlass 0x2012C #define kidSpeechGlass 0x2012D #define kidBrwsSoundsBackground 0x2012E #define kidSSorterBar 0x2012F #define kidNewSoundBackground 0x20131 #define kidNewSoundCancel 0x20132 #define kidNewSoundOk 0x20133 #define kidNewSoundEditBox 0x20134 #define kidNewSoundRecord 0x20135 #define kidNewSoundPlay 0x20136 #define kidListenBackgroundActor 0x20137 #define kidListenCancel 0x20138 #define kidListenOk 0x20139 #define kidListenGlassActor 0x2013A #define kidBrwsSoundFrame 0x2013B #define kidListenVolSpeech 0x2013C #define kidListenVolFX 0x2013D #define kidListenVolSpeechMM 0x2013E #define kidListenVolFXMM 0x2013F #define kidListenVolMidi 0x20140 #define kidListenEditBoxSpeech 0x20141 #define kidListenEditBoxFX 0x20142 #define kidListenEditBoxSpeechMM 0x20143 #define kidListenEditBoxFXMM 0x20144 #define kidListenEditBoxMidi 0x20145 #define kidListenNukeSpeech 0x20146 #define kidListenNukeFX 0x20147 #define kidListenNukeSpeechMM 0x20148 #define kidListenNukeFXMM 0x20149 #define kidListenNukeMidi 0x2014A #define kidSoundsImportGlass 0x2014B #define kidBrwsSoundsImportBackground 0x2014C #define kidBrwsSoundImportFrame 0x2014D #define kidListenBackgroundBkgd 0x2014E #define kidListenGlassBkgd 0x2014F #define kidListenMidiIcon 0x20150 #define kidListenSpeechIcon 0x20151 #define kidListenSpeechMMIcon 0x20152 #define kidListenFXIcon 0x20153 #define kidListenFXMMIcon 0x20154 #define kidBrwsImportFX 0x20155 #define kidBrwsImportMidi 0x20156 #define kidBrwsImportSpeech 0x20157 #define kidRecordGlass 0x20158 #define kidRecordBackground 0x20159 #define kidRecordSoundLength 0x2015A #define kidRecordSoundName 0x2015B #define kidRecordRecord 0x2015C #define kidRecordPlay 0x2015D #define kidRecordCancel 0x2015E #define kidRecordOk 0x2015F #define kidGadget 0x20160 #define kidHelpAnchor 0x20161 #define kidGenericPageNum 0x20162 #define kidVolumeThumb 0x20163 #define kidRollCallActorBorder1 0x20164 #define kidRollCallActorBorder2 0x20165 #define kidRollCallActorBorder3 0x20166 #define kidRollCallActorBorder4 0x20167 #define kidRollCallPropBorder1 0x20168 #define kidRollCallPropBorder2 0x20169 #define kidRollCallPropBorder3 0x2016A #define kidRollCallPropBorder4 0x2016B #define kidListenVolSpeechThumb 0x2016C #define kidListenVolFXThumb 0x2016D #define kidListenVolMidiThumb 0x2016E #define kidListenVolSpeechMMThumb 0x2016F #define kidListenVolFXMMThumb 0x20170 // // Browser Controls // Browser buttons require a range of kids // #define kidRollCallActorDownArrow 0x21000 #define kidRollCallActorUpArrow 0x21001 #define kidRollCallPropDownArrow 0x21002 #define kidRollCallPropUpArrow 0x21003 #define kidImportPageFwd 0x21004 // Sound import #define kidImportPageBack 0x21005 #define kidImportOk 0x21006 #define kidImportCancel 0x21007 #define kidImportPageNum 0x21008 #define kidReserveProjects 0x21009 // The following ordering of the control buttons must be preserved #define kidBrowserPageFwd 0x21010 // Control buttons are ordered #define kidBrowserPageBack 0x21011 #define kidBrowserOk 0x21012 #define kidBrowserCancel 0x21013 #define kidBrowserImport 0x21014 #define kidBrowserRecord 0x21015 #define kidBrowserPageNum 0x21016 #define kidBrowserCtrlLim 0x21020 // Reserved for future controls // Browser Frames #define kidRollCallActorFrame 0x21100 // Reserving future frames #define kidRollCallActorFrame1 0x21100 #define kidRollCallActorFrame2 0x21101 #define kidRollCallActorFrame3 0x21102 #define kidRollCallActorFrame4 0x21103 #define kidRollCallPropFrame 0x21110 #define kidRollCallPropFrame1 0x21110 #define kidRollCallPropFrame2 0x21111 #define kidRollCallPropFrame3 0x21112 #define kidRollCallPropFrame4 0x21113 #define kidBrowserFrame 0x21120 #define kidBrowserFrameLim 0x21200 // Import Frames #define kidImportFrame 0x21301 #define kidImportThumbLim 0x21500 // // Ids for popdowns // #define kidSpltsColor 0x21501 #define kidSpltsColorBackground 0x21502 #define kidSpltsColorPageDown 0x21503 #define kidSpltsColorPageUp 0x21504 #define kidSpltsColorFrame 0x21505 #define kidSpltsColorFrameLim 0x21510 #define kidSpltsShape 0x21511 #define kidSpltsShapeBackground 0x21512 #define kidSpltsShapePageDown 0x21513 #define kidSpltsShapePageUp 0x21514 #define kidSpltsShapeFrame 0x21515 #define kidSpltsShapeFrameLim 0x21520 #define kidSpltsFont 0x21521 #define kidSpltsFontBackground 0x21522 #define kidSpltsFontPageDown 0x21523 #define kidSpltsFontPageUp 0x21524 #define kidSpltsFontFrame 0x21525 #define kidSpltsFontFrameLim 0x21530 #define kidActorsAcc 0x21531 #define kidActorsAccBackground 0x21532 #define kidActorsAccPageDown 0x21533 #define kidActorsAccPageUp 0x21534 #define kidActorsAccFrame 0x21535 #define kidActorsAccFrameLim 0x21540 #define kidTextFont 0x21541 #define kidTextFontBackground 0x21542 #define kidTextFontPageDown 0x21543 #define kidTextFontPageUp 0x21544 #define kidTextFontFrame 0x21545 #define kidTextFontFrameLim 0x21550 #define kidTextStyle 0x21551 #define kidTextStyleBackground 0x21552 #define kidTextStylePageDown 0x21553 #define kidTextStylePageUp 0x21554 #define kidTextStyleFrame 0x21555 #define kidTextStyleFrameLim 0x21560 #define kidTextSize 0x21561 #define kidTextSizeBackground 0x21562 #define kidTextSizePageDown 0x21563 #define kidTextSizePageUp 0x21564 #define kidTextSizeFrame 0x21565 #define kidTextSizeFrameLim 0x21570 #define kidTextColor 0x21571 #define kidTextColorBackground 0x21572 #define kidTextColorPageDown 0x21573 #define kidTextColorPageUp 0x21574 #define kidTextColorFrame 0x21575 #define kidTextColorFrameLim 0x21580 #define kidTextBkgdColor 0x21581 #define kidTextBkgdColorBackground 0x21582 #define kidTextBkgdColorPageDown 0x21583 #define kidTextBkgdColorPageUp 0x21584 #define kidTextBkgdColorFrame 0x21585 #define kidTextBkgdColorFrameLim 0x21590 // Action preview buttons #define kidBrowserActionBackCel 0x21591 #define kidBrowserActionChangeCel 0x21592 #define kidBrowserActionFwdCel 0x21593 #define kidGenericDisableGlass 0x21594 // Covers all the tools to protect them from clicks #define kidTextFontThumb 0x21595 #define kidPressPageFwd 0x21596 #define kidPressPageBack 0x21597 // // Start tool tip CNOs // #define kttGenericPageFwd 0x22300 #define kttGenericPageBack 0x22301 #define kttGenericCancel 0x22302 #define kttGenericOk 0x22303 #define kttPortsPortfolio 0x22304 #define kttPortsNew 0x22305 #define kttPortsSave 0x22306 #define kttCCPSceneChopFwd 0x22307 #define kttCCPSceneChopBack 0x22308 #define kttCCPSceneNuke 0x22309 #define kttCCPActorNuke 0x2230A #define kttCCPCopyRoute 0x2230B #define kttCCPPaste 0x2230C #define kttCCPCopy 0x2230D #define kttCCPCut 0x2230E #define kttActorsRotateX 0x2230F #define kttActorsRotateY 0x22310 #define kttActorsRotateZ 0x22311 #define kttActorsRotateNorm 0x22312 #define kttActorsSquash 0x22313 #define kttActorsShrink 0x22314 #define kttActorsTransformNorm 0x22315 #define kttTextsScroll 0x22316 #define kttTextsStory 0x22317 #define kttSettingsCameras 0x22318 #define kttSceneSorter 0x22319 #define kttPausesMouse 0x2231A #define kttPausesClear 0x2231B #define kttPausesSound 0x2231C #define kttActorsSelect 0x2231D #define kttActorsBiography 0x2231E #define kttActorsCompose 0x2231F #define kttActorsCostume 0x22320 #define kttActorsActionBrowser 0x22321 #define kttActorsContinue 0x22322 #define kttActorsRecordMode 0x22323 #define kttActorsSooner 0x22324 #define kttActorsRotate 0x22325 #define kttActorsTransform 0x22326 #define kttActorsXY 0x22327 #define kttActorsGround 0x22328 #define kttSoundsPlayOnce 0x22329 #define kttSoundsListen 0x2232A #define kttSoundsLooping 0x2232B #define kttSoundsAttachToCell 0x2232C #define kttTextsBkgdColor 0x2232D #define kttTextsFontShape 0x2232E #define kttTextsFontColor 0x2232F #define kttTextsFont 0x22330 #define kttTextsSelect 0x22331 #define kttTextsFontSize 0x22332 #define kttTextsScrollType 0x22333 #define kttSettingsCover 0x22334 #define kttActorsCover 0x22335 #define kttSoundsCover 0x22336 #define kttTextsCover 0x22337 #define kttBook 0x22338 #define kttMap 0x22339 #define kttCutCopyPaste 0x2233A #define kttUndo 0x2233B #define kttVolumeSlider 0x2233C #define kttPlay 0x2233D #define kttPortfolio 0x2233E #define kttExit 0x2233F #define kttSettingsBrowser 0x22340 #define kttActorsBrowser 0x22341 #define kttActorsPropBrowser 0x22342 #define kttActorsSpletters 0x22343 #define kttSoundsEfxBrowser 0x22344 #define kttSoundsMicBrowser 0x22345 #define kttSoundsMusicBrowser 0x22346 #define kttTextsCreate 0x22347 #define kttActorsSoonerButton 0x22348 #define kttActorsLaterButton 0x22349 #define kttSpltBackground 0x2234A #define kttSpltTransmogrify 0x2234B #define kttSpltTextures 0x2234C #define kttSpltShape 0x2234D #define kttSpltRotate 0x2234E #define kttSpltImportTexture 0x2234F #define kttSpltCancel 0x22350 #define kttSpltOk 0x22351 #define kttSpltFont 0x22352 #define kttCostBackground 0x22353 #define kttCostCostumes 0x22354 #define kttCostRotate 0x22355 #define kttCostAccessories 0x22356 #define kttCostCancel 0x22357 #define kttCostOk 0x22358 #define kttSSorterBackground 0x22359 #define kttSSorterFrame 0x2235A #define kttTransition1 0x2235B #define kttTransition2 0x2235C #define kttTransition3 0x2235D #define kttTransition4 0x2235E #define kttSSorterScrollUp 0x2235F #define kttSSorterScrollDn 0x22360 #define kttSSorterCancel 0x22361 #define kttSSorterOk 0x22362 #define kttSSorterHand 0x22363 #define kttSSorterNuke 0x22364 #define kttSSorterOpen 0x22365 #define kttSSorterThumbFrame 0x22366 #define kttBrwsTextCreate 0x22367 #define kttCTextsStory 0x22368 #define kttCTextsScroll 0x22369 #define kttBrowserRecord 0x2236A #define kttBrowserImportFX 0x2236B #define kttRollCallActorFrame 0x2236C // Reserving future frames thru 2238B #define kttRollCallActorFrame1 0x2236D #define kttRollCallActorFrame2 0x2236E #define kttRollCallActorFrame3 0x2236F #define kttRollCallActorFrame4 0x22370 #define kttRollCallActorUpArrow 0x2238A #define kttRollCallActorDownArrow 0x2238B #define kttRollCallPropFrame 0x2238C // Reserving future frames thru 223AD #define kttRollCallPropFrame1 0x2238D #define kttRollCallPropFrame2 0x2238E #define kttRollCallPropFrame3 0x2238F #define kttRollCallPropFrame4 0x22390 #define kttRollCallPropUpArrow 0x223AE #define kttRollCallPropDownArrow 0x223AF // Note: ***** - 6.19.95 --these ids conflicted with spletter easel #defines... // any particular reason other than human error? #define kttSceneBackground 0x223B0 #define kttRollCallProps 0x223B1 #define kttFrameBackground 0x223B2 #define kttPortsSaveAs 0x223B3 #define kttRollCallActors 0x223B4 #define kttCCPTboxNuke 0x223B5 #define kttListenVolSpeech 0x223B6 #define kttListenVolFX 0x223B7 #define kttListenVolSpeechMM 0x223B8 #define kttListenVolFXMM 0x223B9 #define kttListenVolMidi 0x223BA #define kttListenNukeSpeech 0x223BB #define kttListenNukeFX 0x223BC #define kttListenNukeSpeechMM 0x223BD #define kttListenNukeFXMM 0x223BE #define kttListenNukeMidi 0x223BF #define kttListenCancel 0x223C0 #define kttListenOk 0x223C1 #define kttListenEditBoxSpeech 0x223C2 #define kttListenEditBoxFX 0x223C3 #define kttListenEditBoxSpeechMM 0x223C4 #define kttListenEditBoxFXMM 0x223C5 #define kttListenEditBoxMidi 0x223C6 #define kttImportPageFwd 0x223C7 #define kttImportPageBack 0x223C8 #define kttImportCancel 0x223C9 #define kttImportOk 0x223CA #define kttRecordSoundLength 0x223CB #define kttRecordSoundName 0x223CC #define kttRecordRecord 0x223CD #define kttRecordPlay 0x223CE #define kttRecordCancel 0x223CF #define kttRecordOk 0x223D0 #define kttBrwsActionChangeCel 0x223D1 #define kttBrwsActionBackCel 0x223D2 #define kttBrwsActionFwdCel 0x223D3 #define kttBrowserDelete 0x223D4 #define kttEaselOk 0x223D5 #define kttEaselCancel 0x223D6 #define kttRemoveSound 0x223D7 #define kttRewindEnd 0x223D8 #define kttRewind 0x223D9 #define kttFForward 0x223DA #define kttFForwardEnd 0x223DB #define kttFirstScene 0x223DC #define kttPrevScene 0x223DD #define kttNextScene 0x223DE #define kttLastScene 0x223DF #define kttSceneSlider 0x223E0 #define kttFrameSlider 0x223E1 #define kttBrowserImportSpeech 0x223E2 #define kttBrowserImportMidi 0x223E3 // // Sound CNOs // #define kcnoCoverWav 0x23001 #define kcnoPBrowseWav 0x23002 #define kcnoDropDnWav 0x23003 #define kcnoSBrowseWav 0x23004 #define kcnoBrwzPicWav 0x23005 #define kcnoBrwzBtnWav 0x23006 #define kcnoEzlOpenWav 0x23007 #define kcnoStateOnWav 0x23008 #define kcnoStateOffWav 0x23009 #define kcnoGrabSnWav 0x2300A #define kcnoDropSnWav 0x2300B #define kcnoSelectWav 0x2300C #define kcnoSquashWav 0x2300D #define kcnoStretchWav 0x2300E #define kcnoGrowWav 0x2300F #define kcnoShrinkWav 0x23010 #define kcnoCBackSWav 0x23011 #define kcnoRotateWav 0x23012 #define kcnoCBackRWav 0x23013 #define kcnoSFreezeWav 0x23014 #define kcnoSyStepFWav 0x23015 #define kcnoSyStepBWav 0x23016 #define kcnoMoveWav 0x23017 #define kcnoMove1Wav 0x23018 #define kcnoMoveAllWav 0x23019 #define kcnoActStepFWav 0x2301A #define kcnoActStepBWav 0x2301B #define kcnoTBkOpenWav 0x2301D #define kcnoSPlayWav 0x2301E #define kcnoSLoopWav 0x2301F #define kcnoSActWav 0x23020 #define kcnoWFontWav 0x23022 #define kcnoWSizeWav 0x23023 #define kcnoWColorWav 0x23024 #define kcnoWStyleWav 0x23025 #define kcnoWBgClrWav 0x23026 #define kcnoWScrOnWav 0x23027 #define kcnoWScrOffWav 0x23028 #define kcnoGoFrstFWav 0x23029 #define kcnoGoPrevFWav 0x2302A #define kcnoGoNextFWav 0x2302B #define kcnoAddFrameWav 0x2302C #define kcnoGoLastFWav 0x2302D #define kcnoGoFrstSWav 0x2302E #define kcnoGoPrevSWav 0x2302F #define kcnoGoNextSWav 0x23030 #define kcnoGoLastSWav 0x23031 #define kcnoPlayWav 0x23032 #define kcnoUndoWav 0x23033 #define kcnoRedoWav 0x23034 #define kcnoRemBfrWav 0x23035 #define kcnoRemAftrWav 0x23036 #define kcnoRemScnWav 0x23037 #define kcnoRemActrWav 0x23038 #define kcnoRemWBoxWav 0x23039 #define kcnoPasteWav 0x2303A #define kcnoCopyPWav 0x2303B #define kcnoCopyWav 0x2303C #define kcnoCutWav 0x2303D #define kcnoStopWav 0x2303E #define kcnoSecToolWav 0x2303F #define kcnoOkWav 0x23040 #define kcnoCancelWav 0x23041 #define kcnoFNewWav 0x23042 #define kcnoFSaveWav 0x23043 #define kcnoFSaveAsWav 0x23044 #define kcnoPFOpenWav 0x23045 #define kcnoExitWav 0x23046 #define kcnoPageUpWav 0x23047 #define kcnoPageDnWav 0x23048 #define kcnoRSwitchWav 0x23049 #define kcnoLSelectWav 0x2304A #define kcnoNukeSnWav 0x2304B #define kcnoCostumeWav 0x2304C #define kcnoAcesoryWav 0x2304D #define kcnoSpinWav 0x2304E #define kcnoMikeWav 0x2304F #define kcnoRPlayWav 0x23050 #define kcnoPSelectWav 0x23051 #define kcnoRandomWav 0x23052 #define kcnoMapOpenWav 0x23053 #define kcnoRecordWav 0x23054 // // the following are id's for help topics used as labels // #define klabFrameCounter 0x22500 #define klabSceneCounter 0x22501 #define klabName 0x22502 #define klabFps 0x22503 // Where to go in building after leaving studio. The temp variable is // used to fix the real variable if an aborted attempt to go to the building // is made from the map. (Bug #1010) #define kpridBuildingGob 0x23300 #define kpridBuildingGobT 0x23301 #define kpridBuildingState 0x23302 #define kpridBuildingStateT 0x23303 // the following are "Property Id's" for Browsers. // // The property foobarDef indicates the id of a default item that should // show in the browser page the first time it's instantiated per session // This will differ by series member. // // The property foobarPref is maintained by the browser code and IS // OVERWRITEABLE from script. Upon creation, the browser will search // its content list and display the page which contains this content // // NOTE: the only ones that really matter for scripting are the // actor, prop, background and sound* browsers. #define kpridBrwsBackgroundDef 0x23400 #define kpridBrwsBackgroundPref 0x23401 #define kpridBrwsCameraDef 0x23402 #define kpridBrwsCameraPref 0x23403 #define kpridBrwsActorDef 0x23404 #define kpridBrwsActorPref 0x23405 #define kpridBrwsPropDef 0x23406 #define kpridBrwsPropPref 0x23407 #define kpridBrwsActionDef 0x23408 #define kpridBrwsActionPref 0x23409 #define kpridBrwsBkSoundDef 0x2340A #define kpridBrwsBkSoundPref 0x2340B #define kpridBrwsFXSoundDef 0x2340C #define kpridBrwsFXSoundPref 0x2340D #define kpridBrwsMusSoundDef 0x2340E #define kpridBrwsMusSoundPref 0x2340F #define kpridBrwsDefaultSid 0x23410 #define kpridBrwsDefaultThum 0x23411 #define kpridBrwsOverrideThum 0x23412 #define kpridBrwsOverrideSidThum 0x23413 #define kpridBrwsOverrideKidThum 0x23414 // kprids for user's data (bio pages, etc) #define kpridUserDataBase 0x23500 // these two are used for BIO PAGES #define kpridUserData0 0x23500 #define kpridUserData1 0x23501 // this one is used for Studio information #define kpridStudioFlags 0x23502 #define kpridUserData2 0x23502 // this one is used for maintaing audio help on /off status #define kpridMcZeeAudio 0x23503 #define kpridUserData3 0x23503 // bit flags for suppressing the above audio, #define kflgMcZeeAudio 0x01 #define kflgMelAudio 0x02 #define kpridUserData4 0x23504 #define kpridUserData5 0x23505 #define kpridUserData6 0x23506 #define kpridUserData7 0x23507 #define kcpridUserData 8 #define kpridFirstTimeUser 0x23510 #define kidStudioLim 0x23600 // // Width of screen and workspace // #define kdxpBackground 640 #define kdypBackground 480 #define kdxpWorkspace 544 #define kdypWorkspace 306 #define khidStudio khidLimKidFrame + 5 // // Current tool in use // #define chttNone 0 #define chttCompose 1 #define chttTboxSelect 2 #define chttTboxStory 3 #define chttTboxScroll 4 #define chttNormalizeRot 5 #define chttSooner 6 #define chttRotateX 7 #define chttRotateY 8 #define chttRotateZ 9 #define chttSquash 10 #define chttShrink 11 #define chttSceneChopFwd 13 #define chttSceneNuke 14 #define chttActorNuke 15 #define chttSceneChopBack 16 #define chttNormalizeSize 17 #define chttRotateNorm 20 #define chttTransformNorm 21 #define chttFButtonFW 22 #define chttButtonFWEnd 23 #define chttFButtonRW 24 #define chttButtonRWEnd 25 #define chttScrollbar 26 #define chttThumb 27 #define chttRecordSameAction 28 #define chttActorEasel 29 #define chttSButtonFW 30 #define chttSButtonRW 31 #define chttAction 32 #define chttLooper 33 #define chttMatcher 34 #define chttSounder 35 #define chttListener 36 // // States for kcrsors // #define fcustHand 0x10000 #define fcustNuke 0x20000 // // Types of text boxes // #define ktbxtScroll 0 #define ktbxtStory 1 // // States of buttons // #define kstDisabled kst1 #define kstClosed kst2 #define kstOpen kst3 #define kstDefault kst1 #define kstSelected kst2 #define kstRecording kst3 // for the play button to flash #define kstFreeze kst3 // for the action browser animation #define kstSceneDoorsOpen kst2 #define kstActorDoorsOpen kst3 #define kstSoundDoorsOpen kst4 #define kstTextDoorsOpen kst5 #define kstSceneDoorsAllOpen kst6 #define kstActorDoorsAllOpen kst7 #define kstSoundDoorsAllOpen kst8 #define kstTextDoorsAllOpen kst9 #define kstBrowserInvisible kst1 #define kstBrowserEnabled kst2 #define kstBrowserDisabled kst3 #define kstBrowserSelected kst4 #define kstBrowserDragging kst5 #define kstBrowserScrollingSel kst6 #define kstListenDisabled kst1 #define kstListenLooper kst2 #define kstListenSounderChain kst3 #define kstListenMatcher kst4 #define kstListenSounder kst5 #define kstSliderInvisible kst2 #define kstSliderEnabled kst3 #define fgrfstDisabled fgrfst1 #define fgrfstClosed fgrfst2 #define fgrfstOpen fgrfst3 #define fgrfstDefault fgrfst1 #define fgrfstSelected fgrfst2 #define fgrfstSceneDoorsOpen fgrfst2 #define fgrfstActorDoorsOpen fgrfst3 #define fgrfstSoundDoorsOpen fgrfst4 #define fgrfstTextDoorsOpen fgrfst5 #define fgrfstSceneDoorsAllOpen fgrfst6 #define fgrfstActorDoorsAllOpen fgrfst7 #define fgrfstSoundDoorsAllOpen fgrfst8 #define fgrfstTextDoorsAllOpen fgrfst9 #define fgrfstBrowserInvisible fgrfst1 #define fgrfstBrowserEnabled fgrfst2 #define fgrfstBrowserDisabled fgrfst3 #define fgrfstBrowserSelected fgrfst4 #define fgrfstBrowserDragging fgrfst5 #define fgrfstBrowserScrollingSel fgrfst6 // // Script IDs // #define kchidResetTools kchidScript2 #define kchidSetPauseType kchidScript3 #define kchidEnableSceneTools kchidScript5 #define kchidEnableActorTools kchidScript6 #define kchidEnableTboxTools kchidScript7 #define kchidBrowserDismiss kchidScript2 #define kchidSSorterNuke kchidScript2 #define kchidSSorterHand kchidScript3 #define kchidMovieTechniques kchidScript4 #define kchidFlyingLogo kchidScript8 #define kchidResetXZAxisAndGround kchidScript9 #define kchidOpenDoorsAll kchidScript10 #define kchidPopoutSceneTools kchidScript11 // All possible open portfolio types #define kpfPortOpenMovie 1 #define kpfPortOpenSound 2 #define kpfPortOpenTexture 3 // All possible save portfolio types #define kpfPortSaveMovie 1 // To set portfolio initial dir if necessary #define kpfPortDirUsers 1 /*************************************************************************** Sound classes ***************************************************************************/ #define ksclUISound 10000 #endif // STDIODEF ================================================ FILE: inc/stdiopos.chh ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // // Locations // // // // Actor Accessories popdown // // #define kdxpActorsAcc 136 #define kdypActorsAcc 151 #define kxpActorsAccLeft 80 #define kypActorsAccTop 124 #define kxpActorsAccRight 216 #define kypActorsAccBottom 275 #define kdxpActorsAccLeft 0 #define kdxpActorsAccRight 0 #define kdypActorsAccTop 4 #define kdypActorsAccBottom 19 #define kdxpActorsAccBorder 0 #define kdypActorsAccBorder 0 #define kdxpActorsAccSpacing 0 #define kdypActorsAccSpacing 0 #define kdxpActorsAccFrame 136 #define kdypActorsAccFrame 16 #define kdxpActorsAccFrameBorder 1 #define kdypActorsAccFrameBorder 1 #define kxpActorsAccPageDown 50 #define kypActorsAccPageDown 133 #define kxprActorsAccPageDown 0 #define kyprActorsAccPageDown 0 #define kxpActorsAccPageUp 86 #define kypActorsAccPageUp 133 #define kxprActorsAccPageUp 0 #define kyprActorsAccPageUp 0 // // Registration points // // TODO(bjrkk): probably should be moved into pos3.chh? #define kxpregSSorterFrameBorder 0 #define kypregSSorterFrameBorder 0 #define kxpregImportPageFwd 0 #define kypregImportPageFwd 0 #define kxpregImportPageBack 0 #define kypregImportPageBack 0 #define kxpregImportCancel 0 #define kypregImportCancel 0 #define kxpregImportOk 0 #define kypregImportOk 0 #define kxpregGenericPageFwd 0 #define kypregGenericPageFwd 0 #define kxpregGenericPageBack 0 #define kypregGenericPageBack 0 #define kxpregSpltsColorFrame 0 #define kypregSpltsColorFrame 0 #define kxpregSpltsColorPageDown 0 #define kypregSpltsColorPageDown 0 #define kxpregSpltsColorPageUp 0 #define kypregSpltsColorPageUp 0 #define kxpregSpltsShapeFrame 0 #define kypregSpltsShapeFrame 0 #define kxpregSpltsShapePageDown 0 #define kypregSpltsShapePageDown 0 #define kxpregSpltsShapePageUp 0 #define kypregSpltsShapePageUp 0 #define kxpregSpltsFontFrame 0 #define kypregSpltsFontFrame 0 #define kxpregSpltsFontPageDown 0 #define kypregSpltsFontPageDown 0 #define kxpregSpltsFontPageUp 0 #define kypregSpltsFontPageUp 0 #define kxpregActorsAccFrame 0 #define kypregActorsAccFrame 0 #define kxpregActorsAccPageDown 0 #define kypregActorsAccPageDown 0 #define kxpregActorsAccPageUp 0 #define kypregActorsAccPageUp 0 #define kxpregTextFontFrame 0 #define kypregTextFontFrame 0 #define kxpregTextFontPageDown 0 #define kypregTextFontPageDown 0 #define kxpregTextFontPageUp 0 #define kypregTextFontPageUp 0 #define kxpregTextStyleFrame 0 #define kypregTextStyleFrame 0 #define kxpregTextStylePageDown 0 #define kypregTextStylePageDown 0 #define kxpregTextStylePageUp 0 #define kypregTextStylePageUp 0 #define kxpregTextSizeFrame 0 #define kypregTextSizeFrame 0 #define kxpregTextSizePageDown 0 #define kypregTextSizePageDown 0 #define kxpregTextSizePageUp 0 #define kypregTextSizePageUp 0 #define kxpregTextColorFrame 0 #define kypregTextColorFrame 0 #define kxpregTextColorPageDown 0 #define kypregTextColorPageDown 0 #define kxpregTextColorPageUp 0 #define kypregTextColorPageUp 0 #define kxpregTextBkgdColorFrame 0 #define kypregTextBkgdColorFrame 0 #define kxpregTextBkgdColorPageDown 0 #define kypregTextBkgdColorPageDown 0 #define kxpregTextBkgdColorPageUp 0 #define kypregTextBkgdColorPageUp 0 #include "pos3.chh" ================================================ FILE: inc/stdioscb.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*****************************************************************************\ * * stdioscb.h * * Author: ****** * Date: March, 1995 * * This file contains the studio scrollbar class SSCB. * \*****************************************************************************/ #ifndef STDIOSCB_H #define STDIOSCB_H // // The studio scrollbar class. // const long kctsFps = 20; #define SSCB_PAR BASE typedef class SSCB *PSSCB; #define kclsSSCB 'SSCB' class SSCB : public SSCB_PAR { RTCLASS_DEC ASSERT MARKMEM private: long _nfrmFirstOld; bool _fNoAutoadjust; bool _fBtnAddsFrames; // // Private methods // long _CxScrollbar(long kidScrollbar, long kidThumb); protected: PTGOB _ptgobFrame; PTGOB _ptgobScene; #ifdef SHOW_FPS // Frame descriptor struct FDSC { ulong ts; long cfrm; }; PTGOB _ptgobFps; FDSC _rgfdsc[kctsFps]; long _itsNext; #endif // SHOW_FPS PMVIE _pmvie; SSCB(PMVIE pmvie); public: // // Constructors and destructors // static PSSCB PsscbNew(PMVIE pmvie); ~SSCB(void); // // Notification // virtual void Update(void); void SetMvie(PMVIE pmvie); void StartNoAutoadjust(void); void EndNoAutoadjust(void) { AssertThis(0); _fNoAutoadjust = fFalse; } void SetSndFrame(bool fSoundInFrame); // // Event handling // bool FCmdScroll(PCMD pcmd); }; #endif // STDIOSCB_H ================================================ FILE: inc/studio.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Studio Stuff The Studio STDIO ---> GOB ***************************************************************************/ #ifndef STUDIO_H #define STUDIO_H #include "soc.h" #include "kidgsdef.h" #include "stdiodef.h" #include "buildgob.h" #include "sharedef.h" #include "stdiocrs.h" #include "tgob.h" #include "stdioscb.h" #include "ape.h" #include "browser.h" #include "popup.h" #include "esl.h" #include "scnsort.h" #include "tatr.h" #include "utest.h" #include "version.h" #include "portf.h" #include "splot.h" #include "helpbook.h" #include "helptops.h" typedef class SMCC *PSMCC; const long kcmhlStudio = 0x10000; // nice medium level for the Studio extern APP vapp; // // Studio class // #define STDIO_PAR GOB #define kclsSTDIO 'stio' class STDIO : public STDIO_PAR { RTCLASS_DEC ASSERT MARKMEM CMD_MAP_DEC(STDIO) protected: PCRM _pcrm; PGST _pgstMisc; PMVIE _pmvie; PSMCC _psmcc; PGL _pglpbrcn; long _aridSelected; PBRWR _pbrwrActr; PBRWR _pbrwrProp; PGL _pglcmg; // Cno map tmpl->gokd for rollcall PGL _pglclr; // Color table for common palette bool _fDisplayCast; // Display movie's cast CMD _cmd; long _dtimToolTipDelay; bool _fStopUISound; PTGOB _ptgobTitle; bool _fStartedSoonerLater; STDIO(PGCB pgcb) : GOB(pgcb){}; bool _FOpenStudio(bool fPaletteFade); void _SetToolStates(void); bool _FBuildMenuCidCtg(long cid, CTG ctg, PGL pgl, ulong grfHotKey, ulong grfNum, bool fNew); PBRCN _PbrcnFromBrwdid(long brwdid); #ifdef BUG1959 bool _FLoadMovie(PFNI pfni, CNO cno, bool *pfClosedOld); #endif // BUG1959 public: // // Create and destroy functions // static PSTDIO PstdioNew(long hid, PCRM pcrmStudio, PFNI pfniUserDoc = pvNil, bool fFailIfDocOpenFailed = fTrue); void ReleaseBrcn(void); ~STDIO(void); // // Command functions for getting from scripts to here. // bool FCmdXYAxis(PCMD pcmd); bool FCmdXZAxis(PCMD pcmd); bool FCmdRecordPath(PCMD pcmd); bool FCmdRerecordPath(PCMD pcmd); bool FCmdSetTool(PCMD pcmd); bool FCmdPlay(PCMD pcmd); bool FCmdNewScene(PCMD pcmd); bool FCmdRespectGround(PCMD pcmd); bool FCmdPause(PCMD pcmd); bool FCmdOpen(PCMD pcmb); bool FCmdBrowserReady(PCMD pcmd); bool FCmdScroll(PCMD pcmd); bool FCmdSooner(PCMD pcmd); bool FCmdLater(PCMD pcmd); bool FCmdNewSpletter(PCMD pcmd); bool FCmdCreatePopup(PCMD pcmd); bool FCmdTextSetColor(PCMD pcmd); bool FCmdTextSetBkgdColor(PCMD pcmd); bool FCmdTextSetFont(PCMD pcmd); bool FCmdTextSetStyle(PCMD pcmd); bool FCmdTextSetSize(PCMD pcmd); bool FCmdOpenSoundRecord(PCMD pcmd); bool FBuildActorMenu(void); bool FCmdToggleXY(PCMD pcmd); bool FCmdHelpBook(PCMD pcmd); bool FCmdMovieGoto(PCMD pcmd); bool FCmdLoadProjectMovie(PCMD pcmd); bool FCmdSoundsEnabled(PCMD pcmd); bool FCmdCreateTbox(PCMD pcmd); bool FCmdActorEaselOpen(PCMD pcmd); bool FCmdListenerEaselOpen(PCMD pcmd); #ifdef DEBUG bool FCmdWriteBmps(PCMD pcmd); #endif // DEBUG // // Call back functions // void PlayStopped(void); void ChangeTool(long tool); void SceneNuked(void); void SceneUnnuked(void); void ActorNuked(void); void EnableActorTools(void); void EnableTboxTools(void); void TboxSelected(void); void SetUndo(long undo); void SetCurs(long tool); void ActorEasel(bool *pfActrChanged); void SceneChange(void); void PauseType(WIT wit); void Recording(bool fRecording, bool fRecord); void StartSoonerLater(void); void EndSoonerLater(void); void NewActor(void); void StartActionBrowser(void); void StartListenerEasel(void); void PlayUISound(long tool, long grfcust); void StopUISound(void); void UpdateTitle(PSTN pstnTitle); bool FEdit3DText(PSTN pstn, long *ptdts); void SetAridSelected(long arid) { _aridSelected = arid; } long AridSelected(void) { return _aridSelected; } PBRWR PbrwrActr(void) { return _pbrwrActr; } PBRWR PbrwrProp(void) { return _pbrwrProp; } bool FAddCmg(CNO cnoTmpl, CNO cnoGokd); CNO CnoGokdFromCnoTmpl(CNO cnoTmpl); void SetDisplayCast(bool fDisplayCast) { _fDisplayCast = fDisplayCast; } bool FShutdown(bool fClearCache = fTrue); // Stop and restart the action button's animation static void PauseActionButton(void); static void ResumeActionButton(void); // Misc Studio strings void GetStnMisc(long ids, PSTN pstn); // // Movie changing // bool FLoadMovie(PFNI pfni = pvNil, CNO cno = cnoNil); bool FSetMovie(PMVIE pmvie); PMVIE Pmvie() { return _pmvie; }; bool FGetFniMovieOpen(PFNI pfni) { return FPortDisplayWithIds(pfni, fTrue, idsPortfMovieFilterLabel, idsPortfMovieFilterExt, idsPortfOpenMovieTitle, pvNil, pvNil, pvNil, fpfPortPrevMovie, kwavPortOpenMovie); } PSMCC Psmcc(void) { return _psmcc; } }; #define SMCC_PAR MCC #define kclsSMCC 'SMCC' class SMCC : public SMCC_PAR { RTCLASS_DEC ASSERT MARKMEM private: PSSCB _psscb; PSTDIO _pstdio; long _dypTextTbox; public: ~SMCC(void) { ReleasePpo(&_psscb); } SMCC(long dxp, long dyp, long cbCache, PSSCB psscb, PSTDIO pstdio); virtual long Dxp(void) { return _dxp; } virtual long Dyp(void) { return _dyp; } virtual long CbCache(void) { return _cbCache; } virtual PSSCB Psscb(void) { return _psscb; } virtual void SetCurs(long tool) { _pstdio->SetCurs(tool); } virtual void ActorSelected(long arid) { _pstdio->SetAridSelected(arid); UpdateRollCall(); } virtual void UpdateAction(void) { } // Update selected action virtual void UpdateRollCall(void); virtual void UpdateScrollbars(void) { if (pvNil != _psscb) _psscb->Update(); } virtual void SetSscb(PSSCB psscb) { AssertNilOrPo(psscb, 0); ReleasePpo(&_psscb); _psscb = psscb; if (pvNil != _psscb) _psscb->AddRef(); } virtual void PlayStopped(void) { _pstdio->PlayStopped(); } virtual void ChangeTool(long tool) { _pstdio->ChangeTool(tool); } virtual void SceneNuked(void) { _pstdio->SceneNuked(); } virtual void SceneUnnuked(void) { _pstdio->SceneUnnuked(); } virtual void ActorNuked(void) { _pstdio->ActorNuked(); } virtual void EnableActorTools(void) { _pstdio->EnableActorTools(); } virtual void EnableTboxTools(void) { _pstdio->EnableTboxTools(); } virtual void TboxSelected(void) { _pstdio->TboxSelected(); } virtual void ActorEasel(bool *pfActrChanged) { _pstdio->ActorEasel(pfActrChanged); } virtual void SetUndo(long undo) { _pstdio->SetUndo(undo); } virtual void SceneChange(void) { _pstdio->SceneChange(); } virtual void PauseType(WIT wit) { _pstdio->PauseType(wit); } virtual void Recording(bool fRecording, bool fRecord) { _pstdio->Recording(fRecording, fRecord); } virtual void StartSoonerLater(void) { _pstdio->StartSoonerLater(); } virtual void EndSoonerLater(void) { _pstdio->EndSoonerLater(); } virtual void NewActor(void) { _pstdio->NewActor(); } virtual void StartActionBrowser(void) { _pstdio->StartActionBrowser(); } virtual void StartListenerEasel(void) { _pstdio->StartListenerEasel(); } virtual bool GetFniSave(FNI *pfni, long lFilterLabel, long lFilterExt, long lTitle, LPTSTR lpstrDefExt, PSTN pstnDefFileName) { return (FPortDisplayWithIds(pfni, fFalse, lFilterLabel, lFilterExt, lTitle, lpstrDefExt, pstnDefFileName, pvNil, fpfPortPrevMovie, kwavPortSaveMovie)); } virtual void PlayUISound(long tool, long grfcust) { _pstdio->PlayUISound(tool, grfcust); } virtual void StopUISound(void) { _pstdio->StopUISound(); } virtual void UpdateTitle(PSTN pstnTitle) { _pstdio->UpdateTitle(pstnTitle); } virtual void EnableAccel(void) { vpapp->EnableAccel(); } virtual void DisableAccel(void) { vpapp->DisableAccel(); } virtual void GetStn(long ids, PSTN pstn) { vpapp->FGetStnApp(ids, pstn); } virtual long DypTboxDef(void); virtual void SetSndFrame(bool fSoundInFrame) { _psscb->SetSndFrame(fSoundInFrame); } virtual bool FMinimized(void) { return (vpapp->FMinimized()); } virtual bool FQueryPurgeSounds(void); }; #endif // STUDIO_H ================================================ FILE: inc/tagl.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** tagl.h: Tag List class Primary Author: ****** Review Status: REVIEWED - any changes to this file must be reviewed! BASE ---> TAGL ***************************************************************************/ #ifndef TAGL_H #define TAGL_H /**************************************** The tag list class ****************************************/ typedef class TAGL *PTAGL; #define TAGL_PAR BASE #define kclsTAGL 'TAGL' class TAGL : public TAGL_PAR { RTCLASS_DEC ASSERT MARKMEM protected: PGG _pggtagf; // TAGF for fixed part, array of cc's for variable part protected: bool _FInit(void); bool _FFindTag(PTAG ptag, long *pitag); public: static PTAGL PtaglNew(void); ~TAGL(void); long Ctag(void); void GetTag(long itag, PTAG ptag); bool FInsertTag(PTAG ptag, bool fCacheChildren = fTrue); bool FInsertChild(PTAG ptag, CHID chid, CTG ctg); bool FCacheTags(void); }; #endif TAGL_H ================================================ FILE: inc/tagman.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /************************************************************************* tagman.h: Tag Manager class (TAGM) Primary Author: ****** Review Status: REVIEWED - any changes to this file must be reviewed! BASE ---> TAGM A TAG is a reference to a piece of content: a background, actor template, sound, etc. In addition to a CTG and CNO, a TAG specifies a SID, or source ID, that helps TAGM find the content. A source (identified by a SID) is a group of chunky files (managed by a CRM) in one directory of one disk whose chunks all have unique CTG/CNOs. Each Socrates series member will be a source, and the user rolls might also be implemented as a source. A SID of less than 0 is invalid; a TAG with a negative SID is an invalid TAG. Each source has a name, managed by _pgstSource. This name is used with the _pfninscd callback when the source cannot be found. The callback should put up an alert saying (for example) "The source *Socrates* cannot be found...please insert the CD." TAGM supports caching chunks to the local hard disk. In Socrates, the studio should call FCacheTagToHD as soon as the chunk is requested by the kid, and when the tag is resolved to a BACO, the HD copy is used. This reduces headaches about dealing with a missing CD all over the place. If a tag has ksidUseCrf for its sid, the chunk is read from the tag's pcrf rather than a source or a source's cache. Use this functionality for things like content chunks embedded in user documents. *************************************************************************/ #ifndef TAGM_H #define TAGM_H const long ksidInvalid = -1; // negative SIDs imply an invalid TAG const long sidNil = 0; const long ksidUseCrf = 0; // chunk is in ptag->pcrf typedef struct TAG *PTAG; struct TAG { #ifdef DEBUG // I can't use the MARKMEM macro because that makes MarkMem() virtual, // which changes size(TAG), which I don't want to do. void MarkMem(void); #endif // DEBUG long sid; // Source ID (or ksidUseCrf) PCRF pcrf; // File to look in for this chunk if sid is ksidUseCrf CTG ctg; // CTG of chunk CNO cno; // CNO of chunk }; const BOM kbomTag = 0xFF000000; // FNINSCD is a client-supplied callback function to alert the user to // insert the given CD. The name of the source is passed to the callback. // The function should return fTrue if the user wants to retry searching // for the chunk, or fFalse to cancel. typedef bool FNINSCD(PSTN pstnSourceTitle); typedef FNINSCD *PFNINSCD; enum { ftagmNil = 0x0000, ftagmFile = 0x0001, // for ClearCache: clear HD cache ftagmMemory = 0x0002, // for ClearCache: clear CRF RAM cache }; /**************************************** Tag Manager class ****************************************/ typedef class TAGM *PTAGM; #define TAGM_PAR BASE #define kclsTAGM 'TAGM' class TAGM : public TAGM_PAR { RTCLASS_DEC MARKMEM ASSERT protected: FNI _fniHDRoot; // Root HD directory to search for content long _cbCache; // Size of RAM Cache on files in CRM for each source PGL _pglsfs; // GL of source file structs PGST _pgstSource; // String table of source descriptions PFNINSCD _pfninscd; // Function to call when source is not found protected: TAGM(void) { } bool _FFindSid(long sid, long *pistn = pvNil); bool _FGetStnMergedOfSid(long sid, PSTN pstn); bool _FGetStnSplitOfSid(long sid, PSTN pstnLong, PSTN pstnShort); bool _FRetry(long sid); bool _FEnsureFniCD(long sid, PFNI pfniCD, PSTN pstn = pvNil); bool _FFindFniCD(long sid, PFNI pfniCD, bool *pfFniChanged); bool _FDetermineIfSourceHD(long sid, bool *pfSourceIsOnHD); bool _FDetermineIfContentOnFni(PFNI pfni, bool *pfContentOnFni); bool _FGetFniHD(long sid, PFNI pfniHD); bool _FGetFniCD(long sid, PFNI pfniHD, bool fAskForCD); bool _FBuildFniHD(long sid, PFNI pfniHD, bool *pfExists); PCRM _PcrmSourceNew(long sid, PFNI pfniInfo); PCRM _PcrmSourceGet(long sid, bool fDontHitCD = fFalse); PCFL _PcflFindTag(PTAG ptag); public: static PTAGM PtagmNew(PFNI pfniHDRoot, PFNINSCD pfninscd, long cbCache); ~TAGM(void); // GstSource stuff: PGST PgstSource(void); bool FMergeGstSource(PGST pgst, short bo, short osk); bool FAddStnSource(PSTN pstnMerged, long sid); bool FGetSid(PSTN pstn, long *psid); // pstn can be short or long bool FFindFile(long sid, PSTN pstn, PFNI pfni, bool fAskForCD); void SplitString(PSTN pstnMerged, PSTN pstnLong, PSTN pstnShort); bool FBuildChildTag(PTAG ptagPar, CHID chid, CTG ctgChild, PTAG ptagChild); bool FCacheTagToHD(PTAG ptag, bool fCacheChildChunks = fTrue); PBACO PbacoFetch(PTAG ptag, PFNRPO pfnrpo, bool fUseCD = fFalse); void ClearCache(long sid = sidNil, ulong grftagm = ftagmFile | ftagmMemory); // sidNil clears all caches // For ksidUseCrf tags: static bool FOpenTag(PTAG ptag, PCRF pcrfDest, PCFL pcflSrc = pvNil); static bool FSaveTag(PTAG ptag, PCRF pcrf, bool fRedirect); static void DupTag(PTAG ptag); // call this when you're copying a tag static void CloseTag(PTAG ptag); static ulong FcmpCompareTags(PTAG ptag1, PTAG ptag2); }; #endif // TAGM_H ================================================ FILE: inc/tatr.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** tatr.h: Theater class Primary Author: ****** Review Status: REVIEWED - any changes to this file must be reviewed! BASE ---> BACO ---> CMH ---> TATR ***************************************************************************/ #ifndef TATR_H #define TATR_H #ifdef DEBUG // Flags for TATR::AssertValid() enum { ftatrNil = 0x0000, ftatrMvie = 0x0001, }; #endif // DEBUG /**************************************** The theater class ****************************************/ typedef class TATR *PTATR; #define TATR_PAR CMH #define kclsTATR 'TATR' class TATR : public TATR_PAR { RTCLASS_DEC ASSERT MARKMEM CMD_MAP_DEC(TATR) protected: long _kidParent; // ID of gob parent of MVU PMVIE _pmvie; // Currently loaded movie protected: TATR(long hid) : CMH(hid) { } bool _FInit(long kidParent); public: static PTATR PtatrNew(long kidParent); ~TATR(void); bool FCmdLoad(PCMD pcmd); bool FCmdPlay(PCMD pcmd); bool FCmdStop(PCMD pcmd); bool FCmdRewind(PCMD pcmd); PMVIE Pmvie(void) { return _pmvie; } }; #endif TATR_H ================================================ FILE: inc/tbox.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Status: All changes must be code reviewed. Textbox Class Textbox (TBOX) TXRD ---> TBOX Drawing stuff Textbox border (TBXB) GOB ---> TBXB Textbox Ddg (TBXG) TXRG ---> TBXG (created as a child Gob of a TBXB) Cut/Copy/Paste Stuff Clipboard object (TCLP) DOCB ---> TCLP ***************************************************************************/ #ifndef TBOX_H #define TBOX_H // // Defines for global text box constant values // #define kdzpBorderTbox 5 // Width of the border in pixels #define kdxpMinTbox 16 + 2 * kdxpIndentTxtg // Minimum Width of a tbox in pixels #define kdypMinTbox 12 // Minimum Height of a tbox in pixels #define kxpDefaultTbox 177 // Default location of a tbox #define kypDefaultTbox 78 // Default location of a tbox #define kdxpDefaultTbox 140 // Default width of a tbox #define kdypDefaultTbox 100 // Default height of a tbox // // // The border for a single textbox (TBXB) // // // // Definitions for each of the anchor points in a border // enum TBXT { tbxtUp, tbxtUpRight, tbxtRight, tbxtDownRight, tbxtDown, tbxtDownLeft, tbxtLeft, tbxtUpLeft, tbxtMove }; #define TBXB_PAR GOB typedef class TBXB *PTBXB; #define kclsTBXB 'TBXB' class TBXB : public TBXB_PAR { RTCLASS_DEC ASSERT MARKMEM private: PTBOX _ptbox; // Owning text box. bool _fTrackingMouse; // Are we tracking the mouse. TBXT _tbxt; // The anchor point being dragged. long _xpPrev; // Previous x coord of the mouse. long _ypPrev; // Previous y coord of the mouse. RC _rcOrig; // Original size of the border. TBXB(PTBOX ptbox, PGCB pgcb) : GOB(pgcb) { _ptbox = ptbox; } TBXT _TbxtAnchor(long xp, long yp); // Returns the anchor point the mouse is at. public: // // Creates a text box with border // static PTBXB PtbxbNew(PTBOX ptbox, PGCB pgcb); // // Overridden routines // void Draw(PGNV pgnv, RC *prcClip); void Activate(bool fActive); virtual bool FPtIn(long xp, long yp); virtual bool FCmdMouseMove(PCMD_MOUSE pcmd); virtual bool FCmdTrackMouse(PCMD_MOUSE pcmd); void AttachToMouse(void); }; // // // The DDG for a single textbox (TBXG). // // #define TBXG_PAR TXRG typedef class TBXG *PTBXG; #define kclsTBXG 'TBXG' class TBXG : public TBXG_PAR { RTCLASS_DEC ASSERT MARKMEM CMD_MAP_DEC(TBXG) private: PTBXB _ptbxb; // Enclosing border. RC _rcOld; // Old rectangle for the ddg. TBXG(PTXRD ptxrd, PGCB pgcb) : TXRG(ptxrd, pgcb) { } ~TBXG(void); public: // // Creation function // static PTBXG PtbxgNew(PTBOX ptbox, PGCB pgcb); // // Accessors // void SetTbxb(PTBXB ptbxb) { _ptbxb = ptbxb; } PTBXB Ptbxb(void) { return _ptbxb; } // // Scrolling // bool FNeedToScroll(void); // Does this text box need to scroll anything void Scroll(long scaVert); // Scrolls to beginning or a single pixel only. // // Overridden routines // virtual bool FPtIn(long xp, long yp); virtual bool FCmdMouseMove(PCMD_MOUSE pcmd); virtual bool FCmdTrackMouse(PCMD_MOUSE pcmd); virtual bool FCmdClip(PCMD pcmd); virtual bool FEnableDdgCmd(PCMD pcmd, ulong *pgrfeds); virtual void Draw(PGNV pgnv, RC *prcClip); virtual long _DxpDoc(void); virtual void _NewRc(void); virtual void InvalCp(long cp, long ccpIns, long ccpDel); void Activate(bool fActive); virtual void _FetchChp(long cp, PCHP pchp, long *pcpMin = pvNil, long *pcpLim = pvNil); // // Status // bool FTextSelected(void); // // Only for TBXB // bool _FDoClip(long tool); // Actually does a clipboard command. }; enum { grfchpNil = 0, kfchpOnn = 0x01, kfchpDypFont = 0x02, kfchpBold = 0x04, kfchpItalic = 0x08 }; const ulong kgrfchpAll = (kfchpOnn | kfchpDypFont | kfchpBold | kfchpItalic); // // // Text box document class (TBOX). // // typedef class TBOX *PTBOX; #define TBOX_PAR TXRD #define kclsTBOX 'TBOX' class TBOX : public TBOX_PAR { RTCLASS_DEC ASSERT MARKMEM private: PSCEN _pscen; // The owning scene long _nfrmFirst; // Frame the tbox appears in. long _nfrmMax; // Frame the tbox disappears in. long _nfrmCur; // Current frame number. bool _fSel; // Is this tbox selected? bool _fStory; // Is this a story text box. RC _rc; // Size of text box. TBOX(void) : TXRD() { } public: // // Creation routines // static PTBOX PtboxNew(PSCEN pscen = pvNil, RC *prcRel = pvNil, bool fStory = fTrue); PDDG PddgNew(PGCB pgcb) { return TBXG::PtbxgNew(this, pgcb); } static PTBOX PtboxRead(PCRF pcrf, CNO cno, PSCEN pscen); bool FWrite(PCFL pcfl, CNO cno); bool FDup(PTBOX *pptbox); // // Movie specific functions // void SetScen(PSCEN pscen); bool FIsVisible(void); bool FGotoFrame(long nfrm); void Select(bool fSel); bool FSelected(void) { return _fSel; } bool FGetLifetime(long *pnfrmStart, long *pnfrmLast); bool FShowCore(void); bool FShow(void); void HideCore(void); bool FHide(void); bool FStory(void) { return _fStory; } void SetTypeCore(bool fStory); bool FSetType(bool fStory); bool FNeedToScroll(void); void Scroll(void); PSCEN Pscen(void) { return _pscen; } bool FTextSelected(void); bool FSetAcrBack(ACR acr); bool FSetAcrText(ACR acr); bool FSetOnnText(long onn); bool FSetDypFontText(long dypFont); bool FSetStyleText(ulong grfont); void SetStartFrame(long nfrm); void SetOnnDef(long onn) { _onnDef = onn; } void SetDypFontDef(long dypFont) { _dypFontDef = dypFont; } void FetchChpSel(PCHP pchp, ulong *pgrfchp); void AttachToMouse(void); // // Overridden functions // void SetDirty(bool fDirty = fTrue); virtual bool FAddUndo(PUNDB pundb); virtual void ClearUndo(void); void ParClearUndo(void) { TBOX_PAR::ClearUndo(); } // // TBXG/TBXB specific funtions // void GetRc(RC *prc) { *prc = _rc; } void SetRc(RC *prc); void CleanDdg(void); long Itbox(void); // // Undo access functions, not for use by anyone but tbox.cpp // long NfrmFirst(void) { return _nfrmFirst; } long nfrmMax(void) { return _nfrmMax; } }; // // // Textbox document for clipping // // typedef class TCLP *PTCLP; #define TCLP_PAR DOCB #define kclsTCLP 'TCLP' class TCLP : public TCLP_PAR { RTCLASS_DEC MARKMEM ASSERT protected: PTBOX _ptbox; // Text box copy. TCLP(void) { } public: // // Constructors and destructors // static PTCLP PtclpNew(PTBOX ptbox); ~TCLP(void); // // Pasting // bool FPaste(PSCEN pscen); }; #endif ================================================ FILE: inc/tdf.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** tdf.h: Three-D Font class Primary Author: ****** Review Status: REVIEWED - any changes to this file must be reviewed! BASE ---> BACO ---> TDF (Three-D Font) ***************************************************************************/ #ifndef TDF_H #define TDF_H /**************************************** 3-D Font class ****************************************/ typedef class TDF *PTDF; #define TDF_PAR BACO #define kclsTDF 'TDF' class TDF : public TDF_PAR { RTCLASS_DEC ASSERT MARKMEM protected: long _cch; // count of chars BRS _dyrMax; // max character height BRS *_prgdxr; // character widths BRS *_prgdyr; // character heights protected: TDF(void) { } bool _FInit(PBLCK pblck); public: static bool FReadTdf(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb); ~TDF(void); // This authoring-only API creates a new TDF based on a set of models static bool FCreate(PCRF pcrf, PGL pglkid, STN *pstn, CKI *pckiTdf = pvNil); PMODL PmodlFetch(CHID chid); BRS DxrChar(long ich); BRS DyrChar(long ich); BRS DyrMax(void) { return _dyrMax; } }; #endif // TDF_H ================================================ FILE: inc/tdfmake.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** tdfmake.h: Three-D Font authoring tool Primary Author: ****** Review Status: Not yet reviewed ***************************************************************************/ #ifndef TDFMAKE_H #define TDFMAKE_H #include #include "frame.h" #endif //! TDFMAKE_H ================================================ FILE: inc/tdt.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** tdt.h: Three-D Text class Primary Author: ****** Review Status: REVIEWED - any changes to this file must be reviewed! BASE ---> BACO ---> TMPL ---> TDT (Three-D Text) ***************************************************************************/ #ifndef TDT_H #define TDT_H // 3-D Text Shapes - the positions and orientations of the letters enum { tdtsNil = -1, tdtsNormal = 0, tdtsArchPositive, tdtsCircleY, tdtsLargeMiddle, tdtsArchNegative, tdtsArchZ, tdtsCircleZ, tdtsVertical, tdtsGrowRight, tdtsGrowLeft, tdtsLim }; // 3-D Actions enum { tdaNil = -1, tdaRest = 0, tdaLetterRotX, // each letter rotates around its own X axis tdaLetterRotY, tdaLetterRotZ, tdaSwingX, // letters skew right, then left, then back to normal tdaSwingY, tdaSwingZ, tdaPulse, // letters grow 10%, then shrink back to normal tdaWordRotX, // (rotate entire word around X axis) tdaWordRotY, tdaWordRotZ, tdaWave, // a bump ripples through the letters tdaReveal, // letters slowly grow from zero height tdaWalk, // walk (word hops forward as if walking) tdaHop, // letters hop up and down tdaStretch, // stretch in X tdaLim }; /**************************************** 3-D Text class ****************************************/ typedef class TDT *PTDT; #define TDT_PAR TMPL #define kclsTDT 'TDT' class TDT : public TDT_PAR { RTCLASS_DEC ASSERT MARKMEM protected: static PGST _pgstAction; // Action names long _tdts; // TDT shape TAG _tagTdf; // Tag to Three-D Font PMTRL _pmtrlDefault; // MTRL for TDT's default costume PACTN _pactnCache; // Last-used action long _tdaCache; // Action in pactnCache protected: virtual bool _FInit(PCFL pcfl, CTG ctgTmpl, CNO cnoTmpl); bool _FInitLists(void); PGL _PglibactParBuild(void); PGL _PglibsetBuild(void); PGG _PggcmidBuild(void); PGL _Pglbmat34Build(long tda); PGG _PggcelBuild(long tda); virtual PACTN _PactnFetch(long tda); PACTN _PactnBuild(long tda); virtual PMODL _PmodlFetch(CHID chidModl); long _CcelOfTda(long tda); void _ApplyAction(BMAT34 *pbmat34, long tda, long ich, long ccel, long icel, BRS xrChar, BRS pdxrText); void _ApplyShape(BMAT34 *pbmat34, long tdts, long cch, long ich, BRS xrChar, BRS dxrText, BRS yrChar, BRS dyrMax, BRS dyrTotal); public: static bool FSetActionNames(PGST pgstAction); #ifdef DEBUG static void MarkActionNames(void); #endif static PTDT PtdtNew(PSTN pstn, long tdts, PTAG ptagTdf); ~TDT(void); static PGL PgltagFetch(PCFL pcfl, CTG ctg, CNO cno, bool *pfError); PTDT PtdtDup(void); void GetInfo(PSTN pstn, long *ptdts, PTAG ptagTdf); bool FChange(PSTN pstn, long tdts = tdtsNil, PTAG ptagTdf = pvNil); bool FWrite(PCFL pcfl, CTG ctg, CNO *pcno); bool FAdjustBody(PBODY pbody); virtual bool FSetDefaultCost(PBODY pbody); virtual PCMTL PcmtlFetch(long cmid); virtual bool FGetActnName(long anid, PSTN pstn); }; #endif // TDT_H ================================================ FILE: inc/tgob.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Lite, low-cholestoral, politically correct, ethinically and genderally mixed text gobs. TGOB ---> GOB ***************************************************************************/ #ifndef TGOB_H #define TGOB_H #include "frame.h" // // Tgob class // #define TGOB_PAR GOB #define kclsTGOB 'tgob' typedef class TGOB *PTGOB; class TGOB : public TGOB_PAR { RTCLASS_DEC ASSERT MARKMEM protected: long _onn; long _dypFont; STN _stn; long _tah; long _tav; ACR _acrFore; ACR _acrBack; ~TGOB(void) { } public: // // Create and destroy functions // TGOB(PGCB pgcb); TGOB(long hid); void SetFont(long onn) { AssertThis(0); _onn = onn; } void SetFontSize(long dypFont) { AssertThis(0); _dypFont = dypFont; } void SetText(PSTN pstn) { AssertThis(0); _stn = *pstn; InvalRc(pvNil, kginMark); } void SetAcrFore(ACR acrFore) { AssertThis(0); _acrFore = acrFore; } void SetAcrBack(ACR acrBack) { AssertThis(0); _acrBack = acrBack; } void SetAlign(long tah = tahLim, long tav = tavLim); long GetFont(void) { AssertThis(0); return (_onn); } long GetFontSize(void) { AssertThis(0); return _dypFont; } ACR GetAcrFore(void) { AssertThis(0); return (_acrFore); } ACR GetAcrBack(void) { AssertThis(0); return (_acrBack); } void GetAlign(long *ptah = pvNil, long *ptav = pvNil); static PTGOB PtgobCreate(long kidFrm, long idsFont, long tav = tavTop, long hid = hidNil); virtual void Draw(PGNV pgnv, RC *prcClip); }; #endif ================================================ FILE: inc/tmpl.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /************************************************************************* tmpl.h: Actor template class Primary Author: ****** Review Status: REVIEWED - any changes to this file must be reviewed! BASE ---> BACO ---> ACTN BASE ---> BACO ---> TMPL A TMPL encapsulates all the data that distinguishes one actor "species" from another, including the species' models, actions, and custom texture maps. One or more BODY classes are created based on a TMPL, and the TMPL attaches models and materials to the body based on more abstract concepts like actions and costumes. *************************************************************************/ #ifndef TMPL_H #define TMPL_H /**************************************** Cel part spec: tells what model and xfrm to apply to a body part for one cel ****************************************/ struct CPS { short chidModl; // CHID (under TMPL chunk) of model for this body part short imat34; // index into ACTN's GL of transforms }; const BOM kbomCps = 0x50000000; /**************************************** Cel: tells what CPS's to apply to an actor for one cel. It also tells what sound to play (if any), and how far the actor should move from the previous cel (dwr). ****************************************/ struct CEL { CHID chidSnd; // sound to play at this cel (CHID under ACTN chunk) BRS dwr; // distance from previous cel // CPS rgcps[]; // list of cel part specs (variable part of pggcel) }; const BOM kbomCel = 0xf0000000; // template on file struct TMPLF { short bo; short osk; BRA xaRest; // reminder: BRAs are shorts BRA yaRest; BRA zaRest; short swPad; // so grftmpl (and the whole TMPLF) is long-aligned ulong grftmpl; }; #define kbomTmplf 0x554c0000 // action chunk on file struct ACTNF { short bo; short osk; long grfactn; }; const ulong kbomActnf = 0x5c000000; // grfactn flags enum { factnRotateX = 1, // Tells whether actor should rotate around this factnRotateY = 2, // axis when following a path factnRotateZ = 4, factnStatic = 8, // Tells whether this is a stationary action }; /**************************************** ACTN (action): all the information for an action like 'rest' or 'walk'. ****************************************/ typedef class ACTN *PACTN; #define ACTN_PAR BACO #define kclsACTN 'ACTN' class ACTN : public ACTN_PAR { RTCLASS_DEC ASSERT MARKMEM protected: PGG _pggcel; // GG of CELs; variable part is a rgcps[] PGL _pglbmat34; // GL of transformation matrices used in this action PGL _pgltagSnd; // GL of motion-match sounds for this action ulong _grfactn; // various flags for this action protected: ACTN(void) { } // can't instantiate directly; must use FReadActn bool _FInit(PCFL pcfl, CTG ctg, CNO cno); public: static PACTN PactnNew(PGG pggcel, PGL pglbmat34, ulong grfactn); static bool FReadActn(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb); ~ACTN(void); ulong Grfactn(void) { return _grfactn; } long Ccel(void) { return _pggcel->IvMac(); } void GetCel(long icel, CEL *pcel); void GetCps(long icel, long icps, CPS *pcps); void GetMatrix(long imat34, BMAT34 *pbmat34); void GetSnd(long icel, PTAG ptagSnd); }; // grftmpl flags enum { ftmplOnlyCustomCostumes = 1, // fTrue means don't apply generic MTRLs ftmplTdt = 2, // fTrue means this is a 3-D Text object ftmplProp = 4, // fTrue means this is a "prop" actor }; /**************************************** TMPL: The template class. anid is an action ID. cmid is a costume ID. celn is a cel number. ****************************************/ typedef class TMPL *PTMPL; #define TMPL_PAR BACO #define kclsTMPL 'TMPL' class TMPL : public TMPL_PAR { RTCLASS_DEC ASSERT MARKMEM protected: BRA _xaRest; // Rest orientation BRA _yaRest; BRA _zaRest; ulong _grftmpl; PGL _pglibactPar; // GL of parent IDs (shorts) to build BODY PGL _pglibset; // GL of body-part-set IDs to build BODY PGG _pggcmid; // List of costumes for each body part set long _ccmid; // Count of custom costumes long _cbset; // Count of body part sets long _cactn; // Count of actions STN _stn; // Template name protected: TMPL(void) { } // can't instantiate directly; must use FReadTmpl bool _FReadTmplf(PCFL pcfl, CTG ctg, CNO cno); virtual bool _FInit(PCFL pcfl, CTG ctgTmpl, CNO cnoTmpl); virtual PACTN _PactnFetch(long anid); virtual PMODL _PmodlFetch(CHID chidModl); bool _FWriteTmplf(PCFL pcfl, CTG ctg, CNO *pcno); public: static bool FReadTmpl(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb); ~TMPL(void); static PGL PgltagFetch(PCFL pcfl, CTG ctg, CNO cno, bool *pfError); // TMPL / BODY stuff void GetName(PSTN pstn); // default name of actor or text of the TDT PBODY PbodyCreate(void); // Creates a body based on this TMPL void GetRestOrien(BRA *pxa, BRA *pya, BRA *pza); bool FIsTdt(void) { return FPure(_grftmpl & ftmplTdt); } bool FIsProp(void) { return FPure(_grftmpl & ftmplProp); } // Action stuff long Cactn(void) { return _cactn; } // count of actions virtual bool FGetActnName(long anid, PSTN pstn); bool FSetActnCel(PBODY pbody, long anid, long celn, BRS *pdwr = pvNil); bool FGetGrfactn(long anid, ulong *pgrfactn); bool FGetDwrActnCel(long anid, long celn, BRS *pdwr); bool FGetCcelActn(long anid, long *pccel); bool FGetSndActnCel(long anid, long celn, bool *pfSoundExists, PTAG ptag); // Costume stuff virtual bool FSetDefaultCost(PBODY pbody); // applies default costume virtual PCMTL PcmtlFetch(long cmid); long CcmidOfBset(long ibset); long CmidOfBset(long ibset, long icmid); bool FBsetIsAccessory(long ibset); // whether ibset holds accessories bool FIbsetAccOfIbset(long ibset, long *pibsetAcc); bool FSameAccCmids(long cmid1, long cmid2); }; #endif TMPL_H ================================================ FILE: inc/utest.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** utest.h: Socrates main app class Primary Author: ****** Review Status: REVIEWED - any changes to this file must be reviewed! ***************************************************************************/ #ifndef UTEST_H #define UTEST_H /**************************************** KidWorld for the App class ****************************************/ typedef class KWA *PKWA; #define KWA_PAR WOKS #define kclsKWA 'KWA' class KWA : public KWA_PAR { RTCLASS_DEC ASSERT MARKMEM protected: PMBMP _pmbmp; // MBMP to draw in KWA (may be pvNil) bool _fAskForCD; public: KWA(GCB *pgcb) : WOKS(pgcb) { _fAskForCD = fTrue; } ~KWA(void); virtual void Draw(PGNV pgnv, RC *prcClip); virtual bool FFindFile(PSTN pstnSrc, PFNI pfni); // for finding AVIs virtual bool FModalTopic(PRCA prca, CNO cnoTopic, long *plwRet); void SetMbmp(PMBMP pmbmp); void SetCDPrompt(bool fAskForCD) { _fAskForCD = fAskForCD; } bool FAskForCD(void) { return _fAskForCD; } }; // // If you change anything for the registry, notify SeanSe for setup changes. // #define kszSocratesKey PszLit("Software\\Microsoft\\Microsoft Kids\\3D Movie Maker") #define kszWaveOutMsgValue PszLit("WaveOutMsg") #define kszMidiOutMsgValue PszLit("MidiOutMsg") #define kszGreaterThan8bppMsgValue PszLit("GreaterThan8bppMsg") #define kszSwitchResolutionValue PszLit("SwitchResolution") #define kszHomeDirValue PszLit("HomeDirectory") #define kszInstallDirValue PszLit("InstallDirectory") #define kszProductsKey PszLit("Software\\Microsoft\\Microsoft Kids\\3D Movie Maker\\Products") #define kszUserDataValue PszLit("UserData") #define kszBetterSpeedValue PszLit("BetterSpeed") // FGetSetRegKey flags enum { fregNil = 0, fregSetKey = 0x01, fregSetDefault = 0x02, fregString = 0x04, fregBinary = 0x08, // not boolean fregMachine = 0x10 }; /**************************************** The app class ****************************************/ typedef class APP *PAPP; #define APP_PAR APPB #define kclsAPP 'APP' class APP : public APP_PAR { RTCLASS_DEC CMD_MAP_DEC(APP) ASSERT MARKMEM protected: bool _fDontReportInitFailure; // init failure was already reported bool _fOnscreenDrawing; PCFL _pcfl; // resource file for app PSTDIO _pstdio; // Current studio PTATR _ptatr; // Current theater PCRM _pcrmAll; // The app CRM -- all crfs are loaded into this. PGL _pglicrfBuilding; // List of crfs in _pcrmAll belonging to Building. PGL _pglicrfStudio; // List of crfs in _pcrmAll belonging to Studio. bool _fDontMinimize : 1, // "/M" command-line switch _fSlowCPU : 1, // running on slow CPU _fSwitchedResolution : 1, // we successfully switched to 640x480 mode _fMainWindowCreated : 1, _fMinimized : 1, _fRunInWindow : 1, // run in a window (as opposed to fullscreen) _fFontError : 1, // Have we already seen a font error? _fInPortfolio : 1; // Is the portfolio active? PCEX _pcex; // Pointer to suspended cex. FNI _fniPortfolioDoc; // document last opened in portfolio PMVIE _pmvieHandoff; // Stores movie for studio to use PKWA _pkwa; // Kidworld for App PGST _pgstBuildingFiles; PGST _pgstStudioFiles; PGST _pgstSharedFiles; PGST _pgstApp; // Misc. app global strings STN _stnAppName; // App name STN _stnProductLong; // Long version of product name STN _stnProductShort; // Short version of product name STN _stnUser; // User's name long _sidProduct; FNI _fniCurrentDir; // fni of current working directory FNI _fniExe; // fni of this executable file FNI _fniMsKidsDir; // e.g., \mskids FNI _fniUsersDir; // e.g., \mskids\users FNI _fniMelanieDir; // e.g., \mskids\users\melanie FNI _fniProductDir; // e.g., \mskids\3dmovie or \mskids\otherproduct FNI _fniUserDir; // User's preferred directory FNI _fni3DMovieDir; // e.g., \mskids\3dMovie long _dypTextDef; // Default text height long _cactDisable; // disable count for keyboard accelerators #ifdef BUG1085 long _cactCursHide; // hide count for cursor long _cactCursSav; // saved count for cursor #endif // // // bool _fDown; long _cactToggle; #ifdef WIN HACCEL _haccel; HACCEL _haccelGlobal; #endif protected: bool _FAppAlreadyRunning(void); void _TryToActivateWindow(void); bool _FEnsureOS(void); bool _FEnsureAudio(void); bool _FEnsureVideo(void); bool _FEnsureColorDepth(void); bool _FEnsureDisplayResolution(void); bool _FDisplaySwitchSupported(void); void _ParseCommandLine(void); void _SkipToSpace(char **ppch); void _SkipSpace(char **ppch); bool _FEnsureProductNames(void); bool _FFindProductDir(PGST pgst); bool _FQueryProductExists(STN *pstnLong, STN *pstnShort, FNI *pfni); bool _FFindMsKidsDir(void); bool _FFindMsKidsDirAt(FNI *path); bool _FCantFindFileDialog(PSTN pstn); bool _FGenericError(PSTZ message); bool _FGenericError(PSTN message); bool _FGenericError(FNI *path); bool _FGetUserName(void); bool _FGetUserDirectories(void); bool _FReadUserData(void); bool _FWriteUserData(void); bool _FDisplayHomeLogo(void); bool _FDetermineIfSlowCPU(void); bool _FOpenResourceFile(void); bool _FInitKidworld(void); bool _FInitProductNames(void); bool _FReadTitlesFromReg(PGST *ppgst); bool _FInitTdt(void); PGST _PgstRead(CNO cno); bool _FReadStringTables(void); bool _FSetWindowTitle(void); bool _FInitCrm(void); bool _FAddToCrm(PGST pgstFiles, PCRM pcrm, PGL pglFiles); bool _FInitBuilding(void); bool _FInitStudio(PFNI pfniUserDoc, bool fFailIfDocOpenFailed = fTrue); void _GetWindowProps(long *pxp, long *pyp, long *pdxp, long *pdyp, DWORD *pdwStyle); void _RebuildMainWindow(void); bool _FSwitch640480(bool fTo640480); bool _FDisplayIs640480(void); bool _FShowSplashScreen(void); bool _FPlaySplashSound(void); PMVIE _Pmvie(void); void _CleanupTemp(void); #ifdef WIN bool _FSendOpenDocCmd(HWND hwnd, PFNI pfniUserDoc); bool _FProcessOpenDocCmd(void); #endif // WIN // APPB methods that we override virtual bool _FInit(ulong grfapp, ulong grfgob, long ginDef); virtual bool _FInitOS(void); virtual bool _FInitMenu(void) { return fTrue; } // no menubar virtual void _CopyPixels(PGNV pgvnSrc, RC *prcSrc, PGNV pgnvDst, RC *prcDst); virtual void _FastUpdate(PGOB pgob, PREGN pregnClip, ulong grfapp = fappNil, PGPT pgpt = pvNil); virtual void _CleanUp(void); virtual void _Activate(bool fActive); virtual bool _FGetNextEvt(PEVT pevt); #ifdef WIN virtual bool _FFrameWndProc(HWND hwnd, uint wm, WPARAM wParam, LPARAM lw, long *plwRet); #endif // WIN public: APP(void) { _dypTextDef = 0; } // Overridden APPB functions virtual void GetStnAppName(PSTN pstn); virtual long OnnDefVariable(void); virtual long DypTextDef(void); virtual tribool TQuerySaveDoc(PDOCB pdocb, bool fForce); virtual void Quit(bool fForce); virtual void UpdateHwnd(HWND hwnd, RC *prc, ulong grfapp = fappNil); virtual void Run(ulong grfapp, ulong grfgob, long ginDef); #ifdef BUG1085 virtual void HideCurs(void); virtual void ShowCurs(void); // New cursor methods void PushCurs(void); void PopCurs(void); #endif // BUG 1085 // Command processors bool FCmdLoadStudio(PCMD pcmd); bool FCmdLoadBuilding(PCMD pcmd); bool FCmdTheaterOpen(PCMD pcmd); bool FCmdTheaterClose(PCMD pcmd); bool FCmdIdle(PCMD pcmd); bool FCmdInfo(PCMD pcmd); bool FCmdPortfolioClear(PCMD pcmd); bool FCmdPortfolioOpen(PCMD pcmd); bool FCmdDisableAccel(PCMD pcmd); bool FCmdEnableAccel(PCMD pcmd); bool FCmdInvokeSplot(PCMD pcmd); bool FCmdExitStudio(PCMD pcmd); bool FCmdDeactivate(PCMD pcmd); static bool FInsertCD(PSTN pstnTitle); void DisplayErrors(void); void SetPortfolioDoc(PFNI pfni) { _fniPortfolioDoc = *pfni; } void GetPortfolioDoc(PFNI pfni) { *pfni = _fniPortfolioDoc; } void SetFInPortfolio(bool fInPortfolio) { _fInPortfolio = fInPortfolio; } bool FInPortfolio(void) { return _fInPortfolio; } PSTDIO Pstdio(void) { return _pstdio; } PKWA Pkwa(void) { return _pkwa; } PCRM PcrmAll(void) { return _pcrmAll; } bool FMinimized() { return _fMinimized; } bool FGetStnApp(long ids, PSTN pstn) { return _pgstApp->FFindExtra(&ids, pstn); } void GetStnProduct(PSTN pstn) { *pstn = _stnProductLong; } void GetStnUser(PSTN pstn) { *pstn = _stnUser; } void GetFniExe(PFNI pfni) { *pfni = _fniExe; } void GetFniProduct(PFNI pfni) { *pfni = _fniProductDir; } void GetFniUsers(PFNI pfni) { *pfni = _fniUsersDir; } void GetFniUser(PFNI pfni) { *pfni = _fniUserDir; } void GetFniMelanie(PFNI pfni) { *pfni = _fniMelanieDir; } long SidProduct(void) { return _sidProduct; } bool FGetOnn(PSTN pstn, long *ponn); void MemStat(long *pdwTotalPhys, long *pdwAvailPhys = pvNil); bool FSlowCPU(void) { return _fSlowCPU; } // Kid-friendly modal dialog stuff: void EnsureInteractive(void) { #ifdef WIN if (_fMinimized || GetForegroundWindow() != vwig.hwndApp) #else if (_fMinimized) #endif { #ifdef WIN SetForegroundWindow(vwig.hwndApp); ShowWindow(vwig.hwndApp, SW_RESTORE); #else //! WIN RawRtn(); #endif //! WIN } } tribool TModal(PRCA prca, long tpc, PSTN pstnBackup = pvNil, long bkBackup = ivNil, long stidSubst = ivNil, PSTN pstnSubst = pvNil); // Enable/disable accelerator keys void DisableAccel(void); void EnableAccel(void); // Registry access function bool FGetSetRegKey(PSZ pszValueName, void *pvData, long cbData, ulong grfreg = fregSetDefault, bool *pfNoValue = pvNil); // Movie handoff routines void HandoffMovie(PMVIE pmvie); PMVIE PmvieRetrieve(void); // Determines whether screen savers should be blocked. virtual bool FAllowScreenSaver(void); }; #define vpapp ((APP *)vpappb) #endif //! UTEST_H ================================================ FILE: inc/utestres.h ================================================ //{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by utest.rc // #include "socdef.h" #define stidAppName 1 #define stidPortNameLabel 2 #define stid3DMovieNameLong 3 #define stid3DMovieNameShort 4 #define stidInstallDriverWin95 5 #define stidInstallDriverNT 6 #define stidInstallCmdLine 7 #define stidSectionName 8 // uses 7 entries #define stidDriverName 15 // uses 7 entries #define IDI_APP 208 #define IDI_DOC 209 #define IDI_CD 210 #define dlidBadOS 211 #define dlidNotEnoughColors 212 #define dlidTooManyColors 213 #define dlidDesktopResizing 214 #define dlidDesktopResized 215 #define dlidDesktopWontResize 216 #define bmidHomeLogo 217 #define dlidInfo 218 #define dlidInitFailed 219 #define dlidInitFailedOOM 220 #define dlidNoWaveOut 221 #define dlidNoMidiOut 222 #define dlidPortfolio 223 #define dlidCantFindFile 224 #define acidGlobal 225 #define dlidAbnormalExit 226 #define dlidGenericErrorBox 227 #define IDC_CHECK1 1010 #define IDC_RADIO1 1012 #define IDC_RADIO2 1013 #define IDC_RADIO3 1014 #define IDC_RADIO4 1015 #define IDC_RADIO5 1016 #define idsTotalMemory 1017 #define IDC_EDIT1 1018 #define IDC_EDIT2 1019 #define IDC_EDIT4 1020 #define IDC_BUTTON1 1021 #define IDC_BUTTON2 1022 #define IDC_PREVIEW 1023 #define IDC_BUTTON3 1024 #define IDC_EDIT3 1025 #define cidInfo 40038 #define cidWriteBmps 40039 #define cidHelpBook 40040 #define cidToggleXY 40041 #define cidMap 40042 #define IDC_STATIC -1 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 226 #define _APS_NEXT_COMMAND_VALUE 40045 #define _APS_NEXT_CONTROL_VALUE 1026 #define _APS_NEXT_SYMED_VALUE 128 #endif #endif ================================================ FILE: inc/version.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ #define rmj 1 #define rmm 0 #define rup 1009 #define szVerName "" #define szVerUser "SHEILA" ================================================ FILE: kauai/doc/chunk.txt ================================================ /*************************************************************************** Chunky file API. ***************************************************************************/ /**************************************** Types ****************************************/ class CFL; typedef class CFL *PCFL; A chunky file. class CGE; An auto class to enumerate over a subgraph of a chunky file. It is illegal to assign a cge to another cge. typedef ulong CTG; A chunk type. These should all be registered in ctg.h. typedef ulong CNO; A chunk number. These are assigned by the chunky code when a chunk is created. It is possible to create a chunk with a given cno, but this is generally not a good thing to do as doing so will overwrite any existing chunk with that cno. struct CKI; A struct consisting of a ctg and cno. Identifies a chunk within a chunky file. typedef ulong CHID; A child id. When adding a child to a chunk, you can specify an id by which you will refer to the child (in the context of the parent). These are preserved when chunks are copied to other files (while cno's may not be). struct KID; A struct consisting of a CKI and a CHID. Identifies a child chunk. ulong grfcfl; A group of flags indicating chunky file options. /**************************************** Constants ****************************************/ ulong fcflNil; // default options ulong fcflWriteEnable; // open with write permissions ulong fcflTemp; // make it a temp chunky file ulong fcflMark; // mark the chunky file (see below) ulong fcflAddToExtra; // forces added chunks to be in a temp file // (until FSave is called). ulong fcflFull; // debug only - may be passed to AssertObj to // do a full check of the chunky file /**************************************** Concepts ****************************************/ Chunky files have both a mark flag and an open count. See file.txt for a description of how these work. If a chunky file is opened read-only, or if fcflAddToExtra is specified at open or create time, then chunks are added to a temp file associated with the chunky file. When the chunky file is then saved, all chunk data is put in the same file. Opening a chunky file with write permissions (and without fAddToExtra), then adding chunks to the file invalidates the file until it is saved (the index is trashed on disk until it is saved). Closing a chunky file does _not_ automatically save it. The chunks in a CFL form an acyclic directed graph. Ie, a chunk can own other ("child") chunks. Child chunks may be owned by more than one chunk and may themselves own chunks. It is illegal to create a cycle, where a chunk is a direct or indirect descendent of itself. REVIEW shonk: assert and check for cycles. /**************************************** CFL static methods ****************************************/ PCFL CFL::PcflFirst(void); Chunky files form a linked list. This returns the first chunky file in the linked list. PCFL CFL::PcflFromFni(FNI *pfni); If the file indicated by *pfni is open as a chunky file, this returns a pointer to the CFL. Otherwise it returns pNil. PCFL CFL::PcflOpen(FNI *pfni, ulong grfcfl); Attempts to open the indicated file as a chunky file. grfcfl may include fcflWriteEnable, fcflAddToExtra, fcflMark. fcflTemp is illegal. If the file is already open as a chunky file, this ensures that the permissions are high enough and increments the open count. This should be balanced with a call to pcfl->Close(). Specifying fcflMark causes the cfl to be marked (but not the underlying fil). Returns pNil on failure. PCFL CFL::PcflCreate(FNI *pfni, ulong grfcfl); Creates and opens the indicated file as a chunk file (asserts that it isn't already open) and sets the open count to 1. Assumes fcflWriteEnable. fcflMark is legal. Use fcflTemp to create a temp chunky file, which will be automatically deleted when it is closed. Returns pNil on failure. void CFL::ClearMarks(void); Clears the mark flag on all chunky files. See discussion under concepts. void CFL::CloseUnmarked(void); Closes all chunky files that are not marked and have zero open count. See discussion under concepts. /**************************************** CFL methods ****************************************/ PCFL CFL::Next(void); Returns the next chunky file (in the linked list). void CFL::Open(void); Increment the open count, nothing more. void CFL::Close(void); Decrements the open count. If the cfl is not marked and the open count becomes zero, the cfl is closed. bool CFL::FSave(CTG ctgCreator, FNI *pfni = pNil); Saves the chunky file. Passing pNil (or the current fni of the CFL) for pfni does a normal save. Passing any other fni does a save as (the original file still exists). Note: if you do a save as, but added chunks to the file and had it open for writing, the original file may be corrupt. Adding chunks to a file opened for writing corrupts the file until it is saved. void CFL::Mark(void); Set the mark flag. void CFL::SetTemp(bool f); Set whether the chunky file is a temp file. Temp files are automatically deleted when they are closed. bool CFL::FTemp(void); Return whether the chunky file is a temp file. void CFL::GetFni(FNI *pfni); Get the file name. bool CFL::FFind(CTG ctg, CNO cno, FLO *pflo); Look for the chunk and fill in *pflo with the location of its data. HQ CFL::HqGet(CTG ctg, CNO cno); Read the chunk into an hq. Returns hqNil if there is no such chunk or on memory failure. bool CFL::FAdd(long cb, CTG ctg, CNO *pcno, FLO *pflo); Adds a chunk to the file. Fills in *pcno with the cno for the chunk and fills in *pflo with the space on file allocated for the chunk. bool CFL::FAddPv(void *pv, long cb, CTG ctg, CNO *pcno); bool CFL::FAddHq(HQ hq, CTG ctg, CNO *pcno); Adds a chunk to the file and writes the data from the pv or hq into it. Fills in *pcno with the cno for the chunk. pv can only be nil if cb is zero. bool CFL::FAddChild(CTG ctgPar, CNO cnoPar, CHID chid, long cb, CTG ctg, CNO *pcno, FLO *pflo); bool CFL::FAddChildPv(CTG ctgPar, CNO cnoPar, CHID chid, void *pv, long cb, CTG ctg, CNO *pcno); bool CFL::FAddChildHq(CTG ctgPar, CNO cnoPar, CHID chid, HQ hq, CTG ctg, CNO *pcno); These atomize the adding of a chunk and adopting the new chunk by (ctgPar, cnoPar). bool CFL::FPut(long cb, CTG ctg, CNO cno, FLO *pflo); Replaces (or creates) the indicated chunk. Use this with caution. You may be nuking an existing chunk by calling this. Preserves any existing children of the node. bool CFL::FPutPv(void *pv, long cb, CTG ctg, CNO cno); bool CFL::FPutHq(HQ hq, CTG ctg, CNO cno); Replaces (or creates) the indicated chunk with the data in pv or hq. Use this with caution. You may be nuking an existing chunk by calling this. Preserves any existing children of the node. pv can only be nil if cb is zero. bool CFL::FCopy(CTG ctgSrc, CNO cnoSrc, PCFL pcflDst, CNO *pcnoDst); Copies a chunk from one file to another. If the chunk has already been copied, the actual data is not copied again, but the child sub-graph is verified (new descendents will be copied) and names of the chunks in the graph are verified. void CFL::Delete(CTG ctg, CNO cno); Deletes a chunk. It is illegal to call this on a child chunk. It should only be called on top level chunks. This deletes (or decrements reference counts of) descendents of the chunk. bool CFL::FAdoptChild(CTG ctgPar, CNO cnoPar, CTG ctgChild, CNO cnoChild, CHID chid = 0); Makes (ctgChild, cnoChild) a child of (ctgPar, cnoPar) with the given chid value. If it already is a child with this chid value, this does nothing. Note that a chunk may be a child of another chunk multiple times (with different chid values). void DeleteChild(CTG ctgPar, CNO cnoPar, CTG ctgChild, CNO cnoChild, CHID chid); Deletes (ctgChild, cnoChild, chid) as a child of (ctgPar, cnoPar). If the child is no longer a child of any chunks, it is deleted from the cfl. This deletes (or decrements reference counts of) descendents of the child. bool CFL::FSetName(CTG ctg, CNO cno, char *pstz); Sets the name of the chunk. If pstz is pNil, makes the name empty. bool CFL::FGetName(CTG ctg, CNO cno, char *pstz); Gets the name of the chunk. Returns fFalse iff the name is empty. long CFL::Ccki(void); Returns the number of chunks in the file. bool CFL::FGetCki(long icki, CKI *pcki); Gets a cki for the icki'th chunk. Returns false if icki is too big. long CFL::CckiCtg(CTG ctg); Returns the number of chunks of type ctg in the file. bool CFL::FGetCkiCtg(CTG ctg, long icki, CKI *pcki); Gets a cki for the icki'th chunk of type ctg. Returns false if icki is too big. long CFL::Ckid(CTG ctgPar, CNO cnoPar); Returns the number of children of the given chunk. bool CFL::FGetKid(CTG ctgPar, CNO cnoPar, long ikid, KID *pkid); Gets a kid for the ikid'th child of (ctgPar, cnoPar). Returns false if ikid is too big. bool CFL::FGetKidChid(CTG ctgPar, CNO cnoPar, CHID chid, KID *pkid); Gets a kid for the first child of (ctgPar, cnoPar) with given chid. bool CFL::FGetKidChidCtg(CTG ctgPar, CNO cnoPar, CHID chid, CTG ctg, KID *pkid); Gets a kid for the first child of (ctgPar, cnoPar) with given chid and ctg. /**************************************** CGE methods ****************************************/ void CGE::Init(PCFL pcfl, CTG ctg, CNO cno); This initializes an enumeration and must be called before GrfcgeNextKid is called. The enumeration is over the given node and all of its descendents. bool CGE::FNextKid(KID *pkid, CKI *pckiPar, ulong *pgrfcgeOut, ulong grfcgeIn); Fetches the next node in the graph enumeration. Returns fFalse iff the enumeration is done (there are no more nodes). Generally, parent nodes are returned twice (once with fcgePre and again with fcgePost). Nodes without children are returned only once (with both fcgePre and fcgePost set). The new node is put in *pkid, and the node's parent (if the node is not the root of the enumeration) is put in *pckiPar. pckiPar may be nil. If fcgeSkipToSib is passed in (in the grfcgeIn parameter), skips all children and the upward touch of the last node returned. The value of *pgrfcge on return can contain any combination of: fcgePre, fcgePost, fcgeError, fcgeRoot. These have the following meanings: fcgePre: haven't traversed the node's children yet fcgePost: have already traversed the children (or there aren't any children) fcgeError: a memory error occurred; may be set in conjunction with other flags fcgeRoot: *pkid is valid (except the chid value); *pckiPar is invalid; the node is the root of the enumeration ================================================ FILE: kauai/doc/file.txt ================================================ /*************************************************************************** API doc for low level file management. See chunk.txt for chunky file management. ***************************************************************************/ /**************************************** Classes and types ****************************************/ class FIL; typedef class FIL *PFIL; Low level file class. class FLO; File location class. Has fields for a pfil, fp and cb. Legal as auto. typedef long FP; A file position (index into a file). /**************************************** Other hungarian ****************************************/ short bo; Indicates byte order. short osk; Indicates an operating system. Typically used to determine how to translate strings (from one character set to another). See TranslateStz and its cousins in utilstr. These have the same value in either byte order. Ie, their high and low bytes are the same. short el; Error level. These, in order of severity, include elNil, kelWrite, kelRead, kelSeek, kelCritical. ushort grffil; A group of flags indicating file options. /**************************************** Constants ****************************************/ short kboCur; // byte order same as current machine short kboOther; // byte order opposite from current machine short koskCur; // current machine short koskMac; // Mac OS short koskWin; // Win OS ushort ffilNil; // default options ushort ffilWriteEnable; // open with write permissions ushort ffilTemp; // make it a temp file ushort ffilMark; // mark the file (see below) /**************************************** Concepts ****************************************/ Files have both a mark flag and an open count. If you open a file that is already open, the open count of the file is incremented. Calling pfil->Close() decrements the open count. A pfil is only freed when both the open count is zero and the mark flag is clear. To set the mark flag, specify ffilMark when opening or creating the file, or call pfil->Mark(). To use Quill-style Mark-and-Free, open the file with ffilMark specified and call pfil->Close(). At cleanup time, client code should call FIL::ClearMarks() to clear all the mark flags, then enumerate files still needed and call Mark() on them, then call FIL::CloseUnmarked(). Files that were marked or have non-zero open count will not be closed by FIL::CloseUnmarked(). For a file used locally, open the file normally. When you are done with it, call close. There is no need to monkey with the marking stuff if you just need to do a quick file access. Files have a delayed error handling mechanism. If you have several file accesses to make, you can generally do them all without checking for errors. If an error occurs, future file accesses will short circuit. At the end of a section of several accesses, you should call ElError() to check for an error. /**************************************** FIL static methods ****************************************/ PFIL FIL::PfilFirst(void); The first pfil (they form a linked list). PFIL FIL::PfilFromFni(FNI *pfni); If the file indicated by *pfni is open, this returns a pointer to the FIL. Otherwise it returns pNil. PFIL FIL::PfilOpen(FNI *pfni, ushort grffil); Opens the indicated file with the indicated options. Read-only is the default. To allow writing to a file, use ffilWriteEnable. If the file is already open, this ensures that the read/write permissions are high enough and increments the open count. This call should be balanced with a call to pfil->Close(). Specifying ffilMark causes the file to be marked. ffilTemp is illegal. PFIL FIL::PfilCreate(FNI *pfni, ushort grffil); Creates and opens the indicated file (asserts that it isn't already open) and sets the open count to 1. Assumes ffilWriteEnable. ffilMark is legal. Use ffilTemp to create a temp file, which will be automatically deleted when it is closed. void FIL::ClearMarks(void); Clears the mark flag on all files. See discussion under concepts. void FIL::CloseUnmarked(void); Closes all files that are not marked and have zero open count. See discussion under concepts. /**************************************** FIL methods ****************************************/ PFIL FIL::Next(void); Returns the next file (in the linked list). void FIL::Open(void); Increment the open count, nothing more. void FIL::Close(void); Decrements the open count. If the file is not marked and the open count becomes zero, the file is closed. void FIL::Mark(void); Sets the mark flag. short FIL::ElError(void); Returns the error level of the file. elNil means no error. void FIL::SetTemp(bool f); Set or clear the temp flag. Temp files are automatically deleted when closed. bool FIL::FTemp(void); Returns the temp flag. void FIL::GetFni(FNI *pfni); Gets the file name. void FIL::SetFpPos(FP fp); Sets the file position. FP FIL::FpPos(void); Returns the current file position. If there has been a seek error (or higher level error), returns 0. bool FIL::FSetFpMac(FP fp); Sets the end of file. Files can not be shrunk using this. This asserts that the passed fp is greater than the current end of file. FP FIL::FpMac(void); Returns the length of the file. If there has been a seek error (or higher level error), returns 0. bool FIL::FReadRgb(void *pv, long cb); Reads cb bytes from the current file position. Advances the file position. Asserts if you read past the end of file. bool FIL::FWriteRgb(void *pv, long cb); Writes cb bytes to the current file position. Advances the file position (and eof if its reached). bool FIL::FSwapNames(PFIL pfil); Renames the files to swap names. Typically used during a safe save. The files should live in the same directory. bool FIL::FRename(FNI *pfni); Renames the file. The fni should be in the same directory as the file. /**************************************** FLO methods ****************************************/ FLO is an auto class: new is illegal; auto, member and global declarations are legal. bool FLO::FRead(void *pv); Read data from the flo into pv. bool FLO::FWrite(void *pv); Write data from pv to the file. bool FLO::FReadRgb(void *pv, long cb, FP dfp); Read cb bytes of data from dfp into the flo into pv. Asserts the range is totally contained within the flo. bool FLO::FWriteRgb(void *pv, long cb, FP dfp); Write cb bytes of data from pv to dfp into the flo. Asserts the range is totally contained within the flo. bool FLO::FCopy(FLO *pfloDest); Copy data from one flo to the other. Asserts the cb's are equal. ================================================ FILE: kauai/doc/glossary.txt ================================================ chdoc.h doc - chunky document chdoc.h doce - chunky editing document chdoc.h doch - hex editor document chdoc.h docg - group editor document chdoc.h doci - item hex editor document chdoc.h docpic - picture display document chdoc.h dclb - line-based document chdoc.h sel - selection chdoc.h dcd - display for chunky document - displays a DOC chdoc.h dch - display chunk in hex - displays a BSF chdoc.h dcgb - display for group chunk chdoc.h dcgl - display for GL or AL chunk chdoc.h dcgg - display for GG or AG chunk chdoc.h dcst - display for GST or AST chunk chdoc.h dcpic - display for picture chunk chdoc.h tscg - test script chunk gob docb.h docb - base class for documents (doc) docb.h dte - document tree enumerator docb.h ddg - document display gob docb.h dmd - document mdi window docb.h dmw - document main window docb.h dsg - document scroll gob docb.h dssp - document scroll window splitter docb.h dssm - document scroll split mover stream.h bsm - byte stream in memory (entire stream is in memory) stream.h bsf - byte stream on file (parts of the stream may be in files) cache.h smep - swappable map entry priority cache.h smec - swappable map error code cache.h sml - swappable map of GL cache.h smg - swappable map of GG cache.h smlhq - cache of HQs cache.h smlpo - cache of POs ================================================ FILE: kauai/doc/groups.txt ================================================ /*************************************************************************** Collection classes: General List (GL), Allocated List (AL), General Group (GG), Allocated Group (AG), General String Table (GST), Allocated String Table (AST). ***************************************************************************/ /**************************************** Types ****************************************/ class GL; typedef class GL *PGL; A general purpose dynamically allocated array class. Data elements must be all the same size. Clients may assume the data elements are contiguous. I.e., if you have a pointer to the iv'th element, incrementing the pointer will give you a pointer to the (iv+1)th element. class AL; typedef class AL *PAL; A list where indices don't change when items are added or deleted. Clients may assume data elements are contiguous. Note, however, that an element may be free. Call FFree to determine if a particular item is free. class GG; typedef class GG *PGG; A group: a collection of data objects of possibly different sizes. If all your elements are the same size, use a GL. class AG; typedef class AG *PAG; A group where indices don't change when items are added or deleted. Entries can be free. Call FFree to determine if an entry is free. class GST; typedef class GST *PGST; A string table. Can also store a fixed size piece of "extra" data for each string. class AST; typedef class AST *PAST; An allocated string table. Like a string table, but indices don't change when strings are added or deleted. Entries can be free. Call FFree to determine if an entry is free. /**************************************** Constants ****************************************/ fgrpNil - default options fgrpShrink - shrink space allocated if its more than needed /**************************************** Common methods ****************************************/ PGL GL::PglNew(long cb, long cvInit = 0); PAL AL::PalNew(long cb, long cvInit = 0); PGG GG::PggNew(long cvInit = 0, long cbInit = 0); PAG AG::PagNew(long cvInit = 0, long cbInit = 0); PGST GST::PgstNew(long cbExtra, long cstzInit = 0, long cchInit = 0); PAST AST::PastNew(long cbExtra, long cstzInit = 0, long cchInit = 0); These are static methods (not invoked from an object) that allocate a new object of the appropriate class. For GL and AL classes, cb is the size of the elements and cvInit is the number of elements to reserve space for. For GST and AST, cbExtra is the amount of extra data associated with each string. For GG, AG, GST and AST, cvInit/cstzInit are how many entries to make room for and cbInit/cchInit are the total number of bytes to allow for these entries. These values are as in FEnsureSpace. PGL GL::PglRead(PFIL pfil, FP fp, long cb, short *pbo, short *posk); PAL AL::PalRead(PFIL pfil, FP fp, long cb, short *pbo, short *posk); PGG GG::PggRead(PFIL pfil, FP fp, long cb, short *pbo, short *posk); PAG AG::PagRead(PFIL pfil, FP fp, long cb, short *pbo, short *posk); PGST GST::PgstRead(PFIL pfil, FP fp, long cb, short *pbo, short *posk); PAST AST::PastRead(PFIL pfil, FP fp, long cb, short *pbo, short *posk); Static methods to read an object from disk. pbo and posk may be nil. *pbo is set to the byte order of the object and *posk is set to the osk (Operating System Kind) that wrote the object. Use *pbo to do byte swapping after reading and *posk to do string translation after reading. bool GL::FWrite(PFIL pfil, FP fp, long *pcb = pvNil, short bo = kboCur, short osk = koskCur); bool AL::FWrite(PFIL pfil, FP fp, long *pcb = pvNil, short bo = kboCur, short osk = koskCur); bool GG::FWrite(PFIL pfil, FP fp, long *pcb = pvNil, short bo = kboCur, short osk = koskCur); bool AG::FWrite(PFIL pfil, FP fp, long *pcb = pvNil, short bo = kboCur, short osk = koskCur); bool GST::FWrite(PFIL pfil, FP fp, long *pcb = pvNil, short bo = kboCur, short osk = koskCur); bool AST::FWrite(PFIL pfil, FP fp, long *pcb = pvNil, short bo = kboCur, short osk = koskCur); Write the object to disk. If pcb is not nil, sets *pcb to the amount of space used. If bo and osk are specified as something different from kboCur and koskCur, these will adjust the byte order and/or osk before writing the data. Obviously, client managed data is not adjusted. REVIEW shonk: should strings in an GST/AST be handled automatically. long GL::CbOnFile(void); long AL::CbOnFile(void); long GG::CbOnFile(void); long AG::CbOnFile(void); long GST::CbOnFile(void); long AST::CbOnFile(void); Returns the amount of space required to write the object to disk. long GL::IvMac(void); long AL::IvMac(void); long GG::IvMac(void); long AG::IvMac(void); long GST::IstzMac(void); long AST::IstzMac(void); Returns the number of active items. For AL, AG and AST, this is the lim of legal indices, not the number of non-free entries. void GL::Delete(long iv); void AL::Delete(long iv); void GG::Delete(long iv); void AG::Delete(long iv); void GST::Delete(long istz); void AST::Delete(long istz); Deletes the indicated element. For AL, AG and AST, indices of remaining items don't change (ie, a hole is created). For the other classes, items with larger indices "slide down" to fill the hole. void *GL::QvGet(long iv); void *AL::QvGet(long iv); void *GG::QvGet(long iv); void *AG::QvGet(long iv); Returns a volatile pointer to the element. For GPs, iv must be less than IvMac(). For GL and AL, iv must be <= IMac() ( == is allowed for convenience; don't access it!). For AL and AG, the element may be free (call FFree to check). void *GL::PvLock(long iv); void *AL::PvLock(long iv); void *GG::PvLock(long iv); void *AG::PvLock(long iv); Locks the data and returns a pointer to the iv'th element. Same restrictions on iv as for QvGet(iv). void GL::Lock(void); void AL::Lock(void); void GG::Lock(void); void AG::Lock(void); Locks the data. void GL::Unlock(void); void AL::Unlock(void); void GG::Unlock(void); void AG::Unlock(void); Unlocks the data. Balances a call to PvLock() or Lock(). Locking is nestable. void GL::Get(long iv, void *pv); void AL::Get(long iv, void *pv); void GG::Get(long iv, void *pv); void AG::Get(long iv, void *pv); Copies the iv'th item to *pv. Assumes pv points to a block large enough to hold the item. iv must be less than IvMac(). For GG and AG, GetRgb is more useful. void GL::Put(long iv, void *pv); void AL::Put(long iv, void *pv); void GG::Put(long iv, void *pv); void AG::Put(long iv, void *pv); The opposite of Get(iv, pv). Copies data from *pv to the iv'th element. For GG and AG, see FPut and PutRgb. bool GL::FAdd(void *pv, long *piv); bool AL::FAdd(void *pv, long *piv); bool GG::FAdd(long cb, void *pv, long *piv); bool AG::FAdd(long cb, void *pv, long *piv); Add a new element to the class. If piv is not nil, *piv is set to the index of the new item. For GL and GG, the new item is always the last. For AL and AG, the first free slot is used. /**************************************** List specific methods ****************************************/ long GL::CbEntry(void); Returns the size of each element of the list (as specified in PglNew or as read from file in PglRead. bool GL::FSetIvMac(long ivMacNew); Changes the number of items active in the list. Rarely used. bool GL::FEnsureSpace(long cvAdd, short grfgrp); Ensure that there is room for at least cvAdd additional items. To close up the list, use FEnsureSpace(0, fgrpShrink). bool GL::FInsert(long iv, void *pv); Inserts a new item into the list at location iv. Parameter iv must be less than or equal to IvMac(). Moves later items up to make room. void Move(long ivSrc, long ivDst) Moves the element at ivSrc to the ivDst position, shifting everything in between. bool GL::FPush(void *pv); Appends the item to the end of the list. Equivalent to FAdd(pv, pvNil). bool GL::FPop(void *pv = pvNil); If the list is empty, returns false (indicating stack underflow). Otherwise, fetches the last item (if pv is not nil), deletes the item, and returns true. bool GL::FEnqueue(void *pv) Equivalent to FInsert(0, pv). bool GL::FDequeue(void *pv = pvNil); Equivalent to FPop(pv). /**************************************** Allocated List specific methods ****************************************/ long AL::CbEntry(void); Returns the size of each element of the list (as specified in PalNew or as read from file in PalRead. bool AL::FEnsureSpace(long cvAdd, short grfgrp); Ensure that there is room for at least cvAdd additional items. To close up the allocated list use FEnsureSpace(0, fgrpShrink). bool AL::FFree(long iv); Indicates whether item iv is free. (This is fast). iv should be less than IvMac(). /**************************************** Group specific methods ****************************************/ bool GG::FEnsureSpace(long cvAdd, long cbAdd, short grfgrp); bool AG::FEnsureSpace(long cvAdd, long cbAdd, short grfgrp); Make sure there is room for at least cvAdd additional items, using cbAdd bytes of space. To close up the group use FEnsureSpace(0, 0, fgrpShrink). bool GG::FInsert(long iv, long cb, void *pv); Inserts an item of size cb into the group. pv may be nil. bool GG::FPut(long iv, long cb, void *pv); bool AG::FPut(long iv, long cb, void *pv); Replaces the item with new data of the given length. pv may be nil, in which case this effectively resizes the element. long GG::Cb(long iv); long AG::Cb(long iv); Returns the length of the item. void GG::GetRgb(long iv, long bv, long cb, void *pv); void AG::GetRgb(long iv, long bv, long cb, void *pv); Fetches a section of data from the given element. bv is the offset of the data into the element, cb is the amount of data to copy and pv is the destination. void GG::PutRgb(long iv, long bv, long cb, void *pv); void AG::PutRgb(long iv, long bv, long cb, void *pv); The inverse of GetRgb. void GG::DeleteRgb(long iv, long bv, long cb); void AG::DeleteRgb(long iv, long bv, long cb); Deletes a portion of the given element. Deletes bytes [bv, bv+cb). bool GG::FInsertRgb(long iv, long bv, long cb, void *pv); bool AG::FInsertRgb(long iv, long bv, long cb, void *pv); Inserts cb new bytes before byte bv of the element. pv may be nil. bool AG::FFree(long iv); Indicates whether item iv is free. (This is fast). iv should be less than IvMac(). /**************************************** String Table specific methods ****************************************/ bool GST::FEnsureSpace(long cstzAdd, long cchAdd, short grfgrp); bool AST::FEnsureSpace(long cstzAdd, long cchAdd, short grfgrp); Make sure there is room for at least cstzAdd additional strings, using cchAdd bytes of space. To close up the string table use FEnsureSpace(0, 0, fgrpShrink). bool GST::FInsertRgch(long istz, char *prgch, long cch, void *pvExtra); bool GST::FInsertStz(long istz, char *pstz, void *pvExtra); bool GST::FInsertSt(long istz, char *pst, void *pvExtra); bool GST::FInsertSz(long istz, char *psz, void *pvExtra); Insert a new string at location istz. pvExtra may be nil. bool GST::FAddRgch(char *prgch, long cch, void *pvExtra, long *pistz); bool GST::FAddStz(char *pstz, void *pvExtra, long *pistz); bool GST::FAddSt(char *pst, void *pvExtra, long *pistz); bool GST::FAddSz(char *psz, void *pvExtra, long *pistz); bool AST::FAddRgch(char *prgch, long cch, void *pvExtra, long *pistz); bool AST::FAddStz(char *pstz, void *pvExtra, long *pistz); bool AST::FAddSt(char *pst, void *pvExtra, long *pistz); bool AST::FAddSz(char *psz, void *pvExtra, long *pistz); Append a string to the string table. pistz may be nil. If not, *pistz is set the index of the new string. pvExtra may be nil. void GST::GetExtra(long istz, void *pv); void AST::GetExtra(long istz, void *pv); Fill pv with the extra data for the string. Asserts that cbExtra is > 0. void GST::PutExtra(long istz, void *pv); void AST::PutExtra(long istz, void *pv); Set the extra data for the string. Asserts that cbExtra is > 0. void GST::GetStz(long istz, char *pstz); void GST::GetSt(long istz, char *pst); void GST::GetSz(long istz, char *psz); void AST::GetStz(long istz, char *pstz); void AST::GetSt(long istz, char *pst); void AST::GetSz(long istz, char *psz); Get the istz'th string. pstz/pst/psz must point to a buffer at least kcbMaxStz/kcbMaxSt/kcbMaxSz bytes long. bool GST::FPutRgch(long istz, char *prgch, long cch); bool GST::FPutStz(long istz, char *pstz); bool GST::FPutSt(long istz, char *pst); bool GST::FPutSz(long istz, char *psz); bool AST::FPutRgch(long istz, char *prgch, long cch); bool AST::FPutStz(long istz, char *pstz); bool AST::FPutSt(long istz, char *pst); bool AST::FPutSz(long istz, char *psz); Replace the istz'th string. bool GST::FFindStz(char *pstz, long *pistz, ulong grfstb = fstbNil); bool GST::FFindSt(char *pst, long *pistz, ulong grfstb = fstbNil); bool GST::FFindSz(char *psz, long *pistz, ulong grfstb = fstbNil); bool AST::FFindStz(char *pstz, long *pistz, ulong grfstb = fstbNil); bool AST::FFindSt(char *pst, long *pistz, ulong grfstb = fstbNil); bool AST::FFindSz(char *psz, long *pistz, ulong grfstb = fstbNil); Finds the given string in the string table. If fstbSorted is specified, and this is an GST, a binary search is performed. If the string is not found, false is returned. If the string is not found and this is an GST and fstbSorted was specified, *pistz will be filled with where the string should be inserted to maintain the sorting. In other cases, if the string is not found, *pistz is filled with IstzMac(). bool AST::FFree(long istz); Indicates whether item istz is free. (This is fast). istz should be less than IstzMac(). ================================================ FILE: kauai/doc/mem.txt ================================================ /*************************************************************************** Memory Management API doc. ***************************************************************************/ /**************************************** Types ****************************************/ HQ An opaque handle to a generic memory block. Implementation is private. HN An operating system handle. On Mac, these are Handles. On Win, they are HGLOBAL. /**************************************** Constants ****************************************/ const byte kbGarbage; New blocks are filled with this (if they are not zeroed) const long kcbMax; Maximum size of an HQ. HQ hqNil; pNil hNil It is legal to assume these are zero. Use hqNil to compare against an explicit hq, pNil for pointers and hNil for any other abstract handle. fhqNil - default options fhqClear - zero newly allocated memory /**************************************** Routines ****************************************/ HQ HqAlloc(long cb, ushort grfhq); Allocates an hq and optionally clears it. void FreeHq(HQ hq); Frees an hq. Accepts hqNil. void FreePhq(HQ *phq); Calls FreeHq on *phq and sets *phq to hqNil. long CbOfHq(HQ hq); Returns the size of the hq. This is guaranteed to be the same as the cb passed to HqAlloc (or FResizePhq). HQ HqCopyHq(HQ hq); Duplicates the hq. bool FResizePhq(HQ *phq, long cb, ushort grfhq); Resizes *phq. The value of *phq may change. void *PvLockHq(HQ hq); Lock the hq and return a pointer to the data. void UnlockHq(HQ hq); Unlock the hq. Must balance a call to PvLockHq or LockHq. void *QvFromHq(HQ hq); Return a volatile pointer to the hq block. /**************************************** Generic pointer arithmetic ****************************************/ void *PvAddBv(void *pv, long bv); Add an offset to a pointer. void *PvSubBv(void *pv, long bv); Subtract an offset from a pointer. long BvSubPvs(void *pv1, void *pv2) Subtract two pointers to get the number of bytes between them. /**************************************** Debug only API ****************************************/ void UnmarkAllHqs(void); Clear the marks on all hq's. void MarkHq(HQ hq); Marks an hq. void AssertUnmarkedHqs(void); Asserts on any unmarked hqs. void AssertHq(HQ hq); Validate an hq. hq should not be nil. ================================================ FILE: kauai/makefile ================================================ #--- $(KAUAI_ROOT)\makefile.mak !INCLUDE $(KAUAI_ROOT)\makefile.def .SILENT: ALL: ALL_KAUAI_SRC ALL_KAUAI_TOOLS ALL_KAUAI_SRC: cd $(KAUAI_ROOT)\src @echo Making Kauai\src All... nmake /NOLOGO all cd $(KAUAI_ROOT) ALL_KAUAI_TOOLS: cd $(KAUAI_ROOT)\tools @echo Making Kauai\tools All... nmake /NOLOGO all cd $(KAUAI_ROOT) CLEAN: CLEAN_OBJ_DIR ALL_KAUAI_SRC ALL_KAUAI_TOOLS CLEAN_OBJ_DIR: @echo Cleaning $(KAUAI_ROOT)\obj\$(BLD_TYPE_DIR)\ directory DEL /q $(KAUAI_ROOT)\obj\$(BLD_TYPE_DIR)\*.obj 2>nul DEL /q $(KAUAI_ROOT)\obj\$(BLD_TYPE_DIR)\*.pch 2>nul DEL /q $(KAUAI_ROOT)\obj\$(BLD_TYPE_DIR)\*.pdb 2>nul DEL /q $(KAUAI_ROOT)\obj\$(BLD_TYPE_DIR)\*.exe 2>nul DEL /q $(KAUAI_ROOT)\obj\$(BLD_TYPE_DIR)\*.res 2>nul DEL /q $(KAUAI_ROOT)\obj\$(BLD_TYPE_DIR)\*.cod 2>nul DEL /q $(KAUAI_ROOT)\obj\$(BLD_TYPE_DIR)\*.map 2>nul DEL /q $(KAUAI_ROOT)\obj\$(BLD_TYPE_DIR)\*.lib 2>nul DEL /q $(KAUAI_ROOT)\obj\$(BLD_TYPE_DIR)\*.i 2>nul DEL /q $(KAUAI_ROOT)\obj\$(BLD_TYPE_DIR)\*.lnk 2>nul CLEAN_KAUAI_SRC: cd $(KAUAI_ROOT)\src @echo Making Kauai\src Clean... nmake /NOLOGO clean cd $(KAUAI_ROOT) CLEAN_KAUAI_TOOLS: cd $(KAUAI_ROOT)\tools @echo Making Kauai\tools Clean... nmake /NOLOGO clean cd $(KAUAI_ROOT)  ================================================ FILE: kauai/makefile.def ================================================ #--- makefile.def -- included in Kids Build makefiles !IFNDEF MAKEFILE_DEF MAKEFILE_DEF = 1 #- Map some variables ---------------------------------------------------------- !IF "$(TYPE)" == "DAY" TYPE=DEBUG INCREMENTAL=1 !ELSEIF "$(TYPE)" == "HOME" TYPE=DEBUG INCREMENTAL= !ELSEIF "$(TYPE)" == "DBSHIP" TYPE=SHIP DEBUG_LINK=1 !ELSEIF "$(LOCAL_BUILD)" != "1" DEBUG_LINK=1 !ENDIF #-Tools------------------------------------------------------------------------- CPP=cl /nologo !IF "$(ARCH)" == "MAC" ASM=asm68 !ENDIF LINK=link MRC=mrc RC=rc CHOMP=$(KAUAI_ROOT)\obj\wins\chomp.exe CHELPDMP=$(KAUAI_ROOT)\obj\wins\chelpdmp.exe !IF "$(ARCH)" == "MAC" .SUFFIXES : .rsc .rm .asm !ELSE .SUFFIXES: .cht .chk .scr !ENDIF #-CPPFLAGS---------------------------------------------------------------------- # /YX is "automate precompiled headers" # /Fp renames the pch file from the default "msvc.pch" # /W3 provides warning level 3 # /Gz uses "stdcall", the default 32-bit VC++ calling convention. DEFS = /D"$(ARCH)" /D"STRICT" !IF "$(CHIP)" != "" DEFS = $(DEFS) /D"$(CHIP)" !ENDIF !IF "$(UNICODE)" != "" DEFS = $(DEFS) /D"UNICODE" !ENDIF #CPPFLAGS = /c /YX /Fp"frame.pch" /W3 /Gz #PLACED PRECOMPILED HEADERS IN PROJ MAKEFILES CPPFLAGS = /c /YX /W3 /Gz /Gy ASMFLAGS = -c !IF "$(BROWSE)" != "" CPPFLAGS = /Fr $(CPPFLAGS) !ENDIF !IF "$(ARCH)" == "WIN" DEFS = $(DEFS) /D"WIN32" !ENDIF !IF "$(TYPE)" == "DEBUG" # /Zi generates debugging info and puts it in the .pdb file # /Fd renames the pdb file from the default "msvc.pdb" # /Og enables global optimization # /Ob1 enables inline expansion DEFS = $(DEFS) /D"DEBUG" !IF "$(ARCH)" == "MAC" CPPFLAGS = /Q68m $(CPPFLAGS) ASMFLAGS = $(ASMFLAGS) -s !ENDIF CPPFLAGS = /Gf /Ge $(CPPFLAGS) !ELSE #CPPFLAGS = /Ogityb1 /Gs /Gf $(CPPFLAGS) REVIEW shonk: revert to this CPPFLAGS = /Ogityb1 /Gs /Gf $(CPPFLAGS) !ENDIF #-LFLAGS--------------------------------------------------------------------------- # Cannot incrementally link and generate mapfile, or optimize references # REVIEW seanse: remove /DEBUG flag for ship build later in project LFLAGS_BASE = /nologo !IF "$(INCREMENTAL)"=="" LFLAGS_CONS = $(LFLAGS_BASE) /OPT:REF /map LFLAGS_GUI = $(LFLAGS_BASE) /OPT:REF /map LFLAGS_LIB = $(LFLAGS_BASE) /OPT:REF !ELSE LFLAGS_CONS = /INCREMENTAL:YES $(LFLAGS_BASE) LFLAGS_GUI = /INCREMENTAL:YES $(LFLAGS_BASE) LFLAGS_LIB = $(LFLAGS_BASE) !ENDIF !IF "$(ARCH)" == "WIN" LFLAGS_CONS = $(LFLAGS_CONS) /SUBSYSTEM:console kernel32.lib comdlg32.lib\ user32.lib gdi32.lib winmm.lib LFLAGS_GUI = $(LFLAGS_GUI) $(LFLAGS_PROF) /SUBSYSTEM:windows,4.0 kernel32.lib\ comdlg32.lib user32.lib gdi32.lib winmm.lib advapi32.lib uuid.lib !ENDIF !IF "$(ARCH)" == "MAC" LFLAGS_GUI = $(LFLAGS_GUI) /MACHINE:M68K !ENDIF #SHIP AND DEBUG USE /DEBUG FLAG #!IF "$(TYPE)" == "DEBUG" # /DEBUG incorporates debugging info (/DEBUGTYPE is cv by default) #LFLAGS_CONS = /DEBUG $(LFLAGS_CONS) #LFLAGS_GUI = /DEBUG $(LFLAGS_GUI) #!ENDIF !IF ("$(TYPE)" == "DEBUG") || ("$(DEBUG_LINK)" == "1") LFLAGS_CONS = /DEBUG $(LFLAGS_CONS) LFLAGS_GUI = /DEBUG $(LFLAGS_GUI) !ENDIF # DEBUG || DEBUG_LINK .cpp.exe: #-Build-Macros--------------------------------------------------------------------- !IF "$(ARCH)" == "WIN" !IF "$(TYPE)" == "DEBUG" !IF "$(UNICODE)"=="" BLD_TYPE_DIR = wind !ELSE BLD_TYPE_DIR = winud !ENDIF !ELSE IF "$(TYPE)" == "SHIP" !IF "$(UNICODE)"=="" BLD_TYPE_DIR = wins !ELSE BLD_TYPE_DIR = winus !ENDIF !ENDIF !ELSE IF "$(ARCH)" == "MAC" !IF "$(TYPE)" == "DEBUG" BLD_TYPE_DIR = macd !ELSE IF "$(TYPE)" == "SHIP" BLD_TYPE_DIR = macs !ENDIF !ENDIF #AUDIO LIB !IF "$(ARCH)" == "WIN" !IF "$(TYPE)" == "DEBUG" AUDIO_LIB = $(KAUAI_ROOT)\elib\$(BLD_TYPE_DIR)\audiod.lib !ELSE IF "$(TYPE)" == "SHIP" AUDIO_LIB = $(KAUAI_ROOT)\elib\$(BLD_TYPE_DIR)\audios.lib !ENDIF !ENDIF #VIDEO FOR WINDOWS LIB VFW32_LIB = $(MSVCNT_ROOT)\lib\vfw32.lib #Windows WNet LIB WNET_LIB = $(MSVCNT_ROOT)\lib\mpr.lib #KAUAI OBJ DIRECTORIES KAUAI_OBJ_ROOT_DIR = $(KAUAI_ROOT)\obj KAUAI_OBJ_DIR = $(KAUAI_OBJ_ROOT_DIR)\$(BLD_TYPE_DIR) #==================================================================== #KAUIA OBJ GROUPS #BASE_OBJS #Base: Base files required for all Kauai based projects #Requires: nothing !IF "$(ARCH)" == "WIN" BASE_PLATFORM_SPECIFIC =\ $(KAUAI_OBJ_DIR)\memwin.obj !ELSE IF "$(ARCH)" == "MAC" BASE_PLATFORM_SPECIFIC =\ $(KAUAI_OBJ_DIR)\memmac.obj !IF "$(CHIP)" == "MC_68020" BASE_CHIP_SPECIFIC =\ $(KAUAI_OBJ_DIR)\utilmc.obj !ENDIF !ENDIF BASE_OBJS =\ $(KAUAI_OBJ_DIR)\utilglob.obj\ $(KAUAI_OBJ_DIR)\util.obj\ $(KAUAI_OBJ_DIR)\base.obj\ $(KAUAI_OBJ_DIR)\utilcopy.obj\ $(KAUAI_OBJ_DIR)\utilerro.obj\ $(KAUAI_OBJ_DIR)\utilint.obj\ $(KAUAI_OBJ_DIR)\utilmem.obj\ $(KAUAI_OBJ_DIR)\utilrnd.obj\ $(KAUAI_OBJ_DIR)\utilstr.obj\ $(BASE_PLATFORM_SPECIFIC)\ $(BASE_CHIP_SPECIFIC) #GROUP_OBJS #Group: Collection classes #Requires: Base, File, and NoFile GROUP_OBJS =\ $(KAUAI_OBJ_DIR)\groups.obj\ $(KAUAI_OBJ_DIR)\groups2.obj #FILE_OBJS #File: File and chunky file stuff #Requires: Group !IF "$(ARCH)" == "WIN" FILE_PLATFORM_SPECIFIC =\ $(KAUAI_OBJ_DIR)\filewin.obj\ $(KAUAI_OBJ_DIR)\fniwin.obj !ELSE IF "$(ARCH)" == "MAC" FILE_PLATFORM_SPECIFIC =\ $(KAUAI_OBJ_DIR)\filemac.obj\ $(KAUAI_OBJ_DIR)\fnimac.obj !ENDIF FILE_OBJS =\ $(KAUAI_OBJ_DIR)\chunk.obj\ $(KAUAI_OBJ_DIR)\codec.obj\ $(KAUAI_OBJ_DIR)\codkauai.obj\ $(KAUAI_OBJ_DIR)\crf.obj\ $(KAUAI_OBJ_DIR)\file.obj\ $(FILE_PLATFORM_SPECIFIC) #NOFILE_OBJS #NoFile: To be implemented in the future #Requires: Base #STREAM_OBJS #Stream: Stream classes #Requires: Group STREAM_OBJS =\ $(KAUAI_OBJ_DIR)\stream.obj #LEXER_OBJS #Lexer: Lexing classes #Requires: Stream LEXER_OBJS =\ $(KAUAI_OBJ_DIR)\lex.obj #SCRCOM_OBJS #ScrCom: Script compiler #Requires: Lexer SCRCOM_OBJS =\ $(KAUAI_OBJ_DIR)\scrcom.obj #KIDCOM_OBJS #KidCom: Script compiler for kidspace scripts #Requires: ScrCom KIDCOM_OBJS =\ $(KAUAI_OBJ_DIR)\scrcomg.obj #SCREXE_OBJS #ScrExe: Script interpreter #Requires: Group SCREXE_OBJS =\ $(KAUAI_OBJ_DIR)\screxe.obj #MBMPIO_OBJS #MbmpIO: Masked bitmap IO support #Requires: File or NoFile MBMPIO_OBJS =\ $(KAUAI_OBJ_DIR)\mbmp.obj #CHSE_OBJS #Chse: Chunky source emitter #Requires: Group CHSE_OBJS =\ $(KAUAI_OBJ_DIR)\chse.obj #CHCM_OBJS #Chcm: Chunky compiler and decompiler classes #Requires: Lexer, Chse, MbmpIO, KidCom CHCM_OBJS =\ $(KAUAI_OBJ_DIR)\chcm.obj #SOUND_OBJS #Sound: Sound support #Requires: Group SOUND_OBJS =\ $(KAUAI_OBJ_DIR)\sndm.obj\ $(KAUAI_OBJ_DIR)\sndam.obj\ $(KAUAI_OBJ_DIR)\mididev.obj\ $(KAUAI_OBJ_DIR)\mididev2.obj\ $(KAUAI_OBJ_DIR)\midi.obj #NOSOUND_OBJS #NoSound: Not yet implemented #Requires: Base #VIDEO_OBJS #Video: Video playback and support #Requires: GUI VIDEO_OBJS =\ $(KAUAI_OBJ_DIR)\video.obj #NOVIDEO_OBJS #NoVideo: Not yet implemented #Requires: GUI #SPELL_OBJS #SpellChecker #Requires: Base, Group SPELL_OBJS =\ $(KAUAI_OBJ_DIR)\spell.obj #GUI_OBJS #Gui: Support for a GUI application #Requires: Group, MbmpIO, Sound or NoSound, Video or NoVideo !IF "$(ARCH)" == "WIN" GUI_PLATFORM_SPECIFIC =\ $(KAUAI_OBJ_DIR)\appbwin.obj\ $(KAUAI_OBJ_DIR)\gfxwin.obj\ $(KAUAI_OBJ_DIR)\gobwin.obj\ $(KAUAI_OBJ_DIR)\menuwin.obj\ $(KAUAI_OBJ_DIR)\picwin.obj !ELSE IF "$(ARCH)" == "MAC" GUI_PLATFORM_SPECIFIC =\ $(KAUAI_OBJ_DIR)\appbmac.obj\ $(KAUAI_OBJ_DIR)\gfxmac.obj\ $(KAUAI_OBJ_DIR)\gobmac.obj\ $(KAUAI_OBJ_DIR)\menumac.obj\ $(KAUAI_OBJ_DIR)\picmac.obj !ENDIF GUI_OBJS =\ $(KAUAI_OBJ_DIR)\appb.obj\ $(KAUAI_OBJ_DIR)\clok.obj\ $(KAUAI_OBJ_DIR)\cmd.obj\ $(KAUAI_OBJ_DIR)\cursor.obj\ $(KAUAI_OBJ_DIR)\gfx.obj\ $(KAUAI_OBJ_DIR)\gob.obj\ $(KAUAI_OBJ_DIR)\mbmpgui.obj\ $(KAUAI_OBJ_DIR)\region.obj\ $(KAUAI_OBJ_DIR)\pic.obj\ $(GUI_PLATFORM_SPECIFIC) #DLG_OBJS #Dlg: Dialog support #Requires: Gui !IF "$(ARCH)" == "WIN" DLG_PLATFORM_SPECIFIC =\ $(KAUAI_OBJ_DIR)\dlgwin.obj\ !ELSE IF "$(ARCH)" == "MAC" DLG_PLATFORM_SPECIFIC =\ $(KAUAI_OBJ_DIR)\dlgmac.obj\ !ENDIF DLG_OBJS =\ $(KAUAI_OBJ_DIR)\dlg.obj\ $(DLG_PLATFORM_SPECIFIC) #CTL_OBJS #Ctl: Control support #Requires: Gui CTL_OBJS =\ $(KAUAI_OBJ_DIR)\ctl.obj #DOC_OBJS #Doc: Base document class support #Requires: Ctl DOC_OBJS =\ $(KAUAI_OBJ_DIR)\docb.obj\ $(KAUAI_OBJ_DIR)\clip.obj #RICHTEXT_OBJS #RichText: Rich text document support #Requires: Doc, Stream RICHTEXT_OBJS =\ $(KAUAI_OBJ_DIR)\rtxt.obj\ $(KAUAI_OBJ_DIR)\rtxt2.obj #TEXTEDIT_OBJS #TextEdit: Edit controls #Requires: Gui, Stream TEXTEDIT_OBJS =\ $(KAUAI_OBJ_DIR)\text.obj #PLAINTEXT_OBJS #PlainText: Plain line based text document #Requires: Doc, Stream PLAINTEXT_OBJS =\ $(KAUAI_OBJ_DIR)\textdoc.obj #KID_OBJS #Kid: Kidspace and help balloon stuff #Requires: Gui, ScrExe KID_OBJS =\ $(KAUAI_OBJ_DIR)\kidworld.obj\ $(KAUAI_OBJ_DIR)\kidhelp.obj\ $(KAUAI_OBJ_DIR)\kidspace.obj\ $(KAUAI_OBJ_DIR)\screxeg.obj #KAUAITEST_OBJS #KauiaTest: Kauai test app stuff #Requires: Gui, File KAUAITEST_OBJS =\ $(KAUAI_OBJ_DIR)\ft.obj\ $(KAUAI_OBJ_DIR)\test.obj #CHED_OBJS #Ched: Chunky editor #Requires: Gui, Kid, KidCom, PlainText, Doc, Chcm CHED_OBJS =\ $(KAUAI_OBJ_DIR)\chdoc.obj\ $(KAUAI_OBJ_DIR)\ched.obj\ $(KAUAI_OBJ_DIR)\chgrp.obj\ $(KAUAI_OBJ_DIR)\chhex.obj\ $(KAUAI_OBJ_DIR)\chmbmp.obj\ $(KAUAI_OBJ_DIR)\chpic.obj\ $(KAUAI_OBJ_DIR)\chtxt.obj #CHELP_OBJS #Chelp: Chunky help editor #Requires: Gui, Kid, RichText CHELP_OBJS =\ $(KAUAI_OBJ_DIR)\chelp.obj\ $(KAUAI_OBJ_DIR)\chtop.obj\ $(KAUAI_OBJ_DIR)\chelpexp.obj #CHOMP_OBJS #Chomp: Chunky compiler #Requires: File, Group, Chcm CHOMP_OBJS =\ $(KAUAI_OBJ_DIR)\chomp.obj\ $(KAUAI_OBJ_DIR)\mssio.obj !ENDIF # !MAKEFILE_DEF ================================================ FILE: kauai/makefile.kmk ================================================ # makefile.kmk # # This is the makefile used by kmake.bat. It knows how to build everything # in Kauai LOCAL_BUILD=1 # Included files should append targets as follows: # *** Any target that should be executed for a clean should be appended # to "CLEAN_TARGETS_ROOT" # *** Any target that should be built by default should be appended to # "ALL_TARGETS_ROOT". Note that there *will* be targets defined which # should not be appended to this, because they are only interesting # when used as dependents to something else. CLEAN_TARGETS_ROOT= ALL_TARGETS_ROOT= ############################################################################# ## Process ERRLVL ## ############################################################################# # CHKERR is used in any build rule that should cause the build to stop !IF "$(ERRLVL)" == "FATAL" CHKERR=@@if errorlevel 1 goto error !ELSE CHKERR=@@if errorlevel 1 (echo Removing goodmake.log & rm goodmake.log) !ENDIF # CHKERRW is used in any build rule that should report an error, but should # never cause the build to stop, even if ERRLVL == FATAL CHKERRW=@@if errorlevel 1 (echo Removing goodmake.log & rm goodmake.log) .SUFFIXES: .cpp .asm .c .obj .rc .cht !INCLUDE $(KAUAI_ROOT)\makefile.def !INCLUDE $(KAUAI_ROOT)\src\makefile !INCLUDE $(KAUAI_ROOT)\tools\makefile # NOTE: unlike the other "CLEAN" targets, this does not actually do a build. # This is intentional (BY DESIGN). CLEAN: -del $(KAUAI_ROOT)\obj\$(BLD_TYPE_DIR)\*.obj 2> nul -del $(KAUAI_ROOT)\obj\$(BLD_TYPE_DIR)\*.pch 2> nul -del $(KAUAI_ROOT)\obj\$(BLD_TYPE_DIR)\*.pdb 2> nul -del $(KAUAI_ROOT)\obj\$(BLD_TYPE_DIR)\*.exe 2> nul -del $(KAUAI_ROOT)\obj\$(BLD_TYPE_DIR)\*.res 2> nul -del $(KAUAI_ROOT)\obj\$(BLD_TYPE_DIR)\*.chk 2> nul -del $(KAUAI_ROOT)\obj\$(BLD_TYPE_DIR)\*.cht 2> nul -del $(KAUAI_ROOT)\obj\$(BLD_TYPE_DIR)\*.cod 2> nul -del $(KAUAI_ROOT)\obj\$(BLD_TYPE_DIR)\*.map 2> nul -del $(KAUAI_ROOT)\obj\$(BLD_TYPE_DIR)\*.thd 2> nul -del $(KAUAI_ROOT)\obj\$(BLD_TYPE_DIR)\*.lib 2> nul -del $(KAUAI_ROOT)\obj\$(BLD_TYPE_DIR)\*.lnk 2> nul -del $(KAUAI_ROOT)\obj\$(BLD_TYPE_DIR)\*.ilk 2> nul -del $(KAUAI_ROOT)\obj\$(BLD_TYPE_DIR)\*.i 2> nul CLEAN_BY_FILE: $(CLEAN_TARGETS_ROOT) @echo on ALL: $(ALL_TARGETS_ROOT) ================================================ FILE: kauai/makefile.rul ================================================ # Use this file to automatically declare rules for a group of targets. # Set the "SRC_DIR" variable to the appropriate directory, set OBJ_DIR # to the appropriate target directory and then include this file. # If the "LOCAL_BUILD" variable is defined and set to "1", this indicates that # we're already cd'd to the target directory. This allows nmake to use a much # simpler set of make rules. #-Compile rules------------------------------------------------------------- !IF "$(LOCAL_BUILD)" != "1" !IF "$(LOCAL_BUILD)" != "0" {$(SRC_DIR)}.cpp.obj: @nmake /NOLOGO $(OBJ_DIR)\%|fF.obj {$(SRC_DIR)}.cpp.exe: @nmake /NOLOGO $(OBJ_DIR)\%|fF.exe {$(SRC_DIR)}.asm.obj: @nmake /NOLOGO $(OBJ_DIR)\%|fF.obj {$(SRC_DIR)}.rc.res: @nmake /NOLOGO $(OBJ_DIR)\%|fF.res {$(SRC_DIR)}.cht.chk: @nmake /NOLOGO $(OBJ_DIR)\%|fF.chk {$(SRC_DIR)}.cpp.i: @nmake /NOLOGO $(OBJ_DIR)\%|fF.i {$(SRC_DIR)}.cpp.cod: @nmake /NOLOGO $(OBJ_DIR)\%|fF.cod !ENDIF # LOCAL_BUILD != 0 {$(SRC_DIR)}.cpp{$(OBJ_DIR)}.obj: !@echo Compiling $(TGT_NAME) Src... $< $(CPP) $(CPPFLAGS) /Zi /Fd$(KAUAI_OBJ_DIR)\kauai.pdb /Fp$(KAUAI_OBJ_DIR)\kauai.pch /Fo$@ $(DEFS) $< $(CHKERR) {$(SRC_DIR)}.c{$(OBJ_DIR)}.obj: !@echo Compiling $(TGT_NAME) Src... $< $(CPP) $(CPPFLAGS) /Zi /Fd$(KAUAI_OBJ_DIR)\kauai.pdb /Fp$(KAUAI_OBJ_DIR)\kauai.pch /Fo$@ $(DEFS) $< $(CHKERR) {$(SRC_DIR)}.asm{$(OBJ_DIR)}.obj: !@echo Compiling $(TGT_NAME) Assembly Src... $< $(ASM) $(ASMFLAGS) /Fo$@ $(DEFS) $< $(CHKERR) {$(SRC_DIR)}.rc{$(OBJ_DIR)}.res: !@echo Compiling $(TGT_NAME) Resource... $< $(RC) $(DEFS) /Fo$*.res $< $(CHKERR) {$(SRC_DIR)}.cht{$(OBJ_DIR)}.chk: cl /E -I%|pF $(DEFS) /Tp$< > $(OBJ_DIR)\$(@B).i $(CHOMP) $(OBJ_DIR)\$(@B).i $*.chk $(CHKERR) {$(SRC_DIR)}.cpp{$(OBJ_DIR)}.i: !@echo Compiling $(TGT_NAME) Src... $< $(CPP) /E $(DEFS) $< > $*.i $(CHKERR) {$(SRC_DIR)}.cpp{$(OBJ_DIR)}.cod: !@echo Compiling $(TGT_NAME) Src... $< $(CPP) /FAcs $(CPPFLAGS) /Zi /Fd$(KAUAI_OBJ_DIR)\kauai.pdb /Fp$(KAUAI_OBJ_DIR)\kauai.pch $(DEFS) /Fa$*.cod $< $(CHKERR) !ELSE # !LOCAL_BUILD {$(SRC_DIR)}.cpp.obj: $(CPP) $(CPPFLAGS) /Zi /Fdkauai.pdb /Fpkauai.pch $(DEFS) $< $(CHKERR) {$(SRC_DIR)}.c.obj: $(CPP) $(CPPFLAGS) /Zi /Fdkauai.pdb /Fpkauai.pch $(DEFS) $< $(CHKERR) {$(SRC_DIR)}.asm.obj: $(ASM) $(ASMFLAGS) /Fo$@ $(DEFS) $< {$(SRC_DIR)}.rc.res: $(RC) $(DEFS) /Fo$*.res $< $(CHKERR) {$(SRC_DIR)}.cht.chk: cl /P -I%|pF $(DEFS) /Tp$< $(CHOMP) $(@B).i $*.chk $(CHKERR) {$(SRC_DIR)}.cpp.i: $(CPP) /P $(DEFS) $< $(CHKERR) {$(SRC_DIR)}.cpp.cod: $(CPP) /FAcs $(CPPFLAGS) /Zi /Fdkauai.pdb /Fpkauai.pch $(DEFS) /Fa%|fF.cod $< $(CHKERR) !ENDIF # LOCAL_BUILD ================================================ FILE: kauai/src/appb.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Common base application class methods. ***************************************************************************/ #include "frame.h" ASSERTNAME PAPPB vpappb; PCEX vpcex; PSNDM vpsndm; // basic commands common to most apps BEGIN_CMD_MAP(APPB, CMH) ON_CID_GEN(cidQuit, &APPB::FCmdQuit, pvNil) ON_CID_GEN(cidShowClipboard, &APPB::FCmdShowClipboard, &APPB::FEnableAppCmd) ON_CID_GEN(cidChooseWnd, &APPB::FCmdChooseWnd, &APPB::FEnableAppCmd) #ifdef MAC ON_CID_GEN(cidOpenDA, &APPB::FCmdOpenDA, pvNil) #endif // MAC ON_CID_GEN(cidIdle, &APPB::FCmdIdle, pvNil) ON_CID_GEN(cidEndModal, &APPB::FCmdEndModal, pvNil) END_CMD_MAP_NIL() RTCLASS(APPB) /*************************************************************************** Constructor for the app class. Assumes that the block is initially zeroed. This implies that the block has to either be allocated (using NewObj) or a global. ***************************************************************************/ APPB::APPB(void) : CMH(khidApp) { AssertBaseThis(0); vpappb = this; Debug(_fCheckForLostMem = fTrue;) _onnDefFixed = _onnDefVariable = onnNil; AssertThis(0); } /*************************************************************************** Destructor for the app. Assumes we don't have to free anything. ***************************************************************************/ APPB::~APPB(void) { vpappb = pvNil; } /*************************************************************************** Calls _FInit and if successful, calls _Loop then _CleanUp. ***************************************************************************/ void APPB::Run(ulong grfapp, ulong grfgob, long ginDef) { AssertThis(0); if (_FInit(grfapp, grfgob, ginDef)) _Loop(); _CleanUp(); } /*************************************************************************** Quit routine. May or may not initiate the quit sequence (depending on user input). ***************************************************************************/ void APPB::Quit(bool fForce) { AssertThis(0); if (_fQuit || DOCB::FQueryCloseAll(fForce ? fdocForceClose : fdocNil) || fForce) { _fQuit = fTrue; } } /*************************************************************************** Return a default app name. ***************************************************************************/ void APPB::GetStnAppName(PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); *pstn = PszLit("Generic"); } /*************************************************************************** Sets the cursor. Increments the reference count on the cursor. If fLongOp is true, the cursor will get used as the wait cursor, but won't necessarily be displayed immediately. ***************************************************************************/ void APPB::SetCurs(PCURS pcurs, bool fLongOp) { AssertThis(0); AssertNilOrPo(pcurs, 0); PCURS *ppcurs = fLongOp ? &_pcursWait : &_pcurs; if (*ppcurs == pcurs) return; SwapVars(ppcurs, &pcurs); if (pvNil != *ppcurs) (*ppcurs)->AddRef(); // set the new one before we release the old one. RefreshCurs(); ReleasePpo(&pcurs); } /*************************************************************************** Set the indicated cursor as the current one. ***************************************************************************/ void APPB::SetCursCno(PRCA prca, CNO cno, bool fLongOp) { AssertThis(0); AssertPo(prca, 0); PCURS pcurs; if (pvNil == (pcurs = (PCURS)prca->PbacoFetch(kctgCursor, cno, CURS::FReadCurs))) { Warn("cursor not found"); return; } SetCurs(pcurs, fLongOp); ReleasePpo(&pcurs); } /*************************************************************************** Make sure the current cursor is being used by the system. ***************************************************************************/ void APPB::RefreshCurs(void) { AssertThis(0); PCURS *ppcurs = _cactLongOp > 0 ? &_pcursWait : &_pcurs; if (pvNil != *ppcurs) (*ppcurs)->Set(); else { #ifdef WIN SetCursor(LoadCursor(hNil, _cactLongOp > 0 ? IDC_WAIT : IDC_ARROW)); #endif // WIN #ifdef MAC HCURS hcurs; if (_cactLongOp > 0 && hNil != (hcurs = GetCursor(watchCursor))) SetCursor(*hcurs); else SetCursor(&qd.arrow); #endif // MAC } } /*************************************************************************** Starting a long operation, put up the wait cursor. ***************************************************************************/ void APPB::BeginLongOp(void) { AssertThis(0); if (_cactLongOp++ == 0) RefreshCurs(); } /*************************************************************************** Done with a long operation. Decrement the long op count and if it becomes zero, use the normal cursor. If fAll is true, set the long op count to 0. ***************************************************************************/ void APPB::EndLongOp(bool fAll) { AssertThis(0); if (_cactLongOp == 0) return; if (fAll) _cactLongOp = 0; else _cactLongOp--; if (_cactLongOp == 0) RefreshCurs(); } /*************************************************************************** Get the current cursor/modifier state. If fAsync is set, the key state returned is the actual current values at the hardware level, ie, not synchronized with the command stream. ***************************************************************************/ ulong APPB::GrfcustCur(bool fAsync) { AssertThis(0); #ifdef WIN auto pfnT = fAsync ? GetAsyncKeyState : GetKeyState; _grfcust &= ~kgrfcustUser; if (pfnT(VK_CONTROL) < 0) _grfcust |= fcustCmd; if (pfnT(VK_SHIFT) < 0) _grfcust |= fcustShift; if (pfnT(VK_MENU) < 0) _grfcust |= fcustOption; if (pfnT(VK_LBUTTON) < 0) _grfcust |= fcustMouse; #endif // WIN #ifdef MAC Assert(!fAsync, "Unimplemented code"); // REVIEW shonk: Mac: implement #endif // MAC return _grfcust; } /*************************************************************************** Modify the current cursor/modifier state. Doesn't affect the key states or mouse state. ***************************************************************************/ void APPB::ModifyGrfcust(ulong grfcustOr, ulong grfcustXor) { AssertThis(0); grfcustOr &= ~kgrfcustUser; grfcustXor &= ~kgrfcustUser; _grfcust |= grfcustOr; _grfcust ^= grfcustXor; } /*************************************************************************** Hide the cursor ***************************************************************************/ void APPB::HideCurs(void) { AssertThis(0); MacWin(HideCursor(), ShowCursor(fFalse)); } /*************************************************************************** Show the cursor ***************************************************************************/ void APPB::ShowCurs(void) { AssertThis(0); MacWin(ShowCursor(), ShowCursor(fTrue)); } /*************************************************************************** Warp the cursor to (xpScreen, ypScreen) ***************************************************************************/ void APPB::PositionCurs(long xpScreen, long ypScreen) { AssertThis(0); // REVIEW shonk: implement on Mac MacWin(RawRtn(), SetCursorPos(xpScreen, ypScreen)); } /*************************************************************************** Return the default variable pitch font. ***************************************************************************/ long APPB::OnnDefVariable(void) { AssertThis(0); if (_onnDefVariable == onnNil) { STN stn; stn = MacWin(PszLit("New York"), PszLit("Times New Roman")); if (!vntl.FGetOnn(&stn, &_onnDefVariable)) _onnDefVariable = vntl.OnnSystem(); } return _onnDefVariable; } /*************************************************************************** Return the default fixed pitch font. ***************************************************************************/ long APPB::OnnDefFixed(void) { AssertThis(0); if (_onnDefFixed == onnNil) { STN stn; stn = MacWin(PszLit("Courier"), PszLit("Courier New")); if (!vntl.FGetOnn(&stn, &_onnDefFixed)) { // just use the first fixed pitch font for (_onnDefFixed = 0;; _onnDefFixed++) { if (_onnDefFixed >= vntl.OnnMac()) { _onnDefFixed = vntl.OnnSystem(); break; } if (vntl.FFixedPitch(_onnDefFixed)) break; } } } return _onnDefFixed; } /*************************************************************************** Static method to return the default text size. REVIEW shonk: DypTextDef: what's the right way to do this? ***************************************************************************/ long APPB::DypTextDef(void) { AssertThis(0); return 12; } /*************************************************************************** Quit the app (don't force it). ***************************************************************************/ bool APPB::FCmdQuit(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); Quit(fFalse); return fTrue; } /*************************************************************************** Open a window onto the clipboard, if it exists. ***************************************************************************/ bool APPB::FCmdShowClipboard(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); vpclip->Show(); return fTrue; } /*************************************************************************** Handles an idle command. ***************************************************************************/ bool APPB::FCmdIdle(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); static long _cactIdle = 0; PGOB pgob; if (_fQuit) return fFalse; ++_cactIdle; #ifdef DEBUG if ((_cactIdle & 0x00FF) == 0 && _fCheckForLostMem && _cactModal <= 0) { UnmarkAllMem(); UnmarkAllObjs(); MarkMem(); // marks all frame-work memory MarkUtilMem(); // marks all util memory AssertUnmarkedObjs(); AssertUnmarkedMem(); } #endif // DEBUG if ((_cactIdle & 0x0F) == 1 && pvNil != (pgob = GOB::PgobScreen())) { // check to see if the mouse moved PT pt; bool fDown; ulong grfcust; CMD_MOUSE cmd; pgob->GetPtMouse(&pt, &fDown); if (fDown) return fTrue; pgob->MapPt(&pt, cooLocal, cooGlobal); pgob = GOB::PgobFromPtGlobal(pt.xp, pt.yp, &pt); grfcust = GrfcustCur(); if (pgob != _pgobMouse || pt.xp != _xpMouse || pt.yp != _ypMouse || _grfcustMouse != grfcust) { if (_pgobMouse != pgob) { _tsMouse = 0; if (pvNil != _pgobMouse) { AssertPo(_pgobMouse, 0); vpcex->EnqueueCid(cidRollOff, _pgobMouse); _TakeDownToolTip(); } _tsMouseEnter = TsCurrent(); _pgobMouse = pgob; } _xpMouse = pt.xp; _ypMouse = pt.yp; _grfcustMouse = grfcust; ClearPb(&cmd, size(cmd)); cmd.cid = cidMouseMove; cmd.pcmh = pgob; cmd.xp = pt.xp; cmd.yp = pt.yp; cmd.grfcust = grfcust; vpcex->EnqueueCmd((PCMD)&cmd); } // adjust tool tips if (pvNil != _pgobMouse && (_fToolTip || TsCurrent() - _tsMouseEnter > _dtsToolTip)) { _EnsureToolTip(); } } // Flush the sound manager occasionally to free up idle memory if (pvNil != vpsndm && (_cactIdle & 0x003F) == 3) vpsndm->Flush(); return fTrue; } /*************************************************************************** Make sure no tool tip is up. ***************************************************************************/ void APPB::_TakeDownToolTip(void) { AssertThis(0); PGOB pgob; if (pvNil != (pgob = GOB::PgobFromHidScr(khidToolTip))) { if (pgob == _pgobMouse) { Bug("how did a tooltip become _pgobMouse???"); _pgobMouse = pvNil; } ReleasePpo(&pgob); _pgobToolTipTarget = pvNil; } } /*************************************************************************** Make sure a tool tip is up, if the current gob wants one. ***************************************************************************/ void APPB::_EnsureToolTip(void) { AssertThis(0); PGOB pgob; if (pvNil == _pgobMouse) return; if (_pgobToolTipTarget == _pgobMouse) return; pgob = GOB::PgobFromHidScr(khidToolTip); _fToolTip = FPure(_pgobMouse->FEnsureToolTip(&pgob, _xpMouse, _ypMouse)); if (!_fToolTip) { ReleasePpo(&pgob); _pgobToolTipTarget = pvNil; } else _pgobToolTipTarget = _pgobMouse; } /*************************************************************************** Take down any existing tool tip and resest tool tip timing. ***************************************************************************/ void APPB::ResetToolTip(void) { AssertThis(0); _TakeDownToolTip(); _fToolTip = fFalse; _tsMouseEnter = TsCurrent(); } /*************************************************************************** Enable app level commands ***************************************************************************/ bool APPB::FEnableAppCmd(PCMD pcmd, ulong *pgrfeds) { AssertThis(0); AssertVarMem(pcmd); AssertVarMem(pgrfeds); *pgrfeds = fedsEnable; switch (pcmd->cid) { case cidShowClipboard: if (vpclip->FDocIsClip(pvNil)) goto LDisable; break; case cidChooseWnd: if ((HWND)pcmd->rglw[0] == GOB::HwndMdiActive()) *pgrfeds |= fedsCheck; else *pgrfeds |= fedsUncheck; break; default: BugVar("unhandled cid in FEnableAppCmd", &pcmd->cid); LDisable: *pgrfeds = fedsDisable; break; } return fTrue; } /*************************************************************************** Respond to a cidChooseWnd command. ***************************************************************************/ bool APPB::FCmdChooseWnd(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); GOB::MakeHwndActive((HWND)pcmd->rglw[0]); return fTrue; } /*************************************************************************** Application initialization. ***************************************************************************/ bool APPB::_FInit(ulong grfapp, ulong grfgob, long ginDef) { AssertThis(0); _fOffscreen = FPure(grfapp & fappOffscreen); #ifdef DEBUG if (!_FInitDebug()) return fFalse; #endif // initialize the command dispatcher if (pvNil == (vpcex = CEX::PcexNew(20, 20))) return fFalse; // add the app as a handler (so it can catch menu commands) if (!vpcex->FAddCmh(vpappb, kcmhlAppb)) return fFalse; // do OS specific initialization if (!_FInitOS()) return fFalse; // Initialize the graphics stuff. if (!FInitGfx()) return fFalse; // set up the menus if (!_FInitMenu()) return fFalse; // initialize the screen gob if (!GOB::FInitScreen(grfgob, ginDef)) return fFalse; // initialize sound functionality if (!_FInitSound(kwav22M16)) return fFalse; // import any external clipboard vpclip->Import(); return fTrue; } /*************************************************************************** Initialize the sound manager. Default is to return true whether or not we could create the sound manager. ***************************************************************************/ bool APPB::_FInitSound(long wav) { AssertBaseThis(0); PSNDV psndv; if (pvNil != vpsndm) return fTrue; // create the Sound manager if (pvNil == (vpsndm = SNDM::PsndmNew())) return fTrue; if (pvNil != (psndv = SDAM::PsdamNew(wav))) { vpsndm->FAddDevice(kctgWave, psndv); ReleasePpo(&psndv); } // create the midi playback device - use the stream one if (pvNil != (psndv = MDPS::PmdpsNew())) { vpsndm->FAddDevice(kctgMidi, psndv); ReleasePpo(&psndv); } return fTrue; } /*************************************************************************** Standard menu initialization. Just loads menu number 128. ***************************************************************************/ bool APPB::_FInitMenu(void) { AssertThis(0); return MUB::PmubNew(128) != pvNil; } /*************************************************************************** Main program loop. ***************************************************************************/ void APPB::_Loop(void) { AssertThis(0); EVT evt; Assert(chNil == 0 && vkNil == 0, "nil key events wrong"); while (!_fQuit && (!_fEndModal || _cactModal <= 0)) { // do top of the loop stuff TopOfLoop(); // internal commands have priority if (vpcex->FDispatchNextCmd()) continue; // handle system events if (_FGetNextEvt(&evt)) _DispatchEvt(&evt); else { // nothing to do, so enqueue some idle commands vpcex->EnqueueCid(cidSelIdle, pvNil, pvNil, _fForeground); vpcex->EnqueueCid(cidIdle); } } } #ifdef WIN STDAPI_(int) DetectLeaks(BOOL fDebugOut, BOOL fMessageBox); #endif // WIN /*************************************************************************** Clean up routine for the app base class. ***************************************************************************/ void APPB::_CleanUp(void) { AssertThis(0); PSNDM psndm; if (pvNil != vpsndm) { // do this so if we pop into the debugger, or whatever while releasing // vpsndm, we don't deactivate the sound manager. psndm = vpsndm; vpsndm = pvNil; // deactivate the sndm to release all devices psndm->Activate(fFalse); ReleasePpo(&psndm); } #ifdef WIN #ifdef DEBUG // check for Audioman memory leaks DetectLeaks(fTrue, fFalse); #endif // DEBUG #endif // WIN GOB::ShutDown(); FIL::ShutDown(); #ifdef WIN _ShutDownViewer(); #endif // WIN } /*************************************************************************** Activate or deactivate the application. ***************************************************************************/ void APPB::_Activate(bool fActive) { AssertThis(0); if (pvNil != vpsndm) vpsndm->Activate(fActive); _fForeground = FPure(fActive); } /*************************************************************************** This gets called every time through the main app loop. ***************************************************************************/ void APPB::TopOfLoop(void) { AssertThis(0); #ifdef DEBUG if (_fRefresh) { // need to redraw all our windows - we ignored some paint // events while in an assert _fRefresh = fFalse; GTE gte; PGOB pgob; ulong grfgte; gte.Init(GOB::PgobScreen(), fgteNil); while (gte.FNextGob(&pgob, &grfgte, fgteNil)) { if ((grfgte & fgtePre) && pgob->Hwnd() != hNil) pgob->InvalRc(pvNil); } } #endif // DEBUG // update any marked stuff UpdateMarked(); // take down the wait cursor EndLongOp(fTrue); } /*************************************************************************** Update the given window. *prc is the bounding rectangle of the update region. ***************************************************************************/ void APPB::UpdateHwnd(HWND hwnd, RC *prc, ulong grfapp) { AssertThis(0); Assert(hNil != hwnd, "nil hwnd in UpdateHwnd"); AssertVarMem(prc); PGOB pgob; PGPT pgpt = pvNil; if (pvNil == (pgob = GOB::PgobFromHwnd(hwnd))) return; #ifdef DEBUG if (_fInAssert) { // don't do the update, just set _fRefresh so we'll invalidate // everything the next time thru the main loop. _fRefresh = fTrue; return; } #endif // DEBUG if ((grfapp & fappOffscreen) || (_fOffscreen && !(grfapp & fappOnscreen))) { // do offscreen drawing pgpt = _PgptEnsure(prc); } // NOTE: technically we should map from hwnd to local coordinates // but they are the same for an hwnd based gob. pgob->DrawTree(pgpt, pvNil, prc, fgobUseVis); if (pvNil != pgpt) { // put the image on the screen GNV gnv(pgob); GNV gnvSrc(pgpt); gnv.CopyPixels(&gnvSrc, prc, prc); } } /*************************************************************************** Map a handler id to a handler. ***************************************************************************/ PCMH APPB::PcmhFromHid(long hid) { AssertThis(0); PCMH pcmh; switch (hid) { case hidNil: return pvNil; case khidApp: return this; } if (pvNil != (pcmh = CLOK::PclokFromHid(hid))) return pcmh; return GOB::PgobFromHidScr(hid); } /*************************************************************************** The command handler is dying - take it out of any lists it's in. ***************************************************************************/ void APPB::BuryCmh(PCMH pcmh) { AssertThis(0); long imodcx; MODCX modcx; // NOTE: don't do an AssertPo(pcmh, 0)! Assert(pvNil != pcmh, 0); if (pvNil != vpcex) vpcex->BuryCmh(pcmh); if (pvNil != _pglmodcx && 0 < (imodcx = _pglmodcx->IvMac())) { while (imodcx-- > 0) { _pglmodcx->Get(imodcx, &modcx); AssertPo(modcx.pcex, 0); modcx.pcex->BuryCmh(pcmh); } } CLOK::BuryCmh(pcmh); if (pcmh == _pgobMouse) { _pgobMouse = pvNil; _TakeDownToolTip(); } } /*************************************************************************** Mark the rectangle for a fast update. The rectangle is given in pgobCoo coordinates. If prc is nil, the entire rectangle for pgobCoo is used. ***************************************************************************/ void APPB::MarkRc(RC *prc, PGOB pgobCoo) { AssertThis(0); AssertNilOrVarMem(prc); AssertPo(pgobCoo, 0); _MarkRegnRc(pvNil, prc, pgobCoo); } /*************************************************************************** Mark a region dirty. ***************************************************************************/ void APPB::MarkRegn(PREGN pregn, PGOB pgobCoo) { AssertThis(0); AssertNilOrPo(pregn, 0); AssertPo(pgobCoo, 0); _MarkRegnRc(pregn, pvNil, pgobCoo); } /*************************************************************************** Mark the rectangle for a fast update. The rectangle is given in pgobCoo coordinates. If prc is nil, the entire rectangle for pgobCoo is used. ***************************************************************************/ void APPB::_MarkRegnRc(PREGN pregn, RC *prc, PGOB pgobCoo) { AssertThis(0); AssertNilOrPo(pregn, 0); AssertNilOrVarMem(prc); AssertPo(pgobCoo, 0); MKRGN mkrgn; long imkrgn; RC rc; PT pt; HWND hwnd; // get the offset pgobCoo->GetRc(&rc, cooHwnd); pt = rc.PtTopLeft(); if (pvNil == prc) { if (pvNil == pregn) { // use the full rectangle for the GOB if (rc.FEmpty()) return; prc = &rc; } else if (pregn->FEmpty()) return; } else { // offset *prc to hwnd coordinates rc.OffsetCopy(prc, pt.xp, pt.yp); if (rc.FEmpty() && (pvNil == pregn || pregn->FEmpty())) return; prc = &rc; } // offset the region to hwnd coordinates if (pvNil != pregn) pregn->Offset(pt.xp, pt.yp); hwnd = pgobCoo->HwndContainer(); if (pvNil == _pglmkrgn) { if (pvNil == (_pglmkrgn = GL::PglNew(size(MKRGN)))) goto LFail; } else { for (imkrgn = _pglmkrgn->IvMac(); imkrgn-- > 0;) { _pglmkrgn->Get(imkrgn, &mkrgn); if (mkrgn.hwnd == hwnd) { // already something marked dirty, union in the new stuff if (pvNil != prc && !mkrgn.pregn->FUnionRc(prc)) goto LFail; if (pvNil != pregn && !mkrgn.pregn->FUnion(pregn)) goto LFail; goto LDone; } } } // create a new entry mkrgn.hwnd = hwnd; if (pvNil == (mkrgn.pregn = REGN::PregnNew(prc)) || pvNil != pregn && !mkrgn.pregn->FUnion(pregn) || !_pglmkrgn->FPush(&mkrgn)) { ReleasePpo(&mkrgn.pregn); LFail: Warn("marking failed"); pgobCoo->InvalRc(pvNil, kginSysInval); } LDone: // put the region back the way it was if (pvNil != pregn) pregn->Offset(-pt.xp, -pt.yp); } /*************************************************************************** Unmark the rectangle for a fast update. The rectangle is given in pgobCoo coordinates. If prc is nil, the entire rectangle for pgobCoo is used. ***************************************************************************/ void APPB::UnmarkRc(RC *prc, PGOB pgobCoo) { AssertThis(0); AssertNilOrVarMem(prc); AssertPo(pgobCoo, 0); _UnmarkRegnRc(pvNil, prc, pgobCoo); } /*************************************************************************** Mark a region clean. ***************************************************************************/ void APPB::UnmarkRegn(PREGN pregn, PGOB pgobCoo) { AssertThis(0); AssertNilOrPo(pregn, 0); AssertPo(pgobCoo, 0); _UnmarkRegnRc(pregn, pvNil, pgobCoo); } /*************************************************************************** Unmark the rectangle for a fast update. The rectangle is given in pgobCoo coordinates. If prc is nil, the entire rectangle for pgobCoo is used. ***************************************************************************/ void APPB::_UnmarkRegnRc(PREGN pregn, RC *prc, PGOB pgobCoo) { AssertNilOrPo(pregn, 0); AssertNilOrVarMem(prc); AssertPo(pgobCoo, 0); MKRGN mkrgn; long imkrgn; RC rc; PT pt; HWND hwnd; if (pvNil == _pglmkrgn || _pglmkrgn->IvMac() == 0) return; // get the mkrgn and imkrgn hwnd = pgobCoo->HwndContainer(); for (imkrgn = _pglmkrgn->IvMac();;) { if (imkrgn-- <= 0) return; _pglmkrgn->Get(imkrgn, &mkrgn); if (mkrgn.hwnd == hwnd) break; } // get the offset pgobCoo->GetRc(&rc, cooHwnd); pt = rc.PtTopLeft(); if (pvNil == prc) { if (pvNil == pregn) { // use the full rectangle for the GOB if (rc.FEmpty()) return; prc = &rc; } else if (pregn->FEmpty()) return; } else { // offset *prc to hwnd coordinates rc.OffsetCopy(prc, pt.xp, pt.yp); if (rc.FEmpty() && (pvNil == pregn || pregn->FEmpty())) return; prc = &rc; } if (pvNil != pregn) { pregn->Offset(pt.xp, pt.yp); mkrgn.pregn->FDiff(pregn); pregn->Offset(-pt.xp, -pt.yp); } if (pvNil != prc) mkrgn.pregn->FDiffRc(prc); if (mkrgn.pregn->FEmpty()) { ReleasePpo(&mkrgn.pregn); _pglmkrgn->Delete(imkrgn); } } /*************************************************************************** Get the bounding rectangle of any marked portion of the given hwnd. ***************************************************************************/ bool APPB::FGetMarkedRc(HWND hwnd, RC *prc) { AssertThis(0); Assert(hNil != hwnd, "bad hwnd"); AssertVarMem(prc); MKRGN mkrgn; long imkrgn; if (pvNil != _pglmkrgn) { // get the mkrgn and imkrgn for (imkrgn = _pglmkrgn->IvMac(); imkrgn-- > 0;) { _pglmkrgn->Get(imkrgn, &mkrgn); if (mkrgn.hwnd == hwnd) return !mkrgn.pregn->FEmpty(prc); } } prc->Zero(); return fFalse; } /*************************************************************************** If there is a marked region for this HWND, remove it from the list and invalidate it. This is called when we get a system paint/update event. ***************************************************************************/ void APPB::InvalMarked(HWND hwnd) { AssertThis(0); Assert(hNil != hwnd, "bad hwnd"); long imkrgn; MKRGN mkrgn; RC rc; RCS rcs; if (pvNil == _pglmkrgn) return; for (imkrgn = _pglmkrgn->IvMac(); imkrgn-- > 0;) { _pglmkrgn->Get(imkrgn, &mkrgn); if (mkrgn.hwnd == hwnd) { if (!mkrgn.pregn->FEmpty(&rc)) { rcs = RCS(rc); InvalHwndRcs(hwnd, &rcs); } ReleasePpo(&mkrgn.pregn); _pglmkrgn->Delete(imkrgn); } } } /*************************************************************************** Update all marked regions. ***************************************************************************/ void APPB::UpdateMarked(void) { AssertThis(0); MKRGN mkrgn; PGOB pgob; if (pvNil == _pglmkrgn) return; while (_pglmkrgn->FPop(&mkrgn)) { if (pvNil != (pgob = GOB::PgobFromHwnd(mkrgn.hwnd))) _FastUpdate(pgob, mkrgn.pregn); ReleasePpo(&mkrgn.pregn); } } /*************************************************************************** Do a fast update of the gob and its descendents into the given gpt. ***************************************************************************/ void APPB::_FastUpdate(PGOB pgob, PREGN pregnClip, ulong grfapp, PGPT pgpt) { AssertThis(0); AssertPo(pgob, 0); AssertPo(pregnClip, 0); AssertNilOrPo(pgpt, 0); RC rc, rcT; bool fOffscreen; if (pregnClip->FEmpty(&rc)) return; pgob->GetRc(&rcT, cooLocal); if (!rc.FIntersect(&rcT)) return; fOffscreen = (FPure(grfapp & fappOffscreen) || (_fOffscreen && !(grfapp & fappOnscreen))) && pvNil == pgpt && hNil != pgob->Hwnd() && pvNil != (pgpt = _PgptEnsure(&rc)); pgob->DrawTreeRgn(pgpt, pvNil, pregnClip, fgobUseVis); if (fOffscreen) { // copy the stuff to the screen GNV gnvOff(pgpt); GNV gnv(pgob); PGPT pgptDst = pgob->Pgpt(); pgptDst->ClipToRegn(&pregnClip); _CopyPixels(&gnvOff, &rc, &gnv, &rc); pgptDst->ClipToRegn(&pregnClip); GPT::Flush(); } } /*************************************************************************** Set the transition to apply the next time we do offscreen fast updating. gft is the transition type. The meaning of lwGft depends on the transition. dts is how long each phase of the transition should take. pglclr is the new palette (may be nil). acr is an intermediary color to transition to. If acr is clear, no intermediary transition is done. If pglclr is not nil, this AddRef's it and holds onto it until after the transition is done. ***************************************************************************/ void APPB::SetGft(long gft, long lwGft, ulong dts, PGL pglclr, ACR acr) { AssertThis(0); AssertNilOrPo(pglclr, 0); AssertPo(&acr, 0); _gft = gft; _lwGft = lwGft; _dtsGft = dts; ReleasePpo(&_pglclr); if (pvNil != pglclr) { _pglclr = pglclr; _pglclr->AddRef(); } _acr = acr; } /*************************************************************************** Copy pixels from an offscreen buffer (pgnvSrc, prcSrc) to the screen (pgnvDst, prcDst). This gives the app a chance to do any transition affects they want. ***************************************************************************/ void APPB::_CopyPixels(PGNV pgnvSrc, RC *prcSrc, PGNV pgnvDst, RC *prcDst) { AssertThis(0); AssertPo(pgnvSrc, 0); AssertVarMem(prcSrc); AssertPo(pgnvDst, 0); AssertVarMem(prcDst); switch (_gft) { default: pgnvDst->CopyPixels(pgnvSrc, prcSrc, prcDst); break; case kgftWipe: pgnvDst->Wipe(_lwGft, _acr, pgnvSrc, prcSrc, prcDst, _dtsGft, _pglclr); break; case kgftSlide: pgnvDst->Slide(_lwGft, _acr, pgnvSrc, prcSrc, prcDst, _dtsGft, _pglclr); break; case kgftDissolve: // high word of _lwGft is number for columns, low word is number of rows // of the dissolve grid. If one or both is zero, the dissolve is done // at the pixel level offscreen. pgnvDst->Dissolve(SwHigh(_lwGft), SwLow(_lwGft), _acr, pgnvSrc, prcSrc, prcDst, _dtsGft, _pglclr); break; case kgftFade: pgnvDst->Fade(_lwGft, _acr, pgnvSrc, prcSrc, prcDst, _dtsGft, _pglclr); break; case kgftIris: // top 15 bits are the xp value, next 15 bits are the (signed) yp value, // bottom 2 bits are the gfd. pgnvDst->Iris(_lwGft & 0x03, _lwGft >> 17, (_lwGft << 15) >> 17, _acr, pgnvSrc, prcSrc, prcDst, _dtsGft, _pglclr); break; } _gft = gftNil; ReleasePpo(&_pglclr); } /*************************************************************************** Get an offscreen GPT big enough to enclose the given rectangle. Should minimize reallocations. Doesn't increment a ref count. APPB maintains ownership of the GPT. ***************************************************************************/ PGPT APPB::_PgptEnsure(RC *prc) { AssertThis(0); AssertVarMem(prc); RC rc; if (prc->Dxp() > _dxpOff || prc->Dyp() > _dypOff) { ReleasePpo(&_pgptOff); rc.Set(0, 0, LwMax(prc->Dxp(), _dxpOff), LwMax(prc->Dyp(), _dypOff)); _pgptOff = GPT::PgptNewOffscreen(&rc, 8); if (pvNil != _pgptOff) { _dxpOff = rc.Dxp(); _dypOff = rc.Dyp(); } else _dxpOff = _dypOff = 0; } if (pvNil != _pgptOff) { PT pt = prc->PtTopLeft(); _pgptOff->SetPtBase(&pt); } return _pgptOff; } /*************************************************************************** See if the given property is in the property list. ***************************************************************************/ bool APPB::_FFindProp(long prid, PROP *pprop, long *piprop) { AssertThis(0); AssertNilOrVarMem(pprop); AssertNilOrVarMem(piprop); long ivMin, ivLim, iv; PROP prop; if (pvNil == _pglprop) { if (pvNil != piprop) *piprop = 0; TrashVar(pprop); return fFalse; } for (ivMin = 0, ivLim = _pglprop->IvMac(); ivMin < ivLim;) { iv = (ivMin + ivLim) / 2; _pglprop->Get(iv, &prop); if (prop.prid < prid) ivMin = iv + 1; else if (prop.prid > prid) ivLim = iv; else { if (pvNil != piprop) *piprop = iv; if (pvNil != pprop) *pprop = prop; return fTrue; } } if (pvNil != piprop) *piprop = ivMin; TrashVar(pprop); return fFalse; } /*************************************************************************** Set the given property in the property list. ***************************************************************************/ bool APPB::_FSetProp(long prid, long lw) { AssertThis(0); PROP prop; long iprop; if (_FFindProp(prid, &prop, &iprop)) { Assert(prop.prid == prid, 0); prop.lw = lw; _pglprop->Put(iprop, &prop); return fTrue; } if (pvNil == _pglprop) { Assert(iprop == 0, 0); if (pvNil == (_pglprop = GL::PglNew(size(PROP)))) return fFalse; } prop.prid = prid; prop.lw = lw; return _pglprop->FInsert(iprop, &prop); } /*************************************************************************** Set the indicated property, using the given parameter. ***************************************************************************/ bool APPB::FSetProp(long prid, long lw) { AssertThis(0); switch (prid) { case kpridFullScreen: if (FPure(_fFullScreen) == FPure(lw)) break; #ifdef WIN long lwT; // if we're already maximized, we have to restore and maximize // to force the system to use our new MINMAXINFO. // REVIEW shonk: full screen: is there a better way to do this? if (!FGetProp(kpridMaximized, &lwT)) return fFalse; if (lwT) { if (!FSetProp(kpridMaximized, fFalse)) return fFalse; _fFullScreen = FPure(lw); if (!FSetProp(kpridMaximized, fTrue)) { _fFullScreen = !lw; return fFalse; } } #else //! WIN // REVIEW shonk: Mac: implement #endif //! WIN _fFullScreen = FPure(lw); break; case kpridMaximized: #ifdef WIN if (FPure(IsZoomed(vwig.hwndApp)) == FPure(lw)) break; return FPure(ShowWindow(vwig.hwndApp, lw ? SW_SHOWMAXIMIZED : SW_SHOWNORMAL)); #else //! WIN // REVIEW shonk: Mac: implement return FPure(lw); #endif //! WIN case kpridToolTipDelay: lw = LwBound(lw, 0, LwMulDiv(klwMax, kdtimSecond, kdtsSecond)); _dtsToolTip = LwMulDiv(lw, kdtsSecond, kdtimSecond); ResetToolTip(); break; default: return _FSetProp(prid, lw); } return fTrue; } /*************************************************************************** Return the current value of the given property. ***************************************************************************/ bool APPB::FGetProp(long prid, long *plw) { AssertThis(0); AssertVarMem(plw); PROP prop; TrashVar(plw); switch (prid) { case kpridFullScreen: *plw = _fFullScreen; break; case kpridMaximized: #ifdef WIN *plw = FPure(IsZoomed(vwig.hwndApp)); #else //! WIN // REVIEW shonk: Mac: implement *plw = fTrue; #endif //! WIN break; case kpridToolTipDelay: *plw = LwMulDivAway(_dtsToolTip, kdtimSecond, kdtsSecond); break; default: if (!_FFindProp(prid, &prop)) return fFalse; *plw = prop.lw; break; } return fTrue; } /*************************************************************************** Import some data in the given clip format to a docb. If pv is nil (or cb is 0), just return whether we can import the format. Otherwise, actually create a document and set *ppdocb to point to it. To delay import, we create an empty document and set *pfDelay to true. If pfDelay is nil, importing cannot be delayed. If *ppdocb is not nil, import into *ppdocb if we can. ***************************************************************************/ bool APPB::FImportClip(long clfm, void *pv, long cb, PDOCB *ppdocb, bool *pfDelay) { AssertThis(0); AssertPvCb(pv, cb); AssertNilOrVarMem(ppdocb); AssertNilOrVarMem(pfDelay); long cpMac; switch (clfm) { default: return fFalse; // we can only import these types case kclfmText: break; } if (pvNil == pv || 0 == cb || pvNil == ppdocb) return fTrue; switch (clfm) { default: Bug("unknown clip format"); return fFalse; case kclfmText: AssertNilOrPo(*ppdocb, 0); if (pvNil == *ppdocb || !(*ppdocb)->FIs(kclsTXTB)) { ReleasePpo(ppdocb); if (pvNil == (*ppdocb = TXRD::PtxrdNew())) return fFalse; } // if we can delay and there is more than 1K of text, delay it if (pvNil != pfDelay) { if (cb > 0x0400) { *pfDelay = fTrue; return fTrue; } *pfDelay = fFalse; } ((PTXTB)(*ppdocb))->SuspendUndo(); cpMac = ((PTXTB)(*ppdocb))->CpMac(); ((PTXTB)(*ppdocb))->FReplaceRgch(pv, cb / size(achar), 0, cpMac - 1); ((PTXTB)(*ppdocb))->ResumeUndo(); return fTrue; } } /*************************************************************************** Push the current modal context and create a new one. This should be balanced with a call to PopModal (if successful). ***************************************************************************/ bool APPB::FPushModal(PCEX pcex) { AssertThis(0); MODCX modcx; PUSAC pusacNew = pvNil; if (pvNil == _pglmodcx && pvNil == (_pglmodcx = GL::PglNew(size(MODCX)))) { return fFalse; } modcx.cactLongOp = _cactLongOp; modcx.pcex = vpcex; modcx.pusac = vpusac; modcx.luScale = vpusac->LuScale(); if (!_pglmodcx->FPush(&modcx)) return fFalse; if (pcex != pvNil) pcex->AddRef(); if (pvNil == pcex && pvNil == (pcex = CEX::PcexNew(20, 20)) || !pcex->FAddCmh(vpappb, kcmhlAppb) || pvNil == (pusacNew = NewObj USAC)) { ReleasePpo(&pcex); AssertDo(_pglmodcx->FPop(), 0); return fFalse; } modcx.pcex->Suspend(); vpcex = pcex; pcex->Suspend(fFalse); _cactLongOp = 0; vpusac->Scale(0); vpusac = pusacNew; return fTrue; } /*************************************************************************** Go into a modal loop and don't return until _fQuit is set or a cidEndModal comes to the app. Normally should be bracketed by an FPushModal/PopModal pair. Returns false iff the modal terminated abnormally (eg, we're quitting). ***************************************************************************/ bool APPB::FModalLoop(long *plwRet) { AssertThis(0); AssertVarMem(plwRet); bool fRet; _fEndModal = fFalse; _cactModal++; _Loop(); _cactModal--; fRet = FPure(_fEndModal); _fEndModal = fFalse; *plwRet = _lwModal; AssertThis(0); return fRet; } /*************************************************************************** Cause the topmost modal loop to terminate (next time through) with the given return value. ***************************************************************************/ void APPB::EndModal(long lwRet) { AssertThis(0); _lwModal = lwRet; _fEndModal = fTrue; } /*************************************************************************** Pop the topmost modal context. ***************************************************************************/ void APPB::PopModal(void) { AssertThis(0); MODCX modcx; if (pvNil == _pglmodcx || !_pglmodcx->FPop(&modcx)) { Bug("Unbalanced call to PopModal"); return; } SwapVars(&vpcex, &modcx.pcex); SwapVars(&vpusac, &modcx.pusac); modcx.pcex->Suspend(); vpcex->Suspend(fFalse); vpusac->Scale(modcx.luScale); _cactLongOp = modcx.cactLongOp; ReleasePpo(&modcx.pcex); ReleasePpo(&modcx.pusac); } /*************************************************************************** End the topmost modal loop. ***************************************************************************/ bool APPB::FCmdEndModal(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); if (_cactModal <= 0) return fFalse; EndModal(pcmd->rglw[0]); return fTrue; } /*************************************************************************** Handle any bad modal commands. Default is to put the command in the next modal context's CEX. ***************************************************************************/ void APPB::BadModalCmd(PCMD pcmd) { AssertThis(0); AssertPo(pcmd, 0); long imodcx; MODCX modcx; if (pvNil == _pglmodcx || 0 >= (imodcx = _pglmodcx->IvMac())) { Bug("Don't know what to do with the modal command"); return; } _pglmodcx->Get(--imodcx, &modcx); if (pvNil != pcmd->pgg) pcmd->pgg->AddRef(); modcx.pcex->EnqueueCmd(pcmd); } /*************************************************************************** Ask the user if they want to save changes to the given doc. ***************************************************************************/ tribool APPB::TQuerySaveDoc(PDOCB pdocb, bool fForce) { AssertThis(0); STN stn; STN stnName; pdocb->GetName(&stnName); stn.FFormatSz(PszLit("Save changes to \"%s\" before closing?"), &stnName); return vpappb->TGiveAlertSz(stn.Psz(), fForce ? bkYesNo : bkYesNoCancel, cokQuestion); } /*************************************************************************** Return whether we should allow a screen saver to come up. Defaults to returning true. ***************************************************************************/ bool APPB::FAllowScreenSaver(void) { AssertThis(0); return fTrue; } #ifdef DEBUG /*************************************************************************** Assert the validity of a APPB. ***************************************************************************/ void APPB::AssertValid(ulong grf) { APPB_PAR::AssertValid(0); AssertNilOrPo(_pgptOff, 0); AssertNilOrPo(_pcurs, 0); AssertNilOrPo(_pcursWait, 0); AssertNilOrPo(_pglclr, 0); AssertNilOrPo(_pglprop, 0); AssertNilOrPo(_pglmkrgn, 0); AssertNilOrPo(_pglmodcx, 0); } /*************************************************************************** Registers memory for frame specific memory (command dispatcher, menu bar, screen gobs, etc). ***************************************************************************/ void APPB::MarkMem(void) { AssertThis(0); PGOB pgob; APPB_PAR::MarkMem(); MarkMemObj(vpcex); MarkMemObj(vpmubCur); MarkMemObj(&vntl); MarkMemObj(vpclip); MarkMemObj(vpsndm); MarkMemObj(_pgptOff); MarkMemObj(_pcurs); MarkMemObj(_pcursWait); MarkMemObj(_pglclr); MarkMemObj(_pglprop); if (pvNil != _pglmkrgn) { long imkrgn; MKRGN mkrgn; MarkMemObj(_pglmkrgn); for (imkrgn = _pglmkrgn->IvMac(); imkrgn-- > 0;) { _pglmkrgn->Get(imkrgn, &mkrgn); MarkMemObj(mkrgn.pregn); } } if (pvNil != _pglmodcx) { long imodcx; MODCX modcx; MarkMemObj(_pglmodcx); for (imodcx = _pglmodcx->IvMac(); imodcx-- > 0;) { _pglmodcx->Get(imodcx, &modcx); MarkMemObj(modcx.pcex); MarkMemObj(modcx.pusac); } } GPT::MarkStaticMem(); CLOK::MarkAllCloks(); if ((pgob = GOB::PgobScreen()) != pvNil) pgob->MarkGobTree(); } /*************************************************************************** Assert proc - just calls the app's AssertProc. ***************************************************************************/ bool FAssertProc(PSZS pszsFile, long lwLine, PSZS pszsMsg, void *pv, long cb) { if (vpappb == pvNil) return fTrue; return vpappb->FAssertProcApp(pszsFile, lwLine, pszsMsg, pv, cb); } /*************************************************************************** Warning reporting proc. ***************************************************************************/ void WarnProc(PSZS pszsFile, long lwLine, PSZS pszsMsg) { if (vpappb == pvNil) Debugger(); else vpappb->WarnProcApp(pszsFile, lwLine, pszsMsg); } static MUTX _mutxWarn; /*************************************************************************** Default framework warning proc. ***************************************************************************/ void APPB::WarnProcApp(PSZS pszsFile, long lwLine, PSZS pszsMsg) { static PFIL _pfilWarn; static bool _fInWarn; static FP _fpCur; STN stn; STN stnFile; STN stnMsg; if (_fInWarn) return; _mutxWarn.Enter(); _fInWarn = fTrue; if (pvNil == _pfilWarn) { FNI fni; FTG ftg; // put the warning file at the root of the drive that temp files go on if (!fni.FGetTemp() || !fni.FSetLeaf(pvNil, kftgDir)) goto LDone; while (fni.FUpDir(pvNil, ffniMoveToDir)) ; stn = PszLit("_Frame_W"); if (!fni.FSetLeaf(&stn, kftgText)) goto LDone; ftg = FIL::vftgCreator; FIL::vftgCreator = 'ttxt'; _pfilWarn = FIL::PfilCreate(&fni); FIL::vftgCreator = ftg; if (pvNil == _pfilWarn) goto LDone; } stnFile.SetSzs(pszsFile); stnMsg.SetSzs(pszsMsg); stn.FFormatSz(PszLit("%s(%d): %s\xD") Win(PszLit("\xA")), &stnFile, lwLine, &stnMsg); Win(OutputDebugString(stn.Psz());) _pfilWarn->FWriteRgbSeq(stn.Prgch(), stn.Cch(), &_fpCur); LDone: _fInWarn = fFalse; _mutxWarn.Leave(); } #endif // DEBUG ================================================ FILE: kauai/src/appb.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation The base application class. Most apps will need to subclass this. ***************************************************************************/ #ifndef APPB_H #define APPB_H /*************************************************************************** Misc types ***************************************************************************/ #ifdef WIN typedef MSG EVT; #endif // WIN #ifdef MAC typedef EventRecord EVT; #endif // WIN typedef EVT *PEVT; #ifdef WIN // windows specific globals struct WIG { HINSTANCE hinst; HINSTANCE hinstPrev; LPTSTR pszCmdLine; int wShow; HWND hwndApp; HDC hdcApp; HWND hwndClient; // MDI client window HACCEL haccel; // main accelerator table HWND hwndNextViewer; // next clipboard viewer long lwThreadMain; // main thread }; extern WIG vwig; #endif // WIN /*************************************************************************** The base application class. ***************************************************************************/ const long kcmhlAppb = klwMax; // appb goes at the end of the cmh list enum { fappNil = 0x0, fappOffscreen = 0x1, fappOnscreen = 0x2, }; typedef class APPB *PAPPB; #define APPB_PAR CMH #define kclsAPPB 'APPB' class APPB : public APPB_PAR { RTCLASS_DEC ASSERT MARKMEM CMD_MAP_DEC(APPB) protected: // marked region - for fast updating struct MKRGN { HWND hwnd; PREGN pregn; }; // map from a property id to its value struct PROP { long prid; long lw; }; // modal context struct MODCX { long cactLongOp; PCEX pcex; PUSAC pusac; ulong luScale; }; #ifdef DEBUG bool _fCheckForLostMem : 1; // whether to check for lost mem at idle bool _fInAssert : 1; // whether we're in an assert bool _fRefresh : 1; // whether to refresh the entire display #endif // DEBUG bool _fQuit : 1; // whether we're in the process of quitting bool _fOffscreen : 1; // whether to do offscreen updates by default bool _fFullScreen : 1; // when maximized, we hide the caption, etc bool _fToolTip : 1; // whether we're in tool-tip mode bool _fForeground : 1; // whether we're the foreground app bool _fEndModal : 1; // set to end the topmost modal loop PGL _pglmkrgn; // list of marked regions for fast updating long _onnDefFixed; // default fixed pitch font long _onnDefVariable; // default variable pitched font PGPT _pgptOff; // cached offscreen GPT for offscreen updates long _dxpOff; // size of the offscreen GPT long _dypOff; long _xpMouse; // location of mouse on last reported mouse move long _ypMouse; PGOB _pgobMouse; // gob mouse was last over ulong _grfcustMouse; // cursor state on last mouse move // for determining the multiplicity of a click long _tsMouse; // time of last mouse click long _cactMouse; // multiplicity of last mouse click // for tool tips ulong _tsMouseEnter; // when the mouse entered _pgobMouse ulong _dtsToolTip; // time lag for tool tip PGOB _pgobToolTipTarget; // if there is a tool tip up, it's for this gob PCURS _pcurs; // current cursor PCURS _pcursWait; // cursor to use for long operations long _cactLongOp; // long operation count ulong _grfcust; // current cursor state long _gft; // transition to apply during next fast update long _lwGft; // parameter for transition ulong _dtsGft; // how much time to give the transition PGL _pglclr; // palette to transition to ACR _acr; // intermediate color to transition to PGL _pglprop; // the properties PGL _pglmodcx; // The modal context stack long _lwModal; // Return value from modal loop long _cactModal; // how deep we are in application loops // initialization, running and clean up virtual bool _FInit(ulong grfapp, ulong grfgob, long ginDef); #ifdef DEBUG virtual bool _FInitDebug(void); #endif // DEBUG virtual bool _FInitOS(void); virtual bool _FInitMenu(void); virtual void _Loop(void); virtual void _CleanUp(void); virtual bool _FInitSound(long wav); // event fetching and dispatching virtual bool _FGetNextEvt(PEVT pevt); virtual void _DispatchEvt(PEVT pevt); virtual bool _FTranslateKeyEvt(EVT *pevt, PCMD_KEY pcmd); #ifdef MAC // event handlers virtual void _MouseDownEvt(EVT *pevt); virtual void _MouseUpEvt(EVT *pevt); virtual void _UpdateEvt(EVT *pevt); virtual void _ActivateEvt(EVT *pevt); virtual void _DiskEvt(EVT *pevt); virtual void _ActivateApp(EVT *pevt); virtual void _DeactivateApp(EVT *pevt); virtual void _MouseMovedEvt(EVT *pevt); #endif // fast updating virtual void _FastUpdate(PGOB pgob, PREGN pregnClip, ulong grfapp = fappNil, PGPT pgpt = pvNil); virtual void _CopyPixels(PGNV pgvnSrc, RC *prcSrc, PGNV pgnvDst, RC *prcDst); void _MarkRegnRc(PREGN pregn, RC *prc, PGOB pgobCoo); void _UnmarkRegnRc(PREGN pregn, RC *prc, PGOB pgobCoo); // to borrow the common offscreen GPT virtual PGPT _PgptEnsure(RC *prc); // property list management bool _FFindProp(long prid, PROP *pprop, long *piprop = pvNil); bool _FSetProp(long prid, long lw); // tool tip support void _TakeDownToolTip(void); void _EnsureToolTip(void); // window procs #ifdef WIN static LRESULT CALLBACK _LuWndProc(HWND hwnd, uint wm, WPARAM wParam, LPARAM lParam); static LRESULT CALLBACK _LuMdiWndProc(HWND hwnd, uint wm, WPARAM wParam, LPARAM lParam); virtual bool _FFrameWndProc(HWND hwnd, uint wm, WPARAM wParam, LPARAM lw, long *plwRet); virtual bool _FMdiWndProc(HWND hwnd, uint wm, WPARAM wParam, LPARAM lw, long *plwRet); virtual bool _FCommonWndProc(HWND hwnd, uint wm, WPARAM wParam, LPARAM lw, long *plwRet); // remove ourself from the clipboard viewer chain void _ShutDownViewer(void); #endif // WIN // Activation virtual void _Activate(bool fActive); public: APPB(void); ~APPB(void); #ifdef MAC // setting up the heap static void _SetupHeap(long cbExtraStack, long cactMoreMasters); virtual void SetupHeap(void); #elif defined(WIN) static void CreateConsole(); #endif bool FQuitting(void) { return _fQuit; } bool FForeground(void) { return _fForeground; } // initialization, running and quitting virtual void Run(ulong grfapp, ulong grfgob, long ginDef); virtual void Quit(bool fForce); virtual void Abort(void); virtual void TopOfLoop(void); // look for the next key event in the system event queue virtual bool FGetNextKeyFromOsQueue(PCMD_KEY pcmd); // Look for mouse events and get the mouse location // GrfcustCur() is synchronized with this void TrackMouse(PGOB pgob, PT *ppt); // app name virtual void GetStnAppName(PSTN pstn); // command handler stuff virtual void BuryCmh(PCMH pcmh); virtual PCMH PcmhFromHid(long hid); // drawing virtual void UpdateHwnd(HWND hwnd, RC *prc, ulong grfapp = fappNil); virtual void MarkRc(RC *prc, PGOB pgobCoo); virtual void MarkRegn(PREGN pregn, PGOB pgobCoo); virtual void UnmarkRc(RC *prc, PGOB pgobCoo); virtual void UnmarkRegn(PREGN pregn, PGOB pgobCoo); virtual bool FGetMarkedRc(HWND hwnd, RC *prc); virtual void UpdateMarked(void); virtual void InvalMarked(HWND hwnd); virtual void SetGft(long gft, long lwGft, ulong dts = kdtsSecond, PGL pglclr = pvNil, ACR acr = kacrClear); // default fonts virtual long OnnDefVariable(void); virtual long OnnDefFixed(void); virtual long DypTextDef(void); // basic alert handling virtual tribool TGiveAlertSz(PSZ psz, long bk, long cok); // common commands virtual bool FCmdQuit(PCMD pcmd); virtual bool FCmdShowClipboard(PCMD pcmd); virtual bool FEnableAppCmd(PCMD pcmd, ulong *pgrfeds); virtual bool FCmdIdle(PCMD pcmd); virtual bool FCmdChooseWnd(PCMD pcmd); #ifdef MAC virtual bool FCmdOpenDA(PCMD pcmd); #endif // MAC #ifdef DEBUG virtual bool FAssertProcApp(PSZS pszsFile, long lwLine, PSZS pszsMsg, void *pv, long cb); virtual void WarnProcApp(PSZS pszsFile, long lwLine, PSZS pszsMsg); #endif // DEBUG // cursor stuff virtual void SetCurs(PCURS pcurs, bool fLongOp = fFalse); virtual void SetCursCno(PRCA prca, CNO cno, bool fLongOp = fFalse); virtual void RefreshCurs(void); virtual ulong GrfcustCur(bool fAsynch = fFalse); virtual void ModifyGrfcust(ulong grfcustOr, ulong grfcustXor); virtual void HideCurs(void); virtual void ShowCurs(void); virtual void PositionCurs(long xpScreen, long ypScreen); virtual void BeginLongOp(void); virtual void EndLongOp(bool fAll = fFalse); // setting and fetching properties virtual bool FSetProp(long prid, long lw); virtual bool FGetProp(long prid, long *plw); // clipboard importing - normally only called by the clipboard object virtual bool FImportClip(long clfm, void *pv = pvNil, long cb = 0, PDOCB *ppdocb = pvNil, bool *pfDelay = pvNil); // reset tooltip tracking. virtual void ResetToolTip(void); // modal loop support virtual bool FPushModal(PCEX pcex = pvNil); virtual bool FModalLoop(long *plwRet); virtual void EndModal(long lwRet); virtual void PopModal(void); virtual bool FCmdEndModal(PCMD pcmd); long CactModal(void) { return _cactModal; } virtual void BadModalCmd(PCMD pcmd); // Query save changes for a document virtual tribool TQuerySaveDoc(PDOCB pdocb, bool fForce); // flush user generated events from the system event queue. virtual void FlushUserEvents(ulong grfevt = kgrfevtAll); // whether to allow a screen saver to come up virtual bool FAllowScreenSaver(void); }; extern PAPPB vpappb; extern PCEX vpcex; extern PSNDM vpsndm; // main entry point for the client app void FrameMain(void); // alert button kinds enum { bkOk, bkOkCancel, bkYesNo, bkYesNoCancel, }; // alert icon kinds enum { cokNil, cokInformation, // general info to/from the user cokQuestion, // ask the user something cokExclamation, // warn the user and/or ask something cokStop, // inform the user that we can't do that }; #endif //! APPB_H ================================================ FILE: kauai/src/appbmac.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Mac specific base application class methods. ***************************************************************************/ #include "frame.h" ASSERTNAME ulong _GrfcustFromEvt(PEVT pevt); // by default grow the stack by 8K and call MoreMasters 10 times const long _cbExtraStackDef = 0x2000L; const long _cactMoreMastersDef = 10; /*************************************************************************** main for the entire frame work app. Does system initialization and calls FrameMain. ***************************************************************************/ void __cdecl main(void) { // Grow the stack and expand the heap. This MUST be done first! if (pvNil == vpappb) APPB::_SetupHeap(_cbExtraStackDef, _cactMoreMastersDef); else vpappb->SetupHeap(); InitGraf(&qd.thePort); InitFonts(); FlushEvents(everyEvent, 0); InitWindows(); InitMenus(); TEInit(); InitDialogs(pvNil); InitCursor(); // Go to the app's main entry point. FrameMain(); } /*************************************************************************** Static method to increase the stack size by cbExtraStack and call MoreMasters the specified number of times. ***************************************************************************/ void APPB::_SetupHeap(long cbExtraStack, long cactMoreMasters) { // This is called before any Mac OS stuff is initialized, so // don't assert on anything. static _fCalled = fFalse; if (_fCalled) { Debug(Debugger();) return; } _fCalled = fTrue; if (cbExtraStack > 0) { // limit the increase to 100K SetApplLimit(PvSubBv(GetApplLimit(), LwMin(cbExtraStack, 102400L))); } MaxApplZone(); while (cactMoreMasters-- > 0) MoreMasters(); } /*************************************************************************** Method to set up the heap. ***************************************************************************/ void APPB::SetupHeap(void) { // This is called before any Mac OS stuff is initialized, so // don't assert on anything. // add 8K to the stack and call MoreMasters 10 times. _SetupHeap(_cbExtraStackDef, _cactMoreMastersDef); } /*************************************************************************** Shutdown immediately. ***************************************************************************/ void APPB::Abort(void) { ExitToShell(); } /*************************************************************************** Do OS specific initialization. ***************************************************************************/ bool APPB::_FInitOS(void) { AssertThis(0); // we already initialized everything return fTrue; } /*************************************************************************** Open a desk accessory. ***************************************************************************/ bool APPB::FCmdOpenDA(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); PRT *pprt; schar rgchs[256]; long cchs; if (pcmd->pgg != pvNil && pcmd->pgg->IvMac() == 1 && (cchs = pcmd->pgg->Cb(0)) < size(rgchs)) { pcmd->pgg->Get(0, rgchs + 1); st[0] = (schar)cchs; GetPort(&pprt); OpenDeskAcc((byte *)rgchs); SetPort(pprt); } pcmd->cid = cidNil; // don't record this command return fTrue; } /*************************************************************************** Get the next event from the OS. ***************************************************************************/ bool APPB::_FGetNextEvt(EVT *pevt) { AssertThis(0); AssertVarMem(pevt); if (!WaitNextEvent(everyEvent, pevt, 0, hNil)) pevt->what = nullEvent; _grfcust &= ~kgrfcustUser; _grfcust |= _GrfcustFromEvt(pevt); return pevt->what != nullEvent; } /*************************************************************************** The given GOB is tracking the mouse. See if there are any relevant mouse events in the system event queue. Fill in *ppt with the location of the mouse relative to pgob. Also ensure that GrfcustCur() will return the correct mouse state. ***************************************************************************/ void APPB::TrackMouse(PGOB pgob, PT *ppt) { AssertThis(0); AssertPo(pgob, 0); AssertVarMem(ppt); EVT evt; while (EventAvail(everyEvent, &evt)) { if (!GetNextEvent(everyEvent, &evt)) break; _grfcust &= ~kgrfcustUser; _grfcust |= _GrfcustFromEvt(&evt); switch (evt.what) { case mouseDown: _grfcust |= fcustMouse; goto LDone; case mouseUp: _grfcust &= ~fcustMouse; goto LDone; case keyDown: case autoKey: break; case updateEvt: _UpdateEvt(&evt); break; case activateEvt: _ActivateEvt(&evt); break; case diskEvt: break; case osEvt: if ((evt.message & 0xFF000000) == 0xFA000000) { // mouse move goto LDone; } if (evt.message & 0x01000000) { // suspend or resume Bug("How can this happen?"); if (evt.message & 0x00000001) _ActivateApp(&evt); else _DeactivateApp(&evt); } break; } } LDone: ppt->xp = evt.where.h; ppt->yp = evt.where.v; pgob->MapPt(ppt, cooGlobal, cooLocal); } /*************************************************************************** Dispatch the OS level event to a translator. ***************************************************************************/ void APPB::_DispatchEvt(EVT *pevt) { AssertThis(0); AssertVarMem(pevt); CMD cmd; switch (pevt->what) { case mouseDown: _MouseDownEvt(pevt); break; case mouseUp: _MouseUpEvt(pevt); break; case keyDown: case autoKey: if (_FTranslateKeyEvt(pevt, (PCMD_KEY)&cmd)) vpcex->EnqueueCmd(&cmd); break; case updateEvt: _UpdateEvt(pevt); break; case activateEvt: _ActivateEvt(pevt); break; case diskEvt: _DiskEvt(pevt); break; case osEvt: if (pevt->message & 0x01000000) { // suspend or resume if (pevt->message & 0x00000001) _ActivateApp(pevt); else _DeactivateApp(pevt); } else if ((pevt->message & 0xFF000000) == 0xFA000000) _MouseMovedEvt(pevt); break; } } /*************************************************************************** Dispatch an OS level mouse down event. ***************************************************************************/ void APPB::_MouseDownEvt(EVT *pevt) { AssertThis(0); AssertVarMem(pevt); short in; HWND hwnd; PGOB pgob; in = FindWindow(pevt->where, (WindowPtr *)&hwnd); switch (in) { case inMenuBar: if (pvNil != vpmubCur) vpmubCur->FDoClick(pevt); break; case inDrag: RCS rcs = qd.screenBits.bounds; InsetRect(&rcs, 4, 4); DragWindow(&hwnd->port, pevt->where, &rcs); break; case inGoAway: if (TrackGoAway(&hwnd->port, pevt->where) && (pgob = GOB::PgobFromHwnd(hwnd)) != pvNil) { vpcex->EnqueueCid(cidCloseWnd, pgob); } break; case inGrow: if ((pgob = GOB::PgobFromHwnd(hwnd)) != pvNil) pgob->TrackGrow(pevt); break; case inContent: if (hwnd != (HWND)FrontWindow()) SelectWindow(&hwnd->port); else if ((pgob = GOB::PgobFromHwnd(hwnd)) != pvNil) { PPRT pprt; PT pt; PTS pts = pevt->where; GetPort(&pprt); SetPort(&hwnd->port); GlobalToLocal(&pts); SetPort(pprt); if ((pgob = pgob->PgobFromPt(pts.h, pts.v, &pt)) != pvNil) { if (_pgobMouse == pgob && FIn(pevt->when - _tsMouse, 0, GetDblTime())) { _cactMouse++; } else _cactMouse = 1; _tsMouse = pevt->when; if (_pgobMouse != pgob && pvNil != _pgobMouse) { AssertPo(_pgobMouse, 0); vpcex->EnqueueCid(cidRollOff, _pgobMouse); } _pgobMouse = pgob; _xpMouse = klwMax; pgob->MouseDown(pt.xp, pt.yp, _cactMouse, GrfcustCur()); } else _pgobMouse = pvNil; } break; case inSysWindow: case inZoomIn: case inZoomOut: break; } } /*************************************************************************** Dispatch an OS level mouse up event. ***************************************************************************/ void APPB::_MouseUpEvt(EVT *pevt) { // Ignore mouse up events } /*************************************************************************** Translate an OS level key down event to a CMD. This returns false if the key maps to a menu item. //REVIEW shonk: resolve (ch, vk) differences between Mac and Win ***************************************************************************/ bool APPB::_FTranslateKeyEvt(EVT *pevt, PCMD_KEY pcmd) { AssertThis(0); AssertVarMem(pevt); AssertVarMem(pcmd); ClearPb(pcmd, size(*pcmd)); pcmd->cid = cidKey; pcmd->grfcust = GrfcustCur(); if ((pcmd->grfcust & fcustCmd) && vpmubCur != pvNil && vpmubCur->FDoKey(pevt)) { TrashVar(pcmd); return fFalse; } pcmd->ch = B0Lw(pevt->message); pcmd->vk = pcmd->ch; pcmd->cact = 1; return fTrue; } /*************************************************************************** Look at the next system event and if it's a key, fill in the *pcmd with the relevant info. ***************************************************************************/ bool APPB::FGetNextKeyFromOsQueue(PCMD_KEY pcmd) { AssertThis(0); AssertVarMem(pcmd); EVT evt; if (!EventAvail(everyEvent, &evt)) goto LFail; if (evt.what != keyDown && evt.what != autoKey) goto LFail; if (!GetNextEvent(keyDownMask | autoKeyMask, &evt)) { LFail: TrashVar(pcmd); return fFalse; } _grfcust &= ~kgrfcustUser; _grfcust |= _GrfcustFromEvt(&evt); return _FTranslateKeyEvt(&evt, pcmd); } /*************************************************************************** Returns the grfcust for the given event. ***************************************************************************/ ulong _GrfcustFromEvt(PEVT pevt) { AssertThis(0); AssertVarMem(pevt); ulong grfcust = 0; if (pevt->modifiers & (cmdKey | controlKey)) grfcust |= fcustCmd; if (pevt->modifiers & shiftKey) grfcust |= fcustShift; if (pevt->modifiers & optionKey) grfcust |= fcustOption; if (!(pevt->modifiers & btnState)) grfcust |= fcustMouse; return grfcust; } /*************************************************************************** Dispatch an OS level update event. ***************************************************************************/ void APPB::_UpdateEvt(EVT *pevt) { AssertThis(0); AssertVarMem(pevt); PPRT pprt, pprtSav; RCS rcs; RC rc; pprt = (PPRT)pevt->message; InvalMarked((HWND)pprt); rcs = (*((HWND)pprt)->updateRgn)->rgnBBox; GetPort(&pprtSav); SetPort(pprt); GlobalToLocal((PTS *)&rcs); GlobalToLocal((PTS *)&rcs + 1); rc = rcs; BeginUpdate(pprt); UpdateHwnd((HWND)pprt, &rc); EndUpdate(pprt); SetPort(pprtSav); } /*************************************************************************** Dispatch an OS level activate event. ***************************************************************************/ void APPB::_ActivateEvt(EVT *pevt) { AssertThis(0); AssertVarMem(pevt); // Tell the gob code that an hwnd is being activated or deactivated GOB::ActivateHwnd((HWND)pevt->message, pevt->modifiers & 1); } /*************************************************************************** Handle an OS level disk event. ***************************************************************************/ void APPB::_DiskEvt(EVT *pevt) { AssertThis(0); AssertVarMem(pevt); } /*************************************************************************** Handle activation of the app. ***************************************************************************/ void APPB::_ActivateApp(EVT *pevt) { AssertThis(0); AssertVarMem(pevt); _Activate(fTrue); } /*************************************************************************** Handle deactivation of the app. ***************************************************************************/ void APPB::_DeactivateApp(EVT *pevt) { AssertThis(0); AssertVarMem(pevt); _Activate(fFalse); } /*************************************************************************** Handle an OS level mouse moved event. ***************************************************************************/ void APPB::_MouseMovedEvt(EVT *pevt) { AssertThis(0); AssertVarMem(pevt); } /**************************************** Standard alert resources ****************************************/ enum { kridOkAlert = 128, kridOkCancelAlert, kridYesNoAlert, kridYesNoCancelAlert }; /*************************************************************************** Put an alert up. Return which button was hit. Returns tYes for yes or ok; tNo for no; tMaybe for cancel. ***************************************************************************/ bool APPB::TGiveAlertSz(PSZ psz, long bk, long cok) { AssertThis(0); AssertSz(psz); short rid, bid; STN stn; stn = psz; switch (bk) { default: BugVar("bad bk value", &bk); // fall through case bkOk: rid = kridOkAlert; break; case bkOkCancel: rid = kridOkCancelAlert; break; case bkYesNo: rid = kridYesNoAlert; break; case bkYesNoCancel: rid = kridYesNoCancelAlert; break; } ParamText(stn.Pst(), (uchar *)"", (uchar *)"", (uchar *)""); switch (cok) { default: BugVar("bad cok value", &cok); Debug(ParamText(stn.Pst(), (uchar *)"", (uchar *)"", (uchar *)"");) // fall through case cokNil : bid = Alert(rid, pvNil); break; case cokInformation: bid = NoteAlert(rid, pvNil); break; case cokQuestion: case cokExclamation: bid = CautionAlert(rid, pvNil); break; case cokStop: bid = StopAlert(rid, pvNil); break; } switch (bid) { default: case 1: return tYes; case 2: return tNo; case 3: return tMaybe; } } #ifdef DEBUG const short kridAssert = 32000; const short kbidDebugger = 1; const short kbidIgnore = 2; const short kbidQuit = 3; /*************************************************************************** Debug initialization. ***************************************************************************/ bool APPB::_FInitDebug(void) { return fTrue; } /*************************************************************************** Assert proc. REVIEW shonk: Mac FAssertProcApp: flesh out and fix for unicode. ***************************************************************************/ bool APPB::FAssertProcApp(PSZ pszFile, long lwLine, PSZ pszMsg, void *pv, long cb) { short bid; achar stLine[kcbMaxSt]; achar stFile[kcbMaxSt]; achar stMessage[kcbMaxSt]; if (_fInAssert) return fFalse; _fInAssert = fTrue; if (pszMsg != pvNil) CopySzSt(pszMsg, stMessage); else SetStCch(stMessage, 0); if (pvNil != pszFile) CopySzSt(pszFile, stFile); else CopySzSt("Some Header file", stFile); NumToString(lwLine, (byte *)stLine); ParamText((byte *)stLine, (byte *)stFile, (byte *)stMessage, (byte *)"\p"); bid = Alert(kridAssert, pvNil); _fInAssert = fFalse; switch (bid) { case kbidDebugger: return 1; case kbidIgnore: break; case kbidQuit: ExitToShell(); default: break; } return 0; } #endif ================================================ FILE: kauai/src/appbwin.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Windows base application class. ***************************************************************************/ #include #include "frame.h" #include "fcntl.h" #include "stdio.h" #include "io.h" ASSERTNAME WIG vwig; /*************************************************************************** WinMain for any frame work app. Sets up vwig and calls FrameMain. ***************************************************************************/ int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR pszs, int wShow) { vwig.hinst = hinst; vwig.hinstPrev = hinstPrev; vwig.pszCmdLine = GetCommandLine(); vwig.wShow = wShow; vwig.lwThreadMain = LwThreadCur(); #ifdef DEBUG APPB::CreateConsole(); #endif FrameMain(); return 0; } /* * Create debug console window and wire up std streams */ void APPB::CreateConsole() { if (!AllocConsole()) { return; } FILE *fDummy; freopen_s(&fDummy, "CONOUT$", "w", stdout); freopen_s(&fDummy, "CONOUT$", "w", stderr); freopen_s(&fDummy, "CONIN$", "r", stdin); std::cout.clear(); std::clog.clear(); std::cerr.clear(); std::cin.clear(); } /*************************************************************************** Shutdown immediately. ***************************************************************************/ void APPB::Abort(void) { _ShutDownViewer(); FatalAppExit(0, PszLit("Fatal Error Termination")); } /*************************************************************************** Do OS specific initialization. ***************************************************************************/ bool APPB::_FInitOS(void) { AssertThis(0); STN stnApp; PSZ pszAppWndCls = PszLit("APP"); // get the app name GetStnAppName(&stnApp); // register the window classes if (vwig.hinstPrev == hNil) { WNDCLASS wcs; wcs.style = CS_BYTEALIGNCLIENT | CS_OWNDC; wcs.lpfnWndProc = _LuWndProc; wcs.cbClsExtra = 0; wcs.cbWndExtra = 0; wcs.hInstance = vwig.hinst; wcs.hIcon = LoadIcon(NULL, IDI_APPLICATION); wcs.hCursor = LoadCursor(NULL, IDC_ARROW); wcs.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wcs.lpszMenuName = 0; wcs.lpszClassName = pszAppWndCls; if (!RegisterClass(&wcs)) return fFalse; wcs.lpfnWndProc = _LuMdiWndProc; wcs.lpszClassName = PszLit("MDI"); if (!RegisterClass(&wcs)) return fFalse; } if ((vwig.hwndApp = CreateWindow(pszAppWndCls, stnApp.Psz(), WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hNil, hNil, vwig.hinst, pvNil)) == hNil) { return fFalse; } if (hNil == (vwig.hdcApp = GetDC(vwig.hwndApp))) return fFalse; // set a timer, so we can idle regularly. if (SetTimer(vwig.hwndApp, 0, 1, pvNil) == 0) return fFalse; vwig.haccel = LoadAccelerators(vwig.hinst, MIR(acidMain)); ShowWindow(vwig.hwndApp, vwig.wShow); return fTrue; } /*************************************************************************** Get the next event from the OS event queue. Return true iff it's a real event (not just an idle type event). ***************************************************************************/ bool APPB::_FGetNextEvt(PEVT pevt) { AssertThis(0); AssertVarMem(pevt); GetMessage(pevt, hNil, 0, 0); switch (pevt->message) { case WM_TIMER: return fFalse; case WM_MOUSEMOVE: // dispatch these so real Windows controls can receive them, // but return false so we can do our idle stuff - including // our own mouse moved stuff. _DispatchEvt(pevt); return fFalse; } return fTrue; } /*************************************************************************** The given GOB is tracking the mouse. See if there are any relevant mouse events in the system event queue. Fill in *ppt with the location of the mouse relative to pgob. Also ensure that GrfcustCur() will return the correct mouse state. ***************************************************************************/ void APPB::TrackMouse(PGOB pgob, PT *ppt) { AssertThis(0); AssertPo(pgob, 0); AssertVarMem(ppt); EVT evt; PTS pts; for (;;) { if (!PeekMessage(&evt, hNil, 0, 0, PM_REMOVE | PM_NOYIELD)) { GetCursorPos(&pts); break; } if (FIn(evt.message, WM_MOUSEFIRST, WM_MOUSELAST + 1)) { pts = evt.pt; break; } // toss key events if (!FIn(evt.message, WM_KEYFIRST, WM_KEYLAST + 1)) { TranslateMessage(&evt); DispatchMessage(&evt); } } ppt->xp = pts.x; ppt->yp = pts.y; pgob->MapPt(ppt, cooGlobal, cooLocal); } /*************************************************************************** Dispatch an OS level event to someone that knows what to do with it. ***************************************************************************/ void APPB::_DispatchEvt(PEVT pevt) { AssertThis(0); AssertVarMem(pevt); CMD cmd; if (hNil != vwig.hwndClient && TranslateMDISysAccel(vwig.hwndClient, pevt) || hNil != vwig.haccel && TranslateAccelerator(vwig.hwndApp, vwig.haccel, pevt)) { return; } switch (pevt->message) { case WM_KEYDOWN: case WM_CHAR: if (_FTranslateKeyEvt(pevt, (PCMD_KEY)&cmd) && pvNil != vpcex) vpcex->EnqueueCmd(&cmd); ResetToolTip(); break; case WM_KEYUP: case WM_DEADCHAR: case WM_SYSKEYDOWN: case WM_SYSKEYUP: case WM_SYSCHAR: case WM_SYSDEADCHAR: ResetToolTip(); // fall thru default: TranslateMessage(pevt); DispatchMessage(pevt); break; } } /*************************************************************************** Translate an OS level key down event to a CMD. This returns false if the key maps to a menu item. ***************************************************************************/ bool APPB::_FTranslateKeyEvt(PEVT pevt, PCMD_KEY pcmd) { AssertThis(0); AssertVarMem(pevt); AssertVarMem(pcmd); EVT evt; ClearPb(pcmd, size(*pcmd)); pcmd->cid = cidKey; if (pevt->message == WM_KEYDOWN) { TranslateMessage(pevt); if (PeekMessage(&evt, pevt->hwnd, 0, 0, PM_NOREMOVE) && WM_CHAR == evt.message && PeekMessage(&evt, pevt->hwnd, WM_CHAR, WM_CHAR, PM_REMOVE)) { Assert(evt.message == WM_CHAR, 0); pcmd->ch = evt.wParam; } else pcmd->ch = chNil; pcmd->vk = pevt->wParam; } else { pcmd->vk = vkNil; pcmd->ch = pevt->wParam; } pcmd->grfcust = GrfcustCur(); pcmd->cact = SwLow(pevt->lParam); return fTrue; } /*************************************************************************** Look at the next system event and if it's a key, fill in the *pcmd with the relevant info. ***************************************************************************/ bool APPB::FGetNextKeyFromOsQueue(PCMD_KEY pcmd) { AssertThis(0); AssertVarMem(pcmd); EVT evt; for (;;) { if (!PeekMessage(&evt, hNil, 0, 0, PM_NOREMOVE) || !FIn(evt.message, WM_KEYFIRST, WM_KEYLAST + 1) || !PeekMessage(&evt, evt.hwnd, evt.message, evt.message, PM_REMOVE)) { break; } if (hNil != vwig.hwndClient && TranslateMDISysAccel(vwig.hwndClient, &evt) || hNil != vwig.haccel && TranslateAccelerator(vwig.hwndApp, vwig.haccel, &evt)) { break; } switch (evt.message) { case WM_CHAR: case WM_KEYDOWN: if (!_FTranslateKeyEvt(&evt, pcmd)) goto LFail; return fTrue; default: TranslateMessage(&evt); DispatchMessage(&evt); break; } } LFail: TrashVar(pcmd); return fFalse; } /*************************************************************************** Flush user generated events from the system event queue. ***************************************************************************/ void APPB::FlushUserEvents(ulong grfevt) { AssertThis(0); EVT evt; while ((grfevt & fevtMouse) && PeekMessage(&evt, hNil, WM_MOUSEFIRST, WM_MOUSELAST, PM_REMOVE) || (grfevt & fevtKey) && PeekMessage(&evt, hNil, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE)) { } } /*************************************************************************** Get our app window out of the clipboard viewer chain. ***************************************************************************/ void APPB::_ShutDownViewer(void) { if (vwig.hwndApp != hNil) ChangeClipboardChain(vwig.hwndApp, vwig.hwndNextViewer); vwig.hwndNextViewer = hNil; } /*************************************************************************** Main window procedure (a static method). ***************************************************************************/ LRESULT CALLBACK APPB::_LuWndProc(HWND hwnd, uint wm, WPARAM wParam, LPARAM lw) { AssertNilOrPo(vpappb, 0); long lwRet; if (pvNil != vpappb && vpappb->_FFrameWndProc(hwnd, wm, wParam, lw, &lwRet)) { return lwRet; } return DefFrameProc(hwnd, vwig.hwndClient, wm, wParam, lw); } /*************************************************************************** Handle Windows messages for the main app window. Return true iff the default window proc should _NOT_ be called. ***************************************************************************/ bool APPB::_FFrameWndProc(HWND hwnd, uint wm, WPARAM wParam, LPARAM lw, long *plwRet) { AssertThis(0); AssertVarMem(plwRet); PGOB pgob; RC rc; PT pt; long xp, yp; long lwT; long lwStyle; *plwRet = 0; switch (wm) { default: return _FCommonWndProc(hwnd, wm, wParam, lw, plwRet); case WM_CREATE: Assert(vwig.hwndApp == hNil, 0); vwig.hwndNextViewer = SetClipboardViewer(hwnd); vwig.hwndApp = hwnd; return fTrue; case WM_CHANGECBCHAIN: if ((HWND)wParam == vwig.hwndNextViewer) vwig.hwndNextViewer = (HWND)lw; else if (hNil != vwig.hwndNextViewer) SendMessage(vwig.hwndNextViewer, wm, wParam, lw); return fTrue; case WM_DRAWCLIPBOARD: if (hNil != vwig.hwndNextViewer) SendMessage(vwig.hwndNextViewer, wm, wParam, lw); if (vwig.hwndApp != hNil && GetClipboardOwner() != vwig.hwndApp) vpclip->Import(); return fTrue; case WM_DESTROY: _ShutDownViewer(); vwig.hwndApp = hNil; PostQuitMessage(0); return fTrue; case WM_SIZE: // make sure the style bits are set correctly lwT = lwStyle = GetWindowLong(vwig.hwndApp, GWL_STYLE); if (_fFullScreen && wParam == SIZE_MAXIMIZED) { // in full screen mode, set popup and nuke the system menu stuff lwStyle |= WS_POPUP; lwStyle &= ~(WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX); } else { // in non-full screen mode, clear popup and set the system menu stuff lwStyle &= ~WS_POPUP; lwStyle |= (WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX); } if (lwT != lwStyle) SetWindowLong(vwig.hwndApp, GWL_STYLE, lwStyle); return _FCommonWndProc(hwnd, wm, wParam, lw, plwRet); case WM_PALETTECHANGED: if ((HWND)wParam == hwnd) return fTrue; // fall thru case WM_QUERYNEWPALETTE: *plwRet = GPT::CclrSetPalette(hwnd, fTrue) > 0; return fTrue; case WM_GETMINMAXINFO: BLOCK { long dypFrame, dypScreen, dypExtra; MINMAXINFO *pmmi; pmmi = (MINMAXINFO *)lw; *plwRet = DefFrameProc(hwnd, vwig.hwndClient, wm, wParam, (long)pmmi); dypFrame = GetSystemMetrics(SM_CYFRAME); dypScreen = GetSystemMetrics(SM_CYSCREEN); dypExtra = 0; FGetProp(kpridFullScreen, &lw); if (lw) dypExtra = GetSystemMetrics(SM_CYCAPTION); pmmi->ptMaxPosition.y = -dypFrame - dypExtra; pmmi->ptMaxSize.y = pmmi->ptMaxTrackSize.y = dypScreen + 2 * dypFrame + dypExtra; _FCommonWndProc(hwnd, wm, wParam, (long)pmmi, &lw); } return fTrue; case WM_CLOSE: if (pvNil != vpcex) vpcex->EnqueueCid(cidQuit); return fTrue; case WM_QUERYENDSESSION: if (!_fQuit) Quit(fFalse); *plwRet = _fQuit; return fTrue; case WM_COMMAND: if (GET_WM_COMMAND_HWND(wParm, lw) != hNil) break; lwT = GET_WM_COMMAND_ID(wParam, lw); if (!FIn(lwT, wcidMinApp, wcidLimApp)) break; if (pvNil != vpmubCur) vpmubCur->EnqueueWcid(lwT); else if (pvNil != vpcex) vpcex->EnqueueCid(lwT); return fTrue; case WM_INITMENU: if (vpmubCur != pvNil) { vpmubCur->Clean(); return fTrue; } break; // these are for automated testing support... case WM_GOB_STATE: if (pvNil != (pgob = GOB::PgobFromHidScr(lw))) *plwRet = pgob->LwState(); return fTrue; case WM_GOB_LOCATION: *plwRet = -1; if (pvNil == (pgob = GOB::PgobFromHidScr(lw))) return fTrue; pgob->GetRcVis(&rc, cooLocal); if (rc.FEmpty()) return fTrue; pt.xp = pt.yp = 0; pgob->MapPt(&pt, cooLocal, cooGlobal); for (lwT = 0; lwT < 256; lwT++) { for (yp = rc.ypTop + (lwT & 0x0F); yp < rc.ypBottom; yp += 16) { for (xp = rc.xpLeft + (lwT >> 4); xp < rc.xpRight; xp += 16) { if (pgob->FPtIn(xp, yp) && pgob == GOB::PgobFromPtGlobal(xp + pt.xp, yp + pt.yp)) { pt.xp += xp; pt.yp += yp; GOB::PgobScreen()->MapPt(&pt, cooGlobal, cooLocal); *plwRet = LwHighLow((short)pt.xp, (short)pt.yp); return fTrue; } } } } return fTrue; case WM_GLOBAL_STATE: *plwRet = GrfcustCur(); return fTrue; case WM_CURRENT_CURSOR: if (pvNil != _pcurs) *plwRet = _pcurs->Cno(); else *plwRet = cnoNil; return fTrue; case WM_GET_PROP: if (!FGetProp(lw, plwRet)) *plwRet = wParam; return fTrue; case WM_SCALE_TIME: *plwRet = vpusac->LuScale(); vpusac->Scale(lw); return fTrue; case WM_GOB_FROM_PT: pt.xp = wParam; pt.yp = lw; GOB::PgobScreen()->MapPt(&pt, cooLocal, cooGlobal); if (pvNil != (pgob = GOB::PgobFromPtGlobal(pt.xp, pt.yp))) *plwRet = pgob->Hid(); return fTrue; case WM_FIRST_CHILD: if (pvNil != (pgob = GOB::PgobFromHidScr(lw)) && pvNil != (pgob = pgob->PgobFirstChild())) { *plwRet = pgob->Hid(); } return fTrue; case WM_NEXT_SIB: if (pvNil != (pgob = GOB::PgobFromHidScr(lw)) && pvNil != (pgob = pgob->PgobNextSib())) { *plwRet = pgob->Hid(); } return fTrue; case WM_PARENT: if (pvNil != (pgob = GOB::PgobFromHidScr(lw)) && pvNil != (pgob = pgob->PgobPar())) { *plwRet = pgob->Hid(); } return fTrue; case WM_GOB_TYPE: if (pvNil != (pgob = GOB::PgobFromHidScr(lw))) *plwRet = pgob->Cls(); return fTrue; case WM_IS_GOB: if (pvNil != (pgob = GOB::PgobFromHidScr(lw))) *plwRet = pgob->FIs(wParam); return fTrue; } return fFalse; } /*************************************************************************** MDI window proc (a static method). ***************************************************************************/ LRESULT CALLBACK APPB::_LuMdiWndProc(HWND hwnd, uint wm, WPARAM wParam, LPARAM lw) { AssertNilOrPo(vpappb, 0); long lwRet; if (pvNil != vpappb && vpappb->_FMdiWndProc(hwnd, wm, wParam, lw, &lwRet)) { return lwRet; } return DefMDIChildProc(hwnd, wm, wParam, lw); } /*************************************************************************** Handle MDI window messages. Returns true iff the default window proc should _NOT_ be called. ***************************************************************************/ bool APPB::_FMdiWndProc(HWND hwnd, uint wm, WPARAM wParam, LPARAM lw, long *plwRet) { AssertThis(0); AssertVarMem(plwRet); PGOB pgob; long lwT; *plwRet = 0; switch (wm) { default: return _FCommonWndProc(hwnd, wm, wParam, lw, plwRet); case WM_GETMINMAXINFO: *plwRet = DefMDIChildProc(hwnd, wm, wParam, lw); _FCommonWndProc(hwnd, wm, wParam, lw, &lwT); return fTrue; case WM_CLOSE: if ((pgob = GOB::PgobFromHwnd(hwnd)) != pvNil) vpcex->EnqueueCid(cidCloseWnd, pgob); return fTrue; case WM_MDIACTIVATE: GOB::ActivateHwnd(hwnd, GET_WM_MDIACTIVATE_FACTIVATE(hwnd, wParam, lw)); break; } return fFalse; } /*************************************************************************** Common stuff between the two window procs. Returns true if the default window proc should _NOT_ be called. ***************************************************************************/ bool APPB::_FCommonWndProc(HWND hwnd, uint wm, WPARAM wParam, LPARAM lw, long *plwRet) { AssertThis(0); AssertVarMem(plwRet); PGOB pgob; PT pt; PSCB pscb; RC rc; HDC hdc; PAINTSTRUCT ps; HRGN hrgn; *plwRet = 0; switch (wm) { case WM_PAINT: if (IsIconic(hwnd)) break; // make sure the palette is selected and realized.... // theoretically, we shouldn't have to do this, but because // of past and present Win bugs, we do it to be safe. GPT::CclrSetPalette(hwnd, fFalse); // invalidate stuff that we have marked internally (may as well // draw everything that needs drawn). InvalMarked(hwnd); // NOTE: BeginPaint has a bug where it returns in ps.rcPaint the // bounds of the update region intersected with the current clip region. // This causes us to not draw everything we need to. To fix this we // save, open up, and restore the clipping region around the BeginPaint // call. hdc = GetDC(hwnd); if (hNil == hdc) goto LFailPaint; if (FCreateRgn(&hrgn, pvNil) && 1 != GetClipRgn(hdc, hrgn)) FreePhrgn(&hrgn); SelectClipRgn(hdc, hNil); if (!BeginPaint(hwnd, &ps)) { ReleaseDC(hwnd, hdc); LFailPaint: Warn("Painting failed"); break; } // Since we use CS_OWNDC, these DCs should be the same... Assert(hdc == ps.hdc, 0); rc = RC(ps.rcPaint); UpdateHwnd(hwnd, &rc); EndPaint(hwnd, &ps); // don't call the default window proc - or it will clear anything // that got invalidated while we were drawing (which can happen // in a multi-threaded pre-emptive environment). return fTrue; case WM_SYSCOMMAND: if (wParam == SC_SCREENSAVE && !FAllowScreenSaver()) return fTrue; break; case WM_GETMINMAXINFO: if (pvNil != (pgob = GOB::PgobFromHwnd(hwnd))) { MINMAXINFO *pmmi = (MINMAXINFO far *)lw; pgob->GetMinMax(&rc); pmmi->ptMinTrackSize.x = LwMax(pmmi->ptMinTrackSize.x, rc.xpLeft); pmmi->ptMinTrackSize.y = LwMax(pmmi->ptMinTrackSize.y, rc.ypTop); pmmi->ptMaxTrackSize.x = LwMin(pmmi->ptMaxTrackSize.x, rc.xpRight); pmmi->ptMaxTrackSize.y = LwMin(pmmi->ptMaxTrackSize.y, rc.ypBottom); } return fTrue; case WM_SIZE: if (pvNil != (pgob = GOB::PgobFromHwnd(hwnd))) pgob->SetRcFromHwnd(); break; case WM_LBUTTONDOWN: case WM_LBUTTONDBLCLK: ResetToolTip(); if (pvNil != (pgob = GOB::PgobFromHwnd(hwnd)) && pvNil != (pgob = pgob->PgobFromPt(SwLow(lw), SwHigh(lw), &pt))) { long ts; // compute the multiplicity of the click - don't use Windows' // guess, since it can be wrong for our GOBs. It's even wrong // at the HWND level! (Try double-clicking the maximize button). ts = GetMessageTime(); if (_pgobMouse == pgob && FIn(ts - _tsMouse, 0, GetDoubleClickTime())) { _cactMouse++; } else _cactMouse = 1; _tsMouse = ts; if (_pgobMouse != pgob && pvNil != _pgobMouse) { AssertPo(_pgobMouse, 0); vpcex->EnqueueCid(cidRollOff, _pgobMouse); } _pgobMouse = pgob; _xpMouse = klwMax; pgob->MouseDown(pt.xp, pt.yp, _cactMouse, GrfcustCur()); } else _pgobMouse = pvNil; break; case WM_LBUTTONUP: case WM_RBUTTONDOWN: case WM_RBUTTONUP: case WM_RBUTTONDBLCLK: case WM_MBUTTONDOWN: case WM_MBUTTONUP: case WM_MBUTTONDBLCLK: ResetToolTip(); break; case WM_SETCURSOR: if (LOWORD(lw) != HTCLIENT) return fFalse; RefreshCurs(); return fTrue; case WM_HSCROLL: case WM_VSCROLL: pscb = (PSCB)CTL::PctlFromHctl(GET_WM_HSCROLL_HWND(wParam, lw)); if (pvNil != pscb && pscb->FIs(kclsSCB)) { pscb->TrackScroll(GET_WM_HSCROLL_CODE(wParam, lw), GET_WM_HSCROLL_POS(wParam, lw)); } break; case WM_ACTIVATEAPP: _Activate(FPure(wParam)); break; } return fFalse; } #ifdef DEBUG /*************************************************************************** Debug initialization. ***************************************************************************/ bool APPB::_FInitDebug(void) { AssertThis(0); return fTrue; } // passes the strings to the assert dialog proc STN *_rgpstn[3]; /*************************************************************************** Dialog proc for assert. ***************************************************************************/ BOOL CALLBACK _FDlgAssert(HWND hdlg, UINT msg, WPARAM w, LPARAM lw) { switch (msg) { case WM_INITDIALOG: SetDlgItemText(hdlg, 3, _rgpstn[0]->Psz()); SetDlgItemText(hdlg, 4, _rgpstn[1]->Psz()); SetDlgItemText(hdlg, 5, _rgpstn[2]->Psz()); return fTrue; case WM_COMMAND: switch (GET_WM_COMMAND_ID(w, lw)) { default: break; case 0: case 1: case 2: EndDialog(hdlg, GET_WM_COMMAND_ID(w, lw)); return fTrue; } break; } return fFalse; } MUTX _mutxAssert; /*************************************************************************** The assert proc. Returning true breaks into the debugger. ***************************************************************************/ bool APPB::FAssertProcApp(PSZS pszsFile, long lwLine, PSZS pszsMsg, void *pv, long cb) { const long kclwChain = 10; STN stn0, stn1, stn2; int tmc; PSZ psz; long cact; long *plw; long ilw; long rglw[kclwChain]; _mutxAssert.Enter(); if (_fInAssert) { _mutxAssert.Leave(); return fFalse; } _fInAssert = fTrue; _rgpstn[0] = &stn0; _rgpstn[1] = &stn1; _rgpstn[2] = &stn2; // build the main assert message with file name and line number if (pszsMsg == pvNil || *pszsMsg == 0) psz = PszLit("Assert (%s line %d)"); else { psz = PszLit("Assert (%s line %d): %s"); stn2.SetSzs(pszsMsg); } if (pvNil != pszsFile) stn1.SetSzs(pszsFile); else stn1 = PszLit("Some Header file"); stn0.FFormatSz(psz, &stn1, lwLine, &stn2); // call stack - follow the EBP chain.... __asm { mov plw,ebp } for (ilw = 0; ilw < kclwChain; ilw++) { if (pvNil == plw || IsBadReadPtr(plw, 2 * size(long)) || *plw <= (long)plw) { rglw[ilw] = 0; plw = pvNil; } else { rglw[ilw] = plw[1]; plw = (long *)*plw; } } for (cact = 0; cact < 2; cact++) { // format data if (pv != pvNil && cb > 0) { byte *pb = (byte *)pv; long cbT = cb; long ilw; long lw; STN stnT; stn2.SetNil(); for (ilw = 0; ilw < 20 && cb >= 4; cb -= 4, pb += 4, ++ilw) { CopyPb(pb, &lw, 4); stnT.FFormatSz(PszLit("%08x "), lw); stn2.FAppendStn(&stnT); } if (ilw < 20 && cb > 0) { lw = 0; CopyPb(pb, &lw, cb); stnT.FFormatSz((cb <= 2) ? PszLit("%04x") : PszLit("%08x"), lw); stn2.FAppendStn(&stnT); } } else stn2.SetNil(); if (cact == 0) { pv = rglw; cb = size(rglw); stn1 = stn2; } } OutputDebugString(stn0.Psz()); OutputDebugString(PszLit("\n")); if (stn1.Cch() > 0) { OutputDebugString(stn1.Psz()); OutputDebugString(PszLit("\n")); } if (stn2.Cch() > 0) { OutputDebugString(stn2.Psz()); OutputDebugString(PszLit("\n")); } if (LwThreadCur() != vwig.lwThreadMain) { // can't use a dialog - it may cause grid - lock long sid; ulong grfmb; stn0.FAppendSz(PszLit("\n")); stn0.FAppendStn(&stn1); stn0.FAppendSz(PszLit("\n")); stn0.FAppendStn(&stn2); grfmb = MB_SYSTEMMODAL | MB_YESNO | MB_ICONHAND; sid = MessageBox(hNil, stn0.Psz(), PszLit("Thread Assert! (Y = Ignore, N = Debugger)"), grfmb); switch (sid) { default: tmc = 0; break; case IDNO: tmc = 1; break; } } else { // run the dialog tmc = DialogBox(vwig.hinst, PszLit("AssertDlg"), vwig.hwndApp, &_FDlgAssert); } _fInAssert = fFalse; _mutxAssert.Leave(); switch (tmc) { case 0: // ignore return fFalse; case 1: // break into debugger return fTrue; case 2: // abort Abort(); // shouldn't return Debugger(); break; } return fFalse; } #endif // DEBUG /*************************************************************************** Put an alert up. Return which button was hit. Returns tYes for yes or ok; tNo for no; tMaybe for cancel. ***************************************************************************/ tribool APPB::TGiveAlertSz(PSZ psz, long bk, long cok) { AssertThis(0); AssertSz(psz); long sid; ulong grfmb; HWND hwnd; grfmb = MB_APPLMODAL; switch (bk) { default: BugVar("bad bk value", &bk); // fall through case bkOk: grfmb |= MB_OK; break; case bkOkCancel: grfmb |= MB_OKCANCEL; break; case bkYesNo: grfmb |= MB_YESNO; break; case bkYesNoCancel: grfmb |= MB_YESNOCANCEL; break; } switch (cok) { default: BugVar("bad cok value", &cok); // fall through case cokNil: break; case cokInformation: grfmb |= MB_ICONINFORMATION; break; case cokQuestion: grfmb |= MB_ICONQUESTION; break; case cokExclamation: grfmb |= MB_ICONEXCLAMATION; break; case cokStop: grfmb |= MB_ICONSTOP; break; } hwnd = GetActiveWindow(); if (hNil == hwnd) hwnd = vwig.hwndApp; sid = MessageBox(hwnd, psz, PszLit(""), grfmb); switch (sid) { default: case IDYES: case IDOK: return tYes; case IDCANCEL: return tMaybe; case IDNO: return tNo; } } ================================================ FILE: kauai/src/audioman.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /////////////////////////////////////////////////////////////////////////////////////////////////////////// // // Contains AudioMan Pubic Interfaces and Types // // Copyright (c) Microsoft Corporation 1995 // // 4/27/95 ***** // /////////////////////////////////////////////////////////////////////////////////////////////////////////// #ifndef _AUDIOMANPUBLICINTEFACES_ #define _AUDIOMANPUBLICINTEFACES_ /////////////////////////////////////////////////////////////////////////////////////////////////////////// // // Class ID's // /////////////////////////////////////////////////////////////////////////////////////////////////////////// #define _CLSID_AMMixer 94C7E510 - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(CLSID_AMMixer, 0x94C7E510L, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _CLSID_AMWavFileSrc 94C7E514 - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(CLSID_AMWavFileSrc, 0x94C7E514L, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _CLSID_AMSilentSound 94C7E516 - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(CLSID_AMSilentSound, 0x94C7E516L, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _CLSID_AMAppendFilter 94C7E517 - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(CLSID_AMAppendFilter, 0x94C7E517L, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _CLSID_AMClipFilter 94C7E518 - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(CLSID_AMClipFilter, 0x94C7E518L, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _CLSID_AMConvertFilter 94C7E522 - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(CLSID_AMConvertFilter, 0x94C7E522L, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _CLSID_AMDelayFilter 94C7E519 - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(CLSID_AMDelayFilter, 0x94C7E519L, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _CLSID_AMGainFilter 94C7E51A - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(CLSID_AMGainFilter, 0x94C7E51AL, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _CLSID_AMGateFilter 94C7E51B - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(CLSID_AMGateFilter, 0x94C7E51BL, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _CLSID_AMLoopFilter 94C7E51C - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(CLSID_AMLoopFilter, 0x94C7E51CL, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _CLSID_AMMixFilter 94C7E51D - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(CLSID_AMMixFilter, 0x94C7E51DL, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _CLSID_AMFaderFilter 94C7E51E-9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(CLSID_AMFaderFilter, 0x94C7E51EL, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _CLSID_AMScheduleFilter 94C7E51F - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(CLSID_AMScheduleFilter, 0x94C7E51FL, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _CLSID_AMRandomizeFilter 94C7E520 - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(CLSID_AMRandomizeFilter, 0x94C7E520L, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _CLSID_AMDistortFilter 94C7E521 - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(CLSID_AMDistortFilter, 0x94C7E521L, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _CLSID_AMCacheFilter 94C7E523 - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(CLSID_AMCacheFilter, 0x94C7E523L, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _CLSID_AMTrimFilter 94C7E524 - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(CLSID_AMTrimFilter, 0x94C7E524L, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _CLSID_AMStereoFilter 94C7E525 - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(CLSID_AMStereoFilter, 0x94C7E525L, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _CLSID_AMBiasFilter 94C7E526 - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(CLSID_AMBiasFilter, 0x94C7E526L, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); /////////////////////////////////////////////////////////////////////////////////////////////////////////// // // Interface Definitions // /////////////////////////////////////////////////////////////////////////////////////////////////////////// #define _IID_IAMMixer A0434E40 - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(IID_IAMMixer, 0xA0434E40L, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _IID_IAMChannel A0434E42 - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(IID_IAMChannel, 0xA0434E42L, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _IID_IAMWaveOut A0434E43 - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(IID_IAMWaveOut, 0xA0434E43L, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _IID_IAMSound A0434E44 - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(IID_IAMSound, 0xA0434E44L, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _IID_IAMNotifySink A0434E45 - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(IID_IAMNotifySink, 0xA0434E45L, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _IID_IAMWavFileSrc A0434E46 - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(IID_IAMWavFileSrc, 0xA0434E46L, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _IID_IAMSilentSound A0434E48 - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(IID_IAMSilentSound, 0xA0434E48L, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _IID_IAMAppendFilter A0434E49 - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(IID_IAMAppendFilter, 0xA0434E49L, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _IID_IAMClipFilter A0434E4A - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(IID_IAMClipFilter, 0xA0434E4AL, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _IID_IAMConvertFilter A0434E4B - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(IID_IAMConvertFilter, 0xA0434E4BL, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _IID_IAMDelayFilter A0434E4C - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(IID_IAMDelayFilter, 0xA0434E4CL, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _IID_IAMGainFilter A0434E4D - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(IID_IAMGainFilter, 0xA0434E4DL, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _IID_IAMGateFilter A0434E4E - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(IID_IAMGateFilter, 0xA0434E4EL, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _IID_IAMLoopFilter A0434E4F - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(IID_IAMLoopFilter, 0xA0434E4FL, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _IID_IAMMixFilter A0434E50 - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(IID_IAMMixFilter, 0xA0434E50L, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _IID_IAMFaderFilter A0434E51 - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(IID_IAMFaderFilter, 0xA0434E51L, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _IID_IAMScheduleFilter A0434E52 - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(IID_IAMScheduleFilter, 0xA0434E52L, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _IID_IAMRandomizeFilter A0434E53 - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(IID_IAMRandomizeFilter, 0xA0434E53L, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _IID_IAMDistortFilter A0434E54 - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(IID_IAMDistortFilter, 0xA0434E54L, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _IID_IAMCacheFilter A0434E55 - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(IID_IAMCacheFilter, 0xA0434E55L, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _IID_IAMTrimFilter A0434E56 - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(IID_IAMTrimFilter, 0xA0434E56L, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _IID_IAMStereoFilter A0434E57 - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(IID_IAMStereoFilter, 0xA0434E57L, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); #define _IID_IAMBiasFilter A0434E58 - 9573 - 11CE-B61B - 00AA006EBBE5 DEFINE_GUID(IID_IAMBiasFilter, 0xA0434E58L, 0x9573, 0x11CE, 0xB6, 0x1B, 0x00, 0xAA, 0x00, 0x6E, 0xBB, 0xE5); /////////////////////////////////////////////////////////////////////////////////////////////////////////// // // Interface Typedefs // /////////////////////////////////////////////////////////////////////////////////////////////////////////// typedef interface IAMMixer IAMMixer; typedef IAMMixer FAR *LPMIXER; typedef interface IAMChannel IAMChannel; typedef IAMChannel FAR *LPCHANNEL; typedef interface IAMWaveOut IAMWaveOut; typedef IAMWaveOut FAR *LPWAVEOUT; typedef interface IAMSound IAMSound; typedef IAMSound FAR *LPSOUND; typedef interface IAMNotifySink IAMNotifySink; typedef IAMNotifySink FAR *LPNOTIFYSINK; typedef interface IAMWavFileSrc IAMWavFileSrc; typedef IAMWavFileSrc FAR *LPWAVFILESRC; typedef interface IAMSilentSound IAMSilentSound; typedef IAMSilentSound FAR *LPSILENTSOUND; typedef interface IAMAppendFilter IAMAppendFilter; typedef IAMAppendFilter FAR *LPAPPENDFILTER; typedef interface IAMClipFilter IAMClipFilter; typedef IAMClipFilter FAR *LPCLIPFILTER; typedef interface IAMConvertFilter IAMConvertFilter; typedef IAMConvertFilter FAR *LPCONVERTFILTER; typedef interface IAMDelayFilter IAMDelayFilter; typedef IAMDelayFilter FAR *LPDELAYFILTER; typedef interface IAMGainFilter IAMGainFilter; typedef IAMGainFilter FAR *LPGAINFILTER; typedef interface IAMGateFilter IAMGateFilter; typedef IAMGateFilter FAR *LPGATEFILTER; typedef interface IAMLoopFilter IAMLoopFilter; typedef IAMLoopFilter FAR *LPLOOPFILTER; typedef interface IAMMixFilter IAMMixFilter; typedef IAMMixFilter FAR *LPMIXFILTER; typedef interface IAMFaderFilter IAMFaderFilter; typedef IAMFaderFilter FAR *LPFADERFILTER; typedef interface IAMScheduleFilter IAMScheduleFilter; typedef IAMScheduleFilter FAR *LPSCHEDULEFILTER; typedef interface IAMRandomizeFilter IAMRandomizeFilter; typedef IAMRandomizeFilter FAR *LPRANDOMIZEFILTER; typedef interface IAMDistortFilter IAMDistortFilter; typedef IAMDistortFilter FAR *LPDISTORTFILTER; typedef interface IAMCacheFilter IAMCacheFilter; typedef IAMCacheFilter FAR *LPCACHEFILTER; typedef interface IAMTrimFilter IAMTrimFilter; typedef IAMTrimFilter FAR *LPTRIMFILTER; typedef interface IAMStereoFilter IAMStereoFilter; typedef IAMStereoFilter FAR *LPSTEREOFILTER; typedef interface IAMBiasFilter IAMBiasFilter; typedef IAMBiasFilter FAR *LPBIASFILTER; #ifndef LPSTREAM typedef IStream FAR *LPSTREAM; #endif #ifndef LPUNKNOWN typedef IUnknown FAR *LPUNKNOWN; #endif /////////////////////////////////////////////////////////////////////////////////////////////////////////// // // Audio HRESULT Return Codes // /////////////////////////////////////////////////////////////////////////////////////////////////////////// // Success Codes #define AM_S_FIRST (OLE_S_FIRST + 5000) #define S_ENDOFSOUND (AM_S_FIRST + 1) #define S_SOUNDIDLE (AM_S_FIRST + 2) // Error Codes #define AM_E_FIRST (OLE_E_FIRST + 5000) #define E_BADPCMFORMAT (AM_E_FIRST + 1) #define E_NOSOUNDCARD (AM_E_FIRST + 2) #define E_INVALIDCARD (AM_E_FIRST + 3) #define E_AUDIODEVICEBUSY (AM_E_FIRST + 4) #define E_NOTACTIVE (AM_E_FIRST + 5) #define E_NEEDSETUP (AM_E_FIRST + 6) #define E_OPENDEVICEFAILED (AM_E_FIRST + 7) #define E_INITFAILED (AM_E_FIRST + 8) #define E_NOTINITED (AM_E_FIRST + 9) #define E_MMSYSERROR (AM_E_FIRST + 10) #define E_MMSYSBADDEVICEID (AM_E_FIRST + 11) #define E_MMSYSNOTENABLED (AM_E_FIRST + 12) #define E_MMSYSALLOCATED (AM_E_FIRST + 13) #define E_MMSYSINVALHANDLE (AM_E_FIRST + 14) #define E_MMSYSNODRIVER (AM_E_FIRST + 15) #define E_MMSYSNOMEM (AM_E_FIRST + 16) #define E_MMSYSNOTSUPPORTED (AM_E_FIRST + 17) #define E_MMSYSBADERRNUM (AM_E_FIRST + 18) #define E_MMSYSINVALFLAG (AM_E_FIRST + 19) #define E_MMSYSINVALPARAM (AM_E_FIRST + 20) #define E_MMSYSHANDLEBUSY (AM_E_FIRST + 21) #define E_MMSYSINVALIDALIAS (AM_E_FIRST + 22) #define E_MMSYSBADDB (AM_E_FIRST + 23) #define E_MMSYSKEYNOTFOUND (AM_E_FIRST + 24) #define E_MMSYSREADERROR (AM_E_FIRST + 25) #define E_MMSYSWRITEERROR (AM_E_FIRST + 26) #define E_MMSYSDELETEERROR (AM_E_FIRST + 27) #define E_MMSYSVALNOTFOUND (AM_E_FIRST + 28) #define E_MMSYSNODRIVERCB (AM_E_FIRST + 29) #define E_WAVEERRBADFORMAT (AM_E_FIRST + 30) #define E_WAVEERRSTILLPLAYING (AM_E_FIRST + 31) #define E_WAVERRUNPREPARED (AM_E_FIRST + 32) #define E_WAVERRSYNC (AM_E_FIRST + 33) #define E_TIMERRNOCANDO (AM_E_FIRST + 34) #define E_TIMERRSTRUCT (AM_E_FIRST + 35) #define E_ALREADYREGISTERED (AM_E_FIRST + 36) #define E_CHANNELNOTREGISTERED (AM_E_FIRST + 37) #define E_ALLGROUPSALLOCATED (AM_E_FIRST + 38) #define E_GROUPNOTALLOCATED (AM_E_FIRST + 39) #define E_BADTIMERPERIOD (AM_E_FIRST + 40) #define E_NOTIMER (AM_E_FIRST + 41) // Mixer Error Codes #define E_ALREADYINITED (OLE_E_FIRST + 8) /////////////////////////////////////////////////////////////////////////////////////////////////////////// // // AudioMan common defines // /////////////////////////////////////////////////////////////////////////////////////////////////////////// enum RAND_FREQUENCY { NORMAL_FREQ = 0, LO_OCCURRING = 1, HI_OCCURRING = 2 }; enum SMPTE_FRAMERATES { SMPTE_30_FPS = 3000, SMPTE_29DF_FPS = 2997, SMPTE_29_FPS = 2900, SMPTE_25_FPS = 2500 }; enum NOTIFYSINKFLAGS { NOTIFYSINK_ONSTART = 1, NOTIFYSINK_ONCOMPLETION = 2, NOTIFYSINK_ONERROR = 4, NOTIFYSINK_ONSYNCOBJECT = 8 }; enum DELAY_FLAGS { DELAY_FADE = 1, DELAY_IN = 2, DELAY_OUT = 4, DELAY_FLIP = 8 }; enum WODM_CUSTOM { WODM_SETGAIN = 100, WODM_GETGAIN = 101, }; /////////////////////////////////////////////////////////////////////////////////////////////////////////// // // AudioMan Type definitions // /////////////////////////////////////////////////////////////////////////////////////////////////////////// typedef struct SMPTE { BYTE hour; BYTE min; BYTE sec; BYTE frame; DWORD fps; } SMPTE, FAR *LPSMPTE; typedef struct CacheConfig { DWORD dwSize; BOOL fSrcFormat; LPWAVEFORMATEX lpFormat; DWORD dwFormat; DWORD dwCacheTime; } CACHECONFIG, FAR *LPCACHECONFIG; typedef struct AdvMixerConfig { DWORD dwSize; UINT uVoices; BOOL fRemixEnabled; UINT uBufferTime; } ADVMIXCONFIG, FAR *LPADVMIXCONFIG; typedef struct MixerConfig { DWORD dwSize; LPWAVEFORMATEX lpFormat; DWORD dwFormat; } MIXERCONFIG, FAR *LPMIXERCONFIG; typedef struct SchedulerConfig { DWORD dwSize; DWORD dwUser; DWORD dwDuration; DWORD dwLoops; BOOL fExclusiveBlocks; } SCHEDULERCONFIG, FAR *LPSCHEDULERCONFIG; typedef struct RandomizeConfig { DWORD dwSize; DWORD dwUser; DWORD dwNumSubChannels; DWORD dwMinTime; DWORD dwMaxTime; BOOL fRandomVol; BOOL fRandomPan; DWORD dwMinVol; DWORD dwMaxVol; DWORD dwMaxPan; } RANDOMIZECONFIG, FAR *LPRANDOMIZECONFIG; typedef struct RequestParam { DWORD dwSize; DWORD dwFinishPos; LPNOTIFYSINK lpNotifySink; DWORD fdwNotifyMask; // REFIID riid; } REQUESTPARAM, FAR *LPREQUESTPARAM; /////////////////////////////////////////////////////////////////////////////////////////////////////////// // // AudioMan Interface Definitions // /////////////////////////////////////////////////////////////////////////////////////////////////////////// DECLARE_INTERFACE_(IAMMixer, IUnknown) { //--- IUnknown methods--- STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; STDMETHOD_(ULONG, AddRef)(THIS) PURE; STDMETHOD_(ULONG, Release)(THIS) PURE; //--- IAMMixer methods--- STDMETHOD(TestConfig) (THIS_ LPWAVEOUT pWaveOut, LPMIXERCONFIG pMixerConfig, LPADVMIXCONFIG pAdvMixConfig, BOOL fRecommend) PURE; STDMETHOD(Init) (THIS_ HINSTANCE hInst, LPWAVEOUT pWaveOut, LPMIXERCONFIG pMixerConfig, LPADVMIXCONFIG pAdvMixConfig) PURE; STDMETHOD(Uninit)(THIS) PURE; STDMETHOD(Activate)(THIS_ BOOL fActive) PURE; STDMETHOD(Suspend)(THIS_ BOOL fSuspend) PURE; STDMETHOD(SetConfig)(THIS_ LPMIXERCONFIG pMixerConfig, LPADVMIXCONFIG pAdvMixConfig) PURE; STDMETHOD(GetConfig)(THIS_ LPMIXERCONFIG pMixerConfig, LPADVMIXCONFIG pAdvMixConfig) PURE; STDMETHOD(SetMixerVolume)(THIS_ DWORD dwVolume) PURE; STDMETHOD(GetMixerVolume)(THIS_ LPDWORD lpdwVolume) PURE; STDMETHOD(PlaySound)(THIS_ LPSOUND pSound) PURE; STDMETHOD_(BOOL, RemixMode)(THIS_ BOOL fActive) PURE; STDMETHOD_(DWORD, GetAvgSample)(THIS) PURE; STDMETHOD(AllocGroup)(THIS_ LPDWORD lpdwGroup) PURE; STDMETHOD(FreeGroup)(THIS_ DWORD dwGroup) PURE; STDMETHOD(EnlistGroup)(THIS_ IUnknown FAR * pChannel, DWORD dwGroup) PURE; STDMETHOD(DefectGroup)(THIS_ LPUNKNOWN pUnknown, DWORD dwGroup) PURE; STDMETHOD(StartGroup)(THIS_ DWORD dwGroup, BOOL fStart) PURE; STDMETHOD(ResetGroup)(THIS_ DWORD dwGroup) PURE; STDMETHOD(SetGroupVolume)(THIS_ DWORD dwGroup, DWORD dwVolume) PURE; STDMETHOD(SetGroupGain)(THIS_ DWORD dwGroup, float flDBLeft, float flDBRight, BOOL fAbsolute) PURE; STDMETHOD(SetGroupPosition)(THIS_ DWORD dwGroup, DWORD dwPosition) PURE; STDMETHOD(AllocChannel)(THIS_ LPCHANNEL FAR * ppChannel) PURE; STDMETHOD(RegisterChannel)(THIS_ LPUNKNOWN pUnknown) PURE; STDMETHOD(UnregisterChannel)(THIS_ LPUNKNOWN pUnknown) PURE; STDMETHOD(SetPriority)(THIS_ LPUNKNOWN pUnknown, DWORD dwPriority) PURE; STDMETHOD(GetPriority)(THIS_ LPUNKNOWN pUnknown, LPDWORD lpdwPriority) PURE; STDMETHOD_(void, Refresh)(THIS) PURE; }; DECLARE_INTERFACE_(IAMChannel, IUnknown) { //--- IUnknown methods--- STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; STDMETHOD_(ULONG, AddRef)(THIS) PURE; STDMETHOD_(ULONG, Release)(THIS) PURE; //--- IAMChannel methods--- STDMETHOD(RegisterNotify)(THIS_ LPNOTIFYSINK pNotifySink, DWORD fdwNotifyFlags) PURE; STDMETHOD(SetSoundSrc)(THIS_ LPSOUND pSound) PURE; STDMETHOD(SetCachedSrc)(THIS_ LPSOUND pSound, LPCACHECONFIG pCacheConfig) PURE; STDMETHOD(GetSoundSrc)(THIS_ LPSOUND FAR * ppSound) PURE; STDMETHOD(Play)(THIS) PURE; STDMETHOD(Stop)(THIS) PURE; STDMETHOD(Finish)(THIS) PURE; STDMETHOD_(BOOL, IsPlaying)(THIS) PURE; STDMETHOD_(DWORD, Samples)(THIS) PURE; STDMETHOD(SetPosition)(THIS_ DWORD dwSample) PURE; STDMETHOD(GetPosition)(THIS_ LPDWORD lpdwSample) PURE; STDMETHOD(Mute)(THIS_ BOOL fMute) PURE; STDMETHOD(SetVolume)(THIS_ DWORD dwVolume) PURE; STDMETHOD(GetVolume)(THIS_ LPDWORD lpdwVolume) PURE; STDMETHOD(SetGain)(THIS_ float flLeft, float flRight) PURE; STDMETHOD(GetGain)(THIS_ float FAR *lpflLeft, float FAR *lpflRight) PURE; STDMETHOD(GetSMPTEPos)(THIS_ LPSMPTE lpSMPTE) PURE; STDMETHOD(SetSMPTEPos)(THIS_ LPSMPTE lpSMPTE) PURE; STDMETHOD(GetTimePos)(THIS_ LPDWORD lpdwTime) PURE; STDMETHOD(SetTimePos)(THIS_ DWORD dwTime) PURE; }; DECLARE_INTERFACE_(IAMWaveOut, IUnknown) { //--- IUnknown methods--- STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; STDMETHOD_(ULONG, AddRef)(THIS) PURE; STDMETHOD_(ULONG, Release)(THIS) PURE; //--- IAMWaveOut methods--- STDMETHOD_(UINT, GetNumDevs)(THIS) PURE; STDMETHOD_(MMRESULT, Open) (THIS_ UINT uDeviceID, LPWAVEFORMATEX lpwfx, DWORD dwCallback, DWORD dwCallbackInstance, DWORD fdwOpen) PURE; STDMETHOD_(MMRESULT, Close)(THIS) PURE; STDMETHOD_(MMRESULT, GetDevCaps)(THIS_ UINT uDeviceID, LPWAVEOUTCAPS lpCaps, UINT cbCaps) PURE; STDMETHOD_(MMRESULT, GetVolume)(THIS_ LPDWORD lpdwVolume) PURE; STDMETHOD_(MMRESULT, SetVolume)(THIS_ DWORD dwVolume) PURE; STDMETHOD_(MMRESULT, PrepareHeader)(THIS_ LPWAVEHDR pwh, UINT cbwh) PURE; STDMETHOD_(MMRESULT, UnprepareHeader)(THIS_ LPWAVEHDR pwh, UINT cbwh) PURE; STDMETHOD_(MMRESULT, Write)(THIS_ LPWAVEHDR pwh, UINT cbwh) PURE; STDMETHOD_(MMRESULT, Pause)(THIS) PURE; STDMETHOD_(MMRESULT, Restart)(THIS) PURE; STDMETHOD_(MMRESULT, Reset)(THIS) PURE; STDMETHOD_(MMRESULT, BreakLoop)(THIS) PURE; STDMETHOD_(MMRESULT, GetPosition)(THIS_ LPMMTIME lpmmt, UINT cbmmt) PURE; STDMETHOD_(MMRESULT, GetPitch)(THIS_ LPDWORD lpdwPitch) PURE; STDMETHOD_(MMRESULT, SetPitch)(THIS_ DWORD dwPitch) PURE; STDMETHOD_(MMRESULT, GetPlaybackRate)(THIS_ LPDWORD lpdwRate) PURE; STDMETHOD_(MMRESULT, SetPlaybackRate)(THIS_ DWORD dwRate) PURE; STDMETHOD_(MMRESULT, GetID)(THIS_ UINT FAR * lpuDeviceID) PURE; STDMETHOD_(MMRESULT, Message)(THIS_ UINT uMsg, DWORD dw1, DWORD dw2) PURE; STDMETHOD_(MMRESULT, GetErrorText)(THIS_ MMRESULT err, LPSTR lpText, UINT cchText) PURE; }; DECLARE_INTERFACE_(IAMSound, IUnknown) { //--- IUnknown methods--- STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; STDMETHOD_(ULONG, AddRef)(THIS) PURE; STDMETHOD_(ULONG, Release)(THIS) PURE; //--- IAMSound methods--- STDMETHOD(GetFormat)(THIS_ LPWAVEFORMATEX pFormat, DWORD cbSize) PURE; STDMETHOD_(DWORD, GetSamples)(THIS) PURE; STDMETHOD(GetAlignment)(THIS_ LPDWORD lpdwLeftAlign, LPDWORD lpdwRightAlign) PURE; STDMETHOD(GetSampleData) (THIS_ LPBYTE lpBuffer, DWORD dwPosition, LPDWORD lpdwSamples, LPREQUESTPARAM lpRequestParams) PURE; STDMETHOD(SetCacheSize)(THIS_ DWORD dwCacheSize) PURE; STDMETHOD(SetMode)(THIS_ BOOL fActive, BOOL fRecurse) PURE; }; DECLARE_INTERFACE_(IAMNotifySink, IUnknown) { //--- IUnknown methods--- STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE; STDMETHOD_(ULONG, AddRef)(THIS) PURE; STDMETHOD_(ULONG, Release)(THIS) PURE; //--- IAMNotifySink methods--- STDMETHOD_(void, OnStart)(THIS_ LPSOUND pSound, DWORD dwPosition) PURE; STDMETHOD_(void, OnCompletion)(THIS_ LPSOUND pSound, DWORD dwPosition) PURE; STDMETHOD_(void, OnError)(THIS_ LPSOUND pSound, DWORD dwPosition, HRESULT hrError) PURE; STDMETHOD_(void, OnSyncObject)(THIS_ LPSOUND pSound, DWORD dwPosition, void *pvObject) PURE; }; DECLARE_INTERFACE_(IAMWavFileSrc, IUnknown) { //--- IAMWavFileSrc methods--- STDMETHOD(InitFromStream)(THIS_ IStream * pStream, BOOL fSpooled) PURE; STDMETHOD(InitFromMemory)(THIS_ char *lpMemory, DWORD dwLength) PURE; STDMETHOD(InitFromFile)(THIS_ char *pAbsFilePath, DWORD dwOffset, BOOL fSpooled) PURE; }; DECLARE_INTERFACE_(IAMScheduleFilter, IUnknown) { //--- IAMScheduleFilter methods--- STDMETHOD(Init)(THIS_ LPSCHEDULERCONFIG pSchedulerConfig) PURE; STDMETHOD(Schedule) (THIS_ LPSOUND pSound, DWORD dwBeginTime, DWORD dwEndTime, DWORD dwLoops, BOOL fGrowSchedule) PURE; STDMETHOD(ScheduleLast)(THIS_ LPSOUND pSound, DWORD dwLoops, BOOL fGrowSchedule) PURE; STDMETHOD(ClearTime)(THIS_ DWORD dwBeginTime, DWORD dwEndTime) PURE; STDMETHOD(ClearAll)(THIS) PURE; STDMETHOD_(DWORD, GetNumScheduled)(THIS) PURE; STDMETHOD(GetSound)(THIS_ LPSOUND FAR * ppSound, DWORD dwIndex) PURE; STDMETHOD(GetTimeBlock)(THIS_ LPSOUND pSound, LPDWORD lpdwBeginTime, LPDWORD lpdwEndTime) PURE; STDMETHOD_(BOOL, IsScheduled)(THIS_ LPSOUND pSound) PURE; STDMETHOD_(BOOL, IsPlaying)(THIS_ LPSOUND pSound) PURE; }; DECLARE_INTERFACE_(IAMRandomizeFilter, IUnknown) { //--- IAMRandomizeFilter methods--- STDMETHOD(Init)(THIS_ LPRANDOMIZECONFIG pRandomizeConfig) PURE; STDMETHOD(Add)(THIS_ LPSOUND pSound, DWORD dwFrequency) PURE; STDMETHOD(Remove)(THIS_ LPSOUND pSound) PURE; STDMETHOD(Clear)(THIS) PURE; }; DECLARE_INTERFACE_(IAMSilentSound, IUnknown) { STDMETHOD(Init)(THIS_ LPWAVEFORMATEX lpwfx, DWORD dwSamples) PURE; }; DECLARE_INTERFACE_(IAMCacheFilter, IUnknown) { STDMETHOD(Init)(THIS_ LPSOUND pSound, LPCACHECONFIG lpCacheConfig) PURE; }; DECLARE_INTERFACE_(IAMTrimFilter, IUnknown) { STDMETHOD(Init)(THIS_ LPSOUND pSound) PURE; }; DECLARE_INTERFACE_(IAMStereoFilter, IUnknown) { STDMETHOD(Init)(THIS_ LPSOUND pSound) PURE; }; DECLARE_INTERFACE_(IAMBiasFilter, IUnknown) { STDMETHOD(Init)(THIS_ LPSOUND pSound) PURE; }; DECLARE_INTERFACE_(IAMClipFilter, IUnknown) { STDMETHOD(Init)(THIS_ LPSOUND pSoundSrc, DWORD dwStartPos, DWORD dwEndPos) PURE; }; DECLARE_INTERFACE_(IAMLoopFilter, IUnknown) { STDMETHOD(Init)(THIS_ LPSOUND pSoundSrc, DWORD dwLoops) PURE; }; DECLARE_INTERFACE_(IAMConvertFilter, IUnknown) { STDMETHOD(Init)(THIS_ LPSOUND pSoundSrc, LPWAVEFORMATEX lpwfxDest) PURE; }; DECLARE_INTERFACE_(IAMGainFilter, IUnknown) { STDMETHOD(Init)(THIS_ LPSOUND pSoundSrc, float flLeft, float flRight) PURE; STDMETHOD(SetGain)(THIS_ float flLeft, float flRight) PURE; }; DECLARE_INTERFACE_(IAMDelayFilter, IUnknown) { STDMETHOD(Init) (THIS_ LPSOUND pSoundSrc, DWORD dwDelay, DWORD dwReflectLeft, DWORD dwReflectRight, DWORD dwDuration, DWORD dwFlags) PURE; }; DECLARE_INTERFACE_(IAMGateFilter, IUnknown) { STDMETHOD(Init)(THIS_ LPSOUND pSoundSrc, float flDBGate) PURE; }; DECLARE_INTERFACE_(IAMMixFilter, IUnknown) { STDMETHOD(Init)(THIS_ LPSOUND pSoundSrcA, LPSOUND pSoundSrcB) PURE; }; DECLARE_INTERFACE_(IAMAppendFilter, IUnknown) { STDMETHOD(Init)(THIS_ LPSOUND pSoundSrcA, LPSOUND pSoundSrcB, BOOL fAlign) PURE; }; DECLARE_INTERFACE_(IAMFaderFilter, IUnknown) { STDMETHOD(Init)(THIS_ LPSOUND pSoundSrc, DWORD dwFadeTime, DWORD dwPosition) PURE; }; DECLARE_INTERFACE_(IAMDistortFilter, IUnknown) { STDMETHOD(Init)(THIS_ LPSOUND pSoundSrc, float flDBThreshold) PURE; }; /////////////////////////////////////////////////////////////////////////////////////////////////////// // // Prototypes // /////////////////////////////////////////////////////////////////////////////////////////////////////// HRESULT AM_CreateInstance(REFCLSID rclsid, IUnknown *pUnkOuter, REFIID riid, void **ppvObject); /////////////////////////////////////////////////////////////////////////////////////////////////////// // // AudioMan Helper Functions // /////////////////////////////////////////////////////////////////////////////////////////////////////// STDAPI AllocSoundFromStream(LPSOUND FAR *ppSound, LPSTREAM pStream, BOOL fSpooled, LPCACHECONFIG lpCacheConfig); STDAPI AllocSoundFromFile(LPSOUND FAR *ppSound, char FAR *szFileName, DWORD dwOffset, BOOL fSpooled, LPCACHECONFIG lpCacheConfig); STDAPI AllocSoundFromMemory(LPSOUND FAR *ppSound, LPBYTE lpFileData, DWORD dwSize); STDAPI AllocSilentSound(LPSOUND FAR *ppSound, LPWAVEFORMATEX lpwfx, DWORD dwSamples); STDAPI_(LPMIXER) GetAudioManMixer(void); STDAPI AllocClipFilter(LPSOUND FAR *ppSound, LPSOUND pSoundSrc, DWORD dwStartPos, DWORD dwEndPos); STDAPI AllocCacheFilter(LPSOUND FAR *ppSound, LPSOUND pSoundSrc, LPCACHECONFIG lpCacheConfig); STDAPI AllocTrimFilter(LPSOUND FAR *ppSound, LPSOUND pSoundSrc); STDAPI AllocStereoFilter(LPSOUND FAR *ppSound, LPSOUND pSoundSrc); STDAPI AllocBiasFilter(LPSOUND FAR *ppSound, LPSOUND pSoundSrc); STDAPI AllocLoopFilter(LPSOUND FAR *ppSound, LPSOUND pSoundSrc, DWORD dwLoops); STDAPI AllocConvertFilter(LPSOUND FAR *ppSound, LPSOUND pSoundSrc, LPWAVEFORMATEX lpwfx); STDAPI AllocGainFilter(LPSOUND FAR *ppSound, LPSOUND pSoundSrc, float flLeft, float flRight); STDAPI AllocDelayFilter(LPSOUND FAR *ppSound, LPSOUND pSoundSrc, DWORD dwDelay, DWORD dwReflectLeft, DWORD dwReflectRight, DWORD dwDuration, DWORD dwFlags); STDAPI AllocGateFilter(LPSOUND FAR *ppSound, LPSOUND pSoundSrc, float flDBGate); STDAPI AllocDistortFilter(LPSOUND FAR *ppSound, LPSOUND pSoundSrc, float flDBThreshold); STDAPI AllocMixFilter(LPSOUND FAR *ppSound, LPSOUND pSoundSrcA, LPSOUND pSoundSrcB); STDAPI AllocAppendFilter(LPSOUND FAR *ppSound, LPSOUND pSoundSrcA, LPSOUND pSoundSrcB, BOOL fAlign); STDAPI AllocFaderFilter(LPSOUND FAR *ppSound, LPSOUND pSoundSrc, DWORD dwFadeTime, DWORD dwPosition); STDAPI AllocScheduleFilter(LPSOUND FAR *ppSound, LPSCHEDULERCONFIG pSchedulerConfig); STDAPI AllocRandomizeFilter(LPSOUND FAR *ppSound, LPRANDOMIZECONFIG pRandomizeConfig); STDAPI AllocWaveOut(LPWAVEOUT FAR *ppWaveOut, LPMIXER pMixer); STDAPI_(DWORD) TimeToSamples(LPSOUND pSound, DWORD dwTime); STDAPI_(DWORD) SamplesToTime(LPSOUND pSound, DWORD dwSamples); STDAPI_(DWORD) SizeToSamples(LPSOUND pSound, DWORD dwSize); STDAPI_(DWORD) SamplesToSize(LPSOUND pSound, DWORD dwSamples); STDAPI SoundToStreamAsWave(LPSOUND pSound, LPSTREAM pStream, LPDWORD pcbFileSize); STDAPI SoundToFileAsWave(LPSOUND pSound, char FAR *pAbsFilePath); STDAPI_(int) DetectLeaks(BOOL fDebugOut, BOOL fMessageBox); #endif //_AUDIOMANPUBLICINTEFACES_ ================================================ FILE: kauai/src/base.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Base classes. Base class that all other classes are derived from and a base linked list class for implementing singly linked lists. ***************************************************************************/ #include "util.h" ASSERTNAME #ifdef DEBUG long vcactSuspendAssertValid = 0; long vcactAVSave = 0; long vcactAV = kswMax; /***************************************************************************** Debugging stuff to track leaked allocated objects. ******************************************************************************/ // Debugging object info. const long kclwStackDoi = 10; struct DOI { short swMagic; // magic number == kswMagicMem short cactRef; // for marking memory and asserting on unused objects PSZS pszsFile; // file NewObj appears in long lwLine; // line NewObj appears on long cbTot; // total size of the block, including the DOI long lwThread; // thread that allocated this long rglwStack[10]; // what we get from following the EBP/A6 chain DOI *pdoiNext; // singly linked list DOI **ppdoiPrev; }; #define kcbBaseDebug size(DOI) priv void _AssertDoi(DOI *pdoi, bool tLinked); inline DOI *_PdoiFromBase(void *pv) { return (DOI *)PvSubBv(pv, kcbBaseDebug); } inline BASE *_PbaseFromDoi(DOI *pdoi) { return (BASE *)PvAddBv(pdoi, kcbBaseDebug); } priv void _LinkDoi(DOI *pdoi, DOI **ppdoiFirst); priv void _UnlinkDoi(DOI *pdoi); DOI *_pdoiFirst; // Head of linked list of all allocated objects. DOI *_pdoiFirstRaw; // Head of linked list of raw newly allocated objects. inline void _Enter(void) { vmutxBase.Enter(); } inline void _Leave(void) { vmutxBase.Leave(); } #define klwMagicAllocatedBase 'ALOC' #define klwMagicNonAllocBase 'NOAL' #else //! DEBUG #define kcbBaseDebug 0 #endif //! DEBUG RTCLASS(BLL) /*************************************************************************** Returns the run-time class id (cls) of the class. ***************************************************************************/ long BASE::Cls(void) { return kclsBASE; } /*************************************************************************** Returns true iff cls is kclsBASE. ***************************************************************************/ bool BASE::FIs(long cls) { return kclsBASE == cls; } /*************************************************************************** Static method. Returns true iff cls is kclsBASE. ***************************************************************************/ bool BASE::FWouldBe(long cls) { return kclsBASE == cls; } /*************************************************************************** Constructor for a BASE object. Sets _cactRef to 1 and in debug sets the magic number to indicate whether the thing was allocated. ***************************************************************************/ BASE::BASE(void) { _cactRef = 1; #ifdef DEBUG DOI *pdoi = _pdoiFirstRaw; if (pvNil != pdoi) { // Note that we have to check _pdoiFirstRaw before entering the // mutx so we don't try to enter the mutx before it's been // initialized (during global object construction). _Enter(); // see if this is in the raw list - note that we have to refresh // _pdoiFirstRaw in case another thread grabbed it before we got // the critical section for (pdoi = _pdoiFirstRaw; pdoi != pvNil && this != _PbaseFromDoi(pdoi); pdoi = pdoi->pdoiNext) { _AssertDoi(pdoi, tYes); } if (pvNil != pdoi) { // this is us! _UnlinkDoi(pdoi); _LinkDoi(pdoi, &_pdoiFirst); _lwMagic = klwMagicAllocatedBase; AssertValid(0); } _Leave(); } if (pvNil == pdoi) { _lwMagic = klwMagicNonAllocBase; // don't call AssertValid here, since this may be during // global initialization (FAssertProc and/or AssertPvCb may not be // callable). } #endif // DEBUG } /*************************************************************************** Increments the reference count. ***************************************************************************/ void BASE::AddRef(void) { AssertThis(0); _cactRef++; // NOTE: some classes allow _cactRef == 0, so we can't assert _cactRef > 1 Assert(_cactRef > 0, "_cactRef not positive"); } /*************************************************************************** Decrement the reference count and delete it if the reference count goes to zero. ***************************************************************************/ void BASE::Release(void) { AssertThis(0); if (--_cactRef <= 0) { AssertThis(fobjAllocated); delete this; } } /*************************************************************************** Used to allocate all objects. Clears the block and in debug, adds magic number, reference count for marking and inserts in linked list of allocated objects for object leakage tracking. ***************************************************************************/ #ifdef DEBUG void *BASE::operator new(size_t cb, PSZS pszsFile, long lwLine) #else //! DEBUG void *BASE::operator new(size_t cb) #endif //! DEBUG { AssertVarMem(pszsFile); void *pv; #ifdef DEBUG // do failure simulation _Enter(); if (vdmglob.dmaglBase.FFail()) { _Leave(); PushErc(ercOomNew); return pvNil; } _Leave(); #endif // DEBUG #ifdef WIN if ((pv = (void *)GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, cb + kcbBaseDebug)) == pvNil) #else //! WIN if ((pv = ::operator new(cb + kcbBaseDebug)) == pvNil) #endif //! WIN PushErc(ercOomNew); else { #ifdef DEBUG _Enter(); DOI *pdoi = (DOI *)pv; pdoi->swMagic = kswMagicMem; pdoi->cactRef = 0; pdoi->pszsFile = pszsFile; pdoi->lwLine = lwLine; pdoi->cbTot = cb + kcbBaseDebug; pdoi->lwThread = LwThreadCur(); pdoi->ppdoiPrev = pvNil; _LinkDoi(pdoi, &_pdoiFirstRaw); pv = _PbaseFromDoi(pdoi); #ifdef WIN // follow the EBP chain.... long *plw; long ilw; __asm { mov plw,ebp } for (ilw = 0; ilw < kclwStackDoi; ilw++) { if (pvNil == plw || IsBadReadPtr(plw, 2 * size(long)) || *plw <= (long)plw) { pdoi->rglwStack[ilw] = 0; plw = pvNil; } else { pdoi->rglwStack[ilw] = plw[1]; plw = (long *)*plw; } } #endif // WIN // update statistics vdmglob.dmaglBase.Allocate(cb); _Leave(); #endif // DEBUG #ifndef WIN ClearPb(pv, cb); #endif //! WIN } return pv; } #if defined(DEBUG) || defined(WIN) /*************************************************************************** DEBUG : Unlink from linked list of allocated objects and free the memory. ***************************************************************************/ void BASE::operator delete(void *pv) { #ifdef DEBUG DOI *pdoi = _PdoiFromBase(pv); _UnlinkDoi(pdoi); // update statistics vdmglob.dmaglBase.Free(pdoi->cbTot - kcbBaseDebug); TrashPvCb(pdoi, pdoi->cbTot); pv = pdoi; #endif // DEBUG #ifdef WIN GlobalFree((HGLOBAL)pv); #else //! WIN ::delete (pv); #endif //! WIN } #ifdef DEBUG void BASE::operator delete(void *pv, schar *pszsFile, long lwLine) { BASE::operator delete(pv); } #endif // DEBUG #endif // DEBUG || WIN #ifdef DEBUG /*************************************************************************** Assert the this pointer is valid. ***************************************************************************/ void BASE::AssertValid(ulong grfobj) { AssertVarMem(this); AssertIn(_cactRef, 0, kcbMax); if (_lwMagic != klwMagicAllocatedBase) { Assert(!(grfobj & fobjAllocated), "should be allocated"); AssertVar(_lwMagic == klwMagicNonAllocBase, "_lwMagic wrong", &_lwMagic); AssertPvCb(this, size(BASE)); return; } Assert(!(grfobj & fobjNotAllocated), "should not be allocated"); _Enter(); DOI *pdoi = _PdoiFromBase(this); _AssertDoi(pdoi, tYes); _Leave(); } /*************************************************************************** If this objects has already been marked, just return. If not, call its MarkMem method. ***************************************************************************/ void BASE::MarkMemStub(void) { AssertThis(0); if (_lwMagic != klwMagicAllocatedBase) { AssertVar(_lwMagic == klwMagicNonAllocBase, "_lwMagic wrong", &_lwMagic); MarkMem(); return; } DOI *pdoi = _PdoiFromBase(this); if (pdoi->cactRef == 0 && pdoi->lwThread == LwThreadCur()) MarkMem(); } /*************************************************************************** Mark object. ***************************************************************************/ void BASE::MarkMem(void) { AssertValid(0); if (_lwMagic == klwMagicAllocatedBase) _PdoiFromBase(this)->cactRef++; } /*************************************************************************** Assert that a doi is valid and optionally linked or unlinked. ***************************************************************************/ void _AssertDoi(DOI *pdoi, bool tLinked) { _Enter(); AssertPvCb(pdoi, size(BASE) + kcbBaseDebug); AssertIn(pdoi->cbTot, size(BASE) + kcbBaseDebug, kcbMax); AssertPvCb(pdoi, pdoi->cbTot); AssertVar(pdoi->swMagic == kswMagicMem, "magic number has been hammered", &pdoi->swMagic); AssertVar(pdoi->cactRef >= 0, "negative reference count", &pdoi->cactRef); if (pvNil == pdoi->ppdoiPrev) Assert(tLinked != tYes, "should be linked"); else { Assert(tLinked != tNo, "should NOT be linked"); AssertVarMem(pdoi->ppdoiPrev); AssertVar(*pdoi->ppdoiPrev == pdoi, "*ppdoiPrev is wrong", pdoi->ppdoiPrev); if (pdoi->pdoiNext != pvNil) { AssertVarMem(pdoi->pdoiNext); AssertVar(pdoi->pdoiNext->ppdoiPrev == &pdoi->pdoiNext, "ppdoiPrev in next is wrong", &pdoi->pdoiNext->ppdoiPrev); } } _Leave(); } /*************************************************************************** Link object into list. ***************************************************************************/ priv void _LinkDoi(DOI *pdoi, DOI **ppdoiFirst) { _Enter(); _AssertDoi(pdoi, tNo); AssertVarMem(ppdoiFirst); if (*ppdoiFirst != pvNil) { _AssertDoi(*ppdoiFirst, tYes); (*ppdoiFirst)->ppdoiPrev = &pdoi->pdoiNext; } pdoi->pdoiNext = *ppdoiFirst; pdoi->ppdoiPrev = ppdoiFirst; *ppdoiFirst = pdoi; _AssertDoi(pdoi, tYes); _Leave(); } /*************************************************************************** Unlink object from list. ***************************************************************************/ priv void _UnlinkDoi(DOI *pdoi) { _Enter(); _AssertDoi(pdoi, tYes); *pdoi->ppdoiPrev = pdoi->pdoiNext; if (pvNil != pdoi->pdoiNext) { pdoi->pdoiNext->ppdoiPrev = pdoi->ppdoiPrev; _AssertDoi(pdoi->pdoiNext, tYes); } pdoi->ppdoiPrev = pvNil; pdoi->pdoiNext = pvNil; _AssertDoi(pdoi, tNo); _Leave(); } /*************************************************************************** Called if anyone tries to copy a class with NOCOPY(cls) in its declaration. ***************************************************************************/ void __AssertOnCopy(void) { Bug("Copying a non-copyable object"); } /*************************************************************************** Asserts on unmarked allocated (BASE) objects. ***************************************************************************/ void AssertUnmarkedObjs(void) { _Enter(); STN stn; SZS szs; BASE *pbase; DOI *pdoi; DOI *pdoiLast; bool fAssert; long cdoiLost = 0; long lwThread = LwThreadCur(); Assert(_pdoiFirstRaw == pvNil, "Raw list is not empty!"); // we want to traverse the list in the reverse order to report problems // find the end of the list and see if there are any lost blocks pdoiLast = pvNil; for (pdoi = _pdoiFirst; pvNil != pdoi; pdoi = pdoi->pdoiNext) { pdoiLast = pdoi; if (pdoi->cactRef == 0 && pdoi->lwThread == lwThread) cdoiLost++; } if (cdoiLost == 0) { // no lost blocks goto LDone; } stn.FFormatSz(PszLit("Total lost objects: %d. Press 'Debugger' for detail"), cdoiLost); stn.GetSzs(szs); fAssert = FAssertProc(__szsFile, __LINE__, szs, pvNil, 0); for (pdoi = pdoiLast;;) { pbase = _PbaseFromDoi(pdoi); AssertPo(pbase, fobjAllocated); if (pdoi->cactRef == 0 && pdoi->lwThread == lwThread) { if (fAssert) { stn.FFormatSz(PszLit("\nLost object: cls='%f', size=%d, ") PszLit("StackTrace=(use map file)"), pbase->Cls(), pdoi->cbTot - size(DOI)); stn.GetSzs(szs); if (FAssertProc(pdoi->pszsFile, pdoi->lwLine, szs, pdoi->rglwStack, kclwStackDoi * size(long))) { Debugger(); } } MarkMemObj(pbase); } if (pdoi->ppdoiPrev == &_pdoiFirst) break; // UUUUGGGGH! We don't have a pointer to the previous DOI, we // have a pointer to the previous DOI's pdoiNext! pdoi = (DOI *)PvSubBv(pdoi->ppdoiPrev, offset(DOI, pdoiNext)); } LDone: _Leave(); } /*************************************************************************** Clears all marks on allocated (BASE) objects. ***************************************************************************/ void UnmarkAllObjs(void) { _Enter(); BASE *pbase; DOI *pdoi; long lwThread = LwThreadCur(); Assert(_pdoiFirstRaw == pvNil, "Raw list is not empty!"); for (pdoi = _pdoiFirst; pvNil != pdoi; pdoi = pdoi->pdoiNext) { pbase = _PbaseFromDoi(pdoi); AssertPo(pbase, fobjAllocated); if (pdoi->lwThread == lwThread) pdoi->cactRef = 0; } _Leave(); } #endif // DEBUG /*************************************************************************** Linked list element constructor ***************************************************************************/ BLL::BLL(void) { _ppbllPrev = pvNil; _pbllNext = pvNil; } /*************************************************************************** Remove the element from the linked list ***************************************************************************/ BLL::~BLL(void) { // unlink the thing if (_ppbllPrev != pvNil) _Attach(pvNil); } /*************************************************************************** Remove the element from the linked list (if it's in one) and reattach it at ppbllPrev (if not pvNil). ***************************************************************************/ void BLL::_Attach(void *ppbllPrev) { AssertThis(0); PBLL *ppbll = (PBLL *)ppbllPrev; AssertNilOrVarMem(ppbll); // unlink the thing if (_ppbllPrev != pvNil) { Assert(*_ppbllPrev == this, "links corrupt"); if ((*_ppbllPrev = _pbllNext) != pvNil) { Assert(_pbllNext->_ppbllPrev == &_pbllNext, "links corrupt 2"); _pbllNext->_ppbllPrev = _ppbllPrev; } } // link the thing if ((_ppbllPrev = ppbll) == pvNil) { // not in a linked list _pbllNext = pvNil; return; } if ((_pbllNext = *ppbll) != pvNil) { Assert(_pbllNext->_ppbllPrev == ppbll, "links corrupt 3"); _pbllNext->_ppbllPrev = &_pbllNext; } *ppbll = this; } #ifdef DEBUG /*************************************************************************** Check the links. ***************************************************************************/ void BLL::AssertValid(ulong grf) { BLL_PAR::AssertValid(grf); if (_pbllNext != pvNil) { AssertVarMem(_pbllNext); Assert(_pbllNext->_ppbllPrev == &_pbllNext, "links corrupt"); } if (_ppbllPrev != pvNil) { AssertVarMem(_ppbllPrev); Assert(*_ppbllPrev == this, "links corrupt 2"); } } #endif // DEBUG ================================================ FILE: kauai/src/base.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Base classes. All classes should be derived from BASE. BLL is a base class for singly linked lists. ***************************************************************************/ #ifndef BASE_H #define BASE_H /*************************************************************************** Run-time class determination support. Each class, FOO, that uses this needs a constant, kclsFOO, defined somewhere (preferably with the class declaration) and needs FOO_PAR defined to be the class' parent class. kclsFOO should be 'FOO' if FOO is at most 4 characters long and should consist of a unique string of 4 lowercase characters if FOO is longer than 4 characters. Eg, kclsSCEG is 'SCEG', but kclsSTUDIO is 'stdo'. RTCLASS_DEC goes in the class definition. RTCLASS(FOO) goes in the .cpp file. ***************************************************************************/ #define RTCLASS_DEC \ public: \ static bool FWouldBe(long cls); \ \ public: \ virtual bool FIs(long cls); \ \ public: \ virtual long Cls(void); #define RTCLASS_INLINE(foo) \ public: \ static bool FWouldBe(long cls) \ { \ if (kcls##foo == cls) \ return fTrue; \ return foo##_PAR::FWouldBe(cls); \ } \ \ public: \ virtual bool FIs(long cls) \ { \ return FWouldBe(cls); \ } \ \ public: \ virtual long Cls(void) \ { \ return kcls##foo; \ } #define RTCLASS(foo) \ bool foo::FWouldBe(long cls) \ { \ if (kcls##foo == cls) \ return fTrue; \ return foo##_PAR::FWouldBe(cls); \ } \ bool foo::FIs(long cls) \ { \ return FWouldBe(cls); \ } \ long foo::Cls(void) \ { \ return kcls##foo; \ } /*************************************************************************** Debugging aids - for finding lost memory and asserting the validity of objects. ***************************************************************************/ #ifdef DEBUG void AssertUnmarkedObjs(void); #define MarkMemObj(po) \ if ((po) != pvNil) \ { \ (po)->MarkMemStub(); \ } \ else \ (void)0 #define NewObj new (__szsFile, __LINE__) void UnmarkAllObjs(void); const ulong fobjNil = 0x00000000L; const ulong fobjNotAllocated = 0x40000000L; const ulong fobjAllocated = 0x20000000L; const ulong fobjAssertFull = 0x10000000L; extern long vcactSuspendAssertValid; extern long vcactAVSave; extern long vcactAV; inline void SuspendAssertValid(void) { if (0 == vcactSuspendAssertValid++) { vcactAVSave = vcactAV; vcactAV = 0; } } inline void ResumeAssertValid(void) { if (0 == --vcactSuspendAssertValid) vcactAV = vcactAVSave; } #define AssertPo(po, grf) \ if ((po) != 0) \ { \ if (vcactAV > 0) \ { \ vcactAV--; \ (po)->AssertValid(grf); \ vcactAV++; \ } \ } \ else \ Bug("nil") #define AssertNilOrPo(po, grf) \ if ((po) != 0 && vcactAV > 0) \ { \ vcactAV--; \ (po)->AssertValid(grf); \ vcactAV++; \ } \ else \ (void)0 #define AssertBasePo(po, grf) \ if ((po) != 0) \ { \ if (vcactAV > 0) \ { \ vcactAV--; \ (po)->BASE::AssertValid(grf); \ vcactAV++; \ } \ } \ else \ Bug("nil") #define AssertThis(grf) \ if (vcactAV > 0) \ { \ vcactAV--; \ this->AssertValid(grf); \ vcactAV++; \ } \ else \ (void)0 #define AssertBaseThis(grf) \ if (vcactAV > 0) \ { \ vcactAV--; \ this->BASE::AssertValid(grf); \ vcactAV++; \ } \ else \ (void)0 #define MARKMEM \ public: \ virtual void MarkMem(void); #define ASSERT \ public: \ void AssertValid(ulong grf); #define NOCOPY(cls) \ private: \ cls &operator=(cls &robj) \ { \ __AssertOnCopy(); \ return *this; \ } void __AssertOnCopy(void); void MarkUtilMem(void); #else //! DEBUG #define SuspendAssertValid() #define ResumeAssertValid() #define AssertUnmarkedObjs() #define MarkMemObj(po) #define NewObj new #define UnmarkAllObjs() #define AssertPo(po, grf) #define AssertNilOrPo(po, grf) #define AssertBasePo(po, grf) #define AssertThis(grf) #define AssertBaseThis(grf) #define MARKMEM #define ASSERT #define NOCOPY(cls) #define MarkUtilMem() #endif //! DEBUG /*************************************************************************** Macro to release an object and clear the pointer to it. ***************************************************************************/ #define ReleasePpo(ppo) \ if (*(ppo) != pvNil) \ { \ (*(ppo))->Release(); \ *(ppo) = pvNil; \ } \ else \ (void)0 /*************************************************************************** Base class. Any instances allocated using NewObj (as opposed to being on the stack) are guaranteed to be zero'ed out. Also provides reference counting and debug lost memory checks. ***************************************************************************/ #define kclsBASE 'BASE' class BASE { RTCLASS_DEC MARKMEM ASSERT private: Debug(long _lwMagic;) protected : long _cactRef; public: #ifdef DEBUG void *operator new(size_t cb, schar *pszsFile, long lwLine); void operator delete(void *pv, schar *pszsFile, long lwLine); // To prevent warning C4291 void operator delete(void *pv); void MarkMemStub(void); #else //! DEBUG void *operator new(size_t cb); #ifdef WIN void operator delete(void *pv); #endif // WIN #endif //! DEBUG BASE(void); virtual ~BASE(void) { AssertThis(0); } virtual void AddRef(void); virtual void Release(void); long CactRef(void) { return _cactRef; } }; /*************************************************************************** Base linked list ***************************************************************************/ #define BLL_DEC(cls, rtn) \ public: \ class cls *rtn(void) \ { \ return (class cls *)BLL::PbllNext(); \ } typedef class BLL *PBLL; #define BLL_PAR BASE #define kclsBLL 'BLL' class BLL : public BLL_PAR { RTCLASS_DEC ASSERT private: PBLL _pbllNext; PBLL *_ppbllPrev; protected: void _Attach(void *ppbllPrev); public: BLL(void); ~BLL(void); PBLL PbllNext(void) { return _pbllNext; } }; #endif //! BASE_H ================================================ FILE: kauai/src/chcm.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Copyright (c) Microsoft Corporation Chunky file compiler and decompiler class implementations. ***************************************************************************/ #include "kidframe.h" //because we need scrcomg ASSERTNAME RTCLASS(CHCM) RTCLASS(CHLX) RTCLASS(CHDC) PSZ _mpertpsz[] = { PszLit("no error"), PszLit("Internal allocation error"), // ertOom PszLit("Can't open the given file"), // ertOpenFile PszLit("Can't read the given metafile"), // ertReadMeta PszLit("Number not in range for BYTE"), // ertRangeByte PszLit("Number not in range for SHORT"), // ertRangeShort PszLit("Invalid data before atomic chunk"), // ertBufData PszLit("Open parenthesis '(' expected"), // ertParenOpen PszLit("Unexpected end of file"), // ertEof PszLit("String expected"), // ertNeedString PszLit("Numeric value expected"), // ertNeedNumber PszLit("Unexpected Token"), // ertBadToken PszLit("Close parenthesis ')' expected"), // ertParenClose PszLit("Invalid CHUNK declaration"), // ertChunkHead PszLit("Duplicate CHUNK declaration"), // ertDupChunk PszLit("Invalid CHILD declaration"), // ertBodyChildHead PszLit("Child chunk doesn't exist"), // ertChildMissing PszLit("A cycle would be created by this adoption"), // ertCycle PszLit("Invalid PARENT declaration"), // ertBodyParentHead PszLit("Parent chunk doesn't exist"), // ertParentMissing PszLit("Alignment parameter out of range"), // ertBodyAlignRange PszLit("File name expected"), // ertBodyFile PszLit("ENDCHUNK expected"), // ertNeedEndChunk PszLit("Invalid GL or AL declaration"), // ertListHead PszLit("Invalid size for list entries"), // ertListEntrySize PszLit("Variable undefined"), // ertVarUndefined PszLit("Too much data for item"), // ertItemOverflow PszLit("Can't have a free item in a general collection"), // ertBadFree PszLit("Syntax error"), // ertSyntax PszLit("Invalid GG or AG declaration"), // ertGroupHead PszLit("Invalid size for fixed group data"), // ertGroupEntrySize PszLit("Invalid GST or AST declaration"), // ertGstHead PszLit("Invalid size for extra string table data"), // ertGstEntrySize PszLit("Script compilation failed"), // ertScript PszLit("Invalid ADOPT declaration"), // ertAdoptHead PszLit("CHUNK declaration expected"), // ertNeedChunk PszLit("Invalid BITMAP declaration"), // ertBodyBitmapHead PszLit("Can't read the given bitmap file"), // ertReadBitmap PszLit("Disassembling the script failed"), // ertBadScript PszLit("Can't read the given cursor file"), // ertReadCursor PszLit("Can't read given file as a packed file"), // ertPackedFile PszLit("Can't read the given midi file"), // ertReadMidi PszLit("Bad pack format"), // ertBadPackFmt PszLit("Illegal LONER primitive in SUBFILE"), // ertLonerInSub PszLit("Unterminated SUBFILE"), // ertNoEndSubFile }; /*************************************************************************** Constructor for the CHCM class. ***************************************************************************/ CHCM::CHCM(void) { _pglcsfc = pvNil; _pcfl = pvNil; _pchlx = pvNil; _pglckiLoner = pvNil; _pmsnkError = pvNil; _cactError = 0; AssertThis(0); } /*************************************************************************** Destructor for the CHCM class. ***************************************************************************/ CHCM::~CHCM(void) { if (pvNil != _pglcsfc) { CSFC csfc; while (_pglcsfc->FPop(&csfc)) { ReleasePpo(&_pcfl); _pcfl = csfc.pcfl; } ReleasePpo(&_pglcsfc); } ReleasePpo(&_pcfl); ReleasePpo(&_pchlx); ReleasePpo(&_pglckiLoner); } #ifdef DEBUG /*************************************************************************** Assert that the CHCM is a valid object. ***************************************************************************/ void CHCM::AssertValid(ulong grf) { CHCM_PAR::AssertValid(grf); AssertNilOrPo(_pcfl, 0); AssertPo(&_bsf, 0); AssertNilOrPo(_pchlx, 0); AssertNilOrPo(_pglckiLoner, 0); AssertNilOrPo(_pmsnkError, 0); } /*************************************************************************** Mark memory for the CHCM object. ***************************************************************************/ void CHCM::MarkMem(void) { AssertThis(0); CHCM_PAR::MarkMem(); MarkMemObj(_pglcsfc); MarkMemObj(_pcfl); MarkMemObj(&_bsf); MarkMemObj(_pchlx); MarkMemObj(_pglckiLoner); } #endif // DEBUG /*************************************************************************** Registers an error, prints error message with filename and line number. pszMessage may be nil. ***************************************************************************/ void CHCM::_Error(long ert, PSZ pszMessage) { AssertThis(0); AssertIn(ert, ertNil, ertLim); AssertPo(_pchlx, 0); STN stnFile; STN stn; _pchlx->GetStnFile(&stnFile); if (ertNil == ert) { stn.FFormatSz(pszMessage == pvNil ? PszLit("%s(%d:%d) : warning") : PszLit("%s(%d:%d) : warning : %z"), &stnFile, _pchlx->LwLine(), _pchlx->IchLine(), pszMessage); } else { _cactError++; stn.FFormatSz(pszMessage == pvNil ? PszLit("%s(%d:%d) : error : %z") : PszLit("%s(%d:%d) : error : %z : %z"), &stnFile, _pchlx->LwLine(), _pchlx->IchLine(), _mpertpsz[ert], pszMessage); } _pmsnkError->ReportLine(stn.Psz()); } /*************************************************************************** Checks that lw could be accepted under the current numerical mode. ***************************************************************************/ void CHCM::_GetRgbFromLw(long lw, byte *prgb) { AssertThis(0); AssertPvCb(prgb, size(long)); switch (_cbNum) { case size(byte): if (lw < -128 || lw > kbMax) _Error(ertRangeByte); prgb[0] = B0Lw(lw); break; case size(short): if ((lw < kswMin) || (lw > ksuMax)) _Error(ertRangeShort); *(short *)prgb = SwLow(lw); break; default: Assert(_cbNum == size(long), "invalid numerical mode"); _cbNum = size(long); *(long *)prgb = lw; break; } if (_bo != kboCur && _cbNum > 1) ReversePb(prgb, _cbNum); } /*************************************************************************** Checks if data is already in the buffer (and issues an error) for a non-buffer command such as metafile import. ***************************************************************************/ void CHCM::_ErrorOnData(PSZ pszPreceed) { AssertThis(0); AssertSz(pszPreceed); if (_bsf.IbMac() > 0) { // already data _Error(ertBufData, pszPreceed); // clear buffer _bsf.FReplace(pvNil, 0, 0, _bsf.IbMac()); } } /*************************************************************************** Get a token, automatically handling mode change commands and negatives. Return true iff *ptok is valid, not whether an error occurred. ***************************************************************************/ bool CHCM::_FGetCleanTok(TOK *ptok, bool fEofOk) { AssertThis(0); AssertVarMem(ptok); long cactNegate = 0; for (;;) { if (!_pchlx->FGetTokSkipSemi(ptok)) { if (cactNegate > 0) _Error(ertSyntax); if (!fEofOk) _Error(ertEof); return fFalse; } switch (ptok->tt) { default: if (cactNegate > 0) _Error(ertSyntax); return fTrue; case ttLong: if (cactNegate & 1) ptok->lw = -ptok->lw; return fTrue; case ttSub: cactNegate++; break; case ttModeStn: _sm = smStn; break; case ttModeStz: _sm = smStz; break; case ttModeSz: _sm = smSz; break; case ttModeSt: _sm = smSt; break; case ttModeByte: _cbNum = size(byte); break; case ttModeShort: _cbNum = size(short); break; case ttModeLong: _cbNum = size(long); break; case ttMacBo: _bo = MacWin(kboCur, kboOther); break; case ttWinBo: _bo = MacWin(kboOther, kboCur); break; case ttMacOsk: _osk = koskMac; break; case ttWinOsk: _osk = koskWin; break; } } } /*************************************************************************** Skip tokens until we encounter the given token type. ***************************************************************************/ void CHCM::_SkipPastTok(long tt) { AssertThis(0); TOK tok; while (_FGetCleanTok(&tok) && tt != tok.tt) ; } /*************************************************************************** Parse a parenthesized header from the source file. ***************************************************************************/ bool CHCM::_FParseParenHeader(PHP *prgphp, long cphpMax, long *pcphp) { AssertThis(0); AssertIn(cphpMax, 1, kcbMax); AssertPvCb(prgphp, LwMul(cphpMax, size(PHP))); AssertVarMem(pcphp); TOK tok; long iphp; if (!_pchlx->FGetTok(&tok)) { TrashVar(pcphp); return fFalse; } if (ttOpenParen != tok.tt) { _Error(ertParenOpen); goto LFail; } for (iphp = 0; iphp < cphpMax; iphp++) { AssertNilOrPo(prgphp[iphp].pstn, 0); if (!_FGetCleanTok(&tok)) { TrashVar(pcphp); return fFalse; } if (ttCloseParen == tok.tt) { // close paren = end of header *pcphp = iphp; // empty remaining strings for (; iphp < cphpMax; iphp++) { AssertNilOrPo(prgphp[iphp].pstn, 0); if (pvNil != prgphp[iphp].pstn) prgphp[iphp].pstn->SetNil(); } return fTrue; } if (ttLong == tok.tt) { // numerical value if (prgphp[iphp].pstn == pvNil) prgphp[iphp].lw = tok.lw; else { _Error(ertNeedString); prgphp[iphp].pstn->SetNil(); } } else if (ttString == tok.tt) { // string if (prgphp[iphp].pstn != pvNil) *prgphp[iphp].pstn = tok.stn; else { _Error(ertNeedNumber); prgphp[iphp].lw = 0; } } else { // invalid token in header _Error(ertBadToken); } } // get closing paren if (!_pchlx->FGetTok(&tok)) { TrashVar(pcphp); return fFalse; } if (ttCloseParen != tok.tt) { _Error(ertParenClose); LFail: _SkipPastTok(ttCloseParen); return fFalse; } *pcphp = cphpMax; return fTrue; } /*************************************************************************** Parse a chunk header from the source file. ***************************************************************************/ void CHCM::_ParseChunkHeader(CTG *pctg, CNO *pcno) { AssertThis(0); AssertVarMem(pctg); AssertVarMem(pcno); STN stnChunkName; PHP rgphp[3]; long cphp; ClearPb(rgphp, size(rgphp)); rgphp[2].pstn = &stnChunkName; if (!_FParseParenHeader(rgphp, 3, &cphp) || cphp < 2) { _Error(ertChunkHead); goto LFail; } *pctg = rgphp[0].lw; *pcno = rgphp[1].lw; // write empty chunk if (_pcfl->FFind(*pctg, *pcno)) { // duplicate chunk! _Error(ertDupChunk); LFail: _SkipPastTok(ttEndChunk); TrashVar(pctg); TrashVar(pcno); return; } // create the chunk and set its name if (!_pcfl->FPutPv(pvNil, 0, *pctg, *pcno) || stnChunkName.Cch() > 0 && !FError() && !_pcfl->FSetName(*pctg, *pcno, &stnChunkName)) { _Error(ertOom); } } /*************************************************************************** Append a string to the chunk data stream. ***************************************************************************/ void CHCM::_AppendString(PSTN pstnValue) { AssertThis(0); AssertPo(pstnValue, 0); void *pv; long cb; byte rgb[kcbMaxDataStn]; switch (_sm) { default: Bug("Invalid string mode"); // fall through case smStn: cb = pstnValue->CbData(); pstnValue->GetData(rgb); pv = rgb; break; case smStz: pv = pstnValue->Pstz(); cb = CchTotStz((PSTZ)pv) * size(achar); break; case smSz: pv = pstnValue->Psz(); cb = CchTotSz((PSZ)pv) * size(achar); break; case smSt: pv = pstnValue->Pst(); cb = CchTotSt((PST)pv) * size(achar); break; } if (!FError() && !_bsf.FReplace(pv, cb, _bsf.IbMac(), 0)) _Error(ertOom); } /*************************************************************************** Stores a numerical value in the chunk data stream. ***************************************************************************/ void CHCM::_AppendNumber(long lwValue) { AssertThis(0); byte rgb[size(long)]; _GetRgbFromLw(lwValue, rgb); if (!FError() && !_bsf.FReplace(rgb, _cbNum, _bsf.IbMac(), 0)) _Error(ertOom); } /*************************************************************************** Parse a child statement from the source file. ***************************************************************************/ void CHCM::_ParseBodyChild(CTG ctg, CNO cno) { AssertThis(0); CTG ctgChild; CNO cnoChild; CHID chid; PHP rgphp[3]; long cphp; ClearPb(rgphp, size(rgphp)); if (!_FParseParenHeader(rgphp, 3, &cphp) || cphp < 2) { _Error(ertBodyChildHead); return; } ctgChild = rgphp[0].lw; cnoChild = rgphp[1].lw; chid = rgphp[2].lw; // check if chunk exists if (!_pcfl->FFind(ctgChild, cnoChild)) { _Error(ertChildMissing); return; } // check if cycle would be created if (_pcfl->TIsDescendent(ctgChild, cnoChild, ctg, cno) != tNo) { _Error(ertCycle); return; } // do the adoption if (!FError() && !_pcfl->FAdoptChild(ctg, cno, ctgChild, cnoChild, chid, fTrue)) { _Error(ertOom); } } /*************************************************************************** Parse a parent statement from the source file. ***************************************************************************/ void CHCM::_ParseBodyParent(CTG ctg, CNO cno) { AssertThis(0); CTG ctgParent; CNO cnoParent; CHID chid; PHP rgphp[3]; long cphp; ClearPb(rgphp, size(rgphp)); if (!_FParseParenHeader(rgphp, 3, &cphp) || cphp < 2) { _Error(ertBodyParentHead); return; } ctgParent = rgphp[0].lw; cnoParent = rgphp[1].lw; chid = rgphp[2].lw; // check if chunk exists if (!_pcfl->FFind(ctgParent, cnoParent)) { _Error(ertParentMissing); return; } // check if cycle would be created if (_pcfl->TIsDescendent(ctg, cno, ctgParent, cnoParent) != tNo) { _Error(ertCycle); return; } // do the adoption if (!FError() && !_pcfl->FAdoptChild(ctgParent, cnoParent, ctg, cno, chid, fTrue)) { _Error(ertOom); } } /*************************************************************************** Parse an align statement from the source file. ***************************************************************************/ void CHCM::_ParseBodyAlign(void) { AssertThis(0); TOK tok; if (!_FGetCleanTok(&tok)) return; if (tok.tt != ttLong) { _Error(ertNeedNumber); return; } if (!FIn(tok.lw, kcbMinAlign, kcbMaxAlign + 1)) { STN stn; stn.FFormatSz(PszLit("legal range for alignment is (%d, %d)"), kcbMinAlign, kcbMaxAlign); _Error(ertBodyAlignRange, stn.Psz()); return; } if (!FError()) { // actually do the padding byte rgb[100]; long cb; long ibMac = _bsf.IbMac(); long ibMacNew = LwRoundAway(ibMac, tok.lw); AssertIn(ibMacNew, ibMac, ibMac + tok.lw); while ((ibMac = _bsf.IbMac()) < ibMacNew) { cb = LwMin(ibMacNew - ibMac, size(rgb)); ClearPb(rgb, cb); if (!_bsf.FReplace(rgb, cb, ibMac, 0)) { _Error(ertOom); return; } } } } /*************************************************************************** Parse a file statement from the source file. ***************************************************************************/ void CHCM::_ParseBodyFile(void) { AssertThis(0); FNI fni; FLO floSrc; if (!_pchlx->FGetPath(&fni)) { _Error(ertBodyFile); _SkipPastTok(ttEndChunk); return; } if (pvNil == (floSrc.pfil = FIL::PfilOpen(&fni))) { _Error(ertOpenFile); return; } floSrc.fp = 0; floSrc.cb = floSrc.pfil->FpMac(); if (!_bsf.FReplaceFlo(&floSrc, fFalse, _bsf.IbMac(), 0)) _Error(ertOom); ReleasePpo(&floSrc.pfil); } /*************************************************************************** Start a write operation. If fPack is true, allocate a temporary block. Otherwise, get the block on the CFL. The caller should write its data into the pblck, then call _FEndWrite to complete the operation. ***************************************************************************/ bool CHCM::_FPrepWrite(bool fPack, long cb, CTG ctg, CNO cno, PBLCK pblck) { AssertThis(0); AssertPo(pblck, 0); if (fPack) { pblck->Free(); Assert(!pblck->FPacked(), "why is block packed?"); return pblck->FSetTemp(cb); } return _pcfl->FPut(cb, ctg, cno, pblck); } /*************************************************************************** Balances a call to _FPrepWrite. ***************************************************************************/ bool CHCM::_FEndWrite(bool fPack, CTG ctg, CNO cno, PBLCK pblck) { AssertThis(0); AssertPo(pblck, fblckUnpacked); if (fPack) { // we don't fail if we can't compress it pblck->FPackData(); return _pcfl->FPutBlck(pblck, ctg, cno); } AssertPo(pblck, fblckFile); return fTrue; } /*************************************************************************** Parse a metafile import command from the source file. ***************************************************************************/ void CHCM::_ParseBodyMeta(bool fPack, CTG ctg, CNO cno) { AssertThis(0); FNI fni; BLCK blck; PPIC ppic; TOK tok; if (!_pchlx->FGetPath(&fni)) { _Error(ertBodyFile); _SkipPastTok(ttEndChunk); return; } if (pvNil == (ppic = PIC::PpicReadNative(&fni))) { _Error(ertReadMeta); return; } if (!FError()) { if (!_FPrepWrite(fPack, ppic->CbOnFile(), ctg, cno, &blck) || !ppic->FWrite(&blck) || !_FEndWrite(fPack, ctg, cno, &blck)) { _Error(ertOom); } } ReleasePpo(&ppic); if (_FGetCleanTok(&tok) && ttEndChunk != tok.tt) { _Error(ertNeedEndChunk); _SkipPastTok(ttEndChunk); } } /*************************************************************************** Parse a bitmap import command from the source file. ***************************************************************************/ void CHCM::_ParseBodyBitmap(bool fPack, bool fMask, CTG ctg, CNO cno) { AssertThis(0); FNI fni; BLCK blck; TOK tok; PHP rgphp[3]; long cphp; PMBMP pmbmp = pvNil; ClearPb(rgphp, size(rgphp)); if (!_FParseParenHeader(rgphp, 3, &cphp)) { _Error(ertBodyBitmapHead); return; } if (!_pchlx->FGetPath(&fni)) { _Error(ertBodyFile); goto LFail; } if (pvNil == (pmbmp = MBMP::PmbmpReadNative(&fni, (byte)rgphp[0].lw, rgphp[1].lw, rgphp[2].lw, fMask ? fmbmpMask : fmbmpNil))) { STN stn; fni.GetStnPath(&stn); _Error(ertReadBitmap, stn.Psz()); goto LFail; } if (!FError()) { if (!_FPrepWrite(fPack, pmbmp->CbOnFile(), ctg, cno, &blck) || !pmbmp->FWrite(&blck) || !_FEndWrite(fPack, ctg, cno, &blck)) { _Error(ertOom); } } ReleasePpo(&pmbmp); if (_FGetCleanTok(&tok) && ttEndChunk != tok.tt) { _Error(ertNeedEndChunk); LFail: _SkipPastTok(ttEndChunk); } } /*************************************************************************** Parse a palette import command from the source file. ***************************************************************************/ void CHCM::_ParseBodyPalette(bool fPack, CTG ctg, CNO cno) { AssertThis(0); FNI fni; BLCK blck; TOK tok; PGL pglclr; if (!_pchlx->FGetPath(&fni)) { _Error(ertBodyFile); goto LFail; } if (!FReadBitmap(&fni, pvNil, &pglclr, pvNil, pvNil, pvNil)) { _Error(ertReadBitmap); goto LFail; } if (!FError()) { if (!_FPrepWrite(fPack, pglclr->CbOnFile(), ctg, cno, &blck) || !pglclr->FWrite(&blck) || !_FEndWrite(fPack, ctg, cno, &blck)) { _Error(ertOom); } } ReleasePpo(&pglclr); if (_FGetCleanTok(&tok) && ttEndChunk != tok.tt) { _Error(ertNeedEndChunk); LFail: _SkipPastTok(ttEndChunk); } } /*************************************************************************** Parse a midi import command from the source file. ***************************************************************************/ void CHCM::_ParseBodyMidi(bool fPack, CTG ctg, CNO cno) { AssertThis(0); FNI fni; BLCK blck; TOK tok; PMIDS pmids; if (!_pchlx->FGetPath(&fni)) { _Error(ertBodyFile); goto LFail; } if (pvNil == (pmids = MIDS::PmidsReadNative(&fni))) { _Error(ertReadMidi); goto LFail; } if (!FError()) { if (!_FPrepWrite(fPack, pmids->CbOnFile(), ctg, cno, &blck) || !pmids->FWrite(&blck) || !_FEndWrite(fPack, ctg, cno, &blck)) { _Error(ertOom); } } ReleasePpo(&pmids); if (_FGetCleanTok(&tok) && ttEndChunk != tok.tt) { _Error(ertNeedEndChunk); LFail: _SkipPastTok(ttEndChunk); } } /*************************************************************************** Parse a cursor import command from the source file. ***************************************************************************/ void CHCM::_ParseBodyCursor(bool fPack, CTG ctg, CNO cno) { // These are for parsing a Windows cursor file struct CURDIR { byte dxp; byte dyp; byte bZero1; byte bZero2; short xp; short yp; long cb; long bv; }; struct CURH { long cbCurh; long dxp; long dyp; short swOne1; short swOne2; long lwZero1; long lwZero2; long lwZero3; long lwZero4; long lwZero5; long lwZero6; long lw1; long lw2; }; AssertThis(0); FNI fni; BLCK blck; FLO floSrc; TOK tok; long ccurdir, cbBits; CURF curf; short rgsw[3]; byte *prgb; CURDIR *pcurdir; CURH *pcurh; PGG pggcurf = pvNil; HQ hq = hqNil; floSrc.pfil = pvNil; if (!_pchlx->FGetPath(&fni)) { _Error(ertBodyFile); _SkipPastTok(ttEndChunk); return; } if (pvNil == (floSrc.pfil = FIL::PfilOpen(&fni))) { _Error(ertReadCursor); goto LFail; } floSrc.fp = 0; floSrc.cb = floSrc.pfil->FpMac(); if (floSrc.cb < size(rgsw) + size(CURDIR) + size(CURH) + 128 || !floSrc.FReadRgb(rgsw, size(rgsw), 0) || rgsw[0] != 0 || rgsw[1] != 2 || !FIn(ccurdir = rgsw[2], 1, (floSrc.cb - size(rgsw)) / size(CURDIR))) { _Error(ertReadCursor); goto LFail; } floSrc.cb -= size(rgsw); floSrc.fp = size(rgsw); if (!floSrc.FReadHq(&hq)) { _Error(ertOom); goto LFail; } ReleasePpo(&floSrc.pfil); prgb = (byte *)PvLockHq(hq); pcurdir = (CURDIR *)prgb; if (pvNil == (pggcurf = GG::PggNew(size(CURF), ccurdir))) { _Error(ertOom); goto LFail; } while (ccurdir-- > 0) { cbBits = pcurdir->dxp == 32 ? 256 : 128; if (pcurdir->dxp != pcurdir->dyp || pcurdir->dxp != 16 && pcurdir->dxp != 32 || pcurdir->bZero1 != 0 || pcurdir->bZero2 != 0 || pcurdir->cb != size(CURH) + cbBits || !FIn(pcurdir->bv -= size(rgsw), LwMul(rgsw[2], size(CURDIR)), floSrc.cb - pcurdir->cb + 1) || CbRoundToLong(pcurdir->bv) != pcurdir->bv) { _Error(ertReadCursor); goto LFail; } curf.curt = curtMonochrome; curf.xp = (byte)pcurdir->xp; curf.yp = (byte)pcurdir->yp; curf.dxp = pcurdir->dxp; curf.dyp = pcurdir->dyp; pcurh = (CURH *)PvAddBv(prgb, pcurdir->bv); if (pcurh->cbCurh != size(CURH) - 2 * size(long) || pcurh->dxp != pcurdir->dxp || pcurh->dyp != 2 * pcurdir->dyp || pcurh->swOne1 != 1 || pcurh->swOne2 != 1 || pcurh->lwZero1 != 0 || (pcurh->lwZero2 != 0 && pcurh->lwZero2 != pcurdir->cb - size(CURH)) || pcurh->lwZero3 != 0 || pcurh->lwZero4 != 0 || pcurh->lwZero5 != 0 || pcurh->lwZero6 != 0) { _Error(ertReadCursor); goto LFail; } // The bits are stored in upside down DIB order! ReversePb(pcurh + 1, pcurdir->cb - size(CURH)); SwapBytesRglw(pcurh + 1, (pcurdir->cb - size(CURH)) / size(long)); if (pcurdir->dxp == 16) { // need to consolidate the bits, because they are stored 4 bytes per // row (2 bytes wasted) instead of 2 bytes per row. long csw = 32; short *pswSrc, *pswDst; pswSrc = pswDst = (short *)(pcurh + 1); while (csw-- != 0) { *pswDst++ = *pswSrc++; pswSrc++; } } if (!pggcurf->FInsert(pggcurf->IvMac(), (long)curf.dxp * curf.dyp / 4, pcurh + 1, &curf)) { _Error(ertOom); goto LFail; } pcurdir++; } LFail: // success comes through here also ReleasePpo(&floSrc.pfil); if (hqNil != hq) { UnlockHq(hq); FreePhq(&hq); } if (!FError()) { if (!_FPrepWrite(fPack, pggcurf->CbOnFile(), ctg, cno, &blck) || !pggcurf->FWrite(&blck) || !_FEndWrite(fPack, ctg, cno, &blck)) { _Error(ertOom); } } ReleasePpo(&pggcurf); if (_FGetCleanTok(&tok) && ttEndChunk != tok.tt) { _Error(ertNeedEndChunk); _SkipPastTok(ttEndChunk); } } /*************************************************************************** Parse a data section from the source file. ptok should be pre-loaded with the first token and when _FParseData returns it contains the next token to be processed. Returns false iff no tokens were consumed. ***************************************************************************/ bool CHCM::_FParseData(PTOK ptok) { enum { psNil, psHaveLw, psHaveBOr, }; AssertThis(0); AssertVarMem(ptok); long cbNum; long lw; long cbNumPrev = _cbNum; long ps = psNil; bool fRet = fFalse; for (;;) { switch (ptok->tt) { case ttBOr: if (ps == psNil) return fRet; if (ps != psHaveLw) { ptok->tt = ttError; return fRet; } ps = psHaveBOr; break; case ttLong: if (ps == psHaveLw) { SwapVars(&_cbNum, &cbNumPrev); _AppendNumber(lw); _cbNum = cbNumPrev; ps = psNil; } if (ps == psNil) { lw = ptok->lw; cbNumPrev = _cbNum; ps = psHaveLw; } else { Assert(ps == psHaveBOr, 0); if (cbNumPrev != _cbNum) { ptok->tt = ttError; return fRet; } lw |= ptok->lw; ps = psHaveLw; } break; default: if (ps == psHaveBOr) { ptok->tt = ttError; return fRet; } if (ps == psHaveLw) { SwapVars(&_cbNum, &cbNumPrev); _AppendNumber(lw); _cbNum = cbNumPrev; ps = psNil; } switch (ptok->tt) { case ttString: _AppendString(&ptok->stn); break; case ttAlign: _ParseBodyAlign(); break; case ttFile: _ParseBodyFile(); break; case ttBo: // insert the current byte order cbNum = _cbNum; _cbNum = size(short); _AppendNumber(kboCur); _cbNum = cbNum; break; case ttOsk: // insert the current osk cbNum = _cbNum; _cbNum = size(short); _AppendNumber(_osk); _cbNum = cbNum; break; default: return fRet; } break; } fRet = fTrue; if (!_FGetCleanTok(ptok, fTrue)) { ptok->tt = ttError; return fRet; } } } /*************************************************************************** Parse a list structure from the source file. ***************************************************************************/ void CHCM::_ParseBodyList(bool fPack, bool fAl, CTG ctg, CNO cno) { AssertThis(0); TOK tok; PHP rgphp[1]; long cphp; long cbEntry, cb; byte *prgb; long iv, iiv; BLCK blck; PGLB pglb = pvNil; PGL pglivFree = pvNil; // get size of entry data ClearPb(rgphp, size(rgphp)); if (!_FParseParenHeader(rgphp, 1, &cphp) || cphp < 1) { _Error(ertListHead); _SkipPastTok(ttEndChunk); return; } if (!FIn(cbEntry = rgphp[0].lw, 1, kcbMax)) { _Error(ertListEntrySize); _SkipPastTok(ttEndChunk); return; } pglb = fAl ? (PGLB)AL::PalNew(cbEntry) : (PGLB)GL::PglNew(cbEntry); if (pvNil == pglb) { _Error(ertOom); _SkipPastTok(ttEndChunk); return; } pglb->SetMinGrow(20); // prefetch a token if (!_FGetCleanTok(&tok)) goto LFail; for (;;) { // empty the BSF _bsf.FReplace(pvNil, 0, 0, _bsf.IbMac()); if (ttFree == tok.tt) { if (!fAl) _Error(ertBadFree); else if (!FError()) { iv = pglb->IvMac(); if (pvNil == pglivFree && pvNil == (pglivFree = GL::PglNew(size(long))) || !pglivFree->FAdd(&iv)) { _Error(ertOom); } } if (!_FGetCleanTok(&tok)) goto LFail; } else if (ttItem != tok.tt) break; else { if (!_FGetCleanTok(&tok)) goto LFail; _FParseData(&tok); } if ((cb = _bsf.IbMac()) > cbEntry) { _Error(ertItemOverflow); continue; } AssertIn(cb, 0, cbEntry + 1); if (FError()) continue; if (!pglb->FAdd(pvNil, &iv)) _Error(ertOom); else { Assert(iv == pglb->IvMac() - 1, "what?"); prgb = (byte *)pglb->PvLock(iv); if (cb > 0) _bsf.FetchRgb(0, cb, prgb); if (cb < cbEntry) ClearPb(prgb + cb, cbEntry - cb); pglb->Unlock(); } } if (ttEndChunk != tok.tt) { _Error(ertNeedEndChunk); _SkipPastTok(ttEndChunk); } if (FError()) goto LFail; if (pvNil != pglivFree) { Assert(fAl, "why did GL have free entries?"); for (iiv = pglivFree->IvMac(); iiv-- > 0;) { pglivFree->Get(iiv, &iv); AssertIn(iv, 0, pglb->IvMac()); pglb->Delete(iv); } } // write list to disk if (!_FPrepWrite(fPack, pglb->CbOnFile(), ctg, cno, &blck) || !pglb->FWrite(&blck, _bo, _osk) || !_FEndWrite(fPack, ctg, cno, &blck)) { _Error(ertOom); } LFail: ReleasePpo(&pglb); ReleasePpo(&pglivFree); } /*************************************************************************** Parse a group structure from the source file. ***************************************************************************/ void CHCM::_ParseBodyGroup(bool fPack, bool fAg, CTG ctg, CNO cno) { AssertThis(0); TOK tok; PHP rgphp[1]; long cphp; long cbFixed, cb; byte *prgb; long iv, iiv; BLCK blck; bool fFree; PGGB pggb = pvNil; PGL pglivFree = pvNil; // get size of fixed data ClearPb(rgphp, size(rgphp)); if (!_FParseParenHeader(rgphp, 1, &cphp) || cphp < 1) { _Error(ertGroupHead); _SkipPastTok(ttEndChunk); return; } if (!FIn(cbFixed = rgphp[0].lw, 0, kcbMax)) { _Error(ertGroupEntrySize); _SkipPastTok(ttEndChunk); return; } pggb = fAg ? (PGGB)AG::PagNew(cbFixed) : (PGGB)GG::PggNew(cbFixed); if (pvNil == pggb) { _Error(ertOom); _SkipPastTok(ttEndChunk); return; } pggb->SetMinGrow(10, 100); // prefetch a token if (!_FGetCleanTok(&tok)) goto LFail; for (;;) { // empty the BSF _bsf.FReplace(pvNil, 0, 0, _bsf.IbMac()); fFree = (ttFree == tok.tt); if (fFree) { if (!fAg) _Error(ertBadFree); else if (!FError()) { iv = pggb->IvMac(); if (pvNil == pglivFree && pvNil == (pglivFree = GL::PglNew(size(long))) || !pglivFree->FAdd(&iv)) { _Error(ertOom); } } if (!_FGetCleanTok(&tok)) goto LFail; } else if (ttItem != tok.tt) break; else { // get the fixed part if (!_FGetCleanTok(&tok)) goto LFail; _FParseData(&tok); } if ((cb = _bsf.IbMac()) > cbFixed) { _Error(ertItemOverflow); cb = cbFixed; } AssertIn(cb, 0, cbFixed + 1); if (!FError()) { // add the item if (!pggb->FAdd(pvNil, &iv)) _Error(ertOom); else { Assert(iv == pggb->IvMac() - 1, "what?"); prgb = (byte *)pggb->PvFixedLock(iv); if (cb > 0) _bsf.FetchRgb(0, cb, prgb); if (cb < cbFixed) ClearPb(prgb + cb, cbFixed - cb); pggb->Unlock(); } } // check for a variable part if (fFree || ttVar != tok.tt) continue; if (!_FGetCleanTok(&tok)) goto LFail; _bsf.FReplace(pvNil, 0, 0, _bsf.IbMac()); _FParseData(&tok); if (FError() || (cb = _bsf.IbMac()) <= 0) continue; Assert(iv == pggb->IvMac() - 1, "iv wrong"); if (!pggb->FInsertRgb(iv, 0, cb, pvNil)) _Error(ertOom); else { prgb = (byte *)pggb->PvLock(iv); _bsf.FetchRgb(0, cb, prgb); pggb->Unlock(); } } if (ttEndChunk != tok.tt) { _Error(ertNeedEndChunk); _SkipPastTok(ttEndChunk); } if (FError()) goto LFail; if (pvNil != pglivFree) { Assert(fAg, "why did GG have free entries?"); for (iiv = pglivFree->IvMac(); iiv-- > 0;) { pglivFree->Get(iiv, &iv); AssertIn(iv, 0, pggb->IvMac()); pggb->Delete(iv); } } // write list to disk if (!_FPrepWrite(fPack, pggb->CbOnFile(), ctg, cno, &blck) || !pggb->FWrite(&blck, _bo, _osk) || !_FEndWrite(fPack, ctg, cno, &blck)) { _Error(ertOom); } LFail: ReleasePpo(&pggb); ReleasePpo(&pglivFree); } /*************************************************************************** Parse a string table from the source file. ***************************************************************************/ void CHCM::_ParseBodyStringTable(bool fPack, bool fAst, CTG ctg, CNO cno) { AssertThis(0); TOK tok; PHP rgphp[1]; long cphp; long cbExtra, cb; long iv, iiv; STN stn; BLCK blck; bool fFree; PGSTB pgstb = pvNil; PGL pglivFree = pvNil; void *pvExtra = pvNil; // get size of attached data ClearPb(rgphp, size(rgphp)); if (!_FParseParenHeader(rgphp, 1, &cphp) || cphp < 1) { _Error(ertGstHead); _SkipPastTok(ttEndChunk); return; } if (!FIn(cbExtra = rgphp[0].lw, 0, kcbMax) || cbExtra % size(long) != 0) { _Error(ertGstEntrySize); _SkipPastTok(ttEndChunk); return; } pgstb = fAst ? (PGSTB)AST::PastNew(cbExtra) : (PGSTB)GST::PgstNew(cbExtra); if (pvNil == pgstb || cbExtra > 0 && !FAllocPv(&pvExtra, cbExtra, fmemNil, mprNormal)) { _Error(ertOom); _SkipPastTok(ttEndChunk); goto LFail; } pgstb->SetMinGrow(10, 100); // prefetch a token if (!_FGetCleanTok(&tok)) goto LFail; for (;;) { fFree = (ttFree == tok.tt); if (fFree) { if (!fAst) _Error(ertBadFree); else if (!FError()) { iv = pgstb->IvMac(); if (pvNil == pglivFree && pvNil == (pglivFree = GL::PglNew(size(long))) || !pglivFree->FAdd(&iv)) { _Error(ertOom); } } if (!_FGetCleanTok(&tok)) goto LFail; stn.SetNil(); } else if (ttItem != tok.tt) break; else { if (!_FGetCleanTok(&tok)) goto LFail; if (ttString != tok.tt) { _Error(ertNeedString); _SkipPastTok(ttEndChunk); goto LFail; } stn = tok.stn; if (!_FGetCleanTok(&tok)) goto LFail; } if (!FError() && !pgstb->FAddStn(&stn, pvNil, &iv)) _Error(ertOom); if (cbExtra <= 0 || fFree) continue; // empty the BSF and get the extra data _bsf.FReplace(pvNil, 0, 0, _bsf.IbMac()); _FParseData(&tok); if ((cb = _bsf.IbMac()) > cbExtra) { _Error(ertItemOverflow); cb = cbExtra; } AssertIn(cb, 0, cbExtra + 1); if (!FError()) { // add the item Assert(iv == pgstb->IvMac() - 1, "what?"); if (cb > 0) _bsf.FetchRgb(0, cb, pvExtra); if (cb < cbExtra) ClearPb(PvAddBv(pvExtra, cb), cbExtra - cb); pgstb->PutExtra(iv, pvExtra); } } if (ttEndChunk != tok.tt) { _Error(ertNeedEndChunk); _SkipPastTok(ttEndChunk); } if (FError()) goto LFail; if (pvNil != pglivFree) { Assert(fAst, "why did GST have free entries?"); for (iiv = pglivFree->IvMac(); iiv-- > 0;) { pglivFree->Get(iiv, &iv); AssertIn(iv, 0, pgstb->IvMac()); pgstb->Delete(iv); } } // write list to disk if (!_FPrepWrite(fPack, pgstb->CbOnFile(), ctg, cno, &blck) || !pgstb->FWrite(&blck, _bo, _osk) || !_FEndWrite(fPack, ctg, cno, &blck)) { _Error(ertOom); } LFail: ReleasePpo(&pgstb); ReleasePpo(&pglivFree); FreePpv(&pvExtra); } /*************************************************************************** Parse a script from the source file. ***************************************************************************/ void CHCM::_ParseBodyScript(bool fPack, bool fInfix, CTG ctg, CNO cno) { AssertThis(0); SCCG sccg; PSCPT pscpt; if (pvNil == (pscpt = sccg.PscptCompileLex(_pchlx, fInfix, _pmsnkError, ttEndChunk))) { _Error(ertScript); return; } if (!pscpt->FSaveToChunk(_pcfl, ctg, cno, fPack)) _Error(ertOom); ReleasePpo(&pscpt); } /*************************************************************************** Parse a script from the source file. ***************************************************************************/ void CHCM::_ParseBodyPackedFile(bool *pfPacked) { AssertThis(0); long lw, lwSwapped; TOK tok; _ParseBodyFile(); if (_bsf.IbMac() < size(long)) { _Error(ertPackedFile, PszLit("bad packed file")); _SkipPastTok(ttEndChunk); return; } _bsf.FetchRgb(0, size(long), &lw); lwSwapped = lw; SwapBytesRglw(&lwSwapped, 1); if (lw == klwSigPackedFile || lwSwapped == klwSigPackedFile) *pfPacked = fTrue; else if (lw == klwSigUnpackedFile || lwSwapped == klwSigUnpackedFile) *pfPacked = fFalse; else { _Error(ertPackedFile, PszLit("not a packed file")); _SkipPastTok(ttEndChunk); return; } _bsf.FReplace(pvNil, 0, 0, size(long)); if (!_FGetCleanTok(&tok) || ttEndChunk != tok.tt) { _Error(ertNeedEndChunk); _SkipPastTok(ttEndChunk); } } /*************************************************************************** Start a sub file. ***************************************************************************/ void CHCM::_StartSubFile(bool fPack, CTG ctg, CNO cno) { AssertThis(0); CSFC csfc; if (pvNil == _pglcsfc && pvNil == (_pglcsfc = GL::PglNew(size(CSFC)))) goto LFail; csfc.pcfl = _pcfl; csfc.ctg = ctg; csfc.cno = cno; csfc.fPack = FPure(fPack); if (!_pglcsfc->FPush(&csfc)) goto LFail; if (pvNil == (_pcfl = CFL::PcflCreateTemp())) { _pglcsfc->FPop(); _pcfl = csfc.pcfl; LFail: _Error(ertOom); } } /*************************************************************************** End a sub file. ***************************************************************************/ void CHCM::_EndSubFile(void) { AssertThis(0); CSFC csfc; if (pvNil == _pglcsfc || !_pglcsfc->FPop(&csfc)) { _Error(ertSyntax); return; } AssertPo(csfc.pcfl, 0); if (!FError()) { long icki; CKI cki; long cbTot, cbT; FP fpDst; PFIL pfilDst = pvNil; bool fRet = fFalse; // get the size of the data cbTot = 0; for (icki = 0; _pcfl->FGetCki(icki, &cki); icki++) { if (_pcfl->CckiRef(cki.ctg, cki.cno) > 0) continue; if (!_pcfl->FWriteChunkTree(cki.ctg, cki.cno, pvNil, 0, &cbT)) goto LFail; cbTot += cbT; } // setup pfilDst and fpDst for writing the chunk trees if (csfc.fPack) { pfilDst = FIL::PfilCreateTemp(); fpDst = 0; } else { FLO floDst; // resize the chunk if (!csfc.pcfl->FPut(cbTot, csfc.ctg, csfc.cno)) goto LFail; csfc.pcfl->FFindFlo(csfc.ctg, csfc.cno, &floDst); pfilDst = floDst.pfil; pfilDst->AddRef(); fpDst = floDst.fp; } // write the data to (pfilDst, fpDst) for (icki = 0; _pcfl->FGetCki(icki, &cki); icki++) { if (_pcfl->CckiRef(cki.ctg, cki.cno) > 0) continue; if (!_pcfl->FWriteChunkTree(cki.ctg, cki.cno, pfilDst, fpDst, &cbT)) goto LFail; fpDst += cbT; Debug(cbTot -= cbT;) } Assert(cbTot == 0, "FWriteChunkTree messed up!"); if (csfc.fPack) { BLCK blck(pfilDst, 0, fpDst); // pack the data and put it in the chunk. blck.FPackData(); if (!csfc.pcfl->FPutBlck(&blck, csfc.ctg, csfc.cno)) goto LFail; } csfc.pcfl->SetForest(csfc.ctg, csfc.cno, fTrue); fRet = fTrue; LFail: if (!fRet) _Error(ertOom); ReleasePpo(&pfilDst); } ReleasePpo(&_pcfl); _pcfl = csfc.pcfl; } /*************************************************************************** Parse a PACKFMT command, which is used to specify the packing format to use. ***************************************************************************/ void CHCM::_ParsePackFmt(void) { AssertThis(0); PHP rgphp[1]; long cphp; long cfmt; // get the format ClearPb(rgphp, size(rgphp)); if (!_FParseParenHeader(rgphp, 1, &cphp) || cphp < 1) { _Error(ertSyntax); return; } cfmt = rgphp[0].lw; if (!vpcodmUtil->FCanDo(cfmt, fTrue)) _Error(ertBadPackFmt); else vpcodmUtil->SetCfmtDefault(cfmt); } /*************************************************************************** Parse the chunk body from the source file. ***************************************************************************/ void CHCM::_ParseChunkBody(CTG ctg, CNO cno) { AssertThis(0); TOK tok; BLCK blck; CKI cki; bool fFetch; bool fPack, fPrePacked; // empty the BSF _bsf.FReplace(pvNil, 0, 0, _bsf.IbMac()); fFetch = fTrue; fPack = fPrePacked = fFalse; for (;;) { if (fFetch && !_FGetCleanTok(&tok)) return; fFetch = fTrue; switch (tok.tt) { default: if (!_FParseData(&tok)) { _Error(ertBadToken); _SkipPastTok(ttEndChunk); return; } // don't fetch next token fFetch = fFalse; break; case ttChild: _ParseBodyChild(ctg, cno); break; case ttParent: _ParseBodyParent(ctg, cno); break; case ttLoner: if (pvNil != _pglcsfc && 0 < _pglcsfc->IvMac()) { _Error(ertLonerInSub); break; } cki.ctg = ctg; cki.cno = cno; if (pvNil == _pglckiLoner && pvNil == (_pglckiLoner = GL::PglNew(size(CKI))) || !_pglckiLoner->FPush(&cki)) { _Error(ertOom); } break; case ttPrePacked: fPrePacked = fTrue; break; case ttPack: fPack = fTrue; break; case ttPackFmt: _ParsePackFmt(); break; // We're done after all the cases below case ttPackedFile: fPack = fFalse; _ErrorOnData(PszLit("Packed File")); _ParseBodyPackedFile(&fPrePacked); // fall thru case ttEndChunk: if (!FError()) { if (!_FPrepWrite(fPack, _bsf.IbMac(), ctg, cno, &blck) || !_bsf.FWriteRgb(&blck) || !_FEndWrite(fPack, ctg, cno, &blck)) { _Error(ertOom); } } _bsf.FReplace(pvNil, 0, 0, _bsf.IbMac()); if (!FError() && fPrePacked) _pcfl->SetPacked(ctg, cno, fTrue); return; case ttMeta: _ErrorOnData(PszLit("Metafile")); _ParseBodyMeta(fPack, ctg, cno); return; case ttBitmap: case ttMask: _ErrorOnData(PszLit("Bitmap")); _ParseBodyBitmap(fPack, ttMask == tok.tt, ctg, cno); return; case ttPalette: _ErrorOnData(PszLit("Palette")); _ParseBodyPalette(fPack, ctg, cno); return; case ttMidi: _ErrorOnData(PszLit("Midi")); _ParseBodyMidi(fPack, ctg, cno); return; case ttCursor: _ErrorOnData(PszLit("Cursor")); _ParseBodyCursor(fPack, ctg, cno); return; case ttAl: case ttGl: _ErrorOnData(PszLit("List")); _ParseBodyList(fPack, ttAl == tok.tt, ctg, cno); return; case ttAg: case ttGg: _ErrorOnData(PszLit("Group")); _ParseBodyGroup(fPack, ttAg == tok.tt, ctg, cno); return; case ttAst: case ttGst: _ErrorOnData(PszLit("String Table")); _ParseBodyStringTable(fPack, ttAst == tok.tt, ctg, cno); return; case ttScript: case ttScriptP: _ErrorOnData(PszLit("Script")); _ParseBodyScript(fPack, ttScript == tok.tt, ctg, cno); return; case ttSubFile: _ErrorOnData(PszLit("Sub File")); _StartSubFile(fPack, ctg, cno); return; } } } /*************************************************************************** Parse an adopt parenthesized header from the source file. ***************************************************************************/ void CHCM::_ParseAdopt(void) { AssertThis(0); CTG ctgParent, ctgChild; CNO cnoParent, cnoChild; CHID chid; PHP rgphp[5]; long cphp; ClearPb(rgphp, size(rgphp)); if (!_FParseParenHeader(rgphp, 5, &cphp) || cphp < 4) { _Error(ertAdoptHead); return; } ctgParent = rgphp[0].lw; cnoParent = rgphp[1].lw; ctgChild = rgphp[2].lw; cnoChild = rgphp[3].lw; chid = rgphp[4].lw; // check if parent exists if (!_pcfl->FFind(ctgParent, cnoParent)) { _Error(ertParentMissing); return; } // check if child exists if (!_pcfl->FFind(ctgChild, cnoChild)) { _Error(ertChildMissing); return; } // check if cycle would be created if (_pcfl->TIsDescendent(ctgChild, cnoChild, ctgParent, cnoParent) != tNo) _Error(ertCycle); else if (!FError() && !_pcfl->FAdoptChild(ctgParent, cnoParent, ctgChild, cnoChild, chid, fTrue)) { _Error(ertOom); } } /*************************************************************************** Compile the given file. ***************************************************************************/ PCFL CHCM::PcflCompile(PFNI pfniSrc, PFNI pfniDst, PMSNK pmsnk) { AssertThis(0); AssertPo(pfniSrc, ffniFile); AssertPo(pfniDst, ffniFile); AssertPo(pmsnk, 0); BSF bsfSrc; STN stnFile; FLO flo; bool fRet; if (pvNil == (flo.pfil = FIL::PfilOpen(pfniSrc))) { pmsnk->ReportLine(PszLit("opening source file failed")); return pvNil; } flo.fp = 0; flo.cb = flo.pfil->FpMac(); fRet = flo.FTranslate(oskNil) && bsfSrc.FReplaceFlo(&flo, fFalse, 0, 0); ReleasePpo(&flo.pfil); if (!fRet) return pvNil; pfniSrc->GetStnPath(&stnFile); return PcflCompile(&bsfSrc, &stnFile, pfniDst, pmsnk); } /*************************************************************************** Compile the given BSF, using initial file name given by pstnFile. ***************************************************************************/ PCFL CHCM::PcflCompile(PBSF pbsfSrc, PSTN pstnFile, PFNI pfniDst, PMSNK pmsnk) { AssertThis(0); AssertPo(pbsfSrc, ffniFile); AssertPo(pstnFile, 0); AssertPo(pfniDst, ffniFile); AssertPo(pmsnk, 0); TOK tok; CTG ctg; CNO cno; PCFL pcfl; bool fReportBadTok; if (pvNil == (_pchlx = NewObj CHLX(pbsfSrc, pstnFile))) { pmsnk->ReportLine(PszLit("Memory failure")); return pvNil; } if (pvNil == (_pcfl = CFL::PcflCreate(pfniDst, fcflWriteEnable))) { pmsnk->ReportLine(PszLit("Couldn't create destination file")); ReleasePpo(&_pchlx); return pvNil; } _pmsnkError = pmsnk; _sm = smStz; _cbNum = size(long); _bo = kboCur; _osk = koskCur; fReportBadTok = fTrue; while (_FGetCleanTok(&tok, fTrue)) { switch (tok.tt) { case ttChunk: _ParseChunkHeader(&ctg, &cno); _ParseChunkBody(ctg, cno); fReportBadTok = fTrue; break; case ttEndChunk: // ending a sub file _EndSubFile(); fReportBadTok = fTrue; break; case ttAdopt: _ParseAdopt(); fReportBadTok = fTrue; break; case ttPackFmt: _ParsePackFmt(); fReportBadTok = fTrue; break; default: if (fReportBadTok) { _Error(ertNeedChunk); fReportBadTok = fFalse; } break; } if (_cactError > 100) { pmsnk->ReportLine(PszLit("Too many errors - compilation aborted")); break; } } // empty the BSF _bsf.FReplace(pvNil, 0, 0, _bsf.IbMac()); // make sure we're not in any subfiles if (pvNil != _pglcsfc && _pglcsfc->IvMac() > 0) { CSFC csfc; _Error(ertNoEndSubFile); while (_pglcsfc->FPop(&csfc)) { ReleasePpo(&_pcfl); _pcfl = csfc.pcfl; } } if (!FError() && pvNil != _pglckiLoner) { CKI cki; long icki; for (icki = _pglckiLoner->IvMac(); icki-- > 0;) { _pglckiLoner->Get(icki, &cki); _pcfl->SetLoner(cki.ctg, cki.cno, fTrue); } } if (!FError() && !_pcfl->FSave(kctgChkCmp, pvNil)) _Error(ertOom); if (FError()) { ReleasePpo(&_pcfl); pfniDst->FDelete(); } ReleasePpo(&_pchlx); ReleasePpo(&_pglckiLoner); pcfl = _pcfl; _pcfl = pvNil; _pmsnkError = pvNil; return pcfl; } /*************************************************************************** Keyword-tokentype mappings ***************************************************************************/ static KEYTT _rgkeytt[] = { PszLit("ITEM"), ttItem, PszLit("FREE"), ttFree, PszLit("VAR"), ttVar, PszLit("BYTE"), ttModeByte, PszLit("SHORT"), ttModeShort, PszLit("LONG"), ttModeLong, PszLit("CHUNK"), ttChunk, PszLit("ENDCHUNK"), ttEndChunk, PszLit("ADOPT"), ttAdopt, PszLit("CHILD"), ttChild, PszLit("PARENT"), ttParent, PszLit("BO"), ttBo, PszLit("OSK"), ttOsk, PszLit("STN"), ttModeStn, PszLit("STZ"), ttModeStz, PszLit("SZ"), ttModeSz, PszLit("ST"), ttModeSt, PszLit("ALIGN"), ttAlign, PszLit("FILE"), ttFile, PszLit("PACKEDFILE"), ttPackedFile, PszLit("META"), ttMeta, PszLit("BITMAP"), ttBitmap, PszLit("MASK"), ttMask, PszLit("MIDI"), ttMidi, PszLit("SCRIPT"), ttScript, PszLit("SCRIPTPF"), ttScriptP, PszLit("GL"), ttGl, PszLit("AL"), ttAl, PszLit("GG"), ttGg, PszLit("AG"), ttAg, PszLit("GST"), ttGst, PszLit("AST"), ttAst, PszLit("MACBO"), ttMacBo, PszLit("WINBO"), ttWinBo, PszLit("MACOSK"), ttMacOsk, PszLit("WINOSK"), ttWinOsk, PszLit("LONER"), ttLoner, PszLit("CURSOR"), ttCursor, PszLit("PALETTE"), ttPalette, PszLit("PREPACKED"), ttPrePacked, PszLit("PACK"), ttPack, PszLit("PACKFMT"), ttPackFmt, PszLit("SUBFILE"), ttSubFile, }; #define kckeytt (size(_rgkeytt) / size(_rgkeytt[0])) /*************************************************************************** Constructor for the chunky compiler lexer. ***************************************************************************/ CHLX::CHLX(PBSF pbsf, PSTN pstnFile) : CHLX_PAR(pbsf, pstnFile) { _pgstVariables = pvNil; AssertThis(0); } /*************************************************************************** Destructor for the chunky compiler lexer. ***************************************************************************/ CHLX::~CHLX(void) { ReleasePpo(&_pgstVariables); } /*************************************************************************** Reads in the next token. Resolves certain names to keyword tokens. ***************************************************************************/ bool CHLX::FGetTok(PTOK ptok) { AssertThis(0); AssertVarMem(ptok); long ikeytt; long istn; for (;;) { if (!CHLX_PAR::FGetTok(ptok)) return fFalse; if (ttName != ptok->tt) return fTrue; // check for a keyword for (ikeytt = 0; ikeytt < kckeytt; ikeytt++) { if (ptok->stn.FEqualSz(_rgkeytt[ikeytt].pszKeyword)) { ptok->tt = _rgkeytt[ikeytt].tt; return fTrue; } } // if the token isn't SET, check for a variable if (!ptok->stn.FEqualSz(PszLit("SET"))) { // check for a variable if (pvNil != _pgstVariables && _pgstVariables->FFindStn(&ptok->stn, &istn, fgstSorted)) { ptok->tt = ttLong; _pgstVariables->GetExtra(istn, &ptok->lw); } break; } // handle a SET if (!_FDoSet(ptok)) { ptok->tt = ttError; break; } } return fTrue; } /*************************************************************************** Reads in the next token. Skips semicolons and commas. ***************************************************************************/ bool CHLX::FGetTokSkipSemi(PTOK ptok) { AssertThis(0); AssertVarMem(ptok); // skip comma and semicolon separators while (FGetTok(ptok)) { if (ttComma != ptok->tt && ttSemi != ptok->tt) return fTrue; } return fFalse; } /*************************************************************************** Reads a path and builds an FNI. ***************************************************************************/ bool CHLX::FGetPath(FNI *pfni) { AssertThis(0); AssertPo(pfni, 0); achar ch; STN stn; if (!_FSkipWhiteSpace()) { _fSkipToNextLine = fTrue; return fFalse; } if (!_FFetchRgch(&ch) || '"' != ch) return fFalse; _Advance(); stn.SetNil(); for (;;) { if (!_FFetchRgch(&ch)) return fFalse; _Advance(); if ('"' == ch) break; if (kchReturn == ch) return fFalse; stn.FAppendCh(ch); } #ifdef WIN static achar _szInclude[1024]; SZ szT; if (_szInclude[0] == 0) { GetEnvironmentVariable(PszLit("include"), _szInclude, CvFromRgv(_szInclude) - 1); } if (0 != SearchPath(_szInclude, stn.Psz(), pvNil, kcchMaxSz, szT, pvNil)) stn = szT; return pfni->FBuildFromPath(&stn); #endif // WIN #ifdef MAC return pfni->FBuild(0, 0, &stn, kftgText); #endif // MAC } /*************************************************************************** Handle a set command. ***************************************************************************/ bool CHLX::_FDoSet(PTOK ptok) { AssertThis(0); AssertVarMem(ptok); long tt; long lw; long istn; bool fNegate; if (!CHLX_PAR::FGetTok(ptok) || ttName != ptok->tt) return fFalse; lw = 0; istn = ivNil; if (pvNil != _pgstVariables || pvNil != (_pgstVariables = GST::PgstNew(size(long)))) { if (_pgstVariables->FFindStn(&ptok->stn, &istn, fgstSorted)) _pgstVariables->GetExtra(istn, &lw); else if (!_pgstVariables->FInsertStn(istn, &ptok->stn, &lw)) istn = ivNil; } if (!CHLX_PAR::FGetTok(ptok)) return fFalse; switch (ptok->tt) { case ttInc: lw++; break; case ttDec: lw--; break; case ttAssign: case ttAAdd: case ttASub: case ttAMul: case ttADiv: case ttAMod: case ttABOr: case ttABAnd: case ttABXor: case ttAShr: case ttAShl: tt = ptok->tt; fNegate = fFalse; for (;;) { if (!CHLX_PAR::FGetTok(ptok)) return fFalse; if (ttLong == ptok->tt) break; if (ttName == ptok->tt) { long istnT; if (!_pgstVariables->FFindStn(&ptok->stn, &istnT, fgstSorted)) return fFalse; _pgstVariables->GetExtra(istnT, &ptok->lw); ptok->tt = ttLong; break; } if (ttSub != ptok->tt) return fFalse; fNegate = !fNegate; } if (fNegate) ptok->lw = -ptok->lw; switch (tt) { case ttAssign: lw = ptok->lw; break; case ttAAdd: lw += ptok->lw; break; case ttASub: lw -= ptok->lw; break; case ttAMul: lw *= ptok->lw; break; case ttADiv: if (ptok->lw == 0) return fFalse; lw /= ptok->lw; break; case ttAMod: if (ptok->lw == 0) return fFalse; lw %= ptok->lw; break; case ttABOr: lw |= ptok->lw; break; case ttABAnd: lw &= ptok->lw; break; case ttABXor: lw ^= ptok->lw; break; case ttAShr: // do logical shift lw = (ulong)lw >> ptok->lw; break; case ttAShl: lw <<= ptok->lw; break; } break; default: return fFalse; } if (ivNil != istn) _pgstVariables->PutExtra(istn, &lw); return fTrue; } #ifdef DEBUG /*************************************************************************** Assert that the CHLX is a valid object. ***************************************************************************/ void CHLX::AssertValid(ulong grf) { CHLX_PAR::AssertValid(grf); AssertNilOrPo(_pgstVariables, 0); } /*************************************************************************** Mark memory for the CHLX object. ***************************************************************************/ void CHLX::MarkMem(void) { AssertValid(0); CHLX_PAR::MarkMem(); MarkMemObj(_pgstVariables); } #endif /*************************************************************************** Constructor for the CHDC class. This is the chunky decompiler. ***************************************************************************/ CHDC::CHDC(void) { _ert = ertNil; _pcfl = pvNil; AssertThis(0); } /*************************************************************************** Destructor for the CHDC class. ***************************************************************************/ CHDC::~CHDC(void) { ReleasePpo(&_pcfl); } #ifdef DEBUG /*************************************************************************** Assert the validity of a CHDC. ***************************************************************************/ void CHDC::AssertValid(ulong grf) { CHDC_PAR::AssertValid(0); AssertNilOrPo(_pcfl, 0); AssertPo(&_bsf, 0); AssertPo(&_chse, 0); } /*************************************************************************** Mark memory for the CHDC. ***************************************************************************/ void CHDC::MarkMem(void) { AssertValid(0); CHDC_PAR::MarkMem(); MarkMemObj(&_bsf); MarkMemObj(&_chse); } #endif // DEBUG /*************************************************************************** Decompile a chunky file. ***************************************************************************/ bool CHDC::FDecompile(PCFL pcflSrc, PMSNK pmsnk, PMSNK pmsnkError) { AssertThis(0); AssertPo(pcflSrc, 0); long icki, ikid, ckid; CTG ctg; CKI cki; KID kid; BLCK blck; _pcfl = pcflSrc; _ert = ertNil; _chse.Init(pmsnk, pmsnkError); _bo = kboCur; _osk = koskCur; _chse.DumpSz(PszLit("BYTE")); _chse.DumpSz(PszLit("")); for (icki = 0; _pcfl->FGetCki(icki, &cki, pvNil, &blck); icki++) { STN stnName; // don't dump these, because they're embedded in the script if (cki.ctg == kctgScriptStrs) continue; _pcfl->FGetName(cki.ctg, cki.cno, &stnName); _chse.DumpHeader(cki.ctg, cki.cno, &stnName); // look for special CTGs ctg = cki.ctg; // handle 4 character ctg's switch (ctg) { case kctgScript: if (_FDumpScript(&cki)) goto LEndChunk; _pcfl->FGetCki(icki, &cki, pvNil, &blck); break; } // handle 3 character ctg's ctg = ctg & 0xFFFFFF00L | 0x00000020L; switch (ctg) { case kctgGst: case kctgAst: if (_FDumpStringTable(&blck, kctgAst == ctg)) goto LEndChunk; _pcfl->FGetCki(icki, &cki, pvNil, &blck); break; } // handle 2 character ctg's ctg = ctg & 0xFFFF0000L | 0x00002020L; switch (ctg) { case kctgGl: case kctgAl: if (_FDumpList(&blck, kctgAl == ctg)) goto LEndChunk; _pcfl->FGetCki(icki, &cki, pvNil, &blck); break; case kctgGg: case kctgAg: if (_FDumpGroup(&blck, kctgAg == ctg)) goto LEndChunk; _pcfl->FGetCki(icki, &cki, pvNil, &blck); break; } _chse.DumpBlck(&blck); LEndChunk: _chse.DumpSz(PszLit("ENDCHUNK")); _chse.DumpSz(PszLit("")); } // now output parent-child relationships for (icki = 0; _pcfl->FGetCki(icki++, &cki, &ckid);) { for (ikid = 0; ikid < ckid;) { AssertDo(_pcfl->FGetKid(cki.ctg, cki.cno, ikid++, &kid), 0); if (kid.cki.ctg == kctgScriptStrs && cki.ctg == kctgScript) continue; _chse.DumpAdoptCmd(&cki, &kid); } } _pcfl = pvNil; _chse.Uninit(); return !FError(); } /*************************************************************************** Disassemble the script and dump it. ***************************************************************************/ bool CHDC::_FDumpScript(CKI *pcki) { AssertThis(0); AssertVarMem(pcki); PSCPT pscpt; bool fRet; SCCG sccg; long cfmt; bool fPacked; BLCK blck; _pcfl->FFind(pcki->ctg, pcki->cno, &blck); fPacked = blck.FPacked(&cfmt); if (pvNil == (pscpt = SCPT::PscptRead(_pcfl, pcki->ctg, pcki->cno))) return fFalse; if (fPacked) _WritePack(cfmt); fRet = _chse.FDumpScript(pscpt, &sccg); ReleasePpo(&pscpt); return fRet; } /*************************************************************************** Try to read the chunk as a list and dump it out. If the chunk isn't a list, return false so it can be dumped in hex. ***************************************************************************/ bool CHDC::_FDumpList(PBLCK pblck, bool fAl) { AssertThis(0); AssertPo(pblck, fblckReadable); PGLB pglb; short bo, osk; long cfmt; bool fPacked = pblck->FPacked(&cfmt); pglb = fAl ? (PGLB)AL::PalRead(pblck, &bo, &osk) : (PGLB)GL::PglRead(pblck, &bo, &osk); if (pvNil == pglb) return fFalse; if (fPacked) _WritePack(cfmt); if (bo != _bo) { _chse.DumpSz(MacWin(bo != kboCur, bo == kboCur) ? PszLit("WINBO") : PszLit("MACBO")); _bo = bo; } if (osk != _osk) { _chse.DumpSz(osk == koskWin ? PszLit("WINOSK") : PszLit("MACOSK")); _osk = osk; } _chse.DumpList(pglb); ReleasePpo(&pglb); return fTrue; } /*************************************************************************** Try to read the chunk as a group and dump it out. If the chunk isn't a group, return false so it can be dumped in hex. ***************************************************************************/ bool CHDC::_FDumpGroup(PBLCK pblck, bool fAg) { AssertThis(0); AssertPo(pblck, fblckReadable); PGGB pggb; short bo, osk; long cfmt; bool fPacked = pblck->FPacked(&cfmt); pggb = fAg ? (PGGB)AG::PagRead(pblck, &bo, &osk) : (PGGB)GG::PggRead(pblck, &bo, &osk); if (pvNil == pggb) return fFalse; if (fPacked) _WritePack(cfmt); if (bo != _bo) { _chse.DumpSz(MacWin(bo != kboCur, bo == kboCur) ? PszLit("WINBO") : PszLit("MACBO")); _bo = bo; } if (osk != _osk) { _chse.DumpSz(osk == koskWin ? PszLit("WINOSK") : PszLit("MACOSK")); _osk = osk; } _chse.DumpGroup(pggb); ReleasePpo(&pggb); return fTrue; } /*************************************************************************** Try to read the chunk as a string table and dump it out. If the chunk isn't a string table, return false so it can be dumped in hex. ***************************************************************************/ bool CHDC::_FDumpStringTable(PBLCK pblck, bool fAst) { AssertThis(0); AssertPo(pblck, fblckReadable); PGSTB pgstb; short bo, osk; long cfmt; bool fPacked = pblck->FPacked(&cfmt); bool fRet; pgstb = fAst ? (PGSTB)AST::PastRead(pblck, &bo, &osk) : (PGSTB)GST::PgstRead(pblck, &bo, &osk); if (pvNil == pgstb) return fFalse; if (fPacked) _WritePack(cfmt); if (bo != _bo) { _chse.DumpSz(MacWin(bo != kboCur, bo == kboCur) ? PszLit("WINBO") : PszLit("MACBO")); _bo = bo; } if (osk != _osk) { _chse.DumpSz(osk == koskWin ? PszLit("WINOSK") : PszLit("MACOSK")); _osk = osk; } fRet = _chse.FDumpStringTable(pgstb); ReleasePpo(&pgstb); return fRet; } /*************************************************************************** Write out the PACKFMT and PACK commands ***************************************************************************/ void CHDC::_WritePack(long cfmt) { AssertThis(0); STN stn; if (cfmtNil == cfmt) _chse.DumpSz(PszLit("PACK")); else { stn.FFormatSz(PszLit("PACKFMT (0x%x) PACK"), cfmt); _chse.DumpSz(stn.Psz()); } } ================================================ FILE: kauai/src/chcm.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Header file for the CHCM class - the chunky compiler class, and CHLX - its lexer. ***************************************************************************/ #ifndef CHCM_H #define CHCM_H // token types enum { ttChunk = ttLimBase, // chunk definition ttChild, // child descriptor ttParent, // parent descriptor ttAlign, // align command ttFile, // file import command ttMeta, // metafile import command ttBitmap, // bitmap import command ttFree, // for AL, AG, AST - item is free ttItem, // for GL, etc - start of data for new item ttVar, // for GG and AG - variable sized data ttGl, // GL command ttAl, // AL command ttGg, // GG command ttAg, // AG command ttGst, // GST command ttAst, // AST command ttScript, // infix script ttScriptP, // postfix script ttModeStn, // change mode to store strings as stn's ttModeStz, // change mode to store strings as stz's ttModeSz, // change mode to store strings as sz's ttModeSt, // change mode to store strings as st's ttModeByte, // change mode to accept a byte ttModeShort, // change mode to accept a short ttModeLong, // change mode to accept a long ttEndChunk, // end of chunk ttAdopt, // adopt command ttMacBo, // use Mac byte order and OSK ttWinBo, // use Win byte order and OSK ttMacOsk, // use Mac byte order and OSK ttWinOsk, // use Win byte order and OSK ttBo, // insert the current byte order ttOsk, // insert the current OSK ttMask, // MASK command ttLoner, // LONER command ttCursor, // CURSOR command ttPalette, // PALETTE command ttPrePacked, // mark the change as packed ttPack, // pack the data ttPackedFile, // packed file import command ttMidi, // midi file import command ttPackFmt, // format to pack in ttSubFile, // start an embedded chunk forest ttLimChlx }; // lookup table for keywords struct KEYTT { PSZ pszKeyword; long tt; }; /*************************************************************************** Chunky Compiler lexer class. ***************************************************************************/ typedef class CHLX *PCHLX; #define CHLX_PAR LEXB #define kclsCHLX 'CHLX' class CHLX : public CHLX_PAR { RTCLASS_DEC ASSERT MARKMEM NOCOPY(CHLX) protected: PGST _pgstVariables; bool _FDoSet(PTOK ptok); public: CHLX(PBSF pbsf, PSTN pstnFile); ~CHLX(void); // override the LEXB FGetTok to resolve variables, hande SET // and recognize our additional key words virtual bool FGetTok(PTOK ptok); virtual bool FGetTokSkipSemi(PTOK ptok); // also skip ';' & ',' virtual bool FGetPath(FNI *pfni); // read a path }; // error types enum { ertNil = 0, ertOom, ertOpenFile, ertReadMeta, ertRangeByte, ertRangeShort, ertBufData, ertParenOpen, ertEof, ertNeedString, ertNeedNumber, ertBadToken, ertParenClose, ertChunkHead, ertDupChunk, ertBodyChildHead, ertChildMissing, ertCycle, ertBodyParentHead, ertParentMissing, ertBodyAlignRange, ertBodyFile, ertNeedEndChunk, ertListHead, ertListEntrySize, ertVarUndefined, ertItemOverflow, ertBadFree, ertSyntax, ertGroupHead, ertGroupEntrySize, ertGstHead, ertGstEntrySize, ertScript, ertAdoptHead, ertNeedChunk, ertBodyBitmapHead, ertReadBitmap, ertBadScript, ertReadCursor, ertPackedFile, ertReadMidi, ertBadPackFmt, ertLonerInSub, ertNoEndSubFile, ertLim }; // string modes enum { smStn, smStz, smSz, smSt }; #define kcbMinAlign 2 #define kcbMaxAlign 1024 /*************************************************************************** Base chunky compiler class ***************************************************************************/ typedef class CHCM *PCHCM; #define CHCM_PAR BASE #define kclsCHCM 'CHCM' class CHCM : public CHCM_PAR { RTCLASS_DEC ASSERT MARKMEM NOCOPY(CHCM) protected: // Chunk sub file context struct CSFC { PCFL pcfl; CTG ctg; CNO cno; bool fPack; }; PGL _pglcsfc; // the stack of CSFCs for sub files PCFL _pcfl; // current sub file PGL _pglckiLoner; // the chunks that must be loners BSF _bsf; // temporary buffer for the chunk data PCHLX _pchlx; // lexer for compiling long _sm; // current string mode long _cbNum; // current numerical size (1, 2, or 4) short _bo; // current byte order and osk short _osk; PMSNK _pmsnkError; // error message sink long _cactError; // how many errors we've encountered protected: struct PHP // parenthesized header parameter { long lw; PSTN pstn; }; void _Error(long ert, PSZ pszMessage = pvNil); void _GetRgbFromLw(long lw, byte *prgb); void _ErrorOnData(PSZ pszPreceed); bool _FParseParenHeader(PHP *prgphp, long cphpMax, long *pcphp); bool _FGetCleanTok(TOK *ptok, bool fEofOk = fFalse); void _SkipPastTok(long tt); void _ParseChunkHeader(CTG *pctg, CNO *pcno); void _AppendString(PSTN pstnValue); void _AppendNumber(long lwValue); void _ParseBodyChild(CTG ctg, CNO cno); void _ParseBodyParent(CTG ctg, CNO cno); void _ParseBodyAlign(void); void _ParseBodyFile(void); void _StartSubFile(bool fPack, CTG ctg, CNO cno); void _EndSubFile(void); void _ParseBodyMeta(bool fPack, CTG ctg, CNO cno); void _ParseBodyBitmap(bool fPack, bool fMask, CTG ctg, CNO cno); void _ParseBodyPalette(bool fPack, CTG ctg, CNO cno); void _ParseBodyMidi(bool fPack, CTG ctg, CNO cno); void _ParseBodyCursor(bool fPack, CTG ctg, CNO cno); bool _FParseData(PTOK ptok); void _ParseBodyList(bool fPack, bool fAl, CTG ctg, CNO cno); void _ParseBodyGroup(bool fPack, bool fAg, CTG ctg, CNO cno); void _ParseBodyStringTable(bool fPack, bool fAst, CTG ctg, CNO cno); void _ParseBodyScript(bool fPack, bool fInfix, CTG ctg, CNO cno); void _ParseBodyPackedFile(bool *pfPacked); void _ParseChunkBody(CTG ctg, CNO cno); void _ParseAdopt(void); void _ParsePackFmt(void); bool _FPrepWrite(bool fPack, long cb, CTG ctg, CNO cno, PBLCK pblck); bool _FEndWrite(bool fPack, CTG ctg, CNO cno, PBLCK pblck); public: CHCM(void); ~CHCM(void); bool FError(void) { return _cactError > 0; } PCFL PcflCompile(PFNI pfniSrc, PFNI pfniDst, PMSNK pmsnk); PCFL PcflCompile(PBSF pbsfSrc, PSTN pstnFile, PFNI pfniDst, PMSNK pmsnk); }; /*************************************************************************** Chunky decompiler class. ***************************************************************************/ typedef class CHDC *PCHDC; #define CHDC_PAR BASE #define kclsCHDC 'CHDC' class CHDC : public CHDC_PAR { RTCLASS_DEC ASSERT MARKMEM NOCOPY(CHDC) protected: long _ert; // error type PCFL _pcfl; // the chunky file to read from BSF _bsf; // temporary buffer for the chunk data short _bo; // current byte order and osk short _osk; CHSE _chse; // chunky source emitter protected: bool _FDumpScript(CKI *pcki); bool _FDumpList(PBLCK pblck, bool fAl); bool _FDumpGroup(PBLCK pblck, bool fAg); bool _FDumpStringTable(PBLCK pblck, bool fAst); void _WritePack(long cfmt); public: CHDC(void); ~CHDC(void); bool FError(void) { return ertNil != _ert; } bool FDecompile(PCFL pcflSrc, PMSNK pmsnk, PMSNK pmsnkError); }; #endif // CHCM_H ================================================ FILE: kauai/src/chse.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ****** Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Chunky source emitter class implementation. ***************************************************************************/ #include "util.h" ASSERTNAME RTCLASS(CHSE) /*************************************************************************** Constructor for a chunky source emitter. ***************************************************************************/ CHSE::CHSE(void) { AssertBaseThis(0); _pmsnkError = pvNil; _pmsnkDump = pvNil; AssertThis(0); } /*************************************************************************** Destructor for a chunky source emitter. ***************************************************************************/ CHSE::~CHSE(void) { Uninit(); } /*************************************************************************** Initialize the chunky source emitter. ***************************************************************************/ void CHSE::Init(PMSNK pmsnkDump, PMSNK pmsnkError) { AssertThis(0); AssertPo(pmsnkDump, 0); AssertNilOrPo(pmsnkError, 0); Uninit(); _pmsnkDump = pmsnkDump; _pmsnkDump->AddRef(); _pmsnkError = pmsnkError; if (_pmsnkError != pvNil) _pmsnkError->AddRef(); AssertThis(fchseDump); } /*************************************************************************** Clean up and return the chse to an inactive state. ***************************************************************************/ void CHSE::Uninit(void) { AssertThis(0); ReleasePpo(&_pmsnkDump); ReleasePpo(&_pmsnkError); if (_bsf.IbMac() > 0) _bsf.FReplace(pvNil, 0, 0, _bsf.IbMac()); } #ifdef DEBUG /*************************************************************************** Assert the validity of a CHSE. ***************************************************************************/ void CHSE::AssertValid(ulong grfchse) { CHSE_PAR::AssertValid(0); AssertPo(&_bsf, 0); if (grfchse & fchseDump) AssertPo(_pmsnkDump, 0); AssertNilOrPo(_pmsnkError, 0); } /*************************************************************************** Mark memory for the CHSE. ***************************************************************************/ void CHSE::MarkMem(void) { AssertValid(0); CHSE_PAR::MarkMem(); MarkMemObj(_pmsnkError); MarkMemObj(_pmsnkDump); MarkMemObj(&_bsf); } #endif // DEBUG /*************************************************************************** Dumps chunk header. ***************************************************************************/ void CHSE::DumpHeader(CTG ctg, CNO cno, PSTN pstnName, bool fPack) { AssertThis(fchseDump); AssertNilOrPo(pstnName, 0); STN stnT; if (pstnName != pvNil) { STN stnName; stnName = *pstnName; stnName.FExpandControls(); stnT.FFormatSz(PszLit("CHUNK('%f', %d, \"%s\")"), ctg, cno, &stnName); } else stnT.FFormatSz(PszLit("CHUNK('%f', %d)"), ctg, cno); DumpSz(stnT.Psz()); if (fPack) DumpSz(PszLit("\tPACK")); } /*************************************************************************** Dump a raw data chunk ***************************************************************************/ void CHSE::DumpBlck(PBLCK pblck) { AssertThis(fchseDump); AssertPo(pblck, 0); FLO flo; if (pblck->FPacked()) DumpSz(PszLit("PREPACKED")); if (!pblck->FGetFlo(&flo, fTrue)) { Error(PszLit("Dumping chunk failed")); return; } _bsf.FReplaceFlo(&flo, fFalse, 0, _bsf.IbMac()); ReleasePpo(&flo.pfil); _DumpBsf(1); } /*************************************************************************** Dump raw data from memory. ***************************************************************************/ void CHSE::DumpRgb(void *prgb, long cb, long cactTab) { AssertThis(fchseDump); AssertIn(cb, 0, kcbMax); AssertPvCb(prgb, cb); if (cb > 0) { _bsf.FReplace(prgb, cb, 0, _bsf.IbMac()); _DumpBsf(cactTab); } } /*************************************************************************** Dump a parent directive ***************************************************************************/ void CHSE::DumpParentCmd(CTG ctgPar, CNO cnoPar, CHID chid) { AssertThis(fchseDump); STN stn; stn.FFormatSz(PszLit("PARENT('%f', %d, %d)"), ctgPar, cnoPar, chid); DumpSz(stn.Psz()); } /*************************************************************************** Dump a bitmap directive ***************************************************************************/ void CHSE::DumpBitmapCmd(byte bTransparent, long dxp, long dyp, PSTN pstnFile) { AssertThis(fchseDump); AssertPo(pstnFile, 0); STN stn; stn.FFormatSz(PszLit("BITMAP(%d, %d, %d) \"%s\""), (long)bTransparent, dxp, dyp, pstnFile); DumpSz(stn.Psz()); } /*************************************************************************** Dump a file directive ***************************************************************************/ void CHSE::DumpFileCmd(PSTN pstnFile, bool fPacked) { AssertThis(fchseDump); AssertPo(pstnFile, 0); STN stn; if (fPacked) stn.FFormatSz(PszLit("PACKEDFILE \"%s\""), pstnFile); else stn.FFormatSz(PszLit("FILE \"%s\""), pstnFile); DumpSz(stn.Psz()); } /*************************************************************************** Dump an adopt directive ***************************************************************************/ void CHSE::DumpAdoptCmd(CKI *pcki, KID *pkid) { AssertThis(fchseDump); AssertVarMem(pcki); AssertVarMem(pkid); STN stn; stn.FFormatSz(PszLit("ADOPT('%f', %d, '%f', %d, %d)"), pcki->ctg, pcki->cno, pkid->cki.ctg, pkid->cki.cno, pkid->chid); DumpSz(stn.Psz()); } /*************************************************************************** Dump the data in the _bsf ***************************************************************************/ void CHSE::_DumpBsf(long cactTab) { AssertThis(fchseDump); AssertIn(cactTab, 0, kcchMaxStn + 1); byte rgb[8], bT; STN stn1; STN stn2; long cact; long ib, ibMac; long cb, ibT; stn1.SetNil(); for (cact = cactTab; cact-- > 0;) stn1.FAppendCh(kchTab); stn1.FAppendSz(PszLit("BYTE")); DumpSz(stn1.Psz()); ibMac = _bsf.IbMac(); for (ib = 0; ib < ibMac;) { stn1.SetNil(); for (cact = cactTab; cact-- > 0;) stn1.FAppendCh(kchTab); cb = LwMin(ibMac - ib, size(rgb)); _bsf.FetchRgb(ib, cb, rgb); // append the hex for (ibT = 0; ibT < size(rgb); ibT++) { if (ibT >= cb) stn1.FAppendSz(PszLit(" ")); else { stn2.FFormatSz(PszLit("0x%02x "), rgb[ibT]); stn1.FAppendStn(&stn2); } } stn1.FAppendSz(PszLit(" // '")); // append the ascii for (ibT = 0; ibT < cb; ibT++) { bT = rgb[ibT]; if (bT < 0x20 || bT == 0x7F) bT = '?'; stn1.FAppendCh((achar)bT); } stn1.FAppendSz(PszLit("' ")); DumpSz(stn1.Psz()); ib += cb; } } /****************************************************************************** Disassembles a script (pscpt) using the given script compiler (psccb) and dumps the result (including a "SCRIPTPF" directive). ******************************************************************************/ bool CHSE::FDumpScript(PSCPT pscpt, PSCCB psccb) { AssertThis(fchseDump); AssertPo(pscpt, 0); AssertPo(psccb, 0); DumpSz(PszLit("SCRIPTPF")); if (!psccb->FDisassemble(pscpt, _pmsnkDump, _pmsnkError)) { Error(PszLit("Dumping script failed")); return fFalse; } return fTrue; } /****************************************************************************** Dumps a GL or AL, including the GL or AL directive. pglb is the GL or AL to dump. ******************************************************************************/ void CHSE::DumpList(PGLB pglb) { AssertThis(fchseDump); AssertPo(pglb, 0); long cbEntry; long iv, ivMac; STN stn; bool fAl = pglb->FIs(kclsAL); Assert(fAl || pglb->FIs(kclsGL), "neither a GL or AL!"); // have a valid GL or AL -- print it out in readable format cbEntry = pglb->CbEntry(); AssertIn(cbEntry, 0, kcbMax); ivMac = pglb->IvMac(); stn.FFormatSz(fAl ? PszLit("\tAL(%d)") : PszLit("\tGL(%d)"), cbEntry); DumpSz(stn.Psz()); // print out the entries for (iv = 0; iv < ivMac; iv++) { if (pglb->FFree(iv)) DumpSz(PszLit("\tFREE")); else { DumpSz(PszLit("\tITEM")); _bsf.FReplace(pglb->PvLock(iv), cbEntry, 0, _bsf.IbMac()); pglb->Unlock(); _DumpBsf(2); } } } /****************************************************************************** Dumps a GG or AG, including the GG or AG directive. pggb is the GG or AG to dump. ******************************************************************************/ void CHSE::DumpGroup(PGGB pggb) { AssertThis(fchseDump); AssertPo(pggb, 0); long cbFixed, cb; long iv, ivMac; STN stnT; bool fAg = pggb->FIs(kclsAG); Assert(fAg || pggb->FIs(kclsGG), "neither a GG or AG!"); // have a valid GG or AG -- print it out in readable format cbFixed = pggb->CbFixed(); AssertIn(cbFixed, 0, kcbMax); ivMac = pggb->IvMac(); stnT.FFormatSz(fAg ? PszLit("\tAG(%d)") : PszLit("\tGG(%d)"), cbFixed); DumpSz(stnT.Psz()); // print out the entries for (iv = 0; iv < ivMac; iv++) { if (pggb->FFree(iv)) { DumpSz(PszLit("\tFREE")); continue; } DumpSz(PszLit("\tITEM")); if (cbFixed > 0) { _bsf.FReplace(pggb->PvFixedLock(iv), cbFixed, 0, _bsf.IbMac()); pggb->Unlock(); _DumpBsf(2); } if (0 < (cb = pggb->Cb(iv))) { DumpSz(PszLit("\tVAR")); _bsf.FReplace(pggb->PvLock(iv), cb, 0, _bsf.IbMac()); pggb->Unlock(); _DumpBsf(2); } } } /****************************************************************************** Dumps a GST or AST, including the GST or AST directive. pggb is the GST or AST to dump. ******************************************************************************/ bool CHSE::FDumpStringTable(PGSTB pgstb) { AssertThis(fchseDump); AssertPo(pgstb, 0); long cbExtra; long iv, ivMac; STN stn1; STN stn2; void *pvExtra = pvNil; bool fAst = pgstb->FIs(kclsAST); Assert(fAst || pgstb->FIs(kclsGST), "neither a GST or AST!"); // have a valid GST or AST -- print it out in readable format cbExtra = pgstb->CbExtra(); AssertIn(cbExtra, 0, kcbMax); ivMac = pgstb->IvMac(); if (cbExtra > 0 && !FAllocPv(&pvExtra, cbExtra, fmemNil, mprNormal)) return fFalse; stn1.FFormatSz(fAst ? PszLit("\tAST(%d)") : PszLit("\tGST(%d)"), cbExtra); DumpSz(stn1.Psz()); // print out the entries for (iv = 0; iv < ivMac; iv++) { if (pgstb->FFree(iv)) { DumpSz(PszLit("\tFREE")); continue; } DumpSz(PszLit("\tITEM")); pgstb->GetStn(iv, &stn2); stn2.FExpandControls(); stn1.FFormatSz(PszLit("\t\t\"%s\""), &stn2); DumpSz(stn1.Psz()); if (cbExtra > 0) { pgstb->GetExtra(iv, pvExtra); _bsf.FReplace(pvExtra, cbExtra, 0, _bsf.IbMac()); _DumpBsf(2); } } FreePpv(&pvExtra); return fTrue; } ================================================ FILE: kauai/src/chse.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ****** Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Header file for the CHSE class - the chunky source emitter class. ***************************************************************************/ #ifndef CHSE_H #define CHSE_H /*************************************************************************** Chunky source emitter class ***************************************************************************/ #ifdef DEBUG enum { fchseNil = 0, fchseDump = 0x8000, }; #endif // DEBUG typedef class CHSE *PCHSE; #define CHSE_PAR BASE #define kclsCHSE 'CHSE' class CHSE : public CHSE_PAR { RTCLASS_DEC ASSERT MARKMEM NOCOPY(CHSE) protected: PMSNK _pmsnkDump; PMSNK _pmsnkError; BSF _bsf; bool _fError; protected: void _DumpBsf(long cactTab); public: CHSE(void); ~CHSE(void); void Init(PMSNK pmsnkDump, PMSNK pmsnkError = pvNil); void Uninit(void); void DumpHeader(CTG ctg, CNO cno, PSTN pstnName = pvNil, bool fPack = fFalse); void DumpRgb(void *prgb, long cb, long cactTab = 1); void DumpParentCmd(CTG ctg, CNO cno, CHID chid); void DumpBitmapCmd(byte bTransparent, long dxp, long dyp, PSTN pstnFile); void DumpFileCmd(PSTN pstnFile, bool fPacked = fFalse); void DumpAdoptCmd(CKI *pcki, KID *pkid); void DumpList(PGLB pglb); void DumpGroup(PGGB pggb); bool FDumpStringTable(PGSTB pgstb); void DumpBlck(PBLCK pblck); bool FDumpScript(PSCPT pscpt, PSCCB psccb); // General sz emitting routines void DumpSz(PSZ psz) { AssertThis(fchseDump); _pmsnkDump->ReportLine(psz); } void Error(PSZ psz) { AssertThis(fchseNil); _fError = fTrue; if (pvNil != _pmsnkError) _pmsnkError->ReportLine(psz); } bool FError(void) { return _fError || pvNil != _pmsnkDump && _pmsnkDump->FError(); } }; #endif // !CHSE_H ================================================ FILE: kauai/src/chtrans.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /********************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Character translation table for Mac to and from Win **********************************************************************/ #ifndef SYMC // disable brain dead cast warnings #pragma warning(disable : 4305) #pragma warning(disable : 4309) #pragma warning(disable : 4838) #endif //! SYMC static constexpr schar _mpchschsMacToWin[128] = { /* 0/8 1/9 2/A 3/B 4/C 5/D 6/E 7/F */ /* 80 */ 0xC4, 0xC5, 0xC7, 0xC9, 0xD1, 0xD6, 0xDC, 0xE1, 0xE0, 0xE2, 0xE4, 0xE3, 0xE5, 0xE7, 0xE9, 0xE8, /* 90 */ 0xEA, 0xEB, 0xED, 0xEC, 0xEE, 0xEF, 0xF1, 0xF3, 0xF2, 0xF4, 0xF6, 0xF5, 0xFA, 0xF9, 0xFB, 0xFC, /* A0 */ 0x86, 0xB0, 0xA2, 0xA3, 0xA7, 0x95, 0xB6, 0xDF, 0xAE, 0xA9, 0x99, 0xB4, 0xA8, 0x7F, 0xC6, 0xD8, /* B0 */ 0x7F, 0xB1, 0x7F, 0x7F, 0xA5, 0xB5, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0xAA, 0xBA, 0x7F, 0xE6, 0xF8, /* C0 */ 0xBF, 0xA1, 0xAC, 0x7F, 0x83, 0x7F, 0x7F, 0xAB, 0xBB, 0x85, 0xA0, 0xC0, 0xC3, 0xD5, 0x8C, 0x9C, /* D0 */ 0x96, 0x97, 0x93, 0x94, 0x91, 0x92, 0xF7, 0x7F, 0xFF, 0x9F, 0x2F, 0xA4, 0x8B, 0x9B, 0x7F, 0x7F, /* E0 */ 0x87, 0xB7, 0x82, 0x84, 0x89, 0xC2, 0xCA, 0xC1, 0xCB, 0xC8, 0xCD, 0xCE, 0xCF, 0xCC, 0xD3, 0xD4, /* F0 */ 0x7F, 0xD2, 0xDA, 0xDB, 0xD9, 0xA6, 0x88, 0x98, 0xAF, 0x7F, 0x7F, 0xB0, 0xB8, 0xA8, 0x7F, 0x7F, }; static constexpr schar _mpchschsWinToMac[128] = { /* 0/8 1/9 2/A 3/B 4/C 5/D 6/E 7/F */ /* 80 */ 0x7F, 0x7F, 0xE2, 0xC4, 0xE3, 0xC9, 0xA0, 0xE0, 0xF6, 0xE4, 0x7F, 0xDC, 0xCE, 0x7F, 0x7F, 0x7F, /* 90 */ 0x7F, 0xD4, 0xD5, 0xD2, 0xD3, 0xA5, 0xD0, 0xD1, 0xF7, 0xAA, 0x7F, 0xDD, 0xCF, 0x7F, 0x7F, 0xD9, /* A0 */ 0xCA, 0xC1, 0xA2, 0xA3, 0xDB, 0xB4, 0xF5, 0xA4, 0xAC, 0xA9, 0xBB, 0xC7, 0xC2, 0xD0, 0xA8, 0xF8, /* B0 */ 0xA1, 0xB1, 0x32, 0x33, 0xAB, 0xB5, 0xA6, 0xE1, 0xE2, 0x31, 0xBC, 0xC8, 0x7F, 0x7F, 0x7F, 0xC0, /* C0 */ 0xCB, 0xE7, 0xE5, 0xCC, 0x80, 0x81, 0xAE, 0x82, 0xE9, 0x83, 0xE6, 0xE8, 0xED, 0xEA, 0xEB, 0xEC, /* D0 */ 0x7F, 0x84, 0xF1, 0xEE, 0xEF, 0xCD, 0x85, 0x7F, 0xAF, 0xF4, 0xF2, 0xF3, 0x86, 0x59, 0x7F, 0xA7, /* E0 */ 0x88, 0x87, 0x89, 0x8B, 0x8A, 0x8C, 0xBE, 0x8D, 0x8F, 0x8E, 0x90, 0x91, 0x93, 0x92, 0x94, 0x95, /* F0 */ 0x7F, 0x96, 0x98, 0x97, 0x99, 0x9B, 0x9A, 0xD6, 0xBF, 0x9D, 0x9C, 0x9E, 0x9F, 0x79, 0x7F, 0xD8, }; schar _mpchschsUpper[256]; schar _mpchschsLower[256]; #ifndef SYMC #pragma warning(default : 4305) #pragma warning(default : 4309) #pragma warning(default : 4838) #endif //! SYMC ================================================ FILE: kauai/src/chunk.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Chunky file classes. Chunky files store distinct "chunks" of data. Each chunk is identified by a chunk tag (CTG) and chunk number (CNO) pair. By convention, CTGs consist of 4 ASCII characters. CTGs that are shorter than 4 characters should be padded with spaces (eg, 'GST '). The CFL class does not enforce these conventions, but many Kauai tools assume that CTGs consist of 4 printable characters. Chunks store arbitrary data. Chunks can have names. Most importantly, chunks can have child chunks. A chunk can also be a child of more than one chunk and can be a child of a chunk mutliple times. The main restriction on parent-child relationships is that there can be no loops. Mathematically speaking, the chunks form an acyclic directed graph. A parent-child relationship has a client specified number associated with it. This is called the child id (CHID). Child id's don't have to be unique. CFL places no significance on child id's. The only restriction concerning CHIDs is that if chunk B is to be a child of chunk A twice, then those two parent-child relationships must have different child id's. In a nutshell, a parent-child relationship (an arrow in the acyclic directed graph) is uniquely identified by the 5-tuple (ctgPar, cnoPar, ctgChild, cnoChild, chid). On disk, chunky files are organized as follows: * A header (CFP struct defined below). * The raw chunk data arranged in arbitrary order (a heap). * The index for the chunky file. * An optional free map indicating which portions of the heap are currently not being used to store chunk data. The header stores signatures, version numbers, and pointers to the index and free map. The heap contains only the raw chunk data. The index is not updated on disk until FSave is called. The index is implemented as a general group (GG). The fixed portion of each entry is a CRP (defined below). The variable portion contains the list of children of the chunk (including CHID values) and the chunk name (if it has one). The CRP indicates where in the heap the chunk data is, whether the chunk data is compressed, whether the chunk is a "loner" and how many parents the chunk has. Loner chunks are ones that can exist without a parent. When pcfl->Delete(ctg, cno) is called, the chunk's loner flag is cleared. If the chunk has no parents, the chunk is deleted (by removing its CRP from the index and adding the space in the heap that it occupied to the free map). We also decrement the parent counts of the children of the chunk. Child chunks whose parent count becomes zero and are not loner chunks are then deleted, and the process continues down through the chunk graph. The CFL class implements intelligent chunk copying within a run-time session. Suppose a source CFL contains two chunks A and B, with B a child of A. If chunk A is copied to another chunky file, its entire subgraph is copied, so B is copied with it. Suppose however that chunk B was previously copied to the destination, then A is copied. We see that chunk B is already in the destination CFL, so don't actually copy the chunk - we just copy A and make the previously coped B a child of the newly copied A. If this is not what you want, use FClone instead of FCopy. FClone copies the entire chunk subgraph, but does not use any previously copied chunks. The intelligent chunk copying only happens within a single run-time session (from the files point of view). If the chunky files are closed and re-opened, no sharing will occur. ***************************************************************************/ #include "util.h" ASSERTNAME /* HISTORY of CFL version numbers 1 ShonK: instantiated, 10/28/93 2 ShonK: added compression support, 2/14/95 3 ShonK: changed format of chunk names to be a saved STN, 3/30/95 4 ShonK: implemented support for compact index (CRP is smaller). 8/21/95 5 ShonK: added the fcrpForest flag. 9/4/95 */ // A file written by this version of chunk.cpp receives this cvn. Any // file with this cvn value has exactly the same file format const short kcvnCur = 5; // A file written by this version of chunk.cpp can be read by any version // of chunk.cpp whose kcvnCur is >= to this (this should be <= kcvnCur) const short kcvnBack = 4; // A file whose cvn is less than kcvnMin cannot be directly read by // this version of chunk.cpp (maybe a converter will read it). // (this should be <= kcvnCur) // NOTE: (ShonK, 3/30/95): if this is >= 3, the fOldNames handling in // _FReadIndex can be removed! // NOTE: (ShonK, 8/21/95): if this is >= 4, the fOldIndex handling in // _FReadIndex can be removed! const short kcvnMin = 1; const auto kcvnMinStnNames = 3; const auto kcvnMinGrfcrp = 4; const auto kcvnMinSmallIndex = 4; const auto kcvnMinForest = 5; const long klwMagicChunky = BigLittle('CHN2', '2NHC'); // chunky file signature // chunky file prefix struct CFP { long lwMagic; // identifies this as a chunky file CTG ctgCreator; // program that created this file DVER dver; // chunky file version short bo; // byte order short osk; // which system wrote this FP fpMac; // logical end of file FP fpIndex; // location of chunky index long cbIndex; // size of chunky index FP fpMap; // location of free space map long cbMap; // size of free space map (may be 0) long rglwReserved[23]; // reserved for future use - should be zero }; const BOM kbomCfp = 0xB55FFC00L; // free space map entry struct FSM { FP fp; long cb; }; const BOM kbomFsm = 0xF0000000L; enum { fcrpNil = 0, fcrpOnExtra = 0x01, // data is on the extra file fcrpLoner = 0x02, // the chunk can stand (may also be a child) fcrpPacked = 0x04, // the data is compressed fcrpMarkT = 0x08, // used for consistency checks (see _TValidIndex) fcrpForest = 0x10, // the chunk contains a forest of chunks }; // Chunk Representation (big version) - fixed element in pggcrp // variable part of group element is an rgkid and stn data (the name) const long kcbMaxCrpbg = klwMax; struct CRPBG { CKI cki; // chunk id FP fp; // location on file long cb; // size of data on file long ckid; // number of owned chunks long ccrpRef; // number of owners of this chunk long rti; // run-time id union { struct { // for cvn <= kcvnMinGrfcrp byte fOnExtra; // fcrpOnExtra byte fLoner; // fcrpLoner byte fPacked; // fcrpPacked byte bT; // fcrpMarkT }; // for cvn >= kcvnMinGrfcrp ulong grfcrp; }; long BvRgch(void) { return LwMul(ckid, size(KID)); } long CbRgch(long cbVar) { return cbVar - BvRgch(); } ulong Grfcrp(ulong grfcrpMask = (ulong)(-1)) { return grfcrp & grfcrpMask; } void ClearGrfcrp(ulong grfcrpT) { grfcrp &= ~grfcrpT; } void SetGrfcrp(ulong grfcrpT) { grfcrp |= grfcrpT; } void AssignGrfcrp(ulong grfcrpT, ulong grfcrpMask = (ulong)(-1)) { grfcrp = grfcrp & ~grfcrpMask | grfcrpT & grfcrpMask; } long Cb(void) { return cb; } void SetCb(long cbT) { cb = cbT; } }; const BOM kbomCrpbgGrfcrp = 0xFFFF0000L; const BOM kbomCrpbgBytes = 0xFFFE0000L; // Chunk Representation (small version) - fixed element in pggcrp // variable part of group element is an rgkid and stn data (the name) const long kcbMaxCrpsm = 0x00FFFFFF; const long kcbitGrfcrp = 8; const ulong kgrfcrpAll = (1 << kcbitGrfcrp) - 1; struct CRPSM { CKI cki; // chunk id FP fp; // location on file ulong luGrfcrpCb; // low byte is the grfcrp, high 3 bytes is cb ushort ckid; // number of owned chunks ushort ccrpRef; // number of owners of this chunk long BvRgch(void) { return LwMul(ckid, size(KID)); } long CbRgch(long cbVar) { return cbVar - BvRgch(); } ulong Grfcrp(ulong grfcrpMask = (ulong)(-1)) { return luGrfcrpCb & grfcrpMask & kgrfcrpAll; } void ClearGrfcrp(ulong grfcrpT) { luGrfcrpCb &= ~(grfcrpT & kgrfcrpAll); } void SetGrfcrp(ulong grfcrpT) { luGrfcrpCb |= grfcrpT & kgrfcrpAll; } void AssignGrfcrp(ulong grfcrpT, ulong grfcrpMask = (ulong)(-1)) { luGrfcrpCb = luGrfcrpCb & ~(grfcrpMask & kgrfcrpAll) | grfcrpT & grfcrpMask & kgrfcrpAll; } long Cb(void) { return luGrfcrpCb >> kcbitGrfcrp; } void SetCb(long cbT) { luGrfcrpCb = (cbT << kcbitGrfcrp) | luGrfcrpCb & kgrfcrpAll; } }; const BOM kbomCrpsm = 0xFF500000L; #ifdef CHUNK_BIG_INDEX typedef CRPBG CRP; typedef CRPSM CRPOTH; const long kcbMaxCrp = kcbMaxCrpbg; typedef long CKID; const long kckidMax = kcbMax; const BOM kbomCrpsm = kbomCrpbgGrfcrp; #else //! CHUNK_BIG_INDEX typedef CRPSM CRP; typedef CRPBG CRPOTH; const long kcbMaxCrp = kcbMaxCrpsm; typedef ushort CKID; const long kckidMax = ksuMax; const BOM kbomCrp = kbomCrpsm; #endif //! CHUNK_BIG_INDEX #define _BvKid(ikid) LwMul(ikid, size(KID)) const long rtiNil = 0; // no rti assigned long CFL::_rtiLast = rtiNil; PCFL CFL::_pcflFirst; #ifdef CHUNK_STATS bool vfDumpChunkRequests = fTrue; PFIL _pfilStats; FP _fpStats; /*************************************************************************** Static method to dump a string to the chunk stats file ***************************************************************************/ void CFL::DumpStn(PSTN pstn, PFIL pfil) { FNI fni; STN stn; if (pvNil == _pfilStats) { stn = PszLit("ChnkStat.txt"); if (!fni.FGetTemp() || !fni.FSetLeaf(&stn) || pvNil == (_pfilStats = FIL::PfilCreate(&fni))) { return; } } if (pvNil != pfil) { pfil->GetFni(&fni); fni.GetStnPath(&stn); stn.FAppendSz(PszLit(": ")); _pfilStats->FWriteRgbSeq(stn.Prgch(), LwMul(stn.Cch(), size(achar)), &_fpStats); } _pfilStats->FWriteRgbSeq(pstn->Prgch(), LwMul(pstn->Cch(), size(achar)), &_fpStats); _pfilStats->FWriteRgbSeq(PszLit("\xD\xA"), MacWin(size(achar), 2 * size(achar)), &_fpStats); } #endif // CHUNK_STATS RTCLASS(CFL) RTCLASS(CGE) /*************************************************************************** Constructor for CFL - private. ***************************************************************************/ CFL::CFL(void) { // add it to the linked list _Attach(&_pcflFirst); AssertBaseThis(0); } /*************************************************************************** Close the associated files. Private. ***************************************************************************/ CFL::~CFL(void) { AssertBaseThis(0); ReleasePpo(&_csto.pfil); ReleasePpo(&_csto.pglfsm); ReleasePpo(&_cstoExtra.pfil); ReleasePpo(&_cstoExtra.pglfsm); ReleasePpo(&_pggcrp); #ifndef CHUNK_BIG_INDEX ReleasePpo(&_pglrtie); #endif //! CHUNK_BIG_INDEX } /*************************************************************************** Static method: open an existing file as a chunky file. Increments the open count. ***************************************************************************/ PCFL CFL::PcflOpen(FNI *pfni, ulong grfcfl) { AssertPo(pfni, ffniFile); PCFL pcfl; ulong grffil; Assert(!(grfcfl & fcflTemp), "can't open a file as temp"); if (pvNil != (pcfl = PcflFromFni(pfni))) { if (!pcfl->FSetGrfcfl(grfcfl)) return pvNil; pcfl->AddRef(); return pcfl; } grffil = _GrffilFromGrfcfl(grfcfl); if ((pcfl = NewObj CFL()) == pvNil) goto LFail; if ((pcfl->_csto.pfil = FIL::PfilOpen(pfni, grffil)) == pvNil || !pcfl->_FReadIndex()) { goto LFail; } if (tYes != pcfl->_TValidIndex()) { LFail: ReleasePpo(&pcfl); PushErc(ercCflOpen); return pvNil; } AssertDo(pcfl->FSetGrfcfl(grfcfl), 0); // We don't assert with fcflGraph, because we've already // called _TValidIndex. AssertPo(pcfl, fcflFull); return pcfl; } /*************************************************************************** If the file is read-only, toss the index and extra file and re-read the index. ***************************************************************************/ bool CFL::FReopen(void) { AssertThis(0); CSTO csto, cstoExtra; PGG pggcrp; #ifndef CHUNK_BIG_INDEX PGL pglrtie; #endif // CHUNK_BIG_INDEX bool fFreeMapNotRead; bool fRet; if (_csto.pfil->GrffilCur() & ffilWriteEnable || _fInvalidMainFile) return fFalse; pggcrp = _pggcrp; _pggcrp = pvNil; #ifndef CHUNK_BIG_INDEX pglrtie = _pglrtie; _pglrtie = pvNil; #endif // CHUNK_BIG_INDEX fFreeMapNotRead = _fFreeMapNotRead; _fFreeMapNotRead = fFalse; csto = _csto; ClearPb(&_csto, size(csto)); _csto.pfil = csto.pfil; _csto.pfil->AddRef(); cstoExtra = _cstoExtra; ClearPb(&_cstoExtra, size(cstoExtra)); fRet = _FReadIndex() && tYes == _TValidIndex(); if (!fRet) { SwapVars(&_pggcrp, &pggcrp); #ifndef CHUNK_BIG_INDEX SwapVars(&_pglrtie, &pglrtie); #endif // CHUNK_BIG_INDEX SwapVars(&_csto, &csto); SwapVars(&_cstoExtra, &cstoExtra); _fFreeMapNotRead = FPure(fFreeMapNotRead); } ReleasePpo(&pggcrp); #ifndef CHUNK_BIG_INDEX ReleasePpo(&pglrtie); #endif // CHUNK_BIG_INDEX ReleasePpo(&csto.pfil); ReleasePpo(&csto.pglfsm); ReleasePpo(&cstoExtra.pfil); ReleasePpo(&cstoExtra.pglfsm); AssertThis(0); return fRet; } /*************************************************************************** Static method to get file options corresponding to the given chunky file options. ***************************************************************************/ ulong CFL::_GrffilFromGrfcfl(ulong grfcfl) { ulong grffil = ffilDenyWrite; if (grfcfl & fcflWriteEnable) grffil |= ffilWriteEnable | ffilDenyRead; if (grfcfl & fcflTemp) grffil |= ffilTemp; return grffil; } /*************************************************************************** Static method: create a new file. Increments the open count. ***************************************************************************/ PCFL CFL::PcflCreate(FNI *pfni, ulong grfcfl) { AssertPo(pfni, ffniFile); PCFL pcfl; ulong grffil; grfcfl |= fcflWriteEnable; grffil = _GrffilFromGrfcfl(grfcfl); if (pvNil != (pcfl = CFL::PcflFromFni(pfni))) { Bug("trying to create an open file"); goto LFail; } if ((pcfl = NewObj CFL()) == pvNil) goto LFail; if ((pcfl->_pggcrp = GG::PggNew(size(CRP))) == pvNil || (pcfl->_csto.pfil = FIL::PfilCreate(pfni, grffil)) == pvNil || !pcfl->_csto.pfil->FSetFpMac(size(CFP))) { ReleasePpo(&pcfl); LFail: PushErc(ercCflCreate); return pvNil; } pcfl->_csto.fpMac = size(CFP); AssertDo(pcfl->FSetGrfcfl(grfcfl), 0); AssertPo(pcfl, fcflFull | fcflGraph); return pcfl; } /*************************************************************************** Static method to create a temporary chunky file in the same directory as *pfni and with the same ftg. If pfni is nil, the file is created in the standard place with a temp ftg. ***************************************************************************/ PCFL CFL::PcflCreateTemp(FNI *pfni) { AssertNilOrPo(pfni, ffniFile); FNI fni; if (pvNil != pfni) { fni = *pfni; if (!fni.FGetUnique(pfni->Ftg())) goto LFail; } else if (!fni.FGetTemp()) { LFail: PushErc(ercCflCreate); return pvNil; } return PcflCreate(&fni, fcflTemp); } /*************************************************************************** Static method: if we have the chunky file indicated by fni open, returns the pcfl, otherwise returns pvNil. Doesn't affect the open count. ***************************************************************************/ PCFL CFL::PcflFromFni(FNI *pfni) { AssertPo(pfni, ffniFile); PFIL pfil; PCFL pcfl; if ((pfil = FIL::PfilFromFni(pfni)) == pvNil) return pvNil; for (pcfl = _pcflFirst; pcfl != pvNil; pcfl = pcfl->PcflNext()) { Assert(pfil != pcfl->_cstoExtra.pfil, "who is using this FNI?"); if (pcfl->_csto.pfil == pfil && !pcfl->_fInvalidMainFile) break; } return pcfl; } /*************************************************************************** Embedded chunk descriptor on file. Chunks and their subtrees can be combined into a single stream by the following rules: CF stands for a chunk forest. CT stands for a chunk tree. ECDF(n, m) stands for an ECDF structure with cb == n and ckid == m. data(n) stands for n bytes of data. CF -> (empty) CF -> CT CF CT -> ECDF(n, 0) data(n) CT -> EDCF(n, m) data(n) CT CT ... CT (m times) CFL::FWriteChunkTree writes a CT from a chunk and its children. CFL::PcflReadForestFromFlo reads a CF from a flo and creates a CFL around the data. ***************************************************************************/ struct ECDF { short bo; short osk; CTG ctg; CHID chid; long cb; long ckid; ulong grfcrp; }; const BOM kbomEcdf = 0x5FFC0000L; /*************************************************************************** Combine the indicated chunk and its children into an embedded chunk. If pfil is pvNil, just computes the size. ***************************************************************************/ bool CFL::FWriteChunkTree(CTG ctg, CNO cno, PFIL pfilDst, FP fpDst, long *pcb) { AssertThis(0); AssertNilOrPo(pfilDst, 0); AssertNilOrVarMem(pcb); CGE cge; ECDF ecdf; FLO floSrc, floDst; KID kid; CKI ckiPar; ulong grfcge; if (pvNil != pcb) *pcb = 0; cge.Init(this, ctg, cno); while (cge.FNextKid(&kid, &ckiPar, &grfcge, fcgeNil)) { if (grfcge & fcgeError) goto LFail; if (!(grfcge & fcgePre)) continue; AssertDo(FFindFlo(kid.cki.ctg, kid.cki.cno, &floSrc), 0); if (pvNil != pcb) *pcb += size(ECDF) + floSrc.cb; if (pvNil != pfilDst) { // write the data ecdf.bo = kboCur; ecdf.osk = koskCur; ecdf.ctg = kid.cki.ctg; ecdf.chid = (grfcge & fcgeRoot) ? chidNil : kid.chid; ecdf.cb = floSrc.cb; ecdf.ckid = Ckid(kid.cki.ctg, kid.cki.cno); ecdf.grfcrp = fcrpNil; if (FPacked(kid.cki.ctg, kid.cki.cno)) ecdf.grfcrp |= fcrpPacked; if (FForest(kid.cki.ctg, kid.cki.cno)) ecdf.grfcrp |= fcrpForest; if (!pfilDst->FWriteRgbSeq(&ecdf, size(ecdf), &fpDst)) goto LFail; floDst.pfil = pfilDst; floDst.fp = fpDst; floDst.cb = floSrc.cb; if (!floSrc.FCopy(&floDst)) { LFail: TrashVar(pcb); return fFalse; } fpDst += floDst.cb; } } return fTrue; } /*************************************************************************** Static method to read a serialized chunk stream (as written by a series of calls to FWriteChunkTree) and create a CFL around it. If fCopyData is false, we construct the CFL to use pointers to the data in the FLO. Otherwise, we copy the data to a new file. ***************************************************************************/ PCFL CFL::PcflReadForestFromFlo(PFLO pflo, bool fCopyData) { AssertVarMem(pflo); AssertPo(pflo->pfil, 0); // embedded chunk stack descriptor struct ECSD { CTG ctg; CNO cno; long ckid; }; PCFL pcfl; ECDF ecdf; ECSD ecsdT, ecsdCur; FP fpSrc, fpLimSrc; PGL pglecsd = pvNil; if (pvNil == (pglecsd = GL::PglNew(size(ECSD)))) goto LFail; if ((pcfl = NewObj CFL()) == pvNil) goto LFail; if (pvNil == (pcfl->_pggcrp = GG::PggNew(size(CRP)))) goto LFail; if (fCopyData) { if (pvNil == (pcfl->_csto.pfil = FIL::PfilCreateTemp()) || !pcfl->_csto.pfil->FSetFpMac(size(CFP))) { goto LFail; } pcfl->_csto.fpMac = size(CFP); } else { pcfl->_csto.pfil = pflo->pfil; pcfl->_csto.pfil->AddRef(); pcfl->_csto.fpMac = pflo->fp + pflo->cb; pcfl->_fInvalidMainFile = fTrue; pcfl->_fAddToExtra = fTrue; } AssertPo(pcfl, fcflFull | fcflGraph); ClearPb(&ecsdCur, size(ecsdCur)); fpSrc = pflo->fp; fpLimSrc = pflo->fp + pflo->cb; for (;;) { if (fpSrc >= fpLimSrc) break; if (fpSrc > fpLimSrc + size(ecdf) || !pflo->pfil->FReadRgbSeq(&ecdf, size(ecdf), &fpSrc)) { goto LFail; } if (kboOther == ecdf.bo) SwapBytesBom(&ecdf, kbomEcdf); else if (kboCur != ecdf.bo) goto LFail; if (!FIn(ecdf.cb, 0, fpLimSrc - fpSrc + 1)) goto LFail; if (fCopyData) { BLCK blck(pflo->pfil, fpSrc, ecdf.cb, ecdf.grfcrp & fcrpPacked); if (!pcfl->FAddBlck(&blck, ecdf.ctg, &ecsdT.cno)) goto LFail; } else { CRP *qcrp; long icrp; pcfl->_GetUniqueCno(ecdf.ctg, &icrp, &ecsdT.cno); if (!pcfl->_FAdd(0, ecdf.ctg, ecsdT.cno, icrp, pvNil)) goto LFail; qcrp = (CRP *)pcfl->_pggcrp->QvFixedGet(icrp); qcrp->fp = ecdf.cb > 0 ? fpSrc : 0; qcrp->SetCb(ecdf.cb); qcrp->AssignGrfcrp(ecdf.grfcrp, fcrpPacked | fcrpForest); } fpSrc += ecdf.cb; if (pglecsd->IvMac() > 0) { Assert(ecsdCur.ckid > 0, 0); // Make this a child if (!pcfl->FAdoptChild(ecsdCur.ctg, ecsdCur.cno, ecdf.ctg, ecsdT.cno, ecdf.chid)) { goto LFail; } ecsdCur.ckid--; } if (ecdf.ckid > 0) { // This one has children, so we need to push the current ecsd and // make this the current one ecsdT.ctg = ecdf.ctg; ecsdT.ckid = ecdf.ckid; if (!pglecsd->FPush(&ecsdCur)) goto LFail; ecsdCur = ecsdT; } else { // pop up while there are no more children and there's something // to pop. while (ecsdCur.ckid <= 0 && pglecsd->IvMac() > 0) pglecsd->FPop(&ecsdCur); } } if (pglecsd->IvMac() > 0 || ecsdCur.ckid != 0) { LFail: // something failed or the data was bad ReleasePpo(&pcfl); } ReleasePpo(&pglecsd); AssertNilOrPo(pcfl, fcflFull | fcflGraph); return pcfl; } /*************************************************************************** Return whether the chunk contains a forest of subchunks. ***************************************************************************/ bool CFL::FForest(CTG ctg, CNO cno) { AssertThis(0); long icrp; CRP *qcrp; if (!_FFindCtgCno(ctg, cno, &icrp)) { Bug("chunk not there"); return fFalse; } qcrp = (CRP *)_pggcrp->QvFixedGet(icrp); Assert(qcrp->cki.ctg == ctg && qcrp->cki.cno == cno, 0); return FPure(qcrp->Grfcrp(fcrpForest)); } /*************************************************************************** Set or clear the "forest" flag. ***************************************************************************/ void CFL::SetForest(CTG ctg, CNO cno, bool fForest) { AssertThis(0); long icrp; CRP *qcrp; if (!_FFindCtgCno(ctg, cno, &icrp)) { Bug("chunk not there"); return; } qcrp = (CRP *)_pggcrp->QvFixedGet(icrp); Assert(qcrp->cki.ctg == ctg && qcrp->cki.cno == cno, 0); if (FPure(qcrp->Grfcrp(fcrpForest)) != FPure(fForest)) { if (fForest) qcrp->SetGrfcrp(fcrpForest); else qcrp->ClearGrfcrp(fcrpForest); _FSetRti(ctg, cno, rtiNil); } } /*************************************************************************** Read the chunk's data as an embedded forest and construct a CFL around the data. ***************************************************************************/ PCFL CFL::PcflReadForest(CTG ctg, CNO cno, bool fCopyData) { AssertThis(0); FLO flo; if (!FFindFlo(ctg, cno, &flo)) return pvNil; if (FPacked(ctg, cno)) { BLCK blck(&flo, fTrue); if (!blck.FUnpackData() || !blck.FGetFlo(&flo)) return pvNil; fCopyData = fFalse; } return PcflReadForestFromFlo(&flo, fCopyData); } /*************************************************************************** Static method: clear the marks for chunky files. ***************************************************************************/ void CFL::ClearMarks(void) { PCFL pcfl; for (pcfl = _pcflFirst; pcfl != pvNil; pcfl = pcfl->PcflNext()) { AssertPo(pcfl, 0); pcfl->_fMark = fFalse; } } /*************************************************************************** Static method: close any chunky files that are unmarked and have 0 open count. ***************************************************************************/ void CFL::CloseUnmarked(void) { PCFL pcfl, pcflNext; for (pcfl = _pcflFirst; pcfl != pvNil; pcfl = pcflNext) { AssertPo(pcfl, 0); pcflNext = pcfl->PcflNext(); if (!pcfl->_fMark && pcfl->_cactRef == 0) delete pcfl; } } /*************************************************************************** Set the grfcfl options. This sets or clears fcflTemp and only sets (never clears) fcflMark, fcflWriteEnable and fcflAddToExtra. This can only fail if fcflWriteEnable is specified and we can't make the base file write enabled. ***************************************************************************/ bool CFL::FSetGrfcfl(ulong grfcfl, ulong grfcflMask) { AssertThis(0); ulong grffil, grffilMask; grfcfl &= grfcflMask; grffil = _GrffilFromGrfcfl(grfcfl); grffilMask = _GrffilFromGrfcfl(grfcflMask); if ((grffil ^ _csto.pfil->GrffilCur()) & grffilMask) { // need to change some file properties if (_fInvalidMainFile || !_csto.pfil->FSetGrffil(grffil, grffilMask)) return fFalse; } // If we're becoming write enabled and we haven't read the free map yet, // do so now. Reading the free map is non-critical. if ((grfcfl & fcflWriteEnable) && _fFreeMapNotRead) _ReadFreeMap(); // don't clear the mark field if it's already set if (grfcfl & fcflMark) _fMark = fTrue; // don't clear the _fAddToExtra field if it's already set if ((grfcfl & fcflAddToExtra) || ((grfcfl ^ grfcflMask) & fcflWriteEnable)) _fAddToExtra = fTrue; if (grfcfl & fcflReadFromExtra) _fReadFromExtra = fTrue; return fTrue; } /*************************************************************************** Return the level of error that we've encountered for this chunky file. ***************************************************************************/ long CFL::ElError(void) { AssertThis(0); long elT; elT = _csto.pfil->ElError(); if (pvNil != _cstoExtra.pfil) elT = LwMax(elT, _cstoExtra.pfil->ElError()); return elT; } /*************************************************************************** Make sure the el level on both files is at or below el. ***************************************************************************/ void CFL::ResetEl(long el) { AssertThis(0); AssertIn(el, elNil, kcbMax); if (_csto.pfil->ElError() > el) _csto.pfil->SetEl(el); if (pvNil != _cstoExtra.pfil && _cstoExtra.pfil->ElError() > el) _cstoExtra.pfil->SetEl(el); } /*************************************************************************** Decrement the open count. If it is zero and the chunky file isn't marked, the file is closed. ***************************************************************************/ void CFL::Release(void) { AssertBaseThis(0); if (_cactRef <= 0) { Bug("calling Release without an AddRef"); return; } if (--_cactRef == 0 && !_fMark) delete this; } #ifdef DEBUG /*************************************************************************** Assert the validity of the chunky file. If fcflFull, does some checking of the index. If fcflGraph, does fcflFull and checks the graph structure for cycles. ***************************************************************************/ void CFL::AssertValid(ulong grfcfl) { CFL_PAR::AssertValid(fobjAllocated); bool fFirstCrp; long cbTot = 0; long cbTotExtra = 0; CKI ckiOld; CKI ckiNew; KID kid, kidOld; bool fFirstKid; long icrp, icrpT; long ccrpRefTot = 0; long ckidTot = 0; long cbVar, cbRgch; CRP crp; long ikid; FP fpBase = _fInvalidMainFile ? 0 : size(CFP); Assert(!_fInvalidMainFile || _fAddToExtra, 0); AssertPo(_pggcrp, 0); AssertPo(_csto.pfil, 0); if (_csto.pglfsm != pvNil) { AssertPo(_csto.pglfsm, 0); Assert(!_fFreeMapNotRead, "free map never read, but exists!"); } Assert(_csto.fpMac >= fpBase, "fpMac wrong"); if (_cstoExtra.pfil != pvNil) { AssertPo(_cstoExtra.pfil, 0); if (_cstoExtra.pglfsm != pvNil) AssertPo(_cstoExtra.pglfsm, 0); } else Assert(_cstoExtra.pglfsm == pvNil, 0); #ifndef CHUNK_BIG_INDEX AssertNilOrPo(_pglrtie, 0); #endif //! CHUNK_BIG_INDEX if (!(grfcfl & (fcflFull | fcflGraph))) return; SuspendAssertValid(); // Verify that the index and free map(s) are in sorted order. // Would be nice to verify ccrpRef and that crp's don't overlap, // but this is hard, so instead we verify that the sum of ccrpRef // values is correct and that the total length of all blocks is not // too big. fFirstCrp = fTrue; for (icrp = _pggcrp->IvMac(); icrp-- != 0;) { _pggcrp->GetFixed(icrp, &crp); cbVar = _pggcrp->Cb(icrp); cbRgch = crp.CbRgch(cbVar); AssertIn(crp.ckid, 0, kckidMax + 1); AssertIn(cbRgch, 0, kcbMaxDataStn + 1); // we use this in checking the graph structure Assert(!crp.Grfcrp(fcrpMarkT), "fcrpMarkT set"); ckiNew = crp.cki; ccrpRefTot += crp.ccrpRef; ckidTot += crp.ckid; #ifdef CHUNK_BIG_INDEX AssertIn(crp.rti, 0, _rtiLast + 1); #endif // CHUNK_BIG_INDEX // assert that the file storage (fp,cb) is OK if (crp.Grfcrp(fcrpOnExtra)) { Assert(_cstoExtra.pfil != pvNil, "fcrpOnExtra wrong"); AssertIn(crp.fp, 0, _cstoExtra.fpMac); AssertIn(crp.Cb(), 1, _cstoExtra.fpMac - crp.fp + 1); cbTotExtra += crp.Cb(); } else { AssertVar(crp.Cb() > 0 && (crp.fp >= fpBase) || crp.Cb() == 0 && crp.fp == 0, "bad fp", &crp.fp); AssertVar(crp.fp <= _csto.fpMac, "bad fp", &crp.fp); AssertIn(crp.Cb(), 0, _csto.fpMac - crp.fp + 1); cbTot += crp.Cb(); } // assert that this crp is in order AssertVar(fFirstCrp || ckiNew.ctg < ckiOld.ctg || ckiNew.ctg == ckiOld.ctg && ckiNew.cno < ckiOld.cno, "crp not in order", &ckiNew); ckiOld = ckiNew; fFirstCrp = fFalse; fFirstKid = fTrue; for (ikid = 0; ikid < crp.ckid; ikid++) { _pggcrp->GetRgb(icrp, _BvKid(ikid), size(KID), &kid); AssertVar(_FFindCtgCno(kid.cki.ctg, kid.cki.cno, &icrpT), "child doesn't exist", &kid.cki); Assert(kid.cki.ctg != ckiOld.ctg || kid.cki.cno != ckiOld.cno, "chunk is child of itself!"); Assert(fFirstKid || kidOld.chid < kid.chid || kidOld.chid == kid.chid && kidOld.cki.ctg < kid.cki.ctg || kidOld.chid == kid.chid && kidOld.cki.ctg == kid.cki.ctg && kidOld.cki.cno < kid.cki.cno, "kid's not sorted or duplicate kid"); kidOld = kid; fFirstKid = fFalse; } } Assert(ccrpRefTot == ckidTot, "ref counts messed up"); Assert(cbTotExtra <= _cstoExtra.fpMac, "overlapping chunks on extra"); Assert(cbTot <= _csto.fpMac - fpBase, "overlapping chunks on file"); if (_csto.pglfsm != pvNil) { long ifsm; FSM fsm; FP fpOld; fpOld = _csto.fpMac; for (ifsm = _csto.pglfsm->IvMac(); ifsm-- != 0;) { _csto.pglfsm->Get(ifsm, &fsm); Assert(fsm.fp >= fpBase && fsm.fp < fpOld, "bad fp in fsm"); Assert(fsm.cb + fsm.fp > fsm.fp && fsm.cb + fsm.fp < fpOld, "bad cb in fsm"); fpOld = fsm.fp; cbTot += fsm.cb; } Assert(cbTot <= _csto.fpMac - fpBase, "too much free space"); } if (_cstoExtra.pglfsm != pvNil) { long ifsm; FSM fsm; FP fpOld; fpOld = _cstoExtra.fpMac; for (ifsm = _cstoExtra.pglfsm->IvMac(); ifsm-- != 0;) { _cstoExtra.pglfsm->Get(ifsm, &fsm); Assert(fsm.fp >= 0 && fsm.fp < fpOld, "bad fp in fsm"); Assert(fsm.cb + fsm.fp > fsm.fp && fsm.cb + fsm.fp < fpOld, "bad cb in fsm"); fpOld = fsm.fp; cbTotExtra += fsm.cb; } Assert(cbTotExtra <= _cstoExtra.fpMac, "too much free space on extra"); } if (grfcfl & fcflGraph) Assert(_TValidIndex() != tNo, "bad index"); #ifndef CHUNK_BIG_INDEX // verify that the _pglrtie is in sorted order and all the chunks exist if (pvNil != _pglrtie && _pglrtie->IvMac() > 0) { long irtie; RTIE rtie, rtiePrev; long icrp; irtie = _pglrtie->IvMac() - 1; _pglrtie->Get(irtie, &rtie); Assert(rtiNil != rtie.rti && _FFindCtgCno(rtie.ctg, rtie.cno, &icrp), "Bad RTIE"); while (irtie-- > 0) { rtiePrev = rtie; _pglrtie->Get(irtie, &rtie); Assert(rtiNil != rtie.rti && _FFindCtgCno(rtie.ctg, rtie.cno, &icrp), "Bad RTIE"); Assert(rtie.ctg < rtiePrev.ctg || rtie.ctg == rtiePrev.ctg && rtie.cno < rtiePrev.cno, "RTIE out of order"); } } #endif //! CHUNK_BIG_INDEX ResumeAssertValid(); } /*************************************************************************** Mark memory used by the CFL ***************************************************************************/ void CFL::MarkMem(void) { AssertThis(0); CFL_PAR::MarkMem(); MarkMemObj(_pggcrp); MarkMemObj(_csto.pglfsm); MarkMemObj(_cstoExtra.pglfsm); #ifndef CHUNK_BIG_INDEX MarkMemObj(_pglrtie); #endif //! CHUNK_BIG_INDEX } #endif // DEBUG /*************************************************************************** Checks for cycles and other consistency in the chunky index. If we find something wrong, return tNo. If a memory error occurs, return tMaybe. If it's AOK, return tYes. ***************************************************************************/ tribool CFL::_TValidIndex(void) { // WARNING: this is called by a full CFL::AssertValid(). long icrp, icrpT; CRP *qcrp; CGE cge; ulong grfcge, grfcgeIn; KID kid; long cbVar; long ccrpRefTot; long ckidTot; // first clear all fcrpMarkT fields ccrpRefTot = ckidTot = 0; for (icrp = _pggcrp->IvMac(); icrp-- != 0;) { qcrp = (CRP *)_pggcrp->QvFixedGet(icrp, &cbVar); if (!FIn(qcrp->ckid, 0, cbVar / size(KID) + 1)) return tNo; if (!FIn(qcrp->ccrpRef, 0, kckidMax + 1)) return tNo; ccrpRefTot += qcrp->ccrpRef; ckidTot += qcrp->ckid; qcrp->ClearGrfcrp(fcrpMarkT); } if (ccrpRefTot != ckidTot) return tNo; SuspendAssertValid(); SuspendCheckPointers(); // now enumerate over root level graphs, marking descendents on the // pre-pass and unmarking on the post pass - this catches cycles // NOTE: we must do this before checking for orphan subgraphs, so we don't // end up in an infinite loop in the orphan check. for (icrp = _pggcrp->IvMac(); icrp-- != 0;) { qcrp = (CRP *)_pggcrp->QvFixedGet(icrp); if (qcrp->ccrpRef > 0 || qcrp->ckid == 0) continue; // this is not a child node and has children, so enum its subgraph cge.Init(this, qcrp->cki.ctg, qcrp->cki.cno); while (cge.FNextKid(&kid, pvNil, &grfcge, fcgeNil)) { if (grfcge & fcgeError) { ResumeAssertValid(); ResumeCheckPointers(); return tMaybe; } if (!_FFindCtgCno(kid.cki.ctg, kid.cki.cno, &icrpT)) { ResumeAssertValid(); ResumeCheckPointers(); return tNo; } qcrp = (CRP *)_pggcrp->QvFixedGet(icrpT); if (grfcge & fcgePre) { if (qcrp->Grfcrp(fcrpMarkT)) { // has a cycle here ResumeAssertValid(); ResumeCheckPointers(); return tNo; } qcrp->SetGrfcrp(fcrpMarkT); } if (grfcge & fcgePost) { Assert(qcrp->Grfcrp(fcrpMarkT), "why isn't this marked?"); qcrp->ClearGrfcrp(fcrpMarkT); } } } // now enumerate over root level graphs, marking all descendents // this will find orphan subgraphs and validate (ccrpRef > 0). for (icrp = _pggcrp->IvMac(); icrp-- != 0;) { qcrp = (CRP *)_pggcrp->QvFixedGet(icrp); if (qcrp->ccrpRef > 0 || qcrp->ckid == 0) continue; // this is not a child node and has some children, so enum its subgraph cge.Init(this, qcrp->cki.ctg, qcrp->cki.cno); grfcgeIn = fcgeNil; while (cge.FNextKid(&kid, pvNil, &grfcge, grfcgeIn)) { grfcgeIn = fcgeNil; if (grfcge & fcgeError) { ResumeAssertValid(); ResumeCheckPointers(); return tMaybe; } if ((grfcge & fcgePre) && !(grfcge & fcgeRoot)) { if (!_FFindCtgCno(kid.cki.ctg, kid.cki.cno, &icrpT)) { ResumeAssertValid(); ResumeCheckPointers(); return tNo; } qcrp = (CRP *)_pggcrp->QvFixedGet(icrpT); if (qcrp->Grfcrp(fcrpMarkT)) grfcgeIn = fcgeSkipToSib; else qcrp->SetGrfcrp(fcrpMarkT); } } } // make sure the fcrpMarkT fields are set iff (ccrpRef > 0) for (icrp = _pggcrp->IvMac(); icrp-- != 0;) { qcrp = (CRP *)_pggcrp->QvFixedGet(icrp); if ((qcrp->ccrpRef != 0) != FPure(qcrp->Grfcrp(fcrpMarkT))) { ResumeAssertValid(); ResumeCheckPointers(); return tNo; } qcrp->ClearGrfcrp(fcrpMarkT); } ResumeAssertValid(); ResumeCheckPointers(); return tYes; } /*************************************************************************** Verifies that this is a chunky file and reads the index into memory. Sets the _fpFreeMap and _cbFreeMap fields and sets the _fFreeMapNotRead flag. The free map is read separately by _ReadFreeMap. This is to avoid hogging memory for the free map when we may never need it. ***************************************************************************/ bool CFL::_FReadIndex(void) { AssertBaseThis(0); AssertPo(_csto.pfil, 0); Assert(!_fInvalidMainFile, 0); CFP cfp; FP fpMac; short bo; short osk; long cbVar; long cbRgch; long icrp, ccrp; long cbFixed; BOM bom; // used for old name stuff SZS szsName; STN stn; bool fOldNames; // used for old index stuff bool fOldIndex; Assert(_pggcrp == pvNil && _csto.pglfsm == pvNil && _cstoExtra.pfil == pvNil && _cstoExtra.pglfsm == pvNil, "cfl has wrong non-nil entries"); // verify that this is a chunky file if ((fpMac = _csto.pfil->FpMac()) < size(CFP)) return fFalse; if (!_csto.pfil->FReadRgb(&cfp, size(cfp), 0)) return fFalse; // check the magic number and byte order indicator if (cfp.lwMagic != klwMagicChunky || cfp.bo != kboCur && cfp.bo != kboOther) { return fFalse; } if (cfp.bo == kboOther) SwapBytesBom(&cfp, kbomCfp); // check the version numbers if (!cfp.dver.FReadable(kcvnCur, kcvnMin)) return fFalse; // if the file has old style chunk names, translate them fOldNames = cfp.dver._swCur < kcvnMinStnNames; // whether the index needs converted fOldIndex = cfp.dver._swCur < kcvnMinGrfcrp; // verify the fp's and cb's // the index and map should be last if (!FIn(cfp.fpMac, size(cfp), fpMac + 1) || !FIn(cfp.fpIndex, size(cfp), cfp.fpMac + 1) || !FIn(cfp.cbIndex, 1, cfp.fpMac - cfp.fpIndex + 1) || cfp.fpMap != cfp.fpIndex + cfp.cbIndex || cfp.fpMap + cfp.cbMap != cfp.fpMac) { return fFalse; } // read and validate the index if ((_pggcrp = GG::PggRead(_csto.pfil, cfp.fpIndex, cfp.cbIndex, &bo, &osk)) == pvNil) { return fFalse; } cbFixed = _pggcrp->CbFixed(); if (cbFixed != size(CRPBG) && (fOldIndex || cbFixed != size(CRPSM))) return fFalse; // Clean the index AssertBomRglw(kbomKid, size(KID)); _pggcrp->Lock(); if (cbFixed == size(CRPBG)) { // Big index CRPBG *pcrpbg; bom = (bo != kboCur) ? (fOldIndex ? kbomCrpbgBytes : kbomCrpbgGrfcrp) : bomNil; for (icrp = _pggcrp->IvMac(); icrp-- != 0;) { pcrpbg = (CRPBG *)_pggcrp->QvFixedGet(icrp, &cbVar); #ifndef CHUNK_BIG_INDEX // make sure we can convert this CRP to a small index CRP if (pcrpbg->cb > kcbMaxCrpsm || pcrpbg->ckid > kckidMax || pcrpbg->ccrpRef > kckidMax) { goto LBadFile; } #endif //! CHUNK_BIG_INDEX if (!FIn(cbVar, 0, kcbMax)) goto LBadFile; if (bomNil != bom) SwapBytesBom(pcrpbg, bom); if (!FIn(pcrpbg->ckid, 0, cbVar / size(KID) + 1) || (cbRgch = pcrpbg->CbRgch(cbVar)) > kcbMaxDataStn) { goto LBadFile; } if (bomNil != bom && pcrpbg->ckid > 0) { SwapBytesRglw(_pggcrp->QvGet(icrp), pcrpbg->ckid * (size(KID) / size(long))); } pcrpbg->rti = rtiNil; if (fOldIndex) { ulong grfcrp = fcrpNil; if (pcrpbg->fLoner) grfcrp |= fcrpLoner; if (pcrpbg->fPacked) grfcrp |= fcrpPacked; pcrpbg->grfcrp = grfcrp; } else pcrpbg->ClearGrfcrp(fcrpOnExtra); if (pcrpbg->ccrpRef == 0) pcrpbg->SetGrfcrp(fcrpLoner); AssertIn(cbRgch, 0, kcbMaxDataStn + 1); if (fOldNames && cbRgch > 0) { // translate the name long bvRgch = pcrpbg->BvRgch(); if (cbRgch < size(szsName)) { long cbNew; CopyPb(PvAddBv(_pggcrp->QvGet(icrp), bvRgch), szsName, cbRgch); szsName[cbRgch] = 0; stn.SetSzs(szsName); cbNew = stn.CbData(); if (cbRgch != cbNew) { _pggcrp->Unlock(); if (cbRgch < cbNew) { if (!_pggcrp->FInsertRgb(icrp, bvRgch, cbNew - cbRgch, pvNil)) { goto LNukeName; } } else _pggcrp->DeleteRgb(icrp, bvRgch, cbRgch - cbNew); _pggcrp->Lock(); } stn.GetData(PvAddBv(_pggcrp->QvGet(icrp), bvRgch)); } else { // just nuke the name _pggcrp->Unlock(); LNukeName: _pggcrp->DeleteRgb(icrp, bvRgch, cbRgch); _pggcrp->Lock(); } } } } else { // Small index Assert(size(CRPSM) == cbFixed, 0); CRPSM *pcrpsm; bom = (bo != kboCur) ? kbomCrpsm : bomNil; for (icrp = _pggcrp->IvMac(); icrp-- != 0;) { pcrpsm = (CRPSM *)_pggcrp->QvFixedGet(icrp, &cbVar); if (!FIn(cbVar, 0, kcbMax)) goto LBadFile; if (bomNil != bom) SwapBytesBom(pcrpsm, bom); if (!FIn(pcrpsm->ckid, 0, cbVar / size(KID) + 1) || (cbRgch = pcrpsm->CbRgch(cbVar)) > kcbMaxDataStn) { goto LBadFile; } if (pcrpsm->ckid > 0 && bomNil != bom) { SwapBytesRglw(_pggcrp->QvGet(icrp), pcrpsm->ckid * (size(KID) / size(long))); } pcrpsm->ClearGrfcrp(fcrpOnExtra); if (pcrpsm->ccrpRef == 0 && !pcrpsm->Grfcrp(fcrpLoner)) { LBadFile: _pggcrp->Unlock(); Bug("corrupt crp"); ReleasePpo(&_pggcrp); return fFalse; } } } if (size(CRP) != cbFixed) { // need to convert the index (from big to small or small to big) PGG pggcrp; CRPOTH *pcrpOld; CRP crp; if (pvNil == (pggcrp = GG::PggNew(size(CRP), _pggcrp->IvMac()))) goto LFail; for (ccrp = _pggcrp->IvMac(), icrp = 0; icrp < ccrp; icrp++) { pcrpOld = (CRPOTH *)_pggcrp->QvFixedGet(icrp, &cbVar); crp.cki = pcrpOld->cki; crp.fp = pcrpOld->fp; crp.SetCb(pcrpOld->Cb()); crp.ckid = (CKID)pcrpOld->ckid; crp.ccrpRef = (CKID)pcrpOld->ccrpRef; crp.AssignGrfcrp(pcrpOld->Grfcrp()); #ifdef CHUNK_BIG_INDEX crp.rti = rtiNil; #endif // CHUNK_BIG_INDEX if (!pggcrp->FInsert(icrp, _pggcrp->Cb(icrp), _pggcrp->QvGet(icrp), &crp)) { ReleasePpo(&pggcrp); LFail: _pggcrp->Unlock(); return fFalse; } } _pggcrp->Unlock(); ReleasePpo(&_pggcrp); _pggcrp = pggcrp; } else _pggcrp->Unlock(); _cbFreeMap = cfp.cbMap; _fpFreeMap = cfp.fpMap; _fFreeMapNotRead = cfp.cbMap > 0; _csto.fpMac = cfp.fpIndex; return fTrue; } /*************************************************************************** Assert that the free map hasn't been read (and doesn't exist). Read the free map from the file. This _cannot_ be called after chunk data has been added to the main file (as opposed to the extra file). This _cannot_ be called before _FReadIndex has been called. ***************************************************************************/ void CFL::_ReadFreeMap(void) { AssertBaseThis(0); Assert(_fFreeMapNotRead, "free map already read"); Assert(!_fInvalidMainFile, 0); short bo; short osk; long cfsm; // clear this even if reading the free map fails - so we don't try to // read again _fFreeMapNotRead = fFalse; if (_csto.pglfsm != pvNil) { Bug("free map already exists"); return; } if (_cbFreeMap > 0) { if ((_csto.pglfsm = GL::PglRead(_csto.pfil, _fpFreeMap, _cbFreeMap, &bo, &osk)) == pvNil || _csto.pglfsm->CbEntry() != size(FSM)) { // it failed, but so what ReleasePpo(&_csto.pglfsm); return; } // swap bytes AssertBomRglw(kbomFsm, size(FSM)); if (bo != kboCur && (cfsm = _csto.pglfsm->IvMac()) > 0) { SwapBytesRglw(_csto.pglfsm->QvGet(0), cfsm * (size(FSM) / size(long))); } } } /*************************************************************************** If we have don't have write permission or there's an extra file, write out a new file and do the rename stuff. If not, just write the index and free map. ***************************************************************************/ bool CFL::FSave(CTG ctgCreator, FNI *pfni) { AssertThis(fcflFull | fcflGraph); AssertNilOrPo(pfni, ffniFile); FNI fni; FLO floSrc, floDst; long ccrp, icrp; CRP *qcrp; PFIL pfilOld; if (_fInvalidMainFile) { if (pvNil == pfni) { Bug("can't save a CFL that has no file attached!"); return fFalse; } fni = *pfni; } else { GetFni(&fni); if (pfni != pvNil) { if (pfni->FEqual(&fni)) pfni = pvNil; else fni = *pfni; } } if (!_fAddToExtra && _cstoExtra.pfil == pvNil && pfni == pvNil) { // just write the index Assert(!_fFreeMapNotRead, "why hasn't the free map been read?"); if (!_FWriteIndex(ctgCreator)) goto LError; return fTrue; } // get a temp name in the same directory as the target if ((floDst.pfil = FIL::PfilCreateTemp(&fni)) == pvNil) goto LError; if (!floDst.pfil->FSetFpMac(size(CFP))) goto LFail; floDst.fp = size(CFP); ccrp = _pggcrp->IvMac(); for (icrp = 0; icrp < ccrp; icrp++) { qcrp = (CRP *)_pggcrp->QvFixedGet(icrp); floSrc.pfil = qcrp->Grfcrp(fcrpOnExtra) ? _cstoExtra.pfil : _csto.pfil; floSrc.fp = qcrp->fp; floSrc.cb = floDst.cb = qcrp->Cb(); if (floSrc.cb > 0 && !floSrc.FCopy(&floDst)) { LFail: Assert(floDst.pfil->FTemp(), "file not a temp"); ReleasePpo(&floDst.pfil); goto LError; } floDst.fp += floDst.cb; } // All the data has been copied. Update the index to point to the new file. floSrc.fp = size(CFP); for (icrp = 0; icrp < ccrp; icrp++) { qcrp = (CRP *)_pggcrp->QvFixedGet(icrp); qcrp->ClearGrfcrp(fcrpOnExtra); qcrp->fp = qcrp->Cb() > 0 ? floSrc.fp : 0; floSrc.fp += qcrp->Cb(); } Assert(floSrc.fp == floDst.fp, "what happened? - file messed up"); // update the csto's and write the index pfilOld = _csto.pfil; ReleasePpo(&_csto.pglfsm); _fFreeMapNotRead = fFalse; _csto.pfil = floDst.pfil; _csto.fpMac = floDst.fp; _csto.pfil->SetTemp(_fInvalidMainFile || pfilOld->FTemp()); if (_cstoExtra.pfil != pvNil) { _cstoExtra.fpMac = 0; ReleasePpo(&_cstoExtra.pfil); ReleasePpo(&_cstoExtra.pglfsm); } // write the index if (!_FWriteIndex(ctgCreator)) goto LIndexFail; if (pfni != pvNil) { // delete any existing file with this name, then rename our output // file to the given name if (pfni->TExists() != tNo) pfni->FDelete(); if (!_csto.pfil->FRename(pfni)) goto LIndexFail; _fInvalidMainFile = fFalse; } else if (!_csto.pfil->FSwapNames(pfilOld)) { LIndexFail: if (_fInvalidMainFile) { // we can just use the new file now. ReleasePpo(&pfilOld); // release our claim on the old file } else { // restore the original csto and make floDst.pfil the extra file _csto.pfil = pfilOld; _csto.fpMac = size(CFP); for (icrp = 0; icrp < ccrp; icrp++) { qcrp = (CRP *)_pggcrp->QvFixedGet(icrp); if (qcrp->Cb() > 0) qcrp->SetGrfcrp(fcrpOnExtra); } _cstoExtra.pfil = floDst.pfil; floDst.pfil->SetTemp(fTrue); _cstoExtra.fpMac = floDst.fp; } LError: PushErc(ercCflSave); AssertThis(fcflFull | fcflGraph); return fFalse; } // everything worked if (pfni == pvNil) pfilOld->SetTemp(fTrue); ReleasePpo(&pfilOld); // release our claim on the old file AssertThis(fcflFull | fcflGraph); return fTrue; } /*************************************************************************** Write the chunky index and free map to the end of the file. ***************************************************************************/ bool CFL::_FWriteIndex(CTG ctgCreator) { AssertBaseThis(0); AssertPo(_pggcrp, 0); AssertPo(_csto.pfil, 0); CFP cfp; BLCK blck; ClearPb(&cfp, size(cfp)); cfp.lwMagic = klwMagicChunky; cfp.ctgCreator = ctgCreator; cfp.dver.Set(kcvnCur, kcvnBack); cfp.bo = kboCur; cfp.osk = koskCur; blck.Set(_csto.pfil, cfp.fpIndex = _csto.fpMac, cfp.cbIndex = _pggcrp->CbOnFile()); if (!_pggcrp->FWrite(&blck)) return fFalse; cfp.fpMap = cfp.fpIndex + cfp.cbIndex; if (_csto.pglfsm != pvNil) { AssertDo(blck.FMoveMin(cfp.cbIndex), 0); AssertDo(blck.FMoveLim(cfp.cbMap = _csto.pglfsm->CbOnFile()), 0); if (!_csto.pglfsm->FWrite(&blck)) return fFalse; } else cfp.cbMap = 0; cfp.fpMac = cfp.fpMap + cfp.cbMap; return _csto.pfil->FWriteRgb(&cfp, size(cfp), 0); } /*************************************************************************** Save a copy of the chunky file out to *pfni. The CFL and its FIL are untouched. ***************************************************************************/ bool CFL::FSaveACopy(CTG ctgCreator, FNI *pfni) { AssertThis(fcflFull | fcflGraph); AssertPo(pfni, ffniFile); PCFL pcflDst; long icrp, ccrp; CRP *pcrp; CRP crp; FLO floSrc, floDst; if (pvNil == (pcflDst = CFL::PcflCreate(pfni, fcflWriteEnable))) goto LError; // initialize the destination FLO. floDst.pfil = pcflDst->_csto.pfil; floDst.fp = size(CFP); // need to lock the _pggcrp for the FInsert operations below ccrp = _pggcrp->IvMac(); _pggcrp->Lock(); for (icrp = 0; icrp < ccrp; icrp++, floDst.fp += floDst.cb) { pcrp = (CRP *)_pggcrp->QvFixedGet(icrp); crp = *pcrp; // get the source and destination FLOs floSrc.pfil = pcrp->Grfcrp(fcrpOnExtra) ? _cstoExtra.pfil : _csto.pfil; floSrc.fp = pcrp->fp; floDst.cb = floSrc.cb = pcrp->Cb(); // copy the data if (!floSrc.FCopy(&floDst)) { _pggcrp->Unlock(); goto LFail; } // create the index entry - the only things that change are the // (fp, cb) and the fcrpOnExtra flag. crp.fp = floDst.fp; crp.SetCb(floDst.cb); crp.ClearGrfcrp(fcrpOnExtra); if (!pcflDst->_pggcrp->FInsert(icrp, _pggcrp->Cb(icrp), _pggcrp->QvGet(icrp), &crp)) { _pggcrp->Unlock(); goto LFail; } } _pggcrp->Unlock(); // set the fpMac of the destination CFL pcflDst->_csto.fpMac = floDst.fp; if (!pcflDst->FSave(ctgCreator)) { LFail: pcflDst->SetTemp(fTrue); ReleasePpo(&pcflDst); LError: PushErc(ercCflSaveCopy); return fFalse; } ReleasePpo(&pcflDst); return fTrue; } /*************************************************************************** Return whether the chunk's data is on the extra file. ***************************************************************************/ bool CFL::FOnExtra(CTG ctg, CNO cno) { AssertThis(0); long icrp; CRP *qcrp; if (!_FFindCtgCno(ctg, cno, &icrp)) return fFalse; qcrp = (CRP *)_pggcrp->QvFixedGet(icrp); return FPure(qcrp->Grfcrp(fcrpOnExtra)); } /*************************************************************************** Make sure the given chunk's data is on the extra file. Fails iff the chunk doesn't exist or copying the data failed. ***************************************************************************/ bool CFL::FEnsureOnExtra(CTG ctg, CNO cno) { AssertThis(0); long icrp; if (!_FFindCtgCno(ctg, cno, &icrp)) return fFalse; return _FEnsureOnExtra(icrp); } /*************************************************************************** Make sure the given chunk's data is on the extra file. Optionally get the flo for the data. ***************************************************************************/ bool CFL::_FEnsureOnExtra(long icrp, FLO *pflo) { AssertThis(0); AssertNilOrVarMem(pflo); CRP *qcrp; qcrp = (CRP *)_pggcrp->QvFixedGet(icrp); if (qcrp->Grfcrp(fcrpOnExtra) || qcrp->Cb() == 0) { if (pvNil != pflo) { pflo->pfil = _cstoExtra.pfil; pflo->fp = qcrp->fp; pflo->cb = qcrp->Cb(); } } else { FLO floSrc, floDst; #ifdef CHUNK_STATS if (vfDumpChunkRequests) { STN stn; qcrp = (CRP *)_pggcrp->QvFixedGet(icrp); stn.FFormatSz(PszLit("Cache: '%f', 0x%08x, fp = 0x%08x, cb = 0x%08x"), qcrp->cki.ctg, qcrp->cki.cno, qcrp->fp, qcrp->Cb()); DumpStn(&stn, _csto.pfil); } #endif // CHUNK_STATS floSrc.pfil = _csto.pfil; floSrc.fp = qcrp->fp; floSrc.cb = qcrp->Cb(); if (!_FAllocFlo(floSrc.cb, &floDst, fTrue)) return fFalse; if (!floSrc.FCopy(&floDst)) { _FreeFpCb(fTrue, floDst.fp, floDst.cb); return fFalse; } qcrp = (CRP *)_pggcrp->QvFixedGet(icrp); qcrp->SetGrfcrp(fcrpOnExtra); qcrp->fp = floDst.fp; if (pvNil != pflo) *pflo = floDst; } #ifdef CHUNK_STATS if (pvNil != pflo && vfDumpChunkRequests) { STN stn; qcrp = (CRP *)_pggcrp->QvFixedGet(icrp); stn.FFormatSz(PszLit("Fetch from extra: '%f', 0x%08x, fp = 0x%08x, cb = 0x%08x"), qcrp->cki.ctg, qcrp->cki.cno, qcrp->fp, qcrp->Cb()); DumpStn(&stn, _csto.pfil); } #endif // CHUNK_STATS return fTrue; } /*************************************************************************** Get the FLO from the chunk. ***************************************************************************/ void CFL::_GetFlo(long icrp, PFLO pflo) { AssertThis(0); AssertVarMem(pflo); if (!_fReadFromExtra || !_FEnsureOnExtra(icrp, pflo)) { CRP *qcrp; qcrp = (CRP *)_pggcrp->QvFixedGet(icrp); pflo->pfil = qcrp->Grfcrp(fcrpOnExtra) ? _cstoExtra.pfil : _csto.pfil; pflo->fp = qcrp->fp; pflo->cb = qcrp->Cb(); #ifdef CHUNK_STATS if (vfDumpChunkRequests) { STN stn; qcrp = (CRP *)_pggcrp->QvFixedGet(icrp); stn.FFormatSz(PszLit("Fetch from %z: '%f', 0x%08x, fp = 0x%08x, cb = 0x%08x"), qcrp->Grfcrp(fcrpOnExtra) ? PszLit("extra") : PszLit("main"), qcrp->cki.ctg, qcrp->cki.cno, qcrp->fp, qcrp->Cb()); DumpStn(&stn, _csto.pfil); } #endif // CHUNK_STATS } AssertPo(pflo->pfil, 0); } /*************************************************************************** Get the BLCK from the chunk. ***************************************************************************/ void CFL::_GetBlck(long icrp, PBLCK pblck) { AssertThis(0); AssertPo(pblck, 0); FLO flo; CRP *qcrp; _GetFlo(icrp, &flo); qcrp = (CRP *)_pggcrp->QvFixedGet(icrp); pblck->Set(&flo, qcrp->Grfcrp(fcrpPacked)); } /*************************************************************************** Map the (ctg, cno) to a BLCK. ***************************************************************************/ bool CFL::FFind(CTG ctg, CNO cno, BLCK *pblck) { AssertThis(0); AssertNilOrPo(pblck, 0); long icrp; if (!_FFindCtgCno(ctg, cno, &icrp)) { if (pvNil != pblck) pblck->Free(); return fFalse; } if (pvNil != pblck) _GetBlck(icrp, pblck); return fTrue; } /*************************************************************************** Map the (ctg, cno) to a pflo. ***************************************************************************/ bool CFL::FFindFlo(CTG ctg, CNO cno, PFLO pflo) { AssertThis(0); AssertVarMem(pflo); long icrp; if (!_FFindCtgCno(ctg, cno, &icrp)) { TrashVar(pflo); return fFalse; } _GetFlo(icrp, pflo); return fTrue; } /*************************************************************************** Reads the chunk (if it exists) into an hq. Returns false if the chunk doesn't exist or something failed, in which case *phq is set to hqNil. Doesn't unpack the data if it's packed. ***************************************************************************/ bool CFL::FReadHq(CTG ctg, CNO cno, HQ *phq) { AssertThis(0); AssertVarMem(phq); BLCK blck; *phq = hqNil; // in case FFind fails return FFind(ctg, cno, &blck) && blck.FReadHq(phq, fTrue); } /*************************************************************************** Make sure the packed flag is set or clear according to fPacked. This doesn't affect the data at all. ***************************************************************************/ void CFL::SetPacked(CTG ctg, CNO cno, bool fPacked) { AssertThis(0); long icrp; CRP *qcrp; if (!_FFindCtgCno(ctg, cno, &icrp)) { Bug("chunk not there"); return; } qcrp = (CRP *)_pggcrp->QvFixedGet(icrp); Assert(qcrp->cki.ctg == ctg && qcrp->cki.cno == cno, 0); if (FPure(qcrp->Grfcrp(fcrpPacked)) != FPure(fPacked)) { if (fPacked) qcrp->SetGrfcrp(fcrpPacked); else qcrp->ClearGrfcrp(fcrpPacked); _FSetRti(ctg, cno, rtiNil); } } /*************************************************************************** Return the value of the packed flag. ***************************************************************************/ bool CFL::FPacked(CTG ctg, CNO cno) { AssertThis(0); long icrp; CRP *qcrp; if (!_FFindCtgCno(ctg, cno, &icrp)) { Bug("chunk not there"); return fFalse; } qcrp = (CRP *)_pggcrp->QvFixedGet(icrp); Assert(qcrp->cki.ctg == ctg && qcrp->cki.cno == cno, 0); return FPure(qcrp->Grfcrp(fcrpPacked)); } /*************************************************************************** If the data for the chunk is packed, unpack it. ***************************************************************************/ bool CFL::FUnpackData(CTG ctg, CNO cno) { AssertThis(0); BLCK blck; if (!FPacked(ctg, cno)) return fTrue; AssertDo(FFind(ctg, cno, &blck), 0); if (!blck.FUnpackData()) return fFalse; return FPutBlck(&blck, ctg, cno); } /*************************************************************************** If the data isn't already packed, pack it. ***************************************************************************/ bool CFL::FPackData(CTG ctg, CNO cno) { AssertThis(0); BLCK blck; if (FPacked(ctg, cno)) return fTrue; AssertDo(FFind(ctg, cno, &blck), 0); if (!blck.FPackData()) return fFalse; return FPutBlck(&blck, ctg, cno); } /*************************************************************************** Create the extra file. Note: the extra file doesn't have a CFP - just raw data. ***************************************************************************/ bool CFL::_FCreateExtra(void) { AssertBaseThis(0); Assert(_cstoExtra.pfil == pvNil, 0); Assert(_cstoExtra.pglfsm == pvNil, 0); if (pvNil == (_cstoExtra.pfil = FIL::PfilCreateTemp())) return fFalse; _cstoExtra.fpMac = 0; return fTrue; } /*************************************************************************** Find a place to put a block the given size. ***************************************************************************/ bool CFL::_FAllocFlo(long cb, PFLO pflo, bool fForceOnExtra) { AssertBaseThis(0); AssertIn(cb, 0, kcbMax); AssertVarMem(pflo); CSTO *pcsto; long cfsm, ifsm; FSM *qfsm; if (cb > kcbMaxCrp) { Bug("Requested FLO too big"); return fFalse; } if ((fForceOnExtra || _fAddToExtra) && cb > 0) { pcsto = &_cstoExtra; if (pcsto->pfil == pvNil && !_FCreateExtra()) { TrashVar(pflo); return fFalse; } } else { Assert(!_fFreeMapNotRead, "free map not read yet"); pcsto = &_csto; } // set the file and cb - just need to find an fp AssertPo(pcsto->pfil, 0); pflo->pfil = pcsto->pfil; pflo->cb = cb; if (cb <= 0) { pflo->fp = 0; pflo->cb = 0; // for safety return fTrue; } // look for a free spot in the free space map if (pcsto->pglfsm != pvNil && (cfsm = pcsto->pglfsm->IvMac()) > 0) { qfsm = (FSM *)pcsto->pglfsm->QvGet(0); for (ifsm = 0; ifsm < cfsm; ifsm++, qfsm++) { if (qfsm->cb >= cb) { // can put it here pflo->fp = qfsm->fp; if (qfsm->cb == cb) pcsto->pglfsm->Delete(ifsm); else { qfsm->cb -= cb; qfsm->fp += cb; } return fTrue; } } } // put it at the end of the file if (pcsto->fpMac + cb > pcsto->pfil->FpMac() && !pcsto->pfil->FSetFpMac(pcsto->fpMac + cb)) { TrashVar(pflo); return fFalse; } pflo->fp = pcsto->fpMac; pcsto->fpMac += cb; return fTrue; } /*************************************************************************** Look for the (ctg, cno) pair. Fills *picrp with where it should be. Returns whether or not it was found. Assumes the _pggcrp is sorted by (ctg, cno). Does a binary search. ***************************************************************************/ bool CFL::_FFindCtgCno(CTG ctg, CNO cno, long *picrp) { // WARNING: this is called by CFL::AssertValid, so be careful about // asserting stuff in here AssertBaseThis(0); AssertVarMem(picrp); AssertPo(_pggcrp, 0); long ccrp, icrpMin, icrpLim, icrp; CKI cki; if ((ccrp = _pggcrp->IvMac()) == 0) { *picrp = 0; return fFalse; } for (icrpMin = 0, icrpLim = ccrp; icrpMin < icrpLim;) { icrp = (icrpMin + icrpLim) / 2; cki = ((CRP *)_pggcrp->QvFixedGet(icrp))->cki; if (cki.ctg < ctg) icrpMin = icrp + 1; else if (cki.ctg > ctg) icrpLim = icrp; else if (cki.cno < cno) icrpMin = icrp + 1; else if (cki.cno > cno) icrpLim = icrp; else { *picrp = icrp; return fTrue; } } *picrp = icrpMin; return fFalse; } /*************************************************************************** Find an unused cno for the given ctg. Fill in *picrp and *pcno. ***************************************************************************/ void CFL::_GetUniqueCno(CTG ctg, long *picrp, CNO *pcno) { AssertBaseThis(0); AssertVarMem(picrp); AssertVarMem(pcno); long icrp, ccrp; CNO cno; CRP *qcrp; if (!_FFindCtgCno(ctg, 0, picrp)) { *pcno = 0; return; } // 0 already exists so do a linear search for the first useable slot ccrp = _pggcrp->IvMac(); for (icrp = *picrp + 1, cno = 1; icrp < ccrp; icrp++, cno++) { qcrp = (CRP *)_pggcrp->QvFixedGet(icrp); if (qcrp->cki.ctg != ctg || qcrp->cki.cno != cno) break; } *picrp = icrp; *pcno = cno; } /*************************************************************************** Add a new chunk. ***************************************************************************/ bool CFL::FAdd(long cb, CTG ctg, CNO *pcno, PBLCK pblck) { AssertThis(0); AssertIn(cb, 0, kcbMax); AssertVarMem(pcno); AssertNilOrPo(pblck, 0); long icrp; _GetUniqueCno(ctg, &icrp, pcno); if (!_FAdd(cb, ctg, *pcno, icrp, pblck)) { TrashVar(pcno); AssertThis(0); return fFalse; } AssertThis(0); return fTrue; } /*************************************************************************** Add a new chunk and write the pv to it. ***************************************************************************/ bool CFL::FAddPv(void *pv, long cb, CTG ctg, CNO *pcno) { AssertThis(0); AssertVarMem(pcno); AssertIn(cb, 0, kcbMax); AssertPvCb(pv, cb); BLCK blck; if (!FAdd(cb, ctg, pcno, &blck)) return fFalse; if (!blck.FWrite(pv)) { Delete(ctg, *pcno); TrashVar(pcno); return fFalse; } return fTrue; } /*************************************************************************** Add a new chunk and write the hq to it. ***************************************************************************/ bool CFL::FAddHq(HQ hq, CTG ctg, CNO *pcno) { AssertThis(0); AssertVarMem(pcno); AssertHq(hq); BLCK blck; long cb = CbOfHq(hq); if (!FAdd(cb, ctg, pcno, &blck)) return fFalse; if (!blck.FWriteHq(hq, 0)) { Delete(ctg, *pcno); TrashVar(pcno); return fFalse; } return fTrue; } /*************************************************************************** Add a new chunk and write the block to it. ***************************************************************************/ bool CFL::FAddBlck(PBLCK pblckSrc, CTG ctg, CNO *pcno) { AssertThis(0); AssertPo(pblckSrc, 0); AssertVarMem(pcno); BLCK blck; long cb = pblckSrc->Cb(fTrue); if (!FAdd(cb, ctg, pcno, &blck)) return fFalse; if (!pblckSrc->FWriteToBlck(&blck, fTrue)) { Delete(ctg, *pcno); TrashVar(pcno); return fFalse; } if (pblckSrc->FPacked()) SetPacked(ctg, *pcno, fTrue); return fTrue; } /*************************************************************************** Adds the chunk and makes it a child of (ctgPar, cnoPar). The loner flag of the new chunk will be clear. ***************************************************************************/ bool CFL::FAddChild(CTG ctgPar, CNO cnoPar, CHID chid, long cb, CTG ctg, CNO *pcno, PBLCK pblck) { AssertThis(0); AssertVarMem(pcno); AssertNilOrPo(pblck, 0); if (!FAdd(cb, ctg, pcno, pblck)) return fFalse; if (!FAdoptChild(ctgPar, cnoPar, ctg, *pcno, chid, fTrue)) { Delete(ctg, *pcno); TrashVar(pcno); if (pvNil != pblck) pblck->Free(); return fFalse; } return fTrue; } /*************************************************************************** Adds the chunk and makes it a child of (ctgPar, cnoPar). The child's loner flag will be clear. ***************************************************************************/ bool CFL::FAddChildPv(CTG ctgPar, CNO cnoPar, CHID chid, void *pv, long cb, CTG ctg, CNO *pcno) { if (!FAddPv(pv, cb, ctg, pcno)) return fFalse; if (!FAdoptChild(ctgPar, cnoPar, ctg, *pcno, chid, fTrue)) { Delete(ctg, *pcno); TrashVar(pcno); return fFalse; } return fTrue; } /*************************************************************************** Adds the chunk and makes it a child of (ctgPar, cnoPar). The child's loner flag will be clear. ***************************************************************************/ bool CFL::FAddChildHq(CTG ctgPar, CNO cnoPar, CHID chid, HQ hq, CTG ctg, CNO *pcno) { if (!FAddHq(hq, ctg, pcno)) return fFalse; if (!FAdoptChild(ctgPar, cnoPar, ctg, *pcno, chid, fTrue)) { Delete(ctg, *pcno); TrashVar(pcno); return fFalse; } return fTrue; } /*************************************************************************** Low level add. Sets the loner flag. ***************************************************************************/ bool CFL::_FAdd(long cb, CTG ctg, CNO cno, long icrp, PBLCK pblck) { AssertBaseThis(0); AssertIn(cb, 0, kcbMax); AssertNilOrPo(pblck, 0); CRP *qcrp; FLO flo; if (!_pggcrp->FInsert(icrp, 0)) { if (pvNil != pblck) pblck->Free(); return fFalse; } if (!_FAllocFlo(cb, &flo)) { _pggcrp->Delete(icrp); AssertThis(0); if (pvNil != pblck) pblck->Free(); return fFalse; } Assert(flo.pfil == _csto.pfil || flo.pfil == _cstoExtra.pfil, 0); qcrp = (CRP *)_pggcrp->QvFixedGet(icrp); ClearPb(qcrp, size(CRP)); qcrp->cki.ctg = ctg; qcrp->cki.cno = cno; qcrp->fp = flo.fp; qcrp->SetCb(flo.cb); if (flo.pfil == _cstoExtra.pfil) qcrp->SetGrfcrp(fcrpOnExtra); qcrp->SetGrfcrp(fcrpLoner); if (pvNil != pblck) pblck->Set(&flo); AssertThis(0); return fTrue; } /*************************************************************************** Replace or create a chunk of a particular cno. ***************************************************************************/ bool CFL::FPut(long cb, CTG ctg, CNO cno, PBLCK pblck) { AssertThis(0); AssertNilOrPo(pblck, 0); return _FPut(cb, ctg, cno, pblck, pvNil, pvNil); } /*************************************************************************** Replace or create a chunk with the given cno and put the data in it. ***************************************************************************/ bool CFL::FPutPv(void *pv, long cb, CTG ctg, CNO cno) { AssertThis(0); AssertIn(cb, 0, kcbMax); AssertPvCb(pv, cb); return _FPut(cb, ctg, cno, pvNil, pvNil, pv); } /*************************************************************************** Replace or create a chunk with the given cno and put the hq's data in it. ***************************************************************************/ bool CFL::FPutHq(HQ hq, CTG ctg, CNO cno) { AssertThis(0); AssertHq(hq); bool fRet; HQ hqT = hq; BLCK blckSrc(&hq); fRet = _FPut(blckSrc.Cb(), ctg, cno, pvNil, &blckSrc, pvNil); AssertDo(hqT == blckSrc.HqFree(), "blckSrc.HqFree() returned a differnt hq!"); return fRet; } /*************************************************************************** Replace or create a chunk with the given cno and put the block's data in it. Set the packed flag as in the block. ***************************************************************************/ bool CFL::FPutBlck(PBLCK pblckSrc, CTG ctg, CNO cno) { AssertThis(0); AssertPo(pblckSrc, 0); if (!_FPut(pblckSrc->Cb(fTrue), ctg, cno, pvNil, pblckSrc, pvNil)) return pvNil; SetPacked(ctg, cno, pblckSrc->FPacked()); return fTrue; } /*************************************************************************** Low level put. Writes data from pblckSrc or pv (or neither). If the chunk doesn't already exist, this has the same affect as doing an add. If it does exist, this doesn't change the fcrpLoner flag or anything else except the data. If pblck isn't nil, this sets it to the location of the new data. Doesn't change the packed flag. ***************************************************************************/ bool CFL::_FPut(long cb, CTG ctg, CNO cno, PBLCK pblck, PBLCK pblckSrc, void *pv) { AssertBaseThis(0); AssertIn(cb, 0, kcbMax); AssertNilOrPo(pblck, 0); AssertNilOrPo(pblckSrc, 0); long icrp; CRP *qcrp; FLO flo; if (!_FFindCtgCno(ctg, cno, &icrp)) { BLCK blck; if (pvNil == pblck) pblck = &blck; if (!_FAdd(cb, ctg, cno, icrp, pblck)) return fFalse; if (pv != pvNil) { Assert(pvNil == pblckSrc, 0); if (!pblck->FWrite(pv)) goto LFailNew; } else if (pvNil != pblckSrc && !pblckSrc->FWriteToBlck(pblck, fTrue)) { LFailNew: Delete(ctg, cno); pblck->Free(); AssertThis(0); return fFalse; } AssertThis(0); return fTrue; } if (!_FAllocFlo(cb, &flo)) { AssertThis(0); return fFalse; } Assert(flo.pfil == _csto.pfil || flo.pfil == _cstoExtra.pfil, 0); if (pvNil != pblck) pblck->Set(&flo); if (pv != pvNil) { Assert(pvNil == pblckSrc, 0); if (!flo.FWrite(pv)) goto LFailOld; } else if (pvNil != pblckSrc && !pblckSrc->FWriteToFlo(&flo, fTrue)) { LFailOld: _FreeFpCb(_fAddToExtra, flo.fp, flo.cb); if (pvNil != pblck) pblck->Free(); AssertThis(0); return fFalse; } qcrp = (CRP *)_pggcrp->QvFixedGet(icrp); Assert(qcrp->cki.ctg == ctg, 0); Assert(qcrp->cki.cno == cno, 0); _FreeFpCb(qcrp->Grfcrp(fcrpOnExtra), qcrp->fp, qcrp->Cb()); qcrp = (CRP *)_pggcrp->QvFixedGet(icrp); qcrp->fp = flo.fp; qcrp->SetCb(flo.cb); if (flo.pfil == _cstoExtra.pfil) qcrp->SetGrfcrp(fcrpOnExtra); else qcrp->ClearGrfcrp(fcrpOnExtra); _FSetRti(ctg, cno, rtiNil); AssertThis(0); return fTrue; } /*************************************************************************** Swaps the data for the two chunks. This allows a "safe save" of individual chunks (create a temp chunk, write the data, swap the data, delete the temp chunk). Doesn't affect child/parent relationships or the loner flag. ***************************************************************************/ void CFL::SwapData(CTG ctg1, CNO cno1, CTG ctg2, CNO cno2) { AssertThis(0); long icrp1, icrp2; CRP *qcrp1, *qcrp2; FP fp; long cb; ulong grfcrpT; const ulong kgrfcrpMask = fcrpOnExtra | fcrpPacked | fcrpForest; if (!_FFindCtgCno(ctg1, cno1, &icrp1) || !_FFindCtgCno(ctg2, cno2, &icrp2)) { Bug("can't find the chunks"); return; } qcrp1 = (CRP *)_pggcrp->QvFixedGet(icrp1); qcrp2 = (CRP *)_pggcrp->QvFixedGet(icrp2); fp = qcrp1->fp; qcrp1->fp = qcrp2->fp; qcrp2->fp = fp; cb = qcrp1->Cb(); qcrp1->SetCb(qcrp2->Cb()); qcrp2->SetCb(cb); // swap the bits of grfcrp in grfcrpMask grfcrpT = qcrp1->Grfcrp(kgrfcrpMask); qcrp1->AssignGrfcrp(qcrp2->Grfcrp(kgrfcrpMask), kgrfcrpMask); qcrp2->AssignGrfcrp(grfcrpT, kgrfcrpMask); _FSetRti(ctg1, cno1, rtiNil); _FSetRti(ctg2, cno2, rtiNil); AssertThis(fcflFull); } /*************************************************************************** Swaps the children for the two chunks. This allows a "safe save" of chunk graphs (create a temp chunk, write the data, swap the data, swap the children, delete the temp chunk). Doesn't affect the data or the loner flag. ***************************************************************************/ void CFL::SwapChildren(CTG ctg1, CNO cno1, CTG ctg2, CNO cno2) { AssertThis(0); long icrp1, icrp2; CRP *qcrp1, *qcrp2; long cb1, cb2; if (!_FFindCtgCno(ctg1, cno1, &icrp1) || !_FFindCtgCno(ctg2, cno2, &icrp2)) { Bug("can't find the chunks"); return; } // Swap the child lists. qcrp1 = (CRP *)_pggcrp->QvFixedGet(icrp1); qcrp2 = (CRP *)_pggcrp->QvFixedGet(icrp2); cb1 = LwMul(qcrp1->ckid, size(KID)); cb2 = LwMul(qcrp2->ckid, size(KID)); SwapVars(&qcrp1->ckid, &qcrp2->ckid); // These FMoveRgb calls won't fail, because no padding is necessary for // child entries. (FMoveRgb can fail only if the number of bytes being // moved is not a multiple of size(long)). if (0 < cb1) AssertDo(_pggcrp->FMoveRgb(icrp1, 0, icrp2, cb2, cb1), 0); if (0 < cb2) AssertDo(_pggcrp->FMoveRgb(icrp2, 0, icrp1, 0, cb2), 0); AssertThis(fcflFull); } /*************************************************************************** Move the chunk from (ctg, cno) to (ctgNew, cnoNew). Asserts that there is not already a chunk labelled (ctgNew, cnoNew). If the chunk has parents, updates the parent links to point to (ctgNew, cnoNew). Adjusting the links is slow. ***************************************************************************/ void CFL::Move(CTG ctg, CNO cno, CTG ctgNew, CNO cnoNew) { AssertThis(0); long icrpCur, icrpTarget; CRP *qcrp; long ccrpRef; long rti; if (ctg == ctgNew && cno == cnoNew) return; if (!_FFindCtgCno(ctg, cno, &icrpCur) || _FFindCtgCno(ctgNew, cnoNew, &icrpTarget)) { Bug("bad move request"); return; } rti = _Rti(ctg, cno); if (rtiNil != rti) _FSetRti(ctg, cno, rtiNil); qcrp = (CRP *)_pggcrp->QvFixedGet(icrpCur); ccrpRef = qcrp->ccrpRef; qcrp->cki.ctg = ctgNew; qcrp->cki.cno = cnoNew; _pggcrp->Move(icrpCur, icrpTarget); if (ccrpRef > 0) { // chunk has some parents CRP crp; long icrp, ikid, ikidNew; KID *qkid, *qrgkid; // In debug, increment ccrpRef so we'll traverse the entire // index. In ship, we'll stop once we changed ccrpRef KIDs. Debug(ccrpRef++;) for (icrp = _pggcrp->IvMac(); icrp-- > 0 && ccrpRef > 0;) { _pggcrp->GetFixed(icrp, &crp); qkid = (KID *)_pggcrp->QvGet(icrp); for (ikid = 0; ikid < crp.ckid;) { if (qkid->cki.ctg != ctg || qkid->cki.cno != cno) { ikid++; qkid++; continue; } // replace this kid AssertDo(!_FFindChild(icrp, ctgNew, cnoNew, qkid->chid, &ikidNew), "already a child"); // refresh the qkid and qrgkid pointers qkid = (qrgkid = (KID *)_pggcrp->QvGet(icrp)) + ikid; qkid->cki.ctg = ctgNew; qkid->cki.cno = cnoNew; MoveElement(qrgkid, size(KID), ikid, ikidNew); ccrpRef--; } } Assert(ccrpRef == 1, "corrupt chunky index"); // in ship, ccrpRef should be 0 here } if (rtiNil != rti && ctgNew == ctg) _FSetRti(ctgNew, cnoNew, rti); AssertThis(fcflFull); } /*************************************************************************** Delete the given chunk. Handles deleting child chunks that are no longer referenced. If the chunk has the loner flag set, this clears it. If the chunk has no parents, the chunk is also physically deleted from the CFL. ***************************************************************************/ void CFL::Delete(CTG ctg, CNO cno) { AssertThis(0); long icrp; CGE cge; ulong grfcgeIn, grfcge; KID kid; CRP *qcrp; if (!_FFindCtgCno(ctg, cno, &icrp)) { Bug("chunk not there"); return; } qcrp = (CRP *)_pggcrp->QvFixedGet(icrp); Assert(qcrp->Grfcrp(fcrpLoner) || qcrp->ccrpRef == 0, "can't directly delete a child chunk"); qcrp->ClearGrfcrp(fcrpLoner); if (qcrp->ccrpRef > 0) return; cge.Init(this, ctg, cno); for (grfcgeIn = fcgeNil; cge.FNextKid(&kid, pvNil, &grfcge, grfcgeIn);) { grfcgeIn = fcgeSkipToSib; if (!_FFindCtgCno(kid.cki.ctg, kid.cki.cno, &icrp)) { Bug("MIA"); continue; } if (grfcge & fcgePre) { if (!(grfcge & fcgeRoot) && !_FDecRefCount(icrp)) continue; grfcgeIn = fcgeNil; } if (grfcge & fcgePost) { // actually delete the node if (grfcge & fcgeError) { Warn("memory failure in CFL::Delete - adjusting ref counts"); // memory failure - adjust the ref counts of this chunk's // children, but don't try to delete them long ikid, icrpChild; KID kid; qcrp = (CRP *)_pggcrp->QvFixedGet(icrp); for (ikid = qcrp->ckid; ikid-- != 0;) { _pggcrp->GetRgb(icrp, _BvKid(ikid), size(kid), &kid); if (!_FFindCtgCno(kid.cki.ctg, kid.cki.cno, &icrpChild)) { Bug("child not there"); continue; } _FDecRefCount(icrpChild); } } _DeleteCore(icrp); } } AssertThis(fcflFull); } /*************************************************************************** Make sure the loner flag is set or clear according to fLoner. If fLoner is false and (ctg, cno) is not currently the child of anything, it will be deleted. ***************************************************************************/ void CFL::SetLoner(CTG ctg, CNO cno, bool fLoner) { AssertThis(0); long icrp; CRP *qcrp; if (!_FFindCtgCno(ctg, cno, &icrp)) { Bug("chunk not there"); return; } qcrp = (CRP *)_pggcrp->QvFixedGet(icrp); if (fLoner) qcrp->SetGrfcrp(fcrpLoner); else if (qcrp->Grfcrp(fcrpLoner)) Delete(ctg, cno); } /*************************************************************************** Return the value of the loner flag. ***************************************************************************/ bool CFL::FLoner(CTG ctg, CNO cno) { AssertThis(0); long icrp; CRP *qcrp; if (!_FFindCtgCno(ctg, cno, &icrp)) { Bug("chunk not there"); return fFalse; } qcrp = (CRP *)_pggcrp->QvFixedGet(icrp); return FPure(qcrp->Grfcrp(fcrpLoner)); } /*************************************************************************** Returns the number of parents of this chunk ***************************************************************************/ long CFL::CckiRef(CTG ctg, CNO cno) { AssertThis(0); long icrp; CRP *qcrp; if (!_FFindCtgCno(ctg, cno, &icrp)) { Bug("chunk not there"); return 0; } qcrp = (CRP *)_pggcrp->QvFixedGet(icrp); return qcrp->ccrpRef; } /*************************************************************************** Determines if (ctgSub, cnoSub) is in the chunk subgraph of (ctg, cno). Returns tMaybe on error. ***************************************************************************/ tribool CFL::TIsDescendent(CTG ctg, CNO cno, CTG ctgSub, CNO cnoSub) { AssertThis(0); CGE cge; KID kid; ulong grfcge; if (CckiRef(ctgSub, cnoSub) == 0) return tNo; cge.Init(this, ctg, cno); while (cge.FNextKid(&kid, pvNil, &grfcge, fcgeNil)) { if (kid.cki.ctg == ctgSub && kid.cki.cno == cnoSub) return tYes; if (grfcge & fcgeError) return tMaybe; } return tNo; } /*************************************************************************** Delete the given child chunk. Handles deleting child chunks that are no longer referenced and don't have the fcrpLoner flag set. ***************************************************************************/ void CFL::DeleteChild(CTG ctgPar, CNO cnoPar, CTG ctgChild, CNO cnoChild, CHID chid) { AssertThis(0); long icrpPar, icrpChild, ikid; CRP *qcrp; if (!_FFindCtgCno(ctgPar, cnoPar, &icrpPar) || !_FFindCtgCno(ctgChild, cnoChild, &icrpChild)) { Bug("chunk not there"); return; } if (!_FFindChild(icrpPar, ctgChild, cnoChild, chid, &ikid)) { Bug("not a child"); return; } // remove the reference qcrp = (CRP *)_pggcrp->QvFixedGet(icrpPar); qcrp->ckid--; _pggcrp->DeleteRgb(icrpPar, _BvKid(ikid), size(KID)); // now decrement the ref count and nuke it if the ref count is zero if (_FDecRefCount(icrpChild)) { // delete the chunk Delete(ctgChild, cnoChild); } AssertThis(fcflFull); } /*************************************************************************** Decrements the reference count on the chunk. Return true if the ref count becomes zero (after decrementing) and fcrpLoner is not set. ***************************************************************************/ bool CFL::_FDecRefCount(long icrp) { AssertBaseThis(0); CRP *qcrp; qcrp = (CRP *)_pggcrp->QvFixedGet(icrp); if (qcrp->ccrpRef <= 0) { Bug("ref count wrong"); return fFalse; } return --(qcrp->ccrpRef) == 0 && !qcrp->Grfcrp(fcrpLoner); } /*************************************************************************** Remove entry icrp from _pggcrp and add the file space to the free map. ***************************************************************************/ void CFL::_DeleteCore(long icrp) { AssertBaseThis(0); CRP *qcrp; CKI cki; qcrp = (CRP *)_pggcrp->QvFixedGet(icrp); cki = qcrp->cki; _FreeFpCb(qcrp->Grfcrp(fcrpOnExtra), qcrp->fp, qcrp->Cb()); _FSetRti(cki.ctg, cki.cno, rtiNil); _pggcrp->Delete(icrp); } /*************************************************************************** Add the (fp, cb) to the free map. ***************************************************************************/ void CFL::_FreeFpCb(bool fOnExtra, FP fp, long cb) { AssertBaseThis(0); Assert(cb > 0 || cb == 0 && fp == 0, "bad cb"); Assert(fp >= 0 && (fOnExtra || fp >= size(CFP) || cb == 0 || _fInvalidMainFile), "bad fp"); PGL pglfsm; long ifsm, ifsmMin, ifsmLim; FSM fsm, fsmT; CSTO *pcsto; // no space allocated to the chunk if (cb == 0) return; // if the free map hasn't been read yet, read it now if (!fOnExtra && _fFreeMapNotRead) _ReadFreeMap(); pcsto = fOnExtra ? &_cstoExtra : &_csto; pglfsm = pcsto->pglfsm; AssertPo(pcsto->pfil, 0); Assert(fp + cb <= pcsto->fpMac, "bad (fp,cb)"); if (fp + cb >= pcsto->fpMac) { // it's at the end of the file, just change fpMac and // compact the free map if possible pcsto->fpMac = fp; if (pglfsm == pvNil || (ifsm = pglfsm->IvMac()) == 0) return; ifsm--; pglfsm->Get(ifsm, &fsm); if (fsm.fp + fsm.cb >= pcsto->fpMac) { // fsm extends to the new end of the file, so delete the fsm // and adjust fpMac Assert(fsm.fp + fsm.cb == pcsto->fpMac, "bad fsm?"); pglfsm->Delete(ifsm); pcsto->fpMac = fsm.fp; } return; } // Chunk is not at the end of the file. We need to add it // to the free map. if (pglfsm == pvNil && (pglfsm = pcsto->pglfsm = GL::PglNew(size(FSM), 1)) == pvNil) { // can't create the free map, just drop the space return; } for (ifsmMin = 0, ifsmLim = pglfsm->IvMac(); ifsmMin < ifsmLim;) { ifsm = (ifsmMin + ifsmLim) / 2; pglfsm->Get(ifsm, &fsm); Assert(fp + cb <= fsm.fp || fp >= fsm.fp + fsm.cb, "freeing space that overlaps free space"); if (fsm.fp < fp) ifsmMin = ifsm + 1; else ifsmLim = ifsm; } ifsmLim = pglfsm->IvMac(); if (ifsmMin > 0) { // check for adjacency to previous free block pglfsm->Get(ifsmMin - 1, &fsm); Assert(fsm.fp < fp, "bad ifsmMin"); if (fsm.fp + fsm.cb >= fp) { // extend the previous free block Assert(fsm.fp + fsm.cb == fp, "overlap"); fsm.cb = fp + cb - fsm.fp; if (ifsmMin < ifsmLim) { // check for adjacency to next free block pglfsm->Get(ifsmMin, &fsmT); if (fsmT.fp <= fsm.fp + fsm.cb) { // merge the two Assert(fsmT.fp == fsm.fp + fsm.cb, "overlap"); fsm.cb = fsmT.fp + fsmT.cb - fsm.fp; pglfsm->Delete(ifsmMin); } } pglfsm->Put(ifsmMin - 1, &fsm); return; } } if (ifsmMin < ifsmLim) { pglfsm->Get(ifsmMin, &fsm); Assert(fsm.fp > fp, "bad ifsmMin"); if (fsm.fp <= fp + cb) { Assert(fsm.fp == fp + cb, "overlap"); fsm.cb = fsm.fp + fsm.cb - fp; fsm.fp = fp; pglfsm->Put(ifsmMin, &fsm); return; } } fsm.fp = fp; fsm.cb = cb; // if it fails, we lose some space - so what pglfsm->FInsert(ifsmMin, &fsm); } /*************************************************************************** Set the name of the chunk. ***************************************************************************/ bool CFL::FSetName(CTG ctg, CNO cno, PSTN pstn) { AssertThis(0); AssertNilOrPo(pstn, 0); long icrp; if (!_FFindCtgCno(ctg, cno, &icrp)) { Bug("chunk not there"); return fFalse; } if (!_FSetName(icrp, pstn)) return fFalse; _FSetRti(ctg, cno, rtiNil); AssertThis(0); return fTrue; } /*************************************************************************** Set the name of the chunk at the given index. ***************************************************************************/ bool CFL::_FSetName(long icrp, PSTN pstn) { AssertBaseThis(0); AssertIn(icrp, 0, _pggcrp->IvMac()); AssertNilOrPo(pstn, 0); long cbVar, cbOld, cbNew; CRP *qcrp; long bvRgch; if (pstn != pvNil && pstn->Cch() > 0) cbNew = pstn->CbData(); else cbNew = 0; qcrp = (CRP *)_pggcrp->QvFixedGet(icrp, &cbVar); bvRgch = qcrp->BvRgch(); cbOld = cbVar - bvRgch; AssertIn(cbOld, 0, kcbMaxDataStn + 1); if (cbOld > cbNew) _pggcrp->DeleteRgb(icrp, bvRgch, cbOld - cbNew); else if (cbOld < cbNew && !_pggcrp->FInsertRgb(icrp, bvRgch, cbNew - cbOld, pvNil)) { return fFalse; } if (cbNew > 0) { pstn->GetData(PvAddBv(_pggcrp->PvLock(icrp), bvRgch)); _pggcrp->Unlock(); } return fTrue; } /*************************************************************************** Retrieve the name of the chunk. Returns whether the string is non-empty. ***************************************************************************/ bool CFL::FGetName(CTG ctg, CNO cno, PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); long icrp; if (!_FFindCtgCno(ctg, cno, &icrp)) { Bug("chunk not there"); pstn->SetNil(); return fFalse; } return _FGetName(icrp, pstn); } /*************************************************************************** Retrieve the name of the chunk at the given index. Returns whether the string is non-empty. ***************************************************************************/ bool CFL::_FGetName(long icrp, PSTN pstn) { AssertBaseThis(0); AssertIn(icrp, 0, _pggcrp->IvMac()); AssertPo(pstn, 0); long cbRgch, bvRgch; long cbVar; CRP *qcrp; qcrp = (CRP *)_pggcrp->QvFixedGet(icrp, &cbVar); cbRgch = qcrp->CbRgch(cbVar); AssertIn(cbRgch, 0, kcbMaxDataStn + 1); if (cbRgch <= 0) { pstn->SetNil(); return fFalse; } bvRgch = qcrp->BvRgch(); if (!pstn->FSetData(PvAddBv(_pggcrp->PvLock(icrp), bvRgch), cbRgch)) pstn->SetNil(); _pggcrp->Unlock(); return pstn->Cch() > 0; } /*************************************************************************** Make a node a child of another node. If fClearLoner is set, the loner flag of the child is cleared. ***************************************************************************/ bool CFL::FAdoptChild(CTG ctgPar, CNO cnoPar, CTG ctgChild, CNO cnoChild, CHID chid, bool fClearLoner) { AssertThis(0); long icrpPar; long ikid; if (!_FFindCtgCno(ctgPar, cnoPar, &icrpPar)) { Bug("parent not there"); return fFalse; } if (_FFindChild(icrpPar, ctgChild, cnoChild, chid, &ikid)) return fTrue; // already a child if (!_FAdoptChild(icrpPar, ikid, ctgChild, cnoChild, chid, fClearLoner)) { AssertThis(0); return fFalse; } AssertThis(0); return fTrue; } /*************************************************************************** Make (ctgChild, cnoChild) a child of icrpPar. ***************************************************************************/ bool CFL::_FAdoptChild(long icrpPar, long ikid, CTG ctgChild, CNO cnoChild, CHID chid, bool fClearLoner) { AssertBaseThis(0); AssertIn(icrpPar, 0, _pggcrp->IvMac()); long icrp; CRP *qcrp; KID kid; if (!_FFindCtgCno(ctgChild, cnoChild, &icrp)) { Bug("child not there"); return fFalse; } qcrp = (CRP *)_pggcrp->QvFixedGet(icrpPar); AssertIn(ikid, 0, (long)qcrp->ckid + 1); if (tNo != TIsDescendent(ctgChild, cnoChild, qcrp->cki.ctg, qcrp->cki.cno)) { Warn("Performing this adoption may cause a cycle"); return fFalse; } kid.cki.ctg = ctgChild; kid.cki.cno = cnoChild; kid.chid = chid; if (!_pggcrp->FInsertRgb(icrpPar, _BvKid(ikid), size(KID), &kid)) { AssertThis(0); return fFalse; } qcrp = (CRP *)_pggcrp->QvFixedGet(icrpPar); if (qcrp->ckid >= kckidMax) goto LOverFlow; qcrp->ckid++; qcrp = (CRP *)_pggcrp->QvFixedGet(icrp); if (qcrp->ccrpRef >= kckidMax) { qcrp = (CRP *)_pggcrp->QvFixedGet(icrpPar); qcrp->ckid--; LOverFlow: _pggcrp->DeleteRgb(icrpPar, _BvKid(ikid), size(KID)); AssertThis(0); return fFalse; } qcrp->ccrpRef++; if (fClearLoner) qcrp->ClearGrfcrp(fcrpLoner); AssertThis(0); return fTrue; } /*************************************************************************** Changes the chid value of the given child link. Assert that (ctgChild, cnoChild, chidOld) is a child of (ctgPar, cnoPar) and that (ctgChild, cnoChild, chidNew) is not currently a child. ***************************************************************************/ void CFL::ChangeChid(CTG ctgPar, CNO cnoPar, CTG ctgChild, CNO cnoChild, CHID chidOld, CHID chidNew) { AssertThis(0); long icrp, ikidOld, ikidNew; KID *qkid, *qrgkid; if (chidOld == chidNew) return; if (!_FFindCtgCno(ctgPar, cnoPar, &icrp)) { Bug("parent not there"); return; } if (!_FFindChild(icrp, ctgChild, cnoChild, chidOld, &ikidOld) || _FFindChild(icrp, ctgChild, cnoChild, chidNew, &ikidNew)) { Bug("src not a child or dest already a child"); return; } qkid = (qrgkid = (KID *)_pggcrp->QvGet(icrp)) + ikidOld; qkid->chid = chidNew; MoveElement(qrgkid, size(KID), ikidOld, ikidNew); AssertThis(0); } /*************************************************************************** Return the total number of chunks. ***************************************************************************/ long CFL::Ccki(void) { AssertThis(0); return _pggcrp->IvMac(); } /*************************************************************************** Finds the icki'th chunk. If there is such a chunk (icki isn't too big), fills in *pcki and *pckid and returns true. Otherwise, returns fFalse. ***************************************************************************/ bool CFL::FGetCki(long icki, CKI *pcki, long *pckid, PBLCK pblck) { AssertThis(0); AssertNilOrVarMem(pcki); AssertNilOrVarMem(pckid); AssertNilOrPo(pblck, 0); AssertIn(icki, 0, kcbMax); CRP *qcrp; if (!FIn(icki, 0, _pggcrp->IvMac())) { TrashVar(pcki); TrashVar(pckid); if (pvNil != pblck) pblck->Free(); return fFalse; } qcrp = (CRP *)_pggcrp->QvFixedGet(icki); if (pvNil != pcki) *pcki = qcrp->cki; if (pvNil != pckid) *pckid = qcrp->ckid; if (pvNil != pblck) _GetBlck(icki, pblck); return fTrue; } /*************************************************************************** Finds the icki corresponding to the given (ctg, cno). If the (ctg, cno) is not in the CFL, fills *picki with where it would be. ***************************************************************************/ bool CFL::FGetIcki(CTG ctg, CNO cno, long *picki) { AssertThis(0); AssertVarMem(picki); return _FFindCtgCno(ctg, cno, picki); } /*************************************************************************** Return the total number of chunks of the given type in the file. ***************************************************************************/ long CFL::CckiCtg(CTG ctg) { AssertThis(0); long icrpMac; long icrpMin; long icrpLim; if ((icrpMac = _pggcrp->IvMac()) == 0) return 0; _FFindCtgCno(ctg, 0, &icrpMin); if (ctg + 1 < ctg) { // ctg is the largest possible ctg! return icrpMac - icrpMin; } _FFindCtgCno(ctg + 1, 0, &icrpLim); return icrpLim - icrpMin; } /*************************************************************************** Finds the icki'th chunk of type ctg. If there is such a chunk, fills in *pcki and returns true. Otherwise, returns fFalse. ***************************************************************************/ bool CFL::FGetCkiCtg(CTG ctg, long icki, CKI *pcki, long *pckid, PBLCK pblck) { AssertThis(0); AssertIn(icki, 0, kcbMax); AssertNilOrVarMem(pcki); AssertNilOrVarMem(pckid); AssertNilOrPo(pblck, 0); CRP *qcrp; long icrpMac; long icrp; if (!FIn(icki, 0, (icrpMac = _pggcrp->IvMac()))) goto LFail; _FFindCtgCno(ctg, 0, &icrp); icrp += icki; if (!FIn(icrp, 0, icrpMac)) goto LFail; qcrp = (CRP *)_pggcrp->QvFixedGet(icrp); if (qcrp->cki.ctg != ctg) { LFail: TrashVar(pcki); TrashVar(pckid); if (pvNil != pblck) pblck->Free(); return fFalse; } if (pvNil != pcki) *pcki = qcrp->cki; if (pvNil != pckid) *pckid = qcrp->ckid; if (pvNil != pblck) _GetBlck(icki, pblck); return fTrue; } /*************************************************************************** Return the number of children of the given chunk. ***************************************************************************/ long CFL::Ckid(CTG ctg, CNO cno) { AssertThis(0); CRP *qcrp; long icrp; if (!_FFindCtgCno(ctg, cno, &icrp)) { Bug("chunk not found"); return 0; } qcrp = (CRP *)_pggcrp->QvFixedGet(icrp); return qcrp->ckid; } /*************************************************************************** If ikid is less than number of children of the given chunk, fill *pkid and return true. Otherwise, return false. ***************************************************************************/ bool CFL::FGetKid(CTG ctg, CNO cno, long ikid, KID *pkid) { AssertThis(0); AssertVarMem(pkid); AssertIn(ikid, 0, kcbMax); CRP *qcrp; long icrp; if (!_FFindCtgCno(ctg, cno, &icrp)) { Bug("chunk not found"); TrashVar(pkid); return fFalse; } qcrp = (CRP *)_pggcrp->QvFixedGet(icrp); if (!FIn(ikid, 0, qcrp->ckid)) { TrashVar(pkid); return fFalse; } _pggcrp->GetRgb(icrp, _BvKid(ikid), size(KID), pkid); Assert(_FFindCtgCno(pkid->cki.ctg, pkid->cki.cno, &icrp), "child not there"); Assert(pkid->cki.ctg != ctg || pkid->cki.cno != cno, "chunk is child of itself!"); return fTrue; } /*************************************************************************** Look for a child of (ctgPar, cnoPar) with the given chid value. If one is found, fill in *pkid and return true; else return false. Kid's are sorted by (chid, ctg, cno). ***************************************************************************/ bool CFL::FGetKidChid(CTG ctgPar, CNO cnoPar, CHID chid, KID *pkid) { AssertThis(0); AssertVarMem(pkid); return _FFindChidCtg(ctgPar, cnoPar, chid, (CTG)0, pkid); } /*************************************************************************** Look for a child of (ctgPar, cnoPar) with the given chid and ctg value. If one is found, fill in *pkid and return true; else return false. Kid's are sorted by (chid, ctg, cno). ***************************************************************************/ bool CFL::FGetKidChidCtg(CTG ctgPar, CNO cnoPar, CHID chid, CTG ctg, KID *pkid) { AssertThis(0); AssertVarMem(pkid); // the kid returned from _FFindChidCtg should have ctg >= the given ctg, // but not necessarily equal if (!_FFindChidCtg(ctgPar, cnoPar, chid, ctg, pkid) || pkid->cki.ctg != ctg) { TrashVar(pkid); return fFalse; } return fTrue; } /*************************************************************************** Find the first child with the given chid and with ctg >= the given ctg. Returns true iff there is such a child and fills in the *pkid. ***************************************************************************/ bool CFL::_FFindChidCtg(CTG ctgPar, CNO cnoPar, CHID chid, CTG ctg, KID *pkid) { AssertThis(0); AssertVarMem(pkid); long ikidMin, ikidLim, ikid; CRP *qcrp; KID *qrgkid, *qkid; long ckid, icrp; if (!_FFindCtgCno(ctgPar, cnoPar, &icrp)) { Bug("chunk not found"); goto LFail; } qcrp = (CRP *)_pggcrp->QvFixedGet(icrp); if ((ckid = qcrp->ckid) <= 0) { Assert(0 == ckid, "bad crp"); goto LFail; } qrgkid = (KID *)_pggcrp->QvGet(icrp); for (ikidMin = 0, ikidLim = ckid; ikidMin < ikidLim;) { ikid = (ikidMin + ikidLim) / 2; qkid = &qrgkid[ikid]; if (qkid->chid < chid) ikidMin = ikid + 1; else if (qkid->chid > chid) ikidLim = ikid; else if (qkid->cki.ctg < ctg) ikidMin = ikid + 1; else ikidLim = ikid; } if (ikidMin < qcrp->ckid) { qkid = &qrgkid[ikidMin]; if (qkid->chid == chid && qkid->cki.ctg >= ctg) { *pkid = *qkid; return fTrue; } } LFail: TrashVar(pkid); return fFalse; } /*************************************************************************** Finds the ikid value associated with the given child (ctg, cno, chid) of the given chunk. If the (ctg, cno, chid) is not a child of (ctgPar, cnoPar), fills *pikid with where it would be if it were. ***************************************************************************/ bool CFL::FGetIkid(CTG ctgPar, CNO cnoPar, CTG ctg, CNO cno, CHID chid, long *pikid) { AssertThis(0); AssertVarMem(pikid); long icrp; if (!_FFindCtgCno(ctgPar, cnoPar, &icrp)) { Bug("chunk not found"); *pikid = 0; return fFalse; } return _FFindChild(icrp, ctg, cno, chid, pikid); } /*************************************************************************** If (ctgChild, cnoChild, chid) is a child of icrpPar, return true and put the index in *pikid. If not set *pikid to where to insert it. Kids are sorted by (chid, ctg, cno). ***************************************************************************/ bool CFL::_FFindChild(long icrpPar, CTG ctgChild, CNO cnoChild, CHID chid, long *pikid) { AssertBaseThis(0); AssertVarMem(pikid); AssertIn(icrpPar, 0, _pggcrp->IvMac()); long ikidMin, ikidLim, ikid, ckid; CRP *qcrp; KID *qrgkid, *qkid; qcrp = (CRP *)_pggcrp->QvFixedGet(icrpPar); if ((ckid = qcrp->ckid) <= 0) { Assert(0 == ckid, "bad crp"); *pikid = 0; return fFalse; } qrgkid = (KID *)_pggcrp->QvGet(icrpPar); for (ikidMin = 0, ikidLim = ckid; ikidMin < ikidLim;) { ikid = (ikidMin + ikidLim) / 2; qkid = &qrgkid[ikid]; if (qkid->chid < chid) ikidMin = ikid + 1; else if (qkid->chid > chid) ikidLim = ikid; else if (qkid->cki.ctg < ctgChild) ikidMin = ikid + 1; else if (qkid->cki.ctg > ctgChild) ikidLim = ikid; else if (qkid->cki.cno < cnoChild) ikidMin = ikid + 1; else if (qkid->cki.cno > cnoChild) ikidLim = ikid; else { *pikid = ikid; return fTrue; } } *pikid = ikidMin; return fFalse; } // cno map entry struct CNOM { CTG ctg; CNO cnoSrc; CNO cnoDst; }; bool _FFindCnom(PGL pglcnom, CTG ctg, CNO cno, CNOM *pcnom = pvNil, long *picnom = pvNil); bool _FAddCnom(PGL *ppglcnom, CNOM *pcnom); /*************************************************************************** Look for a cnom for the given (ctg, cno). Whether or not it exists, fill *picnom with where it would go in the pglcnom. ***************************************************************************/ bool _FFindCnom(PGL pglcnom, CTG ctg, CNO cno, CNOM *pcnom, long *picnom) { AssertNilOrPo(pglcnom, 0); AssertNilOrVarMem(pcnom); AssertNilOrVarMem(picnom); long ivMin, ivLim, iv; CNOM cnom; if (pvNil == pglcnom) { TrashVar(pcnom); if (pvNil != picnom) *picnom = 0; return fFalse; } for (ivMin = 0, ivLim = pglcnom->IvMac(); ivMin < ivLim;) { iv = (ivMin + ivLim) / 2; pglcnom->Get(iv, &cnom); if (cnom.ctg < ctg) ivMin = iv + 1; else if (cnom.ctg > ctg) ivLim = iv; else if (cnom.cnoSrc < cno) ivMin = iv + 1; else if (cnom.cnoSrc > cno) ivLim = iv; else { if (pvNil != pcnom) *pcnom = cnom; if (pvNil != picnom) *picnom = iv; return fTrue; } } TrashVar(pcnom); if (pvNil != picnom) *picnom = ivMin; return fFalse; } /*************************************************************************** Add a cnom to the *ppglcnom. Allocated *ppglcnom if it is nil. ***************************************************************************/ bool _FAddCnom(PGL *ppglcnom, CNOM *pcnom) { AssertVarMem(ppglcnom); AssertNilOrPo(*ppglcnom, 0); AssertVarMem(pcnom); long icnom; if (pvNil == *ppglcnom && pvNil == (*ppglcnom = GL::PglNew(size(CNOM)))) return fFalse; AssertDo(!_FFindCnom(*ppglcnom, pcnom->ctg, pcnom->cnoSrc, pvNil, &icnom), "why is this cnom already in the gl?"); return (*ppglcnom)->FInsert(icnom, pcnom); } /*************************************************************************** Copy a chunk (ctgSrc, cnoSrc) from this chunky file to pcflDst. The new cno is put in *pcno. The destination chunk is marked as a loner. If possible, the cno in the destination file will be the same as the cno in the source file. If fClone is set, no chunk sharing will occur. Otherwise, this does intelligent chunk sharing. ***************************************************************************/ bool CFL::_FCopy(CTG ctgSrc, CNO cnoSrc, PCFL pcflDst, CNO *pcnoDst, bool fClone) { AssertThis(fcflFull); AssertPo(pcflDst, fcflFull); AssertVarMem(pcnoDst); long icrpSrc, icrpDst; long rtiSrc; CGE cge; KID kid; CKI ckiPar; BLCK blckSrc; ulong grfcge, grfcgeIn; CNOM cnom, cnomPar; STN stn; CRP *qcrp; bool fFreeDstOnFailure = fFalse; PGL pglcnom = pvNil; bool fRet = fFalse; if (!_FFindCtgCno(ctgSrc, cnoSrc, &icrpSrc)) { Bug("chunk not found"); TrashVar(pcnoDst); return fFalse; } if (!fClone && this == pcflDst) { SetLoner(ctgSrc, cnoSrc, fTrue); *pcnoDst = cnoSrc; return fTrue; } // copy chunks to the destination CFL cge.Init(this, ctgSrc, cnoSrc); grfcgeIn = fcgeNil; while (cge.FNextKid(&kid, &ckiPar, &grfcge, grfcgeIn)) { grfcgeIn = fcgeNil; if (grfcge & fcgeError) goto LFail; // do pre-order handling only if (!(grfcge & fcgePre)) continue; if (_FFindCnom(pglcnom, kid.cki.ctg, kid.cki.cno, &cnom)) { // chunk has already been copied - just link it to the parent // and skip to its sibling Assert(!(grfcge & fcgeRoot), "how can the root already have been copied?"); grfcgeIn = fcgeSkipToSib; } else if (rtiNil != (rtiSrc = _Rti(kid.cki.ctg, kid.cki.cno)) && !fClone && _FFindMatch(kid.cki.ctg, kid.cki.cno, pcflDst, &cnom.cnoDst)) { // chunk and its subgraph exists in the destination, just link it // to the parent and skip to its sibling grfcgeIn = fcgeSkipToSib; } else { // must copy the chunk // assign the source chunk an rti (if it doesn't have one) if (rtiNil == rtiSrc && _FSetRti(kid.cki.ctg, kid.cki.cno, _rtiLast + 1)) { rtiSrc = ++_rtiLast; } cnom.ctg = kid.cki.ctg; cnom.cnoSrc = kid.cki.cno; // find the source icrp AssertDo(_FFindCtgCno(kid.cki.ctg, kid.cki.cno, &icrpSrc), 0); // get the source blck _GetBlck(icrpSrc, &blckSrc); // allocate the dst chunk and copy the data - use the source cno // if possible if (this != pcflDst && !pcflDst->FFind(kid.cki.ctg, kid.cki.cno)) { // can preserve cno cnom.cnoDst = kid.cki.cno; if (!pcflDst->FPutBlck(&blckSrc, kid.cki.ctg, cnom.cnoDst)) goto LFail; } else { if (!pcflDst->FAddBlck(&blckSrc, kid.cki.ctg, &cnom.cnoDst)) goto LFail; if (this == pcflDst) { AssertDo(_FFindCtgCno(kid.cki.ctg, kid.cki.cno, &icrpSrc), 0); } } AssertDo(pcflDst->_FFindCtgCno(kid.cki.ctg, cnom.cnoDst, &icrpDst), "_FFindCtgCno doesn't work"); // make sure the forest flags match qcrp = (CRP *)_pggcrp->QvFixedGet(icrpSrc); if (qcrp->Grfcrp(fcrpForest)) { qcrp = (CRP *)pcflDst->_pggcrp->QvFixedGet(icrpDst); qcrp->SetGrfcrp(fcrpForest); } // set the dst name and rti to the src name and rti if (_FGetName(icrpSrc, &stn) && !pcflDst->_FSetName(icrpDst, &stn)) { pcflDst->Delete(kid.cki.ctg, cnom.cnoDst); goto LFail; } if (rtiNil != rtiSrc) pcflDst->_FSetRti(kid.cki.ctg, cnom.cnoDst, rtiSrc); if (!_FAddCnom(&pglcnom, &cnom)) goto LFail; fFreeDstOnFailure = fTrue; } // if it's the root, it has no parent and we need to set *pcnoDst if (grfcge & fcgeRoot) { *pcnoDst = cnom.cnoDst; continue; } // get the source parent's cnom AssertDo(_FFindCnom(pglcnom, ckiPar.ctg, ckiPar.cno, &cnomPar), 0); // make sure the dst child is a child of the dst parent if (!pcflDst->FAdoptChild(ckiPar.ctg, cnomPar.cnoDst, kid.cki.ctg, cnom.cnoDst, kid.chid, grfcgeIn == fcgeNil)) { if (grfcgeIn == fcgeNil) pcflDst->Delete(kid.cki.ctg, cnom.cnoDst); goto LFail; } } fRet = fTrue; pcflDst->SetLoner(ctgSrc, *pcnoDst, fTrue); LFail: AssertThis(fcflFull); AssertPo(pcflDst, fcflFull); ReleasePpo(&pglcnom); if (!fRet && fFreeDstOnFailure) pcflDst->Delete(ctgSrc, *pcnoDst); TrashVarIf(!fRet, pcnoDst); return fRet; } /*************************************************************************** See if there is a subgraph of pcflDst matching the subgraph at (ctgSrc, cnoSrc). Subgraphs match if there is one-to-one correspondence of nodes and arcs of the two subgraphs and the rti's of corresponding nodes are equal. ***************************************************************************/ bool CFL::_FFindMatch(CTG ctgSrc, CNO cnoSrc, PCFL pcflDst, CNO *pcnoDst) { AssertBaseThis(0); AssertPo(pcflDst, 0); AssertVarMem(pcnoDst); long rtiSrc, rtiKid; long ckidSrc; CNO cnoMin, cnoDst; CGE cgeSrc, cgeDst; KID kidSrc, kidDst; CKI ckiParSrc, ckiParDst; ulong grfcgeSrc, grfcgeDst; bool fKidSrc, fKidDst; if (this == pcflDst || rtiNil == (rtiSrc = _Rti(ctgSrc, cnoSrc))) return fFalse; ckidSrc = Ckid(ctgSrc, cnoSrc); for (cnoDst = cnoMin = 0;; cnoMin = cnoDst + 1) { // get the next chunk with the same rti if (cnoDst == (CNO)(-1) || !pcflDst->_FFindCtgRti(ctgSrc, rtiSrc, cnoMin, &cnoDst)) { return fFalse; } if (pcflDst->Ckid(ctgSrc, cnoDst) != ckidSrc) continue; cgeSrc.Init(this, ctgSrc, cnoSrc); cgeDst.Init(pcflDst, ctgSrc, cnoDst); for (;;) { // get the next element of the the source graph fKidSrc = cgeSrc.FNextKid(&kidSrc, &ckiParSrc, &grfcgeSrc, fcgeNil); // if the source chunk doesn't have an rti, there's no hope if (fKidSrc && rtiNil == (rtiKid = _Rti(kidSrc.cki.ctg, kidSrc.cki.cno))) { return fFalse; } // get the next element of the destination graph fKidDst = cgeDst.FNextKid(&kidDst, &ckiParDst, &grfcgeDst, fcgeNil); if (FPure(fKidSrc) != FPure(fKidDst)) { // the two graphs have different numbers of nodes, so they // don't match break; } if (!fKidSrc) { // we're finished with the enumeration and everything matched *pcnoDst = cnoDst; return fTrue; } if ((grfcgeSrc | grfcgeDst) & fcgeError) return fFalse; if ((grfcgeSrc ^ grfcgeDst) & (fcgePre | fcgePost | fcgeRoot) || kidSrc.cki.ctg != kidDst.cki.ctg || !(grfcgeSrc & fcgeRoot) && kidSrc.chid != kidDst.chid || rtiKid != pcflDst->_Rti(kidDst.cki.ctg, kidDst.cki.cno) || Ckid(kidSrc.cki.ctg, kidSrc.cki.cno) != pcflDst->Ckid(kidDst.cki.ctg, kidDst.cki.cno)) { // children don't match break; } } } } /*************************************************************************** Looks for a chunk of the given type with assigned rti and cno at least cnoMin. ***************************************************************************/ bool CFL::_FFindCtgRti(CTG ctg, long rti, CNO cnoMin, CNO *pcno) { AssertBaseThis(0); AssertNilOrVarMem(pcno); #ifdef CHUNK_BIG_INDEX long icrp, ccrp; CRP *qcrp; _FFindCtgCno(ctg, cnoMin, &icrp); ccrp = Ccki(); for (; icrp < ccrp; icrp++) { qcrp = (CRP *)_pggcrp->QvFixedGet(icrp); if (qcrp->cki.ctg != ctg) break; // done if (qcrp->rti == rti) { // found one if (pcno != pvNil) *pcno = qcrp->cki.cno; return fTrue; } } #else //! CHUNK_BIG_INDEX long irtie, crtie; RTIE rtie; if (pvNil != _pglrtie && 0 < (crtie = _pglrtie->IvMac())) { _FFindRtie(ctg, cnoMin, pvNil, &irtie); for (; irtie < crtie; irtie++) { _pglrtie->Get(irtie, &rtie); if (rtie.ctg != ctg) break; // done if (rtie.rti == rti) { // found one if (pcno != pvNil) *pcno = rtie.cno; return fTrue; } } } #endif //! CHUNK_BIG_INDEX TrashVar(pcno); return fFalse; } /*************************************************************************** Copy a chunk (ctgSrc, cnoSrc) from this chunky file to pcflDst. The new cno is put in *pcno. The destination chunk is marked as a loner. If possible, the cno in the destination file will be the same as the cno in the source file. This does intelligent chunk sharing. ***************************************************************************/ bool CFL::FCopy(CTG ctgSrc, CNO cnoSrc, PCFL pcflDst, CNO *pcnoDst) { return _FCopy(ctgSrc, cnoSrc, pcflDst, pcnoDst, fFalse); } /*************************************************************************** Clone a chunk subgraph from this chunky file to pcflDst. This will make a copy of the the chunk and its descendents without using any previously existing chunks in the destination. The new cno is put in *pcno. The destination chunk is marked as a loner. If possible, the cno in the destination file will be the same as the cno in the source file. ***************************************************************************/ bool CFL::FClone(CTG ctgSrc, CNO cnoSrc, PCFL pcflDst, CNO *pcnoDst) { return _FCopy(ctgSrc, cnoSrc, pcflDst, pcnoDst, fTrue); } /*************************************************************************** Return the run time id of the given chunk. ***************************************************************************/ long CFL::_Rti(CTG ctg, CNO cno) { AssertBaseThis(0); #ifdef CHUNK_BIG_INDEX long icrp; CRP *qcrp; if (!_FFindCtgCno(ctg, cno, &icrp)) return rtiNil; qcrp = (CRP *)_pggcrp->QvFixedGet(icrp, &cbVar); return qcrp->rti; #else //! CHUNK_BIG_INDEX RTIE rtie; if (!_FFindRtie(ctg, cno, &rtie)) return rtiNil; return rtie.rti; #endif //! CHUNK_BIG_INDEX } /*************************************************************************** Set the run time id of the given chunk. ***************************************************************************/ bool CFL::_FSetRti(CTG ctg, CNO cno, long rti) { AssertBaseThis(0); #ifdef CHUNK_BIG_INDEX long icrp; CRP *qcrp; if (!_FFindCtgCno(ctg, cno, &icrp)) return fFalse; qcrp = (CRP *)_pggcrp->QvFixedGet(icrp, &cbVar); qcrp->rti = rti; return fTrue; #else //! CHUNK_BIG_INDEX RTIE rtie; long irtie; if (_FFindRtie(ctg, cno, &rtie, &irtie)) { if (rtiNil == rti) _pglrtie->Delete(irtie); else { rtie.rti = rti; _pglrtie->Put(irtie, &rtie); } return fTrue; } if (rtiNil == rti) return fTrue; rtie.ctg = ctg; rtie.cno = cno; rtie.rti = rti; if (pvNil == _pglrtie && pvNil == (_pglrtie = GL::PglNew(size(RTIE), 1))) return fFalse; return _pglrtie->FInsert(irtie, &rtie); #endif //! CHUNK_BIG_INDEX } #ifndef CHUNK_BIG_INDEX /*************************************************************************** Look for an RTIE entry for the given (ctg, cno). ***************************************************************************/ bool CFL::_FFindRtie(CTG ctg, CNO cno, RTIE *prtie, long *pirtie) { AssertBaseThis(0); AssertNilOrVarMem(prtie); AssertNilOrVarMem(pirtie); long ivMin, ivLim, iv; RTIE rtie; if (pvNil == _pglrtie) { if (pvNil != pirtie) *pirtie = 0; TrashVar(prtie); return fFalse; } for (ivMin = 0, ivLim = _pglrtie->IvMac(); ivMin < ivLim;) { iv = (ivMin + ivLim) / 2; _pglrtie->Get(iv, &rtie); if (rtie.ctg < ctg) ivMin = iv + 1; else if (rtie.ctg > ctg) ivLim = iv; else if (rtie.cno < cno) ivMin = iv + 1; else if (rtie.cno > cno) ivLim = iv; else { if (pvNil != prtie) *prtie = rtie; if (pvNil != pirtie) *pirtie = iv; return fTrue; ; } } if (pvNil != pirtie) *pirtie = ivMin; TrashVar(prtie); return fFalse; } #endif //! CHUNK_BIG_INDEX /*************************************************************************** Constructor for chunk graph enumerator. ***************************************************************************/ CGE::CGE(void) { AssertThisMem(); _es = esDone; _pgldps = pvNil; AssertThis(0); } /*************************************************************************** Destructor for chunk graph enumerator. ***************************************************************************/ CGE::~CGE(void) { AssertThis(0); ReleasePpo(&_pgldps); } #ifdef DEBUG /*************************************************************************** Assert the validity of the cge ***************************************************************************/ void CGE::AssertValid(ulong grf) { CGE_PAR::AssertValid(0); AssertIn(_es, esStart, esDone + 1); if (FIn(_es, esStart, esDone)) { AssertPo(_pcfl, 0); AssertNilOrPo(_pgldps, 0); } else Assert(_pgldps == pvNil, "_pgldps not nil"); } /*************************************************************************** Mark memory used by the cge. ***************************************************************************/ void CGE::MarkMem(void) { AssertThis(0); CGE_PAR::MarkMem(); MarkMemObj(_pgldps); } #endif // DEBUG /*************************************************************************** Start a new enumeration. ***************************************************************************/ void CGE::Init(PCFL pcfl, CTG ctg, CNO cno) { AssertThis(0); AssertPo(pcfl, 0); ReleasePpo(&_pgldps); _es = esStart; _pcfl = pcfl; _dps.kid.cki.ctg = ctg; _dps.kid.cki.cno = cno; TrashVar(&_dps.kid.chid); AssertThis(0); } /*************************************************************************** Fetch the next node in the graph enumeration. Generally, parent nodes are returned twice (once with fcgePre and again with fcgePost). Nodes without children are returned only once (with both fcgePre and fcgePost set). The new node is put in *pkid, and the node's parent (if the node is not the root of the enumeration) is put in *pckiPar. pckiPar may be nil. If (grfcgeIn & fcgeSkipToSib), skips all children and the upward touch of the last node returned. The *pgrfcgeOut value can contain any combination of: fcgePre, fcgePost, fcgeError, fcgeRoot. These have the following meanings: fcgePre: *pkid is valid; haven't traversed the node's children yet fcgePost: *pkid is valid; have already traversed the children (or there aren't any children) fcgeError: a memory error occurred; may be set in conjunction with other flags fcgeRoot: *pkid is valid (except the chid value); *pckiPar is invalid; the node is the root of the enumeration ***************************************************************************/ bool CGE::FNextKid(KID *pkid, CKI *pckiPar, ulong *pgrfcgeOut, ulong grfcgeIn) { AssertThis(0); AssertVarMem(pkid); AssertNilOrVarMem(pckiPar); AssertVarMem(pgrfcgeOut); *pgrfcgeOut = fcgeNil; switch (_es) { case esStart: // starting the enumeration // hit the node on the way down *pgrfcgeOut |= fcgePre | fcgeRoot; if (_pcfl->Ckid(_dps.kid.cki.ctg, _dps.kid.cki.cno) == 0) goto LPost; *pkid = _dps.kid; _dps.ikid = 0; _es = esGo; break; case esGo: if ((grfcgeIn & fcgeSkipToSib) && (_pgldps == pvNil || !_pgldps->FPop(&_dps))) { goto LDone; } // fall through case esGoNoSkip: if (!_pcfl->FGetKid(_dps.kid.cki.ctg, _dps.kid.cki.cno, _dps.ikid++, pkid)) { LPost: // no more children, hit the node on the way up *pgrfcgeOut |= fcgePost; *pkid = _dps.kid; if (_pgldps == pvNil || !_pgldps->FPop(&_dps)) { // this is the root *pgrfcgeOut |= fcgeRoot; _es = esDone; ReleasePpo(&_pgldps); } else { _es = esGoNoSkip; if (pckiPar != pvNil) *pckiPar = _dps.kid.cki; } break; } // hit the child if (pckiPar != pvNil) *pckiPar = _dps.kid.cki; if (_pcfl->Ckid(pkid->cki.ctg, pkid->cki.cno) > 0) { // child has children, need to push the dps if (_pgldps == pvNil && (_pgldps = GL::PglNew(size(DPS), 10)) == pvNil || !_pgldps->FPush(&_dps)) { // mem failure, pretend it has no children *pgrfcgeOut |= fcgeError; goto LNoChildren; } _dps.kid = *pkid; _dps.ikid = 0; *pgrfcgeOut |= fcgePre; _es = esGo; } else { LNoChildren: // child doesn't have children, just handle it *pgrfcgeOut |= fcgePost | fcgePre; _es = esGoNoSkip; } break; default: LDone: _es = esDone; ReleasePpo(&_pgldps); TrashVar(pkid); TrashVar(pckiPar); TrashVar(pgrfcgeOut); return fFalse; } TrashVarIf((*pgrfcgeOut & fcgeRoot), pckiPar); TrashVarIf((*pgrfcgeOut & fcgeRoot), &pkid->chid); return fTrue; } ================================================ FILE: kauai/src/chunk.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Chunky file classes. See comments in chunk.cpp. ***************************************************************************/ #ifndef CHUNK_H #define CHUNK_H /*************************************************************************** These must be unsigned longs! We sort on them and assume in the code that they are unsinged. ***************************************************************************/ typedef ulong CTG; // chunk tag/type typedef ulong CNO; // chunk number typedef ulong CHID; // child chunk id enum { fcflNil = 0x0000, fcflWriteEnable = 0x0001, fcflTemp = 0x0002, fcflMark = 0x0004, fcflAddToExtra = 0x0008, // This flag indicates that when data is read, it should first be // copied to the extra file (if it's not already there). This is // for chunky files that are on a CD for which we want to cache data // to the hard drive. fcflReadFromExtra = 0x0010, #ifdef DEBUG // for AssertValid fcflGraph = 0x4000, // check the graph structure for cycles fcflFull = fobjAssertFull, #endif // DEBUG }; // chunk identification struct CKI { CTG ctg; CNO cno; }; const BOM kbomCki = 0xF0000000; // child chunk identification struct KID { CKI cki; CHID chid; }; const BOM kbomKid = 0xFC000000; /*************************************************************************** Chunky file class. ***************************************************************************/ typedef class CFL *PCFL; #define CFL_PAR BLL #define kclsCFL 'CFL' class CFL : public CFL_PAR { RTCLASS_DEC BLL_DEC(CFL, PcflNext) ASSERT MARKMEM private: // chunk storage struct CSTO { PFIL pfil; // the file FP fpMac; // logical end of file (for writing new chunks) PGL pglfsm; // free space map }; PGG _pggcrp; // the index CSTO _csto; // the main file CSTO _cstoExtra; // the scratch file bool _fAddToExtra : 1; bool _fMark : 1; bool _fFreeMapNotRead : 1; bool _fReadFromExtra : 1; bool _fInvalidMainFile : 1; // for deferred reading of the free map FP _fpFreeMap; long _cbFreeMap; #ifndef CHUNK_BIG_INDEX struct RTIE { CTG ctg; CNO cno; long rti; }; PGL _pglrtie; bool _FFindRtie(CTG ctg, CNO cno, RTIE *prtie = pvNil, long *pirtie = pvNil); #endif //! CHUNK_BIG_INDEX // static member variables static long _rtiLast; static PCFL _pcflFirst; private: // private methods CFL(void); ~CFL(void); static ulong _GrffilFromGrfcfl(ulong grfcfl); bool _FReadIndex(void); tribool _TValidIndex(void); bool _FWriteIndex(CTG ctgCreator); bool _FCreateExtra(void); bool _FAllocFlo(long cb, PFLO pflo, bool fForceOnExtra = fFalse); bool _FFindCtgCno(CTG ctg, CNO cno, long *picrp); void _GetUniqueCno(CTG ctg, long *picrp, CNO *pcno); void _FreeFpCb(bool fOnExtra, FP fp, long cb); bool _FAdd(long cb, CTG ctg, CNO cno, long icrp, PBLCK pblck); bool _FPut(long cb, CTG ctg, CNO cno, PBLCK pblck, PBLCK pblckSrc, void *pv); bool _FCopy(CTG ctgSrc, CNO cnoSrc, PCFL pcflDst, CNO *pcnoDst, bool fClone); bool _FFindMatch(CTG ctgSrc, CNO cnoSrc, PCFL pcflDst, CNO *pcnoDst); bool _FFindCtgRti(CTG ctg, long rti, CNO cnoMin, CNO *pcnoDst); bool _FDecRefCount(long icrp); void _DeleteCore(long icrp); bool _FFindChild(long icrpPar, CTG ctgChild, CNO cnoChild, CHID chid, long *pikid); bool _FAdoptChild(long icrpPar, long ikid, CTG ctgChild, CNO cnoChild, CHID chid, bool fClearLoner); void _ReadFreeMap(void); bool _FFindChidCtg(CTG ctgPar, CNO cnoPar, CHID chid, CTG ctg, KID *pkid); bool _FSetName(long icrp, PSTN pstn); bool _FGetName(long icrp, PSTN pstn); void _GetFlo(long icrp, PFLO pflo); void _GetBlck(long icrp, PBLCK pblck); bool _FEnsureOnExtra(long icrp, FLO *pflo = pvNil); long _Rti(CTG ctg, CNO cno); bool _FSetRti(CTG ctg, CNO cno, long rti); public: // static methods static PCFL PcflFirst(void) { return _pcflFirst; } static PCFL PcflOpen(FNI *pfni, ulong grfcfl); static PCFL PcflCreate(FNI *pfni, ulong grfcfl); static PCFL PcflCreateTemp(FNI *pfni = pvNil); static PCFL PcflFromFni(FNI *pfni); static void ClearMarks(void); static void CloseUnmarked(void); #ifdef CHUNK_STATS static void DumpStn(PSTN pstn, PFIL pfil = pvNil); #endif // CHUNK_STATS virtual void Release(void); bool FSetGrfcfl(ulong grfcfl, ulong grfcflMask = (ulong)~0); void Mark(void) { _fMark = fTrue; } void SetTemp(bool f) { _csto.pfil->SetTemp(f); } bool FTemp(void) { return _csto.pfil->FTemp(); } void GetFni(FNI *pfni) { _csto.pfil->GetFni(pfni); } bool FSetFni(FNI *pfni) { return _csto.pfil->FSetFni(pfni); } long ElError(void); void ResetEl(long el = elNil); bool FReopen(void); // finding and reading chunks bool FOnExtra(CTG ctg, CNO cno); bool FEnsureOnExtra(CTG ctg, CNO cno); bool FFind(CTG ctg, CNO cno, BLCK *pblck = pvNil); bool FFindFlo(CTG ctg, CNO cno, PFLO pflo); bool FReadHq(CTG ctg, CNO cno, HQ *phq); void SetPacked(CTG ctg, CNO cno, bool fPacked); bool FPacked(CTG ctg, CNO cno); bool FUnpackData(CTG ctg, CNO cno); bool FPackData(CTG ctg, CNO cno); // creating and replacing chunks bool FAdd(long cb, CTG ctg, CNO *pcno, PBLCK pblck = pvNil); bool FAddPv(void *pv, long cb, CTG ctg, CNO *pcno); bool FAddHq(HQ hq, CTG ctg, CNO *pcno); bool FAddBlck(PBLCK pblckSrc, CTG ctg, CNO *pcno); bool FPut(long cb, CTG ctg, CNO cno, PBLCK pblck = pvNil); bool FPutPv(void *pv, long cb, CTG ctg, CNO cno); bool FPutHq(HQ hq, CTG ctg, CNO cno); bool FPutBlck(PBLCK pblck, CTG ctg, CNO cno); bool FCopy(CTG ctgSrc, CNO cnoSrc, PCFL pcflDst, CNO *pcnoDst); bool FClone(CTG ctgSrc, CNO cnoSrc, PCFL pcflDst, CNO *pcnoDst); void SwapData(CTG ctg1, CNO cno1, CTG ctg2, CNO cno2); void SwapChildren(CTG ctg1, CNO cno1, CTG ctg2, CNO cno2); void Move(CTG ctg, CNO cno, CTG ctgNew, CNO cnoNew); // creating child chunks bool FAddChild(CTG ctgPar, CNO cnoPar, CHID chid, long cb, CTG ctg, CNO *pcno, PBLCK pblck = pvNil); bool FAddChildPv(CTG ctgPar, CNO cnoPar, CHID chid, void *pv, long cb, CTG ctg, CNO *pcno); bool FAddChildHq(CTG ctgPar, CNO cnoPar, CHID chid, HQ hq, CTG ctg, CNO *pcno); // deleting chunks void Delete(CTG ctg, CNO cno); void SetLoner(CTG ctg, CNO cno, bool fLoner); bool FLoner(CTG ctg, CNO cno); // chunk naming bool FSetName(CTG ctg, CNO cno, PSTN pstn); bool FGetName(CTG ctg, CNO cno, PSTN pstn); // graph structure bool FAdoptChild(CTG ctgPar, CNO cnoPar, CTG ctgChild, CNO cnoChild, CHID chid = 0, bool fClearLoner = fTrue); void DeleteChild(CTG ctgPar, CNO cnoPar, CTG ctgChild, CNO cnoChild, CHID chid = 0); long CckiRef(CTG ctg, CNO cno); tribool TIsDescendent(CTG ctg, CNO cno, CTG ctgSub, CNO cnoSub); void ChangeChid(CTG ctgPar, CNO cnoPar, CTG ctgChild, CNO cnoChild, CHID chidOld, CHID chidNew); // enumerating chunks long Ccki(void); bool FGetCki(long icki, CKI *pcki, long *pckid = pvNil, PBLCK pblck = pvNil); bool FGetIcki(CTG ctg, CNO cno, long *picki); long CckiCtg(CTG ctg); bool FGetCkiCtg(CTG ctg, long icki, CKI *pcki, long *pckid = pvNil, PBLCK pblck = pvNil); // enumerating child chunks long Ckid(CTG ctgPar, CNO cnoPar); bool FGetKid(CTG ctgPar, CNO cnoPar, long ikid, KID *pkid); bool FGetKidChid(CTG ctgPar, CNO cnoPar, CHID chid, KID *pkid); bool FGetKidChidCtg(CTG ctgPar, CNO cnoPar, CHID chid, CTG ctg, KID *pkid); bool FGetIkid(CTG ctgPar, CNO cnoPar, CTG ctg, CNO cno, CHID chid, long *pikid); // Serialized chunk forests bool FWriteChunkTree(CTG ctg, CNO cno, PFIL pfilDst, FP fpDst, long *pcb); static PCFL PcflReadForestFromFlo(PFLO pflo, bool fCopyData); bool FForest(CTG ctg, CNO cno); void SetForest(CTG ctg, CNO cno, bool fForest = fTrue); PCFL PcflReadForest(CTG ctg, CNO cno, bool fCopyData); // writing bool FSave(CTG ctgCreator, FNI *pfni = pvNil); bool FSaveACopy(CTG ctgCreator, FNI *pfni); }; /*************************************************************************** Chunk graph enumerator ***************************************************************************/ enum { // inputs fcgeNil = 0x0000, fcgeSkipToSib = 0x0001, // outputs fcgePre = 0x0010, fcgePost = 0x0020, fcgeRoot = 0x0040, fcgeError = 0x0080 }; #define CGE_PAR BASE #define kclsCGE 'CGE' class CGE : public CGE_PAR { RTCLASS_DEC ASSERT MARKMEM NOCOPY(CGE) private: // data enumeration push state struct DPS { KID kid; long ikid; }; // enumeration states enum { esStart, // waiting to start the enumeration esGo, // go to the next node esGoNoSkip, // there are no children to skip, so ignore fcgeSkipToSib esDone // we're done with the enumeration }; long _es; // current state PCFL _pcfl; // the chunky file PGL _pgldps; // our stack of DPSs DPS _dps; // the current DPS public: CGE(void); ~CGE(void); void Init(PCFL pcfl, CTG ctg, CNO cno); bool FNextKid(KID *pkid, CKI *pckiPar, ulong *pgrfcgeOut, ulong grfcgeIn); }; #ifdef CHUNK_STATS extern bool vfDumpChunkRequests; #endif // CHUNK_STATS #endif //! CHUNK_H ================================================ FILE: kauai/src/clip.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Clipboard object implementation. ***************************************************************************/ #include "frame.h" ASSERTNAME RTCLASS(CLIP) PCLIP vpclip; CLIP _clip; /*************************************************************************** Constructor for the clipboard. ***************************************************************************/ CLIP::CLIP(void) { vpclip = this; AssertThis(0); } /*************************************************************************** Return whether the given document is the clipboard document. If pdocb is nil this returns true if the clipboard is empty and false if it's not empty. ***************************************************************************/ bool CLIP::FDocIsClip(PDOCB pdocb) { AssertThis(0); AssertNilOrPo(pdocb, 0); if (pvNil == pdocb) _EnsureDoc(); return pdocb == _pdocb; } /*************************************************************************** Show the clipboard document. ***************************************************************************/ void CLIP::Show(void) { AssertThis(0); _EnsureDoc(); _ImportCur(); if (pvNil != _pdocb) { if (_pdocb->Cddg() > 0) _pdocb->ActivateDmd(); else _pdocb->PdmdNew(); } } /*************************************************************************** Make the given document the clipboard document. ***************************************************************************/ void CLIP::Set(PDOCB pdocb, bool fExport) { AssertThis(0); AssertNilOrPo(pdocb, 0); if (_fExporting || _fImporting) { Bug("can't change the clipboard while exporting or importing"); return; } if (pdocb == _pdocb) return; _fDocCurrent = fTrue; _fDelayImport = fFalse; _clfmImport = clfmNil; // throw away the old clip document and replace it with the new one SwapVars(&pdocb, &_pdocb); if (pvNil != pdocb) { if (pdocb->Cddg() > 0) pdocb->UpdateName(); ReleasePpo(&pdocb); } if (pvNil != _pdocb) { _pdocb->AddRef(); if (_pdocb->Cddg() > 0) _pdocb->UpdateName(); if (fExport) { _pdocb->ExportFormats(this); EndExport(); } } } /*************************************************************************** See if the clipboard supports this format and if so, get it. ***************************************************************************/ bool CLIP::FGetFormat(long cls, PDOCB *ppdocb) { AssertThis(0); AssertNilOrVarMem(ppdocb); _EnsureDoc(); if (pvNil != ppdocb) _ImportCur(); if (pvNil == _pdocb) return fFalse; if (_pdocb->FIs(cls)) { if (pvNil != ppdocb) { *ppdocb = _pdocb; (*ppdocb)->AddRef(); } return fTrue; } return _pdocb->FGetFormat(cls, ppdocb); } /*************************************************************************** Import stuff from the external clipboard. ***************************************************************************/ void CLIP::Import(void) { AssertThis(0); if (pvNil != _pdocb && _pdocb->Cddg() > 0) Set(); _fDocCurrent = fFalse; } /*************************************************************************** Make sure the _pdocb is current - import the current system clipboard if it isn't. ***************************************************************************/ void CLIP::_EnsureDoc(void) { if (_fExporting || _fImporting) { Bug("can't import the clipboard while exporting or importing"); return; } if (_fDocCurrent) return; _fDocCurrent = fTrue; #ifdef WIN HN hn; PDOCB pdocb; bool fDelay; long clfm; if (GetClipboardOwner() == vwig.hwndApp || !OpenClipboard(vwig.hwndApp)) return; for (clfm = 0; 0 != (clfm = EnumClipboardFormats(clfm));) { if (!_FImportFormat(clfm)) continue; if (hNil == (hn = GetClipboardData(clfm))) continue; pdocb = pvNil; fDelay = fFalse; if (_FImportFormat(clfm, GlobalLock(hn), GlobalSize(hn), &pdocb, &fDelay)) { GlobalUnlock(hn); Set(pdocb, fFalse); _fDelayImport = FPure(fDelay) && pdocb != pvNil; _clfmImport = clfm; ReleasePpo(&pdocb); break; } GlobalUnlock(hn); } CloseClipboard(); #endif // WIN #ifdef MAC RawRtn(); // REVIEW shonk: Mac: implement CLIP::Import #endif // MAC } /*************************************************************************** Import the actual data for the current clipboard (if importing was delayed). ***************************************************************************/ void CLIP::_ImportCur(void) { AssertThis(0); Assert(_fDocCurrent, 0); if (pvNil == _pdocb || !_fDelayImport || clfmNil == _clfmImport) return; #ifdef WIN HN hn; bool fRet; PDOCB pdocb; if (GetClipboardOwner() == vwig.hwndApp || !OpenClipboard(vwig.hwndApp)) return; if (hNil != (hn = GetClipboardData(_clfmImport))) { pdocb = _pdocb; if (pvNil != pdocb) pdocb->AddRef(); fRet = _FImportFormat(_clfmImport, GlobalLock(hn), GlobalSize(hn), &pdocb); GlobalUnlock(hn); if (fRet) Set(pdocb, fFalse); _fDelayImport = fFalse; _clfmImport = clfmNil; ReleasePpo(&pdocb); } CloseClipboard(); #endif // WIN #ifdef MAC RawRtn(); // REVIEW shonk: Mac: implement CLIP::_ImportCur #endif // MAC } /*************************************************************************** Import a particular format. ***************************************************************************/ bool CLIP::_FImportFormat(long clfm, void *pv, long cb, PDOCB *ppdocb, bool *pfDelay) { AssertThis(0); AssertPvCb(pv, cb); AssertNilOrVarMem(ppdocb); AssertNilOrVarMem(pfDelay); Assert(_fDocCurrent, 0); bool fRet; #ifdef WIN if (pvNil != pv && cb > 0) { // adjust cb for text - remove the stupid trailing null and compensate // for the fact that cb might be too big (GlobalSize(hn) might be bigger // than what was allocated). switch (clfm) { case kclfmUniText: wchar *pchw, *pchwLim; pchw = (wchar *)pv; pchwLim = (wchar *)pv + cb / size(wchar); while (pchw < pchwLim && *pchw != 0) pchw++; cb = BvSubPvs(pchw, pv); break; case kclfmSbText: schar *pchs, *pchsLim; pchs = (schar *)pv; pchsLim = (schar *)pv + cb; while (pchs < pchsLim && *pchs != 0) pchs++; cb = BvSubPvs(pchs, pv); break; } } #endif // WIN _fImporting = fTrue; fRet = vpappb->FImportClip(clfm, pv, cb, ppdocb, pfDelay); _fImporting = fFalse; return fRet; } /*************************************************************************** Start an export session. ***************************************************************************/ bool CLIP::FInitExport(void) { AssertThis(0); if (_fExporting || _fImporting) { Bug("Already exporting or importing"); return fFalse; } _hnExport = hNil; #ifdef WIN if (!OpenClipboard(vwig.hwndApp)) return fFalse; if (!EmptyClipboard()) { CloseClipboard(); return fFalse; } _fExporting = fTrue; #endif // WIN #ifdef MAC RawRtn(); // REVIEW shonk: Mac: implement CLIP::FInitExport #endif // MAC return _fExporting; } /*************************************************************************** Allocate a buffer to export to. ***************************************************************************/ void *CLIP::PvExport(long cb, long clfm) { AssertThis(0); AssertIn(cb, 1, kcbMax); if (!_fExporting) { Bug("not exporting"); return pvNil; } _ExportCur(); #ifdef WIN switch (clfm) { case kclfmText: // need to add size(achar) for the terminating zero character cb = LwRoundAway(cb + size(achar), size(achar)); break; } if (hNil == (_hnExport = GlobalAlloc(GMEM_DDESHARE | GMEM_MOVEABLE | GMEM_ZEROINIT, cb))) { return pvNil; } _clfmExport = clfm; return GlobalLock(_hnExport); #endif // WIN #ifdef MAC RawRtn(); // REVIEW shonk: Mac: implement CLIP::PvExport return pvNil; #endif // MAC } /*************************************************************************** End an exporting session. ***************************************************************************/ void CLIP::EndExport(void) { AssertThis(0); if (!_fExporting) return; _ExportCur(); #ifdef WIN CloseClipboard(); #endif // WIN #ifdef MAC RawRtn(); // REVIEW shonk: Mac: implement CLIP::EndExport #endif // MAC _fExporting = fFalse; } /*************************************************************************** Export the current format. ***************************************************************************/ void CLIP::_ExportCur(void) { AssertThis(0); Assert(_fExporting, 0); #ifdef WIN if (hNil != _hnExport) { GlobalUnlock(_hnExport); SetClipboardData(_clfmExport, _hnExport); _hnExport = hNil; } #endif // WIN #ifdef MAC RawRtn(); // REVIEW shonk: Mac: implement CLIP::_ExportCur #endif // MAC } #ifdef DEBUG /*************************************************************************** Assert the validity of a CLIP. ***************************************************************************/ void CLIP::AssertValid(ulong grf) { CLIP_PAR::AssertValid(0); AssertNilOrPo(_pdocb, 0); Assert(!_fExporting || !_fImporting, "both importing and exporting!"); } /*************************************************************************** Mark memory for the CLIP. ***************************************************************************/ void CLIP::MarkMem(void) { AssertValid(0); CLIP_PAR::MarkMem(); MarkMemObj(_pdocb); } #endif // DEBUG ================================================ FILE: kauai/src/clip.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Clipboard object declarations. ***************************************************************************/ #ifndef CLIP_H #define CLIP_H /*************************************************************************** Clipboard object. ***************************************************************************/ typedef class CLIP *PCLIP; #define CLIP_PAR BASE #define kclsCLIP 'CLIP' class CLIP : public CLIP_PAR { RTCLASS_DEC ASSERT MARKMEM protected: PDOCB _pdocb; bool _fDocCurrent : 1; bool _fExporting : 1; bool _fImporting : 1; bool _fDelayImport : 1; HN _hnExport; long _clfmExport; long _clfmImport; void _EnsureDoc(); void _ExportCur(void); void _ImportCur(void); bool _FImportFormat(long clfm, void *pv = pvNil, long cb = 0, PDOCB *ppdocb = pvNil, bool *pfDelay = pvNil); public: CLIP(void); bool FDocIsClip(PDOCB pdocb); void Show(void); void Set(PDOCB pdocb = pvNil, bool fExport = fTrue); bool FGetFormat(long cls, PDOCB *pdocb = pvNil); bool FInitExport(void); void *PvExport(long cb, long clfm); void EndExport(void); void Import(void); }; extern PCLIP vpclip; const long clfmNil = 0; // REVIEW shonk: Mac unicode const long kclfmUniText = MacWin('WTXT', CF_UNICODETEXT); const long kclfmSbText = MacWin('TEXT', CF_TEXT); #ifdef UNICODE const long kclfmText = kclfmUniText; #else //! UNICODE const long kclfmText = kclfmSbText; #endif //! UNICODE #endif //! CLIP_H ================================================ FILE: kauai/src/clok.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Clock class. Clocks provide timing and alarm functionality. Clocks get CPU time by inserting themselves in the command handler list (attached to the CEX). This causes CLOK::FCmdAll to be called every time a command comes through the CEX. The time of a clock is updated only when CLOK::FCmdAll is called. So the following code will not time the operation: dtim = vclok.TimCur(); for (...) { ... } dtim = vlok.TimCur() - dtim; At the end of this, dtim will always be zero (unless CLOK::FCmdAll is somehow called in the loop - in which case dtim still won't be the exact timing of the loop). To do this type of timing use TsCurrent() or TsCurrentSystem(). Clocks use TsCurrent(), so scaling the application time scales all clocks. Added feature: TimCur now takes an optional boolean parameter indicating whether the time should be calculated or just the current value as described above. The default is false (return the current value ...). FSetAlarm also has an optional boolean specifying whether the alarm time should be computed from the current app time or from the current value (ie from TimCur(fTrue) or TimCur(fFalse)). The default is to use TimCur(fFalse) (old behavior). By default, if a clock's time is computed to exceed its next alarm's time, the clock's time "slips" back to the alarm's time. Eg, if an alarm is set for tim = 1000 and the app does something that takes a long time, so that the next time thru the clock's FCmdAll the clocks time is computed to be 1200, the clock's time is set back to 1000 and the alarm is triggered. If the clock should not slip in this way, fclokNoSlip should be specified in the constructor's grfclok parameter. fclokReset means that the clock's time should be reset to 0 every time the following commands come through the command queue: cidKey, cidTrackMouse, cidMouseMove, any cid less than cidMinNoMenu. Such a clock could be used for screen saver functionality or time-out animations, etc. WARNING: If alarms are not handled and set appropriately, the app can sometimes get into a tight loop that the user can't break into. Suppose a command handler "A" wants to do something every 1/10 of a second. It sets up a clock and sets an alarm for 1/10 of a second from now. When the alarm goes off, A sets the next alarm for 1/10 of a second from now, does some work that takes 1/2 second (we're running on a slow machine), then enqueues a command "cidFoo" to another object "B". Assuming the command queue was empty, the next command processed by the CEX is cidFoo. This causes the alarm to go off again (remember that alarms go off during the FCmdAll call). And the whole process repeats. The command queue is never empty in the main app loop, so we never check the system event queue, so the user can sit there and hit the keyboard or play with the mouse as much as they want and we will never see it. The way to avoid this is to set the next alarm after the work is done, and better yet, don't reset the alarm until all commands resulting from the alarm have been processed. Handler A should do the following: do its work, enqueue cidFoo to object B, enqueue cidBar to itself. When it gets cidBar, it sets an alarm for 1/10 of a second into the future. This guarantees a 1/10 second gap between then end of handling one alarm and starting to handle the next alarm. ***************************************************************************/ #include "frame.h" ASSERTNAME RTCLASS(CLOK) BEGIN_CMD_MAP_BASE(CLOK) END_CMD_MAP(&CLOK::FCmdAll, pvNil, kgrfcmmAll) const long kcmhlClok = kswMin; // put clocks at the head of the list PCLOK CLOK::_pclokFirst; /*************************************************************************** Constructor for the clock - just zeros the time. fclokReset specifies that this clock should reset itself to zero on key or mouse input. fclokNoSlip specifies that the clok should not let time slip. ***************************************************************************/ CLOK::CLOK(long hid, ulong grfclok) : CMH(hid) { _pclokNext = _pclokFirst; _pclokFirst = this; _timBase = _timCur = _dtimAlarm = 0; _timNext = kluMax; _tsBase = 0; _grfclok = grfclok; _pglalad = pvNil; AssertThis(0); } /*************************************************************************** Destructor for a CLOK - remove it from the linked list of clocks. ***************************************************************************/ CLOK::~CLOK(void) { PCLOK *ppclok; for (ppclok = &_pclokFirst; *ppclok != pvNil && *ppclok != this; ppclok = &(*ppclok)->_pclokNext) { } if (*ppclok == this) *ppclok = _pclokNext; else Bug("clok not in linked list"); ReleasePpo(&_pglalad); } /*************************************************************************** Static method to find the first clok with the given id. ***************************************************************************/ PCLOK CLOK::PclokFromHid(long hid) { PCLOK pclok; for (pclok = _pclokFirst; pvNil != pclok; pclok = pclok->_pclokNext) { AssertPo(pclok, 0); if (pclok->Hid() == hid) break; } return pclok; } /*************************************************************************** Static method to remove all references to the given CMH from the clok ALAD lists. ***************************************************************************/ void CLOK::BuryCmh(PCMH pcmh) { PCLOK pclok; for (pclok = _pclokFirst; pvNil != pclok; pclok = pclok->_pclokNext) pclok->RemoveCmh(pcmh); } /*************************************************************************** Remove any alarms set by the given CMH. ***************************************************************************/ void CLOK::RemoveCmh(PCMH pcmh) { AssertThis(0); ALAD *qalad; long ialad; if (pvNil == _pglalad) return; for (ialad = _pglalad->IvMac(); ialad-- > 0;) { qalad = (ALAD *)_pglalad->QvGet(ialad); if (qalad->pcmh == pcmh) _pglalad->Delete(ialad); } } /*************************************************************************** Start the clock. ***************************************************************************/ void CLOK::Start(ulong tim) { AssertThis(0); _timBase = _timCur = tim; _dtimAlarm = 0; _tsBase = TsCurrent(); vpcex->RemoveCmh(this, kcmhlClok); vpcex->FAddCmh(this, kcmhlClok, kgrfcmmAll); } /*************************************************************************** Stop the clock. The time will no longer advance on this clock. ***************************************************************************/ void CLOK::Stop(void) { AssertThis(0); vpcex->RemoveCmh(this, kcmhlClok); } /*************************************************************************** Return the current time. If fAdjustForDelay is true, the time is a more accurate time, but is not synchronized to the alarms or to the command stream. Normally, the clok's time is only updated when a command gets processed by the command dispatcher. If fAdjustForDelay is false, the last computed time value is returned, otherwise the time is computed from the current application time. ***************************************************************************/ ulong CLOK::TimCur(bool fAdjustForDelay) { AssertThis(0); if (!fAdjustForDelay) return _timCur; return _timBase + LuMulDiv(TsCurrent() - _tsBase, kdtimSecond, kdtsSecond); } /*************************************************************************** Set an alarm for the given time and for the given command handler. Alarms are sorted in _decreasing_ order. ***************************************************************************/ bool CLOK::FSetAlarm(long dtim, PCMH pcmhNotify, long lwUser, bool fAdjustForDelay) { AssertThis(0); AssertIn(dtim, 0, kcbMax); AssertNilOrPo(pcmhNotify, 0); ALAD alad; ALAD *qalad; long ialad, ialadMin, ialadLim; alad.pcmh = pcmhNotify; alad.tim = TimCur(fAdjustForDelay) + LwMax(dtim, 1); alad.lw = lwUser; if (pvNil == _pglalad && pvNil == (_pglalad = GL::PglNew(size(ALAD), 1))) return fFalse; for (ialadMin = 0, ialadLim = _pglalad->IvMac(); ialadMin < ialadLim;) { ialad = (ialadMin + ialadLim) / 2; qalad = (ALAD *)_pglalad->QvGet(ialad); if (qalad->tim < alad.tim) ialadLim = ialad; else ialadMin = ialad + 1; } if (!_pglalad->FInsert(ialadMin, &alad)) return fFalse; if (_timNext > alad.tim) _timNext = alad.tim; return fTrue; } /*************************************************************************** Advance the clock and sound an alarm if one is due to go off. This actually gets called every time through the command loop. ***************************************************************************/ bool CLOK::FCmdAll(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); CMD cmd; long ialad; ALAD alad; ulong tsCur, timCur; _dtimAlarm = 0; if (pcmd->cid == cidAlarm) return fFalse; tsCur = TsCurrent(); timCur = _timBase + LuMulDiv(tsCur - _tsBase, kdtimSecond, kdtsSecond); if (_grfclok & fclokReset) { switch (pcmd->cid) { case cidKey: case cidTrackMouse: case cidMouseMove: goto LReset; default: if (pcmd->cid < cidMinNoMenu) { LReset: _tsBase = tsCur; _timBase = 0; timCur = 0; } break; } } if (timCur < _timNext) { // just update the time _timCur = timCur; return fFalse; } // sound any alarms for (;;) { if (pvNil == _pglalad || 0 > (ialad = _pglalad->IvMac() - 1)) { _timNext = kluMax; break; } _pglalad->Get(ialad, &alad); if (alad.tim > timCur) { _timNext = alad.tim; break; } _pglalad->Delete(ialad); // adjust the current time _timCur = alad.tim; _timNext = kluMax; if (timCur > alad.tim && !(_grfclok & fclokNoSlip)) { // we've slipped timCur = _timBase = alad.tim; _tsBase = tsCur; } // send the alarm ClearPb(&cmd, size(CMD)); cmd.cid = cidAlarm; cmd.pcmh = alad.pcmh; cmd.rglw[0] = Hid(); cmd.rglw[1] = alad.tim; cmd.rglw[2] = alad.lw; if (pvNil != alad.pcmh) { // tell the CMH that the alarm went off AddRef(); Assert(_cactRef > 1, 0); _dtimAlarm = timCur - _timCur; alad.pcmh->FDoCmd(&cmd); if (_cactRef == 1) { Release(); return fFalse; } Release(); AssertThis(0); } else vpcex->EnqueueCmd(&cmd); } _timCur = timCur; return fFalse; } #ifdef DEBUG /*************************************************************************** Assert the validity of a CLOK. ***************************************************************************/ void CLOK::AssertValid(ulong grf) { CLOK_PAR::AssertValid(0); AssertNilOrPo(_pglalad, 0); Assert(_timCur <= _timNext, "_timNext too small"); Assert((_grfclok & fclokNoSlip) || _dtimAlarm == 0, "_dtimAlarm should be 0"); } /*************************************************************************** Mark memory for the CLOK. ***************************************************************************/ void CLOK::MarkMem(void) { AssertValid(0); CLOK_PAR::MarkMem(); MarkMemObj(_pglalad); } /*************************************************************************** Static method to mark all the CLOKs ***************************************************************************/ void CLOK::MarkAllCloks(void) { PCLOK pclok; for (pclok = _pclokFirst; pvNil != pclok; pclok = pclok->_pclokNext) { AssertPo(pclok, 0); MarkMemObj(pclok); } } #endif // DEBUG ================================================ FILE: kauai/src/clok.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Clock class. See comments in clok.cpp. ***************************************************************************/ #ifndef CLOK_H #define CLOK_H enum { fclokNil = 0, fclokReset = 1, fclokNoSlip = 2, }; typedef class CLOK *PCLOK; #define CLOK_PAR CMH #define kclsCLOK 'CLOK' class CLOK : public CLOK_PAR { RTCLASS_DEC ASSERT MARKMEM CMD_MAP_DEC(CLOK) protected: // alarm descriptor struct ALAD { PCMH pcmh; ulong tim; long lw; }; static PCLOK _pclokFirst; PCLOK _pclokNext; ulong _tsBase; ulong _timBase; ulong _timCur; // current time ulong _dtimAlarm; // processing alarms up to _timCur + _dtimAlarm ulong _timNext; // next alarm time to process (for speed) ulong _grfclok; PGL _pglalad; // the registered alarms public: CLOK(long hid, ulong grfclok = fclokNil); ~CLOK(void); static PCLOK PclokFromHid(long hid); static void BuryCmh(PCMH pcmh); void RemoveCmh(PCMH pcmh); void Start(ulong tim); void Stop(void); ulong TimCur(bool fAdjustForDelay = fFalse); ulong DtimAlarm(void) { return _dtimAlarm; } bool FSetAlarm(long dtim, PCMH pcmhNotify = pvNil, long lwUser = 0, bool fAdjustForDelay = fFalse); // idle handling virtual bool FCmdAll(PCMD pcmd); #ifdef DEBUG static void MarkAllCloks(void); #endif // DEBUG }; #endif //! CLOK_H ================================================ FILE: kauai/src/cmd.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Basic command classes: CEX (command dispatcher), CMH (command handler). The command dispatcher (CEX) has a command (CMD) queue and a list of command handlers (CMH). During normal operation (CEX::FDispatchNextCmd), the CEX takes the next CMD from the queue, passes it to each CMH in its list (by calling CMH::FDoCmd) until one of the handlers returns true. If none of the handlers in the list returns true, the command is passed to the handler specified in the CMD itself (cmd.pcmh, if not nil). A CMH is placed in the handler list by a call to CEX::FAddCmh. The cmhl parameter determines the order of CMH's in the list. The grfcmm parameter indicates which targets the CMH wants to see commands for. The options are fcmmThis, fcmmNobody, fcmmOthers. The CEX class supports command stream recording and playback. ***************************************************************************/ #include "frame.h" ASSERTNAME // command map shared by every command handler BEGIN_CMD_MAP_BASE(CMH) END_CMD_MAP_NIL() RTCLASS(CMH) RTCLASS(CEX) long CMH::_hidLast; #ifdef DEBUG /*************************************************************************** Assert the validity of a CMD. ***************************************************************************/ void CMD::AssertValid(ulong grf) { AssertThisMem(); AssertNilOrPo(pgg, 0); AssertNilOrPo(pcmh, 0); } #endif // DEBUG /*************************************************************************** Static method to return a hid (command handler ID) such that the numbers { hid, hid + 1, ... , hid + ccmh - 1 } are not currently in use and all have their high bit set. To avoid possible conflicts, hard-wired handler ID's should have their high bit clear. This guarantees that the values will not be returned again in the near future (whether or not they are in use). This calls vpappb->PcmhFromHid to determine if a hid is in use. This means that the returned hid is only unique over handlers that the application class knows about. ***************************************************************************/ long CMH::HidUnique(long ccmh) { AssertIn(ccmh, 1, 1000); long ccmhT; _hidLast |= 0x80000000L; for (ccmhT = ccmh; ccmhT-- > 0;) { _hidLast++; if (!(_hidLast & 0x80000000L)) { _hidLast = 0x80000000L; ccmhT = ccmh; continue; } if (pvNil != vpappb->PcmhFromHid(_hidLast)) ccmhT = ccmh; } return _hidLast - (ccmh - 1); } /*************************************************************************** Constructor for a command handler - set the handler id. ***************************************************************************/ CMH::CMH(long hid) { AssertBaseThis(0); Assert(hid != hidNil, "bad hid"); _hid = hid; } /*************************************************************************** Destructor for a command handler - purge any global references to it from the app. The app purges it from the command dispatcher. ***************************************************************************/ CMH::~CMH(void) { AssertThis(0); if (pvNil != vpappb) vpappb->BuryCmh(this); } #ifdef DEBUG /*************************************************************************** Assert the validity of a CMH. ***************************************************************************/ void CMH::AssertValid(ulong grf) { CMH_PAR::AssertValid(0); Assert(_hid != hidNil, 0); } #endif // DEBUG /*************************************************************************** Protected virtual function to find a CMME (command map entry) for the given command id. ***************************************************************************/ bool CMH::_FGetCmme(long cid, ulong grfcmmWanted, CMME *pcmme) { AssertThis(0); AssertVarMem(pcmme); Assert(cid != cidNil, "why is the cid nil?"); CMM *pcmm; CMME *pcmmeT; CMME *pcmmeDef = pvNil; for (pcmm = Pcmm(); pcmm != pvNil; pcmm = pcmm->pcmmBase) { for (pcmmeT = pcmm->prgcmme; pcmmeT->cid != cidNil; pcmmeT++) { if (pcmmeT->cid == cid && (pcmmeT->grfcmm & grfcmmWanted)) { *pcmme = *pcmmeT; return fTrue; } } // check for a default function if (pcmmeT->pfncmd != pvNil && (pcmmeT->grfcmm & grfcmmWanted) && pcmmeDef == pvNil) { pcmmeDef = pcmmeT; } } // no specific one found, return the default one if (pcmmeDef != pvNil) { *pcmme = *pcmmeDef; return fTrue; } return fFalse; } /*************************************************************************** Determines whether this command handler can handle the given command. If not, returns false (and does nothing else). If so, executes the command and returns true. NOTE: a true return indicates that the command was handled and should not be passed on down the command handler list - regardless of the success/failure of the execution of the command. Do not return false to indicate that command execution failed. ***************************************************************************/ bool CMH::FDoCmd(PCMD pcmd) { AssertThis(0); AssertPo(pcmd, 0); CMME cmme; ulong grfcmm; if (pvNil == pcmd->pcmh) grfcmm = fcmmNobody; else if (this == pcmd->pcmh) grfcmm = fcmmThis; else grfcmm = fcmmOthers; if (!_FGetCmme(pcmd->cid, grfcmm, &cmme) || pvNil == cmme.pfncmd) return fFalse; return (this->*cmme.pfncmd)(pcmd); } /*************************************************************************** Determines whether the command is enabled. If this command handler doesn't normally handle the command, this returns false (and does nothing else). Otherwise sets the grfeds and returns true. ***************************************************************************/ bool CMH::FEnableCmd(PCMD pcmd, ulong *pgrfeds) { AssertThis(0); AssertPo(pcmd, 0); AssertVarMem(pgrfeds); CMME cmme; ulong grfcmm; if (pvNil == pcmd->pcmh) grfcmm = fcmmNobody; else if (this == pcmd->pcmh) grfcmm = fcmmThis; else grfcmm = fcmmOthers; if (!_FGetCmme(pcmd->cid, grfcmm, &cmme) || pvNil == cmme.pfncmd) return fFalse; if (cmme.pfneds == pvNil) { if (cidNil == cmme.cid) return fFalse; *pgrfeds = fedsEnable; } else if (!(this->*cmme.pfneds)(pcmd, pgrfeds)) return fFalse; return fTrue; } /*************************************************************************** Command dispatcher constructor. ***************************************************************************/ CEX::CEX(void) { AssertBaseThis(0); } /*************************************************************************** Destructor for a CEX. ***************************************************************************/ CEX::~CEX(void) { AssertBaseThis(0); CMD cmd; long icmd; if (pvNil != _pglcmd) { for (icmd = _pglcmd->IvMac(); icmd-- != 0;) { _pglcmd->Get(icmd, &cmd); ReleasePpo(&cmd.pgg); } ReleasePpo(&_pglcmd); } ReleasePpo(&_pglcmhe); ReleasePpo(&_pcfl); ReleasePpo(&_pglcmdf); ReleasePpo(&_cmdCur.pgg); } /*************************************************************************** Static method to create a new CEX object. ***************************************************************************/ PCEX CEX::PcexNew(long ccmdInit, long ccmhInit) { AssertIn(ccmdInit, 0, kcbMax); AssertIn(ccmhInit, 0, kcbMax); PCEX pcex; if (pvNil == (pcex = NewObj CEX)) return pvNil; if (!pcex->_FInit(ccmdInit, ccmhInit)) ReleasePpo(&pcex); AssertNilOrPo(pcex, 0); return pcex; } /*************************************************************************** Initialization of the command dispatcher. ***************************************************************************/ bool CEX::_FInit(long ccmdInit, long ccmhInit) { AssertBaseThis(0); AssertIn(ccmdInit, 0, kcbMax); AssertIn(ccmhInit, 0, kcbMax); if (pvNil == (_pglcmd = GL::PglNew(size(CMD), ccmdInit)) || pvNil == (_pglcmhe = GL::PglNew(size(CMHE), ccmhInit))) { return fFalse; } AssertThis(0); return fTrue; } /*************************************************************************** Start recording a macro to the given chunky file. ***************************************************************************/ void CEX::Record(PCFL pcfl) { AssertThis(0); AssertPo(pcfl, 0); if (_rs != rsNormal) { Bug("already recording or playing"); return; } _rs = rsRecording; _rec = recNil; _pcfl = pcfl; _pcfl->AddRef(); _cno = cnoNil; _icmdf = 0; _chidLast = 0; _cact = 0; Assert(_pglcmdf == pvNil, "why isn't _pglcmdf nil?"); if ((_pglcmdf = GL::PglNew(size(CMDF), 100)) == pvNil) _rec = recMemError; else if (!_pcfl->FAdd(0, kctgMacro, &_cno)) { _rec = recFileError; _cno = cnoNil; } } /*************************************************************************** Stop recording a command stream, and write the command stream to file. If there were any errors, delete the command stream from the chunky file. Pushes a command notifying the world that recording has stopped. The command (cidCexRecordDone) contains the error code (rec), and cno in the first two lw's of the command. If the rec is not recNil, the cno is cnoNil and wasn't actually created. ***************************************************************************/ void CEX::StopRecording(void) { AssertThis(0); BLCK blck; if (_rs != rsRecording) return; if (_rec == recNil) { long cb; if (_cact > 1) { // rewrite the last one's _cact CMDF cmdf; _pglcmdf->Get(_icmdf, &cmdf); cmdf.cact = _cact; _pglcmdf->Put(_icmdf, &cmdf); } cb = _pglcmdf->CbOnFile(); if (!_pcfl->FPut(cb, kctgMacro, _cno, &blck) || !_pglcmdf->FWrite(&blck)) { _rec = recFileError; } } if (_rec != recNil && _cno != cnoNil) { _pcfl->Delete(kctgMacro, _cno); _cno = cnoNil; } if (_cno != cnoNil) { if (_pcfl->FSave(kctgFramework)) _pcfl->SetTemp(fFalse); else { _rec = recFileError; _cno = cnoNil; } } _rs = rsNormal; ReleasePpo(&_pglcmdf); ReleasePpo(&_pcfl); PushCid(cidCexRecordDone, pvNil, pvNil, _rec, _cno); } /*************************************************************************** Record a command. ***************************************************************************/ void CEX::RecordCmd(PCMD pcmd) { AssertThis(0); AssertPo(pcmd, 0); Assert(_rs == rsRecording, "not recording"); CMDF cmdf; if (_rec != recNil) return; if (_cact > 0) { if (_cmd.pgg == pvNil && FEqualRgb(pcmd, &_cmd, size(_cmd))) { // commands are the same, just increment the _cact if (pcmd->cid < cidMinNoRepeat || pcmd->cid >= cidLimNoRepeat) _cact++; return; } // new command is not the same as the previous one if (_cact > 1) { // rewrite the previous one's _cact _pglcmdf->Get(_icmdf, &cmdf); cmdf.cact = _cact; _pglcmdf->Put(_icmdf, &cmdf); } // increment _icmdf _icmdf++; _cact = 0; } // fill in the cmdf and save it in the list cmdf.cid = pcmd->cid; cmdf.hid = pcmd->pcmh == pvNil ? hidNil : pcmd->pcmh->Hid(); cmdf.cact = 1; cmdf.chidGg = pcmd->pgg != pvNil ? ++_chidLast : 0; CopyPb(pcmd->rglw, cmdf.rglw, kclwCmd * size(long)); if (!_pglcmdf->FInsert(_icmdf, &cmdf)) { // out of memory _rec = recMemError; return; } // write the group and make it a child of the macro if (pvNil != pcmd->pgg) { BLCK blck; long cb; CNO cno; cb = pcmd->pgg->CbOnFile(); if (!_pcfl->FAddChild(kctgMacro, _cno, cmdf.chidGg, cb, kctgGg, &cno, &blck)) { goto LFileError; } if (!pcmd->pgg->FWrite(&blck)) { _pcfl->DeleteChild(kctgMacro, _cno, kctgGg, cno, cmdf.chidGg); LFileError: _pglcmdf->Delete(_icmdf); _rec = recFileError; return; } } _cact = 1; _cmd = *pcmd; } /*************************************************************************** Play back the command stream starting in the given pcfl with the given cno. ***************************************************************************/ void CEX::Play(PCFL pcfl, CNO cno) { AssertThis(0); AssertPo(pcfl, 0); BLCK blck; short bo, osk; if (_rs != rsNormal) { Bug("already recording or playing"); return; } _rs = rsPlaying; _rec = recNil; _pcfl = pcfl; _pcfl->AddRef(); _cno = cno; _icmdf = 0; _cact = 0; Assert(_pglcmdf == pvNil, "why isn't _pglcmdf nil?"); if (!_pcfl->FFind(kctgMacro, _cno, &blck) || (_pglcmdf = GL::PglRead(&blck, &bo, &osk)) == pvNil) { _rec = recFileError; StopPlaying(); } else if (bo != kboCur || osk != koskCur) { _rec = recWrongPlatform; StopPlaying(); } } /*************************************************************************** Stop play back of a command stream. Pushes a command notifying the world that play back has stopped. The command (cidCexPlayDone) contains the error code (rec), and cno in the first two lw's of the command. ***************************************************************************/ void CEX::StopPlaying(void) { AssertThis(0); if (_rs != rsPlaying) return; if (_rec == recNil && (_cact > 0 || _icmdf < _pglcmdf->IvMac())) _rec = recAbort; PushCid(cidCexPlayDone, pvNil, pvNil, _rec, _cno); _rs = rsNormal; ReleasePpo(&_pcfl); ReleasePpo(&_pglcmdf); } /*************************************************************************** Read the next command. ***************************************************************************/ bool CEX::_FReadCmd(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); Assert(_rs == rsPlaying, "not playing a command stream"); AssertPo(_pglcmdf, 0); CMDF cmdf; if (_cact > 0) { // this command is being repeated *pcmd = _cmd; _cact--; return fTrue; } if (_icmdf >= _pglcmdf->IvMac()) goto LStop; _pglcmdf->Get(_icmdf, &cmdf); ClearPb(pcmd, size(*pcmd)); pcmd->cid = cmdf.cid; pcmd->pcmh = vpappb->PcmhFromHid(cmdf.hid); pcmd->pgg = pvNil; CopyPb(cmdf.rglw, pcmd->rglw, kclwCmd * size(long)); if (cmdf.chidGg != 0) { BLCK blck; KID kid; short bo, osk; Assert(cmdf.cact <= 1, 0); // read the gg if (!_pcfl->FGetKidChidCtg(kctgMacro, _cno, cmdf.chidGg, kctgGg, &kid) || !_pcfl->FFind(kid.cki.ctg, kid.cki.cno, &blck) || pvNil == (pcmd->pgg = GG::PggRead(&blck, &bo, &osk))) { _rec = recFileError; goto LStop; } if (bo != kboCur || osk != koskCur) { // don't know how to change byte order or translate strings ReleasePpo(&pcmd->pgg); _rec = recWrongPlatform; goto LStop; } } AssertPo(pcmd, 0); _icmdf++; if ((_cact = cmdf.cact - 1) > 0) _cmd = *pcmd; return fTrue; // error handling LStop: StopPlaying(); return fFalse; } /*************************************************************************** Determine whether it's OK to communicate with the CMH. Default is to return true iff there is no current modal gob or the cmh is not a gob or it is a gob in the tree of the modal gob. ***************************************************************************/ bool CEX::_FCmhOk(PCMH pcmh) { AssertNilOrPo(pcmh, 0); PGOB pgob; if (pvNil == _pgobModal || pvNil == pcmh || !pcmh->FIs(kclsGOB)) return fTrue; for (pgob = (PGOB)pcmh; pgob != _pgobModal; pgob = pgob->PgobPar()) { if (pvNil == pgob) return fFalse; } return fTrue; } /*************************************************************************** Add a command handler to the filter list. These command handlers get a crack at every command whether or not it is for them. grfcmm determines which targets the handler will see commands for (as in command map entries). The cmhl is a command handler level - indicating the priority of the command handler. Handlers with lower cmhl values get first crack at commands. It is legal for a handler to be in the list more than once (even with the same cmhl value). ***************************************************************************/ bool CEX::FAddCmh(PCMH pcmh, long cmhl, ulong grfcmm) { AssertThis(0); AssertPo(pcmh, 0); CMHE cmhe; long icmhe; if (fcmmNil == (grfcmm & kgrfcmmAll)) { // no sense adding this Bug("why is grfcmm nil?"); return fFalse; } if (!_FCmhOk(pcmh)) return fFalse; _FFindCmhl(cmhl, &icmhe); cmhe.pcmh = pcmh; cmhe.cmhl = cmhl; cmhe.grfcmm = grfcmm; if (!_pglcmhe->FInsert(icmhe, &cmhe)) return fFalse; if (icmhe <= _icmheNext) _icmheNext++; return fTrue; } /*************************************************************************** Removes the the handler (at the given cmhl level) from the handler list. ***************************************************************************/ void CEX::RemoveCmh(PCMH pcmh, long cmhl) { AssertThis(0); AssertPo(pcmh, 0); long icmhe, ccmhe; CMHE cmhe; if (!_FFindCmhl(cmhl, &icmhe)) return; for (ccmhe = _pglcmhe->IvMac(); icmhe < ccmhe; icmhe++) { _pglcmhe->Get(icmhe, &cmhe); if (cmhe.cmhl != cmhl) break; if (cmhe.pcmh == pcmh) { _pglcmhe->Delete(icmhe); if (icmhe < _icmheNext) _icmheNext--; break; } } } /*************************************************************************** Remove all references to the handler from the command dispatcher, including from the handler list and the command queue. ***************************************************************************/ void CEX::BuryCmh(PCMH pcmh) { AssertThis(0); Assert(pcmh != pvNil, 0); long icmhe, icmd; CMHE cmhe; CMD cmd; if (_pgobModal == pcmh) _pgobModal = pvNil; if (_pgobTrack == pcmh) { #ifdef WIN if (hNil != _hwndCapture && GetCapture() == _hwndCapture) ReleaseCapture(); _hwndCapture = hNil; #endif // WIN _pgobTrack = pvNil; } if (_cmdCur.pcmh == pcmh) _cmdCur.pcmh = pvNil; if (_cmd.pcmh == pcmh) { _cmd.pcmh = pvNil; _cact = 0; } for (icmhe = _pglcmhe->IvMac(); icmhe-- != 0;) { _pglcmhe->Get(icmhe, &cmhe); if (cmhe.pcmh == pcmh) { _pglcmhe->Delete(icmhe); if (icmhe < _icmheNext) _icmheNext--; } } for (icmd = _pglcmd->IvMac(); icmd-- != 0;) { _pglcmd->Get(icmd, &cmd); if (cmd.pcmh == pcmh) { _pglcmd->Delete(icmd); ReleasePpo(&cmd.pgg); } } } /*************************************************************************** Finds the first item with the given cmhl in the handler list. If there aren't any, still sets *picmhe to where they would be. ***************************************************************************/ bool CEX::_FFindCmhl(long cmhl, long *picmhe) { AssertThis(0); AssertVarMem(picmhe); long icmhe, icmheMin, icmheLim; CMHE *qrgcmhe; qrgcmhe = (CMHE *)_pglcmhe->QvGet(0); for (icmheMin = 0, icmheLim = _pglcmhe->IvMac(); icmheMin < icmheLim;) { icmhe = (icmheMin + icmheLim) / 2; if (qrgcmhe[icmhe].cmhl < cmhl) icmheMin = icmhe + 1; else icmheLim = icmhe; } *picmhe = icmheMin; return icmheMin < _pglcmhe->IvMac() && qrgcmhe[icmheMin].cmhl == cmhl; } /*************************************************************************** Adds a command to the tail of the queue. ***************************************************************************/ void CEX::EnqueueCid(long cid, PCMH pcmh, PGG pgg, long lw0, long lw1, long lw2, long lw3) { Assert(cid != cidNil, 0); AssertNilOrPo(pcmh, 0); AssertNilOrPo(pgg, 0); CMD cmd; cmd.cid = cid; cmd.pcmh = pcmh; cmd.pgg = pgg; cmd.rglw[0] = lw0; cmd.rglw[1] = lw1; cmd.rglw[2] = lw2; cmd.rglw[3] = lw3; EnqueueCmd(&cmd); } /*************************************************************************** Pushes a command onto the head of the queue. ***************************************************************************/ void CEX::PushCid(long cid, PCMH pcmh, PGG pgg, long lw0, long lw1, long lw2, long lw3) { Assert(cid != cidNil, 0); AssertNilOrPo(pcmh, 0); AssertNilOrPo(pgg, 0); CMD cmd; cmd.cid = cid; cmd.pcmh = pcmh; cmd.pgg = pgg; cmd.rglw[0] = lw0; cmd.rglw[1] = lw1; cmd.rglw[2] = lw2; cmd.rglw[3] = lw3; PushCmd(&cmd); } /*************************************************************************** Adds a command to the tail of the queue. This asserts if it can't add it to the queue. Clients should make sure that the value of ccmdInit passed to PcexNew is large enough to handle the busiest session. ***************************************************************************/ void CEX::EnqueueCmd(PCMD pcmd) { AssertThis(0); AssertPo(pcmd, 0); Assert(pcmd->cid != cidNil, "why enqueue a nil command?"); if (!_pglcmd->FEnqueue(pcmd)) { Bug("event queue not big enough"); ReleasePpo(&pcmd->pgg); } #ifdef DEBUG if (_ccmdMax < _pglcmd->IvMac()) _ccmdMax = _pglcmd->IvMac(); #endif // DEBUG } /*************************************************************************** Pushes a command onto the head of the queue. This asserts if it can't add it to the queue. Clients should make sure that the value of ccmdInit passed to PcexNew is large enough to handle the busiest session. ***************************************************************************/ void CEX::PushCmd(PCMD pcmd) { AssertThis(0); AssertPo(pcmd, 0); Assert(pcmd->cid != cidNil, "why enqueue a nil command?"); if (!_pglcmd->FPush(pcmd)) { Bug("event queue not big enough"); ReleasePpo(&pcmd->pgg); } #ifdef DEBUG if (_ccmdMax < _pglcmd->IvMac()) _ccmdMax = _pglcmd->IvMac(); #endif // DEBUG } /*************************************************************************** Checks if a cid is in the queue. ***************************************************************************/ bool CEX::FCidIn(long cid) { AssertThis(0); Assert(cid != cidNil, "why check for a nil command?"); long icmd; CMD cmd; for (icmd = _pglcmd->IvMac(); icmd-- > 0;) { _pglcmd->Get(icmd, &cmd); if (cmd.cid == cid) return fTrue; } return fFalse; } /*************************************************************************** Flushes all instances of a cid in the queue. ***************************************************************************/ void CEX::FlushCid(long cid) { AssertThis(0); Assert(cid != cidNil, "why flush a nil command?"); long icmd; CMD cmd; for (icmd = _pglcmd->IvMac(); icmd-- > 0;) { _pglcmd->Get(icmd, &cmd); if (cmd.cid == cid) { _pglcmd->Delete(icmd); ReleasePpo(&cmd.pgg); } } } /*************************************************************************** Get the next command to be dispatched (put it in _cmdCur). Return tYes if there was a command and it should be dispatched. Return tNo if there wasn't a command (if the system queue should be checked). Return tMaybe if the command shouldn't be dispatched, but we shouldn't check the system queue. ***************************************************************************/ tribool CEX::_TGetNextCmd(void) { AssertThis(0); // get the next command from the command stream if (!_pglcmd->FPop(&_cmdCur)) { ClearPb(&_cmdCur, size(_cmdCur)); if (pvNil == _pgobTrack) return tNo; AssertPo(_pgobTrack, 0); PT pt; PCMD_MOUSE pcmd = (PCMD_MOUSE)&_cmdCur; _cmdCur.pcmh = _pgobTrack; _cmdCur.cid = cidTrackMouse; vpappb->TrackMouse(_pgobTrack, &pt); pcmd->xp = pt.xp; pcmd->yp = pt.yp; pcmd->grfcust = vpappb->GrfcustCur(); if (!vpappb->FForeground()) { // if we're not in the foreground, toggle the state of // fcustMouse repeatedly. Most of the time, this will cause // the client to stop tracking the mouse. Clients // whose tracking state depends on something other than // the mouse state should call vpappb->FForeground() to // determine if tracking should be aborted. static bool _fDown; _fDown = !_fDown; if (!_fDown) pcmd->grfcust ^= fcustMouse; else pcmd->grfcust &= ~fcustMouse; } } AssertPo(&_cmdCur, 0); // handle playing and recording if (rsPlaying == _rs) { // We're playing back. Throw away the incoming command and play // one from the stream. ReleasePpo(&_cmdCur.pgg); // let a cidCexStopPlay go through and handle it at the end. // this is so a cmh can intercept it. if (_cmdCur.cid != cidCexStopPlay && !_FReadCmd(&_cmdCur)) return tMaybe; } if (!_FCmhOk(_cmdCur.pcmh)) { vpappb->BadModalCmd(&_cmdCur); ReleasePpo(&_cmdCur.pgg); return tMaybe; } return tYes; } /*************************************************************************** Send the command (_cmdCur) to the given command handler. ***************************************************************************/ bool CEX::_FSendCmd(PCMH pcmh) { AssertPo(pcmh, 0); if (!_FCmhOk(pcmh)) return fFalse; return pcmh->FDoCmd(&_cmdCur); } /*************************************************************************** Handle post processing on the command - record it if we're recording, free the pgg, etc. ***************************************************************************/ void CEX::_CleanUpCmd(void) { // If the handler went away during command dispatching, we should // have heard about it (via BuryCmh) and should have set _cmdCur.pcmh // to nil. AssertNilOrPo(_cmdCur.pcmh, 0); // record the command after dispatching, in case arguments got added // or the cid was set to nil. if (rsRecording == _rs && !FIn(_cmdCur.cid, cidMinNoRecord, cidLimNoRecord) && cidNil != _cmdCur.cid && cidCexStopRec != _cmdCur.cid) { RecordCmd(&_cmdCur); } // check for a stop record or stop play command if (rsNormal != _rs) { if (cidCexStopPlay == _cmdCur.cid && rsPlaying == _rs) StopPlaying(); else if (cidCexStopRec == _cmdCur.cid && rsRecording == _rs) StopRecording(); } ReleasePpo(&_cmdCur.pgg); } /*************************************************************************** If there is a command in the queue, this dispatches it and returns true. If there aren't any commands in the queue, it simply returns false. If a gob is tracking the mouse and the queue is empty, a cidTrackMouse command is generated and dispatched to the gob. NOTE: care has to be taken here because a CMH may go away while dispatching the command. That's why _cmdCur and _icmheNext are member variables - so BuryCmh can adjust them if needed. ***************************************************************************/ bool CEX::FDispatchNextCmd(void) { AssertThis(0); CMHE cmhe; bool fHandled; bool tRet; if (_fDispatching) { Bug("recursing into FDispatchNextCmd!"); return fFalse; } _fDispatching = fTrue; tRet = _TGetNextCmd(); if (tYes != tRet) { _fDispatching = fFalse; return tRet != tNo; } // pipe it through the command handlers, then to the target fHandled = fFalse; for (_icmheNext = 0; _icmheNext < _pglcmhe->IvMac() && !fHandled;) { _pglcmhe->Get(_icmheNext++, &cmhe); if (pvNil == _cmdCur.pcmh) { if (!(cmhe.grfcmm & fcmmNobody)) continue; } else if (cmhe.pcmh == _cmdCur.pcmh) { if (!(cmhe.grfcmm & fcmmThis)) continue; } else if (!(cmhe.grfcmm & fcmmOthers)) continue; fHandled = _FSendCmd(cmhe.pcmh); } if (!fHandled && pvNil != _cmdCur.pcmh) { AssertPo(_cmdCur.pcmh, 0); fHandled = _FSendCmd(_cmdCur.pcmh); } _CleanUpCmd(); _fDispatching = fFalse; return fTrue; } /*************************************************************************** Give the handler a crack at enabling/disabling the command. ***************************************************************************/ bool CEX::_FEnableCmd(PCMH pcmh, PCMD pcmd, ulong *pgrfeds) { AssertPo(pcmh, 0); AssertPo(pcmd, 0); AssertVarMem(pgrfeds); if (!_FCmhOk(pcmh)) return fFalse; return pcmh->FEnableCmd(pcmd, pgrfeds); } /*************************************************************************** Determines whether the given command is currently enabled. This is normally used for menu graying/checking etc and toolbar enabling/status. ***************************************************************************/ ulong CEX::GrfedsForCmd(PCMD pcmd) { AssertThis(0); AssertPo(pcmd, 0); long icmhe, ccmhe; CMHE cmhe; ulong grfeds; // pipe it through the command handlers, then to the target for (icmhe = 0, ccmhe = _pglcmhe->IvMac(); icmhe < ccmhe; icmhe++) { _pglcmhe->Get(icmhe, &cmhe); grfeds = fedsNil; if (_FEnableCmd(cmhe.pcmh, pcmd, &grfeds)) goto LDone; } if (pcmd->pcmh != pvNil) { AssertPo(pcmd->pcmh, 0); grfeds = fedsNil; if (_FEnableCmd(pcmd->pcmh, pcmd, &grfeds)) goto LDone; } // handle the CEX commands switch (pcmd->cid) { case cidCexStopRec: grfeds = rsRecording == _rs ? fedsEnable : fedsDisable; break; case cidCexStopPlay: grfeds = rsPlaying == _rs ? fedsEnable : fedsDisable; break; default: grfeds = fedsDisable; break; } LDone: return grfeds; } /*************************************************************************** Determines whether the given command is currently enabled. This is normally used for menu graying/checking etc and toolbar enabling/status. ***************************************************************************/ ulong CEX::GrfedsForCid(long cid, PCMH pcmh, PGG pgg, long lw0, long lw1, long lw2, long lw3) { AssertThis(0); Assert(cid != cidNil, 0); AssertNilOrPo(pcmh, 0); AssertNilOrPo(pgg, 0); CMD cmd; cmd.cid = cid; cmd.pcmh = pcmh; cmd.pgg = pgg; cmd.rglw[0] = lw0; cmd.rglw[1] = lw1; cmd.rglw[2] = lw2; cmd.rglw[3] = lw3; return GrfedsForCmd(&cmd); } /*************************************************************************** See if the next command is a key command and if so, put it in *pcmd (and remove it from the queue). ***************************************************************************/ bool CEX::FGetNextKey(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); long iv; if (_rs != rsNormal) goto LFail; if ((iv = _pglcmd->IvMac()) > 0) { // get next cmd _pglcmd->Get(iv - 1, pcmd); if (pcmd->cid == cidKey) { AssertDo(_pglcmd->FPop(pvNil), 0); return fTrue; } LFail: TrashVar(pcmd); return fFalse; } return vpappb->FGetNextKeyFromOsQueue((PCMD_KEY)pcmd); } /*************************************************************************** The given GOB wants to track the mouse. ***************************************************************************/ void CEX::TrackMouse(PGOB pgob) { AssertThis(0); AssertPo(pgob, 0); Assert(_pgobTrack == pvNil, "some other gob is already tracking the mouse"); _pgobTrack = pgob; #ifdef WIN _hwndCapture = pgob->HwndContainer(); SetCapture(_hwndCapture); #endif // WIN } /*************************************************************************** Stop tracking the mouse. ***************************************************************************/ void CEX::EndMouseTracking(void) { AssertThis(0); #ifdef WIN if (pvNil != _pgobTrack) { if (hNil != _hwndCapture && GetCapture() == _hwndCapture) ReleaseCapture(); _hwndCapture = hNil; } #endif // WIN _pgobTrack = pvNil; } /*************************************************************************** Return the gob that is tracking the mouse. ***************************************************************************/ PGOB CEX::PgobTracking(void) { AssertThis(0); return _pgobTrack; } /*************************************************************************** Suspend or resume the command dispatcher. All this does is release (capture) the mouse if we're current tracking the mouse and we're being suspended (resumed). ***************************************************************************/ void CEX::Suspend(bool fSuspend) { AssertThis(0); #ifdef WIN if (pvNil == _pgobTrack || hNil == _hwndCapture) return; if (fSuspend && GetCapture() == _hwndCapture) ReleaseCapture(); else if (!fSuspend && GetCapture() != _hwndCapture) SetCapture(_hwndCapture); #endif // WIN } /*************************************************************************** Set the modal GOB. ***************************************************************************/ void CEX::SetModalGob(PGOB pgob) { AssertThis(0); AssertNilOrPo(pgob, 0); _pgobModal = pgob; } #ifdef DEBUG /*************************************************************************** Assert the validity of the command dispatcher ***************************************************************************/ void CEX::AssertValid(ulong grf) { CEX_PAR::AssertValid(fobjAllocated); AssertPo(_pglcmhe, 0); AssertPo(_pglcmd, 0); AssertNilOrPo(_pglcmdf, 0); AssertNilOrPo(_pcfl, 0); AssertNilOrPo(_cmdCur.pgg, 0); } /*************************************************************************** Mark the memory associated with the command dispatcher. ***************************************************************************/ void CEX::MarkMem(void) { AssertThis(0); CMD cmd; long icmd; CEX_PAR::MarkMem(); MarkMemObj(_pglcmhe); MarkMemObj(_pglcmd); MarkMemObj(_pglcmdf); MarkMemObj(_cmdCur.pgg); for (icmd = _pglcmd->IvMac(); icmd-- != 0;) { _pglcmd->Get(icmd, &cmd); if (cmd.pgg != pvNil) MarkMemObj(cmd.pgg); } } #endif // DEBUG ================================================ FILE: kauai/src/cmd.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Command execution. Manages the command filter list and dispatching commands to command handlers. ***************************************************************************/ #ifndef CMD_H #define CMD_H /*************************************************************************** Command id, options and command struct ***************************************************************************/ // command handler forward declaration class CMH; typedef CMH *PCMH; // command enable-disable status flags enum { fedsNil = 0, fedsDisable = 1, fedsEnable = 2, fedsUncheck = 4, fedsCheck = 8, fedsBullet = 16 }; const ulong kgrfedsMark = fedsUncheck | fedsCheck | fedsBullet; // command #define kclwCmd 4 // if this ever changes, change the CMD_TYPE macro also struct CMD { ASSERT PCMH pcmh; // the target of the command - may be nil long cid; // the command id PGG pgg; // additional parameters for the command long rglw[kclwCmd]; // standard parameters }; typedef CMD *PCMD; // command on file - for saving recorded macros struct CMDF { long cid; long hid; long cact; CHID chidGg; // child id of the pgg, 0 if none long rglw[kclwCmd]; }; /*************************************************************************** Custom command types ***************************************************************************/ // used to define a new CMD structure. Needs a trailing semicolon. #define CMD_TYPE(foo, a, b, c, d) \ struct CMD_##foo \ { \ PCMH pcmh; \ long cid; \ PGG pgg; \ long a, b, c, d; \ }; \ typedef CMD_##foo *PCMD_##foo CMD_TYPE(KEY, ch, vk, grfcust, cact); // defines CMD_KEY and PCMD_KEY CMD_TYPE(BADKEY, ch, vk, grfcust, hid); // defines CMD_BADKEY and PCMD_BADKEY CMD_TYPE(MOUSE, xp, yp, grfcust, cact); // defines CMD_MOUSE and PCMD_MOUSE /*************************************************************************** Command Map stuff. To attach a command map to a subclass of CMH, put a CMD_MAP_DEC(cls) in the definition of the class. Then in the .cpp file, use BEGIN_CMD_MAP, ON_CID and END_CMD_MAP to define the command map. This architecture was borrowed from MFC. ***************************************************************************/ enum { fcmmNil = 0, fcmmThis = 1, fcmmNobody = 2, fcmmOthers = 4, }; const ulong kgrfcmmAll = fcmmThis | fcmmNobody | fcmmOthers; // for including a command map in this class #define CMD_MAP_DEC(cls) \ private: \ static CMME _rgcmme##cls[]; \ \ protected: \ static CMM _cmm##cls; \ virtual CMM *Pcmm(void) \ { \ return &_cmm##cls; \ } // for defining the command map in a .cpp file #define BEGIN_CMD_MAP_BASE(cls) \ cls::CMM cls::_cmm##cls = {pvNil, cls::_rgcmme##cls}; \ cls::CMME cls::_rgcmme##cls[] = { #define BEGIN_CMD_MAP(cls, clsBase) \ cls::CMM cls::_cmm##cls = {&(clsBase::_cmm##clsBase), cls::_rgcmme##cls}; \ cls::CMME cls::_rgcmme##cls[] = { #define ON_CID(cid, pfncmd, pfneds, grfcmm) {cid, (PFNCMD)pfncmd, (PFNEDS)pfneds, grfcmm}, #define ON_CID_ME(cid, pfncmd, pfneds) {cid, (PFNCMD)pfncmd, (PFNEDS)pfneds, fcmmThis}, #define ON_CID_GEN(cid, pfncmd, pfneds) {cid, (PFNCMD)pfncmd, (PFNEDS)pfneds, fcmmThis | fcmmNobody}, #define ON_CID_ALL(cid, pfncmd, pfneds) {cid, (PFNCMD)pfncmd, (PFNEDS)pfneds, kgrfcmmAll}, #define END_CMD_MAP(pfncmdDef, pfnedsDef, grfcmm) \ { \ cidNil, (PFNCMD)pfncmdDef, (PFNEDS)pfnedsDef, grfcmm \ } \ } \ ; #define END_CMD_MAP_NIL() \ { \ cidNil, pvNil, pvNil, fcmmNil \ } \ } \ ; /*************************************************************************** Command handler class ***************************************************************************/ #define CMH_PAR BASE #define kclsCMH 'CMH' class CMH : public CMH_PAR { RTCLASS_DEC ASSERT private: static long _hidLast; // for HidUnique long _hid; // handler id protected: // command function typedef bool (CMH::*PFNCMD)(PCMD pcmd); // command enabler function typedef bool (CMH::*PFNEDS)(PCMD pcmd, ulong *pgrfeds); // command map entry struct CMME { long cid; PFNCMD pfncmd; PFNEDS pfneds; ulong grfcmm; }; // command map struct CMM { CMM *pcmmBase; CMME *prgcmme; }; CMD_MAP_DEC(CMH) protected: virtual bool _FGetCmme(long cid, ulong grfcmmWanted, CMME *pcmme); public: CMH(long hid); ~CMH(void); // return indicates whether the command was handled, not success virtual bool FDoCmd(PCMD pcmd); virtual bool FEnableCmd(PCMD pcmd, ulong *pgrfeds); long Hid(void) { return _hid; } static long HidUnique(long ccmh = 1); }; /*************************************************************************** Command execution manager (dispatcher) ***************************************************************************/ // command stream recording error codes. enum { recNil, recFileError, recMemError, recWrongPlatform, recAbort, recLim }; typedef class CEX *PCEX; #define CEX_PAR BASE #define kclsCEX 'CEX' class CEX : public CEX_PAR { RTCLASS_DEC ASSERT MARKMEM NOCOPY(CEX) protected: // an entry in the command handler list struct CMHE { PCMH pcmh; long cmhl; ulong grfcmm; }; // command recording/playback state enum { rsNormal, rsRecording, rsPlaying, rsLim }; // recording and playback long _rs; // recording/playback state long _rec; // recording/playback errors PCFL _pcfl; // the file we are recording to or playing from PGL _pglcmdf; // the command stream CNO _cno; // which macro is being played long _icmdf; // current command for recording or playback CHID _chidLast; // last chid used for recording long _cact; // number of times on this command CMD _cmd; // previous command recorded or played // dispatching CMD _cmdCur; // command being dispatched long _icmheNext; // next command handler to dispatch to PGOB _pgobTrack; // the gob that is tracking the mouse #ifdef WIN HWND _hwndCapture; // the hwnd that we captured the mouse with #endif // WIN // filter list and command queue PGL _pglcmhe; // the command filter list PGL _pglcmd; // the command queue bool _fDispatching; // whether we're currently in FDispatchNextCmd // Modal filtering PGOB _pgobModal; #ifdef DEBUG long _ccmdMax; // running max #endif // DEBUG CEX(void); virtual bool _FInit(long ccmdInit, long ccmhInit); virtual bool _FFindCmhl(long cmhl, long *picmhe); virtual bool _FCmhOk(PCMH pcmh); virtual tribool _TGetNextCmd(void); virtual bool _FSendCmd(PCMH pcmh); virtual void _CleanUpCmd(void); virtual bool _FEnableCmd(PCMH pcmh, PCMD pcmd, ulong *pgrfeds); // command recording and playback bool _FReadCmd(PCMD pcmd); public: static PCEX PcexNew(long ccmdInit, long ccmhInit); ~CEX(void); // recording and play back bool FRecording(void) { return _rs == rsRecording; } bool FPlaying(void) { return _rs == rsPlaying; } void Record(PCFL pcfl); void Play(PCFL pcfl, CNO cno); void StopRecording(void); void StopPlaying(void); void RecordCmd(PCMD pcmd); // managing the filter list virtual bool FAddCmh(PCMH pcmh, long cmhl, ulong grfcmm = fcmmNobody); virtual void RemoveCmh(PCMH pcmh, long cmhl); virtual void BuryCmh(PCMH pcmh); // queueing and dispatching virtual void EnqueueCmd(PCMD pcmd); virtual void PushCmd(PCMD pcmd); virtual void EnqueueCid(long cid, PCMH pcmh = pvNil, PGG pgg = pvNil, long lw0 = 0, long lw1 = 0, long lw2 = 0, long lw3 = 0); virtual void PushCid(long cid, PCMH pcmh = pvNil, PGG pgg = pvNil, long lw0 = 0, long lw1 = 0, long lw2 = 0, long lw3 = 0); virtual bool FDispatchNextCmd(void); virtual bool FGetNextKey(PCMD pcmd); virtual bool FCidIn(long cid); virtual void FlushCid(long cid); // menu marking virtual ulong GrfedsForCmd(PCMD pcmd); virtual ulong GrfedsForCid(long cid, PCMH pcmh = pvNil, PGG pgg = pvNil, long lw0 = 0, long lw1 = 0, long lw2 = 0, long lw3 = 0); // mouse tracking virtual void TrackMouse(PGOB pgob); virtual void EndMouseTracking(void); virtual PGOB PgobTracking(void); virtual void Suspend(bool fSuspend = fTrue); virtual void SetModalGob(PGOB pgob); }; #endif //! CMD_H ================================================ FILE: kauai/src/codec.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Codec manager class. ***************************************************************************/ #include "util.h" ASSERTNAME RTCLASS(CODM) RTCLASS(CODC) /*************************************************************************** The header on a compressed block consists of the cfmt (a long in big endian order) and the decompressed length (a long in big endian order). ***************************************************************************/ const long kcbCodecHeader = 2 * size(long); /*************************************************************************** Constructor for the compression manager. pcodc is an optional default codec. cfmt is the default compression format. ***************************************************************************/ CODM::CODM(PCODC pcodc, long cfmt) { AssertNilOrPo(pcodc, 0); Assert(cfmtNil != cfmt, "nil default compression format"); _cfmtDef = cfmt; _pcodcDef = pcodc; if (pvNil != _pcodcDef) _pcodcDef->AddRef(); _pglpcodc = pvNil; AssertThis(0); } /*************************************************************************** Destructor for the compression manager. ***************************************************************************/ CODM::~CODM(void) { AssertThis(0); ReleasePpo(&_pcodcDef); if (pvNil != _pglpcodc) { long ipcodc; PCODC pcodc; for (ipcodc = _pglpcodc->IvMac(); ipcodc-- > 0;) { _pglpcodc->Get(ipcodc, &pcodc); ReleasePpo(&pcodc); } ReleasePpo(&_pglpcodc); } } #ifdef DEBUG /*************************************************************************** Assert the validity of a CODM. ***************************************************************************/ void CODM::AssertValid(ulong grf) { CODM_PAR::AssertValid(0); Assert(cfmtNil != _cfmtDef, "nil default compression"); AssertNilOrPo(_pcodcDef, 0); AssertNilOrPo(_pglpcodc, 0); } /*************************************************************************** Mark memory for the CODM. ***************************************************************************/ void CODM::MarkMem(void) { AssertValid(0); CODM_PAR::MarkMem(); MarkMemObj(_pcodcDef); if (pvNil != _pglpcodc) { long ipcodc; PCODC pcodc; for (ipcodc = _pglpcodc->IvMac(); ipcodc-- > 0;) { _pglpcodc->Get(ipcodc, &pcodc); MarkMemObj(pcodc); } MarkMemObj(_pglpcodc); } } #endif // DEBUG /*************************************************************************** Set the default compression type. ***************************************************************************/ void CODM::SetCfmtDefault(long cfmt) { AssertThis(0); if (cfmt == cfmtNil) { Bug("can't set default compression to nil"); return; } _cfmtDef = cfmt; } /*************************************************************************** Add a codec to the compression manager. ***************************************************************************/ bool CODM::FRegisterCodec(PCODC pcodc) { AssertThis(0); AssertPo(pcodc, 0); if (pvNil == _pglpcodc && pvNil == (_pglpcodc = GL::PglNew(size(PCODC)))) return fFalse; if (!_pglpcodc->FAdd(&pcodc)) return fFalse; pcodc->AddRef(); return fTrue; } /*************************************************************************** Return whether we can encode or decode the given format. ***************************************************************************/ bool CODM::FCanDo(long cfmt, bool fEncode) { AssertThis(0); PCODC pcodc; if (cfmtNil == cfmt) return fFalse; return _FFindCodec(fEncode, cfmt, &pcodc); } /*************************************************************************** Gets the type of compression used on the block (assuming it is compressed). ***************************************************************************/ bool CODM::FGetCfmtFromBlck(PBLCK pblck, long *pcfmt) { AssertThis(0); AssertPo(pblck, 0); AssertVarMem(pcfmt); byte rgb[4]; TrashVar(pcfmt); if (pblck->Cb(fTrue) < 2 * size(rgb)) return fFalse; if (!pblck->FReadRgb(rgb, size(rgb), 0, fTrue)) return fFalse; *pcfmt = LwFromBytes(rgb[0], rgb[1], rgb[2], rgb[3]); return fTrue; } /*************************************************************************** Look for a codec that can handle the given format. ***************************************************************************/ bool CODM::_FFindCodec(bool fEncode, long cfmt, PCODC *ppcodc) { AssertThis(0); AssertVarMem(ppcodc); Assert(cfmtNil != cfmt, "nil cfmt"); if (pvNil != _pcodcDef && _pcodcDef->FCanDo(fEncode, cfmt)) { *ppcodc = _pcodcDef; return fTrue; } if (pvNil != _pglpcodc) { long ipcodc; PCODC pcodc; for (ipcodc = _pglpcodc->IvMac(); ipcodc-- > 0;) { _pglpcodc->Get(ipcodc, &pcodc); if (pcodc->FCanDo(fEncode, cfmt)) { *ppcodc = pcodc; return fTrue; } } } return fFalse; } /*************************************************************************** Compress or decompress an hq of data. Note that the value of *phq may change. cfmt should be cfmtNil to decompress. ***************************************************************************/ bool CODM::_FCodePhq(long cfmt, HQ *phq) { AssertThis(0); AssertVarMem(phq); AssertHq(*phq); HQ hqDst; void *pvSrc; long cbSrc; long cbDst; bool fRet; pvSrc = PvLockHq(*phq); cbSrc = CbOfHq(*phq); fRet = _FCode(cfmt, pvSrc, cbSrc, pvNil, 0, &cbDst); UnlockHq(*phq); if (!fRet) return fFalse; if (!FAllocHq(&hqDst, cbDst, fmemNil, mprNormal)) return fFalse; pvSrc = PvLockHq(*phq); fRet = _FCode(cfmt, pvSrc, cbSrc, PvLockHq(hqDst), cbDst, &cbDst); UnlockHq(hqDst); UnlockHq(*phq); if (!fRet) { FreePhq(&hqDst); return fFalse; } Assert(cbDst <= CbOfHq(hqDst), "why is the final size larger?"); if (cbDst < CbOfHq(hqDst)) AssertDo(FResizePhq(&hqDst, cbDst, fmemNil, mprNormal), 0); FreePhq(phq); *phq = hqDst; return fTrue; } /*************************************************************************** Compress or decompress a block of data. If pvDst is nil, just fill *pcbDst with the required destination buffer size. This is just an estimate in the compress case. ***************************************************************************/ bool CODM::_FCode(long cfmt, void *pvSrc, long cbSrc, void *pvDst, long cbDst, long *pcbDst) { AssertIn(cbSrc, 1, kcbMax); AssertPvCb(pvSrc, cbSrc); AssertIn(cbDst, 0, kcbMax); AssertPvCb(pvDst, cbDst); AssertVarMem(pcbDst); byte *prgb; PCODC pcodc; if (cfmtNil != cfmt) { // Encode the data if (pvNil == pvDst || cbDst >= cbSrc) cbDst = cbSrc - 1; if (cbDst <= kcbCodecHeader) { // destination is smaller than the minimum compressed size, so // no sense trying. return fFalse; } // make sure we have a codec for this format if (!_FFindCodec(fTrue, cfmt, &pcodc)) return fFalse; if (pvNil == pvDst) { // this is our best guess at the compressed size *pcbDst = cbDst; return fTrue; } prgb = (byte *)pvDst; if (!pcodc->FConvert(fTrue, cfmt, pvSrc, cbSrc, prgb + kcbCodecHeader, cbDst - kcbCodecHeader, pcbDst)) { return fFalse; } AssertIn(*pcbDst, 1, cbDst - kcbCodecHeader + 1); *pcbDst += kcbCodecHeader; prgb[0] = B3Lw(cfmt); prgb[1] = B2Lw(cfmt); prgb[2] = B1Lw(cfmt); prgb[3] = B0Lw(cfmt); prgb[4] = B3Lw(cbSrc); prgb[5] = B2Lw(cbSrc); prgb[6] = B1Lw(cbSrc); prgb[7] = B0Lw(cbSrc); } else { // decode if (0 >= (cbSrc -= kcbCodecHeader)) return fFalse; // get the format and decompressed size prgb = (byte *)pvSrc; cfmt = LwFromBytes(prgb[0], prgb[1], prgb[2], prgb[3]); *pcbDst = LwFromBytes(prgb[4], prgb[5], prgb[6], prgb[7]); if (!FIn(*pcbDst, 1, pvNil == pvDst ? kcbMax : cbDst + 1)) return fFalse; // make sure we have a codec for this format if (!_FFindCodec(fFalse, cfmt, &pcodc)) return fFalse; if (pvNil == pvDst) return fTrue; cbDst = *pcbDst; if (!pcodc->FConvert(fFalse, cfmt, prgb + kcbCodecHeader, cbSrc, pvDst, cbDst, pcbDst)) { return fFalse; } if (cbDst != *pcbDst) { Bug("decompressed to wrong size"); return fFalse; } } return fTrue; } ================================================ FILE: kauai/src/codec.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Copyright (c) Microsoft Corporation Compression/decompression manager and default Kauai codec. ***************************************************************************/ #ifndef CODEC_H #define CODEC_H /*************************************************************************** Codec object. ***************************************************************************/ typedef class CODC *PCODC; #define CODC_PAR BASE #define kclsCODC 'CODC' class CODC : public CODC_PAR { RTCLASS_DEC public: // return whether this codec can handle the given format. virtual bool FCanDo(bool fEncode, long cfmt) = 0; // Decompression should be extremely fast. Compression may be // (painfully) slow. virtual bool FConvert(bool fEncode, long cfmt, void *pvSrc, long cbSrc, void *pvDst, long cbDst, long *pcbDst) = 0; }; /*************************************************************************** Codec manager. ***************************************************************************/ typedef class CODM *PCODM; #define CODM_PAR BASE #define kclsCODM 'CODM' class CODM : public CODM_PAR { RTCLASS_DEC ASSERT MARKMEM protected: long _cfmtDef; PCODC _pcodcDef; PGL _pglpcodc; virtual bool _FFindCodec(bool fEncode, long cfmt, PCODC *ppcodc); virtual bool _FCodePhq(long cfmt, HQ *phq); virtual bool _FCode(long cfmt, void *pvSrc, long cbSrc, void *pvDst, long cbDst, long *pcbDst); public: CODM(PCODC pcodc, long cfmt); ~CODM(void); long CfmtDefault(void) { return _cfmtDef; } void SetCfmtDefault(long cfmt); virtual bool FRegisterCodec(PCODC pcodc); virtual bool FCanDo(long cfmt, bool fEncode); // Gets the type of compression used on the block (assuming it is // compressed). virtual bool FGetCfmtFromBlck(PBLCK pblck, long *pcfmt); // FDecompress allows pvDst to be nil (in which case *pcbDst is filled // in with the buffer size required). // FCompress also allows pvDst to be nil, but the value returned in // *pcbDst will just be cbSrc - 1. bool FDecompressPhq(HQ *phq) { return _FCodePhq(cfmtNil, phq); } bool FCompressPhq(HQ *phq, long cfmt = cfmtNil) { return _FCodePhq(cfmtNil == cfmt ? _cfmtDef : cfmt, phq); } bool FDecompress(void *pvSrc, long cbSrc, void *pvDst, long cbDst, long *pcbDst) { return _FCode(cfmtNil, pvSrc, cbSrc, pvDst, cbDst, pcbDst); } bool FCompress(void *pvSrc, long cbSrc, void *pvDst, long cbDst, long *pcbDst, long cfmt = cfmtNil) { return _FCode(cfmtNil == cfmt ? _cfmtDef : cfmt, pvSrc, cbSrc, pvDst, cbDst, pcbDst); } }; /*************************************************************************** The standard Kauai Codec object. ***************************************************************************/ typedef class KCDC *PKCDC; #define KCDC_PAR CODC #define kclsKCDC 'KCDC' class KCDC : public KCDC_PAR { RTCLASS_DEC protected: bool _FEncode(void *pvSrc, long cbSrc, void *pvDst, long cbDst, long *pcbDst); bool _FDecode(void *pvSrc, long cbSrc, void *pvDst, long cbDst, long *pcbDst); bool _FEncode2(void *pvSrc, long cbSrc, void *pvDst, long cbDst, long *pcbDst); bool _FDecode2(void *pvSrc, long cbSrc, void *pvDst, long cbDst, long *pcbDst); public: virtual bool FCanDo(bool fEncode, long cfmt) { return kcfmtKauai2 == cfmt || kcfmtKauai == cfmt; } virtual bool FConvert(bool fEncode, long cfmt, void *pvSrc, long cbSrc, void *pvDst, long cbDst, long *pcbDst); }; #endif //! CODEC_H ================================================ FILE: kauai/src/codkauai.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Standard Kauai codec. This codec compresses a byte stream into a bit stream. The bit stream is decoded by the following pseudo code: loop forever if (next bit is 0) // literal byte write next 8 bits continue // initialize length length = 1 // find the offset if (next bit is 0) offset = next 6 bits + 0x01 else if (next bit is 0) offset = next 9 bits + 0x41 else if (next bit is 0) offset = next 12 bits + 0x0241 else offset = next 20 bits if (offset is 0xFFFFF) break // we're done offset += 0x1241 length++ // get the length c = number of non-zero bits (up to 11) skip the zero bit length += next c bits + (1 << c) // write the destination bytes write length bytes from the current dest position minus offset. Essentially, previous uncompressed byte strings form a dictionary for the compression. As an example, the byte string consisting of 37 a's in a row would be compressed as: // first a encoded: 0 // literal byte 01100001 // 'a' = 0x61 // next 36 a's encoded: 01 // 6 bit offset 000000 // offset = 0 + 1 = 1 011111 // length encoded in next 5 bits 00011 // length = 1 + 3 + (1 << 5) = 36 1111 // 20 bit offset 11111111111111111111 // special 20 bit offset indicating end of data The source stream is 296 bits long. The compressed stream is 28 bits (not counting the 24 bit termination). For a less trivial example: the string abaabaaabaaaab would be compressed to the following bit stream: // first aba encoded: 0 // literal byte 01100001 // 'a' = 0x61 0 // literal byte 01100010 // 'b = 0x62 0 // literal byte 01100001 // 'a' = 0x61 // next abaa encoded: 01 // 6 bit offset 000010 // offset = 2 + 1 = 3 01 // length encoded in next 1 bit 1 // length = 1 + 1 + (1 << 1) = 4 // next abaaa encoded: 01 // 6 bit offset 000011 // offset = 3 + 1 = 4 011 // length encoded in next 2 bits 00 // length = 1 + 0 + (1 << 2) = 5 // next ab encoded: 01 // 6 bit offset 000100 // offset = 4 + 1 = 5 0 // length encoded in next 0 bits // length = 1 + 0 + (1 << 0) = 2 1111 // 20 bit offset 11111111111111111111 // special 20 bit offset indicating end of data The uncompressed stream is 112 bits. The compressed stream is 60 bits (not including the 24 bit termination). All compressed streams are padded with extra 0xFF bytes so that at decompression time we can verify a priori that decompression will terminate (by verifying that there are at least 6 0xFF bytes at the end. ***************************************************************************/ #include "util.h" #include "codkpri.h" ASSERTNAME // REVIEW shonk: should we turn on _Safety? #define SAFETY RTCLASS(KCDC) /*************************************************************************** Encode or decode a block. ***************************************************************************/ bool KCDC::FConvert(bool fEncode, long cfmt, void *pvSrc, long cbSrc, void *pvDst, long cbDst, long *pcbDst) { AssertThis(0); AssertIn(cbSrc, 1, kcbMax); AssertPvCb(pvSrc, cbSrc); AssertIn(cbDst, 1, kcbMax); AssertPvCb(pvDst, cbDst); AssertVarMem(pcbDst); switch (cfmt) { default: return fFalse; case kcfmtKauai2: if (fEncode) return _FEncode2(pvSrc, cbSrc, pvDst, cbDst, pcbDst); return _FDecode2(pvSrc, cbSrc, pvDst, cbDst, pcbDst); case kcfmtKauai: if (fEncode) return _FEncode(pvSrc, cbSrc, pvDst, cbDst, pcbDst); return _FDecode(pvSrc, cbSrc, pvDst, cbDst, pcbDst); } } /*************************************************************************** Bit array class - for writing the compressed data. ***************************************************************************/ class BITA { protected: byte *_prgb; long _cb; long _ibit; long _ib; public: void Set(void *pvDst, long cbDst); bool FWriteBits(ulong lu, long cbit); bool FWriteLogEncoded(ulong lu); long Ibit(void) { return _ibit; } long Ib(void) { return _ib; } }; /*************************************************************************** Set the buffer to write to. ***************************************************************************/ void BITA::Set(void *pvDst, long cbDst) { AssertPvCb(pvDst, cbDst); _prgb = (byte *)pvDst; _cb = cbDst; _ibit = _ib = 0; } /*************************************************************************** Write some bits. ***************************************************************************/ bool BITA::FWriteBits(ulong lu, long cbit) { long cb; // store the partial byte if (_ibit > 0) { AssertIn(_ib, 0, _cb); _prgb[_ib] = (byte)((_prgb[_ib] & ((1 << (_ibit)) - 1)) | (lu << _ibit)); if (_ibit + cbit < 8) { _ibit += cbit; return fTrue; } cbit -= 8 - _ibit; lu >>= 8 - _ibit; _ib++; _ibit = 0; } Assert(_ibit == 0, 0); cb = cbit >> 3; cbit &= 0x07; if (_ib + cb + (cbit > 0) > _cb) return fFalse; while (cb-- > 0) { _prgb[_ib++] = (byte)lu; lu >>= 8; } if (cbit > 0) { _prgb[_ib] = (byte)lu; _ibit = cbit; } return fTrue; } /*************************************************************************** Write the value logarithmically encoded. ***************************************************************************/ bool BITA::FWriteLogEncoded(ulong lu) { Assert(lu > 0 && !(lu & 0x80000000), "bad value to encode logarithmically"); long cbit; for (cbit = 1; (ulong)(1L << cbit) <= lu; cbit++) ; cbit--; if (cbit > 0 && !FWriteBits(0xFFFFFFFF, cbit)) return fFalse; return FWriteBits(lu << 1, cbit + 1); } /*************************************************************************** Compress the data in pvSrc using the KCDC encoding. Returns false if the data can't be compressed. This is not optimized (ie, it's slow). ***************************************************************************/ bool KCDC::_FEncode(void *pvSrc, long cbSrc, void *pvDst, long cbDst, long *pcbDst) { AssertThis(0); AssertIn(cbSrc, 1, kcbMax); AssertPvCb(pvSrc, cbSrc); AssertIn(cbDst, 1, kcbMax); AssertPvCb(pvDst, cbDst); AssertVarMem(pcbDst); long ibSrc; long ibMatch, ibTest, cbMatch, ibMin, cbT; byte bMatchNew, bMatchLast; BITA bita; long *pmpsuibStart = pvNil; byte *prgbSrc = (byte *)pvSrc; long *pmpibibNext = pvNil; TrashVar(pcbDst); if (cbDst - kcbTailKcdc <= 1) return fFalse; // allocate the links if (!FAllocPv((void **)&pmpibibNext, LwMul(size(long), cbSrc), fmemNil, mprNormal) || !FAllocPv((void **)&pmpsuibStart, LwMul(size(long), 0x10000), fmemNil, mprNormal)) { Warn("failed to allocate memory for links"); goto LFail; } // write the links // we need to set each entry of pmpsuibStart to a big negative number, // but not too big, or we risk overflow below. FillPb(pmpsuibStart, LwMul(size(long), 0x10000), 0xCC); for (ibSrc = 0; ibSrc < cbSrc - 1; ibSrc++) { ushort suCur = ((ushort)prgbSrc[ibSrc]) << 8 | (ushort)prgbSrc[ibSrc + 1]; ibTest = pmpsuibStart[suCur]; pmpsuibStart[suCur] = ibSrc; pmpibibNext[ibSrc] = ibTest; } pmpibibNext[cbSrc - 1] = 0xCCCCCCCCL; FreePpv((void **)&pmpsuibStart); // write flags byte bita.Set(pvDst, cbDst); AssertDo(bita.FWriteBits(0, 8), 0); for (ibSrc = 0; ibSrc < cbSrc; ibSrc += cbMatch) { byte *pbMatch; long cbMaxMatch; // get the new byte and the link ibTest = pmpibibNext[ibSrc]; Assert(ibTest < ibSrc, 0); // assume we'll store a literal cbMatch = 1; ibMatch = ibSrc; if (ibTest <= (ibMin = ibSrc - kdibMinKcdc4)) goto LStore; // we've seen this byte pair before - look for the longest match cbMaxMatch = LwMin(kcbMaxLenKcdc, cbSrc - ibSrc); pbMatch = prgbSrc + ibSrc; bMatchNew = prgbSrc[ibSrc + 1]; bMatchLast = prgbSrc[ibSrc]; for (; ibTest > ibMin; ibTest = pmpibibNext[ibTest]) { Assert(prgbSrc[ibTest + 1] == prgbSrc[ibSrc + 1], "links are wrong"); if (prgbSrc[ibTest + cbMatch] != bMatchNew || prgbSrc[ibTest + cbMatch - 1] != bMatchLast || cbMatch >= (cbT = CbEqualRgb(prgbSrc + ibTest, pbMatch, cbMaxMatch))) { Assert(pmpibibNext[ibTest] < ibTest, 0); continue; } AssertIn(cbT, cbMatch + 1, kcbMaxLenKcdc + 1); // if this run requires a 20 bit offset, we need to beat a // 9 or 6 bit offset by 2 bytes if (ibSrc - ibTest < kdibMinKcdc3 || cbT - cbMatch > 1 || ibSrc - ibMatch >= kdibMinKcdc2) { cbMatch = cbT; ibMatch = ibTest; if (cbMatch == cbMaxMatch) break; bMatchNew = prgbSrc[ibSrc + cbMatch]; bMatchLast = prgbSrc[ibSrc + cbMatch - 1]; } Assert(pmpibibNext[ibTest] < ibTest, 0); } // write out the bits LStore: AssertIn(ibMatch, 0, ibSrc + (cbMatch == 1)); AssertIn(cbMatch, 1 + (ibMatch < ibSrc) + (ibSrc - ibMatch >= kdibMinKcdc3), kcbMaxLenKcdc + 1); if (cbMatch == 1) { // literal if (!bita.FWriteBits((ulong)prgbSrc[ibSrc] << 1, 9)) goto LFail; } else { // find the offset ulong luCode, luLen; long cbit; luCode = ibSrc - ibMatch; luLen = cbMatch - 1; if (luCode < kdibMinKcdc1) { // 6 bit offset cbit = 2 + kcbitKcdc0; luCode = ((luCode - kdibMinKcdc0) << 2) | 1; } else if (luCode < kdibMinKcdc2) { // 9 bit offset cbit = 3 + kcbitKcdc1; luCode = ((luCode - kdibMinKcdc1) << 3) | 0x03; } else if (luCode < kdibMinKcdc3) { // 12 bit offset cbit = 4 + kcbitKcdc2; luCode = ((luCode - kdibMinKcdc2) << 4) | 0x07; } else { // 20 bit offset Assert(luCode < kdibMinKcdc4, 0); cbit = 4 + kcbitKcdc3; luCode = ((luCode - kdibMinKcdc3) << 4) | 0x0F; luLen--; } AssertIn(cbit, 8, kcbitKcdc3 + 5); Assert(luLen > 0, "bad len"); if (!bita.FWriteBits(luCode, cbit)) goto LFail; if (!bita.FWriteLogEncoded(luLen)) goto LFail; } } // fill the remainder of the last byte with 1's if (bita.Ibit() > 0) AssertDo(bita.FWriteBits(0xFF, 8 - bita.Ibit()), 0); // write the tail (kcbTailKcdc bytes of FF) for (cbT = 0; cbT < kcbTailKcdc; cbT += size(long)) { if (!bita.FWriteBits(0xFFFFFFFF, LwMin(size(long), kcbTailKcdc - cbT) << 3)) { goto LFail; } } *pcbDst = bita.Ib(); FreePpv((void **)&pmpibibNext); return fTrue; LFail: // can't compress the source FreePpv((void **)&pmpibibNext); return fFalse; } /*************************************************************************** Decompress a compressed KCDC stream. ***************************************************************************/ bool KCDC::_FDecode(void *pvSrc, long cbSrc, void *pvDst, long cbDst, long *pcbDst) { AssertThis(0); AssertIn(cbSrc, 1, kcbMax); AssertPvCb(pvSrc, cbSrc); AssertIn(cbDst, 1, kcbMax); AssertPvCb(pvDst, cbDst); AssertVarMem(pcbDst); long ib; byte bFlags; TrashVar(pcbDst); if (cbSrc <= kcbTailKcdc + 1) { Bug("bad source stream"); return fFalse; } // verify that the last kcbTailKcdc bytes are FF. This guarantees that // we won't run past the end of the source. for (ib = 0; ib++ < kcbTailKcdc;) { if (((byte *)pvSrc)[cbSrc - ib] != 0xFF) { Bug("bad tail of compressed data"); return fFalse; } } bFlags = ((byte *)pvSrc)[0]; if (bFlags != 0) { Bug("unknown flag byte"); return fFalse; } #ifdef IN_80386 #include "kcdc_386.h" *pcbDst = cbTot; return fTrue; #else //! IN_80386 long cb, dib, ibit, cbit; register ulong luCur; byte *pbT; register byte *pbDst = (byte *)pvDst; byte *pbLimDst = (byte *)pvDst + cbDst; register byte *pbSrc = (byte *)pvSrc + 1; #define _FTest(ibit) (luCur & (1L << (ibit))) #ifdef LITTLE_ENDIAN #define _Advance(cb) ((pbSrc += (cb)), (luCur = *(ulong *)(pbSrc - 4))) #else //! LITTLE_ENDIAN #define _Advance(cb) ((pbSrc += (cb)), (luCur = LwFromBytes(pbSrc[-1], pbSrc[-2], pbSrc[-3], pbSrc[-4]))) #endif //! LITTLE_ENDIAN _Advance(4); for (ibit = 0;;) { if (!_FTest(ibit)) { // literal #ifdef SAFETY if (pbDst >= pbLimDst) goto LFail; #endif // SAFETY *pbDst++ = (byte)(luCur >> ibit + 1); ibit += 9; } else { // get the offset cb = 1; if (!_FTest(ibit + 1)) { dib = ((luCur >> (ibit + 2)) & ((1 << kcbitKcdc0) - 1)) + kdibMinKcdc0; ibit += 2 + kcbitKcdc0; } else if (!_FTest(ibit + 2)) { dib = ((luCur >> (ibit + 3)) & ((1 << kcbitKcdc1) - 1)) + kdibMinKcdc1; ibit += 3 + kcbitKcdc1; } else if (!_FTest(ibit + 3)) { dib = ((luCur >> (ibit + 4)) & ((1 << kcbitKcdc2) - 1)) + kdibMinKcdc2; ibit += 4 + kcbitKcdc2; } else { dib = (luCur >> (ibit + 4)) & ((1 << kcbitKcdc3) - 1); if (dib == ((1 << kcbitKcdc3) - 1)) break; dib += kdibMinKcdc3; ibit += 4 + kcbitKcdc3; cb++; } _Advance(ibit >> 3); ibit &= 0x07; // get the length for (cbit = 0;;) { if (!_FTest(ibit + cbit)) break; if (++cbit > kcbitMaxLenKcdc) goto LFail; } cb += (1 << cbit) + ((luCur >> (cbit + 1)) & ((1 << cbit) - 1)); ibit += cbit + cbit + 1; #ifdef SAFETY if (pbLimDst - pbDst < cb || pbDst - (byte *)pvDst < dib) goto LFail; #endif // SAFETY for (pbT = pbDst - dib; cb-- > 0;) *pbDst++ = *pbT++; } _Advance(ibit >> 3); ibit &= 0x07; } *pcbDst = pbDst - (byte *)pvDst; return fTrue; #undef _FTest #undef _Advance #endif //! IN_80386 LFail: Bug("bad compressed data"); return fFalse; } /*************************************************************************** Compress the data in pvSrc using the KCD2 encoding. Returns false if the data can't be compressed. This is not optimized (ie, it's slow). ***************************************************************************/ bool KCDC::_FEncode2(void *pvSrc, long cbSrc, void *pvDst, long cbDst, long *pcbDst) { AssertThis(0); AssertIn(cbSrc, 1, kcbMax); AssertPvCb(pvSrc, cbSrc); AssertIn(cbDst, 1, kcbMax); AssertPvCb(pvDst, cbDst); AssertVarMem(pcbDst); long ibSrc; long ibMatch, ibTest, cbMatch, ibMin, cbT; byte bMatchNew, bMatchLast; BITA bita; long cbRun; long *pmpsuibStart = pvNil; byte *prgbSrc = (byte *)pvSrc; long *pmpibibNext = pvNil; TrashVar(pcbDst); if (cbDst - kcbTailKcdc <= 1) return fFalse; // allocate the links if (!FAllocPv((void **)&pmpibibNext, LwMul(size(long), cbSrc), fmemNil, mprNormal) || !FAllocPv((void **)&pmpsuibStart, LwMul(size(long), 0x10000), fmemNil, mprNormal)) { Warn("failed to allocate memory for links"); goto LFail; } // write the links // we need to set each entry of pmpsuibStart to a big negative number, // but not too big, or we risk overflow below. FillPb(pmpsuibStart, LwMul(size(long), 0x10000), 0xCC); for (ibSrc = 0; ibSrc < cbSrc - 1; ibSrc++) { ushort suCur = ((ushort)prgbSrc[ibSrc]) << 8 | (ushort)prgbSrc[ibSrc + 1]; ibTest = pmpsuibStart[suCur]; pmpsuibStart[suCur] = ibSrc; pmpibibNext[ibSrc] = ibTest; } pmpibibNext[cbSrc - 1] = 0xCCCCCCCCL; FreePpv((void **)&pmpsuibStart); // write flags byte bita.Set(pvDst, cbDst); AssertDo(bita.FWriteBits(0, 8), 0); cbRun = 0; for (ibSrc = 0;; ibSrc += cbMatch) { byte *pbMatch; long cbMaxMatch; if (ibSrc >= cbSrc) { cbMatch = 0; goto LStore; } // get the new byte and the link ibTest = pmpibibNext[ibSrc]; Assert(ibTest < ibSrc, 0); // assume we'll store a literal cbMatch = 1; ibMatch = ibSrc; if (ibTest <= (ibMin = ibSrc - kdibMinKcdc4)) goto LStore; // we've seen this byte pair before - look for the longest match cbMaxMatch = LwMin(kcbMaxLenKcdc, cbSrc - ibSrc); pbMatch = prgbSrc + ibSrc; bMatchNew = prgbSrc[ibSrc + 1]; bMatchLast = prgbSrc[ibSrc]; for (; ibTest > ibMin; ibTest = pmpibibNext[ibTest]) { Assert(prgbSrc[ibTest + 1] == prgbSrc[ibSrc + 1], "links are wrong"); if (prgbSrc[ibTest + cbMatch] != bMatchNew || prgbSrc[ibTest + cbMatch - 1] != bMatchLast || cbMatch >= (cbT = CbEqualRgb(prgbSrc + ibTest, pbMatch, cbMaxMatch))) { Assert(pmpibibNext[ibTest] < ibTest, 0); continue; } AssertIn(cbT, cbMatch + 1, kcbMaxLenKcdc + 1); // if this run requires a 20 bit offset, we need to beat a // 9 or 6 bit offset by 2 bytes if (ibSrc - ibTest < kdibMinKcdc3 || cbT - cbMatch > 1 || ibSrc - ibMatch >= kdibMinKcdc2) { cbMatch = cbT; ibMatch = ibTest; if (cbMatch == cbMaxMatch) break; bMatchNew = prgbSrc[ibSrc + cbMatch]; bMatchLast = prgbSrc[ibSrc + cbMatch - 1]; } Assert(pmpibibNext[ibTest] < ibTest, 0); } // write out the bits LStore: if (cbMatch != 1 && cbRun > 0) { // write the previous literal run long ibit, ib; if (!bita.FWriteLogEncoded(cbRun)) goto LFail; if (!bita.FWriteBits(0, 1)) goto LFail; ibit = bita.Ibit(); if (ibit > 0) { if (!bita.FWriteBits(prgbSrc[ibSrc - 1], 8 - ibit)) goto LFail; } else ibit = 8; Assert(bita.Ibit() == 0, 0); for (ib = ibSrc - cbRun; ib < ibSrc - 1; ib++) { if (!bita.FWriteBits(prgbSrc[ib], 8)) goto LFail; } if (!bita.FWriteBits(prgbSrc[ibSrc - 1] >> (8 - ibit), ibit)) goto LFail; cbRun = 0; } if (cbMatch == 0) { // we're done break; } if (cbMatch == 1) cbRun++; else { AssertIn(ibMatch, 0, ibSrc); AssertIn(cbMatch, 2 + (ibSrc - ibMatch >= kdibMinKcdc3), kcbMaxLenKcdc + 1); // find the offset ulong luCode, luLen; long cbit; luCode = ibSrc - ibMatch; luLen = cbMatch - 1; if (luCode < kdibMinKcdc1) { // 6 bit offset cbit = 2 + kcbitKcdc0; luCode = ((luCode - kdibMinKcdc0) << 2) | 1; } else if (luCode < kdibMinKcdc2) { // 9 bit offset cbit = 3 + kcbitKcdc1; luCode = ((luCode - kdibMinKcdc1) << 3) | 0x03; } else if (luCode < kdibMinKcdc3) { // 12 bit offset cbit = 4 + kcbitKcdc2; luCode = ((luCode - kdibMinKcdc2) << 4) | 0x07; } else { // 20 bit offset Assert(luCode < kdibMinKcdc4, 0); cbit = 4 + kcbitKcdc3; luCode = ((luCode - kdibMinKcdc3) << 4) | 0x0F; luLen--; } AssertIn(cbit, 8, kcbitKcdc3 + 5); Assert(luLen > 0, "bad len"); if (!bita.FWriteLogEncoded(luLen)) goto LFail; if (!bita.FWriteBits(luCode, cbit)) goto LFail; } } // fill the remainder of the last byte with 1's if (bita.Ibit() > 0) AssertDo(bita.FWriteBits(0xFF, 8 - bita.Ibit()), 0); // write the tail (kcbTailKcdc bytes of FF) for (cbT = 0; cbT < kcbTailKcdc; cbT += size(long)) { if (!bita.FWriteBits(0xFFFFFFFF, LwMin(size(long), kcbTailKcdc - cbT) << 3)) { goto LFail; } } *pcbDst = bita.Ib(); FreePpv((void **)&pmpibibNext); return fTrue; LFail: // can't compress the source FreePpv((void **)&pmpibibNext); return fFalse; } /*************************************************************************** Decompress a compressed KCD2 stream. ***************************************************************************/ bool KCDC::_FDecode2(void *pvSrc, long cbSrc, void *pvDst, long cbDst, long *pcbDst) { AssertThis(0); AssertIn(cbSrc, 1, kcbMax); AssertPvCb(pvSrc, cbSrc); AssertIn(cbDst, 1, kcbMax); AssertPvCb(pvDst, cbDst); AssertVarMem(pcbDst); long ib; byte bFlags; TrashVar(pcbDst); if (cbSrc <= kcbTailKcd2 + 1) { Bug("bad source stream"); return fFalse; } // verify that the last kcbTailKcd2 bytes are FF. This guarantees that // we won't run past the end of the source. for (ib = 0; ib++ < kcbTailKcd2;) { if (((byte *)pvSrc)[cbSrc - ib] != 0xFF) { Bug("bad tail of compressed data"); return fFalse; } } bFlags = ((byte *)pvSrc)[0]; if (bFlags != 0) { Bug("unknown flag byte"); return fFalse; } #ifdef IN_80386 #include "kcd2_386.h" *pcbDst = cbTot; return fTrue; #else //! IN_80386 long cb, dib, ibit, cbit; register ulong luCur; byte bT; byte *pbT; register byte *pbDst = (byte *)pvDst; byte *pbLimDst = (byte *)pvDst + cbDst; register byte *pbSrc = (byte *)pvSrc + 1; byte *pbLimSrc = (byte *)pvSrc + cbSrc - kcbTailKcd2; #define _FTest(ibit) (luCur & (1L << (ibit))) #ifdef LITTLE_ENDIAN #define _Advance(cb) ((pbSrc += (cb)), (luCur = *(ulong *)(pbSrc - 4))) #else //! LITTLE_ENDIAN #define _Advance(cb) ((pbSrc += (cb)), (luCur = LwFromBytes(pbSrc[-1], pbSrc[-2], pbSrc[-3], pbSrc[-4]))) #endif //! LITTLE_ENDIAN _Advance(4); for (ibit = 0;;) { // get the length for (cbit = 0;;) { if (!_FTest(ibit + cbit)) break; if (++cbit > kcbitMaxLenKcd2) goto LDone; } cb = (1 << cbit) + ((luCur >> (cbit + 1)) & ((1 << cbit) - 1)); ibit += cbit + cbit + 1; _Advance(ibit >> 3); ibit &= 0x07; if (!_FTest(ibit)) { // literal #ifdef SAFETY if (pbDst + cb > pbLimDst) goto LFail; if (pbSrc - 3 + cb > pbLimSrc) goto LFail; #endif // SAFETY ibit++; bT = (byte) ~(luCur & ((1 << ibit) - 1)); if (cb > 1) { CopyPb(pbSrc - 3, pbDst, cb - 1); pbDst += cb - 1; _Advance(cb); } else _Advance(1); bT |= luCur & ((1 << ibit) - 1); *pbDst++ = bT; } else { // get the offset cb++; if (!_FTest(ibit + 1)) { dib = ((luCur >> (ibit + 2)) & ((1 << kcbitKcd2_0) - 1)) + kdibMinKcd2_0; ibit += 2 + kcbitKcd2_0; } else if (!_FTest(ibit + 2)) { dib = ((luCur >> (ibit + 3)) & ((1 << kcbitKcd2_1) - 1)) + kdibMinKcd2_1; ibit += 3 + kcbitKcd2_1; } else if (!_FTest(ibit + 3)) { dib = ((luCur >> (ibit + 4)) & ((1 << kcbitKcd2_2) - 1)) + kdibMinKcd2_2; ibit += 4 + kcbitKcd2_2; } else { dib = (luCur >> (ibit + 4)) & ((1 << kcbitKcd2_3) - 1) + kdibMinKcd2_3; ibit += 4 + kcbitKcd2_3; cb++; } #ifdef SAFETY if (pbLimDst - pbDst < cb || pbDst - (byte *)pvDst < dib) goto LFail; #endif // SAFETY for (pbT = pbDst - dib; cb-- > 0;) *pbDst++ = *pbT++; } _Advance(ibit >> 3); ibit &= 0x07; } LDone: *pcbDst = pbDst - (byte *)pvDst; return fTrue; #undef _FTest #undef _Advance #endif //! IN_80386 LFail: Bug("bad compressed data"); return fFalse; } ================================================ FILE: kauai/src/codkpri.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Private defines for the Kauai codec. ***************************************************************************/ #ifndef CODKPRI_H #define CODKPRI_H /*************************************************************************** Constants for the KCDC encoding. Note: these should be #defines and not consts because they are used in inline asm. ***************************************************************************/ #define kcbTailKcdc 6 // number of FF bytes required at the end #define kcbMaxLenKcdc 4096 // maximum run length #define kcbitMaxLenKcdc 11 // number of bits used to encode kcbMaxLenKcdc #define kcbitKcdc0 6 // number of bits used for the offsets... #define kcbitKcdc1 9 #define kcbitKcdc2 12 #define kcbitKcdc3 20 #define kdibMinKcdc0 0x01 // add to binary offset of corresponding size #define kdibMinKcdc1 0x41 #define kdibMinKcdc2 0x0241 #define kdibMinKcdc3 0x1241 #define kdibMinKcdc4 0x101240 // used as a lim for 20 bit offsets /*************************************************************************** Constants for the KCD2 encoding. Note: these should be #defines and not consts because they are used in inline asm. ***************************************************************************/ #define kcbTailKcd2 6 // number of FF bytes required at the end #define kcbMaxLenKcd2 4096 // maximum run length #define kcbitMaxLenKcd2 11 // number of bits used to encode kcbMaxLenKcd2 #define kcbitKcd2_0 6 // number of bits used for the offsets... #define kcbitKcd2_1 9 #define kcbitKcd2_2 12 #define kcbitKcd2_3 20 #define kdibMinKcd2_0 0x01 // add to binary offset of corresponding size #define kdibMinKcd2_1 0x41 #define kdibMinKcd2_2 0x0241 #define kdibMinKcd2_3 0x1241 #define kdibMinKcd2_4 0x101240 // used as a lim for 20 bit offsets #endif //! CODKPRI_H ================================================ FILE: kauai/src/crf.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Chunky resource management. WARNING: BACOs should only be released or fetched from the main thread! CRFs are NOT thread safe! Alternatively, the BACO can be detached from the CRF (in the main thread), then later released in a different thread. ***************************************************************************/ #include "util.h" ASSERTNAME RTCLASS(BACO) RTCLASS(GHQ) RTCLASS(RCA) RTCLASS(CRF) RTCLASS(CRM) RTCLASS(CABO) /*************************************************************************** Constructor for base cacheable object. ***************************************************************************/ BACO::BACO(void) { AssertBaseThis(fobjAllocated); _pcrf = pvNil; _crep = crepToss; _fAttached = fFalse; } /*************************************************************************** Destructor. ***************************************************************************/ BACO::~BACO(void) { AssertBaseThis(fobjAllocated); Assert(!_fAttached, "still attached"); ReleasePpo(&_pcrf); } /*************************************************************************** Write the BACO to a FLO - just make the FLO a BLCK and write to the block. ***************************************************************************/ bool BACO::FWriteFlo(PFLO pflo) { AssertThis(0); AssertPo(pflo, 0); BLCK blck(pflo); return FWrite(&blck); } /*************************************************************************** Placeholder function for BACO generic writer. ***************************************************************************/ bool BACO::FWrite(PBLCK pblck) { AssertThis(0); RawRtn(); // Derived class should be defining this return fFalse; } /*************************************************************************** Placeholder function for BACO generic cb-getter. ***************************************************************************/ long BACO::CbOnFile(void) { AssertThis(0); RawRtn(); // Derived class should be defining this return 0; } #ifdef DEBUG /*************************************************************************** Assert the validity of a BACO. ***************************************************************************/ void BACO::AssertValid(ulong grf) { BACO_PAR::AssertValid(fobjAllocated); Assert(!_fAttached || pvNil != _pcrf, "attached baco has no crf"); AssertNilOrVarMem(_pcrf); } /*************************************************************************** Mark memory for the BACO. ***************************************************************************/ void BACO::MarkMem(void) { AssertValid(0); BACO_PAR::MarkMem(); if (!_fAttached) MarkMemObj(_pcrf); } #endif // DEBUG /*************************************************************************** Release a reference to the BACO. If the reference count goes to zero and the BACO is not attached, it is deleted. ***************************************************************************/ void BACO::Release(void) { AssertThis(0); if (_cactRef-- <= 0) { Bug("calling Release without an AddRef"); _cactRef = 0; } if (_cactRef == 0) { if (!_fAttached) delete this; else { AssertPo(_pcrf, 0); _pcrf->BacoReleased(this); } } } /*************************************************************************** Detach a BACO from its CRF. ***************************************************************************/ void BACO::Detach(void) { AssertThis(0); if (_fAttached) { AssertPo(_pcrf, 0); _pcrf->AddRef(); _fAttached = fFalse; _pcrf->BacoDetached(this); } if (_cactRef <= 0) delete this; } /*************************************************************************** Set the crep for the BACO. ***************************************************************************/ void BACO::SetCrep(long crep) { AssertThis(0); // An AddRef followed by Release is done so that BacoReleased() is // called if this BACO's _cactRef is 0...if crep is crepToss, this // detaches this BACO from the cache. AddRef(); _crep = crep; Release(); } /*************************************************************************** Constructor for CRF. Increments the open count on the CFL. ***************************************************************************/ CRF::CRF(PCFL pcfl, long cbMax) { AssertBaseThis(fobjAllocated); AssertPo(pcfl, 0); AssertIn(cbMax, 0, kcbMax); pcfl->AddRef(); _pcfl = pcfl; _cbMax = cbMax; } /*************************************************************************** Destructor for the CRF. Decrements the open count on the CFL and frees all the cached data. ***************************************************************************/ CRF::~CRF(void) { AssertBaseThis(fobjAllocated); CRE cre; _cactRef++; // so we don't get "deleted" while detaching the BACOs if (pvNil != _pglcre) { while (_pglcre->IvMac() > 0) { _pglcre->Get(0, &cre); cre.pbaco->AddRef(); // so it doesn't go away when being detached cre.pbaco->Detach(); cre.pbaco->_pcrf = pvNil; // we're going away! Debug(_cactRef--;) cre.pbaco->Release(); } ReleasePpo(&_pglcre); } Assert(_cactRef == 1, "someone still refers to this CRF"); ReleasePpo(&_pcfl); } /*************************************************************************** Static method to create a new chunky resource file cache. ***************************************************************************/ PCRF CRF::PcrfNew(PCFL pcfl, long cbMax) { AssertPo(pcfl, 0); AssertIn(cbMax, 0, kcbMax); PCRF pcrf; if (pvNil != (pcrf = NewObj CRF(pcfl, cbMax)) && pvNil == (pcrf->_pglcre = GL::PglNew(size(CRE), 5))) { ReleasePpo(&pcrf); } AssertNilOrPo(pcrf, 0); return pcrf; } /*************************************************************************** Set the size of the cache. This is most effecient when cbMax is 0 (all non-required BACOs are flushed) or is bigger than the current cbMax. ***************************************************************************/ void CRF::SetCbMax(long cbMax) { AssertThis(0); AssertIn(cbMax, 0, kcbMax); if (0 == cbMax) { CRE cre; long icre; for (icre = _pglcre->IvMac(); icre-- > 0;) { _pglcre->Get(icre, &cre); AssertPo(cre.pbaco, 0); if (cre.pbaco->CactRef() == 0) { Assert(cre.pbaco->_fAttached, "BACO not attached!"); cre.pbaco->Detach(); // have to start over in case other BACOs got deleted or // reference counts went to zero icre = _pglcre->IvMac(); } } } else if (_cbCur > cbMax) _FPurgeCb(_cbCur - cbMax, klwMax); _cbMax = cbMax; } /*************************************************************************** Pre-fetch the object. Returns tYes if the chunk is successfully cached, tNo if the chunk isn't in the CRF and tMaybe if there wasn't room to cache the chunk. ***************************************************************************/ tribool CRF::TLoad(CTG ctg, CNO cno, PFNRPO pfnrpo, RSC rsc, long crep) { AssertThis(0); Assert(pvNil != pfnrpo, "bad pfnrpo"); Assert(crep > crepToss, "crep too small"); CRE cre; long icre; BLCK blck; // see if this CRF contains this resource type if (rscNil != rsc && !_pcfl->FFind(kctgRsc, rsc)) return tNo; // see if it's in the cache if (_FFindCre(ctg, cno, pfnrpo, &icre)) { _pglcre->Get(icre, &cre); cre.pbaco->SetCrep(LwMax(cre.pbaco->_crep, crep)); cre.cactRelease = _cactRelease++; _pglcre->Put(icre, &cre); return tYes; } // see if it's in the chunky file if (!_pcfl->FFind(ctg, cno, &blck)) return tNo; // get the approximate size of the object if (!(*pfnrpo)(this, ctg, cno, &blck, pvNil, &cre.cb)) return tMaybe; if (_cbCur + cre.cb > _cbMax) { if (!_FPurgeCb(_cbCur + cre.cb - _cbMax, crep - 1)) return tMaybe; } if (!(*pfnrpo)(this, ctg, cno, &blck, &cre.pbaco, &cre.cb)) return tMaybe; AssertPo(cre.pbaco, 0); AssertIn(cre.cb, 0, kcbMax); if (_cbCur + cre.cb > _cbMax && !_FPurgeCb(_cbCur + cre.cb - _cbMax, crep - 1)) { ReleasePpo(&cre.pbaco); return tMaybe; } cre.pbaco->_pcrf = this; cre.pbaco->_ctg = ctg; cre.pbaco->_cno = cno; cre.pbaco->_crep = crep; AddRef(); // until the baco is attached it needs a reference count cre.pbaco->_fAttached = fFalse; cre.pfnrpo = pfnrpo; cre.cactRelease = _cactRelease++; // indexes may have changed, get the location to insert again AssertDo(!_FFindCre(ctg, cno, pfnrpo, &icre), "how did this happen?"); if (!_pglcre->FInsert(icre, &cre)) { // can't keep it loaded ReleasePpo(&cre.pbaco); return tMaybe; } _cbCur += cre.cb; cre.pbaco->_fAttached = fTrue; cre.pbaco->Release(); Release(); // baco successfully attached, so release its reference count return tYes; } /*************************************************************************** Make sure the object is loaded and increment its reference count. If successful, must be balanced with a call to ReleasePpo. ***************************************************************************/ PBACO CRF::PbacoFetch(CTG ctg, CNO cno, PFNRPO pfnrpo, bool *pfError, RSC rsc) { AssertThis(0); Assert(pvNil != pfnrpo, "bad pfnrpo"); AssertNilOrVarMem(pfError); CRE cre; long icre; BLCK blck; if (pvNil != pfError) *pfError = fFalse; // see if this CRF contains this resource type if (rscNil != rsc && !_pcfl->FFind(kctgRsc, rsc)) return pvNil; // see if it's in the cache if (_FFindCre(ctg, cno, pfnrpo, &icre)) { _pglcre->Get(icre, &cre); AssertPo(cre.pbaco, 0); cre.pbaco->AddRef(); return cre.pbaco; } // see if it's in the chunky file if (!_pcfl->FFind(ctg, cno, &blck)) return pvNil; // get the object and its size if (!(*pfnrpo)(this, ctg, cno, &blck, &cre.pbaco, &cre.cb)) { if (pvNil != pfError) *pfError = fTrue; PushErc(ercCrfCantLoad); return pvNil; } AssertPo(cre.pbaco, 0); AssertIn(cre.cb, 0, kcbMax); cre.pbaco->_pcrf = this; cre.pbaco->_ctg = ctg; cre.pbaco->_cno = cno; cre.pbaco->_crep = crepNormal; AddRef(); cre.pbaco->_fAttached = fFalse; cre.pfnrpo = pfnrpo; // indexes may have changed, get the location to insert again AssertDo(!_FFindCre(ctg, cno, pfnrpo, &icre), "how did this happen?"); if (!_pglcre->FInsert(icre, &cre)) { // return the pbaco anyway. when it's released it will go away if (pvNil != pfError) *pfError = fTrue; return cre.pbaco; } _cbCur += cre.cb; cre.pbaco->_fAttached = fTrue; Release(); if (_cbCur > _cbMax) { // purge some stuff _FPurgeCb(_cbCur - _cbMax, klwMax); } return cre.pbaco; } /*************************************************************************** If the object is loaded, increment its reference count and return it. If it's not already loaded, just return nil. ***************************************************************************/ PBACO CRF::PbacoFind(CTG ctg, CNO cno, PFNRPO pfnrpo, RSC rsc) { AssertThis(0); Assert(pvNil != pfnrpo, "bad pfnrpo"); CRE cre; long icre; // see if it's in the cache if (!_FFindCre(ctg, cno, pfnrpo, &icre) || rscNil != rsc && !_pcfl->FFind(kctgRsc, rsc)) { return pvNil; } _pglcre->Get(icre, &cre); AssertPo(cre.pbaco, 0); cre.pbaco->AddRef(); return cre.pbaco; } /*************************************************************************** If the baco indicated chunk is cached, set its crep. Returns true iff the baco was cached. ***************************************************************************/ bool CRF::FSetCrep(long crep, CTG ctg, CNO cno, PFNRPO pfnrpo, RSC rsc) { AssertThis(0); Assert(pvNil != pfnrpo, "bad pfnrpo"); CRE cre; long icre; // see if it's in the cache if (!_FFindCre(ctg, cno, pfnrpo, &icre) || rscNil != rsc && !_pcfl->FFind(kctgRsc, rsc)) { return fFalse; } _pglcre->Get(icre, &cre); AssertPo(cre.pbaco, 0); cre.pbaco->SetCrep(crep); return fTrue; } /*************************************************************************** Return this if the chunk is in this crf, otherwise return nil. The caller is not given a reference count. ***************************************************************************/ PCRF CRF::PcrfFindChunk(CTG ctg, CNO cno, RSC rsc) { AssertThis(0); if (!_pcfl->FFind(ctg, cno) || rscNil != rsc && !_pcfl->FFind(kctgRsc, rsc)) { return pvNil; } return this; } /*************************************************************************** Check the _fAttached flag. If it's false, make sure the BACO is not in the CRF. ***************************************************************************/ void CRF::BacoDetached(PBACO pbaco) { AssertThis(0); AssertPo(pbaco, 0); Assert(pbaco->_pcrf == this, "BACO doesn't have right CRF"); long icre; CRE cre; if (pbaco->_fAttached) { Bug("who's calling BacoDetached?"); return; } if (!_FFindBaco(pbaco, &icre)) { Bug("why isn't the BACO in the CRF?"); return; } _pglcre->Get(icre, &cre); _cbCur -= cre.cb; AssertIn(_cbCur, 0, kcbMax); _pglcre->Delete(icre); } /*************************************************************************** The BACO was released. See if it should be flushed. ***************************************************************************/ void CRF::BacoReleased(PBACO pbaco) { AssertThis(0); AssertPo(pbaco, 0); Assert(pbaco->_pcrf == this, "BACO doesn't have right CRF"); long icre; CRE cre; if (!pbaco->_fAttached || pbaco->CactRef() != 0) { Bug("who's calling BacoReleased?"); return; } if (!_FFindBaco(pbaco, &icre)) { Bug("why isn't the BACO in the CRF?"); return; } _pglcre->Get(icre, &cre); cre.cactRelease = _cactRelease++; _pglcre->Put(icre, &cre); if (pbaco->_crep <= crepToss || _cbCur > _cbMax) { // toss it pbaco->Detach(); } } /*************************************************************************** Find the cre corresponding to the (ctg, cno, pfnrpo). Set *picre to its location (or where it would be if it were in the list). ***************************************************************************/ bool CRF::_FFindCre(CTG ctg, CNO cno, PFNRPO pfnrpo, long *picre) { AssertThis(0); AssertVarMem(picre); CRE *qrgcre, *qcre; long icreMin, icreLim, icre; // Do a binary search. The CREs are sorted by (ctg, cno, pfnrpo). qrgcre = (CRE *)_pglcre->QvGet(0); for (icreMin = 0, icreLim = _pglcre->IvMac(); icreMin < icreLim;) { icre = (icreMin + icreLim) / 2; qcre = qrgcre + icre; AssertPo(qcre->pbaco, 0); if (ctg < qcre->pbaco->_ctg) icreLim = icre; else if (ctg > qcre->pbaco->_ctg) icreMin = icre + 1; else if (cno < qcre->pbaco->_cno) icreLim = icre; else if (cno > qcre->pbaco->_cno) icreMin = icre + 1; else if (pfnrpo == qcre->pfnrpo) { *picre = icre; return fTrue; } else if (pfnrpo < qcre->pfnrpo) icreLim = icre; else icreMin = icre + 1; } *picre = icreMin; return fFalse; } /*************************************************************************** Find the cre corresponding to the BACO. Set *picre to its location. ***************************************************************************/ bool CRF::_FFindBaco(PBACO pbaco, long *picre) { AssertThis(0); AssertPo(pbaco, 0); Assert(pbaco->_pcrf == this, "BACO doesn't have right CRF"); AssertVarMem(picre); CTG ctg; CNO cno; CRE *qrgcre, *qcre; long icreMin, icreLim, icre; ctg = pbaco->_ctg; cno = pbaco->_cno; // Do a binary search. The CREs are sorted by (ctg, cno, pfnrpo). qrgcre = (CRE *)_pglcre->QvGet(0); for (icreMin = 0, icreLim = _pglcre->IvMac(); icreMin < icreLim;) { icre = (icreMin + icreLim) / 2; qcre = qrgcre + icre; AssertPo(qcre->pbaco, 0); if (ctg < qcre->pbaco->_ctg) icreLim = icre; else if (ctg > qcre->pbaco->_ctg) icreMin = icre + 1; else if (cno < qcre->pbaco->_cno) icreLim = icre; else if (cno > qcre->pbaco->_cno) icreMin = icre + 1; else if (pbaco == qcre->pbaco) { *picre = icre; return fTrue; } else { // we've found the (ctg, cno), now look for the BACO for (icreMin = icre; icreMin-- > 0;) { qcre = qrgcre + icreMin; if (qcre->pbaco->_ctg != ctg || qcre->pbaco->_cno != cno) break; if (qcre->pbaco == pbaco) { *picre = icreMin; return fTrue; } } for (icreLim = icre; ++icreLim < _pglcre->IvMac();) { qcre = qrgcre + icreLim; if (qcre->pbaco->_ctg != ctg || qcre->pbaco->_cno != cno) break; if (qcre->pbaco == pbaco) { *picre = icreLim; return fTrue; } } TrashVar(picre); return fFalse; } } TrashVar(picre); return fFalse; } /*************************************************************************** Try to purge at least cbPurge bytes of space. Doesn't free anything with a crep > crepLast or that is locked. ***************************************************************************/ bool CRF::_FPurgeCb(long cbPurge, long crepLast) { AssertThis(0); AssertIn(cbPurge, 1, kcbMax); if (crepLast <= crepToss) return fFalse; CRE cre; long icreMac; while (0 < (icreMac = _pglcre->IvMac())) { // We want to find the "best" element to free. This is determined by // keeping a "best so far" element, which we compare each element to. // If the cre has a larger crep, it is worse, so just continue. // If the cre has a smaller crep, it is better. When the crep values // are the same, we score it based on when the cre was last released // (how many releases have happened since the cre was last used) and // how different the cb is from cbPurge. Each release is worth // kcbRelease bytes. Bytes short of cbPurge are considered worse // (by a factor of 3) than bytes beyond cbPurge, so we favor elements // that are larger than cbPurge. // REVIEW shonk: tune kcbRelease and the weighting factor... const long kcbRelease = 256; long icre, crep; long lw, dcb; long lwBest = klwMax; long icreBest = ivNil; long crepBest = crepLast; for (icre = 0; icre < icreMac; icre++) { _pglcre->Get(icre, &cre); AssertPo(cre.pbaco, 0); if (cre.pbaco->CactRef() > 0 || (crep = cre.pbaco->_crep) > crepBest) { continue; } Assert(crep <= crepBest, 0); AssertIn(cre.cactRelease, 0, _cactRelease); dcb = cre.cb - cbPurge; lw = -LwMul(kcbRelease, LwMin(kcbMax / kcbRelease, _cactRelease - cre.cactRelease)) + LwMul(2, LwAbs(dcb)) - dcb; if (crep < crepBest || lw < lwBest) { icreBest = icre; crepBest = crep; lwBest = lw; } } if (ivNil == icreBest) return fFalse; _pglcre->Get(icreBest, &cre); Assert(cre.pbaco->_fAttached, "BACO not attached!"); cre.pbaco->Detach(); if (0 >= (cbPurge -= cre.cb)) return fTrue; } return fFalse; } #ifdef DEBUG /*************************************************************************** Assert the validity of a CRF (chunky resource file). ***************************************************************************/ void CRF::AssertValid(ulong grf) { CRF_PAR::AssertValid(fobjAllocated); AssertPo(_pglcre, 0); AssertPo(_pcfl, 0); AssertIn(_cbMax, 0, kcbMax); AssertIn(_cbCur, 0, kcbMax); AssertIn(_cactRelease, 0, kcbMax); } /*************************************************************************** Mark memory used by a CRF. ***************************************************************************/ void CRF::MarkMem(void) { AssertThis(0); long icre; CRE cre; CRF_PAR::MarkMem(); MarkMemObj(_pglcre); MarkMemObj(_pcfl); for (icre = _pglcre->IvMac(); icre-- > 0;) { _pglcre->Get(icre, &cre); AssertPo(cre.pbaco, 0); Assert(cre.pbaco->_fAttached, "baco claims to not be attached!"); cre.pbaco->_fAttached = fTrue; // safety to avoid infinite recursion MarkMemObj(cre.pbaco); } } #endif // DEBUG /*************************************************************************** Destructor for Chunky resource manager. ***************************************************************************/ CRM::~CRM(void) { AssertBaseThis(fobjAllocated); long ipcrf; PCRF pcrf; if (pvNil != _pglpcrf) { for (ipcrf = _pglpcrf->IvMac(); ipcrf-- > 0;) { _pglpcrf->Get(ipcrf, &pcrf); AssertPo(pcrf, 0); ReleasePpo(&pcrf); } ReleasePpo(&_pglpcrf); } } /*************************************************************************** Static method to create a new CRM. ***************************************************************************/ PCRM CRM::PcrmNew(long ccrfInit) { AssertIn(ccrfInit, 0, kcbMax); PCRM pcrm; if (pvNil == (pcrm = NewObj CRM())) return pvNil; if (pvNil == (pcrm->_pglpcrf = GL::PglNew(size(PCRF), ccrfInit))) { ReleasePpo(&pcrm); return pvNil; } AssertPo(pcrm, 0); return pcrm; } /*************************************************************************** Prefetch the object if there is room in the cache. Assigns the fetched object the given priority (crep). ***************************************************************************/ tribool CRM::TLoad(CTG ctg, CNO cno, PFNRPO pfnrpo, RSC rsc, long crep) { AssertThis(0); Assert(pvNil != pfnrpo, "nil object reader"); PCRF pcrf; tribool t; long ipcrf; long cpcrf = _pglpcrf->IvMac(); for (ipcrf = 0; ipcrf < cpcrf; ipcrf++) { _pglpcrf->Get(ipcrf, &pcrf); AssertPo(pcrf, 0); t = pcrf->TLoad(ctg, cno, pfnrpo, rsc, crep); if (t != tNo) return t; } return tNo; } /*************************************************************************** Make sure the object is loaded and increment its reference count. If successful, must be balanced with a call to ReleasePpo. If this fails, and pfError is not nil, *pfError is set iff the chunk exists but couldn't be loaded. ***************************************************************************/ PBACO CRM::PbacoFetch(CTG ctg, CNO cno, PFNRPO pfnrpo, bool *pfError, RSC rsc) { AssertThis(0); Assert(pvNil != pfnrpo, "nil object reader"); AssertNilOrVarMem(pfError); PCRF pcrf; long ipcrf; bool fError = fFalse; PBACO pbaco = pvNil; long cpcrf = _pglpcrf->IvMac(); for (ipcrf = 0; ipcrf < cpcrf; ipcrf++) { _pglpcrf->Get(ipcrf, &pcrf); AssertPo(pcrf, 0); pbaco = pcrf->PbacoFetch(ctg, cno, pfnrpo, &fError, rsc); if (pvNil != pbaco || fError) break; } if (pvNil != pfError) *pfError = fError; AssertNilOrPo(pbaco, 0); return pbaco; } /*************************************************************************** If the object is loaded, increment its reference count and return it. If it's not already loaded, just return nil. ***************************************************************************/ PBACO CRM::PbacoFind(CTG ctg, CNO cno, PFNRPO pfnrpo, RSC rsc) { AssertThis(0); Assert(pvNil != pfnrpo, "nil object reader"); PCRF pcrf; if (pvNil == (pcrf = PcrfFindChunk(ctg, cno, rsc))) return pvNil; return pcrf->PbacoFind(ctg, cno, pfnrpo); } /*************************************************************************** If the chunk is cached, set its crep. Returns true iff the chunk was cached. ***************************************************************************/ bool CRM::FSetCrep(long crep, CTG ctg, CNO cno, PFNRPO pfnrpo, RSC rsc) { AssertThis(0); Assert(pvNil != pfnrpo, "nil object reader"); PCRF pcrf; long ipcrf; long cpcrf = _pglpcrf->IvMac(); for (ipcrf = 0; ipcrf < cpcrf; ipcrf++) { _pglpcrf->Get(ipcrf, &pcrf); AssertPo(pcrf, 0); if (pcrf->FSetCrep(crep, ctg, cno, pfnrpo, rsc)) return fTrue; } return fFalse; } /*************************************************************************** Return which CRF the given chunk is in. The caller is not given a reference count. ***************************************************************************/ PCRF CRM::PcrfFindChunk(CTG ctg, CNO cno, RSC rsc) { AssertThis(0); PCRF pcrf; long ipcrf; long cpcrf = _pglpcrf->IvMac(); for (ipcrf = 0; ipcrf < cpcrf; ipcrf++) { _pglpcrf->Get(ipcrf, &pcrf); AssertPo(pcrf, 0); if (pcrf->Pcfl()->FFind(ctg, cno) && (rscNil == rsc || pcrf->Pcfl()->FFind(kctgRsc, rsc))) { return pcrf; } } return pvNil; } /*************************************************************************** Add a chunky file to the list of chunky resource files, by creating the chunky resource file object and adding it to the GL ***************************************************************************/ bool CRM::FAddCfl(PCFL pcfl, long cbMax, long *piv) { AssertThis(0); AssertPo(pcfl, 0); AssertIn(cbMax, 0, kcbMax); AssertNilOrVarMem(piv); PCRF pcrf; if (pvNil == (pcrf = CRF::PcrfNew(pcfl, cbMax))) { TrashVar(piv); return fFalse; } if (!_pglpcrf->FAdd(&pcrf, piv)) { ReleasePpo(&pcrf); return fFalse; } return fTrue; } /*************************************************************************** Get the icrf'th CRF. ***************************************************************************/ PCRF CRM::PcrfGet(long icrf) { AssertThis(0); AssertIn(icrf, 0, kcbMax); PCRF pcrf; if (!FIn(icrf, 0, _pglpcrf->IvMac())) return pvNil; _pglpcrf->Get(icrf, &pcrf); AssertPo(pcrf, 0); return pcrf; } #ifdef DEBUG /*************************************************************************** Check the sanity of the CRM ***************************************************************************/ void CRM::AssertValid(ulong grfobj) { CRM_PAR::AssertValid(grfobj | fobjAllocated); AssertPo(_pglpcrf, 0); } /*************************************************************************** mark the memory associated with the CRM ***************************************************************************/ void CRM::MarkMem(void) { AssertThis(0); long ipcrf; long cpcrf; PCRF pcrf; CRM_PAR::MarkMem(); MarkMemObj(_pglpcrf); for (ipcrf = 0, cpcrf = _pglpcrf->IvMac(); ipcrf < cpcrf; ipcrf++) { _pglpcrf->Get(ipcrf, &pcrf); AssertPo(pcrf, 0); MarkMemObj(pcrf); } } #endif // DEBUG /*************************************************************************** A PFNRPO to read GHQ objects. ***************************************************************************/ bool GHQ::FReadGhq(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb) { AssertPo(pcrf, 0); AssertPo(pblck, 0); AssertNilOrVarMem(ppbaco); AssertVarMem(pcb); GHQ *pghq; HQ hq; *pcb = pblck->Cb(fTrue); if (pvNil == ppbaco) return fTrue; if (!pblck->FUnpackData() || hqNil == (hq = pblck->HqFree())) { TrashVar(pcb); TrashVar(ppbaco); return fFalse; } *pcb = CbOfHq(hq); if (pvNil == (pghq = NewObj GHQ(hq))) { FreePhq(&hq); TrashVar(pcb); TrashVar(ppbaco); return fFalse; } *ppbaco = pghq; return fTrue; } #ifdef DEBUG /*************************************************************************** Assert the validity of a GHQ. ***************************************************************************/ void GHQ::AssertValid(ulong grf) { GHQ_PAR::AssertValid(grf); if (hqNil != hq) AssertHq(hq); } /*************************************************************************** Mark memory used by the GHQ. ***************************************************************************/ void GHQ::MarkMem(void) { GHQ_PAR::MarkMem(); MarkHq(hq); } #endif // DEBUG #ifdef DEBUG /*************************************************************************** Assert the validity of a CABO. ***************************************************************************/ void CABO::AssertValid(ulong grf) { CABO_PAR::AssertValid(grf); AssertNilOrPo(po, 0); } /*************************************************************************** Mark memory used by the CABO. ***************************************************************************/ void CABO::MarkMem(void) { CABO_PAR::MarkMem(); MarkMemObj(po); } #endif // DEBUG ================================================ FILE: kauai/src/crf.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Chunky resource file management. A CRF is a cache wrapped around a chunky file. A CRM is a list of CRFs. A BACO is an object that can be cached in a CRF. An RCA is an interface that CRF and CRM both implement (are a super set of). ***************************************************************************/ #ifndef CHRES_H #define CHRES_H typedef class CRF *PCRF; typedef CNO RSC; const RSC rscNil = 0L; // chunky resource entry priority enum { crepToss, crepTossFirst, crepNormal, }; /*************************************************************************** Base cacheable object. All cacheable objects must be based on BACO. ***************************************************************************/ typedef class BACO *PBACO; #define BACO_PAR BASE #define kclsBACO 'BACO' class BACO : public BACO_PAR { RTCLASS_DEC ASSERT MARKMEM private: // These fields are owned by the CRF PCRF _pcrf; // The BACO has a ref count on this iff !_fAttached CTG _ctg; CNO _cno; long _crep : 16; long _fAttached : 1; friend class CRF; protected: BACO(void); ~BACO(void); public: virtual void Release(void); virtual void SetCrep(long crep); virtual void Detach(void); CTG Ctg(void) { return _ctg; } CNO Cno(void) { return _cno; } PCRF Pcrf(void) { return _pcrf; } long Crep(void) { return _crep; } // Many objects know how big they are, and how to write themselves to a // chunky file. Here are some useful prototypes so that the users of those // objects don't need to know what the actual class is. virtual bool FWrite(PBLCK pblck); virtual bool FWriteFlo(PFLO pflo); virtual long CbOnFile(void); }; /*************************************************************************** Chunky resource cache - this is a pure virtual class that supports the crf and crm classes. ***************************************************************************/ // Object reader function - must handle ppo == pvNil, in which case, the // *pcb should be set to an estimate of the size when read. typedef bool FNRPO(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb); typedef FNRPO *PFNRPO; typedef class RCA *PRCA; #define RCA_PAR BASE #define kclsRCA 'RCA' class RCA : public RCA_PAR { RTCLASS_DEC public: virtual tribool TLoad(CTG ctg, CNO cno, PFNRPO pfnrpo, RSC rsc = rscNil, long crep = crepNormal) = 0; virtual PBACO PbacoFetch(CTG ctg, CNO cno, PFNRPO pfnrpo, bool *pfError = pvNil, RSC rsc = rscNil) = 0; virtual PBACO PbacoFind(CTG ctg, CNO cno, PFNRPO pfnrpo, RSC rsc = rscNil) = 0; virtual bool FSetCrep(long crep, CTG ctg, CNO cno, PFNRPO pfnrpo, RSC rsc = rscNil) = 0; virtual PCRF PcrfFindChunk(CTG ctg, CNO cno, RSC rsc = rscNil) = 0; }; /*************************************************************************** Chunky resource file. ***************************************************************************/ #define CRF_PAR RCA #define kclsCRF 'CRF' class CRF : public CRF_PAR { RTCLASS_DEC ASSERT MARKMEM protected: struct CRE { PFNRPO pfnrpo; // object reader long cactRelease; // the last time this object was released BACO *pbaco; // the object long cb; // size of data }; PCFL _pcfl; PGL _pglcre; // sorted by (cki, pfnrpo) long _cbMax; long _cbCur; long _cactRelease; CRF(PCFL pcfl, long cbMax); bool _FFindCre(CTG ctg, CNO cno, PFNRPO pfnrpo, long *picre); bool _FFindBaco(PBACO pbaco, long *picre); bool _FPurgeCb(long cbPurge, long crepLast); public: ~CRF(void); static PCRF PcrfNew(PCFL pcfl, long cbMax); virtual tribool TLoad(CTG ctg, CNO cno, PFNRPO pfnrpo, RSC rsc = rscNil, long crep = crepNormal); virtual PBACO PbacoFetch(CTG ctg, CNO cno, PFNRPO pfnrpo, bool *pfError = pvNil, RSC rsc = rscNil); virtual PBACO PbacoFind(CTG ctg, CNO cno, PFNRPO pfnrpo, RSC rsc = rscNil); virtual bool FSetCrep(long crep, CTG ctg, CNO cno, PFNRPO pfnrpo, RSC rsc = rscNil); virtual PCRF PcrfFindChunk(CTG ctg, CNO cno, RSC rsc = rscNil); long CbMax(void) { return _cbMax; } void SetCbMax(long cbMax); PCFL Pcfl(void) { return _pcfl; } // These APIs are intended for BACO use only void BacoDetached(PBACO pbaco); void BacoReleased(PBACO pbaco); }; /*************************************************************************** Chunky resource manager - a list of CRFs. ***************************************************************************/ typedef class CRM *PCRM; #define CRM_PAR RCA #define kclsCRM 'CRM' class CRM : public CRM_PAR { RTCLASS_DEC ASSERT MARKMEM protected: PGL _pglpcrf; CRM(void) { } public: ~CRM(void); static PCRM PcrmNew(long ccrfInit); virtual tribool TLoad(CTG ctg, CNO cno, PFNRPO pfnrpo, RSC rsc = rscNil, long crep = crepNormal); virtual PBACO PbacoFetch(CTG ctg, CNO cno, PFNRPO pfnrpo, bool *pfError = pvNil, RSC rsc = rscNil); virtual PBACO PbacoFind(CTG ctg, CNO cno, PFNRPO pfnrpo, RSC rsc = rscNil); virtual bool FSetCrep(long crep, CTG ctg, CNO cno, PFNRPO pfnrpo, RSC rsc = rscNil); virtual PCRF PcrfFindChunk(CTG ctg, CNO cno, RSC rsc = rscNil); bool FAddCfl(PCFL pcfl, long cbMax, long *piv = pvNil); long Ccrf(void) { AssertThis(0); return _pglpcrf->IvMac(); } PCRF PcrfGet(long icrf); }; /*************************************************************************** An object (BACO) wrapper around a generic HQ. ***************************************************************************/ #define GHQ_PAR BACO typedef class GHQ *PGHQ; #define kclsGHQ 'GHQ' class GHQ : public GHQ_PAR { RTCLASS_DEC ASSERT MARKMEM public: HQ hq; GHQ(HQ hqT) { hq = hqT; } ~GHQ(void) { FreePhq(&hq); } // An object reader for a GHQ. static bool FReadGhq(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb); }; /*************************************************************************** A BACO wrapper around a generic object. ***************************************************************************/ #define CABO_PAR BACO typedef class CABO *PCABO; #define kclsCABO 'CABO' class CABO : public CABO_PAR { RTCLASS_DEC ASSERT MARKMEM public: BASE *po; CABO(BASE *poT) { po = poT; } ~CABO(void) { ReleasePpo(&po); } }; #endif //! CHRES_H ================================================ FILE: kauai/src/csapi.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* CSAPI.H - API entry header file for CSAPI * * See Csapi.Doc for details on the CSAPI. * Note that the double slash comment // should not be used in this file * since THINK_C does not support this format. */ #ifndef CSAPI_H #define CSAPI_H #ifdef NT typedef unsigned SC_MDR; /* main dictionary reference*/ typedef unsigned SC_UDR; /* user dictionary reference*/ #else typedef unsigned short SC_MDR; /* main dictionary reference*/ typedef unsigned short SC_UDR; /* user dictionary reference*/ #endif typedef unsigned short SC_CC; /* Spell Check Command Code */ /* SPLID is the replacement for SID due to a conflict with the Windows NT header files. References to sid i.e. sidSA are left unchanged for the sake of less required code changes. */ typedef unsigned long SC_SPLID; /* Spell Id type */ typedef unsigned short SC_SCIS; /* SpellCheckInputStatus*/ typedef unsigned short SC_SCRS; /* SpellCheckReturnStatus */ typedef unsigned short SC_LID; /* two byte language identifier code */ /* Comment out as needed */ typedef unsigned char SC_BYTE; typedef unsigned short SC_WORD; typedef char SC_CHAR; #ifdef NT typedef int SC_BOOL; #else typedef short SC_BOOL; #endif /* All undefined or unused chars should be mapped to bIgnore. */ typedef struct WizSpecChars { SC_BYTE bIgnore; SC_BYTE bHyphenHard; SC_BYTE bHyphenSoft; SC_BYTE bHyphenNonBreaking; SC_BYTE bEmDash; SC_BYTE bEnDash; SC_BYTE bEllipsis; SC_BYTE rgLineBreak[2]; SC_BYTE rgParaBreak[2]; } SC_WSC; #ifndef SC_FAR #ifdef MAC #define SC_FAR #else #define SC_FAR far #endif #endif /************************** Structure Typedefs *************/ typedef SC_WORD SC_SEC; /* Spell Error Code. Low byte for major code, High byte for minor.*/ typedef struct SpellInputBuffer { unsigned short cch; /* Total characters in buffer area */ unsigned short cMdr; /* Count of MDR's specified in lrgMdr */ unsigned short cUdr; /* Should not reference Exclusion UDR's. Count of UDR's specified in lrgUdr */ unsigned short wSpellState; /* State relative to previous SpellCheck() call */ SC_CHAR SC_FAR *lrgch; /* ptr to buf area of text to be spell checked */ SC_MDR SC_FAR *lrgMdr; /* List of main dicts to use when spelling the buffer */ SC_UDR SC_FAR *lrgUdr; /* Should not reference Exclusion UDR's. List of user dicts to use when spelling the buffer */ } SC_SIB; typedef SC_SIB SC_FAR *LPSC_SIB; typedef struct SpellReturnBuffer { /* These fields are set by the SpellCheck() function */ /* reference word in error or flagged into SC_SIB. */ unsigned short ichError; /*position in the SC_SIB */ unsigned short cchError; /*Length of error "word" in SC_SIB.*/ /* These fields are set by the SpellCheck() function. */ SC_SCRS scrs; /*spell check return status. Set by SC()*/ unsigned short csz; /*count of sz's put in buffer. Set by SC*/ unsigned short cchMac; /* Current total of chars in buffer. */ /* These fields MUST be set by the app, NULL pointers are invalid */ unsigned short cch; /* total space in lrgch. Set by App. */ SC_CHAR SC_FAR *lrgsz; /* ptr to alternatives. format: word\0word\0...word\0\0*/ SC_BYTE SC_FAR *lrgbRating; /* ptr to Rating value for each sugg. returned. Parallel to lrgsz array. Allocated by App.*/ unsigned short cbRate; /* Number of elements in lrgbRating. Set by App. lrgbRating must be this long.*/ } SC_SRB; typedef SC_SRB SC_FAR *LPSC_SRB; typedef struct mdrs { SC_MDR mdr; SC_LID sclid; SC_UDR udrExc; } SC_MDRS; typedef SC_MDRS SC_FAR *LPSC_MDRS; #ifndef MAC typedef SC_CHAR SC_FAR *LPSC_PATH; /* ptr to full Sz path string. */ #else typedef struct spath { short volRefNum; long dirID; SC_CHAR *lpszFilePath; /* lpSzFile is local Sz path string for MAC, it is the local file path which will be used with the volRefNum. */ } SC_PATH; typedef SC_PATH *LPSC_PATH; #endif /* !MAC */ /*-------------------------------------------------------*/ /* All Defines*/ /* Explicit word delimeters. */ #define chSpaceSpell \ 0x20 /* ' ' space. Also used to delimit \ "change always" pairs */ #define chTabSpell \ 0x09 /* TAB. Can be word delimeter or a \ string delimiter for "change once" lists.*/ /*** Additional Word Delimeters. */ /* [] {} () <> / EmDash EnDash Ellipsis New_Paragraph */ #define chLParenSpell 0x28 #define chRParenSpell 0x29 #define chLBracketSpell 0x7B #define chRBracketSpell 0x7D #define chLBraceSpell 0x5B #define chRBraceSpell 0x5D #define chLessThanSpell 0x3C #define chGreaterThanSpell 0x3E #define chForwardSlashSpell 0x2F /* Spell Id Engine Defines */ #define sidSA 1 /* SoftArt */ #define sidHM 2 /* Houghton-Mifflin (InfoSoft) */ #define sidML 3 /* MicroLytics */ #define sidLS 4 /* LanSer Data */ #define sidCT 5 /* Center of Educational Technology */ #define sidHS 6 /* HSoft */ #define sidMO 7 /* MorphoLogic */ #define sidTI 8 /* TiP */ #define sidKF 9 /* Korea Foreign Language University */ #define sidPI 10 /* Priberam Informatica Lince */ #define sidGS 11 /* Glyph Systems */ #define sidRA 12 /* Radiar */ #define sidIN 13 /* Intracom */ /* IPG two byte language id's. Returned in SC_LID field. */ #define ksclidAmerican 0x0409 /* "AM" American English */ #define ksclidAustralian 0x0c09 /* "EA" English Australian */ #define ksclidBritish 0x0809 /* "BR" English */ #define ksclidCatalan 0x0403 /* "CT" Catalan */ #define ksclidDanish 0x0406 /* "DA" Danish */ #define ksclidDutch 0x0413 /* "NL" Dutch */ #define ksclidDutchPreferred 0x0013 /* "NL" Dutch Preferred */ #define ksclidFinnish 0x040b /* "FI" Finish */ #define ksclidFrench 0x040c /* "FR" French */ #define ksclidFrenchCanadian 0x0c0c /* "FC" French Canadian */ #define ksclidGerman 0x0407 /* "GE" German */ #define ksclidSwissGerman 0x0807 /* "GS" German Swiss */ #define ksclidItalian 0x0410 /* "IT" Italian */ #define ksclidNorskBokmal 0x0414 /* "NO" Norwegian Bokmal */ #define ksclidNorskNynorsk 0x0814 /* "NN" Norwegian Nynorsk */ #define ksclidPortBrazil 0x0416 /* "PB" Portuguese Brazil */ #define ksclidPortIberian 0x0816 /* "PT" Portuguese Iberian */ #define ksclidSpanish 0x040a /* "SP" Spanish */ #define ksclidSwedish 0x041d /* "SW" Swedish */ #define ksclidRussian 0x0419 /* "RU" Russian */ #define ksclidCzech 0x0405 /* "CZ" Czech */ #define ksclidHungarian 0x040e /* "HU" Hungarian */ #define ksclidPolish 0x0415 /* "PL" Polish */ #define ksclidTurkish 0x041f /* "TR" Turkish */ /* African languages */ #define ksclidSutu 0x0430 /* "ST" Sutu */ #define ksclidTsonga 0x0431 /* "TS" Tsonga */ #define ksclidTswana 0x0432 /* "TN" Tswana */ #define ksclidVenda 0x0433 /* "VE" Venda */ #define ksclidXhosa 0x0434 /* "XH" Xhosa */ #define ksclidZulu 0x0435 /* "ZU" Zulu */ #define ksclidAfrikaans 0x0436 /* "AF" Afrikaans */ /* These are currently not used, but added for future support. */ #define ksclidArabic 0x0401 #define ksclidHebrew 0x040d #define ksclidJapanese 0x0411 #define ksclidLatin 0x041a /* Croato-Serbian (Latin) */ #define ksclidCyrillic 0x081a /* Serbo-Croatian (Cyrillic) */ #define ksclidSlovak 0x041b #define LID_UNKNOWN 0xffff #define ksclidUnknown 0xffff /* Ram Cache User Dictionary Reference. */ #define udrChangeOnce 0xfffc /* UDR reserved reference for Change Once list */ #define udrChangeAlways 0xfffd /* UDR reserved reference for Change Always list */ #define udrIgnoreAlways 0xfffe /* UDR reserved reference for Ingore Always list. */ /* Word List property types. Note: Code relies on being == to above udr's! */ #define ChangeOnceProp udrChangeOnce #define ChangeAlwaysProp udrChangeAlways #define IgnoreAlwaysProp udrIgnoreAlways /* Bitfield definitions for SpellInit() Status */ #define fscisWildCardSupport 0x0001 #define fscisMultiDictSupport 0x0002 #define fscisHyphenationSupport 0x0004 #define scisNULL 0x0000 /* Spell Check Command Definitions */ #define sccVerifyWord 1 #define sccVerifyBuffer 2 #define sccSuggest 3 #define sccSuggestMore 4 #define sccHyphInfo 5 #define sccWildcard 6 #define sccAnagram 7 /* Flag values for SpellState field in Sib. */ #define fssIsContinued 0x0001 /* Call is continuing from where last call returned. Must be cleared for first call into SpellCheck(). */ #define fssStartsSentence 0x0002 /* First word in buffer is known to be start of sentence/paragraph/document. This is only used if the fSibIsContinued bit is not set. It should not be needed if the fSibIsContinued bit is being used. If this bit is set during a suggestion request, suggestions will be capitalized. */ #define fssIsEditedChange 0x0004 /* The run of text represented in the SC_SIB is a change from either a change pair (change always or change once) edit, or from a user specified change, possibly from a suggestion list presented to the user. This text should be checked for repeat word problems, and possibly sentence status, but should not be subject to subsequent spell verification or change pair substitutions. Note that if an app is not using the fSibIsContinued support, they do not need to pass in these edited changes, thus bypassing the potential problem, and working faster. */ #define fssNoStateInfo 0x0000 /* App is responsible for checking for all repeat word and sentence punctuation, and avoiding processing loops such as change always can=can can. */ /* End of Sib Spell State flag definitions. */ /* Spell Check return status identifiers */ #define scrsNoErrors 0 /* All buffer processed. */ #define scrsUnknownInputWord 1 /* Unknown word. */ #define scrsReturningChangeAlways 2 /* Returning a Change Always word in SC_SRB. */ #define scrsReturningChangeOnce 3 /* Returning a Change Once word in SC_SRB. */ #define scrsInvalidHyphenation 4 /* Error in hyphenation point.*/ #define scrsErrorCapitalization 5 /* Cap pattern not valid. */ #define scrsWordConsideredAbbreviation 6 /* Word is considered an abbreviation. */ #define scrsHyphChangesSpelling 7 /* Word changes spelling when not hyphenated. */ #define scrsNoMoreSuggestions 8 /* All methods used. */ #define scrsMoreInfoThanBufferCouldHold 9 /* More return data than fit in buffer */ #define scrsNoSentenceStartCap 10 /* Start of sentence was not capitalized. */ #define scrsRepeatWord 11 /* Repeat word found. */ #define scrsExtraSpaces 12 /* Too many spaces for context.*/ #define scrsMissingSpace 13 /* Too few space(s) between words or sentences. */ #define scrsInitialNumeral 14 /* Word starts with numeral & soFlagInitialNumeral set */ /* Spell Error Codes */ #define secNOERRORS 0 /* Major Error Codes. Low Byte of SEC*/ #define secOOM 1 #define secModuleError 2 /* Something wrong with parameters, or state of spell module. */ #define secIOErrorMdr 3 /* Read,write,or share error with Mdr. */ #define secIOErrorUdr 4 /* Read,write,or share error with Udr. */ /* Minor Error Codes. Not set unless major code also set. */ /* High Byte of SEC word var. */ #define secModuleAlreadyBusy (128 << 8) /* For non-reentrant code */ #define secInvalidID (129 << 8) /* Not yet inited or already terminated.*/ #define secInvalidWsc (130 << 8) /* Illegal values in SC_WSC struct */ #define secInvalidMdr (131 << 8) /* Mdr not registered with spell session */ #define secInvalidUdr (132 << 8) /* Udr not registered with spell session */ #define secInvalidSCC (133 << 8) /* SC_CC unknown (spellcheck() only ) */ #define secInvalidMainDict (134 << 8) /* Specified dictionary not correct format */ #define secOperNotMatchedUserDict (135 << 8) /* Illegal operation for user dictionary type. */ #define secFileReadError (136 << 8) /* Generic read error */ #define secFileWriteError (137 << 8) /* Generic write error */ #define secFileCreateError (138 << 8) /* Generic create error */ #define secFileShareError (139 << 8) /* Generic share error */ #define secModuleNotTerminated (140 << 8) /* Module not able to be terminated completely.*/ #define secUserDictFull (141 << 8) /* Could not update Udr without exceeding limit.*/ #define secInvalidUdrEntry (142 << 8) /* invalid chars in string(s) */ #define secUdrEntryTooLong (143 << 8) /* Entry too long, or invalid chars in string(s) */ #define secMdrCountExceeded (144 << 8) /* Too many Mdr references */ #define secUdrCountExceeded (145 << 8) /* Too many udr references */ #define secFileOpenError (146 << 8) /* Generic Open error */ #define secFileTooLargeError (147 << 8) /* Generic file too large error */ #define secUdrReadOnly (148 << 8) /* Attempt to add to or write RO udr */ /* Spell Options bitfield definitions */ #define soSuggestFromUserDict 0x00000001L /* Suggest from user dictionaries. */ #define soIgnoreAllCaps 0x00000002L /* Ignore words in all UPPERCASE. */ #define soIgnoreMixedDigits 0x00000004L /* Ignore words with any numbers in it. */ #define soIgnoreRomanNumerals 0x00000008L /* Ignore words composed of all roman numerals. */ #define soFindUncappedSentences \ 0x00000010L /* Flag sentences which don't start with a cap. \ * (Soft-Art only) \ */ #define soFindMissingSpaces \ 0x00000020L /* Flag missing spaces between words/sentences. \ * (Soft-Art only) \ */ #define soFindRepeatWord 0x00000040L /* Flag repeated words. */ #define soFindExtraSpaces \ 0x00000080L /* Flag extra spaces between words. \ * (Soft-Art only) \ */ #define soFindSpacesBeforePunc \ 0x00000100L /* Flag spaces preceeding \ * the chars below: \ * ) ] } > , ; % . ? ! \ * (Soft-Art only) \ */ #define soFindSpacesAfterPunc \ 0x00000200L /* Flag spaces following \ * the chars below: \ * ( [ { $ \ * (Soft-Art only) \ */ #define soRateSuggestions \ 0x00000400L /* Rate the suggestions on scale \ * of 1-255, 255 being most likely \ * (Soft-Art only) \ */ #define soFindInitialNumerals 0x00000800L /* Flag words starting with number(s) */ #define soReportUDHits \ 0x00001000L /* Report (via scrsNoErrorsUDHit) where \ * user dict was used during verification \ */ #define soQuickSuggest 0x00002000L /* Don't use typo suggest code (Soft-Art only) */ #define soUseAllOpenUdr \ 0x00004000L /* Automatically use all udr's opened \ * after this option is set, or all opened udr's \ * with mdr's opened after this option is set. \ * This option does not allow exclusion dicts to \ * be edited. \ * (HM only) \ */ #define soSwapMdr \ 0x00008000L /* Keep the most recent 2 mdr's around. \ * swap between them instead of actually closing \ * and reopening mdr's. \ * (HM only) \ */ #define soSglStepSugg \ 0x00010000L /* Break after each suggestion task for faster \ * return of control to the application. \ * (HM only) \ */ #define soIgnoreSingleLetter \ 0x00020000L /* Do not check single letters: e.g., "a)". \ * (HS only) \ */ #define soLangMode 0xF0000000L /* Language Mode mask */ /* Hebrew Language Modes -- (CT only) */ #define soHebrewFullScript 0x00000000L #define soHebrewPartialScript 0x10000000L #define soHebrewMixedScript 0x20000000L #define soHebrewMixedAuthorizedScript 0x30000000L /* French Language Modes -- (HM only) */ #define soFrenchDialectDefault 0x00000000L #define soFrenchUnaccentedUppercase 0x10000000L #define soFrenchAccentedUppercase 0x20000000L /* Russian Language Modes -- (HM only) */ #define soRussianDialectDefault 0x00000000L #define soRussianIE 0x10000000L #define soRussianIO 0x20000000L #ifdef DEBUG #define sdcDumpRCAll 200 #define sdcDumpRCIgnore 201 #define sdcDumpRCOnce 202 #define sdcDumpRCAlways 203 #define sdcDumpUdrAll 300 #define sdcDumpUdr1 301 #define sdcDumpUdr2 302 #define sdcDumpUdr3 303 #define sdcDumpUdr4 304 #define sdcDumpMdrAll 400 #define sdcDumpMdr1 401 #endif /* DEBUG */ #ifndef SC_PASCAL #define SC_PASCAL pascal #endif #define GLOBAL SC_FAR SC_PASCAL #define GLOBALSEC SC_SEC SC_FAR SC_PASCAL #ifdef MAC /* Exported Function Prototypes */ extern GLOBALSEC SpellVer(SC_WORD SC_FAR *, SC_WORD SC_FAR *, SC_WORD SC_FAR *); extern GLOBALSEC SpellInit(SC_SPLID SC_FAR *, SC_WSC SC_FAR *); extern GLOBALSEC SpellOptions(SC_SPLID, long); extern GLOBALSEC SpellCheck(SC_SPLID, SC_CC, LPSC_SIB, LPSC_SRB); extern GLOBALSEC SpellTerminate(SC_SPLID, SC_BOOL); extern GLOBALSEC SpellVerifyMdr(LPSC_PATH, SC_LID, SC_LID SC_FAR *); extern GLOBALSEC SpellOpenMdr(SC_SPLID, LPSC_PATH, LPSC_PATH, SC_BOOL, SC_BOOL, SC_LID, LPSC_MDRS); extern GLOBALSEC SpellOpenUdr(SC_SPLID, LPSC_PATH, SC_BOOL, SC_WORD, SC_UDR SC_FAR *, SC_BOOL SC_FAR *); extern GLOBALSEC SpellAddUdr(SC_SPLID, SC_UDR, SC_CHAR SC_FAR *); extern GLOBALSEC SpellAddChangeUdr(SC_SPLID, SC_UDR, SC_CHAR SC_FAR *, SC_CHAR SC_FAR *); extern GLOBALSEC SpellDelUdr(SC_SPLID, SC_UDR, SC_CHAR SC_FAR *); extern GLOBALSEC SpellClearUdr(SC_SPLID, SC_UDR); #ifdef NT extern GLOBALSEC SpellGetSizeUdr(SC_SPLID, SC_UDR, int *); #else extern GLOBALSEC SpellGetSizeUdr(SC_SPLID, SC_UDR, SC_WORD SC_FAR *); #endif extern GLOBALSEC SpellGetListUdr(SC_SPLID, SC_UDR, SC_WORD, LPSC_SRB); extern GLOBALSEC SpellCloseMdr(SC_SPLID, LPSC_MDRS); extern GLOBALSEC SpellCloseUdr(SC_SPLID, SC_UDR, SC_BOOL); extern Handle HCsapiResInit(SC_CHAR *stzsFileName, short vRef, long dirId); extern void CsapiResTerm(void); extern void CsapiResFlush(void); #endif /* MAC */ #endif /* !CSAPI_H */ ================================================ FILE: kauai/src/ctl.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Standard controls. ***************************************************************************/ #include "frame.h" ASSERTNAME // what we set the system max to for scroll bars const long _klwMaxScroll = 20000; // should be less than 32K #ifdef WIN achar _szCtlProp[] = PszLit("CTL"); #endif // WIN RTCLASS(CTL) RTCLASS(SCB) RTCLASS(WSB) /*************************************************************************** Constructor for a control. ***************************************************************************/ CTL::CTL(PGCB pgcb) : GOB(pgcb) { _hctl = hNil; } /*************************************************************************** Destructor for controls. ***************************************************************************/ CTL::~CTL(void) { if (_hctl != hNil) { #ifdef MAC RC rc; GNV gnv(this); rc.Zero(); gnv.ClipRc(&rc); gnv.Set(); DisposeControl(_hctl); gnv.Restore(); #endif // MAC #ifdef WIN RemoveProp(_hctl, _szCtlProp); DestroyWindow(_hctl); #endif // WIN _hctl = hNil; } } /*************************************************************************** Sets the OS control for the CTL. If this fails, it frees the control. ***************************************************************************/ bool CTL::_FSetHctl(HCTL hctl) { Assert(_hctl == hNil, "CTL already has an OS control"); if (hctl != hNil) { #ifdef MAC SetCRefCon(hctl, (long)this); #endif // MAC #ifdef WIN if (!SetProp(hctl, _szCtlProp, (HANDLE)this)) { DestroyWindow(hctl); return fFalse; } #endif // WIN _hctl = hctl; } return fTrue; } /*************************************************************************** Return the CTL associated with the given HCTL. ***************************************************************************/ PCTL CTL::PctlFromHctl(HCTL hctl) { #ifdef MAC return (PCTL)GetCRefCon(hctl); #endif // MAC #ifdef WIN return (PCTL)GetProp(hctl, _szCtlProp); #endif // WIN } /*************************************************************************** The control may have been moved - move the OS control. ***************************************************************************/ void CTL::_NewRc(void) { RC rc; RCS rcs; HWND hwnd; if (_hctl == hNil) return; hwnd = _HwndGetRc(&rc); Assert(hwnd != hNil, "control isn't based in an hwnd"); rcs = RCS(rc); #ifdef MAC RCS rcsOld = (*_hctl)->contrlRect; if (!EqualRect(&rcs, &rcsOld)) { GNV gnv(this); // clip out everything - hide it, then move and size it // don't make it visible again - we do that in the Draw // routine rc.Zero(); gnv.ClipRc(&rc); gnv.Set(); HideControl(_hctl); MoveControl(_hctl, rcs.left, rcs.top); SizeControl(_hctl, rcs.right - rcs.left, rcs.bottom - rcs.top); gnv.Restore(); } #endif // MAC #ifdef WIN MoveWindow(_hctl, rcs.left, rcs.top, rcs.right - rcs.left, rcs.bottom - rcs.top, fFalse); InvalidateRect(_hctl, pvNil, fFalse); #endif // WIN } #ifdef MAC /*************************************************************************** Draw routine for a control. ***************************************************************************/ void CTL::Draw(PGNV pgnv, RC *prcClip) { if (_hctl == hNil) return; if (pgnv->Pgpt() == Pgpt()) { pgnv->Set(); if (!(*_hctl)->contrlVis) ShowControl(_hctl); else Draw1Control(_hctl); pgnv->Restore(); } else { RC rc; GNV gnv(this); gnv.Set(); if (!(*_hctl)->contrlVis) ShowControl(_hctl); else Draw1Control(_hctl); gnv.Restore(); GetRcVis(&rc, cooLocal); pgnv->CopyPixels(&gnv, &rc, &rc); } } #endif // MAC /*************************************************************************** Static method to create a scroll bar. ***************************************************************************/ PSCB SCB::PscbNew(PGCB pgcb, ulong grfscb, long val, long valMin, long valMax) { Assert(FPure(grfscb & fscbHorz) != FPure(grfscb & fscbVert), "exactly one of (fscbHorz,fscbVert) should be set"); PSCB pscb; GCB gcb; if (grfscb & fscbStandardRc) { gcb.Set(pgcb->_hid, pgcb->_pgob, pgcb->_grfgob, pgcb->_gin); GetStandardRc(grfscb, &gcb._rcAbs, &gcb._rcRel); pgcb = &gcb; } if (pvNil == (pscb = NewObj SCB(pgcb))) return pvNil; if (!pscb->_FCreate(val, valMin, valMax, grfscb)) ReleasePpo(&pscb); return pscb; } /*************************************************************************** Static method to return the normal width of a vertical scroll bar. ***************************************************************************/ long SCB::DxpNormal(void) { #ifdef WIN static int _dxp = 0; if (_dxp > 0) return _dxp; return (_dxp = GetSystemMetrics(SM_CXVSCROLL)); #endif // WIN #ifdef MAC return 16; #endif // MAC } /*************************************************************************** Static method to return the normal width of a horizontal scroll bar. ***************************************************************************/ long SCB::DypNormal(void) { #ifdef WIN static int _dyp = 0; if (_dyp > 0) return _dyp; return (_dyp = GetSystemMetrics(SM_CYHSCROLL)); #endif // WIN #ifdef MAC return 16; #endif // MAC } /*************************************************************************** Get the standard rectangles for document window scroll bars. grfscb should contain fscbHorz or fscbVert. ***************************************************************************/ void SCB::GetStandardRc(ulong grfscb, RC *prcAbs, RC *prcRel) { if (FPure(grfscb & fscbVert)) { prcRel->ypTop = krelZero; prcRel->xpLeft = prcRel->xpRight = prcRel->ypBottom = krelOne; prcAbs->ypTop = -!(grfscb & fscbShowTop); prcAbs->xpLeft = -SCB::DxpNormal() + !(grfscb & fscbShowRight); prcAbs->xpRight = !(grfscb & fscbShowRight); prcAbs->ypBottom = -SCB::DypNormal() + 1 + !(grfscb & fscbShowBottom); } else { prcRel->xpLeft = krelZero; prcRel->ypTop = prcRel->xpRight = prcRel->ypBottom = krelOne; prcAbs->ypTop = -SCB::DypNormal() + !(grfscb & fscbShowBottom); prcAbs->xpLeft = -!(grfscb & fscbShowLeft); prcAbs->xpRight = -SCB::DxpNormal() + 1 + !(grfscb & fscbShowRight); prcAbs->ypBottom = !(grfscb & fscbShowBottom); } } /*************************************************************************** Get the standard client window rectangle (assuming the given set of scroll bars). ***************************************************************************/ void SCB::GetClientRc(ulong grfscb, RC *prcAbs, RC *prcRel) { prcRel->ypTop = prcRel->xpLeft = krelZero; prcRel->ypBottom = prcRel->xpRight = krelOne; prcAbs->Zero(); if (grfscb & fscbVert) prcAbs->xpRight = -SCB::DxpNormal() + !(grfscb & fscbShowRight); if (grfscb & fscbHorz) prcAbs->ypBottom = -SCB::DypNormal() + !(grfscb & fscbShowBottom); } /*************************************************************************** Create the actual system scroll bar. ***************************************************************************/ bool SCB::_FCreate(long val, long valMin, long valMax, ulong grfscb) { Assert(_Hctl() == hNil, "scb already created"); RC rc; RCS rcs; HWND hwnd; HCTL hctl; _fVert = FPure(grfscb & fscbVert); if ((hwnd = _HwndGetRc(&rc)) == hNil) { Bug("can only add controls to hwnd based gobs"); return fFalse; } rcs = RCS(rc); #ifdef MAC GNV gnv(this); gnv.Set(); hctl = NewControl(&hwnd->port, &rcs, (byte *)"\p", fTrue, 0, 0, 0, scrollBarProc, 0); gnv.Restore(); if (hctl == hNil || !_FSetHctl(hctl)) return fFalse; ValidRc(pvNil); #endif // MAC #ifdef WIN hctl = CreateWindow(PszLit("SCROLLBAR"), PszLit(""), (_fVert ? SBS_VERT : SBS_HORZ) | WS_CHILD | WS_VISIBLE, rcs.left, rcs.top, rcs.right - rcs.left, rcs.bottom - rcs.top, hwnd, hNil, vwig.hinst, pvNil); if (hctl == hNil || !_FSetHctl(hctl)) return fFalse; SetScrollRange(hctl, SB_CTL, 0, _klwMaxScroll, fFalse); SetScrollPos(hctl, SB_CTL, 0, fFalse); #endif // WIN SetValMinMax(val, valMin, valMax, MacWin(fTrue, fFalse)); return fTrue; } /*************************************************************************** Set the value of the scroll bar. ***************************************************************************/ void SCB::SetVal(long val, bool fRedraw) { long lwCur; val = LwMin(_valMax, LwMax(_valMin, val)); if (val == _val) return; _val = val; lwCur = LwMulDiv(_klwMaxScroll, _val - _valMin, LwMax(1, _valMax - _valMin)); #ifdef MAC // REVIEW shonk: Mac: implement fRedraw false GNV gnv(this); gnv.Set(); SetCtlValue(_Hctl(), (short)lwCur); gnv.Restore(); #endif // MAC #ifdef WIN SetScrollPos(_Hctl(), SB_CTL, lwCur, fRedraw); #endif // WIN } /*************************************************************************** Set the min and max of the scroll bar. ***************************************************************************/ void SCB::SetValMinMax(long val, long valMin, long valMax, bool fRedraw) { long lwCur; valMax = LwMax(valMin, valMax); val = LwMin(valMax, LwMax(valMin, val)); if (val == _val && valMin == _valMin && valMax == _valMax) return; _val = val; _valMin = valMin; _valMax = valMax; lwCur = LwMulDiv(_klwMaxScroll, _val - _valMin, LwMax(1, _valMax - _valMin)); #ifdef MAC // REVIEW shonk: Mac: implement fRedraw false GNV gnv(this); gnv.Set(); if (_valMax == _valMin) SetCtlMax(_Hctl(), 0); else SetCtlMax(_Hctl(), (short)_klwMaxScroll); SetCtlValue(_Hctl(), (short)lwCur); gnv.Restore(); #endif // MAC #ifdef WIN SetScrollPos(_Hctl(), SB_CTL, lwCur, fRedraw); #endif // WIN } #ifdef MAC /*************************************************************************** The hwnd has been activated or deactivated - redraw and validate. ***************************************************************************/ void SCB::_ActivateHwnd(bool fActive) { if (_valMin < _valMax) { GNV gnv(this); long lwCur; gnv.Set(); SetCtlMax(_Hctl(), (short)(fActive ? _klwMaxScroll : 0)); if (fActive) { lwCur = LwMulDiv(_klwMaxScroll, _val - _valMin, LwMax(1, _valMax - _valMin)); SetCtlValue(_Hctl(), (short)lwCur); } gnv.Restore(); if (!(*_Hctl())->contrlVis) { ValidRc(pvNil, kginDraw); InvalRc(pvNil, kginDraw); // this makes it visible } } } /*************************************************************************** Handle mouse tracking for a scroll bar. ***************************************************************************/ void SCB::MouseDown(long xp, long yp, long cact, ulong grfcust) { PTS pts; short in; PT pt; bool fDown, fLit; CMD cmd; GNV gnv(this); pts.h = (short)xp + (*_Hctl())->contrlRect.left; pts.v = (short)yp + (*_Hctl())->contrlRect.top; in = TestControl(_Hctl(), pts); switch (in) { default: break; case inThumb: gnv.Set(); in = TrackControl(_Hctl(), pts, pvNil); gnv.Restore(); // send the final position - this will get recorded // note that the _Hctl() has the wrong value so the // gob should call SetValue in response to this command vpcex->EnqueueCid(cidEndScroll, PgobPar(), pvNil, Hid(), _valMin + LwMulDiv((long)GetCtlValue(_Hctl()), _valMax - _valMin, _klwMaxScroll)); break; case inUpButton: case inDownButton: case inPageUp: case inPageDown: fDown = fTrue; pt.xp = xp; pt.yp = yp; for (;; GetPtMouse(&pt, &fDown)) { // get the new hilite state pts.h = (short)pt.xp + (*_Hctl())->contrlRect.left; pts.v = (short)pt.yp + (*_Hctl())->contrlRect.top; fLit = fDown && (TestControl(_Hctl(), pts) == in); // hilite the scroll bar appropriately gnv.Set(); if (fLit) HiliteControl(_Hctl(), in); else HiliteControl(_Hctl(), 0); gnv.Restore(); // see if we're done if (!fDown) break; if (fLit) { // send the command - this doesn't get recorded ClearPb(&cmd, size(cmd)); cmd.cid = cidDoScroll; cmd.pcmh = PgobPar(); cmd.rglw[0] = Hid(); switch (in) { case inUpButton: cmd.rglw[1] = scaLineUp; break; case inPageUp: cmd.rglw[1] = scaPageUp; break; case inDownButton: cmd.rglw[1] = scaLineDown; break; case inPageDown: cmd.rglw[1] = scaPageDown; break; default: BugVar("what is the in value?", &in); cmd.rglw[1] = scaNil; break; } cmd.pcmh->FDoCmd(&cmd); } } // send the final position - this will get recorded vpcex->EnqueueCid(cidEndScroll, PgobPar(), pvNil, Hid(), _val); break; } } #endif // MAC #ifdef WIN /*************************************************************************** Called in response to a Win WM_HSCROLL or WM_VSCROLL message. ***************************************************************************/ void SCB::TrackScroll(long sb, long lwVal) { AssertThis(0); CMD cmd; long val; ClearPb(&cmd, size(cmd)); cmd.cid = cidDoScroll; cmd.pcmh = PgobPar(); cmd.rglw[0] = Hid(); switch (sb) { case SB_LINEUP: cmd.rglw[1] = scaLineUp; break; case SB_LINEDOWN: cmd.rglw[1] = scaLineDown; break; case SB_PAGEUP: cmd.rglw[1] = scaPageUp; break; case SB_PAGEDOWN: cmd.rglw[1] = scaPageDown; break; case SB_THUMBTRACK: lwVal = LwMax(0, LwMin(_klwMaxScroll, lwVal)); cmd.rglw[1] = scaToVal; cmd.rglw[2] = _valMin + LwMulDiv(lwVal, _valMax - _valMin, _klwMaxScroll); break; // these values just push an end-scroll command case SB_THUMBPOSITION: _fSentEndScroll = fFalse; lwVal = LwMax(0, LwMin(_klwMaxScroll, lwVal)); val = _valMin + LwMulDiv(lwVal, _valMax - _valMin, _klwMaxScroll); goto LEndScroll; case SB_TOP: _fSentEndScroll = fFalse; val = _valMin; goto LEndScroll; case SB_BOTTOM: _fSentEndScroll = fFalse; val = _valMax; goto LEndScroll; case SB_ENDSCROLL: // NOTE: _fSentEndScroll is so we don't send another EndScroll // here if we've already sent one (in response to an SB_THUMBPOSITION, // SB_TOP or SB_BOTTOM), since this value will generally be wrong. val = _val; goto LEndScroll; default: // do nothing return; } _fSentEndScroll = fFalse; cmd.pcmh->FDoCmd(&cmd); return; LEndScroll: if (!_fSentEndScroll) { cmd.cid = cidEndScroll; cmd.rglw[1] = val; vpcex->EnqueueCmd(&cmd); _fSentEndScroll = fTrue; } } #endif // WIN /*************************************************************************** Static method to create a window size box. ***************************************************************************/ PWSB WSB::PwsbNew(PGOB pgob, ulong grfgob) { RC rcRel, rcAbs; PWSB pwsb; rcRel.xpLeft = rcRel.xpRight = rcRel.ypTop = rcRel.ypBottom = krelOne; rcAbs.xpLeft = -SCB::DxpNormal() + 1; rcAbs.ypTop = -SCB::DypNormal() + 1; rcAbs.xpRight = rcAbs.ypBottom = 1; GCB gcb(khidSizeBox, pgob, grfgob, kginDefault, &rcAbs, &rcRel); if ((pwsb = NewObj WSB(&gcb)) == pvNil) return pvNil; Assert(pwsb->PgobPar() != pvNil, "nil parent"); Assert(pwsb->PgobPar()->Hwnd() != hNil, "parent of size box doesn't have an hwnd"); #ifdef WIN RC rc; RCS rcs; HWND hwnd; HCTL hctl; hwnd = pwsb->_HwndGetRc(&rc); rcs = RCS(rc); hctl = CreateWindow(PszLit("SCROLLBAR"), PszLit(""), SBS_SIZEBOX | WS_CHILD | WS_VISIBLE, rcs.left, rcs.top, rcs.right - rcs.left, rcs.bottom - rcs.top, hwnd, hNil, vwig.hinst, pvNil); if (hctl == hNil || !pwsb->_FSetHctl(hctl)) ReleasePpo(&pwsb); #endif return pwsb; } #ifdef MAC /*************************************************************************** Draw the size box icon. ***************************************************************************/ void WSB::Draw(PGNV pgnv, RC *prcClip) { HWND hwnd; RC rc; hwnd = PgobPar()->Hwnd(); Assert(hwnd != hNil, "hwnd nil"); GetRcVis(&rc, cooLocal); if (pgnv->Pgpt() == Pgpt()) { pgnv->ClipRc(&rc); pgnv->Set(); DrawGrowIcon(&hwnd->port); pgnv->Restore(); } else { GNV gnv(this); gnv.ClipRc(&rc); gnv.Set(); DrawGrowIcon(&hwnd->port); gnv.Restore(); pgnv->CopyPixels(&gnv, &rc, &rc); } } /*************************************************************************** The hwnd has been activated or deactivated - redraw and validate. ***************************************************************************/ void WSB::_ActivateHwnd(bool fActive) { ValidRc(pvNil, kginDraw); InvalRc(pvNil, kginDraw); } #endif // MAC ================================================ FILE: kauai/src/ctl.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Standard controls (scroll bars, etc). ***************************************************************************/ #ifndef CTL_H #define CTL_H #ifdef WIN typedef HWND HCTL; #elif defined(MAC) typedef ControlHandle HCTL; #endif // MAC // general control typedef class CTL *PCTL; #define CTL_PAR GOB #define kclsCTL 'CTL' class CTL : public CTL_PAR { RTCLASS_DEC private: HCTL _hctl; protected: CTL(PGCB pgcb); ~CTL(void); virtual void _NewRc(void); HCTL _Hctl(void) { return _hctl; } bool _FSetHctl(HCTL hctl); public: static PCTL PctlFromHctl(HCTL hctl); #ifdef MAC virtual void Draw(PGNV pgnv, RC *prcClip); #endif // MAC }; // scroll bar enum { fscbNil = 0, fscbVert = 1, fscbHorz = 2, fscbStandardRc = 4, // These are for GetStandardRc and GetClientRc. They indicate that // the controls should not hide the indicated edge (ie, the edge should // be just inside the parent's rectangle). fscbShowLeft = 16, fscbShowRight = 32, fscbShowTop = 64, fscbShowBottom = 128 }; #define kgrfscbShowHorz (fscbShowLeft | fscbShowRight) #define kgrfscbShowVert (fscbShowTop | fscbShowBottom) #define kgrfscbShowAll (kgrfscbShowHorz | kgrfscbShowVert) // scroll action enum { scaNil, scaPageUp, scaPageDown, scaLineUp, scaLineDown, scaToVal, }; typedef class SCB *PSCB; #define SCB_PAR CTL #define kclsSCB 'SCB' class SCB : public SCB_PAR { RTCLASS_DEC private: long _val; long _valMin; long _valMax; bool _fVert : 1; #ifdef WIN bool _fSentEndScroll : 1; #endif // WIN protected: SCB(PGCB pgcb) : CTL(pgcb) { } bool _FCreate(long val, long valMin, long valMax, ulong grfscb); #ifdef MAC virtual void _ActivateHwnd(bool fActive); #endif // MAC public: static long DxpNormal(void); static long DypNormal(void); static void GetStandardRc(ulong grfscb, RC *prcAbs, RC *prcRel); static void GetClientRc(ulong grfscb, RC *prcAbs, RC *prcRel); static PSCB PscbNew(PGCB pgcb, ulong grfscb, long val = 0, long valMin = 0, long valMax = 0); void SetVal(long val, bool fRedraw = fTrue); void SetValMinMax(long val, long valMin, long valMax, bool fRedraw = fTrue); long Val(void) { return _val; } long ValMin(void) { return _valMin; } long ValMax(void) { return _valMax; } #ifdef MAC virtual void MouseDown(long xp, long yp, long cact, ulong grfcust); #endif // MAC #ifdef WIN virtual void TrackScroll(long sb, long lwVal); #endif // WIN }; // size box typedef class WSB *PWSB; #define WSB_PAR CTL #define kclsWSB 'WSB' class WSB : public WSB_PAR { RTCLASS_DEC protected: WSB(PGCB pgcb) : CTL(pgcb) { } #ifdef MAC virtual void _ActivateHwnd(bool fActive); #endif // MAC public: static PWSB PwsbNew(PGOB pgob, ulong grfgob); #ifdef MAC virtual void Draw(PGNV pgnv, RC *prcClip); #endif // MAC }; #endif //! CTL_H ================================================ FILE: kauai/src/cursor.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Cursor class. ***************************************************************************/ #include "frame.h" ASSERTNAME RTCLASS(CURS) /*************************************************************************** Destructor for the cursor class. ***************************************************************************/ CURS::~CURS(void) { #ifdef WIN if (hNil != _hcrs) DestroyCursor(_hcrs); #endif // WIN } /*************************************************************************** Read a cursor out of a CRF. ***************************************************************************/ bool CURS::FReadCurs(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb) { PGG pggcurf; long icurf, icurfBest; CURF curf; short bo; long dxp, dyp, dzpT; long dzpBest; long cbRowDst, cbRowSrc, cbT; byte *prgb, *qrgb; PCURS pcurs = pvNil; *pcb = size(CURS); if (pvNil == ppbaco) return fTrue; if (pvNil == (pggcurf = GG::PggRead(pblck, &bo)) || pggcurf->IvMac() == 0) { ReleasePpo(&pggcurf); return fFalse; } #ifdef MAC dxp = dyp = 16; #endif // MAC #ifdef WIN dxp = GetSystemMetrics(SM_CXCURSOR); dyp = GetSystemMetrics(SM_CYCURSOR); #endif // WIN icurfBest = 0; dzpBest = klwMax; for (icurf = 0; icurf < pggcurf->IvMac(); icurf++) { pggcurf->GetFixed(icurf, &curf); if (kboOther == bo) SwapBytesBom(&curf, kbomCurf); if (curf.dxp > dxp || curf.dyp > dyp || curf.curt != curtMonochrome || pggcurf->Cb(icurf) != (long)curf.dxp * curf.dyp / 4) { continue; } dzpT = (dxp - curf.dxp) + (dyp - curf.dyp); if (dzpBest > dzpT) { icurfBest = icurf; if (dzpT == 0) break; dzpBest = dzpT; } } AssertIn(icurfBest, 0, pggcurf->IvMac()); pggcurf->GetFixed(icurfBest, &curf); if (kboOther == bo) SwapBytesBom(&curf, kbomCurf); cbRowSrc = LwRoundAway(LwDivAway(curf.dxp, 8), 2); cbRowDst = LwRoundAway(LwDivAway(dxp, 8), 2); if (!FAllocPv((void **)&prgb, LwMul(cbRowDst, 2 * dyp), fmemClear, mprNormal)) goto LFail; if (pvNil == (pcurs = NewObj CURS)) goto LFail; FillPb(prgb, LwMul(cbRowDst, dyp), 0xFF); qrgb = (byte *)pggcurf->QvGet(icurfBest); cbT = LwMin(cbRowSrc, cbRowDst); for (dzpT = LwMin(dyp, curf.dyp); dzpT-- > 0;) { CopyPb(qrgb + LwMul(dzpT, cbRowSrc), prgb + LwMul(dzpT, cbRowDst), cbT); CopyPb(qrgb + LwMul(curf.dyp + dzpT, cbRowSrc), prgb + LwMul(dyp + dzpT, cbRowDst), cbT); } #ifdef WIN pcurs->_hcrs = CreateCursor(vwig.hinst, curf.xp, curf.yp, dxp, dyp, prgb, prgb + LwMul(dxp, cbRowDst)); if (hNil == pcurs->_hcrs) ReleasePpo(&pcurs); #endif // WIN #ifdef MAC Assert(dxp == 16, 0); long *plwAnd, *plwXor; long ilw; plwAnd = (long *)prgb; plwXor = plwAnd + 8; pcurs->_crs.hotSpot.h = curf.xp; pcurs->_crs.hotSpot.v = curf.yp; for (ilw = 0; ilw < 8; ilw++) { ((long *)pcurs->_crs.mask)[ilw] = ~*plwAnd; ((long *)pcurs->_crs.data)[ilw] = ~*plwAnd++ ^ *plwXor++; } #endif // MAC LFail: FreePpv((void **)&prgb); ReleasePpo(&pggcurf); *ppbaco = pcurs; return pvNil != pcurs; } /*************************************************************************** Set the cursor. ***************************************************************************/ void CURS::Set(void) { #ifdef WIN SetCursor(_hcrs); #endif // WIN #ifdef MAC SetCursor(&_crs); #endif // MAC } ================================================ FILE: kauai/src/cursor.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Cursor class. ***************************************************************************/ #ifndef CURSOR_H #define CURSOR_H enum { curtMonochrome = 0, }; // cursor on file - stored in a GG with the rgb's in the variable part struct CURF { long curt; // type of cursor byte xp; // hot spot byte yp; byte dxp; // size - either 16 or 32 and they should match byte dyp; // byte rgbAnd[]; // byte rgbXor[]; }; const BOM kbomCurf = 0xC0000000; typedef class CURS *PCURS; #define CURS_PAR BACO #define kclsCURS 'CURS' class CURS : public CURS_PAR { RTCLASS_DEC private: protected: #ifdef WIN HCRS _hcrs; #endif // WIN #ifdef MAC Cursor _crs; #endif // MAC CURS(void) { } // we have to be allocated ~CURS(void); public: static bool FReadCurs(PCRF pcrf, CTG ctg, CNO cno, BLCK *pblck, PBACO *ppbaco, long *pcb); void Set(void); }; #endif //! CURSOR_H ================================================ FILE: kauai/src/debug.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Debug routines. ***************************************************************************/ #ifndef DEBUG_H #define DEBUG_H #ifdef WIN inline void Debugger(void) { __asm { int 3 } } #endif // WIN #ifdef DEBUG bool FAssertProc(schar *pszsFile, long lwLine, schar *pszsMsg, void *pv, long cb); void WarnProc(schar *pszsFile, long lwLine, schar *pszsMsg); #define ASSERTNAME static schar __szsFile[] = __FILE__; #define AssertCore(f, szs, pv, cb) \ if (!(f) && FAssertProc(__szsFile, __LINE__, (schar *)szs, pv, cb)) \ Debugger(); \ else \ (void)(0) #define Warn(szs) WarnProc(__szsFile, __LINE__, (schar *)szs) #define Bug(szs) AssertCore(fFalse, szs, 0, 0) #define Assert(f, szs) AssertCore(f, szs, 0, 0) #define AssertVar(f, szs, pvar) AssertCore(f, szs, pvar, size(*(pvar))) #define BugVar(szs, pvar) AssertVar(fFalse, szs, pvar) #define AssertDo(f, szs) Assert(f, szs) #define AssertDoVar(f, szs, pvar) AssertVar(f, szs, pvar) #define AssertDoCore(f, szs, pv, cb) AssertCore(f, szs, pv, cb) #define Debug(foo) foo #define DebugShip(dbg, shp) dbg // these Asserts are for use in a header file #define AssertH(f) \ if (!(f) && FAssertProc(pvNil, __LINE__, pvNil, pvNil, 0)) \ Debugger(); \ else \ (void)(0) #define BugH() AssertH(fFalse) #else //! DEBUG #define ASSERTNAME #define Debugger() #define Warn(szs) #define Bug(szs) #define Assert(f, szs) #define AssertVar(f, szs, pvar) #define BugVar(szs, pvar) #define AssertCore(f, szs, pv, cb) #define AssertDo(f, szs) (f) #define AssertDoVar(f, szs, pvar) (f) #define AssertDoCore(f, szs, pv, cb) (f) #define Debug(foo) #define DebugShip(dbg, shp) shp #define AssertH(f) #endif //! DEBUG #define RawRtn() Bug("Unimplemented Code") #define NewCode() Bug("Untested Code") #endif //! DEBUG_H ================================================ FILE: kauai/src/dlg.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Standard dialogs. ***************************************************************************/ #include "frame.h" ASSERTNAME RTCLASS(DLG) /*************************************************************************** Constructor for a dialog object. ***************************************************************************/ DLG::DLG(long rid) : GG(size(DIT)) { _rid = rid; } /*************************************************************************** Static method to create a new DLG. Does NewObj then calls _FInit. ***************************************************************************/ PDLG DLG::PdlgNew(long rid, PFNDLG pfn, void *pv) { PDLG pdlg; if ((pdlg = NewObj DLG(rid)) == pvNil) return pvNil; pdlg->_pfn = pfn; pdlg->_pv = pv; if (!pdlg->_FInit()) ReleasePpo(&pdlg); return pdlg; } /*************************************************************************** Get the values for [iditMin, iditLim) from the actual dialog and put them in the GGDIT. ***************************************************************************/ bool DLG::FGetValues(long iditMin, long iditLim) { AssertThis(0); long idit; DIT dit; long lw; STN stn; AssertIn(iditMin, 0, iditLim); if (_pgob == pvNil) { Bug("why are you calling this when the dialog doesn't exist?"); return fFalse; } iditLim = LwMin(iditLim, IvMac()); for (idit = iditMin; idit < iditLim; idit++) { GetDit(idit, &dit); switch (dit.ditk) { case ditkCheckBox: lw = _FGetCheckBox(idit); goto LPutLw; case ditkRadioGroup: lw = _LwGetRadioGroup(idit); LPutLw: PutRgb(idit, 0, size(lw), &lw); break; case ditkEditText: case ditkCombo: _GetEditText(idit, &stn); if (!FPutStn(idit, &stn)) return fFalse; break; } } return fTrue; } /*************************************************************************** Set the values for [iditMin, iditLim) from the GGDIT into the actual dialog. ***************************************************************************/ void DLG::SetValues(long iditMin, long iditLim) { AssertThis(0); long idit; DIT dit; STN stn; long lw; long cb, cbT, ib; byte *prgb; if (_pgob == pvNil) { Bug("why are you calling this when the dialog doesn't exist?"); return; } iditLim = LwMin(iditLim, IvMac()); for (idit = iditMin; idit < iditLim; idit++) { GetDit(idit, &dit); switch (dit.ditk) { case ditkCheckBox: GetRgb(idit, 0, size(lw), &lw); _SetCheckBox(idit, lw); break; case ditkRadioGroup: GetRgb(idit, 0, size(lw), &lw); _SetRadioGroup(idit, lw); break; case ditkEditText: GetStn(idit, &stn); _SetEditText(idit, &stn); break; case ditkCombo: _ClearList(idit); cb = Cb(idit); if (cb <= 0) { stn.SetNil(); _SetEditText(idit, &stn); break; } prgb = (byte *)PvLock(idit); if (!stn.FSetData(prgb, cb, &cbT)) { Bug("bad combo item"); cbT = cb; } _SetEditText(idit, &stn); for (ib = cbT; ib < cb;) { if (!stn.FSetData(prgb + ib, cb - ib, &cbT)) { BugVar("bad combo item", &ib); break; } ib += cbT; _FAddToList(idit, &stn); } Unlock(); break; } } } /*************************************************************************** Get the item number from a system item number. ***************************************************************************/ long DLG::IditFromSit(long sit) { long idit; DIT dit; for (idit = IvMac(); idit-- != 0;) { GetDit(idit, &dit); if (sit >= dit.sitMin && sit < dit.sitLim) return idit; } return ivNil; } /*************************************************************************** Calls the PFNDLG (if not nil) to notify of a change. PFNDLG should return true if the dialog should be dismissed. The PFNDLG is free to change *pidit. If a nil PFNDLG was specified (in PdlgNew), this returns true (dismisses the dialog) on any button hit. ***************************************************************************/ bool DLG::_FDitChange(long *pidit) { if (pvNil == _pfn) { DIT dit; if (ivNil == *pidit) return fFalse; GetDit(*pidit, &dit); return dit.ditk == ditkButton; } return (*_pfn)(this, pidit, _pv); } /*************************************************************************** Get the stn (for an edit item). ***************************************************************************/ void DLG::GetStn(long idit, PSTN pstn) { AssertThis(0); AssertIn(idit, 0, IvMac()); AssertPo(pstn, 0); long cb; #ifdef DEBUG DIT dit; GetDit(idit, &dit); Assert(ditkEditText == dit.ditk || dit.ditk == ditkCombo, "not a text item or combo"); #endif // DEBUG cb = Cb(idit); if (cb <= 0) pstn->SetNil(); else { AssertDo(pstn->FSetData(PvLock(idit), cb, &cb), 0); Unlock(); } } /*************************************************************************** Put the stn into the DLG. ***************************************************************************/ bool DLG::FPutStn(long idit, PSTN pstn) { AssertThis(0); AssertIn(idit, 0, IvMac()); AssertPo(pstn, 0); DIT dit; long cbOld, cbNew; GetDit(idit, &dit); cbOld = Cb(idit); cbNew = pstn->CbData(); switch (dit.ditk) { default: Bug("not a text item or combo"); return fFalse; case ditkEditText: if (cbOld != cbNew && !FPut(idit, cbNew, pvNil)) return fFalse; break; case ditkCombo: if (cbOld > 0) { STN stn; if (!stn.FSetData(PvLock(idit), cbOld, &cbOld)) { Bug("why did setting the data fail?"); cbOld = Cb(idit); } Unlock(); } if (cbOld > cbNew) DeleteRgb(idit, 0, cbOld - cbNew); else if (cbOld < cbNew && !FInsertRgb(idit, 0, cbNew - cbOld, pvNil)) return fFalse; break; } pstn->GetData(PvLock(idit)); Unlock(); return fTrue; } /*************************************************************************** Get the value of a radio group. ***************************************************************************/ long DLG::LwGetRadio(long idit) { AssertThis(0); AssertIn(idit, 0, IvMac()); long lw; #ifdef DEBUG DIT dit; GetDit(idit, &dit); Assert(ditkRadioGroup == dit.ditk, "not a radio group"); #endif // DEBUG GetRgb(idit, 0, size(long), &lw); return lw; } /*************************************************************************** Set the value of the radio group. ***************************************************************************/ void DLG::PutRadio(long idit, long lw) { AssertThis(0); AssertIn(idit, 0, IvMac()); #ifdef DEBUG DIT dit; GetDit(idit, &dit); Assert(ditkRadioGroup == dit.ditk, "not a radio group"); AssertIn(lw, 0, dit.sitLim - dit.sitMin); #endif // DEBUG PutRgb(idit, 0, size(long), &lw); } /*************************************************************************** Get the value of a check box. ***************************************************************************/ bool DLG::FGetCheck(long idit) { AssertThis(0); AssertIn(idit, 0, IvMac()); long lw; #ifdef DEBUG DIT dit; GetDit(idit, &dit); Assert(ditkCheckBox == dit.ditk, "not a check box"); #endif // DEBUG GetRgb(idit, 0, size(long), &lw); return lw; } /*************************************************************************** Set the value of a check box item. ***************************************************************************/ void DLG::PutCheck(long idit, bool fOn) { AssertThis(0); AssertIn(idit, 0, IvMac()); long lw; #ifdef DEBUG DIT dit; GetDit(idit, &dit); Assert(ditkCheckBox == dit.ditk, "not a check box"); #endif // DEBUG lw = FPure(fOn); PutRgb(idit, 0, size(long), &lw); } /*************************************************************************** Get the indicated edit item from the dialog and convert it to a long. If the string is empty, sets *plw to zero and sets *pfEmpty (if pfEmpty is not nil) and returns false. If the string doesn't parse as a number, returns false. ***************************************************************************/ bool DLG::FGetLwFromEdit(long idit, long *plw, bool *pfEmpty) { AssertThis(0); AssertVarMem(plw); AssertNilOrVarMem(pfEmpty); STN stn; GetStn(idit, &stn); if (0 == stn.Cch()) { if (pvNil != pfEmpty) *pfEmpty = fTrue; *plw = 0; return fFalse; } if (pvNil != pfEmpty) *pfEmpty = fFalse; if (!stn.FGetLw(plw, 0)) { TrashVar(plw); return fFalse; } return fTrue; } /*************************************************************************** Put the long into the indicated edit item (in decimal). ***************************************************************************/ bool DLG::FPutLwInEdit(long idit, long lw) { AssertThis(0); STN stn; stn.FFormatSz(PszLit("%d"), lw); return FPutStn(idit, &stn); } /*************************************************************************** Add the string to the given list item. ***************************************************************************/ bool DLG::FAddToList(long idit, PSTN pstn) { AssertThis(0); long cb, cbTot; #ifdef DEBUG DIT dit; GetDit(idit, &dit); Assert(ditkCombo == dit.ditk, "not a combo"); #endif // DEBUG cbTot = Cb(idit); if (cbTot == 0) { STN stn; stn.SetNil(); if (!FPut(idit, cbTot = stn.CbData(), pvNil)) return fFalse; stn.GetData(PvLock(idit)); Unlock(); } cb = pstn->CbData(); if (!FInsertRgb(idit, cbTot, cb, pvNil)) return fFalse; pstn->GetData(PvAddBv(PvLock(idit), cbTot)); Unlock(); return fTrue; } /*************************************************************************** Empty the list of options for the list item. ***************************************************************************/ void DLG::ClearList(long idit) { AssertThis(0); AssertIn(idit, 0, IvMac()); long cbOld, cbNew; STN stn; #ifdef DEBUG DIT dit; GetDit(idit, &dit); Assert(ditkCombo == dit.ditk, "not a combo"); #endif // DEBUG cbOld = Cb(idit); if (cbOld <= 0) return; if (!stn.FSetData(PvLock(idit), cbOld, &cbNew)) { Bug("why did setting the data fail?"); cbNew = 0; } Unlock(); if (cbOld > cbNew) DeleteRgb(idit, cbNew, cbOld - cbNew); } ================================================ FILE: kauai/src/dlg.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Dialog header file. ***************************************************************************/ #ifndef DLG_H #define DLG_H #ifdef MAC typedef DialogPtr HDLG; #endif // MAC #ifdef WIN typedef HWND HDLG; #endif // WIN // type of dialog item enum { ditkButton, // no value ditkCheckBox, // long (bool) ditkRadioGroup, // long (index) ditkEditText, // streamed stn ditkCombo, // streamed stn, followed by a list of streamed stn's. ditkLim }; // dialog item struct DIT { long sitMin; // first system item number (for this DIT) long sitLim; // lim of system item numbers (for this DIT) long ditk; // kind of item }; typedef class DLG *PDLG; // callback to notify of an item change (while the dialog is active) typedef bool (*PFNDLG)(PDLG pdlg, long *pidit, void *pv); // dialog class - a DLG is a GG of DITs #define DLG_PAR GG #define kclsDLG 'DLG' class DLG : public DLG_PAR { RTCLASS_DEC private: PGOB _pgob; long _rid; PFNDLG _pfn; void *_pv; #ifdef WIN friend BOOL CALLBACK _FDlgCore(HWND hdlg, UINT msg, WPARAM w, LPARAM lw); #endif // WIN DLG(long rid); bool _FInit(void); long _LwGetRadioGroup(long idit); void _SetRadioGroup(long idit, long lw); bool _FGetCheckBox(long idit); void _InvertCheckBox(long idit); void _SetCheckBox(long idit, bool fOn); void _GetEditText(long idit, PSTN pstn); void _SetEditText(long idit, PSTN pstn); bool _FDitChange(long *pidit); bool _FAddToList(long idit, PSTN pstn); void _ClearList(long idit); public: static PDLG PdlgNew(long rid, PFNDLG pfn = pvNil, void *pv = pvNil); long IditDo(long iditFocus = ivNil); // these are only valid while the dialog is up bool FGetValues(long iditMin, long iditLim); void SetValues(long iditMin, long iditLim); void SelectDit(long idit); // argument access long IditFromSit(long sit); void GetDit(long idit, DIT *pdit) { GetFixed(idit, pdit); } void PutDit(long idit, DIT *pdit) { PutFixed(idit, pdit); } void GetStn(long idit, PSTN pstn); bool FPutStn(long idit, PSTN pstn); long LwGetRadio(long idit); void PutRadio(long idit, long lw); bool FGetCheck(long idit); void PutCheck(long idit, bool fOn); bool FGetLwFromEdit(long idit, long *plw, bool *pfEmpty = pvNil); bool FPutLwInEdit(long idit, long lw); bool FAddToList(long idit, PSTN pstn); void ClearList(long idit); }; #endif //! DLG_H ================================================ FILE: kauai/src/dlgmac.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Mac standard dialogs. ***************************************************************************/ #include "frame.h" ASSERTNAME // REVIEW shonk: implement combo items. /*************************************************************************** Read the dialog resource and construct the GGDIT. ***************************************************************************/ bool DLG::_FInit(void) { HN hn; short ridDitl; long sit, sitLim; long idit; byte bState; byte *pbDitl; byte bType; long cbEntry; DIT dit; bool fAddDit; bool fRet = fFalse; if ((hn = (HN)GetResource('DLOG', (short)_rid)) == hNil) { PushErc(ercDlgCantFind); return fFalse; } // get the rid of the DITL resource ridDitl = (*(short **)hn)[9]; if ((hn = GetResource('DITL', ridDitl)) == hNil) { PushErc(ercDlgCantFind); return fFalse; } // lock the DITL so it doesn't move and so it isn't purged while // we're looking at it. bState = HGetState(hn); HLock(hn); pbDitl = *(byte **)hn; /*********************************************************************** This info comes from New Inside Macintosh - Toolbox Essentials, pages 6-152 to 6-156. A DITL is a group of items preceeded by a short containing the number of items - 1. Each item contains: 4 bytes of reserved info 8 bytes for a bounding rectangle 1 byte for the item type and enable flag The remaining data in the item depends on the type of item. For Buttons(4), checkboxes(5), radio buttons(6), static text(8) and editable text items(16), the item data continues with: 1 - 256 bytes (variable) - an st containing the name 0 or 1 byte alignment (to a short word) For compiled controls(7), icons(32) and pictures(64): 1 byte reserved 2 bytes resource number For application defined items(0): 1 byte reserved For Help items(1): 1 byte size - 4 or 6 (so we don't have to use the help item type) 2 byte help item type 2 byte resource number 0 or 2 bytes for an item number (2 bytes if help item type is 8, otherwise 0 bytes) For other values of the item type, we assert and bag out. ***********************************************************************/ // get the lim of system items (they start at 1) and grow the GGDIT // to a reasonable size sitLim = (*(short *)pbDitl) + 2; pbDitl += size(short); if (!FEnsureSpace(sitLim, size(long), fgrpNil)) goto LFail; // look at the items in the DITL for (idit = 0, sit = 1; sit < sitLim; sit++) { // skip the reserved bytes and rectangle pbDitl += 12; // the high bit is an enble bit, so mask it off bType = *pbDitl & 0x7F; pbDitl++; fAddDit = fFalse; switch (bType) { default: Bug("unkown item in DITL resource"); goto LFail; case btnCtrl + ctrlItem: // button dit.ditk = ditkButton; cbEntry = 0; fAddDit = fTrue; goto LSkipSt; case chkCtrl + ctrlItem: // check box dit.ditk = ditkCheckBox; cbEntry = size(long); fAddDit = fTrue; goto LSkipSt; case radCtrl + ctrlItem: // radio button // if the last item added was a radio group, add this button to // the group, otherwise create a new radio group if (idit > 0) { GetDit(idit - 1, &dit); if (dit.ditk == ditkRadioGroup && dit.sitLim == sit) { dit.sitLim++; PutDit(idit - 1, &dit); goto LSkipSt; } } dit.ditk = ditkRadioGroup; cbEntry = size(long); fAddDit = fTrue; goto LSkipSt; case statText: // static text item goto LSkipSt; case editText: // edit item dit.ditk = ditkEditText; cbEntry = kcbMaxStz - kcchMaxStz; fAddDit = fTrue; LSkipSt: pbDitl += CbSt((achar *)pbDitl); if ((long)pbDitl & 1) pbDitl++; break; case 7: // control case iconItem: // icon case picItem: // picture pbDitl += 3; break; case userItem: // app defined pbDitl += 1; break; case 1: // help item pbDitl += CbSt((achar *)pbDitl); break; } if (fAddDit) { Assert(cbEntry >= 0, 0); dit.sitMin = sit; dit.sitLim = sit + 1; if (!FInsert(idit, cbEntry, pvNil, &dit)) goto LFail; // zero the extra data if (cbEntry > 0) ClearPb(QvGet(idit), cbEntry); idit++; } } FEnsureSpace(0, 0, fgrpShrink); fRet = fTrue; LFail: HSetState(hn, bState); if (!fRet) PushErc(ercDlgOom); return fRet; } /*************************************************************************** Actually put up the dialog and don't return until it comes down. Returns the idit that dismissed the dialog. Returns ivNil on failure. ***************************************************************************/ long DLG::IditDo(long iditFocus) { HDLG hdlg; DIT dit; short swHit; long idit = ivNil; if ((hdlg = GetNewDialog((short)_rid, pvNil, (PPRT)-1L)) == pvNil) { PushErc(ercDlgOom); goto LDone; } if (pvNil == (_pgob = NewObj GOB(khidDialog))) { PushErc(ercDlgOom); goto LDone; } if (!_pgob->FAttachHwnd((HWND)hdlg)) { PushErc(ercDlgOom); goto LDone; } SetValues(0, IvMac()); ShowWindow(hdlg); if (ivNil != iditFocus) SelectDit(iditFocus); for (;;) { ModalDialog(pvNil, &swHit); if ((idit = IditFromSit((long)swHit)) == ivNil) continue; GetDit(idit, &dit); switch (dit.ditk) { default: continue; case ditkButton: break; case ditkCheckBox: // invert it _InvertCheckBox(idit); break; case ditkRadioGroup: // set the value to swHit - dit.sitMin _SetRadioGroup(idit, (long)swHit - dit.sitMin); break; } if (_FDitChange(&idit)) break; } LDone: if (hdlg != hNil) { if (_pgob != pvNil) { if (idit != ivNil && !FGetValues(0, IvMac())) { PushErc(ercDlgCantGetArgs); idit = ivNil; } _pgob->FAttachHwnd(hNil); _pgob->Release(); _pgob = pvNil; } DisposeDialog(hdlg); } return idit; } /*************************************************************************** Get the value of a radio group. ***************************************************************************/ long DLG::_LwGetRadioGroup(long idit) { HDLG hdlg; DIT dit; short sitk; HCTL hctl; RCS rcs; long sit; GetDit(idit, &dit); hdlg = (HDLG)_pgob->Hwnd(); Assert(hdlg != hNil, "no dialog!"); Assert(dit.ditk == ditkRadioGroup, "not a radio group!"); for (sit = dit.sitMin; sit < dit.sitLim; sit++) { GetDialogItem(hdlg, (short)sit, &sitk, (HN *)&hctl, &rcs); Assert(sitk == (radCtrl + ctrlItem), "not a radio button!"); if (GetCtlValue(hctl)) return sit - dit.sitMin; } Bug("no radio button set"); return dit.sitLim - dit.sitMin; } /*************************************************************************** Change a radio group value. ***************************************************************************/ void DLG::_SetRadioGroup(long idit, long lw) { HDLG hdlg; DIT dit; short sitk; HCTL hctl; RCS rcs; long sit; short swT; GetDit(idit, &dit); hdlg = (HDLG)_pgob->Hwnd(); Assert(hdlg != hNil, "no dialog!"); Assert(dit.ditk == ditkRadioGroup, "not a radio group!"); AssertIn(lw, 0, dit.sitLim - dit.sitMin); GNV gnv(_pgob); gnv.Set(); for (sit = dit.sitMin; sit < dit.sitLim; sit++) { GetDialogItem(hdlg, (short)sit, &sitk, (HN *)&hctl, &rcs); Assert(sitk == (radCtrl + ctrlItem), "not a radio button!"); swT = GetCtlValue(hctl); // set the value if (swT) { if (sit - dit.sitMin != lw) SetCtlValue(hctl, 0); } else { if (sit - dit.sitMin == lw) SetCtlValue(hctl, 1); } } gnv.Restore(); } /*************************************************************************** Returns the current value of a check box. ***************************************************************************/ bool DLG::_FGetCheckBox(long idit) { HDLG hdlg; DIT dit; short sitk; HCTL hctl; RCS rcs; GetDit(idit, &dit); hdlg = (HDLG)_pgob->Hwnd(); Assert(hdlg != hNil, "no dialog!"); Assert(dit.ditk == ditkCheckBox, "not a check box!"); Assert(dit.sitLim == dit.sitMin + 1, "wrong lim on check box"); GetDialogItem(hdlg, (short)dit.sitMin, &sitk, (HN *)&hctl, &rcs); Assert(sitk == (chkCtrl + ctrlItem), "not a check box!"); return FPure(GetCtlValue(hctl)); } /*************************************************************************** Invert the value of a check box. ***************************************************************************/ void DLG::_InvertCheckBox(long idit) { _SetCheckBox(idit, !_FGetCheckBox(idit)); } /*************************************************************************** Set the value of a check box. ***************************************************************************/ void DLG::_SetCheckBox(long idit, bool fOn) { HDLG hdlg; DIT dit; short sitk; HCTL hctl; RCS rcs; short swT; GetDit(idit, &dit); hdlg = (HDLG)_pgob->Hwnd(); Assert(hdlg != hNil, "no dialog!"); Assert(dit.ditk == ditkCheckBox, "not a check box!"); Assert(dit.sitLim == dit.sitMin + 1, "wrong lim on check box"); GNV gnv(_pgob); gnv.Set(); GetDialogItem(hdlg, (short)dit.sitMin, &sitk, (HN *)&hctl, &rcs); Assert(sitk == (chkCtrl + ctrlItem), "not a check box!"); swT = GetCtlValue(hctl); if (FPure(swT) != FPure(fOn)) SetCtlValue(hctl, FPure(fOn)); gnv.Restore(); } /*************************************************************************** Get the text from an edit control. ***************************************************************************/ void DLG::_GetEditText(long idit, PSTZ pstz) { HDLG hdlg; DIT dit; short sitk; HN hn; RCS rcs; GetDit(idit, &dit); hdlg = (HDLG)_pgob->Hwnd(); Assert(hdlg != hNil, "no dialog!"); Assert(dit.ditk == ditkEditText, "not edit item!"); Assert(dit.sitLim == dit.sitMin + 1, "wrong lim on edit item"); GetDialogItem(hdlg, (short)dit.sitMin, &sitk, &hn, &rcs); AssertVar(sitk == editText, "not an edit item!", &sitk); GetDialogItemText(hn, (byte *)pstz); StToStz(pstz); } /*************************************************************************** Set the text in an edit control. ***************************************************************************/ void DLG::_SetEditText(long idit, PSTZ pstz) { HDLG hdlg; DIT dit; short sitk; HN hn; RCS rcs; GetDit(idit, &dit); hdlg = (HDLG)_pgob->Hwnd(); Assert(hdlg != hNil, "no dialog!"); Assert(dit.ditk == ditkEditText, "not edit item!"); Assert(dit.sitLim == dit.sitMin + 1, "wrong lim on edit item"); GNV gnv(_pgob); gnv.Set(); GetDialogItem(hdlg, (short)dit.sitMin, &sitk, &hn, &rcs); AssertVar(sitk == editText, "not an edit item!", &sitk); SetDialogItemText(hn, (byte *)pstz); gnv.Restore(); } /*************************************************************************** Make the given item the "focused" item and select its contents. The item should be a text item. ***************************************************************************/ void DLG::SelectDit(long idit) { HDLG hdlg; DIT dit; if (hNil == (hdlg = (HDLG)_pgob->Hwnd())) goto LBug; GetDit(idit, &dit); if (dit.ditk != ditkEditText) { LBug: Bug("bad call to DLG::SelectDit"); return; } Assert(dit.sitLim == dit.sitMin + 1, "wrong lim on edit item"); SelIText(hdlg, (short)dit.sitMin, 0, kswMax); } ================================================ FILE: kauai/src/dlgwin.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Standard dialogs. ***************************************************************************/ #include "frame.h" ASSERTNAME // dialog init structure struct DLGI { PDLG pdlg; long iditFocus; }; achar _szDlgProp[] = PszLit("DLG"); /*************************************************************************** Read the dialog resource and construct the GGDIT. The dialog resource consists of: DLGTEMPLATE structure (0xFFFF, 2-byte value) or unicode string specifying the menu (0xFFFF, 2-byte value) or unicode string specifying the class unicode string for the title The following fields only exist if the dialog has the DS_SETFONT style: 2-byte value specifying the font size unicode string specifying the font Next comes: 0-2 bytes align to dword For each dialog item the resource contains: DLGITEMTEMPLATE structure (0xFFFF, 2-byte value) or unicode string specifying the class (0xFFFF, 2-byte value) or unicode string specifying the title ***************************************************************************/ bool DLG::_FInit(void) { HN hn; long cbEntry; long idit, csit; bool fAddDit; DIT dit; short *psw; short swClass; DLGTEMPLATE dtm; DLGITEMTEMPLATE ditm; bool fRet = fFalse; if ((hn = (HN)FindResource(vwig.hinst, MIR(_rid), RT_DIALOG)) == hNil || (hn = (HN)LoadResource(vwig.hinst, (HRSRC)hn)) == hNil || (psw = (short *)LockResource(hn)) == pvNil) { PushErc(ercDlgCantFind); return fFalse; } // get and skip the dtm dtm = *(DLGTEMPLATE *)psw; psw = (short *)PvAddBv(psw, size(dtm)); // get the number of items and ensure space in the GGDIT Assert(dtm.cdit > 0, "no items in this dialog"); if (!FEnsureSpace(dtm.cdit, size(long), fgrpNil)) goto LFail; // skip over the menu field if (*psw == -1) psw += 2; else { while (*psw++ != 0) ; } // skip over the class field if (*psw == -1) psw += 2; else { while (*psw++ != 0) ; } // skip over the title while (*psw++ != 0) ; if (dtm.style & DS_SETFONT) { // skip over the point size psw++; // skip over the font name while (*psw++ != 0) ; } // look at the items for (csit = dtm.cdit, idit = 0; csit > 0; csit--) { // align to dword if ((long)psw & 2) psw++; // get and skip the ditm ditm = *(DLGITEMTEMPLATE *)psw; psw = (short *)PvAddBv(psw, size(ditm)); // get and skip the class if (*psw == -1) { swClass = psw[1]; psw += 2; } else { swClass = 0; while (*psw++ != 0) ; } // skip the title if (*psw == -1) psw += 2; else { while (*psw++ != 0) ; } // the next word is a size of extra stuff psw = (short *)PvAddBv(psw, psw[0] + size(short)); // We should be at the end of this item (except for possible padding). // Now figure out what to do with the item. fAddDit = fTrue; switch (swClass) { default: fAddDit = fFalse; break; case 0x0080: // button, radio button or check box switch (ditm.style & 0x000F) { case 0: case 1: // button dit.ditk = ditkButton; cbEntry = 0; break; case 2: case 3: // check box dit.ditk = ditkCheckBox; cbEntry = size(long); break; case 4: case 9: // radio button // if the radio button has the WS_GROUP style or the last // dit is not a radio group, start a new group. if (!(ditm.style & WS_GROUP) && idit > 0) { GetDit(idit - 1, &dit); if (dit.ditk == ditkRadioGroup && dit.sitLim == ditm.id) { dit.sitLim++; PutDit(idit - 1, &dit); fAddDit = fFalse; break; } } // new group dit.ditk = ditkRadioGroup; cbEntry = size(long); break; default: fAddDit = fFalse; break; } break; case 0x0081: // edit item dit.ditk = ditkEditText; cbEntry = 0; break; case 0x0085: // combo item dit.ditk = ditkCombo; cbEntry = 0; break; } if (fAddDit) { Assert(cbEntry >= 0, 0); dit.sitMin = ditm.id; dit.sitLim = dit.sitMin + 1; if (!FInsert(idit, cbEntry, pvNil, &dit)) goto LFail; // zero the extra data if (cbEntry > 0) ClearPb(QvGet(idit), cbEntry); idit++; } } Assert(idit > 0, "no dits in this dialog"); FEnsureSpace(0, 0, fgrpShrink); fRet = fTrue; LFail: if (!fRet) PushErc(ercDlgOom); return fRet; } /*************************************************************************** Windows dialog proc. ***************************************************************************/ BOOL CALLBACK _FDlgCore(HWND hdlg, UINT msg, WPARAM w, LPARAM lw) { PDLG pdlg; DIT dit; long idit; RC rcDlg; RC rcDsp; // this may return nil pdlg = (PDLG)GetProp(hdlg, _szDlgProp); switch (msg) { case WM_SYSCOMMAND: if (w == SC_SCREENSAVE && pvNil != vpappb && !vpappb->FAllowScreenSaver()) { return fTrue; } break; case WM_INITDIALOG: DLGI *pdlgi; RCS rcs; // the pdlgi should be in the lParam pdlgi = (DLGI *)lw; pdlg = pdlgi->pdlg; AssertPo(pdlg, 0); // set the DLG property so we can find the pdlg easily if (!SetProp(hdlg, _szDlgProp, (HANDLE)pdlg)) goto LFail; // create a timer so we can do idle processing if (SetTimer(hdlg, (uint)hdlg, 10, pvNil) == 0) goto LFail; // create a container gob and attach the hdlg pdlg->_pgob = NewObj GOB(khidDialog); if (pdlg->_pgob == pvNil) goto LFail; if (!pdlg->_pgob->FAttachHwnd((HWND)hdlg)) { LFail: PushErc(ercDlgOom); idit = ivNil; goto LEndDialog; } // set the dialog values pdlg->SetValues(0, pdlg->IvMac()); if (ivNil != pdlgi->iditFocus) pdlg->SelectDit(pdlgi->iditFocus); GetWindowRect(hdlg, &rcs); rcDlg = rcs; rcDsp.Set(0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)); if (hNil != vwig.hwndApp) { RC rcApp; GetWindowRect(vwig.hwndApp, &rcs); rcApp = rcs; rcDlg.CenterOnRc(&rcApp); } else rcDlg.CenterOnRc(&rcDsp); rcDlg.PinToRc(&rcDsp); MoveWindow(hdlg, rcDlg.xpLeft, rcDlg.ypTop, rcDlg.Dxp(), rcDlg.Dyp(), fFalse); return ivNil == pdlgi->iditFocus; case WM_TIMER: if (pvNil == pdlg) break; idit = ivNil; if (pdlg->_FDitChange(&idit)) goto LEndDialog; break; case WM_COMMAND: if (pvNil == pdlg) break; if ((idit = pdlg->IditFromSit(GET_WM_COMMAND_ID(w, lw))) == ivNil) break; pdlg->GetDit(idit, &dit); switch (dit.ditk) { default: return fFalse; case ditkEditText: if (SwHigh(w) != EN_CHANGE) return fFalse; break; case ditkButton: case ditkCheckBox: case ditkRadioGroup: break; } if (pdlg->_FDitChange(&idit)) { LEndDialog: if (pdlg->_pgob != pvNil) { if (idit != ivNil && !pdlg->FGetValues(0, pdlg->IvMac())) idit = ivNil; pdlg->_pgob->FAttachHwnd(hNil); pdlg->_pgob->Release(); pdlg->_pgob = pvNil; } else idit = ivNil; // remove the pdlg property and kill the timer RemoveProp(hdlg, _szDlgProp); KillTimer(hdlg, (uint)hdlg); EndDialog(hdlg, idit); return fTrue; } break; } return fFalse; } /*************************************************************************** Actually put up the dialog and don't return until it comes down. Returns the idit that dismissed the dialog. Returns ivNil on failure. ***************************************************************************/ long DLG::IditDo(long iditFocus) { long idit; DLGI dlgi; dlgi.pdlg = this; dlgi.iditFocus = iditFocus; idit = DialogBoxParam(vwig.hinst, MIR(_rid), vwig.hwndApp, &_FDlgCore, (long)&dlgi); return idit; } /*************************************************************************** Make the given item the "focused" item and select its contents. The item should be a text item or combo item. ***************************************************************************/ void DLG::SelectDit(long idit) { HDLG hdlg; DIT dit; if (pvNil == _pgob || hNil == (hdlg = (HDLG)_pgob->Hwnd())) goto LBug; GetDit(idit, &dit); if (dit.ditk != ditkEditText && dit.ditk != ditkCombo) { LBug: Bug("bad call to DLG::SelectDit"); return; } Assert(dit.sitLim == dit.sitMin + 1, "wrong lim on edit item"); SetFocus(GetDlgItem(hdlg, dit.sitMin)); SendDlgItemMessage(hdlg, dit.sitMin, EM_SETSEL, GET_EM_SETSEL_MPS(0, -1)); } /*************************************************************************** Get the value of a radio group. ***************************************************************************/ long DLG::_LwGetRadioGroup(long idit) { HDLG hdlg; DIT dit; long sit; GetDit(idit, &dit); hdlg = (HDLG)_pgob->Hwnd(); Assert(hdlg != hNil, "no dialog!"); Assert(dit.ditk == ditkRadioGroup, "not a radio group!"); for (sit = dit.sitMin; sit < dit.sitLim; sit++) { if (IsDlgButtonChecked(hdlg, sit)) return sit - dit.sitMin; } Bug("no radio button set"); return dit.sitLim - dit.sitMin; } /*************************************************************************** Change a radio group value. ***************************************************************************/ void DLG::_SetRadioGroup(long idit, long lw) { HDLG hdlg; DIT dit; GetDit(idit, &dit); hdlg = (HDLG)_pgob->Hwnd(); Assert(hdlg != hNil, "no dialog!"); Assert(dit.ditk == ditkRadioGroup, "not a radio group!"); AssertIn(lw, 0, dit.sitLim - dit.sitMin); CheckRadioButton(hdlg, dit.sitMin, dit.sitLim - 1, dit.sitMin + lw); } /*************************************************************************** Returns the current value of a check box. ***************************************************************************/ bool DLG::_FGetCheckBox(long idit) { HDLG hdlg; DIT dit; GetDit(idit, &dit); hdlg = (HDLG)_pgob->Hwnd(); Assert(hdlg != hNil, "no dialog!"); Assert(dit.ditk == ditkCheckBox, "not a check box!"); Assert(dit.sitLim == dit.sitMin + 1, "wrong lim on check box"); return FPure(IsDlgButtonChecked(hdlg, dit.sitMin)); } /*************************************************************************** Invert the value of a check box. ***************************************************************************/ void DLG::_InvertCheckBox(long idit) { _SetCheckBox(idit, !_FGetCheckBox(idit)); } /*************************************************************************** Set the value of a check box. ***************************************************************************/ void DLG::_SetCheckBox(long idit, bool fOn) { HDLG hdlg; DIT dit; GetDit(idit, &dit); hdlg = (HDLG)_pgob->Hwnd(); Assert(hdlg != hNil, "no dialog!"); Assert(dit.ditk == ditkCheckBox, "not a check box!"); Assert(dit.sitLim == dit.sitMin + 1, "wrong lim on check box"); CheckDlgButton(hdlg, dit.sitMin, FPure(fOn)); } /*************************************************************************** Get the text from an edit control or combo. ***************************************************************************/ void DLG::_GetEditText(long idit, PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); HDLG hdlg; DIT dit; SZ sz; GetDit(idit, &dit); hdlg = (HDLG)_pgob->Hwnd(); Assert(hdlg != hNil, "no dialog!"); Assert(dit.ditk == ditkEditText || dit.ditk == ditkCombo, "not edit item or combo!"); Assert(dit.sitLim == dit.sitMin + 1, "wrong lim on item"); GetDlgItemText(hdlg, dit.sitMin, sz, kcchMaxSz); *pstn = sz; } /*************************************************************************** Set the text in an edit control or combo. ***************************************************************************/ void DLG::_SetEditText(long idit, PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); HDLG hdlg; DIT dit; GetDit(idit, &dit); hdlg = (HDLG)_pgob->Hwnd(); Assert(hdlg != hNil, "no dialog!"); Assert(dit.ditk == ditkEditText || dit.ditk == ditkCombo, "not edit item or combo!"); Assert(dit.sitLim == dit.sitMin + 1, "wrong lim on item"); SetDlgItemText(hdlg, dit.sitMin, pstn->Psz()); } /*************************************************************************** Add a string to a combo item. ***************************************************************************/ bool DLG::_FAddToList(long idit, PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); HDLG hdlg; HWND hwndCombo; DIT dit; GetDit(idit, &dit); hdlg = (HDLG)_pgob->Hwnd(); Assert(hdlg != hNil, "no dialog!"); Assert(dit.ditk == ditkCombo, "not combo!"); Assert(dit.sitLim == dit.sitMin + 1, "wrong lim on item"); if (hNil == (hwndCombo = GetDlgItem(hdlg, dit.sitMin))) { Warn("Couldn't get combo hwnd"); return fFalse; } return 0 <= (long)SendMessage(hwndCombo, CB_ADDSTRING, 0, (LPARAM)pstn->Psz()); } /*************************************************************************** Empty the list portion of the combo item. ***************************************************************************/ void DLG::_ClearList(long idit) { AssertThis(0); HDLG hdlg; HWND hwndCombo; DIT dit; GetDit(idit, &dit); hdlg = (HDLG)_pgob->Hwnd(); Assert(hdlg != hNil, "no dialog!"); Assert(dit.ditk == ditkCombo, "not combo!"); Assert(dit.sitLim == dit.sitMin + 1, "wrong lim on item"); if (hNil == (hwndCombo = GetDlgItem(hdlg, dit.sitMin))) { Warn("Couldn't get combo hwnd"); return; } SendMessage(hwndCombo, CB_RESETCONTENT, 0, 0); } ================================================ FILE: kauai/src/docb.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Base document class and its supporting gobs. ***************************************************************************/ #include "frame.h" ASSERTNAME #define dsnoNil 0 long DOCB::_cactLast = 0; PDOCB DOCB::_pdocbFirst = pvNil; BEGIN_CMD_MAP(DDG, GOB) ON_CID_GEN(cidClose, &DDG::FCmdCloseDoc, pvNil) ON_CID_GEN(cidSaveAndClose, &DDG::FCmdCloseDoc, pvNil) ON_CID_GEN(cidSave, &DDG::FCmdSave, &DDG::FEnableDdgCmd) ON_CID_GEN(cidSaveAs, &DDG::FCmdSave, pvNil) ON_CID_GEN(cidSaveCopy, &DDG::FCmdSave, pvNil) ON_CID_GEN(cidCut, &DDG::FCmdClip, &DDG::FEnableDdgCmd) ON_CID_GEN(cidCopy, &DDG::FCmdClip, &DDG::FEnableDdgCmd) ON_CID_GEN(cidPaste, &DDG::FCmdClip, &DDG::FEnableDdgCmd) ON_CID_GEN(cidPasteSpecial, &DDG::FCmdClip, &DDG::FEnableDdgCmd) ON_CID_GEN(cidClear, &DDG::FCmdClip, &DDG::FEnableDdgCmd) ON_CID_GEN(cidUndo, &DDG::FCmdUndo, &DDG::FEnableDdgCmd) ON_CID_GEN(cidRedo, &DDG::FCmdUndo, &DDG::FEnableDdgCmd) END_CMD_MAP_NIL() RTCLASS(DOCB) RTCLASS(DTE) RTCLASS(DDG) RTCLASS(DMD) RTCLASS(DMW) RTCLASS(DSG) RTCLASS(DSSP) RTCLASS(DSSM) RTCLASS(UNDB) /*************************************************************************** Constructor for DOCB ***************************************************************************/ DOCB::DOCB(PDOCB pdocb, ulong grfdoc) : CMH(khidDoc) { _pdocbChd = pvNil; if (pvNil == pdocb) { _pdocbPar = pvNil; _pdocbSib = _pdocbFirst; _pdocbFirst = this; } else if (grfdoc & fdocSibling) { AssertPo(pdocb, 0); _pdocbPar = pdocb->_pdocbPar; _pdocbSib = pdocb->_pdocbSib; pdocb->_pdocbSib = this; } else { AssertPo(pdocb, 0); _pdocbPar = pdocb; _pdocbSib = pdocb->_pdocbChd; pdocb->_pdocbChd = this; } _cundbMax = 10; AssertThis(fobjAssertFull); } /*************************************************************************** First calls Release on all direct child docb's of this DOCB. Finally calls delete on itself. ***************************************************************************/ void DOCB::Release(void) { AssertThis(fobjAssertFull); PDOCB pdocb; PUNDB pundb; if (--_cactRef > 0) return; Assert(Cddg() == 0, "why are there still DDG's open on this DOCB?"); Assert(!_fFreeing, "we're recursing into the DOCB::Release!"); _fFreeing = fTrue; if (pvNil != _pglpundb) { while (_pglpundb->FPop(&pundb)) ReleasePpo(&pundb); ReleasePpo(&_pglpundb); _ipundbLimDone = 0; } while (pvNil != (pdocb = _pdocbChd)) { pdocb->CloseAllDdg(); if (pdocb == _pdocbChd) { // REVIEW shonk: Release: is this the right thing to do? What if // someone else has a reference count to this child DOCB? Bug("why wasn't this child doc released?"); ReleasePpo(&pdocb); } } delete this; } /*************************************************************************** Close all DDGs on this DOCB. ***************************************************************************/ void DOCB::CloseAllDdg(void) { PDDG pddg; PDMD pdmd; if (pvNil != _pglpddg) { // the pddg's are removed from _hplpddg in RemoveDdg // Note that freeing one DMD may end up nuking more than // one DDG. // REVIEW shonk: this assumes that no one else has a // reference count open on one of these DMDs or DDGs. AddRef(); // so we aren't freed in the loop while (_pglpddg->IvMac() > 0) { _pglpddg->Get(0, &pddg); if (pvNil != (pdmd = pddg->Pdmd())) ReleasePpo(&pdmd); // close the MDI window else ReleasePpo(&pddg); // close just the DDG } Release(); // balance our AddRef } } /*************************************************************************** Destructor for the document class. ***************************************************************************/ DOCB::~DOCB(void) { AssertThis(fobjAssertFull); PDOCB *ppdocb; Assert(_fFreeing, "Release not called first!"); Assert(pvNil == _pdocbChd, "docb still has children"); Assert(pvNil == _pglpddg || _pglpddg->IvMac() == 0, "doc is still being displayed by a window"); if (vpclip->FDocIsClip(this)) { Bug("The clipboard document is going away!"); // these AddRef's are so our destructor doesn't get called when the // clipboard releases us! AddRef(); AddRef(); vpclip->Set(); } // remove it from the sibling list for (ppdocb = pvNil != _pdocbPar ? &_pdocbPar->_pdocbChd : &_pdocbFirst; *ppdocb != this && pvNil != *ppdocb; ppdocb = &(*ppdocb)->_pdocbSib) { } if (*ppdocb == this) *ppdocb = _pdocbSib; else Bug("corrupt docb tree"); ReleasePpo(&_pglpddg); } /*************************************************************************** Static method: calls FQueryClose on all open docs. ***************************************************************************/ bool DOCB::FQueryCloseAll(ulong grfdoc) { PDOCB pdocb; for (pdocb = _pdocbFirst; pvNil != pdocb; pdocb = pdocb->_pdocbSib) { if (!pdocb->FQueryClose(grfdoc)) return fFalse; } return fTrue; } /*************************************************************************** If the document is dirty, ask the user if they want to save changes (and save if they do). Return false if the user cancels the operation. Don't allow cancel if fdocForceClose is set. Don't ask about saving (assume yes) if fdocAssumeYes is set. Doesn't assume doc is fni based (calls FSave() to perform the save). ***************************************************************************/ bool DOCB::FQueryClose(ulong grfdoc) { tribool tRet; DTE dte; PDOCB pdocb; ulong grfdte; bool fForce = FPure(grfdoc & fdocForceClose); dte.Init(this); while (dte.FNextDoc(&pdocb, &grfdte)) { if (!(grfdte & fdtePost) || !pdocb->FDirty()) continue; if (!(grfdoc & fdocAssumeYes)) { tRet = pdocb->_TQuerySave(fForce); if (tNo == tRet) continue; if (tMaybe == tRet) return false; } if (!pdocb->FSave()) { if (!fForce) return false; } } return true; } /*************************************************************************** Ask the user if they want to save the document before closing it. ***************************************************************************/ tribool DOCB::_TQuerySave(bool fForce) { AssertThis(0); return vpappb->TQuerySaveDoc(this, fForce) ? tYes : tNo; } /*************************************************************************** If the document is dirty, and this is the only DMD displaying the doc, ask the user if they want to save changes (and save if they do). Return false if the user cancels the operation or the save fails. ***************************************************************************/ bool DOCB::FQueryCloseDmd(PDMD pdmd) { PDDG pddg; PDMD pdmdT; long ipddg; if (pvNil == _pglpddg || _pglpddg->IvMac() == 0) { Bug("why are there no DDGs for this doc if there's a DMD?"); return fTrue; } for (ipddg = _pglpddg->IvMac(); ipddg-- != 0;) { _pglpddg->Get(ipddg, &pddg); AssertBasePo(pddg, 0); pdmdT = pddg->Pdmd(); if (pdmdT != pdmd && pdmdT != pvNil) { // there's another window on this doc, so let this one close return fTrue; } } return FQueryClose(fdocNil); } /*************************************************************************** Return whether this is an internal document. ***************************************************************************/ bool DOCB::FInternal(void) { AssertThis(0); return _fInternal || vpclip->FDocIsClip(this); } /*************************************************************************** Change this document's internal status. ***************************************************************************/ void DOCB::SetInternal(bool fInternal) { AssertThis(0); _fInternal = FPure(fInternal); } /*************************************************************************** Static method to return the DOC open on this fni (if there is one). ***************************************************************************/ PDOCB DOCB::PdocbFromFni(FNI *pfni) { AssertPo(pfni, 0); PDOCB pdocb; FNI fni; for (pdocb = _pdocbFirst; pvNil != pdocb; pdocb = pdocb->_pdocbSib) { if (!pdocb->FGetFni(&fni)) continue; if (fni.FEqual(pfni)) return pdocb; } return pvNil; } /*************************************************************************** Get the current FNI for the doc. Return false if the doc is not currently based on an FNI (it's a new doc or an internal one). ***************************************************************************/ bool DOCB::FGetFni(FNI *pfni) { return fFalse; } /*************************************************************************** High level save. ***************************************************************************/ bool DOCB::FSave(long cid) { FNI fni; switch (cid) { default: Bug("why are we here?"); return fFalse; case cidSave: if (FGetFni(&fni)) break; // fall through case cidSaveAs: case cidSaveCopy: if (!FGetFniSave(&fni)) return fFalse; break; } if (!FSaveToFni(&fni, cid != cidSaveCopy)) { PushErc(ercCantSave); return fFalse; } if (cid != cidSaveCopy) UpdateName(); return fTrue; } /*************************************************************************** Save the document and optionally set this fni as the current one. If the doc is currently based on an FNI, pfni may be nil, indicating that this is a normal save (not save as). If pfni is not nil and fSetFni is false, this just writes a copy of the doc but doesn't change the doc one bit. ***************************************************************************/ bool DOCB::FSaveToFni(FNI *pfni, bool fSetFni) { return fFalse; } /*************************************************************************** Ask the user what file they want to save to. On Mac, assumes saving to a text file. ***************************************************************************/ bool DOCB::FGetFniSave(FNI *pfni) { return FGetFniSaveMacro(pfni, 'TEXT', "\x9" "Save As: ", "", PszLit("All files\0*.*\0"), vwig.hwndApp); } /*************************************************************************** Add the DDG to the list of DDGs displaying this document ***************************************************************************/ bool DOCB::FAddDdg(PDDG pddg) { AssertThis(fobjAssertFull); AssertPo(pddg, 0); bool fT; if (pvNil == _pglpddg && pvNil == (_pglpddg = GL::PglNew(size(PDDG), 1))) { return fFalse; } fT = _pglpddg->FAdd(&pddg); AssertThis(fobjAssertFull); return fT; } /*************************************************************************** Find the position of the pddg in the DOCB's list. ***************************************************************************/ bool DOCB::_FFindDdg(PDDG pddg, long *pipddg) { AssertThis(0); AssertVarMem(pipddg); long ipddg, cpddg; PDDG pddgT; if (_pglpddg == pvNil) goto LFail; cpddg = _pglpddg->IvMac(); for (ipddg = 0; ipddg < cpddg; ipddg++) { _pglpddg->Get(ipddg, &pddgT); if (pddgT == pddg) { *pipddg = ipddg; return fTrue; } } LFail: TrashVar(pipddg); return fFalse; } /*************************************************************************** Remove the pddg from the list of DDGs for this doc. ***************************************************************************/ void DOCB::RemoveDdg(PDDG pddg) { AssertThis(fobjAssertFull); long ipddg; if (_FFindDdg(pddg, &ipddg)) _pglpddg->Delete(ipddg); AssertThis(fobjAssertFull); } /*************************************************************************** Make this DDG the first one in the DOCB's list. ***************************************************************************/ void DOCB::MakeFirstDdg(PDDG pddg) { long ipddg; if (!_FFindDdg(pddg, &ipddg)) { BugVar("pddg not in docb's list", &pddg); return; } if (ipddg != 0) _pglpddg->Move(ipddg, 0); } /*************************************************************************** Return the iddg'th DDG displaying this doc. If iddg is too big, return pvNil. ***************************************************************************/ PDDG DOCB::PddgGet(long iddg) { AssertThis(0); AssertIn(iddg, 0, klwMax); PDDG pddg; if (pvNil == _pglpddg || iddg >= _pglpddg->IvMac()) return pvNil; _pglpddg->Get(iddg, &pddg); AssertPo(pddg, 0); return pddg; } /*************************************************************************** If there is an active DDG for this doc, return it. ***************************************************************************/ PDDG DOCB::PddgActive(void) { AssertThis(0); PDDG pddg; pddg = PddgGet(0); if (pvNil == pddg || !pddg->FActive()) return pvNil; return pddg; } /*************************************************************************** Create a new mdi window for this document. ***************************************************************************/ PDMD DOCB::PdmdNew(void) { AssertThis(fobjAssertFull); return DMD::PdmdNew(this); } /*************************************************************************** If this DOCB has a DMD, make it the activate hwnd. ***************************************************************************/ void DOCB::ActivateDmd(void) { AssertThis(fobjAssertFull); long ipddg; PDDG pddg; PDMD pdmd; for (ipddg = 0; pvNil != (pddg = PddgGet(ipddg)); ipddg++) { pdmd = (PDMD)pddg->PgobParFromCls(kclsDMD); if (pvNil != pdmd) { GOB::MakeHwndActive(pdmd->HwndContainer()); return; } } } /*************************************************************************** Create a DMW for the document. ***************************************************************************/ PDMW DOCB::PdmwNew(PGCB pgcb) { AssertThis(fobjAssertFull); return DMW::PdmwNew(this, pgcb); } /*************************************************************************** Create a new DSG for the doc in the given DMW. ***************************************************************************/ PDSG DOCB::PdsgNew(PDMW pdmw, PDSG pdsgSplit, ulong grfdsg, long rel) { AssertThis(fobjAssertFull); return DSG::PdsgNew(pdmw, pdsgSplit, grfdsg, rel); } /*************************************************************************** Create a new DDG for the doc in the given DSG. ***************************************************************************/ PDDG DOCB::PddgNew(PGCB pgcb) { AssertThis(fobjAssertFull); return DDG::PddgNew(this, pgcb); } /*************************************************************************** Get the name of a default (untitled) document. ***************************************************************************/ void DOCB::GetName(PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); FNI fni; // REVIEW shonk: clipboard constant string. if (vpclip->FDocIsClip(this)) *pstn = PszLit("Clipboard"); else if (FGetFni(&fni)) fni.GetLeaf(pstn); else { if (_cactUntitled == 0) _cactUntitled = ++_cactLast; pstn->FFormatSz(PszLit("Untitled %d"), _cactUntitled); } } /*************************************************************************** Makes sure all windows displaying this document have the correct title. ***************************************************************************/ void DOCB::UpdateName(void) { DTE dte; ulong grfdte; STN stn; long ipddg; PDDG pddg; PDOCB pdocb; PDMD pdmd; dte.Init(this); while (dte.FNextDoc(&pdocb, &grfdte, fdteNil)) { if (!(grfdte & fdtePre)) continue; pdocb->GetName(&stn); for (ipddg = 0; pvNil != (pddg = pdocb->PddgGet(ipddg++));) { if (pvNil != (pdmd = pddg->Pdmd())) pdmd->SetHwndName(&stn); } } } /*************************************************************************** Does a single Undo off the undo list. ***************************************************************************/ bool DOCB::FUndo() { AssertThis(fobjAssertFull); PUNDB pundb; if (pvNil == _pglpundb || _ipundbLimDone <= 0) return fFalse; _pglpundb->Get(_ipundbLimDone - 1, &pundb); if (!pundb->FUndo(this)) return fFalse; _ipundbLimDone--; return fTrue; } /*************************************************************************** Redoes a single undo off the undo list. ***************************************************************************/ bool DOCB::FRedo() { AssertThis(fobjAssertFull); PUNDB pundb; if (pvNil == _pglpundb || _ipundbLimDone >= _pglpundb->IvMac()) return fFalse; _pglpundb->Get(_ipundbLimDone, &pundb); if (!pundb->FDo(this)) return fFalse; _ipundbLimDone++; return fTrue; } /*************************************************************************** Adds a single undo to the undo list, removing any Redo items. Increments the ref count on the pundb if we keep a reference to it. Assumes the action has already been done. ***************************************************************************/ bool DOCB::FAddUndo(PUNDB pundb) { AssertThis(fobjAssertFull); PUNDB pundbT; bool fRet; if (_cundbMax == 0) return fTrue; if (pvNil == _pglpundb && pvNil == (_pglpundb = GL::PglNew(size(PUNDB), 1))) { return fFalse; } ClearRedo(); if (_cundbMax <= _pglpundb->IvMac()) { _pglpundb->Get(0, &pundbT); _pglpundb->Delete(0); ReleasePpo(&pundbT); } while (!(fRet = _pglpundb->FPush(&pundb)) && _pglpundb->IvMac() > 0) { _pglpundb->Get(0, &pundbT); _pglpundb->Delete(0); ReleasePpo(&pundbT); } if (fRet) pundb->AddRef(); _ipundbLimDone = _pglpundb->IvMac(); AssertThis(fobjAssertFull); return fRet; } /*************************************************************************** Delete all undo and redo records. ***************************************************************************/ void DOCB::ClearUndo(void) { PUNDB pundb; if (pvNil == _pglpundb) return; while (_pglpundb->FPop(&pundb)) ReleasePpo(&pundb); _ipundbLimDone = 0; } /*************************************************************************** Delete all redo records. ***************************************************************************/ void DOCB::ClearRedo(void) { PUNDB pundb; if (pvNil == _pglpundb) return; while (_ipundbLimDone < _pglpundb->IvMac()) { AssertDo(_pglpundb->FPop(&pundb), 0); ReleasePpo(&pundb); } } /*************************************************************************** Set the maximum allowable number of undoable operations. ***************************************************************************/ void DOCB::SetCundbMax(long cundbMax) { AssertThis(fobjAssertFull); AssertIn(cundbMax, 0, kcbMax); long ipundbLimNew; PUNDB pundb; _cundbMax = cundbMax; if (pvNil == _pglpundb || _pglpundb->IvMac() <= cundbMax) return; ipundbLimNew = LwMax(_ipundbLimDone, cundbMax); while (_pglpundb->IvMac() > ipundbLimNew) { AssertDo(_pglpundb->FPop(&pundb), 0); ReleasePpo(&pundb); } while (_pglpundb->IvMac() > cundbMax) { Assert(_ipundbLimDone == _pglpundb->IvMac(), 0); _pglpundb->Get(0, &pundb); _pglpundb->Delete(0); _ipundbLimDone--; ReleasePpo(&pundb); } AssertThis(fobjAssertFull); } /*************************************************************************** Return the maximum number of undoable operations for this doc ***************************************************************************/ long DOCB::CundbMax(void) { AssertThis(0); return _cundbMax; } /*************************************************************************** Return the number of operations that can currently be undone. ***************************************************************************/ long DOCB::CundbUndo(void) { AssertThis(0); return _ipundbLimDone; } /*************************************************************************** Return the number of operations that can currently be redone. ***************************************************************************/ long DOCB::CundbRedo(void) { if (pvNil == _pglpundb) return 0; return _pglpundb->IvMac() - _ipundbLimDone; } /*************************************************************************** Export this docb as the external clipboard. ***************************************************************************/ void DOCB::ExportFormats(PCLIP pclip) { AssertThis(0); AssertPo(pclip, 0); } /*************************************************************************** See if this document can be coerced to the given format. ***************************************************************************/ bool DOCB::FGetFormat(long cls, PDOCB *ppdocb) { AssertThis(0); AssertNilOrVarMem(ppdocb); if (pvNil != ppdocb) *ppdocb = pvNil; return fFalse; } #ifdef DEBUG /*************************************************************************** Assert validity of a DOCB ***************************************************************************/ void DOCB::AssertValid(ulong grfdocb) { long ipddg; PDDG pddg; long ipundb; PUNDB pundb; DOCB_PAR::AssertValid(grfdocb & fobjAssertFull); AssertNilOrPo(_pglpddg, 0); if (!(grfdocb & fobjAssertFull)) return; if (pvNil != _pglpddg) { for (ipddg = _pglpddg->IvMac(); ipddg-- != 0;) { _pglpddg->Get(ipddg, &pddg); AssertBasePo(pddg, 0); } } if (pvNil != _pglpundb) { AssertIn(_ipundbLimDone, 0, _pglpundb->IvMac() + 1); AssertIn(_pglpundb->IvMac(), 0, _cundbMax + 1); for (ipundb = _pglpundb->IvMac(); ipundb-- != 0;) { _pglpundb->Get(ipundb, &pundb); AssertPo(pundb, 0); } } else { Assert(_ipundbLimDone == 0, 0); AssertIn(_cundbMax, 0, kcbMax); } } /*************************************************************************** Mark the memory used by the DOCB ***************************************************************************/ void DOCB::MarkMem(void) { long ipundb; PUNDB pundb; AssertThis(fobjAssertFull); DOCB_PAR::MarkMem(); MarkMemObj(_pglpddg); if (pvNil != _pglpundb) { MarkMemObj(_pglpundb); for (ipundb = _pglpundb->IvMac(); ipundb-- != 0;) { _pglpundb->Get(ipundb, &pundb); MarkMemObj(pundb); } } } #endif // DEBUG /*************************************************************************** Constructor for a document tree enumerator. ***************************************************************************/ DTE::DTE(void) { _es = esDone; } /*************************************************************************** Initialize a document tree enumerator. ***************************************************************************/ void DTE::Init(PDOCB pdocb) { _pdocbRoot = pdocb; _pdocbCur = pvNil; _es = pdocb == pvNil ? esDone : esStart; } /*************************************************************************** Goes to the next node in the sub tree being enumerated. Returns false iff the enumeration is done. ***************************************************************************/ bool DTE::FNextDoc(PDOCB *ppdocb, ulong *pgrfdteOut, ulong grfdte) { PDOCB pdocbT; *pgrfdteOut = fdteNil; switch (_es) { case esStart: _pdocbCur = _pdocbRoot; *pgrfdteOut |= fdteRoot; goto LCheckForKids; case esGoDown: if (!(grfdte & fdteSkipToSib)) { pdocbT = _pdocbCur->_pdocbChd; if (pdocbT != pvNil) { _pdocbCur = pdocbT; goto LCheckForKids; } } // fall through case esGoLeft: // go to the sibling (if there is one) or parent if (_pdocbCur == _pdocbRoot) { _es = esDone; return fFalse; } pdocbT = _pdocbCur->_pdocbSib; if (pdocbT != pvNil) { _pdocbCur = pdocbT; LCheckForKids: *pgrfdteOut |= fdtePre; if (_pdocbCur->_pdocbChd == pvNil) { *pgrfdteOut |= fdtePost; _es = esGoLeft; } else _es = esGoDown; } else { // no more siblings, go to parent _pdocbCur = _pdocbCur->_pdocbPar; *pgrfdteOut |= fdtePost; if (_pdocbCur == _pdocbRoot) { _es = esDone; *pgrfdteOut |= fdteRoot; } else _es = esGoLeft; } break; case esDone: return fFalse; } *ppdocb = _pdocbCur; return fTrue; } /*************************************************************************** Static method to create a new DDG. ***************************************************************************/ PDDG DDG::PddgNew(PDOCB pdocb, PGCB pgcb) { PDDG pddg; if (pvNil == (pddg = NewObj DDG(pdocb, pgcb))) return pvNil; if (!pddg->_FInit()) { ReleasePpo(&pddg); return pvNil; } pddg->Activate(fTrue); AssertPo(pddg, 0); return pddg; } /*************************************************************************** Constructor for a DDG. AddRef's the DOCB. ***************************************************************************/ DDG::DDG(PDOCB pdocb, PGCB pgcb) : GOB(pgcb) { AssertBasePo(pdocb, 0); pdocb->AddRef(); _pdocb = pdocb; _scvVert = _scvHorz = 0; AssertThis(fobjAssertFull); } /*************************************************************************** Destructor for DDG - remove itself from the DOCB's list. Releases the DOCB. ***************************************************************************/ DDG::~DDG(void) { AssertBasePo(_pdocb, 0); PDMD pdmd; _pdocb->RemoveDdg(this); if (_fActive && pvNil != (pdmd = Pdmd())) pdmd->ActivateNext(this); _pdocb->Release(); } /*************************************************************************** Initialize the DDG - including setting its position. ***************************************************************************/ bool DDG::_FInit(void) { _fCreating = fTrue; if (!_pdocb->FAddDdg(this)) return fFalse; _fCreating = fFalse; return fTrue; } /*************************************************************************** If this DDG is contained in a DMD, return the DMD. Otherwise, return pvNil. ***************************************************************************/ PDMD DDG::Pdmd(void) { return (PDMD)GOB::PgobParFromCls(kclsDMD); } /*************************************************************************** Make this the active DDG for the docb or deactivate it according to fActive. ***************************************************************************/ void DDG::Activate(bool fActive) { AssertThis(fobjAssertFull); PDDG pddg; PDMD pdmd; if (FPure(fActive) == FPure(_fActive)) return; if (fActive) { // deactivate the current active one pddg = _pdocb->PddgActive(); if (pvNil != pddg) { pddg->_Activate(fFalse); pddg->_fActive = fFalse; } // activate ourself if (pvNil != (pdmd = Pdmd())) { // bring our parent chain to the front PGOB pgob; for (pgob = this; pgob != pdmd; pgob = pgob->PgobPar()) pgob->BringToFront(); } _pdocb->MakeFirstDdg(this); } _Activate(fActive); _fActive = FPure(fActive); AssertThis(fobjAssertFull); } /*************************************************************************** Default for a DDG - add/remove itself to the command handler list. ***************************************************************************/ void DDG::_Activate(bool fActive) { vpcex->RemoveCmh(this, 0); if (fActive) vpcex->FAddCmh(this, 0); } /*************************************************************************** Handles enabling/disabling of common Ddg commands. ***************************************************************************/ bool DDG::FEnableDdgCmd(PCMD pcmd, ulong *pgrfeds) { AssertThis(0); switch (pcmd->cid) { case cidSave: if (!_pdocb->FDirty()) goto LDisable; break; case cidCut: case cidCopy: case cidClear: if (!_FCopySel(pvNil)) goto LDisable; break; case cidPaste: case cidPasteSpecial: if (vpclip->FDocIsClip(pvNil) || vpclip->FDocIsClip(_pdocb) || !_FPaste(vpclip, fFalse, pcmd->cid)) { goto LDisable; } break; case cidUndo: if (_pdocb->CundbUndo() <= 0) goto LDisable; break; case cidRedo: if (_pdocb->CundbRedo() <= 0) goto LDisable; break; default: BugVar("unhandled cid in FEnableDdgCmd", &pcmd->cid); LDisable: *pgrfeds = fedsDisable; return fTrue; } *pgrfeds = fedsEnable; return fTrue; } /*************************************************************************** Handles the Cut, Copy, Paste and Clear commands. ***************************************************************************/ bool DDG::FCmdClip(PCMD pcmd) { AssertThis(fobjAssertFull); AssertVarMem(pcmd); PDOCB pdocb = pvNil; switch (pcmd->cid) { case cidCut: case cidCopy: // copy the selection if (!_FCopySel(&pdocb)) return fTrue; vpclip->Set(pdocb); ReleasePpo(&pdocb); if (pcmd->cid == cidCopy) break; // fall thru case cidClear: // delete the selection _ClearSel(); break; case cidPaste: case cidPasteSpecial: if (!vpclip->FDocIsClip(pvNil) && !vpclip->FDocIsClip(_pdocb)) _FPaste(vpclip, fTrue, pcmd->cid); break; } return fTrue; } /*************************************************************************** Default for copying a selection. Just returns false so the Cut, Copy and Clear edit menu items are disabled. ***************************************************************************/ bool DDG::_FCopySel(PDOCB *ppdocb) { return fFalse; } /*************************************************************************** Default for clearing (deleting) a selection. ***************************************************************************/ void DDG::_ClearSel(void) { } /*************************************************************************** Default for pasting over a selection. Just returns false so the Paste edit menu item is disabled. ***************************************************************************/ bool DDG::_FPaste(PCLIP pclip, bool fDoIt, long cid) { return fFalse; } /*************************************************************************** Handle a close command. ***************************************************************************/ bool DDG::FCmdCloseDoc(PCMD pcmd) { if (_pdocb->FQueryClose(pcmd->cid == cidSaveAndClose ? fdocAssumeYes : fdocNil)) _pdocb->CloseAllDdg(); return fTrue; } /*************************************************************************** Handle a save, save as or save a copy command. ***************************************************************************/ bool DDG::FCmdSave(PCMD pcmd) { _pdocb->FSave(pcmd->cid); return fTrue; } /*************************************************************************** Handle a save, save as or save a copy command. ***************************************************************************/ bool DDG::FCmdUndo(PCMD pcmd) { if (pcmd->cid == cidUndo) _pdocb->FUndo(); else _pdocb->FRedo(); return fTrue; } /*************************************************************************** Default for a DDG - for frame testing only. ***************************************************************************/ void DDG::Draw(PGNV pgnv, RC *prcClip) { AssertThis(0); pgnv->FillRc(prcClip, _fActive ? kacrBlue : kacrMagenta); } /*************************************************************************** Activate the selection. Default activates the DDG. ***************************************************************************/ bool DDG::FCmdActivateSel(PCMD pcmd) { Activate(fTrue); return fTrue; } /*************************************************************************** Scroll the DCD ***************************************************************************/ bool DDG::FCmdScroll(PCMD pcmd) { bool fVert; long scv; fVert = (pcmd->rglw[0] == khidVScroll); switch (pcmd->cid) { case cidDoScroll: if (pcmd->rglw[1] == scaToVal) break; // ignore thumb tracking if (fVert) _Scroll(scaNil, pcmd->rglw[1]); else _Scroll(pcmd->rglw[1], scaNil); break; case cidEndScroll: scv = pcmd->rglw[1]; if (fVert) _Scroll(scaNil, scaToVal, 0, scv); else _Scroll(scaToVal, scaNil, scv); break; } return fTrue; } /*************************************************************************** Scroll with the given scrolling actions. Sets the scroll bar values accordingly. ***************************************************************************/ void DDG::_Scroll(long scaHorz, long scaVert, long scvHorz, long scvVert) { _SetScrollValues(); } /*************************************************************************** Set the scroll bar values for the DDG to _scvHorz and _scvVert and the Max values. ***************************************************************************/ void DDG::_SetScrollValues(void) { PSCB pscb; PGOB pgob; pgob = PgobPar(); if (pgob->FIs(kclsDSG)) { if (pvNil != (pscb = (PSCB)pgob->PgobFromHid(khidVScroll))) pscb->SetValMinMax(_scvVert, 0, _ScvMax(fTrue)); if (pvNil != (pscb = (PSCB)pgob->PgobFromHid(khidHScroll))) pscb->SetValMinMax(_scvHorz, 0, _ScvMax(fFalse)); } } /*************************************************************************** Actually move the bits for a scroll. The _scvVert and _scvHorz member variables have already been updated. ***************************************************************************/ void DDG::_ScrollDxpDyp(long dxp, long dyp) { Scroll(pvNil, -dxp, -dyp, kginDraw); } /*************************************************************************** Return the scroll bound. ***************************************************************************/ long DDG::_ScvMax(bool fVert) { return 0; } /*************************************************************************** The DDG has changed sizes, reset the scroll bounds. ***************************************************************************/ void DDG::_NewRc(void) { _SetScrollValues(); } #ifdef DEBUG /*************************************************************************** Assert the validity of a DDG. ***************************************************************************/ void DDG::AssertValid(ulong grfobj) { DDG_PAR::AssertValid(grfobj | fobjAllocated); AssertPo(_pdocb, grfobj & fobjAssertFull); } /*************************************************************************** Mark memory for the DDG. ***************************************************************************/ void DDG::MarkMem(void) { AssertValid(fobjAssertFull); DDG_PAR::MarkMem(); MarkMemObj(_pdocb); } #endif // DEBUG /*************************************************************************** Static method: create a new Document MDI window. Put a size box in it and add a DMW. ***************************************************************************/ PDMD DMD::PdmdNew(PDOCB pdocb) { AssertPo(pdocb, 0); PDMD pdmd; STN stn; RC rcRel, rcAbs; GCB gcb(khidDmd, GOB::PgobScreen()); if (pvNil == (pdmd = NewObj DMD(pdocb, &gcb))) return pvNil; pdocb->GetName(&stn); if (!pdmd->FCreateAndAttachMdi(&stn)) goto LFail; rcRel.xpLeft = rcRel.ypTop = 0; rcRel.xpRight = rcRel.ypBottom = krelOne; rcAbs.xpLeft = rcAbs.ypTop = 0; rcAbs.xpRight = rcAbs.ypBottom = 1; if (pvNil == WSB::PwsbNew(pdmd, fgobNil)) goto LFail; gcb.Set(khidDmw, pdmd, fgobNil, kginDefault, &rcAbs, &rcRel); if (pvNil == pdocb->PdmwNew(&gcb)) { LFail: ReleasePpo(&pdmd); return pvNil; } AssertPo(pdmd, 0); return pdmd; } /*************************************************************************** Static method: returns the currently active DMD (if there is one). ***************************************************************************/ PDMD DMD::PdmdTop(void) { PGOB pgob; if (pvNil == (pgob = GOB::PgobMdiActive())) return pvNil; AssertPo(pgob, 0); if (!pgob->FIs(kclsDMD)) return pvNil; AssertPo((PDMD)pgob, 0); return (PDMD)pgob; } /*************************************************************************** Constructor for document mdi window. ***************************************************************************/ DMD::DMD(PDOCB pdocb, PGCB pgcb) : GOB(pgcb) { AssertPo(pdocb, 0); _pdocb = pdocb; } /*************************************************************************** Activate the next DDG (after the given one). ***************************************************************************/ void DMD::ActivateNext(PDDG pddg) { AssertThis(fobjAssertFull); GTE gte; ulong grfgte; PGOB pgob; if (_fFreeing) return; gte.Init(this, fgteNil); while (gte.FNextGob(&pgob, &grfgte, fgteNil)) { if (pgob->FIs(kclsDDG) && pgob != pddg) { ((PDDG)pgob)->Activate(fTrue); return; } } } /*************************************************************************** Handle activation/deactivation of the hwnd. ***************************************************************************/ void DMD::_ActivateHwnd(bool fActive) { AssertThis(0); PDDG pddg; pddg = (PDDG)PgobFromCls(kclsDDG); if (FPure(fActive) != FPure(pddg->FActive())) pddg->Activate(fActive); } /*************************************************************************** Handles cidCloseWnd. ***************************************************************************/ bool DMD::FCmdCloseWnd(PCMD pcmd) { // ask the user about saving the doc if (!_pdocb->FQueryCloseDmd(this)) { pcmd->cid = cidNil; return fTrue; } Release(); return fTrue; } /*************************************************************************** Static method to create a new DMW (document window) based on the given document. ***************************************************************************/ PDMW DMW::PdmwNew(PDOCB pdocb, PGCB pgcb) { PDMW pdmw; pdmw = NewObj DMW(pdocb, pgcb); if (!pdmw->_FInit()) { ReleasePpo(&pdmw); return pvNil; } AssertPo(pdmw, 0); return pdmw; } /*************************************************************************** Constructor for document window class ***************************************************************************/ DMW::DMW(PDOCB pdocb, PGCB pgcb) : GOB(pgcb) { AssertPo(pdocb, 0); _pdocb = pdocb; _paldsed = pvNil; _idsedRoot = ivNil; AssertThis(fobjAssertFull); } /*************************************************************************** Free the DSED tree so we don't bother with the tree manipulations during freeing. Then call GOB::Free. ***************************************************************************/ void DMW::Release(void) { AssertThis(fobjAssertFull); if (_cactRef <= 1) { Assert(!_fFreeing, "we're recursing into the destructor!"); _fFreeing = fTrue; ReleasePpo(&_paldsed); _idsedRoot = ivNil; } DMW_PAR::Release(); } /*************************************************************************** Create the actual mdi window, etc. ***************************************************************************/ bool DMW::_FInit(void) { _fCreating = fTrue; // create a lone dsg if (pvNil == _pdocb->PdsgNew(this, pvNil, fdsgNil, krelOne)) return fFalse; AssertPo(_paldsed, 0); Assert(_paldsed->IvMac() > 0, "the DSG wasn't added to the DMW"); _fCreating = fFalse; return fTrue; } /*************************************************************************** The DMW has been resized, make sure no DSGs are too small. ***************************************************************************/ void DMW::_NewRc(void) { AssertThis(0); _Layout(_idsedRoot); } /*************************************************************************** Add the dsg to the dmw (the dsg is already a child gob - we now promote it to a full fledged child dsg). ***************************************************************************/ bool DMW::FAddDsg(PDSG pdsg, PDSG pdsgSplit, ulong grfdsg, long rel) { AssertThis(fobjAssertFull); AssertIn(rel, 0, krelOne + 1); DSED dsed; DSED *qdsed; long idsedSplit, idsedPar, idsedEdge, idsedNew; ClearPb(&dsed, size(dsed)); dsed.idsedLeft = ivNil; dsed.idsedRight = ivNil; dsed.idsedPar = ivNil; if (pvNil == _paldsed || _paldsed->IvMac() == 0) { // this is the first one Assert(pvNil == pdsgSplit, "no DSGs yet, so can't split one"); if (pvNil == _paldsed && pvNil == (_paldsed = AL::PalNew(size(DSED), 1))) return fFalse; dsed.pdsg = pdsg; if (!_paldsed->FAdd(&dsed, &_idsedRoot)) return fFalse; pdsg->_dsno = _idsedRoot + 1; idsedEdge = _idsedRoot; goto LDone; } AssertIn(_idsedRoot, 0, _paldsed->IvMac()); if ((idsedSplit = pdsgSplit->_dsno) == dsnoNil) { Bug("pdsgSplit is not a registered DSG"); return fFalse; } idsedSplit--; if (!_paldsed->FEnsureSpace(2, fgrpNil)) return fFalse; AssertDo(_paldsed->FAdd(&dsed, &idsedEdge), 0); AssertDo(_paldsed->FAdd(&dsed, &idsedNew), 0); // fix the links on the one being split qdsed = _Qdsed(idsedSplit); Assert(qdsed->pdsg == pdsgSplit, "DSED tree bad"); idsedPar = qdsed->idsedPar; qdsed->idsedPar = idsedEdge; // fix the links on the parent if (ivNil == idsedPar) { Assert(idsedSplit == _idsedRoot, "corrupt DSED tree"); _idsedRoot = idsedEdge; } else { qdsed = _Qdsed(idsedPar); if (qdsed->idsedLeft == idsedSplit) qdsed->idsedLeft = idsedEdge; else { Assert(qdsed->idsedRight == idsedSplit, "DSED tree is trashed"); qdsed->idsedRight = idsedEdge; } } // construct the new node qdsed = _Qdsed(idsedNew); qdsed->idsedPar = idsedEdge; qdsed->pdsg = pdsg; pdsg->_dsno = idsedNew + 1; // construct the Edge node qdsed = _Qdsed(idsedEdge); qdsed->fVert = FPure(grfdsg & fdsgVert); qdsed->rel = rel; qdsed->idsedPar = idsedPar; if (grfdsg & fdsgAfter) { qdsed->idsedLeft = idsedSplit; qdsed->idsedRight = idsedNew; } else { qdsed->idsedLeft = idsedNew; qdsed->idsedRight = idsedSplit; } LDone: _Layout(idsedEdge); AssertThis(fobjAssertFull); return fTrue; } /*************************************************************************** Remove the dsg from the list of active DSGs. ***************************************************************************/ void DMW::RemoveDsg(PDSG pdsg) { long idsedStart; if (!_fFreeing) { _RemoveDsg(pdsg, &idsedStart); _Layout(idsedStart); } } /*************************************************************************** Remove the DSG from the tree and set its _dsno to nil. ***************************************************************************/ void DMW::_RemoveDsg(PDSG pdsg, long *pidsedStartLayout) { AssertThis(0); AssertPo(pdsg, 0); long idsedDel, idsedGrandPar, idsedSib; DSED *qdsed; DSED dsed; *pidsedStartLayout = ivNil; if (dsnoNil == pdsg->_dsno) return; if (pvNil == _paldsed) { pdsg->_dsno = dsnoNil; return; } // delete the node idsedDel = pdsg->_dsno - 1; pdsg->_dsno = dsnoNil; _paldsed->Get(idsedDel, &dsed); _paldsed->Delete(idsedDel); if (ivNil == dsed.idsedPar) { Assert(_idsedRoot == idsedDel, "bad root value"); _idsedRoot = ivNil; AssertThis(0); return; } // get info from the parent, then delete it qdsed = _Qdsed(dsed.idsedPar); idsedGrandPar = qdsed->idsedPar; if (idsedDel == qdsed->idsedLeft) idsedSib = qdsed->idsedRight; else { Assert(idsedDel == qdsed->idsedRight, "DSED tree bad"); idsedSib = qdsed->idsedLeft; } _paldsed->Delete(dsed.idsedPar); // fix the sibling and grandparent if (ivNil == idsedGrandPar) { Assert(_idsedRoot == dsed.idsedPar, "DSED root value wrong"); _idsedRoot = idsedSib; } else { qdsed = _Qdsed(idsedGrandPar); if (dsed.idsedPar == qdsed->idsedLeft) qdsed->idsedLeft = idsedSib; else { Assert(dsed.idsedPar == qdsed->idsedRight, "DSED tree bad"); qdsed->idsedRight = idsedSib; } } // fix the sib qdsed = _Qdsed(idsedSib); qdsed->idsedPar = idsedGrandPar; *pidsedStartLayout = idsedSib; AssertThis(0); } /*************************************************************************** Find the edge corresponding to the given leaf restricted to the subtree pointed to by idsedRoot. We get to the edge by going up until we either hit the root (return ivNil) or we just went up a left arc (return the parent). ***************************************************************************/ long DMW::_IdsedEdge(long idsed, long idsedRoot) { // Don't call AssertThis because AssertValid calls this AssertBaseThis(0); DSED *qdsed; long idsedPar; qdsed = _Qdsed(idsed); idsedPar = qdsed->idsedPar; while (ivNil != idsedPar) { qdsed = _Qdsed(idsedPar); if (qdsed->idsedLeft == idsed) { Assert(ivNil != qdsed->idsedRight, "bad node"); return idsedPar; } Assert(qdsed->idsedRight == idsed, "bad DSED tree"); if (idsedPar == idsedRoot) return ivNil; idsed = idsedPar; idsedPar = qdsed->idsedPar; // keep going up until we're on a left branch } // we went right all the way up, so we're done return ivNil; } /*************************************************************************** Find the next dsed to visit in the sub-tree traversal based at idsedStart (pre-order traversal). ***************************************************************************/ long DMW::_IdsedNext(long idsed, long idsedRoot) { DSED *qdsed; qdsed = _Qdsed(idsed); if (ivNil != qdsed->idsedLeft) return qdsed->idsedLeft; Assert(ivNil == qdsed->idsedRight, "bad node"); Assert(pvNil != qdsed->pdsg, "node should have a dsg"); if (ivNil == (idsed = _IdsedEdge(idsed, idsedRoot))) return ivNil; return _Qdsed(idsed)->idsedRight; } /*************************************************************************** Re-layout the DSGs in the DMW. If any become too small, delete them. ***************************************************************************/ void DMW::_Layout(long idsedStart) { AssertThis(0); RC rc, rcDsg; long dxpDmw, dypDmw; long idsed; DSED *qdsed; RC rcRel; PDSG pdsg; LRestart: if (ivNil == idsedStart) return; GetRc(&rc, cooLocal); dxpDmw = rc.Dxp(); dypDmw = rc.Dyp(); // set rcRel for idsedStart if (idsedStart == _idsedRoot) { // put full rcRel in the root rcRel.xpLeft = rcRel.ypTop = 0; rcRel.xpRight = rcRel.ypBottom = krelOne; } else { // get the rcRel for this node from its parent idsed = _Qdsed(idsedStart)->idsedPar; Assert(ivNil != idsed, "nil parent but not the root!"); _SplitRcRel(idsed, &rcRel, &rc); if (_Qdsed(idsed)->idsedRight == idsedStart) rcRel = rc; } qdsed = _Qdsed(idsedStart); qdsed->rcRel = rcRel; for (idsed = idsedStart; ivNil != idsed; idsed = _IdsedNext(idsed, idsedStart)) { qdsed = _Qdsed(idsed); if (ivNil != qdsed->idsedLeft) { // internal node - no DSG DSED dsed; Assert(ivNil != qdsed->idsedRight, "bad node"); dsed = *qdsed; _SplitRcRel(idsed, &rcRel, &rc); _Qdsed(dsed.idsedLeft)->rcRel = rcRel; _Qdsed(dsed.idsedRight)->rcRel = rc; continue; } // this is a leaf Assert(ivNil == qdsed->idsedRight, "bad node"); rcRel = qdsed->rcRel; pdsg = qdsed->pdsg; AssertPo(pdsg, 0); pdsg->GetMinMax(&rc); rcDsg.xpLeft = LwMulDiv(dxpDmw, rcRel.xpLeft, krelOne); rcDsg.xpRight = LwMulDiv(dxpDmw, rcRel.xpRight, krelOne); rcDsg.ypTop = LwMulDiv(dypDmw, rcRel.ypTop, krelOne); rcDsg.ypBottom = LwMulDiv(dypDmw, rcRel.ypBottom, krelOne); if ((rcDsg.Dxp() < rc.xpLeft || rcDsg.Dyp() < rc.ypTop) && idsed != _idsedRoot) { // DSG is becoming too small and it's not the only one, so nuke it // and restart this routine from the top. // Remove the dsg first so we don't recursively enter _Layout _RemoveDsg(pdsg, &idsedStart); ReleasePpo(&pdsg); goto LRestart; } } // now go through and actually set the positions for (idsed = idsedStart; ivNil != idsed; idsed = _IdsedNext(idsed, idsedStart)) { qdsed = (DSED *)_paldsed->QvGet(idsed); if (ivNil != qdsed->idsedLeft) continue; // this is a leaf Assert(ivNil == qdsed->idsedRight, "bad node"); rcRel = qdsed->rcRel; pdsg = qdsed->pdsg; AssertPo(pdsg, 0); pdsg->GetPos(pvNil, &rc); if (rc != rcRel) pdsg->SetPos(pvNil, &rcRel); } AssertThis(0); } /*************************************************************************** Find the two child rc's from the DSED's rc. ***************************************************************************/ void DMW::_SplitRcRel(long idsed, RC *prcLeft, RC *prcRight) { DSED *qdsed; qdsed = _Qdsed(idsed); *prcLeft = qdsed->rcRel; *prcRight = *prcLeft; if (qdsed->fVert) { prcRight->ypTop = prcLeft->ypBottom = prcLeft->ypTop + LwMulDiv(prcLeft->Dyp(), qdsed->rel, krelOne); } else { prcRight->xpLeft = prcLeft->xpRight = prcLeft->xpLeft + LwMulDiv(prcLeft->Dxp(), qdsed->rel, krelOne); } } /*************************************************************************** Return the number of DSGs. ***************************************************************************/ long DMW::Cdsg(void) { AssertThis(0); long idsed, cdsg; DSED *qdsed; if (pvNil == _paldsed) return 0; cdsg = 0; for (idsed = _paldsed->IvMac(); idsed-- != 0;) { if (_paldsed->FFree(idsed)) continue; qdsed = _Qdsed(idsed); if (pvNil != qdsed->pdsg) cdsg++; } return cdsg; } /*************************************************************************** Get the rectangles for the split associated with pdsg and for the area that the split affects. ***************************************************************************/ void DMW::GetRcSplit(PDSG pdsg, RC *prcBounds, RC *prcSplit) { AssertThis(0); AssertPo(pdsg, 0); RC rc; long idsedEdge; DSED *qdsed; long rel; if (dsnoNil == pdsg->_dsno) goto LZero; idsedEdge = _IdsedEdge(pdsg->_dsno - 1, ivNil); if (ivNil == idsedEdge) { LZero: prcBounds->Zero(); prcSplit->Zero(); return; } GetRc(&rc, cooLocal); qdsed = _Qdsed(idsedEdge); prcBounds->xpLeft = LwMulDiv(rc.xpRight, qdsed->rcRel.xpLeft, krelOne); prcBounds->xpRight = LwMulDiv(rc.xpRight, qdsed->rcRel.xpRight, krelOne); prcBounds->ypTop = LwMulDiv(rc.ypBottom, qdsed->rcRel.ypTop, krelOne); prcBounds->ypBottom = LwMulDiv(rc.ypBottom, qdsed->rcRel.ypBottom, krelOne); *prcSplit = *prcBounds; if (qdsed->fVert) { rel = qdsed->rcRel.ypTop + LwMulDiv(qdsed->rel, qdsed->rcRel.Dyp(), krelOne); prcSplit->ypBottom = LwMulDiv(rc.ypBottom, rel, krelOne); prcSplit->ypTop = prcSplit->ypBottom - SCB::DypNormal(); } else { rel = qdsed->rcRel.xpLeft + LwMulDiv(qdsed->rel, qdsed->rcRel.Dxp(), krelOne); prcSplit->xpRight = LwMulDiv(rc.xpRight, rel, krelOne); prcSplit->xpLeft = prcSplit->xpRight - SCB::DxpNormal(); } } /*************************************************************************** Move the split corresponding to the given DSG. ***************************************************************************/ void DMW::MoveSplit(PDSG pdsg, long relNew) { AssertThis(fobjAssertFull); AssertPo(pdsg, 0); AssertIn(relNew, 0, krelOne + 1); long idsedEdge; DSED *qdsed; if (dsnoNil == pdsg->_dsno) goto LZero; idsedEdge = _IdsedEdge(pdsg->_dsno - 1, ivNil); if (ivNil == idsedEdge) { LZero: Bug("split can't be moved"); return; } // REVIEW shonk: if relNew is 0 or krelOne, we could nuke the // subtree first. Then layout would be faster. qdsed = _Qdsed(idsedEdge); qdsed->rel = relNew; _Layout(idsedEdge); AssertThis(fobjAssertFull); } /*************************************************************************** Determine whether the split corresponding to pdsg is vertical, horizontal or inactive. ***************************************************************************/ tribool DMW::TVert(PDSG pdsg) { AssertThis(0); AssertPo(pdsg, 0); long idsed; if (dsnoNil == pdsg->_dsno) return tMaybe; idsed = _IdsedEdge(pdsg->_dsno - 1, ivNil); if (ivNil == idsed) return tMaybe; return _Qdsed(idsed)->fVert ? tYes : tNo; } #ifdef DEBUG /*************************************************************************** Assert the validity of the DMW. ***************************************************************************/ void DMW::AssertValid(ulong grfobj) { long cdsed, idsed; DSED dsed; DSED *qdsed; DMW_PAR::AssertValid(grfobj); AssertPo(_pdocb, grfobj & fobjAssertFull); if (pvNil == _paldsed || _paldsed->IvMac() == 0) { Assert(ivNil == _idsedRoot, "no paldsed but _idsedRoot not nil"); return; } if (ivNil == _idsedRoot) { Assert(0 == _paldsed->IvMac(), "some DSEDs, but nil _idsedRoot"); return; } if (!(grfobj & fobjAssertFull)) return; // count the number of active dseds cdsed = 0; for (idsed = _paldsed->IvMac(); idsed-- != 0;) { if (!_paldsed->FFree(idsed)) cdsed++; } for (idsed = _idsedRoot; ivNil != idsed;) { Assert(!_paldsed->FFree(idsed), "free node!"); dsed = *_Qdsed(idsed); // verify the parent pointer Assert(FPure(idsed == _idsedRoot) == FPure(ivNil == dsed.idsedPar), "dsed.idsedPar isn't right"); if (ivNil != dsed.idsedPar) Assert(!_paldsed->FFree(dsed.idsedPar), "free node!"); if (ivNil == dsed.idsedLeft) { Assert(ivNil == dsed.idsedRight, "left nil, but right not"); AssertPo(dsed.pdsg, 0); Assert(dsed.pdsg->_dsno == idsed + 1, "bad _dsno in DSG"); } else { Assert(!_paldsed->FFree(dsed.idsedLeft), "free left child!"); Assert(ivNil != dsed.idsedRight, "non-nil left but nil right"); Assert(!_paldsed->FFree(dsed.idsedRight), "free right child!"); Assert(pvNil == dsed.pdsg, "nil pdsg expected"); qdsed = _Qdsed(dsed.idsedLeft); Assert(qdsed->idsedPar == idsed, "left child's parent is wrong"); qdsed = _Qdsed(dsed.idsedRight); Assert(qdsed->idsedPar == idsed, "right child's parent is wrong"); } cdsed--; if (cdsed < 0) { Bug("dsed tree is mangled or has a loop"); break; } // find the next node if (ivNil != dsed.idsedLeft) { idsed = dsed.idsedLeft; continue; } if (ivNil == (idsed = _IdsedEdge(idsed, ivNil))) break; Assert(!_paldsed->FFree(idsed), "bad edge"); qdsed = _Qdsed(idsed); idsed = qdsed->idsedRight; Assert(ivNil != idsed, "idsedRight is nil"); } Assert(cdsed == 0, "node count wrong"); } /*************************************************************************** Mark memory used by the DMW. ***************************************************************************/ void DMW::MarkMem(void) { DMW_PAR::MarkMem(); MarkMemObj(_paldsed); } #endif // DEBUG BEGIN_CMD_MAP(DSG, GOB) ON_CID_ME(cidDoScroll, &DSG::FCmdScroll, pvNil) ON_CID_ME(cidEndScroll, &DSG::FCmdScroll, pvNil) END_CMD_MAP_NIL() /*************************************************************************** Static method to create a new DSG. ***************************************************************************/ PDSG DSG::PdsgNew(PDMW pdmw, PDSG pdsgSplit, ulong grfdsg, long rel) { AssertPo(pdmw, 0); Assert(pvNil != pdsgSplit || pdmw->Cdsg() == 0, "must split an existing DSG"); PDSG pdsg; GCB gcb(khidDsg, pdmw); if (pvNil == (pdsg = NewObj DSG(&gcb))) return pvNil; if (!pdsg->_FInit(pdsgSplit, grfdsg, rel)) { ReleasePpo(&pdsg); return pvNil; } AssertPo(pdsg, 0); return pdsg; } /*************************************************************************** Constructor for DSG. ***************************************************************************/ DSG::DSG(PGCB pgcb) : GOB(pgcb) { _dsno = dsnoNil; AssertThis(fobjAssertFull); } /*************************************************************************** Destructor for DSG - remove ourselves from the DMW. ***************************************************************************/ DSG::~DSG(void) { Pdmw()->RemoveDsg(this); } /*************************************************************************** Create the scroll bars, the DDG and do any other DSG initialization. ***************************************************************************/ bool DSG::_FInit(PDSG pdsgSplit, ulong grfdsg, long rel) { Assert(pvNil != pdsgSplit || Pdmw()->Cdsg() == 0, "must split an existing DSG"); PDMW pdmw; PDOCB pdocb; _fCreating = fTrue; // create the split mover if (pvNil == DSSM::PdssmNew(this)) return fFalse; // Create the scroll bars and split boxes GCB gcb(khidVScroll, this); SCB::GetStandardRc(fscbVert | fscbShowBottom | fscbShowRight, &gcb._rcAbs, &gcb._rcRel); gcb._rcAbs.ypTop += DSSP::DypNormal(); if (pvNil == SCB::PscbNew(&gcb, fscbVert) || pvNil == DSSP::PdsspNew(this, fdsspVert)) { return fFalse; } gcb._hid = khidHScroll; SCB::GetStandardRc(fscbHorz | fscbShowBottom | fscbShowRight, &gcb._rcAbs, &gcb._rcRel); gcb._rcAbs.xpLeft += DSSP::DxpNormal(); if (pvNil == SCB::PscbNew(&gcb, fscbHorz) || pvNil == DSSP::PdsspNew(this, fdsspHorz)) { return fFalse; } // create a ddg pdmw = Pdmw(); AssertBasePo(pdmw, 0); pdocb = pdmw->Pdocb(); AssertBasePo(pdocb, 0); gcb._hid = khidDdg; SCB::GetClientRc(fscbHorz | fscbVert | fscbShowBottom | fscbShowRight, &gcb._rcAbs, &gcb._rcRel); if (pvNil == (_pddg = pdocb->PddgNew(&gcb))) return fFalse; // add ourselves to the pdmw if (!pdmw->FAddDsg(this, pdsgSplit, grfdsg, rel)) return fFalse; _fCreating = fFalse; return fTrue; } /*************************************************************************** Get the min and max sizes for the DSG. ***************************************************************************/ void DSG::GetMinMax(RC *prcMinMax) { AssertThis(0); long dxpScb = SCB::DxpNormal(); long dypScb = SCB::DypNormal(); AssertPo(_pddg, 0); _pddg->GetMinMax(prcMinMax); // impose our own min and add the scroll bar dimensions prcMinMax->xpLeft = dxpScb + LwMax(prcMinMax->xpLeft, DSSP::DxpNormal() + dxpScb); prcMinMax->ypTop = dypScb + LwMax(prcMinMax->ypTop, DSSP::DypNormal() + dypScb); prcMinMax->xpRight = LwMax(prcMinMax->xpLeft, dxpScb + prcMinMax->xpRight); prcMinMax->ypBottom = LwMax(prcMinMax->ypTop, dypScb + prcMinMax->ypBottom); } /*************************************************************************** Split the DSG into two dsg's. ***************************************************************************/ void DSG::Split(ulong grfdsg, long rel) { AssertThis(fobjAssertFull); PDMW pdmw; PDOCB pdocb; Assert(_dsno != dsnoNil, "why are we splitting an unattached DSG?"); pdmw = Pdmw(); pdocb = pdmw->Pdocb(); pdocb->PdsgNew(pdmw, this, grfdsg, rel); } /*************************************************************************** A scroll bar has been hit. Do the scroll. ***************************************************************************/ bool DSG::FCmdScroll(PCMD pcmd) { // just pass it on to the DDG AssertThis(0); CMD cmd = *pcmd; cmd.pcmh = _pddg; cmd.pgg = pvNil; return _pddg->FCmdScroll(&cmd); } #ifdef DEBUG /*************************************************************************** Assert the validity of the DSG. ***************************************************************************/ void DSG::AssertValid(ulong grfobj) { PDMW pdmw; DSG_PAR::AssertValid(grfobj); pdmw = (PDMW)PgobPar(); AssertBasePo(pdmw, 0); } #endif // DEBUG /*************************************************************************** Constructor for the splitter. ***************************************************************************/ DSSP::DSSP(PGCB pgcb) : GOB(pgcb) { AssertThis(0); } /*************************************************************************** Static method to create a new split box. ***************************************************************************/ PDSSP DSSP::PdsspNew(PDSG pdsg, ulong grfdssp) { Assert(FPure(grfdssp & fdsspHorz) != FPure(grfdssp & fdsspVert), "must specify exactly one of (fdsspVert,fdsspHorz)"); AssertPo(pdsg, 0); GCB gcb((grfdssp & fdsspVert) ? khidDsspVert : khidDsspHorz, pdsg); if (grfdssp & fdsspVert) { gcb._rcRel.xpLeft = gcb._rcRel.xpRight = krelOne; gcb._rcRel.ypTop = gcb._rcRel.ypBottom = krelZero; gcb._rcAbs.xpLeft = -SCB::DxpNormal(); gcb._rcAbs.ypTop = 0; gcb._rcAbs.xpRight = 0; gcb._rcAbs.ypBottom = DypNormal(); } else { gcb._rcRel.xpLeft = gcb._rcRel.xpRight = krelZero; gcb._rcRel.ypTop = gcb._rcRel.ypBottom = krelOne; gcb._rcAbs.xpLeft = 0; gcb._rcAbs.ypTop = -SCB::DypNormal(); gcb._rcAbs.xpRight = DxpNormal(); gcb._rcAbs.ypBottom = 0; } return NewObj DSSP(&gcb); } /*************************************************************************** Draw the split box. ***************************************************************************/ void DSSP::Draw(PGNV pgnv, RC *prcClip) { AssertThis(0); RC rc; pgnv->GetRcSrc(&rc); pgnv->FillRc(&rc, kacrBlack); } /*************************************************************************** See if the parent DSG can be split. If so, track the mouse and draw the gray outline until the user releases the mouse. ***************************************************************************/ void DSSP::MouseDown(long xp, long yp, long cact, ulong grfcust) { AssertThis(0); long dzpMinDsg, dzpDsg, zpMin, zpLast, dzp, zp; RC rc; bool fVert = Hid() == khidDsspVert; PDSG pdsg = (PDSG)PgobPar(); PT pt(xp, yp); MapPt(&pt, cooLocal, cooParent); pdsg->GetMinMax(&rc); dzpMinDsg = fVert ? rc.ypTop : rc.xpLeft; pdsg->GetRc(&rc, cooLocal); dzpDsg = fVert ? rc.Dyp() : rc.Dxp(); if (dzpDsg <= 2 * dzpMinDsg) return; if (fVert) { dzp = DypNormal(); zpMin = pt.yp - dzp; rc.ypBottom = rc.ypTop + dzp; } else { dzp = DxpNormal(); zpMin = pt.xp - dzp; rc.xpRight = rc.xpLeft + dzp; } zpLast = zpMin + dzpDsg; zp = pdsg->ZpDragRc(&rc, fVert, zpMin + dzp, zpMin + dzp, zpLast + 1, zpMin + dzpMinDsg, zpLast - dzpMinDsg + 1); if (FIn(zp, zpMin + dzpMinDsg, zpLast - dzpMinDsg + 1)) { long rel; rel = LwMulDiv(zp - zpMin, krelOne, zpLast - zpMin) + 1; pdsg->Split(fVert, rel); } } /*************************************************************************** Constructor for the split mover. ***************************************************************************/ DSSM::DSSM(PGCB pgcb) : GOB(pgcb) { } /*************************************************************************** Static method to create a new split mover. ***************************************************************************/ PDSSM DSSM::PdssmNew(PDSG pdsg) { AssertPo(pdsg, 0); PDSSM pdssm; GCB gcb(khidDssm, pdsg); gcb._rcRel.xpLeft = gcb._rcRel.xpRight = gcb._rcRel.ypTop = gcb._rcRel.ypBottom = krelOne; gcb._rcAbs.xpLeft = -SCB::DxpNormal(); gcb._rcAbs.ypTop = -SCB::DypNormal(); gcb._rcAbs.xpRight = gcb._rcAbs.ypBottom = 0; pdssm = NewObj DSSM(&gcb); return pdssm; } /*************************************************************************** Draw the split mover. ***************************************************************************/ void DSSM::Draw(PGNV pgnv, RC *prcClip) { AssertThis(0); RC rc; tribool tVert; tVert = TVert(); if (tMaybe == tVert) return; // REVIEW shonk: split mover: need an appropriate icon GetRc(&rc, cooLocal); pgnv->FrameRc(&rc, kacrBlack); rc.Inset(1, 1); pgnv->FillRc(&rc, tVert == tYes ? kacrGreen : kacrRed); } /*************************************************************************** Track the mouse and change the split location. ***************************************************************************/ void DSSM::MouseDown(long xp, long yp, long cact, ulong grfcust) { AssertThis(0); long zp, zpMin, zpLast, zpOrig, dzpMinDsg, dzp; RC rc, rcSplit; PDSG pdsg; PDMW pdmw; tribool tVert; PT pt(xp, yp); tVert = TVert(); if (tMaybe == tVert) return; pdsg = (PDSG)PgobPar(); AssertPo(pdsg, 0); pdsg->GetMinMax(&rc); dzpMinDsg = (tYes == tVert) ? rc.ypTop : rc.xpLeft; pdmw = pdsg->Pdmw(); AssertPo(pdmw, 0); MapPt(&pt, cooLocal, cooGlobal); pdmw->MapPt(&pt, cooGlobal, cooLocal); pdmw->GetRcSplit(pdsg, &rc, &rcSplit); if (tYes == tVert) { zpOrig = pt.yp; dzp = rcSplit.Dyp(); zpMin = zpOrig + rc.ypTop - rcSplit.ypBottom; zpLast = zpOrig + rc.ypBottom - rcSplit.ypBottom; } else { zpOrig = pt.xp; dzp = rcSplit.Dxp(); zpMin = zpOrig + rc.xpLeft - rcSplit.xpRight; zpLast = zpOrig + rc.xpRight - rcSplit.xpRight; } zp = pdmw->ZpDragRc(&rcSplit, tYes == tVert, zpOrig, zpMin + dzp, zpLast + 1, zpMin + dzpMinDsg, zpLast + 1 - dzpMinDsg); if (zp != zpOrig) { long rel; if (zp < zpMin + dzpMinDsg) rel = 0; else if (zp > zpLast - dzpMinDsg) rel = krelOne; else rel = LwMulDiv(zp - zpMin, krelOne, zpLast - zpMin) + 1; pdmw->MoveSplit(pdsg, rel); } } /*************************************************************************** Determine if we are disabled (tMaybe) or if not whether we are vertical (tYes) or horizontal (tNo). ***************************************************************************/ tribool DSSM::TVert(void) { PDSG pdsg; PDMW pdmw; pdsg = (PDSG)PgobPar(); pdmw = pdsg->Pdmw(); return pdmw->TVert(pdsg); } ================================================ FILE: kauai/src/docb.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation A base document class and its supporting gob classes. ***************************************************************************/ #ifndef DOCB_H #define DOCB_H /*************************************************************************** base undo class ***************************************************************************/ typedef class UNDB *PUNDB; #define UNDB_PAR BASE #define kclsUNDB 'UNDB' class UNDB : public UNDB_PAR { RTCLASS_DEC NOCOPY(UNDB) protected: UNDB(void) { } public: // General undo funtionality virtual bool FUndo(PDOCB pdocb) = 0; virtual bool FDo(PDOCB pdocb) = 0; }; /*************************************************************************** base document class ***************************************************************************/ enum { fdocNil = 0, fdocSibling = 1, fdocForceClose = 2, // for FQueryClose, etc fdocAssumeYes = 4, // for FQueryClose, etc fdocUpdate = 8, // update associated DDGs fdocInval = 16, // invalidate associated DDGs }; #define DOCB_PAR CMH #define kclsDOCB 'DOCB' class DOCB : public DOCB_PAR { RTCLASS_DEC ASSERT MARKMEM friend class DTE; protected: static long _cactLast; static PDOCB _pdocbFirst; PDOCB _pdocbPar; PDOCB _pdocbSib; PDOCB _pdocbChd; long _cactUntitled; // 0 if titled bool _fDirty : 1; bool _fFreeing : 1; bool _fInternal : 1; PGL _pglpddg; // keep track of the DDGs based on this doc PGL _pglpundb; // keep track of undo items long _ipundbLimDone; long _cundbMax; bool _FFindDdg(PDDG pddg, long *pipddg); virtual tribool _TQuerySave(bool fForce); DOCB(PDOCB pdocb = pvNil, ulong grfdoc = fdocNil); ~DOCB(void); public: static bool FQueryCloseAll(ulong grfdoc); static PDOCB PdocbFromFni(FNI *pfni); static PDOCB PdocbFirst(void) { return _pdocbFirst; } PDOCB PdocbPar(void) { return _pdocbPar; } PDOCB PdocbSib(void) { return _pdocbSib; } PDOCB PdocbChd(void) { return _pdocbChd; } virtual void Release(void); // high level call to create a new MDI window based on the doc. virtual PDMD PdmdNew(void); void ActivateDmd(void); // low level calls - generally not for public consumption virtual PDMW PdmwNew(PGCB pgcb); virtual PDSG PdsgNew(PDMW pdwm, PDSG pdsgSplit, ulong grfdsg, long rel); virtual PDDG PddgNew(PGCB pgcb); // DDG management - only to be called by DDGs bool FAddDdg(PDDG pddg); void RemoveDdg(PDDG pddg); void MakeFirstDdg(PDDG pddg); void CloseAllDdg(void); // General DDG management long Cddg(void) { return pvNil == _pglpddg ? 0 : _pglpddg->IvMac(); } PDDG PddgGet(long ipddg); PDDG PddgActive(void); virtual void UpdateName(void); virtual void GetName(PSTN pstn); virtual bool FQueryClose(ulong grfdoc); virtual bool FQueryCloseDmd(PDMD pdmd); virtual bool FSave(long cid = cidSave); virtual bool FGetFni(FNI *pfni); virtual bool FGetFniSave(FNI *pfni); virtual bool FSaveToFni(FNI *pfni, bool fSetFni); virtual bool FDirty(void) { return _fDirty && !FInternal(); } virtual void SetDirty(bool fDirty = fTrue) { _fDirty = FPure(fDirty); } // General undo funtionality virtual bool FUndo(void); virtual bool FRedo(void); virtual bool FAddUndo(PUNDB pundb); virtual void ClearUndo(void); virtual void ClearRedo(void); virtual void SetCundbMax(long cundbMax); virtual long CundbMax(void); virtual long CundbUndo(void); virtual long CundbRedo(void); bool FInternal(void); void SetAsClipboard(void); void SetInternal(bool fInternal = fTrue); virtual void ExportFormats(PCLIP pclip); virtual bool FGetFormat(long cls, PDOCB *ppdocb = pvNil); }; /*************************************************************************** document tree enumerator ***************************************************************************/ enum { // inputs fdteNil = 0, fdteSkipToSib = 1, // legal to FNextDoc // outputs fdtePre = 2, fdtePost = 4, fdteRoot = 8 }; #define DTE_PAR BASE #define kclsDTE 'DTE' class DTE : public DTE_PAR { RTCLASS_DEC ASSERT private: // enumeration states enum { esStart, esGoDown, esGoLeft, esDone }; long _es; PDOCB _pdocbRoot; PDOCB _pdocbCur; public: DTE(void); void Init(PDOCB pdocb); bool FNextDoc(PDOCB *ppdocb, ulong *pgrfdteOut, ulong grfdteIn = fdteNil); }; /*************************************************************************** document display gob - normally a child of a DSG but can be a child of any gob (for doc previewing, etc) ***************************************************************************/ #define DDG_PAR GOB #define kclsDDG 'DDG' class DDG : public DDG_PAR { RTCLASS_DEC CMD_MAP_DEC(DDG) ASSERT MARKMEM protected: PDOCB _pdocb; bool _fActive; long _scvVert; // scroll values long _scvHorz; DDG(PDOCB pdocb, PGCB pgcb); ~DDG(void); virtual bool _FInit(void); virtual void _Activate(bool fActive); virtual void _NewRc(void); // scrolling support virtual long _ScvMax(bool fVert); virtual void _SetScrollValues(void); virtual void _Scroll(long scaHorz, long scaVert, long scvHorz = 0, long scvVert = 0); virtual void _ScrollDxpDyp(long dxp, long dyp); // clipboard support virtual bool _FCopySel(PDOCB *ppdocb = pvNil); virtual void _ClearSel(void); virtual bool _FPaste(PCLIP pclip, bool fDoIt, long cid); public: static PDDG PddgNew(PDOCB pdocb, PGCB pgcb); PDOCB Pdocb(void) { return _pdocb; } PDMD Pdmd(void); // activation virtual void Activate(bool fActive); bool FActive(void) { return _fActive; } // members of GOB virtual void Draw(PGNV pgnv, RC *prcClip); virtual bool FCmdActivateSel(PCMD pcmd); virtual bool FCmdScroll(PCMD pcmd); virtual bool FCmdCloseDoc(PCMD pcmd); virtual bool FCmdSave(PCMD pcmd); virtual bool FCmdClip(PCMD pcmd); virtual bool FEnableDdgCmd(PCMD pcmd, ulong *pgrfeds); virtual bool FCmdUndo(PCMD pcmd); }; /*************************************************************************** Document mdi window - this communicates with the docb to coordinate closing and querying the user about saving ***************************************************************************/ #define DMD_PAR GOB #define kclsDMD 'DMD' class DMD : public DMD_PAR { RTCLASS_DEC protected: PDOCB _pdocb; DMD(PDOCB pdocb, PGCB pgcb); virtual void _ActivateHwnd(bool fActive); public: static PDMD PdmdNew(PDOCB pdocb); static PDMD PdmdTop(void); PDOCB Pdocb(void) { return _pdocb; } virtual void ActivateNext(PDDG pddg); virtual bool FCmdCloseWnd(PCMD pcmd); }; /*************************************************************************** Document main window provides basic pane management - including splitting, etc ***************************************************************************/ #define DMW_PAR GOB #define kclsDMW 'DMW' class DMW : public DMW_PAR { RTCLASS_DEC ASSERT MARKMEM protected: // DSG edge struct - these form a locally-balanced binary tree // with DSGs as the leafs. Locally-balanced means that a node has a left // child iff it has a right child. struct DSED { bool fVert; // splits its parent vertically, so the edge is horizontal long rel; // where it splits its parent RC rcRel; // current relative rectangle (in the DMW) long idsedLeft; long idsedRight; long idsedPar; PDSG pdsg; }; PAL _paldsed; // the tree of DSEDs long _idsedRoot; PDOCB _pdocb; DMW(PDOCB pdocb, PGCB pgcb); virtual bool _FInit(void); virtual void _NewRc(void); void _Layout(long idsedStart); long _IdsedNext(long idsed, long idsedRoot); long _IdsedEdge(long idsed, long idsedRoot); void _RemoveDsg(PDSG pdsg, long *pidsedStartLayout); DSED *_Qdsed(long idsed) { return (DSED *)_paldsed->QvGet(idsed); } void _SplitRcRel(long idsed, RC *prcLeft, RC *prcRight); public: static PDMW PdmwNew(PDOCB pdocb, PGCB pgcb); PDOCB Pdocb(void) { return _pdocb; } bool FAddDsg(PDSG pdsg, PDSG pdsgSplit, ulong grfdsg, long rel); void RemoveDsg(PDSG pdsg); long Cdsg(void); void GetRcSplit(PDSG pdsg, RC *prcBounds, RC *prcSplit); void MoveSplit(PDSG pdsg, long relNew); tribool TVert(PDSG pdsg); virtual void Release(void); }; /*************************************************************************** document scroll gob - child gob of a DMW holds any scroll bars, splitter boxes and split movers dialogs tightly with DMW and DDG ***************************************************************************/ #define DSG_PAR GOB #define kclsDSG 'DSG' class DSG : public DSG_PAR { RTCLASS_DEC CMD_MAP_DEC(DSG) ASSERT friend DMW; private: long _dsno; // this is how the DMW refers to this DSG PDDG _pddg; protected: DSG(PGCB pgcb); ~DSG(void); virtual bool _FInit(PDSG pdsgSplit, ulong grfdsg, long rel); public: static PDSG PdsgNew(PDMW pdmw, PDSG pdsgSplit, ulong grfdsg, long rel); virtual void GetMinMax(RC *prcMinMax); PDMW Pdmw(void) { return (PDMW)PgobPar(); } virtual void Split(ulong grfdsg, long rel); virtual bool FCmdScroll(PCMD pcmd); }; enum { fdsgNil = 0, fdsgVert = 1, // for splitting and PdsgNew fdsgHorz = 2, // for splitting and PdsgNew fdsgAfter = 4 // for PdsgNew }; /*************************************************************************** document scroll window splitter - must be a child of a DSG ***************************************************************************/ typedef class DSSP *PDSSP; #define DSSP_PAR GOB #define kclsDSSP 'DSSP' class DSSP : public DSSP_PAR { RTCLASS_DEC protected: DSSP(PGCB pgcb); public: static long DypNormal(void) { return SCB::DypNormal() / 2; } static long DxpNormal(void) { return SCB::DxpNormal() / 2; } static PDSSP PdsspNew(PDSG pdsg, ulong grfdssp); virtual void Draw(PGNV pgnv, RC *prcClip); virtual void MouseDown(long xp, long yp, long cact, ulong grfcust); }; enum { fdsspNil = 0, fdsspVert = 1, fdsspHorz = 2 }; /*************************************************************************** document scroll split mover - must be a child of a DSG ***************************************************************************/ typedef class DSSM *PDSSM; #define DSSM_PAR GOB #define kclsDSSM 'DSSM' class DSSM : public DSSM_PAR { RTCLASS_DEC private: bool _fVert; protected: DSSM(PGCB pgcb); void _DrawTrackBar(PGNV pgnv, RC *prcOld, RC *prcNew); public: static PDSSM PdssmNew(PDSG pdsg); virtual void Draw(PGNV pgnv, RC *prcClip); virtual void MouseDown(long xp, long yp, long cact, ulong grfcust); tribool TVert(void); }; #endif //! DOCB_H ================================================ FILE: kauai/src/file.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Shared (platform independent) file APIs. ***************************************************************************/ #include "util.h" ASSERTNAME FTG FIL::vftgCreator = '____'; PFIL FIL::_pfilFirst; MUTX FIL::_mutxList; RTCLASS(FIL) RTCLASS(BLCK) RTCLASS(MSFIL) /*************************************************************************** Constructor for a file. ***************************************************************************/ FIL::FIL(FNI *pfni, ulong grffil) { AssertPo(pfni, ffniFile); _fni = *pfni; _grffil = grffil; // add it to the linked list _mutxList.Enter(); _Attach(&_pfilFirst); _mutxList.Leave(); } /*************************************************************************** Destructor. This is private. ***************************************************************************/ FIL::~FIL(void) { // make sure the file is closed. _Close(fTrue); _mutxList.Enter(); _Attach(pvNil); _mutxList.Leave(); } /*************************************************************************** Static method to open an existing file. Increments the open count. ***************************************************************************/ PFIL FIL::PfilOpen(FNI *pfni, ulong grffil) { AssertPo(pfni, ffniFile); PFIL pfil; Assert(!(grffil & ffilTemp), "can't open a file as temp"); if (pvNil != (pfil = PfilFromFni(pfni))) { if (!pfil->FSetGrffil(grffil)) return pvNil; // increment the open count pfil->AddRef(); return pfil; } if ((pfil = NewObj FIL(pfni, grffil)) == pvNil) goto LFail; if (!pfil->_FOpen(fFalse, grffil)) { delete pfil; LFail: PushErc(ercFileOpen); return pvNil; } AssertPo(pfil, 0); return pfil; } /*************************************************************************** Create a new file. Increments the open count. ***************************************************************************/ PFIL FIL::PfilCreate(FNI *pfni, ulong grffil) { AssertPo(pfni, ffniFile); PFIL pfil; if (pvNil != (pfil = FIL::PfilFromFni(pfni))) { Bug("trying to create an open file"); return pvNil; } grffil |= ffilWriteEnable; if ((pfil = NewObj FIL(pfni, grffil)) == pvNil) goto LFail; if (!pfil->_FOpen(fTrue, grffil)) { delete pfil; LFail: PushErc(ercFileCreate); return pvNil; } AssertPo(pfil, 0); return pfil; } /*************************************************************************** Static method to create a temp file in the same directory as fni with the same ftg, or, if pfni is nil, in the standard place with vftgTemp. The file is not marked. ***************************************************************************/ PFIL FIL::PfilCreateTemp(FNI *pfni) { AssertNilOrPo(pfni, ffniFile); FNI fni; if (pvNil != pfni) { fni = *pfni; if (!fni.FGetUnique(pfni->Ftg())) goto LFail; } else if (!fni.FGetTemp()) { LFail: PushErc(ercFileCreate); return pvNil; } return PfilCreate(&fni, ffilTemp | ffilWriteEnable | ffilDenyWrite); } /*************************************************************************** If we have the file indicated by fni open, returns the pfil, otherwise returns pvNil. Doesn't affect the open count. ***************************************************************************/ PFIL FIL::PfilFromFni(FNI *pfni) { AssertPo(pfni, ffniFile); PFIL pfil; bool fRet; _mutxList.Enter(); for (pfil = _pfilFirst; pfil != pvNil; pfil = pfil->PfilNext()) { AssertPo(pfil, 0); pfil->_mutx.Enter(); fRet = pfni->FEqual(&pfil->_fni); pfil->_mutx.Leave(); if (fRet) break; } _mutxList.Leave(); return pfil; } /*************************************************************************** Set the file flags according to grffil and grffilMask. Write enabling is only set, never cleared. Same with marking. ***************************************************************************/ bool FIL::FSetGrffil(ulong grffil, ulong grffilMask) { AssertThis(0); bool fRet = fFalse; grffil &= grffilMask; _mutx.Enter(); // make sure the permissions are high enough if ((~_grffil & grffil & kgrffilPerm) && !_FOpen(fFalse, grffil)) { PushErc(ercFilePerm); goto LRet; } // adjust the mark flag if (grffil & ffilMark) _grffil |= ffilMark; // adjust the temp flag if (grffilMask & ffilTemp) { if (grffil & ffilTemp) _grffil |= ffilTemp; else _grffil &= ~ffilTemp; } fRet = fTrue; LRet: _mutx.Leave(); return fTrue; } /*************************************************************************** Decrement the open count. If it is zero and the file isn't marked, the file is closed. ***************************************************************************/ void FIL::Release(void) { AssertThis(0); if (_cactRef <= 0) { Bug("calling Release without an AddRef"); _cactRef = 0; return; } if (--_cactRef == 0 && !(_grffil & ffilMark)) delete this; } /*************************************************************************** Get a string representing the path of the file. ***************************************************************************/ void FIL::GetStnPath(PSTN pstn) { AssertThis(0); _mutx.Enter(); _fni.GetStnPath(pstn); _mutx.Leave(); } /*************************************************************************** Set the temporary status of a file. ***************************************************************************/ void FIL::SetTemp(bool fTemp) { AssertThis(0); _mutx.Enter(); if (fTemp) _grffil |= ffilTemp; else _grffil &= ~ffilTemp; _mutx.Leave(); } /*************************************************************************** Rename the file to the given file name. If an open file exists with the same name, we rename it and swap names with it as a temporary file. Otherwise, we delete any existing file with the same name. The rules for *pfni are the same as for FRename. ***************************************************************************/ bool FIL::FSetFni(FNI *pfni) { AssertPo(pfni, ffniFile); PFIL pfilOld; if (pvNil != (pfilOld = FIL::PfilFromFni(pfni))) { if (this == pfilOld) return fTrue; if (!FSwapNames(pfilOld)) return fFalse; pfilOld->SetTemp(fTrue); return fTrue; } // delete any existing file with this name, then rename our // file to the given name if (pfni->TExists() != tNo) pfni->FDelete(); return FRename(pfni); } /*************************************************************************** Static method to clear the marks for files. ***************************************************************************/ void FIL::ClearMarks(void) { PFIL pfil; _mutxList.Enter(); for (pfil = _pfilFirst; pfil != pvNil; pfil = pfil->PfilNext()) { AssertPo(pfil, 0); pfil->FSetGrffil(ffilNil, ffilMark); } _mutxList.Leave(); } /*************************************************************************** Static method to close any files that are unmarked and have 0 open count. ***************************************************************************/ void FIL::CloseUnmarked(void) { PFIL pfil, pfilNext; _mutxList.Enter(); for (pfil = _pfilFirst; pfil != pvNil; pfil = pfilNext) { AssertPo(pfil, 0); pfilNext = pfil->PfilNext(); if (!(pfil->_grffil & ffilMark) && pfil->_cactRef == 0) delete pfil; } _mutxList.Leave(); } /*************************************************************************** Static method to close all files. ***************************************************************************/ void FIL::ShutDown(void) { PFIL pfil; _mutxList.Enter(); for (pfil = _pfilFirst; pfil != pvNil; pfil = pfil->PfilNext()) { AssertPo(pfil, 0); pfil->_Close(fTrue); } _mutxList.Leave(); } #ifdef DEBUG /*************************************************************************** Validate a pfil. ***************************************************************************/ void FIL::AssertValid(ulong grf) { PFIL pfil; FIL_PAR::AssertValid(fobjAllocated); _mutx.Enter(); AssertPo(&_fni, ffniFile); _mutx.Leave(); _mutxList.Enter(); for (pfil = _pfilFirst; pfil != pvNil; pfil = pfil->PfilNext()) { if (pfil == this) break; } _mutxList.Leave(); Assert(this == pfil, "not in file list"); } #endif // DEBUG /*************************************************************************** Determine if the given range is within cbTot. ***************************************************************************/ priv bool _FRangeIn(long cbTot, long cb, long ib) { return FIn(ib, 0, cbTot + 1) && FIn(cb, 0, cbTot - ib + 1); } /*************************************************************************** Read a piece of a flo into pv. ***************************************************************************/ bool FLO::FReadRgb(void *pv, long cbRead, FP dfp) { AssertThis(ffloReadable); if (!_FRangeIn(this->cb, cbRead, dfp)) { Bug("reading outside flo"); return fFalse; } if (cbRead == 0) return fTrue; return this->pfil->FReadRgb(pv, cbRead, this->fp + dfp); } /*************************************************************************** Write a piece of a flo from pv. ***************************************************************************/ bool FLO::FWriteRgb(void *pv, long cbWrite, FP dfp) { AssertThis(0); if (!_FRangeIn(this->cb, cbWrite, dfp)) { Bug("writing outside flo"); return fFalse; } if (cbWrite == 0) return fTrue; return this->pfil->FWriteRgb(pv, cbWrite, this->fp + dfp); } /*************************************************************************** Copy data from this flo to another. ***************************************************************************/ bool FLO::FCopy(PFLO pfloDst) { AssertThis(ffloReadable); AssertPo(pfloDst, 0); byte rgb[1024]; long cbBlock, cbT; void *pv; bool fRet = fFalse; if (this->cb != pfloDst->cb) { Bug("different sized FLOs"); return fFalse; } if (this->cb <= size(rgb) || !FAllocPv(&pv, cbBlock = this->cb, fmemNil, mprForSpeed)) { pv = (void *)rgb; cbBlock = size(rgb); } for (cbT = 0; cbT < this->cb; cbT += cbBlock) { if (cbBlock > this->cb - cbT) cbBlock = this->cb - cbT; // read the source if (!this->pfil->FReadRgb(pv, cbBlock, this->fp + cbT)) goto LFail; // write to the dest if (!pfloDst->pfil->FWriteRgb(pv, cbBlock, pfloDst->fp + cbT)) goto LFail; } fRet = fTrue; LFail: if ((void *)rgb != pv) FreePpv(&pv); return fRet; } /*************************************************************************** Allocate an hq and read the flo into it. ***************************************************************************/ bool FLO::FReadHq(HQ *phq, long cbRead, FP dfp) { AssertThis(ffloReadable); AssertVarMem(phq); bool fT; if (!_FRangeIn(this->cb, cbRead, dfp)) { Bug("reading outside flo 2"); return fFalse; } if (!FAllocHq(phq, cbRead, fmemNil, mprNormal)) return fFalse; fT = FReadRgb(PvLockHq(*phq), cbRead, dfp); UnlockHq(*phq); if (!fT) FreePhq(phq); return fT; } /*************************************************************************** Write the contents of an hq to the flo. ***************************************************************************/ bool FLO::FWriteHq(HQ hq, long dfp) { AssertThis(0); AssertHq(hq); bool fRet; long cbWrite = CbOfHq(hq); if (!_FRangeIn(this->cb, cbWrite, dfp)) { Bug("writing outside flo 2"); return fFalse; } fRet = FWriteRgb(PvLockHq(hq), cbWrite, dfp); UnlockHq(hq); return fRet; } /*************************************************************************** Translate the text in a flo from the given osk to the current osk. If the text changes, creates a temp file and redirects the flo to the temp file (and releases a ref count on the pfil). ***************************************************************************/ bool FLO::FTranslate(short osk) { AssertThis(0); short oskSig; byte rgbSrc[512]; byte rgbDst[1024]; void *pvSrc; void *pvDst; long cchDst, cch; long cbBlock, cbT; PFIL pfilNew; FP fpSrc, fpDst; bool fRet = fFalse; // look for a unicode byte order signature oskSig = MacWin(koskSbMac, koskSbWin); if (this->cb >= size(wchar) && this->cb % size(wchar) == 0) { wchar chw; if (!FReadRgb(&chw, size(wchar), 0)) return fFalse; if (chw == kchwUnicode) { oskSig = MacWin(koskUniMac, koskUniWin); this->fp += size(wchar); this->cb -= size(wchar); } else if (chw == kchwUnicodeSwap) { oskSig = MacWin(koskUniWin, koskUniMac); this->fp += size(wchar); this->cb -= size(wchar); } } // determine the probable osk if (oskSig != osk) { if (oskNil == osk) osk = oskSig; else { long dcb = CbCharOsk(osk) - CbCharOsk(oskSig); if (dcb < 0 || dcb == 0 && CbCharOsk(osk) == size(wchar)) osk = oskSig; } } if (osk == koskCur) return fTrue; if (pvNil == (pfilNew = FIL::PfilCreateTemp())) return fFalse; if (this->cb <= size(rgbSrc) || !FAllocPv(&pvSrc, cbBlock = this->cb, fmemNil, mprForSpeed)) { pvSrc = (void *)rgbSrc; cbBlock = size(rgbDst); } pvDst = (void *)rgbDst; cchDst = size(rgbDst) / size(achar); fpSrc = this->fp; fpDst = 0; for (cbT = 0; cbT < this->cb; cbT += cbBlock) { if (cbBlock > this->cb - cbT) cbBlock = this->cb - cbT; // read the source if (!this->pfil->FReadRgbSeq(pvSrc, cbBlock, &fpSrc)) goto LFail; // translate cch = CchTranslateRgb(pvSrc, cbBlock, osk, pvNil, 0); if (cch <= 0) continue; if (cch > cchDst) { if (pvDst != (void *)rgbDst) FreePpv(&pvDst); cchDst = cch; if (!FAllocPv(&pvDst, cchDst * size(achar), fmemNil, mprNormal)) goto LFail; } if (cch != CchTranslateRgb(pvSrc, cbBlock, osk, (achar *)pvDst, cch)) { Bug("why did CchTranslateRgb fail?"); goto LFail; } // write to the dest if (!pfilNew->FWriteRgbSeq(pvDst, cch * size(achar), &fpDst)) goto LFail; } fRet = fTrue; ReleasePpo(&this->pfil); this->pfil = pfilNew; this->fp = 0; this->cb = this->pfil->FpMac(); pfilNew = pvNil; LFail: if ((void *)rgbSrc != pvSrc) FreePpv(&pvSrc); if (pvDst != (void *)rgbDst) FreePpv(&pvDst); ReleasePpo(&pfilNew); return fRet; } #ifdef DEBUG /*************************************************************************** Assert this is a valif FLO. ***************************************************************************/ void FLO::AssertValid(ulong grfflo) { AssertPo(pfil, 0); AssertIn(fp, 0, kcbMax); AssertIn(cb, 0, kcbMax); FP fpMac = pfil->FpMac(); if (pfil->ElError() < kelSeek) { AssertIn(fp, 0, fpMac + 1); if (grfflo & ffloReadable) AssertIn(fp + cb, cb, fpMac + 1); } } #endif // DEBUG /*************************************************************************** Constructor for a data block. ***************************************************************************/ BLCK::BLCK(PFLO pflo, bool fPacked) { AssertBaseThis(0); AssertPo(pflo, 0); _flo = *pflo; _flo.pfil->AddRef(); _hq = hqNil; _fPacked = FPure(fPacked); AssertThis(0); } /*************************************************************************** Constructor for a data block. ***************************************************************************/ BLCK::BLCK(PFIL pfil, FP fp, long cb, bool fPacked) { AssertBaseThis(0); AssertPo(pfil, 0); _flo.pfil = pfil; _flo.pfil->AddRef(); _flo.fp = fp; _flo.cb = cb; _hq = hqNil; _fPacked = FPure(fPacked); AssertThis(0); } /*************************************************************************** Another constructor for a data block. Assumes ownership of the hq (and sets *phq to hqNil). ***************************************************************************/ BLCK::BLCK(HQ *phq, bool fPacked) { AssertBaseThis(0); AssertVarMem(phq); AssertHq(*phq); _flo.pfil = pvNil; _hq = *phq; *phq = hqNil; _ibMin = 0; _ibLim = CbOfHq(_hq); _fPacked = FPure(fPacked); AssertThis(0); } /*************************************************************************** Another constructor for a data block. ***************************************************************************/ BLCK::BLCK(void) { AssertBaseThis(0); _flo.pfil = pvNil; _hq = hqNil; _fPacked = fFalse; AssertThis(0); } /*************************************************************************** The destructor. ***************************************************************************/ BLCK::~BLCK(void) { AssertThis(0); Free(); } /*************************************************************************** Set the data block to refer to the given flo. ***************************************************************************/ void BLCK::Set(PFLO pflo, bool fPacked) { AssertThis(0); AssertPo(pflo, 0); Free(); _flo = *pflo; _flo.pfil->AddRef(); _fPacked = FPure(fPacked); AssertThis(0); } /*************************************************************************** Set the data block to refer to the given range on the file. ***************************************************************************/ void BLCK::Set(PFIL pfil, FP fp, long cb, bool fPacked) { AssertThis(0); AssertPo(pfil, 0); Free(); _flo.pfil = pfil; _flo.pfil->AddRef(); _flo.fp = fp; _flo.cb = cb; _fPacked = FPure(fPacked); AssertThis(0); } /*************************************************************************** Set the data block to the given hq. Assumes ownership of the hq and sets *phq to hqNil. ***************************************************************************/ void BLCK::SetHq(HQ *phq, bool fPacked) { AssertThis(0); AssertVarMem(phq); AssertHq(*phq); Free(); _hq = *phq; *phq = hqNil; _ibMin = 0; _ibLim = CbOfHq(_hq); _fPacked = FPure(fPacked); AssertThis(0); } /*************************************************************************** Free the block (make it empty). ***************************************************************************/ void BLCK::Free(void) { AssertThis(0); ReleasePpo(&_flo.pfil); FreePhq(&_hq); _fPacked = fFalse; AssertThis(0); } /*************************************************************************** Return an hq to the data. If the blck is a memory based block, the block is also "freed". If the block hasn't been packed or unpacked or had its min or lim moved, the hq returned is the one originally passed to the constructor or SetHq. ***************************************************************************/ HQ BLCK::HqFree(bool fPackedOk) { AssertThis(0); HQ hq; if (!fPackedOk && _fPacked) { Bug("accessing packed data"); return hqNil; } if (pvNil != _flo.pfil) { _flo.FReadHq(&hq); return hq; } if (pvNil != _hq) { hq = _hq; _hq = hqNil; _fPacked = fFalse; if (_ibMin > 0) { byte *qrgb = (byte *)QvFromHq(hq); BltPb(qrgb + _ibMin, qrgb, _ibLim - _ibMin); _ibLim -= _ibMin; } if (CbOfHq(hq) > _ibLim) AssertDo(FResizePhq(&hq, _ibLim, fmemNil, mprNormal), 0); AssertThis(0); return hq; } return hqNil; } /*************************************************************************** Return the length of the data block. ***************************************************************************/ long BLCK::Cb(bool fPackedOk) { AssertThis(fPackedOk ? 0 : fblckUnpacked); if (pvNil != _flo.pfil) return _flo.cb; if (hqNil != _hq) return _ibLim - _ibMin; return 0; } /*************************************************************************** Create a temporary buffer. ***************************************************************************/ bool BLCK::FSetTemp(long cb, bool fForceFile) { AssertThis(0); PFIL pfil; if (!fForceFile && cb < (1L << 23) /* 8 MB */) { // try to allocate enough mem HQ hq; if (FAllocHq(&hq, cb, fmemNil, mprNormal)) { SetHq(&hq, _fPacked); return fTrue; } } if (pvNil == (pfil = FIL::PfilCreateTemp())) return fFalse; Set(pfil, 0, cb, _fPacked); ReleasePpo(&pfil); return fTrue; } /*************************************************************************** Move the beginning of the block. Doesn't change the location of the end of the block. Fails if you try to move before the beginning of the physical storage or after the lim of the block. ***************************************************************************/ bool BLCK::FMoveMin(long dib) { AssertThis(0); if (pvNil != _flo.pfil) { if (!FIn(dib, -_flo.fp, _flo.cb + 1)) return fFalse; _flo.fp += dib; _flo.cb -= dib; return fTrue; } if (hqNil != _hq) { if (!FIn(dib + _ibMin, 0, _ibLim + 1)) return fFalse; _ibMin += dib; return fTrue; } return fFalse; } /*************************************************************************** Move the end of the block. Doesn't change the location of the beginning of the block. Fails if you try to move before the min of the block or after the end of the physical storage. ***************************************************************************/ bool BLCK::FMoveLim(long dib) { AssertThis(0); if (pvNil != _flo.pfil) { if (!FIn(dib, -_flo.cb, kcbMax - _flo.fp)) return fFalse; _flo.cb += dib; return fTrue; } if (hqNil != _hq) { if (!FIn(dib + _ibLim, _ibMin, CbOfHq(_hq) + 1)) return fFalse; _ibLim += dib; return fTrue; } return fFalse; } /*************************************************************************** Read a range of bytes from the data block. ***************************************************************************/ bool BLCK::FReadRgb(void *pv, long cb, long ib, bool fPackedOk) { AssertThis(0); AssertPvCb(pv, cb); if (!fPackedOk && _fPacked) { Bug("reading packed data"); return fFalse; } if (!_FRangeIn(Cb(fTrue), cb, ib)) { Bug("reading outside blck"); return fFalse; } if (pvNil != _flo.pfil) return _flo.FReadRgb(pv, cb, ib); if (hqNil != _hq) { CopyPb((byte *)QvFromHq(_hq) + ib + _ibMin, pv, cb); return fTrue; } Assert(cb == 0 && ib == 0, 0); return fTrue; } /*************************************************************************** Write a range of bytes to the data block. ***************************************************************************/ bool BLCK::FWriteRgb(void *pv, long cb, long ib, bool fPackedOk) { AssertThis(0); AssertPvCb(pv, cb); if (!fPackedOk && _fPacked) { Bug("writing packed data"); return fFalse; } if (!_FRangeIn(Cb(fTrue), cb, ib)) { Bug("writing outside blck"); return fFalse; } if (pvNil != _flo.pfil) return _flo.FWriteRgb(pv, cb, ib); if (hqNil != _hq) { CopyPb(pv, (byte *)QvFromHq(_hq) + ib + _ibMin, cb); return fTrue; } Assert(cb == 0 && ib == 0, 0); return fTrue; } /*************************************************************************** Read a range of bytes from the data block and put it in an hq. ***************************************************************************/ bool BLCK::FReadHq(HQ *phq, long cb, long ib, bool fPackedOk) { AssertThis(0); AssertVarMem(phq); *phq = hqNil; if (!fPackedOk && _fPacked) { Bug("reading packed data"); return fFalse; } if (!_FRangeIn(Cb(fTrue), cb, ib)) { Bug("reading outside blck 2"); return fFalse; } if (pvNil != _flo.pfil) return _flo.FReadHq(phq, cb, ib); if (hqNil != _hq) { if (!FAllocHq(phq, cb, fmemNil, mprNormal)) return fFalse; CopyPb((byte *)QvFromHq(_hq) + ib + _ibMin, QvFromHq(*phq), cb); return fTrue; } Assert(cb == 0 && ib == 0, 0); return fTrue; } /*************************************************************************** Write an hq to the data block. ***************************************************************************/ bool BLCK::FWriteHq(HQ hq, long ib, bool fPackedOk) { AssertThis(0); AssertHq(hq); long cb = CbOfHq(hq); if (!fPackedOk && _fPacked) { Bug("writing packed data"); return fFalse; } if (!_FRangeIn(Cb(fTrue), cb, ib)) { Bug("writing outside blck 2"); return fFalse; } if (pvNil != _flo.pfil) return _flo.FWriteHq(hq, ib); if (hqNil != _hq) { CopyPb(QvFromHq(hq), (byte *)QvFromHq(_hq) + ib + _ibMin, cb); return fTrue; } Assert(cb == 0 && ib == 0, 0); return fTrue; } /*************************************************************************** Write the block to a flo. ***************************************************************************/ bool BLCK::FWriteToFlo(PFLO pfloDst, bool fPackedOk) { AssertThis(fblckReadable); AssertPo(pfloDst, 0); if (!fPackedOk && _fPacked) { Bug("copying packed data"); return fFalse; } if (Cb(fTrue) != pfloDst->cb) { Bug("flo is wrong size"); return fFalse; } if (pvNil != _flo.pfil) return _flo.FCopy(pfloDst); if (hqNil != _hq) { bool fRet; fRet = pfloDst->FWrite(PvAddBv(PvLockHq(_hq), _ibMin)); UnlockHq(_hq); return fRet; } return fTrue; } /*************************************************************************** Write this block to another block. ***************************************************************************/ bool BLCK::FWriteToBlck(PBLCK pblckDst, bool fPackedOk) { AssertThis(fblckReadable); AssertPo(pblckDst, 0); long cb; if (!fPackedOk && _fPacked) { Bug("copying packed data"); return fFalse; } if ((cb = Cb(fTrue)) != pblckDst->Cb(fTrue)) { Bug("blck is wrong size"); return fFalse; } if (pvNil != pblckDst->_flo.pfil) return FWriteToFlo(&pblckDst->_flo, fPackedOk); if (hqNil != pblckDst->_hq) { bool fRet; fRet = FReadRgb((byte *)PvLockHq(pblckDst->_hq) + pblckDst->_ibMin, cb, 0, fTrue); UnlockHq(pblckDst->_hq); return fRet; } return fTrue; } /*************************************************************************** Get a flo to the data in the block. ***************************************************************************/ bool BLCK::FGetFlo(PFLO pflo, bool fPackedOk) { AssertThis(0); AssertVarMem(pflo); if (!fPackedOk && _fPacked) { Bug("accessing packed data"); return fFalse; } if (pvNil != _flo.pfil) { *pflo = _flo; pflo->pfil->AddRef(); return fTrue; } if (hqNil != _hq && _ibLim > _ibMin) { bool fRet; if (pvNil == (pflo->pfil = FIL::PfilCreateTemp())) goto LFail; pflo->fp = 0; pflo->cb = _ibLim - _ibMin; fRet = pflo->FWrite(PvAddBv(PvLockHq(_hq), _ibMin)); UnlockHq(_hq); if (!fRet) { LFail: ReleasePpo(&pflo->pfil); TrashVar(pflo); return fFalse; } return fTrue; } pflo->pfil = pvNil; pflo->fp = pflo->cb = 0; return fTrue; } /*************************************************************************** Return whether the block is packed. If the block is compressed, but determining the compression type failed, *pcfmt is set to cfmtNil and true is returned. ***************************************************************************/ bool BLCK::FPacked(long *pcfmt) { AssertThis(0); AssertNilOrVarMem(pcfmt); if (pvNil != pcfmt && (!_fPacked || !vpcodmUtil->FGetCfmtFromBlck(this, pcfmt))) { *pcfmt = cfmtNil; } return _fPacked; } /*************************************************************************** If the block is unpacked, pack it. If cfmt is cfmtNil, use the default packing format, otherwise use the one specified. If the block is already packed, this doesn't change the packing format. ***************************************************************************/ bool BLCK::FPackData(long cfmt) { AssertThis(0); HQ hq; if (_fPacked) return fTrue; if (pvNil != _flo.pfil) { if (!_flo.FReadHq(&hq)) return fFalse; if (!vpcodmUtil->FCompressPhq(&hq, cfmt)) { FreePhq(&hq); AssertThis(fblckUnpacked | fblckFile); return fFalse; } SetHq(&hq, fTrue); } else if (hqNil == _hq) return fFalse; else { AssertHq(_hq); if (_ibMin != 0 || _ibLim != CbOfHq(_hq)) { hq = HqFree(); SetHq(&hq, fFalse); } Assert(_ibMin == 0 && _ibLim == CbOfHq(_hq), 0); if (!vpcodmUtil->FCompressPhq(&_hq, cfmt)) { AssertThis(fblckUnpacked | fblckMemory); return fFalse; } _ibMin = 0; _ibLim = CbOfHq(_hq); _fPacked = fTrue; } AssertThis(fblckPacked | fblckMemory); return fTrue; } /*************************************************************************** If the block is packed, unpack it. ***************************************************************************/ bool BLCK::FUnpackData(void) { AssertThis(0); HQ hq; if (!_fPacked) return fTrue; if (pvNil != _flo.pfil) { if (!_flo.FReadHq(&hq)) return fFalse; if (!vpcodmUtil->FDecompressPhq(&hq)) { FreePhq(&hq); AssertThis(fblckPacked | fblckFile); return fFalse; } SetHq(&hq, fFalse); } else if (hqNil == _hq) return fFalse; else { AssertHq(_hq); if (_ibMin != 0 || _ibLim != CbOfHq(_hq)) { hq = HqFree(); SetHq(&hq, fTrue); } Assert(_ibMin = 0 && _ibLim == CbOfHq(_hq), 0); if (!vpcodmUtil->FDecompressPhq(&_hq)) { AssertThis(fblckPacked | fblckMemory); return fFalse; } _ibMin = 0; _ibLim = CbOfHq(_hq); _fPacked = fFalse; } AssertThis(fblckUnpacked | fblckMemory); return fTrue; } /*************************************************************************** Return the amount of memory the block is using (roughly). ***************************************************************************/ long BLCK::CbMem(void) { AssertThis(0); if (pvNil == _flo.pfil && hqNil != _hq) return CbOfHq(_hq); return 0; } #ifdef DEBUG /*************************************************************************** Assert the validity of a BLCK. ***************************************************************************/ void BLCK::AssertValid(ulong grfblck) { BLCK_PAR::AssertValid(0); if (pvNil != _flo.pfil) { AssertPo(&_flo, (grfblck & fblckReadable) ? ffloReadable : 0); Assert(hqNil == _hq, "both the _flo and _hq are non-nil"); Assert(!(grfblck & fblckMemory) || (grfblck & fblckFile), "block should be memory based"); } else if (hqNil != _hq) { Assert(!(grfblck & fblckFile) || (grfblck & fblckMemory), "block should be file based"); AssertHq(_hq); long cb = CbOfHq(_hq); AssertIn(_ibMin, 0, cb + 1); AssertIn(_ibLim, _ibMin, cb + 1); } Assert(_fPacked || !(grfblck & fblckPacked), "block should be packed"); Assert(!_fPacked || !(grfblck & fblckUnpacked), "block should be unpacked"); } /*************************************************************************** Mark memory for the BLCK. ***************************************************************************/ void BLCK::MarkMem(void) { AssertValid(0); BLCK_PAR::MarkMem(); MarkHq(_hq); } #endif // DEBUG /*************************************************************************** Constructor for a file based message sink. ***************************************************************************/ MSFIL::MSFIL(PFIL pfil) { AssertNilOrPo(pfil, 0); _fError = fFalse; _pfil = pvNil; _fpCur = 0; if (pvNil != pfil) SetFile(pfil); } /*************************************************************************** Destructor for a file based message sink. ***************************************************************************/ MSFIL::~MSFIL(void) { AssertThis(0); ReleasePpo(&_pfil); } #ifdef DEBUG /*************************************************************************** Assert the validity of a MSFIL. ***************************************************************************/ void MSFIL::AssertValid(ulong grf) { MSFIL_PAR::AssertValid(0); AssertNilOrPo(_pfil, 0); Assert(_fError || pvNil == _pfil || _fpCur == _pfil->FpMac() || _pfil->ElError() != elNil, "bad _fpCur"); } #endif // DEBUG /*************************************************************************** Set the current file to use for the MSFIL. ***************************************************************************/ void MSFIL::SetFile(PFIL pfil) { AssertThis(0); AssertNilOrPo(pfil, 0); _fError = fFalse; if (pfil != pvNil) pfil->AddRef(); ReleasePpo(&_pfil); _pfil = pfil; _fpCur = 0; if (pvNil != _pfil) { _fError |= !_pfil->FSetFpMac(0); #ifdef UNICODE wchar chw = kchwUnicode; _fError |= !_pfil->FWriteRgbSeq(&chw, size(wchar), &_fpCur); #endif // UNICODE } } /*************************************************************************** Return the output file and give the caller our reference count on it. ***************************************************************************/ PFIL MSFIL::PfilRelease(void) { AssertThis(0); PFIL pfil = _pfil; _pfil = pvNil; return pfil; } /*************************************************************************** Dump a line to the file. ***************************************************************************/ void MSFIL::ReportLine(PSZ psz) { AssertThis(0); AssertNilOrPo(_pfil, 0); achar rgch[2] = {kchReturn, kchLineFeed}; Report(psz); if (pvNil != _pfil) { _fError |= !_pfil->FWriteRgbSeq(rgch, MacWin(size(achar), 2 * size(achar)), &_fpCur); } } /*************************************************************************** Dump some text to the file. ***************************************************************************/ void MSFIL::Report(PSZ psz) { AssertThis(0); AssertNilOrPo(_pfil, 0); if (pvNil == _pfil) { SetFile(FIL::PfilCreateTemp()); if (pvNil == _pfil) { _fError = fTrue; return; } } _fError |= !_pfil->FWriteRgbSeq(psz, CchSz(psz) * size(achar), &_fpCur); } /*************************************************************************** Return whether there has been an error writing to this message sink. ***************************************************************************/ bool MSFIL::FError(void) { AssertThis(0); return _fError; } ================================================ FILE: kauai/src/file.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation File management. ***************************************************************************/ #ifndef FILE_H #define FILE_H /**************************************** Byte order issues ****************************************/ const short kboCur = 0x0001; const short kboOther = 0x0100; /**************************************** Basic types ****************************************/ typedef long FP; enum { ffilNil = 0x00, ffilWriteEnable = 0x01, // we can write to the file ffilDenyWrite = 0x02, // others can't write to the file ffilDenyRead = 0x04, // others can't read the file ffilTemp = 0x10, ffilMark = 0x20 }; const ulong kgrffilPerm = ffilWriteEnable | ffilDenyWrite | ffilDenyRead; // file error levels - in order of severity enum { elNil, kelWrite, kelRead, kelSeek, kelCritical }; /**************************************** FIL class ****************************************/ typedef class FIL *PFIL; #define FIL_PAR BLL #define kclsFIL 'FIL' class FIL : public FIL_PAR { RTCLASS_DEC BLL_DEC(FIL, PfilNext) ASSERT protected: // static member variables static MUTX _mutxList; static PFIL _pfilFirst; MUTX _mutx; FNI _fni; bool _fOpen : 1; bool _fEverOpen : 1; bool _fWrote : 1; ulong _grffil; // permissions, mark and temp flags long _el; #ifdef MAC short _fref; #elif defined(WIN) HANDLE _hfile; #endif // WIN // private methods FIL(FNI *pfni, ulong grffil); ~FIL(void); bool _FOpen(bool fCreate, ulong grffil); void _Close(bool fFinal = fFalse); void _SetFpPos(FP fp); public: // public static members static FTG vftgCreator; public: // static methods static void ClearMarks(void); static void CloseUnmarked(void); static void ShutDown(void); // static methods returning a PFIL static PFIL PfilFirst(void) { return _pfilFirst; } static PFIL PfilOpen(FNI *pfni, ulong grffil = ffilDenyWrite); static PFIL PfilCreate(FNI *pfni, ulong grffil = ffilWriteEnable | ffilDenyWrite); static PFIL PfilCreateTemp(FNI *pfni = pvNil); static PFIL PfilFromFni(FNI *pfni); virtual void Release(void); void Mark(void) { _grffil |= ffilMark; } long ElError(void) { return _el; } void SetEl(long el = elNil) { _el = el; } bool FSetGrffil(ulong grffil, ulong grffilMask = ~0); ulong GrffilCur(void) { return _grffil; } void SetTemp(bool fTemp = fTrue); bool FTemp(void) { return FPure(_grffil & ffilTemp); } void GetFni(FNI *pfni) { *pfni = _fni; } void GetStnPath(PSTN pstn); bool FSetFpMac(FP fp); FP FpMac(void); bool FReadRgb(void *pv, long cb, FP fp); bool FReadRgbSeq(void *pv, long cb, FP *pfp) { AssertVarMem(pfp); if (!FReadRgb(pv, cb, *pfp)) return fFalse; *pfp += cb; return fTrue; } bool FWriteRgb(void *pv, long cb, FP fp); bool FWriteRgbSeq(void *pv, long cb, FP *pfp) { AssertVarMem(pfp); if (!FWriteRgb(pv, cb, *pfp)) return fFalse; *pfp += cb; return fTrue; } bool FSwapNames(PFIL pfil); bool FRename(FNI *pfni); bool FSetFni(FNI *pfni); void Flush(void); }; /**************************************** File Location Class ****************************************/ // for AssertValid enum { ffloNil, ffloReadable, }; typedef struct FLO *PFLO; struct FLO { PFIL pfil; FP fp; long cb; bool FRead(void *pv) { return FReadRgb(pv, cb, 0); } bool FWrite(void *pv) { return FWriteRgb(pv, cb, 0); } bool FReadRgb(void *pv, long cbRead, FP dfp); bool FWriteRgb(void *pv, long cbWrite, FP dfp); bool FCopy(PFLO pfloDst); bool FReadHq(HQ *phq, long cbRead, FP dfp = 0); bool FWriteHq(HQ hq, FP dfp = 0); bool FReadHq(HQ *phq) { return FReadHq(phq, cb, 0); } bool FTranslate(short osk); ASSERT }; /*************************************************************************** Data block class - wrapper around either a flo or an hq. ***************************************************************************/ enum { fblckNil = 0, fblckPacked = 1, fblckUnpacked = 2, fblckFile = 4, fblckMemory = 8, fblckReadable = 16, }; typedef class BLCK *PBLCK; #define BLCK_PAR BASE #define kclsBLCK 'BLCK' class BLCK : public BLCK_PAR { RTCLASS_DEC NOCOPY(BLCK) ASSERT MARKMEM protected: bool _fPacked; // for file based blocks FLO _flo; // for memory based blocks HQ _hq; long _ibMin; long _ibLim; public: BLCK(PFLO pflo, bool fPacked = fFalse); BLCK(PFIL pfil, FP fp, long cb, bool fPacked = fFalse); BLCK(HQ *phq, bool fPacked = fFalse); BLCK(void); ~BLCK(void); void Set(PFLO pflo, bool fPacked = fFalse); void Set(PFIL pfil, FP fp, long cb, bool fPacked = fFalse); void SetHq(HQ *phq, bool fPacked = fFalse); void Free(void); HQ HqFree(bool fPackedOk = fFalse); long Cb(bool fPackedOk = fFalse); // changing the range of the block bool FMoveMin(long dib); bool FMoveLim(long dib); // create a temp block bool FSetTemp(long cb, bool fForceFile = fFalse); // reading from and writing to bool FRead(void *pv, bool fPackedOk = fFalse) { return FReadRgb(pv, Cb(fPackedOk), 0, fPackedOk); } bool FWrite(void *pv, bool fPackedOk = fFalse) { return FWriteRgb(pv, Cb(fPackedOk), 0, fPackedOk); } bool FReadRgb(void *pv, long cb, long ib, bool fPackedOk = fFalse); bool FWriteRgb(void *pv, long cb, long ib, bool fPackedOk = fFalse); bool FReadHq(HQ *phq, long cb, long ib, bool fPackedOk = fFalse); bool FWriteHq(HQ hq, long ib, bool fPackedOk = fFalse); bool FReadHq(HQ *phq, bool fPackedOk = fFalse) { return FReadHq(phq, Cb(fPackedOk), 0, fPackedOk); } // writing a block to a flo or another blck. bool FWriteToFlo(PFLO pfloDst, bool fPackedOk = fFalse); bool FWriteToBlck(PBLCK pblckDst, bool fPackedOk = fFalse); bool FGetFlo(PFLO pflo, bool fPackedOk = fFalse); // packing and unpacking bool FPacked(long *pcfmt = pvNil); bool FPackData(long cfmt = cfmtNil); bool FUnpackData(void); // Amount of memory being used long CbMem(void); }; /*************************************************************************** Message sink class. Basic interface for output streaming. ***************************************************************************/ typedef class MSNK *PMSNK; #define MSNK_PAR BASE #define kclsMSNK 'MSNK' class MSNK : public MSNK_PAR { RTCLASS_INLINE(MSNK) public: virtual void ReportLine(PSZ psz) = 0; virtual void Report(PSZ psz) = 0; virtual bool FError(void) = 0; }; /*************************************************************************** File based message sink. ***************************************************************************/ typedef class MSFIL *PMSFIL; #define MSFIL_PAR MSNK #define kclsMSFIL 'msfl' class MSFIL : public MSFIL_PAR { ASSERT RTCLASS_DEC protected: bool _fError; PFIL _pfil; FP _fpCur; void _EnsureFile(void); public: MSFIL(PFIL pfil = pvNil); ~MSFIL(void); virtual void ReportLine(PSZ psz); virtual void Report(PSZ psz); virtual bool FError(void); void SetFile(PFIL pfil); PFIL PfilRelease(void); }; #endif //! FILE_H ================================================ FILE: kauai/src/filemac.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation File management. ***************************************************************************/ #include "util.h" #include ASSERTNAME /*************************************************************************** Open or create the file. If the file is already open, sets the permissions according to grffil. Note that the ffilDenyRead and ffilDenyWrite do not work as in Windows. Effectively, this routine picks one of the following combinations: ffilWriteEnable | ffilDenyRead | ffilDenyWrite ffilDenyWrite ***************************************************************************/ bool FIL::_FOpen(bool fCreate, ulong grffil) { AssertBaseThis(0); AssertPo(&_fni, ffniFile); short fref; if (_el != elNil) goto LFail; // we just care about the permissions if (grffil & ffilWriteEnable) grffil = ffilWriteEnable | ffilDenyRead | ffilDenyWrite; else grffil = ffilDenyWrite; // create the file if we need to if (fCreate) { Assert(!_fOpen, "Creating an open file"); short cact, err; for (cact = 0;; cact++) { if ((err = FSpCreate(&_fni._fss, vftgCreator, _fni._ftg, smSystemScript)) == noErr) { break; } if (cact > 0 || err != dupFNErr || FSpDelete(&_fni._fss) != noErr) goto LFail; } } else if (_fOpen && (~_grffil & grffil) == 0) { // permissions are already set high enough return fTrue; } if (noErr != FSpOpenDF(&_fni._fss, (grffil & ffilWriteEnable) ? fsRdWrPerm : fsRdPerm, &fref)) { LFail: if (!_fOpen) _el = kelCritical; return fFalse; } if (_fOpen && _fref != fref) FSClose(_fref); _fref = fref; _fOpen = fTrue; _grffil = _grffil & ~kgrffilPerm | grffil; return fTrue; } /*************************************************************************** Close the file. ***************************************************************************/ void FIL::_Close(void) { AssertBaseThis(0); if (_fOpen) { FSClose(_fref); if (_fWrote) FlushVol(pvNil, _fni._fss.vRefNum); _fOpen = fFalse; _fref = 0; if (_grffil & ffilTemp) FSpDelete(&_fni._fss); } _el = elNil; } /*************************************************************************** Flush the file (and its volume?). ***************************************************************************/ void FIL::Flush(void) { AssertThis(0); FlushVol(pvNil, _fni._fss.vRefNum); } /*************************************************************************** Seek to the given fp. ***************************************************************************/ void FIL::_SetFpPos(FP fp) { AssertThis(0); if (_el < kelSeek && SetFPos(_fref, fsFromStart, fp) != noErr) { _el = kelSeek; PushErc(ercFileGeneral); } } /*************************************************************************** Set the length of the file. ***************************************************************************/ bool FIL::FSetFpMac(FP fp) { AssertThis(0); AssertIn(fp, 0, kcbMax); if (_el >= kelWrite) return fFalse; _fWrote = fTrue; Assert(_grffil & ffilWriteEnable, "file not open for write"); if (SetEOF(_fref, fp) != noErr) { _el = kelWrite; PushErc(ercFileGeneral); return fFalse; } return fTrue; } /*************************************************************************** Return the length of the file. ***************************************************************************/ FP FIL::FpMac(void) { AssertThis(0); FP fp; if (_el < kelSeek && GetEOF(_fref, &fp) != noErr) { _el = kelSeek; PushErc(ercFileGeneral); } return _el < kelSeek ? fp : 0; } /*************************************************************************** Read a block from the file. ***************************************************************************/ bool FIL::FReadRgb(void *pv, long cb, FP fp) { AssertThis(0); AssertIn(cb, 0, kcbMax); AssertIn(fp, 0, klwMax); AssertPvCb(pv, cb); Debug(FP dfp = FpMac() - fp;) _SetFpPos(fp); if (_el >= kelRead) return fFalse; Assert(dfp >= cb, "read past EOF"); if (cb > 0 && FSRead(_fref, &cb, pv) != noErr) { _el = kelRead; PushErc(ercFileGeneral); return fFalse; } return fTrue; } /*************************************************************************** Write a block to the file. ***************************************************************************/ bool FIL::FWriteRgb(void *pv, long cb, FP fp) { AssertThis(0); AssertIn(cb, 0, kcbMax); AssertIn(fp, 0, klwMax); AssertPvCb(pv, cb); _SetFpPos(fp); if (_el >= kelWrite) return fFalse; Assert(_grffil & ffilWriteEnable, "file not open for write"); _fWrote = fTrue; if (cb > 0 && FSWrite(_fref, &cb, pv) != noErr) { _el = kelWrite; PushErc(ercFileGeneral); return fFalse; } return fTrue; } /*************************************************************************** Swap the names of the two files. They should be in the same directory. ***************************************************************************/ bool FIL::FSwapNames(PFIL pfil) { AssertThis(0); AssertPo(pfil, 0); FNI fni; if (_el != elNil || pfil->_el != elNil) return fFalse; Assert(_fni.FSameDir(&pfil->_fni), "trying to change directories with FSwapNames"); // swap the data if (FSpExchangeFiles(&_fni._fss, &pfil->_fni._fss) != noErr) { PushErc(ercFileSwapNames); return fFalse; } // swap the fni's fni = _fni; _fni = pfil->_fni; pfil->_fni = fni; AssertThis(0); AssertPo(pfil, 0); return fTrue; } /*************************************************************************** Rename the file. ***************************************************************************/ bool FIL::FRename(FNI *pfni) { AssertThis(0); AssertPo(pfni, ffniFile); if (_el != elNil) return fFalse; Assert(_fni.FSameDir(pfni), "trying to change directories with FRename"); if (FSpRename(&_fni._fss, pfni->_fss.name) != noErr) { PushErc(ercFileRename); return fFalse; } CopySt((achar *)pfni->_fss.name, (achar *)_fni._fss.name); AssertThis(0); return fTrue; } ================================================ FILE: kauai/src/filewin.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Windows specific file management. ***************************************************************************/ #include "util.h" ASSERTNAME const ulong kfpError = 0xFFFFFFFF; priv HANDLE _HfileOpen(PSZ pszFile, bool fCreate, ulong grffil); /*************************************************************************** Open or create the file by calling CreateFile. Returns hBadWin on failure. ***************************************************************************/ priv HANDLE _HfileOpen(PSZ psz, bool fCreate, ulong grffil) { ulong luAccess = GENERIC_READ; ulong luShare = 0; if (grffil & ffilWriteEnable) luAccess |= GENERIC_WRITE; if (!(grffil & ffilDenyRead)) luShare |= FILE_SHARE_READ; if (!(grffil & ffilDenyWrite)) luShare |= FILE_SHARE_WRITE; return CreateFile(psz, luAccess, luShare, pvNil, fCreate ? CREATE_ALWAYS : OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, pvNil); } /*************************************************************************** Open or create the file. If the file is already open, sets the permissions according to grffil. ***************************************************************************/ bool FIL::_FOpen(bool fCreate, ulong grffil) { AssertBaseThis(0); bool fRet = fFalse; _mutx.Enter(); if (_el >= kelCritical) goto LRet; grffil &= kgrffilPerm; if (_fOpen) { Assert(!fCreate, "can't create an open file"); if ((~_grffil & grffil) == 0) { // permissions are already set high enough fRet = fTrue; goto LRet; } CloseHandle(_hfile); _hfile = hBadWin; // maintain the permissions we had before grffil |= _grffil & kgrffilPerm; } _hfile = _HfileOpen(_fni._stnFile.Psz(), fCreate, grffil); if (hBadWin == _hfile) { // if it was open, re-open it with old permissions if (_fOpen) { _hfile = _HfileOpen(_fni._stnFile.Psz(), fFalse, _grffil); if (hBadWin != _hfile) goto LRet; } _fOpen = fFalse; _el = kelCritical; goto LRet; } _fOpen = fTrue; _fEverOpen = fTrue; _grffil = (_grffil & ~kgrffilPerm) | grffil; fRet = fTrue; LRet: _mutx.Leave(); return fRet; } /*************************************************************************** Close the file. ***************************************************************************/ void FIL::_Close(bool fFinal) { AssertBaseThis(0); _mutx.Enter(); if (_fOpen) { Flush(); CloseHandle(_hfile); _fOpen = fFalse; _hfile = hBadWin; } if ((_grffil & ffilTemp) && fFinal && _fEverOpen) { if (!DeleteFile(_fni._stnFile.Psz())) Warn("Deleting temp file failed"); } _mutx.Leave(); } /*************************************************************************** Flush the file (and its volume?). ***************************************************************************/ void FIL::Flush(void) { AssertThis(0); _mutx.Enter(); if (_fOpen) FlushFileBuffers(_hfile); _mutx.Leave(); } /*************************************************************************** Seek to the given fp - assumes the mutx is already entered. ***************************************************************************/ void FIL::_SetFpPos(FP fp) { AssertThis(0); if (!_fOpen) _FOpen(fFalse, _grffil); if (_el < kelSeek && SetFilePointer(_hfile, fp, pvNil, FILE_BEGIN) == kfpError) { PushErc(ercFileGeneral); _el = kelSeek; } } /*************************************************************************** Set the length of the file. This doesn't zero the appended portion. ***************************************************************************/ bool FIL::FSetFpMac(FP fp) { AssertThis(0); AssertIn(fp, 0, kcbMax); bool fRet; _mutx.Enter(); Assert(_grffil & ffilWriteEnable, "can't write to read only file"); _SetFpPos(fp); if (_el < kelWrite) { _fWrote = fTrue; if (!SetEndOfFile(_hfile)) { PushErc(ercFileGeneral); _el = kelWrite; } } fRet = _el < kelWrite; _mutx.Leave(); return fRet; } /*************************************************************************** Return the length of the file. ***************************************************************************/ FP FIL::FpMac(void) { AssertThis(0); FP fp; _mutx.Enter(); if (!_fOpen) _FOpen(fFalse, _grffil); if (_el < kelSeek && (fp = SetFilePointer(_hfile, 0, pvNil, FILE_END)) == kfpError) { PushErc(ercFileGeneral); _el = kelSeek; } if (_el >= kelSeek) fp = 0; _mutx.Leave(); return fp; } /*************************************************************************** Read a block from the file. ***************************************************************************/ bool FIL::FReadRgb(void *pv, long cb, FP fp) { AssertThis(0); AssertIn(cb, 0, kcbMax); AssertIn(fp, 0, klwMax); AssertPvCb(pv, cb); long cbT; bool fRet = fFalse; if (cb <= 0) return fTrue; _mutx.Enter(); if (!_fOpen) _FOpen(fFalse, _grffil); Debug(FP dfp = FpMac() - fp;) _SetFpPos(fp); if (_el >= kelRead) goto LRet; Assert(dfp >= cb, "read past EOF"); if (!ReadFile(_hfile, pv, cb, (ulong *)&cbT, pvNil) || cb != cbT) { PushErc(ercFileGeneral); _el = kelRead; goto LRet; } fRet = fTrue; LRet: _mutx.Leave(); return fRet; } /*************************************************************************** Write a block to the file. ***************************************************************************/ bool FIL::FWriteRgb(void *pv, long cb, FP fp) { AssertThis(0); AssertIn(cb, 0, kcbMax); AssertIn(fp, 0, klwMax); AssertPvCb(pv, cb); long cbT; bool fRet = fFalse; if (cb <= 0) return fTrue; _mutx.Enter(); Assert(_grffil & ffilWriteEnable, "can't write to read only file"); if (!_fOpen) _FOpen(fFalse, _grffil); _SetFpPos(fp); if (_el >= kelWrite) goto LRet; _fWrote = fTrue; if (!WriteFile(_hfile, pv, cb, (ulong *)&cbT, pvNil) || cb != cbT) { PushErc(ercFileGeneral); _el = kelWrite; goto LRet; } fRet = fTrue; LRet: _mutx.Leave(); return fRet; } /*************************************************************************** Swap the names of the two files. They should be in the same directory. ***************************************************************************/ bool FIL::FSwapNames(PFIL pfil) { AssertThis(0); AssertPo(pfil, 0); FNI fni; FNI fniT; bool fRet = fFalse; if (this == pfil) { Bug("Why are you calling FSwapNames on the same file?"); return fTrue; } _mutx.Enter(); pfil->_mutx.Enter(); Assert(_fni.FSameDir(&pfil->_fni), "trying to change directories with FSwapNames"); fni = pfil->_fni; if (!fni.FGetUnique(fni.Ftg())) goto LRet; _Close(); pfil->_Close(); if (!_fni.FRename(&fni)) goto LFail; if (!pfil->_fni.FRename(&_fni)) goto LRenameFail; if (!fni.FRename(&pfil->_fni)) { if (!_fni.FRename(&pfil->_fni)) { Bug("rename failure"); pfil->_fni = _fni; _fni = fni; goto LFail; } LRenameFail: if (!fni.FRename(&_fni)) { Bug("rename failure"); _fni = fni; } goto LFail; } fni = _fni; _fni = pfil->_fni; pfil->_fni = fni; fRet = fTrue; LFail: // reopen the files _FOpen(fFalse, _grffil); pfil->_FOpen(fFalse, pfil->_grffil); LRet: _mutx.Leave(); pfil->_mutx.Leave(); if (!fRet) PushErc(ercFileSwapNames); AssertThis(0); AssertPo(pfil, 0); return fRet; } /*************************************************************************** Rename a file. The new fni should be on the same volume. This may fail without an error code being set. ***************************************************************************/ bool FIL::FRename(FNI *pfni) { AssertThis(0); AssertPo(pfni, ffniFile); FNI fni; bool fRet = fFalse; _mutx.Enter(); Assert(_fni.FSameDir(pfni), "trying to change directories with FRename"); _Close(); if (fRet = _fni.FRename(pfni)) _fni = *pfni; // reopen the file if (!_FOpen(fFalse, _grffil)) fRet = fFalse; _mutx.Leave(); if (!fRet) PushErc(ercFileRename); AssertThis(0); return fRet; } ================================================ FILE: kauai/src/fni.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation File name handling. ***************************************************************************/ #ifndef FNI_H #define FNI_H #ifdef MAC typedef FSSpec FSS; #endif // MAC enum { ffniNil = 0x0000, ffniCreateDir = 0x0001, ffniMoveToDir = 0x0002, // for FNI::AssertValid #ifdef DEBUG ffniFile = 0x10000, ffniDir = 0x20000, ffniEmpty = 0x40000, #endif }; // Volume kinds: enum { fvkNil = 0x0000, fvkFloppy = 0x0001, fvkNetwork = 0x0002, fvkCD = 0x0004, fvkRemovable = 0x0008, }; typedef long FTG; // file type const FTG ftgNil = '...,'; const FTG kftgDir = '....'; const FTG kftgTemp = MacWin('temp', 'TMP'); // the standard temp file ftg const FTG kftgText = MacWin('TEXT', 'TXT'); extern FTG vftgTemp; // the ftg to use for temp files /**************************************** File name class ****************************************/ typedef class FNI *PFNI; #define FNI_PAR BASE #define kclsFNI 'FNI' class FNI : public FNI_PAR { RTCLASS_DEC ASSERT friend class FIL; friend class FNE; private: FTG _ftg; #ifdef MAC long _lwDir; // the directory id FSS _fss; #elif defined(WIN) STN _stnFile; #endif // WIN #ifdef WIN void _SetFtgFromName(void); long _CchExt(void); bool _FChangeLeaf(PSTN pstn); #endif // WIN public: FNI(void); // building FNIs #ifdef MAC bool FGetOpen(FTG *prgftg, short cftg); bool FGetSave(FTG ftg, PST pstPrompt, PST pstDefault); bool FBuild(long lwVol, long lwDir, PSTN pstn, FTG ftg); #elif defined(WIN) bool FGetOpen(achar *prgchFilter, HWND hwndOwner); bool FGetSave(achar *prgchFilter, HWND hwndOwner); bool FSearchInPath(PSTN pstn, PSTN pstnEnv = pvNil); #endif // WIN bool FBuildFromPath(PSTN pstn, FTG ftgDef = ftgNil); // REVIEW shonk: Mac: implement bool FGetUnique(FTG ftg); bool FGetTemp(void); void SetNil(void); FTG Ftg(void); ulong Grfvk(void); // volume kind (floppy/net/CD/etc) bool FChangeFtg(FTG ftg); bool FSetLeaf(PSTN pstn, FTG ftg = ftgNil); void GetLeaf(PSTN pstn); void GetStnPath(PSTN pstn); tribool TExists(void); bool FDelete(void); bool FRename(PFNI pfniNew); bool FEqual(PFNI pfni); bool FDir(void); bool FSameDir(PFNI pfni); bool FDownDir(PSTN pstn, ulong grffni); bool FUpDir(PSTN pstn, ulong grffni); }; #ifdef MAC #define FGetFniOpenMacro(pfni, prgftg, cftg, prgchFilter, hwndOwner) (pfni)->FGetOpen(prgftg, cftg) #define FGetFniSaveMacro(pfni, ftg, pstPrompt, pstDef, prgchFilter, hwndOwner) (pfni)->FGetSave(ftg, pstPrompt, pstDef) #endif // MAC #ifdef WIN #define FGetFniOpenMacro(pfni, prgftg, cftg, prgchFilter, hwndOwner) (pfni)->FGetOpen(prgchFilter, hwndOwner) #define FGetFniSaveMacro(pfni, ftg, pstPrompt, pstDef, prgchFilter, hwndOwner) (pfni)->FGetSave(prgchFilter, hwndOwner) #endif // WIN /**************************************** File name enumerator. ****************************************/ const long kcftgFneBase = 20; enum { ffneNil = 0, ffneRecurse = 1, // for FNextFni ffnePre = 0x10, ffnePost = 0x20, ffneSkipDir = 0x80, }; #define FNE_PAR BASE #define kclsFNE 'FNE' class FNE : public FNE_PAR { RTCLASS_DEC ASSERT MARKMEM NOCOPY(FNE) private: // file enumeration state struct FES { #ifdef MAC long lwVol; long lwDir; long iv; #endif // MAC #ifdef WIN FNI fni; // directory fni HN hn; // for enumerating files/directories WIN32_FIND_DATA wfd; ulong grfvol; // which volumes are available (for enumerating volumes) long chVol; // which volume we're on (for enumerating volumes) #endif // WIN }; FTG _rgftg[kcftgFneBase]; FTG *_prgftg; long _cftg; bool _fRecurse : 1; bool _fInited : 1; PGL _pglfes; FES _fesCur; void _Free(void); #ifdef WIN bool _FPop(void); #endif // WIN public: FNE(void); ~FNE(void); bool FInit(FNI *pfniDir, FTG *prgftg, long cftg, ulong grffne = ffneNil); bool FNextFni(FNI *pfni, ulong *pgrffneOut = pvNil, ulong grffneIn = ffneNil); }; #endif //! FNI_H ================================================ FILE: kauai/src/fnimac.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation File name management. ***************************************************************************/ #include "util.h" #include ASSERTNAME // This is the FTG to use for temp files - clients may set this to whatever // they want. FTG vftgTemp = kftgTemp; /*************************************************************************** Implementation notes: The _fss is a standard FSSpec record and is always filled in via a call to FSMakeFSSpec. If the fni is a directory, _ftg will be kftgDir. For files, _lwDir is the same as _fss.parID. For directories, _lwDir is the directory id for the directory described by the fni (while _fss.parID is the id of its parent). ***************************************************************************/ typedef StandardFileReply SFR; priv bool _FFssDir(FSS *pfss, long *plwDir); RTCLASS(FNI) RTCLASS(FNE) /*************************************************************************** Sets the fni to nil values. ***************************************************************************/ void FNI::SetNil(void) { _ftg = ftgNil; _lwDir = 0; ClearPb(&_fss, size(_fss)); AssertThis(ffniEmpty); } /*************************************************************************** Constructor for fni class. ***************************************************************************/ FNI::FNI(void) { SetNil(); } /*************************************************************************** Get an fni (for opening) from the user. ***************************************************************************/ bool FNI::FGetOpen(FTG *prgftg, short cftg) { AssertThis(0); AssertNilOrVarMem(prgftg); SFR sfr; StandardGetFile(pvNil, cftg <= 0 ? -1 : cftg, (ulong *)prgftg, &sfr); if (sfr.sfGood) { _fss = sfr.sfFile; _ftg = sfr.sfType; _lwDir = _fss.parID; AssertThis(ffniFile); } else SetNil(); return sfr.sfGood; } /*************************************************************************** Get an fni (for saving) from the user. ***************************************************************************/ bool FNI::FGetSave(FTG ftg, PST pstPrompt, PST pstDefault) { AssertThis(0); AssertNilOrSt(pstPrompt); AssertNilOrSt(pstDefault); SFR sfr; StandardPutFile((byte *)pstPrompt, (byte *)pstDefault, &sfr); if (sfr.sfGood) { _fss = sfr.sfFile; _ftg = ftg; _lwDir = _fss.parID; AssertThis(ffniFile); } else SetNil(); return sfr.sfGood; } /*************************************************************************** Get a unique filename in the given directory. ***************************************************************************/ bool FNI::FGetUnique(FTG ftg) { AssertThis(ffniFile | ffniDir); static long _dlw = 0; long lw; short cact; short err; STN stn; long lwDir = _lwDir; short swVol = _fss.vRefNum; Assert(ftg != kftgDir && ftg != ftgNil, "bad ftg"); lw = TsSystemCurrent() + ++_dlw; for (cact = 0; cact < 20; cact++, lw += ++_dlw) { AssertDo(stn.FFormatSz(PszLit("~TempFile#%08x"), lw), 0); err = FSMakeFSSpec(swVol, lwDir, &stn, &_fss); if (err == fnfErr) { _ftg = ftg; _lwDir = _fss.parID; AssertThis(ffniFile); return fTrue; } } SetNil(); PushErc(ercFniGeneral); return fFalse; } /*************************************************************************** Get a temporary fni. ***************************************************************************/ bool FNI::FGetTemp(void) { AssertThis(0); static short _swVolTemp = 0; static long _lwDirTemp = -1; // This is so we only call FindFolder once. if (_swVolTemp == 0 && _lwDirTemp == -1 && FindFolder(0, kTemporaryFolderType, kCreateFolder, &_swVolTemp, &_lwDirTemp) != noErr) { _swVolTemp = 0; _lwDirTemp = 0; } if (FSMakeFSSpec(_swVolTemp, _lwDirTemp, pvNil, &_fss) != noErr) { SetNil(); PushErc(ercFniGeneral); return fFalse; } _ftg = kftgDir; _lwDir = _lwDirTemp; return FGetUnique(vftgTemp); } /*************************************************************************** Return the file type of the fni. ***************************************************************************/ FTG FNI::Ftg(void) { AssertThis(0); return _ftg; } /*************************************************************************** Return the volume kind for the given fni. ***************************************************************************/ ulong FNI::Grfvk(void) { AssertThis(0); ulong grfvk = fvkNil; // REVIEW shonk: Mac Grfvk: implement RawRtn(); return grfvk; } /*************************************************************************** Set the leaf for the fni. ***************************************************************************/ bool FNI::FSetLeaf(PSTZ pstz, FTG ftg) { AssertThis(ffniFile | ffniDir); return FBuild(_fss.vRefNum, _lwDir, pstz, ftg); } /*************************************************************************** Set the leaf for the fni. ***************************************************************************/ bool FNI::FBuild(long lwVol, long lwDir, PSTZ pstz, FTG ftg) { AssertNilOrStz(pstz); short err; FSS fss; Assert(FPure(ftg == kftgDir) == FPure(pstz == pvNil || CchStz(pstz) == 0), "pstz doesn't match ftg"); if (ftg == kftgDir) pstz = pvNil; err = FSMakeFSSpec((short)lwVol, lwDir, (byte *)pstz, &fss); if (ftg == kftgDir) { // a directory (it had better exist) if (noErr != err) goto LFail; _lwDir = lwDir; } else { // not supposed to be a directory - so make sure it isn't if (fnfErr != err) { if (noErr != err) goto LFail; if (_FFssDir(&fss, pvNil)) goto LFail; } _lwDir = fss.parID; } _fss = fss; _ftg = ftg; AssertThis(ffniFile | ffniDir); return fTrue; LFail: SetNil(); PushErc(ercFniGeneral); return fFalse; } /*************************************************************************** Set the FTG for the fni. ***************************************************************************/ bool FNI::FChangeFtg(FTG ftg) { AssertThis(ffniFile); Assert(ftg != ftgNil && ftg != kftgDir, "Bad FTG"); _ftg = ftg; return fTrue; } /*************************************************************************** Get the leaf name for the fni. ***************************************************************************/ void FNI::GetLeaf(PSTZ pstz) { AssertThis(0); AssertMaxStz(pstz); if (_ftg == kftgDir) SetStzNil(pstz); else CopyStStz((achar *)_fss.name, pstz); } /*************************************************************************** Get a string representing the path of the fni. ***************************************************************************/ void FNI::GetStzPath(PSTZ pstz) { AssertThis(0); AssertMaxStz(pstz); RawRtn(); // REVIEW shonk: Mac GetStzPath: implement for real CopyStStz((achar *)_fss.name, pstz); } /*************************************************************************** Determines if the file/directory exists. Returns tMaybe on error or if the fni type (file or dir) doesn't match the disk object of the same name or if the file/dir is invisible or is an alias. Pushes an erc if it returns tMaybe. ***************************************************************************/ bool FNI::TExists(void) { AssertThis(ffniFile | ffniDir); CInfoPBRec iob; short err; achar st[kcbMaxSt]; ClearPb(&iob, size(iob)); CopySt((achar *)_fss.name, st); iob.hFileInfo.ioNamePtr = (byte *)st; iob.hFileInfo.ioVRefNum = _fss.vRefNum; iob.hFileInfo.ioDirID = _fss.parID; if ((err = PBGetCatInfo(&iob, fFalse)) != noErr) { if (err != fnfErr) { PushErc(ercFniGeneral); return tMaybe; } return tNo; } if ((_ftg == kftgDir) != FPure(iob.hFileInfo.ioFlAttrib & 0x0010)) { PushErc(ercFniMismatch); return tMaybe; } if (iob.hFileInfo.ioFlFndrInfo.fdFlags & (kIsInvisible | kIsAlias)) { PushErc(ercFniHidden); return tMaybe; } return tYes; } /*************************************************************************** Delete the file. ***************************************************************************/ bool FNI::FDelete(void) { AssertThis(ffniFile); if (FSpDelete(&_fss) == noErr) return fTrue; PushErc(ercFniDelete); return fFalse; } /*************************************************************************** Rename the file as indicated by *pfni. The directories must match. ***************************************************************************/ bool FNI::FRename(FNI *pfni) { AssertThis(ffniFile); AssertPo(pfni, ffniFile); Assert(_fss.vRefNum == pfni->_fss.vRefNum && _fss.parID == pfni->_fss.parID, "directory change"); Assert(_ftg == pfni->_ftg, "ftg's don't match"); if (FSpRename(&_fss, pfni->_fss.name) == noErr) return fTrue; PushErc(ercFniRename); return fFalse; } /*************************************************************************** Compare two fni's for equality. Doesn't consider the ftg's. ***************************************************************************/ bool FNI::FEqual(FNI *pfni) { // NOTE: see IM:Text, pg 5-17. It's not documented whether the comparison // should be case sensitive and/or diacritical sensitive. Experimenting // with the US finder indicates that we should use case insensitive, // diacritical sensitive comparison. AssertThis(ffniFile | ffniDir); AssertPo(pfni, ffniFile | ffniDir); return pfni->_fss.vRefNum == _fss.vRefNum && pfni->_fss.parID == _fss.parID && EqualString(pfni->_fss.name, _fss.name, fFalse, fTrue); } /*************************************************************************** Return whether the fni refers to a directory. ***************************************************************************/ bool FNI::FDir(void) { AssertThis(0); return _ftg == kftgDir; } /*************************************************************************** Return whether the directory portions of the fni's are the same. ***************************************************************************/ bool FNI::FSameDir(FNI *pfni) { AssertThis(ffniDir | ffniFile); AssertPo(pfni, ffniDir | ffniFile); return pfni->_fss.vRefNum == _fss.vRefNum && pfni->_lwDir == _lwDir; } /*************************************************************************** Determine if the directory pstz in fni exists, optionally creating it and/or moving into it. Specify ffniCreateDir to create it if it doesn't exist. Specify ffniMoveTo to make the fni refer to it. If this fails, the fni is untouched. ***************************************************************************/ bool FNI::FDownDir(PSTZ pstz, ulong grffni) { AssertThis(ffniDir); AssertStz(pstz); FSS fss; long lwDir; short err; // make the fss err = FSMakeFSSpec(_fss.vRefNum, _lwDir, (byte *)pstz, &fss); if (noErr == err) { // exists, make sure it is a directory and get the directory id if (!_FFssDir(&fss, &lwDir)) { PushErc(ercFniMismatch); return fFalse; } } else { if (fnfErr != err) { PushErc(ercFniGeneral); return fFalse; } // doesn't exist if (!(grffni & ffniCreateDir)) return fFalse; // create it err = FSpDirCreate(&fss, smSystemScript, &lwDir); if (err != noErr) { PushErc(ercFniDirCreate); return fFalse; } } if (grffni & ffniMoveToDir) { _fss = fss; _lwDir = lwDir; _ftg = kftgDir; } return fTrue; } /*************************************************************************** Gets the lowest directory name (if pstz is not nil) and optionally moves the fni up a level (if ffniMoveToDir is specified). If this fails, the fni is untouched. ***************************************************************************/ bool FNI::FUpDir(PSTZ pstz, ulong grffni) { AssertThis(ffniDir); AssertNilOrMaxStz(pstz); CInfoPBRec iob; short err; FSS fss; if (_lwDir == fsRtDirID) return fFalse; ClearPb(&iob, size(iob)); iob.dirInfo.ioFDirIndex = -1; // ignore name, look at vol/dir iob.dirInfo.ioNamePtr = (byte *)pstz; iob.dirInfo.ioVRefNum = _fss.vRefNum; iob.dirInfo.ioDrDirID = _lwDir; if (PBGetCatInfo(&iob, fFalse) != noErr) { PushErc(ercFniGeneral); return fFalse; } if (pstz != pvNil) SetStzCch(pstz, CchSt(pstz)); Assert(iob.dirInfo.ioFlAttrib & 0x0010, "not a directory?!"); if (grffni & ffniMoveToDir) { err = FSMakeFSSpec(_fss.vRefNum, iob.dirInfo.ioDrParID, pvNil, &fss); if (noErr != err) { PushErc(ercFniGeneral); return fFalse; } _fss = fss; _lwDir = iob.dirInfo.ioDrParID; _ftg = kftgDir; AssertThis(ffniDir); } return fTrue; } #ifdef DEBUG /*************************************************************************** Assert validity of the FNI. ***************************************************************************/ void FNI::AssertValid(ulong grffni) { FNI_PAR::AssertValid(0); if (grffni == 0) grffni = ffniEmpty | ffniFile | ffniDir; if (_ftg == ftgNil) { Assert(grffni & ffniEmpty, "unexpected nil fni"); Assert(_fss.vRefNum == 0 && _fss.parID == 0 && _lwDir == 0 && CchSt((achar *)_fss.name) == 0, "bad nil"); } else if (_ftg == kftgDir) { Assert(grffni & ffniDir, "unexpected dir"); Assert(_lwDir != _fss.parID, "dir is its own parent?"); } else { Assert(grffni & ffniFile, "unexpected file"); Assert(CchSt((achar *)_fss.name) > 0, "no name for file"); Assert(_lwDir == _fss.parID, "parent not consistent?"); } } #endif // DEBUG /*************************************************************************** Low level routine to determine if the given fss points to an existing directory. If so and plwDir is not nil, sets *plwDir to the id of the directory. ***************************************************************************/ priv bool _FFssDir(FSS *pfss, long *plwDir) { CInfoPBRec iob; // find the entry ClearPb(&iob, size(iob)); iob.hFileInfo.ioNamePtr = (StringPtr)pfss->name; iob.hFileInfo.ioVRefNum = pfss->vRefNum; iob.hFileInfo.ioDirID = pfss->parID; if (PBGetCatInfo(&iob, fFalse) != noErr) { PushErc(ercFniGeneral); goto LFail; } // entry exists so see if it's a directory if (!(iob.hFileInfo.ioFlAttrib & 0x0010)) { LFail: TrashVar(plwDir); return fFalse; } if (plwDir != pvNil) *plwDir = iob.dirInfo.ioDrDirID; return fTrue; } /*************************************************************************** Constructor for a File Name Enumerator. ***************************************************************************/ FNE::FNE(void) { AssertBaseThis(0); _prgftg = _rgftg; _pglfes = pvNil; _fInited = fFalse; AssertThis(0); } /*************************************************************************** Destructor for an FNE. ***************************************************************************/ FNE::~FNE(void) { AssertBaseThis(0); _Free(); } /*************************************************************************** Free all the memory associated with the FNE. ***************************************************************************/ void FNE::_Free(void) { if (_prgftg != _rgftg) { FreePpv((void **)&_prgftg); _prgftg = _rgftg; } ReleasePpo(&_pglfes); _fInited = fFalse; AssertThis(0); } /*************************************************************************** Initialize the fne to do an enumeration. ***************************************************************************/ bool FNE::FInit(FNI *pfniDir, FTG *prgftg, long cftg, ulong grffne) { AssertThis(0); AssertNilOrVarMem(pfniDir); AssertIn(cftg, 0, kcbMax); AssertPvCb(prgftg, LwMul(cftg, size(FTG))); // free the old stuff _Free(); if (0 >= cftg) _cftg = 0; else { long cb = LwMul(cftg, size(FTG)); if (cftg > kcftgFneBase && !FAllocPv((void **)&_prgftg, cb, fmemNil, mprNormal)) { _prgftg = _rgftg; PushErc(ercFneGeneral); AssertThis(0); return fFalse; } CopyPb(prgftg, _prgftg, cb); _cftg = cftg; } if (pfniDir == pvNil) _fesCur.lwVol = 0; else { _fesCur.lwVol = (long)pfniDir->_fss.vRefNum; _fesCur.lwDir = pfniDir->_lwDir; } _fesCur.iv = 0; _fRecurse = FPure(grffne & ffneRecurse); _fInited = fTrue; AssertThis(0); return fTrue; } /*************************************************************************** Get the next FNI in the enumeration. ***************************************************************************/ bool FNE::FNextFni(FNI *pfni, ulong *pgrffneOut, ulong grffneIn) { AssertThis(0); AssertVarMem(pfni); AssertNilOrVarMem(pgrffneOut); short err; if (!_fInited) { Bug("must initialize the FNE before using it!"); return fFalse; } if (grffneIn & ffneSkipDir) { // skip the rest of the stuff in this dir if (pvNil == _pglfes || !_pglfes->FPop(&_fesCur)) goto LDone; } if (_fesCur.lwVol == 0) { // volume ParamBlockRec iob; do { ClearPb(&iob, size(iob)); iob.volumeParam.ioVolIndex = (short)++_fesCur.iv; if ((err = PBGetVInfoSync(&iob)) != noErr) { if (err != nsvErr) PushErc(ercFneGeneral); goto LDone; } } while (!pfni->FBuild(iob.volumeParam.ioVRefNum, 0, pvNil, kftgDir)); // we've got one goto LGotOne; } // directory or file for (;;) { int ich; bool fT; FTG *pftg; PSZ pszExt; CInfoPBRec iob; achar stz[kcbMaxStz]; ClearPb(&iob, size(iob)); iob.hFileInfo.ioNamePtr = (byte *)stz; iob.hFileInfo.ioVRefNum = (short)_fesCur.lwVol; iob.hFileInfo.ioDirID = _fesCur.lwDir; iob.hFileInfo.ioFDirIndex = (short)++_fesCur.iv; if ((err = PBGetCatInfoSync(&iob)) != noErr) { if (err != fnfErr) PushErc(ercFneGeneral); goto LPop; } if (iob.hFileInfo.ioFlFndrInfo.fdFlags & (kIsInvisible | kNameLocked | kIsAlias)) { continue; } if (iob.hFileInfo.ioFlAttrib & 0x0010) fT = pfni->FBuild(_fesCur.lwVol, iob.hFileInfo.ioDirID, pvNil, kftgDir); else { StToStz(stz); fT = pfni->FBuild(_fesCur.lwVol, _fesCur.lwDir, stz, iob.hFileInfo.ioFlFndrInfo.fdType); } if (!fT) continue; if (_cftg == 0) goto LGotOne; for (pftg = _prgftg + _cftg; pftg-- > _prgftg;) { if (*pftg == pfni->_ftg) goto LGotOne; // see if the file has a dos-like extension matching the ftg if (pfni->_ftg != kftgDir && (pszExt = (achar *)pftg)[3] == 0 && (ich = CchStz(stz) - CchSz(pszExt)) > 0 && PszStz(stz)[ich - 1] == '.' && fcmpEq == FcmpCompareInsSz(PszStz(stz) + ich, pszExt)) { goto LGotOne; } } } Bug("How did we fall through to here?"); LPop: if (_pglfes == pvNil || _pglfes->IvMac() == 0) goto LDone; // we're about to pop a directory, so send the current directory back // with ffnePost if (pvNil != pgrffneOut) *pgrffneOut = ffnePost; if (!pfni->FBuild(_fesCur.lwVol, _fesCur.lwDir, pvNil, kftgDir)) { PushErc(ercFneGeneral); LDone: _Free(); AssertThis(0); return fFalse; } Assert(_pglfes->FPop(&_fesCur), 0); AssertPo(pfni, ffniDir); AssertThis(0); return fTrue; LGotOne: AssertPo(pfni, ffniFile | ffniDir); if (pvNil != pgrffneOut) *pgrffneOut = ffnePre | ffnePost; if (_fRecurse && pfni->_ftg == kftgDir) { if ((pvNil != _pglfes || pvNil != (_pglfes = GL::PglNew(size(FES), 5))) && _pglfes->FPush(&_fesCur)) { // set up the new fes _fesCur.lwVol = pfni->_fss.vRefNum; _fesCur.lwDir = pfni->_lwDir; _fesCur.iv = 0; if (pvNil != pgrffneOut) *pgrffneOut = ffnePre; } else PushErc(ercFneGeneral); } AssertThis(0); return fTrue; } #ifdef DEBUG /*************************************************************************** Assert the validity of a FNE. ***************************************************************************/ void FNE::AssertValid(ulong grf) { FNE_PAR::AssertValid(0); if (_fInited) { AssertNilOrPo(_pglfes, 0); AssertIn(_cftg, 0, kcbMax); AssertPvCb(_prgftg, LwMul(size(FTG), _cftg)); Assert((_cftg > kcftgFneBase) == (_prgftg == _rgftg), "wrong _prgftg"); } else Assert(_pglfes == pvNil, 0); } /*************************************************************************** Mark memory used by the FNE. ***************************************************************************/ void FNE::MarkMem(void) { AssertValid(0); FNE_PAR::MarkMem(); if (_prgftg != _rgftg) MarkPv(_prgftg); MarkMemObj(_pglfes); } #endif // DEBUG ================================================ FILE: kauai/src/fniwin.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation File name management. ***************************************************************************/ #include "util.h" #include ASSERTNAME // This is the FTG to use for temp files - clients may set this to whatever // they want. FTG vftgTemp = kftgTemp; typedef OFSTRUCT OFS; typedef OPENFILENAME OFN; // maximal number of short characters in an extension is 4 (so it fits in // a long). const long kcchsMaxExt = size(long); priv void _CleanFtg(FTG *pftg, PSTN pstnExt = pvNil); FNI _fniTemp; RTCLASS(FNI) RTCLASS(FNE) /*************************************************************************** Sets the fni to nil values. ***************************************************************************/ void FNI::SetNil(void) { _ftg = ftgNil; _stnFile.SetNil(); AssertThis(ffniEmpty); } /*************************************************************************** Constructor for fni class. ***************************************************************************/ FNI::FNI(void) { SetNil(); } /*************************************************************************** Get an fni (for opening) from the user. ***************************************************************************/ bool FNI::FGetOpen(achar *prgchFilter, HWND hwndOwner) { AssertThis(0); AssertNilOrVarMem(prgchFilter); OFN ofn; SZ sz; ClearPb(&ofn, size(OFN)); SetNil(); sz[0] = 0; ofn.lStructSize = size(OFN); ofn.hwndOwner = hwndOwner; ofn.hInstance = NULL; ofn.lpstrFilter = prgchFilter; ofn.nFilterIndex = 1L; ofn.lpstrFile = sz; ofn.nMaxFile = kcchMaxSz; ofn.lpstrFileTitle = NULL; ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_NOTESTFILECREATE | OFN_READONLY; if (!GetOpenFileName(&ofn)) { SetNil(); return fFalse; } _stnFile = ofn.lpstrFile; _SetFtgFromName(); AssertThis(ffniFile); return fTrue; } /*************************************************************************** Get an fni (for saving) from the user. ***************************************************************************/ bool FNI::FGetSave(achar *prgchFilter, HWND hwndOwner) { AssertThis(0); AssertNilOrVarMem(prgchFilter); OFN ofn; SZ sz; ClearPb(&ofn, size(OFN)); SetNil(); sz[0] = 0; ofn.lStructSize = size(OFN); ofn.hwndOwner = hwndOwner; ofn.hInstance = NULL; ofn.lpstrFilter = prgchFilter; ofn.nFilterIndex = 1L; ofn.lpstrFile = sz; ofn.nMaxFile = kcchMaxSz; ofn.lpstrFileTitle = NULL; ofn.Flags = OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST; ofn.lpstrDefExt = PszLit(""); if (!GetSaveFileName(&ofn)) { SetNil(); return fFalse; } _stnFile = sz; _SetFtgFromName(); AssertThis(ffniFile); return fTrue; } /*************************************************************************** Builds the fni from the path. ***************************************************************************/ bool FNI::FBuildFromPath(PSTN pstn, FTG ftgDef) { AssertThis(0); AssertPo(pstn, 0); long cch; achar *pchT; SZ sz; if (kftgDir != ftgDef) { // if the path ends with a slash or only has periods after the last // slash, force the fni to be a directory. cch = pstn->Cch(); for (pchT = pstn->Prgch() + cch - 1;; pchT--) { if (cch-- <= 0 || *pchT == ChLit('\\') || *pchT == ChLit('/')) { ftgDef = kftgDir; break; } if (*pchT != ChLit('.')) break; } } /* ask windows to parse the file name (resolves ".." and ".") and returns absolute filename "X:\FOO\BAR", relative to the current drive and directory if no drive or directory is given in pstn */ if ((cch = GetFullPathName(pstn->Psz(), kcchMaxSz, sz, &pchT)) == 0 || cch > kcchMaxSz) { goto LFail; } Assert(cch <= kcchMaxSz, 0); _stnFile = sz; if (ftgDef == kftgDir) { achar ch = _stnFile.Prgch()[_stnFile.Cch() - 1]; if (ch != ChLit('\\') && ch != ChLit('/')) { if (!_stnFile.FAppendCh(ChLit('\\'))) { goto LFail; } } _ftg = kftgDir; } else { _SetFtgFromName(); if (_ftg == 0 && ftgDef != ftgNil && pstn->Prgch()[pstn->Cch() - 1] != ChLit('.') && !FChangeFtg(ftgDef)) { LFail: SetNil(); PushErc(ercFniGeneral); return fFalse; } } AssertThis(ffniFile | ffniDir); return fTrue; } /****************************************************************************** Will attempt to build an FNI with the given filename. Uses the Windows SearchPath API, and thus the Windows path*search rules. Arguments: PSTN pstn ** the filename to look for Returns: fTrue if it could find the file ******************************************************************************/ bool FNI::FSearchInPath(PSTN pstn, PSTN pstnEnv) { AssertThis(0); AssertPo(pstn, 0); AssertNilOrPo(pstnEnv, 0); long cch; SZ sz; achar *pchT; PSZ psz = (pstnEnv == pvNil) ? pvNil : pstnEnv->Psz(); if ((cch = SearchPath(psz, pstn->Psz(), pvNil, kcchMaxSz, sz, &pchT)) == 0 || cch > kcchMaxSz) { SetNil(); PushErc(ercFniGeneral); return fFalse; } Assert(cch <= kcchMaxSz, 0); _stnFile = sz; _SetFtgFromName(); AssertThis(ffniFile | ffniDir); return fTrue; } /*************************************************************************** Get a unique filename in the directory currently indicated by the fni. ***************************************************************************/ bool FNI::FGetUnique(FTG ftg) { AssertThis(ffniFile | ffniDir); static short _dsw = 0; STN stn; STN stnOld; short sw; long cact; if (Ftg() == kftgDir) stnOld.SetNil(); else GetLeaf(&stnOld); sw = (short)TsCurrentSystem() + ++_dsw; for (cact = 20; cact != 0; cact--, sw += ++_dsw) { stn.FFormatSz(PszLit("Temp%04x"), (long)sw); if (stn.FEqual(&stnOld)) continue; if (FSetLeaf(&stn, ftg) && TExists() == tNo) return fTrue; } SetNil(); PushErc(ercFniGeneral); return fFalse; } /*************************************************************************** Get a temporary fni. ***************************************************************************/ bool FNI::FGetTemp(void) { AssertThis(0); if (_fniTemp._ftg != kftgDir) { // get the temp directory SZ sz; if (GetTempPath(kcchMaxSz, sz) == 0) { PushErc(ercFniGeneral); return fFalse; } _fniTemp._stnFile = sz; _fniTemp._ftg = kftgDir; AssertPo(&_fniTemp, ffniDir); } *this = _fniTemp; return FGetUnique(vftgTemp); } /*************************************************************************** Return the file type of the fni. ***************************************************************************/ FTG FNI::Ftg(void) { AssertThis(0); return _ftg; } /*************************************************************************** Return the volume kind for the given fni. ***************************************************************************/ ulong FNI::Grfvk(void) { AssertThis(ffniDir | ffniFile); STN stn; PSZ psz; ulong grfvk = fvkNil; psz = _stnFile.Psz(); if (_stnFile.Cch() < 3 || psz[1] != ':' || psz[2] != '\\' && psz[2] != '/') return fvkNetwork; stn.FFormatSz(PszLit("%c:\\"), psz[0]); switch (GetDriveType(stn.Psz())) { case DRIVE_FIXED: case DRIVE_RAMDISK: break; case DRIVE_REMOVABLE: grfvk |= fvkRemovable; switch (stn.Psz()[0]) { case ChLit('A'): case ChLit('B'): case ChLit('a'): case ChLit('b'): grfvk |= fvkFloppy; break; } break; case DRIVE_CDROM: grfvk |= fvkRemovable | fvkCD; break; case DRIVE_REMOTE: default: // treat anything else like a network drive grfvk |= fvkNetwork; break; } return grfvk; } /*************************************************************************** Set the leaf to the given string and type. ***************************************************************************/ bool FNI::FSetLeaf(PSTN pstn, FTG ftg) { AssertThis(ffniFile | ffniDir); AssertNilOrPo(pstn, 0); _CleanFtg(&ftg); Assert(FPure(ftg == kftgDir) == FPure(pstn == pvNil || pstn->Cch() == 0), "ftg doesn't match pstn"); if (!_FChangeLeaf(pstn)) goto LFail; if ((kftgDir != ftg) && (ftgNil != ftg) && !FChangeFtg(ftg)) goto LFail; AssertThis(ffniFile | ffniDir); return fTrue; LFail: SetNil(); PushErc(ercFniGeneral); return fFalse; } /****************************************************************************** Changes just the FTG of the FNI, leaving the file path and filename alone (but does change the extension). Returns: fTrue if it succeeds ******************************************************************************/ bool FNI::FChangeFtg(FTG ftg) { AssertThis(ffniFile); Assert(ftg != ftgNil && ftg != kftgDir, "Bad FTG"); STN stnFtg; long cchBase; _CleanFtg(&ftg, &stnFtg); if (_ftg == ftg) return fTrue; // set the extension cchBase = _stnFile.Cch() - _CchExt(); // use >= to leave room for the '.' if (cchBase + stnFtg.Cch() >= kcchMaxStn) return fFalse; _stnFile.Delete(cchBase); _ftg = ftg; if (stnFtg.Cch() > 0) { _stnFile.FAppendCh(ChLit('.')); _stnFile.FAppendStn(&stnFtg); } return fTrue; } /*************************************************************************** Get the leaf name. ***************************************************************************/ void FNI::GetLeaf(PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); achar *pch; PSZ psz = _stnFile.Psz(); for (pch = psz + _stnFile.Cch(); pch-- > psz && *pch != '\\' && *pch != '/';) { } Assert(pch > psz, "bad fni"); pstn->SetSz(pch + 1); } /*************************************************************************** Get a string representing the path of the fni. ***************************************************************************/ void FNI::GetStnPath(PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); *pstn = _stnFile; } /*************************************************************************** Determines if the file/directory exists. Returns tMaybe on error or if the fni type (file or dir) doesn't match the disk object of the same name. ***************************************************************************/ tribool FNI::TExists(void) { AssertThis(ffniFile | ffniDir); STN stn; PSTN pstn; ulong lu; // strip off the trailing slash (if a directory). pstn = &_stnFile; if (_ftg == kftgDir) { long cch; stn = _stnFile; pstn = &stn; cch = stn.Cch(); Assert(cch > 0 && (stn.Psz()[cch - 1] == '\\' || stn.Psz()[cch - 1] == '/'), 0); stn.Delete(cch - 1); } if (0xFFFFFFFF == (lu = GetFileAttributes(pstn->Psz()))) { /* Any of these are equivalent to "there's no file with that name" */ if ((lu = GetLastError()) == ERROR_FILE_NOT_FOUND || lu == ERROR_INVALID_DRIVE) { return tNo; } PushErc(ercFniGeneral); return tMaybe; } if ((_ftg == kftgDir) != FPure(lu & FILE_ATTRIBUTE_DIRECTORY)) { PushErc(ercFniMismatch); return tMaybe; } if (lu & (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM)) { PushErc(ercFniHidden); return tMaybe; } return tYes; } /*************************************************************************** Delete the physical file. Should not be open. ***************************************************************************/ bool FNI::FDelete(void) { AssertThis(ffniFile); Assert(FIL::PfilFromFni(this) == pvNil, "file is open"); if (DeleteFile(_stnFile.Psz())) return fTrue; PushErc(ercFniDelete); return fFalse; } /*************************************************************************** Renames the file indicated by this to *pfni. ***************************************************************************/ bool FNI::FRename(FNI *pfni) { AssertThis(ffniFile); AssertPo(pfni, ffniFile); if (!(FILE_ATTRIBUTE_READONLY & GetFileAttributes(_stnFile.Psz())) && MoveFile(_stnFile.Psz(), pfni->_stnFile.Psz())) { return fTrue; } PushErc(ercFniRename); return fFalse; } /*************************************************************************** Compare two fni's for equality. ***************************************************************************/ bool FNI::FEqual(FNI *pfni) { AssertThis(ffniFile | ffniDir); AssertPo(pfni, ffniFile | ffniDir); return pfni->_stnFile.FEqualUser(&_stnFile); } /*************************************************************************** Return whether the fni refers to a directory. ***************************************************************************/ bool FNI::FDir(void) { AssertThis(0); return _ftg == kftgDir; } /*************************************************************************** Return whether the directory portions of the fni's are the same. ***************************************************************************/ bool FNI::FSameDir(FNI *pfni) { AssertThis(ffniFile | ffniDir); AssertPo(pfni, ffniFile | ffniDir); FNI fni1, fni2; fni1 = *this; fni2 = *pfni; fni1._FChangeLeaf(pvNil); fni2._FChangeLeaf(pvNil); return fni1.FEqual(&fni2); } /*************************************************************************** Determine if the directory pstn in fni exists, optionally creating it and/or moving into it. Specify ffniCreateDir to create it if it doesn't exist. Specify ffniMoveTo to make the fni refer to it. ***************************************************************************/ bool FNI::FDownDir(PSTN pstn, ulong grffni) { AssertThis(ffniDir); AssertPo(pstn, 0); FNI fniT; fniT = *this; // the +1 is for the \ character if (fniT._stnFile.Cch() + pstn->Cch() + 1 > kcchMaxStn) { PushErc(ercFniGeneral); return fFalse; } AssertDo(fniT._stnFile.FAppendStn(pstn), 0); AssertDo(fniT._stnFile.FAppendCh(ChLit('\\')), 0); fniT._ftg = kftgDir; AssertPo(&fniT, ffniDir); if (fniT.TExists() != tYes) { if (!(grffni & ffniCreateDir)) return fFalse; // try to create it if (!CreateDirectory(fniT._stnFile.Psz(), NULL)) { PushErc(ercFniDirCreate); return fFalse; } } if (grffni & ffniMoveToDir) *this = fniT; return fTrue; } /*************************************************************************** Gets the lowest directory name (if pstn is not nil) and optionally moves the fni up a level (if ffniMoveToDir is specified). ***************************************************************************/ bool FNI::FUpDir(PSTN pstn, ulong grffni) { AssertThis(ffniDir); AssertNilOrPo(pstn, 0); long cch; achar *pchT; SZ sz; STN stn; stn = _stnFile; if (!stn.FAppendSz(PszLit(".."))) return fFalse; if ((cch = GetFullPathName(stn.Psz(), kcchMaxSz, sz, &pchT)) == 0 || cch >= _stnFile.Cch() - 1) { return fFalse; } Assert(cch <= kcchMaxSz, 0); Assert(cch < _stnFile.Cch() + 2, 0); stn = sz; switch (stn.Psz()[cch - 1]) { case ChLit('\\'): case ChLit('/'): break; default: AssertDo(stn.FAppendCh(ChLit('\\')), 0); cch++; break; } if (pvNil != pstn) { // copy the tail and delete the trailing slash pstn->SetSz(_stnFile.Psz() + cch); pstn->Delete(pstn->Cch() - 1); } if (grffni & ffniMoveToDir) { _stnFile = stn; AssertThis(ffniDir); } return fTrue; } #ifdef DEBUG /*************************************************************************** Assert validity of the FNI. ***************************************************************************/ void FNI::AssertValid(ulong grffni) { FNI_PAR::AssertValid(0); AssertPo(&_stnFile, 0); SZ szT; long cch; PSZ pszT; if (grffni == 0) grffni = ffniEmpty | ffniDir | ffniFile; if (_ftg == ftgNil) { Assert(grffni & ffniEmpty, "unexpected empty"); Assert(_stnFile.Cch() == 0, "named empty?"); return; } if ((cch = GetFullPathName(_stnFile.Psz(), kcchMaxSz, szT, &pszT)) == 0 || cch > kcchMaxSz || !_stnFile.FEqualUserRgch(szT, CchSz(szT))) { Bug("bad fni"); return; } if (_ftg == kftgDir) { Assert(grffni & ffniDir, "unexpected dir"); Assert(szT[cch - 1] == ChLit('\\') || szT[cch - 1] == ChLit('/'), "expected trailing slash"); Assert(pszT == NULL, "unexpected filename"); } else { Assert(grffni & ffniFile, "unexpected file"); Assert(pszT >= szT && pszT < szT + cch, "expected filename"); } } #endif // DEBUG /*************************************************************************** Find the length of the file extension on the fni (including the period). Allow up to kcchsMaxExt characters for the extension (plus one for the period). ***************************************************************************/ long FNI::_CchExt(void) { AssertBaseThis(0); long cch; PSZ psz = _stnFile.Psz(); achar *pch = psz + _stnFile.Cch() - 1; for (cch = 1; cch <= kcchsMaxExt + 1 && pch >= psz; cch++, pch--) { if ((achar)(schar)*pch != *pch) { // not an ANSI character - so doesn't qualify for our // definition of an extension return 0; } switch (*pch) { case ChLit('.'): return cch; case ChLit('\\'): case ChLit('/'): return 0; } } return 0; } /*************************************************************************** Set the ftg from the file name. ***************************************************************************/ void FNI::_SetFtgFromName(void) { AssertBaseThis(0); Assert(_stnFile.Cch() > 0, 0); long cch, ich; achar *pchLim = _stnFile.Psz() + _stnFile.Cch(); if (pchLim[-1] == ChLit('\\') || pchLim[-1] == ChLit('/')) _ftg = kftgDir; else { _ftg = 0; cch = _CchExt() - 1; AssertIn(cch, -1, kcchsMaxExt + 1); pchLim -= cch; for (ich = 0; ich < cch; ich++) _ftg = (_ftg << 8) | (long)(byte)ChsUpper((schar)pchLim[ich]); } AssertThis(ffniFile | ffniDir); } /*************************************************************************** Change the leaf of the fni. ***************************************************************************/ bool FNI::_FChangeLeaf(PSTN pstn) { AssertThis(ffniFile | ffniDir); AssertNilOrPo(pstn, 0); achar *pch; PSZ psz; long cchBase, cch; psz = _stnFile.Psz(); for (pch = psz + _stnFile.Cch(); pch-- > psz && *pch != ChLit('\\') && *pch != ChLit('/');) { } Assert(pch > psz, "bad fni"); cchBase = pch - psz + 1; _stnFile.Delete(cchBase); _ftg = kftgDir; if (pstn != pvNil && (cch = pstn->Cch()) > 0) { if (cchBase + cch > kcchMaxStn) return fFalse; AssertDo(_stnFile.FAppendStn(pstn), 0); _SetFtgFromName(); } AssertThis(ffniFile | ffniDir); return fTrue; } /*************************************************************************** Make sure the ftg is all uppercase and has no characters after a zero. ***************************************************************************/ priv void _CleanFtg(FTG *pftg, PSTN pstnExt) { AssertVarMem(pftg); AssertNilOrPo(pstnExt, 0); long ichs; schar chs; bool fZero; FTG ftgNew; if (pvNil != pstnExt) pstnExt->SetNil(); if (*pftg == kftgDir || *pftg == ftgNil) return; fZero = fFalse; ftgNew = 0; for (ichs = 0; ichs < kcchsMaxExt; ichs++) { chs = (schar)((ulong)*pftg >> (ichs * 8)); fZero |= (chs == 0); if (!fZero) { chs = ChsUpper(chs); ftgNew |= (long)(byte)chs << (8 * ichs); if (pvNil != pstnExt) pstnExt->FInsertCh(0, (achar)(byte)chs); } } *pftg = ftgNew; } /*************************************************************************** Constructor for a File Name Enumerator. ***************************************************************************/ FNE::FNE(void) { AssertBaseThis(0); _prgftg = _rgftg; _pglfes = pvNil; _fesCur.hn = hBadWin; _fInited = fFalse; AssertThis(0); } /*************************************************************************** Destructor for an FNE. ***************************************************************************/ FNE::~FNE(void) { AssertBaseThis(0); _Free(); } /*************************************************************************** Free all the memory associated with the FNE. ***************************************************************************/ void FNE::_Free(void) { if (_prgftg != _rgftg) { FreePpv((void **)&_prgftg); _prgftg = _rgftg; } do { if (hBadWin != _fesCur.hn) FindClose(_fesCur.hn); } while (pvNil != _pglfes && _pglfes->FPop(&_fesCur)); _fesCur.hn = hBadWin; _fInited = fFalse; ReleasePpo(&_pglfes); AssertThis(0); } /*************************************************************************** Initialize the fne to do an enumeration. ***************************************************************************/ bool FNE::FInit(FNI *pfniDir, FTG *prgftg, long cftg, ulong grffne) { AssertThis(0); AssertNilOrVarMem(pfniDir); AssertIn(cftg, 0, kcbMax); AssertPvCb(prgftg, LwMul(cftg, size(FTG))); FTG *pftg; // free the old stuff _Free(); if (0 >= cftg) _cftg = 0; else { long cb = LwMul(cftg, size(FTG)); if (cftg > kcftgFneBase && !FAllocPv((void **)&_prgftg, cb, fmemNil, mprNormal)) { _prgftg = _rgftg; PushErc(ercFneGeneral); AssertThis(0); return fFalse; } CopyPb(prgftg, _prgftg, cb); _cftg = cftg; for (pftg = _prgftg + _cftg; pftg-- > _prgftg;) _CleanFtg(pftg); } if (pfniDir == pvNil) { _fesCur.chVol = 'A'; _fesCur.grfvol = GetLogicalDrives(); } else { STN stn; _fesCur.grfvol = 0; _fesCur.chVol = 0; _fesCur.fni = *pfniDir; stn = PszLit("*"); if (!_fesCur.fni._FChangeLeaf(&stn)) { PushErc(ercFneGeneral); _Free(); AssertThis(0); return fFalse; } } _fesCur.hn = hBadWin; _fRecurse = FPure(grffne & ffneRecurse); _fInited = fTrue; AssertThis(0); return fTrue; } /*************************************************************************** Get the next FNI in the enumeration. ***************************************************************************/ bool FNE::FNextFni(FNI *pfni, ulong *pgrffneOut, ulong grffneIn) { AssertThis(0); AssertVarMem(pfni); AssertNilOrVarMem(pgrffneOut); STN stn; bool fT; long fvol; long err; FTG *pftg; if (!_fInited) { Bug("must initialize the FNE before using it!"); return fFalse; } if (grffneIn & ffneSkipDir) { // skip the rest of the stuff in this dir if (!_FPop()) goto LDone; } if (_fesCur.chVol != 0) { // volume for (fvol = 1L << (_fesCur.chVol - 'A'); _fesCur.chVol <= 'Z' && (_fesCur.grfvol & fvol) == 0; _fesCur.chVol++, fvol <<= 1) { } if (_fesCur.chVol > 'Z') goto LDone; // we've got one stn.FFormatSz(PszLit("%c:\\"), (long)_fesCur.chVol++); AssertDo(pfni->FBuildFromPath(&stn), 0); goto LGotOne; } // directory or file for (;;) { if (hBadWin == _fesCur.hn) { _fesCur.hn = FindFirstFile(_fesCur.fni._stnFile.Psz(), &_fesCur.wfd); if (hBadWin == _fesCur.hn) { err = GetLastError(); goto LReportError; } } else if (!FindNextFile(_fesCur.hn, &_fesCur.wfd)) { err = GetLastError(); LReportError: if (err != ERROR_NO_MORE_FILES) PushErc(ercFneGeneral); goto LPop; } if (_fesCur.wfd.dwFileAttributes & (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM)) continue; stn.SetSz(_fesCur.wfd.cFileName); *pfni = _fesCur.fni; if (_fesCur.wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if (stn.FEqualSz(PszLit(".")) || stn.FEqualSz(PszLit(".."))) continue; AssertDo(pfni->_FChangeLeaf(pvNil), 0); fT = pfni->FDownDir(&stn, ffniMoveToDir); } else fT = pfni->_FChangeLeaf(&stn); if (!fT) { PushErc(ercFneGeneral); continue; } if (_cftg == 0) goto LGotOne; for (pftg = _prgftg + _cftg; pftg-- > _prgftg;) { if (*pftg == pfni->_ftg) goto LGotOne; } } Bug("How did we fall through to here?"); LPop: if (pvNil == _pglfes || _pglfes->IvMac() == 0) { LDone: _Free(); AssertThis(0); return fFalse; } // we're about to pop a directory, so send the current directory back // with ffnePost if (pvNil != pgrffneOut) *pgrffneOut = ffnePost; *pfni = _fesCur.fni; AssertDo(pfni->_FChangeLeaf(pvNil), 0); AssertDo(_FPop(), 0); AssertPo(pfni, ffniDir); AssertThis(0); return fTrue; LGotOne: AssertPo(pfni, ffniFile | ffniDir); if (pvNil != pgrffneOut) *pgrffneOut = ffnePre | ffnePost; if (_fRecurse && pfni->_ftg == kftgDir) { if ((pvNil != _pglfes || pvNil != (_pglfes = GL::PglNew(size(FES), 5))) && _pglfes->FPush(&_fesCur)) { // set up the new fes _fesCur.fni = *pfni; stn = PszLit("*"); if (!_fesCur.fni._FChangeLeaf(&stn)) { AssertDo(_pglfes->FPop(&_fesCur), 0); } else { _fesCur.hn = hBadWin; _fesCur.grfvol = 0; _fesCur.chVol = 0; if (pvNil != pgrffneOut) *pgrffneOut = ffnePre; } } else PushErc(ercFneGeneral); } AssertThis(0); return fTrue; } /*************************************************************************** Pop a state in the FNE. ***************************************************************************/ bool FNE::_FPop(void) { AssertBaseThis(0); if (hBadWin != _fesCur.hn) { FindClose(_fesCur.hn); _fesCur.hn = hBadWin; } return pvNil != _pglfes && _pglfes->FPop(&_fesCur); } #ifdef DEBUG /*************************************************************************** Assert the validity of a FNE. ***************************************************************************/ void FNE::AssertValid(ulong grf) { FNE_PAR::AssertValid(0); if (_fInited) { AssertNilOrPo(_pglfes, 0); AssertIn(_cftg, 0, kcbMax); AssertPvCb(_prgftg, LwMul(size(FTG), _cftg)); Assert((_cftg <= kcftgFneBase) == (_prgftg == _rgftg), "wrong _prgftg"); } else Assert(_pglfes == pvNil, 0); } /*************************************************************************** Mark memory for the FNE. ***************************************************************************/ void FNE::MarkMem(void) { AssertValid(0); FNE_PAR::MarkMem(); if (_prgftg != _rgftg) MarkPv(_prgftg); MarkMemObj(_pglfes); } #endif // DEBUG ================================================ FILE: kauai/src/frame.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Main include file for frame files. ***************************************************************************/ #ifndef FRAME_H #define FRAME_H #include "frameres.h" //frame resource id's #include "util.h" #include "keys.h" class GPT; // graphics port class GNV; // graphics environment class CMH; // command handler class GOB; // graphic object class MUB; // menu bar class DOCB; // base document class DMD; // document mdi window class DMW; // main document window class DSG; // document scroll gob class DDG; // document display gob class SNDM; // sound manager typedef class GPT *PGPT; typedef class GNV *PGNV; typedef class CMH *PCMH; typedef class GOB *PGOB; typedef class MUB *PMUB; typedef class DOCB *PDOCB; typedef class DMD *PDMD; typedef class DMW *PDMW; typedef class DSG *PDSG; typedef class DDG *PDDG; typedef class SNDM *PSNDM; #include "region.h" #include "pic.h" #include "mbmp.h" #include "gfx.h" #include "cmd.h" #include "cursor.h" #include "appb.h" #include "menu.h" #include "gob.h" #include "ctl.h" #include "sndm.h" #include "video.h" // these are optional #include "dlg.h" #include "clip.h" #include "docb.h" #include "text.h" #include "clok.h" #include "textdoc.h" #include "rtxt.h" #include "chcm.h" #include "spell.h" #include "sndam.h" #include "mididev.h" #include "mididev2.h" #endif //! FRAME_H ================================================ FILE: kauai/src/frame.rc ================================================ //Microsoft App Studio generated resource script. // #include "frameres.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #define APSTUDIO_HIDDEN_SYMBOLS #include "windows.h" #undef APSTUDIO_HIDDEN_SYMBOLS ///////////////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS #ifdef APSTUDIO_INVOKED ////////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE DISCARDABLE BEGIN "frameres.h\0" END 2 TEXTINCLUDE DISCARDABLE BEGIN "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" "#include ""windows.h""\r\n" "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" "\0" END 3 TEXTINCLUDE DISCARDABLE BEGIN "\r\n" "\0" END ///////////////////////////////////////////////////////////////////////////////////// #endif // APSTUDIO_INVOKED ////////////////////////////////////////////////////////////////////////////// // // Dialog // ASSERTDLG DIALOG DISCARDABLE 50, 50, 249, 136 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Assertion Failure" FONT 10, "System" BEGIN DEFPUSHBUTTON "&Ignore",0,33,109,50,15 PUSHBUTTON "&Debugger",1,98,109,50,15 PUSHBUTTON "&Quit",2,163,109,50,15 LTEXT "Static",3,10,5,227,25 LTEXT "Static",4,10,38,227,34 LTEXT "Static",5,10,81,227,24 END #ifndef APSTUDIO_INVOKED //////////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED ================================================ FILE: kauai/src/framedef.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Frame #defines that might get used by a source file for a tool, such as source files for the chunky compiler. This file should only contain #defines, and the values for the #defines should be constant values (no arithmetic). ***************************************************************************/ #ifndef FRAMEDEF_H #define FRAMEDEF_H #ifdef MAC #define MacWin(mac, win) mac #define Mac(foo) foo #define Win(foo) #elif defined(WIN) #define MacWin(mac, win) win #define Mac(foo) #define Win(foo) foo #endif // WIN /*************************************************************************** Miscellaneous defines ***************************************************************************/ #define kdzpInch 72 #define klwSigPackedFile 'kapa' #define klwSigUnpackedFile 'kaup' #define stidNil 0xFFFFFFFF // nil string id #define kdtimSecond 60 /*************************************************************************** Compression formats. ***************************************************************************/ #define cfmtNil 0 #define kcfmtKauai 'KCDC' #define kcfmtKauai2 'KCD2' /*************************************************************************** For flushing events. ***************************************************************************/ #define fevtNil 0x00000000 #define fevtMouse 0x00000001 #define fevtKey 0x00000002 #define kgrfevtAll 0xFFFFFFFF /*************************************************************************** Sound manager constants. ***************************************************************************/ #define sclNil 0xFFFFFFFF // nil sound class #define sqnNil 0xFFFFFFFF // nil queue (for wild card) #define ksqnNone 0 // non-queued sound #define kvlmFull 0x00010000 // normal volume level /*************************************************************************** Cursor state constants. bits 0-7 are reserved by GUI Kauai. bits 8-15 are reserved by Kidspace Kauai. bits 16-31 are reserved for application use. ***************************************************************************/ #define fcustNil 0 #define fcustCmd 1 #define fcustShift 2 #define fcustOption 4 #define kgrfcustKeys 7 #define fcustMouse 8 #define kgrfcustUser 15 #define kgrfcustFrame 0x000000FF #define kgrfcustKid 0x0000FF00 #define kgrfcustApp 0xFFFF0000 /*************************************************************************** Property id's. For APPB::FSetProp and APPB::FGetProp. ***************************************************************************/ #define kpridMaximized 1 #define kpridFullScreen 2 #define kpridToolTipDelay 3 /*************************************************************************** Transitions that Kauai knows how to do. ***************************************************************************/ #define gftNil 0 #define kgftWipe 1 #define kgftSlide 2 #define kgftDissolve 3 #define kgftFade 4 #define kgftIris 5 // transition directions for Wipe and Slide #define kgfdLeft 0x00 // 0000 #define kgfdRight 0x05 // 0101 #define kgfdUp 0x0A // 1010 #define kgfdDown 0x0F // 1111 #define kgfdLeftRight 0x04 // 0100 #define kgfdRightLeft 0x01 // 0001 #define kgfdUpDown 0x0E // 1110 #define kgfdDownUp 0x0B // 1011 // transition directions for Iris #define kgfdOpen 0x00 // 00 #define kgfdClose 0x03 // 11 #define kgfdCloseOpen 0x01 // 01 #define kgfdOpenClose 0x02 // 10 /*************************************************************************** Standard command handler IDs. GUI Kauai reserves values below 10000. Kidspace Kauai reserves values below 20000. Values >= 20000 can be used by the application. ***************************************************************************/ // The framework reserves values below khidLimFrame #define hidNil 0 #define khidApp 1 #define khidScreen 2 #define khidMdi 3 // generic mdi windows should get this #define khidSizeBox 4 // all size boxes (WSBs) get this #define khidDialog 5 // for modal dialogs #define khidHScroll 6 // standard horizontal scroll bar #define khidVScroll 7 // standard vertical scroll bar #define khidDoc 8 // standard hid for a document #define khidDsg 9 // standard dsg (child of dmw) #define khidDdg 10 // standard ddg (child of dsg) #define khidDsspHorz 11 // standard horizontal document window split box #define khidDsspVert 12 // standard vertical document window split box #define khidDssm 13 // standard split mover #define khidDmw 14 // convenient for single DMW window #define khidDmd 15 // standard dmd #define khidEdit 16 // edit control #define khidToolTip 17 // tool tip #define khidLimFrame 10000 /*************************************************************************** Chunky file constants. ***************************************************************************/ // convenient to indicate none (chunk places no restrictions on these) #define cnoNil 0xFFFFFFFF #define ctgNil 0 #define chidNil 0xFFFFFFFF #define kctgFramework 'FRAM' // for chunky file creator #define kctgMacro 'GLCM' #define kctgGl 'GL ' #define kctgAl 'AL ' #define kctgGg 'GG ' #define kctgAg 'AG ' #define kctgGst 'GST ' #define kctgAst 'AST ' #define kctgRsc 'RSC ' #define kctgMeta 'META' #define kctgMacPict 'MPIC' #define kctgPictNative MacWin(kctgMacPict, kctgMeta) #define kctgGraphic 'GRAF' #define kctgScript 'GLOP' #define kctgMask 'MASK' #define kctgMbmp 'MBMP' #define kctgMidi 'MIDS' #define kctgWave 'WAVE' #define kctgChkCmp 'CHMP' #define kctgColorTable 'GLCR' #define kctgCursor 'GGCR' #define kctgText 'TEXT' #define kctgTxtProps 'GLMP' #define kctgTxtPropArgs 'AGPA' #define kctgRichText 'RTXT' #define kctgScriptStrs 'GSTX' #define kctgStringReg 'GSTR' /*************************************************************************** Command IDs Commands above 64K cannot be put on Win menus. Commands between 40000 and 50000 should be reserved for AppStudio defined values (these are defined in .h files generated by AppStudio). Commands between 50000 and 65535 are reserved for Windows menu list handling. Commands between cidMinNoRepeat and cidLimNoRepeat will be recorded only once when multiple instances of the command occur consecutively. Commands between cidMinNoRecord and cidLimNoRecord will not be recorded at all. ***************************************************************************/ // id of main key accelerator table (if one is used) #define acidMain 128 #define cidNil 0 // Windows MDI reserves ids 1-10, so start at 100 // command IDs #define wcidMinApp 100 #define cidNew 100 #define cidOpen 101 #define cidClose 102 #define cidSave 103 #define cidSaveAs 104 #define cidSaveCopy 105 // save a copy of the doc #define cidQuit 106 #define cidAbout 107 #define cidNewWnd 108 #define cidCloseWnd 109 // just the current window, not the whole doc #define cidChooseWnd 110 // a dynamic list #define cidOpenDA 111 // (Mac only) a desk accessory list #define cidChooseFont 112 // a font menu list #define cidCexStopPlay 113 // stop playing a command stream #define cidCexStopRec 114 // stop recording a command stream #define cidCexPlayDone 115 // notify the world that play stopped #define cidCexRecordDone 116 // notify the world that record stopped #define cidSaveAndClose 117 #define cidCut 118 #define cidCopy 119 #define cidPaste 120 #define cidClear 121 #define cidShowClipboard 122 #define cidJustifyLeft 123 #define cidJustifyCenter 124 #define cidJustifyRight 125 #define cidIndentNone 126 #define cidIndentFirst 127 #define cidIndentRest 128 #define cidIndentAll 129 #define cidBold 130 #define cidItalic 131 #define cidUnderline 132 #define cidUndo 133 #define cidRedo 134 #define cidChooseFontSize 135 // a dynamic list #define cidPlain 136 #define cidChooseSubSuper 137 // a dynamic list #define cidPrint 138 #define cidPrintSetup 139 #define cidPasteSpecial 140 #define wcidListBase 50000 // for windows menu list handling #define dwcidList 500 // increment between list base values #define wcidLimApp 0xF000 // windows reserves larger values /**************************************** non-menu, non-key invoked commands These commands cannot be put on menus ****************************************/ #define cidMinNoMenu 100000 #define cidDoScroll 100000 #define cidEndScroll 100001 #define cidSplitDsg 100002 #define cidKey 100003 #define cidBadKey 100004 #define cidAlarm 100005 #define cidActivateSel 100006 #define cidMouseDown 100007 #define cidClicked 100008 #define cidEndModal 100009 /**************************************** no-repeat commands: when recording, multiple (identical) instances of these are recorded only once. ****************************************/ #define cidMinNoRepeat 200000 #define cidTrackMouse 200000 #define cidLimNoRepeat 400000 /**************************************** no-record commands: when recording, don't record these at all. ****************************************/ #define cidMinNoRecord 400000 #define cidIdle 400000 #define cidSelIdle 400001 // idle for settting/clearing selection. #define cidMouseMove 400002 // mouse moved #define cidRollOff 400003 // mouse rolled off the GOB #define cidLimNoRecord 600000 /*************************************************************************** Error codes ***************************************************************************/ /**************************************** 0 - 9999: Util-issued error codes ****************************************/ // 00000 - 00099: low-memory errors #define ercNil 0xFFFFFFFF #define ercOomHq 0 #define ercOomPv 1 #define ercOomNew 2 // 00100 - 00199: file errors #define ercFileGeneral 100 // enum files and check el's #define ercFilePerm 101 // can't set write permissions #define ercFileOpen 102 // can't open a file #define ercFileCreate 103 // can't create a file #define ercFileSwapNames 104 // FSwapNames failed #define ercFileRename 105 // FRename failed #define ercStnRead 106 // reading a string failed // 00200 - 00299: fni errors #define ercFniGeneral 200 // couldn't build an fni #define ercFniDelete 201 // delete failed #define ercFniRename 202 // rename failed #define ercFniMismatch 203 // requested dir is a file or file is dir #define ercFniHidden 204 // requested file/dir is hidden or alias #define ercFniDirCreate 205 // can't create directory // 00300 - 00399: fne errors #define ercFneGeneral 300 // 00400 - 00499: chunk errors #define ercCflOpen 400 #define ercCflCreate 401 #define ercCflSave 402 #define ercCflSaveCopy 403 // 00500 - 00599: crf errors #define ercCrfCantLoad 500 // 00600 - 00699: sound manager #define ercSndmCantInit 600 #define ercSndmPartialInit 601 #define ercSndamWaveDeviceBusy 602 #define ercSndMidiDeviceBusy 603 /******************************************* 10000 - 19999: Frame-issued error codes *******************************************/ // 10000 - 10099: gdi errors #define ercOomGdi 10000 // 10100 - 10199: gfx errors #define ercGfxCantDraw 10100 #define ercGfxCantSetFont 10101 #define ercGfxNoFontList 10102 #define ercGfxCantSetPalette 10103 // 10200 - 10299: dlg errors #define ercDlgCantGetArgs 10200 #define ercDlgCantFind 10201 #define ercDlgOom 10202 // 10300 - 10399: rtxd errors #define ercCantSave 10300 #define ercRtxdTooMuchText 10301 #define ercRtxdReadFailed 10302 #define ercRtxdSaveFailed 10303 // 11000 - 11999: misc errors #define ercCantOpenVideo 11000 #define ercMbmpCantOpenBitmap 11001 #define ercSpellNoDll 11002 #define ercSpellNoDict 11003 #define ercSpellNoUserDict 11004 /*************************************************************************** Custom window messages for testing WARNING: because of Chicago stupidity, these have to be less than 64K. Chicago truncates to 16 bits! Long live NT! ***************************************************************************/ #define WM_GOB_STATE 0x00004000 #define WM_GOB_LOCATION 0x00004001 #define WM_GLOBAL_STATE 0x00004002 #define WM_CURRENT_CURSOR 0x00004003 #define WM_GET_PROP 0x00004004 #define WM_SCALE_TIME 0x00004005 #define WM_GOB_FROM_PT 0x00004006 #define WM_FIRST_CHILD 0x00004007 #define WM_NEXT_SIB 0x00004008 #define WM_PARENT 0x00004009 #define WM_GOB_TYPE 0x0000400A #define WM_IS_GOB 0x0000400B #endif //! FRAMEDEF_H ================================================ FILE: kauai/src/frameres.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ //{{NO_DEPENDENCIES}} // App Studio generated include file. // Used by FRAME.RC // // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 101 #define _APS_NEXT_COMMAND_VALUE 20001 #define _APS_NEXT_CONTROL_VALUE 1001 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif ================================================ FILE: kauai/src/ft.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai test app Reviewed: Copyright (c) Microsoft Corporation Frame tester. ***************************************************************************/ #include "frame.h" #include "ftres.h" ASSERTNAME #ifdef DEBUG void CheckForLostMem(BASE *po); #else //! DEBUG #define CheckForLostMem(po) #endif //! DEBUG void TestUtil(void); long _LwSqrt(long lw); #define APP_PAR APPB #define kclsAPP 'APP' class APP : public APP_PAR { RTCLASS_DEC CMD_MAP_DEC(APP) protected: virtual bool _FInit(ulong grfapp, ulong grfgob, long ginDef); public: virtual void GetStnAppName(PSTN pstn); bool FCmdTestSuite(PCMD pcmd); bool FCmdNewTestWnd(PCMD pcmd); bool FCmdTextTestWnd(PCMD pcmd); bool FCmdTimeTestRc(PCMD pcmd); bool FCmdMacro(PCMD pcmd); bool FCmdTestPerspective(PCMD pcmd); bool FCmdTestPictures(PCMD pcmd); bool FCmdTestMbmps(PCMD pcmd); bool FCmdFastUpdate(PCMD pcmd); bool FCmdTextEdit(PCMD pcmd); #ifdef WIN bool FCmdTestFni(PCMD pcmd); #endif // WIN #ifdef MAC bool FCmdSetScreen(PCMD pcmd); bool FEnableScreen(PCMD pcmd, ulong *pgrfeds); #endif // MAC bool FEnableMacro(PCMD pcmd, ulong *pgrfeds); }; BEGIN_CMD_MAP(APP, APPB) ON_CID_GEN(cidTestSuite, &APP::FCmdTestSuite, pvNil) ON_CID_GEN(cidNewTestWnd, &APP::FCmdNewTestWnd, pvNil) ON_CID_GEN(cidTextTestWnd, &APP::FCmdTextTestWnd, pvNil) ON_CID_GEN(cidTimeFrameRc, &APP::FCmdTimeTestRc, pvNil) ON_CID_GEN(cidTestPerspective, &APP::FCmdTestPerspective, pvNil) ON_CID_GEN(cidTestPictures, &APP::FCmdTestPictures, pvNil) ON_CID_GEN(cidTestMbmps, &APP::FCmdTestMbmps, pvNil) ON_CID_GEN(cidTestFastUpdate, &APP::FCmdFastUpdate, pvNil) ON_CID_GEN(cidTestTextEdit, &APP::FCmdTextEdit, pvNil) ON_CID_GEN(cidStartRecording, &APP::FCmdMacro, &APP::FEnableMacro) ON_CID_GEN(cidStartPlaying, &APP::FCmdMacro, &APP::FEnableMacro) #ifdef WIN ON_CID_GEN(cidTestFni, &APP::FCmdTestFni, pvNil) #endif // WIN #ifdef MAC ON_CID_GEN(cidSetColor, &APP::FCmdSetScreen, APP::FEnableScreen) ON_CID_GEN(cidSetGrayScale, &APP::FCmdSetScreen, APP::FEnableScreen) ON_CID_GEN(cidSetDepth1, &APP::FCmdSetScreen, APP::FEnableScreen) ON_CID_GEN(cidSetDepth2, &APP::FCmdSetScreen, APP::FEnableScreen) ON_CID_GEN(cidSetDepth4, &APP::FCmdSetScreen, APP::FEnableScreen) ON_CID_GEN(cidSetDepth8, &APP::FCmdSetScreen, APP::FEnableScreen) ON_CID_GEN(cidSetDepth16, &APP::FCmdSetScreen, APP::FEnableScreen) ON_CID_GEN(cidSetDepth32, &APP::FCmdSetScreen, APP::FEnableScreen) #endif // MAC END_CMD_MAP_NIL() APP vapp; CLOK vclok(10000); RND vrnd; ACR _rgacr[] = {kacrBlack, kacrBlue, kacrGreen, kacrCyan, kacrRed, kacrMagenta, kacrYellow, kacrWhite, kacrClear, kacrInvert}; achar *_rgszColors[] = {PszLit("bla"), PszLit("blu"), PszLit("gre"), PszLit("cya"), PszLit("red"), PszLit("mag"), PszLit("yel"), PszLit("whi"), PszLit("cle"), PszLit("inv")}; const long _cacr = size(_rgacr) / size(_rgacr[0]); RTCLASS(APP) /*************************************************************************** Main for a frame app. ***************************************************************************/ void FrameMain(void) { vapp.Run(fappNil, fgobNil, kginDefault); } /*************************************************************************** Get the name for the frame tester app. ***************************************************************************/ void APP::GetStnAppName(PSTN pstn) { *pstn = PszLit("Frame Tester"); } /*************************************************************************** Initialize the app. ***************************************************************************/ bool APP::_FInit(ulong grfapp, ulong grfgob, long ginDef) { if (!APP_PAR::_FInit(grfapp, grfgob, ginDef)) return fFalse; vclok.Start(0); return fTrue; } #ifdef DEBUG /*************************************************************************** Unmarks all hqs, marks all hqs known to be in use, then asserts on all unmarked hqs. ***************************************************************************/ void CheckForLostMem(BASE *po) { UnmarkAllMem(); UnmarkAllObjs(); MarkMemObj(&vapp); // marks all frame-work memory MarkUtilMem(); // marks all util memory if (pvNil != po) po->MarkMem(); AssertUnmarkedMem(); AssertUnmarkedObjs(); } #endif // DEBUG /*************************************************************************** Test the util code. ***************************************************************************/ bool APP::FCmdTestSuite(PCMD pcmd) { TestUtil(); return fTrue; } // graphic pattern rectangle #define GPRC_PAR GOB #define kclsGPRC 'GPRC' class GPRC : public GPRC_PAR { RTCLASS_DEC MARKMEM private: ACR _acrFore; ACR _acrBack; APT _apt; bool _fLit; bool _fTrackMouse; POGN _pogn; public: GPRC(PGCB pgcb, APT *papt, ACR acrFore, ACR acrBack, bool fTrackMouse); ~GPRC(void); virtual void Draw(PGNV pgnv, RC *prcClip); virtual bool FCmdTrackMouse(PCMD_MOUSE pcmd); }; // graphic fill rectangle #define GFRC_PAR GOB #define kclsGFRC 'GFRC' class GFRC : public GFRC_PAR { RTCLASS_DEC private: bool _fOval; bool _fFrame; ACR _acr; public: GFRC(PGCB pgcb, ACR acr, bool fOval); virtual void Draw(PGNV pgnv, RC *prcClip); virtual void MouseDown(long xp, long yp, long cact, ulong grfcust); }; RTCLASS(GPRC) RTCLASS(GFRC) /*************************************************************************** Constructor for patterned rectangle. ***************************************************************************/ GPRC::GPRC(PGCB pgcb, APT *papt, ACR acrFore, ACR acrBack, bool fTrackMouse) : GOB(pgcb) { _apt = *papt; _acrFore = acrFore; _acrBack = acrBack; _fLit = fFalse; _fTrackMouse = fTrackMouse; } /*************************************************************************** Destructor for the GPRC. ***************************************************************************/ GPRC::~GPRC(void) { ReleasePpo(&_pogn); } #ifdef DEBUG /*************************************************************************** Mark memory for the GPRC. ***************************************************************************/ void GPRC::MarkMem(void) { AssertValid(0); GPRC_PAR::MarkMem(); MarkMemObj(_pogn); } #endif // DEBUG /*************************************************************************** Draw the patterned rectangle. ***************************************************************************/ void GPRC::Draw(PGNV pgnv, RC *prcClip) { RC rc; pgnv->GetRcSrc(&rc); if (pvNil == _pogn) { PT *qrgpt; if (pvNil == (_pogn = OGN::PognNew(_fTrackMouse ? 4 : 1))) return; AssertDo(_pogn->FSetIvMac(_fTrackMouse ? 4 : 1), "why did this fail"); qrgpt = _pogn->QrgptGet(); if (_fTrackMouse) { qrgpt[0].xp = (7 * rc.xpLeft + rc.xpRight) / 8; qrgpt[0].yp = (7 * rc.ypTop + rc.ypBottom) / 8; qrgpt[1].xp = (rc.xpLeft + 7 * rc.xpRight) / 8; qrgpt[1].yp = qrgpt[0].yp; qrgpt[2].xp = qrgpt[1].xp; qrgpt[2].yp = (rc.ypTop + 7 * rc.ypBottom) / 8; qrgpt[3].xp = qrgpt[0].xp; qrgpt[3].yp = qrgpt[2].yp; } else { qrgpt[0].xp = rc.xpLeft; qrgpt[0].yp = rc.ypTop; } } if (_fTrackMouse) { pgnv->SetPenSize(10, 10); pgnv->FramePolyLineApt(_pogn, &_apt, _acrFore, _acrBack); } else { pgnv->SetPenSize(7, 10); pgnv->FrameOgn(_pogn, _acrFore); } if (_fLit) pgnv->FillRc(&rc, kacrInvert); } /*************************************************************************** Track mouse proc. Makes us act like a button. ***************************************************************************/ bool GPRC::FCmdTrackMouse(PCMD_MOUSE pcmd) { PT pt; bool fDown, fLitNew; pt.xp = pcmd->xp; pt.yp = pcmd->yp; fDown = FPure(pcmd->grfcust & fcustMouse); if (pcmd->cid == cidMouseDown) { Assert(vpcex->PgobTracking() == pvNil, "mouse already being tracked!"); vpcex->TrackMouse(this); } else { Assert(vpcex->PgobTracking() == this, "not tracking mouse!"); Assert(pcmd->cid == cidTrackMouse, 0); } if (fDown) { // mouse is still down fLitNew = FPtIn(pt.xp, pt.yp); if (FPure(_fLit) != FPure(fLitNew)) { // invert it GNV gnv(this); RC rc; gnv.GetRcSrc(&rc); gnv.FillRc(&rc, kacrInvert); _fLit = fLitNew; } } else { vpcex->EndMouseTracking(); if (_fLit) { // turn it off and push a close command GNV gnv(this); RC rc; gnv.GetRcSrc(&rc); gnv.FillRc(&rc, kacrInvert); if (!_fTrackMouse) { PT rgpt[3]; POGN pogn; rgpt[0].xp = 0; rgpt[0].yp = 0; rgpt[1].xp = 40; rgpt[1].yp = 0; rgpt[2].xp = 20; rgpt[2].yp = 30; if (pvNil != (pogn = _pogn->PognTraceRgpt(rgpt, 3, fognAutoClose))) { ReleasePpo(&_pogn); _pogn = pogn; } _fLit = fFalse; InvalRc(pvNil); } else vpcex->EnqueueCid(cidCloseWnd, this); } } return fTrue; } /*************************************************************************** Constructor for filled rectangle. ***************************************************************************/ GFRC::GFRC(PGCB pgcb, ACR acr, bool fOval) : GOB(pgcb) { _acr = acr; _fOval = fOval; _fFrame = fFalse; } /*************************************************************************** Draw the filled rectangle. ***************************************************************************/ void GFRC::Draw(PGNV pgnv, RC *prcClip) { RC rc; pgnv->GetRcSrc(&rc); if (_fOval) { if (_fFrame) { pgnv->SetPenSize(3, 7); pgnv->FrameOval(&rc, _acr); } else pgnv->FillOval(&rc, _acr); } else pgnv->FillRc(&rc, _acr); } /*************************************************************************** The mouse hit us - so die. ***************************************************************************/ void GFRC::MouseDown(long xp, long yp, long cact, ulong grfcust) { if (Hid() != 99) { if (_fOval) { _fFrame = !_fFrame; InvalRc(pvNil); } else vpcex->EnqueueCid(cidCloseWnd, this); } } // test document #define TDC_PAR GOB #define kclsTDC 'TDC' class TDC : public TDC_PAR { RTCLASS_DEC protected: virtual void _NewRc(void); public: TDC(PGCB pgcb) : GOB(pgcb) { _NewRc(); } virtual void Draw(PGNV pgnv, RC *prcClip); }; RTCLASS(TDC) /*************************************************************************** _NewRc (from GOB) of TDC. ***************************************************************************/ void TDC::_NewRc(void) { // set the scroll bar ranges and values PSCB pscb; long dxp, dyp; RC rc, rcPar; PgobPar()->GetRc(&rcPar, cooLocal); GetRc(&rc, cooParent); dxp = LwMax(0, LwMin(-rc.xpLeft, rcPar.xpRight - rc.xpRight)); dyp = LwMax(0, LwMin(-rc.ypTop, rcPar.ypBottom - rc.ypBottom)); if (dxp > 0 || dyp > 0) { rc.Offset(dxp, dyp); SetPos(&rc, pvNil); // we'll be getting another _NewRc to set the scroll bars by return; } if ((pscb = (PSCB)PgobFromHidScr(khidHScroll)) != pvNil) pscb->SetValMinMax(-rc.xpLeft, 0, LwMax(0, rc.Dxp() - rcPar.Dxp())); if ((pscb = (PSCB)PgobFromHidScr(khidVScroll)) != pvNil) pscb->SetValMinMax(-rc.ypTop, 0, LwMax(0, rc.Dyp() - rcPar.Dyp())); } /*************************************************************************** Draw routine for the TDC. ***************************************************************************/ void TDC::Draw(PGNV pgnv, RC *prcClip) { RC rc; GetRc(&rc, cooLocal); pgnv->FillRc(&rc, kacrRed); } // graphic test doc window #define DWN_PAR GOB #define kclsDWN 'DWN' class DWN : public DWN_PAR { RTCLASS_DEC CMD_MAP_DEC(DWN) protected: static long _cdwn; DWN(PGCB pgcb) : GOB(pgcb) { } public: static DWN *PdwnNew(void); virtual bool FCmdScroll(PCMD pcmd); }; BEGIN_CMD_MAP(DWN, GOB) ON_CID_ME(cidDoScroll, &DWN::FCmdScroll, pvNil) ON_CID_ME(cidEndScroll, &DWN::FCmdScroll, pvNil) END_CMD_MAP_NIL() long DWN::_cdwn = 0; RTCLASS(DWN) /*************************************************************************** Create a new dwn. ***************************************************************************/ DWN *DWN::PdwnNew(void) { DWN *pdwn; PGOB pgob; STN stn; GCB gcb(khidMdi, GOB::PgobScreen()); if ((pdwn = NewObj DWN(&gcb)) == pvNil) return pvNil; stn.FFormatSz(PszLit("Graphics Test #%d"), ++_cdwn); if (!pdwn->FCreateAndAttachMdi(&stn)) { ReleasePpo(&pdwn); return pvNil; } RC rcRel; RC rcAbs; APT apt = {0xFF, 0x01, 0x7D, 0x45, 0x5D, 0x41, 0x7F, 0x00}; // add a size box and some scroll bar WSB::PwsbNew(pdwn, fgobNil); gcb.Set(khidVScroll, pdwn); SCB::PscbNew(&gcb, fscbVert | fscbStandardRc); gcb.Set(khidHScroll, pdwn); SCB::PscbNew(&gcb, fscbHorz | fscbStandardRc); // create a content gob gcb.Set(98, pdwn); SCB::GetClientRc(fscbVert | fscbHorz, &gcb._rcAbs, &gcb._rcRel); pgob = NewObj GOB(&gcb); if (pgob == pvNil) return pdwn; // create the test document gob gcb.Set(99, pgob); gcb._rcRel.xpLeft = gcb._rcRel.ypTop = krelZero; gcb._rcRel.xpRight = gcb._rcRel.ypBottom = krelZero; gcb._rcAbs.xpLeft = gcb._rcAbs.ypTop = 0; gcb._rcAbs.xpRight = 1000; gcb._rcAbs.ypBottom = 1000; pgob = NewObj TDC(&gcb); if (pgob == pvNil) return pdwn; gcb.Set(100, pgob); gcb._rcRel.xpLeft = gcb._rcRel.ypTop = krelZero; gcb._rcRel.xpRight = krelOne / 4; gcb._rcRel.ypBottom = krelOne / 4; gcb._rcRel.Inset(krelOne / 20, krelOne / 20); NewObj GFRC(&gcb, kacrInvert, fFalse); gcb._hid = 100; gcb._rcRel.Offset(krelOne / 4, 0); NewObj GFRC(&gcb, kacrClear, fFalse); gcb._hid = 102; gcb._rcRel.Offset(krelOne / 4, 0); NewObj GFRC(&gcb, kacrBlue, fTrue); gcb._hid = 103; gcb._rcRel.Offset(krelOne / 4, 0); NewObj GFRC(&gcb, kacrGreen, fTrue); gcb._hid = 200; gcb._rcRel.Offset(-3 * krelOne / 4, krelOne / 4); NewObj GPRC(&gcb, &apt, kacrBlue, kacrGreen, fTrue); gcb._hid = 201; gcb._rcRel.Offset(krelOne / 4, 0); NewObj GPRC(&gcb, &apt, kacrBlue, kacrClear, fTrue); gcb._hid = 202; gcb._rcRel.Offset(krelOne / 4, 0); NewObj GPRC(&gcb, &apt, kacrBlue, kacrInvert, fTrue); gcb._hid = 203; gcb._rcRel.Offset(krelOne / 4, 0); NewObj GPRC(&gcb, &apt, kacrClear, kacrInvert, fTrue); gcb._hid = 300; gcb._rcRel.Offset(-3 * krelOne / 4, krelOne / 4); NewObj GPRC(&gcb, &apt, kacrBlue, kacrGreen, fFalse); gcb._hid = 301; gcb._rcRel.Offset(krelOne / 4, 0); NewObj GPRC(&gcb, &apt, kacrClear, kacrGreen, fFalse); gcb._hid = 302; gcb._rcRel.Offset(krelOne / 4, 0); NewObj GPRC(&gcb, &apt, kacrInvert, kacrGreen, fFalse); gcb._hid = 303; gcb._rcRel.Offset(krelOne / 4, 0); NewObj GPRC(&gcb, &apt, kacrInvert, kacrClear, fFalse); return pdwn; } /*************************************************************************** Handles scrolling. ***************************************************************************/ bool DWN::FCmdScroll(PCMD pcmd) { long hid, val, dval; PSCB pscb; PGOB pgob; RC rc; hid = pcmd->rglw[0]; pscb = (PSCB)PgobFromHid(hid); if (pscb == pvNil) return fTrue; switch (pcmd->cid) { case cidDoScroll: switch (pcmd->rglw[1]) { case scaLineUp: dval = -10; break; case scaPageUp: dval = -100; break; case scaLineDown: dval = 10; break; case scaPageDown: dval = 100; break; default: dval = 0; break; } val = pscb->Val() + dval; break; case cidEndScroll: val = pcmd->rglw[1]; break; } // pin the new value to the max and min val = LwMin(pscb->ValMax(), LwMax(pscb->ValMin(), val)); if (val != pscb->Val() && (pgob = PgobFromHid(99)) != pvNil) { pgob->GetRc(&rc, cooParent); if (hid == khidHScroll) rc.Offset(-rc.xpLeft - val, 0); else rc.Offset(0, -rc.ypTop - val); pgob->SetPos(&rc, pvNil); pscb->SetVal(val); pgob->GetRc(&rc, cooGpt); pgob->DrawTree(pvNil, &rc, pvNil, fgobUseVis); pgob->ValidRc(pvNil); } return fTrue; } // text test window #define TTW_PAR DWN #define kclsTTW 'TTW' class TTW : public TTW_PAR { RTCLASS_DEC private: long _cact; public: TTW(PGCB pgcb) : DWN(pgcb) { } static TTW *PttwNew(void); virtual void MouseDown(long xp, long yp, long cact, ulong grfcust); void Draw(PGNV pgnv, RC *prcClip); }; RTCLASS(TTW) /*************************************************************************** Create a new ttw. ***************************************************************************/ TTW *TTW::PttwNew(void) { TTW *pttw; STN stn; RC rc; PEDPL pedpl; GCB gcb(khidMdi, GOB::PgobScreen()); if ((pttw = NewObj TTW(&gcb)) == pvNil) return pvNil; stn.FFormatSz(PszLit("Text Test #%d"), ++_cdwn); if (!pttw->FCreateAndAttachMdi(&stn)) { ReleasePpo(&pttw); return pvNil; } rc.xpLeft = 5; rc.xpRight = 305; rc.ypTop = 0; rc.ypBottom = 100; rc.Offset(5, 0); EDPAR edpar(khidEdit, pttw, fgobNil, kginDefault, &rc, pvNil, vntl.OnnSystem(), fontNil, 12, tahLeft, tavTop, kacrBlue, kacrYellow); pedpl = EDMW::PedmwNew(&edpar); if (pvNil != pedpl) pedpl->Activate(fTrue); return pttw; } void TTW::Draw(PGNV pgnv, RC *prcClip) { RC rc; long dxp, dyp, idxp, idyp; long irc; const long cdxp = 8; const long cdyp = 10; struct TNM // Text alignment NaMe { long lw; achar ch; }; static TNM _rgtnmVert[] = {{tavTop, 'T'}, {tavCenter, 'C'}, {tavBaseline, 'S'}, {tavBottom, 'B'}}; static TNM _rgtnmHorz[] = {{tahLeft, 'L'}, {tahCenter, 'C'}, {tahRight, 'R'}}; static APT _apt = {0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F}; pgnv->GetRcSrc(&rc); pgnv->FillRc(&rc, kacrWhite); rc.ypTop += 30; pgnv->FillRcApt(&rc, &_apt, kacrRed, kacrBlue); dxp = rc.Dxp() / cdxp; dyp = rc.Dyp() / cdyp; pgnv->SetFont(_cact % vntl.OnnMac(), fontNil, LwMin(10, dyp / 2)); pgnv->SetPenSize(1, 5); irc = 0; for (idyp = 0; idyp < cdyp; idyp++) { for (idxp = 0; idxp < cdxp; idxp++) { STN stn; RC rc; long itnm; long tah, tav; achar chH, chV; rc.xpLeft = idxp * dxp; rc.ypTop = 30 + idyp * dyp; rc.xpRight = rc.xpLeft + dxp; rc.ypBottom = rc.ypTop + dyp; pgnv->ClipRc(&rc); pgnv->FrameRc(&rc, ACR(byte(3 * irc))); itnm = irc % CvFromRgv(_rgtnmHorz); chH = _rgtnmHorz[itnm].ch; tah = _rgtnmHorz[itnm].lw; itnm = (irc / CvFromRgv(_rgtnmHorz)) % CvFromRgv(_rgtnmVert); chV = _rgtnmVert[itnm].ch; tav = _rgtnmVert[itnm].lw; stn.FFormatSz(PszLit("(%z:%z, %c:%c)"), _rgszColors[idxp], _rgszColors[idyp], chH, chV); pgnv->ClipRc(&rc); rc.Inset(1, 5); pgnv->SetFontAlign(tah, tav); pgnv->DrawStn(&stn, rc.XpCenter(), rc.YpCenter(), _rgacr[idxp], _rgacr[idyp]); irc++; } } pgnv->ClipRc(pvNil); } void TTW::MouseDown(long xp, long yp, long cact, ulong grfcust) { RC rc; GNV gnv(this); _cact++; GetRc(&rc, cooLocal); Draw(&gnv, &rc); } // Frame rectangle test window #define RTW_PAR DWN #define kclsRTW 'RTW' class RTW : public RTW_PAR { RTCLASS_DEC private: long _cact; public: RTW(PGCB pgcb) : DWN(pgcb) { _cact = 0; } virtual void MouseDown(long xp, long yp, long cact, ulong grfcust); virtual void Draw(PGNV pgnv, RC *prcClip); static RTW *PrtwNew(void); }; RTCLASS(RTW) /*************************************************************************** Create a new rtw. ***************************************************************************/ RTW *RTW::PrtwNew(void) { RTW *prtw; STN stn; GCB gcb(khidMdi, GOB::PgobScreen()); if (pvNil == (prtw = NewObj RTW(&gcb))) return pvNil; stn.FFormatSz(PszLit("Frame rectangle test #%d"), ++_cdwn); if (!prtw->FCreateAndAttachMdi(&stn)) { ReleasePpo(&prtw); return pvNil; } return prtw; } class DOC : public DOCB { public: DOC(void) : DOCB(pvNil, fdocNil) { } }; /****************************************************************************** Test the gob code ******************************************************************************/ bool APP::FCmdNewTestWnd(PCMD pcmd) { long idit; long lw; if (pcmd->pgg == pvNil) { // put up the dialog PDLG pdlg; pdlg = DLG::PdlgNew(200); pcmd->pgg = pdlg; if (pdlg == pvNil) goto LFail; idit = pdlg->IditDo(); if (idit != 0) goto LFail; } pcmd->pgg->GetRgb(2, 0, size(long), &lw); switch (lw) { case 0: // new graphics window if (pvNil == DWN::PdwnNew()) goto LFail; break; case 1: // new text window if (pvNil == TTW::PttwNew()) goto LFail; break; case 2: // new DMD PDOCB pdocb; if (pvNil == (pdocb = NewObj DOC())) goto LFail; if (pvNil == pdocb->PdmdNew()) { ReleasePpo(&pdocb); goto LFail; } ReleasePpo(&pdocb); break; } return fTrue; LFail: pcmd->cid = cidNil; // don't record return fTrue; } /****************************************************************************** Test the gob code ******************************************************************************/ bool APP::FCmdTextTestWnd(PCMD pcmd) { TTW::PttwNew(); return fTrue; } /****************************************************************************** Test rectangle framing speed. ******************************************************************************/ bool APP::FCmdTimeTestRc(PCMD pcmd) { RTW::PrtwNew(); return fTrue; } /****************************************************************************** Perform the test. ******************************************************************************/ void RTW::MouseDown(long xp, long yp, long cact, ulong grfcust) { GNV gnv(this); long iact; RC rc; PT *qrgpt; POGN pogn; long xp1, xp2, xp3, yp1, yp2, yp3; APT apt = {0xFF, 0x01, 0x7D, 0x45, 0x5D, 0x41, 0x7F, 0x00}; ulong ts; STN stn; if (pvNil == (pogn = OGN::PognNew(8))) return; gnv.GetRcSrc(&rc); xp1 = (9 * rc.xpLeft + rc.xpRight) / 10; yp1 = (9 * rc.ypTop + rc.ypBottom) / 10; xp2 = rc.XpCenter(); yp2 = rc.YpCenter(); xp3 = (rc.xpLeft + 9 * rc.xpRight) / 10; yp3 = (rc.ypTop + 9 * rc.ypBottom) / 10; AssertDo(pogn->FSetIvMac(8), "why did this fail"); qrgpt = pogn->QrgptGet(); qrgpt[0].xp = xp1; qrgpt[0].yp = yp1; qrgpt[1].xp = xp2; qrgpt[1].yp = yp2; qrgpt[2].xp = xp3; qrgpt[2].yp = yp1; qrgpt[3].xp = xp2; qrgpt[3].yp = yp2; qrgpt[4].xp = xp3; qrgpt[4].yp = yp3; qrgpt[5].xp = xp2; qrgpt[5].yp = yp2; qrgpt[6].xp = xp1; qrgpt[6].yp = yp3; qrgpt[7].xp = xp2; qrgpt[7].yp = yp2; gnv.SetPenSize(10, 20); ts = TsCurrent(); for (iact = 0; iact < 100; iact++) { ACR acrFore = _rgacr[iact % 10]; ACR acrBack = _rgacr[(iact / 10) % 10]; switch (_cact % 3) { default: break; case 0: gnv.FrameRcApt(&rc, &apt, acrFore, acrBack); break; case 1: gnv.FrameOgnApt(pogn, &apt, acrFore, acrBack); break; case 2: gnv.LineApt(xp1, yp1, xp3, yp3, &apt, acrFore, acrBack); break; } } stn.FFormatSz(PszLit("elapsed time: %u"), TsCurrent() - ts); vpappb->TGiveAlertSz(stn.Psz(), bkOk, cokInformation); ReleasePpo(&pogn); _cact++; gnv.GetRcSrc(&rc); Draw(&gnv, &rc); } /****************************************************************************** Paint the RTW GOB. ******************************************************************************/ void RTW::Draw(PGNV pgnv, RC *prcClip) { STN stn; STN rgstn[] = {PszLit("frame rectangle "), PszLit("frame polygon "), PszLit("line draw ")}; RC rc; stn.FFormatSz(PszLit("Click to begin the %s test"), &rgstn[_cact % 3]); pgnv->GetRcSrc(&rc); pgnv->FillRc(&rc, kacrWhite); pgnv->SetFontAlign(tahCenter, tavCenter); pgnv->DrawStn(&stn, rc.XpCenter(), rc.YpCenter(), kacrBlack, kacrClear); } long _LwSqrt(long lw) { ushort wHi, wLo, wMid; long lwT; AssertVar(lw >= 0, "sqrt of negative", &lw); for (lwT = wHi = 1; lwT < lw;) { lwT <<= 2; wHi <<= 1; } if (lwT == lw) return wHi; wLo = wHi >> 1; /* wLo^2 < lw <= wHi^2 */ while (wLo < wHi) { wMid = (wLo + wHi) >> 1; lwT = (long)wMid * wMid; if (lwT < lw) wLo = wMid + 1; else if (lwT > lw) wHi = wMid; else return wMid; } wLo = wHi - 1; Assert((long)wHi * wHi > lw && (long)wLo * wLo <= lw, "bad logic"); return (long)(((long)wHi * wHi - lw < lw - (long)wLo * wLo) ? wHi : wLo); } /*************************************************************************** Command function to handle macro recording and playback. ***************************************************************************/ bool APP::FCmdMacro(PCMD pcmd) { FNI fni; PCFL pcfl; // make sure we're not already recording or playing a macro. if (vpcex->FRecording() || vpcex->FPlaying()) return fTrue; if (pcmd->cid == cidStartRecording) { if (!FGetFniSaveMacro(&fni, 'TEXT', "\pSave As: ", "\pMacro", PszLit("All files\0*.*\0"), vwig.hwndApp)) { return fTrue; } if ((pcfl = CFL::PcflCreate(&fni, fcflTemp)) == pvNil) return fTrue; vpcex->Record(pcfl); ReleasePpo(&pcfl); } else { if (!FGetFniOpenMacro(&fni, pvNil, 0, PszLit("All files\0*.*\0"), vwig.hwndApp)) { return fTrue; } AssertDo(fni.TExists() == tYes, 0); if ((pcfl = CFL::PcflOpen(&fni, fcflNil)) == pvNil) return fTrue; vpcex->Play(pcfl, 0); ReleasePpo(&pcfl); } return fTrue; } /*************************************************************************** Handles enabling of macro recording and playback commands. ***************************************************************************/ bool APP::FEnableMacro(PCMD pcmd, ulong *pgrfeds) { if (vpcex->FRecording() || vpcex->FPlaying()) *pgrfeds = fedsDisable; else *pgrfeds = fedsEnable; return fTrue; } #ifdef WIN /****************************************************************************** Test windows fni code to build an fni from a path ******************************************************************************/ bool APP::FCmdTestFni(PCMD pcmd) { long idit; STN stn, stnT; FNI fni; PDLG pdlg; // put up the dialog pdlg = DLG::PdlgNew(201); if (pdlg == pvNil) goto LFail; idit = pdlg->IditDo(); if (idit != 0) goto LFail; pdlg->GetStn(2, &stn); ReleasePpo(&pdlg); fni.FBuildFromPath(&stn); fni.GetStnPath(&stnT); MessageBox((HWND)NULL, stnT.Psz(), stn.Psz(), MB_OK); LFail: pcmd->cid = cidNil; // don't record return fTrue; } #endif // WIN // point in R3 struct PTT { long xt, yt, zt; }; // world of perspective struct WOP { PTT pttEye; long ztScreen; long ztMax; PT PtMap(long xt, long yt, long zt); // PTT PttUnmap(long xp, long yp, long yt); }; /*************************************************************************** Map an R3 point to a screen point. ***************************************************************************/ PT WOP::PtMap(long xt, long yt, long zt) { PT pt; pt.xp = pttEye.xt + LwMulDiv(xt - pttEye.xt, ztScreen - pttEye.zt, zt - pttEye.zt); pt.yp = pttEye.yt + LwMulDiv(yt - pttEye.yt, ztScreen - pttEye.zt, zt - pttEye.zt); return pt; } #ifdef FUTURE /*************************************************************************** Map a screen point to an R3 point. yt stays fixed. ***************************************************************************/ PTT WOP::PttUnmap(long xp, long yp, long yt) { PTT ptt; long ypBound; if (((yp - pttEye.yt) > 0) != ((yt - pttEye.yt) > 0)) yp = pttEye.yt; ypBound } #endif // FUTURE // perspective doc class DOCP : public DOCB { public: WOP _wop; PTT _pttSquare; long _dxt, _dyt; DOCP(void); virtual PDDG PddgNew(PGCB pgcb); void GetRcPic(RC *prc); }; // ddg for a docp class DDP : public DDG { protected: DDP(DOCP *pdocp, PGCB pgcb); public: static DDP *PddpNew(DOCP *pdocp, PGCB pgcb); virtual void Draw(PGNV pgnv, RC *prcClip); virtual void MouseDown(long xp, long yp, long cact, ulong grfcust); void DrawRc(PGNV pgnv); void DrawNumbers(PGNV pgnv); }; /*************************************************************************** Constructor for a perspective doc. ***************************************************************************/ DOCP::DOCP(void) { _wop.ztScreen = 0; _wop.pttEye.zt = -500; _wop.pttEye.xt = 320; _wop.pttEye.yt = 240; _wop.ztMax = 10000; _pttSquare.xt = 320; _pttSquare.yt = 480; _pttSquare.zt = 20; _dxt = 50; _dyt = 50; } /*************************************************************************** Create a new pane for a perspective doc. ***************************************************************************/ PDDG DOCP::PddgNew(PGCB pgcb) { return DDP::PddpNew(this, pgcb); } /*************************************************************************** Get the on screen rectangle for the perspective doc. ***************************************************************************/ void DOCP::GetRcPic(RC *prc) { PT pt; pt = _wop.PtMap(_pttSquare.xt, _pttSquare.yt, _pttSquare.zt); prc->xpLeft = pt.xp; prc->ypBottom = pt.yp; pt = _wop.PtMap(_pttSquare.xt + _dxt, _pttSquare.yt - _dyt, _pttSquare.zt); prc->xpRight = pt.xp; prc->ypTop = pt.yp; } /*************************************************************************** Constructor for a perspective doc pane. ***************************************************************************/ DDP::DDP(DOCP *pdocp, PGCB pgcb) : DDG(pdocp, pgcb) { } /*************************************************************************** Static method to create a new DDP. ***************************************************************************/ DDP *DDP::PddpNew(DOCP *pdocp, PGCB pgcb) { DDP *pddp; if (pvNil == (pddp = NewObj DDP(pdocp, pgcb))) return pvNil; if (!pddp->_FInit()) { ReleasePpo(&pddp); return pvNil; } pddp->Activate(fTrue); AssertPo(pddp, 0); return pddp; } /*************************************************************************** Draws the perspective doc. ***************************************************************************/ void DDP::Draw(PGNV pgnv, RC *prcClip) { DOCP *pdocp = (DOCP *)_pdocb; RC rc, rcT; pgnv->ClipRc(prcClip); pgnv->FillRc(prcClip, kacrWhite); // draw the vanishing point in red rc.Set(pdocp->_wop.pttEye.xt - 3, pdocp->_wop.pttEye.yt - 3, pdocp->_wop.pttEye.xt + 4, pdocp->_wop.pttEye.yt + 4); if (rcT.FIntersect(&rc, prcClip)) { rcT = rc; rcT.Inset(3, 0); pgnv->FillRc(&rcT, kacrRed); rc.Inset(0, 3); pgnv->FillRc(&rc, kacrRed); } // draw the square DrawRc(pgnv); DrawNumbers(pgnv); } /*************************************************************************** Draw the square and it's coordinates. ***************************************************************************/ void DDP::DrawRc(PGNV pgnv) { DOCP *pdocp = (DOCP *)_pdocb; RC rc; pdocp->GetRcPic(&rc); pgnv->FillRc(&rc, kacrBlue); } /*************************************************************************** Draw the coordinates in the GNV. ***************************************************************************/ void DDP::DrawNumbers(PGNV pgnv) { DOCP *pdocp = (DOCP *)_pdocb; STN stn; stn.FFormatSz(PszLit("coords: (%d, %d, %d) "), pdocp->_pttSquare.xt, pdocp->_pttSquare.yt, pdocp->_pttSquare.zt); pgnv->DrawStn(&stn, 0, 0, kacrBlack, kacrWhite); } /*************************************************************************** Track the mouse and drag the square. ***************************************************************************/ void DDP::MouseDown(long xp, long yp, long cact, ulong grfcust) { DOCP *pdocp = (DOCP *)_pdocb; PT pt(xp, yp); PT ptPrev = pt; PT dpt; RC rc; bool fDown = fTrue; for (; fDown; GetPtMouse(&pt, &fDown)) { dpt = pt - ptPrev; if (grfcust & fcustShift) { // x - z dpt.yp = pdocp->_pttSquare.zt - LwBound(pdocp->_pttSquare.zt - dpt.yp, pdocp->_wop.pttEye.zt / 2, pdocp->_wop.ztMax); } else if (grfcust & fcustCmd) { // y - z dpt.xp = LwBound(pdocp->_pttSquare.zt + dpt.xp, pdocp->_wop.pttEye.zt / 2, pdocp->_wop.ztMax) - pdocp->_pttSquare.zt; } if (dpt.xp != 0 || dpt.yp != 0) { pdocp->GetRcPic(&rc); vpappb->MarkRc(&rc, this); if (grfcust & fcustShift) { // x - z pdocp->_pttSquare.xt += dpt.xp; pdocp->_pttSquare.zt -= dpt.yp; } else if (grfcust & fcustCmd) { // y - z pdocp->_pttSquare.zt += dpt.xp; pdocp->_pttSquare.yt += dpt.yp; } else { // x - y pdocp->_pttSquare.xt += dpt.xp; pdocp->_pttSquare.yt += dpt.yp; } pdocp->GetRcPic(&rc); vpappb->MarkRc(&rc, this); rc.Set(0, 0, 20, 200); vpappb->MarkRc(&rc, this); vpappb->UpdateMarked(); } ptPrev = pt; } } /*************************************************************************** Create a new perspective doc and window. ***************************************************************************/ bool APP::FCmdTestPerspective(PCMD pcmd) { DOCP *pdocp; if (pvNil != (pdocp = NewObj DOCP())) { pdocp->PdmdNew(); ReleasePpo(&pdocp); } return fTrue; } // picture document #define DOCPIC_PAR DOCB class DOCPIC : public DOCPIC_PAR { MARKMEM protected: PPIC _ppic; DOCPIC(void); public: ~DOCPIC(void); static DOCPIC *PdocpicNew(void); virtual PDDG PddgNew(PGCB pgcb); PPIC Ppic(void) { return _ppic; } virtual bool FSaveToFni(FNI *pfni, bool fSetFni); }; // picture document display #define DDPIC_PAR DDG class DDPIC : public DDPIC_PAR { protected: DDPIC(DOCPIC *pdocpic, PGCB pgcb); public: static DDPIC *PddpicNew(DOCPIC *pdocpic, PGCB pgcb); virtual void Draw(PGNV pgnv, RC *prcClip); }; /*************************************************************************** Constructor for picture document. ***************************************************************************/ DOCPIC::DOCPIC(void) { _ppic = pvNil; } /*************************************************************************** Destructor for picture document. ***************************************************************************/ DOCPIC::~DOCPIC(void) { ReleasePpo(&_ppic); } #ifdef DEBUG /*************************************************************************** Mark memory for the DOCPIC. ***************************************************************************/ void DOCPIC::MarkMem(void) { AssertValid(0); DOCPIC_PAR::MarkMem(); MarkMemObj(_ppic); } #endif // DEBUG /*************************************************************************** Static method to create a new picture document. ***************************************************************************/ DOCPIC *DOCPIC::PdocpicNew(void) { static long _cact = 0; PGPT pgpt; PGNV pgnv; PPIC ppic; DOCPIC *pdocpic; long i, j; CLR clr; PGL pglclr; RC rc(0, 0, 16, 16); if (pvNil == (pglclr = GL::PglNew(size(CLR), 256))) return pvNil; for (i = 0; i < 256; i++) { ClearPb(&clr, size(clr)); switch (_cact) { default: clr.bRed = byte(255 - i); break; case 1: clr.bGreen = byte(255 - i); break; case 2: clr.bBlue = byte(255 - i); break; } pglclr->FPush(&clr); _cact = (_cact + 1) % 3; } GPT::SetActiveColors(pglclr, fpalIdentity); ReleasePpo(&pglclr); if (pvNil == (pgpt = GPT::PgptNewPic(&rc))) return pvNil; if (pvNil != (pgnv = NewObj GNV(pgpt))) { rc.Offset(rc.Dxp() / 2, 0); pgnv->FillOval(&rc, kacrMagenta); for (i = 0; i < 16; i++) { for (j = 0; j < 16; j++) { rc.Set(i, j, i + 1, j + 1); if ((i + j) & 1) pgnv->FillRc(&rc, ACR(byte(i * 16 + j))); else pgnv->FillOval(&rc, ACR(byte(i * 16 + j))); } } ReleasePpo(&pgnv); } ppic = pgpt->PpicRelease(); if (pvNil == ppic) return pvNil; if (pvNil == (pdocpic = NewObj DOCPIC)) { ReleasePpo(&ppic); return pvNil; } pdocpic->_ppic = ppic; return pdocpic; } /*************************************************************************** Create a new display gob for the document. ***************************************************************************/ PDDG DOCPIC::PddgNew(PGCB pgcb) { return DDPIC::PddpicNew(this, pgcb); } /*************************************************************************** Save the picture in a chunky file. ***************************************************************************/ bool DOCPIC::FSaveToFni(FNI *pfni, bool fSetFni) { PCFL pcfl; bool fT; CNO cno; if (pvNil == (pcfl = CFL::PcflCreate(pfni, fcflNil))) return fFalse; fT = _ppic->FAddToCfl(pcfl, kctgGraphic, &cno) && pcfl->FSave('FT '); ReleasePpo(&pcfl); if (!fT) pfni->FDelete(); return fT; } /*************************************************************************** Constructor for a picture doc pane. ***************************************************************************/ DDPIC::DDPIC(DOCPIC *pdocpic, PGCB pgcb) : DDG(pdocpic, pgcb) { } /*************************************************************************** Static method to create a new DDPIC. ***************************************************************************/ DDPIC *DDPIC::PddpicNew(DOCPIC *pdocpic, PGCB pgcb) { DDPIC *pddpic; if (pvNil == (pddpic = NewObj DDPIC(pdocpic, pgcb))) return pvNil; if (!pddpic->_FInit()) { ReleasePpo(&pddpic); return pvNil; } pddpic->Activate(fTrue); AssertPo(pddpic, 0); return pddpic; } /*************************************************************************** Draws the picture doc. ***************************************************************************/ void DDPIC::Draw(PGNV pgnv, RC *prcClip) { DOCPIC *pdocpic = (DOCPIC *)_pdocb; long i, j; RC rc(0, 0, 33, 16); // draw the picture and draw directly pgnv->FillRc(prcClip, kacrLtGray); rc.Inset(-1, -1); pgnv->SetRcSrc(&rc); rc.Inset(1, 1); rc.xpLeft += 17; pgnv->DrawPic(pdocpic->Ppic(), &rc); for (i = 0; i < 16; i++) { for (j = 0; j < 16; j++) { rc.Set(i, j, i + 1, j + 1); if ((i + j) & 1) pgnv->FillRc(&rc, ACR(byte(i * 16 + j))); else pgnv->FillOval(&rc, ACR(byte(i * 16 + j))); } } } /*************************************************************************** Create a new picture doc and window. ***************************************************************************/ bool APP::FCmdTestPictures(PCMD pcmd) { DOCPIC *pdocpic; if (pvNil != (pdocpic = DOCPIC::PdocpicNew())) { pdocpic->PdmdNew(); ReleasePpo(&pdocpic); } return fTrue; } // GPT Document. #define DOCGPT_PAR DOCB class DOCGPT : public DOCGPT_PAR { MARKMEM protected: DOCGPT(void); PGPT _pgpt; public: ~DOCGPT(void); static DOCGPT *PdocgptNew(void); virtual PDDG PddgNew(PGCB pgcb); PGPT Pgpt(void) { return _pgpt; } }; // GPT display class. #define DDGPT_PAR DDG class DDGPT : public DDGPT_PAR { protected: DDGPT(DOCGPT *pdocgpt, PGCB pgcb); public: static DDGPT *PddgptNew(DOCGPT *pdocgpt, PGCB pgcb); virtual void Draw(PGNV pgnv, RC *prcClip); }; /*************************************************************************** Constructor for mbmp document. ***************************************************************************/ DOCGPT::DOCGPT(void) { _pgpt = pvNil; } /*************************************************************************** Destructor for mbmp document. ***************************************************************************/ DOCGPT::~DOCGPT(void) { ReleasePpo(&_pgpt); } #ifdef DEBUG /*************************************************************************** Mark memory for the DOCGPT. ***************************************************************************/ void DOCGPT::MarkMem(void) { AssertValid(0); DOCGPT_PAR::MarkMem(); MarkMemObj(_pgpt); } #endif // DEBUG /*************************************************************************** Static method to create a new mbmp document. ***************************************************************************/ DOCGPT *DOCGPT::PdocgptNew(void) { DOCGPT *pdocgpt; PGPT pgpt; PGNV pgnv; PMBMP pmbmp; long i; RC rc(0, 0, 256, 256); RC rcT; ACR acr; CLR clr; PGL pglclr; static long _cact = 0; PT pt(0, 0); ACR acr63(63), acr127(127), acr191(191); if (pvNil == (pglclr = GL::PglNew(size(CLR), 256))) return pvNil; for (i = 0; i < 256; i++) { ClearPb(&clr, size(clr)); switch (_cact) { default: clr.bRed = byte(255 - i); break; case 1: clr.bGreen = byte(255 - i); break; case 2: clr.bBlue = byte(255 - i); break; } if (i == 100) // make 100 always the same - yellow { clr.bRed = byte(kbMax); clr.bGreen = byte(kbMax); clr.bBlue = byte(0); } pglclr->FPush(&clr); _cact = (_cact + 1) % 3; } GPT::SetActiveColors(pglclr, fpalIdentity); ReleasePpo(&pglclr); pdocgpt = pvNil; pgpt = pvNil; pmbmp = pvNil; pgnv = pvNil; // Create the gpt if (pvNil == (pgpt = GPT::PgptNewOffscreen(&rc, 8))) goto LFail; if (pvNil == (pgnv = NewObj GNV(pgpt))) goto LFail; // The color mapped to 100 is the transparent pixel value for // the MBMP, so start everything as transparent. acr.SetToIndex(100); pgnv->FillRc(&rc, acr); // Fill the foreground with a pattern rcT.Set(0, 0, 128, 128); pgnv->FillRc(&rcT, acr63); rcT.Set(128, 128, 256, 256); pgnv->FillOval(&rcT, acr63); rcT.Set(48, 48, 80, 80); pgnv->FillRc(&rcT, acr127); rcT.Set(176, 176, 208, 208); pgnv->FillOval(&rcT, acr127); rcT.Set(240, 112, 256, 128); pgnv->FillOval(&rcT, acr191); rcT.Set(0, 128, 16, 144); pgnv->FillRc(&rcT, acr191); rcT.Set(48, 144, 80, 176); pgnv->FillRc(&rcT, kacrBlack); rcT.Set(176, 80, 208, 112); pgnv->FillOval(&rcT, kacrBlack); rcT.Set(0, 208, 48, 256); pgnv->FillRc(&rcT, kacrCyan); rcT.Set(208, 0, 256, 48); pgnv->FillOval(&rcT, kacrCyan); rcT.Set(64, 192, 128, 256); pgnv->FillRc(&rcT, kacrWhite); rcT.Set(128, 0, 192, 64); pgnv->FillOval(&rcT, kacrWhite); // Create an MBMP from the foreground. pmbmp = MBMP::PmbmpNew(pgpt->PrgbLockPixels(), pgpt->CbRow(), rc.Dyp(), &rc, 0, 0, 100); pgpt->Unlock(); if (pvNil == pmbmp) goto LFail; pgnv->FillRc(&rc, kacrMagenta); pgnv->DrawMbmp(pmbmp, 0, 0); if (pvNil != (pdocgpt = NewObj DOCGPT)) { pdocgpt->_pgpt = pgpt; pgpt = pvNil; } if (pvNil == (pglclr = GL::PglNew(size(CLR), 256))) goto LFail; for (i = 0; i < 128; i++) { ClearPb(&clr, size(clr)); clr.bGreen = byte(i * 2); pglclr->FPush(&clr); } for (; i < 256; i++) { ClearPb(&clr, size(clr)); clr.bGreen = 255; clr.bRed = clr.bBlue = (byte)((i - 128) * 2); pglclr->FPush(&clr); } pdocgpt->_pgpt->SetOffscreenColors(pglclr); ReleasePpo(&pglclr); LFail: ReleasePpo(&pgnv); ReleasePpo(&pmbmp); ReleasePpo(&pgpt); return pdocgpt; } /*************************************************************************** Create a new display gob for the document. ***************************************************************************/ PDDG DOCGPT::PddgNew(PGCB pgcb) { return DDGPT::PddgptNew(this, pgcb); } /*************************************************************************** Constructor for a gpt doc pane. ***************************************************************************/ DDGPT::DDGPT(DOCGPT *pdocgpt, PGCB pgcb) : DDG(pdocgpt, pgcb) { } /*************************************************************************** Static method to create a new DDMBMP. ***************************************************************************/ DDGPT *DDGPT::PddgptNew(DOCGPT *pdocgpt, PGCB pgcb) { DDGPT *pddgpt; if (pvNil == (pddgpt = NewObj DDGPT(pdocgpt, pgcb))) return pvNil; if (!pddgpt->_FInit()) { ReleasePpo(&pddgpt); return pvNil; } pddgpt->Activate(fTrue); AssertPo(pddgpt, 0); return pddgpt; } /*************************************************************************** Draws the gpt doc. ***************************************************************************/ void DDGPT::Draw(PGNV pgnv, RC *prcClip) { DOCGPT *pdocgpt = (DOCGPT *)_pdocb; PGNV pgnvT; RC rc(0, 0, 256, 256); RC rcT; if (pvNil == (pgnvT = NewObj GNV(pdocgpt->Pgpt()))) return; GetRc(&rcT, cooLocal); pgnv->CopyPixels(pgnvT, &rc, &rcT); ReleasePpo(&pgnvT); return; } /*************************************************************************** Create a new mbmp and window. ***************************************************************************/ bool APP::FCmdTestMbmps(PCMD pcmd) { DOCGPT *pdocgpt; if (pvNil != (pdocgpt = DOCGPT::PdocgptNew())) { pdocgpt->PdmdNew(); ReleasePpo(&pdocgpt); } return fTrue; } #ifdef MAC /*************************************************************************** Set the main screen as indicated. ***************************************************************************/ bool APP::FCmdSetScreen(PCMD pcmd) { bool tColor = tMaybe; long cbit = 0; switch (pcmd->cid) { default: return fFalse; case cidSetColor: tColor = tYes; break; case cidSetGrayScale: tColor = tNo; break; case cidSetDepth1: cbit = 1; break; case cidSetDepth2: cbit = 2; break; case cidSetDepth4: cbit = 4; break; case cidSetDepth8: cbit = 8; break; case cidSetDepth16: cbit = 16; break; case cidSetDepth32: cbit = 32; break; } GPT::FSetScreenState(cbit, tColor); return fTrue; } /*************************************************************************** Set the menu stuff for the screen resolutions. ***************************************************************************/ bool APP::FEnableScreen(PCMD pcmd, ulong *pgrfeds) { long cbitPixel; bool fColor; bool fCheck; bool fEnable; long cbit; GPT::GetScreenState(&cbitPixel, &fColor); switch (pcmd->cid) { default: return fFalse; case cidSetColor: fCheck = fColor; fEnable = fCheck || GPT::FCanScreen(cbitPixel, fTrue); break; case cidSetGrayScale: fCheck = !fColor; fEnable = fCheck || GPT::FCanScreen(cbitPixel, fFalse); break; case cidSetDepth1: cbit = 1; goto LAll; case cidSetDepth2: cbit = 2; goto LAll; case cidSetDepth4: cbit = 4; goto LAll; case cidSetDepth8: cbit = 8; goto LAll; case cidSetDepth16: cbit = 16; goto LAll; case cidSetDepth32: cbit = 32; LAll: fCheck = cbit == cbitPixel; fEnable = fCheck || GPT::FCanScreen(cbit, fColor); break; } *pgrfeds = (fEnable ? fedsEnable : fedsDisable) | (fCheck ? fedsBullet : fedsUncheck); return fTrue; } #endif // MAC // test animations typedef class TAN *PTAN; #define TAN_PAR GOB class TAN : public TAN_PAR { CMD_MAP_DEC(TAN) protected: static long _cact; APT _apt; ulong _dtim; TAN(PGCB pgcb); public: static PTAN PtanNew(void); virtual void Draw(PGNV pgnv, RC *prcClip); virtual bool FCmdAlarm(PCMD pcmd); }; BEGIN_CMD_MAP(TAN, GOB) ON_CID_ME(cidAlarm, &TAN::FCmdAlarm, pvNil) END_CMD_MAP_NIL() long TAN::_cact = 0; /*************************************************************************** Create a new picture doc and window. ***************************************************************************/ bool APP::FCmdFastUpdate(PCMD pcmd) { TAN::PtanNew(); return fTrue; } /*************************************************************************** Constructor for a Test animation gob. ***************************************************************************/ TAN::TAN(PGCB pgcb) : GOB(pgcb) { } /*************************************************************************** Create a new animation test gob ***************************************************************************/ PTAN TAN::PtanNew(void) { PTAN ptan; RC rc; STN stn; APT apt = {0xF0, 0xF0, 0xF0, 0xF0, 0x0F, 0x0F, 0x0F, 0x0F}; GCB gcb(khidMdi, GOB::PgobScreen()); if (pvNil == (ptan = NewObj TAN(&gcb))) return pvNil; ptan->_dtim = (1 << _cact); _cact = (_cact + 1) % 5; stn.FFormatSz(PszLit("Animation test (%d)"), ptan->_dtim); if (!ptan->FCreateAndAttachMdi(&stn)) { ReleasePpo(&ptan); return pvNil; } ptan->_apt = apt; rc.Set(0, 0, 100, 100); gcb.Set(100, ptan, fgobNil, kginMark, &rc); NewObj GFRC(&gcb, ACR(0x80), fFalse); gcb._hid = 101; NewObj GFRC(&gcb, ACR(0x35), fFalse); vclok.FSetAlarm(ptan->_dtim, ptan); return ptan; } /*************************************************************************** Alarm handler for a TAN. ***************************************************************************/ bool TAN::FCmdAlarm(PCMD pcmd) { if (pcmd->rglw[0] != vclok.Hid()) return fFalse; // wrong clock RC rcPar, rc; RC rcT; PGOB pgob; long cact; GetRc(&rcPar, cooLocal); for (cact = 0, pgob = PgobFirstChild(); pvNil != pgob; pgob = pgob->PgobNextSib(), cact++) { pgob->GetRc(&rc, cooParent); if (cact & 1) { rc.Offset(15, 10); if (rc.ypTop >= rcPar.ypBottom) rc.Offset(0, -rcPar.Dyp() - rc.Dyp()); } else { rc.Offset(10, -15); if (rc.ypBottom <= rcPar.ypTop) rc.Offset(0, rcPar.Dyp() + rc.Dyp()); } if (rc.xpLeft >= rcPar.xpRight) rc.Offset(-rcPar.Dxp() - rc.Dxp(), 0); pgob->SetPos(&rc, pvNil); } vclok.FSetAlarm(_dtim, this); return fTrue; } /*************************************************************************** Draw the thing ***************************************************************************/ void TAN::Draw(PGNV pgnv, RC *prcClip) { //_apt.MoveOrigin(1, 1); pgnv->FillRcApt(prcClip, &_apt, kacrRed, kacrBlue); } typedef class TED *PTED; #define TED_PAR GOB class TED : public TED_PAR { protected: TED(void) : GOB(khidMdi) { } public: static PTED PtedNew(void); virtual void Draw(PGNV pgnv, RC *prcClip); virtual bool FCmdBadKey(PCMD_BADKEY pcmd); }; /*************************************************************************** Create a new window containing a bunch of edit controls. ***************************************************************************/ bool APP::FCmdTextEdit(PCMD pcmd) { TED::PtedNew(); return fTrue; } /*************************************************************************** Static method to create a new TED. ***************************************************************************/ PTED TED::PtedNew(void) { RC rcRel, rcAbs; EDPAR edpar; PTED pted; STN stn; long i, j; long hid; long rgtah[3] = {tahLeft, tahCenter, tahRight}; long rgtav[3] = {tavTop, tavCenter, tavBottom}; if (pvNil == (pted = NewObj TED)) return pvNil; stn = PszLit("Test Edits"); if (!pted->FCreateAndAttachMdi(&stn)) { ReleasePpo(&pted); return pvNil; } rcAbs.Set(1, 1, -1, -1); hid = 1000; for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { rcRel.Set(i * krelOne / 3, j * krelOne / 9, (i + 1) * krelOne / 3, (j + 1) * krelOne / 9); edpar.Set(hid++, pted, fgobNil, kginDefault, &rcAbs, &rcRel, vntl.OnnSystem(), fontNil, 12, rgtah[i], rgtav[j], kacrBlue, kacrYellow); EDSL::PedslNew(&edpar); } } for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { rcRel.Set(i * krelOne / 3, (j + 3) * krelOne / 9, (i + 1) * krelOne / 3, (j + 4) * krelOne / 9); edpar.Set(hid++, pted, fgobNil, kginDefault, &rcAbs, &rcRel, vntl.OnnSystem(), fontNil, 12, rgtah[i], rgtav[j], kacrBlue, kacrYellow); EDML::PedmlNew(&edpar); } } for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { rcRel.Set(i * krelOne / 3, (j + 6) * krelOne / 9, (i + 1) * krelOne / 3, (j + 7) * krelOne / 9); edpar.Set(hid++, pted, fgobNil, kginDefault, &rcAbs, &rcRel, vntl.OnnSystem(), fontNil, 12, rgtah[i], rgtav[j], kacrBlue, kacrYellow); EDMW::PedmwNew(&edpar); } } return pted; } /*************************************************************************** A key wasn't handled by the edit control. ***************************************************************************/ bool TED::FCmdBadKey(PCMD_BADKEY pcmd) { long hid; switch (pcmd->ch) { case kchReturn: case kchTab: hid = pcmd->hid; AssertIn(hid, 1000, 10027); if (pcmd->grfcust & fcustShift) hid = (hid - 974) % 27 + 1000; else hid = (hid - 999) % 27 + 1000; vpcex->EnqueueCid(cidActivateSel, PgobFromHid(hid)); break; } return fTrue; } /*************************************************************************** Draw the background of the TED. ***************************************************************************/ void TED::Draw(PGNV pgnv, RC *prcClip) { pgnv->FillRc(prcClip, kacrWhite); } ================================================ FILE: kauai/src/ft.rc ================================================ //Microsoft App Studio generated resource script. // #include "ftres.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #define APSTUDIO_HIDDEN_SYMBOLS #include "windows.h" #undef APSTUDIO_HIDDEN_SYMBOLS #include "framedef.h" ///////////////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ////////////////////////////////////////////////////////////////////////////// // // Menu // 128 MENU DISCARDABLE BEGIN POPUP "&File" BEGIN MENUITEM "Save &As...", cidSaveAs MENUITEM SEPARATOR MENUITEM "E&xit", cidQuit END POPUP "&Macro" BEGIN MENUITEM "&Record...", cidStartRecording MENUITEM "&Stop Recording", cidCexStopRec MENUITEM "&Play...", cidStartPlaying MENUITEM "S&top Playing", cidCexStopPlay END POPUP "&Test" BEGIN MENUITEM "Test &Suite", cidTestSuite MENUITEM "&New Test Window", cidNewTestWnd MENUITEM "New Te&xt Window", cidTextTestWnd MENUITEM "&Time FrameRc", cidTimeFrameRc MENUITEM "Build &Fni from szPath", cidTestFni MENUITEM SEPARATOR MENUITEM "New &Perspective Window", cidTestPerspective MENUITEM "New &Masked Bitmap Window", cidTestMbmps MENUITEM "New Pi&cture Window", cidTestPictures MENUITEM "New &Animation Window", cidTestFastUpdate MENUITEM "New &Edit Window", cidTestTextEdit END END #ifdef APSTUDIO_INVOKED ////////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE DISCARDABLE BEGIN "ftres.h\0" END 2 TEXTINCLUDE DISCARDABLE BEGIN "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" "#include ""windows.h""\r\n" "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" "\0" END 3 TEXTINCLUDE DISCARDABLE BEGIN "#include ""frame.rc""\r\n" "\0" END ///////////////////////////////////////////////////////////////////////////////////// #endif // APSTUDIO_INVOKED ////////////////////////////////////////////////////////////////////////////// // // Dialog // 200 DIALOG DISCARDABLE 0, 0, 233, 121 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Dialog" FONT 10, "System" BEGIN DEFPUSHBUTTON "OK",100,171,8,50,14 PUSHBUTTON "Cancel",101,171,29,50,14 CONTROL "Graphics",104,"Button",BS_AUTORADIOBUTTON,13,39,82,11 CONTROL "Text",105,"Button",BS_AUTORADIOBUTTON,13,61,82,11 CONTROL "Neither",106,"Button",BS_AUTORADIOBUTTON,13,83,82,11 PUSHBUTTON "Whatever",102,171,50,50,14 CONTROL "CheckBox",103,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,6, 96,12 EDITTEXT 107,121,81,96,14,ES_AUTOHSCROLL LTEXT "Static",108,121,103,86,11 END 201 DIALOG DISCARDABLE 0, 0, 233, 51 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Enter szPath from which to build fni" FONT 10, "System" BEGIN DEFPUSHBUTTON "OK",100,171,8,50,14,NOT WS_TABSTOP PUSHBUTTON "Cancel",101,171,29,50,14,NOT WS_TABSTOP EDITTEXT 107,9,19,152,14,ES_AUTOHSCROLL END #ifndef APSTUDIO_INVOKED //////////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // #include "frame.rc" ///////////////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED ================================================ FILE: kauai/src/ftres.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ //{{NO_DEPENDENCIES}} // App Studio generated include file. // Used by FT.RC // #define cidTestSuite 40001 #define cidNewTestWnd 40002 #define cidTextTestWnd 40004 #define cidStartRecording 40005 #define cidStartPlaying 40006 #define cidTimeFrameRc 40007 #define cidTestFni 40008 #define cidTestPerspective 40009 #define cidTestPictures 40010 #define cidSetColor 40011 #define cidSetGrayScale 40012 #define cidSetDepth1 40013 #define cidSetDepth2 40014 #define cidSetDepth4 40015 #define cidSetDepth8 40016 #define cidSetDepth16 40017 #define cidSetDepth32 40018 #define cidTestFastUpdate 40019 #define cidTestTextEdit 40020 #define cidTestMbmps 40021 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 102 #define _APS_NEXT_COMMAND_VALUE 40022 #define _APS_NEXT_CONTROL_VALUE 1007 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif ================================================ FILE: kauai/src/gfx.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation GFX classes: graphics device (GDV), graphics environment (GNV) ***************************************************************************/ #include "frame.h" ASSERTNAME APT vaptGray = {0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55}; APT vaptLtGray = {0x22, 0x88, 0x44, 0x11, 0x22, 0x88, 0x44, 0x11}; APT vaptDkGray = {0xDD, 0x77, 0xBB, 0xEE, 0xDD, 0x77, 0xBB, 0xEE}; NTL vntl; RTCLASS(GNV) RTCLASS(GPT) RTCLASS(NTL) RTCLASS(OGN) const long kdtsMaxTrans = 30 * kdtsSecond; long vcactRealize; /*************************************************************************** Set the ACR from the lw. The lw should have been returned by a call to ACR::LwGet(). ***************************************************************************/ void ACR::SetFromLw(long lw) { _lu = (ulong)lw; AssertThis(0); } /*************************************************************************** Get an lw from the ACR. The lw can then be stored on file, reread and passed to ACR::SetFromLw. Valid non-nil colors always return non-zero, so zero can be used as a nil value. ***************************************************************************/ long ACR::LwGet(void) const { return (long)_lu; } /*************************************************************************** Get a clr from the ACR. Asserts that the acr is an rgb color. ***************************************************************************/ void ACR::GetClr(CLR *pclr) { AssertThis(facrRgb); AssertVarMem(pclr); pclr->bRed = B2Lw(_lu); pclr->bGreen = B1Lw(_lu); pclr->bBlue = B0Lw(_lu); pclr->bZero = 0; } #ifdef DEBUG /*************************************************************************** Assert that the acr is a valid color. ***************************************************************************/ void ACR::AssertValid(ulong grfacr) { switch (B3Lw(_lu)) { case kbNilAcr: Assert(grfacr == facrNil, "unexpected nil ACR"); break; case kbRgbAcr: Assert(grfacr == facrNil || (grfacr & facrRgb), "unexpected RGB ACR"); break; case kbIndexAcr: Assert(B2Lw(_lu) == 0 && B1Lw(_lu) == 0, "bad Index ACR"); Assert(grfacr == facrNil || (grfacr & facrIndex), "unexpected Index ACR"); break; case kbSpecialAcr: Assert(_lu == kluAcrClear || _lu == kluAcrInvert, "unknown acr"); Assert(grfacr == facrNil, "unexpected Special ACR"); break; default: BugVar("invalid ACR", &_lu); break; } } #endif // DEBUG /*************************************************************************** Change the origin on the pattern. ***************************************************************************/ void APT::MoveOrigin(long dxp, long dyp) { // this cast to ulong works because 2^32 is a multiple of 8. dxp = (ulong)dxp % 8; dyp = (ulong)dyp % 8; if (dxp != 0) { byte *pb; for (pb = rgb + 8; pb-- != rgb;) *pb = (*pb >> dxp) | (*pb << (8 - dxp)); } if (dyp != 0) SwapBlocks(rgb, 8 - dyp, dyp); } /*************************************************************************** Constructor for Graphics environment. ***************************************************************************/ GNV::GNV(GPT *pgpt) { AssertPo(pgpt, 0); _Init(pgpt); AssertThis(0); } /*************************************************************************** Constructor for Graphics environment based on a pgob. ***************************************************************************/ GNV::GNV(PGOB pgob) { AssertPo(pgob, 0); _Init(pgob->Pgpt()); // use the GOB's port SetGobRc(pgob); // set the rc's according to the gob AssertThis(0); } /*************************************************************************** Constructor for Graphics environment based on both a port and a pgob. ***************************************************************************/ GNV::GNV(PGOB pgob, PGPT pgpt) { AssertPo(pgpt, 0); AssertPo(pgob, 0); _Init(pgpt); SetGobRc(pgob); AssertThis(0); } /*************************************************************************** Destructor for the GNV. ***************************************************************************/ GNV::~GNV(void) { AssertThis(0); Mac(_pgpt->Unlock();) ReleasePpo(&_pgpt); } /*************************************************************************** Fill in all fields of the gnv with default values. ***************************************************************************/ void GNV::_Init(PGPT pgpt) { PT pt; _pgpt = pgpt; pgpt->AddRef(); Mac(pgpt->Lock();) _rcSrc.Set(0, 0, 1, 1); pgpt->GetPtBase(&pt); _rcDst.OffsetCopy(&_rcSrc, -pt.xp, -pt.yp); _xp = _yp = 0; _dsf.onn = vntl.OnnSystem(); _dsf.grfont = fontNil; _dsf.dyp = vpappb->DypTextDef(); _dsf.tah = tahLeft; _dsf.tav = tavTop; _gdd.dxpPen = _gdd.dypPen = 1; _gdd.prcsClip = pvNil; _rcVis.Max(); } /*************************************************************************** Set the mapping and vis according to the gob. ***************************************************************************/ void GNV::SetGobRc(PGOB pgob) { RC rc; // set the mapping pgob->GetRc(&rc, cooGpt); SetRcDst(&rc); pgob->GetRc(&rc, cooLocal); SetRcSrc(&rc); pgob->GetRcVis(&rc, cooLocal); SetRcVis(&rc); } #ifdef DEBUG /*************************************************************************** Assert the validity of the gnv ***************************************************************************/ void GNV::AssertValid(ulong grf) { GNV_PAR::AssertValid(0); AssertPo(_pgpt, 0); AssertPo(&_dsf, 0); Assert(!_rcSrc.FEmpty(), "empty src rectangle"); Assert(!_rcDst.FEmpty(), "empty dst rectangle"); Assert(_gdd.prcsClip == pvNil || _gdd.prcsClip == &_rcsClip, "bad _gdd.prcsClip"); } /*************************************************************************** Mark memory for the GNV. ***************************************************************************/ void GNV::MarkMem(void) { AssertValid(0); GNV_PAR::MarkMem(); MarkMemObj(_pgpt); } #endif // DEBUG /*************************************************************************** Fill a rectangle with a two color pattern. ***************************************************************************/ void GNV::FillRcApt(RC *prc, APT *papt, ACR acrFore, ACR acrBack) { AssertThis(0); AssertVarMem(prc); AssertVarMem(papt); AssertPo(&acrFore, 0); AssertPo(&acrBack, 0); RCS rcs; if (!_FMapRcRcs(prc, &rcs)) return; _gdd.grfgdd = fgddFill | fgddPattern; _gdd.apt = *papt; _gdd.apt.MoveOrigin(_rcDst.xpLeft - _rcSrc.xpLeft, _rcDst.ypTop - _rcSrc.ypTop); _gdd.acrFore = acrFore; _gdd.acrBack = acrBack; _pgpt->DrawRcs(&rcs, &_gdd); } /*************************************************************************** Fill a rectangle with a color. ***************************************************************************/ void GNV::FillRc(RC *prc, ACR acr) { AssertThis(0); AssertVarMem(prc); AssertPo(&acr, 0); RCS rcs; if (!_FMapRcRcs(prc, &rcs)) return; _gdd.grfgdd = fgddFill; _gdd.acrFore = acr; _pgpt->DrawRcs(&rcs, &_gdd); } /*************************************************************************** Frame a rectangle with a two color pattern. ***************************************************************************/ void GNV::FrameRcApt(RC *prc, APT *papt, ACR acrFore, ACR acrBack) { AssertThis(0); AssertVarMem(prc); AssertVarMem(papt); AssertPo(&acrFore, 0); AssertPo(&acrBack, 0); RCS rcs; if (!_FMapRcRcs(prc, &rcs) || _gdd.dxpPen == 0 && _gdd.dypPen == 0) return; _gdd.grfgdd = fgddFrame | fgddPattern; _gdd.apt = *papt; _gdd.apt.MoveOrigin(_rcDst.xpLeft - _rcSrc.xpLeft, _rcDst.ypTop - _rcSrc.ypTop); _gdd.acrFore = acrFore; _gdd.acrBack = acrBack; _pgpt->DrawRcs(&rcs, &_gdd); } /*************************************************************************** Frame a rectangle with a color. ***************************************************************************/ void GNV::FrameRc(RC *prc, ACR acr) { AssertThis(0); AssertVarMem(prc); AssertPo(&acr, 0); RCS rcs; if (!_FMapRcRcs(prc, &rcs) || _gdd.dxpPen == 0 && _gdd.dypPen == 0) return; _gdd.grfgdd = fgddFrame; _gdd.acrFore = acr; _pgpt->DrawRcs(&rcs, &_gdd); } /*************************************************************************** For hilighting text. On mac, interchanges the system hilite color and the background color. On Win, just inverts. ***************************************************************************/ void GNV::HiliteRc(RC *prc, ACR acrBack) { AssertThis(0); AssertVarMem(prc); RCS rcs; if (!_FMapRcRcs(prc, &rcs)) return; _gdd.acrBack = acrBack; _pgpt->HiliteRcs(&rcs, &_gdd); } /*************************************************************************** Fill an oval with a two color pattern. ***************************************************************************/ void GNV::FillOvalApt(RC *prc, APT *papt, ACR acrFore, ACR acrBack) { AssertThis(0); AssertVarMem(prc); AssertVarMem(papt); AssertPo(&acrFore, 0); AssertPo(&acrBack, 0); RCS rcs; if (!_FMapRcRcs(prc, &rcs)) return; _gdd.grfgdd = fgddFill | fgddPattern; _gdd.apt = *papt; _gdd.apt.MoveOrigin(_rcDst.xpLeft - _rcSrc.xpLeft, _rcDst.ypTop - _rcSrc.ypTop); _gdd.acrFore = acrFore; _gdd.acrBack = acrBack; _pgpt->DrawOval(&rcs, &_gdd); } /*************************************************************************** Fill an oval with a color. ***************************************************************************/ void GNV::FillOval(RC *prc, ACR acr) { AssertThis(0); AssertVarMem(prc); AssertPo(&acr, 0); RCS rcs; if (!_FMapRcRcs(prc, &rcs)) return; _gdd.grfgdd = fgddFill; _gdd.acrFore = acr; _pgpt->DrawOval(&rcs, &_gdd); } /*************************************************************************** Frame an oval with a two color pattern. ***************************************************************************/ void GNV::FrameOvalApt(RC *prc, APT *papt, ACR acrFore, ACR acrBack) { AssertThis(0); AssertVarMem(prc); AssertVarMem(papt); AssertPo(&acrFore, 0); AssertPo(&acrBack, 0); RCS rcs; if (!_FMapRcRcs(prc, &rcs) || _gdd.dxpPen == 0 && _gdd.dypPen == 0) return; _gdd.grfgdd = fgddFrame | fgddPattern; _gdd.apt = *papt; _gdd.apt.MoveOrigin(_rcDst.xpLeft - _rcSrc.xpLeft, _rcDst.ypTop - _rcSrc.ypTop); _gdd.acrFore = acrFore; _gdd.acrBack = acrBack; _pgpt->DrawOval(&rcs, &_gdd); } /*************************************************************************** Frame an oval with a color. ***************************************************************************/ void GNV::FrameOval(RC *prc, ACR acr) { AssertThis(0); AssertVarMem(prc); AssertPo(&acr, 0); RCS rcs; if (!_FMapRcRcs(prc, &rcs) || _gdd.dxpPen == 0 && _gdd.dypPen == 0) return; _gdd.grfgdd = fgddFrame; _gdd.acrFore = acr; _pgpt->DrawOval(&rcs, &_gdd); } /*************************************************************************** Draw a line with a pattern. Sets the pen position to (xp2, yp2). ***************************************************************************/ void GNV::LineApt(long xp1, long yp1, long xp2, long yp2, APT *papt, ACR acrFore, ACR acrBack) { AssertThis(0); AssertVarMem(papt); AssertPo(&acrFore, 0); AssertPo(&acrBack, 0); PTS pts1, pts2; if (_gdd.dxpPen != 0 || _gdd.dypPen != 0) { _gdd.grfgdd = fgddFrame | fgddPattern; _gdd.apt = *papt; _gdd.apt.MoveOrigin(_rcDst.xpLeft - _rcSrc.xpLeft, _rcDst.ypTop - _rcSrc.ypTop); _gdd.acrFore = acrFore; _gdd.acrBack = acrBack; _MapPtPts(xp1, yp1, &pts1); _MapPtPts(xp2, yp2, &pts2); _pgpt->DrawLine(&pts1, &pts2, &_gdd); } _xp = xp2; _yp = yp2; } /*************************************************************************** Draw a line in a solid color. Sets the pen position to (xp2, yp2). ***************************************************************************/ void GNV::Line(long xp1, long yp1, long xp2, long yp2, ACR acr) { AssertThis(0); AssertPo(&acr, 0); PTS pts1, pts2; if (_gdd.dxpPen != 0 || _gdd.dypPen != 0) { _gdd.grfgdd = fgddFrame; _gdd.acrFore = acr; _MapPtPts(xp1, yp1, &pts1); _MapPtPts(xp2, yp2, &pts2); _pgpt->DrawLine(&pts1, &pts2, &_gdd); } _xp = xp2; _yp = yp2; } /*************************************************************************** Fill a polygon with a pattern. ***************************************************************************/ void GNV::FillOgnApt(POGN pogn, APT *papt, ACR acrFore, ACR acrBack) { AssertThis(0); AssertPo(pogn, 0); AssertVarMem(papt); AssertPo(&acrFore, 0); AssertPo(&acrBack, 0); HQ hqoly; if ((hqoly = _HqolyCreate(pogn, fognAutoClose)) == hqNil) { PushErc(ercGfxCantDraw); return; } _gdd.grfgdd = fgddFill | fgddPattern; _gdd.apt = *papt; _gdd.apt.MoveOrigin(_rcDst.xpLeft - _rcSrc.xpLeft, _rcDst.ypTop - _rcSrc.ypTop); _gdd.acrFore = acrFore; _gdd.acrBack = acrBack; _pgpt->DrawPoly(hqoly, &_gdd); FreePhq(&hqoly); } /*************************************************************************** Fill a polygon with a color. ***************************************************************************/ void GNV::FillOgn(POGN pogn, ACR acr) { AssertThis(0); AssertPo(pogn, 0); AssertPo(&acr, 0); HQ hqoly; if ((hqoly = _HqolyCreate(pogn, fognAutoClose)) == hqNil) { PushErc(ercGfxCantDraw); return; } _gdd.grfgdd = fgddFill; _gdd.acrFore = acr; _pgpt->DrawPoly(hqoly, &_gdd); FreePhq(&hqoly); } /*************************************************************************** Frame a polygon with a pattern. NOTE: Using kacrInvert produces slightly different results on the Mac. (Mac only does alternate winding). ***************************************************************************/ void GNV::FrameOgnApt(POGN pogn, APT *papt, ACR acrFore, ACR acrBack) { AssertThis(0); AssertPo(pogn, 0); AssertVarMem(papt); AssertPo(&acrFore, 0); AssertPo(&acrBack, 0); HQ hqoly; if (_gdd.dxpPen == 0 && _gdd.dypPen == 0) return; if (hqNil == (hqoly = _HqolyFrame(pogn, fognAutoClose))) { PushErc(ercGfxCantDraw); return; } _gdd.grfgdd = fgddFrame | fgddPattern; _gdd.apt = *papt; _gdd.apt.MoveOrigin(_rcDst.xpLeft - _rcSrc.xpLeft, _rcDst.ypTop - _rcSrc.ypTop); _gdd.acrFore = acrFore; _gdd.acrBack = acrBack; _pgpt->DrawPoly(hqoly, &_gdd); FreePhq(&hqoly); } /*************************************************************************** Frame a polygon with a color. NOTE: Using kacrInvert produces slightly different results on the Mac. ***************************************************************************/ void GNV::FrameOgn(POGN pogn, ACR acr) { AssertThis(0); AssertPo(pogn, 0); AssertPo(&acr, 0); HQ hqoly; if (_gdd.dxpPen == 0 && _gdd.dypPen == 0) return; if (hqNil == (hqoly = _HqolyFrame(pogn, fognAutoClose))) { PushErc(ercGfxCantDraw); return; } _gdd.grfgdd = fgddFrame; _gdd.acrFore = acr; _pgpt->DrawPoly(hqoly, &_gdd); FreePhq(&hqoly); } /*************************************************************************** Frame a poly-line with a pattern. NOTE: Using kacrInvert produces slightly different results on the Mac. ***************************************************************************/ void GNV::FramePolyLineApt(POGN pogn, APT *papt, ACR acrFore, ACR acrBack) { AssertThis(0); AssertPo(pogn, 0); AssertVarMem(papt); AssertPo(&acrFore, 0); AssertPo(&acrBack, 0); HQ hqoly; if (_gdd.dxpPen == 0 && _gdd.dypPen == 0) return; if (hqNil == (hqoly = _HqolyFrame(pogn, fognNil))) { PushErc(ercGfxCantDraw); return; } _gdd.grfgdd = fgddFrame | fgddPattern; _gdd.apt = *papt; _gdd.apt.MoveOrigin(_rcDst.xpLeft - _rcSrc.xpLeft, _rcDst.ypTop - _rcSrc.ypTop); _gdd.acrFore = acrFore; _gdd.acrBack = acrBack; _pgpt->DrawPoly(hqoly, &_gdd); FreePhq(&hqoly); } /*************************************************************************** Frame a poly-line with a color. NOTE: Using kacrInvert produces slightly different results on the Mac. ***************************************************************************/ void GNV::FramePolyLine(POGN pogn, ACR acr) { AssertThis(0); AssertPo(pogn, 0); AssertPo(&acr, 0); HQ hqoly; if (_gdd.dxpPen == 0 && _gdd.dypPen == 0) return; if (hqNil == (hqoly = _HqolyCreate(pogn, fognNil))) { PushErc(ercGfxCantDraw); return; } _gdd.grfgdd = fgddFrame; _gdd.acrFore = acr; _pgpt->DrawPoly(hqoly, &_gdd); FreePhq(&hqoly); } /*************************************************************************** Convert an OGN into a polygon record (hqoly). This maps the points and optionally closes the polygon and/or calculates the bounds (Mac only). ***************************************************************************/ HQ GNV::_HqolyCreate(POGN pogn, ulong grfogn) { AssertThis(0); AssertPo(pogn, 0); HQ hqoly; long ipt; long cb; long cpt; OLY *poly; PT *ppt; PTS *ppts; if ((cpt = pogn->IvMac()) < 2) return hqNil; cb = kcbOlyBase + LwMul(cpt, size(PTS)); if (cpt < 3) grfogn &= ~fognAutoClose; else if (grfogn & fognAutoClose) cb += size(PTS); if (!FAllocHq(&hqoly, cb, fmemNil, mprNormal)) return hqNil; poly = (OLY *)PvLockHq(hqoly); #ifdef MAC poly->cb = (short)cb; Assert(cb == poly->cb, "polygon too big"); poly->rcs.left = kswMax; poly->rcs.right = kswMin; poly->rcs.top = kswMax; poly->rcs.bottom = kswMin; #else //! MAC poly->cpts = cpt + FPure(grfogn & fognAutoClose); #endif //! MAC ppt = pogn->PrgptLock(); ppts = (PTS *)poly->rgpts; for (ipt = 0; ipt < cpt; ipt++, ppt++, ppts++) { _MapPtPts(ppt->xp, ppt->yp, ppts); #ifdef MAC // Compute bounding rectangle. if (poly->rcs.top > ppts->v) poly->rcs.top = ppts->v; if (poly->rcs.left > ppts->h) poly->rcs.left = ppts->h; if (poly->rcs.bottom < ppts->v) poly->rcs.bottom = ppts->v; if (poly->rcs.right < ppts->h) poly->rcs.right = ppts->h; #endif // MAC } if (grfogn & fognAutoClose) *ppts = poly->rgpts[0]; pogn->Unlock(); UnlockHq(hqoly); return hqoly; } /*************************************************************************** Convert a polygon (OGN) into a polygon record (hqoly). On Windows, this actually generates a new polygon that is the outline of the framed path (which we'll tell GDI to fill). On the Mac, this just calls _HqolyCreate. ***************************************************************************/ HQ GNV::_HqolyFrame(POGN pogn, ulong grfogn) { #ifdef WIN AssertThis(0); AssertPo(pogn, 0); HQ hqoly; POGN pognUse; PT rgptPen[4]; // Pen rectangle vectors. rgptPen[0].xp = 0; rgptPen[0].yp = 0; rgptPen[1].xp = _gdd.dxpPen; rgptPen[1].yp = 0; rgptPen[2].xp = _gdd.dxpPen; rgptPen[2].yp = _gdd.dypPen; rgptPen[3].xp = 0; rgptPen[3].yp = _gdd.dypPen; if (pvNil == (pognUse = pogn->PognTraceRgpt(rgptPen, 4, grfogn))) return pvNil; hqoly = _HqolyCreate(pognUse, grfogn); ReleasePpo(&pognUse); return hqoly; #elif defined(MAC) return _HqolyCreate(pogn, grfogn); #endif // MAC } /*************************************************************************** Scroll the given rectangle by (dxp, dyp). If prc1 is not nil fill it with the first uncovered rectangle. If prc2 is not nil fill it with the second uncovered rectangle (if there is one). ***************************************************************************/ void GNV::ScrollRc(RC *prc, long dxp, long dyp, RC *prc1, RC *prc2) { AssertThis(0); AssertVarMem(prc); AssertNilOrVarMem(prc1); AssertNilOrVarMem(prc2); PTS pts; RCS rcs; PT pt; if (!_FMapRcRcs(prc, &rcs) || dxp == 0 && dyp == 0) { if (pvNil != prc1) prc1->Zero(); if (pvNil != prc2) prc2->Zero(); return; } _MapPtPts(prc->xpLeft + dxp, prc->ypTop + dyp, &pts); pt = pts; _pgpt->ScrollRcs(&rcs, pt.xp - rcs.left, pt.yp - rcs.top, &_gdd); GetBadRcForScroll(prc, dxp, dyp, prc1, prc2); } /*************************************************************************** Static method to get the RC's that are uncovered during a scroll operation. ***************************************************************************/ void GNV::GetBadRcForScroll(RC *prc, long dxp, long dyp, RC *prc1, RC *prc2) { AssertNilOrVarMem(prc1); AssertNilOrVarMem(prc2); if (pvNil != prc1) { *prc1 = *prc; if (0 < dxp) prc1->xpRight = prc1->xpLeft + dxp; else if (0 > dxp) prc1->xpLeft = prc1->xpRight + dxp; else if (0 < dyp) prc1->ypBottom = prc1->ypTop + dyp; else prc1->ypTop = prc1->ypBottom + dyp; prc1->FIntersect(prc); } if (pvNil != prc2) { if (0 == dxp || 0 == dyp) prc2->Zero(); else { *prc2 = *prc; if (0 < dyp) prc2->ypBottom = prc2->ypTop + dyp; else prc2->ypTop = prc2->ypBottom + dyp; if (0 < dxp) prc2->xpLeft += dxp; else prc2->xpRight += dxp; prc2->FIntersect(prc); } } } /*************************************************************************** Get the source rectangle. ***************************************************************************/ void GNV::GetRcSrc(RC *prc) { AssertThis(0); AssertVarMem(prc); *prc = _rcSrc; } /*************************************************************************** Set the source rectangle. ***************************************************************************/ void GNV::SetRcSrc(RC *prc) { AssertThis(0); AssertVarMem(prc); _rcSrc = *prc; if (_rcSrc.FEmpty()) { _rcSrc.xpRight = _rcSrc.xpLeft + 1; _rcSrc.ypBottom = _rcSrc.ypTop + 1; } AssertThis(0); } /*************************************************************************** Get the destination rectangle. ***************************************************************************/ void GNV::GetRcDst(RC *prc) { AssertThis(0); AssertVarMem(prc); PT pt; *prc = _rcDst; _pgpt->GetPtBase(&pt); prc->Offset(pt.xp, pt.yp); } /*************************************************************************** Set the destination rectangle. Also opens up the vis rc and clipping and sets default font and pen values. ***************************************************************************/ void GNV::SetRcDst(RC *prc) { AssertThis(0); AssertVarMem(prc); PT pt; _rcDst = *prc; if (_rcDst.FEmpty()) { _rcDst.xpRight = _rcDst.xpLeft + 1; _rcDst.ypBottom = _rcDst.ypTop + 1; } _pgpt->GetPtBase(&pt); _rcDst.Offset(-pt.xp, -pt.yp); _gdd.prcsClip = pvNil; _rcVis.Max(); _dsf.onn = vntl.OnnSystem(); _dsf.grfont = fontNil; _dsf.dyp = vpappb->DypTextDef(); _dsf.tah = tahLeft; _dsf.tav = tavTop; _gdd.dxpPen = _gdd.dypPen = 1; AssertThis(0); } /*************************************************************************** Set the visible rectangle. When ClipRc is called, the rc is first intersected with the vis rc. Passing pvNil opens up the vis rectangle (so there is no natural clipping). This should be called _after_ SetRcDst, since SetRcDst opens up the vis rc. This also opens the clipping to the vis rc. ***************************************************************************/ void GNV::SetRcVis(RC *prc) { AssertThis(0); AssertNilOrVarMem(prc); if (prc == pvNil) { _rcVis.Max(); _gdd.prcsClip = pvNil; } else { _rcVis = *prc; _rcVis.Map(&_rcSrc, &_rcDst); _rcsClip = RCS(_rcVis); _gdd.prcsClip = &_rcsClip; } AssertThis(0); } /*************************************************************************** Intersect the current vis rectangle with the given rectangle and make that the new vis rectangle. Opens the clipping to the vis rectangle also. ***************************************************************************/ void GNV::IntersectRcVis(RC *prc) { AssertThis(0); AssertVarMem(prc); RC rc; rc = *prc; rc.Map(&_rcSrc, &_rcDst); _rcVis.FIntersect(&rc); _rcsClip = RCS(_rcVis); _gdd.prcsClip = &_rcsClip; AssertThis(0); } /*************************************************************************** Set the clipping (in source coordinates). If prc is pvNil, opens up the clipping (to the vis rectangle). Otherwise, sets the clipping to the intersection of the vis rectangle and *prc. ***************************************************************************/ void GNV::ClipRc(RC *prc) { AssertThis(0); AssertNilOrVarMem(prc); RC rc; if (prc == pvNil) { rc.Max(); if (rc == _rcVis) { // no clipping _gdd.prcsClip = pvNil; return; } rc = _rcVis; } else { rc = *prc; rc.Map(&_rcSrc, &_rcDst); rc.FIntersect(&_rcVis); } _rcsClip = RCS(rc); _gdd.prcsClip = &_rcsClip; } /*************************************************************************** Clip to the source rectangle. ***************************************************************************/ void GNV::ClipToSrc(void) { AssertThis(0); ClipRc(&_rcSrc); } /*************************************************************************** Set the pen size (in source coordinates). ***************************************************************************/ void GNV::SetPenSize(long dxpPen, long dypPen) { AssertThis(0); AssertIn(dxpPen, 0, kswMax); AssertIn(dypPen, 0, kswMax); _gdd.dxpPen = LwMulDivAway(dxpPen, _rcDst.Dxp(), _rcSrc.Dxp()); _gdd.dypPen = LwMulDivAway(dypPen, _rcDst.Dyp(), _rcSrc.Dyp()); } /*************************************************************************** Set the current font info. ***************************************************************************/ void GNV::SetFont(long onn, ulong grfont, long dypFont, long tah, long tav) { AssertThis(0); _dsf.onn = onn; _dsf.grfont = grfont; _dsf.dyp = LwMulDivAway(dypFont, _rcDst.Dyp(), _rcSrc.Dyp()); _dsf.tah = tah; _dsf.tav = tav; AssertThis(0); } /*************************************************************************** Set the current font. ***************************************************************************/ void GNV::SetOnn(long onn) { AssertThis(0); _dsf.onn = onn; AssertThis(0); } /*************************************************************************** Set the current font style. ***************************************************************************/ void GNV::SetFontStyle(ulong grfont) { AssertThis(0); _dsf.grfont = grfont; AssertThis(0); } /*************************************************************************** Set the current font size. ***************************************************************************/ void GNV::SetFontSize(long dyp) { AssertThis(0); _dsf.dyp = LwMulDivAway(dyp, _rcDst.Dyp(), _rcSrc.Dyp()); AssertThis(0); } /*************************************************************************** Set the current font alignment. ***************************************************************************/ void GNV::SetFontAlign(long tah, long tav) { AssertThis(0); _dsf.tah = tah; _dsf.tav = tav; AssertThis(0); } /****************************************************************************** Set the current font. Font size must be specified in Dst units. ******************************************************************************/ void GNV::SetDsf(DSF *pdsf) { AssertThis(0); AssertPo(pdsf, 0); _dsf = *pdsf; AssertThis(0); } /****************************************************************************** Get the current font. Font size is specified in Dst units. ******************************************************************************/ void GNV::GetDsf(DSF *pdsf) { AssertThis(0); AssertVarMem(pdsf); *pdsf = _dsf; } /****************************************************************************** Draw some text. ******************************************************************************/ void GNV::DrawRgch(achar *prgch, long cch, long xp, long yp, ACR acrFore, ACR acrBack) { AssertThis(0); AssertIn(cch, 0, kcbMax); AssertPvCb(prgch, cch); AssertPo(&acrFore, 0); AssertPo(&acrBack, 0); PTS pts; if (cch == 0) return; _gdd.acrFore = acrFore; _gdd.acrBack = acrBack; _MapPtPts(xp, yp, &pts); _pgpt->DrawRgch(prgch, cch, pts, &_gdd, &_dsf); } /*************************************************************************** Draw the given string. ***************************************************************************/ void GNV::DrawStn(PSTN pstn, long xp, long yp, ACR acrFore, ACR acrBack) { AssertThis(0); AssertPo(pstn, 0); AssertPo(&acrFore, 0); AssertPo(&acrBack, 0); DrawRgch(pstn->Prgch(), pstn->Cch(), xp, yp, acrFore, acrBack); } /****************************************************************************** Return the bounding box of the text. If the GNV has any scaling, this is approximate. This even works if cch is 0 (just gives the height). ******************************************************************************/ void GNV::GetRcFromRgch(RC *prc, achar *prgch, long cch, long xp, long yp) { AssertThis(0); AssertVarMem(prc); AssertIn(cch, 0, kcbMax); AssertPvCb(prgch, cch); PTS pts; RCS rcs; _MapPtPts(xp, yp, &pts); _pgpt->GetRcsFromRgch(&rcs, prgch, cch, pts, &_dsf); *prc = rcs; prc->Map(&_rcDst, &_rcSrc); } /****************************************************************************** Return the bounding box of the text. If the GNV has any scaling, this is approximate. This even works if the string is empty (gives the height). ******************************************************************************/ void GNV::GetRcFromStn(RC *prc, PSTN pstn, long xp, long yp) { AssertThis(0); AssertVarMem(prc); AssertPo(pstn, 0); GetRcFromRgch(prc, pstn->Prgch(), pstn->Cch(), xp, yp); } /*************************************************************************** Copy bits from a GNV to this one. ***************************************************************************/ void GNV::CopyPixels(PGNV pgnvSrc, RC *prcSrc, RC *prcDst) { AssertThis(0); AssertPo(pgnvSrc, 0); AssertVarMem(prcSrc); AssertVarMem(prcDst); RCS rcsSrc, rcsDst; if (!pgnvSrc->_FMapRcRcs(prcSrc, &rcsSrc) || !_FMapRcRcs(prcDst, &rcsDst)) return; _pgpt->CopyPixels(pgnvSrc->_pgpt, &rcsSrc, &rcsDst, &_gdd); } ulong _mpgfdgrfpt[4] = {fptNegateXp, fptNil, fptNegateYp | fptTranspose, fptTranspose}; ulong _mpgfdgrfptInv[4] = {fptNegateXp, fptNil, fptNegateXp | fptTranspose, fptTranspose}; /*************************************************************************** Get the old palette in *ppglclrOld, allocate a transitionary palette in *ppglclrTrans, and get init the palette animation. On failure set the new palette and set *ppglclrOld and *ppglclrTrans to nil. If cbitPixel is not zero and not the depth of this device, this sets the palette and returns false. ***************************************************************************/ bool GNV::_FInitPaletteTrans(PGL pglclr, PGL *ppglclrOld, PGL *ppglclrTrans, long cbitPixel) { AssertNilOrPo(pglclr, 0); AssertVarMem(ppglclrOld); AssertVarMem(ppglclrTrans); long cclr = pvNil == pglclr ? 256 : pglclr->IvMac(); *ppglclrOld = pvNil; *ppglclrTrans = pvNil; // get the current palette and set up the temporary transitionary palette if (0 != cbitPixel && _pgpt->CbitPixel() != cbitPixel || pvNil == (*ppglclrOld = GPT::PglclrGetPalette()) || 0 == (cclr = LwMin((*ppglclrOld)->IvMac(), cclr)) || pvNil == (*ppglclrTrans = GL::PglNew(size(CLR), cclr))) { ReleasePpo(ppglclrOld); if (pvNil != pglclr) GPT::SetActiveColors(pglclr, fpalIdentity); return fFalse; } AssertDo((*ppglclrTrans)->FSetIvMac(cclr), 0); GPT::SetActiveColors(*ppglclrOld, fpalIdentity | fpalInitAnim); return fTrue; } /*************************************************************************** Transition the palette. Merge pglclrOld and pglclrNew into pglclrTrans and animate the palette to pglclrTrans. If either source palette is nil, *pclrSub is used in place of the nil palette. acrSub must be an RGB color. ***************************************************************************/ void GNV::_PaletteTrans(PGL pglclrOld, PGL pglclrNew, long lwNum, long lwDen, PGL pglclrTrans, CLR *pclrSub) { AssertNilOrPo(pglclrOld, 0); AssertNilOrPo(pglclrNew, 0); AssertIn(lwDen, 1, kcbMax); AssertIn(lwNum, 0, lwDen + 1); AssertNilOrVarMem(pclrSub); long iclr; CLR clrOld, clrNew; CLR clrSub; iclr = pglclrTrans->IvMac(); if (pvNil != pglclrOld) iclr = LwMin(pglclrOld->IvMac(), iclr); if (pvNil != pglclrNew) iclr = LwMin(pglclrNew->IvMac(), iclr); if (pvNil != pclrSub) clrSub = *pclrSub; else ClearPb(&clrSub, size(clrSub)); while (iclr-- > 0) { clrOld = clrNew = clrSub; if (pvNil != pglclrOld) pglclrOld->Get(iclr, &clrOld); if (pvNil != pglclrNew) pglclrNew->Get(iclr, &clrNew); clrOld.bRed += (byte)LwMulDiv((long)clrNew.bRed - clrOld.bRed, lwNum, lwDen); clrOld.bGreen += (byte)LwMulDiv((long)clrNew.bGreen - clrOld.bGreen, lwNum, lwDen); clrOld.bBlue += (byte)LwMulDiv((long)clrNew.bBlue - clrOld.bBlue, lwNum, lwDen); pglclrTrans->Put(iclr, &clrOld); } GPT::SetActiveColors(pglclrTrans, fpalIdentity | fpalAnimate); } /*************************************************************************** Create a temporary GNV that is a copy of the given rectangle in this GNV. This is used for several transitions. ***************************************************************************/ bool GNV::_FEnsureTempGnv(PGNV *ppgnv, RC *prc) { PGPT pgpt; PGNV pgnv; if (pvNil == (pgpt = GPT::PgptNewOffscreen(prc, 8)) || pvNil == (pgnv = NewObj GNV(pgpt))) { ReleasePpo(&pgpt); *ppgnv = pvNil; return fFalse; } ReleasePpo(&pgpt); pgnv->CopyPixels(this, prc, prc); GPT::Flush(); *ppgnv = pgnv; return fTrue; } /*************************************************************************** Wipe the source gnv onto this one. If acrFill is not kacrClear, first wipe acrFill on. The source and destination rectangles must be the same size. gfd indicates which direction the wipe is. If pglclr is not nil and acrFill is clear, the palette transition is gradual. ***************************************************************************/ void GNV::Wipe(long gfd, ACR acrFill, PGNV pgnvSrc, RC *prcSrc, RC *prcDst, ulong dts, PGL pglclr) { AssertThis(0); AssertPo(&acrFill, 0); AssertPo(pgnvSrc, 0); AssertVarMem(prcSrc); AssertVarMem(prcDst); AssertNilOrPo(pglclr, 0); ulong grfpt, grfptInv; ulong tsStart, dtsT; long dxp, dxpTot; long cact; RC rcSrc, rcDst; RC rc1, rc2; PGL pglclrOld = pvNil; PGL pglclrTrans = pvNil; Assert(prcSrc->Dyp() == prcDst->Dyp() && prcSrc->Dxp() == prcDst->Dxp(), "rc's are scaled"); GPT::Flush(); if (!FIn(dts, 1, kdtsMaxTrans)) dts = kdtsSecond; for (cact = 0; cact < 2; cact++) { grfpt = _mpgfdgrfpt[gfd & 0x03]; grfptInv = _mpgfdgrfptInv[gfd & 0x03]; gfd >>= 2; if (cact == 0) { if (kacrClear == acrFill) continue; } else if (pvNil != pglclr && !_FInitPaletteTrans(pglclr, &pglclrOld, &pglclrTrans, 8)) { pglclr = pvNil; // so we don't try to transition } tsStart = TsCurrent(); rcSrc = *prcSrc; rcDst = *prcDst; rcSrc.Transform(grfpt); rcDst.Transform(grfpt); dxpTot = rcDst.Dxp(); for (dxp = 0; dxp < dxpTot;) { rc1 = rcSrc; rc2 = rcDst; rc1.xpLeft = rcSrc.xpLeft + dxp; rc2.xpLeft = rcDst.xpLeft + dxp; dtsT = LwMin(TsCurrent() - tsStart, dts); dxp = LwMulDiv(dxpTot, dtsT, dts); rc1.xpRight = rcSrc.xpLeft + dxp; rc2.xpRight = rcDst.xpLeft + dxp; if (cact == 1 && pglclr != pvNil) _PaletteTrans(pglclrOld, pglclr, dtsT, dts, pglclrTrans); if (!rc2.FEmpty()) { rc1.Transform(grfptInv); rc2.Transform(grfptInv); if (cact == 0) FillRc(&rc2, acrFill); else CopyPixels(pgnvSrc, &rc1, &rc2); GPT::Flush(); } } if (pvNil != pglclr) { // set the palette GPT::SetActiveColors(pglclr, fpalIdentity); pglclr = pvNil; // so we don't transition during the second wipe } } ReleasePpo(&pglclrOld); ReleasePpo(&pglclrTrans); } /*************************************************************************** Slide the source gnv onto this one. The source and destination rectangles must be the same size. ***************************************************************************/ void GNV::Slide(long gfd, ACR acrFill, PGNV pgnvSrc, RC *prcSrc, RC *prcDst, ulong dts, PGL pglclr) { AssertThis(0); AssertPo(&acrFill, 0); AssertPo(pgnvSrc, 0); AssertVarMem(prcSrc); AssertVarMem(prcDst); AssertNilOrPo(pglclr, 0); ulong grfpt, grfptInv; ulong dtsT, tsStart; long cact; long dxp, dxpTot, dxpOld; RC rcSrc, rcDst; RC rc1, rc2; PGNV pgnv; PT dpt; PGL pglclrOld = pvNil; PGL pglclrTrans = pvNil; Assert(prcSrc->Dyp() == prcDst->Dyp() && prcSrc->Dxp() == prcDst->Dxp(), "rc's are scaled"); // allocate the offscreen port and copy the destination into it. if (!_FEnsureTempGnv(&pgnv, prcDst)) { if (pvNil != pglclr) GPT::SetActiveColors(pglclr, fpalIdentity); CopyPixels(pgnvSrc, prcSrc, prcDst); GPT::Flush(); return; } if (!FIn(dts, 1, kdtsMaxTrans)) dts = kdtsSecond; for (cact = 0; cact < 2; cact++) { grfpt = _mpgfdgrfpt[gfd & 0x03]; grfptInv = _mpgfdgrfptInv[gfd & 0x03]; gfd >>= 2; if (cact == 0) { if (kacrClear == acrFill) continue; } else if (pvNil != pglclr && !_FInitPaletteTrans(pglclr, &pglclrOld, &pglclrTrans)) { pglclr = pvNil; // so we don't try to transition } tsStart = TsCurrent(); rcSrc = *prcSrc; rcDst = *prcDst; rcSrc.Transform(grfpt); rcDst.Transform(grfpt); dxpTot = rcDst.Dxp(); for (dxp = 0; dxp < dxpTot;) { dxpOld = dxp; dtsT = LwMin(TsCurrent() - tsStart, dts); dxp = LwMulDiv(dxpTot, dtsT, dts); if (dxp != dxpOld) { // scroll the stuff that's already there dpt.xp = dxp - dxpOld; dpt.yp = 0; dpt.Transform(grfptInv); pgnv->ScrollRc(prcDst, dpt.xp, dpt.yp); // copy in the new stuff rc1 = rcSrc; rc2 = rcDst; rc1.xpLeft = rc1.xpRight - dxp; rc1.xpRight -= dxpOld; rc2.xpRight = rc2.xpLeft + dxp - dxpOld; rc1.Transform(grfptInv); rc2.Transform(grfptInv); if (cact == 0) pgnv->FillRc(&rc2, acrFill); else pgnv->CopyPixels(pgnvSrc, &rc1, &rc2); } if (pvNil != pglclr && 1 == cact) _PaletteTrans(pglclrOld, pglclr, dtsT, dts, pglclrTrans); if (dxp != dxpOld) { // copy the result to the destination CopyPixels(pgnv, prcDst, prcDst); GPT::Flush(); } } if (pvNil != pglclr) { // set the palette GPT::SetActiveColors(pglclr, fpalIdentity); // if we're not in 8 bit and cact is 1, copy the pixels so we // make sure we've drawn the picture after the last palette change if (1 == cact && _pgpt->CbitPixel() != 8) { CopyPixels(pgnv, prcDst, prcDst); GPT::Flush(); } pglclr = pvNil; // so we don't transition during the second wipe } } ReleasePpo(&pgnv); ReleasePpo(&pglclrOld); ReleasePpo(&pglclrTrans); } // klwPrime must be a prime and klwRoot must be a primitive root for klwPrime. // the code under #ifdef SPECIAL_PRIME below assumes that klwPrime is // (2^16 + 1) and klwRoot is (2 ^15 - 1). If you change klwPrime and/or // klwRoot, make sure that SPECIAL_PRIME is not defined. #define SPECIAL_PRIME #define klwPrime 65537 // a prime #define klwRoot 32767 // a primitive root for the prime /*************************************************************************** Returns the next quasi-random number for Dissolve. ***************************************************************************/ inline long _LwNextDissolve(long lw) { AssertIn(lw, 1, klwPrime); #ifdef SPECIAL_PRIME Assert(klwPrime == 0x00010001, 0); Assert(klwRoot == 0x00007FFF, 0); // multiply by 2^15 - 1 lw = (lw << 15) - lw; // mod by 2^16 + 1 lw = (lw & 0x0000FFFFL) - (long)((ulong)lw >> 16); if (lw < 0) lw += klwPrime; #else //! SPECIAL_PRIME LwMulDivMod(lw, klwRoot, klwPrime, &lw); #endif //! SPECIAL_PRIME return lw; } /*************************************************************************** Dissolve the source gnv into this one. If acrFill is not kacrClear, first dissolve into a solid acrFill, then into the source. The source and destination rectangles must be the same size. If pgnvSrc is nil, just dissolve into the solid color. Each portion is done in dts time. ***************************************************************************/ void GNV::Dissolve(long crcWidth, long crcHeight, ACR acrFill, PGNV pgnvSrc, RC *prcSrc, RC *prcDst, ulong dts, PGL pglclr) { AssertThis(0); AssertPo(&acrFill, 0); AssertNilOrPo(pgnvSrc, 0); AssertNilOrVarMem(prcSrc); AssertVarMem(prcDst); AssertNilOrPo(pglclr, 0); AssertIn(crcWidth, 0, kcbMax); AssertIn(crcHeight, 0, kcbMax); ulong tsStart, dtsT; byte bFill; long cbRowSrc, cbRowDst; RND rnd; long lw, cact, irc, crc, crcFill, crcT; RC rc1, rc2; bool fOnScreen; long dibExtra, dibRow, ibExtra; byte *pbRow; byte *prgbDst = pvNil; byte *prgbSrc = pvNil; PGNV pgnv = pvNil; PGL pglclrOld = pvNil; PGL pglclrTrans = pvNil; if (prcDst->FEmpty()) return; if (crcWidth <= 0 || crcHeight <= 0) { // do off screen pixel level dissolve fOnScreen = fFalse; // allocate the offscreen port and copy the destination into it. if (pgnvSrc != pvNil) { PGPT pgptSrc; AssertVarMem(prcSrc); Assert(prcSrc->Dyp() == prcDst->Dyp() && prcSrc->Dxp() == prcDst->Dxp(), "rc's are scaled"); pgptSrc = pgnvSrc->Pgpt(); if (pgptSrc->CbitPixel() != 8 || pvNil == (prgbSrc = pgptSrc->PrgbLockPixels(&rc2))) { Bug("Can't dissolve from this GPT"); goto LFail; } rc1 = *prcSrc; rc1.Map(&pgnvSrc->_rcSrc, &pgnvSrc->_rcDst); if (!rc2.FContains(&rc1)) { Bug("Source rectangle is outside the source bitmap"); goto LFail; } cbRowSrc = pgptSrc->CbRow(); prgbSrc += LwMul(rc1.ypTop - rc2.ypTop, cbRowSrc) + rc1.xpLeft - rc2.xpLeft; } if (!_FEnsureTempGnv(&pgnv, prcDst)) { LFail: if (pvNil != prgbSrc && pvNil != pgnvSrc) pgnvSrc->Pgpt()->Unlock(); if (pvNil != pglclr) GPT::SetActiveColors(pglclr, fpalIdentity); if (pvNil != pgnvSrc) CopyPixels(pgnvSrc, prcSrc, prcDst); else FillRc(prcDst, acrFill); GPT::Flush(); return; } prgbDst = pgnv->Pgpt()->PrgbLockPixels(); cbRowDst = pgnv->Pgpt()->CbRow(); if (acrFill != kacrClear) { // get the byte value to fill with byte bT = prgbDst[0]; rc1.Set(prcDst->xpLeft, prcDst->ypTop, prcDst->xpLeft + 1, prcDst->ypTop + 1); pgnv->FillRc(&rc1, acrFill); GPT::Flush(); bFill = prgbDst[0]; prgbDst[0] = bT; } crcWidth = cbRowDst; crcHeight = prcDst->Dyp(); crcFill = LwMul(crcWidth, crcHeight) + prcDst->Dxp() - cbRowDst; dibExtra = (klwPrime - 1) % crcWidth; dibRow = ((klwPrime - 1) / crcWidth) * cbRowSrc; } else { // on screen dissolve fOnScreen = fTrue; crcWidth = LwMin(prcDst->Dxp(), crcWidth); crcHeight = LwMin(prcDst->Dyp(), crcHeight); crcFill = LwMul(crcWidth, crcHeight); } if (!FIn(dts, 1, kdtsMaxTrans)) dts = kdtsSecond; // the first time through, dissolve to the color; the second time // through dissolve to the source bitmap for (cact = 0; cact < 2; cact++) { if (cact == 0) { if (kacrClear == acrFill) continue; } else { if (pvNil == pgnvSrc) goto LSetPalette; if (pvNil != pglclr && !_FInitPaletteTrans(pglclr, &pglclrOld, &pglclrTrans, fOnScreen ? 8 : 0)) { pglclr = pvNil; // so we don't try to transition } } // We start with lw a random value between 1 and (klwPrime - 1) // (inclusive). Subsequent values of lw are computed as // lw = lw * klwRoot % klwPrime. Because klwRoot is a primitive root // of unity for klwPrime, lw will take on all values from 1 thru // (klwPrime - 1) in seemingly random order. irc = rnd.LwNext(crcFill); lw = (crcFill - irc - 1) % (klwPrime - 1) + 1; if (!fOnScreen && cact != 0) { // pbRow points to the row of prgbSrc that the current source // pixel is in. ibExtra is the offset of the source pixel // into the row (the "xp" coordinate of the source pixel). // dibRow and dibExtra are for finding the source pixel // incrementally. When we subtract (klwPrime - 1) from irc, // we subtract dibRow from pbRow and dibExtra from ibExtra. // If ibExtra goes negative, we add cbRowSrc to pbRow and // crcWidth to ibExtra. ibExtra = irc % crcWidth; pbRow = prgbSrc + (irc / crcWidth) * cbRowSrc; } tsStart = TsCurrent(); for (crc = 0; crc < crcFill;) { dtsT = LwMin(TsCurrent() - tsStart, dts); crcT = LwMulDiv(crcFill, dtsT, dts) - crc; if (crcT <= 0) goto LPaletteTrans; crc += crcT; if (fOnScreen) { for (; crcT > 0; crcT--) { // find the next rectangle to fill for (irc -= klwPrime - 1; irc < 0; irc = crcFill - lw) lw = _LwNextDissolve(lw); rc1.SetToCell(prcDst, crcWidth, crcHeight, irc % crcWidth, irc / crcWidth); if (cact == 0) FillRc(&rc1, acrFill); else { rc2 = rc1; rc2.Map(prcDst, prcSrc); CopyPixels(pgnvSrc, &rc2, &rc1); } } goto LPaletteTrans; } if (cact == 0) { // fill with bFill for (; crcT > 0; crcT--) { // find the next pixel to fill for (irc -= klwPrime - 1; irc < 0; irc = crcFill - lw) lw = _LwNextDissolve(lw); prgbDst[irc] = bFill; } goto LBlastToScreen; } // cact == 1, fill from prgbSrc for (; crcT > 0; crcT--) { // find the next rectangle to fill irc -= klwPrime - 1; if (irc >= 0) { pbRow -= dibRow; ibExtra -= dibExtra; if (ibExtra < 0) { pbRow -= cbRowSrc; ibExtra += crcWidth; } } else { do { lw = _LwNextDissolve(lw); } while (0 > (irc = crcFill - lw)); #ifdef IN_80386 __asm { // ibExtra = irc % crcWidth; // pbRow = prgbSrc + (irc / crcWidth) * cbRowSrc; mov edx,irc movzx eax,dx shr edx,16 div WORD PTR crcWidth // 16 bit divide for speed imul eax,cbRowSrc mov ibExtra,edx add eax,prgbSrc mov pbRow,eax } #else //! IN_80386 ibExtra = irc % crcWidth; pbRow = prgbSrc + (irc / crcWidth) * cbRowSrc; #endif //! IN_80386 } prgbDst[irc] = pbRow[ibExtra]; } LBlastToScreen: CopyPixels(pgnv, prcDst, prcDst); GPT::Flush(); LPaletteTrans: if (cact == 1 && pglclr != pvNil) _PaletteTrans(pglclrOld, pglclr, dtsT, dts, pglclrTrans); } LSetPalette: if (pvNil != pglclr) { // set the palette GPT::SetActiveColors(pglclr, fpalIdentity); // if we're not in 8 bit and cact is 1, copy the pixels so we // make sure we've drawn the picture after the last palette change if (pvNil != pgnv && 1 == cact && _pgpt->CbitPixel() != 8) { CopyPixels(pgnv, prcDst, prcDst); GPT::Flush(); } pglclr = pvNil; // so we don't transition during the second wipe } } if (pvNil != prgbDst) pgnv->Pgpt()->Unlock(); if (pvNil != prgbSrc && pvNil != pgnvSrc) pgnvSrc->Pgpt()->Unlock(); ReleasePpo(&pgnv); ReleasePpo(&pglclrOld); ReleasePpo(&pglclrTrans); } /*************************************************************************** Fade the palette to color acrFade, copy the pixels from pgnvSrc to this gnv, then fade to the new palette or original palette. Each fade is given dts time. Asserts that acrFade is an rgb color. cactMax is the maximum number of palette interpolations to do. It doesn't make sense for this to be bigger than 256. If it's zero, we'll use 256. ***************************************************************************/ void GNV::Fade(long cactMax, ACR acrFade, PGNV pgnvSrc, RC *prcSrc, RC *prcDst, ulong dts, PGL pglclr) { AssertThis(0); AssertIn(cactMax, 0, 257); AssertPo(&acrFade, facrRgb); AssertPo(pgnvSrc, 0); AssertVarMem(prcSrc); AssertVarMem(prcDst); AssertNilOrPo(pglclr, 0); ulong tsStart; long cact, cactOld; CLR clr; PGL pglclrOld = pvNil; PGL pglclrTrans = pvNil; cactMax = (cactMax <= 0) ? 256 : LwMin(cactMax, 256); if (!_FInitPaletteTrans(pglclr, &pglclrOld, &pglclrTrans, 8)) { CopyPixels(pgnvSrc, prcSrc, prcDst); GPT::Flush(); return; } GPT::Flush(); if (!FIn(dts, 1, kdtsMaxTrans)) dts = kdtsSecond; acrFade.GetClr(&clr); tsStart = TsCurrent(); for (cact = 0; cact < cactMax;) { cactOld = cact; cact = LwMulDiv(cactMax, LwMin(TsCurrent() - tsStart, dts), dts); if (cactOld < cact) _PaletteTrans(pglclrOld, pvNil, cact, cactMax, pglclrTrans, &clr); } CopyPixels(pgnvSrc, prcSrc, prcDst); GPT::Flush(); if (pvNil == pglclr) pglclr = pglclrOld; tsStart = TsCurrent(); for (cact = 0; cact < cactMax;) { cactOld = cact; cact = LwMulDiv(cactMax, LwMin(TsCurrent() - tsStart, dts), dts); if (cactOld < cact) _PaletteTrans(pvNil, pglclr, cact, cactMax, pglclrTrans, &clr); } GPT::SetActiveColors(pglclr, fpalIdentity); ReleasePpo(&pglclrOld); ReleasePpo(&pglclrTrans); } /*************************************************************************** Open and/or close a rectangular iris onto the gnvSrc with an intermediate color of acrFill (if not clear). xp, yp are the focus point of the iris (in destination coordinates). ***************************************************************************/ void GNV::Iris(long gfd, long xp, long yp, ACR acrFill, PGNV pgnvSrc, RC *prcSrc, RC *prcDst, ulong dts, PGL pglclr) { AssertThis(0); AssertPo(&acrFill, 0); AssertPo(pgnvSrc, 0); AssertVarMem(prcSrc); AssertVarMem(prcDst); AssertNilOrPo(pglclr, 0); ulong tsStart, dtsT; RC rc, rcOld, rcDst; PT pt, ptBase; long cact; bool fOpen; PREGN pregn, pregnClip; PGL pglclrOld = pvNil; PGL pglclrTrans = pvNil; GPT::Flush(); if (pvNil == (pregn = REGN::PregnNew(prcDst))) goto LFail; if (!FIn(dts, 1, kdtsMaxTrans)) dts = kdtsSecond; _pgpt->GetPtBase(&ptBase); pt.xp = LwBound(xp, prcDst->xpLeft, prcDst->xpRight + 1); pt.yp = LwBound(yp, prcDst->ypTop, prcDst->ypBottom + 1); pt.Map(&_rcSrc, &_rcDst); pt += ptBase; rcDst = *prcDst; rcDst.Map(&_rcSrc, &_rcDst); rcDst.Offset(ptBase.xp, ptBase.yp); for (cact = 0; cact < 2; cact++) { if (cact == 0) { if (kacrClear == acrFill) continue; } else if (pvNil != pglclr && !_FInitPaletteTrans(pglclr, &pglclrOld, &pglclrTrans, 8)) { pglclr = pvNil; // so we don't try to transition } fOpen = !(gfd & (1 << cact)); if (fOpen) rc.Set(pt.xp, pt.yp, pt.xp, pt.yp); else rc = rcDst; pregnClip = pvNil; tsStart = TsCurrent(); for (dtsT = 0; dtsT < dts;) { rcOld = rc; dtsT = LwMin(TsCurrent() - tsStart, dts); if (!fOpen) dtsT = dts - dtsT; rc.xpLeft = pt.xp + LwMulDiv(rcDst.xpLeft - pt.xp, dtsT, dts); rc.xpRight = pt.xp + LwMulDiv(rcDst.xpRight - pt.xp, dtsT, dts); rc.ypTop = pt.yp + LwMulDiv(rcDst.ypTop - pt.yp, dtsT, dts); rc.ypBottom = pt.yp + LwMulDiv(rcDst.ypBottom - pt.yp, dtsT, dts); if (!fOpen) dtsT = dts - dtsT; if (cact == 1 && pglclr != pvNil) _PaletteTrans(pglclrOld, pglclr, dtsT, dts, pglclrTrans); if (rc == rcOld) continue; _pgpt->ClipToRegn(&pregnClip); pregn->SetRc(fOpen ? &rc : &rcOld); if (!pregn->FDiffRc(fOpen ? &rcOld : &rc) || pvNil != pregnClip && !pregn->FIntersect(pregnClip)) { _pgpt->ClipToRegn(&pregnClip); ReleasePpo(&pregn); LFail: if (pvNil != pglclr) GPT::SetActiveColors(pglclr, fpalIdentity); CopyPixels(pgnvSrc, prcSrc, prcDst); return; } _pgpt->ClipToRegn(&pregnClip); _pgpt->ClipToRegn(&pregn); if (cact == 0) FillRc(prcDst, acrFill); else CopyPixels(pgnvSrc, prcSrc, prcDst); GPT::Flush(); _pgpt->ClipToRegn(&pregn); } if (pvNil != pglclr) { // set the palette GPT::SetActiveColors(pglclr, fpalIdentity); pglclr = pvNil; // so we don't transition during the second iris } } ReleasePpo(&pregn); ReleasePpo(&pglclrOld); ReleasePpo(&pglclrTrans); } /*************************************************************************** Draw the picture in the given rectangle. ***************************************************************************/ void GNV::DrawPic(PPIC ppic, RC *prc) { AssertThis(0); AssertPo(ppic, 0); AssertVarMem(prc); RCS rcs; if (!_FMapRcRcs(prc, &rcs)) return; _pgpt->DrawPic(ppic, &rcs, &_gdd); } /*************************************************************************** Draw the mbmp with reference point at the given point. ***************************************************************************/ void GNV::DrawMbmp(PMBMP pmbmp, long xp, long yp) { AssertThis(0); AssertPo(pmbmp, 0); RC rc; RCS rcs; pmbmp->GetRc(&rc); rc.Offset(xp - rc.xpLeft, yp - rc.ypTop); if (!_FMapRcRcs(&rc, &rcs)) return; _pgpt->DrawMbmp(pmbmp, &rcs, &_gdd); } /*************************************************************************** Draw the mbmp in the given rectangle. ***************************************************************************/ void GNV::DrawMbmp(PMBMP pmbmp, RC *prc) { AssertThis(0); AssertPo(pmbmp, 0); AssertVarMem(prc); RCS rcs; if (!_FMapRcRcs(prc, &rcs)) return; _pgpt->DrawMbmp(pmbmp, &rcs, &_gdd); } /*************************************************************************** Map a rectangle to a system rectangle. Return true iff the result is non-empty. ***************************************************************************/ bool GNV::_FMapRcRcs(RC *prc, RCS *prcs) { AssertThis(0); AssertVarMem(prc); AssertVarMem(prcs); RC rc = *prc; rc.Map(&_rcSrc, &_rcDst); *prcs = RCS(rc); return prcs->left < prcs->right && prcs->top < prcs->bottom; } /*************************************************************************** Map an (xp, yp) pair to a system point. ***************************************************************************/ void GNV::_MapPtPts(long xp, long yp, PTS *ppts) { AssertThis(0); AssertVarMem(ppts); PT pt(xp, yp); pt.Map(&_rcSrc, &_rcDst); *ppts = PTS(pt); } #ifdef MAC /*************************************************************************** Set the port associated with the GNV as the current port and set the clipping as in the GNV and set the pen and fore/back color to defaults. ***************************************************************************/ void GNV::Set(void) { AssertThis(0); _pgpt->Set(_gdd.prcsClip); ForeColor(blackColor); BackColor(whiteColor); PenNormal(); } /*************************************************************************** Restore the port. Balances a call to GNV::Set. ***************************************************************************/ void GNV::Restore(void) { _pgpt->Restore(); } #endif // MAC /*************************************************************************** Clip to the region specified by *ppregn. *ppregn is set to the previous clip region (may be pvNil). The GPT takes over ownership of the region and relinquishes ownership of the old region. ***************************************************************************/ void GPT::ClipToRegn(PREGN *ppregn) { if (_ptBase.xp != 0 || _ptBase.yp != 0) { if (pvNil != *ppregn) (*ppregn)->Offset(-_ptBase.xp, -_ptBase.yp); if (pvNil != _pregnClip) _pregnClip->Offset(_ptBase.xp, _ptBase.yp); } SwapVars(&_pregnClip, ppregn); _fNewClip = fTrue; } /*************************************************************************** Set the base PT for the GPT. This affects the mapping of any attached GNVs. ***************************************************************************/ void GPT::SetPtBase(PT *ppt) { AssertThis(0); AssertVarMem(ppt); _ptBase = *ppt; } /*************************************************************************** Get the base PT for the GPT. ***************************************************************************/ void GPT::GetPtBase(PT *ppt) { AssertThis(0); AssertVarMem(ppt); *ppt = _ptBase; } #ifdef DEBUG /*************************************************************************** Mark memory for the GPT. ***************************************************************************/ void GPT::MarkMem(void) { AssertValid(0); GPT_PAR::MarkMem(); MarkMemObj(_pregnClip); } /****************************************************************************** Assert the validity of a polygon descriptor. ******************************************************************************/ void OLY::AssertValid(ulong grf) { AssertThisMem(); AssertPvCb(rgpts, LwMul(Cpts(), size(PTS))); } /****************************************************************************** Assert the validity of the font description. ******************************************************************************/ void DSF::AssertValid(ulong grf) { AssertThisMem(); AssertIn(dyp, 1, kswMax); AssertVar(vntl.FValidOnn(onn), "Invalid onn", &onn); AssertIn(tah, 0, tahLim); AssertIn(tav, 0, tavLim); } #endif // DEBUG /****************************************************************************** Initialize the graphics module. ******************************************************************************/ bool FInitGfx(void) { return vntl.FInit(); } /*************************************************************************** Construct a new font list. ***************************************************************************/ NTL::NTL(void) { _pgst = pvNil; } /*************************************************************************** Destroy a font list. ***************************************************************************/ NTL::~NTL(void) { ReleasePpo(&_pgst); } #ifdef DEBUG /*************************************************************************** Assert the validity of the font list. ***************************************************************************/ void NTL::AssertValid(ulong grf) { NTL_PAR::AssertValid(0); AssertPo(_pgst, 0); } /*************************************************************************** Mark memory for the font table. ***************************************************************************/ void NTL::MarkMem(void) { AssertValid(0); NTL_PAR::MarkMem(); MarkMemObj(_pgst); } /*************************************************************************** Return whether the font number is valid. ***************************************************************************/ bool NTL::FValidOnn(long onn) { return pvNil != _pgst && onn >= 0 && onn < _pgst->IstnMac(); } #endif // DEBUG /*************************************************************************** Find the name of the given font. ***************************************************************************/ void NTL::GetStn(long onn, PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); _pgst->GetStn(onn, pstn); } /*************************************************************************** Get the font number for the given font name. ***************************************************************************/ bool NTL::FGetOnn(PSTN pstn, long *ponn) { AssertThis(0); AssertPo(pstn, 0); return _pgst->FFindStn(pstn, ponn, fgstUserSorted); } /*************************************************************************** Map a font name to an existing font. Use platform information if possible. REVIEW shonk: implement font mapping for real. ***************************************************************************/ long NTL::OnnMapStn(PSTN pstn, short osk) { AssertThis(0); AssertPo(pstn, 0); long onn; if (!FGetOnn(pstn, &onn)) onn = _onnSystem; return onn; } /*************************************************************************** Return the font number mac. ***************************************************************************/ long NTL::OnnMac(void) { AssertThis(0); return _pgst->IstnMac(); } /*************************************************************************** Create a new polygon by tracing the outline of this one with a convex polygon. ***************************************************************************/ POGN OGN::PognTraceOgn(POGN pogn, ulong grfogn) { AssertThis(0); AssertPo(pogn, 0); POGN pognNew = PognTraceRgpt(pogn->PrgptLock(), pogn->IvMac(), grfogn); pogn->Unlock(); return pognNew; } /*************************************************************************** Create a new polygon by tracing the outline of this one with a convex polygon. ***************************************************************************/ POGN OGN::PognTraceRgpt(PT *prgpt, long cpt, ulong grfogn) { AssertThis(0); AssertIn(cpt, 2, kcbMax); AssertPvCb(prgpt, LwMul(cpt, size(PT))); PT *prgptThis; AEI aei; long iptLast = IvMac() - 1; if (2 > cpt || iptLast < 0) return pvNil; aei.prgpt = prgpt; aei.cpt = cpt; if (pvNil == (aei.pogn = PognNew(IvMac() * 2 + cpt))) return pvNil; aei.pogn->SetMinGrow(cpt); prgptThis = PrgptLock(); if (iptLast == 0 || prgptThis[0] == prgptThis[1]) { // if all the points of the polygon are the same, doing this ensures // that we will encircle the pen aei.ptCur = prgpt[0] + prgptThis[0]; if (!aei.pogn->FPush(&aei.ptCur)) goto LError; aei.iptPenCur = 1; } else { aei.iptPenCur = IptFindLeftmost(prgpt, cpt, prgptThis[0].xp - prgptThis[1].xp, prgptThis[0].yp - prgptThis[1].yp); } aei.ptCur = prgpt[aei.iptPenCur] + prgptThis[0]; if (!aei.pogn->FPush(&aei.ptCur)) goto LError; // Walk to end, adding vertices. for (aei.dipt = 1, aei.ipt = 0; aei.ipt < iptLast; aei.ipt++) { if (!_FAddEdge(&aei)) goto LError; } if (fognAutoClose & grfogn) { if (!_FAddEdge(&aei)) goto LError; aei.ipt = 0; aei.dipt = iptLast; if (!_FAddEdge(&aei)) goto LError; } // Walk back to start. for (aei.dipt = aei.ipt = iptLast; aei.ipt > 0; aei.ipt--) { if (!_FAddEdge(&aei)) { LError: ReleasePpo(&aei.pogn); break; } } Unlock(); if (pvNil != aei.pogn) aei.pogn->FEnsureSpace(0, fgrpShrink); return aei.pogn; } /*************************************************************************** Add the vertices encountered while walking an edge of the input polygon. ***************************************************************************/ bool OGN::_FAddEdge(AEI *paei) { AssertVarMem(paei); AssertIn(paei->cpt, 1, kcbMax); AssertPvCb(paei->prgpt, LwMul(paei->cpt, size(PT))); AssertPo(paei->pogn, 0); AssertIn(paei->dipt, LwMin(IvMac() - 1, 1), LwMax(IvMac(), 2)); AssertIn(paei->ipt, 0, IvMac()); AssertIn(paei->iptPenCur, 0, paei->cpt); PT *prgptThis = (PT *)QvGet(0); // Already locked in PognTraceRgpt(). long iptEnd = (paei->ipt + paei->dipt) % IvMac(); long iptPenNew = IptFindLeftmost(paei->prgpt, paei->cpt, prgptThis[iptEnd].xp - prgptThis[paei->ipt].xp, prgptThis[iptEnd].yp - prgptThis[paei->ipt].yp); // Add vertices from current to leftmost. if (paei->iptPenCur != iptPenNew) { PT pt; long ipt = paei->iptPenCur; PT dpt = paei->ptCur - paei->prgpt[ipt]; do { ipt = (ipt + 1) % paei->cpt; pt = paei->prgpt[ipt] + dpt; if (!paei->pogn->FPush(&pt)) return fFalse; } while (ipt != iptPenNew); } // Add vertex at endpoint. paei->iptPenCur = iptPenNew; paei->ptCur = prgptThis[iptEnd] + paei->prgpt[iptPenNew]; return paei->pogn->FPush(&paei->ptCur); } /*************************************************************************** Find the leftmost vertex of the rgpt looking down the vector. dxp, dyp : Direction of vector to look down. ***************************************************************************/ long IptFindLeftmost(PT *prgpt, long cpt, long dxp, long dyp) { AssertPvCb(prgpt, LwMul(cpt, size(PT))); AssertIn(cpt, 2, kcbMax); long ipt, iptLeftmost; long dzpMac; // Maximum cross product (z vector) found. long dzp; // reduces the chance of overflow if (1 < (dzp = LwGcd(dxp, dyp))) { dxp /= dzp; dyp /= dzp; } for (dzpMac = klwMin, ipt = 0; ipt < cpt; ipt++) { dzp = LwMul(dyp, prgpt[ipt].xp) - LwMul(dxp, prgpt[ipt].yp); if (dzp > dzpMac) { dzpMac = dzp; iptLeftmost = ipt; } } return iptLeftmost; } /*************************************************************************** -- Allocate a new OGN and ensure that it has space for cptInit elements. ***************************************************************************/ POGN OGN::PognNew(long cptInit) { AssertIn(cptInit, 0, kcbMax); POGN pogn; if (pvNil == (pogn = NewObj OGN())) return pvNil; if (cptInit > 0 && !pogn->FEnsureSpace(cptInit, fgrpNil)) { ReleasePpo(&pogn); return pvNil; } AssertPo(pogn, 0); return pogn; } /*************************************************************************** Constructor for OGN. ***************************************************************************/ OGN::OGN(void) : GL(size(PT)) { AssertThis(0); } /*************************************************************************** This does a 2x stretch blt, clipped to prcClip and pregnClip. The clipping is expressed in destination coordinates. ***************************************************************************/ void DoubleStretch(byte *prgbSrc, long cbRowSrc, long dypSrc, RC *prcSrc, byte *prgbDst, long cbRowDst, long dypDst, long xpDst, long ypDst, RC *prcClip, PREGN pregnClip) { AssertPvCb(prgbSrc, LwMul(cbRowSrc, dypSrc)); AssertPvCb(prgbDst, LwMul(cbRowDst, dypDst)); AssertVarMem(prcSrc); Assert(prcSrc->xpLeft >= 0 && prcSrc->ypTop >= 0 && prcSrc->xpRight <= cbRowSrc && prcSrc->ypBottom <= dypSrc, "Source rectangle not in source bitmap!"); AssertNilOrVarMem(prcClip); AssertNilOrPo(pregnClip, 0); long xpOn, xpOff, dypAdvance, dxpBase, yp; bool fSecondRow; REGSC regsc; RC rcT(xpDst, ypDst, xpDst + 2 * prcSrc->Dxp(), ypDst + 2 * prcSrc->Dyp()); RC rcClip(0, 0, cbRowDst, dypDst); if (!rcClip.FIntersect(&rcT)) return; if (pvNil != prcClip && !rcClip.FIntersect(prcClip)) return; // Set up the region scanner if (pvNil != pregnClip) regsc.Init(pregnClip, &rcClip); else regsc.InitRc(&rcClip, &rcClip); dxpBase = rcClip.xpLeft - xpDst; // move to rcClip.ypTop yp = rcClip.ypTop; prgbSrc += prcSrc->xpLeft + LwMul(prcSrc->ypTop + ((yp - ypDst) >> 1), cbRowSrc); prgbDst += xpDst + LwMul(yp, cbRowDst); fSecondRow = (yp - ypDst) & 1; for (;;) { if (klwMax == (xpOn = regsc.XpCur())) { // empty strip of the region dypAdvance = regsc.DypCur(); goto LAdvance; } xpOn += dxpBase; if (fSecondRow || (regsc.DypCur() == 1)) goto LOneRow; // copy two rows to the destination for (;;) { xpOff = regsc.XpFetch() + dxpBase; AssertIn(xpOff - 1, xpOn, rcClip.Dxp() + dxpBase); #ifdef IN_80386 // copy two rows to the destination in native #define pbDstReg edi #define pbSrcReg esi #define pbDst2Reg ebx #define lwTReg edx __asm { // lwTReg = xpOn; // pbDstReg = prgbDst + xpOn; // pbSrcReg = prgbSrc + (xpOn >> 1); // pbDst2Reg = pbDstReg + cbRowDst; mov lwTReg,xpOn mov pbSrcReg,lwTReg mov pbDstReg,lwTReg sar pbSrcReg,1 add pbDstReg,prgbDst add pbSrcReg,prgbSrc mov pbDst2Reg,pbDstReg add pbDst2Reg,cbRowDst // if (!(lwTReg & 1)) goto LGetCount2; test lwTReg,1 mov ecx,xpOff jz LGetCount2 // move the single leading byte // lwTReg++; // al = *pbSrcReg++; // *pbDstReg++ = al; // *pbDstReg2++ = al; inc lwTReg mov al,[pbSrcReg] inc pbSrcReg mov [pbDstReg],al inc pbDstReg mov [pbDst2Reg],al inc pbDst2Reg LGetCount2: // ecx = xpOff - lwTReg; // ecx >>= 1; // if (ecx <= 0) goto LLastByte2; sub ecx,lwTReg sar ecx,1 jle LLastByte2 LLoop2: // al = *pbSrcReg++; // ah = al; // *(short *)pbDstReg = ax; // *(short *)pbDst2Reg = ax; // pbDstReg += 2; // pbDst2Reg += 2; mov al,[pbSrcReg] inc pbSrcReg mov ah,al mov [pbDstReg],ax add pbDstReg,2 mov [pbDst2Reg],ax add pbDst2Reg,2 // if (--ecx != 0) goto LLoop2; loop LLoop2 LLastByte2: // if (!(xpOff & 1)) goto LDone2; test xpOff,1 jz LDone2 // move the single trailing byte // al = *pbSrcReg; // *pbDstReg = al; // *pbDstReg2 = al; mov al,[pbSrcReg] mov [pbDstReg],al mov [pbDst2Reg],al LDone2: } #undef pbDstReg #undef pbSrcReg #undef pbDst2Reg #undef lwTReg #else //! IN_80386 // copy two rows to the destination in C code byte *pbSrc = prgbSrc + (xpOn >> 1); byte *pbDst = prgbDst + xpOn; byte *pbDst2 = pbDst + cbRowDst; byte bT; long cactLoop; if (xpOn & 1) { // do leading single byte bT = *pbSrc++; *pbDst++ = bT; *pbDst2++ = bT; xpOn++; } for (cactLoop = (xpOff - xpOn) >> 1; cactLoop > 0; cactLoop--) { bT = *pbSrc++; pbDst[0] = bT; pbDst[1] = bT; pbDst += 2; pbDst2[0] = bT; pbDst2[1] = bT; pbDst2 += 2; } if (xpOff & 1) { // do the trailing byte bT = *pbSrc; *pbDst = bT; *pbDst2 = bT; } #endif //! IN_80386 if (klwMax == (xpOn = regsc.XpFetch())) break; xpOn += dxpBase; AssertIn(xpOn - 1, xpOff, rcClip.Dxp() - 1 + dxpBase); } dypAdvance = 2; goto LAdvance; LOneRow: // copy just one row to the destination for (;;) { xpOff = regsc.XpFetch() + dxpBase; AssertIn(xpOff - 1, xpOn, rcClip.Dxp() + dxpBase); #ifdef IN_80386 // copy just one row to the destination in native #define pbDstReg edi #define pbSrcReg esi #define lwTReg edx __asm { // lwTReg = xpOn; // pbDstReg = prgbDst + xpOn; // pbSrcReg = prgbSrc + (xpOn >> 1); mov lwTReg,xpOn mov pbSrcReg,lwTReg mov pbDstReg,lwTReg sar pbSrcReg,1 add pbDstReg,prgbDst add pbSrcReg,prgbSrc // if (!(lwTReg & 1)) goto LGetCount1; test lwTReg,1 mov ecx,xpOff jz LGetCount1 // move the single leading byte // lwTReg++; // al = *pbSrcReg++; // *pbDstReg++ = al; inc lwTReg mov al,[pbSrcReg] inc pbSrcReg inc pbDstReg mov [pbDstReg-1],al LGetCount1: // ecx = xpOff - lwTReg; // ecx >>= 1; // if (ecx <= 0) goto LLastByte1; sub ecx,lwTReg sar ecx,1 jle LLastByte1 LLoop1: // al = *pbSrcReg++; // ah = al; // *(short *)pbDstReg = ax; // pbDstReg += 2; mov al,[pbSrcReg] inc pbSrcReg add pbDstReg,2 mov ah,al mov [pbDstReg-2],ax // if (--ecx != 0) goto LLoop1; loop LLoop1 LLastByte1: // if (!(xpOff & 1)) goto LDone1; test xpOff,1 jz LDone1 // move the single trailing byte // al = *pbSrcReg; // *pbDstReg = al; mov al,[pbSrcReg] mov [pbDstReg],al LDone1: } #undef pbDstReg #undef pbSrcReg #undef lwTReg #else //! IN_80386 // copy just one row to the destination in C code byte bT; byte *pbSrc = prgbSrc + (xpOn >> 1); byte *pbDst = prgbDst + xpOn; long cactLoop; if (xpOn & 1) { // do leading single byte *pbDst++ = *pbSrc++; xpOn++; } for (cactLoop = (xpOff - xpOn) >> 1; cactLoop > 0; cactLoop--) { bT = *pbSrc++; pbDst[0] = bT; pbDst[1] = bT; pbDst += 2; } if (xpOff & 1) { // do the trailing byte *pbDst = *pbSrc; } #endif //! IN_80386 if (klwMax == (xpOn = regsc.XpFetch())) break; xpOn += dxpBase; AssertIn(xpOn - 1, xpOff, rcClip.Dxp() - 1 + dxpBase); } dypAdvance = 1; LAdvance: if ((yp += dypAdvance) >= rcClip.ypBottom) break; regsc.ScanNext(dypAdvance); prgbDst += dypAdvance * cbRowDst; prgbSrc += (dypAdvance >> 1) * cbRowSrc; if (dypAdvance & 1) { if (fSecondRow) prgbSrc += cbRowSrc; fSecondRow = !fSecondRow; } } } /*************************************************************************** This does a 2x vertical and 1x horizontal stretch blt, clipped to prcClip and pregnClip. The clipping is expressed in destination coordinates. ***************************************************************************/ void DoubleVertStretch(byte *prgbSrc, long cbRowSrc, long dypSrc, RC *prcSrc, byte *prgbDst, long cbRowDst, long dypDst, long xpDst, long ypDst, RC *prcClip, PREGN pregnClip) { AssertPvCb(prgbSrc, LwMul(cbRowSrc, dypSrc)); AssertPvCb(prgbDst, LwMul(cbRowDst, dypDst)); AssertVarMem(prcSrc); Assert(prcSrc->xpLeft >= 0 && prcSrc->ypTop >= 0 && prcSrc->xpRight <= cbRowSrc && prcSrc->ypBottom <= dypSrc, "Source rectangle not in source bitmap!"); AssertNilOrVarMem(prcClip); AssertNilOrPo(pregnClip, 0); long xpOn, xpOff, dypAdvance, dxpBase, yp; bool fSecondRow; REGSC regsc; RC rcT(xpDst, ypDst, xpDst + prcSrc->Dxp(), ypDst + 2 * prcSrc->Dyp()); RC rcClip(0, 0, cbRowDst, dypDst); if (!rcClip.FIntersect(&rcT)) return; if (pvNil != prcClip && !rcClip.FIntersect(prcClip)) return; // Set up the region scanner if (pvNil != pregnClip) regsc.Init(pregnClip, &rcClip); else regsc.InitRc(&rcClip, &rcClip); dxpBase = rcClip.xpLeft - xpDst; // move to rcClip.ypTop yp = rcClip.ypTop; prgbSrc += prcSrc->xpLeft + LwMul(prcSrc->ypTop + ((yp - ypDst) >> 1), cbRowSrc); prgbDst += xpDst + LwMul(yp, cbRowDst); fSecondRow = (yp - ypDst) & 1; for (;;) { if (klwMax == (xpOn = regsc.XpCur())) { // empty strip of the region dypAdvance = regsc.DypCur(); goto LAdvance; } xpOn += dxpBase; if (fSecondRow || (regsc.DypCur() == 1)) goto LOneRow; // copy two rows to the destination for (;;) { xpOff = regsc.XpFetch() + dxpBase; AssertIn(xpOff - 1, xpOn, rcClip.Dxp() + dxpBase); #ifdef IN_80386 // copy two rows to the destination in native __asm { // edi = prgbDst + xpOn; // esi = eax = prgbSrc + xpOn; // ebx = pbDstReg + cbRowDst; // ecx = xpOff - xpOn mov edx,xpOn mov ecx,xpOff mov edi,edx mov esi,edx sub ecx,edx add edi,prgbDst add esi,prgbSrc mov ebx,edi mov eax,esi add ebx,cbRowDst // copy the first row mov edx,ecx shr ecx,2 rep movsd mov ecx,edx and ecx,3 rep movsb // prepare to copy the second row mov esi,eax mov edi,ebx mov ecx,edx // copy the second row shr ecx,2 and edx,3 rep movsd mov ecx,edx rep movsb } #else //! IN_80386 // copy two rows to the destination in C code CopyPb(prgbSrc + xpOn, prgbDst + xpOn, xpOff - xpOn); CopyPb(prgbSrc + xpOn + cbRowDst, prgbDst + xpOn, xpOff - xpOn); #endif //! IN_80386 if (klwMax == (xpOn = regsc.XpFetch())) break; xpOn += dxpBase; AssertIn(xpOn - 1, xpOff, rcClip.Dxp() - 1 + dxpBase); } dypAdvance = 2; goto LAdvance; LOneRow: // copy just one row to the destination for (;;) { xpOff = regsc.XpFetch() + dxpBase; AssertIn(xpOff - 1, xpOn, rcClip.Dxp() + dxpBase); #ifdef IN_80386 // copy one row to the destination in native __asm { // edi = prgbDst + xpOn; // esi = prgbSrc + xpOn; // ecx = xpOff - xpOn mov edx,xpOn mov ecx,xpOff mov edi,edx mov esi,edx sub ecx,edx add edi,prgbDst add esi,prgbSrc // copy the row mov edx,ecx shr ecx,2 and edx,3 rep movsd mov ecx,edx rep movsb } #else //! IN_80386 // copy one row to the destination in C code CopyPb(prgbSrc + xpOn, prgbDst + xpOn, xpOff - xpOn); #endif //! IN_80386 if (klwMax == (xpOn = regsc.XpFetch())) break; xpOn += dxpBase; AssertIn(xpOn - 1, xpOff, rcClip.Dxp() - 1 + dxpBase); } dypAdvance = 1; LAdvance: if ((yp += dypAdvance) >= rcClip.ypBottom) break; regsc.ScanNext(dypAdvance); prgbDst += dypAdvance * cbRowDst; prgbSrc += (dypAdvance >> 1) * cbRowSrc; if (dypAdvance & 1) { if (fSecondRow) prgbSrc += cbRowSrc; fSecondRow = !fSecondRow; } } } ================================================ FILE: kauai/src/gfx.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation GFX classes: graphics port (GPT), graphics environment (GNV) ***************************************************************************/ #ifndef GFX_H #define GFX_H /**************************************** Text and fonts. ****************************************/ // DeScription of a Font. struct DSF { long onn; // Font number. ulong grfont; // Font style. long dyp; // Font height in points. long tah; // Horizontal Text Alignment long tav; // Vertical Text Alignment ASSERT }; // fONT Styles - note that these match the Mac values enum { fontNil = 0, fontBold = 1, fontItalic = 2, fontUnderline = 4, fontBoxed = 8, }; // Horizontal Text Alignment. enum { tahLeft, tahCenter, tahRight, tahLim }; // Vertical Text Alignment enum { tavTop, tavCenter, tavBaseline, tavBottom, tavLim }; /**************************************** Font List ****************************************/ const long onnNil = -1; #ifdef WIN int CALLBACK _FEnumFont(LOGFONT *plgf, TEXTMETRIC *ptxm, ulong luType, LPARAM luParam); #endif // WIN #define NTL_PAR BASE #define kclsNTL 'NTL' class NTL : public NTL_PAR { RTCLASS_DEC ASSERT MARKMEM NOCOPY(NTL) private: #ifdef WIN friend int CALLBACK _FEnumFont(LOGFONT *plgf, TEXTMETRIC *ptxm, ulong luType, LPARAM luParam); #endif // WIN PGST _pgst; long _onnSystem; public: NTL(void); ~NTL(void); #ifdef WIN HFONT HfntCreate(DSF *pdsf); #endif // WIN #ifdef MAC short FtcFromOnn(long onn); #endif // MAC bool FInit(void); long OnnSystem(void) { return _onnSystem; } void GetStn(long onn, PSTN pstn); bool FGetOnn(PSTN pstn, long *ponn); long OnnMapStn(PSTN pstn, short osk = koskCur); long OnnMac(void); bool FFixedPitch(long onn); #ifdef DEBUG bool FValidOnn(long onn); #endif // DEBUG }; extern NTL vntl; /**************************************** Color and pattern ****************************************/ #ifdef WIN typedef COLORREF SCR; #elif defined(MAC) typedef RGBColor SCR; #endif //! MAC // NOTE: this matches the Windows RGBQUAD structure struct CLR { byte bBlue; byte bGreen; byte bRed; byte bZero; }; #ifdef DEBUG enum { facrNil, facrRgb = 1, facrIndex = 2, }; #endif // DEBUG enum { kbNilAcr = 0, kbRgbAcr = 1, kbIndexAcr = 0xFE, kbSpecialAcr = 0xFF }; const ulong kluAcrInvert = 0xFF000000L; const ulong kluAcrClear = 0xFFFFFFFFL; // Abstract ColoR class ACR { friend class GPT; ASSERT private: ulong _lu; #ifdef WIN SCR _Scr(void); #endif // WIN #ifdef MAC void _SetFore(void); void _SetBack(void); #endif // MAC public: ACR(void) { _lu = 0; } ACR(CLR clr) { _lu = LwFromBytes(kbRgbAcr, clr.bRed, clr.bGreen, clr.bBlue); } void Set(CLR clr) { _lu = LwFromBytes(kbRgbAcr, clr.bRed, clr.bGreen, clr.bBlue); } ACR(byte bRed, byte bGreen, byte bBlue) { _lu = LwFromBytes(kbRgbAcr, bRed, bGreen, bBlue); } void Set(byte bRed, byte bGreen, byte bBlue) { _lu = LwFromBytes(kbRgbAcr, bRed, bGreen, bBlue); } ACR(byte iscr) { _lu = LwFromBytes(kbIndexAcr, 0, 0, iscr); } void SetToIndex(byte iscr) { _lu = LwFromBytes(kbIndexAcr, 0, 0, iscr); } ACR(bool fClear, bool fIgnored) { _lu = fClear ? kluAcrClear : kluAcrInvert; } void SetToClear(void) { _lu = kluAcrClear; } void SetToInvert(void) { _lu = kluAcrInvert; } void SetFromLw(long lw); long LwGet(void) const; void GetClr(CLR *pclr); bool operator==(const ACR &acr) const { return _lu == acr._lu; } bool operator!=(const ACR &acr) const { return _lu != acr._lu; } }; #ifdef SYMC extern ACR kacrBlack; extern ACR kacrDkGray; extern ACR kacrGray; extern ACR kacrLtGray; extern ACR kacrWhite; extern ACR kacrRed; extern ACR kacrGreen; extern ACR kacrBlue; extern ACR kacrYellow; extern ACR kacrCyan; extern ACR kacrMagenta; extern ACR kacrClear; extern ACR kacrInvert; #else //! SYMC const ACR kacrBlack(0, 0, 0); const ACR kacrDkGray(0x3F, 0x3F, 0x3F); const ACR kacrGray(0x7F, 0x7F, 0x7F); const ACR kacrLtGray(0xBF, 0xBF, 0xBF); const ACR kacrWhite(kbMax, kbMax, kbMax); const ACR kacrRed(kbMax, 0, 0); const ACR kacrGreen(0, kbMax, 0); const ACR kacrBlue(0, 0, kbMax); const ACR kacrYellow(kbMax, kbMax, 0); const ACR kacrCyan(0, kbMax, kbMax); const ACR kacrMagenta(kbMax, 0, kbMax); const ACR kacrClear(fTrue, fTrue); const ACR kacrInvert(fFalse, fFalse); #endif //! SYMC // abstract pattern struct APT { byte rgb[8]; bool operator==(APT &apt) { return ((long *)rgb)[0] == ((long *)apt.rgb)[0] && ((long *)rgb)[1] == ((long *)apt.rgb)[1]; } bool operator!=(APT &apt) { return ((long *)rgb)[0] != ((long *)apt.rgb)[0] || ((long *)rgb)[1] != ((long *)apt.rgb)[1]; } void SetSolidFore(void) { ((long *)rgb)[0] = -1L; ((long *)rgb)[1] = -1L; } bool FSolidFore(void) { return (((long *)rgb)[0] & ((long *)rgb)[1]) == -1L; } void SetSolidBack(void) { ((long *)rgb)[0] = 0L; ((long *)rgb)[1] = 0L; } bool FSolidBack(void) { return (((long *)rgb)[0] | ((long *)rgb)[1]) == 0L; } void Invert(void) { ((long *)rgb)[0] = ~((long *)rgb)[0]; ((long *)rgb)[1] = ~((long *)rgb)[1]; } void MoveOrigin(long dxp, long dyp); }; extern APT vaptGray; extern APT vaptLtGray; extern APT vaptDkGray; /**************************************** Polygon structure - designed to be compatible with the Mac's Polygon. ****************************************/ struct OLY // pOLYgon { #ifdef MAC short cb; // size of the whole thing RCS rcs; // bounding rectangle PTS rgpts[1]; long Cpts(void) { return (cb - offset(OLY, rgpts[0])) / size(PTS); } #else //! MAC long cpts; PTS rgpts[1]; long Cpts(void) { return cpts; } #endif //! MAC ASSERT }; const long kcbOlyBase = size(OLY) - size(PTS); /**************************************** High level polygon - a GL of PT's. ****************************************/ enum { fognNil = 0, fognAutoClose = 1, fognLim }; typedef class OGN *POGN; #define OGN_PAR GL #define kclsOGN 'OGN' class OGN : public OGN_PAR { RTCLASS_DEC private: struct AEI // Add Edge Info. { PT *prgpt; long cpt; long iptPenCur; PT ptCur; POGN pogn; long ipt; long dipt; }; bool _FAddEdge(AEI *paei); protected: OGN(void); public: PT *PrgptLock(long ipt = 0) { return (PT *)PvLock(ipt); } PT *QrgptGet(long ipt = 0) { return (PT *)QvGet(ipt); } POGN PognTraceOgn(POGN pogn, ulong grfogn); POGN PognTraceRgpt(PT *prgpt, long cpt, ulong grfogn); // static methods static POGN PognNew(long cvInit = 0); }; long IptFindLeftmost(PT *prgpt, long cpt, long dxp, long dyp); /**************************************** Graphics drawing data - a parameter to drawing apis in the GPT class ****************************************/ enum { fgddNil = 0, fgddFill = fgddNil, fgddFrame = 1, fgddPattern = 2, fgddAutoClose = 4, }; // graphics drawing data struct GDD { ulong grfgdd; // what to do APT apt; // pattern to use ACR acrFore; // foreground color (used for solid fills also) ACR acrBack; // background color long dxpPen; // pen width (used if framing) long dypPen; // pen height RCS *prcsClip; // clipping (may be pvNil) }; /**************************************** Graphics environment ****************************************/ #define GNV_PAR BASE #define kclsGNV 'GNV' class GNV : public GNV_PAR { RTCLASS_DEC ASSERT MARKMEM private: PGPT _pgpt; // the port // coordinate mapping RC _rcSrc; RC _rcDst; // current pen location and clipping long _xp; long _yp; RCS _rcsClip; RC _rcVis; // always clipped to - this is in Dst coordinates // Current font DSF _dsf; // contains the current pen size and prcsClip // this is passed to the GPT GDD _gdd; void _Init(PGPT pgpt); bool _FMapRcRcs(RC *prc, RCS *prcs); void _MapPtPts(long xp, long yp, PTS *ppts); HQ _HqolyCreate(POGN pogn, ulong grfogn); HQ _HqolyFrame(POGN pogn, ulong grfogn); // transition related methods bool _FInitPaletteTrans(PGL pglclr, PGL *ppglclrOld, PGL *ppglclrTrans, long cbitPixel = 0); void _PaletteTrans(PGL pglclrOld, PGL pglclrNew, long lwNum, long lwDen, PGL pglclrTrans, CLR *pclrSub = pvNil); bool _FEnsureTempGnv(PGNV *ppgnv, RC *prc); public: GNV(PGPT pgpt); GNV(PGOB pgob); GNV(PGOB pgob, PGPT pgpt); ~GNV(void); void SetGobRc(PGOB pgob); PGPT Pgpt(void) { return _pgpt; } #ifdef MAC void Set(void); void Restore(void); #endif // MAC #ifdef WIN // this gross API is for AVI playback void DrawDib(HDRAWDIB hdd, BITMAPINFOHEADER *pbi, RC *prc); #endif // WIN void SetPenSize(long dxp, long dyp); void FillRcApt(RC *prc, APT *papt, ACR acrFore, ACR acrBack); void FillRc(RC *prc, ACR acr); void FrameRcApt(RC *prc, APT *papt, ACR acrFore, ACR acrBack); void FrameRc(RC *prc, ACR acr); void HiliteRc(RC *prc, ACR acrBack); void FillOvalApt(RC *prc, APT *papt, ACR acrFore, ACR acrBack); void FillOval(RC *prc, ACR acr); void FrameOvalApt(RC *prc, APT *papt, ACR acrFore, ACR acrBack); void FrameOval(RC *prc, ACR acr); void FillOgnApt(POGN pogn, APT *papt, ACR acrFore, ACR acrBack); void FillOgn(POGN pogn, ACR acr); void FrameOgnApt(POGN pogn, APT *papt, ACR acrFore, ACR acrBack); void FrameOgn(POGN pogn, ACR acr); void FramePolyLineApt(POGN pogn, APT *papt, ACR acrFore, ACR acrBack); void FramePolyLine(POGN pogn, ACR acr); void MoveTo(long xp, long yp) { _xp = xp; _yp = yp; } void MoveRel(long dxp, long dyp) { _xp += dxp; _yp += dyp; } void LineToApt(long xp, long yp, APT *papt, ACR acrFore, ACR acrBack) { LineApt(_xp, _yp, xp, yp, papt, acrFore, acrBack); } void LineTo(long xp, long yp, ACR acr) { Line(_xp, _yp, xp, yp, acr); } void LineRelApt(long dxp, long dyp, APT *papt, ACR acrFore, ACR acrBack) { LineApt(_xp, _yp, _xp + dxp, _yp + dyp, papt, acrFore, acrBack); } void LineRel(long dxp, long dyp, ACR acr) { Line(_xp, _yp, _xp + dxp, _yp + dyp, acr); } void LineApt(long xp1, long yp1, long xp2, long yp2, APT *papt, ACR acrFore, ACR acrBack); void Line(long xp1, long yp1, long xp2, long yp2, ACR acr); void ScrollRc(RC *prc, long dxp, long dyp, RC *prc1 = pvNil, RC *prc2 = pvNil); static void GetBadRcForScroll(RC *prc, long dxp, long dyp, RC *prc1, RC *prc2); // for mapping void GetRcSrc(RC *prc); void SetRcSrc(RC *prc); void GetRcDst(RC *prc); void SetRcDst(RC *prc); void SetRcVis(RC *prc); void IntersectRcVis(RC *prc); // set clipping void ClipRc(RC *prc); void ClipToSrc(void); // Text & font. void SetFont(long onn, ulong grfont, long dypFont, long tah = tahLeft, long tav = tavTop); void SetOnn(long onn); void SetFontStyle(ulong grfont); void SetFontSize(long dyp); void SetFontAlign(long tah, long tav); void GetDsf(DSF *pdsf); void SetDsf(DSF *pdsf); void DrawRgch(achar *prgch, long cch, long xp, long yp, ACR acrFore = kacrBlack, ACR acrBack = kacrClear); void DrawStn(PSTN pstn, long xp, long yp, ACR acrFore = kacrBlack, ACR acrBack = kacrClear); void GetRcFromRgch(RC *prc, achar *prgch, long cch, long xp = 0, long yp = 0); void GetRcFromStn(RC *prc, PSTN pstn, long xp = 0, long yp = 0); // bitmaps and pictures void CopyPixels(PGNV pgnvSrc, RC *prcSrc, RC *prcDst); void DrawPic(PPIC ppic, RC *prc); void DrawMbmp(PMBMP pmbmp, long xp, long yp); void DrawMbmp(PMBMP pmbmp, RC *prc); // transitions void Wipe(long gfd, ACR acrFill, PGNV pgnvSrc, RC *prcSrc, RC *prcDst, ulong dts, PGL pglclr = pvNil); void Slide(long gfd, ACR acrFill, PGNV pgnvSrc, RC *prcSrc, RC *prcDst, ulong dts, PGL pglclr = pvNil); void Dissolve(long crcWidth, long crcHeight, ACR acrFill, PGNV pgnvSrc, RC *prcSrc, RC *prcDst, ulong dts, PGL pglclr = pvNil); void Fade(long cactMax, ACR acrFade, PGNV pgnvSrc, RC *prcSrc, RC *prcDst, ulong dts, PGL pglclr = pvNil); void Iris(long gfd, long xp, long yp, ACR acrFill, PGNV pgnvSrc, RC *prcSrc, RC *prcDst, ulong dts, PGL pglclr = pvNil); }; // palette setting options enum { fpalNil = 0, fpalIdentity = 1, // make this an identity palette fpalInitAnim = 2, // make the palette animatable fpalAnimate = 4, // animate the current palette with these colors }; /**************************************** Graphics port ****************************************/ #define GPT_PAR BASE #define kclsGPT 'GPT' class GPT : public GPT_PAR { RTCLASS_DEC ASSERT MARKMEM private: PREGN _pregnClip; RC _rcClip; PT _ptBase; // coordinates assigned to top-left of the GPT #ifdef WIN #ifdef DEBUG static bool _fFlushGdi; #endif static HPAL _hpal; static HPAL _hpalIdentity; static CLR *_prgclr; static long _cclrPal; static long _cactPalCur; static long _cactFlush; static bool _fPalettized; // whether the screen is palettized HDC _hdc; HWND _hwnd; HBMP _hbmp; // nil if not an offscreen port byte *_prgbPixels; // nil if not a dib section port long _cbitPixel; long _cbRow; RC _rcOff; // bounding rectangle for a metafile or dib port long _cactPal; // which palette this port has selected long _cactDraw; // last draw - for knowing when to call GdiFlush long _cactLock; // lock count // selected brush and its related info enum // brush kind { bkNil, bkApt, bkAcr, bkStock }; HBRUSH _hbr; long _bk; APT _apt; // for bkApt ACR _acr; // for bkAcr int _wType; // for bkStock (stock brush) HFONT _hfnt; DSF _dsf; bool _fNewClip : 1; // _pregnClip has changed bool _fMetaFile : 1; bool _fMapIndices : 1; // SelectPalette failed, map indices to RGBs bool _fOwnPalette : 1; // this offscreen has its own palette void _SetClip(RCS *prcsClip); void _EnsurePalette(void); void _SetTextProps(DSF *pdsf); void _SetAptBrush(APT *papt); void _SetAcrBrush(ACR acr); void _SetStockBrush(int wType); void _FillRcs(RCS *prcs); void _FillOval(RCS *prcs); void _FillPoly(OLY *poly); void _FillRgn(HRGN *phrgn); void _FrameRcsOval(RCS *prcs, GDD *pgdd, bool fOval); SCR _Scr(ACR acr); bool _FInit(HDC hdc); #endif // WIN #ifdef MAC static HCLT _hcltDef; static bool _fForcePalOnSys; static HCLT _HcltUse(long cbitPixel); // WARNING: the PPRT's below may be GWorldPtr's instead of GrafPtr's // Only use SetGWorld or GetGWorld on these. Don't assume they // point to GrafPort's. PPRT _pprt; // may be a GWorldPtr HGD _hgd; PPRT _pprtSav; // may be a GWorldPtr HGD _hgdSav; short _cactLock; // lock count for pixels (if offscreen) short _cbitPixel; // depth of bitmap (if offscreen) bool _fSet : 1; bool _fOffscreen : 1; bool _fNoClip : 1; bool _fNewClip : 1; //_pregnClip is new // for picture based GPT's RC _rcOff; // also valid for offscreen GPTs HPIC _hpic; HPIX _Hpix(void); void _FillRcs(RCS *prcs); void _FrameRcs(RCS *prcs); void _FillOval(RCS *prcs); void _FrameOval(RCS *prcs); void _FillPoly(HQ *phqoly); void _FramePoly(HQ *phqoly); void _DrawLine(PTS *prgpts); void _GetRcsFromRgch(RCS *prcs, achar *prgch, short cch, PTS *ppts, DSF *pdsf); #endif // MAC // low level draw routine typedef void (GPT::*PFNDRW)(void *); void _Fill(void *pv, GDD *pgdd, PFNDRW pfn); GPT(void) { } ~GPT(void); public: #ifdef WIN static PGPT PgptNew(HDC hdc); static PGPT PgptNewHwnd(HWND hwnd); static long CclrSetPalette(HWND hwnd, bool fInval); // this gross API is for AVI playback void DrawDib(HDRAWDIB hdd, BITMAPINFOHEADER *pbi, RCS *prcs, GDD *pgdd); #endif // WIN #ifdef MAC static PGPT PgptNew(PPRT pprt, HGD hgd = hNil); static bool FCanScreen(long cbitPixel, bool fColor); static bool FSetScreenState(long cbitPixel, bool tColor); static void GetScreenState(long *pcbitPixel, bool *pfColor); void Set(RCS *prcsClip); void Restore(void); #endif // MAC #ifdef DEBUG static void MarkStaticMem(void); #endif // DEBUG static void SetActiveColors(PGL pglclr, ulong grfpal); static PGL PglclrGetPalette(void); static void Flush(void); static PGPT PgptNewOffscreen(RC *prc, long cbitPixel); static PGPT PgptNewPic(RC *prc); PPIC PpicRelease(void); void SetOffscreenColors(PGL pglclr = pvNil); void ClipToRegn(PREGN *ppregn); void SetPtBase(PT *ppt); void GetPtBase(PT *ppt); void DrawRcs(RCS *prcs, GDD *pgdd); void HiliteRcs(RCS *prcs, GDD *pgdd); void DrawOval(RCS *prcs, GDD *pgdd); void DrawLine(PTS *ppts1, PTS *ppts2, GDD *pgdd); void DrawPoly(HQ hqoly, GDD *pgdd); void ScrollRcs(RCS *prcs, long dxp, long dyp, GDD *pgdd); void DrawRgch(achar *prgch, long cch, PTS pts, GDD *pgdd, DSF *pdsf); void GetRcsFromRgch(RCS *prcs, achar *prgch, long cch, PTS pts, DSF *pdsf); void CopyPixels(PGPT pgptSrc, RCS *prcsSrc, RCS *prcsDst, GDD *pgdd); void DrawPic(PPIC ppic, RCS *prcs, GDD *pgdd); void DrawMbmp(PMBMP pmbmp, RCS *prcs, GDD *pgdd); void Lock(void); void Unlock(void); byte *PrgbLockPixels(RC *prc = pvNil); long CbRow(void); long CbitPixel(void); }; /**************************************** Regions ****************************************/ bool FCreateRgn(HRGN *phrgn, RC *prc); void FreePhrgn(HRGN *phrgn); bool FSetRectRgn(HRGN *phrgn, RC *prc); bool FUnionRgn(HRGN hrgnDst, HRGN hrgnSrc1, HRGN hrgnSrc2); bool FIntersectRgn(HRGN hrgnDst, HRGN hrgnSrc1, HRGN hrgnSrc2, bool *pfEmpty = pvNil); bool FDiffRgn(HRGN hrgnDst, HRGN hrgnSrc, HRGN hrgnSrcSub, bool *pfEmpty = pvNil); bool FRectRgn(HRGN hrgn, RC *prc = pvNil); bool FEmptyRgn(HRGN hrgn, RC *prc = pvNil); bool FEqualRgn(HRGN hrgn1, HRGN hrgn2); /**************************************** Misc. ****************************************/ bool FInitGfx(void); // stretch by a factor of 2 in each dimension. void DoubleStretch(byte *prgbSrc, long cbRowSrc, long dypSrc, RC *prcSrc, byte *prgbDst, long cbRowDst, long dypDst, long xpDst, long ypDst, RC *prcClip, PREGN pregnClip); // stretch by a factor of 2 in vertical direction only. void DoubleVertStretch(byte *prgbSrc, long cbRowSrc, long dypSrc, RC *prcSrc, byte *prgbDst, long cbRowDst, long dypDst, long xpDst, long ypDst, RC *prcClip, PREGN pregnClip); // Number of times that the palette has changed (via a call to CclrSetPalette // or SetActiveColors). This can be used by other modules to detect a palette // change. extern long vcactRealize; #endif //! GFX_H ================================================ FILE: kauai/src/gfxmac.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Mac specific graphics routines. ***************************************************************************/ #include "frame.h" ASSERTNAME HCLT GPT::_hcltDef; bool GPT::_fForcePalOnSys; #ifdef SYMC ACR kacrBlack(0, 0, 0); ACR kacrDkGray(0x3F, 0x3F, 0x3F); ACR kacrGray(0x7F, 0x7F, 0x7F); ACR kacrLtGray(0xBF, 0xBF, 0xBF); ACR kacrWhite(kbMax, kbMax, kbMax); ACR kacrRed(kbMax, 0, 0); ACR kacrGreen(0, kbMax, 0); ACR kacrBlue(0, 0, kbMax); ACR kacrYellow(kbMax, kbMax, 0); ACR kacrCyan(0, kbMax, kbMax); ACR kacrMagenta(kbMax, 0, kbMax); ACR kacrClear(fTrue, fTrue); ACR kacrInvert(fFalse, fFalse); #endif // SYMC /*************************************************************************** Set the color as the current foreground color. ***************************************************************************/ void ACR::_SetFore(void) { AssertThis(facrRgb | facrIndex); SCR scr; byte b; if (B3Lw(_lu) == kbIndexAcr) PmForeColor(B0Lw(_lu)); else { b = B2Lw(_lu); scr.red = SwHighLow(b, b); b = B1Lw(_lu); scr.green = SwHighLow(b, b); b = B0Lw(_lu); scr.blue = SwHighLow(b, b); RGBForeColor(&scr); } } /*************************************************************************** Set the color as the current background color. ***************************************************************************/ void ACR::_SetBack(void) { AssertThis(facrRgb | facrIndex); SCR scr; byte b; if (B3Lw(_lu) == kbIndexAcr) PmBackColor(B0Lw(_lu)); else { b = B2Lw(_lu); scr.red = SwHighLow(b, b); b = B1Lw(_lu); scr.green = SwHighLow(b, b); b = B0Lw(_lu); scr.blue = SwHighLow(b, b); RGBBackColor(&scr); } } /*************************************************************************** Static method to flush any pending graphics operations. ***************************************************************************/ void GPT::Flush(void) { // does nothing on Mac. } /*************************************************************************** Static method to set the current color table. While using fpalIdentity the following cautions apply: 1) The following indexes are reserved by the system, so shouldn't be used: { 0, 1, 3, 15, 255 } (Mac) { 0 - 9; 246 - 255 } (Win). 2) While we're in the background, RGB values may get mapped to the wrong indexes, so the colors will change when we move to the foreground. The solution is to always use indexed based color while using fForceOnSystem. 3) This should only be called when we are the foreground app. REVIEW shonk: Mac: implement fpalInitAnim and fpalAnimate. ***************************************************************************/ void GPT::SetActiveColors(PGL pglclr, ulong grfpal) { AssertNilOrPo(pglclr, 0); long cclr, iclr, iv; HPAL hpal, hpalOld; SCR scr; CLR clr; HCLT hclt; HWND hwnd; if (hNil == (hclt = GetCTable(72))) goto LFail; (*hclt)->ctSeed = GetCTSeed(); // REVIEW shonk: Mac: does it work to call SetPalette with a nil palette? if (pvNil != pglclr && 0 < (cclr = LwMin(256, pglclr->IvMac()))) { if (hNil == (hpal = NewPalette((short)cclr, hNil, (grfpal & fpalIdentity) ? pmTolerant | pmExplicit : pmTolerant, 0))) { DisposeHandle((HN)hclt); LFail: PushErc(ercGfxCantSetPalette); return; } for (iclr = 0; iclr < cclr; iclr++) { pglclr->Get(iclr, &clr); scr.red = SwHighLow(clr.bRed, clr.bRed); scr.green = SwHighLow(clr.bGreen, clr.bGreen); scr.blue = SwHighLow(clr.bBlue, clr.bBlue); SetEntryColor(hpal, (short)iclr, &scr); (*hclt)->ctTable[iclr].rgb = scr; } if (grfpal & fpalIdentity) { // set the first entry to white (with just pmExplicit) scr.red = scr.green = scr.blue = (ushort)-1; SetEntryColor(hpal, 0, &scr); SetEntryUsage(hpal, 0, pmExplicit, -1); (*hclt)->ctTable[0].rgb = scr; // set all possible ending entries to black (with just pmExplicit) scr.red = scr.green = scr.blue = 0; for (iv = 1; iv <= 8; iv <<= 1) { iclr = (1 << iv) - 1; if (iclr < cclr) { SetEntryColor(hpal, (short)iclr, &scr); SetEntryUsage(hpal, (short)iclr, pmExplicit, -1); } (*hclt)->ctTable[iclr].rgb = scr; } } } else hpal = hNil; hpalOld = GetPalette(PPRT(-1)); SetPalette(PPRT(-1), hpal, fFalse); // activate the palette if (hNil != (hwnd = (HWND)FrontWindow())) ActivatePalette((PPRT)hwnd); else { // to activate the palette, create a window offscreen and then destroy it RCS rcs; rcs = qd.screenBits.bounds; rcs.top = qd.screenBits.bounds.top + GetMBarHeight() / 2; rcs.left = (qd.screenBits.bounds.left + qd.screenBits.bounds.right) / 2; rcs.bottom = rcs.top + 1; rcs.right = rcs.left + 1; hwnd = (HWND)NewCWindow(pvNil, &rcs, (byte *)"\p", fTrue, plainDBox, GrafPtr(-1), fTrue, 0); if (hNil != hwnd) DisposeWindow((PPRT)hwnd); } if (hNil != hpalOld) DisposePalette(hpalOld); if (hNil != _hcltDef) DisposeHandle((HN)_hcltDef); _hcltDef = hclt; _fForcePalOnSys = FPure(grfpal & fpalIdentity); } /*************************************************************************** Static method to determine if the main screen supports this depth and color status. ***************************************************************************/ bool GPT::FCanScreen(long cbitPixel, bool fColor) { if (cbitPixel == 24) cbitPixel = 32; // assert that cbitPixel is in {1,2,4,8,16,32} AssertIn(cbitPixel, 1, 33); AssertVar((cbitPixel & (cbitPixel - 1)) == 0, "bad cbitPixel value", &cbitPixel); HGD hgd; if (hNil == (hgd = GetMainDevice())) return fFalse; return HasDepth(hgd, (short)cbitPixel, 1, fColor ? 1 : 0) != 0; } /*************************************************************************** Static method to attempt to set the depth and/or color status of the main screen (the one with the menu bar). ***************************************************************************/ bool GPT::FSetScreenState(long cbitPixel, bool tColor) { if (cbitPixel == 24) cbitPixel = 32; // assert that cbitPixel is in {0,1,2,4,8,16,32} AssertIn(cbitPixel, 0, 33); AssertVar((cbitPixel & (cbitPixel - 1)) == 0, "bad cbitPixel value", &cbitPixel); AssertT(tColor); HGD hgd; short swT; if (hNil == (hgd = GetMainDevice())) return fFalse; if (0 == cbitPixel) cbitPixel = (*(*hgd)->gdPMap)->pixelSize; swT = (tColor == tYes || tColor == tMaybe && TestDeviceAttribute(hgd, gdDevType)) ? 1 : 0; if (0 == HasDepth(hgd, (short)cbitPixel, 1, swT)) return fFalse; return (noErr == SetDepth(hgd, (short)cbitPixel, 1, swT)); } /*************************************************************************** Static method to get the state of the main screen. ***************************************************************************/ void GPT::GetScreenState(long *pcbitPixel, bool *pfColor) { AssertVarMem(pcbitPixel); AssertVarMem(pfColor); HGD hgd; if (hNil == (hgd = GetMainDevice())) { *pcbitPixel = 0; *pfColor = fFalse; } else { *pcbitPixel = (*(*hgd)->gdPMap)->pixelSize; *pfColor = FPure(TestDeviceAttribute(hgd, gdDevType)); } } /*************************************************************************** Static method to create a new GPT. ***************************************************************************/ PGPT GPT::PgptNew(PPRT pprt, HGD hgd) { AssertVarMem(pprt); AssertNilOrVarMem(hgd); PGPT pgpt; if (pvNil == (pgpt = NewObj GPT)) return pvNil; pgpt->_pprt = pprt; pgpt->_hgd = hgd; AssertThis(0); } /*************************************************************************** Destructor for a port. ***************************************************************************/ GPT::~GPT(void) { if (_fOffscreen) { Assert(_cactLock == 0, "pixels are still locked for GWorld being freed"); if (hNil != _hpic) { Set(pvNil); ClosePicture(); Restore(); KillPicture(_hpic); _hpic = hNil; } DisposeGWorld((PGWR)_pprt); } ReleasePpo(&_pregnClip); } /*************************************************************************** Return the clut that should be used for off-screen GPT's. ***************************************************************************/ HCLT GPT::_HcltUse(long cbitPixel) { HGD hgd; HCLT hclt; if (cbitPixel > 8) return hNil; if (_fForcePalOnSys) { if (hNil == (hgd = GetMainDevice()) || hNil == (hclt = (*(*hgd)->gdPMap)->pmTable)) { Warn("Can't get Main Device's color table"); } else if ((*hclt)->ctSize + 1 >= (1 << cbitPixel)) return hclt; } return _hcltDef; } /*************************************************************************** Static method to create an offscreen port. ***************************************************************************/ PGPT GPT::PgptNewOffscreen(RC *prc, long cbitPixel) { AssertVarMem(prc); Assert(!prc->FEmpty(), "empty rc for offscreen"); PGWR pgwr; RCS rcs; PGPT pgpt; if (cbitPixel == 24) cbitPixel = 32; // assert that cbitPixel is in {1,2,4,8,16,32} AssertIn(cbitPixel, 1, 33); AssertVar((cbitPixel & (cbitPixel - 1)) == 0, "bad cbitPixel value", &cbitPixel); rcs = *prc; if (noErr != NewGWorld(&pgwr, (short)cbitPixel, &rcs, _HcltUse(cbitPixel), hNil, 0)) return pvNil; if (pvNil == (pgpt = PgptNew((PPRT)pgwr))) DisposeGWorld(pgwr); else { pgpt->_fOffscreen = fTrue; pgpt->_rcOff = *prc; pgpt->_cbitPixel = (short)cbitPixel; } return pgpt; } /*************************************************************************** If this is an offscreen bitmap, return the pointer to the pixels and optionally get the bounds. Must balance with a call to Unlock(). ***************************************************************************/ byte *GPT::PrgbLockPixels(RC *prc) { AssertThis(0); AssertNilOrVarMem(prc); HPIX hpix; if (!_fOffscreen) return pvNil; Lock(); hpix = _Hpix(); if (pvNil != prc) *prc = _rcOff; return (byte *)(*hpix)->baseAddr; } /*************************************************************************** If this is an offscreen bitmap, return the number of bytes per row. ***************************************************************************/ long GPT::CbRow(void) { AssertThis(0); HPIX hpix; if (!_fOffscreen) return 0; hpix = _Hpix(); return (*hpix)->rowBytes & 0x7FFF; } /*************************************************************************** If this is an offscreen bitmap, return the number of bits per pixel. ***************************************************************************/ long GPT::CbitPixel(void) { AssertThis(0); if (!_fOffscreen) return 0; return _cbitPixel; } /*************************************************************************** Static method to create a PICT and its an associated GPT. This should be balanced with a call to PpicRelease(). ***************************************************************************/ PGPT GPT::PgptNewPic(RC *prc) { AssertVarMem(prc); Assert(!prc->FEmpty(), "empty rectangle for metafile GPT"); PGPT pgpt; RCS rcs; RC rc(0, 0, 1, 1); if (pvNil == (pgpt = PgptNewOffscreen(&rc, 8))) return pvNil; rcs = RCS(*prc); pgpt->Set(&rcs); pgpt->_rcOff = *prc; pgpt->_hpic = OpenPicture(&rcs); pgpt->Restore(); if (hNil == pgpt->_hpic) { ReleasePpo(&pgpt); return pvNil; } return pgpt; } /*************************************************************************** Closes a metafile based GPT and returns the picture produced from drawing into the GPT. ***************************************************************************/ PPIC GPT::PpicRelease(void) { AssertThis(0); PPIC ppic; RCS rcs; if (hNil == _hpic) { Bug("not a Pict GPT"); goto LRelease; } Set(pvNil); ClosePicture(); Restore(); rcs = (*_hpic)->picFrame; if (EmptyRect(&rcs) || pvNil == (ppic = PIC::PpicNew(_hpic, &_rcOff))) { KillPicture(_hpic); _hpic = hNil; LRelease: Release(); return pvNil; } _hpic = hNil; Release(); return ppic; } /*************************************************************************** Fill or frame a rectangle. ***************************************************************************/ void GPT::DrawRcs(RCS *prcs, GDD *pgdd) { AssertThis(0); AssertVarMem(prcs); AssertVarMem(pgdd); PFNDRW pfn; pfn = (pgdd->grfgdd & fgddFrame) ? (PFNDRW)_FrameRcs : (PFNDRW)_FillRcs; _Fill(prcs, pgdd, pfn); } /*************************************************************************** Callback (PFNDRW) to fill a rectangle. ***************************************************************************/ void GPT::_FillRcs(RCS *prcs) { AssertVarMem(prcs); PaintRect(prcs); } /*************************************************************************** Callback (PFNDRW) to frame a rectangle. ***************************************************************************/ void GPT::_FrameRcs(RCS *prcs) { AssertVarMem(prcs); FrameRect(prcs); } /*************************************************************************** Hilite the rectangle by reversing white and the system hilite color. ***************************************************************************/ void GPT::HiliteRcs(RCS *prcs, GDD *pgdd) { AssertThis(0); AssertVarMem(prcs); AssertVarMem(pgdd); Set(pgdd->prcsClip); ForeColor(blackColor); pgdd->acrBack._SetBack(); *(byte *)0x938 &= 0x7f; /* use color highlighting */ InvertRect(prcs); Restore(); } /*************************************************************************** Fill or frame an oval. ***************************************************************************/ void GPT::DrawOval(RCS *prcs, GDD *pgdd) { AssertThis(0); AssertVarMem(prcs); AssertVarMem(pgdd); PFNDRW pfn; pfn = (pgdd->grfgdd & fgddFrame) ? (PFNDRW)_FrameOval : (PFNDRW)_FillOval; _Fill(prcs, pgdd, pfn); } /*************************************************************************** Callback (PFNDRW) to fill an oval. ***************************************************************************/ void GPT::_FillOval(RCS *prcs) { AssertVarMem(prcs); PaintOval(prcs); } /*************************************************************************** Callback (PFNDRW) to frame an oval. ***************************************************************************/ void GPT::_FrameOval(RCS *prcs) { AssertVarMem(prcs); FrameOval(prcs); } /*************************************************************************** Fill or frame a polygon. ***************************************************************************/ void GPT::DrawPoly(HQ hqoly, GDD *pgdd) { AssertThis(0); AssertHq(hqoly); AssertVarMem(pgdd); PFNDRW pfn; pfn = (pgdd->grfgdd & fgddFrame) ? (PFNDRW)_FramePoly : (PFNDRW)_FillPoly; _Fill(&hqoly, pgdd, pfn); } /*************************************************************************** Callback (PFNDRW) to fill a polygon. ***************************************************************************/ void GPT::_FillPoly(HQ *phqoly) { AssertVarMem(phqoly); AssertHq(*phqoly); PaintPoly((PolyHandle)*phqoly); } /*************************************************************************** Callback (PFNDRW) to frame a polygon. ***************************************************************************/ void GPT::_FramePoly(HQ *phqoly) { AssertVarMem(phqoly); AssertHq(*phqoly); FramePoly((PolyHandle)*phqoly); } /*************************************************************************** Draw a line. ***************************************************************************/ void GPT::DrawLine(PTS *ppts1, PTS *ppts2, GDD *pgdd) { AssertThis(0); AssertVarMem(ppts1); AssertVarMem(ppts2); AssertVarMem(pgdd); PTS rgpts[2]; rgpts[0] = *ppts1; rgpts[1] = *ppts2; _Fill(rgpts, pgdd, (PFNDRW)_DrawLine); } /*************************************************************************** Callback (PFNDRW) to draw a line. ***************************************************************************/ void GPT::_DrawLine(PTS *prgpts) { AssertPvCb(prgpts, 2 * size(PTS)); MoveTo(prgpts[0].h, prgpts[0].v); LineTo(prgpts[1].h, prgpts[1].v); } /*************************************************************************** Low level routine to fill/frame a shape. ***************************************************************************/ void GPT::_Fill(void *pv, GDD *pgdd, PFNDRW pfn) { ACR acrFore = pgdd->acrFore; Set(pgdd->prcsClip); if (pgdd->grfgdd & fgddFrame) PenSize((short)pgdd->dxpPen, (short)pgdd->dypPen); if (pgdd->grfgdd & fgddPattern) { // pattern fill APT apt = pgdd->apt; ACR acrBack = pgdd->acrBack; // check for a solid pattern if (apt.FSolidFore() || acrFore == acrBack) goto LSolid; if (apt.FSolidBack()) { acrFore = acrBack; goto LSolid; } Assert(acrFore != acrBack, "fore and back colors still equal!"); // Make sure we have one of these forms: // (*, *) // (clear, *) // (invert, *) // (invert, clear) if (acrBack == kacrInvert || acrBack == kacrClear && acrFore != kacrInvert) { // swap them and invert the pattern acrFore = acrBack; acrBack = pgdd->acrFore; apt.Invert(); } PenPat((Pattern *)apt.rgb); if (acrFore == kacrInvert) { // do (invert, clear) PenMode(patXor); ForeColor(blackColor); (this->*pfn)(pv); if (acrBack != kacrClear) { // need (invert, *), have already done (invert, clear) // so still need to do (clear, *) goto LClear; } } else if (acrFore == kacrClear) { LClear: // do (clear, *) PenMode(notPatOr); acrBack._SetFore(); (this->*pfn)(pv); } else { // do (*, *) PenMode(patCopy); acrFore._SetFore(); acrBack._SetBack(); (this->*pfn)(pv); } } else { // solid color LSolid: if (acrFore == kacrClear) goto LDone; // nothing to do PenPat(&qd.black); if (acrFore == kacrInvert) { PenMode(patXor); ForeColor(blackColor); } else { PenMode(patCopy); acrFore._SetFore(); } (this->*pfn)(pv); } LDone: Restore(); } /*************************************************************************** Scroll the given rectangle. ***************************************************************************/ void GPT::ScrollRcs(RCS *prcs, long dxp, long dyp, GDD *pgdd) { AssertThis(0); AssertVarMem(prcs); AssertVarMem(pgdd); HRGN hrgn; Set(pgdd->prcsClip); if (hNil == (hrgn = NewRgn())) PushErc(ercGfxCantDraw); else { ScrollRect(prcs, (short)dxp, (short)dyp, hrgn); DisposeRgn(hrgn); } Restore(); } /*************************************************************************** Draw the text. ***************************************************************************/ void GPT::DrawRgch(achar *prgch, long cch, PTS pts, GDD *pgdd, DSF *pdsf) { AssertThis(0); AssertIn(cch, 0, kcbMax); AssertPvCb(prgch, cch); AssertVarMem(pgdd); AssertPo(pdsf, 0); ACR acrFore, acrBack; RCS rcs; RCS *prcs = pvNil; if (pdsf->grfont & fontBoxed) prcs = &rcs; Set(pgdd->prcsClip); _GetRcsFromRgch(prcs, prgch, (short)cch, &pts, pdsf); acrFore = pgdd->acrFore; acrBack = pgdd->acrBack; ForeColor(blackColor); BackColor(whiteColor); if (acrFore == kacrInvert) { // do (invert, clear) TextMode(srcXor); MoveTo(pts.h, pts.v); DrawText(prgch, 0, (short)cch); } else if (acrFore != kacrClear) { acrFore._SetFore(); if (acrBack != kacrClear && acrBack != kacrInvert) { TextMode(srcCopy); acrBack._SetBack(); goto LDraw; } TextMode(srcOr); MoveTo(pts.h, pts.v); DrawText(prgch, 0, (short)cch); ForeColor(blackColor); } if (acrBack == kacrInvert) { TextMode(notSrcXor); goto LDraw; } else if (acrBack != kacrClear) { TextMode(notSrcCopy); acrBack._SetFore(); LDraw: MoveTo(pts.h, pts.v); DrawText(prgch, 0, (short)cch); } if (pdsf->grfont & fontBoxed) { GDD gdd = *pgdd; gdd.dxpPen = gdd.dypPen = 1; gdd.grfgdd = fgddFrame | fgddPattern; gdd.apt = vaptGray; gdd.apt.MoveOrigin(-_ptBase.xp, -_ptBase.yp); gdd.acrBack = kacrClear; DrawRcs(&rcs, &gdd); } Restore(); } /*************************************************************************** Get the bounding text rectangle (in port coordinates). ***************************************************************************/ void GPT::GetRcsFromRgch(RCS *prcs, achar *prgch, long cch, PTS pts, DSF *pdsf) { Set(pvNil); _GetRcsFromRgch(prcs, prgch, (short)cch, &pts, pdsf); Restore(); } /*************************************************************************** Set the text properties in the current port and get the bounding rectangle for the text. -- On input: -- ppts : Text origin, relative position is determined by tah and tav. -- On output: -- ppts : Text origin, relative to (left, baseline). -- prcs : Bounding box. prcs may be nil (saves a call to TextWidth if tah is tahLeft). ***************************************************************************/ void GPT::_GetRcsFromRgch(RCS *prcs, achar *prgch, short cch, PTS *ppts, DSF *pdsf) { AssertNilOrVarMem(prcs); AssertIn(cch, 0, kcbMax); AssertPvCb(prgch, cch); AssertVarMem(ppts); AssertPo(pdsf, 0); FontInfo fin; short xpLeft, ypTop; short dyp; short dxp; short ftc; // REVIEW shonk: avoid small font sizes (the OS will crash) - is this true // on newer machines (020 and better)? ftc = vntl.FtcFromOnn(pdsf->onn); TextFont(ftc); TextFace((short)pdsf->grfont); TextSize((short)pdsf->dyp); dxp = (pvNil == prcs && pdsf->tah == tahLeft) ? 0 : TextWidth(prgch, 0, cch); xpLeft = ppts->h; ypTop = ppts->v; switch (pdsf->tah) { case tahCenter: xpLeft -= dxp / 2; break; case tahRight: xpLeft -= dxp; break; } GetFontInfo(&fin); dyp = fin.ascent + fin.descent; switch (pdsf->tav) { case tavBaseline: ypTop -= fin.ascent; break; case tavCenter: ypTop -= dyp / 2; break; case tavBottom: ypTop -= dyp; break; } if (pvNil != prcs) { prcs->left = xpLeft; prcs->top = ypTop; prcs->right = xpLeft + dxp; prcs->bottom = ypTop + dyp; } ppts->h = xpLeft; ppts->v = ypTop + fin.ascent; } /*************************************************************************** Lock the pixels for the port if this is an offscreen PixMap. Must be balanced by a call to Unlock. ***************************************************************************/ void GPT::Lock(void) { if (_fOffscreen && 0 == _cactLock++) { AssertDo(LockPixels(GetGWorldPixMap((PGWR)_pprt)), "couldn't lock gworld pixmap pixels"); } } /*************************************************************************** Unlock the pixels for the port if this is an offscreen PixMap. ***************************************************************************/ void GPT::Unlock(void) { if (_fOffscreen && 0 >= --_cactLock) { Assert(0 == _cactLock, "Unmatched Unlock call"); UnlockPixels(GetGWorldPixMap((PGWR)_pprt)); _cactLock = 0; } } /*************************************************************************** Select our graf-port and device. Must be balanced by a call to Restore. Set/Restore combinations are nestable for distinct ports (but not for the same port). If this is a picture GPT, intersect the clipping with _rcOff. ***************************************************************************/ void GPT::Set(RCS *prcsClip) { HCLT hclt; RC rc, rcT; RCS rcs; HRGN hrgn = hNil; Assert(!_fSet, "this port is already set"); Lock(); GetGWorld((PGWR *)&_pprtSav, &_hgdSav); SetGWorld((PGWR)_pprt, _hgd); if (pvNil == prcsClip) rc.Max(); else rc = RC(*prcsClip); if (hNil != _hpic) { // in a picture GPT, clip to the bounding rectangle rc.FIntersect(&_rcOff); } if (_fNewClip || rc != _rcClip) { // have to set the clipping if (pvNil == _pregnClip) rcT = rc; else { if (!_pregnClip->FIsRc(&rcT) && hNil == (hrgn = _pregnClip->HrgnEnsure())) { Warn("clipping to region failed"); } rcT.FIntersect(&rc); } rcs = RCS(rcT); ClipRect(&rcs); if (hNil != hrgn) { HRGN hrgnClip = qd.thePort->clipRgn; SectRgn(hrgnClip, hrgn, hrgnClip); } _fNewClip = fFalse; _rcClip = rc; } if (_fOffscreen && hNil != (hclt = _HcltUse(_cbitPixel))) { HPIX hpix = ((PCPRT)qd.thePort)->portPixMap; if ((*(*hpix)->pmTable)->ctSeed != (*hclt)->ctSeed) { // change the color table without doing any color mapping // REVIEW shonk: not sure we want to use UpdateGWorld - it does pixel mapping // REVIEW shonk: does UpdateGWorld just copy the color table or does it do // other stuff, including changing the seed? NewCode(); long lw; RCS rcs = _rcOff; // REVIEW shonk: check for errors lw = UpdateGWorld((PGWR *)&_pprt, _cbitPixel, &rcs, hclt, hNil, keepLocal); } } _fSet = fTrue; } /*************************************************************************** Restores the saved port and device (from a call to Set). ***************************************************************************/ void GPT::Restore(void) { if (!_fSet) { Bug("Unmatched restore"); return; } #ifdef DEBUG PPRT pprt; HGD hgd; GetGWorld((PGWR *)&pprt, &hgd); Assert(pprt == _pprt, "why aren't we set - someone didn't restore"); Assert(hgd == _hgd || _hgd == hNil, "gdevice set wrong"); #endif // DEBUG SetGWorld((PGWR)_pprtSav, _hgdSav); Unlock(); _fSet = fFalse; } /*************************************************************************** Return the PixMapHandle for the given port. ***************************************************************************/ HPIX GPT::_Hpix(void) { if (_fOffscreen) return GetGWorldPixMap((PGWR)_pprt); return ((PCPRT)_pprt)->portPixMap; } /*************************************************************************** Copy bits from pgptSrc to this GPT. ***************************************************************************/ void GPT::CopyPixels(PGPT pgptSrc, RCS *prcsSrc, RCS *prcsDst, GDD *pgdd) { Set(pgdd->prcsClip); ForeColor(blackColor); BackColor(whiteColor); pgptSrc->Lock(); CopyBits((PBMP)*pgptSrc->_Hpix(), (PBMP)*_Hpix(), prcsSrc, prcsDst, srcCopy, hNil); pgptSrc->Unlock(); Restore(); } /*************************************************************************** Draw the picture in the given rectangle. ***************************************************************************/ void GPT::DrawPic(PPIC ppic, RCS *prcs, GDD *pgdd) { AssertThis(0); AssertPo(ppic, 0); AssertVarMem(prcs); AssertVarMem(pgdd); Set(pgdd->prcsClip); DrawPicture(ppic->Hpic(), prcs); Restore(); } /*************************************************************************** Draw the masked bitmap in the given rectangle with reference point *ppts. pgdd->prcsClip is the clipping rectangle. ***************************************************************************/ void GPT::DrawMbmp(PMBMP pmbmp, RCS *prcs, GDD *pgdd) { AssertThis(0); AssertPo(pmbmp, 0); AssertVarMem(prcs); AssertVarMem(pgdd); RC rc, rcT; HPIX hpix; // REVIEW shonk: fix DrawMbmp to use the rcs. pmbmp->GetRc(&rc); rc.Offset(prcs->left, prcs->top); if (pvNil != pgdd->prcsClip) { rcT = *pgdd->prcsClip; if (!rc.FIntersect(&rcT)) return; } if (_cbitPixel == 8) { rcT = _rcOff; Assert(rcT.xpLeft == 0 && rcT.ypTop == 0, "bad _rcOff"); if (!rc.FIntersect(&rcT)) return; Lock(); hpix = _Hpix(); pmbmp->Draw((byte *)(*hpix)->baseAddr, (*hpix)->rowBytes & 0x7FFF, rcT.Dyp(), prcs->left, prcs->top, &rc, _pregnClip); Unlock(); } else { // need to create a temporary offscreen GPT for the Mask, set the Mask // area to white in this GPT, then create an offscreen GPT for the // actual MBMP graphic, then blt these to this GPT. PT ptDst; PGPT pgpt; RCS rcsDst; RCS rcsSrc; ptDst = rc.PtTopLeft(); rcsDst = RCS(rc); rc.OffsetToOrigin(); if (pvNil == (pgpt = GPT::PgptNewOffscreen(&rc, 1))) { Warn("Drawing MBMP failed"); return; } Assert(pgpt->_rcOff == rc, 0); pgpt->Lock(); hpix = pgpt->_Hpix(); pmbmp->DrawMask((byte *)(*hpix)->baseAddr, (*hpix)->rowBytes & 0x7FFF, rc.Dyp(), prcs->left - ptDst.xp, prcs->top - ptDst.yp); // set the mask bits to black Set(pgdd->prcsClip); ForeColor(blackColor); BackColor(whiteColor); rcsSrc = RCS(rc); CopyBits((PBMP)*hpix, (PBMP)*_Hpix(), &rcsSrc, &rcsDst, srcBic, hNil); Restore(); pgpt->Unlock(); ReleasePpo(&pgpt); if (pvNil == (pgpt = GPT::PgptNewOffscreen(&rc, 8))) { Warn("Drawing MBMP failed"); return; } pgpt->Set(pvNil); EraseRect(&rcsSrc); pgpt->Restore(); if (pvNil != _pregnClip) _pregnClip->Offset(-ptDst.xp, -ptDst.yp); pgpt->Lock(); hpix = pgpt->_Hpix(); pmbmp->Draw((byte *)(*hpix)->baseAddr, (*hpix)->rowBytes & 0x7FFF, rc.Dyp(), prcs->left - ptDst.xp, prcs->top - ptDst.yp, &rc, _pregnClip); if (pvNil != _pregnClip) _pregnClip->Offset(ptDst.xp, ptDst.yp); Set(pgdd->prcsClip); ForeColor(blackColor); BackColor(whiteColor); CopyBits((PBMP)*hpix, (PBMP)*_Hpix(), &rcsSrc, &rcsDst, srcOr, hNil); Restore(); pgpt->Unlock(); ReleasePpo(&pgpt); } } #ifdef DEBUG /*************************************************************************** Test the validity of the port. ***************************************************************************/ void GPT::AssertValid(ulong grf) { GPT_PAR::AssertValid(0); AssertIn(_cactRef, 1, kcbMax); AssertVarMem(_pprt); AssertNilOrVarMem(_hgd); AssertNilOrVarMem(_pprtSav); AssertNilOrVarMem(_hgdSav); } /*************************************************************************** Static method to mark static GPT memory. ***************************************************************************/ void GPT::MarkStaticMem(void) { } #endif // DEBUG /*************************************************************************** Initialize the font table. ***************************************************************************/ bool NTL::FInit(void) { MenuHandle hmenu; achar st[kcbMaxSt]; short ftc; long ftcT; long cstz, istz; hmenu = NewMenu(1001, (byte *)"\pFont"); AddResMenu(hmenu, 'FONT'); cstz = CountMItems(hmenu); if ((_pgst = GST::PgstNew(size(long), cstz + 1, (cstz + 1) * 15)) == pvNil) goto LFail; for (istz = 0; istz < cstz; istz++) { GetItem(hmenu, istz + 1, (byte *)st); GetFNum((byte *)st, &ftc); ftcT = ftc; AssertDo(!_pgst->FFindSt(st, &istz, fgstUserSorted), "font already found!"); if (!_pgst->FInsertSt(istz, st, &ftcT)) goto LFail; } // add the system font GetFontName(0, (byte *)st); ftcT = 0; if (!_pgst->FFindSt(st, &_onnSystem, fgstUserSorted) && !_pgst->FInsertSt(_onnSystem, st, &ftcT)) { LFail: PushErc(ercGfxNoFontList); return fFalse; } _pgst->FEnsureSpace(0, 0, fgrpShrink); AssertThis(0); return fTrue; } /*************************************************************************** Return the system font code for this font number. ***************************************************************************/ short NTL::FtcFromOnn(long onn) { AssertThis(0); long ftc; _pgst->GetExtra(onn, &ftc); return (short)ftc; } /*************************************************************************** Return true iff the font is a fixed pitch font. ***************************************************************************/ bool NTL::FFixedPitch(long onn) { #ifdef REVIEW // shonk: implement FFixedPitch on Mac AssertThis(0); Assert(FValidOnn(onn), "bad onn"); LOGFONT lgf; _pgst->GetExtra(onn, &lgf); return (lgf.lfPitchAndFamily & 0x03) == FIXED_PITCH; #else return fFalse; #endif } /*************************************************************************** Create a new rectangular region. If prc is nil, the region will be empty. ***************************************************************************/ bool FCreateRgn(HRGN *phrgn, RC *prc) { AssertVarMem(phrgn); AssertNilOrVarMem(prc); if (pvNil == (*phrgn = NewRgn())) return fFalse; if (pvNil != prc && !prc->FEmpty()) { RCS rcs = *prc; RectRgn(*phrgn, &rcs); } return fTrue; } /*************************************************************************** Free the region and set *phrgn to nil. ***************************************************************************/ void FreePhrgn(HRGN *phrgn) { AssertVarMem(phrgn); if (*phrgn != hNil) { DisposeRgn(*phrgn); *phrgn = hNil; } } /*************************************************************************** Make the region rectangular. If prc is nil, the region will be empty. If *phrgn is hNil, creates the region. *phrgn may change even if *phrgn is not nil. ***************************************************************************/ bool FSetRectRgn(HRGN *phrgn, RC *prc) { AssertVarMem(phrgn); AssertNilOrVarMem(prc); if (hNil == *phrgn) return FCreateRgn(phrgn, prc); if (pvNil == prc) SetEmptyRgn(*phrgn); else { RCS rcs = *prc; RectRgn(*phrgn, &rcs); } return fTrue; } /*************************************************************************** Put the union of hrgnSrc1 and hrgnSrc2 into hrgnDst. The parameters need not be distinct. Returns success/failure. ***************************************************************************/ bool FUnionRgn(HRGN hrgnDst, HRGN hrgnSrc1, HRGN hrgnSrc2) { Assert(hNil != hrgnDst, "null dst"); Assert(hNil != hrgnSrc1, "null src1"); Assert(hNil != hrgnSrc2, "null src2"); UnionRgn(hrgnSrc1, hrgnSrc2, hrgnDst); return QDError() == noErr; } /*************************************************************************** Put the intersection of hrgnSrc1 and hrgnSrc2 into hrgnDst. The parameters need not be distinct. Returns success/failure. ***************************************************************************/ bool FIntersectRgn(HRGN hrgnDst, HRGN hrgnSrc1, HRGN hrgnSrc2, bool *pfEmpty) { Assert(hNil != hrgnDst, "null dst"); Assert(hNil != hrgnSrc1, "null src1"); Assert(hNil != hrgnSrc2, "null src2"); SectRgn(hrgnSrc1, hrgnSrc2, hrgnDst); if (pvNil != pfEmpty) *pfEmpty = EmptyRgn(hrgnDst); return QDError() == noErr; } /*************************************************************************** Put hrgnSrc - hrgnSrcSub into hrgnDst. The parameters need not be distinct. Returns success/failure. ***************************************************************************/ bool FDiffRgn(HRGN hrgnDst, HRGN hrgnSrc, HRGN hrgnSrcSub) { Assert(hNil != hrgnDst, "null dst"); Assert(hNil != hrgnSrc, "null src"); Assert(hNil != hrgnSrcSub, "null srcSub"); DiffRgn(hrgnSrc, hrgnSrcSub, hrgnDst); return QDError() == noErr; } /*************************************************************************** Determine if the region is rectangular and put the bounding rectangle in *prc (if not nil). ***************************************************************************/ bool FRectRgn(HRGN hrgn, RC *prc) { Assert(hNil != hrgn, "null rgn"); Assert((*hrgn)->rgnSize >= 10, "bad region"); if (pvNil != prc) { RCS rcs = (*hrgn)->rgnBBox; *prc = rcs; } return (*hrgn)->rgnSize == 10; } /*************************************************************************** Return true iff the region is empty. ***************************************************************************/ bool FEmptyRgn(HRGN hrgn, RC *prc) { Assert(hNil != hrgn, "null rgn"); if (pvNil != prc) { RCS rcs = (*hrgn)->rgnBBox; *prc = rcs; } return EmptyRgn(hrgn); } /*************************************************************************** Return true iff the two regions are equal. ***************************************************************************/ bool FEqualRgn(HRGN hrgn1, HRGN hrgn2) { Assert(hNil != hrgn1, "null rgn1"); Assert(hNil != hrgn2, "null rgn2"); return EqualRgn(hrgn1, hrgn2); } ================================================ FILE: kauai/src/gfxwin.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Windows specific graphics routines. ***************************************************************************/ #include "frame.h" ASSERTNAME const SCR kscrBlack = PALETTERGB(0, 0, 0); const SCR kscrWhite = PALETTERGB(0xFF, 0xFF, 0xFF); HPAL GPT::_hpal = hNil; HPAL GPT::_hpalIdentity = hNil; long GPT::_cclrPal = 0; CLR *GPT::_prgclr = pvNil; long GPT::_cactPalCur = 0; long GPT::_cactFlush = 1; bool GPT::_fPalettized = fFalse; #ifdef DEBUG bool GPT::_fFlushGdi; #define _Flush() \ if (_fFlushGdi) \ Flush(); \ else \ _cactDraw = _cactFlush #else #define _Flush() _cactDraw = _cactFlush #endif // DEBUG HRGN _HrgnNew(RCS *prcs, bool fOval); /*************************************************************************** Creates a rectangular or oval region according to fOval. ***************************************************************************/ HRGN _HrgnNew(RCS *prcs, long dxpInset, long dypInset, bool fOval) { AssertVarMem(prcs); return fOval ? CreateEllipticRgn(prcs->left + dxpInset, prcs->top + dypInset, prcs->right - dxpInset, prcs->bottom - dypInset) : CreateRectRgn(prcs->left + dxpInset, prcs->top + dypInset, prcs->right - dxpInset, prcs->bottom - dypInset); } /*************************************************************************** Get a system color from the abstract color. ***************************************************************************/ SCR ACR::_Scr(void) { AssertThis(facrRgb | facrIndex); return B3Lw(_lu) == kbIndexAcr ? PALETTEINDEX(B0Lw(_lu)) : PALETTERGB(B2Lw(_lu), B1Lw(_lu), B0Lw(_lu)); } /*************************************************************************** Draw a DIB using DrawDibDraw. ***************************************************************************/ void GNV::DrawDib(HDRAWDIB hdd, BITMAPINFOHEADER *pbi, RC *prc) { AssertThis(0); AssertVarMem(pbi); AssertVarMem(prc); RCS rcs; if (!_FMapRcRcs(prc, &rcs)) return; _pgpt->DrawDib(hdd, pbi, &rcs, &_gdd); } /*************************************************************************** Static method to flush any pending graphics operations. ***************************************************************************/ void GPT::Flush(void) { GdiFlush(); _cactFlush++; } /*************************************************************************** These are the standard windows static colors. We use these on non-palettized displays. ***************************************************************************/ static PALETTEENTRY _rgpe[20] = { {0, 0, 0, 0}, {0x80, 0, 0, 0}, {0, 0x80, 0, 0}, {0x80, 0x80, 0, 0}, {0, 0, 0x80, 0}, {0x80, 0, 0x80, 0}, {0, 0x80, 0x80, 0}, {0xC0, 0xC0, 0xC0, 0}, {0xC0, 0xDC, 0xC0, 0}, {0xA6, 0xCA, 0xF0, 0}, {0xFF, 0xFB, 0xF0, 0}, {0xA0, 0xA0, 0xA4, 0}, {0x80, 0x80, 0x80, 0}, {0xFF, 0, 0, 0}, {0, 0xFF, 0, 0}, {0xFF, 0xFF, 0, 0}, {0, 0, 0xFF, 0}, {0xFF, 0, 0xFF, 0}, {0, 0xFF, 0xFF, 0}, {0xFF, 0xFF, 0xFF, 0}, }; /*************************************************************************** Static method to set the current color table. While using fpalIdentity the following cautions apply: 1) The following indexes are reserved by the system, so shouldn't be used: { 0, 1, 3, 15, 255 } (Mac) { 0 - 9; 246 - 255 } (Win). 2) While we're in the background, RGB values may get mapped to the wrong indexes, so the colors will change when we move to the foreground. The solution is to always use indexed based color while using fpalIdentity. 3) This should only be called when we are the foreground app. fpalInitAnim makes all non-reserved colors animatable. fpalAnimate means animate the palette with the new colors, don't do a normal palette set. ***************************************************************************/ void GPT::SetActiveColors(PGL pglclr, ulong grfpal) { AssertNilOrPo(pglclr, 0); Assert(pvNil == pglclr || pglclr->CbEntry() == size(CLR), "wrong CbEntry"); byte rgb[size(LOGPALETTE) + 256 * size(PALETTEENTRY)]; LOGPALETTE *ppal = (LOGPALETTE *)rgb; PALETTEENTRY pe; long ipe, ipeLim; long cclr; CLR clr; byte rgbT[256 / 8]; if (pvNil == _prgclr) { if (hNil == vwig.hdcApp) { Bug("Setting palette before vwig.hdcApp is set"); return; } if (!FAllocPv((void **)&_prgclr, LwMul(256, size(CLR)), fmemNil, mprNormal)) { PushErc(ercGfxCantSetPalette); return; } _fPalettized = FPure(GetDeviceCaps(vwig.hdcApp, RASTERCAPS) & RC_PALETTE); } if (grfpal & fpalInitAnim) grfpal &= ~fpalAnimate; ppal->palVersion = 0x0300; if (hNil == _hpal && _fPalettized) { grfpal &= ~fpalAnimate; // hack to make sure we don't share index space with a small palette // see the MSDN article "The Palette Manager: How and Why" pe.peRed = pe.peGreen = pe.peBlue = 0; pe.peFlags = PC_NOCOLLAPSE; for (ipe = 0; ipe < 256; ipe++) ppal->palPalEntry[ipe] = pe; ppal->palNumEntries = 256; if (hNil == (_hpal = CreatePalette(ppal))) { PushErc(ercGfxCantSetPalette); return; } SelectPalette(vwig.hdcApp, _hpal, fTrue); RealizePalette(vwig.hdcApp); _cclrPal = 256; } // need to resize the palette and fill in the entries if (pglclr == pvNil || 0 == (cclr = LwMin(pglclr->IvMac(), 256))) { if (grfpal & fpalAnimate) return; if (!_fPalettized) { _cclrPal = 0; goto LDone; } if (_cclrPal > 0) { GetSystemPaletteEntries(vwig.hdcApp, 0, 1, ppal->palPalEntry); SetPaletteEntries(_hpal, 0, 1, ppal->palPalEntry); AssertDo(ResizePalette(_hpal, 1), "shrinking palette failed"); _cclrPal = 0; } SelectPalette(vwig.hdcApp, _hpal, fFalse); RealizePalette(vwig.hdcApp); goto LDone; } if (grfpal & fpalAnimate) cclr = LwMin(cclr, _cclrPal); else if (cclr > _cclrPal && _fPalettized && !ResizePalette(_hpal, cclr)) { PushErc(ercGfxCantSetPalette); return; } ClearPb(rgbT, size(rgbT)); if (grfpal & fpalIdentity) { // get the first 10 and last 10 system palette entries // (the static colors) if (_fPalettized) { // the screen is palettized - get them from the screen GetSystemPaletteEntries(vwig.hdcApp, 0, 10, ppal->palPalEntry); GetSystemPaletteEntries(vwig.hdcApp, 246, 10, ppal->palPalEntry + 246); } else { // the screen is non-palettized - get the standard colors. Assert(size(_rgpe[0]) == size(ppal->palPalEntry[0]), 0); CopyPb(_rgpe, ppal->palPalEntry, 10 * size(_rgpe[0])); CopyPb(_rgpe + 10, ppal->palPalEntry + 246, 10 * size(_rgpe[0])); } clr.bZero = 0; for (ipe = 0; ipe < 256; ipe++) { if (ipe == 10) ipe = 246; pe = ppal->palPalEntry[ipe]; clr.bRed = pe.peRed; clr.bGreen = pe.peGreen; clr.bBlue = pe.peBlue; _prgclr[ipe] = clr; rgbT[IbFromIbit(pe.peRed)] |= Fbit(pe.peRed); } } pe.peFlags = (grfpal & (fpalInitAnim | fpalAnimate)) ? PC_RESERVED : PC_NOCOLLAPSE; ipeLim = LwMin(cclr, 246); for (ipe = 10; ipe < ipeLim; ipe++) { pglclr->Get(ipe, &clr); clr.bZero = 0; if (rgbT[IbFromIbit(clr.bRed)] & Fbit(clr.bRed)) { // have to tweak the red component while (clr.bRed > 0 && (rgbT[IbFromIbit(clr.bRed)] & Fbit(clr.bRed))) clr.bRed--; while (rgbT[IbFromIbit(clr.bRed)] & Fbit(clr.bRed)) clr.bRed++; } _prgclr[ipe] = clr; pe.peRed = clr.bRed; pe.peGreen = clr.bGreen; pe.peBlue = clr.bBlue; ppal->palPalEntry[ipe] = pe; } if (_fPalettized) { if (grfpal & fpalAnimate) { // starting at 10 and doing LwMin(cclr - 10, 236) is necessary // to work around a stupid GDI bug. AnimatePalette(_hpal, 10, LwMin(cclr - 10, 236), ppal->palPalEntry + 10); } else { SetPaletteEntries(_hpal, 0, cclr, ppal->palPalEntry); if (cclr < _cclrPal) AssertDo(ResizePalette(_hpal, cclr), "Shrinking palette failed"); _cclrPal = cclr; SelectPalette(vwig.hdcApp, _hpal, fFalse); RealizePalette(vwig.hdcApp); } } else _cclrPal = cclr; LDone: _cactPalCur++; vcactRealize++; } /*************************************************************************** Static method to create a new pglclr containing the current palette. ***************************************************************************/ PGL GPT::PglclrGetPalette(void) { PGL pglclr; if (pvNil == (pglclr = GL::PglNew(size(CLR), _cclrPal))) return pvNil; AssertDo(pglclr->FSetIvMac(_cclrPal), 0); CopyPb(_prgclr, pglclr->QvGet(0), LwMul(size(CLR), _cclrPal)); return pglclr; } /*************************************************************************** We've gotten a WM_QUERYNEWPALETTE or WM_PALETTECHANGED message, so select and realize our palette. ***************************************************************************/ long GPT::CclrSetPalette(HWND hwnd, bool fInval) { HDC hdc; long lwRet; vcactRealize++; if (hNil == _hpal) return 0; hdc = GetDC(hwnd); SelectPalette(hdc, _hpal, fFalse); if ((lwRet = RealizePalette(hdc)) > 0 && fInval) { HWND hwndT, hwndT2; for (hwndT = hwnd;;) { InvalidateRect(hwndT, pvNil, fFalse); if (hNil != (hwndT2 = GetWindow(hwndT, GW_CHILD))) { hwndT = hwndT2; continue; } while (hwndT != hwnd && hNil == (hwndT2 = GetWindow(hwndT, GW_HWNDNEXT))) { hwndT = GetParent(hwndT); if (hwndT == hNil) { Bug("why doesn't the window have a parent?"); break; } } if (hwndT == hwnd || hwndT == hNil) break; hwndT = hwndT2; } } ReleaseDC(hwnd, hdc); return lwRet; } /*************************************************************************** Static method to create a new GPT for an HDC. ***************************************************************************/ PGPT GPT::PgptNew(HDC hdc) { Assert(hNil != hdc, "Null hdc"); PGPT pgpt; if (hNil == hdc || pvNil == (pgpt = NewObj GPT)) return pvNil; if (!pgpt->_FInit(hdc)) ReleasePpo(&pgpt); AssertNilOrPo(pgpt, 0); return pgpt; } /*************************************************************************** Static method to create a new GPT for a window. ***************************************************************************/ PGPT GPT::PgptNewHwnd(HWND hwnd) { Assert(hNil != hwnd, "Null hwnd"); HDC hdc; PGPT pgpt; if (hNil == hwnd || hNil == (hdc = GetDC(hwnd))) { PushErc(ercOomGdi); return pvNil; } if (pvNil == (pgpt = PgptNew(hdc))) { ReleaseDC(hwnd, hdc); return pvNil; } pgpt->_hwnd = hwnd; AssertPo(pgpt, 0); return pgpt; } /*************************************************************************** Initialize the GPT. ***************************************************************************/ bool GPT::_FInit(HDC hdc) { Assert(hNil != hdc, "Null hdc"); HPEN hpen; HBRUSH hbr; HFONT hfnt; HGDIOBJ hobj; _hdc = hdc; hpen = (HPEN)GetStockObject(NULL_PEN); Assert(hpen != hNil, "GetStockObject(NULL_PEN) failed"); if (hNil != (hobj = SelectObject(_hdc, hpen))) DeleteObject(hobj); hbr = (HBRUSH)GetStockObject(WHITE_BRUSH); Assert(hbr != hNil, "GetStockObject(WHITE_BRUSH) failed"); if (hNil != (hobj = SelectObject(_hdc, hbr))) DeleteObject(hobj); hfnt = (HFONT)GetStockObject(SYSTEM_FONT); Assert(hfnt != hNil, "GetStockObject(SYSTEM_FONT) failed"); if (hNil != (hobj = SelectObject(_hdc, hfnt))) DeleteObject(hobj); _dsf.tah = tahLim; _dsf.tav = tavLim; _rcClip.Max(); SelectClipRgn(_hdc, hNil); SetPolyFillMode(_hdc, WINDING); AssertThis(0); return fTrue; } /*************************************************************************** Destructor for a port. ***************************************************************************/ GPT::~GPT(void) { Assert(_cactLock == 0, "pixels are still locked!"); if (_fMetaFile) { if (hNil != _hdc) { HPIC hpic; hpic = CloseEnhMetaFile(_hdc); if (hNil != hpic) DeleteEnhMetaFile(hpic); } goto LDeleteObjects; } if (hNil != _hbmp) { DeleteDC(_hdc); DeleteObject(_hbmp); LDeleteObjects: if (hNil != _hbr) DeleteObject(_hbr); if (hNil != _hfnt) DeleteObject(_hfnt); } else if (hNil != _hwnd) ReleaseDC(_hwnd, _hdc); ReleasePpo(&_pregnClip); } /*************************************************************************** Get the system color for this abstract color. ***************************************************************************/ SCR GPT::_Scr(ACR acr) { SCR scr; long iclr; CLR clr; if (!_fMapIndices && _fPalettized) return acr._Scr(); scr = acr._Scr(); if (B3Lw(scr) != 1 || pvNil == _prgclr) return scr; iclr = SwLow(scr); if (!FIn(iclr, 0, _cclrPal)) return scr; clr = _prgclr[iclr]; return RGB(clr.bRed, clr.bGreen, clr.bBlue); } /*************************************************************************** Static method to create an offscreen port. ***************************************************************************/ PGPT GPT::PgptNewOffscreen(RC *prc, long cbitPixel) { AssertVarMem(prc); Assert(!prc->FEmpty(), "empty rectangle for offscreen"); PGPT pgpt; HDC hdc, hdcT; HBMP hbmp, hbmpOld; BITMAPINFO *pbmi; long cclr, cbRow, lwUsage; void *pvBits; // assert that cbitPixel is in {1,4,8,16,24,32} AssertIn(cbitPixel, 1, 33); AssertVar(cbitPixel == 32 || (1L << cbitPixel) & 0x01010112, "bad cbitPixel value", &cbitPixel); hdc = CreateCompatibleDC(vwig.hdcApp); if (hNil == hdc) return pvNil; if (cbitPixel > 8) cclr = 0; else cclr = 1L << cbitPixel; // the three longs are for 16 and 32 bit dibs. if (!FAllocPv((void **)&pbmi, size(BITMAPINFO) + LwMul(cclr, LwMax(size(short), size(RGBQUAD))) + LwMul(3, size(long)), fmemClear, mprNormal)) { goto LFail; } pbmi->bmiHeader.biSize = size(BITMAPINFOHEADER); pbmi->bmiHeader.biWidth = prc->Dxp(); pbmi->bmiHeader.biHeight = -prc->Dyp(); pbmi->bmiHeader.biPlanes = 1; pbmi->bmiHeader.biBitCount = (short)cbitPixel; pbmi->bmiHeader.biCompression = (cbitPixel == 16 || cbitPixel == 32) ? BI_BITFIELDS : BI_RGB; cbRow = LwRoundAway(LwMulDivAway(prc->Dxp(), cbitPixel, 8), size(long)); pbmi->bmiHeader.biSizeImage = LwMul(prc->Dyp(), cbRow); pbmi->bmiHeader.biXPelsPerMeter = 0; pbmi->bmiHeader.biYPelsPerMeter = 0; pbmi->bmiHeader.biClrUsed = cclr; pbmi->bmiHeader.biClrImportant = 0; lwUsage = DIB_RGB_COLORS; if (cclr == 0) { long *plw = (long *)&pbmi->bmiColors; // set the masks if (cbitPixel == 16) { *plw++ = 0x7C00; *plw++ = 0x03E0; *plw++ = 0x001F; } else if (cbitPixel == 32) { *plw++ = 0x00FF0000; *plw++ = 0x0000FF00; *plw++ = 0x000000FF; } } else if (cclr == 2) { pbmi->bmiColors[1].rgbBlue = 0xFF; pbmi->bmiColors[1].rgbGreen = 0xFF; pbmi->bmiColors[1].rgbRed = 0xFF; } else { if (_hpalIdentity == hNil) { LOGPALETTE *ppal; PALETTEENTRY pe; long ipe; if (!FAllocPv((void **)&ppal, size(LOGPALETTE) + 256 * size(PALETTEENTRY), fmemNil, mprNormal)) { FreePpv((void **)&pbmi); goto LFail; } ppal->palVersion = 0x0300; pe.peRed = pe.peGreen = pe.peBlue = 0; pe.peFlags = PC_EXPLICIT; for (ipe = 0; ipe < 256; ipe++) { *(short *)&pe = (short)ipe; ppal->palPalEntry[ipe] = pe; } ppal->palNumEntries = 256; _hpalIdentity = CreatePalette(ppal); FreePpv((void **)&ppal); if (_hpalIdentity == hNil) { FreePpv((void **)&pbmi); goto LFail; } } if (_prgclr != pvNil) { CopyPb(_prgclr, pbmi->bmiColors, LwMul(LwMin(cclr, _cclrPal), size(RGBQUAD))); } else { short *psw = (short *)pbmi->bmiColors; long isw; lwUsage = DIB_PAL_COLORS; for (isw = 0; isw < cclr;) *psw++ = (short)isw++; } } hdcT = GetDC(hNil); Assert(hNil != hdcT, "Failed to GetDC(hNil)"); hbmp = CreateDIBSection(hdcT, pbmi, lwUsage, &pvBits, hNil, 0); ReleaseDC(NULL, hdcT); FreePpv((void **)&pbmi); if (hNil == hbmp) goto LFail; if (pvNil == (pgpt = PgptNew(hdc))) { DeleteObject(hbmp); LFail: DeleteDC(hdc); return pvNil; } AssertDo(hbmpOld = (HBMP)SelectObject(hdc, hbmp), "cannot select bitmap"); DeleteObject(hbmpOld); pgpt->_hbmp = hbmp; pgpt->_prgbPixels = (byte *)pvBits; pgpt->_cbitPixel = cbitPixel; pgpt->_cbRow = cbRow; pgpt->_ptBase = prc->PtTopLeft(); pgpt->_rcOff = *prc; pgpt->_rcOff.OffsetToOrigin(); SelectPalette(hdc, _hpalIdentity, fFalse); RealizePalette(hdc); pgpt->_cactPal = _cactPalCur; return pgpt; } /*************************************************************************** Set the color table of an offscreen GPT. ***************************************************************************/ void GPT::SetOffscreenColors(PGL pglclr) { AssertThis(0); AssertNilOrPo(pglclr, 0); if (hNil == _hbmp) { Bug("Can't set the palette of this port!"); return; } if (pvNil == pglclr) { if (!_fOwnPalette) return; _fOwnPalette = fFalse; _cactPal = -1; // so we'll set the colors in _EnsurePalette return; } if (FIn(_cbitPixel, 2, 9)) { SetDIBColorTable(_hdc, 0, LwMin(pglclr->IvMac(), 1L << _cbitPixel), (RGBQUAD *)pglclr->PvLock(0)); pglclr->Unlock(); _fOwnPalette = fTrue; } } /*************************************************************************** If this is an offscreen bitmap, return the pointer to the pixels and optionally get the bounds. Must balance with a call to Unlock(). ***************************************************************************/ byte *GPT::PrgbLockPixels(RC *prc) { AssertThis(0); AssertNilOrVarMem(prc); if (hNil == _hbmp) return pvNil; if (_cactDraw >= _cactFlush) { Assert(_cactDraw == _cactFlush, "why is _cactDraw > _cactFlush?"); Flush(); } if (pvNil != prc) *prc = _rcOff; Lock(); return _prgbPixels; } /*************************************************************************** If this is an offscreen bitmap, return the number of bytes per row. ***************************************************************************/ long GPT::CbRow(void) { AssertThis(0); if (hNil == _hbmp) return 0; return _cbRow; } /*************************************************************************** Return the number of bits per pixel for the GPT. ***************************************************************************/ long GPT::CbitPixel(void) { AssertThis(0); if (hNil == _hbmp && 0 == _cbitPixel && (RC_PALETTE & GetDeviceCaps(_hdc, RASTERCAPS))) { _cbitPixel = GetDeviceCaps(_hdc, BITSPIXEL) * GetDeviceCaps(_hdc, PLANES); } return _cbitPixel; } /*************************************************************************** Lock the pixels if this is an offscreen bitmap. Must be balanced by a call to Unlock. ***************************************************************************/ void GPT::Lock(void) { AssertThis(0); _cactLock++; } /*************************************************************************** Unlock the pixels if this is an offscreen bitmap. ***************************************************************************/ void GPT::Unlock(void) { if (--_cactLock < 0) { Bug("Unmatched unlock call"); _cactLock = 0; } } /*************************************************************************** Static method to create a metafile dc and its an associated GPT. This should be balanced with a call to PpicRelease(). ***************************************************************************/ PGPT GPT::PgptNewPic(RC *prc) { AssertVarMem(prc); Assert(!prc->FEmpty(), "empty rectangle for metafile GPT"); PGPT pgpt; RCS rcs; HDC hdc; // NOTE: have to use nil for the rect because GDI is messed up - // the rect is supposed to be in hi-metric but the transform seems // to be totally random (scaled by approximately 129/4 in one // direction and 125/4 in the other, but this is not exact). hdc = CreateEnhMetaFile(pvNil, pvNil, pvNil /*&rcs*/, pvNil); if (hNil == hdc) return pvNil; // fill the bounding rectangle with the null brush so the metafile // is at least the given size. rcs = *prc; rcs.right++; // empirical GDI hack rcs.bottom++; FillRect(hdc, &rcs, (HBRUSH)GetStockObject(NULL_BRUSH)); if (pvNil == (pgpt = PgptNew(hdc))) { HPIC hpic; if (hNil != (hpic = CloseEnhMetaFile(hdc))) DeleteEnhMetaFile(hpic); return pvNil; } pgpt->_fMetaFile = fTrue; pgpt->_rcOff = *prc; return pgpt; } /*************************************************************************** Closes a metafile based GPT and returns the picture produced from drawing into the GPT. ***************************************************************************/ PPIC GPT::PpicRelease(void) { AssertThis(0); PPIC ppic; HPIC hpic; if (!_fMetaFile) { Bug("not a MetaFile GPT"); goto LFail; } if (hNil == _hdc) { Bug("_hdc already nil"); goto LFail; } hpic = CloseEnhMetaFile(_hdc); _hdc = hNil; if (hNil == hpic) goto LFail; if (pvNil == (ppic = PIC::PpicNew(hpic, &_rcOff))) { DeleteEnhMetaFile(hpic); LFail: Release(); return pvNil; } Release(); return ppic; } /*************************************************************************** Hilites the rectangle by inverting. ***************************************************************************/ void GPT::HiliteRcs(RCS *prcs, GDD *pgdd) { AssertThis(0); _SetClip(pgdd->prcsClip); InvertRect(_hdc, prcs); _Flush(); } /*************************************************************************** Fill/frame a rectangle with a 2-color pattern or solid color. ***************************************************************************/ void GPT::DrawRcs(RCS *prcs, GDD *pgdd) { AssertThis(0); AssertVarMem(prcs); AssertVarMem(pgdd); if (!(pgdd->grfgdd & fgddFrame) || pgdd->dxpPen * 2 >= prcs->right - prcs->left || pgdd->dypPen * 2 >= prcs->bottom - prcs->top) { // just fill it _Fill(prcs, pgdd, (PFNDRW)&GPT::_FillRcs); } else _FrameRcsOval(prcs, pgdd, fFalse); } /*************************************************************************** Fill/frame a rectangle with a 2-color pattern or solid color. ***************************************************************************/ void GPT::DrawOval(RCS *prcs, GDD *pgdd) { AssertThis(0); AssertVarMem(prcs); AssertVarMem(pgdd); if (!(pgdd->grfgdd & fgddFrame) || pgdd->dxpPen * 2 >= prcs->right - prcs->left || pgdd->dypPen * 2 >= prcs->bottom - prcs->top) { // just fill it _Fill(prcs, pgdd, (PFNDRW)&GPT::_FillOval); } else _FrameRcsOval(prcs, pgdd, fTrue); } /*************************************************************************** Frames either an RCS or an oval. Client should have already handled the case when the pen is big enough to fill the entire rcs/oval. ***************************************************************************/ void GPT::_FrameRcsOval(RCS *prcs, GDD *pgdd, bool fOval) { Assert((pgdd->grfgdd & fgddFrame) && pgdd->dxpPen * 2 < prcs->right - prcs->left && pgdd->dypPen * 2 < prcs->bottom - prcs->top, "use solid fill"); // Create a region for the area to fill. This is faster than // using a polygon. HRGN hrgnInside, hrgnOutside; if (hNil == (hrgnOutside = _HrgnNew(prcs, 0, 0, fOval))) { hrgnInside = hNil; goto LError; } if (hNil == (hrgnInside = _HrgnNew(prcs, pgdd->dxpPen, pgdd->dypPen, fOval))) goto LError; switch (CombineRgn(hrgnOutside, hrgnInside, hrgnOutside, RGN_XOR)) { default: _Fill(&hrgnOutside, pgdd, (PFNDRW)&GPT::_FillRgn); break; case NULLREGION: break; case ERROR: LError: PushErc(ercOomGdi); PushErc(ercGfxCantDraw); break; } if (hNil != hrgnInside) DeleteObject(hrgnInside); if (hNil != hrgnOutside) DeleteObject(hrgnOutside); } /*************************************************************************** Fill/frame a polygon with a 2-color pattern or solid color. ***************************************************************************/ void GPT::DrawPoly(HQ hqoly, GDD *pgdd) { AssertThis(0); AssertHq(hqoly); AssertVarMem(pgdd); _Fill(PvLockHq(hqoly), pgdd, (PFNDRW)&GPT::_FillPoly); UnlockHq(hqoly); } /*************************************************************************** Draw a line. ***************************************************************************/ void GPT::DrawLine(PTS *ppts1, PTS *ppts2, GDD *pgdd) { AssertThis(0); AssertVarMem(ppts1); AssertVarMem(ppts2); AssertVarMem(pgdd); // create an OLY to fill long dxp, dyp, dypPen; PTS *pptsDst; byte rgbOly[kcbOlyBase + 6 * size(PTS)]; OLY *poly = (OLY *)rgbOly; poly->cpts = 6; if (ppts2->x < ppts1->x) { // swap them PTS *pptsT; pptsT = ppts2; ppts2 = ppts1; ppts1 = pptsT; } Assert(ppts2->x >= ppts1->x, "points still not in order"); dxp = ppts2->x - ppts1->x; dyp = ppts2->y - ppts1->y; dypPen = pgdd->dypPen; pptsDst = poly->rgpts; *pptsDst = *ppts1; if (dyp < 0) { dypPen = -dypPen; pptsDst[1].x = pptsDst[0].x; pptsDst[1].y = pptsDst[0].y - dypPen; pptsDst++; } pptsDst[1].x = pptsDst[0].x + pgdd->dxpPen; pptsDst[1].y = pptsDst[0].y; pptsDst++; pptsDst[1].x = pptsDst[0].x + dxp; pptsDst[1].y = pptsDst[0].y + dyp; pptsDst++; pptsDst[1].x = pptsDst[0].x; pptsDst[1].y = pptsDst[0].y + dypPen; pptsDst++; pptsDst[1].x = pptsDst[0].x - pgdd->dxpPen; pptsDst[1].y = pptsDst[0].y; if (dyp >= 0) { pptsDst++; pptsDst[1].x = pptsDst[0].x - dxp; pptsDst[1].y = pptsDst[0].y - dyp; } Assert(pptsDst == &poly->rgpts[4], "wrote off end of OLY"); _Fill(poly, pgdd, (PFNDRW)&GPT::_FillPoly); } /*************************************************************************** Low level call back to fill a rectangle. Assumes the current pen is NULL and the brush is set as desired. ***************************************************************************/ void GPT::_FillRcs(RCS *prcs) { AssertVarMem(prcs); Rectangle(_hdc, prcs->left, prcs->top, prcs->right + 1, prcs->bottom + 1); _Flush(); } /*************************************************************************** Low level call back to fill an oval (ellipse). Assumes the current pen is NULL and the brush is set as desired. ***************************************************************************/ void GPT::_FillOval(RCS *prcs) { AssertVarMem(prcs); Ellipse(_hdc, prcs->left, prcs->top, prcs->right + 1, prcs->bottom + 1); _Flush(); } /*************************************************************************** Low level call back to fill a region. Assumes the current pen is NULL and the brush is set as desired. ***************************************************************************/ void GPT::_FillRgn(HRGN *phrgn) { AssertVarMem(phrgn); FillRgn(_hdc, *phrgn, _hbr); _Flush(); } /*************************************************************************** Low level call back to fill a polygon. Assumes the current pen is NULL and the brush is set as desired. ***************************************************************************/ void GPT::_FillPoly(OLY *poly) { AssertVarMem(poly); Polygon(_hdc, poly->rgpts, poly->cpts); _Flush(); } /*************************************************************************** Make sure the clipping is set to this rectangle and make sure the palette is selected. ***************************************************************************/ void GPT::_SetClip(RCS *prcsClip) { AssertNilOrVarMem(prcsClip); RC rc, rcT; if (pvNil == prcsClip) rc.Max(); else rc = RC(*prcsClip); if (_fMetaFile) { // in a metafile GPT, clip to the bounding rectangle rc.FIntersect(&_rcOff); } if (_fNewClip || rc != _rcClip) { // have to set the clipping if (_fNewClip || !_rcClip.FMax()) { // have to first set the clipping to the _pregnClip HRGN hrgn; if (pvNil == _pregnClip) SelectClipRgn(_hdc, hNil); else if (_pregnClip->FIsRc(&rcT) || hNil == (hrgn = _pregnClip->HrgnEnsure())) { rcT.FIntersect(&rc); SelectClipRgn(_hdc, hNil); IntersectClipRect(_hdc, rcT.xpLeft, rcT.ypTop, rcT.xpRight, rcT.ypBottom); _rcClip = rc; goto LClipSet; } else SelectClipRgn(_hdc, hrgn); } if (!rc.FMax()) { IntersectClipRect(_hdc, rc.xpLeft, rc.ypTop, rc.xpRight, rc.ypBottom); } LClipSet: _fNewClip = fFalse; _rcClip = rc; } _EnsurePalette(); } /*************************************************************************** Make sure the palette is set up correctly in this GPT. ***************************************************************************/ void GPT::_EnsurePalette(void) { if (_cactPal == _cactPalCur || pvNil == _prgclr) return; if (_prgbPixels != pvNil) { if (!_fOwnPalette && FIn(_cbitPixel, 2, 9)) { SetDIBColorTable(_hdc, 0, LwMin(_cclrPal, 1L << _cbitPixel), (RGBQUAD *)_prgclr); } } else if (!_fMapIndices && hNil != _hpal) { if (!SelectPalette(_hdc, _hpal, fFalse)) _fMapIndices = fTrue; else RealizePalette(_hdc); } _cactPal = _cactPalCur; } /*************************************************************************** Low level routine to fill an object with a color. ***************************************************************************/ void GPT::_Fill(void *pv, GDD *pgdd, PFNDRW pfn) { ACR acrFore; acrFore = pgdd->acrFore; _SetClip(pgdd->prcsClip); if (pgdd->grfgdd & fgddPattern) { // patterned fill ACR acrBack = pgdd->acrBack; APT apt = pgdd->apt; // check for a solid pattern if (apt.FSolidFore() || acrFore == acrBack) goto LFill; if (apt.FSolidBack()) { acrFore = acrBack; goto LFill; } Assert(acrFore != acrBack, "fore and back colors still equal!"); // Make sure we have one of these forms: // (*, *) // (clear, *) // (invert, *) // (invert, clear) if (acrBack == kacrInvert || acrBack == kacrClear && acrFore != kacrInvert) { // swap them and invert the pattern acrFore = acrBack; acrBack = pgdd->acrFore; apt.Invert(); } // set the correct brush _SetAptBrush(&apt); if (acrFore == kacrInvert) { // do (invert, clear) SetTextColor(_hdc, kscrWhite); SetBkColor(_hdc, kscrBlack); SetROP2(_hdc, R2_XORPEN); (this->*pfn)(pv); if (acrBack != kacrClear) { // need (invert, *), have already done (invert, clear) // so still need to do (clear, *) goto LClear; } } else if (acrFore == kacrClear) { LClear: // do (clear, *) SetTextColor(_hdc, kscrWhite); SetBkColor(_hdc, kscrBlack); SetROP2(_hdc, R2_MERGENOTPEN); (this->*pfn)(pv); SetBkColor(_hdc, _Scr(acrBack)); SetROP2(_hdc, R2_MASKPEN); (this->*pfn)(pv); } else { // do (*, *) SetTextColor(_hdc, _Scr(acrFore)); SetBkColor(_hdc, _Scr(acrBack)); SetROP2(_hdc, R2_COPYPEN); (this->*pfn)(pv); } } else { // solid color fill LFill: if (acrFore == kacrClear) return; // nothing to do if (acrFore == kacrInvert) { _SetStockBrush(WHITE_BRUSH); SetROP2(_hdc, R2_XORPEN); } else { _SetAcrBrush(acrFore); SetROP2(_hdc, R2_COPYPEN); } (this->*pfn)(pv); } } /*************************************************************************** Scroll a rectangle. ***************************************************************************/ void GPT::ScrollRcs(RCS *prcs, long dxp, long dyp, GDD *pgdd) { AssertThis(0); AssertVarMem(prcs); AssertVarMem(pgdd); _SetClip(pgdd->prcsClip); ScrollDC(_hdc, dxp, dyp, prcs, prcs, hNil, pvNil); _Flush(); } /*************************************************************************** Draw some text. ***************************************************************************/ void GPT::DrawRgch(achar *prgch, long cch, PTS pts, GDD *pgdd, DSF *pdsf) { AssertThis(0); AssertIn(cch, 0, kcbMax); AssertPvCb(prgch, cch); AssertVarMem(pgdd); AssertPo(pdsf, 0); ACR acrFore, acrBack; RCS rcs; _SetClip(pgdd->prcsClip); acrBack = pgdd->acrBack; if (acrBack == kacrInvert || (pdsf->grfont & fontBoxed) || pdsf->tav == tavCenter) { // GetRcsFromRgch calls _SetTextProps, so we don't need to here GetRcsFromRgch(&rcs, prgch, cch, pts, pdsf); if (acrBack == kacrInvert) { GDD gdd = *pgdd; acrBack = kacrClear; gdd.grfgdd = fgddFill; gdd.acrFore = kacrInvert; DrawRcs(&rcs, &gdd); } } else _SetTextProps(pdsf); if (acrBack == kacrClear) SetBkMode(_hdc, TRANSPARENT); else { SetBkMode(_hdc, OPAQUE); SetBkColor(_hdc, _Scr(acrBack)); } if (pgdd->acrFore == kacrClear || pgdd->acrFore == kacrInvert) { BugVar("Unsupported DrawRgch() foreground color", &pgdd->acrFore); acrFore = kacrBlack; } else acrFore = pgdd->acrFore; SetTextColor(_hdc, _Scr(acrFore)); // Windows won't vertically center via text alignment flags, so we need // to do it ourselves. if (pdsf->tav == tavCenter) pts.y = rcs.top; TextOut(_hdc, pts.x, pts.y, prgch, cch); _Flush(); if (pdsf->grfont & fontBoxed) { GDD gdd = *pgdd; gdd.dxpPen = gdd.dypPen = 1; gdd.grfgdd = fgddFrame | fgddPattern; gdd.apt = vaptGray; gdd.apt.MoveOrigin(-_ptBase.xp, -_ptBase.yp); gdd.acrBack = kacrClear; DrawRcs(&rcs, &gdd); } } /*************************************************************************** Get the bounding text rectangle. ***************************************************************************/ void GPT::GetRcsFromRgch(RCS *prcs, achar *prgch, long cch, PTS pts, DSF *pdsf) { AssertThis(0); AssertVarMem(prcs); AssertIn(cch, 0, kcbMax); AssertPvCb(prgch, cch); AssertPo(pdsf, 0); SIZE dpt; TEXTMETRIC txm; long dxp, dyp; _SetTextProps(pdsf); GetTextMetrics(_hdc, &txm); txm.tmHeight += txm.tmExternalLeading; GetTextExtentPoint32(_hdc, prgch, cch, &dpt); switch (pdsf->tav) { default: BugVar("bogus vertical alignment", &pdsf->tav); // Fall through. case tavTop: dyp = 0; break; case tavCenter: dyp = -(txm.tmHeight / 2); break; case tavBaseline: dyp = -txm.tmAscent; break; case tavBottom: dyp = -txm.tmHeight; break; } switch (pdsf->tah) { default: BugVar("bogus horizontal alignment", &pdsf->tah); // Fall through. case tahLeft: dxp = 0; break; case tahCenter: dxp = -dpt.cx / 2; break; case tahRight: dxp = -dpt.cx; break; } prcs->left = pts.x + dxp; prcs->right = pts.x + dpt.cx + dxp; prcs->top = pts.y + dyp; prcs->bottom = pts.y + txm.tmHeight + dyp; } /*************************************************************************** Select a monochrome patterned brush corresponding to the APT. ***************************************************************************/ void GPT::_SetAptBrush(APT *papt) { AssertVarMem(papt); short rgw[8]; long iw; HBRUSH hbr; HBITMAP hbmp; if (_bk == bkApt && _apt == *papt) return; // create and select the brush for (iw = 0; iw < 8; iw++) rgw[iw] = ~papt->rgb[iw]; if (hNil == (hbmp = CreateBitmap(8, 8, 1, 1, rgw))) goto LError; hbr = CreatePatternBrush(hbmp); DeleteObject(hbmp); if (hNil == hbr) goto LError; if (!SelectObject(_hdc, hbr)) { DeleteObject(hbr); LError: PushErc(ercOomGdi); return; } if (hNil != _hbr) DeleteObject(_hbr); _hbr = hbr; _bk = bkApt; _apt = *papt; } /*************************************************************************** Select a solid brush corresponding to the acr. ***************************************************************************/ void GPT::_SetAcrBrush(ACR acr) { HBRUSH hbr; if (_bk == bkAcr && _acr == acr) return; if (hNil == (hbr = CreateSolidBrush(_Scr(acr)))) goto LError; if (!SelectObject(_hdc, hbr)) { DeleteObject(hbr); LError: PushErc(ercOomGdi); return; } if (hNil != _hbr) DeleteObject(_hbr); _hbr = hbr; _bk = bkAcr; _acr = acr; } /*************************************************************************** Select a stock brush. ***************************************************************************/ void GPT::_SetStockBrush(int wType) { HBRUSH hbr; if (_bk == bkStock && _wType == wType) return; if (hNil == (hbr = (HBRUSH)GetStockObject(wType))) goto LError; if (!SelectObject(_hdc, hbr)) { DeleteObject(hbr); LError: PushErc(ercOomGdi); return; } if (hNil != _hbr) DeleteObject(_hbr); _hbr = hbr; _bk = bkStock; _wType = wType; } /*************************************************************************** Select a font corresponding to the DSF. Also, set the alignment as specified in the DSF. ***************************************************************************/ void GPT::_SetTextProps(DSF *pdsf) { AssertPo(pdsf, 0); static int _mptahw[] = { TA_LEFT, // tahLeft TA_CENTER, // tahCenter TA_RIGHT // tahRight }; static _mptavw[] = { TA_TOP, // tavTop TA_TOP, // tavCenter + code TA_BASELINE, // tavBaseline TA_BOTTOM // tavBottom }; HFONT hfnt; if (_hfnt != hNil && pdsf->onn == _dsf.onn && pdsf->grfont == _dsf.grfont && pdsf->dyp == _dsf.dyp) { goto LSetAlignment; } if (hNil == (hfnt = vntl.HfntCreate(pdsf))) goto LError; if (!SelectObject(_hdc, hfnt)) { DeleteObject(hfnt); LError: PushErc(ercGfxCantSetFont); return; } if (hNil != _hfnt) DeleteObject(_hfnt); _hfnt = hfnt; _dsf.onn = pdsf->onn; _dsf.grfont = pdsf->grfont; _dsf.dyp = pdsf->dyp; LSetAlignment: // Set the text alignment. if (pdsf->tav != _dsf.tav || pdsf->tah != _dsf.tah) { SetTextAlign(_hdc, _mptahw[pdsf->tah] | _mptavw[pdsf->tav]); _dsf.tah = pdsf->tah; _dsf.tav = pdsf->tav; } } /*************************************************************************** Copy bits from pgptSrc to this GPT. ***************************************************************************/ void GPT::CopyPixels(PGPT pgptSrc, RCS *prcsSrc, RCS *prcsDst, GDD *pgdd) { AssertThis(0); AssertPo(pgptSrc, 0); AssertVarMem(prcsSrc); AssertVarMem(prcsDst); AssertVarMem(pgdd); long dxpSrc, dxpDst; // see if we're doing an offscreen (2x, 2x) stretch or (1x, 2x) stretch - // optimize for these if (pgptSrc->_cbitPixel == 8 && _cbitPixel == 8 && ((dxpSrc = prcsSrc->right - prcsSrc->left) == (dxpDst = prcsDst->right - prcsDst->left) || 2 * dxpSrc == dxpDst) && 2 * (prcsSrc->bottom - prcsSrc->top) == prcsDst->bottom - prcsDst->top && !pgptSrc->_fOwnPalette && !_fOwnPalette) { RC rcClip; RC rcDouble(*prcsDst); RC rcSrc(*prcsSrc); if (!rcSrc.FIntersect(&pgptSrc->_rcOff)) return; if (dxpSrc == dxpDst) { rcDouble.xpLeft += rcSrc.xpLeft - prcsSrc->left; rcDouble.xpRight += rcSrc.xpRight - prcsSrc->right; } else { rcDouble.xpLeft += 2 * (rcSrc.xpLeft - prcsSrc->left); rcDouble.xpRight += 2 * (rcSrc.xpRight - prcsSrc->right); } rcDouble.ypTop += 2 * (rcSrc.ypTop - prcsSrc->top); rcDouble.ypBottom += 2 * (rcSrc.ypBottom - prcsSrc->bottom); if (pvNil != pgdd->prcsClip) { rcClip = *pgdd->prcsClip; if (!rcClip.FIntersect(&rcDouble)) return; } else rcClip = rcDouble; if (_cactDraw >= _cactFlush || pgptSrc->_cactDraw >= _cactFlush) Flush(); if (dxpSrc == dxpDst) { DoubleVertStretch(pgptSrc->_prgbPixels, pgptSrc->_cbRow, pgptSrc->_rcOff.Dyp(), &rcSrc, _prgbPixels, _cbRow, _rcOff.Dyp(), prcsDst->left, prcsDst->top, &rcClip, _pregnClip); } else { DoubleStretch(pgptSrc->_prgbPixels, pgptSrc->_cbRow, pgptSrc->_rcOff.Dyp(), &rcSrc, _prgbPixels, _cbRow, _rcOff.Dyp(), prcsDst->left, prcsDst->top, &rcClip, _pregnClip); } return; } // see if we're doing an offscreen double vertical stretch, ie 2x in the // vertical direction, 1x in horizontal - optimize for this if (pgptSrc->_cbitPixel == 8 && _cbitPixel == 8 && 2 * (prcsSrc->right - prcsSrc->left) == prcsDst->right - prcsDst->left && 2 * (prcsSrc->bottom - prcsSrc->top) == prcsDst->bottom - prcsDst->top && !pgptSrc->_fOwnPalette && !_fOwnPalette) { RC rcClip; RC rcDouble(*prcsDst); RC rcSrc(*prcsSrc); if (!rcSrc.FIntersect(&pgptSrc->_rcOff)) return; rcDouble.xpLeft += 2 * (rcSrc.xpLeft - prcsSrc->left); rcDouble.ypTop += 2 * (rcSrc.ypTop - prcsSrc->top); rcDouble.xpRight += 2 * (rcSrc.xpRight - prcsSrc->right); rcDouble.ypBottom += 2 * (rcSrc.ypBottom - prcsSrc->bottom); if (pvNil != pgdd->prcsClip) { rcClip = *pgdd->prcsClip; if (!rcClip.FIntersect(&rcDouble)) return; } else rcClip = rcDouble; if (_cactDraw >= _cactFlush || pgptSrc->_cactDraw >= _cactFlush) Flush(); DoubleStretch(pgptSrc->_prgbPixels, pgptSrc->_cbRow, pgptSrc->_rcOff.Dyp(), &rcSrc, _prgbPixels, _cbRow, _rcOff.Dyp(), prcsDst->left, prcsDst->top, &rcClip, _pregnClip); return; } SetTextColor(_hdc, kscrWhite); SetBkColor(_hdc, kscrBlack); _SetClip(pgdd->prcsClip); pgptSrc->_EnsurePalette(); SetStretchBltMode(_hdc, COLORONCOLOR); StretchBlt(_hdc, prcsDst->left, prcsDst->top, prcsDst->right - prcsDst->left, prcsDst->bottom - prcsDst->top, pgptSrc->_hdc, prcsSrc->left, prcsSrc->top, prcsSrc->right - prcsSrc->left, prcsSrc->bottom - prcsSrc->top, SRCCOPY); // we need to set the source's _cactDraw to _cactFlush because its bits // are referenced in the GDI queue until a flush occurs - so if we // write over them, the wrong stuff gets blasted to the destination. pgptSrc->_cactDraw = _cactFlush; _Flush(); } /*************************************************************************** Draw the picture in the given rectangle. ***************************************************************************/ void GPT::DrawPic(PPIC ppic, RCS *prcs, GDD *pgdd) { AssertThis(0); AssertPo(ppic, 0); AssertVarMem(prcs); AssertVarMem(pgdd); int wLevel; _SetClip(pgdd->prcsClip); if ((wLevel = SaveDC(_hdc)) == 0) { PushErc(ercGfxCantDraw); return; } PlayEnhMetaFile(_hdc, ppic->Hpic(), prcs); RestoreDC(_hdc, wLevel); _Flush(); } /*************************************************************************** Draw the masked bitmap in the given rectangle. pgdd->prcsClip is the clipping rectangle. ***************************************************************************/ void GPT::DrawMbmp(PMBMP pmbmp, RCS *prcs, GDD *pgdd) { AssertThis(0); AssertPo(pmbmp, 0); AssertVarMem(prcs); AssertVarMem(pgdd); RC rcSrc, rcDst, rcClip; rcDst = *prcs; if (pvNil != pgdd->prcsClip) { rcClip = *pgdd->prcsClip; if (!rcClip.FIntersect(&rcDst)) return; } else rcClip = rcDst; pmbmp->GetRc(&rcSrc); if (rcSrc.FEmpty()) return; if (_cbitPixel == 8 && rcSrc.Dxp() == rcDst.Dxp() && rcSrc.Dyp() == rcDst.Dyp()) { Assert(_hbmp != hNil, 0); Assert(_rcOff.xpLeft == 0 && _rcOff.ypTop == 0, "bad _rcOff"); if (!rcClip.FIntersect(&_rcOff)) return; if (_cactDraw >= _cactFlush) { Assert(_cactDraw == _cactFlush, "why is _cactDraw > _cactFlush?"); Flush(); } pmbmp->Draw(_prgbPixels, _cbRow, _rcOff.Dyp(), rcDst.xpLeft - rcSrc.xpLeft, rcDst.ypTop - rcSrc.ypTop, &rcClip, _pregnClip); } else { // need to create a temporary offscreen GPT for the Mask, set the Mask // area to white in this GPT, then create an offscreen GPT for the // actual MBMP graphic, then blt to this GPT. PT ptSrc; PGPT pgpt; SetTextColor(_hdc, kscrWhite); SetBkColor(_hdc, kscrBlack); ptSrc = rcSrc.PtTopLeft(); rcSrc.OffsetToOrigin(); if (pvNil == (pgpt = GPT::PgptNewOffscreen(&rcSrc, 1))) { Warn("Drawing MBMP failed"); return; } Assert(pgpt->_rcOff == rcSrc, 0); pmbmp->DrawMask(pgpt->_prgbPixels, pgpt->_cbRow, rcSrc.Dyp(), -ptSrc.xp, -ptSrc.yp, &rcSrc); // set the mask bits to white _SetClip(pgdd->prcsClip); StretchBlt(_hdc, rcDst.xpLeft, rcDst.ypTop, rcDst.Dxp(), rcDst.Dyp(), pgpt->_hdc, 0, 0, rcSrc.Dxp(), rcSrc.Dyp(), SRCPAINT); ReleasePpo(&pgpt); if (pvNil == (pgpt = GPT::PgptNewOffscreen(&rcSrc, 8))) { Warn("Drawing MBMP failed"); return; } RCS rcs = rcSrc; FillRect(pgpt->_hdc, &rcs, (HBRUSH)GetStockObject(WHITE_BRUSH)); Flush(); pmbmp->Draw(pgpt->_prgbPixels, pgpt->_cbRow, rcSrc.Dyp(), -ptSrc.xp, -ptSrc.yp, &rcSrc); StretchBlt(_hdc, rcDst.xpLeft, rcDst.ypTop, rcDst.Dxp(), rcDst.Dyp(), pgpt->_hdc, 0, 0, rcSrc.Dxp(), rcSrc.Dyp(), SRCAND); ReleasePpo(&pgpt); } } /*************************************************************************** Draw a dib using DrawDibDraw. ***************************************************************************/ void GPT::DrawDib(HDRAWDIB hdd, BITMAPINFOHEADER *pbi, RCS *prcs, GDD *pgdd) { AssertThis(0); AssertVarMem(pbi); AssertVarMem(prcs); AssertVarMem(pgdd); SetTextColor(_hdc, kscrWhite); SetBkColor(_hdc, kscrBlack); _SetClip(pgdd->prcsClip); DrawDibDraw(hdd, _hdc, prcs->left, prcs->top, prcs->right - prcs->left, prcs->bottom - prcs->top, pbi, pvNil, 0, 0, -1, -1, DDF_BACKGROUNDPAL); _Flush(); } #ifdef DEBUG /*************************************************************************** Test the validity of the port. ***************************************************************************/ void GPT::AssertValid(ulong grf) { GPT_PAR::AssertValid(0); HBRUSH hbr; HFONT hfnt; AssertIn(_cactRef, 1, kcbMax); AssertIn(_cactDraw, 0, _cactFlush + 1); if (hNil != _hwnd) AssertVar(IsWindow(_hwnd), "Invalid window handle", &_hwnd); if (hNil == _hdc) { Assert(_fMetaFile, "No DC"); return; } if (hNil != _hbr) { hbr = (HBRUSH)SelectObject(_hdc, _hbr); if (hbr != hNil) AssertVar(hbr == _hbr, "internal brush mismatch", &hbr); } if (hNil != _hfnt) { hfnt = (HFONT)SelectObject(_hdc, _hfnt); if (hfnt != hNil) AssertVar(hfnt == _hfnt, "Internal logical font mismatch", &hfnt); } } /*************************************************************************** Static method to mark static GPT memory. ***************************************************************************/ void GPT::MarkStaticMem(void) { MarkPv(_prgclr); } #endif // DEBUG /*************************************************************************** Enumerate the system fonts and build the font list. ***************************************************************************/ bool NTL::FInit(void) { Assert(hNil != vwig.hdcApp, "No DC"); LOGFONT lgf; HFONT hfnt; if (pvNil == (_pgst = GST::PgstNew(offset(LOGFONT, lfFaceName)))) goto LFail; // Make sure to explicitly add the system font since EnumFonts() won't. // System font always has font number 0. AssertDo(hNil != (hfnt = (HFONT)GetStockObject(SYSTEM_FONT)), "Can't get system font"); AssertDo(GetObject(hfnt, size(lgf), &lgf) != 0, "Can't get logical font"); if (!_pgst->FAddRgch(lgf.lfFaceName, CchSz(lgf.lfFaceName), &lgf) || !EnumFonts(vwig.hdcApp, pvNil, _FEnumFont, (LPARAM)_pgst)) { LFail: PushErc(ercGfxNoFontList); return fFalse; } AssertDo(_pgst->FFindRgch(lgf.lfFaceName, CchSz(lgf.lfFaceName), &_onnSystem, fgstUserSorted), "system font not found!"); AssertThis(0); return fTrue; } /*************************************************************************** -- Font enumuration callback. -- If font is TrueType, it is added to the GST. ***************************************************************************/ int CALLBACK _FEnumFont(LOGFONT *plgf, TEXTMETRIC *ptxm, ulong luType, LPARAM luParam) { long istz; PGST pgst = (PGST)luParam; AssertPo(pgst, 0); if (luType != TRUETYPE_FONTTYPE) return fTrue; AssertDo(!pgst->FFindRgch(plgf->lfFaceName, CchSz(plgf->lfFaceName), &istz, fgstUserSorted), "font already in list!"); return pgst->FInsertRgch(istz, plgf->lfFaceName, CchSz(plgf->lfFaceName), plgf); } /*************************************************************************** -- Create a logical GDI font from the given font attributes. ***************************************************************************/ HFONT NTL::HfntCreate(DSF *pdsf) { AssertThis(0); AssertPo(pdsf, 0); LOGFONT lgf; long cch; _pgst->GetExtra(pdsf->onn, &lgf); _pgst->GetRgch(pdsf->onn, lgf.lfFaceName, size(lgf.lfFaceName) - 1, &cch); lgf.lfFaceName[cch] = 0; lgf.lfItalic = FPure(pdsf->grfont & fontItalic); lgf.lfWeight = (pdsf->grfont & fontBold) ? FW_BOLD : FW_NORMAL; lgf.lfUnderline = FPure(pdsf->grfont & fontUnderline); lgf.lfHeight = -pdsf->dyp; lgf.lfWidth = 0; return CreateFontIndirect(&lgf); } /*************************************************************************** Return true iff the font is a fixed pitch font. ***************************************************************************/ bool NTL::FFixedPitch(long onn) { AssertThis(0); Assert(FValidOnn(onn), "bad onn"); LOGFONT lgf; _pgst->GetExtra(onn, &lgf); return (lgf.lfPitchAndFamily & 0x03) == FIXED_PITCH; } /*************************************************************************** Create a new rectangular region. If prc is nil, the region will be empty. ***************************************************************************/ bool FCreateRgn(HRGN *phrgn, RC *prc) { AssertVarMem(phrgn); AssertNilOrVarMem(prc); RCS rcs; if (pvNil == prc) ClearPb(&rcs, size(rcs)); else rcs = *prc; *phrgn = CreateRectRgnIndirect(&rcs); return *phrgn != hNil; } /*************************************************************************** Free the region and set *phrgn to nil. ***************************************************************************/ void FreePhrgn(HRGN *phrgn) { AssertVarMem(phrgn); if (*phrgn != hNil) { DeleteObject(*phrgn); *phrgn = hNil; } } /*************************************************************************** Make the region rectangular. If prc is nil, the region will be empty. If *phrgn is hNil, creates the region. *phrgn may change even if *phrgn is not nil. ***************************************************************************/ bool FSetRectRgn(HRGN *phrgn, RC *prc) { AssertVarMem(phrgn); AssertNilOrVarMem(prc); if (hNil == *phrgn) return FCreateRgn(phrgn, prc); if (pvNil == prc) return SetRectRgn(*phrgn, 0, 0, 0, 0); return SetRectRgn(*phrgn, prc->xpLeft, prc->ypTop, prc->xpRight, prc->ypBottom); } /*************************************************************************** Put the union of hrgnSrc1 and hrgnSrc2 into hrgnDst. The parameters need not be distinct. Returns success/failure. ***************************************************************************/ bool FUnionRgn(HRGN hrgnDst, HRGN hrgnSrc1, HRGN hrgnSrc2) { Assert(hNil != hrgnDst, "null dst"); Assert(hNil != hrgnSrc1, "null src1"); Assert(hNil != hrgnSrc2, "null src2"); return ERROR != CombineRgn(hrgnDst, hrgnSrc1, hrgnSrc2, RGN_OR); } /*************************************************************************** Put the intersection of hrgnSrc1 and hrgnSrc2 into hrgnDst. The parameters need not be distinct. Returns success/failure. ***************************************************************************/ bool FIntersectRgn(HRGN hrgnDst, HRGN hrgnSrc1, HRGN hrgnSrc2, bool *pfEmpty) { Assert(hNil != hrgnDst, "null dst"); Assert(hNil != hrgnSrc1, "null src1"); Assert(hNil != hrgnSrc2, "null src2"); long lw; lw = CombineRgn(hrgnDst, hrgnSrc1, hrgnSrc2, RGN_AND); if (ERROR == lw) return fFalse; if (pvNil != pfEmpty) *pfEmpty = (lw == NULLREGION); return fTrue; } /*************************************************************************** Put hrgnSrc - hrgnSrcSub into hrgnDst. The parameters need not be distinct. Returns success/failure. ***************************************************************************/ bool FDiffRgn(HRGN hrgnDst, HRGN hrgnSrc, HRGN hrgnSrcSub, bool *pfEmpty) { Assert(hNil != hrgnDst, "null dst"); Assert(hNil != hrgnSrc, "null src"); Assert(hNil != hrgnSrcSub, "null srcSub"); long lw; lw = CombineRgn(hrgnDst, hrgnSrc, hrgnSrcSub, RGN_DIFF); if (ERROR == lw) return fFalse; if (pvNil != pfEmpty) *pfEmpty = (lw == NULLREGION); return fTrue; } /*************************************************************************** Determine if the region is rectangular and put the bounding rectangle in *prc (if not nil). ***************************************************************************/ bool FRectRgn(HRGN hrgn, RC *prc) { Assert(hNil != hrgn, "null rgn"); RCS rcs; bool fRet; fRet = GetRgnBox(hrgn, &rcs) != COMPLEXREGION; if (pvNil != prc) *prc = rcs; return fRet; } /*************************************************************************** Return true iff the region is empty. ***************************************************************************/ bool FEmptyRgn(HRGN hrgn, RC *prc) { Assert(hNil != hrgn, "null rgn"); RCS rcs; bool fRet; fRet = GetRgnBox(hrgn, &rcs) == NULLREGION; if (pvNil != prc) *prc = rcs; return fRet; } /*************************************************************************** Return true iff the two regions are equal. ***************************************************************************/ bool FEqualRgn(HRGN hrgn1, HRGN hrgn2) { Assert(hNil != hrgn1, "null rgn1"); Assert(hNil != hrgn2, "null rgn2"); return EqualRgn(hrgn1, hrgn2); } ================================================ FILE: kauai/src/gob.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Graphics object code. ***************************************************************************/ #include "frame.h" ASSERTNAME BEGIN_CMD_MAP(GOB, CMH) ON_CID_GEN(cidKey, &GOB::FCmdKeyCore, pvNil) ON_CID_GEN(cidSelIdle, &GOB::FCmdSelIdle, pvNil) ON_CID_ME(cidActivateSel, &GOB::FCmdActivateSel, pvNil) ON_CID_ME(cidBadKey, &GOB::FCmdBadKeyCore, pvNil) ON_CID_ME(cidCloseWnd, &GOB::FCmdCloseWnd, pvNil) ON_CID_ME(cidMouseDown, &GOB::FCmdTrackMouseCore, pvNil) ON_CID_ME(cidTrackMouse, &GOB::FCmdTrackMouseCore, pvNil) ON_CID_ME(cidMouseMove, &GOB::FCmdMouseMoveCore, pvNil) END_CMD_MAP_NIL() RTCLASS(GOB) RTCLASS(GTE) long GOB::_ginDefGob = kginSysInval; long GOB::_gridLast; /*************************************************************************** Fill in the elements of the GCB. ***************************************************************************/ void GCB::Set(long hid, PGOB pgob, ulong grfgob, long gin, RC *prcAbs, RC *prcRel) { Assert(hidNil != hid, "bad hid"); AssertNilOrPo(pgob, 0); _hid = hid; _pgob = pgob; _grfgob = grfgob; _gin = gin; if (pvNil == prcAbs) _rcAbs.Zero(); else _rcAbs = *prcAbs; if (pvNil == prcRel) _rcRel.Zero(); else _rcRel = *prcRel; } /*************************************************************************** Static method to shut down all GOBs. ***************************************************************************/ void GOB::ShutDown(void) { while (pvNil != _pgobScreen) { _pgobScreen->FAttachHwnd(hNil); // freeing the _pgobScreen also updates _pgobScreen to its sibling. // _pgobScreen is really the root of the forest. _pgobScreen->Release(); } } /*************************************************************************** Constructor for a graphics object. pgob is either the parent of the new gob or a sibling, according to (grfgob & fgobSibling). ***************************************************************************/ GOB::GOB(PGCB pgcb) : CMH(pgcb->_hid) { _Init(pgcb); } /*************************************************************************** Initialize the gob. ***************************************************************************/ void GOB::_Init(PGCB pgcb) { AssertVarMem(pgcb); AssertNilOrPo(pgcb->_pgob, 0); _grid = ++_gridLast; _ginDefault = pgcb->_gin; _fCreating = fTrue; if (pvNil == pgcb->_pgob) { Assert(pvNil == _pgobScreen, "screen gob already created"); _pgobScreen = this; } else if (pgcb->_grfgob & fgobSibling) { AssertPo(pgcb->_pgob, 0); _pgobPar = pgcb->_pgob->_pgobPar; _pgobSib = pgcb->_pgob->_pgobSib; pgcb->_pgob->_pgobSib = this; } else { AssertPo(pgcb->_pgob, 0); _pgobPar = pgcb->_pgob; _pgobSib = pgcb->_pgob->_pgobChd; pgcb->_pgob->_pgobChd = this; } if (pvNil != _pgobPar) _pgpt = _pgobPar->_pgpt; SetPos(&pgcb->_rcAbs, &pgcb->_rcRel); AssertThis(0); _fCreating = fFalse; } /*************************************************************************** Constructor for GOB. ***************************************************************************/ GOB::GOB(long hid) : CMH(hid) { GCB gcb(hid, GOB::PgobScreen()); _Init(&gcb); } /*************************************************************************** First tells the app that the gob is dying; then calls Release on all direct child gobs of this GOB; then calls delete on itself. ***************************************************************************/ void GOB::Release(void) { AssertThis(0); PGOB pgob; if (--_cactRef > 0) return; // Mark this gob as being freed (may already be marked) _fFreeing = fTrue; // invalidate if (pvNil == _pgobPar || !_pgobPar->_fFreeing) InvalRc(pvNil); while (pvNil != (pgob = _pgobChd)) pgob->Release(); delete this; } /*************************************************************************** Destructor for the graphics object class. ***************************************************************************/ GOB::~GOB(void) { AssertThis(0); PGOB *ppgob; // remove it from the sibling list Assert(pvNil == _pgobChd, "gob still has children"); for (ppgob = pvNil != _pgobPar ? &_pgobPar->_pgobChd : &_pgobScreen; *ppgob != this && pvNil != *ppgob; ppgob = &(*ppgob)->_pgobSib) { } if (*ppgob == this) *ppgob = _pgobSib; else Bug("corrupt gob tree"); // nuke its port and hwnd if (pvNil != _pgpt && (pvNil == _pgobPar || _pgpt != _pgobPar->_pgpt)) ReleasePpo(&_pgpt); if (_hwnd != hNil) _DestroyHwnd(_hwnd); ReleasePpo(&_pglrtvm); ReleasePpo(&_pcurs); } /*************************************************************************** Called by OS specific code when an hwnd is activated or deactivated. We inform the entire gob subtree for the hwnd so individual elements can do whatever is necessary. This is a static member function. ***************************************************************************/ void GOB::ActivateHwnd(HWND hwnd, bool fActive) { PGOB pgob; if (pvNil == (pgob = PgobFromHwnd(hwnd))) return; // if it's becoming active, bring it to the front in our gob tree. if (fActive) pgob->SendBehind(pvNil); GTE gte; ulong grfgte; gte.Init(pgob, fgteBackToFront); while (gte.FNextGob(&pgob, &grfgte, fgteNil)) { if (grfgte & fgtePre) pgob->_ActivateHwnd(fActive); } } /*************************************************************************** Make this the first child of its parent. Doesn't invalidate anything. ***************************************************************************/ void GOB::BringToFront(void) { AssertThis(0); SendBehind(pvNil); } /*************************************************************************** Put this GOB behind the given sibling. If pgobBehind is nil, does the equivalent of a BringToFront. Asserts that pgobBehind and this gob have the same parent. Does no invalidation. ***************************************************************************/ void GOB::SendBehind(PGOB pgobBehind) { AssertThis(0); AssertNilOrPo(pgobBehind, 0); PGOB pgob; if (pvNil != pgobBehind && pgobBehind->_pgobPar != _pgobPar) { Bug("don't have the same parent"); return; } pgob = PgobPrevSib(); if (pgob == pgobBehind) return; // nothing to do // take this gob out of the sibling list if (pvNil == pgob) { Assert(_pgobPar->_pgobChd == this, "corrupt GOB tree"); _pgobPar->_pgobChd = _pgobSib; } else { Assert(pgob->_pgobSib == this, "corrupt GOB tree"); pgob->_pgobSib = _pgobSib; } // now insert it after pgobBehind if (pvNil == pgobBehind) { _pgobSib = _pgobPar->_pgobChd; _pgobPar->_pgobChd = this; } else { _pgobSib = pgobBehind->_pgobSib; pgobBehind->_pgobSib = this; AssertPo(pgobBehind, 0); } AssertThis(0); } /*************************************************************************** Invalidate the given rc in this gob. If gin is ginNil, nothing is done. If gin is kginRedraw, the area is redraw. If gin is kginMark, the area is marked dirty at the framework level. If gin is kginSysInval, the area is marked dirty at the operating system level. In all cases, passing pvNil for prc affects the whole gob. ***************************************************************************/ void GOB::InvalRc(RC *prc, long gin) { AssertThis(0); AssertNilOrVarMem(prc); PT dpt; RC rc; PGOB pgob; RCS rcs; if (kginDefault == gin) { gin = _ginDefault; if (kginDefault == gin) gin = _ginDefGob; } if (ginNil == gin) return; GetRcVis(&rc, cooLocal); if (pvNil != prc) rc.FIntersect(prc); if (rc.FEmpty()) return; for (pgob = this; pvNil != pgob && pgob->_hwnd == hNil; pgob = pgob->_pgobPar) { rc.Offset(pgob->_rcCur.xpLeft, pgob->_rcCur.ypTop); } if (pvNil == pgob) return; switch (gin) { default: Bug("bad gin value"); break; case kginDraw: // do this so we do whatever the app does during a normal draw, such // as drawing offscreen.... vpappb->UpdateHwnd(pgob->_hwnd, &rc); break; case kginMark: vpappb->MarkRc(&rc, pgob); break; case kginSysInval: rcs = RCS(rc); InvalHwndRcs(pgob->_hwnd, &rcs); break; } } /*************************************************************************** Validate the given rc in this gob. If gin is ginNil, nothing is done. If gin is kginRedraw, the area is validated at both the framework level and the system level. If gin is kginMark or kginSysInval, the area is validated only at the given level. In any case, passing pvNil for prc affects the whole gob. ***************************************************************************/ void GOB::ValidRc(RC *prc, long gin) { AssertThis(0); RC rc; PT dpt; PGOB pgob; if (kginDefault == gin) { gin = _ginDefault; if (kginDefault == gin) gin = _ginDefGob; } if (ginNil == gin) return; GetRcVis(&rc, cooLocal); if (pvNil != prc) rc.FIntersect(prc); if (rc.FEmpty()) return; for (pgob = this; pvNil != pgob && pgob->_hwnd == hNil; pgob = pgob->_pgobPar) { rc.Offset(pgob->_rcCur.xpLeft, pgob->_rcCur.ypTop); } if (pvNil == pgob) return; if (gin != kginSysInval) { // do a framework level validation vpappb->UnmarkRc(&rc, pgob); } if (gin != kginMark) { // do a system level validation RCS rcs; rcs = RCS(rc); ValidHwndRcs(pgob->_hwnd, &rcs); } } /*************************************************************************** Get the dirty portion of this gob. Return true iff the dirty rectangle is non-empty. If gin is kginDraw, gets the union of the marked area and system-invalidated area. ***************************************************************************/ bool GOB::FGetRcInval(RC *prc, long gin) { AssertThis(0); AssertVarMem(prc); RC rc; PGOB pgob; PT dpt(0, 0); prc->Zero(); if (kginDefault == gin) { gin = _ginDefault; if (kginDefault == gin) gin = _ginDefGob; } GetRcVis(&rc, cooLocal); if (rc.FEmpty() || ginNil == gin) return fFalse; for (pgob = this; pvNil != pgob && pgob->_hwnd == hNil; pgob = pgob->_pgobPar) { dpt.Offset(pgob->_rcCur.xpLeft, pgob->_rcCur.ypTop); } rc.Offset(dpt.xp, dpt.yp); if (pvNil == pgob) return fFalse; if (kginSysInval != gin) { // get any marked area vpappb->FGetMarkedRc(pgob->_hwnd, prc); } if (kginMark != gin) { // get any system invalidated area RCS rcs; RC rcT; #ifdef WIN GetUpdateRect(pgob->_hwnd, &rcs, fFalse); #endif // WIN #ifdef MAC PPRT pprt; rcs = (*pgob->_hwnd->updateRgn)->rgnBBox; GetPort(&pprt); SetPort(&pgob->_hwnd->port); GlobalToLocal((PTS *)&rcs); GlobalToLocal((PTS *)&rcs + 1); SetPort(pprt); #endif // MAC rcT = RC(rcs); if (rcT.FIntersect(&rc)) prc->Union(&rcT); } prc->Offset(-dpt.xp, -dpt.yp); return !prc->FEmpty(); } /*************************************************************************** Scrolls the given rectangle in the GOB. Translates any invalid portion. Handles this being covered by any GOBs or system windows. If prc is nil, the entire content rectangle is used. ***************************************************************************/ void GOB::Scroll(RC *prc, long dxp, long dyp, long gin, RC *prcBad1, RC *prcBad2) { AssertThis(0); AssertNilOrVarMem(prc); AssertNilOrVarMem(prcBad1); AssertNilOrVarMem(prcBad2); RC rc, rcBad1, rcBad2, rcInval, rcT; PT dpt(0, 0); PGOB pgob, pgobT; GTE gte; ulong grfgte, grfgteIn; bool fFound; if (kginDefault == gin) { gin = _ginDefault; if (kginDefault == gin) gin = _ginDefGob; } if (pvNil != prcBad1) prcBad1->Zero(); if (pvNil != prcBad2) prcBad2->Zero(); if (dxp == 0 && dyp == 0) return; GetRcVis(&rc, cooLocal); if (pvNil != prc && !rc.FIntersect(prc)) return; for (pgob = this; pvNil != pgob && pgob->_hwnd == hNil; pgob = pgob->_pgobPar) { dpt.Offset(pgob->_rcCur.xpLeft, pgob->_rcCur.ypTop); } rc.Offset(dpt.xp, dpt.yp); if (pvNil == pgob) return; // check for GOBs on top of this one. gte.Init(pgob, fgteBackToFront); fFound = fFalse; grfgteIn = fgteNil; while (gte.FNextGob(&pgobT, &grfgte, grfgteIn)) { if (!(grfgte & fgtePre)) continue; if (!fFound) { fFound = pgobT == this; continue; } pgobT->GetRc(&rcT, cooHwnd); if (rcT.FIntersect(&rc)) { // there is a GOB on top of this one, just invalidate the // rectangle to be scrolled pgob->ValidRc(&rc, kginDraw); pgob->InvalRc(&rc, gin); if (pvNil != prcBad1) prcBad1->OffsetCopy(&rc, -dpt.xp, -dpt.yp); return; } grfgteIn = fgteSkipToSib; } // translate any marked area if (FGetRcInval(&rcT, kginMark)) { // something is marked rcT.Offset(dpt.xp, dpt.yp); if (rcT.FIntersect(&rc)) { pgob->ValidRc(&rcT, kginMark); rcT.Offset(dxp, dyp); if (rcT.FIntersect(&rc)) pgob->InvalRc(&rcT, kginMark); } } #ifdef WIN // SW_INVALIDATE invalidates any uncovered stuff and translates any // previously invalid stuff RCS rcs = RCS(rc); ScrollWindowEx(pgob->_hwnd, dxp, dyp, pvNil, &rcs, hNil, pvNil, SW_INVALIDATE); // compute the bad rectangles GNV::GetBadRcForScroll(&rc, dxp, dyp, &rcBad1, &rcBad2); if (pvNil != prcBad1) prcBad1->OffsetCopy(&rcBad1, -dpt.xp, -dpt.yp); if (pvNil != prcBad2) prcBad2->OffsetCopy(&rcBad2, -dpt.xp, -dpt.yp); switch (gin) { default: Bug("bad gin"); break; case kginDraw: UpdateWindow(pgob->_hwnd); break; case kginSysInval: break; case kginMark: vpappb->MarkRc(&rcBad1, pgob); vpappb->MarkRc(&rcBad2, pgob); // fall through case ginNil: if (!rcBad1.FEmpty()) { rcs = RCS(rcBad1); ValidateRect(pgob->_hwnd, &rcs); } if (!rcBad2.FEmpty()) { rcs = RCS(rcBad2); ValidateRect(pgob->_hwnd, &rcs); } break; } #endif // WIN #ifdef MAC HRGN hrgn; // Make sure the vis region intersected with the rectangle to scroll is // a rectangle if (!FCreateRgn(&hrgn, &rc) || !FIntersectRgn(hrgn, pgob->_hwnd->port.visRgn, hrgn) || !FRectRgn(hrgn, &rc)) { // there is something on top of this one, just invalidate the // rectangle to be scrolled FreePhrgn(&hrgn); pgob->ValidRc(&rc, kginDraw); pgob->InvalRc(&rc, gin); if (pvNil != prcBad1) prcBad1->OffsetCopy(&rc, -dpt.xp, -dpt.yp); return; } FreePhrgn(&hrgn); GNV gnv(pgob); gnv.ScrollRc(&rc, dxp, dyp, &rcBad1, &rcBad2); // translate any invalid area if (FGetRcInval(&rcT, kginSysInval)) { // something is invalid rcT.Offset(dpt.xp, dpt.yp); if (rcT.FIntersect(&rc)) { pgob->ValidRc(&rcT, kginSysInval); rcT.Offset(dxp, dyp); if (rcT.FIntersect(&rc)) pgob->InvalRc(&rcT, kginSysInval); } } if (pvNil != prcBad1) prcBad1->OffsetCopy(&rcBad1, -dpt.xp, -dpt.yp); if (pvNil != prcBad2) prcBad2->OffsetCopy(&rcBad2, -dpt.xp, -dpt.yp); switch (gin) { default: Bug("bad gin"); // fall through case ginNil: break; case kginDraw: vpappb->MarkRc(&rcBad1, pgob); vpappb->MarkRc(&rcBad2, pgob); vpappb->UpdateMarked(); break; case kginSysInval: pgob->InvalRc(&rcBad1); pgob->InvalRc(&rcBad2); break; case kginMark: vpappb->MarkRc(&rcBad1, pgob); vpappb->MarkRc(&rcBad2, pgob); break; } #endif // MAC } /*************************************************************************** Draw the gob and its children into the given port. If the pgpt is nil, use the GOB's UI (natural) port. If the prc is pvNil, use the GOB's rectangle based at (0, 0). If prcClip is not nil, only GOB's that intersect prcClip will be drawn. prcClip is in the GOB's local coordinates. ***************************************************************************/ void GOB::DrawTree(PGPT pgpt, RC *prc, RC *prcClip, ulong grfgob) { AssertThis(0); AssertNilOrPo(pgpt, 0); AssertNilOrVarMem(prc); AssertNilOrVarMem(prcClip); RC rcSrc, rcClip, rcSrcGob, rcClipGob, rcVis, rc; // to translate from this->local to pgob->local coordinates add dpt PT dpt; if (pgpt == pvNil && (pgpt = _pgpt) == pvNil) { Bug("no port to draw to"); return; } if (pvNil != prc && prc->FEmpty()) return; dpt = _rcCur.PtTopLeft(); // get the source and clip rectangles in local (this) coordinates rcSrc = _rcCur; if (rcSrc.FEmpty()) return; rcSrc.OffsetToOrigin(); if (pvNil == prcClip) rcClip = rcSrc; else if (!rcClip.FIntersect(prcClip, &rcSrc)) return; GNV gnv(pgpt); GTE gte; ulong grfgte, grfgteIn; PGOB pgob; gte.Init(this, fgteBackToFront); grfgteIn = fgteNil; while (gte.FNextGob(&pgob, &grfgte, grfgteIn)) { if (pgob->_pgpt != _pgpt || pgob->_rcCur.FEmpty()) goto LNextSib; grfgteIn = fgteNil; if (grfgte & fgtePre) { if (grfgob & (fgobAutoVis | fgobUseVis)) { pgob->GetRcVis(&rcVis, cooLocal); if (rcVis.FEmpty()) goto LNextSib; } // get the source and clip rectangles in local (pgob) coordinates rcSrcGob = pgob->_rcCur; dpt.xp -= rcSrcGob.xpLeft; dpt.yp -= rcSrcGob.ypTop; rcSrcGob.OffsetToOrigin(); rcClipGob = rcClip + dpt; if (!rcClipGob.FIntersect(&rcSrcGob)) goto LOffsetNextSib; // set the source rectangle gnv.SetRcSrc(&rcSrcGob); // set the dest rc rc = rcSrcGob - dpt; if (pvNil != prc) rc.Map(&rcSrc, prc); gnv.SetRcDst(&rc); // set the vis rectangle if (grfgob & (fgobAutoVis | fgobUseVis)) { if (!rcVis.FIntersect(&rcClipGob)) { LOffsetNextSib: dpt.xp += pgob->_rcCur.xpLeft; dpt.yp += pgob->_rcCur.ypTop; LNextSib: grfgteIn = fgteSkipToSib; continue; } if (!(grfgob & fgobUseVis) && rcSrcGob == rcVis) gnv.SetRcVis(pvNil); else gnv.SetRcVis(&rcVis); rcClipGob = rcVis; } // draw the gob pgob->Draw(&gnv, &rcClipGob); } if (grfgte & fgtePost) { dpt.xp += pgob->_rcCur.xpLeft; dpt.yp += pgob->_rcCur.ypTop; } } } /*************************************************************************** Draw the gob and its children into the given port. If the pgpt is nil, use the GOB's UI (natural) port. If the prc is pvNil, use the GOB's rectangle based at (0, 0). Only GOB's that intersect pregn will be drawn. pregn is in the GOB's local coordinates. ***************************************************************************/ void GOB::DrawTreeRgn(PGPT pgpt, RC *prc, REGN *pregn, ulong grfgob) { AssertThis(0); AssertNilOrPo(pgpt, 0); AssertNilOrVarMem(prc); AssertPo(pregn, 0); RC rcSrc, rcSrcGob, rcClipGob, rcVis, rc; // to translate from this->local to pgob->local coordinates add dpt PT dpt; if (pgpt == pvNil && (pgpt = _pgpt) == pvNil) { Bug("no port to draw to"); return; } if (pvNil != prc && prc->FEmpty()) return; if (pregn->FEmpty()) return; dpt = _rcCur.PtTopLeft(); // get the source rectangle and clip region in local (this) coordinates rcSrc = _rcCur; rcSrc.OffsetToOrigin(); if (rcSrc.FEmpty()) return; GNV gnv(pgpt); GTE gte; ulong grfgte, grfgteIn; PGOB pgob; PREGN pregnClip; PREGN pregnClipGob = pvNil; if (pvNil == (pregnClip = REGN::PregnNew(&rcSrc)) || pvNil == (pregnClipGob = REGN::PregnNew()) || !pregnClip->FIntersect(pregn)) { goto LFail; } if (pregnClip->FEmpty()) goto LDone; gte.Init(this, fgteBackToFront); grfgteIn = fgteNil; while (gte.FNextGob(&pgob, &grfgte, grfgteIn)) { if (pgob->_pgpt != _pgpt || pgob->_rcCur.FEmpty()) goto LNextSib; grfgteIn = fgteNil; if (grfgte & fgtePre) { if (grfgob & (fgobAutoVis | fgobUseVis)) { pgob->GetRcVis(&rcVis, cooLocal); if (rcVis.FEmpty()) goto LNextSib; } // get the source and clip rectangles in local (pgob) coordinates rcSrcGob = pgob->_rcCur; dpt.xp -= rcSrcGob.xpLeft; dpt.yp -= rcSrcGob.ypTop; rcSrcGob.OffsetToOrigin(); pregnClipGob->SetRc(&rcSrcGob); pregnClipGob->Offset(-dpt.xp, -dpt.yp); if (!pregnClipGob->FIntersect(pregnClip)) goto LFail; if (pregnClipGob->FEmpty(&rcClipGob)) goto LOffsetNextSib; rcClipGob.Offset(dpt.xp, dpt.yp); // set the source rectangle gnv.SetRcSrc(&rcSrcGob); // set the dest rc rc = rcSrcGob - dpt; if (pvNil != prc) rc.Map(&rcSrc, prc); gnv.SetRcDst(&rc); // set the vis rectangle if (grfgob & (fgobAutoVis | fgobUseVis)) { if (!rcVis.FIntersect(&rcClipGob)) { LOffsetNextSib: dpt.xp += pgob->_rcCur.xpLeft; dpt.yp += pgob->_rcCur.ypTop; LNextSib: grfgteIn = fgteSkipToSib; continue; } if (!(grfgob & fgobUseVis) && rcSrcGob == rcVis) gnv.SetRcVis(pvNil); else gnv.SetRcVis(&rcVis); } // draw the gob // NOTE: we use pregn and not pregnClip or pregnClipGob for speed. // Using pregn, the cached hrgn stuff kicks in to only require // one hrgn creation. If we use pregnClip we only have one hrgn // creation here, but another one when the offscreen bitmap is // copied to the screen. Using pregnClipGob would cause lots // of hregn creations. pgpt->ClipToRegn(&pregn); pgob->Draw(&gnv, &rcClipGob); pgpt->ClipToRegn(&pregn); } if (grfgte & fgtePost) { dpt.xp += pgob->_rcCur.xpLeft; dpt.yp += pgob->_rcCur.ypTop; } } LDone: ReleasePpo(&pregnClip); ReleasePpo(&pregnClipGob); return; LFail: pregn->FEmpty(&rc); DrawTree(pgpt, prc, &rc, grfgob); } /*************************************************************************** Draw the GOB into the given graphics environment. On entry, the source rectangle of the GNV is set to (0, 0, dxp, dyp), where dxp and dyp are the width and height of the gob. The gob is free to change the source rectangle, but should not touch the destination rectangle. ***************************************************************************/ void GOB::Draw(PGNV pgnv, RC *prcClip) { AssertThis(0); } /*************************************************************************** Make this gob fill up its parent's interior. ***************************************************************************/ void GOB::Maximize(void) { AssertThis(0); _rcAbs.Zero(); _rcRel.xpLeft = _rcRel.ypTop = krelZero; _rcRel.xpRight = _rcRel.ypBottom = krelOne; _SetRcCur(); } /*************************************************************************** Set the gob's position. Invalidates both the old and new position. ***************************************************************************/ void GOB::SetPos(RC *prcAbs, RC *prcRel) { AssertThis(0); AssertNilOrVarMem(prcAbs); AssertNilOrVarMem(prcRel); if (prcAbs == pvNil) _rcAbs.Zero(); else _rcAbs = *prcAbs; if (prcRel == pvNil) _rcRel.Zero(); else _rcRel = *prcRel; _SetRcCur(); } /*************************************************************************** Get the gob's position. ***************************************************************************/ void GOB::GetPos(RC *prcAbs, RC *prcRel) { AssertThis(0); AssertNilOrVarMem(prcAbs); AssertNilOrVarMem(prcRel); if (pvNil != prcAbs) *prcAbs = _rcAbs; if (pvNil != prcRel) *prcRel = _rcRel; } /*************************************************************************** Set the gob's rectangle from its hwnd. ***************************************************************************/ void GOB::SetRcFromHwnd(void) { AssertThis(0); Assert(_hwnd != hNil, "no hwnd"); _SetRcCur(); } /*************************************************************************** Get the bounding rectangle of the gob in the given coordinates. ***************************************************************************/ void GOB::GetRc(RC *prc, long coo) { AssertThis(0); AssertVarMem(prc); PT dpt; *prc = _rcCur; _HwndGetDptFromCoo(&dpt, coo); prc->Offset(dpt.xp - _rcCur.xpLeft, dpt.yp - _rcCur.ypTop); } /*************************************************************************** Get the visible rectangle of the gob in the given coordinates. ***************************************************************************/ void GOB::GetRcVis(RC *prc, long coo) { AssertThis(0); AssertVarMem(prc); PT dpt; *prc = _rcVis; _HwndGetDptFromCoo(&dpt, coo); prc->Offset(dpt.xp - _rcCur.xpLeft, dpt.yp - _rcCur.ypTop); } /*************************************************************************** Get the rectangle for the gob in cooHwnd coordinates and return the enclosing hwnd (if there is one). This is a protected API. ***************************************************************************/ HWND GOB::_HwndGetRc(RC *prc) { PT dpt; HWND hwnd; *prc = _rcCur; hwnd = _HwndGetDptFromCoo(&dpt, cooHwnd); prc->Offset(dpt.xp - _rcCur.xpLeft, dpt.yp - _rcCur.ypTop); return hwnd; } /*************************************************************************** Return the hwnd that contains this GOB. ***************************************************************************/ HWND GOB::HwndContainer(void) { AssertThis(0); PGOB pgob = this; while (pvNil != pgob) { if (hNil != pgob->_hwnd) return pgob->_hwnd; pgob = pgob->_pgobPar; } return hNil; } /*************************************************************************** Map a point from cooSrc coordinates to cooDst coordinates (relative to the gob). ***************************************************************************/ void GOB::MapPt(PT *ppt, long cooSrc, long cooDst) { AssertThis(0); AssertVarMem(ppt); PT dpt; _HwndGetDptFromCoo(&dpt, cooSrc); ppt->xp -= dpt.xp; ppt->yp -= dpt.yp; _HwndGetDptFromCoo(&dpt, cooDst); ppt->xp += dpt.xp; ppt->yp += dpt.yp; } /*************************************************************************** Map an rc from cooSrc coordinates to cooDst coordinates (relative to the gob). ***************************************************************************/ void GOB::MapRc(RC *prc, long cooSrc, long cooDst) { AssertThis(0); AssertVarMem(prc); PT dpt; _HwndGetDptFromCoo(&dpt, cooSrc); prc->Offset(-dpt.xp, -dpt.yp); _HwndGetDptFromCoo(&dpt, cooDst); prc->Offset(dpt.xp, dpt.yp); } /*************************************************************************** Get the dxp and dyp to map from local coordinates to coo coordinates. If coo is cooHwnd or cooGlobal, also return the containing hwnd (otherwise return hNil). ***************************************************************************/ HWND GOB::_HwndGetDptFromCoo(PT *pdpt, long coo) { PGOB pgob, pgobT; HWND hwnd = hNil; switch (coo) { default: Assert(coo == cooLocal, "bad coo"); pdpt->xp = pdpt->yp = 0; break; case cooParent: pdpt->xp = _rcCur.xpLeft; pdpt->yp = _rcCur.ypTop; break; case cooGpt: pdpt->xp = pdpt->yp = 0; for (pgob = this; (pgobT = pgob->_pgobPar) != pvNil && pgobT->_pgpt == _pgpt; pgob = pgobT) { pdpt->xp += pgob->_rcCur.xpLeft; pdpt->yp += pgob->_rcCur.ypTop; } break; case cooHwnd: case cooGlobal: pdpt->xp = pdpt->yp = 0; for (pgob = this; pgob != pvNil && pgob->_hwnd == hNil; pgob = pgob->_pgobPar) { pdpt->xp += pgob->_rcCur.xpLeft; pdpt->yp += pgob->_rcCur.ypTop; } if (pvNil != pgob) hwnd = pgob->_hwnd; if (cooGlobal == coo && hNil != hwnd) { // Map from Hwnd to screen PTS pts; pts = PTS(*pdpt); #ifdef WIN ClientToScreen(hwnd, &pts); #endif // WIN #ifdef MAC PPRT pprt; GetPort(&pprt); SetPort(&hwnd->port); LocalToGlobal(&pts); SetPort(pprt); #endif // MAC *pdpt = PT(pts); } break; } return hwnd; } /*************************************************************************** Get the minimum and maximum size for a gob. ***************************************************************************/ void GOB::GetMinMax(RC *prcMinMax) { prcMinMax->xpLeft = prcMinMax->ypTop = 0; // yes kswMax for safety prcMinMax->xpRight = prcMinMax->ypBottom = kswMax; } /*************************************************************************** Static method to find the gob containing the given point (in global coordinates). If the mouse isn't over a GOB, this returns pvNil and sets *pptLocal to the passed in (xp, yp). ***************************************************************************/ PGOB GOB::PgobFromPtGlobal(long xp, long yp, PT *pptLocal) { AssertNilOrVarMem(pptLocal); HWND hwnd; PTS pts; PGOB pgob; #ifdef MAC PPRT pprt; pts.h = (short)xp; pts.v = (short)yp; if (inContent != FindWindow(pts, (WindowPtr *)&hwnd) || hNil == hwnd || pvNil == (pgob = PgobFromHwnd(hwnd))) { if (pvNil != pptLocal) { pptLocal->xp = xp; pptLocal->yp = yp; } return pvNil; } GetPort(&pprt); SetPort(&hwnd->port); GlobalToLocal(&pts); SetPort(pprt); return pgob->PgobFromPt(pts.h, pts.v, pptLocal); #endif // MAC #ifdef WIN pts.x = xp; pts.y = yp; if (hNil == (hwnd = WindowFromPoint(pts)) || pvNil == (pgob = PgobFromHwnd(hwnd))) { if (pvNil != pptLocal) { pptLocal->xp = xp; pptLocal->yp = yp; } return pvNil; } ScreenToClient(hwnd, &pts); return pgob->PgobFromPt(pts.x, pts.y, pptLocal); #endif // WIN } /*************************************************************************** Determine which gob in the tree starting with this GOB the given point is in. This may return pvNil if no gob claims to contain the given point. xp, yp is assumed to be in this gob's parent's coordinates. This is recursive, so a GOB can build it's own world and hit testing method. ***************************************************************************/ PGOB GOB::PgobFromPt(long xp, long yp, PT *pptLocal) { AssertThis(0); xp -= _rcCur.xpLeft; yp -= _rcCur.ypTop; if (FPtInBounds(xp, yp)) { // the point is in our bounding rectangle, so give the children // a whack at it PGOB pgob, pgobT; for (pgob = _pgobChd; pvNil != pgob; pgob = pgob->_pgobSib) { if (pvNil != (pgobT = pgob->PgobFromPt(xp, yp, pptLocal))) return pgobT; } } // call FPtIn whether or not FInBounds returned true so a parent can will some // extra space to a child if (FPtIn(xp, yp)) { if (pptLocal != pvNil) { pptLocal->xp = xp; pptLocal->yp = yp; } return this; } return pvNil; } /*************************************************************************** Determine whether the given point (in this gob's local coordinates) is in this gob. This will be subclassed by all non-rectangular gobs (including ones that don't want to respond to the mouse at all). We handle tool tips here to avoid bugs of omission and for convenience. ***************************************************************************/ bool GOB::FPtIn(long xp, long yp) { AssertThis(0); RC rc; // tool tips and their children are "invisible". if (khidToolTip == Hid()) return fFalse; GetRc(&rc, cooLocal); return rc.FPtIn(xp, yp); } /*************************************************************************** Determine whether the given point (in this gob's local coordinates) is in this gob's bounding rectangle. This indicates whether it's OK to ask the GOB's children whether the point is in them. This will be subclassed by all GOBs that don't want to respond to the mouse. We handle tool tips here to avoid bugs of omission and for convenience. If this returns false, PgobFromPt will still call FPtIn. ***************************************************************************/ bool GOB::FPtInBounds(long xp, long yp) { AssertThis(0); RC rc; // tool tips and their children are "invisible". if (khidToolTip == Hid()) return fFalse; GetRc(&rc, cooLocal); return rc.FPtIn(xp, yp); } /*************************************************************************** Default mouse down handler just enqueues a cidActivateSel, cidSelIdle and a cidTrackMouse command. ***************************************************************************/ void GOB::MouseDown(long xp, long yp, long cact, ulong grfcust) { AssertThis(0); Assert(grfcust & fcustMouse, "grfcust wrong"); CMD_MOUSE cmd; vpcex->EnqueueCid(cidActivateSel, this); vpcex->EnqueueCid(cidSelIdle, pvNil, pvNil, fTrue, Hid()); cmd.cid = cidMouseDown; cmd.pcmh = this; cmd.pgg = pvNil; cmd.xp = xp; cmd.yp = yp; cmd.grfcust = grfcust; cmd.cact = cact; vpcex->EnqueueCmd((PCMD)&cmd); } /*************************************************************************** Set the _rcCur values based on _rcAbs and _rcRel. If there is an OS window associated with this GOB, set _rcCur based on the hwnd. Invalidates the old and new rectangles. ***************************************************************************/ void GOB::_SetRcCur(void) { PGOB pgob; GTE gte; ulong grfgte; RC rc, rcVis; // invalidate the original rc InvalRc(pvNil); gte.Init(this, fgteNil); while (gte.FNextGob(&pgob, &grfgte, fgteNil)) { if (!(grfgte & fgtePre)) continue; // get the new rc and the rcVis of the parent (in the parent's local // coordinates) if (pgob->_hwnd != hNil) { RCS rcs; GetClientRect(pgob->_hwnd, &rcs); rc = rcs; rcVis.Max(); } else if (pgob->_pgobPar != pvNil) { long dxp; long dyp; dxp = pgob->_pgobPar->_rcCur.Dxp(); dyp = pgob->_pgobPar->_rcCur.Dyp(); rc.xpLeft = pgob->_rcAbs.xpLeft + LwMulDiv(dxp, pgob->_rcRel.xpLeft, krelOne); rc.ypTop = pgob->_rcAbs.ypTop + LwMulDiv(dyp, pgob->_rcRel.ypTop, krelOne); rc.xpRight = pgob->_rcAbs.xpRight + LwMulDiv(dxp, pgob->_rcRel.xpRight, krelOne); rc.ypBottom = pgob->_rcAbs.ypBottom + LwMulDiv(dyp, pgob->_rcRel.ypBottom, krelOne); pgob->_pgobPar->GetRcVis(&rcVis, cooLocal); } else { rc = pgob->_rcAbs; rcVis.Max(); } // intersect the parents visible portion with the new rc to get // this gob's visible portion rcVis.FIntersect(&rc); pgob->_rcCur = rc; pgob->_rcVis = rcVis; if (grfgte & fgteRoot) { // invalidate the new rectangle - we do it here so children // can draw and validate themselves if they want InvalRc(pvNil); } // tell the gob that it has a new rectangle pgob->_NewRc(); } } /*************************************************************************** Return the previous sibling for the gob. ***************************************************************************/ PGOB GOB::PgobPrevSib(void) { PGOB pgob; pgob = _pgobPar == pvNil ? _pgobScreen : _pgobPar->_pgobChd; if (pgob == this) return pvNil; for (; pgob != pvNil && pgob->_pgobSib != this; pgob = pgob->_pgobSib) ; if (pgob == pvNil) { Bug("corrupt gob tree"); return pvNil; } Assert(pgob->_pgobSib == this, "wrong logic"); return pgob; } /*************************************************************************** Return the last child of the gob. ***************************************************************************/ PGOB GOB::PgobLastChild(void) { PGOB pgob; if ((pgob = _pgobChd) == pvNil) return pvNil; for (; pgob->_pgobSib != pvNil; pgob = pgob->_pgobSib) ; Assert(pgob->_pgobSib == pvNil, "wrong logic"); return pgob; } /*************************************************************************** Create a new MDI window and attach it to the gob. ***************************************************************************/ bool GOB::FCreateAndAttachMdi(PSTN pstnTitle) { AssertThis(0); AssertPo(pstnTitle, 0); HWND hwnd; if ((hwnd = _HwndNewMdi(pstnTitle)) == hNil) return fFalse; if (!FAttachHwnd(hwnd)) { _DestroyHwnd(hwnd); return fFalse; } AssertThis(0); return fTrue; } /*************************************************************************** Static method: find the currently active MDI gob. ***************************************************************************/ PGOB GOB::PgobMdiActive(void) { HWND hwnd; if (hNil == (hwnd = HwndMdiActive())) return pvNil; return PgobFromHwnd(hwnd); } /*************************************************************************** Static method: find the first gob of the given class in the screen's gob tree. ***************************************************************************/ PGOB GOB::PgobFromClsScr(long cls) { if (pvNil == _pgobScreen) return pvNil; return _pgobScreen->PgobFromCls(cls); } /*************************************************************************** Find a gob in this gob's subtree that is of the given class. ***************************************************************************/ PGOB GOB::PgobFromCls(long cls) { AssertThis(0); GTE gte; ulong grfgte; PGOB pgob; gte.Init(this, fgteNil); while (gte.FNextGob(&pgob, &grfgte, fgteNil)) { if (pgob->FIs(cls)) return pgob; } return pvNil; } /*************************************************************************** Find a direct child of this gob of the given class. ***************************************************************************/ PGOB GOB::PgobChildFromCls(long cls) { AssertThis(0); PGOB pgob; for (pgob = _pgobChd; pvNil != pgob; pgob = pgob->_pgobSib) { if (pgob->FIs(cls)) return pgob; } return pvNil; } /*************************************************************************** Find a gob of the given class in the parent chain of this gob. ***************************************************************************/ PGOB GOB::PgobParFromCls(long cls) { AssertThis(0); PGOB pgob; for (pgob = _pgobPar; pvNil != pgob; pgob = pgob->_pgobPar) { if (pgob->FIs(cls)) return pgob; } return pvNil; } /*************************************************************************** Static method: find the first gob with the given hid in the screen's gob tree. ***************************************************************************/ PGOB GOB::PgobFromHidScr(long hid) { Assert(hid != hidNil, "nil hid"); if (pvNil == _pgobScreen) return pvNil; return _pgobScreen->PgobFromHid(hid); } /*************************************************************************** Find a gob in this gobs subtree having the given hid. ***************************************************************************/ PGOB GOB::PgobFromHid(long hid) { AssertThis(0); GTE gte; ulong grfgte; PGOB pgob; gte.Init(this, fgteNil); while (gte.FNextGob(&pgob, &grfgte, fgteNil)) { if (pgob->Hid() == hid) return pgob; } return pvNil; } /*************************************************************************** Find a direct child of this gob having the given hid. ***************************************************************************/ PGOB GOB::PgobChildFromHid(long hid) { AssertThis(0); PGOB pgob; for (pgob = _pgobChd; pvNil != pgob; pgob = pgob->_pgobSib) { if (pgob->Hid() == hid) return pgob; } return pvNil; } /*************************************************************************** Find a gob with the given hid in the parent chain of this gob. ***************************************************************************/ PGOB GOB::PgobParFromHid(long hid) { AssertThis(0); PGOB pgob; for (pgob = _pgobPar; pvNil != pgob; pgob = pgob->_pgobPar) { if (pgob->Hid() == hid) return pgob; } return pvNil; } /*************************************************************************** Find a gob in this gobs subtree having the given gob run-time id. ***************************************************************************/ PGOB GOB::PgobFromGrid(long grid) { AssertThis(0); GTE gte; ulong grfgte; PGOB pgob; gte.Init(this, fgteNil); while (gte.FNextGob(&pgob, &grfgte, fgteNil)) { if (pgob->Grid() == grid) return pgob; } return pvNil; } /*************************************************************************** Handles a close command. ***************************************************************************/ bool GOB::FCmdCloseWnd(PCMD pcmd) { AssertThis(0); Release(); return fTrue; } /*************************************************************************** Handles a mouse track command. ***************************************************************************/ bool GOB::FCmdTrackMouse(PCMD_MOUSE pcmd) { AssertThis(0); return fTrue; } /*************************************************************************** Command function to handle a key stroke. ***************************************************************************/ bool GOB::FCmdKey(PCMD_KEY pcmd) { return fFalse; } /*************************************************************************** Command function to handle a bad key command (sent by a child to its parent). ***************************************************************************/ bool GOB::FCmdBadKey(PCMD_BADKEY pcmd) { return fFalse; } /*************************************************************************** Do selection idle processing. Make sure the selection is on or off according to rglw[0] (non-zero means on) and set rglw[0] to false. Always return false. ***************************************************************************/ bool GOB::FCmdSelIdle(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); return fFalse; } /*************************************************************************** Activate the selection. Default does nothing. ***************************************************************************/ bool GOB::FCmdActivateSel(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); return fFalse; } /*************************************************************************** The mouse moved in this GOB, set the cursor. ***************************************************************************/ bool GOB::FCmdMouseMove(PCMD_MOUSE pcmd) { AssertThis(0); AssertVarMem(pcmd); vpappb->SetCurs(_pcurs); return fTrue; } /*************************************************************************** Drag the rectangle, restricting to [zpMin, zpLim). While zp is in [zpMinActive, zpLimActive), the bar is filled with solid invert, otherwise with patterned (50%) invert. ***************************************************************************/ long GOB::ZpDragRc(RC *prc, bool fVert, long zp, long zpMin, long zpLim, long zpMinActive, long zpLimActive) { RC rcBound, rcActive; PT pt, dpt; bool fActive, fActiveNew, fDown; GNV gnv(this); if (fVert) { pt.xp = 0; pt.yp = zp; rcBound.Set(0, zpMin, 1, zpLim); rcActive.Set(0, zpMinActive, 1, zpLimActive); } else { pt.xp = zp; pt.yp = 0; rcBound.Set(zpMin, 0, zpLim, 1); rcActive.Set(zpMinActive, 0, zpLimActive, 1); } // draw the initial bar fActive = rcActive.FPtIn(pt.xp, pt.yp); if (fActive) gnv.FillRc(prc, kacrInvert); else gnv.FillRcApt(prc, &vaptGray, kacrInvert, kacrClear); for (;;) { GetPtMouse(&dpt, &fDown); if (!fDown) break; // pin the pt to rcBound rcBound.PinPt(&dpt); Assert(dpt.xp == 0 || dpt.yp == 0, "bad pinned point"); if (pt == dpt) continue; // move the bar fActiveNew = rcActive.FPtIn(dpt.xp, dpt.yp); dpt -= pt; if (FPure(fActive) == FPure(fActiveNew)) { // invert the two pieces of the difference between // the new and old rectangles RC rc1, rc2; long dzp; rc1 = *prc; if (fVert) rc1.Transform(fptTranspose); rc2 = rc1; Assert(dpt.xp == 0 || dpt.yp == 0, "bad pinned point"); dzp = dpt.xp + dpt.yp; rc1.Offset(dzp, 0); if (dzp < 0) SortLw(&rc1.xpRight, &rc2.xpLeft); else SortLw(&rc2.xpRight, &rc1.xpLeft); if (fVert) { rc1.Transform(fptTranspose); rc2.Transform(fptTranspose); } if (fActive) { gnv.FillRc(&rc1, kacrInvert); gnv.FillRc(&rc2, kacrInvert); } else { gnv.FillRcApt(&rc1, &vaptGray, kacrInvert, kacrClear); gnv.FillRcApt(&rc2, &vaptGray, kacrInvert, kacrClear); } *prc += dpt; } else if (fActive) { // just draw the two gnv.FillRc(prc, kacrInvert); *prc += dpt; gnv.FillRcApt(prc, &vaptGray, kacrInvert, kacrClear); } else { // just draw the two gnv.FillRcApt(prc, &vaptGray, kacrInvert, kacrClear); *prc += dpt; gnv.FillRc(prc, kacrInvert); } fActive = fActiveNew; pt += dpt; } // erase the current bar if (fActive) gnv.FillRc(prc, kacrInvert); else gnv.FillRcApt(prc, &vaptGray, kacrInvert, kacrClear); return fVert ? pt.yp : pt.xp; } /*************************************************************************** Set the cursor for this GOB to pcurs. ***************************************************************************/ void GOB::SetCurs(PCURS pcurs) { AssertThis(0); AssertNilOrPo(pcurs, 0); SwapVars(&pcurs, &_pcurs); if (pvNil != _pcurs) _pcurs->AddRef(); ReleasePpo(&pcurs); } /*************************************************************************** Set the cursor for this GOB as indicated. ***************************************************************************/ void GOB::SetCursCno(PRCA prca, CNO cno) { AssertPo(prca, 0); PCURS pcurs; if (pvNil == (pcurs = (PCURS)prca->PbacoFetch(kctgCursor, cno, CURS::FReadCurs))) { Warn("cursor not found"); return; } SetCurs(pcurs); ReleasePpo(&pcurs); } /*************************************************************************** Return the address of the variable list belonging to this gob. When the gob is freed, the pointer is no longer valid. ***************************************************************************/ PGL *GOB::Ppglrtvm(void) { AssertThis(0); return &_pglrtvm; } /*************************************************************************** Put up a tool tip if this GOB has one. ***************************************************************************/ bool GOB::FEnsureToolTip(PGOB *ppgobCurTip, long xpMouse, long ypMouse) { AssertThis(0); AssertVarMem(ppgobCurTip); AssertNilOrPo(*ppgobCurTip, 0); return fFalse; } /*************************************************************************** Return the state of the GOB. Must be non-zero. ***************************************************************************/ long GOB::LwState(void) { AssertThis(0); return 1; } #ifdef DEBUG /*************************************************************************** Assert the validity of the GOB. ***************************************************************************/ void GOB::AssertValid(ulong grf) { GOB_PAR::AssertValid(0); if (hNil != _hwnd) { Assert(0 == _rcCur.xpLeft && 0 == _rcCur.ypTop, "_hwnd based gob not at (0, 0)"); } if (pvNil != _pgpt) { AssertPo(_pgpt, 0); } } /*************************************************************************** Mark memory referenced by the gob. ***************************************************************************/ void GOB::MarkMem(void) { AssertValid(0); GOB_PAR::MarkMem(); MarkMemObj(_pgpt); MarkMemObj(_pglrtvm); } /*************************************************************************** Mark memory for this gob and all descendent gobs. ***************************************************************************/ void GOB::MarkGobTree(void) { GTE gte; PGOB pgob; ulong grfgte; gte.Init(this, fgteNil); while (gte.FNextGob(&pgob, &grfgte, fgteNil)) { if (grfgte & fgtePre) pgob->MarkMem(); } } #endif // DEBUG /*************************************************************************** Constructor for a GOB tree enumerator. ***************************************************************************/ GTE::GTE(void) { _es = esDone; } /*************************************************************************** Initialize a GOB tree enumerator. ***************************************************************************/ void GTE::Init(PGOB pgob, ulong grfgte) { _pgobRoot = pgob; _pgobCur = pvNil; _fBackWards = FPure(grfgte & fgteBackToFront); _es = pgob == pvNil ? esDone : esStart; } /*************************************************************************** Goes to the next node in the sub tree being enumerated. Returns false iff the enumeration is done. ***************************************************************************/ bool GTE::FNextGob(PGOB *ppgob, ulong *pgrfgteOut, ulong grfgte) { PGOB pgobT; *pgrfgteOut = fgteNil; switch (_es) { case esStart: _pgobCur = _pgobRoot; *pgrfgteOut |= fgteRoot; goto LCheckForKids; case esGoDown: if (!(grfgte & fgteSkipToSib)) { pgobT = _fBackWards ? _pgobCur->PgobLastChild() : _pgobCur->_pgobChd; if (pgobT != pvNil) { _pgobCur = pgobT; goto LCheckForKids; } } // fall through case esGoRight: // go to the sibling (if there is one) or parent if (_pgobCur == _pgobRoot) { _es = esDone; return fFalse; } pgobT = _fBackWards ? _pgobCur->PgobPrevSib() : _pgobCur->_pgobSib; if (pgobT != pvNil) { _pgobCur = pgobT; LCheckForKids: *pgrfgteOut |= fgtePre; if (_pgobCur->_pgobChd == pvNil) { *pgrfgteOut |= fgtePost; _es = esGoRight; } else _es = esGoDown; } else { // no more siblings, go to parent _pgobCur = _pgobCur->_pgobPar; *pgrfgteOut |= fgtePost; if (_pgobCur == _pgobRoot) { _es = esDone; *pgrfgteOut |= fgteRoot; } else _es = esGoRight; } break; case esDone: return fFalse; } *ppgob = _pgobCur; return fTrue; } ================================================ FILE: kauai/src/gob.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Graphic object class. ***************************************************************************/ #ifndef GOB_H #define GOB_H enum { fgobNil = 0, fgobSibling = 1, // for Constructors fgobEnsureHwnd = 2, // for FInitScreen fgobNoVis = 0, // for DrawTree fgobAutoVis = 4, // for DrawTree fgobUseVis = 8, // for DrawTree }; // GOB invalidation types enum { ginNil, kginDraw, kginMark, kginSysInval, kginDefault }; const long krelOne = 0x00010000L; // denominator for relative rectangles const long krelZero = 0; #ifdef MAC inline void GetClientRect(HWND hwnd, RCS *prcs) { *prcs = hwnd->port.portRect; } inline void InvalHwndRcs(HWND hwnd, RCS *prcs) { PPRT pprt; GetPort(&pprt); SetPort(&hwnd->port); InvalRect(prcs); SetPort(pprt); } inline void ValidHwndRcs(HWND hwnd, RCS *prcs) { PPRT pprt; GetPort(&pprt); SetPort(&hwnd->port); ValidRect(prcs); SetPort(pprt); } #endif // MAC #ifdef WIN inline void InvalHwndRcs(HWND hwnd, RCS *prcs) { InvalidateRect(hwnd, prcs, fFalse); } inline void ValidHwndRcs(HWND hwnd, RCS *prcs) { ValidateRect(hwnd, prcs); } #endif // WIN // coordinates enum { cooLocal, // top-left is (0,0) cooParent, // relative to parent cooGpt, // relative to the UI port cooHwnd, // relative to the enclosing hwnd cooGlobal, // global coordinates cooLim }; /**************************************** GOB creation block ****************************************/ struct GCB { long _hid; PGOB _pgob; ulong _grfgob; long _gin; RC _rcAbs; RC _rcRel; GCB(void) { } GCB(long hid, PGOB pgob, ulong grfgob = fgobNil, long gin = kginDefault, RC *prcAbs = pvNil, RC *prcRel = pvNil) { Set(hid, pgob, grfgob, gin, prcAbs, prcRel); } void Set(long hid, PGOB pgob, ulong grfgob = fgobNil, long gin = kginDefault, RC *prcAbs = pvNil, RC *prcRel = pvNil); }; typedef GCB *PGCB; /**************************************** Graphics object ****************************************/ #define GOB_PAR CMH #define kclsGOB 'GOB' class GOB : public GOB_PAR { RTCLASS_DEC CMD_MAP_DEC(GOB) ASSERT MARKMEM friend class GTE; private: static PGOB _pgobScreen; HWND _hwnd; // the OS window (may be nil) PGPT _pgpt; // the graphics port (may be shared with _pgobPar) PCURS _pcurs; // the cursor to show over this gob RC _rcCur; // current position RC _rcVis; // current visible rectangle (in its parent) RC _rcAbs; //_rcAbs and _rcRel describe the position of this RC _rcRel; // gob in its parent. // tree management PGOB _pgobPar; PGOB _pgobChd; PGOB _pgobSib; // variables PGL _pglrtvm; void _SetRcCur(void); HWND _HwndGetDptFromCoo(PT *pdpt, long coo); protected: static long _ginDefGob; static long _gridLast; long _grid; long _ginDefault : 8; long _fFreeing : 1; long _fCreating : 1; ~GOB(void); static HWND _HwndNewMdi(PSTN pstnTitle); static void _DestroyHwnd(HWND hwnd); void _Init(PGCB pgcb); HWND _HwndGetRc(RC *prc); virtual void _NewRc(void) { } virtual void _ActivateHwnd(bool fActive) { } public: static bool FInitScreen(ulong grfgob, long ginDef); static void ShutDown(void); static PGOB PgobScreen(void) { return _pgobScreen; } static PGOB PgobFromHwnd(HWND hwnd); static PGOB PgobFromClsScr(long cls); static PGOB PgobFromHidScr(long hid); static void MakeHwndActive(HWND hwnd); static void ActivateHwnd(HWND hwnd, bool fActive); static HWND HwndMdiActive(void); static PGOB PgobMdiActive(void); static PGOB PgobFromPtGlobal(long xp, long yp, PT *pptLocal = pvNil); static long GinDefault(void) { return _ginDefGob; } GOB(GCB *pgcb); GOB(long hid); virtual void Release(void); // hwnd stuff bool FAttachHwnd(HWND hwnd); bool FCreateAndAttachMdi(PSTN pstnTitle); HWND Hwnd(void) { return _hwnd; } HWND HwndContainer(void); virtual void GetMinMax(RC *prcMinMax); void SetHwndName(PSTN pstn); // unique gob run-time id. long Grid(void) { return _grid; } // tree management PGOB PgobPar(void) { return _pgobPar; } PGOB PgobFirstChild(void) { return _pgobChd; } PGOB PgobLastChild(void); PGOB PgobNextSib(void) { return _pgobSib; } PGOB PgobPrevSib(void); PGOB PgobFromCls(long cls); PGOB PgobChildFromCls(long cls); PGOB PgobParFromCls(long cls); PGOB PgobFromHid(long hid); PGOB PgobChildFromHid(long hid); PGOB PgobParFromHid(long hid); PGOB PgobFromGrid(long grid); void BringToFront(void); void SendBehind(PGOB pgobBefore); // rectangle management void SetPos(RC *prcAbs, RC *prcRel = pvNil); void GetPos(RC *prcAbs, RC *prcRel); void GetRc(RC *prc, long coo); void GetRcVis(RC *prc, long coo); void SetRcFromHwnd(void); virtual void Maximize(void); void MapPt(PT *ppt, long cooSrc, long cooDst); void MapRc(RC *prc, long cooSrc, long cooDst); // variables virtual PGL *Ppglrtvm(void); PGPT Pgpt(void) { return _pgpt; } void InvalRc(RC *prc, long gin = kginDefault); void ValidRc(RC *prc, long gin = kginDefault); bool FGetRcInval(RC *prc, long gin = kginDefault); void Scroll(RC *prc, long dxp, long dyp, long gin, RC *prcBad1 = pvNil, RC *prcBad2 = pvNil); virtual void Clean(void); virtual void DrawTree(PGPT pgpt, RC *prc, RC *prcUpdate, ulong grfgob); virtual void DrawTreeRgn(PGPT pgpt, RC *prc, REGN *pregn, ulong grfgob); virtual void Draw(PGNV pgnv, RC *prcClip); // mouse handling and hit testing void GetPtMouse(PT *ppt, bool *pfDown); virtual PGOB PgobFromPt(long xp, long yp, PT *pptLocal = pvNil); virtual bool FPtIn(long xp, long yp); virtual bool FPtInBounds(long xp, long yp); virtual void MouseDown(long xp, long yp, long cact, ulong grfcust); virtual long ZpDragRc(RC *prc, bool fVert, long zp, long zpMin, long zpLim, long zpMinActive, long zpLimActive); void SetCurs(PCURS pcurs); void SetCursCno(PRCA prca, CNO cno); #ifdef MAC virtual void TrackGrow(PEVT pevt); #endif // MAC // command functions virtual bool FCmdCloseWnd(PCMD pcmd); virtual bool FCmdTrackMouse(PCMD_MOUSE pcmd); bool FCmdTrackMouseCore(PCMD pcmd) { return FCmdTrackMouse((PCMD_MOUSE)pcmd); } virtual bool FCmdMouseMove(PCMD_MOUSE pcmd); bool FCmdMouseMoveCore(PCMD pcmd) { return FCmdMouseMove((PCMD_MOUSE)pcmd); } // key commands virtual bool FCmdKey(PCMD_KEY pcmd); bool FCmdKeyCore(PCMD pcmd) { return FCmdKey((PCMD_KEY)pcmd); } virtual bool FCmdBadKey(PCMD_BADKEY pcmd); bool FCmdBadKeyCore(PCMD pcmd) { return FCmdBadKey((PCMD_BADKEY)pcmd); } virtual bool FCmdSelIdle(PCMD pcmd); virtual bool FCmdActivateSel(PCMD pcmd); // tool tips virtual bool FEnsureToolTip(PGOB *ppgobCurTip, long xpMouse, long ypMouse); // gob state (for automated testing) virtual long LwState(void); #ifdef DEBUG void MarkGobTree(void); #endif // DEBUG }; /**************************************** Gob Tree Enumerator ****************************************/ enum { // inputs fgteNil = 0x0000, fgteSkipToSib = 0x0001, // legal to FNextGob fgteBackToFront = 0x0002, // legal to Init // outputs fgtePre = 0x0010, fgtePost = 0x0020, fgteRoot = 0x0040 }; #define GTE_PAR BASE #define kclsGTE 'GTE' class GTE : public GTE_PAR { RTCLASS_DEC ASSERT private: // enumeration states enum { esStart, esGoDown, esGoRight, esDone }; long _es; bool _fBackWards; // which way to walk sibling lists PGOB _pgobRoot; PGOB _pgobCur; public: GTE(void); void Init(PGOB pgob, ulong grfgte); bool FNextGob(PGOB *ppgob, ulong *pgrfgteOut, ulong grfgteIn); }; #endif //! GOB_H ================================================ FILE: kauai/src/gobmac.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Graphic object class. ***************************************************************************/ #include "frame.h" ASSERTNAME PGOB GOB::_pgobScreen; #define kswKindGob 0x526F /*************************************************************************** Create the screen gob. If fgobEnsureHwnd is set, ensures that the screen gob has an OS window associated with it. ***************************************************************************/ bool GOB::FInitScreen(ulong grfgob, long ginDef) { PGOB pgob; switch (ginDef) { case kginDraw: case kginMark: case kginSysInval: _ginDefGob = ginDef; break; } if ((pgob = NewObj GOB(khidScreen)) == pvNil) return fFalse; Assert(pgob == _pgobScreen, 0); if (grfgob & fgobEnsureHwnd) { // REVIEW shonk: create the hwnd and attach it RawRtn(); } return fTrue; } /*************************************************************************** Make the GOB a wrapper for the given system window. ***************************************************************************/ bool GOB::FAttachHwnd(HWND hwnd) { if (_hwnd != hNil) { ReleasePpo(&_pgpt); // don't destroy the hwnd _hwnd = hNil; _hwnd->refCon = 0; } if (hwnd != hNil) { if ((_pgpt = GPT::PgptNew(&hwnd->port)) == pvNil) return fFalse; _hwnd = hwnd; if (_hwnd->windowKind != dialogKind) _hwnd->windowKind = kswKindGob; _hwnd->refCon = (long)this; SetRcFromHwnd(); } return fTrue; } /*************************************************************************** Find the GOB associated with the given hwnd (if there is one). ***************************************************************************/ PGOB GOB::PgobFromHwnd(HWND hwnd) { Assert(hwnd != hNil, "nil hwnd"); PGOB pgob; if (hwnd->windowKind != kswKindGob && hwnd->windowKind != dialogKind) return pvNil; pgob = (PGOB)hwnd->refCon; AssertNilOrPo(pgob, 0); return pgob; } /*************************************************************************** Static method to get the next ***************************************************************************/ HWND GOB::HwndMdiActive(void) { HWND hwnd; if (hNil == (hwnd = (HWND)FrontWindow())) return hNil; if (hwnd->windowKind < userKind) return hNil; if (pvNil != _pgobScreen && _pgobScreen->_hwnd == hwnd) return hNil; return hwnd; } /*************************************************************************** Creates a new MDI window and returns it. This is normally then attached to a gob. ***************************************************************************/ HWND GOB::_HwndNewMdi(PSTZ pstzTitle) { HWND hwnd; RCS rcs; static long _cact = 0; rcs = qd.screenBits.bounds; rcs.top += GetMBarHeight() + 25; // menu bar and title rcs.left += 5; rcs.right -= 105; rcs.bottom -= 105; OffsetRect(&rcs, _cact * 20, _cact * 20); _cact = (_cact + 1) % 5; hwnd = (HWND)NewCWindow(pvNil, &rcs, (byte *)pstzTitle, fTrue, documentProc, GrafPtr(-1), fTrue, 0); if (hNil != hwnd && pvNil != vpmubCur) vpmubCur->FAddListCid(cidChooseWnd, (long)hwnd, pstzTitle); return hwnd; } /*************************************************************************** Destroy an hwnd. ***************************************************************************/ void GOB::_DestroyHwnd(HWND hwnd) { if (pvNil != vpmubCur) vpmubCur->FRemoveListCid(cidChooseWnd, (long)hwnd); DisposeWindow((PPRT)hwnd); } /*************************************************************************** The grow area has been hit, track it and resize the window. ***************************************************************************/ void GOB::TrackGrow(PEVT pevt) { Assert(_hwnd != hNil, "gob has no hwnd"); Assert(pevt->what == mouseDown, "wrong EVT"); long lw; RC rc; RCS rcs; GetMinMax(&rc); rcs = RCS(rc); if ((lw = GrowWindow(&_hwnd->port, pevt->where, &rcs)) != 0) { SizeWindow(&_hwnd->port, SwLow(lw), SwHigh(lw), fFalse); _SetRcCur(); } } /*************************************************************************** Gets the current mouse location in this gob's coordinates (if ppt is not nil) and determines if the mouse button is down (if pfDown is not nil). ***************************************************************************/ void GOB::GetPtMouse(PT *ppt, bool *pfDown) { if (ppt != pvNil) { PTS pts; long xp, yp; PGOB pgob; PPRT pprtSav, pprt; xp = yp = 0; for (pgob = this; pgob != pvNil && pgob->_hwnd == hNil; pgob = pgob->_pgobPar) { xp += pgob->_rcCur.xpLeft; yp += pgob->_rcCur.ypTop; } if (pvNil != pgob) pprt = &pgob->_hwnd->port; else GetWMgrPort(&pprt); GetPort(&pprtSav); SetPort(pprt); GetMouse(&pts); SetPort(pprtSav); *ppt = pts; ppt->xp -= xp; ppt->yp -= yp; } if (pfDown != pvNil) *pfDown = FPure(Button()); } /*************************************************************************** Makes sure the GOB is clean (no update is pending). ***************************************************************************/ void GOB::Clean(void) { AssertThis(0); HWND hwnd; RC rc, rcT; RCS rcs; PPRT pprt; if (hNil == (hwnd = _HwndGetRc(&rc))) return; vpappb->InvalMarked(hwnd); rcs = (*hwnd->updateRgn)->rgnBBox; GetPort(&pprt); SetPort(&hwnd->port); GlobalToLocal((PTS *)&rcs); GlobalToLocal((PTS *)&rcs + 1); rcT = rcs; if (!rc.FIntersect(&rcT)) { SetPort(pprt); return; } BeginUpdate(&hwnd->port); vpappb->UpdateHwnd(hwnd, &rc); EndUpdate(&hwnd->port); SetPort(pprt); } /*************************************************************************** Set the window name. ***************************************************************************/ void GOB::SetHwndName(PSTZ pstz) { if (hNil == _hwnd) { Bug("GOB doesn't have an hwnd"); return; } if (pvNil != vpmubCur) { vpmubCur->FChangeListCid(cidChooseWnd, (long)_hwnd, pvNil, (long)_hwnd, pstz); } SetWTitle(&_hwnd->port, (byte *)pstz); } /*************************************************************************** Static method. If this hwnd is one of our MDI windows, make it the active MDI window. ***************************************************************************/ void GOB::MakeHwndActive(HWND hwnd) { Assert(hwnd != hNil, "nil hwnd"); GTE gte; ulong grfgte; PGOB pgob; gte.Init(_pgobScreen, fgteNil); while (gte.FNextGob(&pgob, &grfgte, fgteNil)) { if (pgob->_hwnd == hwnd) { SelectWindow(&hwnd->port); return; } } } ================================================ FILE: kauai/src/gobwin.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Graphic object class. ***************************************************************************/ #include "frame.h" ASSERTNAME PGOB GOB::_pgobScreen; /*************************************************************************** Create the screen gob. If fgobEnsureHwnd is set, ensures that the screen gob has an OS window associated with it. ***************************************************************************/ bool GOB::FInitScreen(ulong grfgob, long ginDef) { PGOB pgob; GCB gcb(khidScreen, pvNil); switch (ginDef) { case kginDraw: case kginMark: case kginSysInval: _ginDefGob = ginDef; break; } if (pvNil == (pgob = NewObj GOB(&gcb))) return fFalse; Assert(pgob == _pgobScreen, 0); if (!pgob->FAttachHwnd(vwig.hwndApp)) return fFalse; return fTrue; } /*************************************************************************** Make the GOB a wrapper for the given system window. ***************************************************************************/ bool GOB::FAttachHwnd(HWND hwnd) { if (_hwnd != hNil) { ReleasePpo(&_pgpt); // don't destroy the hwnd - the caller must do that _hwnd = hNil; } if (hwnd != hNil) { if (pvNil == (_pgpt = GPT::PgptNewHwnd(hwnd))) return fFalse; _hwnd = hwnd; SetRcFromHwnd(); } return fTrue; } /*************************************************************************** Find the GOB associated with the given hwnd (if there is one). ***************************************************************************/ PGOB GOB::PgobFromHwnd(HWND hwnd) { // NOTE: we used to use SetProp and GetProp for this, but profiling // indicated that GetProp is very slow. Assert(hwnd != hNil, "nil hwnd"); GTE gte; ulong grfgte; PGOB pgob; gte.Init(_pgobScreen, fgteNil); while (gte.FNextGob(&pgob, &grfgte, fgteNil)) { if (pgob->_hwnd == hwnd) return pgob; } return pvNil; } /*************************************************************************** Return the active MDI window. ***************************************************************************/ HWND GOB::HwndMdiActive(void) { if (vwig.hwndClient == hNil) return hNil; return (HWND)SendMessage(vwig.hwndClient, WM_MDIGETACTIVE, 0, 0); } /*************************************************************************** Creates a new MDI window and returns it. This is normally then attached to a gob. ***************************************************************************/ HWND GOB::_HwndNewMdi(PSTN pstnTitle) { AssertPo(pstnTitle, 0); HWND hwnd, hwndT; long lwStyle; if (vwig.hwndClient == hNil) { // create the client first CLIENTCREATESTRUCT ccs; RCS rcs; ccs.hWindowMenu = hNil; ccs.idFirstChild = 1; GetClientRect(vwig.hwndApp, &rcs); Assert(rcs.left == 0 && rcs.top == 0, 0); vwig.hwndClient = CreateWindow(PszLit("MDICLIENT"), NULL, WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE, 0, 0, rcs.right, rcs.bottom, vwig.hwndApp, NULL, vwig.hinst, (LPVOID)&ccs); if (vwig.hwndClient == hNil) return hNil; } lwStyle = MDIS_ALLCHILDSTYLES | WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_SYSMENU | WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX; hwndT = HwndMdiActive(); if (hNil == hwndT || IsZoomed(hwndT)) lwStyle |= WS_MAXIMIZE; hwnd = CreateMDIWindow(PszLit("MDI"), pstnTitle->Psz(), lwStyle, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, vwig.hwndClient, vwig.hinst, 0L); if (hNil != hwnd && pvNil != vpmubCur) vpmubCur->FAddListCid(cidChooseWnd, (long)hwnd, pstnTitle); return hwnd; } /*************************************************************************** Destroy an hwnd. ***************************************************************************/ void GOB::_DestroyHwnd(HWND hwnd) { if (hwnd == vwig.hwndApp) { Bug("can't destroy app window"); return; } if (GetParent(hwnd) == vwig.hwndClient && vwig.hwndClient != hNil) { if (pvNil != vpmubCur) vpmubCur->FRemoveListCid(cidChooseWnd, (long)hwnd); SendMessage(vwig.hwndClient, WM_MDIDESTROY, (WPARAM)hwnd, 0); } else DestroyWindow(hwnd); } /*************************************************************************** Gets the current mouse location in this gob's coordinates (if ppt is not nil) and determines if the mouse button is down (if pfDown is not nil). ***************************************************************************/ void GOB::GetPtMouse(PT *ppt, bool *pfDown) { AssertThis(0); if (ppt != pvNil) { PTS pts; long xp, yp; PGOB pgob; xp = yp = 0; for (pgob = this; pgob != pvNil && pgob->_hwnd == hNil; pgob = pgob->_pgobPar) { xp += pgob->_rcCur.xpLeft; yp += pgob->_rcCur.ypTop; } GetCursorPos(&pts); if (pgob != pvNil) ScreenToClient(pgob->_hwnd, &pts); *ppt = PT(pts); ppt->xp -= xp; ppt->yp -= yp; } if (pfDown != pvNil) *pfDown = GetAsyncKeyState(VK_LBUTTON) < 0; } /*************************************************************************** Makes sure the GOB is clean (no update is pending). ***************************************************************************/ void GOB::Clean(void) { AssertThis(0); HWND hwnd; RC rc, rcT; RCS rcs; if (hNil == (hwnd = _HwndGetRc(&rc))) return; vpappb->InvalMarked(hwnd); GetUpdateRect(hwnd, &rcs, fFalse); rcT = RC(rcs); if (rc.FIntersect(&rcT)) UpdateWindow(hwnd); } /*************************************************************************** Set the window name. ***************************************************************************/ void GOB::SetHwndName(PSTN pstn) { if (hNil == _hwnd) { Bug("GOB doesn't have an hwnd"); return; } if (pvNil != vpmubCur) { vpmubCur->FChangeListCid(cidChooseWnd, (long)_hwnd, pvNil, (long)_hwnd, pstn); } SetWindowText(_hwnd, pstn->Psz()); } /*************************************************************************** If this is one of our MDI windows, make it the active MDI window. ***************************************************************************/ void GOB::MakeHwndActive(HWND hwnd) { if (IsWindow(hwnd) && GetParent(hwnd) == vwig.hwndClient && vwig.hwndClient != hNil) SendMessage(vwig.hwndClient, WM_MDIACTIVATE, (WPARAM)hwnd, 0); } ================================================ FILE: kauai/src/groups.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Basic collection classes: General List (GL), Allocated List (AL), General Group (GG), Allocated Group (AG), General String Table (GST), Allocated String Table (AST). BASE ---> GRPB -+-> GLB -+-> GL | +-> AL | +-> GGB -+-> GG | +-> AG | +-> GSTB-+-> GST +-> AST ***************************************************************************/ #include "util.h" ASSERTNAME RTCLASS(GRPB) RTCLASS(GLB) RTCLASS(GL) RTCLASS(AL) RTCLASS(GGB) RTCLASS(GG) RTCLASS(AG) /*************************************************************************** GRPB: Manages two sections of data. Currently the two sections are in two separate hq's, but they could be in one without affecting the clients. The actual data in the two sections is determined by the subclass (client). This class just manages resizing the data sections. ***************************************************************************/ /*************************************************************************** Destructor for GRPB. Frees the hq. ***************************************************************************/ GRPB::~GRPB(void) { AssertThis(0); FreePhq(&_hqData1); FreePhq(&_hqData2); } /*************************************************************************** Ensure that the two sections are at least the given cb's large. if (grfgrp & fgrpShrink), makes them exact. ***************************************************************************/ bool GRPB::_FEnsureSizes(long cbMin1, long cbMin2, ulong grfgrp) { AssertThis(0); Assert(cbMin1 >= 0 && cbMin2 >= 0, "negative sizes"); if (grfgrp & fgrpShrink) { // shrink anything that's too big if (cbMin1 == 0) { FreePhq(&_hqData1); _cb1 = 0; } else if (cbMin1 < _cb1) { FResizePhq(&_hqData1, cbMin1, fmemNil, mprNormal); _cb1 = cbMin1; } if (cbMin2 == 0) { FreePhq(&_hqData2); _cb2 = 0; } else if (cbMin2 < _cb2) { FResizePhq(&_hqData2, cbMin2, fmemNil, mprNormal); _cb2 = cbMin2; } } if (cbMin1 > _cb1 && !_FEnsureHqCb(&_hqData1, cbMin1, _cbMinGrow1, &_cb1)) return fFalse; if (cbMin2 > _cb2 && !_FEnsureHqCb(&_hqData2, cbMin2, _cbMinGrow2, &_cb2)) return fFalse; AssertThis(0); return fTrue; } /*************************************************************************** Ensure that the given HQ is large enough. ***************************************************************************/ bool GRPB::_FEnsureHqCb(HQ *phq, long cb, long cbMinGrow, long *pcb) { AssertVarMem(phq); AssertIn(cbMinGrow, 0, kcbMax); AssertVarMem(pcb); AssertIn(*pcb, 0, kcbMax); // limit the size if ((ulong)cb >= kcbMax) return fFalse; AssertIn(cb, *pcb + 1, kcbMax); if (hqNil != *phq) { // resize an existing hq AssertHq(*phq); if ((cbMinGrow += *pcb) > cb && FResizePhq(phq, cbMinGrow, fmemNil, mprForSpeed)) { *pcb = cbMinGrow; return fTrue; } else if (FResizePhq(phq, cb, fmemNil, mprNormal)) { *pcb = cb; return fTrue; } return fFalse; } // just allocate the thing Assert(*pcb == 0, "bad cb"); if (cbMinGrow > cb && FAllocHq(phq, cbMinGrow, fmemNil, mprForSpeed)) { *pcb = cbMinGrow; return fTrue; } else if (FAllocHq(phq, cb, fmemNil, mprNormal)) { *pcb = cb; return fTrue; } return fFalse; } /*************************************************************************** Make the given GRPB a duplicate of this one. ***************************************************************************/ bool GRPB::_FDup(PGRPB pgrpbDst, long cb1, long cb2) { AssertThis(0); AssertPo(pgrpbDst, 0); AssertIn(cb1, 0, kcbMax); AssertIn(cb2, 0, kcbMax); if (!pgrpbDst->_FEnsureSizes(cb1, cb2, fgrpShrink)) return fFalse; if (cb1 > 0) CopyPb(_Qb1(0), pgrpbDst->_Qb1(0), cb1); if (cb2 > 0) CopyPb(_Qb2(0), pgrpbDst->_Qb2(0), cb2); pgrpbDst->_cbMinGrow1 = _cbMinGrow1; pgrpbDst->_cbMinGrow2 = _cbMinGrow2; pgrpbDst->_ivMac = _ivMac; AssertPo(pgrpbDst, 0); return fTrue; } /*************************************************************************** Write a group to a flo. ***************************************************************************/ bool GRPB::FWriteFlo(PFLO pflo, short bo, short osk) { BLCK blck(pflo); return FWrite(&blck, bo, osk); } /*************************************************************************** Write the GRPB data to the block. First write the (pv, cb), then cb1 bytes from the first section and cb2 bytes from the second. ***************************************************************************/ bool GRPB::_FWrite(PBLCK pblck, void *pv, long cb, long cb1, long cb2) { AssertPo(pblck, 0); AssertIn(cb, 1, kcbMax); AssertPvCb(pv, cb); AssertIn(cb1, 0, _cb1 + 1); AssertIn(cb2, 0, _cb2 + 1); bool fRet = fFalse; if (pblck->Cb() != cb + cb1 + cb2) { Bug("blck wrong size"); return fFalse; } if (!pblck->FWriteRgb(pv, cb, 0)) return fFalse; if (cb1 > 0) { fRet = pblck->FWriteRgb(PvLockHq(_hqData1), cb1, cb); UnlockHq(_hqData1); if (!fRet) return fFalse; } if (cb2 > 0) { fRet = pblck->FWriteRgb(PvLockHq(_hqData2), cb2, cb + cb1); UnlockHq(_hqData2); if (!fRet) return fFalse; } return fTrue; } /*************************************************************************** Read the two sections of data from the given location in the given block. ***************************************************************************/ bool GRPB::_FReadData(PBLCK pblck, long cb1, long cb2, long ib) { AssertPo(pblck, fblckUnpacked); AssertIn(cb1, 0, kcbMax); AssertIn(cb2, 0, kcbMax); bool fRet; if (cb1 == 0 && cb2 == 0) return fTrue; if (!_FEnsureSizes(cb1, cb2, fgrpNil)) return fFalse; if (cb1 > 0) { fRet = pblck->FReadRgb(PvLockHq(_hqData1), cb1, ib); UnlockHq(_hqData1); if (!fRet) return fFalse; } if (cb2 > 0) { fRet = pblck->FReadRgb(PvLockHq(_hqData2), cb2, ib + cb1); UnlockHq(_hqData2); if (!fRet) return fFalse; } return fTrue; } #ifdef DEBUG /*************************************************************************** Assert the validity of the grpb stuff. ***************************************************************************/ void GRPB::AssertValid(ulong grfobj) { GRPB_PAR::AssertValid(grfobj | fobjAllocated); AssertIn(_cb1, 0, kcbMax); AssertIn(_cb2, 0, kcbMax); Assert((_cb1 == 0) == (_hqData1 == hqNil), "cb's don't match _hqData1"); Assert((_cb2 == 0) == (_hqData2 == hqNil), "cb's don't match _hqData2"); Assert(_hqData1 == hqNil || CbOfHq(_hqData1) == _cb1, "_hqData1 wrong size"); Assert(_hqData2 == hqNil || CbOfHq(_hqData2) == _cb2, "_hqData2 wrong size"); } /*************************************************************************** Mark the _hqData blocks. ***************************************************************************/ void GRPB::MarkMem(void) { AssertThis(0); GRPB_PAR::MarkMem(); MarkHq(_hqData1); MarkHq(_hqData2); } #endif // DEBUG /*************************************************************************** GLB: Base class for GL (general list) and AL (general allocated list). The list data goes in section 1. The GL class doesn't use section 2. The AL class uses section 2 for a bit array indicating whether an entry is free or in use. ***************************************************************************/ /*************************************************************************** Constructor for the list base. ***************************************************************************/ GLB::GLB(long cb) { AssertIn(cb, 0, kcbMax); _cbEntry = cb; // use some reasonable values for _cbMinGrow* - code can always set // set these to something else _cbMinGrow1 = 128; _cbMinGrow2 = 16; AssertThis(0); } /*************************************************************************** Return a volatile pointer to a list entry. NOTE: don't assert !FFree(iv) for allocated lists. ***************************************************************************/ void *GLB::QvGet(long iv) { AssertThis(0); AssertIn(iv, 0, _ivMac + 1); return (0 == _ivMac) ? pvNil : _Qb1(LwMul(iv, _cbEntry)); } /*************************************************************************** Get the data for the iv'th element in the GLB. ***************************************************************************/ void GLB::Get(long iv, void *pv) { AssertThis(0); AssertIn(iv, 0, _ivMac); AssertPvCb(pv, _cbEntry); CopyPb(QvGet(iv), pv, _cbEntry); } /*************************************************************************** Put data into the iv'th element in the GLB. ***************************************************************************/ void GLB::Put(long iv, void *pv) { AssertThis(0); AssertIn(iv, 0, _ivMac); AssertPvCb(pv, _cbEntry); CopyPb(pv, QvGet(iv), _cbEntry); AssertThis(0); } /*************************************************************************** Lock the data and return a pointer to the ith item. ***************************************************************************/ void *GLB::PvLock(long iv) { Lock(); return QvGet(iv); } /*************************************************************************** Set the minimum that a GL should grow by. ***************************************************************************/ void GLB::SetMinGrow(long cvAdd) { AssertThis(0); AssertIn(cvAdd, 0, kcbMax); _cbMinGrow1 = CbRoundToLong(LwMul(cvAdd, _cbEntry)); _cbMinGrow2 = CbRoundToLong(LwDivAway(cvAdd, 8)); } #ifdef DEBUG /*************************************************************************** Assert the validity of a list (GL or AL). ***************************************************************************/ void GLB::AssertValid(ulong grfobj) { GLB_PAR::AssertValid(grfobj); AssertIn(_cbEntry, 1, kcbMax); AssertIn(_ivMac, 0, kcbMax); Assert(_Cb1() >= LwMul(_cbEntry, _ivMac), "array area too small"); } #endif // DEBUG /*************************************************************************** Allocate a new list and ensure that it has space for cvInit elements. ***************************************************************************/ PGL GL::PglNew(long cb, long cvInit) { AssertIn(cb, 1, kcbMax); AssertIn(cvInit, 0, kcbMax); PGL pgl; if ((pgl = NewObj GL(cb)) == pvNil) return pvNil; if (cvInit > 0 && !pgl->FEnsureSpace(cvInit, fgrpNil)) { ReleasePpo(&pgl); return pvNil; } AssertPo(pgl, 0); return pgl; } /*************************************************************************** Read a list from a block and return it. ***************************************************************************/ PGL GL::PglRead(PBLCK pblck, short *pbo, short *posk) { AssertPo(pblck, 0); AssertNilOrVarMem(pbo); AssertNilOrVarMem(posk); PGL pgl; /* the use of 4 for the cb is bogus, but _FRead overwrites the cb anyway */ if ((pgl = NewObj GL(4)) == pvNil) goto LFail; if (!pgl->_FRead(pblck, pbo, posk)) { ReleasePpo(&pgl); LFail: TrashVar(pbo); TrashVar(posk); return pvNil; } AssertPo(pgl, 0); return pgl; } /*************************************************************************** Read a list from file and return it. ***************************************************************************/ PGL GL::PglRead(PFIL pfil, FP fp, long cb, short *pbo, short *posk) { BLCK blck(pfil, fp, cb); return PglRead(&blck, pbo, posk); } /*************************************************************************** Constructor for GL. ***************************************************************************/ GL::GL(long cb) : GLB(cb) { AssertThis(0); } /*************************************************************************** Provided for completeness (all GRPB's have an FFree routine). Returns false iff iv is a valid index for the GL. ***************************************************************************/ bool GL::FFree(long iv) { AssertThis(0); return !FIn(iv, 0, _ivMac); } /*************************************************************************** Duplicate this GL. ***************************************************************************/ PGL GL::PglDup(void) { AssertThis(0); PGL pgl; if (pvNil == (pgl = PglNew(_cbEntry))) return pvNil; if (!_FDup(pgl, LwMul(_ivMac, _cbEntry), 0)) ReleasePpo(&pgl); AssertNilOrPo(pgl, 0); return pgl; } // List on file struct GLF { short bo; short osk; long cbEntry; long ivMac; }; const BOM kbomGlf = 0x5F000000L; /*************************************************************************** Return the amount of space on file needed for the list. ***************************************************************************/ long GL::CbOnFile(void) { AssertThis(0); return size(GLF) + LwMul(_cbEntry, _ivMac); } /*************************************************************************** Write the list to disk. ***************************************************************************/ bool GL::FWrite(PBLCK pblck, short bo, short osk) { AssertThis(0); AssertPo(pblck, 0); Assert(kboCur == bo || kboOther == bo, "bad bo"); AssertOsk(osk); GLF glf; glf.bo = kboCur; glf.osk = osk; glf.cbEntry = _cbEntry; glf.ivMac = _ivMac; if (kboOther == bo) { SwapBytesBom(&glf, kbomGlf); Assert(glf.bo == bo, "wrong bo"); Assert(glf.osk == osk, "osk not invariant under byte swapping"); } return _FWrite(pblck, &glf, size(glf), LwMul(_cbEntry, _ivMac), 0); } /*************************************************************************** Read list data from disk. ***************************************************************************/ bool GL::_FRead(PBLCK pblck, short *pbo, short *posk) { AssertThis(0); AssertPo(pblck, 0); AssertNilOrVarMem(pbo); AssertNilOrVarMem(posk); GLF glf; long cb; bool fRet = fFalse; if (!pblck->FUnpackData()) goto LFail; cb = pblck->Cb(); if (cb < size(glf)) goto LBug; if (!pblck->FReadRgb(&glf, size(glf), 0)) goto LFail; if (pbo != pvNil) *pbo = glf.bo; if (posk != pvNil) *posk = glf.osk; if (glf.bo == kboOther) SwapBytesBom(&glf, kbomGlf); cb -= size(glf); if (glf.bo != kboCur || glf.cbEntry <= 0 || glf.ivMac < 0 || cb != glf.cbEntry * glf.ivMac) { LBug: Warn("file corrupt or not a GL"); goto LFail; } _cbEntry = glf.cbEntry; _ivMac = glf.ivMac; fRet = _FReadData(pblck, cb, 0, size(glf)); LFail: TrashVarIf(!fRet, pbo); TrashVarIf(!fRet, posk); return fRet; } /*************************************************************************** Insert some items into a list at position iv. iv should be <= IvMac(). ***************************************************************************/ bool GL::FInsert(long iv, void *pv, long cv) { AssertThis(0); AssertIn(iv, 0, _ivMac + 1); AssertIn(cv, 1, kcbMax); AssertNilOrPvCb(pv, LwMul(cv, _cbEntry)); byte *qb; long cbTot, cbIns, ibIns; cbTot = LwMul(_ivMac + cv, _cbEntry); cbIns = LwMul(cv, _cbEntry); ibIns = LwMul(iv, _cbEntry); if (cbTot > _Cb1() && !_FEnsureSizes(cbTot, 0, fgrpNil)) return fFalse; qb = _Qb1(ibIns); if (iv < _ivMac) BltPb(qb, qb + cbIns, cbTot - cbIns - ibIns); if (pvNil != pv) CopyPb(pv, qb, cbIns); _ivMac += cv; AssertThis(0); return fTrue; } /*************************************************************************** Delete an element from the list. This changes the indices of all later elements. ***************************************************************************/ void GL::Delete(long iv) { AssertThis(0); Delete(iv, 1); } /*************************************************************************** Delete a range of elements. This changes the indices of all later elements. ***************************************************************************/ void GL::Delete(long ivMin, long cv) { AssertThis(0); AssertIn(ivMin, 0, _ivMac); AssertIn(cv, 1, _ivMac - ivMin + 1); if (ivMin < (_ivMac -= cv)) { byte *qb = _Qb1(LwMul(ivMin, _cbEntry)); BltPb(qb + LwMul(cv, _cbEntry), qb, LwMul(_ivMac - ivMin, _cbEntry)); } TrashPvCb(_Qb1(LwMul(_ivMac, _cbEntry)), LwMul(cv, _cbEntry)); AssertThis(0); } /*************************************************************************** Move the entry at ivSrc to be immediately before the element that is currently at ivTarget. If ivTarget > ivSrc, the entry actually ends up at (ivTarget - 1) and the entry at ivTarget doesn't move. If ivTarget < ivSrc, the entry ends up at ivTarget and the entry at ivTarget moves to (ivTarget + 1). Everything in between is shifted appropriately. ivTarget is allowed to be equal to IvMac(). ***************************************************************************/ void GL::Move(long ivSrc, long ivTarget) { AssertThis(0); AssertIn(ivSrc, 0, _ivMac); AssertIn(ivTarget, 0, _ivMac + 1); MoveElement(_Qb1(0), _cbEntry, ivSrc, ivTarget); AssertThis(0); } /*************************************************************************** Add an element to the end of the list. Returns the location in *piv. On failure, returns false and *piv is undefined. ***************************************************************************/ bool GL::FAdd(void *pv, long *piv) { AssertThis(0); AssertNilOrVarMem(piv); if (piv != pvNil) *piv = _ivMac; if (!FInsert(_ivMac, pv)) { TrashVar(piv); return fFalse; } return fTrue; } /*************************************************************************** Stack operation. Returns fFalse on stack underflow. ***************************************************************************/ bool GL::FPop(void *pv) { AssertThis(0); AssertNilOrPvCb(pv, _cbEntry); if (_ivMac == 0) { TrashPvCb(pv, _cbEntry); return fFalse; } if (pv != pvNil) Get(_ivMac - 1, pv); _ivMac--; TrashPvCb(_Qb1(LwMul(_ivMac, _cbEntry)), _cbEntry); return fTrue; } /*************************************************************************** Set the number of elements. Used rarely (to add a block of elements at a time or to "zero out" a list. ***************************************************************************/ bool GL::FSetIvMac(long ivMacNew) { AssertThis(0); AssertIn(ivMacNew, 0, kcbMax); long cb; if (ivMacNew > _ivMac) { if (ivMacNew > kcbMax / _cbEntry) { Bug("who's trying to allocate a list this big?"); return fFalse; } cb = LwMul(ivMacNew, _cbEntry); if (cb > _Cb1() && !_FEnsureSizes(cb, 0, fgrpNil)) return fFalse; TrashPvCb(_Qb1(LwMul(_ivMac, _cbEntry)), LwMul(ivMacNew - _ivMac, _cbEntry)); } #ifdef DEBUG else if (ivMacNew < _ivMac) { TrashPvCb(_Qb1(LwMul(ivMacNew, _cbEntry)), LwMul(_ivMac - ivMacNew, _cbEntry)); } #endif // DEBUG _ivMac = ivMacNew; AssertThis(0); return fTrue; } /*************************************************************************** Make sure there is room for at least cvAdd additional entries. If fgrpShrink is set, will shrink the list if it has more than cvAdd available entries. ***************************************************************************/ bool GL::FEnsureSpace(long cvAdd, ulong grfgrp) { AssertThis(0); AssertIn(cvAdd, 0, kcbMax); // limit the size of the list if (cvAdd > kcbMax / _cbEntry - _ivMac) { Bug("who's trying to allocate a list this big?"); return fFalse; } return _FEnsureSizes(LwMul(cvAdd + _ivMac, _cbEntry), 0, grfgrp); } /*************************************************************************** Allocate a new allocated list and ensure that it has space for cvInit elements. ***************************************************************************/ PAL AL::PalNew(long cb, long cvInit) { AssertIn(cb, 1, kcbMax); AssertIn(cvInit, 0, kcbMax); PAL pal; if ((pal = NewObj AL(cb)) == pvNil) return pvNil; if (cvInit > 0 && !pal->FEnsureSpace(cvInit, fgrpNil)) { ReleasePpo(&pal); return pvNil; } AssertPo(pal, 0); return pal; } /*************************************************************************** Read an allocated list from the block and return it. ***************************************************************************/ PAL AL::PalRead(PBLCK pblck, short *pbo, short *posk) { AssertPo(pblck, 0); AssertNilOrVarMem(pbo); AssertNilOrVarMem(posk); PAL pal; /* the use of 4 for the cb is bogus, but _FRead overwrites the cb anyway */ if ((pal = NewObj AL(4)) == pvNil) goto LFail; if (!pal->_FRead(pblck, pbo, posk)) { ReleasePpo(&pal); LFail: TrashVar(pbo); TrashVar(posk); return pvNil; } AssertPo(pal, 0); return pal; } /*************************************************************************** Read an allocated list from file and return it. ***************************************************************************/ PAL AL::PalRead(PFIL pfil, FP fp, long cb, short *pbo, short *posk) { BLCK blck(pfil, fp, cb); return PalRead(&blck, pbo, posk); } /*************************************************************************** Constructor for AL (allocated list) class. ***************************************************************************/ AL::AL(long cb) : GLB(cb) { AssertThis(fobjAssertFull); } /*************************************************************************** Duplicate this AL. ***************************************************************************/ PAL AL::PalDup(void) { AssertThis(fobjAssertFull); PAL pal; if (pvNil == (pal = PalNew(_cbEntry))) return pvNil; if (!_FDup(pal, LwMul(_ivMac, _cbEntry), CbFromCbit(_ivMac))) ReleasePpo(&pal); else pal->_cvFree = _cvFree; AssertNilOrPo(pal, fobjAssertFull); return pal; } // Allocated list on file struct ALF { short bo; short osk; long cbEntry; long ivMac; long cvFree; }; const BOM kbomAlf = 0x5FC00000L; /*************************************************************************** Return the amount of space on file needed for the list. ***************************************************************************/ long AL::CbOnFile(void) { AssertThis(fobjAssertFull); return size(ALF) + LwMul(_cbEntry, _ivMac) + CbFromCbit(_ivMac); } /*************************************************************************** Write the list to disk. ***************************************************************************/ bool AL::FWrite(PBLCK pblck, short bo, short osk) { AssertThis(fobjAssertFull); AssertPo(pblck, 0); Assert(kboCur == bo || kboOther == bo, "bad bo"); AssertOsk(osk); ALF alf; alf.bo = kboCur; alf.osk = osk; alf.cbEntry = _cbEntry; alf.ivMac = _ivMac; alf.cvFree = _cvFree; if (kboOther == bo) { SwapBytesBom(&alf, kbomAlf); Assert(alf.bo == bo, "wrong bo"); Assert(alf.osk == osk, "osk not invariant under byte swapping"); } return _FWrite(pblck, &alf, size(alf), LwMul(_cbEntry, _ivMac), CbFromCbit(_ivMac)); } /*************************************************************************** Read allocated list data from the block. ***************************************************************************/ bool AL::_FRead(PBLCK pblck, short *pbo, short *posk) { AssertThis(0); AssertPo(pblck, 0); AssertNilOrVarMem(pbo); AssertNilOrVarMem(posk); ALF alf; long cbT; long cb; bool fRet = fFalse; if (!pblck->FUnpackData()) goto LFail; cb = pblck->Cb(); if (cb < size(alf)) goto LBug; if (!pblck->FReadRgb(&alf, size(alf), 0)) goto LFail; if (pbo != pvNil) *pbo = alf.bo; if (posk != pvNil) *posk = alf.osk; if (alf.bo == kboOther) SwapBytesBom(&alf, kbomAlf); cb -= size(alf); cbT = alf.cbEntry * alf.ivMac; if (alf.bo != kboCur || alf.cbEntry <= 0 || alf.ivMac < 0 || cb != cbT + CbFromCbit(alf.ivMac) || alf.cvFree >= LwMax(1, alf.ivMac)) { LBug: Warn("file corrupt or not an AL"); goto LFail; } _cbEntry = alf.cbEntry; _ivMac = alf.ivMac; _cvFree = alf.cvFree; fRet = _FReadData(pblck, cbT, cb - cbT, size(alf)); LFail: TrashVarIf(!fRet, pbo); TrashVarIf(!fRet, posk); return fRet; } /*************************************************************************** Delete all entries in the AL. ***************************************************************************/ void AL::DeleteAll(void) { _ivMac = 0; _cvFree = 0; } /*************************************************************************** Returns whether the given element of the allocated list is free. ***************************************************************************/ bool AL::FFree(long iv) { AssertThis(0); AssertIn(iv, 0, _ivMac); return (iv < _ivMac) && !(*_Qgrfbit(iv) & Fbit(iv)); } /*************************************************************************** Make sure there is room for at least cvAdd additional entries. If fgrpShrink is set, will try to shrink the list if it has more than cvAdd available entries. ***************************************************************************/ bool AL::FEnsureSpace(long cvAdd, ulong grfgrp) { AssertIn(cvAdd, 0, kcbMax); AssertThis(0); // limit the size of the list cvAdd = LwMax(0, cvAdd - _cvFree); if (cvAdd > kcbMax / _cbEntry - _ivMac) { Bug("who's trying to allocate a list this big?"); return fFalse; } return _FEnsureSizes(LwMul(cvAdd + _ivMac, _cbEntry), CbFromCbit(cvAdd + _ivMac), grfgrp); } /*************************************************************************** Add an element to the list. ***************************************************************************/ bool AL::FAdd(void *pv, long *piv) { AssertThis(fobjAssertFull); AssertPvCb(pv, _cbEntry); AssertNilOrVarMem(piv); long iv; if (_cvFree > 0) { /* find the first free one */ byte grfbit; byte *qgrfbit, *qrgb; for (qgrfbit = qrgb = _Qgrfbit(0); *qgrfbit == 0xFF; qgrfbit++) ; iv = (qgrfbit - qrgb) * 8; for (grfbit = *qgrfbit; grfbit & 1; iv++, grfbit >>= 1) ; _cvFree--; } else { if (!FEnsureSpace(1, fgrpNil)) { TrashVar(piv); return fFalse; } iv = _ivMac++; } AssertIn(iv, 0, _ivMac); /* mark the item used */ *_Qgrfbit(iv) |= Fbit(iv); Assert(!FFree(iv), "why is this marked free?"); Put(iv, pv); if (piv != pvNil) *piv = iv; AssertThis(fobjAssertFull); return fTrue; } /*************************************************************************** Delete element iv from an allocated list. ***************************************************************************/ void AL::Delete(long iv) { AssertThis(fobjAssertFull); AssertIn(iv, 0, _ivMac); Assert(!FFree(iv), "already free!"); // trash the thing TrashPvCb(QvGet(iv), _cbEntry); *_Qgrfbit(iv) &= ~Fbit(iv); _cvFree++; if (iv != _ivMac - 1) { AssertThis(fobjAssertFull); return; } // the last element was deleted, find the new _ivMac if (_ivMac <= _cvFree) { // none left, just nuke everything _ivMac = _cvFree = 0; } else { // find the new _ivMac byte fbit; byte *qgrfbit = _Qgrfbit(iv); while (iv >= 0) { fbit = Fbit(iv); if ((*qgrfbit & ((fbit << 1) - 1)) == 0) // check all bits from fbit on down { iv = (iv & ~0x0007L) - 1; qgrfbit--; } else if (!(*qgrfbit & fbit)) // check for the ith bit iv--; else break; } iv++; Assert(_cvFree >= _ivMac - iv, "everything is free!?"); _cvFree -= _ivMac - iv; _ivMac = iv; } AssertThis(fobjAssertFull); } #ifdef DEBUG /*************************************************************************** Check the validity of an allocated list. ***************************************************************************/ void AL::AssertValid(ulong grfobj) { long cT, iv; AL_PAR::AssertValid(0); Assert(_Cb2() >= CbFromCbit(_ivMac), "flag area too small"); if (grfobj & fobjAssertFull) { for (cT = 0, iv = _ivMac; iv--;) { if ((*_Qgrfbit(iv) & Fbit(iv)) == 0) cT++; } Assert(cT == _cvFree, "_cvFree is wrong"); } } #endif // DEBUG /*************************************************************************** Constructor for GGB class. ***************************************************************************/ GGB::GGB(long cbFixed, bool fAllowFree) { AssertIn(cbFixed, 0, kcbMax); _clocFree = fAllowFree ? 0 : cvNil; _cbFixed = cbFixed; // use some reasonable values for _cbMinGrow* - code can always set // set these to something else _cbMinGrow1 = LwMin(1024, 16 * cbFixed); _cbMinGrow2 = 16 * size(LOC); AssertThis(fobjAssertFull); } /*************************************************************************** Duplicate the group. ***************************************************************************/ bool GGB::_FDup(PGGB pggbDst) { AssertThis(fobjAssertFull); AssertPo(pggbDst, fobjAssertFull); Assert(_cbFixed == pggbDst->_cbFixed, "why do these have different sized fixed portions?"); if (!GGB_PAR::_FDup(pggbDst, _bvMac, LwMul(_ivMac, size(LOC)))) return fFalse; pggbDst->_bvMac = _bvMac; pggbDst->_clocFree = _clocFree; pggbDst->_cbFixed = _cbFixed; AssertPo(pggbDst, fobjAssertFull); return fTrue; } // group on file struct GGF { short bo; short osk; long ilocMac; long bvMac; long clocFree; long cbFixed; }; const BOM kbomGgf = 0x5FF00000L; /*************************************************************************** Return the amount of space on file needed for the group. ***************************************************************************/ long GGB::CbOnFile(void) { AssertThis(fobjAssertFull); return size(GGF) + LwMul(_ivMac, size(LOC)) + _bvMac; } /*************************************************************************** Write the group to disk. The client must ensure that the data in the GGB has the correct byte order (as specified by the bo). ***************************************************************************/ bool GGB::FWrite(PBLCK pblck, short bo, short osk) { AssertThis(fobjAssertFull); AssertPo(pblck, 0); Assert(kboCur == bo || kboOther == bo, "bad bo"); AssertOsk(osk); GGF ggf; bool fRet; ggf.bo = kboCur; ggf.osk = osk; ggf.ilocMac = _ivMac; ggf.bvMac = _bvMac; ggf.clocFree = _clocFree; ggf.cbFixed = _cbFixed; AssertBomRglw(kbomLoc, size(LOC)); if (kboOther == bo) { // swap the stuff SwapBytesBom(&ggf, kbomGgf); Assert(ggf.bo == bo, "wrong bo"); Assert(ggf.osk == osk, "osk not invariant under byte swapping"); SwapBytesRglw(_Qb2(0), LwMulDiv(_ivMac, size(LOC), size(long))); } fRet = _FWrite(pblck, &ggf, size(ggf), _bvMac, LwMul(_ivMac, size(LOC))); if (kboOther == bo) { // swap the rgloc back SwapBytesRglw(_Qb2(0), LwMulDiv(_ivMac, size(LOC), size(long))); } return fRet; } /*************************************************************************** Read group data from disk. ***************************************************************************/ bool GGB::_FRead(PBLCK pblck, short *pbo, short *posk) { AssertThis(0); AssertPo(pblck, 0); AssertNilOrVarMem(pbo); AssertNilOrVarMem(posk); GGF ggf; long cbT; short bo; long cb; bool fRet = fFalse; if (!pblck->FUnpackData()) goto LFail; cb = pblck->Cb(); if (cb < size(ggf)) goto LBug; if (!pblck->FReadRgb(&ggf, size(ggf), 0)) goto LFail; if (pbo != pvNil) *pbo = ggf.bo; if (posk != pvNil) *posk = ggf.osk; if ((bo = ggf.bo) == kboOther) SwapBytesBom(&ggf, kbomGgf); cb -= size(ggf); cbT = ggf.ilocMac * size(LOC); if (ggf.bo != kboCur || ggf.bvMac < 0 || ggf.ilocMac < 0 || cb != cbT + ggf.bvMac || ggf.cbFixed < 0 || ggf.cbFixed >= kcbMax || (ggf.clocFree == cvNil) != (_clocFree == cvNil) || ggf.clocFree != cvNil && (ggf.clocFree < 0 || ggf.clocFree >= ggf.ilocMac)) { LBug: Warn("file corrupt or not a GGB"); goto LFail; } _ivMac = ggf.ilocMac; _bvMac = ggf.bvMac; _clocFree = ggf.clocFree; _cbFixed = ggf.cbFixed; fRet = _FReadData(pblck, cb - cbT, cbT, size(ggf)); AssertBomRglw(kbomLoc, size(LOC)); if (bo == kboOther && fRet) { // adjust the byte order on the loc's. SwapBytesRglw(_Qb2(0), LwMulDiv(_ivMac, size(LOC), size(long))); } LFail: TrashVarIf(!fRet, pbo); TrashVarIf(!fRet, posk); return fRet; } /*************************************************************************** Returns true iff the loc.bv is nil or iloc is out of range. ***************************************************************************/ bool GGB::FFree(long iv) { AssertBaseThis(0); AssertIn(iv, 0, kcbMax); LOC *qloc; if (!FIn(iv, 0, _ivMac)) return fTrue; qloc = _Qloc(iv); Assert(FIn(qloc->bv, 0, _bvMac) && FIn(qloc->cb, LwMax(_cbFixed, 1), _bvMac - qloc->bv + 1) || 0 == qloc->cb && (0 == qloc->bv || bvNil == qloc->bv), "bad loc"); return bvNil == qloc->bv; } /*************************************************************************** Ensures that there is room to add at least cvAdd new entries with a total of cbAdd bytes (among the variable parts of the elements). If there is more than enough room and fgrpShrink is passed, the GST will shrink. ***************************************************************************/ bool GGB::FEnsureSpace(long cvAdd, long cbAdd, ulong grfgrp) { AssertThis(0); AssertIn(cvAdd, 0, kcbMax); AssertIn(cbAdd, 0, kcbMax); long clocAdd; if (cvNil == _clocFree) clocAdd = cvAdd; else clocAdd = LwMax(0, cvAdd - _clocFree); // we waste at most (size(long) - 1) bytes per element if (clocAdd > kcbMax / size(LOC) - _ivMac || cvAdd > (kcbMax / (_cbFixed + size(long) - 1)) - _bvMac || cbAdd > kcbMax - _bvMac - cvAdd * (_cbFixed + size(long) - 1)) { Bug("why is this group growing so large?"); return fFalse; } return _FEnsureSizes(_bvMac + cbAdd + LwMul(cvAdd, _cbFixed + size(long) - 1), LwMul(_ivMac + clocAdd, size(LOC)), grfgrp); } /*************************************************************************** Set the minimum that a GGB should grow by. ***************************************************************************/ void GGB::SetMinGrow(long cvAdd, long cbAdd) { AssertThis(0); AssertIn(cvAdd, 0, kcbMax); AssertIn(cbAdd, 0, kcbMax); _cbMinGrow1 = CbRoundToLong(cbAdd + LwMul(cvAdd, _cbFixed + size(long) - 1)); _cbMinGrow2 = LwMul(cvAdd, size(LOC)); } /*************************************************************************** Private api to remove a block of bytes. ***************************************************************************/ void GGB::_RemoveRgb(long bv, long cb) { AssertBaseThis(0); AssertIn(bv, 0, _bvMac); AssertIn(cb, 1, _bvMac - bv + 1); Assert(cb == CbRoundToLong(cb), "cb not divisible by size(long)"); byte *qb; if (bv + cb < _bvMac) { qb = _Qb1(bv); BltPb(qb + cb, qb, _bvMac - bv - cb); _AdjustLocs(bv + 1, _bvMac + 1, -cb); } else _bvMac -= cb; TrashPvCb(_Qb1(_bvMac), cb); } /*************************************************************************** Private api to remove a block of bytes. ***************************************************************************/ void GGB::_AdjustLocs(long bvMin, long bvLim, long dcb) { AssertBaseThis(0); AssertIn(bvMin, 0, _bvMac + 2); AssertIn(bvLim, bvMin, _bvMac + 2); AssertIn(dcb, -_bvMac, kcbMax); Assert((dcb % size(long)) == 0, "dcb not divisible by size(long)"); long cloc; LOC *qloc; if (FIn(_bvMac, bvMin, bvLim)) _bvMac += dcb; for (qloc = _Qloc(0), cloc = _ivMac; cloc > 0; cloc--, qloc++) { if (bvNil == qloc->bv) continue; if (FIn(qloc->bv, bvMin, bvLim)) qloc->bv += dcb; AssertIn(qloc->bv, 0, _bvMac); } } /*************************************************************************** Returns a volative pointer the the fixed sized data in the element. If pcbVar is not nil, fills *pcbVar with the size of the variable part. ***************************************************************************/ void *GGB::QvFixedGet(long iv, long *pcbVar) { AssertThis(0); AssertIn(_cbFixed, 1, kcbMax); AssertIn(iv, 0, _ivMac); Assert(!FFree(iv), "element free!"); AssertNilOrVarMem(pcbVar); LOC loc; loc = *_Qloc(iv); if (pcbVar != pvNil) *pcbVar = loc.cb - _cbFixed; AssertIn(loc.cb, _cbFixed, _bvMac - loc.bv + 1); return _Qb1(loc.bv); } /*************************************************************************** Lock the data and return a pointer to the fixed sized data. ***************************************************************************/ void *GGB::PvFixedLock(long iv, long *pcbVar) { AssertThis(0); Lock(); return QvFixedGet(iv, pcbVar); } /*************************************************************************** Get the fixed sized data for the element. ***************************************************************************/ void GGB::GetFixed(long iv, void *pv) { AssertThis(0); AssertIn(_cbFixed, 1, kcbMax); AssertIn(iv, 0, _ivMac); Assert(!FFree(iv), "element free!"); AssertPvCb(pv, _cbFixed); LOC loc; loc = *_Qloc(iv); AssertIn(loc.cb, _cbFixed, _bvMac - loc.bv + 1); CopyPb(_Qb1(loc.bv), pv, _cbFixed); } /*************************************************************************** Put the fixed sized data for the element. ***************************************************************************/ void GGB::PutFixed(long iv, void *pv) { AssertThis(0); AssertIn(_cbFixed, 1, kcbMax); AssertIn(iv, 0, _ivMac); Assert(!FFree(iv), "element free!"); AssertPvCb(pv, _cbFixed); LOC loc; loc = *_Qloc(iv); AssertIn(loc.cb, _cbFixed, _bvMac - loc.bv + 1); CopyPb(pv, _Qb1(loc.bv), _cbFixed); AssertThis(0); } /*************************************************************************** Return the length of the variable part of the iv'th element. ***************************************************************************/ long GGB::Cb(long iv) { AssertThis(0); AssertIn(iv, 0, _ivMac); Assert(!FFree(iv), "element free!"); return _Qloc(iv)->cb - _cbFixed; } /*************************************************************************** Return a volatile pointer to the variable part of the iv'th element. If pcb is not nil, sets *pcb to the length of the (variable part of the) item. ***************************************************************************/ void *GGB::QvGet(long iv, long *pcb) { AssertThis(0); AssertIn(iv, 0, _ivMac); Assert(!FFree(iv), "element free!"); AssertNilOrVarMem(pcb); LOC loc; loc = *_Qloc(iv); if (pcb != pvNil) *pcb = loc.cb - _cbFixed; AssertIn(loc.cb, _cbFixed, _bvMac - loc.bv + 1); return _Qb1(loc.bv + _cbFixed); } /*************************************************************************** Lock the data and return a pointer to the (variable part of the) iv'th item. If pcb is not nil, sets *pcb to the length of the (variable part of the) item. ***************************************************************************/ void *GGB::PvLock(long iv, long *pcb) { AssertThis(0); Lock(); return QvGet(iv, pcb); } /*************************************************************************** Copy the (variable part of the) iv'th element to pv. ***************************************************************************/ void GGB::Get(long iv, void *pv) { AssertThis(0); AssertIn(iv, 0, _ivMac); Assert(!FFree(iv), "element free!"); LOC loc; loc = *_Qloc(iv); AssertPvCb(pv, loc.cb - _cbFixed); CopyPb(_Qb1(loc.bv + _cbFixed), pv, loc.cb - _cbFixed); } /*************************************************************************** Copy *pv to the (variable part of the) iv'th element. ***************************************************************************/ void GGB::Put(long iv, void *pv) { AssertThis(0); AssertIn(iv, 0, _ivMac); Assert(!FFree(iv), "element free!"); LOC loc; loc = *_Qloc(iv); AssertPvCb(pv, loc.cb - _cbFixed); CopyPb(pv, _Qb1(loc.bv + _cbFixed), loc.cb - _cbFixed); } /*************************************************************************** Replace the (variable part of the) iv'th element with the stuff in pv (cb bytes worth). pv may be nil (effectively resizing the block). ***************************************************************************/ bool GGB::FPut(long iv, long cb, void *pv) { AssertThis(0); AssertIn(iv, 0, _ivMac); Assert(!FFree(iv), "element free!"); AssertIn(cb, 0, kcbMax); long cbCur = Cb(iv); if (cb > cbCur) { if (!FInsertRgb(iv, cbCur, cb - cbCur, pvNil)) return fFalse; } else if (cb < cbCur) DeleteRgb(iv, cb, cbCur - cb); if (pv != pvNil && cb > 0) { AssertPvCb(pv, cb); CopyPb(pv, QvGet(iv), cb); } AssertThis(0); return fTrue; } /*************************************************************************** Get a portion of the element. ***************************************************************************/ void GGB::GetRgb(long iv, long bv, long cb, void *pv) { AssertThis(0); AssertIn(iv, 0, _ivMac); Assert(!FFree(iv), "element free!"); AssertPvCb(pv, cb); LOC loc; bv += _cbFixed; loc = *_Qloc(iv); AssertIn(bv, _cbFixed, loc.cb); AssertIn(cb, 1, loc.cb - bv + 1); CopyPb(_Qb1(loc.bv + bv), pv, cb); } /*************************************************************************** Put a portion of the element. ***************************************************************************/ void GGB::PutRgb(long iv, long bv, long cb, void *pv) { AssertThis(0); AssertIn(iv, 0, _ivMac); Assert(!FFree(iv), "element free!"); AssertPvCb(pv, cb); LOC loc; bv += _cbFixed; loc = *_Qloc(iv); AssertIn(bv, _cbFixed, loc.cb); AssertIn(cb, 1, loc.cb - bv + 1); CopyPb(pv, _Qb1(loc.bv + bv), cb); AssertThis(0); } /*************************************************************************** Remove a portion of element iv (can't be all of it). ***************************************************************************/ void GGB::DeleteRgb(long iv, long bv, long cb) { AssertThis(0); AssertIn(iv, 0, _ivMac); Assert(!FFree(iv), "element free!"); LOC loc; LOC *qloc; long cbDel; byte *qb; bv += _cbFixed; loc = *_Qloc(iv); AssertIn(bv, _cbFixed, loc.cb); AssertIn(cb, 1, loc.cb - bv + 1); if (bv + cb < loc.cb) { // shift usable stuff down qb = _Qb1(loc.bv + bv); BltPb(qb + cb, qb, loc.cb - bv - cb); } // determine the number of bytes to nuke cbDel = CbRoundToLong(loc.cb) - CbRoundToLong(loc.cb - cb); if (cbDel > 0) _RemoveRgb(loc.bv + loc.cb - cb, cbDel); qloc = _Qloc(iv); if (0 == (qloc->cb -= cb)) { Assert(_cbFixed == 0, "oops!"); qloc->bv = 0; // empty element } AssertThis(0); } /*************************************************************************** Insert cb new bytes at location bv into the iv'th element. pv may be nil. ***************************************************************************/ bool GGB::FInsertRgb(long iv, long bv, long cb, void *pv) { AssertThis(0); AssertIn(iv, 0, _ivMac); Assert(!FFree(iv), "element free!"); AssertIn(cb, 1, kcbMax); LOC loc; long cbAdd; byte *qb; bv += _cbFixed; loc = *_Qloc(iv); AssertIn(bv, _cbFixed, loc.cb + 1); if (loc.cb == 0) loc.bv = _bvMac; // need to add this many bytes to _bvMac cbAdd = CbRoundToLong(loc.cb + cb) - CbRoundToLong(loc.cb); if (cbAdd > 0) { long bvT; if (!_FEnsureSizes(_bvMac + cbAdd, LwMul(_ivMac, size(LOC)), fgrpNil)) return fFalse; // move later entries back bvT = loc.bv + CbRoundToLong(loc.cb); if (bvT < _bvMac) { qb = _Qb1(bvT); BltPb(qb, qb + cbAdd, _bvMac - bvT); _AdjustLocs(loc.bv + 1, _bvMac + 1, cbAdd); } else _bvMac += cbAdd; } // move data within this element if (bv < loc.cb) { qb = _Qb1(loc.bv + bv); BltPb(qb, qb + cb, loc.cb - bv); } if (pv != pvNil) { AssertPvCb(pv, cb); CopyPb(pv, _Qb1(loc.bv + bv), cb); } else TrashPvCb(_Qb1(loc.bv + bv), cb); // copy the entire loc in case loc.bv got set to _bvMac (if the item was empty) loc.cb += cb; *_Qloc(iv) = loc; AssertThis(0); return fTrue; } /*************************************************************************** Move cb bytes from position bvSrc in ivSrc to position bvDst in ivDst. This can fail only because of the padding used for each entry (at most size(long) additional bytes will need to be allocated). ***************************************************************************/ bool GGB::FMoveRgb(long ivSrc, long bvSrc, long ivDst, long bvDst, long cb) { AssertThis(fobjAssertFull); AssertIn(ivSrc, 0, _ivMac); Assert(!FFree(ivSrc), "element free!"); AssertIn(ivDst, 0, _ivMac); Assert(!FFree(ivDst), "element free!"); AssertIn(bvSrc, 0, Cb(ivSrc) + 1); AssertIn(cb, 0, Cb(ivSrc) + 1 - bvSrc); AssertIn(bvDst, 0, Cb(ivDst) + 1); LOC *qloc; LOC locSrc, locDst; long cbMove, cbT; locSrc = *_Qloc(ivSrc); locDst = *_Qloc(ivDst); // determine the number of bytes to resize by cbT = (CbRoundToLong(locDst.cb + cb) - CbRoundToLong(locDst.cb)) - (CbRoundToLong(locSrc.cb) - CbRoundToLong(locSrc.cb - cb)); if (cbT > 0) { Assert(cb % size(long) != 0, "why are we here when cb is a multiple of size(long)?"); if (!_FEnsureSizes(_bvMac + cbT, LwMul(_ivMac, size(LOC)), fgrpNil)) return fFalse; } // move most of the bytes cbMove = LwRoundToward(cb, size(long)); AssertIn(cb, cbMove, cbMove + size(long)); if (cbMove > 0) { long bv1 = locSrc.bv + bvSrc + _cbFixed; long bv2 = locDst.bv + bvDst + _cbFixed; qloc = _Qloc(ivSrc); if (0 == (qloc->cb -= cbMove)) { Assert(_cbFixed == 0, "what?"); qloc->bv = 0; } qloc = _Qloc(ivDst); if (qloc->cb == 0) { Assert(_cbFixed == 0, "what?"); bv2 = qloc->bv = _bvMac; } qloc->cb += cbMove; if (bv1 < bv2) { SwapBlocks(_Qb1(bv1), cbMove, bv2 - bv1 - cbMove); _AdjustLocs(locSrc.bv + 1, locDst.bv + 1, -cbMove); } else { SwapBlocks(_Qb1(bv2), bv1 - bv2, cbMove); _AdjustLocs(locDst.bv + 1, locSrc.bv + 1, cbMove); } AssertThis(fobjAssertFull); } // move the last few bytes if (cb > cbMove) { byte rgb[size(long)]; GetRgb(ivSrc, bvSrc, cb - cbMove, rgb); DeleteRgb(ivSrc, bvSrc, cb - cbMove); AssertDo(FInsertRgb(ivDst, bvDst + cbMove, cb - cbMove, rgb), "logic error caused failure"); } AssertThis(fobjAssertFull); return fTrue; } /*************************************************************************** Append the variable data of ivSrc to ivDst, and delete ivSrc. NOTE: this is kind of goofy. The only time FMoveRgb could possibly fail if we just do the naive thing (FMoveRgb the entire var data, then delete the source element) is if _cbFixed is not a multiple of size(long). ***************************************************************************/ void GGB::Merge(long ivSrc, long ivDst) { AssertThis(fobjAssertFull); AssertIn(ivSrc, 0, _ivMac); Assert(!FFree(ivSrc), "element free!"); AssertIn(ivDst, 0, _ivMac); Assert(!FFree(ivDst), "element free!"); Assert(ivSrc != ivDst, "can't merge an element with itself!"); long cb, cbMove, bv; byte rgb[size(long)]; cb = Cb(ivSrc); cbMove = LwRoundToward(cb, size(long)); if (cb > cbMove) GetRgb(ivSrc, cbMove, cb - cbMove, rgb); // get the tail bytes bv = Cb(ivDst); if (cbMove > 0) { // move the main section AssertDo(FMoveRgb(ivSrc, 0, ivDst, bv, cbMove), "why did FMoveRgb fail?"); } // delete the source item Delete(ivSrc); if (ivSrc < ivDst) ivDst--; if (cb > cbMove) { // insert the remaining few bytes - there should already be room // for these AssertDo(FInsertRgb(ivDst, bv + cbMove, cb - cbMove, rgb), "why did FInsertRgb fail?"); } AssertThis(fobjAssertFull); } #ifdef DEBUG /*************************************************************************** Validate a group. ***************************************************************************/ void GGB::AssertValid(ulong grfobj) { LOC loc; long iloc; long cbTot, clocFree; GGB_PAR::AssertValid(grfobj); AssertIn(_ivMac, 0, kcbMax); AssertIn(_bvMac, 0, kcbMax); Assert(_Cb1() >= _bvMac, "group area too small"); Assert(_Cb2() >= LwMul(_ivMac, size(LOC)), "rgloc area too small"); Assert(_clocFree == cvNil || _clocFree == 0 || _clocFree > 0 && _clocFree < _ivMac, "_clocFree is wrong"); AssertIn(_cbFixed, 0, kcbMax); if (grfobj & fobjAssertFull) { for (clocFree = cbTot = iloc = 0; iloc < _ivMac; iloc++) { loc = *_Qloc(iloc); if (bvNil == loc.bv) { Assert(iloc < _ivMac - 1, "Last element free"); Assert(loc.cb == 0, "bad cb in free loc"); clocFree++; continue; } AssertIn(loc.cb, _cbFixed, _bvMac + 1); AssertIn(loc.bv, 0, _bvMac); Assert(loc.cb > 0 || loc.bv == 0, "zero sized item doesn't have zero bv"); loc.cb = CbRoundToLong(loc.cb); Assert(loc.bv + loc.cb <= _bvMac, "loc extends past _bvMac"); cbTot += loc.cb; } Assert(cbTot == _bvMac, "group wrong size"); Assert(clocFree == _clocFree || _clocFree == cvNil && clocFree == 0, "bad _clocFree"); } } #endif // DEBUG /*************************************************************************** Allocate a new group with room for at least cvInit elements containing at least cbInit bytes worth of (total) space. ***************************************************************************/ PGG GG::PggNew(long cbFixed, long cvInit, long cbInit) { AssertIn(cbFixed, 0, kcbMax); AssertIn(cvInit, 0, kcbMax); AssertIn(cbInit, 0, kcbMax); PGG pgg; if ((pgg = NewObj GG(cbFixed)) == pvNil) return pvNil; if ((cvInit > 0 || cbInit > 0) && !pgg->FEnsureSpace(cvInit, cbInit, fgrpNil)) { ReleasePpo(&pgg); return pvNil; } AssertPo(pgg, fobjAssertFull); return pgg; } /*************************************************************************** Read a group from a block and return it. ***************************************************************************/ PGG GG::PggRead(PBLCK pblck, short *pbo, short *posk) { AssertPo(pblck, 0); AssertNilOrVarMem(pbo); AssertNilOrVarMem(posk); PGG pgg; if ((pgg = NewObj GG(0)) == pvNil) goto LFail; if (!pgg->_FRead(pblck, pbo, posk)) { ReleasePpo(&pgg); LFail: TrashVar(pbo); TrashVar(posk); return pvNil; } AssertPo(pgg, fobjAssertFull); return pgg; } /*************************************************************************** Read a group from file and return it. ***************************************************************************/ PGG GG::PggRead(PFIL pfil, FP fp, long cb, short *pbo, short *posk) { BLCK blck(pfil, fp, cb); return PggRead(&blck, pbo, posk); } /*************************************************************************** Duplicate this GG. ***************************************************************************/ PGG GG::PggDup(void) { AssertThis(0); PGG pgg; if (pvNil == (pgg = PggNew(_cbFixed))) return pvNil; if (!_FDup(pgg)) ReleasePpo(&pgg); AssertNilOrPo(pgg, 0); return pgg; } /*************************************************************************** Insert an element into the group. ***************************************************************************/ bool GG::FInsert(long iv, long cb, void *pv, void *pvFixed) { AssertThis(fobjAssertFull); AssertIn(cb, 0, kcbMax); AssertIn(iv, 0, _ivMac + 1); byte *qb; LOC loc; LOC *qloc; cb += _cbFixed; loc.cb = cb; loc.bv = cb == 0 ? 0 : _bvMac; cb = CbRoundToLong(cb); if (!_FEnsureSizes(_bvMac + cb, LwMul(_ivMac + 1, size(LOC)), fgrpNil)) return fFalse; // make room for the entry qloc = _Qloc(iv); if (iv < _ivMac) BltPb(qloc, qloc + 1, LwMul(_ivMac - iv, size(LOC))); *qloc = loc; if (pvNil != pv && cb > 0) { AssertPvCb(pv, cb - _cbFixed); qb = _Qb1(loc.bv); TrashPvCb(qb, _cbFixed); CopyPb(pv, qb + _cbFixed, loc.cb - _cbFixed); TrashPvCb(qb + loc.cb, cb - loc.cb); } else TrashPvCb(_Qb1(loc.bv), cb); if (pvNil != pvFixed) { Assert(_cbFixed > 0, "why is pvFixed not nil?"); AssertPvCb(pvFixed, _cbFixed); qb = _Qb1(loc.bv); CopyPb(pvFixed, qb, _cbFixed); } _bvMac += cb; _ivMac++; AssertThis(fobjAssertFull); return fTrue; } /*************************************************************************** Takes cv entries from pggSrc at ivSrc and inserts (a copy of) them into this GG at ivDst. ***************************************************************************/ bool GG::FCopyEntries(PGG pggSrc, long ivSrc, long ivDst, long cv) { AssertThis(fobjAssertFull); AssertPo(pggSrc, 0); AssertIn(cv, 0, pggSrc->IvMac() + 1); AssertIn(ivSrc, 0, pggSrc->IvMac() + 1 - cv); AssertIn(ivDst, 0, _ivMac + 1); long cb, cbFixed, iv, ivLim; LOC loc; byte *pb; if ((cbFixed = pggSrc->CbFixed()) != CbFixed()) { Bug("Groups have different fixed sizes"); return fFalse; } if (pggSrc == this) { Bug("Cant insert from same group"); return fFalse; } cb = 0; for (iv = ivSrc, ivLim = ivSrc + cv; iv < ivLim; iv++) cb += pggSrc->Cb(iv); if (!FEnsureSpace(cv, cb)) return fFalse; pggSrc->Lock(); for (iv = ivSrc; iv < ivLim; iv++) { loc = *pggSrc->_Qloc(iv); pb = pggSrc->_Qb1(loc.bv); AssertDo(FInsert(ivDst + iv - ivSrc, loc.cb - cbFixed, pb + cbFixed, cbFixed == 0 ? pvNil : pb), 0); } pggSrc->Unlock(); AssertThis(fobjAssertFull); return fTrue; } /*************************************************************************** Append an element to the group. ***************************************************************************/ bool GG::FAdd(long cb, long *piv, void *pv, void *pvFixed) { AssertThis(0); AssertNilOrVarMem(piv); if (piv != pvNil) *piv = _ivMac; if (!FInsert(_ivMac, cb, pv, pvFixed)) { TrashVar(piv); return fFalse; } return fTrue; } /*************************************************************************** Delete an element from the group. ***************************************************************************/ void GG::Delete(long iv) { AssertThis(fobjAssertFull); AssertIn(iv, 0, _ivMac); LOC *qloc; LOC loc; qloc = _Qloc(iv); loc = *qloc; if (iv < --_ivMac) BltPb(qloc + 1, qloc, LwMul(_ivMac - iv, size(LOC))); TrashPvCb(_Qloc(_ivMac), size(LOC)); if (loc.cb > 0) _RemoveRgb(loc.bv, CbRoundToLong(loc.cb)); AssertThis(fobjAssertFull); } /*************************************************************************** Move the entry at ivSrc to be immediately before the element that is currently at ivTarget. If ivTarget > ivSrc, the entry actually ends up at (ivTarget - 1) and the entry at ivTarget doesn't move. If ivTarget < ivSrc, the entry ends up at ivTarget and the entry at ivTarget moves to (ivTarget + 1). Everything in between is shifted appropriately. ivTarget is allowed to be equal to IvMac(). ***************************************************************************/ void GG::Move(long ivSrc, long ivTarget) { AssertThis(0); AssertIn(ivSrc, 0, _ivMac); AssertIn(ivTarget, 0, _ivMac + 1); MoveElement(_Qloc(0), size(LOC), ivSrc, ivTarget); AssertThis(0); } /*************************************************************************** Swap two elements in a GG. ***************************************************************************/ void GG::Swap(long iv1, long iv2) { AssertThis(0); AssertIn(iv1, 0, _ivMac); AssertIn(iv2, 0, _ivMac); SwapPb(_Qloc(iv1), _Qloc(iv2), size(LOC)); AssertThis(0); } #ifdef DEBUG /*************************************************************************** Validate a group. ***************************************************************************/ void GG::AssertValid(ulong grfobj) { GG_PAR::AssertValid(grfobj); AssertVar(_clocFree == cvNil, "bad _clocFree in GG", &_clocFree); } #endif // DEBUG /*************************************************************************** Allocate a new allocated group with romm for at least cvInit elements containing at least cbInit bytes worth of (total) space. ***************************************************************************/ PAG AG::PagNew(long cbFixed, long cvInit, long cbInit) { AssertIn(cbFixed, 0, kcbMax); AssertIn(cvInit, 0, kcbMax); AssertIn(cbInit, 0, kcbMax); PAG pag; if ((pag = NewObj AG(cbFixed)) == pvNil) return pvNil; if ((cvInit > 0 || cbInit > 0) && !pag->FEnsureSpace(cvInit, cbInit, fgrpNil)) { ReleasePpo(&pag); return pvNil; } AssertPo(pag, fobjAssertFull); return pag; } /*************************************************************************** Read an allocated group from a block and return it. ***************************************************************************/ PAG AG::PagRead(PBLCK pblck, short *pbo, short *posk) { AssertPo(pblck, 0); AssertNilOrVarMem(pbo); AssertNilOrVarMem(posk); PAG pag; if ((pag = NewObj AG(0)) == pvNil) goto LFail; if (!pag->_FRead(pblck, pbo, posk)) { ReleasePpo(&pag); LFail: TrashVar(pbo); TrashVar(posk); return pvNil; } AssertPo(pag, fobjAssertFull); return pag; } /*************************************************************************** Read an allocated group from file and return it. ***************************************************************************/ PAG AG::PagRead(PFIL pfil, FP fp, long cb, short *pbo, short *posk) { BLCK blck(pfil, fp, cb); return PagRead(&blck, pbo, posk); } /*************************************************************************** Duplicate this AG. ***************************************************************************/ PAG AG::PagDup(void) { AssertThis(0); PAG pag; if (pvNil == (pag = PagNew(_cbFixed))) return pvNil; if (!_FDup(pag)) ReleasePpo(&pag); AssertNilOrPo(pag, 0); return pag; } /*************************************************************************** Add an element to the allocated group. ***************************************************************************/ bool AG::FAdd(long cb, long *piv, void *pv, void *pvFixed) { AssertThis(fobjAssertFull); AssertIn(cb, 0, kcbMax); AssertNilOrVarMem(piv); long iloc; byte *qb; LOC loc; LOC *qloc; cb += _cbFixed; AssertIn(cb, 0, kcbMax); if (0 < _clocFree) { // find the first free element qloc = _Qloc(0); for (iloc = 0; iloc < _ivMac; iloc++, qloc++) { if (qloc->bv == bvNil) break; } Assert(iloc < _ivMac - 1, "_clocFree wrong"); _clocFree--; } else iloc = _ivMac; if (iloc == _ivMac) _ivMac++; loc.cb = cb; loc.bv = cb == 0 ? 0 : _bvMac; cb = CbRoundToLong(cb); if (!_FEnsureSizes(_bvMac + cb, LwMul(_ivMac, size(LOC)), fgrpNil)) { if (iloc == _ivMac - 1) _ivMac--; else _clocFree++; TrashVar(piv); return fFalse; } // fill in the loc and copy the data *_Qloc(iloc) = loc; if (pv != pvNil) { AssertPvCb(pv, cb - _cbFixed); qb = _Qb1(loc.bv); TrashPvCb(qb, _cbFixed); CopyPb(pv, qb + _cbFixed, loc.cb - _cbFixed); TrashPvCb(qb + loc.cb, cb - loc.cb); } else TrashPvCb(_Qb1(loc.bv), cb); if (pvNil != pvFixed) { Assert(_cbFixed > 0, "why is pvFixed not nil?"); AssertPvCb(pvFixed, _cbFixed); qb = _Qb1(loc.bv); CopyPb(pvFixed, qb, _cbFixed); } _bvMac += cb; if (pvNil != piv) *piv = iloc; AssertThis(fobjAssertFull); return fTrue; } /*************************************************************************** Delete an element from the group. ***************************************************************************/ void AG::Delete(long iv) { AssertThis(fobjAssertFull); AssertIn(iv, 0, _ivMac); Assert(!FFree(iv), "entry already free!"); LOC *qloc; LOC loc; qloc = _Qloc(iv); loc = *qloc; if (iv == _ivMac - 1) { // move _ivMac back past any free entries on the end while (--_ivMac > 0 && (--qloc)->bv == bvNil) _clocFree--; TrashPvCb(_Qloc(_ivMac), LwMul(iv - _ivMac + 1, size(LOC))); } else { qloc->bv = bvNil; qloc->cb = 0; _clocFree++; } if (loc.cb > 0) _RemoveRgb(loc.bv, CbRoundToLong(loc.cb)); AssertThis(fobjAssertFull); } #ifdef DEBUG /*************************************************************************** Validate a group. ***************************************************************************/ void AG::AssertValid(ulong grfobj) { AG_PAR::AssertValid(grfobj); AssertIn(_clocFree, 0, LwMax(1, _ivMac)); } #endif // DEBUG ================================================ FILE: kauai/src/groups.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Basic collection classes: General List (GL), Allocated List (AL), General Group (GG), Allocated Group (AG), General String Table (GST), Allocated String Table (AST). BASE ---> GRPB -+-> GLB -+-> GL | +-> AL | +-> GGB -+-> GG | +-> AG | +-> GSTB-+-> GST +-> AST ***************************************************************************/ #ifndef GROUPS_H #define GROUPS_H enum { fgrpNil = 0, fgrpShrink = 1, }; /**************************************** GRPB is a virtual class supporting all group classes ****************************************/ #define GRPB_PAR BASE #define kclsGRPB 'GRPB' class GRPB : public GRPB_PAR { RTCLASS_DEC ASSERT MARKMEM private: long _cb1; long _cb2; HQ _hqData1; HQ _hqData2; bool _FEnsureHqCb(HQ *phq, long cb, long cbMinGrow, long *pcb); protected: long _cbMinGrow1; long _cbMinGrow2; long _ivMac; byte *_Qb1(long ib) { return (byte *)QvFromHq(_hqData1) + ib; } byte *_Qb2(long ib) { return (byte *)QvFromHq(_hqData2) + ib; } long _Cb1(void) { return _cb1; } long _Cb2(void) { return _cb2; } bool _FEnsureSizes(long cbMin1, long cbMin2, ulong grfgrp); bool _FWrite(PBLCK pblck, void *pv, long cb, long cb1, long cb2); bool _FReadData(PBLCK pblck, long ib, long cb1, long cb2); bool _FDup(PGRPB pgrpbDst, long cb1, long cb2); GRPB(void) { } public: ~GRPB(void); void Lock(void) { if (_hqData1 != hqNil) PvLockHq(_hqData1); } void Unlock(void) { if (_hqData1 != hqNil) UnlockHq(_hqData1); } long IvMac(void) { return _ivMac; } virtual bool FFree(long iv) = 0; virtual void Delete(long iv) = 0; // writing virtual bool FWriteFlo(PFLO pflo, short bo = kboCur, short osk = koskCur); virtual bool FWrite(PBLCK pblck, short bo = kboCur, short osk = koskCur) = 0; virtual long CbOnFile(void) = 0; }; /**************************************** GLB is a virtual class supporting GL and AL ****************************************/ #define GLB_PAR GRPB #define kclsGLB 'GLB' class GLB : public GLB_PAR { RTCLASS_DEC ASSERT protected: long _cbEntry; GLB(long cb); public: long CbEntry(void) { return _cbEntry; } void *QvGet(long iv); void Get(long iv, void *pv); void Put(long iv, void *pv); void *PvLock(long iv); void SetMinGrow(long cvAdd); virtual bool FAdd(void *pv, long *piv = pvNil) = 0; }; /**************************************** GL is the basic dynamic array ****************************************/ #define GL_PAR GLB #define kclsGL 'GL' class GL : public GL_PAR { RTCLASS_DEC protected: GL(long cb); bool _FRead(PBLCK pblck, short *pbo, short *posk); public: // static methods static PGL PglNew(long cb, long cvInit = 0); static PGL PglRead(PBLCK pblck, short *pbo = pvNil, short *posk = pvNil); static PGL PglRead(PFIL pfil, FP fp, long cb, short *pbo = pvNil, short *posk = pvNil); // duplication PGL PglDup(void); // methods required by parent class virtual bool FAdd(void *pv, long *piv = pvNil); virtual void Delete(long iv); virtual bool FWrite(PBLCK pblck, short bo = kboCur, short osk = koskCur); virtual long CbOnFile(void); virtual bool FFree(long iv); // new methods void Delete(long iv, long cv); bool FInsert(long iv, void *pv = pvNil, long cv = 1); bool FSetIvMac(long ivMacNew); bool FEnsureSpace(long cvAdd, ulong grfgrp = fgrpNil); void Move(long ivSrc, long ivTarget); bool FPush(void *pv) { return FInsert(_ivMac, pv); } bool FPop(void *pv = pvNil); bool FEnqueue(void *pv) { return FInsert(0, pv); } bool FDequeue(void *pv = pvNil) { return FPop(pv); } }; /**************************************** Allocated (fixed index) list class ****************************************/ #define AL_PAR GLB #define kclsAL 'AL' class AL : public AL_PAR { RTCLASS_DEC ASSERT private: long _cvFree; private: // section 2 of the data contains a bit array byte *_Qgrfbit(long iv) { return _Qb2(IbFromIbit(iv)); } protected: AL(long cb); bool _FRead(PBLCK pblck, short *pbo, short *posk); public: // static methods static PAL PalNew(long cb, long cvInit = 0); static PAL PalRead(PBLCK pblck, short *pbo = pvNil, short *posk = pvNil); static PAL PalRead(PFIL pfil, FP fp, long cb, short *pbo = pvNil, short *posk = pvNil); // duplication PAL PalDup(void); // methods required by parent class virtual bool FAdd(void *pv, long *piv = pvNil); virtual void Delete(long iv); virtual bool FWrite(PBLCK pblck, short bo = kboCur, short osk = koskCur); virtual long CbOnFile(void); virtual bool FFree(long iv); // new methods bool FEnsureSpace(long cvAdd, ulong grfgrp = fgrpNil); void DeleteAll(void); }; /**************************************** GGB is a virtual class supporting GG and AG ****************************************/ const BOM kbomLoc = 0xF0000000; #define GGB_PAR GRPB #define kclsGGB 'GGB' class GGB : public GGB_PAR { RTCLASS_DEC ASSERT protected: struct LOC { long bv; long cb; }; long _bvMac; long _clocFree; long _cbFixed; protected: GGB(long cbFixed, bool fAllowFree); void _RemoveRgb(long bv, long cb); void _AdjustLocs(long bvMin, long bvLim, long dcb); LOC *_Qloc(long iloc) { return (LOC *)_Qb2(LwMul(iloc, size(LOC))); } bool _FRead(PBLCK pblck, short *pbo, short *posk); bool _FDup(PGGB pggbDst); public: // methods required by parent class virtual bool FWrite(PBLCK pblck, short bo = kboCur, short osk = koskCur); virtual long CbOnFile(void); virtual bool FFree(long iv); bool FEnsureSpace(long cvAdd, long cbAdd, ulong grfgrp = fgrpNil); void SetMinGrow(long cvAdd, long cbAdd); virtual bool FAdd(long cb, long *piv = pvNil, void *pv = pvNil, void *pvFixed = pvNil) = 0; // access to the fixed portion long CbFixed(void) { return _cbFixed; } void *QvFixedGet(long iv, long *pcbVar = pvNil); void *PvFixedLock(long iv, long *pcbVar = pvNil); void GetFixed(long iv, void *pv); void PutFixed(long iv, void *pv); // access to the variable portion long Cb(long iv); void *QvGet(long iv, long *pcb = pvNil); void *PvLock(long iv, long *pcb = pvNil); void Get(long iv, void *pv); void Put(long iv, void *pv); bool FPut(long iv, long cb, void *pv); void GetRgb(long iv, long bv, long cb, void *pv); void PutRgb(long iv, long bv, long cb, void *pv); void DeleteRgb(long iv, long bv, long cb); bool FInsertRgb(long iv, long bv, long cb, void *pv); bool FMoveRgb(long ivSrc, long bvSrc, long ivDst, long bvDst, long cb); void Merge(long ivSrc, long ivDst); }; /**************************************** General Group - based on GGB ****************************************/ #define GG_PAR GGB #define kclsGG 'GG' class GG : public GG_PAR { RTCLASS_DEC ASSERT protected: GG(long cbFixed) : GGB(cbFixed, fFalse) { } public: // static methods static PGG PggNew(long cbFixed = 0, long cvInit = 0, long cbInit = 0); static PGG PggRead(PBLCK pblck, short *pbo = pvNil, short *posk = pvNil); static PGG PggRead(PFIL pfil, FP fp, long cb, short *pbo = pvNil, short *posk = pvNil); // duplication PGG PggDup(void); // methods required by parent class virtual bool FAdd(long cb, long *piv = pvNil, void *pv = pvNil, void *pvFixed = pvNil); virtual void Delete(long iv); // new methods bool FInsert(long iv, long cb, void *pv = pvNil, void *pvFixed = pvNil); bool FCopyEntries(PGG pggSrc, long ivSrc, long ivDst, long cv); void Move(long ivSrc, long ivTarget); void Swap(long iv1, long iv2); }; /**************************************** Allocated Group - based on GGB ****************************************/ #define AG_PAR GGB #define kclsAG 'AG' class AG : public AG_PAR { RTCLASS_DEC ASSERT protected: AG(long cbFixed) : GGB(cbFixed, fTrue) { } public: // static methods static PAG PagNew(long cbFixed = 0, long cvInit = 0, long cbInit = 0); static PAG PagRead(PBLCK pblck, short *pbo = pvNil, short *posk = pvNil); static PAG PagRead(PFIL pfil, FP fp, long cb, short *pbo = pvNil, short *posk = pvNil); // duplication PAG PagDup(void); // methods required by parent class virtual bool FAdd(long cb, long *piv = pvNil, void *pv = pvNil, void *pvFixed = pvNil); virtual void Delete(long iv); }; /**************************************** String table classes ****************************************/ enum { fgstNil = 0, fgstSorted = 1, fgstUserSorted = 2, fgstAllowFree = 4, }; const long kcchMaxGst = kcchMaxStn; /**************************************** GSTB is a virtual class supporting GST and AST. ****************************************/ #define GSTB_PAR GRPB #define kclsGSTB 'GSTB' class GSTB : public GSTB_PAR { RTCLASS_DEC ASSERT protected: long _cbEntry; long _bstMac; long _cbstFree; // this is cvNil for non-allocated GSTBs protected: GSTB(long cbExtra, ulong grfgst); long _Bst(long ibst) { return *(long *)_Qb2(LwMul(ibst, _cbEntry)); } long *_Qbst(long ibst) { return (long *)_Qb2(LwMul(ibst, _cbEntry)); } PST _Qst(long ibst); void _RemoveSt(long bst); void _AppendRgch(achar *prgch, long cch); void _SwapBytesRgbst(void); void _TranslateGrst(short osk, bool fToCur); bool _FTranslateGrst(short osk); bool _FRead(PBLCK pblck, short *pbo, short *posk); bool _FDup(PGSTB pgstbDst); public: // methods required by parent class virtual bool FWrite(PBLCK pblck, short bo = kboCur, short osk = koskCur); virtual long CbOnFile(void); virtual bool FFree(long istn); bool FEnsureSpace(long cstnAdd, long cchAdd, ulong grfgrp = fgrpNil); void SetMinGrow(long cstnAdd, long cchAdd); virtual bool FAddRgch(achar *prgch, long cch, void *pvExtra = pvNil, long *pistn = pvNil) = 0; virtual bool FFindRgch(achar *prgch, long cch, long *pistn, ulong grfgst = fgstNil); long IstnMac(void) { return _ivMac; } long CbExtra(void) { return _cbEntry - size(long); } bool FAddStn(PSTN pstn, void *pvExtra = pvNil, long *pistn = pvNil); bool FPutRgch(long istn, achar *prgch, long cch); bool FPutStn(long istn, PSTN pstn); void GetRgch(long istn, achar *prgch, long cchMax, long *pcch); void GetStn(long istn, PSTN pstn); bool FFindStn(PSTN pstn, long *pistn, ulong grfgst = fgstNil); void GetExtra(long istn, void *pv); void PutExtra(long istn, void *pv); bool FFindExtra(void *prgbFind, PSTN pstn = pvNil, long *pistn = pvNil); }; /**************************************** String table ****************************************/ #define GST_PAR GSTB #define kclsGST 'GST' class GST : public GST_PAR { RTCLASS_DEC ASSERT protected: GST(long cbExtra) : GSTB(cbExtra, fgstNil) { } public: // static methods static PGST PgstNew(long cbExtra = 0, long cstnInit = 0, long cchInit = 0); static PGST PgstRead(PBLCK pblck, short *pbo = pvNil, short *posk = pvNil); static PGST PgstRead(PFIL pfil, FP fp, long cb, short *pbo = pvNil, short *posk = pvNil); // duplication PGST PgstDup(void); // methods required by parent class virtual bool FAddRgch(achar *prgch, long cch, void *pvExtra = pvNil, long *pistn = pvNil); virtual bool FFindRgch(achar *prgch, long cch, long *pistn, ulong grfgst = fgstNil); virtual void Delete(long istn); // new methods bool FInsertRgch(long istn, achar *prgch, long cch, void *pvExtra = pvNil); bool FInsertStn(long istn, PSTN pstn, void *pvExtra = pvNil); void Move(long istnSrc, long istnDst); }; /**************************************** Allocated string table ****************************************/ #define AST_PAR GSTB #define kclsAST 'AST' class AST : public AST_PAR { RTCLASS_DEC ASSERT protected: AST(long cbExtra) : GSTB(cbExtra, fgstAllowFree) { } public: // static methods static PAST PastNew(long cbExtra = 0, long cstnInit = 0, long cchInit = 0); static PAST PastRead(PBLCK pblck, short *pbo = pvNil, short *posk = pvNil); static PAST PastRead(PFIL pfil, FP fp, long cb, short *pbo = pvNil, short *posk = pvNil); // duplication PAST PastDup(void); // methods required by parent class virtual bool FAddRgch(achar *prgch, long cch, void *pvExtra = pvNil, long *pistn = pvNil); virtual void Delete(long istn); }; #endif //! GROUPS_H ================================================ FILE: kauai/src/groups2.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ****** Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Basic collection classes (continued from groups.cpp): General List (GL), Allocated List (AL), General Group (GG), Allocated Group (AG), General String Table (GST), Allocated String Table (AST). BASE ---> GRPB -+-> GLB -+-> GL | +-> AL | +-> GGB -+-> GG | +-> AG | +-> GSTB-+-> GST +-> AST ***************************************************************************/ #include "util.h" ASSERTNAME RTCLASS(GSTB) RTCLASS(GST) RTCLASS(AST) /*************************************************************************** Constructor for a base string table. ***************************************************************************/ GSTB::GSTB(long cbExtra, ulong grfgst) { AssertIn(cbExtra, 0, kcbMax); Assert(cbExtra % size(long) == 0, "cbExtra not multiple of size(long)"); _cbEntry = cbExtra + size(long); _cbstFree = (grfgst & fgstAllowFree) ? 0 : cvNil; // use some reasonable values for _cbMinGrow* - code can always set // set these to something else _cbMinGrow1 = 120; _cbMinGrow2 = 12 * _cbEntry; AssertThis(fobjAssertFull); } /*************************************************************************** Duplicate the string table. ***************************************************************************/ bool GSTB::_FDup(PGSTB pgstbDst) { AssertThis(fobjAssertFull); AssertPo(pgstbDst, fobjAssertFull); Assert(_cbEntry == pgstbDst->_cbEntry, "why do these have different sized entries?"); if (!GSTB_PAR::_FDup(pgstbDst, _bstMac, LwMul(_cbEntry, _ivMac))) return fFalse; pgstbDst->_cbEntry = _cbEntry; pgstbDst->_bstMac = _bstMac; pgstbDst->_cbstFree = _cbstFree; AssertPo(pgstbDst, fobjAssertFull); return fTrue; } // string table on file struct GSTF { short bo; short osk; long cbEntry; long ibstMac; long bstMac; long cbstFree; }; const BOM kbomGstf = 0x5FF00000L; /*************************************************************************** Return the amount of space on file needed for the string table. ***************************************************************************/ long GSTB::CbOnFile(void) { AssertThis(0); return size(GSTF) + LwMul(_ivMac, _cbEntry) + _bstMac; } /*************************************************************************** Write the string table to disk. It is the client's responsibility to ensure that the extra data has the given byte order (bo) and osk. If the osk has a different character size than the current one, the strings are actually saved in the corresponding osk with the same sized characters. ***************************************************************************/ bool GSTB::FWrite(PBLCK pblck, short bo, short osk) { AssertThis(fobjAssertFull); AssertPo(pblck, 0); Assert(kboCur == bo || kboOther == bo, "bad bo"); AssertOsk(osk); GSTF gstf; bool fRet; if (osk != koskCur) { switch (osk) { case koskSbMac: case koskUniMac: osk = koskMac; break; case koskSbWin: case koskUniWin: osk = koskWin; break; default: Bug("unknown osk"); return fFalse; } } gstf.bo = kboCur; gstf.osk = osk; gstf.cbEntry = _cbEntry; gstf.ibstMac = _ivMac; gstf.bstMac = _bstMac; gstf.cbstFree = _cbstFree; if (kboOther == bo) { SwapBytesBom(&gstf, kbomGstf); Assert(gstf.osk == osk, "osk not invariant under byte swapping"); _SwapBytesRgbst(); } if (koskCur != osk) _TranslateGrst(osk, fFalse); fRet = _FWrite(pblck, &gstf, size(gstf), _bstMac, LwMul(_cbEntry, _ivMac)); if (koskCur != osk) _TranslateGrst(osk, fTrue); if (kboOther == bo) _SwapBytesRgbst(); return fRet; } /*************************************************************************** Read string table data from a block. ***************************************************************************/ bool GSTB::_FRead(PBLCK pblck, short *pbo, short *posk) { AssertThis(0); AssertPo(pblck, 0); AssertNilOrVarMem(pbo); AssertNilOrVarMem(posk); GSTF gstf; long cbT; short bo; long cb; bool fRet = fFalse; if (!pblck->FUnpackData()) goto LFail; cb = pblck->Cb(); if (cb < size(gstf)) goto LBug; if (!pblck->FReadRgb(&gstf, size(gstf), 0)) goto LFail; if (pbo != pvNil) *pbo = gstf.bo; if (posk != pvNil) *posk = gstf.osk; if ((bo = gstf.bo) == kboOther) SwapBytesBom(&gstf, kbomGstf); cb -= size(gstf); // don't use LwMul, in case the file is corrupted, we don't want to assert, // we should detect it below. cbT = gstf.cbEntry * gstf.ibstMac; if (gstf.bo != kboCur || !FIn(gstf.cbEntry, size(long), kcbMax) || (gstf.cbEntry % size(long)) != 0 || !FIn(gstf.ibstMac, 0, kcbMax) || !FIn(gstf.bstMac, gstf.ibstMac - LwMax(0, gstf.cbstFree), kcbMax) || cb != cbT + gstf.bstMac || (gstf.cbstFree == cvNil) != (_cbstFree == cvNil) || gstf.cbstFree != cvNil && !FIn(gstf.cbstFree, 0, LwMax(1, gstf.ibstMac))) { LBug: Warn("file corrupt or not a GSTB"); goto LFail; } _cbEntry = gstf.cbEntry; _ivMac = gstf.ibstMac; _bstMac = gstf.bstMac; _cbstFree = gstf.cbstFree; fRet = _FReadData(pblck, cb - cbT, cbT, size(gstf)); if (fRet) { if (bo == kboOther) _SwapBytesRgbst(); if (koskCur != gstf.osk) fRet = _FTranslateGrst(gstf.osk); } LFail: TrashVarIf(!fRet, pbo); TrashVarIf(!fRet, posk); return fRet; } /*************************************************************************** Ensures that there is room to add at least cstnAdd new strings with a total of cchAdd characters. If there is more than enough room and fgrpShrink is passed, the GSTB may shrink. ***************************************************************************/ bool GSTB::FEnsureSpace(long cstnAdd, long cchAdd, ulong grfgrp) { AssertThis(0); AssertIn(cstnAdd, 0, kcbMax); AssertIn(cchAdd, 0, kcbMax); long cbstAdd; long cbAdd = cchAdd * size(achar); if (cvNil == _cbstFree) cbstAdd = cstnAdd; else cbstAdd = LwMax(0, cstnAdd - _cbstFree); if (cbstAdd > kcbMax / _cbEntry - _ivMac || cstnAdd > kcbMax - _bstMac || cbAdd > kcbMax - _bstMac - cstnAdd) { Bug("why is this string table growing so large?"); return fFalse; } return _FEnsureSizes(_bstMac + cbAdd + cstnAdd, LwMul(_ivMac + cbstAdd, _cbEntry), grfgrp); } /*************************************************************************** Set the minimum that a GSTB should grow by. ***************************************************************************/ void GSTB::SetMinGrow(long cstnAdd, long cchAdd) { AssertThis(0); AssertIn(cstnAdd, 0, kcbMax); AssertIn(cchAdd, 0, kcbMax); _cbMinGrow1 = CbRoundToLong(cchAdd * size(achar) + cstnAdd); _cbMinGrow2 = LwMul(cstnAdd, _cbEntry); } /*************************************************************************** Append an stn to string table. ***************************************************************************/ bool GSTB::FAddStn(PSTN pstn, void *pvExtra, long *pistn) { AssertThis(0); AssertPo(pstn, 0); return FAddRgch(pstn->Prgch(), pstn->Cch(), pvExtra, pistn); } /*************************************************************************** Replace the ith string. ***************************************************************************/ bool GSTB::FPutRgch(long istn, achar *prgch, long cch) { AssertThis(fobjAssertFull); AssertIn(istn, 0, _ivMac); Assert(!FFree(istn), "string entry is free!"); AssertIn(cch, 0, kcchMaxGst + 1); AssertPvCb(prgch, cch * size(achar)); long cchOld; long bstOld; achar *qst; qst = _Qst(istn); if ((cchOld = CchSt(qst)) == cch) { CopyPb(prgch, PrgchSt(qst), cch * size(achar)); goto LDone; } if (cchOld < cch && !_FEnsureSizes(_bstMac + (cch - cchOld) * size(achar), LwMul(_ivMac, _cbEntry), fgrpNil)) { return fFalse; } // remove the old one bstOld = _Bst(istn); _RemoveSt(bstOld); // append the new one *_Qbst(istn) = _bstMac; _AppendRgch(prgch, cch); LDone: AssertThis(fobjAssertFull); return fTrue; } /*************************************************************************** Replace the ith string with stn. ***************************************************************************/ bool GSTB::FPutStn(long istn, PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); return FPutRgch(istn, pstn->Prgch(), pstn->Cch()); } /*************************************************************************** Get up to cchMax characters for the istn'th string. ***************************************************************************/ void GSTB::GetRgch(long istn, achar *prgch, long cchMax, long *pcch) { AssertThis(0); AssertIn(istn, 0, _ivMac); Assert(!FFree(istn), "string entry is free!"); AssertIn(cchMax, 0, kcbMax); AssertPvCb(prgch, cchMax * size(achar)); AssertVarMem(pcch); PST qst = _Qst(istn); *pcch = LwMin(cchMax, CchSt(qst)); CopyPb(PrgchSt(qst), prgch, *pcch * size(achar)); } /*************************************************************************** Get the ith string. ***************************************************************************/ void GSTB::GetStn(long istn, PSTN pstn) { AssertThis(0); AssertIn(istn, 0, _ivMac); Assert(!FFree(istn), "string entry is free!"); AssertPo(pstn, 0); pstn->SetSt(_Qst(istn)); } /*************************************************************************** Find the given stn in the string table. ***************************************************************************/ bool GSTB::FFindStn(PSTN pstn, long *pistn, ulong grfgst) { AssertThis(0); AssertPo(pstn, 0); return FFindRgch(pstn->Prgch(), pstn->Cch(), pistn, grfgst); } /*************************************************************************** Search for the string in the string table. This version does a linear search. GST overrides this to do a binary search if fgstSorted is passed in grfgst. ***************************************************************************/ bool GSTB::FFindRgch(achar *prgch, long cch, long *pistn, ulong grfgst) { AssertThis(0); AssertIn(cch, 0, kcchMaxGst + 1); AssertPvCb(prgch, cch * size(achar)); AssertVarMem(pistn); long istn, bst; PST qst; for (istn = 0; istn < _ivMac; istn++) { bst = _Bst(istn); if (bvNil == bst) { AssertIn(_cbstFree, 0, _ivMac); Assert(istn < _ivMac - 1, "last element free"); continue; } AssertIn(bst, 0, _bstMac); qst = (achar *)_Qb1(bst); if (CchSt(qst) == cch && FEqualRgb(PrgchSt(qst), prgch, cch * size(achar))) { *pistn = istn; return fTrue; } } *pistn = istn; return fFalse; } /*************************************************************************** Find the string with the given extra data in the string table. ***************************************************************************/ bool GSTB::FFindExtra(void *prgbFind, PSTN pstn, long *pistn) { AssertThis(0); AssertPvCb(prgbFind, CbExtra()); AssertNilOrPo(pstn, 0); AssertNilOrVarMem(pistn); long istn; byte *qbExtra; long cbExtra = CbExtra(); long ivMac = IvMac(); if (cbExtra == 0) { Bug("no extra data"); TrashVar(pistn); return fFalse; } for (istn = 0; istn < ivMac; istn++) { qbExtra = (byte *)_Qbst(istn) + size(long); if (FEqualRgb(prgbFind, qbExtra, cbExtra)) { if (pstn != pvNil) GetStn(istn, pstn); if (pistn != pvNil) *pistn = istn; return fTrue; } } if (pvNil != pstn) pstn->SetNil(); TrashVar(pistn); return fFalse; } /*************************************************************************** Fetch the extra data for element istn. ***************************************************************************/ void GSTB::GetExtra(long istn, void *pv) { AssertThis(0); AssertIn(istn, 0, _ivMac); Assert(!FFree(istn), "string entry is free!"); Assert(_cbEntry > size(long), "no extra data"); AssertPvCb(pv, _cbEntry - size(long)); byte *qb; qb = (byte *)_Qbst(istn) + size(long); CopyPb(qb, pv, _cbEntry - size(long)); } /*************************************************************************** Put the extra data for element istn. ***************************************************************************/ void GSTB::PutExtra(long istn, void *pv) { AssertThis(0); AssertIn(istn, 0, _ivMac); Assert(!FFree(istn), "string entry is free!"); Assert(_cbEntry > size(long), "no extra data"); AssertPvCb(pv, _cbEntry - size(long)); byte *qb; qb = (byte *)_Qbst(istn) + size(long); CopyPb(pv, qb, _cbEntry - size(long)); AssertThis(0); } /*************************************************************************** Return a volatile pointer to the string given the ibst (not the bst). ***************************************************************************/ achar *GSTB::_Qst(long ibst) { AssertIn(ibst, 0, _ivMac); long bst = _Bst(ibst); AssertIn(bst, 0, _bstMac); return (achar *)_Qb1(bst); } /*************************************************************************** Private api to append the string. It's assumed that the first block is already big enough to accomodate the string. ***************************************************************************/ void GSTB::_AppendRgch(achar *prgch, long cch) { AssertIn(cch, 0, kcchMaxGst + 1); AssertPvCb(prgch, cch * size(achar)); achar *qch; Assert(_Cb1() >= _bstMac + (cch + 1) * size(achar), "first block not big enough"); qch = (achar *)_Qb1(_bstMac); *qch++ = (achar)cch; CopyPb(prgch, qch, cch * size(achar)); _bstMac += (cch + 1) * size(achar); } /*************************************************************************** Private api to remove the string. ***************************************************************************/ void GSTB::_RemoveSt(long bst) { AssertIn(bst, 0, _bstMac); long cb; byte *qb; qb = _Qb1(bst); cb = CchTotSt((PST)qb) * size(achar); AssertIn(bst + cb, 0, _bstMac + 1); if (bst + cb < _bstMac) { long cv; BltPb(qb + cb, qb, _bstMac - bst - cb); for (qb = _Qb2(0), cv = _ivMac; cv-- > 0; qb += _cbEntry) { if (*(long *)qb > bst) { Assert(*(long *)qb >= bst + cb, "overlapping strings in GSTB"); *(long *)qb -= cb; } } } _bstMac -= cb; } /*************************************************************************** Swap the bytes in the BST values. Note that each bst is followed by the extra data, so we can't just use SwapBytesRglw. ***************************************************************************/ void GSTB::_SwapBytesRgbst(void) { if (size(long) == _cbEntry) SwapBytesRglw(_Qb2(0), _ivMac); else { long cbst; byte *qb; for (cbst = _ivMac, qb = _Qb2(0); cbst-- > 0; qb += _cbEntry) SwapBytesRglw(qb, 1); } } /*************************************************************************** Translate the strings to/from the platform osk. This only works if CbCharOsk(osk) == CbCharOsk(koskCur) (it asserts otherwise). ***************************************************************************/ void GSTB::_TranslateGrst(short osk, bool fToCur) { AssertOsk(osk); long bst; byte *qb; if (CbCharOsk(osk) != CbCharOsk(koskCur)) { Bug("can't translate to this osk"); return; } qb = _Qb1(0); for (bst = 0; bst < _bstMac;) { TranslateSt((achar *)(qb + bst), osk, fToCur); bst += CchTotSt((PST)(qb + bst)) * size(achar); } } /*************************************************************************** Translate the strings to the current osk. ***************************************************************************/ bool GSTB::_FTranslateGrst(short osk) { AssertOsk(osk); void *pvSrc; long cbSrc; long cbChar; long ibst, bstOld, cch; long *qbst; achar rgch[kcchMaxSt]; bool fRet = fFalse; if ((cbChar = CbCharOsk(osk)) == CbCharOsk(koskCur)) { _TranslateGrst(osk, fTrue); return fTrue; } if (cbChar != size(schar) && cbChar != size(wchar)) { Bug("unknown osk"); return fFalse; } if (_bstMac == 0) return fTrue; if (!FAllocPv(&pvSrc, cbSrc = _bstMac, fmemNil, mprNormal)) return fFalse; CopyPb(_Qb1(0), pvSrc, cbSrc); _bstMac = 0; for (ibst = 0; ibst < _ivMac; ibst++) { qbst = _Qbst(ibst); bstOld = *qbst; *qbst = _bstMac; if (bstOld + cbChar > cbSrc) goto LFail; if (cbChar == size(schar)) { schar chs = *(schar *)PvAddBv(pvSrc, bstOld); cch = (long)(byte)chs; } else { wchar chw; CopyPb(PvAddBv(pvSrc, bstOld), &chw, size(wchar)); if (osk == MacWin(koskUniWin, koskUniMac)) SwapBytesRgsw(&chw, 1); cch = (long)(ushort)chw; } if (!FIn(cch, 0, kcchMaxSt + 1) || bstOld + (cch + 1) * cbChar > cbSrc) goto LFail; cch = CchTranslateRgb(PvAddBv(pvSrc, bstOld + cbChar), cch * cbChar, osk, rgch, kcchMaxSt); if (!_FEnsureSizes(_bstMac + (cch + 1) * size(achar), LwMul(_ivMac, _cbEntry), fgrpNil)) { goto LFail; } _AppendRgch(rgch, cch); } fRet = fTrue; AssertDo(_FEnsureSizes(_bstMac, LwMul(_ivMac, _cbEntry), fgrpShrink), 0); LFail: FreePpv(&pvSrc); return fRet; } /*************************************************************************** Returns true iff ibst is out of range or the corresponding bst is bvNil. ***************************************************************************/ bool GSTB::FFree(long istn) { AssertIn(istn, 0, kcbMax); long bst; if (!FIn(istn, 0, _ivMac)) return fTrue; bst = _Bst(istn); Assert(bvNil == bst || FIn(bst, 0, _bstMac), "bad bst"); return bvNil == bst; } #ifdef DEBUG /*************************************************************************** Validate a string table. ***************************************************************************/ void GSTB::AssertValid(ulong grfobj) { long ibst; long cchTot, cbstFree; long bst; GSTB_PAR::AssertValid(grfobj); AssertIn(_cbEntry, size(long), kcbMax); Assert(_cbEntry % size(long) == 0, "_cbEntry bad"); AssertIn(_ivMac, 0, kcbMax); Assert(_Cb1() >= _bstMac, "grst area too small"); Assert(_Cb2() >= LwMul(_ivMac, _cbEntry), "rgbst area too small"); Assert(_cbstFree == cvNil || FIn(_cbstFree, 0, LwMax(1, _ivMac)), "_cbstFree is wrong"); if (grfobj & fobjAssertFull) { // it would be nice to assert that no strings overlap each other, // but that's hard to do in linear time, so just assert that the // grst is the correct size. for (cbstFree = cchTot = ibst = 0; ibst < _ivMac; ibst++) { bst = _Bst(ibst); if (bvNil == bst) { Assert(ibst < _ivMac - 1, "last element free"); cbstFree++; continue; } AssertIn(bst, 0, _bstMac); AssertSt((achar *)_Qb1(bst)); cchTot += CchTotSt((PST)_Qb1(bst)); } Assert(cchTot * size(achar) == _bstMac, "grst wrong size"); Assert(cbstFree == _cbstFree || _cbstFree == cvNil && cbstFree == 0, "bad _cbstFree"); } } #endif // DEBUG /*************************************************************************** Allocate a new string table and ensure that it has space for cstnInit strings, totalling cchInit characters. ***************************************************************************/ PGST GST::PgstNew(long cbExtra, long cstnInit, long cchInit) { AssertIn(cbExtra, 0, kcbMax); Assert(cbExtra % size(long) == 0, "cbExtra not multiple of size(long)"); AssertIn(cstnInit, 0, kcbMax); AssertIn(cchInit, 0, kcbMax); PGST pgst; if ((pgst = NewObj GST(cbExtra)) == pvNil) return pvNil; if ((cstnInit > 0 || cchInit > 0) && !pgst->FEnsureSpace(cstnInit, cchInit, fgrpNil)) { ReleasePpo(&pgst); return pvNil; } AssertPo(pgst, 0); return pgst; } /*************************************************************************** Read a string table from a block and return it. ***************************************************************************/ PGST GST::PgstRead(PBLCK pblck, short *pbo, short *posk) { AssertPo(pblck, 0); AssertNilOrVarMem(pbo); AssertNilOrVarMem(posk); PGST pgst; if ((pgst = NewObj GST(0)) == pvNil) goto LFail; if (!pgst->_FRead(pblck, pbo, posk)) { ReleasePpo(&pgst); LFail: TrashVar(pbo); TrashVar(posk); return pvNil; } AssertPo(pgst, 0); return pgst; } /*************************************************************************** Read a string table from file and return it. ***************************************************************************/ PGST GST::PgstRead(PFIL pfil, FP fp, long cb, short *pbo, short *posk) { BLCK blck(pfil, fp, cb); return PgstRead(&blck, pbo, posk); } /*************************************************************************** Duplicate this GST. ***************************************************************************/ PGST GST::PgstDup(void) { AssertThis(0); PGST pgst; if (pvNil == (pgst = PgstNew(_cbEntry - size(long)))) return pvNil; if (!_FDup(pgst)) ReleasePpo(&pgst); AssertNilOrPo(pgst, 0); return pgst; } /*************************************************************************** Append a string to the string table. ***************************************************************************/ bool GST::FAddRgch(achar *prgch, long cch, void *pvExtra, long *pistn) { AssertThis(0); AssertIn(cch, 0, kcchMaxGst + 1); AssertPvCb(prgch, cch * size(achar)); AssertNilOrPvCb(pvExtra, _cbEntry - size(long)); AssertNilOrVarMem(pistn); if (pistn != pvNil) *pistn = _ivMac; if (!FInsertRgch(_ivMac, prgch, cch, pvExtra)) { TrashVar(pistn); return fFalse; } return fTrue; } /*************************************************************************** Find the given string and put its location in *pistn. If it's not there, fill *pistn with where it would be. If fgstSorted or fgstUserSorted is passed in, this does a binary search for the string; otherwise it does a linear search. ***************************************************************************/ bool GST::FFindRgch(achar *prgch, long cch, long *pistn, ulong grfgst) { AssertThis(0); AssertIn(cch, 0, kcchMaxGst); AssertPvCb(prgch, cch * size(achar)); AssertVarMem(pistn); if (!(grfgst & (fgstSorted | fgstUserSorted))) return GSTB::FFindRgch(prgch, cch, pistn, grfgst); // the table should be sorted, so do a binary search long ivMin, ivLim, iv; ulong fcmp; achar *qst; for (ivMin = 0, ivLim = _ivMac; ivMin < ivLim;) { iv = (ivMin + ivLim) / 2; qst = _Qst(iv); if (grfgst & fgstUserSorted) fcmp = FcmpCompareUserRgch(prgch, cch, PrgchSt(qst), CchSt(qst)); else fcmp = FcmpCompareRgch(prgch, cch, PrgchSt(qst), CchSt(qst)); if (fcmp == fcmpLt) ivLim = iv; else if (fcmp == fcmpGt) ivMin = iv + 1; else { Assert(fcmp == fcmpEq, "bad fcmp"); *pistn = iv; return fTrue; } } // this is where it would be *pistn = ivMin; return fFalse; } /*************************************************************************** Insert a new entry into the string text. ***************************************************************************/ bool GST::FInsertRgch(long istn, achar *prgch, long cch, void *pvExtra) { AssertThis(fobjAssertFull); AssertIn(istn, 0, _ivMac + 1); AssertIn(cch, 0, kcchMaxGst + 1); AssertPvCb(prgch, cch * size(achar)); AssertNilOrPvCb(pvExtra, _cbEntry - size(long)); byte *qb; if (!_FEnsureSizes(_bstMac + (cch + 1) * size(achar), LwMul(_ivMac + 1, _cbEntry), fgrpNil)) { return fFalse; } // make room for the entry qb = (byte *)_Qbst(istn); if (istn < _ivMac) BltPb(qb, qb + _cbEntry, LwMul(_ivMac - istn, _cbEntry)); *(long *)qb = _bstMac; if (size(long) < _cbEntry) { qb += size(long); if (pvExtra != pvNil) CopyPb(pvExtra, qb, _cbEntry - size(long)); else TrashPvCb(qb, _cbEntry - size(long)); } else Assert(pvNil == pvExtra, "cbExtra is zero"); _ivMac++; // put the string in _AppendRgch(prgch, cch); AssertThis(fobjAssertFull); return fTrue; } /*************************************************************************** Insert an stn into the string table ***************************************************************************/ bool GST::FInsertStn(long istn, PSTN pstn, void *pvExtra) { AssertThis(0); AssertIn(istn, 0, _ivMac + 1); AssertPo(pstn, 0); AssertNilOrPvCb(pvExtra, _cbEntry - size(long)); return FInsertRgch(istn, pstn->Prgch(), pstn->Cch(), pvExtra); } /*************************************************************************** Delete the string at location istn. ***************************************************************************/ void GST::Delete(long istn) { AssertThis(fobjAssertFull); AssertIn(istn, 0, _ivMac); byte *qb; long bst; qb = (byte *)_Qbst(istn); bst = *(long *)qb; if (istn < --_ivMac) BltPb(qb + _cbEntry, qb, LwMul(_ivMac - istn, _cbEntry)); TrashPvCb(_Qbst(_ivMac), _cbEntry); _RemoveSt(bst); AssertThis(fobjAssertFull); } /*************************************************************************** Move the entry at ivSrc to be immediately before the element that is currently at ivTarget. If ivTarget > ivSrc, the entry actually ends up at (ivTarget - 1) and the entry at ivTarget doesn't move. If ivTarget < ivSrc, the entry ends up at ivTarget and the entry at ivTarget moves to (ivTarget + 1). Everything in between is shifted appropriately. ivTarget is allowed to be equal to IvMac(). ***************************************************************************/ void GST::Move(long ivSrc, long ivTarget) { AssertThis(0); AssertIn(ivSrc, 0, _ivMac); AssertIn(ivTarget, 0, _ivMac + 1); MoveElement(_Qbst(0), _cbEntry, ivSrc, ivTarget); AssertThis(0); } #ifdef DEBUG /*************************************************************************** Validate a string table. ***************************************************************************/ void GST::AssertValid(ulong grfobj) { GST_PAR::AssertValid(grfobj); AssertVar(_cbstFree == cvNil, "bad _cbstFree in GST", &_cbstFree); } #endif // DEBUG /*************************************************************************** Allocate a new allocated string table and ensure that it has space for cstnInit strings, totalling cchInit characters. ***************************************************************************/ PAST AST::PastNew(long cbExtra, long cstnInit, long cchInit) { AssertIn(cbExtra, 0, kcbMax); Assert(cbExtra % size(long) == 0, "cbExtra not multiple of size(long)"); AssertIn(cstnInit, 0, kcbMax); AssertIn(cchInit, 0, kcbMax); PAST past; if ((past = NewObj AST(cbExtra)) == pvNil) return pvNil; if ((cstnInit > 0 || cchInit > 0) && !past->FEnsureSpace(cstnInit, cchInit, fgrpNil)) { ReleasePpo(&past); return pvNil; } AssertPo(past, 0); return past; } /*************************************************************************** Read an allocated string table from a block and return it. ***************************************************************************/ PAST AST::PastRead(PBLCK pblck, short *pbo, short *posk) { AssertPo(pblck, 0); AssertNilOrVarMem(pbo); AssertNilOrVarMem(posk); PAST past; if ((past = NewObj AST(0)) == pvNil) goto LFail; if (!past->_FRead(pblck, pbo, posk)) { ReleasePpo(&past); LFail: TrashVar(pbo); TrashVar(posk); return pvNil; } AssertPo(past, 0); return past; } /*************************************************************************** Read an allocated string table from file and return it. ***************************************************************************/ PAST AST::PastRead(PFIL pfil, FP fp, long cb, short *pbo, short *posk) { BLCK blck; return PastRead(&blck, pbo, posk); } /*************************************************************************** Duplicate this AST. ***************************************************************************/ PAST AST::PastDup(void) { AssertThis(0); PAST past; if (pvNil == (past = PastNew(_cbEntry - size(long)))) return pvNil; if (!_FDup(past)) ReleasePpo(&past); AssertNilOrPo(past, 0); return past; } /*************************************************************************** Append a string to the allocated string table. ***************************************************************************/ bool AST::FAddRgch(achar *prgch, long cch, void *pvExtra, long *pistn) { AssertThis(fobjAssertFull); AssertIn(cch, 0, kcchMaxGst + 1); AssertPvCb(prgch, cch * size(achar)); AssertNilOrPvCb(pvExtra, _cbEntry - size(long)); AssertNilOrVarMem(pistn); long ibst; byte *qb; if (_cbstFree > 0) { /* find the first free bst */ qb = _Qb2(0); for (ibst = 0; ibst < _ivMac; ibst++, qb += _cbEntry) { if (*(long *)qb == bvNil) break; } Assert(ibst < _ivMac - 1, "_cbstFree is wrong"); _cbstFree--; } else ibst = _ivMac++; if (!_FEnsureSizes(_bstMac + (cch + 1) * size(achar), LwMul(_ivMac, _cbEntry), fgrpNil)) { if (ibst == _ivMac - 1) _ivMac--; else _cbstFree++; TrashVar(pistn); return fFalse; } // fill in the bst and extra data qb = (byte *)_Qbst(ibst); *(long *)qb = _bstMac; if (size(long) < _cbEntry) { qb += size(long); if (pvExtra != pvNil) CopyPb(pvExtra, qb, _cbEntry - size(long)); else TrashPvCb(qb, _cbEntry - size(long)); } else Assert(pvNil == pvExtra, "cbExtra is zero"); // put the string in _AppendRgch(prgch, cch); if (pvNil != pistn) *pistn = ibst; AssertThis(fobjAssertFull); return fTrue; } /*************************************************************************** Delete the string at location istn. ***************************************************************************/ void AST::Delete(long istn) { AssertThis(fobjAssertFull); AssertIn(istn, 0, _ivMac); Assert(!FFree(istn), "entry already free!"); byte *qb; long bst; qb = (byte *)_Qbst(istn); bst = *(long *)qb; if (istn == _ivMac - 1) { // move _ivMac back past any free entries on the end while (--_ivMac > 0 && *(long *)(qb -= _cbEntry) == bvNil) _cbstFree--; TrashPvCb(_Qbst(_ivMac), LwMul(istn - _ivMac + 1, _cbEntry)); } else { *(long *)qb = bvNil; TrashPvCb(qb + size(long), _cbEntry - size(long)); _cbstFree++; } _RemoveSt(bst); AssertThis(fobjAssertFull); } #ifdef DEBUG /*************************************************************************** Validate a string table. ***************************************************************************/ void AST::AssertValid(ulong grfobj) { AST_PAR::AssertValid(grfobj); AssertIn(_cbstFree, 0, LwMax(1, _ivMac)); } #endif // DEBUG ================================================ FILE: kauai/src/kcd2_386.c ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** This c file is compiled to a command-line exe which when run produces the 80386 asm version of the KCD2 decompression code. Register usage: eax: source bytes ebx: source address edi: destination address edx: working space ecx: for rep movsb esi: for rep movsb ***************************************************************************/ #include #include #include #include #include "codkpri.h" const int kcbitMinMoveByDword = 3; const bool fFalse = 0; const bool fTrue = 1; static FILE *output = NULL; void Setup(void); void End(void); void Advance(long cb); void Test(long ibit); void Block(long ibit); void Literal(long ibit, bool fDword, bool fSingle); void Offset(long ibit, bool fDword, long cbit, long cbitOH, long dibBase, long cbBase); void Copy(long ibit, bool fDword); int main(int argc, char *argv[]) { if (argc != 2) { fprintf(stderr, "usage: %s ", argv[0]); return EXIT_FAILURE; } output = fopen(argv[1], "w"); if (output == NULL) { fprintf(stderr, "could not open %s", argv[1]); return EXIT_FAILURE; } long ibit; Setup(); for (ibit = 0; ibit < 8; ibit++) { if (kcbitMinMoveByDword <= kcbitMaxLenKcd2) { Literal(ibit, fTrue, fFalse); Offset(ibit, fTrue, kcbitKcd2_0, 2, kdibMinKcd2_0, 1); Offset(ibit, fTrue, kcbitKcd2_1, 3, kdibMinKcd2_1, 1); Offset(ibit, fTrue, kcbitKcd2_2, 4, kdibMinKcd2_2, 1); Offset(ibit, fTrue, kcbitKcd2_3, 4, kdibMinKcd2_3, 2); Copy(ibit, fTrue); fprintf(output, " jmp LBlock%d\n", ibit); } Literal(ibit, fFalse, fTrue); Literal(ibit, fFalse, fFalse); Offset(ibit, fFalse, kcbitKcd2_0, 2, kdibMinKcd2_0, 1); Offset(ibit, fFalse, kcbitKcd2_1, 3, kdibMinKcd2_1, 1); Offset(ibit, fFalse, kcbitKcd2_2, 4, kdibMinKcd2_2, 1); Offset(ibit, fFalse, kcbitKcd2_3, 4, kdibMinKcd2_3, 2); Copy(ibit, fFalse); Block(ibit); } End(); return 0; } void Setup(void) { fprintf(output, " // Setup\n" " long cbTot;\n" " byte *pbLimDst = (byte *)pvDst + cbDst;\n" " byte *pbLimSrc = (byte *)pvSrc + cbSrc - kcbTailKcd2;\n\n" "__asm\n" " {\n" " mov edi,pvDst\n" " mov ebx,pvSrc\n" " inc ebx\n"); Advance(4); fprintf(output, " jmp LBlock0\n"); } void Copy(long ibit, bool fDword) { if (fDword) fprintf(output, "\n // Copy Dword %d\nLCopyDword%d:\n", ibit, ibit); else fprintf(output, "\n // Copy Byte %d\nLCopyByte%d:\n", ibit, ibit); fprintf(output, "#ifdef SAFETY\n" " push edx\n" " lea edx,[edi+ecx]\n" " cmp edx,pbLimDst\n" " pop edx\n" " ja LFail\n" "#endif //SAFETY\n"); fprintf(output, " neg esi\n" " add esi,edi\n"); fprintf(output, "#ifdef SAFETY\n" " cmp esi,pvDst\n" " jb LFail\n" "#endif //SAFETY\n"); if (fDword) { fprintf(output, " mov edx,ecx\n" " shr ecx,2\n" " and edx,3\n" " rep movsd\n" " mov ecx,edx\n" " rep movsb\n"); } else fprintf(output, " rep movsb\n"); } void End(void) { fprintf(output, "\nLDone:\n" " sub edi,pvDst\n" " mov cbTot,edi\n" " }\n\n"); } void Advance(long cb) { switch (cb) { case 0: break; case 1: fprintf(output, " mov eax,[ebx-3]\n" " inc ebx\n"); break; case 2: fprintf(output, " mov eax,[ebx-2]\n" " add ebx,2\n"); break; case 3: fprintf(output, " mov eax,[ebx-1]\n" " add ebx,3\n"); break; case 4: fprintf(output, " mov eax,[ebx]\n" " add ebx,4\n"); break; default: fprintf(output, "*** BUG\n"); break; } } void Test(long ibit) { if (ibit < 8) fprintf(output, " test al,%d\n", 1 << ibit); else if (ibit < 16) fprintf(output, " test ah,%d\n", 1 << (ibit - 8)); else fprintf(output, " test eax,%d\n", 1 << ibit); } void Block(long ibit) { long cbit, ibitT; fprintf(output, "\n // Block %d\n", ibit); fprintf(output, "LBlock%d:\n", ibit); for (cbit = 0; cbit <= kcbitMaxLenKcd2; cbit++) { Test(ibit + cbit); fprintf(output, " jz LLen%d_%d\n", ibit, cbit); } fprintf(output, " jmp LDone\n"); for (cbit = 0; cbit <= kcbitMaxLenKcd2; cbit++) { fprintf(output, "LLen%d_%d:\n", ibit, cbit); if (cbit == 0) fprintf(output, " mov ecx,1\n"); else { fprintf(output, " mov ecx,eax\n"); fprintf(output, " shr ecx,%d\n", ibit + cbit + 1); fprintf(output, " and ecx,%d\n", (1 << cbit) - 1); fprintf(output, " or ecx,%d\n", (1 << cbit)); } ibitT = ibit + cbit + cbit + 1; Advance(ibitT / 8); ibitT &= 0x07; Test(ibitT); if (cbit == 0) fprintf(output, " jz LLitSingle%d\n", ibitT); else if (cbit < kcbitMinMoveByDword) fprintf(output, " jz LLitByte%d\n", ibitT); else fprintf(output, " jz LLitDword%d\n", ibitT); Test(ibitT + 1); if (cbit < kcbitMinMoveByDword) { fprintf(output, " jz L%dBitOffByte%d\n", kcbitKcd2_0, ibitT); Test(ibitT + 2); fprintf(output, " jz L%dBitOffByte%d\n", kcbitKcd2_1, ibitT); Test(ibitT + 3); fprintf(output, " jz L%dBitOffByte%d\n", kcbitKcdc2, ibitT); fprintf(output, " jmp L%dBitOffByte%d\n", kcbitKcdc3, ibitT); } else { fprintf(output, " jz L%dBitOffDword%d\n", kcbitKcd2_0, ibitT); Test(ibitT + 2); fprintf(output, " jz L%dBitOffDword%d\n", kcbitKcd2_1, ibitT); Test(ibitT + 3); fprintf(output, " jz L%dBitOffDword%d\n", kcbitKcdc2, ibitT); fprintf(output, " jmp L%dBitOffDword%d\n", kcbitKcdc3, ibitT); } } } void Offset(long ibit, bool fDword, long cbit, long cbitOH, long dibBase, long cbBase) { ibit = (ibit - cbit - cbitOH) & 0x07; if (fDword) fprintf(output, "\nL%dBitOffDword%d:\n", cbit, ibit); else fprintf(output, "\nL%dBitOffByte%d:\n", cbit, ibit); fprintf(output, " mov esi,eax\n"); if (cbBase == 1) fprintf(output, " inc ecx\n"); else fprintf(output, " add ecx,%d\n", cbBase); fprintf(output, " shr esi,%d\n", ibit + cbitOH); fprintf(output, " and esi,%d\n", (1 << cbit) - 1); if (1 == dibBase) fprintf(output, " inc esi\n"); else fprintf(output, " add esi,%d\n", dibBase); ibit += cbitOH + cbit; Advance(ibit / 8); ibit &= 0x07; if (fDword) { if (dibBase < 4 && fDword) { fprintf(output, " cmp esi,4\n"); fprintf(output, " jb LCopyByte%d\n", ibit); } fprintf(output, " jmp LCopyDword%d\n", ibit); } else fprintf(output, " jmp LCopyByte%d\n", ibit); } void Literal(long ibit, bool fDword, bool fSingle) { ibit = (ibit - 1) & 0x07; if (fDword) fprintf(output, "\nLLitDword%d:\n", ibit); else if (fSingle) fprintf(output, "\nLLitSingle%d:\n", ibit); else fprintf(output, "\nLLitByte%d:\n", ibit); ibit++; if (fSingle) { fprintf(output, "#ifdef SAFETY\n" " cmp edi,pbLimDst\n" " jae LFail\n" "#endif //SAFETY\n"); if (ibit == 8) { fprintf(output, " mov [edi],ah\n" " inc edi\n"); } else { fprintf(output, " mov edx,eax\n" " shr edx,%d\n" " mov [edi],dl\n" " inc edi\n", ibit); } ibit += 8; Advance(ibit / 8); fprintf(output, " jmp LBlock%d\n", ibit & 0x07); return; } fprintf(output, "#ifdef SAFETY\n" " lea edx,[edi+ecx]\n" " cmp edx,pbLimDst\n" " ja LFail\n" "#endif //SAFETY\n"); if (ibit != 8) { // get the low bits of the last byte fprintf(output, " dec ecx\n"); fprintf(output, " mov edx,eax\n"); fprintf(output, " shr edx,%d\n", ibit); fprintf(output, " and edx,%d\n", (1 << (8 - ibit)) - 1); } fprintf(output, "#ifdef SAFETY\n" " lea esi,[ebx-3+ecx]\n" " cmp esi,pbLimSrc\n" " ja LFail\n" " sub esi,ecx\n" "#else //!SAFETY\n" " lea esi,[ebx-3]\n" "#endif //!SAFETY\n"); if (fDword) { fprintf(output, " mov eax,ecx\n" " shr ecx,2\n" " and eax,3\n" " rep movsd\n" " mov ecx,eax\n" " rep movsb\n"); } else fprintf(output, " rep movsb\n"); fprintf(output, " lea ebx,[esi+4]\n" " mov eax,[esi]\n"); if (ibit != 8) { fprintf(output, " mov esi,eax\n"); fprintf(output, " shl esi,%d\n", 8 - ibit); fprintf(output, " or edx,esi\n" " mov [edi],dl\n" " inc edi\n"); } fprintf(output, " jmp LBlock%d\n", ibit & 0x07); } ================================================ FILE: kauai/src/kcdc_386.c ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** This c file is compiled to a command-line exe which when run produces the 80386 asm version of the KCDC decompression code. Register usage: eax: source bytes ebx: source address edi: destination address edx: working space ecx: for rep movsb esi: for rep movsb ***************************************************************************/ #include #include #include #include #include "codkpri.h" const int kcbitMinMoveByDword = 3; const bool fFalse = 0; const bool fTrue = 1; static FILE *output = NULL; void Setup(void); void End(void); void Advance(long cb); void Test(long ibit); void Block(long ibit); void Literal(long ibit); void Offset(long ibit, long cbit, long dibBase, long cbBase); void GetLen(long ibit, bool fTestForDword); void CallCopy(long ibit, long cbit, bool fTestForDword); void Copy(long ibit, bool fDword); int main(int argc, char *argv[]) { if (argc != 2) { fprintf(stderr, "usage: %s ", argv[0]); return EXIT_FAILURE; } output = fopen(argv[1], "w"); if (output == NULL) { fprintf(stderr, "could not open %s", argv[1]); return EXIT_FAILURE; } long ibit; Setup(); for (ibit = 0; ibit < 8; ibit++) { if (kcbitMinMoveByDword <= kcbitMaxLenKcdc) { Copy(ibit, fTrue); fprintf(output, " jmp LBlock%d\n", ibit); } Copy(ibit, fFalse); Block(ibit); } End(); return 0; } void Setup(void) { fprintf(output, " // Setup\n" " long cbTot;\n" " byte *pbLimDst = (byte *)pvDst + cbDst;\n\n" "__asm\n" " {\n" " mov edi,pvDst\n" " mov ebx,pvSrc\n" " inc ebx\n"); Advance(4); fprintf(output, " jmp LBlock0\n"); } void Copy(long ibit, bool fDword) { if (fDword) fprintf(output, "\n // Copy Dword %d\nLCopyDword%d:\n", ibit, ibit); else fprintf(output, "\n // Copy Byte %d\nLCopyByte%d:\n", ibit, ibit); fprintf(output, "#ifdef SAFETY\n" " push edx\n" " lea edx,[edi+ecx]\n" " cmp edx,pbLimDst\n" " pop edx\n" " ja LFail\n" "#endif //SAFETY\n"); fprintf(output, " neg esi\n" " add esi,edi\n"); fprintf(output, "#ifdef SAFETY\n" " cmp esi,pvDst\n" " jb LFail\n" "#endif //SAFETY\n"); if (fDword) { fprintf(output, " mov edx,ecx\n" " shr ecx,2\n" " and edx,3\n" " rep movsd\n" " mov ecx,edx\n" " rep movsb\n"); } else fprintf(output, " rep movsb\n"); } void End(void) { fprintf(output, "\nLDone:\n" " sub edi,pvDst\n" " mov cbTot,edi\n" " }\n\n"); } void Advance(long cb) { switch (cb) { case 0: break; case 1: fprintf(output, " mov eax,[ebx-3]\n" " inc ebx\n"); break; case 2: fprintf(output, " mov eax,[ebx-2]\n" " add ebx,2\n"); break; case 3: fprintf(output, " mov eax,[ebx-1]\n" " add ebx,3\n"); break; case 4: fprintf(output, " mov eax,[ebx]\n" " add ebx,4\n"); break; default: fprintf(output, "*** BUG\n"); break; } } void Test(long ibit) { if (ibit < 8) fprintf(output, " test al,%d\n", 1 << ibit); else if (ibit < 16) fprintf(output, " test ah,%d\n", 1 << (ibit - 8)); else fprintf(output, " test eax,%d\n", 1 << ibit); } void Block(long ibit) { fprintf(output, "\n // Block %d\n", ibit); fprintf(output, "LBlock%d:\n", ibit); Test(ibit); fprintf(output, " jz LLiteral%d\n", ibit + 1); Test(ibit + 1); fprintf(output, " jz L%dBit%d\n", kcbitKcdc0, ibit + 2); Test(ibit + 2); fprintf(output, " jz L%dBit%d\n", kcbitKcdc1, ibit + 3); Test(ibit + 3); fprintf(output, " jz L%dBit%d\n", kcbitKcdc2, ibit + 4); fprintf(output, " jmp L%dBit%d\n", kcbitKcdc3, ibit + 4); Literal(ibit + 1); Offset(ibit + 2, kcbitKcdc0, kdibMinKcdc0, 2); Offset(ibit + 3, kcbitKcdc1, kdibMinKcdc1, 2); Offset(ibit + 4, kcbitKcdc2, kdibMinKcdc2, 2); Offset(ibit + 4, kcbitKcdc3, kdibMinKcdc3, 3); } void Literal(long ibit) { fprintf(output, "\n // Literal %d\n", ibit); fprintf(output, "LLiteral%d:\n", ibit); fprintf(output, "#ifdef SAFETY\n" " cmp edi,pbLimDst\n" " jae LFail\n" "#endif //SAFETY\n"); if (ibit == 8) { fprintf(output, " mov [edi],ah\n" " inc edi\n"); } else { fprintf(output, " mov edx,eax\n" " shr edx,%d\n" " mov [edi],dl\n" " inc edi\n", ibit); } ibit += 8; Advance(ibit / 8); fprintf(output, " jmp LBlock%d\n", ibit & 0x07); } void Offset(long ibit, long cbit, long dibBase, long cbBase) { fprintf(output, "\nL%dBit%d:\n", cbit, ibit); fprintf(output, " mov esi,eax\n"); fprintf(output, " mov ecx,%d\n", cbBase); fprintf(output, " shr esi,%d\n", ibit); fprintf(output, " and esi,%d\n", (1 << cbit) - 1); if (kcbitKcdc3 == cbit) { // Put in the test for being done fprintf(output, " cmp esi,%d\n", (1 << cbit) - 1); fprintf(output, " je LDone\n"); } if (1 == dibBase) fprintf(output, " inc esi\n"); else fprintf(output, " add esi,%d\n", dibBase); ibit += cbit; Advance(ibit / 8); ibit &= 0x07; GetLen(ibit, dibBase < sizeof(long)); } void GetLen(long ibit, bool fTestForDword) { static long _cactCall = 0; long cbit; _cactCall++; for (cbit = 0; cbit <= kcbitMaxLenKcdc; cbit++) { Test(ibit + cbit); fprintf(output, " jz LLen%d_%d\n", _cactCall, cbit); } fprintf(output, " jmp LFail\n"); for (cbit = 0; cbit <= kcbitMaxLenKcdc; cbit++) { fprintf(output, "LLen%d_%d:\n", _cactCall, cbit); if (cbit > 0) { fprintf(output, " mov edx,eax\n"); fprintf(output, " shr edx,%d\n", ibit + cbit + 1); fprintf(output, " add ecx,%d\n", (1 << cbit) - 1); fprintf(output, " and edx,%d\n", (1 << cbit) - 1); fprintf(output, " add ecx,edx\n"); } CallCopy(ibit + cbit + cbit + 1, cbit, fTestForDword); } } void CallCopy(long ibit, long cbit, bool fTestForDword) { Advance(ibit / 8); ibit &= 0x07; if (cbit < kcbitMinMoveByDword) fprintf(output, "jmp LCopyByte%d\n", ibit); else { if (fTestForDword) { fprintf(output, " cmp esi,4\n"); fprintf(output, " jb LCopyByte%d\n", ibit); } fprintf(output, " jmp LCopyDword%d\n", ibit); } } ================================================ FILE: kauai/src/keys.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Declarations related to key handling ***************************************************************************/ #ifndef KEYS_H #define KEYS_H #define vkNil 0 #define kvkLeft MacWin(0x1C, VK_LEFT) #define kvkRight MacWin(0x1D, VK_RIGHT) #define kvkUp MacWin(0x1E, VK_UP) #define kvkDown MacWin(0x1F, VK_DOWN) #define kvkHome MacWin(0x01, VK_HOME) #define kvkEnd MacWin(0x04, VK_END) #define kvkPageUp MacWin(0x0B, VK_PRIOR) #define kvkPageDown MacWin(0x0C, VK_NEXT) #define kvkBack MacWin(0x08, VK_BACK) #define kvkDelete MacWin(0x7F, VK_DELETE) #define kvkReturn MacWin(0x0D, VK_RETURN) #endif //! KEYS_H ================================================ FILE: kauai/src/kiddef.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation KidFrame #defines that might get used by a source file for a tool, such as source files for the chunky compiler. This file should only contain #defines, and the values for the #defines should be constant values (no arithmetic). ***************************************************************************/ #ifndef KIDDEF_H #define KIDDEF_H /*************************************************************************** Cursor state constants. bits 0-7 are reserved by Frame. bits 8-15 are reserved by KidFrame. bits 16-31 are reserved for application use. ***************************************************************************/ #define fcustChildGok 256 #define fcustHotText 512 // over hot text in a help topic /*************************************************************************** Standard command handler IDs. Frame reserves values < 10000. KidFrame reserves values >= 10000 and < 20000. Values >= 20000 can be used by the application. ***************************************************************************/ #define khidClokGokGen 10001 // for use by kidspace gobs #define khidClokGokReset 10002 // for use by kidspace gobs - resets on input #define khidLimKidFrame 20000 /*************************************************************************** Chunky file constants. ***************************************************************************/ #define kctgGokd 'GOKD' #define kctgAnimation 'GLSC' #define kctgHelpTopic 'HTOP' #define kctgTile 'TILE' #define kctgEditControl 'EDIT' // help balloon edit control tag #define kctgFill 'FILL' #define kctgVideo 'VIDE' /*************************************************************************** GOK defines ***************************************************************************/ #define kdchidState 0x00010000 // this times the sno is the base chid #define ksnoInit 1 // mouse state CHIDs - offsets from base chid #define kchidOnState 0x0001 // bit indicating on/off state (1 for on) #define kchidMouseState 0x0002 // bit indicating mouse state (1 for down) #define kchidUpOff 0x0000 // 00 #define kchidUpOn 0x0001 // 01 #define kchidDownOff 0x0002 // 10 #define kchidDownOn 0x0003 // 11 // mouse transition CHIDs - offsets from base chid // bit 4 set; bits 2 & 3 are the from state; bits 1 & 0 are the to state // note that 00 - 10 is not allowed #define kchidTransBase 0x0010 // bit set for a transition state #define kchidMaskDst 0x0003 // mask of destination state #define kshSrcTrans 2 // number of bits to shift source state #define kchidEnterState 0x0010 // this is a transitionary chid #define kchidUpOffOn 0x0011 // 00 - 01 (roll on) #define kchidUpOnOff 0x0014 // 01 - 00 (roll off) #define kchidUpDownOn 0x0017 // 01 - 11 (mouse down event - start tracking) #define kchidDownUpOn 0x001D // 11 - 01 (click event - stop tracking) #define kchidDownOnOff 0x001E // 11 - 10 (continue tracking) #define kchidDownOffOn 0x001B // 10 - 11 (continue tracking) #define kchidDownUpOff 0x0018 // 10 - 00 (stop mouse tracking) // script CHIDs - offsets from base chid #define kchidAlarm 0x0102 // types of GOKs that can be created #define gokkNil 0 #define gokkRectangle 1 // all odd gokk's are rectangular #define gokkNoHitThis 2 // this bit means it's invisible to the mouse #define gokkNoHitKids 4 // this bit means its childrean are invis to mouse #define gokkNoHit 6 // means it and its childrean are invis to mouse #define gokkNoSlip 8 // anims for this GOK shouldn't slip (by default) /*************************************************************************** Misc. constants ***************************************************************************/ #define kcnoToolTipNoAffect 0xFFFFFFFE /*************************************************************************** Error codes ***************************************************************************/ /********************************************** 20000 - 29999: KidFrame-issued error codes **********************************************/ // 20000 - 20099: help errors #define ercHelpReadFailed 20000 #define ercHelpSaveFailed 20001 #endif //! KIDDEF_H ================================================ FILE: kauai/src/kidframe.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Standard KidFrame header file. ***************************************************************************/ #ifndef KIDFRAME_H #define KIDFRAME_H #include "frame.h" #include "kiddef.h" // forward declarations typedef class WOKS *PWOKS; typedef class SCEG *PSCEG; typedef class GOK *PGOK; typedef class HBAL *PHBAL; typedef struct HTOP *PHTOP; #include "scrcomg.h" #include "kidworld.h" #include "screxeg.h" #include "kidspace.h" #include "kidhelp.h" #endif //! KIDFRAME_H ================================================ FILE: kauai/src/kidhelp.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Code for implementing help balloons in kidspace. ***************************************************************************/ #include "kidframe.h" ASSERTNAME BEGIN_CMD_MAP(TXHG, TXRG) ON_CID_GEN(cidSelIdle, pvNil, pvNil) ON_CID_ME(cidActivateSel, pvNil, pvNil) END_CMD_MAP_NIL() RTCLASS(TXHD) RTCLASS(TXHG) RTCLASS(HBAL) RTCLASS(HBTN) const achar kchHelpString = '~'; /*************************************************************************** Constructor for a help text document. ***************************************************************************/ TXHD::TXHD(PRCA prca, PDOCB pdocb, ulong grfdoc) : TXHD_PAR(pdocb, grfdoc) { AssertPo(prca, 0); _prca = prca; _prca->AddRef(); _htop.cnoBalloon = cnoNil; _htop.cnoScript = cnoNil; _htop.ckiSnd.ctg = ctgNil; _htop.ckiSnd.cno = cnoNil; } /*************************************************************************** Destructor for a help text document. ***************************************************************************/ TXHD::~TXHD(void) { ReleasePpo(&_prca); } #ifdef DEBUG /*************************************************************************** Assert the validity of a TXHD. ***************************************************************************/ void TXHD::AssertValid(ulong grf) { TXHD_PAR::AssertValid(0); AssertPo(_prca, 0); } /*************************************************************************** Mark memory for the TXHD. ***************************************************************************/ void TXHD::MarkMem(void) { AssertValid(0); TXHD_PAR::MarkMem(); MarkMemObj(_prca); } #endif // DEBUG /*************************************************************************** Static method to read a help text document from the given (pcfl, ctg, cno) and using the given prca as the source for pictures and buttons. ***************************************************************************/ PTXHD TXHD::PtxhdReadChunk(PRCA prca, PCFL pcfl, CTG ctg, CNO cno, PSTRG pstrg, ulong grftxhd) { AssertPo(prca, 0); AssertPo(pcfl, 0); PTXHD ptxhd; if (pvNil == (ptxhd = NewObj TXHD(prca)) || !ptxhd->_FReadChunk(pcfl, ctg, cno, pstrg, grftxhd)) { PushErc(ercHelpReadFailed); ReleasePpo(&ptxhd); } AssertNilOrPo(ptxhd, fobjAssertFull); return ptxhd; } /*************************************************************************** Read the given chunk into this TXRD. ***************************************************************************/ bool TXHD::_FReadChunk(PCFL pcfl, CTG ctg, CNO cno, PSTRG pstrg, ulong grftxhd) { AssertPo(pcfl, 0); AssertNilOrPo(pstrg, 0); BLCK blck; KID kid; HTOPF htopf; long stid, lw; long cp, cpMac, cpMin; STN stn; bool fRet = fFalse; if (pcfl->FForest(ctg, cno)) { CKI cki; if (pvNil == (pcfl = pcfl->PcflReadForest(ctg, cno, fFalse))) goto LFail; if (!pcfl->FGetCkiCtg(ctg, 0, &cki)) goto LFail; cno = cki.cno; } else pcfl->AddRef(); // The old version of HTOP didn't have the ckiSnd - accept both old and new // versions. htopf.htop.ckiSnd.ctg = ctgNil; htopf.htop.ckiSnd.cno = cnoNil; if (!pcfl->FFind(ctg, cno, &blck) || !blck.FUnpackData() || size(HTOPF) != blck.Cb() && offset(HTOPF, htop.ckiSnd) != blck.Cb() || !blck.FRead(&htopf)) { goto LFail; } if (htopf.bo == kboOther) SwapBytesBom(&htopf.htop, kbomHtop); else if (htopf.bo != kboCur) goto LFail; if (!pcfl->FGetKidChidCtg(ctg, cno, 0, kctgRichText, &kid)) goto LFail; if (!TXHD_PAR::_FReadChunk(pcfl, kid.cki.ctg, kid.cki.cno, FPure(grftxhd & ftxhdCopyText))) { goto LFail; } if ((grftxhd & ftxhdExpandStrings) && pvNil != pstrg) { SetInternal(); SuspendUndo(); cpMac = CpMac(); for (cp = 0; cp < cpMac;) { if (_ChFetch(cp) != kchHelpString) { cp++; continue; } cpMin = cp++; for (stid = 0; cp < cpMac && FIn(lw = _ChFetch(cp) - '0', 0, 10); cp++) stid = stid * 10 + lw; if (!pstrg->FGet(stid, &stn)) Warn("string missing"); if (FReplaceRgch(stn.Psz(), stn.Cch(), cpMin, cp - cpMin, fdocNil)) { cp = cpMin + stn.Cch(); cpMac = CpMac(); } } } fRet = fTrue; _htop = htopf.htop; AssertThis(0); LFail: // Release our hold on the CFL ReleasePpo(&pcfl); return fRet; } /*************************************************************************** Do any necessary munging of the AG entry on open. Return false if we don't recognize this argument type. ***************************************************************************/ bool TXHD::_FOpenArg(long icact, byte sprm, short bo, short osk) { CTG ctg; CNO cno; long cb; long rglw[2]; long clw; if (TXHD_PAR::_FOpenArg(icact, sprm, bo, osk)) return fTrue; cb = _pagcact->Cb(icact); switch (sprm) { case sprmGroup: if (cb < size(byte) + size(CNO)) return fFalse; if (bo == kboOther) { _pagcact->GetRgb(icact, size(byte), size(CNO), &cno); SwapBytesRglw(&cno, 1); _pagcact->PutRgb(icact, size(byte), size(CNO), &cno); } break; case sprmObject: if (cb < size(CTG)) return fFalse; _pagcact->GetRgb(icact, 0, size(CTG), &ctg); if (bo == kboOther) { SwapBytesRglw(&ctg, 1); _pagcact->PutRgb(icact, 0, size(CTG), &ctg); } cb -= size(CTG); switch (ctg) { case kctgMbmp: case kctgEditControl: clw = 1; goto LSwapBytes; case kctgGokd: clw = 2; LSwapBytes: AssertIn(clw, 1, CvFromRgv(rglw) + 1); if (cb < clw * size(long)) return fFalse; if (bo == kboOther) { _pagcact->GetRgb(icact, size(CTG), clw * size(long), rglw); SwapBytesRglw(rglw, clw); _pagcact->PutRgb(icact, size(CTG), clw * size(long), rglw); } break; default: return fFalse; } break; default: return fFalse; } return fTrue; } /*************************************************************************** Save a help topic to the given chunky file. Fill in *pcki with where we put the root chunk. ***************************************************************************/ bool TXHD::FSaveToChunk(PCFL pcfl, CKI *pcki, bool fRedirectText) { AssertThis(0); AssertPo(pcfl, 0); AssertVarMem(pcki); BLCK blck; CKI cki; HTOPF htopf; pcki->ctg = kctgHelpTopic; htopf.bo = kboCur; htopf.osk = koskCur; htopf.htop = _htop; if (!pcfl->FAdd(size(HTOPF), pcki->ctg, &pcki->cno, &blck)) { PushErc(ercHelpSaveFailed); return fFalse; } if (!blck.FWrite(&htopf)) goto LFail; if (!TXHD_PAR::FSaveToChunk(pcfl, &cki, fRedirectText)) goto LFail; // add the text chunk and write it if (!pcfl->FAdoptChild(pcki->ctg, pcki->cno, cki.ctg, cki.cno)) { pcfl->Delete(cki.ctg, cki.cno); LFail: pcfl->Delete(pcki->ctg, pcki->cno); PushErc(ercHelpSaveFailed); return fFalse; } return fTrue; } /*************************************************************************** Get the bounding rectangle for the given object. ***************************************************************************/ bool TXHD::_FGetObjectRc(long icact, byte sprm, PGNV pgnv, PCHP pchp, RC *prc) { AssertThis(0); AssertIn(icact, 0, _pagcact->IvMac()); AssertIn(sprm, sprmMinObj, 0x100); AssertPo(pgnv, 0); AssertVarMem(pchp); AssertVarMem(prc); long cb; PMBMP pmbmp; PCRF pcrf; KID kid; long rglw[2]; if (sprmObject != sprm) return fFalse; Assert(size(CTG) == size(long), 0); cb = _pagcact->Cb(icact); if (cb < size(rglw)) return fFalse; _pagcact->GetRgb(icact, 0, size(rglw), rglw); switch ((CTG)rglw[0]) { case kctgMbmp: pmbmp = (PMBMP)_prca->PbacoFetch(rglw[0], rglw[1], MBMP::FReadMbmp); goto LHaveMbmp; case kctgGokd: pcrf = _prca->PcrfFindChunk(rglw[0], rglw[1]); if (pvNil == pcrf) return fFalse; if (!pcrf->Pcfl()->FGetKidChidCtg(rglw[0], rglw[1], 0x10000, kctgMbmp, &kid)) { return fFalse; } pmbmp = (PMBMP)pcrf->PbacoFetch(kid.cki.ctg, kid.cki.cno, MBMP::FReadMbmp); LHaveMbmp: if (pvNil == pmbmp) return fFalse; pmbmp->GetRc(prc); ReleasePpo(&pmbmp); prc->Offset(-prc->xpLeft, -prc->ypBottom); return fTrue; case kctgEditControl: pgnv->SetFont(pchp->onn, pchp->grfont, pchp->dypFont, tahLeft, tavBaseline); pgnv->GetRcFromRgch(prc, pvNil, 0); prc->Inset(0, -1); prc->xpLeft = 0; prc->xpRight = rglw[1]; return fTrue; default: return fFalse; } return fTrue; } /*************************************************************************** Draw the given object. ***************************************************************************/ bool TXHD::_FDrawObject(long icact, byte sprm, PGNV pgnv, long *pxp, long yp, PCHP pchp, RC *prcClip) { AssertIn(icact, 0, _pagcact->IvMac()); Assert(sprm >= sprmObject, 0); AssertPo(pgnv, 0); AssertVarMem(pxp); AssertVarMem(pchp); AssertVarMem(prcClip); long cb; RC rc; PMBMP pmbmp; PCRF pcrf; KID kid; long rglw[2]; bool fDrawMbmp = fTrue; if (sprmObject != sprm) return fFalse; cb = _pagcact->Cb(icact); if (cb < size(rglw)) return fFalse; _pagcact->GetRgb(icact, 0, size(rglw), rglw); switch ((CTG)rglw[0]) { case kctgMbmp: pmbmp = (PMBMP)_prca->PbacoFetch(rglw[0], rglw[1], MBMP::FReadMbmp); goto LHaveMbmp; case kctgGokd: fDrawMbmp = !_fHideButtons; pcrf = _prca->PcrfFindChunk(rglw[0], rglw[1]); if (pvNil == pcrf) return fFalse; if (!pcrf->Pcfl()->FGetKidChidCtg(rglw[0], rglw[1], ChidFromSnoDchid(ksnoInit, 0), kctgMbmp, &kid)) { return fFalse; } pmbmp = (PMBMP)pcrf->PbacoFetch(kid.cki.ctg, kid.cki.cno, MBMP::FReadMbmp); LHaveMbmp: if (pvNil == pmbmp) return fFalse; pmbmp->GetRc(&rc); rc.Offset(*pxp - rc.xpLeft, yp - rc.ypBottom); if (kacrClear != pchp->acrBack) pgnv->FillRc(&rc, pchp->acrBack); if (fDrawMbmp) pgnv->DrawMbmp(pmbmp, &rc); ReleasePpo(&pmbmp); if (pchp->grfont & fontBoxed) { pgnv->SetPenSize(1, 1); pgnv->FrameRcApt(&rc, &vaptGray, pchp->acrFore, kacrClear); } *pxp += rc.Dxp(); return fTrue; case kctgEditControl: pgnv->SetFont(pchp->onn, pchp->grfont, pchp->dypFont, tahLeft, tavBaseline); pgnv->GetRcFromRgch(&rc, pvNil, 0, 0, yp); rc.Inset(0, -1); rc.xpLeft = *pxp; rc.xpRight = rc.xpLeft + rglw[1]; *pxp = rc.xpRight; pgnv->SetPenSize(1, 1); pgnv->FrameRc(&rc, kacrBlack); rc.Inset(1, 1); pgnv->FillRc(&rc, pchp->acrBack); return fTrue; default: return fFalse; } return fTrue; } /*************************************************************************** Insert a picture into the help text document. ***************************************************************************/ bool TXHD::FInsertPicture(CNO cno, void *pvExtra, long cbExtra, long cp, long ccpDel, PCHP pchp, ulong grfdoc) { AssertThis(0); AssertPvCb(pvExtra, cbExtra); AssertIn(cp, 0, CpMac()); AssertIn(ccpDel, 0, CpMac() - cp); AssertNilOrVarMem(pchp); CKI cki; void *pv = &cki; bool fRet = fFalse; cki.ctg = kctgMbmp; cki.cno = cno; if (cbExtra > 0) { if (!FAllocPv(&pv, size(CKI) + cbExtra, fmemNil, mprNormal)) return fFalse; CopyPb(&cki, pv, size(CKI)); CopyPb(pvExtra, PvAddBv(pv, size(CKI)), cbExtra); } fRet = FInsertObject(pv, size(CKI) + cbExtra, cp, ccpDel, pchp, grfdoc); if (pv != &cki) FreePpv(&pv); return fRet; } /*************************************************************************** Insert a new button ***************************************************************************/ bool TXHD::FInsertButton(CNO cno, CNO cnoTopic, void *pvExtra, long cbExtra, long cp, long ccpDel, PCHP pchp, ulong grfdoc) { AssertThis(0); AssertPvCb(pvExtra, cbExtra); AssertIn(cp, 0, CpMac()); AssertIn(ccpDel, 0, CpMac() - cp); AssertNilOrVarMem(pchp); byte rgb[size(CKI) + size(long)]; CKI *pcki = (CKI *)rgb; CNO *pcnoTopic = (CNO *)(pcki + 1); ; void *pv = rgb; bool fRet = fFalse; pcki->ctg = kctgGokd; pcki->cno = cno; *pcnoTopic = cnoTopic; if (cbExtra > 0) { if (!FAllocPv(&pv, size(rgb) + cbExtra, fmemNil, mprNormal)) return fFalse; CopyPb(rgb, pv, size(rgb)); CopyPb(pvExtra, PvAddBv(pv, size(rgb)), cbExtra); } fRet = FInsertObject(pv, size(rgb) + cbExtra, cp, ccpDel, pchp, grfdoc); if (pv != rgb) FreePpv(&pv); return fRet; } /*************************************************************************** Group the given text into the given group. lw == 0 indicates no group. Any non-zero number is a group. ***************************************************************************/ bool TXHD::FGroupText(long cp1, long cp2, byte bGroup, CNO cnoTopic, PSTN pstnTopic) { AssertThis(0); AssertNilOrPo(pstnTopic, 0); AssertIn(cp1, 0, CpMac()); AssertIn(cp2, 0, CpMac()); SPVM spvm; SortLw(&cp1, &cp2); if (cp1 == cp2) return fTrue; if (!FSetUndo(cp1, cp2, cp2 - cp1)) return fFalse; spvm.sprm = sprmGroup; spvm.lwMask = -1; if (bGroup == 0) { // means no grouping spvm.lw = 0; } else { byte rgb[size(byte) + size(CNO) + kcbMaxDataStn]; long cb = size(byte) + size(CNO); rgb[0] = bGroup; CopyPb(&cnoTopic, rgb + size(byte), size(CNO)); if (pvNil != pstnTopic && pstnTopic->Cch() > 0) { pstnTopic->GetData(rgb + cb); cb += pstnTopic->CbData(); } if (!_FEnsureInAg(sprmGroup, rgb, cb, &spvm.lw)) { CancelUndo(); return fFalse; } } if (!_pglmpe->FEnsureSpace(2)) { _ReleaseRgspvm(&spvm, 1); CancelUndo(); return fFalse; } _ApplyRgspvm(cp1, cp2 - cp1, &spvm, 1); CommitUndo(); AssertThis(0); InvalAllDdg(cp1, cp2 - cp1, cp2 - cp1); return fTrue; } /*************************************************************************** Determine if the given cp is in a grouped text range. ***************************************************************************/ bool TXHD::FGrouped(long cp, long *pcpMin, long *pcpLim, byte *pbGroup, CNO *pcnoTopic, PSTN pstnTopic) { AssertThis(0); AssertIn(cp, 0, CpMac()); AssertNilOrVarMem(pcpMin); AssertNilOrVarMem(pcpLim); AssertNilOrVarMem(pbGroup); AssertNilOrVarMem(pcnoTopic); AssertNilOrPo(pstnTopic, 0); MPE mpe; byte bGroup = 0; if (!_FFindMpe(_SpcpFromSprmCp(sprmGroup, cp), &mpe, pcpLim)) { mpe.lw = 0; mpe.spcp = 0; } if (mpe.lw > 0) { byte *prgb; long cb; prgb = (byte *)_pagcact->PvLock(mpe.lw - 1, &cb); cb -= size(byte) + size(CNO); // group number, cnoTopic if (cb < 0) goto LFail; bGroup = prgb[0]; if (bGroup == 0) { LFail: Bug("bad group data"); _pagcact->Unlock(); goto LNotGrouped; } if (pvNil != pcnoTopic) CopyPb(prgb + size(byte), pcnoTopic, size(CNO)); if (pvNil != pstnTopic) { if (cb > 0) pstnTopic->FSetData(prgb + size(byte) + size(CNO), cb); else pstnTopic->SetNil(); } _pagcact->Unlock(); } else { LNotGrouped: if (pvNil != pcnoTopic) *pcnoTopic = cnoNil; if (pvNil != pstnTopic) pstnTopic->SetNil(); } if (pvNil != pbGroup) *pbGroup = bGroup; if (pvNil != pcpMin) *pcpMin = _CpFromSpcp(mpe.spcp); return bGroup != 0; } /*************************************************************************** Get the help topic information. ***************************************************************************/ void TXHD::GetHtop(PHTOP phtop) { AssertThis(0); AssertVarMem(phtop); *phtop = _htop; } /*************************************************************************** Set the topic info. ***************************************************************************/ void TXHD::SetHtop(PHTOP phtop) { AssertThis(0); AssertVarMem(phtop); _htop = *phtop; SetDirty(); } /*************************************************************************** Constructor for a TXHG. ***************************************************************************/ TXHG::TXHG(PWOKS pwoks, PTXHD ptxhd, PGCB pgcb) : TXRG(ptxhd, pgcb) { AssertBaseThis(0); AssertPo(pwoks, 0); _pwoks = pwoks; } /*************************************************************************** Create a new help topic display gob. ***************************************************************************/ PTXHG TXHG::PtxhgNew(PWOKS pwoks, PTXHD ptxhd, PGCB pgcb) { PTXHG ptxhg; if (pvNil == (ptxhg = NewObj TXHG(pwoks, ptxhd, pgcb))) return pvNil; if (!ptxhg->_FInit()) { ReleasePpo(&ptxhg); return pvNil; } return ptxhg; } /*************************************************************************** Inititalize the display gob for a help balloon topic. ***************************************************************************/ bool TXHG::_FInit(void) { AssertBaseThis(0); PRCA prca; long cp, cb; void *pv; CKI *pcki; long dxp; CNO cno; long xp, ypBase; CNO cnoTopic; byte bGroup; long lwMax; RTVN rtvn; long hid; CHP chp; RC rc; EDPAR edpar; STN stn; PTXHD ptxhd = Ptxhd(); if (!TXHG_PAR::_FInit()) return fFalse; // find the max of the group numbers lwMax = 0; for (cp = 0; cp < ptxhd->CpMac();) { ptxhd->FGrouped(cp, pvNil, &cp, &bGroup); lwMax = LwMax((long)bGroup, lwMax); } // find a base hid that covers lwMax buttons _hidBase = 0; if (lwMax > 0) { _hidBase = CMH::HidUnique(lwMax) - 1; stn = PszLit("_gidBase"); rtvn.SetFromStn(&stn); if (!FAssignRtvm(PgobPar()->Ppglrtvm(), &rtvn, _hidBase)) return fFalse; } prca = Ptxhd()->Prca(); for (cp = 0; Ptxhd()->FFetchObject(cp, &cp, &pv, &cb); cp++) { if (pvNil == pv) continue; if (cb < size(CTG)) goto LContinue; switch (*(CTG *)pv) { case kctgEditControl: if (cb < size(ECOS)) goto LContinue; dxp = ((ECOS *)pv)->dxp; FreePpv(&pv); // get the bounding rectangle _GetXpYpFromCp(cp, pvNil, pvNil, &xp, &ypBase, fFalse); _FetchChp(cp, &chp); _pgnv->SetFont(chp.onn, chp.grfont, chp.dypFont, tahLeft, tavBaseline); _pgnv->GetRcFromRgch(&rc, pvNil, 0); rc.Offset(0, ypBase + chp.dypOffset); rc.xpLeft = xp + 1; rc.xpRight = xp + dxp - 1; Ptxhd()->FGrouped(cp, pvNil, pvNil, &bGroup); if (bGroup == 0 || _pwoks->PcmhFromHid(hid = _hidBase + bGroup) != pvNil) { hid = CMH::HidUnique(); } if (chp.acrBack == kacrClear) chp.acrBack = kacrWhite; edpar.Set(hid, this, fgobNil, kginMark, &rc, pvNil, chp.onn, chp.grfont, chp.dypFont, tahLeft, tavTop, chp.acrFore, chp.acrBack); if (pvNil == EDSL::PedslNew(&edpar)) return fFalse; break; case kctgGokd: if (cb < size(CKI) + size(CNO)) goto LContinue; pcki = (CKI *)pv; cno = pcki->cno; cnoTopic = *(CNO *)(pcki + 1); FreePpv(&pv); _GetXpYpFromCp(cp, pvNil, pvNil, &xp, &ypBase, fFalse); _FetchChp(cp, &chp); Ptxhd()->FGrouped(cp, pvNil, pvNil, &bGroup, cnoTopic == cnoNil ? &cnoTopic : pvNil); if (bGroup == 0 || _pwoks->PcmhFromHid(hid = _hidBase + bGroup) != pvNil) { hid = CMH::HidUnique(); } if (pvNil == HBTN::PhbtnNew(_pwoks, this, hid, cno, prca, bGroup, cnoTopic, xp, ypBase + chp.dypOffset)) { return fFalse; } break; default: LContinue: FreePpv(&pv); break; } } AssertThis(0); return fTrue; } /*************************************************************************** Return whether the point is over hot (marked text). ***************************************************************************/ bool TXHG::FPtIn(long xp, long yp) { AssertThis(0); if (!TXHG_PAR::FPtIn(xp, yp)) return fFalse; return FGroupFromPt(xp, yp); } /*************************************************************************** Track the mouse. ***************************************************************************/ bool TXHG::FCmdTrackMouse(PCMD_MOUSE pcmd) { AssertThis(0); AssertVarMem(pcmd); pcmd->grfcust = _pwoks->GrfcustAdjust(pcmd->grfcust); if (pcmd->cid == cidMouseDown) { // first response to mouse down Assert(vpcex->PgobTracking() == pvNil, "mouse already being tracked!"); if (!FGroupFromPt(pcmd->xp, pcmd->yp, &_bTrack, &_cnoTrack)) return fTrue; vpcex->TrackMouse(this); SetCursor(pcmd->grfcust); _grfcust = pcmd->grfcust; } else { Assert(vpcex->PgobTracking() == this, "not tracking mouse!"); Assert(pcmd->cid == cidTrackMouse, 0); if (!(pcmd->grfcust & fcustMouse)) { byte bGroup; CNO cnoTopic; vpcex->EndMouseTracking(); if (FGroupFromPt(pcmd->xp, pcmd->yp, &bGroup, &cnoTopic) && bGroup == _bTrack && cnoTopic == _cnoTrack) { DoHit(bGroup, cnoTopic, _grfcust, hidNil); } } } return fTrue; } /*************************************************************************** An edit control got a bad key. ***************************************************************************/ bool TXHG::FCmdBadKey(PCMD_BADKEY pcmd) { AssertThis(0); AssertVarMem(pcmd); if (!FIn(pcmd->hid, _hidBase + 1, _hidBase + 257)) return fFalse; pcmd->grfcust = _pwoks->GrfcustAdjust(pcmd->grfcust); _FRunScript((byte)(pcmd->hid - _hidBase), pcmd->grfcust, pcmd->hid, (achar)pcmd->ch); return fTrue; } /*************************************************************************** Return the number of the group text that the given point is in. ***************************************************************************/ bool TXHG::FGroupFromPt(long xp, long yp, byte *pbGroup, CNO *pcnoTopic) { AssertThis(0); AssertNilOrVarMem(pbGroup); AssertNilOrVarMem(pcnoTopic); long cp; if (!_FGetCpFromPt(xp, yp, &cp, fFalse)) return 0; return Ptxhd()->FGrouped(cp, pvNil, pvNil, pbGroup, pcnoTopic); } /*************************************************************************** A child button was hit, take action. ***************************************************************************/ void TXHG::DoHit(byte bGroup, CNO cnoTopic, ulong grfcust, long hidHit) { AssertThis(0); long lwRet = 0; // run the script if (!_FRunScript(bGroup, grfcust, hidHit, chNil, cnoTopic, &lwRet)) return; if (cnoNil != cnoTopic && !lwRet) _pwoks->PhbalNew(PgobPar()->PgobPar(), Ptxhd()->Prca(), cnoTopic); } /*************************************************************************** Run the script. Returns false iff the TXHG doesn't exist after running the script. ***************************************************************************/ bool TXHG::_FRunScript(byte bGroup, ulong grfcust, long hidHit, achar ch, CNO cnoTopic, long *plwRet) { AssertThis(0); AssertNilOrVarMem(plwRet); PSCPT pscpt; PSCEG psceg; HTOP htop; bool fRet = fTrue; PTXHD ptxhd = Ptxhd(); PRCA prca = ptxhd->Prca(); if (pvNil != plwRet) *plwRet = 0; ptxhd->GetHtop(&htop); if (cnoNil == htop.cnoScript) return fTrue; pscpt = (PSCPT)prca->PbacoFetch(kctgScript, htop.cnoScript, SCPT::FReadScript); if (pvNil != pscpt && pvNil != (psceg = _pwoks->PscegNew(prca, this))) { AssertPo(pscpt, 0); AssertPo(psceg, 0); PWOKS pwoks = _pwoks; long grid = Grid(); long rglw[5]; rglw[0] = (long)bGroup; rglw[1] = grfcust; rglw[2] = hidHit; rglw[3] = (long)(byte)ch; rglw[4] = cnoTopic; // be careful not to use TXHG variables here in case the TXHG is // freed while the script is running. if (!psceg->FRunScript(pscpt, rglw, 5, plwRet) && pvNil != plwRet) *plwRet = 0; ReleasePpo(&psceg); fRet = (this == pwoks->PgobFromGrid(grid)); } ReleasePpo(&pscpt); return fRet; } /*************************************************************************** This handles cidMouseMove. ***************************************************************************/ bool TXHG::FCmdMouseMove(PCMD_MOUSE pcmd) { AssertThis(0); AssertVarMem(pcmd); ulong grfcust = _pwoks->GrfcustAdjust(pcmd->grfcust); if (FGroupFromPt(pcmd->xp, pcmd->yp)) grfcust |= fcustHotText; SetCursor(grfcust); return fTrue; } /*************************************************************************** Set the cursor for this TXHG and the given cursor state. ***************************************************************************/ void TXHG::SetCursor(ulong grfcust) { AssertThis(0); PGOB pgob; for (pgob = this;;) { pgob = pgob->PgobPar(); if (pvNil == pgob) { vpappb->SetCurs(pvNil); break; } if (pgob->FIs(kclsGOK)) { ((PGOK)pgob)->SetCursor(grfcust | fcustChildGok); break; } } } /*************************************************************************** Create a new help topic balloon based on the given topic number. ***************************************************************************/ PHBAL HBAL::PhbalCreate(PWOKS pwoks, PGOB pgobPar, PRCA prca, CNO cnoTopic, PHTOP phtop) { AssertPo(pwoks, 0); AssertPo(pgobPar, 0); AssertPo(prca, 0); AssertNilOrVarMem(phtop); PCRF pcrf; PTXHD ptxhd; PHBAL phbal; pcrf = prca->PcrfFindChunk(kctgHelpTopic, cnoTopic); if (pvNil == pcrf) return pvNil; ptxhd = TXHD::PtxhdReadChunk(prca, pcrf->Pcfl(), kctgHelpTopic, cnoTopic, pwoks->Pstrg()); if (pvNil == ptxhd) return pvNil; ptxhd->HideButtons(); phbal = PhbalNew(pwoks, pgobPar, prca, ptxhd, phtop); ReleasePpo(&ptxhd); return phbal; } /*************************************************************************** Static method to create a new help balloon based on the given help topic document and htop. ***************************************************************************/ PHBAL HBAL::PhbalNew(PWOKS pwoks, PGOB pgobPar, PRCA prca, PTXHD ptxhd, PHTOP phtop) { AssertPo(pwoks, 0); AssertPo(pgobPar, 0); AssertPo(ptxhd, 0); AssertPo(prca, 0); AssertNilOrVarMem(phtop); HTOP htop; GCB gcb; PHBAL phbal; long grid; ptxhd->GetHtop(&htop); if (pvNil != phtop) { // merge the given htop with the topic's htop. if (cnoNil != phtop->cnoBalloon) htop.cnoBalloon = phtop->cnoBalloon; if (hidNil != phtop->hidThis) htop.hidThis = phtop->hidThis; if (hidNil != phtop->hidTarget) htop.hidTarget = phtop->hidTarget; if (cnoNil != phtop->cnoScript) htop.cnoScript = phtop->cnoScript; htop.dxp += phtop->dxp; htop.dyp += phtop->dyp; if (cnoNil != phtop->ckiSnd.cno && ctgNil != phtop->ckiSnd.ctg) htop.ckiSnd = phtop->ckiSnd; } if (htop.hidThis == hidNil) htop.hidThis = CMH::HidUnique(); else if (pvNil != (phbal = (PHBAL)pwoks->PcmhFromHid(htop.hidThis))) { if (!phbal->FIs(kclsHBAL)) { Bug("command handler with this ID already exists"); return pvNil; } AssertPo(phbal, 0); #ifdef REVIEW // shonk: this makes little sense and is bug-prone if (htop.cnoBalloon == phbal->_pgokd->Cno() && prca == phbal->_prca) { // same hid, same GOKD, same prca, so just change the topic if (!phbal->FSetTopic(ptxhd, &htop, prca)) return pvNil; return phbal; } #endif // REVIEW // free the balloon and create the new one. ReleasePpo(&phbal); } gcb.Set(htop.hidThis, pgobPar, fgobNil, kginMark); if (pvNil == (phbal = NewObj HBAL(&gcb))) return pvNil; grid = phbal->Grid(); if (!phbal->_FInit(pwoks, ptxhd, &htop, prca)) { ReleasePpo(&phbal); return pvNil; } if (!phbal->_FEnterState(ksnoInit)) { Warn("HBAL immediately destroyed!"); return pvNil; } // initialize the topic phbal->_ptxhg->DoHit(0, cnoNil, fcustNil, hidNil); if (phbal != pwoks->PgobFromGrid(grid)) { Warn("HBAL immediately destroyed 2!"); return pvNil; } AssertPo(phbal, 0); return phbal; } /*************************************************************************** Constructor for a help balloon. ***************************************************************************/ HBAL::HBAL(GCB *pgcb) : HBAL_PAR(pgcb) { } /*************************************************************************** Initialize the help balloon. ***************************************************************************/ bool HBAL::_FInit(PWOKS pwoks, PTXHD ptxhd, HTOP *phtop, PRCA prca) { AssertBaseThis(0); AssertPo(ptxhd, 0); AssertVarMem(phtop); AssertPo(prca, 0); if (!HBAL_PAR::_FInit(pwoks, phtop->cnoBalloon, prca)) return fFalse; return _FSetTopic(ptxhd, phtop, prca); } /*************************************************************************** Set the topic for this balloon. Returns false if setting the topic fails or if the balloon is instantly killed by a script. ***************************************************************************/ bool HBAL::FSetTopic(PTXHD ptxhd, PHTOP phtop, PRCA prca) { AssertThis(0); AssertPo(ptxhd, 0); AssertVarMem(phtop); AssertPo(prca, 0); if (!_FSetTopic(ptxhd, phtop, prca)) return fFalse; return _FEnterState(ksnoInit); } /*************************************************************************** Set the topic in the help balloon. Don't enter the initial state. ***************************************************************************/ bool HBAL::_FSetTopic(PTXHD ptxhd, PHTOP phtop, PRCA prca) { AssertBaseThis(0); AssertPo(ptxhd, 0); AssertVarMem(phtop); AssertPo(prca, 0); PGOB pgob; GCB gcb; PT pt, ptReg; STN stn; RTVN rtvn; PTXHG ptxhgSave = _ptxhg; // create the topic DDG. gcb.Set(CMH::HidUnique(), this, fgobNil, kginMark); if (pvNil == (_ptxhg = TXHG::PtxhgNew(_pwoks, ptxhd, &gcb))) goto LFail; // set the sound variables stn = PszLit("_ctgSound"); rtvn.SetFromStn(&stn); if (!FAssignRtvm(_ptxhg->Ppglrtvm(), &rtvn, phtop->ckiSnd.ctg)) goto LFail; stn = PszLit("_cnoSound"); rtvn.SetFromStn(&stn); if (!FAssignRtvm(_ptxhg->Ppglrtvm(), &rtvn, phtop->ckiSnd.cno)) { LFail: ReleasePpo(&_ptxhg); // restore the previous topic DDG _ptxhg = ptxhgSave; return fFalse; } ReleasePpo(&ptxhgSave); _ptxhg->GetNaturalSize(&_dxpPref, &_dypPref); if (hidNil == phtop->hidTarget || pvNil == (pgob = _pwoks->PgobFromHid(phtop->hidTarget))) { pgob = PgobPar(); } if (pgob->FIs(kclsGOK)) ((PGOK)pgob)->GetPtReg(&pt); else { RC rc; pgob->GetRc(&rc, cooParent); pt.xp = rc.XpCenter(); pt.yp = rc.YpCenter(); } pgob->MapPt(&pt, cooParent, cooGlobal); // point the balloon at the gob PgobPar()->MapPt(&pt, cooGlobal, cooLocal); GetPtReg(&ptReg); _SetGorp(_pgorp, pt.xp - ptReg.xp + phtop->dxp, pt.yp - ptReg.yp + phtop->dyp); return fTrue; } /*************************************************************************** Our representation is changing, so make sure we stay inside our parent and reposition the TXHG. ***************************************************************************/ void HBAL::_SetGorp(PGORP pgorp, long dxp, long dyp) { RC rc1, rc2, rc3; HBAL_PAR::_SetGorp(pgorp, dxp, dyp); // make sure we stay inside our parent GetRc(&rc1, cooParent); PgobPar()->GetRc(&rc2, cooLocal); rc3.FIntersect(&rc1, &rc2); if (rc3 != rc1) { rc1.PinToRc(&rc2); SetPos(&rc1); } // position the TXHG. GetRcContent(&rc1); rc2.Set(0, 0, _dxpPref, _dypPref); rc2.CenterOnRc(&rc1); _ptxhg->SetPos(&rc2); } /*************************************************************************** Constructor for a help balloon button. ***************************************************************************/ HBTN::HBTN(GCB *pgcb) : HBTN_PAR(pgcb) { } /*************************************************************************** Create a new help balloon button ***************************************************************************/ PHBTN HBTN::PhbtnNew(PWOKS pwoks, PGOB pgobPar, long hid, CNO cno, PRCA prca, byte bGroup, CNO cnoTopic, long xpLeft, long ypBottom) { AssertPo(pwoks, 0); AssertNilOrPo(pgobPar, 0); Assert(hid != hidNil, "nil ID"); AssertPo(prca, 0); GCB gcb; PHBTN phbtn; RC rcAbs; if (pvNil != pwoks->PcmhFromHid(hid)) { Bug("command handler with this ID already exists"); return pvNil; } gcb.Set(hid, pgobPar, fgobNil, kginMark); if (pvNil == (phbtn = NewObj HBTN(&gcb))) return pvNil; phbtn->_bGroup = bGroup; phbtn->_cnoTopic = cnoTopic; if (!phbtn->_FInit(pwoks, cno, prca)) { ReleasePpo(&phbtn); return pvNil; } if (!phbtn->_FEnterState(ksnoInit)) { Warn("GOK immediately destroyed!"); return pvNil; } phbtn->GetRc(&rcAbs, cooParent); rcAbs.Offset(xpLeft - rcAbs.xpLeft, ypBottom - rcAbs.ypBottom); phbtn->SetPos(&rcAbs, pvNil); AssertPo(phbtn, 0); return phbtn; } /*************************************************************************** Test whether the given point is in this button or its related text. ***************************************************************************/ bool HBTN::FPtIn(long xp, long yp) { AssertThis(0); PTXHG ptxhg; PT pt(xp, yp); byte bGroup; CNO cnoTopic; if (HBTN_PAR::FPtIn(xp, yp)) return fTrue; if (_bGroup == 0 || !PgobPar()->FIs(kclsTXHG)) return fFalse; ptxhg = (PTXHG)PgobPar(); MapPt(&pt, cooLocal, cooParent); if (!ptxhg->FGroupFromPt(pt.xp, pt.yp, &bGroup, &cnoTopic)) return fFalse; return bGroup == _bGroup && cnoTopic == _cnoTopic; } /*************************************************************************** The button has been clicked on. Tell the TXHG to do its thing. ***************************************************************************/ bool HBTN::FCmdClicked(PCMD_MOUSE pcmd) { AssertThis(0); AssertVarMem(pcmd); PTXHG ptxhg; long hid = Hid(); if (!PgobPar()->FIs(kclsTXHG)) { Bug("why isn't my parent a TXHG?"); return fTrue; } ptxhg = (PTXHG)PgobPar(); ptxhg->DoHit(_bGroup, _cnoTopic, pcmd->grfcust, hid); return fTrue; } ================================================ FILE: kauai/src/kidhelp.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Code for implementing help balloons in kidspace. ***************************************************************************/ #ifndef KIDHELP_H #define KIDHELP_H /*************************************************************************** Help topic construction information. ***************************************************************************/ struct HTOP { CNO cnoBalloon; long hidThis; long hidTarget; CNO cnoScript; long dxp; long dyp; CKI ckiSnd; }; typedef HTOP *PHTOP; const BOM kbomHtop = 0xFFF00000; // help topic on file struct HTOPF { short bo; short osk; HTOP htop; }; // edit control object struct ECOS { CTG ctg; // kctgEditControl long dxp; // width }; /*************************************************************************** Help text document ***************************************************************************/ enum { ftxhdNil = 0, ftxhdCopyText = 1, ftxhdExpandStrings = 2, }; typedef class TXHD *PTXHD; #define TXHD_PAR TXRD #define kclsTXHD 'TXHD' class TXHD : public TXHD_PAR { RTCLASS_DEC ASSERT MARKMEM protected: enum { sprmGroup = 64, // grouped (hot) text - uses the AG }; PRCA _prca; // source of pictures and buttons HTOP _htop; // our gob creation information bool _fHideButtons; // whether to draw buttons TXHD(PRCA prca, PDOCB pdocb = pvNil, ulong grfdoc = fdocNil); ~TXHD(void); virtual bool _FReadChunk(PCFL pcfl, CTG ctg, CNO cno, PSTRG pstrg = pvNil, ulong grftxhd = ftxhdNil); virtual bool _FOpenArg(long icact, byte sprm, short bo, short osk); virtual bool _FGetObjectRc(long icact, byte sprm, PGNV pgnv, PCHP pchp, RC *prc); virtual bool _FDrawObject(long icact, byte sprm, PGNV pgnv, long *pxp, long yp, PCHP pchp, RC *prcClip); public: static PTXHD PtxhdReadChunk(PRCA prca, PCFL pcfl, CTG ctg, CNO cno, PSTRG pstrg = pvNil, ulong grftxhd = ftxhdExpandStrings); virtual bool FSaveToChunk(PCFL pcfl, CKI *pcki, bool fRedirectText = fFalse); bool FInsertPicture(CNO cno, void *pvExtra, long cbExtra, long cp, long ccpDel, PCHP pchp = pvNil, ulong grfdoc = fdocUpdate); bool FInsertButton(CNO cno, CNO cnoTopic, void *pvExtra, long cbExtra, long cp, long ccpDel, PCHP pchp = pvNil, ulong grfdoc = fdocUpdate); PRCA Prca(void) { return _prca; } bool FGroupText(long cp1, long cp2, byte bGroup, CNO cnoTopic = cnoNil, PSTN pstnTopic = pvNil); bool FGrouped(long cp, long *pcpMin = pvNil, long *pcpLim = pvNil, byte *pbGroup = pvNil, CNO *pcnoTopic = pvNil, PSTN pstnTopic = pvNil); void GetHtop(PHTOP phtop); void SetHtop(PHTOP phtop); void HideButtons(bool fHide = fTrue) { _fHideButtons = FPure(fHide); } }; /*************************************************************************** A runtime DDG for a help topic. ***************************************************************************/ typedef class TXHG *PTXHG; #define TXHG_PAR TXRG #define kclsTXHG 'TXHG' class TXHG : public TXHG_PAR { RTCLASS_DEC CMD_MAP_DEC(TXHG) protected: byte _bTrack; CNO _cnoTrack; long _hidBase; ulong _grfcust; PWOKS _pwoks; TXHG(PWOKS pwoks, PTXHD ptxhd, PGCB pgcb); virtual bool _FInit(void); virtual bool _FRunScript(byte bGroup, ulong grfcust, long hidHit, achar ch, CNO cnoTopic = cnoNil, long *plwRet = pvNil); public: static PTXHG PtxhgNew(PWOKS pwoks, PTXHD ptxhd, PGCB pgcb); PTXHD Ptxhd(void) { return (PTXHD)_ptxtb; } virtual bool FPtIn(long xp, long yp); virtual bool FCmdTrackMouse(PCMD_MOUSE pcmd); virtual bool FCmdMouseMove(PCMD_MOUSE pcmd); virtual bool FCmdBadKey(PCMD_BADKEY pcmd); virtual bool FGroupFromPt(long xp, long yp, byte *pbGroup = pvNil, CNO *pcnoTopic = pvNil); virtual void DoHit(byte bGroup, CNO cnoTopic, ulong grfcust, long hidHit); virtual void SetCursor(ulong grfcust); }; /*************************************************************************** Help balloon. ***************************************************************************/ typedef class HBAL *PHBAL; #define HBAL_PAR GOK #define kclsHBAL 'HBAL' class HBAL : public HBAL_PAR { RTCLASS_DEC protected: PTXHG _ptxhg; HBAL(GCB *pgcb); virtual void _SetGorp(PGORP pgorp, long dxp, long dyp); virtual bool _FInit(PWOKS pwoks, PTXHD ptxhd, HTOP *phtop, PRCA prca); virtual bool _FSetTopic(PTXHD ptxhd, PHTOP phtop, PRCA prca); public: static PHBAL PhbalCreate(PWOKS pwoks, PGOB pgobPar, PRCA prca, CNO cnoTopic, PHTOP phtop = pvNil); static PHBAL PhbalNew(PWOKS pwoks, PGOB pgobPar, PRCA prca, PTXHD ptxhd, PHTOP phtop = pvNil); virtual bool FSetTopic(PTXHD ptxhd, PHTOP phtop, PRCA prca); }; /*************************************************************************** Help balloon button. ***************************************************************************/ typedef class HBTN *PHBTN; #define HBTN_PAR GOK #define kclsHBTN 'HBTN' class HBTN : public HBTN_PAR { RTCLASS_DEC protected: HBTN(GCB *pgcb); byte _bGroup; CNO _cnoTopic; public: static PHBTN PhbtnNew(PWOKS pwoks, PGOB pgobPar, long hid, CNO cno, PRCA prca, byte bGroup, CNO cnoTopic, long xpLeft, long ypBottom); virtual bool FPtIn(long xp, long yp); virtual bool FCmdClicked(PCMD_MOUSE pcmd); }; #endif //! KIDHELP_H ================================================ FILE: kauai/src/kidspace.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Kidspace class implementations. ***************************************************************************/ #include "kidframe.h" ASSERTNAME RTCLASS(GOK) RTCLASS(GORP) RTCLASS(GORF) RTCLASS(GORB) RTCLASS(GORT) RTCLASS(GORV) BEGIN_CMD_MAP(GOK, GOB) ON_CID_ME(cidClicked, &GOK::FCmdClickedCore, pvNil) ON_CID_ME(cidAlarm, &GOK::FCmdAlarm, pvNil) ON_CID_ME(cidRollOff, &GOK::FCmdMouseMoveCore, pvNil) ON_CID_ALL(cidKey, &GOK::FCmdAll, pvNil) ON_CID_ALL(cidSelIdle, &GOK::FCmdAll, pvNil) END_CMD_MAP(&GOK::FCmdAll, pvNil, kgrfcmmAll) const long kcmhlGok = -10000; /*************************************************************************** Create a new kidspace gob as described in the GOKD with given cno in the given RCA. ***************************************************************************/ PGOK GOK::PgokNew(PWOKS pwoks, PGOB pgobPar, long hid, PGOKD pgokd, PRCA prca) { AssertPo(pgobPar, 0); AssertPo(pgokd, 0); AssertPo(prca, 0); GCB gcb; PGOK pgok; if (hidNil == hid) { Bug("nil handler id"); return pvNil; } gcb.Set(hid, pgobPar, fgobNil, kginMark); if (pvNil == (pgok = NewObj GOK(&gcb))) return pvNil; if (!pgok->_FInit(pwoks, pgokd, prca)) { ReleasePpo(&pgok); return pvNil; } if (!pgok->_FEnterState(ksnoInit)) { Warn("GOK immediately destroyed!"); return pvNil; } AssertPo(pgok, 0); return pgok; } /*************************************************************************** Static method to find the GOB that should be before a new GOK with this zp. ***************************************************************************/ PGOB GOK::_PgobBefore(PGOB pgobPar, long zp) { AssertPo(pgobPar, 0); PGOB pgobBefore, pgobT; // find the place in the GOB tree to put the GOK. for (pgobBefore = pvNil, pgobT = pgobPar->PgobFirstChild(); pgobT != pvNil; pgobT = pgobT->PgobNextSib()) { if (pgobT->FIs(kclsGOK)) { if (((PGOK)pgobT)->_zp <= zp) break; pgobBefore = pgobT; } } return pgobBefore; } /*************************************************************************** Constructor for the Kidspace graphic object. ***************************************************************************/ GOK::GOK(GCB *pgcb) : GOB(pgcb) { _chidAnim = chidNil; _siiSound = siiNil; _siiMouse = siiNil; _hidToolTipSrc = Hid(); _gmsCur = gmsNil; } /*************************************************************************** Destructor for a GOK. ***************************************************************************/ GOK::~GOK(void) { if (vpsndm != pvNil) { if (siiNil != _siiSound) vpsndm->Stop(_siiSound); if (siiNil != _siiMouse) vpsndm->Stop(_siiMouse); } if (_fStream) { if (pvNil != _pgokd) _pgokd->SetCrep(crepToss); } ReleasePpo(&_pgokd); ReleasePpo(&_pcrf); ReleasePpo(&_prca); ReleasePpo(&_pscegAnim); ReleasePpo(&_pgorp); ReleasePpo(&_pglcmflt); } /*************************************************************************** Initialize this GOK given the cno for the gokd. ***************************************************************************/ bool GOK::_FInit(PWOKS pwoks, CNO cno, PRCA prca) { AssertBaseThis(0); AssertPo(pwoks, 0); AssertPo(prca, 0); PGOKD pgokd; bool fRet; if (pvNil == (pgokd = pwoks->PgokdFetch(kctgGokd, cno, prca))) return fFalse; fRet = _FInit(pwoks, pgokd, prca); ReleasePpo(&pgokd); return fRet; } /*************************************************************************** Initialize this GOK. ***************************************************************************/ bool GOK::_FInit(PWOKS pwoks, PGOKD pgokd, PRCA prca) { AssertBaseThis(0); AssertPo(pwoks, 0); AssertPo(pgokd, 0); AssertPo(prca, 0); LOP lop; _pwoks = pwoks; _pgokd = pgokd; _pgokd->AddRef(); _pgokd->GetLop(PgobPar()->Hid(), &lop); _dxp = lop.xp; _dyp = lop.yp; _zp = klwMax; _fRect = FPure(pgokd->Gokk() & gokkRectangle); _fNoHit = FPure(pgokd->Gokk() & gokkNoHitThis); _fNoHitKids = FPure(pgokd->Gokk() & gokkNoHitKids); _fNoSlip = FPure(pgokd->Gokk() & gokkNoSlip); _prca = prca; _prca->AddRef(); _pcrf = pgokd->Pcrf(); _pcrf->AddRef(); AssertThis(0); SetZPlane(lop.zp); return fTrue; } /*************************************************************************** This is a table of what relative chid value to use for the representation in the given mouse tracking state. relative means that the actual chid is gotten by putting the current gob state number in the high word. ***************************************************************************/ const CHID _mpgmschidRep[] = { chidNil, kchidEnterState, kchidUpOff, kchidUpOffOn, kchidUpOnOff, kchidUpOn, kchidDownUpOff, kchidUpDownOn, kchidDownUpOn, kchidDownOn, kchidDownOnOff, kchidDownOffOn, kchidDownOff, chidNil, }; /*************************************************************************** Return the chid value for the current mouse tracking state. ***************************************************************************/ CHID GOK::_ChidMouse(void) { AssertThisMem(); CHID chid; chid = _mpgmschidRep[_gmsCur]; if (chidNil != chid) chid = ChidFromSnoDchid(_sno, chid); return chid; } /*************************************************************************** These are the actions that can occur at transitions between mouse tracking states. ***************************************************************************/ enum { factNil = 0x0, factEnqueueClick = 0x1, }; /*************************************************************************** The following are the transition tables between the mouse tracking states when given various input. ***************************************************************************/ struct GMSE { Debug(long gms;) long gmsDst; ulong grfact; }; #ifdef DEBUG #define _Gmse(gms, gmsDst, grfact) \ { \ gms, gmsDst, grfact \ } #else //! DEBUG #define _Gmse(gms, gmsDst, grfact) \ { \ gmsDst, grfact \ } #endif //! DEBUG /*************************************************************************** what to do when an animation ends ***************************************************************************/ GMSE _mpgmsgmseEnd[] = { _Gmse(gmsNil, kgmsEnterState, factNil), _Gmse(kgmsEnterState, kgmsIdle, factNil), _Gmse(kgmsIdle, kgmsIdle, factNil), _Gmse(kgmsRollOn, kgmsOn, factNil), _Gmse(kgmsRollOff, kgmsIdle, factNil), _Gmse(kgmsOn, kgmsOn, factNil), _Gmse(kgmsReleaseOff, kgmsIdle, factNil), _Gmse(kgmsPressOn, kgmsDownOn, factNil), _Gmse(kgmsReleaseOn, kgmsWait, factEnqueueClick), _Gmse(kgmsDownOn, kgmsDownOn, factNil), _Gmse(kgmsDragOff, kgmsDownOff, factNil), _Gmse(kgmsDragOn, kgmsDownOn, factNil), _Gmse(kgmsDownOff, kgmsDownOff, factNil), _Gmse(kgmsWait, kgmsWait, factNil), }; /*************************************************************************** what to do when we get a cidMouseMove ***************************************************************************/ GMSE _mpgmsgmseMove[] = { _Gmse(gmsNil, gmsNil, factNil), _Gmse(kgmsEnterState, kgmsIdle, factNil), _Gmse(kgmsIdle, kgmsRollOn, factNil), _Gmse(kgmsRollOn, kgmsRollOn, factNil), _Gmse(kgmsRollOff, kgmsIdle, factNil), _Gmse(kgmsOn, kgmsOn, factNil), _Gmse(kgmsReleaseOff, kgmsIdle, factNil), // shouldn't get a cidMouseMove when tracking the mouse, // so all of these cause asserts _Gmse(kgmsPressOn, gmsNil, factNil), _Gmse(kgmsReleaseOn, gmsNil, factNil), _Gmse(kgmsDownOn, gmsNil, factNil), _Gmse(kgmsDragOff, gmsNil, factNil), _Gmse(kgmsDragOn, gmsNil, factNil), _Gmse(kgmsDownOff, gmsNil, factNil), _Gmse(kgmsWait, gmsNil, factNil), }; /*************************************************************************** what to do when we get a cidRollOff ***************************************************************************/ GMSE _mpgmsgmseRollOff[] = { _Gmse(gmsNil, gmsNil, factNil), _Gmse(kgmsEnterState, kgmsEnterState, factNil), _Gmse(kgmsIdle, kgmsIdle, factNil), _Gmse(kgmsRollOn, kgmsOn, factNil), _Gmse(kgmsRollOff, kgmsRollOff, factNil), _Gmse(kgmsOn, kgmsRollOff, factNil), _Gmse(kgmsReleaseOff, kgmsReleaseOff, factNil), // shouldn't get a cidRollOff when tracking the mouse, // so all of these cause asserts _Gmse(kgmsPressOn, gmsNil, factNil), _Gmse(kgmsReleaseOn, gmsNil, factNil), _Gmse(kgmsDownOn, gmsNil, factNil), _Gmse(kgmsDragOff, gmsNil, factNil), _Gmse(kgmsDragOn, gmsNil, factNil), _Gmse(kgmsDownOff, gmsNil, factNil), // This one can happen if a modal comes up in response to our click _Gmse(kgmsWait, kgmsOn, factNil), }; /*************************************************************************** what to do when we get a cidMouseDown ***************************************************************************/ GMSE _mpgmsgmseMouseDown[] = { _Gmse(gmsNil, gmsNil, factNil), _Gmse(kgmsEnterState, kgmsIdle, factNil), _Gmse(kgmsIdle, kgmsRollOn, factNil), _Gmse(kgmsRollOn, kgmsOn, factNil), _Gmse(kgmsRollOff, kgmsIdle, factNil), _Gmse(kgmsOn, kgmsPressOn, factNil), _Gmse(kgmsReleaseOff, kgmsIdle, factNil), // shouldn't get a cidMouseDown when tracking the mouse, // so all of these cause asserts _Gmse(kgmsPressOn, gmsNil, factNil), _Gmse(kgmsReleaseOn, gmsNil, factNil), _Gmse(kgmsDownOn, gmsNil, factNil), _Gmse(kgmsDragOff, gmsNil, factNil), _Gmse(kgmsDragOn, gmsNil, factNil), _Gmse(kgmsDownOff, gmsNil, factNil), _Gmse(kgmsWait, gmsNil, factNil), }; /*************************************************************************** what to do when we get a cidTrackMouse with button down and mouse on ***************************************************************************/ GMSE _mpgmsgmseDownOn[] = { _Gmse(gmsNil, gmsNil, factNil), // shouldn't get a cidTrackMouse when not tracking the mouse, // so all of these cause asserts _Gmse(kgmsEnterState, gmsNil, factNil), _Gmse(kgmsIdle, gmsNil, factNil), _Gmse(kgmsRollOn, gmsNil, factNil), _Gmse(kgmsRollOff, gmsNil, factNil), _Gmse(kgmsOn, gmsNil, factNil), _Gmse(kgmsReleaseOff, gmsNil, factNil), _Gmse(kgmsPressOn, kgmsPressOn, factNil), _Gmse(kgmsReleaseOn, kgmsReleaseOn, factNil), _Gmse(kgmsDownOn, kgmsDownOn, factNil), _Gmse(kgmsDragOff, kgmsDownOff, factNil), _Gmse(kgmsDragOn, kgmsDragOn, factNil), _Gmse(kgmsDownOff, kgmsDragOn, factNil), _Gmse(kgmsWait, kgmsOn, factNil), }; /*************************************************************************** what to do when we get a cidTrackMouse with button down and mouse off ***************************************************************************/ GMSE _mpgmsgmseDownOff[] = { _Gmse(gmsNil, gmsNil, factNil), // shouldn't get a cidTrackMouse when not tracking the mouse, // so all of these cause asserts _Gmse(kgmsEnterState, gmsNil, factNil), _Gmse(kgmsIdle, gmsNil, factNil), _Gmse(kgmsRollOn, gmsNil, factNil), _Gmse(kgmsRollOff, gmsNil, factNil), _Gmse(kgmsOn, gmsNil, factNil), _Gmse(kgmsReleaseOff, gmsNil, factNil), _Gmse(kgmsPressOn, kgmsDownOn, factNil), _Gmse(kgmsReleaseOn, kgmsReleaseOn, factNil), _Gmse(kgmsDownOn, kgmsDragOff, factNil), _Gmse(kgmsDragOff, kgmsDragOff, factNil), _Gmse(kgmsDragOn, kgmsDownOn, factNil), _Gmse(kgmsDownOff, kgmsDownOff, factNil), _Gmse(kgmsWait, kgmsOn, factNil), }; /*************************************************************************** what to do when we get a cidTrackMouse with button up and mouse on ***************************************************************************/ GMSE _mpgmsgmseUpOn[] = { _Gmse(gmsNil, gmsNil, factNil), // shouldn't get a cidTrackMouse when not tracking the mouse, // so all of these cause asserts _Gmse(kgmsEnterState, gmsNil, factNil), _Gmse(kgmsIdle, gmsNil, factNil), _Gmse(kgmsRollOn, gmsNil, factNil), _Gmse(kgmsRollOff, gmsNil, factNil), _Gmse(kgmsOn, gmsNil, factNil), _Gmse(kgmsReleaseOff, gmsNil, factNil), _Gmse(kgmsPressOn, kgmsDownOn, factNil), _Gmse(kgmsReleaseOn, kgmsReleaseOn, factNil), _Gmse(kgmsDownOn, kgmsReleaseOn, factNil), _Gmse(kgmsDragOff, kgmsDownOff, factNil), _Gmse(kgmsDragOn, kgmsDownOn, factNil), _Gmse(kgmsDownOff, kgmsReleaseOff, factNil), _Gmse(kgmsWait, kgmsOn, factNil), }; /*************************************************************************** what to do when we get a cidTrackMouse with button up and mouse off ***************************************************************************/ GMSE _mpgmsgmseUpOff[] = { _Gmse(gmsNil, gmsNil, factNil), // shouldn't get a cidTrackMouse when not tracking the mouse, // so all of these cause asserts _Gmse(kgmsEnterState, gmsNil, factNil), _Gmse(kgmsIdle, gmsNil, factNil), _Gmse(kgmsRollOn, gmsNil, factNil), _Gmse(kgmsRollOff, gmsNil, factNil), _Gmse(kgmsOn, gmsNil, factNil), _Gmse(kgmsReleaseOff, gmsNil, factNil), _Gmse(kgmsPressOn, kgmsDownOn, factNil), _Gmse(kgmsReleaseOn, kgmsReleaseOn, factNil), _Gmse(kgmsDownOn, kgmsDragOff, factNil), _Gmse(kgmsDragOff, kgmsDownOff, factNil), _Gmse(kgmsDragOn, kgmsDownOn, factNil), _Gmse(kgmsDownOff, kgmsReleaseOff, factNil), _Gmse(kgmsWait, kgmsOn, factNil), }; /*************************************************************************** We got some input, make sure the mouse tracking state is correct, according to the given transition table. CAUTION: this GOK may not exist on return. Returns false iff the GOK doesn't exist on return. ***************************************************************************/ bool GOK::_FAdjustGms(GMSE *pmpgmsgmse) { AssertThis(0); GMSE gmse; bool fStable = fTrue; Debug(bool fFirst = fTrue;) _DeferGorp(fTrue); for (;; Debug(fFirst = fFalse)) { gmse = pmpgmsgmse[_gmsCur]; Assert(gmse.gms == _gmsCur, "bad gmse table"); if (gmsNil == gmse.gmsDst || _gmsCur == gmse.gmsDst) { Assert(!fFirst || gmsNil != gmse.gmsDst, "invalid change in gms"); if (fStable) break; // use the done table from here on out Assert(pmpgmsgmse != _mpgmsgmseEnd, "bug in _mpgmsgmseEnd"); pmpgmsgmse = _mpgmsgmseEnd; continue; } if (!_FSetGmsCore(gmse.gmsDst, gmse.grfact, &fStable)) return fFalse; if (fStable && _mpgmsgmseEnd == pmpgmsgmse) break; AssertThis(0); } _DeferGorp(fFalse); return fTrue; } /*************************************************************************** Set the graphical mouse state. Note that the _gmsCur may end up different than gms. This is similar to _FAdjustGms(_mpgmsgmseEnd), except that the current representation is set before trying to advance. CAUTION: this GOK may not exist on return. Returns false iff the GOK doesn't exist on return. ***************************************************************************/ bool GOK::_FSetGms(long gms, ulong grfact) { AssertThis(0); AssertIn(gms, gmsNil, kgmsLim); GMSE gmse; bool fStable; _DeferGorp(fTrue); for (;;) { if (!_FSetGmsCore(gms, grfact, &fStable)) return fFalse; if (fStable) break; Assert(_gmsCur == gms, "bad _gmsCur"); // Nothing was set so advance gmse = _mpgmsgmseEnd[gms]; Assert(gmse.gms == gms, "bad gmse table"); Assert(gmse.gmsDst != gms, "bad gmse table"); // continue to the next state gms = gmse.gmsDst; grfact = gmse.grfact; } _DeferGorp(fFalse); return fTrue; } /*************************************************************************** Set the graphical mouse state. Note that _gmsCur may end up different than gms. *pfStable is set to false iff the gms is an auto-advance gms and the representation wasn't set (didn't exist or failed). CAUTION: this GOK may not exist on return. Returns false iff the GOK doesn't exist on return. ***************************************************************************/ bool GOK::_FSetGmsCore(long gms, ulong grfact, bool *pfStable) { AssertThis(0); AssertIn(gms, gmsNil, kgmsLim); AssertVarMem(pfStable); CHID chid; CTG ctg; // set the gms _gmsCur = gms; // do the actions if (FIn(gms, kgmsMinTrack, kgmsLimTrack)) { if (pvNil == vpcex->PgobTracking()) vpcex->TrackMouse(this); } else { if (this == vpcex->PgobTracking()) vpcex->EndMouseTracking(); } if (grfact & factEnqueueClick) { CMD_MOUSE cmd; ClearPb(&cmd, size(cmd)); cmd.cid = cidClicked; cmd.pcmh = this; cmd.grfcust = _grfcust; cmd.cact = _cactMouse; vpcex->EnqueueCmd((PCMD)&cmd); } // change the representation ctg = (_mpgmsgmseEnd[gms].gmsDst == gms) ? ctgNil : kctgAnimation; chid = _ChidMouse(); if (chidNil != chid) { if (!_FSetRep(chid, fgokMouseSound | fgokKillAnim, ctg, 0, 0, pfStable)) { return fFalse; } // we're stable if we didn't require an animation or the rep was set if (ctgNil == ctg) *pfStable = fTrue; } else *pfStable = (ctgNil == ctg); return fTrue; } /*************************************************************************** Make the current graphical representation that indicated by the given chid value (if not nil). If ctg is not nil, only uses ctg representations. Moves the GOK by (dxp, dyp). Fills *pfSet with whether the representation was successfully set. CAUTION: this GOK may not exist on return. Returns false iff the GOK doesn't exist on return. ***************************************************************************/ bool GOK::_FSetRep(CHID chid, ulong grfgok, CTG ctg, long dxp, long dyp, bool *pfSet) { AssertThis(0); long ikid; KID kid; PGORP pgorp; bool fSet = fFalse; bool fKillAnim = FPure(grfgok & fgokKillAnim); PCFL pcfl = _pcrf->Pcfl(); if (chidNil == chid) goto LAdjust; if (!(grfgok & fgokNoAnim) && (ctgNil == ctg || kctgAnimation == ctg)) { // animations are allowed - try to start one if (_chidAnim == chid && !(grfgok & fgokReset)) { fSet = fTrue; fKillAnim = fFalse; goto LAdjust; } if (pcfl->FGetKidChidCtg(_pgokd->Ctg(), _pgokd->Cno(), chid, kctgAnimation, &kid)) { PSCPT pscpt; PSCEG psceg = pvNil; if (pvNil != (pscpt = (PSCPT)_pcrf->PbacoFetch(kid.cki.ctg, kid.cki.cno, SCPT::FReadScript)) && pvNil != (psceg = _pwoks->PscegNew(_prca, this)) && psceg->FAttachScript(pscpt)) { ReleasePpo(&pscpt); if (pvNil != _pscegAnim) { ReleasePpo(&_pscegAnim); _pwoks->PclokAnim()->RemoveCmh(this); _pwoks->PclokNoSlip()->RemoveCmh(this); } _pscegAnim = psceg; fSet = fTrue; fKillAnim = fFalse; _chidAnim = chid; if (!_FAdvanceFrame()) return fFalse; goto LAdjust; } Warn("Couldn't attach animation script"); ReleasePpo(&psceg); ReleasePpo(&pscpt); } } if (kctgAnimation == ctg) goto LAdjust; for (pcfl->FGetIkid(_pgokd->Ctg(), _pgokd->Cno(), 0, 0, chid, &ikid); pcfl->FGetKid(_pgokd->Ctg(), _pgokd->Cno(), ikid, &kid) && kid.chid == chid; ikid++) { if (ctgNil != ctg && ctg != kid.cki.ctg || kctgAnimation == kid.cki.ctg) { continue; } if (!(grfgok & fgokReset) && pvNil != _pgorp && FEqualRgb(&kid.cki, &_ckiGorp, size(CKI))) { fSet = fTrue; break; } if (pvNil != (pgorp = _PgorpNew(_pcrf, kid.cki.ctg, kid.cki.cno))) { _SetGorp(pgorp, dxp, dyp); ReleasePpo(&pgorp); _ckiGorp = kid.cki; dxp = dyp = 0; fSet = fTrue; break; } } LAdjust: // reposition the GOK if (dxp != 0 || dyp != 0) { RC rc; GetRc(&rc, cooParent); rc.Offset(dxp, dyp); SetPos(&rc); } if (fKillAnim && fSet) { ReleasePpo(&_pscegAnim); _pwoks->PclokAnim()->RemoveCmh(this); _pwoks->PclokNoSlip()->RemoveCmh(this); _chidAnim = chidNil; } if (grfgok & fgokMouseSound) _PlayMouseSound(chid); if (pvNil != pfSet) *pfSet = fSet; return fTrue; } /*************************************************************************** Run the next section of the animation script. ***************************************************************************/ bool GOK::_FAdvanceFrame(void) { AssertThis(0); bool fExists, fRet, fPaused; PWOKS pwoks = _pwoks; ulong dtim = 0; PSCEG psceg = _pscegAnim; long grid = Grid(); if (pvNil == psceg) { Bug("no animation"); return fTrue; } AssertPo(psceg, 0); psceg->AddRef(); _DeferGorp(fTrue); for (;;) { fRet = psceg->FResume(pvNil, &fPaused); fExists = (this == pwoks->PgobFromGrid(grid)); if (!fExists) { // this GOK went away ReleasePpo(&psceg); return fFalse; } AssertThis(0); if (!fRet || !fPaused || pvNil == _pscegAnim) { // end the animation, but keep _chidAnim set, so we don't restart // this animation until after the animation has been explicitly // killed. if (psceg == _pscegAnim) { ReleasePpo(&_pscegAnim); _pwoks->PclokAnim()->RemoveCmh(this); _pwoks->PclokNoSlip()->RemoveCmh(this); ReleasePpo(&psceg); if (!_FAdjustGms(_mpgmsgmseEnd)) return fFalse; } else ReleasePpo(&psceg); goto LSetGorp; } if (!_fNoSlip) { _pwoks->PclokAnim()->FSetAlarm(_dtim, this); break; } dtim += LwMax(1, _dtim); if (dtim > _pwoks->PclokNoSlip()->DtimAlarm()) { _pwoks->PclokNoSlip()->FSetAlarm(dtim, this); break; } } ReleasePpo(&psceg); LSetGorp: _DeferGorp(fFalse); return fTrue; } /*************************************************************************** Put the kidspace graphic object in the indicated state. CAUTION: this GOK may not exist on return. Returns false iff the GOK doesn't exist on return. ***************************************************************************/ bool GOK::_FEnterState(long sno) { AssertThis(0); AssertIn(sno, 0, kswMax); struct GMMPE { Debug(long gms;) long gmsPar; }; #ifdef DEBUG #define _Gmmpe(gms, gmsPar) \ { \ gms, gmsPar \ } #else //! DEBUG #define _Gmmpe(gms, gmsPar) \ { \ gmsPar \ } #endif //! DEBUG // this maps a gms to its parent in the natural traversal tree static GMMPE _mpgmsgmmpe[] = { _Gmmpe(gmsNil, gmsNil), _Gmmpe(kgmsEnterState, gmsNil), _Gmmpe(kgmsIdle, kgmsEnterState), _Gmmpe(kgmsRollOn, kgmsIdle), _Gmmpe(kgmsRollOff, kgmsOn), _Gmmpe(kgmsOn, kgmsRollOn), // Note: this is the only strange one - we can't go through kgmsDownOff // because that would require tracking the mouse. If some other button // is currently tracking, we couldn't start tracking and things might // break. Thus, we just go through kgmsIdle. _Gmmpe(kgmsReleaseOff, kgmsIdle), _Gmmpe(kgmsPressOn, kgmsOn), _Gmmpe(kgmsReleaseOn, kgmsDownOn), _Gmmpe(kgmsDownOn, kgmsPressOn), _Gmmpe(kgmsDragOff, kgmsDownOn), _Gmmpe(kgmsDragOn, kgmsDownOff), _Gmmpe(kgmsDownOff, kgmsDragOff), _Gmmpe(kgmsWait, kgmsReleaseOn), }; long rggms[kgmsLim]; long igms; long gms, gmsPrev; bool fStable; for (gms = _gmsCur, igms = 0; gmsNil != gms;) { rggms[igms++] = gms; Assert(gms == _mpgmsgmmpe[gms].gms, "bad _mpgmsgmmpe"); gms = _mpgmsgmmpe[gms].gmsPar; } // defer rep changes _DeferGorp(fTrue); // change the state number _sno = (short)sno; // put it in gmsNil if (!_FSetGmsCore(gmsNil, factNil, &fStable)) return fFalse; for (gmsPrev = gmsNil; igms-- > 0; gmsPrev = gms) { gms = rggms[igms]; if (gmsPrev != _gmsCur) continue; if (!_FSetGmsCore(gms, factNil, &fStable)) return fFalse; AssertThis(0); } if (!fStable && !_FAdjustGms(_mpgmsgmseEnd)) return fFalse; _DeferGorp(fFalse); return fTrue; } /*************************************************************************** See if the given point is in this GOK. ***************************************************************************/ bool GOK::FPtIn(long xp, long yp) { AssertThis(0); RC rc; if (pvNil == _pgorp || _fNoHit || khidToolTip == Hid()) return fFalse; GetRc(&rc, cooLocal); if (!rc.FPtIn(xp, yp)) return fFalse; if (_fRect) return fTrue; return _pgorp->FPtIn(xp, yp); } /*************************************************************************** See if the given point is in the rectangular bounds of this GOK (ie, whether there's any chance the point is in a child of this GOK). ***************************************************************************/ bool GOK::FPtInBounds(long xp, long yp) { AssertThis(0); RC rc; if (_fNoHitKids || khidToolTip == Hid()) return fFalse; GetRc(&rc, cooLocal); return rc.FPtIn(xp, yp); } /*************************************************************************** Draw the kidspace object. ***************************************************************************/ void GOK::Draw(PGNV pgnv, RC *prcClip) { AssertThis(0); AssertPo(pgnv, 0); AssertVarMem(prcClip); RC rc; if (pvNil != _pgorp) { GetRc(&rc, cooLocal); if (rc.FIntersect(prcClip)) _pgorp->Draw(pgnv, prcClip); } } /*************************************************************************** Respond to an alarm. If the clock is the animation clock or noslip clock we advance the animation. Otherwise we run an associated script. CAUTION: this GOK may not exist on return. ***************************************************************************/ bool GOK::FCmdAlarm(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); CHID chid; long hid = pcmd->rglw[0]; if (_pwoks->PclokAnim()->Hid() == hid || _pwoks->PclokNoSlip()->Hid() == hid) { if (pvNil != _pscegAnim) _FAdvanceFrame(); else Bug("Alarm sounding without an animation"); } else { chid = pcmd->rglw[2]; if (chidNil == chid || 0 == chid) chid = ChidFromSnoDchid(_sno, kchidAlarm); FRunScript(chid, &pcmd->rglw[0], 3); } return fTrue; } /*************************************************************************** For command filtering. CAUTION: this GOK may not exist on return. ***************************************************************************/ bool GOK::FCmdAll(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); CMFLT cmflt; bool fFiltered; if (pvNil == _pglcmflt) return fFalse; if (pvNil != pcmd->pcmh) { if (_FFindCmflt(pcmd->cid, pcmd->pcmh->Hid(), &cmflt) && _FFilterCmd(pcmd, cmflt.chidScript, &fFiltered)) { return fFiltered; } if (_FFindCmflt(cidNil, pcmd->pcmh->Hid(), &cmflt) && _FFilterCmd(pcmd, cmflt.chidScript, &fFiltered)) { return fFiltered; } } if (_FFindCmflt(pcmd->cid, hidNil, &cmflt) && _FFilterCmd(pcmd, cmflt.chidScript, &fFiltered)) { return fFiltered; } return fFalse; } /*************************************************************************** Determine if the command should be filtered out by calling the indicated script and checking its return value. This returns true iff the command is filtered out or the GOK goes away, in which case *pfFilter is set to whether the command was filtered. ***************************************************************************/ bool GOK::_FFilterCmd(PCMD pcmd, CHID chidScript, bool *pfFilter) { AssertThis(0); AssertVarMem(pcmd); AssertVarMem(pfFilter); long rglw[6]; long lw; bool fGokExists; tribool tRet; rglw[0] = (pvNil == pcmd->pcmh) ? hidNil : pcmd->pcmh->Hid(); rglw[1] = pcmd->cid; rglw[2] = pcmd->rglw[0]; rglw[3] = pcmd->rglw[1]; rglw[4] = pcmd->rglw[2]; rglw[5] = pcmd->rglw[3]; fGokExists = FRunScript(chidScript, rglw, 6, &lw, &tRet); *pfFilter = FPure(lw) && tRet == tYes; return !fGokExists || *pfFilter; } /*************************************************************************** Filter on a command id and/or a handler id. Either cid or hid may be nil. To turn off filtering for a (cid, hid), use chidNil for chidScript. If both cid and hid are nil, chidScript should be nil. If the cid, hid and chidScript are all nil, we turn off all filtering. ***************************************************************************/ bool GOK::FFilterCidHid(long cid, long hid, CHID chidScript) { AssertThis(0); CMFLT cmflt; long icmflt; KID kid; if (chidNil == chidScript || !_pcrf->Pcfl()->FGetKidChidCtg(_pgokd->Ctg(), _pgokd->Cno(), chidScript, kctgScript, &kid)) { // turn off filtering if (chidNil != chidScript) Warn("script doesn't exist (for filtering)"); if (cidNil != cid || hidNil != hid) { if (!_FFindCmflt(cid, hid, pvNil, &icmflt)) return fTrue; _pglcmflt->Delete(icmflt); if (0 < _pglcmflt->IvMac()) return fTrue; } // release the filters and remove ourself from the command handler list ReleasePpo(&_pglcmflt); vpcex->RemoveCmh(this, kcmhlGok); return fTrue; } if (cidNil == cid && hidNil == hid) { Bug("can't filter on (cidNil, hidNil)!"); return fFalse; } if (_FFindCmflt(cid, hid, &cmflt, &icmflt)) { cmflt.chidScript = chidScript; _pglcmflt->Put(icmflt, &cmflt); return fTrue; } if (pvNil == _pglcmflt && pvNil == (_pglcmflt = GL::PglNew(size(CMFLT)))) return fFalse; cmflt.cid = cid; cmflt.hid = hid; cmflt.chidScript = chidScript; if (!_pglcmflt->FInsert(icmflt, &cmflt)) return fFalse; vpcex->RemoveCmh(this, kcmhlGok); return vpcex->FAddCmh(this, kcmhlGok, kgrfcmmAll); } /*************************************************************************** Look for the given (cid, hid) pair in the filtering map. ***************************************************************************/ bool GOK::_FFindCmflt(long cid, long hid, CMFLT *pcmflt, long *picmflt) { AssertThis(0); Assert(cid != cidNil || hid != hidNil, "cid and hid are both nil!"); AssertNilOrVarMem(pcmflt); AssertNilOrVarMem(picmflt); long ivMin, ivLim, iv; CMFLT cmflt; ivMin = 0; if (pvNil != _pglcmflt) { for (ivLim = _pglcmflt->IvMac(); ivMin < ivLim;) { iv = (ivMin + ivLim) / 2; _pglcmflt->Get(iv, &cmflt); if (cmflt.cid < cid) ivMin = iv + 1; else if (cmflt.cid > cid) ivLim = iv; else if (cmflt.hid < hid) ivMin = iv + 1; else if (cmflt.hid > hid) ivLim = iv; else { if (pvNil != pcmflt) *pcmflt = cmflt; if (pvNil != picmflt) *picmflt = iv; return fTrue; } } } TrashVar(pcmflt); if (pvNil != picmflt) *picmflt = ivMin; return fFalse; } /*************************************************************************** This handles cidMouseMove and cidRollOff. ***************************************************************************/ bool GOK::FCmdMouseMove(PCMD_MOUSE pcmd) { AssertThis(0); AssertVarMem(pcmd); pcmd->grfcust = _pwoks->GrfcustAdjust(pcmd->grfcust); if (pcmd->cid == cidRollOff) _FAdjustGms(_mpgmsgmseRollOff); else { Assert(cidMouseMove == pcmd->cid, "unknown command"); CUME cume; bool fCanClick = _pgokd->FGetCume(pcmd->grfcust, _sno, &cume); if (!_FAdjustGms(fCanClick ? _mpgmsgmseMove : _mpgmsgmseRollOff)) return fTrue; SetCursor(pcmd->grfcust); } return fTrue; } /*************************************************************************** Set the cursor for this GOK and the given cursor state. ***************************************************************************/ void GOK::SetCursor(ulong grfcust) { AssertThis(0); PGOK pgok; PGOB pgob; CUME cume; for (pgok = this; !pgok->_pgokd->FGetCume(grfcust, _sno, &cume) || cume.cnoCurs == cnoNil; grfcust |= fcustChildGok) { for (pgob = pgok;;) { pgob = pgob->PgobPar(); if (pvNil == pgob) { vpappb->SetCurs(pvNil); return; } if (pgob->FIs(kclsGOK)) { pgok = (PGOK)pgob; break; } } } vpappb->SetCursCno(pgok->_prca, cume.cnoCurs); } /*************************************************************************** Do mouse tracking. ***************************************************************************/ bool GOK::FCmdTrackMouse(PCMD_MOUSE pcmd) { AssertThis(0); AssertVarMem(pcmd); pcmd->grfcust = _pwoks->GrfcustAdjust(pcmd->grfcust); if (pcmd->cid == cidMouseDown) { // first response to mouse down CUME cume; if (!_pgokd->FGetCume(pcmd->grfcust, _sno, &cume)) return fTrue; _grfcust = pcmd->grfcust; _cactMouse = (short)pcmd->cact; if (!_FAdjustGms(_mpgmsgmseMouseDown)) return fTrue; SetCursor(pcmd->grfcust); } else { Assert(pcmd->cid == cidTrackMouse, 0); bool fIn; GMSE *pmpgmsgmse; fIn = FPtIn(pcmd->xp, pcmd->yp); if (pcmd->grfcust & fcustMouse) { // mouse is down pmpgmsgmse = fIn ? _mpgmsgmseDownOn : _mpgmsgmseDownOff; } else { // mouse is up pmpgmsgmse = fIn ? _mpgmsgmseUpOn : _mpgmsgmseUpOff; } if (!_FAdjustGms(pmpgmsgmse)) return fTrue; } return fTrue; } /*************************************************************************** Put up a tool tip if this GOK has one. Return true if tool tips are still active. ***************************************************************************/ bool GOK::FEnsureToolTip(PGOB *ppgobCurTip, long xpMouse, long ypMouse) { AssertThis(0); AssertVarMem(ppgobCurTip); AssertNilOrPo(*ppgobCurTip, 0); CNO cno; HTOP htop; PGOK pgokSrc; ReleasePpo(ppgobCurTip); if (_hidToolTipSrc == Hid()) pgokSrc = this; else { if (pvNil == (pgokSrc = (PGOK)_pwoks->PgobFromHid(_hidToolTipSrc)) || !pgokSrc->FIs(kclsGOK)) { // abort tool tip mode return fFalse; } } if (cnoNil == (cno = pgokSrc->_CnoToolTip())) { // abort tool tip mode return fFalse; } if (kcnoToolTipNoAffect == cno) { // return true to stay in tool tip mode, but don't put up a tool tip return fTrue; } // put up the tool tip htop.cnoBalloon = cnoNil; htop.hidThis = khidToolTip; htop.hidTarget = Hid(); htop.cnoScript = cnoNil; htop.dxp = 0; htop.dyp = 0; htop.ckiSnd.ctg = ctgNil; htop.ckiSnd.cno = cnoNil; *ppgobCurTip = _pwoks->PhbalNew(pvNil, _prca, cno, &htop); return fTrue; } /*************************************************************************** Get the cno for the our tool tip (given the current modifier state). ***************************************************************************/ CNO GOK::_CnoToolTip(void) { AssertThis(0); CUME cume; if (!_pgokd->FGetCume(_pwoks->GrfcustCur(), _sno, &cume)) return cnoNil; return cume.cnoTopic; } /*************************************************************************** Makes the GOK get its tool tip from the GOK having the given hid. ***************************************************************************/ void GOK::SetHidToolTip(long hidSrc) { AssertThis(0); _hidToolTipSrc = hidSrc; } /*************************************************************************** Get the state information for the GOK (for testing). High 16 bits are the state number; next 14 bits are _gmsCur; low 2 bits are set. ***************************************************************************/ long GOK::LwState(void) { AssertThis(0); return (_sno << 16) | (_gmsCur << 2) & 0x0000FFFF | 0x03; } /*************************************************************************** Get the registration point of the given GOK in its parent's coordinates. ***************************************************************************/ void GOK::GetPtReg(PT *ppt, long coo) { AssertThis(0); AssertVarMem(ppt); RC rc; if (coo == cooLocal) rc.Zero(); else GetRc(&rc, coo); ppt->xp = rc.xpLeft + _dxp; ppt->yp = rc.ypTop + _dyp; } /*************************************************************************** Get the "content" rectangle of this GOK. This is primarily for GOKs that have a content area, such as help balloons and easels. ***************************************************************************/ void GOK::GetRcContent(RC *prc) { AssertThis(0); AssertVarMem(prc); if (pvNil != _pgorp) _pgorp->GetRcContent(prc); else GetRc(prc, cooLocal); } /*************************************************************************** Set the GOK's z plane. ***************************************************************************/ void GOK::SetZPlane(long zp) { AssertThis(0); PGOB pgobBefore; if (_zp == zp) return; pgobBefore = _PgobBefore(PgobPar(), zp); if (pgobBefore == this || pgobBefore == PgobPrevSib()) { _zp = zp; return; } SendBehind(pgobBefore); InvalRc(pvNil); _zp = zp; } /*************************************************************************** Set the slipping behavior of the GOK. ***************************************************************************/ void GOK::SetNoSlip(bool fNoSlip) { AssertThis(0); _fNoSlip = FPure(fNoSlip); } /*************************************************************************** If there is an attached script with the given chid value, run it. Returns false iff the GOK no longer exists on return. *ptSuccess is filled with tNo if the script doesn't exist, tMaybe if the script exists but there was a failure, tYes if the script exists and running it succeeded. CAUTION: this GOK may not exist on return. ***************************************************************************/ bool GOK::FRunScript(CHID chid, long *prglw, long clw, long *plwReturn, tribool *ptSuccess) { AssertThis(0); AssertNilOrVarMem(plwReturn); KID kid; if (!_pcrf->Pcfl()->FGetKidChidCtg(_pgokd->Ctg(), _pgokd->Cno(), chid, kctgScript, &kid)) { if (pvNil != ptSuccess) *ptSuccess = tNo; return fTrue; } return FRunScriptCno(kid.cki.cno, prglw, clw, plwReturn, ptSuccess); } /*************************************************************************** If there is a script with the given cno, run it. Returns false iff the GOK no longer exists on return. *ptSuccess is filled with tNo if the script doesn't exist, tMaybe if the script exists but there was a failure, tYes if the script exists and running it succeeded. CAUTION: this GOK may not exist on return. ***************************************************************************/ bool GOK::FRunScriptCno(CNO cno, long *prglw, long clw, long *plwReturn, tribool *ptSuccess) { AssertThis(0); AssertNilOrVarMem(plwReturn); PSCPT pscpt; bool fError, fExists; tribool tRet; fExists = fTrue; pscpt = (PSCPT)_pcrf->PbacoFetch(kctgScript, cno, SCPT::FReadScript, &fError); if (pvNil != pscpt) { AssertPo(pscpt, 0); long grid = Grid(); PWOKS pwoks = _pwoks; PSCEG psceg = _pwoks->PscegNew(_prca, this); // be careful not to use GOK variables here in case the GOK is // freed while the script is running. if (pvNil != psceg && psceg->FRunScript(pscpt, prglw, clw, plwReturn)) tRet = tYes; else tRet = tMaybe; ReleasePpo(&psceg); ReleasePpo(&pscpt); // see if this GOK still exists fExists = (this == pwoks->PgobFromGrid(grid)); } else tRet = fError ? tMaybe : tNo; if (pvNil != ptSuccess) *ptSuccess = tRet; return fExists; } /*************************************************************************** Change the current state of the GOK to the given state number. CAUTION: this GOK may not exist on return. ***************************************************************************/ bool GOK::FChangeState(long sno) { AssertThis(0); AssertIn(sno, 0, kswMax); return _FEnterState(sno); } /*************************************************************************** Set the representation to the given chid (if it's not nil). Moves the GOK by dxp, dyp and sets its wait time for animation script wake up to dtim (unless it's zero). CAUTION: this GOK may not exist on return. Returns false iff the GOK doesn't exist on return. ***************************************************************************/ bool GOK::FSetRep(CHID chid, ulong grfgok, CTG ctg, long dxp, long dyp, ulong dtim) { AssertThis(0); if (dtim != 0) _dtim = dtim; if (grfgok & fgokKillAnim) { if (!_FAdjustGms(_mpgmsgmseEnd)) return fTrue; } return _FSetRep(chid, grfgok, ctg, dxp, dyp); } /*************************************************************************** The GOK has been hit with the mouse, do the associated action. CAUTION: this GOK may not exist on return. ***************************************************************************/ bool GOK::FCmdClicked(PCMD_MOUSE pcmd) { AssertThis(0); PGOK pgok; PGOB pgob; long rglw[3]; long lw; tribool tRet; CUME cume; long hid = Hid(); long grid = Grid(); _DeferSnd(fTrue); if (kgmsWait == _gmsCur) { if (!_FSetGms(kgmsOn, factNil)) return fTrue; } for (pgok = this;;) { if (pgok->_pgokd->FGetCume(pcmd->grfcust, _sno, &cume)) break; pgob = pgok->PgobPar(); if (pvNil == pgob || !pgob->FIs(kclsGOK)) { _DeferSnd(fFalse); return fTrue; } pgok = (PGOK)pgob; } // do the action associated with a mouse click rglw[0] = pcmd->grfcust; rglw[1] = hid; rglw[2] = pcmd->cact; if (!pgok->FRunScript(cume.chidScript, rglw, 3, &lw, &tRet)) return fTrue; if (cidNil != cume.cidDefault && (tYes != tRet || lw != 0)) { // do the default action vpcex->EnqueueCid(cume.cidDefault, pvNil, pvNil, pgok->Hid(), hid); } // undefer sound - be careful because this GOK may have gone away if (this == pgok || (this == pgok->_pwoks->PgobFromGrid(grid))) _DeferSnd(fFalse); return fTrue; } /*************************************************************************** Make the current graphical representation that indicated by the given chid value. If we're already in that representation, don't do anything, ie, don't restart an animation. CAUTION: this GOK may not exist on return. Returns false iff the GOK doesn't exist on return. ***************************************************************************/ PGORP GOK::_PgorpNew(PCRF pcrf, CTG ctg, CNO cno) { AssertThis(0); typedef PGORP (*PFNGORP)(PGOK pgok, PCRF pcrf, CTG ctg, CNO cno); PFNGORP pfngorp; switch (ctg) { default: return pvNil; case kctgMbmp: case kctgMask: pfngorp = (PFNGORP)GORB::PgorbNew; break; case kctgFill: pfngorp = (PFNGORP)GORF::PgorfNew; break; case kctgTile: pfngorp = (PFNGORP)GORT::PgortNew; break; case kctgVideo: pfngorp = (PFNGORP)GORV::PgorvNew; break; } return (*pfngorp)(this, pcrf, ctg, cno); } /*************************************************************************** Set the current graphical representation to this one. ***************************************************************************/ void GOK::_SetGorp(PGORP pgorp, long dxp, long dyp) { AssertThis(0); AssertNilOrPo(pgorp, 0); RC rc, rcNew; if (_cactDeferGorp > 0) { if (pvNil != pgorp) { pgorp->AddRef(); pgorp->Stream(_fStream); } ReleasePpo(&_pgorp); _pgorp = pgorp; GetRc(&rc, cooParent); rc.xpRight = rc.xpLeft; rc.ypBottom = rc.ypTop; rc.Offset(_dxp + dxp, _dyp + dyp); _dxp = _dyp = 0; SetPos(&rc, pvNil); _fGorpDirty = fTrue; } else { if (pvNil != pgorp) { pgorp->AddRef(); pgorp->Stream(_fStream); pgorp->SetDxpDyp(_dxpPref, _dypPref); pgorp->GetRc(&rcNew); } else rcNew.Zero(); ReleasePpo(&_pgorp); _pgorp = pgorp; GetRc(&rc, cooParent); rc.OffsetCopy(&rcNew, _dxp + rc.xpLeft + dxp, _dyp + rc.ypTop + dyp); _dxp = -rcNew.xpLeft; _dyp = -rcNew.ypTop; SetPos(&rc, pvNil); if (pvNil != _pgorp) { _pgorp->GotoNfr(0); _pgorp->FPlay(); } _fGorpDirty = fFalse; } } /*************************************************************************** Defer or finish defering marking and positioning the gorp. ***************************************************************************/ void GOK::_DeferGorp(bool fDefer) { AssertThis(0); if (fDefer) _cactDeferGorp++; else if (_cactDeferGorp > 0) { --_cactDeferGorp; if (_cactDeferGorp == 0 && _fGorpDirty) _SetGorp(_pgorp, 0, 0); } else Bug("_cactDeferGorp is bad"); _DeferSnd(fDefer); } /*************************************************************************** Start playing the current representation. ***************************************************************************/ bool GOK::FPlay(void) { AssertThis(0); return pvNil != _pgorp && _pgorp->FPlay(); } /*************************************************************************** Return whether the current representation is being played. ***************************************************************************/ bool GOK::FPlaying(void) { AssertThis(0); return pvNil != _pgorp && _pgorp->FPlaying(); } /*************************************************************************** Stop playing the current representation. ***************************************************************************/ void GOK::Stop(void) { AssertThis(0); if (pvNil != _pgorp) _pgorp->Stop(); } /*************************************************************************** Goto the given frame of the current representation. ***************************************************************************/ void GOK::GotoNfr(long nfr) { AssertThis(0); if (pvNil != _pgorp) { long nfrOld = _pgorp->NfrCur(); _pgorp->GotoNfr(nfr); if (nfrOld != _pgorp->NfrCur()) InvalRc(pvNil, kginMark); } } /*************************************************************************** Return the number of frames in the current representation. ***************************************************************************/ long GOK::NfrMac(void) { AssertThis(0); return pvNil == _pgorp ? 0 : _pgorp->NfrMac(); } /*************************************************************************** Return the current frame number of the current representation. ***************************************************************************/ long GOK::NfrCur(void) { AssertThis(0); return pvNil == _pgorp ? 0 : _pgorp->NfrCur(); } /*************************************************************************** Play a sound and attach the sound to this GOK so that when the GOK goes away, the sound will be killed. ***************************************************************************/ long GOK::SiiPlaySound(CTG ctg, CNO cno, long sqn, long vlm, long cactPlay, ulong dtsStart, long spr, long scl) { AssertThis(0); if (pvNil == vpsndm) return siiNil; if (siiNil != _siiSound) vpsndm->Stop(_siiSound); if (cnoNil != cno) { _siiSound = vpsndm->SiiPlay(_prca, ctg, cno, sqn, vlm, cactPlay, dtsStart, spr, scl); } else _siiSound = siiNil; return _siiSound; } /*************************************************************************** Defer or stop defering mouse sounds. ***************************************************************************/ void GOK::_DeferSnd(bool fDefer) { AssertThis(0); if (fDefer) _cactDeferSnd++; else if (_cactDeferSnd > 0) { --_cactDeferSnd; if (_cactDeferSnd == 0 && _fMouseSndDirty) SiiPlayMouseSound(_ckiMouseSnd.ctg, _ckiMouseSnd.cno); } else Bug("_cactDeferSnd is bad"); } /*************************************************************************** Play a sound and attach the sound to this GOK as the mouse tracking sound, so that when the GOK goes away and the mouse state changes, the sound will be killed. ***************************************************************************/ long GOK::SiiPlayMouseSound(CTG ctg, CNO cno) { AssertThis(0); _fMouseSndDirty = fFalse; if (pvNil == vpsndm) return siiNil; if (siiNil != _siiMouse) vpsndm->Stop(_siiMouse); if (cnoNil != cno) _siiMouse = vpsndm->SiiPlay(_prca, ctg, cno); else _siiMouse = siiNil; return _siiMouse; } /*************************************************************************** Play a sound with the given chid as the current mouse tracking sound. ***************************************************************************/ void GOK::_PlayMouseSound(CHID chid) { AssertThis(0); KID kid; if (pvNil == vpsndm) return; if (!_pcrf->Pcfl()->FGetKidChidCtg(_pgokd->Ctg(), _pgokd->Cno(), chid, kctgWave, &kid) && !_pcrf->Pcfl()->FGetKidChidCtg(_pgokd->Ctg(), _pgokd->Cno(), chid, kctgMidi, &kid)) { return; } if (_cactDeferSnd > 0) { _ckiMouseSnd = kid.cki; _fMouseSndDirty = fTrue; } else SiiPlayMouseSound(kid.cki.ctg, kid.cki.cno); } /*************************************************************************** Our kidworld is being suspended. Make sure no AVIs or other things are running. ***************************************************************************/ void GOK::Suspend(void) { AssertThis(0); if (pvNil != _pgorp) _pgorp->Suspend(); } /*************************************************************************** Our kidworld is being resumed. Undo anything we did in Suspend. ***************************************************************************/ void GOK::Resume(void) { AssertThis(0); if (pvNil != _pgorp) _pgorp->Resume(); } /*************************************************************************** The streaming property is being set or reset. If streaming is set, the rep should get flushed when we're done with it. ***************************************************************************/ void GOK::Stream(bool fStream) { AssertThis(0); _fStream = FPure(fStream); if (pvNil != _pgorp) _pgorp->Stream(fStream); } #ifdef DEBUG /*************************************************************************** Assert the validity of a GOK. ***************************************************************************/ void GOK::AssertValid(ulong grf) { GOK_PAR::AssertValid(0); AssertPo(_pwoks, 0); AssertNilOrPo(_pscegAnim, 0); AssertPo(_pcrf, 0); AssertPo(_prca, 0); AssertNilOrPo(_pgorp, 0); AssertNilOrPo(_pglcmflt, 0); AssertIn(_gmsCur, gmsNil, kgmsLim); if (FIn(_gmsCur, kgmsMinTrack, kgmsLimTrack)) { Assert(vpcex->PgobTracking() == this || vpappb->CactModal() > 0, "should be tracking the mouse"); } else { Assert(vpcex->PgobTracking() != this, "shouldn't be tracking the mouse"); } } /*************************************************************************** Mark memory for the GOK. ***************************************************************************/ void GOK::MarkMem(void) { AssertValid(0); GOK_PAR::MarkMem(); MarkMemObj(_pscegAnim); MarkMemObj(_prca); MarkMemObj(_pcrf); MarkMemObj(_pgorp); MarkMemObj(_pglcmflt); } #endif // DEBUG /*************************************************************************** Stub method for non-frame based representations. ***************************************************************************/ long GORP::NfrMac(void) { AssertThis(0); return 0; } /*************************************************************************** Stub method for non-frame based representations. ***************************************************************************/ long GORP::NfrCur(void) { AssertThis(0); return 0; } /*************************************************************************** Stub method for non-frame based representations. ***************************************************************************/ void GORP::GotoNfr(long nfr) { AssertThis(0); } /*************************************************************************** Stub method for non-frame based representations. ***************************************************************************/ bool GORP::FPlaying(void) { AssertThis(0); return fFalse; } /*************************************************************************** Stub method for non-frame based representations. ***************************************************************************/ bool GORP::FPlay(void) { AssertThis(0); return fFalse; } /*************************************************************************** Stub method for non-frame based representations. ***************************************************************************/ void GORP::Stop(void) { AssertThis(0); } /*************************************************************************** Stub method for non-frame based representations. ***************************************************************************/ void GORP::Suspend(void) { AssertThis(0); } /*************************************************************************** Stub method for non-frame based representations. ***************************************************************************/ void GORP::Resume(void) { AssertThis(0); } /*************************************************************************** The streaming property is being set or reset. If streaming is set, we should flush our stuff from the RCA cache when we're done with it. ***************************************************************************/ void GORP::Stream(bool fStream) { AssertThis(0); } // a FILL chunk struct GOKFL { short bo; short osk; RC rc; long lwAcrFore; long lwAcrBack; byte rgbPat[8]; }; const BOM kbomGokfl = 0x5FFF0000; /*************************************************************************** Static method to create a new fill representation. ***************************************************************************/ PGORF GORF::PgorfNew(PGOK pgok, PCRF pcrf, CTG ctg, CNO cno) { AssertPo(pgok, 0); AssertPo(pcrf, 0); GOKFL gokfl; PCFL pcfl; BLCK blck; PGORF pgorf; pcfl = pcrf->Pcfl(); if (!pcfl->FFind(ctg, cno, &blck) || !blck.FUnpackData() || blck.Cb() != size(GOKFL) || !blck.FRead(&gokfl)) { Warn("couldn't load indicated fill"); return pvNil; } if (kboOther == gokfl.bo) SwapBytesBom(&gokfl, kbomGokfl); if (kboCur != gokfl.bo) { Warn("Bad FILL chunk"); return pvNil; } if (pvNil == (pgorf = NewObj GORF)) return pvNil; pgorf->_acrFore.SetFromLw(gokfl.lwAcrFore); pgorf->_acrBack.SetFromLw(gokfl.lwAcrBack); CopyPb(gokfl.rgbPat, pgorf->_apt.rgb, size(gokfl.rgbPat)); pgorf->_rc = gokfl.rc; pgorf->_dxp = gokfl.rc.Dxp(); pgorf->_dyp = gokfl.rc.Dyp(); AssertPo(pgorf, 0); return pgorf; } /*************************************************************************** Fill the rectangle. ***************************************************************************/ void GORF::Draw(PGNV pgnv, RC *prcClip) { AssertThis(0); AssertPo(pgnv, 0); RC rc(0, 0, _dxp, _dyp); if (rc.FIntersect(prcClip) && (_acrFore != kacrClear || _acrBack != kacrClear)) { pgnv->FillRcApt(&rc, &_apt, _acrFore, _acrBack); } } /*************************************************************************** Return whether the point is in the representation. ***************************************************************************/ bool GORF::FPtIn(long xp, long yp) { AssertThis(0); return FIn(xp, 0, _dxp) && FIn(yp, 0, _dyp); } /*************************************************************************** Set the internal state of the GORF to accomodate the given preferred size of the content area. ***************************************************************************/ void GORF::SetDxpDyp(long dxpPref, long dypPref) { AssertThis(0); AssertIn(dxpPref, 0, kcbMax); AssertIn(dypPref, 0, kcbMax); if ((_dxp = dxpPref) == 0) _dxp = _rc.Dxp(); if ((_dyp = dypPref) == 0) _dyp = _rc.Dyp(); } /*************************************************************************** Get the natural rectangle. ***************************************************************************/ void GORF::GetRc(RC *prc) { AssertThis(0); AssertVarMem(prc); prc->Set(0, 0, _dxp, _dyp); prc->CenterOnRc(&_rc); } /*************************************************************************** Get the interior content rectangle. ***************************************************************************/ void GORF::GetRcContent(RC *prc) { AssertThis(0); AssertVarMem(prc); GetRc(prc); prc->OffsetToOrigin(); } /*************************************************************************** Create a new masked bitmap representation of a graphical object. ***************************************************************************/ PGORB GORB::PgorbNew(PGOK pgok, PCRF pcrf, CTG ctg, CNO cno) { AssertPo(pgok, 0); AssertPo(pcrf, 0); PGORB pgorb; if (pvNil == (pgorb = NewObj GORB)) return pvNil; pgorb->_pcrf = pcrf; pgorb->_pcrf->AddRef(); pgorb->_ctg = ctg; pgorb->_cno = cno; AssertPo(pgorb, 0); return pgorb; } /*************************************************************************** Destructor for a GORB. ***************************************************************************/ GORB::~GORB(void) { if (_fStream && pvNil != _pcrf && ctgNil != _ctg) _pcrf->FSetCrep(crepToss, _ctg, _cno, MBMP::FReadMbmp); ReleasePpo(&_pcrf); } /*************************************************************************** Draw the bitmap. ***************************************************************************/ void GORB::Draw(PGNV pgnv, RC *prcClip) { AssertThis(0); AssertPo(pgnv, 0); AssertVarMem(prcClip); PMBMP pmbmp; RC rc; if (kctgMbmp != _ctg) return; if (pvNil != (pmbmp = (PMBMP)_pcrf->PbacoFetch(_ctg, _cno, MBMP::FReadMbmp))) { AssertPo(pmbmp, 0); pmbmp->GetRc(&rc); rc.OffsetToOrigin(); pgnv->DrawMbmp(pmbmp, &rc); ReleasePpo(&pmbmp); } else Warn("Couldn't load kidspace bitmap"); } /*************************************************************************** Return whether the point is in the bitmap. ***************************************************************************/ bool GORB::FPtIn(long xp, long yp) { AssertThis(0); PMBMP pmbmp; RC rc; bool fRet; if (pvNil == (pmbmp = (PMBMP)_pcrf->PbacoFetch(_ctg, _cno, MBMP::FReadMbmp))) { Warn("Couldn't load kidspace bitmap"); return fTrue; } AssertPo(pmbmp, 0); pmbmp->GetRc(&rc); fRet = pmbmp->FPtIn(xp + rc.xpLeft, yp + rc.ypTop); ReleasePpo(&pmbmp); return fRet; } /*************************************************************************** Set the internal state of the GORB to accomodate the given preferred size of the content area. ***************************************************************************/ void GORB::SetDxpDyp(long dxpPref, long dypPref) { AssertThis(0); AssertIn(dxpPref, 0, kcbMax); AssertIn(dypPref, 0, kcbMax); // GORB's are not resizeable, so we do nothing } /*************************************************************************** Get the natural rectangle. ***************************************************************************/ void GORB::GetRc(RC *prc) { AssertThis(0); AssertVarMem(prc); PMBMP pmbmp; if (pvNil != (pmbmp = (PMBMP)_pcrf->PbacoFetch(_ctg, _cno, MBMP::FReadMbmp))) { AssertPo(pmbmp, 0); pmbmp->GetRc(prc); ReleasePpo(&pmbmp); } else { Warn("Couldn't load kidspace bitmap"); prc->Zero(); } } /*************************************************************************** Get the interior content rectangle. ***************************************************************************/ void GORB::GetRcContent(RC *prc) { AssertThis(0); AssertVarMem(prc); GetRc(prc); prc->OffsetToOrigin(); } /*************************************************************************** The streaming property is being set or reset. If streaming is set, we should flush our stuff from the RCA cache when we're done with it. ***************************************************************************/ void GORB::Stream(bool fStream) { AssertThis(0); _fStream = FPure(fStream); } /*************************************************************************** Create a new tile representation. ***************************************************************************/ PGORT GORT::PgortNew(PGOK pgok, PCRF pcrf, CTG ctg, CNO cno) { AssertPo(pgok, 0); AssertPo(pcrf, 0); GOTIL gotil; PCFL pcfl; BLCK blck; PGORT pgort; KID kid; pcfl = pcrf->Pcfl(); if (!pcfl->FFind(ctg, cno, &blck) || !blck.FUnpackData() || blck.Cb() != size(GOTIL) || !blck.FRead(&gotil)) { Warn("couldn't load indicated tile chunk"); return pvNil; } if (kboOther == gotil.bo) SwapBytesRgsw(&gotil, size(gotil) / size(short)); #pragma warning(push) #pragma warning(disable : 4804) if (kboCur != gotil.bo || gotil.rgdxp[idzpLeftBorder] < 0 || gotil.rgdxp[idzpRightBorder] < 0 || gotil.rgdxp[idzpLeft] < 0 || gotil.rgdxp[idzpRight] < 0 || gotil.rgdxp[idzpLeftFlex] < 0 || gotil.rgdxp[idzpRightFlex] < 0 || gotil.rgdxp[idzpLeftFlex] + gotil.rgdxp[idzpRightFlex] <= 0 || /* FIXME(bruxisma): This is comparing an integer with a boolean */ gotil.rgdxp[idzpLeftInc] < (gotil.rgdxp[idzpLeftFlex] > 0) || /* FIXME(bruxisma): This is comparing an integer with a boolean */ gotil.rgdxp[idzpRightInc] < (gotil.rgdxp[idzpRightFlex] > 0) || gotil.rgdxp[idzpLeftInc] > gotil.rgdxp[idzpLeftFlex] || gotil.rgdxp[idzpRightInc] > gotil.rgdxp[idzpRightFlex] || gotil.rgdyp[idzpLeftBorder] < 0 || gotil.rgdyp[idzpRightBorder] < 0 || gotil.rgdyp[idzpLeft] < 0 || gotil.rgdyp[idzpRight] < 0 || gotil.rgdyp[idzpLeftFlex] < 0 || gotil.rgdyp[idzpRightFlex] < 0 || gotil.rgdyp[idzpLeftFlex] + gotil.rgdyp[idzpRightFlex] <= 0 || /* FIXME(bruxisma): This is comparing an integer with a boolean */ gotil.rgdyp[idzpLeftInc] < (gotil.rgdyp[idzpLeftFlex] > 0) || /* FIXME(bruxisma): This is comparing an integer with a boolean */ gotil.rgdyp[idzpRightInc] < (gotil.rgdyp[idzpRightFlex] > 0) || gotil.rgdyp[idzpLeftInc] > gotil.rgdyp[idzpLeftFlex] || gotil.rgdyp[idzpRightInc] > gotil.rgdyp[idzpRightFlex]) { Warn("Bad TILE chunk"); return pvNil; } #pragma warning(pop) if (!pcfl->FGetKidChidCtg(ctg, cno, 0, kctgMbmp, &kid)) { Warn("no child MBMP of TILE chunk"); return pvNil; } if (pvNil == (pgort = NewObj GORT)) return pvNil; CopyPb(gotil.rgdxp, pgort->_rgdxp, size(gotil.rgdxp)); CopyPb(gotil.rgdyp, pgort->_rgdyp, size(gotil.rgdyp)); pgort->_pcrf = pcrf; pgort->_pcrf->AddRef(); pgort->_ctg = kid.cki.ctg; pgort->_cno = kid.cki.cno; pgort->_dxp = pgort->_rgdxp[idzpLeft] + pgort->_rgdxp[idzpMid] + pgort->_rgdxp[idzpRight]; pgort->_dyp = pgort->_rgdyp[idzpLeft] + pgort->_rgdyp[idzpMid] + pgort->_rgdyp[idzpRight]; AssertPo(pgort, 0); return pgort; } /*************************************************************************** Destructor for a GORT. ***************************************************************************/ GORT::~GORT(void) { if (_fStream && pvNil != _pcrf && ctgNil != _ctg) _pcrf->FSetCrep(crepToss, _ctg, _cno, MBMP::FReadMbmp); ReleasePpo(&_pcrf); } /*************************************************************************** Draw the GORT. ***************************************************************************/ void GORT::Draw(PGNV pgnv, RC *prcClip) { AssertThis(0); AssertPo(pgnv, 0); AssertVarMem(prcClip); long ypLim, dyp; PMBMP pmbmp; RC rcRow; if (pvNil == (pmbmp = (PMBMP)_pcrf->PbacoFetch(_ctg, _cno, MBMP::FReadMbmp))) { Warn("Couldn't load kidspace bitmap"); return; } AssertPo(pmbmp, 0); dyp = 0; // draw the top row ypLim = _rgdyp[idzpLeft] + _dypLeftFlex; rcRow.Set(0, 0, _dxp, LwMin(ypLim, _rgdyp[idzpLeft] + _rgdyp[idzpLeftFlex])); _DrawRow(pgnv, pmbmp, &rcRow, prcClip, 0, dyp); // draw the top flex rows dyp -= _rgdyp[idzpLeft]; while (rcRow.ypBottom < ypLim) { rcRow.ypTop = rcRow.ypBottom; rcRow.ypBottom = LwMin(rcRow.ypTop + _rgdyp[idzpLeftFlex], ypLim); _DrawRow(pgnv, pmbmp, &rcRow, prcClip, 0, dyp); } // draw the middle row ypLim = rcRow.ypBottom + _rgdyp[idzpMid] + _dypRightFlex; rcRow.ypTop = rcRow.ypBottom; rcRow.ypBottom = LwMin(ypLim, rcRow.ypTop + _rgdyp[idzpMid] + _rgdyp[idzpRightFlex]); dyp -= _rgdyp[idzpLeftFlex]; _DrawRow(pgnv, pmbmp, &rcRow, prcClip, 0, dyp); // draw the bottom flex rows dyp -= _rgdyp[idzpMid]; while (rcRow.ypBottom < ypLim) { rcRow.ypTop = rcRow.ypBottom; rcRow.ypBottom = LwMin(rcRow.ypTop + _rgdyp[idzpRightFlex], ypLim); _DrawRow(pgnv, pmbmp, &rcRow, prcClip, 0, dyp); } // draw the bottom row rcRow.ypTop = rcRow.ypBottom; rcRow.ypBottom = _dyp; dyp -= _rgdyp[idzpRightFlex]; _DrawRow(pgnv, pmbmp, &rcRow, prcClip, 0, dyp); ReleasePpo(&pmbmp); } /*************************************************************************** Draw a row of the tiled bitmap. ***************************************************************************/ void GORT::_DrawRow(PGNV pgnv, PMBMP pmbmp, RC *prcRow, RC *prcClip, long dxp, long dyp) { AssertThis(0); AssertPo(pgnv, 0); AssertPo(pmbmp, 0); AssertVarMem(prcRow); AssertVarMem(prcClip); long xpLim; RC rcClip, rc, rcMbmp; if (!rcClip.FIntersect(prcRow, prcClip)) return; pmbmp->GetRc(&rcMbmp); // draw the left cell xpLim = prcRow->xpLeft + _rgdxp[idzpLeft] + _dxpLeftFlex; rc = *prcRow; rc.xpRight = LwMin(xpLim, rc.xpLeft + _rgdxp[idzpLeft] + _rgdxp[idzpLeftFlex]); dyp += rc.ypTop; if (rcClip.FIntersect(prcClip, &rc)) { pgnv->ClipRc(&rcClip); rcMbmp.Offset(rc.xpLeft + dxp - rcMbmp.xpLeft, dyp - rcMbmp.ypTop); pgnv->DrawMbmp(pmbmp, &rcMbmp); } // draw the left flex cells dxp -= _rgdxp[idzpLeft]; while (rc.xpRight < xpLim) { rc.xpLeft = rc.xpRight; rc.xpRight = LwMin(rc.xpLeft + _rgdxp[idzpLeftFlex], xpLim); if (rcClip.FIntersect(prcClip, &rc)) { pgnv->ClipRc(&rcClip); rcMbmp.Offset(rc.xpLeft + dxp - rcMbmp.xpLeft, dyp - rcMbmp.ypTop); pgnv->DrawMbmp(pmbmp, &rcMbmp); } } // draw the middle cell xpLim = rc.xpRight + _rgdxp[idzpMid] + _dxpRightFlex; rc.xpLeft = rc.xpRight; rc.xpRight = LwMin(xpLim, rc.xpLeft + _rgdxp[idzpMid] + _rgdxp[idzpRightFlex]); dxp -= _rgdxp[idzpLeftFlex]; if (rcClip.FIntersect(prcClip, &rc)) { pgnv->ClipRc(&rcClip); rcMbmp.Offset(rc.xpLeft + dxp - rcMbmp.xpLeft, dyp - rcMbmp.ypTop); pgnv->DrawMbmp(pmbmp, &rcMbmp); } // draw the right flex cells dxp -= _rgdxp[idzpMid]; while (rc.xpRight < xpLim) { rc.xpLeft = rc.xpRight; rc.xpRight = LwMin(rc.xpLeft + _rgdxp[idzpRightFlex], xpLim); if (rcClip.FIntersect(prcClip, &rc)) { pgnv->ClipRc(&rcClip); rcMbmp.Offset(rc.xpLeft + dxp - rcMbmp.xpLeft, dyp - rcMbmp.ypTop); pgnv->DrawMbmp(pmbmp, &rcMbmp); } } // draw the right cell rc.xpLeft = rc.xpRight; rc.xpRight = prcRow->xpRight; dxp -= _rgdxp[idzpRightFlex]; if (rcClip.FIntersect(prcClip, &rc)) { pgnv->ClipRc(&rcClip); rcMbmp.Offset(rc.xpLeft + dxp - rcMbmp.xpLeft, dyp - rcMbmp.ypTop); pgnv->DrawMbmp(pmbmp, &rcMbmp); } } /*************************************************************************** Do hit testing on a tiled bitmap. ***************************************************************************/ bool GORT::FPtIn(long xp, long yp) { AssertThis(0); PMBMP pmbmp; RC rc; bool fRet; if (!FIn(xp, 0, _dxp) || !FIn(yp, 0, _dyp)) return fFalse; if (pvNil == (pmbmp = (PMBMP)_pcrf->PbacoFetch(_ctg, _cno, MBMP::FReadMbmp))) { Warn("Couldn't load kidspace bitmap"); return fTrue; } AssertPo(pmbmp, 0); _MapZpToMbmp(&xp, _rgdxp, _dxpLeftFlex, _dxpRightFlex); _MapZpToMbmp(&yp, _rgdyp, _dypLeftFlex, _dypRightFlex); pmbmp->GetRc(&rc); fRet = pmbmp->FPtIn(xp + rc.xpLeft, yp + rc.ypTop); ReleasePpo(&pmbmp); return fRet; } /*************************************************************************** Map the point from flexed coordinates to zero based mbmp coordinates for hit testing. ***************************************************************************/ void GORT::_MapZpToMbmp(long *pzp, short *prgdzp, long dzpLeftFlex, long dzpRightFlex) { AssertThis(0); AssertVarMem(pzp); AssertPvCb(prgdzp, LwMul(idzpLimGort, size(short))); long dzp; if (*pzp < (dzp = prgdzp[idzpLeft])) ; else if (*pzp < dzp + dzpLeftFlex) *pzp = (*pzp - dzp) % prgdzp[idzpLeftFlex] + dzp; else if ((*pzp += prgdzp[idzpLeftFlex] - dzpLeftFlex) < (dzp += prgdzp[idzpLeftFlex] + prgdzp[idzpMid])) { } else if (*pzp < dzp + dzpRightFlex) *pzp = (*pzp - dzp) % prgdzp[idzpRightFlex] + dzp; else *pzp += prgdzp[idzpRightFlex] - dzpRightFlex; } /*************************************************************************** Set the internal state of the GORT to accomodate the given preferred size of the content area. ***************************************************************************/ void GORT::SetDxpDyp(long dxpPref, long dypPref) { AssertThis(0); AssertIn(dxpPref, 0, kcbMax); AssertIn(dypPref, 0, kcbMax); dxpPref += _rgdxp[idzpLeftBorder] + _rgdxp[idzpRightBorder]; dypPref += _rgdyp[idzpLeftBorder] + _rgdyp[idzpRightBorder]; _ComputeFlexZp(&_dxpLeftFlex, &_dxpRightFlex, dxpPref, _rgdxp); _ComputeFlexZp(&_dypLeftFlex, &_dypRightFlex, dypPref, _rgdyp); _dxp = _dxpLeftFlex + _dxpRightFlex + _rgdxp[idzpLeft] + _rgdxp[idzpMid] + _rgdxp[idzpRight]; _dyp = _dypLeftFlex + _dypRightFlex + _rgdyp[idzpLeft] + _rgdyp[idzpMid] + _rgdyp[idzpRight]; } /*************************************************************************** Compute the flex values in one direction. ***************************************************************************/ void GORT::_ComputeFlexZp(long *pdzpLeftFlex, long *pdzpRightFlex, long dzp, short *prgdzp) { AssertThis(0); AssertVarMem(pdzpLeftFlex); AssertVarMem(pdzpRightFlex); AssertPvCb(prgdzp, LwMul(idzpLimGort, size(short))); *pdzpRightFlex = LwMax(0, dzp - prgdzp[idzpLeft] - prgdzp[idzpMid] - prgdzp[idzpRight]); *pdzpLeftFlex = LwMulDiv(*pdzpRightFlex, prgdzp[idzpLeftFlex], prgdzp[idzpLeftFlex] + prgdzp[idzpRightFlex]); if (*pdzpLeftFlex > 0) { long dzpT = LwRoundToward(*pdzpLeftFlex, prgdzp[idzpLeftFlex]); *pdzpLeftFlex = dzpT + LwMin(prgdzp[idzpLeftFlex], LwRoundAway(*pdzpLeftFlex - dzpT, prgdzp[idzpLeftInc])); } *pdzpRightFlex = LwMax(0, *pdzpRightFlex - *pdzpLeftFlex); if (*pdzpRightFlex > 0) { long dzpT = LwRoundToward(*pdzpRightFlex, prgdzp[idzpRightFlex]); *pdzpRightFlex = dzpT + LwMin(prgdzp[idzpRightFlex], LwRoundAway(*pdzpRightFlex - dzpT, prgdzp[idzpRightInc])); } } /*************************************************************************** Get the bounding rectangle for the tiled bitmap. ***************************************************************************/ void GORT::GetRc(RC *prc) { AssertThis(0); AssertVarMem(prc); RC rc; PT pt; PMBMP pmbmp; prc->Set(0, 0, _dxp, _dyp); if (pvNil == (pmbmp = (PMBMP)_pcrf->PbacoFetch(_ctg, _cno, MBMP::FReadMbmp))) { Warn("Couldn't load kidspace bitmap"); return; } AssertPo(pmbmp, 0); pmbmp->GetRc(&rc); ReleasePpo(&pmbmp); pt.xp = -rc.xpLeft; pt.yp = -rc.ypTop; // map the point from the MBMP to the flexed rectangle, scaling // proportionally if the point is in a flex portion of the MBMP _MapZpFlex(&pt.xp, _rgdxp, _dxpLeftFlex, _dxpRightFlex); _MapZpFlex(&pt.yp, _rgdyp, _dypLeftFlex, _dypRightFlex); // now make pt the registration point prc->Offset(-pt.xp, -pt.yp); } /*************************************************************************** Map the point from MBMP coordinates to flexed coordinates for setting the registration point. WARNING: this is not the inverse of _MapZpToMbmp. ***************************************************************************/ void GORT::_MapZpFlex(long *pzp, short *prgdzp, long dzpLeftFlex, long dzpRightFlex) { AssertThis(0); AssertVarMem(pzp); AssertPvCb(prgdzp, LwMul(idzpLimGort, size(short))); long dzp; if (*pzp < (dzp = prgdzp[idzpLeft])) ; else if (*pzp < dzp + prgdzp[idzpLeftFlex]) *pzp = LwMulDiv(*pzp - dzp, dzpLeftFlex, prgdzp[idzpLeftFlex]) + dzp; else if ((*pzp += dzpLeftFlex - prgdzp[idzpLeftFlex]) < (dzp += dzpLeftFlex + prgdzp[idzpMid])) { } else if (*pzp < dzp + prgdzp[idzpRightFlex]) *pzp = LwMulDiv(*pzp - dzp, dzpRightFlex, prgdzp[idzpRightFlex]) + dzp; else *pzp += dzpRightFlex - prgdzp[idzpRightFlex]; } /*************************************************************************** Get the interior content rectangle. ***************************************************************************/ void GORT::GetRcContent(RC *prc) { AssertThis(0); AssertVarMem(prc); prc->xpLeft = _rgdxp[idzpLeftBorder]; prc->xpRight = _dxp - _rgdxp[idzpRightBorder]; prc->ypTop = _rgdyp[idzpLeftBorder]; prc->ypBottom = _dyp - _rgdyp[idzpRightBorder]; } /*************************************************************************** The streaming property is being set or reset. If streaming is set, we should flush our stuff from the RCA cache when we're done with it. ***************************************************************************/ void GORT::Stream(bool fStream) { AssertThis(0); _fStream = FPure(fStream); } /*************************************************************************** Static method to create a new video representation. ***************************************************************************/ PGORV GORV::PgorvNew(PGOK pgok, PCRF pcrf, CTG ctg, CNO cno) { AssertPo(pgok, 0); AssertPo(pcrf, 0); PGORV pgorv; if (pvNil == (pgorv = NewObj GORV)) return pvNil; if (!pgorv->_FInit(pgok, pcrf, ctg, cno)) { ReleasePpo(&pgorv); return pvNil; } AssertPo(pgorv, 0); return pgorv; } /*************************************************************************** Initialize the GORV - load the movie indicated byt (pcrf, ctg, cno). ***************************************************************************/ bool GORV::_FInit(PGOK pgok, PCRF pcrf, CTG ctg, CNO cno) { AssertPo(pgok, 0); AssertBaseThis(0); PCFL pcfl; BLCK blck; STN stn; FNI fni; RC rc; byte bT; pcfl = pcrf->Pcfl(); if (!pcfl->FFind(ctg, cno, &blck) || !blck.FUnpackData() || blck.Cb() < 2 || !blck.FReadRgb(&bT, 1, 0) || !stn.FRead(&blck, 1)) { goto LFail; } if (!pgok->Pwoks()->FFindFile(&stn, &fni) || pvNil == (_pgvid = GVID::PgvidNew(&fni, pgok, bT))) { LFail: Warn("couldn't load indicated video"); return fFalse; } _pgvid->GetRc(&rc); _dxp = rc.Dxp(); _dyp = rc.Dyp(); _fHwndBased = FPure(bT); return fTrue; } /*************************************************************************** Destructor for a video representation. ***************************************************************************/ GORV::~GORV(void) { ReleasePpo(&_pgvid); } /*************************************************************************** Draw the frame. ***************************************************************************/ void GORV::Draw(PGNV pgnv, RC *prcClip) { AssertThis(0); AssertPo(pgnv, 0); RC rc(0, 0, _dxp, _dyp); _pgvid->Draw(pgnv, &rc); } /*************************************************************************** Return whether the point is in the representation. ***************************************************************************/ bool GORV::FPtIn(long xp, long yp) { AssertThis(0); return FIn(xp, 0, _dxp) && FIn(yp, 0, _dyp); } /*************************************************************************** Set the internal state of the GORF to accomodate the given preferred size of the content area. ***************************************************************************/ void GORV::SetDxpDyp(long dxpPref, long dypPref) { AssertThis(0); AssertIn(dxpPref, 0, kcbMax); AssertIn(dypPref, 0, kcbMax); RC rc; _pgvid->GetRc(&rc); if ((_dxp = dxpPref) == 0) _dxp = rc.Dxp(); if ((_dyp = dypPref) == 0) _dyp = rc.Dyp(); } /*************************************************************************** Get the natural rectangle. ***************************************************************************/ void GORV::GetRc(RC *prc) { AssertThis(0); AssertVarMem(prc); prc->Set(0, 0, _dxp, _dyp); } /*************************************************************************** Get the interior content rectangle. ***************************************************************************/ void GORV::GetRcContent(RC *prc) { AssertThis(0); AssertVarMem(prc); prc->Set(0, 0, _dxp, _dyp); } /*************************************************************************** Return the length of the video. ***************************************************************************/ long GORV::NfrMac(void) { AssertThis(0); return _pgvid->NfrMac(); } /*************************************************************************** Return the current frame of the video. ***************************************************************************/ long GORV::NfrCur(void) { AssertThis(0); return _pgvid->NfrCur(); } /*************************************************************************** Goto a particular frame. ***************************************************************************/ void GORV::GotoNfr(long nfr) { AssertThis(0); _pgvid->GotoNfr(nfr); } /*************************************************************************** Return whether the video is playing. ***************************************************************************/ bool GORV::FPlaying(void) { AssertThis(0); return (_cactSuspend > 0 && _fPlayOnResume) || _pgvid->FPlaying(); } /*************************************************************************** Play from the current frame to the end. ***************************************************************************/ bool GORV::FPlay(void) { AssertThis(0); RC rc(0, 0, _dxp, _dyp); if (_cactSuspend > 0 && _fHwndBased) rc.Zero(); return _pgvid->FPlay(&rc); } /*************************************************************************** Stop playing. ***************************************************************************/ void GORV::Stop(void) { AssertThis(0); _pgvid->Stop(); } /*************************************************************************** Suspend the video. ***************************************************************************/ void GORV::Suspend(void) { AssertThis(0); if (0 == _cactSuspend++) { _fPlayOnResume = FPure(_pgvid->FPlaying()); _pgvid->Stop(); if (_fHwndBased) { RC rc(0, 0, 0, 0); _pgvid->SetRcPlay(&rc); } } } /*************************************************************************** Resume the video. ***************************************************************************/ void GORV::Resume(void) { AssertThis(0); if (0 == --_cactSuspend && _fPlayOnResume) { FPlay(); _fPlayOnResume = fFalse; } } #ifdef DEBUG /*************************************************************************** Assert the validity of a GORV. ***************************************************************************/ void GORV::AssertValid(ulong grf) { GORV_PAR::AssertValid(0); AssertPo(_pgvid, 0); } /*************************************************************************** Mark memory for the GORV. ***************************************************************************/ void GORV::MarkMem(void) { AssertValid(0); GORV_PAR::MarkMem(); MarkMemObj(_pgvid); } #endif // DEBUG ================================================ FILE: kauai/src/kidspace.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Kidspace class declarations ***************************************************************************/ #ifndef KIDSPACE_H #define KIDSPACE_H #define ChidFromSnoDchid(sno, dchid) LwHighLow((short)(sno), (short)(dchid)) /*************************************************************************** Graphical object representation. A bitmap, fill, tiled bitmap, etc. ***************************************************************************/ typedef class GORP *PGORP; #define GORP_PAR BASE #define kclsGORP 'GORP' class GORP : public GORP_PAR { RTCLASS_DEC protected: GORP(void) { } public: virtual void Draw(PGNV pgnv, RC *prcClip) = 0; virtual bool FPtIn(long xp, long yp) = 0; virtual void SetDxpDyp(long dxpPref, long dypPref) = 0; virtual void GetRc(RC *prc) = 0; virtual void GetRcContent(RC *prc) = 0; virtual long NfrMac(void); virtual long NfrCur(void); virtual void GotoNfr(long nfr); virtual bool FPlaying(void); virtual bool FPlay(void); virtual void Stop(void); virtual void Suspend(void); virtual void Resume(void); virtual void Stream(bool fStream); }; /*************************************************************************** Graphical object fill representation. ***************************************************************************/ typedef class GORF *PGORF; #define GORF_PAR GORP #define kclsGORF 'GORF' class GORF : public GORF_PAR { RTCLASS_DEC protected: ACR _acrFore; ACR _acrBack; APT _apt; RC _rc; long _dxp; long _dyp; public: static PGORF PgorfNew(PGOK pgok, PCRF pcrf, CTG ctg, CNO cno); virtual void Draw(PGNV pgnv, RC *prcClip); virtual bool FPtIn(long xp, long yp); virtual void SetDxpDyp(long dxpPref, long dypPref); virtual void GetRc(RC *prc); virtual void GetRcContent(RC *prc); }; /*************************************************************************** Graphical object bitmap representation. ***************************************************************************/ typedef class GORB *PGORB; #define GORB_PAR GORP #define kclsGORB 'GORB' class GORB : public GORB_PAR { RTCLASS_DEC protected: PCRF _pcrf; CTG _ctg; CNO _cno; bool _fStream; ~GORB(void); public: static PGORB PgorbNew(PGOK pgok, PCRF pcrf, CTG ctg, CNO cno); virtual void Draw(PGNV pgnv, RC *prcClip); virtual bool FPtIn(long xp, long yp); virtual void SetDxpDyp(long dxpPref, long dypPref); virtual void GetRc(RC *prc); virtual void GetRcContent(RC *prc); virtual void Stream(bool fStream); }; /*************************************************************************** Graphical object tiled bitmap representation. ***************************************************************************/ enum { idzpLeftBorder, idzpRightBorder, idzpLeft, idzpLeftFlex, idzpLeftInc, idzpMid, idzpRightFlex, idzpRightInc, idzpRight, idzpLimGort }; typedef class GORT *PGORT; #define GORT_PAR GORP #define kclsGORT 'GORT' class GORT : public GORT_PAR { RTCLASS_DEC protected: // a TILE chunk struct GOTIL { short bo; short osk; short rgdxp[idzpLimGort]; short rgdyp[idzpLimGort]; }; PCRF _pcrf; CTG _ctg; CNO _cno; short _rgdxp[idzpLimGort]; short _rgdyp[idzpLimGort]; long _dxpLeftFlex; long _dxpRightFlex; long _dypLeftFlex; long _dypRightFlex; long _dxp; // the total width long _dyp; // the total height bool _fStream; ~GORT(void); void _DrawRow(PGNV pgnv, PMBMP pmbmp, RC *prcRow, RC *prcClip, long dxp, long dyp); void _ComputeFlexZp(long *pdzpLeftFlex, long *pdzpRightFlex, long dzp, short *prgdzp); void _MapZpToMbmp(long *pzp, short *prgdzp, long dzpLeftFlex, long dzpRightFlex); void _MapZpFlex(long *pzp, short *prgdzp, long dzpLeftFlex, long dzpRightFlex); public: static PGORT PgortNew(PGOK pgok, PCRF pcrf, CTG ctg, CNO cno); virtual void Draw(PGNV pgnv, RC *prcClip); virtual bool FPtIn(long xp, long yp); virtual void SetDxpDyp(long dxpPref, long dypPref); virtual void GetRc(RC *prc); virtual void GetRcContent(RC *prc); virtual void Stream(bool fStream); }; /*************************************************************************** Graphical object video representation. ***************************************************************************/ typedef class GORV *PGORV; #define GORV_PAR GORP #define kclsGORV 'GORV' class GORV : public GORV_PAR { RTCLASS_DEC ASSERT MARKMEM protected: PGVID _pgvid; long _dxp; long _dyp; long _cactSuspend; bool _fHwndBased : 1; bool _fPlayOnResume : 1; ~GORV(void); virtual bool _FInit(PGOK pgok, PCRF pcrf, CTG ctg, CNO cno); public: static PGORV PgorvNew(PGOK pgok, PCRF pcrf, CTG ctg, CNO cno); virtual void Draw(PGNV pgnv, RC *prcClip); virtual bool FPtIn(long xp, long yp); virtual void SetDxpDyp(long dxpPref, long dypPref); virtual void GetRc(RC *prc); virtual void GetRcContent(RC *prc); virtual long NfrMac(void); virtual long NfrCur(void); virtual void GotoNfr(long nfr); virtual bool FPlaying(void); virtual bool FPlay(void); virtual void Stop(void); virtual void Suspend(void); virtual void Resume(void); }; /*************************************************************************** These are the mouse tracking states for kidspace gobs. gmsNil is an illegal state used in the tables to signal that we should assert. In the lists below, tracking indicates that when in the state, we are tracking the mouse. These are static states: kgmsIdle (mouse is not over us, _not_ tracking) kgmsOn (mouse is over us, _not_ tracking) kgmsDownOn (mouse is over us, tracking) kgmsDownOff (mouse isn't over us, tracking) These are auto-advance states (only animations are allowed): kgmsEnterState (entering the state, _not_ tracking) kgmsRollOn (mouse rolled onto us, _not_ tracking) kgmsRollOff (mouse rolled off of us, _not_ tracking) kgmsPressOn (mouse down on us, tracking) kgmsReleaseOn (mouse up on us, tracking) kgmsDragOff (mouse rolled off us, tracking) kgmsDragOn (mouse rolled on us, tracking) kgmsReleaseOff (mouse was released off us, _not_ tracking) There is one special state: kgmsWait (tracking). This indicates that we've completed a kgmsReleaseOn and are waiting for a cidClicked command or a cidTrackMouse command to come through. If the former comes through, we handle the click, stop tracking and advance to kgmsOn. If the latter, the cidClicked was filtered out by someone else, so we stop tracking and goto kgmsOn. ***************************************************************************/ enum { gmsNil, // non-tracking states kgmsEnterState, kgmsIdle, kgmsRollOn, kgmsRollOff, kgmsOn, kgmsReleaseOff, // tracking states kgmsMinTrack, kgmsPressOn = kgmsMinTrack, kgmsReleaseOn, kgmsDownOn, kgmsDragOff, kgmsDragOn, kgmsDownOff, kgmsWait, kgmsLimTrack, kgmsLim = kgmsLimTrack }; /*************************************************************************** Graphic Object in Kidspace. Because of script invocation, the GOK may be destroyed in just about every method of the GOK. So most methods return a boolean indicating whether the GOK still exists. ***************************************************************************/ enum { fgokNil = 0, fgokKillAnim = 1, // kill current animation fgokNoAnim = 2, // don't launch an animation fgokReset = 4, // if the current rep is requested, totally reset it fgokMouseSound = 8, // set the mouse sound as well }; typedef class GOK *PGOK; #define GOK_PAR GOB #define kclsGOK 'GOK' class GOK : public GOK_PAR { RTCLASS_DEC ASSERT MARKMEM CMD_MAP_DEC(GOK) protected: long _dxp; // offset from top-left to the registration point long _dyp; long _zp; // z-coord (for placing GOK's relative to this one) long _dxpPref; // preferred size (if non-zero) long _dypPref; PWOKS _pwoks; // the kidspace world that this GOK belongs to PRCA _prca; // Chunky resource chain PCRF _pcrf; // Chunky resource file short _sno; // state number short _cactMouse; // mouse click count of last mouse down ulong _grfcust; // cursor state at last mouse down long _gmsCur; // gob mouse tracking state bool _fRect : 1; // whether to use rectangular hit testing exclusively bool _fNoHit : 1; // invisible to the mouse bool _fNoHitKids : 1; // children of this GOK are invisible to the mouse bool _fNoSlip : 1; // animations shouldn't slip bool _fGorpDirty : 1; // whether the GORP changed while deferred bool _fMouseSndDirty : 1; // whether playing the mouse sound was deferred bool _fStream : 1; // once we switch reps, we won't use this one again long _cactDeferGorp; // defer marking and positioning the gorp PGORP _pgorp; // the graphical representation CKI _ckiGorp; // cki of the current gorp long _dtim; // current time increment for animation PSCEG _pscegAnim; // animation script CHID _chidAnim; // chid of current animation PGOKD _pgokd; long _siiSound; // sound to kill when we go away long _siiMouse; // mouse tracking sound - kill it when we go away CKI _ckiMouseSnd; // for deferred playing of the mouse sound long _cactDeferSnd; // defer starting the mouse sound if this is > 0 // cid/hid filtering struct CMFLT { long cid; long hid; CHID chidScript; }; PGL _pglcmflt; // list of cmd filtering structs, sorted by cid long _hidToolTipSrc; // get the tool tip info from this GOK GOK(GCB *pgcb); ~GOK(void); static PGOB _PgobBefore(PGOB pgobPar, long zp); virtual bool _FInit(PWOKS pwoks, PGOKD pgokd, PRCA prca); virtual bool _FInit(PWOKS pwoks, CNO cno, PRCA prca); virtual bool _FAdjustGms(struct GMSE *pmpgmsgmse); virtual bool _FSetGmsCore(long gms, ulong grfact, bool *pfStable); virtual bool _FSetGms(long gms, ulong grfact); virtual bool _FEnterState(long sno); virtual bool _FSetRep(CHID chid, ulong grfgok = fgokKillAnim, CTG ctg = ctgNil, long dxp = 0, long dyp = 0, bool *pfSet = pvNil); virtual bool _FAdvanceFrame(void); virtual void _SetGorp(PGORP pgorp, long dxp, long dyp); virtual PGORP _PgorpNew(PCRF pcrf, CTG ctg, CNO cno); bool _FFindCmflt(long cid, long hid, CMFLT *pcmflt = pvNil, long *picmflt = pvNil); bool _FFilterCmd(PCMD pcmd, CHID chidScript, bool *pfFilter); void _PlayMouseSound(CHID chid); CNO _CnoToolTip(void); CHID _ChidMouse(void); void _DeferGorp(bool fDefer); void _DeferSnd(bool fDefer); public: static PGOK PgokNew(PWOKS pwoks, PGOB pgobPar, long hid, PGOKD pgokd, PRCA prca); PWOKS Pwoks(void) { return _pwoks; } long Sno(void) { return _sno; } void GetPtReg(PT *ppt, long coo = cooParent); void GetRcContent(RC *prc); long ZPlane(void) { return _zp; } void SetZPlane(long zp); void SetNoSlip(bool fNoSlip); void SetHidToolTip(long hidSrc); virtual void SetCursor(ulong grfcust); virtual bool FPtIn(long xp, long yp); virtual bool FPtInBounds(long xp, long yp); virtual void Draw(PGNV pgnv, RC *prcClip); virtual bool FCmdTrackMouse(PCMD_MOUSE pcmd); virtual bool FCmdAlarm(PCMD pcmd); virtual bool FCmdMouseMove(PCMD_MOUSE pcmd); virtual bool FCmdClicked(PCMD_MOUSE pcmd); bool FCmdClickedCore(PCMD pcmd) { return FCmdClicked((PCMD_MOUSE)pcmd); } virtual bool FCmdAll(PCMD pcmd); virtual bool FFilterCidHid(long cid, long hid, CHID chidScript); virtual bool FEnsureToolTip(PGOB *ppgobCurTip, long xpMouse, long ypMouse); virtual long LwState(void); virtual bool FRunScript(CHID chid, long *prglw = pvNil, long clw = 0, long *plwReturn = pvNil, tribool *ptSuccess = pvNil); virtual bool FRunScriptCno(CNO cno, long *prglw = pvNil, long clw = 0, long *plwReturn = pvNil, tribool *ptSuccess = pvNil); virtual bool FChangeState(long sno); virtual bool FSetRep(CHID chid, ulong grfgok = fgokKillAnim, CTG ctg = ctgNil, long dxp = 0, long dyp = 0, ulong dtim = 0); virtual bool FPlay(void); virtual bool FPlaying(void); virtual void Stop(void); virtual void GotoNfr(long nfr); virtual long NfrMac(void); virtual long NfrCur(void); virtual long SiiPlaySound(CTG ctg, CNO cno, long sqn, long vlm, long cactPlay, ulong dtsStart, long spr, long scl); virtual long SiiPlayMouseSound(CTG ctg, CNO cno); virtual void Suspend(void); virtual void Resume(void); virtual void Stream(bool fStream); }; #endif //! KIDSPACE_H ================================================ FILE: kauai/src/kidworld.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Copyright (c) Microsoft Corporation This is a class that knows how to create GOKs, Help Balloons and Kidspace script interpreters. It exists so an app can customize default behavior. ***************************************************************************/ #include "kidframe.h" ASSERTNAME RTCLASS(GOKD) RTCLASS(GKDS) RTCLASS(WOKS) /*************************************************************************** Static method to read a GKDS from the CRF. This is a CRF object reader. ***************************************************************************/ bool GKDS::FReadGkds(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb) { PGKDS pgkds; GOKDF gokdf; HQ hq; LOP *qlop; long cb; *pcb = pblck->Cb(fTrue); if (pvNil == ppbaco) return fTrue; if (!pblck->FUnpackData()) return fFalse; *pcb = pblck->Cb(); if (*pcb < size(GOKDF) + size(LOP) || CbRoundToLong(*pcb) != *pcb) { Bug("Bad GOKD"); return fFalse; } if (!pblck->FReadRgb(&gokdf, size(GOKDF), 0)) return fFalse; if (gokdf.bo == kboOther) SwapBytesBom(&gokdf, kbomGokdf); else if (gokdf.bo != kboCur) { Bug("Bad GOKD 2"); return fFalse; } if (!pblck->FMoveMin(size(gokdf))) return fFalse; hq = pblck->HqFree(); if (hqNil == hq) return fFalse; cb = CbOfHq(hq); if (pvNil == (pgkds = NewObj GKDS)) { FreePhq(&hq); return fFalse; } pgkds->_hqData = hq; pgkds->_gokk = gokdf.gokk; if (gokdf.bo == kboOther) SwapBytesRglw(QvFromHq(hq), cb / size(long)); qlop = (LOP *)QvFromHq(hq); for (pgkds->_clop = 0;; qlop++) { if (cb < size(LOP)) { Bug("Bad LOP list in GOKD"); ReleasePpo(&pgkds); return fFalse; } pgkds->_clop++; cb -= size(LOP); if (hidNil == qlop->hidPar) break; } if ((cb % size(CUME)) != 0) { Bug("Bad CUME list in GOKD"); ReleasePpo(&pgkds); return fFalse; } pgkds->_ccume = cb / size(CUME); *ppbaco = pgkds; return fTrue; } /*************************************************************************** Destructor for a GKDS object. ***************************************************************************/ GKDS::~GKDS(void) { FreePhq(&_hqData); } #ifdef DEBUG /*************************************************************************** Assert the validity of a GKDS. ***************************************************************************/ void GKDS::AssertValid(ulong grf) { LOP *qrglop; GKDS_PAR::AssertValid(0); AssertHq(_hqData); AssertIn(_clop, 0, kcbMax); AssertIn(_ccume, 0, kcbMax); Assert(LwMul(_clop, size(LOP)) + LwMul(_ccume, size(CUME)) == CbOfHq(_hqData), "GKDS _hqData wrong size"); qrglop = (LOP *)QvFromHq(_hqData); Assert(qrglop[_clop - 1].hidPar == hidNil, "bad rglop in GKDS"); } /*************************************************************************** Mark memory for the GKDS. ***************************************************************************/ void GKDS::MarkMem(void) { AssertValid(0); GKDS_PAR::MarkMem(); MarkHq(_hqData); } #endif // DEBUG /*************************************************************************** Return the GOK kind id. ***************************************************************************/ long GKDS::Gokk(void) { AssertThis(0); return _gokk; } /*************************************************************************** Look for a cursor map entry in this GKDS. ***************************************************************************/ bool GKDS::FGetCume(ulong grfcust, long sno, CUME *pcume) { AssertThis(0); AssertVarMem(pcume); CUME *qcume; long ccume; ulong fbitSno = (1L << (sno & 0x1F)); if (0 == _ccume) return fFalse; qcume = (CUME *)PvAddBv(QvFromHq(_hqData), LwMul(_clop, size(LOP))); for (ccume = _ccume; ccume > 0; ccume--, qcume++) { if ((qcume->grfbitSno & fbitSno) && (qcume->grfcustMask & grfcust) == qcume->grfcust) { *pcume = *qcume; return fTrue; } } TrashVar(pcume); return fFalse; } /*************************************************************************** Get the location map entry from the parent id. ***************************************************************************/ void GKDS::GetLop(long hidPar, LOP *plop) { AssertThis(0); AssertVarMem(plop); LOP *qlop; for (qlop = (LOP *)QvFromHq(_hqData);; qlop++) { if (hidNil == qlop->hidPar || hidPar == qlop->hidPar) break; } *plop = *qlop; } /*************************************************************************** Constructor for a World of Kidspace GOB. ***************************************************************************/ WOKS::WOKS(GCB *pgcb, PSTRG pstrg) : WOKS_PAR(pgcb), _clokAnim(CMH::HidUnique()), _clokNoSlip(CMH::HidUnique(), fclokNoSlip), _clokGen(CMH::HidUnique()), _clokReset(CMH::HidUnique(), fclokReset) { AssertThis(0); AssertNilOrPo(pstrg, 0); if (pvNil == pstrg) pstrg = &_strg; _pstrg = pstrg; _pstrg->AddRef(); _clokAnim.Start(0); _clokNoSlip.Start(0); _clokGen.Start(0); _clokReset.Start(0); } /*************************************************************************** Destructor for a kidspace world. ***************************************************************************/ WOKS::~WOKS(void) { ReleasePpo(&_pstrg); } #ifdef DEBUG /*************************************************************************** Assert the validity of a WOKS. ***************************************************************************/ void WOKS::AssertValid(ulong grf) { WOKS_PAR::AssertValid(0); AssertPo(&_strg, 0); } /*************************************************************************** Mark memory for the WOKS. ***************************************************************************/ void WOKS::MarkMem(void) { AssertValid(0); WOKS_PAR::MarkMem(); MarkMemObj(&_strg); } #endif // DEBUG /*************************************************************************** Return whether the GOB is in this kidspace world. ***************************************************************************/ bool WOKS::FGobIn(PGOB pgob) { AssertThis(0); AssertPo(pgob, 0); for (; pgob != this; pgob = pgob->PgobPar()) { if (pgob == pvNil) return fFalse; } return fTrue; } /*************************************************************************** Get a GOKD from the given chunk. ***************************************************************************/ PGOKD WOKS::PgokdFetch(CTG ctg, CNO cno, PRCA prca) { AssertThis(0); AssertPo(prca, 0); return (PGOKD)prca->PbacoFetch(ctg, cno, GKDS::FReadGkds); } /*************************************************************************** Create a new gob in this kidspace world. ***************************************************************************/ PGOK WOKS::PgokNew(PGOB pgobPar, long hid, CNO cnoGokd, PRCA prca) { AssertThis(0); AssertNilOrPo(pgobPar, 0); PGOKD pgokd; PGOK pgok; if (pgobPar == pvNil) pgobPar = this; else if (!FGobIn(pgobPar)) { // parent isn't in this kidspace world Bug("Parent is not in this kidspace world"); return pvNil; } if (hidNil == hid) hid = CMH::HidUnique(); else if (pvNil != PcmhFromHid(hid)) { BugVar("command handler with this ID already exists", &hid); return pvNil; } if (pvNil == (pgokd = PgokdFetch(kctgGokd, cnoGokd, prca))) return pvNil; pgok = GOK::PgokNew(this, pgobPar, hid, pgokd, prca); ReleasePpo(&pgokd); return pgok; } /*************************************************************************** Create a new script interpreter for this kidspace world. ***************************************************************************/ PSCEG WOKS::PscegNew(PRCA prca, PGOB pgob) { AssertThis(0); AssertPo(prca, 0); AssertPo(pgob, 0); return NewObj SCEG(this, prca, pgob); } /*************************************************************************** Create a new help balloon. ***************************************************************************/ PHBAL WOKS::PhbalNew(PGOB pgobPar, PRCA prca, CNO cnoTopic, PHTOP phtop) { AssertThis(0); AssertNilOrPo(pgobPar, 0); AssertPo(prca, 0); AssertNilOrVarMem(phtop); if (pgobPar == pvNil) pgobPar = this; else if (!FGobIn(pgobPar)) { // parent isn't in this kidspace world Bug("Parent is not in this kidspace world"); return pvNil; } return HBAL::PhbalCreate(this, pgobPar, prca, cnoTopic, phtop); } /*************************************************************************** Get the command handler for this hid. ***************************************************************************/ PCMH WOKS::PcmhFromHid(long hid) { AssertThis(0); PCMH pcmh; switch (hid) { case hidNil: return pvNil; case khidApp: return vpappb; } if (pvNil != (pcmh = PclokFromHid(hid))) return pcmh; return PgobFromHid(hid); } /*************************************************************************** Get the clock having the given hid. ***************************************************************************/ PCLOK WOKS::PclokFromHid(long hid) { AssertThis(0); if (khidClokGokGen == hid) return &_clokGen; if (khidClokGokReset == hid) return &_clokReset; return CLOK::PclokFromHid(hid); } /*************************************************************************** Get the parent gob of the given gob. This is here so a kidspace world can limit what scripts can get to. ***************************************************************************/ PGOB WOKS::PgobParGob(PGOB pgob) { AssertThis(0); AssertPo(pgob, 0); pgob = pgob->PgobPar(); if (pvNil == pgob || !FGobIn(pgob)) return pvNil; return pgob; } /*************************************************************************** Find a file given a string. ***************************************************************************/ bool WOKS::FFindFile(PSTN pstnSrc, PFNI pfni) { AssertThis(0); AssertPo(pstnSrc, 0); AssertPo(pfni, 0); return pfni->FBuildFromPath(pstnSrc); } /*************************************************************************** Put up an alert (and don't return until it is dismissed). ***************************************************************************/ tribool WOKS::TGiveAlert(PSTN pstn, long bk, long cok) { AssertThis(0); return vpappb->TGiveAlertSz(pstn->Psz(), bk, cok); } /*************************************************************************** Put up an alert (and don't return until it is dismissed). ***************************************************************************/ void WOKS::Print(PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); // REVIEW shonk: implement WOKS::Print better #ifdef WIN OutputDebugString(pstn->Psz()); OutputDebugString(PszLit("\n")); #endif // WIN } /*************************************************************************** Return the current cursor state. This takes the frame cursor state from vpappb and the rest from this kidspace world. ***************************************************************************/ ulong WOKS::GrfcustCur(bool fAsynch) { AssertThis(0); return GrfcustAdjust(vpappb->GrfcustCur(fAsynch)); } /*************************************************************************** Modify the current cursor state. This sets the frame values in vpappb and the rest in this kidspace world. ***************************************************************************/ void WOKS::ModifyGrfcust(ulong grfcustOr, ulong grfcustXor) { AssertThis(0); // write all the bits to the app. Also adjust our internal _grfcust vpappb->ModifyGrfcust(grfcustOr, grfcustXor); _grfcust |= grfcustOr; _grfcust ^= grfcustXor; } /*************************************************************************** Adjust the given grfcust (take the Frame bits from it and combine with our other bits). ***************************************************************************/ ulong WOKS::GrfcustAdjust(ulong grfcust) { AssertThis(0); grfcust &= kgrfcustFrame; grfcust |= _grfcust & (kgrfcustKid | kgrfcustApp); return grfcust; } /*************************************************************************** Do a modal help topic. ***************************************************************************/ bool WOKS::FModalTopic(PRCA prca, CNO cnoTopic, long *plwRet) { AssertThis(0); AssertPo(prca, 0); AssertVarMem(plwRet); GCB gcb; PWOKS pwoksModal; GTE gte; PGOB pgob; ulong grfgte; bool fRet = fFalse; gte.Init(this, fgteNil); while (gte.FNextGob(&pgob, &grfgte, fgteNil)) { if (!(grfgte & fgtePre) || !pgob->FIs(kclsGOK)) continue; ((PGOK)pgob)->Suspend(); } if (vpappb->FPushModal()) { gcb.Set(CMH::HidUnique(), this, fgobNil, kginMark); gcb._rcRel.Set(0, 0, krelOne, krelOne); if (pvNil != (pwoksModal = NewObj WOKS(&gcb, _pstrg))) { vpsndm->PauseAll(); vpcex->SetModalGob(pwoksModal); if (pvNil != pwoksModal->PhbalNew(pwoksModal, prca, cnoTopic)) fRet = FPure(vpappb->FModalLoop(plwRet)); vpcex->SetModalGob(pvNil); vpsndm->ResumeAll(); } ReleasePpo(&pwoksModal); vpappb->PopModal(); } gte.Init(this, fgteNil); while (gte.FNextGob(&pgob, &grfgte, fgteNil)) { if (!(grfgte & fgtePre) || !pgob->FIs(kclsGOK)) continue; ((PGOK)pgob)->Resume(); } return fRet; } ================================================ FILE: kauai/src/kidworld.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Copyright (c) Microsoft Corporation This is a class that knows how to create GOKs, Help Balloons and Kidspace script interpreters. It exists so an app can customize default behavior. ***************************************************************************/ #ifndef KIDWORLD_H #define KIDWORLD_H /*************************************************************************** Base GOK descriptor. ***************************************************************************/ // location from parent map structure struct LOP { long hidPar; long xp; long yp; long zp; // the z-plane number used for placing the GOK in the GOB tree }; // cursor map entry struct CUME { ulong grfcustMask; // what cursor states this CUME is good for ulong grfcust; ulong grfbitSno; // what button states this CUME is good for CNO cnoCurs; // the cursor to use CHID chidScript; // execution script (absolute) long cidDefault; // default command CNO cnoTopic; // tool tip topic }; typedef class GOKD *PGOKD; #define GOKD_PAR BACO #define kclsGOKD 'GOKD' class GOKD : public GOKD_PAR { RTCLASS_DEC protected: GOKD(void) { } public: virtual long Gokk(void) = 0; virtual bool FGetCume(ulong grfcust, long sno, CUME *pcume) = 0; virtual void GetLop(long hidPar, LOP *plop) = 0; }; /*************************************************************************** Standard GOK descriptor. Contains location information and cursor map stuff. ***************************************************************************/ // GOK construction descriptor on file - these are stored in chunky resource files struct GOKDF { short bo; short osk; long gokk; // LOP rglop[]; ends with a default entry (hidPar == hidNil) // CUME rgcume[]; the cursor map }; const BOM kbomGokdf = 0x0C000000; typedef class GKDS *PGKDS; #define GKDS_PAR GOKD #define kclsGKDS 'GKDS' class GKDS : public GKDS_PAR { RTCLASS_DEC ASSERT MARKMEM protected: HQ _hqData; long _gokk; long _clop; long _ccume; GKDS(void) { } public: // An object reader for a GOKD. static bool FReadGkds(PCRF pcrf, CTG ctg, CNO cno, BLCK *pblck, PBACO *ppbaco, long *pcb); ~GKDS(void); virtual long Gokk(void); virtual bool FGetCume(ulong grfcust, long sno, CUME *pcume); virtual void GetLop(long hidPar, LOP *plop); }; /*************************************************************************** World of Kidspace class. ***************************************************************************/ typedef class WOKS *PWOKS; #define WOKS_PAR GOB #define kclsWOKS 'WOKS' class WOKS : public WOKS_PAR { RTCLASS_DEC ASSERT MARKMEM protected: PSTRG _pstrg; STRG _strg; ulong _grfcust; CLOK _clokAnim; CLOK _clokNoSlip; CLOK _clokGen; CLOK _clokReset; public: WOKS(GCB *pgcb, PSTRG pstrg = pvNil); ~WOKS(void); PSTRG Pstrg(void) { return _pstrg; } virtual bool FGobIn(PGOB pgob); virtual PGOKD PgokdFetch(CTG ctg, CNO cno, PRCA prca); virtual PGOK PgokNew(PGOB pgobPar, long hid, CNO cno, PRCA prca); virtual PSCEG PscegNew(PRCA prca, PGOB pgob); virtual PHBAL PhbalNew(PGOB pgobPar, PRCA prca, CNO cnoTopic, PHTOP phtop = pvNil); virtual PCMH PcmhFromHid(long hid); virtual PGOB PgobParGob(PGOB pgob); virtual bool FFindFile(PSTN pstnSrc, PFNI pfni); virtual tribool TGiveAlert(PSTN pstn, long bk, long cok); virtual void Print(PSTN pstn); virtual ulong GrfcustCur(bool fAsynch = fFalse); virtual void ModifyGrfcust(ulong grfcustOr, ulong grfcustXor); virtual ulong GrfcustAdjust(ulong grfcust); virtual bool FModalTopic(PRCA prca, CNO cnoTopic, long *plwRet); virtual PCLOK PclokAnim(void) { return &_clokAnim; } virtual PCLOK PclokNoSlip(void) { return &_clokNoSlip; } virtual PCLOK PclokGen(void) { return &_clokGen; } virtual PCLOK PclokReset(void) { return &_clokReset; } virtual PCLOK PclokFromHid(long hid); }; #endif //! KIDWORLD_H ================================================ FILE: kauai/src/lex.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Basic lexer class ***************************************************************************/ #include #include "util.h" ASSERTNAME RTCLASS(LEXB) // #line handling achar _szPoundLine[] = PszLit("#line"); #define kcchPoundLine (CvFromRgv(_szPoundLine) - 1) ushort LEXB::_mpchgrfct[128] = { // 0x00 - 0x07 fctNil, fctNil, fctNil, fctNil, fctNil, fctNil, fctNil, fctNil, // 0x08; 0x09=tab; 0x0A=line-feed; 0x0B; 0x0C; 0x0D=return; 0x0E; 0x0F fctNil, fctSpc, fctSpc, fctNil, fctNil, fctSpc, fctNil, fctNil, // 0x10 - 0x17 fctNil, fctNil, fctNil, fctNil, fctNil, fctNil, fctNil, fctNil, // 0x18; 0x19; 0x1A=Ctrl-Z; 0x1B - 0x1F fctNil, fctNil, fctSpc, fctNil, fctNil, fctNil, fctNil, fctNil, // space ! " # fctSpc, fctOpr | fctOp1, fctQuo, fctOpr, // $ % & ' fctOpr, fctOpr | fctOp1, fctOpr | fctOp1 | fctOp2, fctQuo, // ( ) * + fctOpr, fctOpr, fctOpr | fctOp1, fctOpr | fctOp1 | fctOp2, // , - . / fctOpr, fctOpr | fctOp1 | fctOp2, fctOpr, fctOpr | fctOp1, // 0 1 2 3 kgrfctDigit, kgrfctDigit, kgrfctDigit, kgrfctDigit, // 4 5 6 7 kgrfctDigit, kgrfctDigit, kgrfctDigit, kgrfctDigit, // 8 9 : ; fctDec | fctHex, fctDec | fctHex, fctOpr | fctOp1 | fctOp2, fctOpr, // < = > ? fctOpr | fctOp1 | fctOp2, fctOpr | fctOp1 | fctOp2, fctOpr | fctOp1 | fctOp2, fctOpr, // @ A B C fctOpr, fctUpp | fctHex, fctUpp | fctHex, fctUpp | fctHex, // D E F G fctUpp | fctHex, fctUpp | fctHex, fctUpp | fctHex, fctUpp, // H I J K L M N O fctUpp, fctUpp, fctUpp, fctUpp, fctUpp, fctUpp, fctUpp, fctUpp, // P Q R S T U V W fctUpp, fctUpp, fctUpp, fctUpp, fctUpp, fctUpp, fctUpp, fctUpp, // X Y Z [ \ ] ^ _ fctUpp, fctUpp, fctUpp, fctOpr, fctOpr, fctOpr, fctOpr | fctOp1 | fctOp2, fctUpp | fctLow, // ` a b c fctOpr, fctLow | fctHex, fctLow | fctHex, fctLow | fctHex, // d e f g fctLow | fctHex, fctLow | fctHex, fctLow | fctHex, fctLow, // h i j k l m n o fctLow, fctLow, fctLow, fctLow, fctLow, fctLow, fctLow, fctLow, // p q r s t u v w fctLow, fctLow, fctLow, fctLow, fctLow, fctLow, fctLow, fctLow, // x y z { fctLow, fctLow, fctLow, fctOpr, // | } ~ 0x7F=del fctOpr | fctOp1 | fctOp2, fctOpr, fctOpr | fctOp1, fctNil, }; // token values for single characters #define kchMinTok ChLit('!') short _rgtt[] = { // ! " # $ % & ' ttLNot, ttNil, ttPound, ttDollar, ttMod, ttBAnd, ttNil, // ( ) * + , - . / ttOpenParen, ttCloseParen, ttMul, ttAdd, ttComma, ttSub, ttDot, ttDiv, // 0-7 ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, // 8 9 : ; < = > ? ttNil, ttNil, ttColon, ttSemi, ttLt, ttAssign, ttGt, ttQuery, // @ A-G ttAt, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, // H-O ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, // P-W ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, // X Y Z [ \ ] ^ _ ttNil, ttNil, ttNil, ttOpenRef, ttBackSlash, ttCloseRef, ttBXor, ttNil, // ` a-g ttAccent, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, // h-o ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, // p-w ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, // x y a { | } ~ ttNil, ttNil, ttNil, ttOpenBrace, ttBOr, ttCloseBrace, ttBNot}; long _TtFromCh(achar ch); /*************************************************************************** Return the token type of a single character operator. ***************************************************************************/ long _TtFromCh(achar ch) { AssertIn(ch, kchMinTok, kchMinTok + size(_rgtt) / size(_rgtt[0])); return _rgtt[(byte)ch - kchMinTok]; } #define kchMinDouble ChLit('&') #define kchLastDouble ChLit('|') short _rgttDouble[] = { // & ' ttLAnd, ttNil, // ( ) * + , - . / ttNil, ttNil, ttNil, ttInc, ttNil, ttDec, ttNil, ttNil, // 0-7 ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, // 8 9 : ; < = > ? ttNil, ttNil, ttScope, ttNil, ttShl, ttEq, ttShr, ttNil, // @ A-G ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, // H-O ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, // P-W ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, // X Y Z [ \ ] ^ _ ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttLXor, ttNil, // ` a-g ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, // h-o ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, // p-w ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, // x y a { | ttNil, ttNil, ttNil, ttNil, ttLOr}; #define kchMinEqual ChLit('!') #define kchLastEqual ChLit('|') short _rgttEqual[] = { // ! " # $ % & ' ttNe, ttNil, ttNil, ttNil, ttAMod, ttABAnd, ttNil, // ( ) * + , - . / ttNil, ttNil, ttAMul, ttAAdd, ttNil, ttASub, ttNil, ttADiv, // 0-7 ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, // 8 9 : ; < = > ? ttNil, ttNil, ttNil, ttNil, ttLe, ttEq, ttGe, ttNil, // @ A-G ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, // H-O ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, // P-W ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, // X Y Z [ \ ] ^ _ ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttABXor, ttNil, // ` a-g ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, // h-o ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, // p-w ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, ttNil, // x y a { | ttNil, ttNil, ttNil, ttNil, ttABOr}; long _TtFromChCh(achar ch1, achar ch2); /*************************************************************************** Return the token type of a double character token. ***************************************************************************/ long _TtFromChCh(achar ch1, achar ch2) { if (ch1 == ch2) { return FIn(ch1, kchMinDouble, kchLastDouble + 1) ? _rgttDouble[(byte)ch1 - kchMinDouble] : ttNil; } if (ch2 == ChLit('=')) { return FIn(ch1, kchMinEqual, kchLastEqual + 1) ? _rgttEqual[ch1 - kchMinEqual] : ttNil; } if (ch1 == ChLit('-') && ch2 == ChLit('>')) return ttArrow; return ttNil; } /*************************************************************************** Constructor for the lexer. ***************************************************************************/ LEXB::LEXB(PFIL pfil, bool fUnionStrings) { AssertPo(pfil, 0); _pfil = pfil; _pbsf = pvNil; _pfil->AddRef(); _pfil->GetStnPath(&_stnFile); _lwLine = 1; _ichLine = 0; _fpCur = 0; _fpMac = pfil->FpMac(); _ichLim = _ichCur = 0; _fLineStart = fTrue; _fSkipToNextLine = fFalse; _fUnionStrings = fUnionStrings; AssertThis(0); } /*************************************************************************** Constructor for the lexer. ***************************************************************************/ LEXB::LEXB(PBSF pbsf, PSTN pstnFile, bool fUnionStrings) { AssertPo(pbsf, 0); AssertPo(pstnFile, 0); _pfil = pvNil; _pbsf = pbsf; _pbsf->AddRef(); _stnFile = *pstnFile; _lwLine = 1; _ichLine = 0; _fpCur = 0; _fpMac = pbsf->IbMac(); _ichLim = _ichCur = 0; _fLineStart = fTrue; _fSkipToNextLine = fFalse; _fUnionStrings = fUnionStrings; AssertThis(0); } /*************************************************************************** Destructor for the lexer. ***************************************************************************/ LEXB::~LEXB(void) { ReleasePpo(&_pfil); ReleasePpo(&_pbsf); } #ifdef DEBUG /*************************************************************************** Assert the validity of a LEXB. ***************************************************************************/ void LEXB::AssertValid(ulong grf) { LEXB_PAR::AssertValid(0); AssertNilOrPo(_pfil, 0); AssertNilOrPo(_pbsf, 0); Assert((_pfil == pvNil) != (_pbsf == pvNil), "exactly one of _pfil, _pbsf should be non-nil"); AssertPo(&_stnFile, 0); AssertIn(_lwLine, 0, kcbMax); AssertIn(_ichLine, 0, kcbMax); AssertIn(_fpCur, 0, _fpMac + 1); AssertIn(_fpMac, 0, kcbMax); AssertIn(_ichCur, 0, _ichLim + 1); AssertIn(_ichLim, 0, size(_rgch) + 1); } /*************************************************************************** Mark memory for the LEXB. ***************************************************************************/ void LEXB::MarkMem(void) { AssertValid(0); LEXB_PAR::MarkMem(); MarkMemObj(_pfil); MarkMemObj(_pbsf); } #endif // DEBUG /*************************************************************************** Get the current file that we're reading tokens from. ***************************************************************************/ void LEXB::GetStnFile(PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); *pstn = _stnFile; } /*************************************************************************** Fetch some characters. Don't advance the pointer into the file. Can fetch at most kcchLexbBuf characters at a time. ***************************************************************************/ bool LEXB::_FFetchRgch(achar *prgch, long cch) { AssertThis(0); AssertIn(cch, 1, kcchLexbBuf); AssertPvCb(prgch, cch * size(achar)); if (_ichLim < _ichCur + cch) { // need to read some more data long cchT; if (_fpCur + (_ichCur + cch - _ichLim) * size(achar) > _fpMac) { // hit the eof return fFalse; } // keep any valid characters if (_ichCur < _ichLim) { BltPb(_rgch + _ichCur, _rgch, (_ichLim - _ichCur) * size(achar)); _ichLim -= _ichCur; } else _ichLim = 0; _ichCur = 0; // read new stuff cchT = LwMin((_fpMac - _fpCur) / size(achar), kcchLexbBuf - _ichLim); AssertIn(cchT, cch - _ichLim, kcchLexbBuf + 1); if (pvNil != _pfil) { AssertPo(_pfil, 0); if (!_pfil->FReadRgb(_rgch + _ichLim, cchT * size(achar), _fpCur)) { Warn("Error reading file, truncating logical file"); _fpMac = _fpCur; return fFalse; } } else { AssertPo(_pbsf, 0); _pbsf->FetchRgb(_fpCur, cchT * size(achar), _rgch + _ichLim); } _ichLim += cchT; _fpCur += cchT * size(achar); AssertIn(_ichLim, _ichCur + cch, kcchLexbBuf + 1); } // get the text CopyPb(_rgch + _ichCur, prgch, cch * size(achar)); AssertThis(0); return fTrue; } /*************************************************************************** Skip any white space at the current location in the buffer. This handles #line directives and comments. Comments are not allowed on the same line as a #line directive. ***************************************************************************/ bool LEXB::_FSkipWhiteSpace(void) { AssertThis(0); achar ch; bool fStar, fSkipComment, fSlash; long lwLineSav; achar rgch[kcchPoundLine + 1]; STN stn; fSkipComment = fFalse; while (_FFetchRgch(&ch)) { if ((_GrfctCh(ch) & fctSpc) || _fSkipToNextLine || fSkipComment) { _Advance(); if (kchReturn == ch) { _lwLine++; _ichLine = 0; _fLineStart = fTrue; _fSkipToNextLine = fFalse; } else if (ChLit('\xA') == ch && 1 == _ichLine) _ichLine = 0; if (fSkipComment) { if (fStar && ch == ChLit('/')) fSkipComment = fFalse; fStar = (ch == ChLit('*')); } continue; } // not a white space character // check for a comment if (ChLit('/') == ch && _FFetchRgch(rgch, 2)) { switch (rgch[1]) { case ChLit('/'): // line comment - skip characters until we hit a return _Advance(2); _fSkipToNextLine = fTrue; continue; case ChLit('*'): // normal comment _Advance(2); fSkipComment = fTrue; fStar = fFalse; continue; } } // if this is at the beginning of a line, check for a #line directive if (!_fLineStart || (ch != _szPoundLine[0]) || !_FFetchRgch(rgch, kcchPoundLine + 1) || !FEqualRgb(rgch, _szPoundLine, kcchPoundLine) || !(_GrfctCh(rgch[kcchPoundLine]) & fctSpc)) { _fLineStart = fFalse; break; } // a #line directive - skip it and white space _Advance(kcchPoundLine); while (_FFetchRgch(&ch) && (_GrfctCh(ch) & fctSpc) && ch != kchReturn) _Advance(); // read the line number lwLineSav = _lwLine; if (!_FFetchRgch(&ch) || !(_GrfctCh(ch) & fctDec)) goto LBadDirective; _Advance(); _ReadNumber(&_lwLine, ch, 10, klwMax); _lwLine--; // skip white space (and make sure there is some) if (!_FFetchRgch(&ch)) break; // eof if (!(_GrfctCh(ch) & fctSpc)) goto LBadDirective; while (_FFetchRgch(&ch) && (_GrfctCh(ch) & fctSpc) && ch != kchReturn) _Advance(); if (!_FFetchRgch(&ch)) break; // eof if (ch == kchReturn) continue; // end of #line // read file name if (ch != ChLit('"')) goto LBadDirective; _Advance(); stn.SetNil(); for (fSlash = fFalse;;) { if (!_FFetchRgch(&ch) || ch == kchReturn) goto LBadDirective; _Advance(); if (ch == ChLit('"')) break; if (ch == ChLit('\\')) { // if this is the second of a pair of slashes, skip it fSlash = !fSlash; if (!fSlash) continue; } else fSlash = fFalse; stn.FAppendCh(ch); } // skip white space to end of line if (!_FFetchRgch(&ch)) goto LSetFileName; // eof if (!(_GrfctCh(ch) & fctSpc)) goto LBadDirective; while (_FFetchRgch(&ch) && (_GrfctCh(ch) & fctSpc) && ch != kchReturn) _Advance(); if (!_FFetchRgch(&ch)) goto LSetFileName; // eof if (ch != kchReturn) { LBadDirective: // Bad #line directive - restore the line number _lwLine = lwLineSav; return fFalse; } else { LSetFileName: _stnFile = stn; } } // if fSkipComment is true, we hit the eof in a comment return !fSkipComment; } /*************************************************************************** Get the next token from the file. ***************************************************************************/ bool LEXB::FGetTok(PTOK ptok) { AssertThis(0); AssertVarMem(ptok); achar ch, ch2; ulong grfct; long cch; ptok->stn.SetNil(); if (!_FSkipWhiteSpace()) { _fSkipToNextLine = fTrue; goto LError; } if (!_FFetchRgch(&ch)) { ptok->tt = ttNil; return fFalse; } _Advance(); grfct = _GrfctCh(ch); if (grfct & fctDec) { // numeric value ptok->tt = ttLong; if (ch == ChLit('0')) { // hex or octal if (!_FFetchRgch(&ch)) { ptok->lw = 0; return fTrue; } if (ch == ChLit('x') || ch == ChLit('X')) { // hex _Advance(); if (!_FReadHex(&ptok->lw)) goto LError; } else { // octal _ReadNumTok(ptok, ChLit('0'), 8, klwMax); } } else { // decimal _ReadNumTok(ptok, ch, 10, klwMax); } // check for bad termination if (_FFetchRgch(&ch) && (_GrfctCh(ch) & (fctDec | fctUpp | fctLow | fctQuo))) { goto LError; } return fTrue; } if (grfct & fctQuo) { // single or double quote if (ch == ChLit('"')) { // string ptok->tt = ttString; for (;;) { if (!_FFetchRgch(&ch)) goto LError; _Advance(); switch (ch) { case kchReturn: goto LError; case ChLit('"'): // check for another string immediately following this one if (!_fUnionStrings) return fTrue; if (!_FSkipWhiteSpace()) { _fSkipToNextLine = fTrue; goto LError; } if (!_FFetchRgch(&ch) || ch != ChLit('"')) return fTrue; _Advance(); break; case ChLit('\\'): // control sequence if (!_FReadControlCh(&ch)) { _fSkipToNextLine = fTrue; goto LError; } if (chNil != ch) ptok->stn.FAppendCh(ch); break; default: ptok->stn.FAppendCh(ch); break; } } Assert(fFalse, "how'd we get here?"); } Assert(ch == ChLit('\''), "bad grfct"); ptok->tt = ttLong; ptok->lw = 0; // ctg type long for (cch = 0; cch < 5;) { if (!_FFetchRgch(&ch)) goto LError; _Advance(); switch (ch) { case kchReturn: goto LError; case ChLit('\''): return fTrue; case ChLit('\\'): if (!_FReadControlCh(&ch)) { _fSkipToNextLine = fTrue; goto LError; } break; } ptok->lw = (ptok->lw << 8) + (byte)ch; cch++; } // constant too long goto LError; } if (grfct & fctOp1) { // check for multi character token if (_FFetchRgch(&ch2) && (_GrfctCh(ch2) & fctOp2) && ttNil != (ptok->tt = _TtFromChCh(ch, ch2))) { _Advance(); // special case <<= and >>= if ((ptok->tt == ttShr || ptok->tt == ttShl) && _FFetchRgch(&ch2) && ch2 == ChLit('=')) { ptok->tt = (ptok->tt == ttShr) ? ttAShr : ttAShl; _Advance(); } return fTrue; } } if (grfct & fctOpr) { /* single character token */ ptok->tt = _TtFromCh(ch); Assert(ttNil != ptok->tt, "bad table entry"); return fTrue; } if (grfct & (fctLow | fctUpp)) { // identifier ptok->tt = ttName; ptok->stn.FAppendCh(ch); while (_FFetchRgch(&ch) && (_GrfctCh(ch) & (fctUpp | fctLow | fctDec))) { ptok->stn.FAppendCh(ch); _Advance(); } return fTrue; } LError: ptok->tt = ttError; ptok->stn.SetNil(); return fTrue; } /*************************************************************************** Return the size of extra data associated with the last token returned. ***************************************************************************/ long LEXB::CbExtra(void) { AssertThis(0); return 0; } /*************************************************************************** Get the extra data for the last token returned. ***************************************************************************/ void LEXB::GetExtra(void *pv) { AssertThis(0); Bug("no extra data"); } /*************************************************************************** Read a number. The first character is passed in ch. lwBase is the base of the number (must be <= 10). ***************************************************************************/ void LEXB::_ReadNumber(long *plw, achar ch, long lwBase, long cchMax) { AssertThis(0); AssertVarMem(plw); AssertIn(ch - ChLit('0'), 0, lwBase); AssertIn(lwBase, 2, 11); *plw = ch - ChLit('0'); while (--cchMax > 0 && _FFetchRgch(&ch) && (_GrfctCh(ch) & fctDec) && (ch - ChLit('0') < lwBase)) { *plw = *plw * lwBase + (ch - ChLit('0')); _Advance(); } } /*************************************************************************** Read in a hexadecimal value (without the 0x). ***************************************************************************/ bool LEXB::_FReadHex(long *plw) { AssertThis(0); AssertVarMem(plw); achar ch; ulong grfct; *plw = 0; if (!_FFetchRgch(&ch) || !((grfct = _GrfctCh(ch)) & fctHex)) return fFalse; do { if (grfct & fctDec) *plw = *plw * 16 + (ch - ChLit('0')); else if (grfct & fctLow) *plw = *plw * 16 + (10 + ch - ChLit('a')); else { Assert(grfct & fctUpp, "bad grfct"); *plw = *plw * 16 + (10 + ch - ChLit('A')); } _Advance(); } while (_FFetchRgch(&ch) && ((grfct = _GrfctCh(ch)) & fctHex)); return fTrue; } /*************************************************************************** Read a control character (eg, \x3F). This code assumes the \ has already been read. ***************************************************************************/ bool LEXB::_FReadControlCh(achar *pch) { AssertThis(0); AssertVarMem(pch); // control sequence achar ch; long lw; if (!_FFetchRgch(&ch)) return fFalse; _Advance(); switch (ch) { case kchReturn: while (_FFetchRgch(&ch) && ch == ChLit('\xA')) _Advance(); *pch = chNil; break; case ChLit('t'): *pch = kchTab; break; case ChLit('n'): *pch = kchReturn; break; case ChLit('x'): case ChLit('X'): if (!_FReadHex(&lw)) return fFalse; *pch = (achar)lw; break; default: if (_GrfctCh(ch) & fctOct) { _ReadNumber(&lw, ch, 8, 3); *pch = (achar)lw; } else *pch = ch; break; } return fTrue; } ================================================ FILE: kauai/src/lex.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation A lexer for command scripts. ***************************************************************************/ #ifndef LEX_H #define LEX_H enum { fctNil = 0, // invalid character fctLow = 1, // lowercase letter fctUpp = 2, // uppercase letter fctOct = 4, // octal fctDec = 8, // digit fctHex = 16, // hex digit fctSpc = 32, // space character fctOp1 = 64, // first character of a multi-character operator fctOp2 = 128, // last character of a multi-character operator fctOpr = 256, // lone character operator fctQuo = 512, // quote character }; #define kgrfctDigit (fctOct | fctDec | fctHex) enum { ttNil, ttError, // bad token ttLong, // numeric constant ttName, // identifier ttString, // string constant ttAdd, // + ttSub, // - ttMul, // * ttDiv, // / ttMod, // % ttInc, // ++ ttDec, // -- ttBOr, // | ttBAnd, // & ttBXor, // ^ ttBNot, // ~ ttShr, // >> ttShl, // << ttLOr, // || ttLAnd, // && ttLXor, // ^^ ttEq, // == ttNe, // != ttGt, // > ttGe, // >= ttLt, // < ttLe, // <= ttLNot, // ! ttAssign, // = ttAAdd, // += ttASub, // -= ttAMul, // *= ttADiv, // /= ttAMod, // %= ttABOr, // |= ttABAnd, // &= ttABXor, // ^= ttAShr, // >>= ttAShl, // <<= ttArrow, // -> ttDot, // . ttQuery, // ? ttColon, // : ttComma, // , ttSemi, // ; ttOpenRef, // [ ttCloseRef, // ] ttOpenParen, // ( ttCloseParen, // ) ttOpenBrace, // { ttCloseBrace, // } ttPound, // # ttDollar, // $ ttAt, // @ ttAccent, // ` ttBackSlash, // backslash character (\) ttScope, // :: ttLimBase }; struct TOK { long tt; long lw; STN stn; }; typedef TOK *PTOK; /*************************************************************************** Base lexer. ***************************************************************************/ #define kcchLexbBuf 512 typedef class LEXB *PLEXB; #define LEXB_PAR BASE #define kclsLEXB 'LEXB' class LEXB : public LEXB_PAR { RTCLASS_DEC ASSERT MARKMEM protected: static ushort _mpchgrfct[]; PFIL _pfil; // exactly one of _pfil, _pbsf should be non-nil PBSF _pbsf; STN _stnFile; long _lwLine; // which line long _ichLine; // which character on the line FP _fpCur; FP _fpMac; long _ichLim; long _ichCur; achar _rgch[kcchLexbBuf]; bool _fLineStart : 1; bool _fSkipToNextLine : 1; bool _fUnionStrings : 1; ulong _GrfctCh(achar ch) { return (uchar)ch < 128 ? _mpchgrfct[(byte)ch] : fctNil; } bool _FFetchRgch(achar *prgch, long cch = 1); void _Advance(long cch = 1) { _ichCur += cch; _ichLine += cch; } bool _FSkipWhiteSpace(void); virtual void _ReadNumber(long *plw, achar ch, long lwBase, long cchMax); virtual void _ReadNumTok(PTOK ptok, achar ch, long lwBase, long cchMax) { _ReadNumber(&ptok->lw, ch, lwBase, cchMax); } bool _FReadHex(long *plw); bool _FReadControlCh(achar *pch); public: LEXB(PFIL pfil, bool fUnionStrings = fTrue); LEXB(PBSF pbsf, PSTN pstnFile, bool fUnionStrings = fTrue); ~LEXB(void); virtual bool FGetTok(PTOK ptok); virtual long CbExtra(void); virtual void GetExtra(void *pv); void GetStnFile(PSTN pstn); long LwLine(void) { return _lwLine; } long IchLine(void) { return _ichLine; } }; #endif //! LEX_H ================================================ FILE: kauai/src/mac.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Mac standard header file - equivalent of windows.h. ***************************************************************************/ #ifndef SYMC /* Wings includes Mac headers explicitly (this isn't all of them): */ // NOTE: avoid including Traps.h because it defines a bunch of stuff // that we use as methods! #define __TRAPS__ #include #include #include //types.h #include //types.h #include //types.h #include //types.h #include //types.h, qdtext.h #include //quickdra.h #include //quickdra.h #include //quickdra.h #include //quickdra.h #include //types.h quickdra.h osutils.h #include //types.h quickdra.h events.h #include //quickdra.h events.h controls.h #include //quickdra.h windows.h #include //windows.h textedit.h #include //types.h osutils.h segload.h #include //types.h files.h #include //types.h files.h #include //types.h files.h #include // #include //types.h dialogs.h files.h #include //types.h quickdra.h intlreso.h #include //types.h script.h osutils.h #include #else //! SYMC #include #include #include #include #define __cdecl #define __pascal pascal #define GetDialogItem GetDItem #define GetDialogItemText GetIText #define SetDialogItemText SetIText #define UppercaseText(prgch, cch, scr) UpperText(prgch, cch) #define LowercaseText(prgch, cch, scr) LowerText(prgch, cch) #include inline long LMGetHeapEnd(void) { return *(long *)ApplLimit; } inline long LMGetCurrentA5(void) { return *(long *)CurrentA5; } #endif //! SYMC typedef GrafPort PRT; typedef GrafPort *PPRT; typedef CGrafPort *PCPRT; typedef GDHandle HGD; typedef WindowRecord SWND; typedef SWND *HWND; typedef RgnHandle HRGN; typedef GWorldPtr PGWR; typedef PixMapHandle HPIX; typedef BitMap *PBMP; typedef PicHandle HPIC; typedef PaletteHandle HPAL; typedef CTabHandle HCLT; ================================================ FILE: kauai/src/makefile ================================================ #---kauai.mak !IFNDEF MAKEFILE_KAUAI MAKEFILE_KAUAI = 1 !INCLUDE $(KAUAI_ROOT)\makefile.def #KAUAI SOURCE DIRECTORIES KAUAI_SRC_DIR = $(KAUAI_ROOT)\src KAUAI_TOOLS_DIR = $(KAUAI_ROOT)\tools #KAUAI OBJ DIRECTORIES KAUAI_OBJ_ROOT_DIR = $(KAUAI_ROOT)\obj KAUAI_OBJ_DIR = $(KAUAI_OBJ_ROOT_DIR)\$(BLD_TYPE_DIR) !IF "$(LOCAL_BUILD)" == "1" TARGET_DIR = !ELSE # LOCAL_BUILD TARGET_DIR = $(KAUAI_OBJ_DIR)^\ !ENDIF # !LOCAL_BUILD KAUAI_TARGETS =\ $(BASE_OBJS)\ $(GROUP_OBJS)\ $(FILE_OBJS)\ $(STREAM_OBJS)\ $(LEXER_OBJS)\ $(SCRCOM_OBJS)\ $(KIDCOM_OBJS)\ $(SCREXE_OBJS)\ $(MBMPIO_OBJS)\ $(CHSE_OBJS)\ $(CHCM_OBJS)\ $(SOUND_OBJS)\ $(VIDEO_OBJS)\ $(GUI_OBJS)\ $(DLG_OBJS)\ $(CTL_OBJS)\ $(DOC_OBJS)\ $(RICHTEXT_OBJS)\ $(TEXTEDIT_OBJS)\ $(PLAINTEXT_OBJS)\ $(KID_OBJS) UT_TARGETS =\ $(BASE_OBJS)\ $(GROUP_OBJS)\ $(FILE_OBJS)\ $(TARGET_DIR)ut.obj\ $(TARGET_DIR)test.obj\ FT_TARGETS =\ $(BASE_OBJS)\ $(GROUP_OBJS)\ $(FILE_OBJS)\ $(GUI_OBJS)\ $(DOC_OBJS)\ $(STREAM_OBJS)\ $(SOUND_OBJS)\ $(DLG_OBJS)\ $(CTL_OBJS)\ $(TEXTEDIT_OBJS)\ $(RICHTEXT_OBJS)\ $(MBMPIO_OBJS)\ $(KAUAITEST_OBJS)\ $(TARGET_DIR)ft.res #-Compile rules------------------------------------------------------------- PROGRAM_DATABASE = $(KAUAI_ROOT)\obj\$(BLD_TYPE_DIR)\kauai.pdb PRECOMPILED_HEADER = $(KAUAI_ROOT)\obj\$(BLD_TYPE_DIR)\kauai.pch CPPEXTRA = /Zi /Fd$(PROGRAM_DATABASE) /Fp$(PRECOMPILED_HEADER) SRC_DIR=$(KAUAI_SRC_DIR) OBJ_DIR=$(KAUAI_OBJ_DIR) TGT_NAME=Kauai !INCLUDE $(KAUAI_ROOT)\makefile.rul # REVIEW a-aarob (peted): why should Kauai src know how to build Kauai tools? # # SRC_DIR=$(KAUAI_TOOLS_DIR) # OBJ_DIR=$(KAUAI_OBJ_DIR) # TGT_NAME=Kauai Tools # # !INCLUDE $(KAUAI_ROOT)\makefile.rul #-Targets------------------------------------------------------------------- ALL_KAUAI = $(KAUAI_TARGETS) $(TARGET_DIR)FT.EXE $(TARGET_DIR)UT.EXE ALL_TARGETS_ROOT = $(ALL_TARGETS_ROOT) $(ALL_KAUAI) CLEAN_KAUAI = CLEAN_KAUAI_OBJ CLEAN_UT CLEAN_FT CLEAN_TARGETS_ROOT = $(CLEAN_TARGETS_ROOT) $(CLEAN_KAUAI) !IF "$(LOCAL_BUILD)" != "1" !IF "$(LOCAL_BUILD)" != "0" && !DEFINED(MAKEFILE_KAUAI_TOOLS) ALL: $(KAUAI_OBJ_DIR) $(ALL_KAUAI) CLEAN : $(CLEAN_KAUAI) ALL !ENDIF # LOCAL_BUILD != 0 KAUAI_OBJS : $(KAUAI_OBJ_DIR) $(KAUAI_TARGETS) $(KAUAI_OBJ_DIR) : @echo Making Directories $(KAUAI_OBJ_DIR)... if not exist $(KAUAI_OBJ_ROOT_DIR)/nul mkdir $(KAUAI_OBJ_ROOT_DIR) if not exist $(KAUAI_OBJ_DIR)/nul mkdir $(KAUAI_OBJ_DIR) !ELSE # !LOCAL_BUILD KAUAI_OBJS : $(KAUAI_TARGETS) !ENDIF # LOCAL_BUILD $(KAUAI_OBJ_DIR)\codkauai.obj: $(KAUAI_SRC_DIR)\kcdc_386.h $(KAUAI_SRC_DIR)\kcd2_386.h $(KAUAI_SRC_DIR)\kcdc_386.h: $(TARGET_DIR)kcdc_386.exe $(TARGET_DIR)kcdc_386.exe $(KAUAI_SRC_DIR)\kcdc_386.h $(TARGET_DIR)kcdc_386.exe: $(KAUAI_SRC_DIR)\kcdc_386.c cl $(KAUAI_SRC_DIR)\kcdc_386.c /Fe$(TARGET_DIR)kcdc_386.exe /Fo$(TARGET_DIR)kcdc_386.obj $(KAUAI_SRC_DIR)\kcd2_386.h: $(TARGET_DIR)kcd2_386.exe $(TARGET_DIR)kcd2_386.exe $(KAUAI_SRC_DIR)\kcd2_386.h $(TARGET_DIR)kcd2_386.exe: $(KAUAI_SRC_DIR)\kcd2_386.c cl $(KAUAI_SRC_DIR)\kcd2_386.c /Fe$(TARGET_DIR)kcd2_386.exe /Fo$(TARGET_DIR)kcd2_386.obj CLEAN_KAUAI_OBJ: @echo <nul^ DEL /q dummy.nul ) 2>nul <nul^ DEL /q dummy.nul ) 2>nul DEL /q dummy.nul $(TARGET_DIR)ut.obj 2>nul DEL /q dummy.nul $(TARGET_DIR)test.obj 2>nul <nul^ DEL /q dummy.nul ) 2>nul DEL /q dummy.nul $(TARGET_DIR)ft.obj 2>nul DEL /q dummy.nul $(TARGET_DIR)test.obj 2>nul DEL /q dummy.nul $(TARGET_DIR)ft.res 2>nul <_FInit(prgbPixels, cbRow, dyp, prc, xpRef, ypRef, bTransparent, grfmbmp, bDefault)) { ReleasePpo(&pmbmp); } return pmbmp; } /*************************************************************************** Initialize the MBMP based on the given pixels. ***************************************************************************/ bool MBMP::_FInit(byte *prgbPixels, long cbRow, long dyp, RC *prc, long xpRef, long ypRef, byte bTransparent, ulong grfmbmp, byte bDefault) { AssertIn(cbRow, 1, kcbMax); AssertIn(dyp, 1, kcbMax); AssertPvCb(prgbPixels, LwMul(cbRow, dyp)); AssertVarMem(prc); Assert(!prc->FEmpty() && prc->xpLeft >= 0 && prc->xpRight <= cbRow && prc->ypTop >= 0 && prc->ypBottom <= dyp, "Invalid rectangle"); short *qrgcb; byte *pb, *pbRow, *pbLimRow; byte *qbDst, *qbDstPrev; long cbPixelData, cbPrev, cbOpaque, cbRun; long dibRow; bool fTrans, fMask; long xpMin, xpLim, ypLim, xp, yp; RC rc = *prc; // allocate enough space for the rgcb if (!FAllocHq(&_hqrgb, size(MBMPH) + LwMul(rc.Dyp(), size(short)), fmemNil, mprNormal)) { return fFalse; } _Qmbmph()->fMask = fMask = FPure(grfmbmp & fmbmpMask); _Qmbmph()->bFill = bDefault; dibRow = (grfmbmp & fmbmpUpsideDown) ? -cbRow : cbRow; // crop the bitmap and get an upper bound on the size of the pixel data pbRow = prgbPixels + LwMul(cbRow, ((grfmbmp & fmbmpUpsideDown) ? dyp - rc.ypTop - 1 : rc.ypTop)); qrgcb = _Qrgcb(); xpMin = rc.xpRight; xpLim = rc.xpLeft; ypLim = rc.ypTop; cbPixelData = 0; for (yp = rc.ypTop; yp < rc.ypBottom; pbRow += dibRow, yp++) { pb = pbRow + rc.xpLeft; pbLimRow = pbRow + rc.xpRight; cbPrev = cbPixelData; cbRun = cbOpaque = 0; fTrans = fTrue; for (;;) { // check for overflow or change in transparent status, or the // end of the row if (pb == pbLimRow || fTrans != (*pb == bTransparent) || cbRun == kbMax) { if (fTrans && pb == pbLimRow) break; cbPixelData++; if (!fTrans && cbRun > 0) { xp = pb - pbRow; if (xpMin > xp - cbRun) xpMin = xp - cbRun; if (xpLim < xp) xpLim = xp; cbOpaque += cbRun; if (!fMask) cbPixelData += cbRun; } if (pb == pbLimRow) break; cbRun = 0; fTrans = !fTrans; } else { // Increment pixel count and go on to next pixel. cbRun++; pb++; } } if (0 == cbOpaque) { // nothing in this row but transparent pixels if (yp == rc.ypTop) rc.ypTop++; else qrgcb[yp - rc.ypTop] = 0; cbPixelData = cbPrev; } else { // set the row length in the rgcb. AssertIn(cbPixelData - cbPrev, 2 + !fMask, kswMax + 1); qrgcb[yp - rc.ypTop] = (short)(cbPixelData - cbPrev); ypLim = yp + 1; } } rc.ypBottom = ypLim; rc.xpLeft = xpMin; rc.xpRight = xpLim; if (rc.FEmpty()) { Warn("Empty source bitmap for MBMP"); rc.Zero(); } // reallocate the _hqrgb to the size actually needed AssertIn(LwMul(rc.Dyp(), size(short)), 0, CbOfHq(_hqrgb) - size(MBMPH) + 1); _cbRgcb = LwMul(rc.Dyp(), size(short)); if (!FResizePhq(&_hqrgb, _cbRgcb + size(MBMPH) + cbPixelData, fmemNil, mprNormal)) { return fFalse; } // now actually construct the pixel data qrgcb = _Qrgcb(); qbDst = (byte *)PvAddBv(qrgcb, _cbRgcb); pbRow = prgbPixels + LwMul(cbRow, ((grfmbmp & fmbmpUpsideDown) ? dyp - rc.ypTop - 1 : rc.ypTop)); for (yp = rc.ypTop; yp < rc.ypBottom; pbRow += dibRow, yp++) { if (qrgcb[yp - rc.ypTop] == 0) { // empty row, no need to scan it AssertIn(yp, rc.ypTop + 1, rc.ypBottom); continue; } pb = pbRow + rc.xpLeft; pbLimRow = pbRow + rc.xpRight; qbDstPrev = qbDst; cbRun = 0; fTrans = fTrue; for (;;) { // check for overflow or change in transparent status, or the // end of the row if (pb == pbLimRow || fTrans != (*pb == bTransparent) || cbRun == kbMax) { if (fTrans && pb == pbLimRow) break; *qbDst++ = (byte)cbRun; if (!fTrans) { if (!fMask) { CopyPb(pb - cbRun, qbDst, cbRun); qbDst += cbRun; } if (pb == pbLimRow) break; } cbRun = 0; fTrans = !fTrans; } else { // Increment pixel count and go on to next pixel. cbRun++; pb++; } } // Set the row length in the rgcb. cbRun = qbDst - qbDstPrev; AssertIn(cbRun, 2 + !fMask, qrgcb[yp - rc.ypTop] + 1); qrgcb[yp - rc.ypTop] = (short)cbRun; } // shrink _hqrgb to the actual size needed cbRun = BvSubPvs(qbDst, QvFromHq(_hqrgb)); AssertIn(cbRun, 0, CbOfHq(_hqrgb) + 1); AssertDo(FResizePhq(&_hqrgb, cbRun, fmemNil, mprNormal), "shrinking failed!"); // set the bounding rectangle of the MBMP rc.Offset(-xpRef, -ypRef); _Qmbmph()->rc = rc; AssertThis(0); return fTrue; } /**************************************************************************** This function will read in a bitmap file and return a PMBMP made from it. (xp, yp) will be the reference point of the mbmp [(0,0) is uppper-left]. All pixels with the same value as bTransparent will be read in as transparent. The bitmap file must be uncompressed and have a bit depth of 8. The palette information is be ignored. ****************************************************************************/ PMBMP MBMP::PmbmpReadNative(FNI *pfni, byte bTransparent, long xp, long yp, ulong grfmbmp, byte bDefault) { AssertPo(pfni, ffniFile); byte *prgb; RC rc; long dxp, dyp; bool fUpsideDown; PMBMP pmbmp = pvNil; if (!FReadBitmap(pfni, &prgb, pvNil, &dxp, &dyp, &fUpsideDown, bTransparent)) return pvNil; rc.Set(0, 0, dxp, dyp); pmbmp = MBMP::PmbmpNew(prgb, CbRoundToLong(rc.xpRight), rc.ypBottom, &rc, xp, yp, bTransparent, (fUpsideDown ? grfmbmp : grfmbmp ^ fmbmpUpsideDown), bDefault); FreePpv((void **)&prgb); return pmbmp; } /*************************************************************************** Read a masked bitmap from a block. May free the block or modify it. ***************************************************************************/ PMBMP MBMP::PmbmpRead(PBLCK pblck) { AssertPo(pblck, 0); PMBMP pmbmp; MBMPH *qmbmph; long cbRgcb; long cbTot; bool fSwap; RC rc; HQ hqrgb = hqNil; if (!pblck->FUnpackData()) return pvNil; cbTot = pblck->Cb(); if (cbTot < size(MBMPH) || hqNil == (hqrgb = pblck->HqFree())) return pvNil; qmbmph = (MBMPH *)QvFromHq(hqrgb); fSwap = (kboOther == qmbmph->bo); if (fSwap) SwapBytesBom(qmbmph, kbomMbmph); else if (qmbmph->bo != kboCur) goto LFail; if (qmbmph->swReserved != 0 || qmbmph->cb != cbTot) goto LFail; rc = qmbmph->rc; if (rc.FEmpty()) { if (cbTot != size(MBMPH)) goto LFail; qmbmph->rc.xpRight = rc.xpLeft; qmbmph->rc.ypBottom = rc.ypTop; } cbRgcb = LwMul(rc.Dyp(), size(short)); if (size(MBMPH) + cbRgcb > cbTot) goto LFail; if (pvNil == (pmbmp = NewObj MBMP)) { LFail: FreePhq(&hqrgb); return pvNil; } pmbmp->_cbRgcb = cbRgcb; pmbmp->_hqrgb = hqrgb; if (fSwap) { // swap bytes in the rgcb SwapBytesRgsw(pmbmp->_Qrgcb(), rc.Dyp()); } #ifdef DEBUG // verify the rgcb and rgb long ccb, cb, dxp; byte *qb; bool fMask = pmbmp->_Qmbmph()->fMask; short *qcb = pmbmp->_Qrgcb(); byte *qbRow = (byte *)PvAddBv(qcb, cbRgcb); cbTot -= size(MBMPH) + cbRgcb; for (ccb = rc.Dyp(); ccb-- > 0;) { cb = *qcb++; if (!FIn(cb, 0, cbTot + 1)) goto LFailDebug; cbTot -= cb; qb = qbRow; dxp = 0; while (qb < qbRow + cb) { dxp += *qb++; if (qb >= qbRow + cb) break; dxp += *qb; if (fMask) qb++; else qb += *qb + 1; } if (dxp > rc.Dxp() || qb != qbRow + cb) goto LFailDebug; qbRow = qb; } if (cbTot != 0) { LFailDebug: Bug("Attempted to read bad MBMP"); ReleasePpo(&pmbmp); } #endif // DEBUG AssertNilOrPo(pmbmp, 0); return pmbmp; } /*************************************************************************** Return the total size on file. ***************************************************************************/ long MBMP::CbOnFile(void) { AssertThis(0); return CbOfHq(_hqrgb); } /*************************************************************************** Write the masked bitmap (and its header) to the given block. ***************************************************************************/ bool MBMP::FWrite(PBLCK pblck) { AssertThis(0); AssertPo(pblck, 0); MBMPH *qmbmph; qmbmph = _Qmbmph(); qmbmph->bo = kboCur; qmbmph->osk = koskCur; qmbmph->swReserved = 0; qmbmph->cb = CbOfHq(_hqrgb); if (qmbmph->cb != pblck->Cb()) { Bug("Wrong sized block"); return fFalse; } if (!pblck->FWriteHq(_hqrgb, 0)) return fFalse; return fTrue; } /*************************************************************************** Get the natural rectangle for the mbmp. ***************************************************************************/ void MBMP::GetRc(RC *prc) { AssertThis(0); *prc = _Qmbmph()->rc; } /*************************************************************************** Return whether the given (xp, yp) is in a non-transparent pixel of the MBMP. (xp, yp) should be given in MBMP coordinates. ***************************************************************************/ bool MBMP::FPtIn(long xp, long yp) { AssertThis(0); byte *qb, *qbLim; short *qcb; short cb; MBMPH *qmbmph; qmbmph = _Qmbmph(); if (!qmbmph->rc.FPtIn(xp, yp)) return fFalse; qcb = _Qrgcb(); qb = (byte *)PvAddBv(qcb, _cbRgcb); for (yp -= qmbmph->rc.ypTop; yp-- > 0;) qb += *qcb++; qbLim = qb + *qcb; for (xp -= qmbmph->rc.xpLeft; qb < qbLim;) { if (0 > (xp -= *qb++) || qb >= qbLim) break; cb = *qb++; if (0 > (xp -= cb)) return fTrue; if (!qmbmph->fMask) qb += cb; } Assert(qb <= qbLim, "bad row in MBMP"); return fFalse; } #ifdef DEBUG /*************************************************************************** Assert the validity of a MBMP. ***************************************************************************/ void MBMP::AssertValid(ulong grf) { long ccb; long cbTot; short *qcb; RC rc; MBMP_PAR::AssertValid(0); AssertHq(_hqrgb); rc = _Qmbmph()->rc; ccb = rc.Dyp(); Assert(_cbRgcb == LwMul(rc.Dyp(), size(short)), "_cbRgcb wrong"); cbTot = 0; qcb = _Qrgcb(); while (ccb-- > 0) { AssertIn(*qcb, 0, kcbMax); cbTot += *qcb++; } Assert(cbTot + _cbRgcb + size(MBMPH) == CbOfHq(_hqrgb), "_hqrgb wrong size"); } /*************************************************************************** Mark memory for the MBMP. ***************************************************************************/ void MBMP::MarkMem(void) { AssertValid(0); MBMP_PAR::MarkMem(); MarkHq(_hqrgb); } #endif // DEBUG /*************************************************************************** A PFNRPO to read an MBMP. ***************************************************************************/ bool MBMP::FReadMbmp(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb) { AssertPo(pcrf, 0); AssertPo(pblck, fblckReadable); AssertNilOrVarMem(ppbaco); AssertVarMem(pcb); PMBMP pmbmp; *pcb = pblck->Cb(fTrue); if (pvNil == ppbaco) return fTrue; if (!pblck->FUnpackData()) goto LFail; *pcb = pblck->Cb(); if (pvNil == (pmbmp = PmbmpRead(pblck))) { LFail: TrashVar(ppbaco); TrashVar(pcb); return fFalse; } *ppbaco = pmbmp; return fTrue; } /*************************************************************************** Given an FNI refering to a bitmap file, returns the interesting parts of the header and the pixel data and palette. Fails if the bitmap is not 8 bits, uncompressed. Any or all of the output pointers may be nil. input: pfni -- the file from which to read the data output: The following variable parameters are valid only if FReadBitmap returns true (*pprgb and *ppglclr will be nil if this fails): pprgb -- pointer to the allocated memory for pixel data ppglclr -- the palette pdxp -- the width of the bitmap pdyp -- the height of the bitmap pfUpsideDown -- fTrue if the bitmap is upside down returns fTrue if it succeeds ***************************************************************************/ bool FReadBitmap(FNI *pfni, byte **pprgb, PGL *ppglclr, long *pdxp, long *pdyp, bool *pfUpsideDown, byte bTransparent) { AssertPo(pfni, ffniFile); AssertNilOrVarMem(pprgb); AssertNilOrVarMem(ppglclr); AssertNilOrVarMem(pdxp); AssertNilOrVarMem(pdyp); AssertNilOrVarMem(pfUpsideDown); #ifdef WIN #pragma pack(2) // the stupid bmfh is an odd number of shorts struct BMH { BITMAPFILEHEADER bmfh; BITMAPINFOHEADER bmih; }; #pragma pack() PFIL pfil; RC rc; long fpMac, cbBitmap, cbSrc; BMH bmh; bool fRet, fRle; FP fpCur = 0; if (pvNil != pprgb) *pprgb = pvNil; if (pvNil != ppglclr) *ppglclr = pvNil; if (pvNil == (pfil = FIL::PfilOpen(pfni))) return fFalse; fpMac = pfil->FpMac(); if (size(BMH) >= fpMac || !pfil->FReadRgbSeq(&bmh, size(BMH), &fpCur)) goto LFail; fRle = (bmh.bmih.biCompression == BI_RLE8); cbSrc = bmh.bmih.biSizeImage; if (((long)bmh.bmfh.bfSize != fpMac) || bmh.bmfh.bfType != 'MB' || !FIn(bmh.bmfh.bfOffBits, size(BMH), fpMac) || bmh.bmfh.bfReserved1 != 0 || bmh.bmfh.bfReserved2 != 0 || bmh.bmih.biSize != size(bmh.bmih) || bmh.bmih.biPlanes != 1) { Warn("bad bitmap file"); goto LFail; } if (bmh.bmih.biBitCount != 8) { Warn("not an 8-bit bitmap"); goto LFail; } if (bmh.bmih.biCompression != BI_RGB && !fRle || cbSrc != fpMac - (long)bmh.bmfh.bfOffBits && (cbSrc != 0 || fRle)) { Warn("bad compression type or bitmap file is wrong length"); goto LFail; } rc.Set(0, 0, bmh.bmih.biWidth, LwAbs(bmh.bmih.biHeight)); cbBitmap = CbRoundToLong(rc.xpRight) * rc.ypBottom; if (rc.FEmpty()) { Warn("Empty bitmap rectangle"); goto LFail; } if (!fRle) { if (cbSrc == 0) cbSrc = cbBitmap; else if (cbSrc != cbBitmap) { Warn("Bitmap data wrong size"); goto LFail; } } if (pvNil != ppglclr) { // get the palette if (bmh.bmih.biClrUsed != 0 && bmh.bmih.biClrUsed != 256) { Warn("palette is wrong size"); goto LFail; } if (pvNil == (*ppglclr = GL::PglNew(size(CLR), 256))) goto LFail; AssertDo((*ppglclr)->FSetIvMac(256), 0); fRet = pfil->FReadRgbSeq((*ppglclr)->PvLock(0), LwMul(size(CLR), 256), &fpCur); (*ppglclr)->Unlock(); if (!fRet) goto LFail; } if (pvNil == pprgb) goto LDone; if (fRle) { byte *pbSrc, *pbDst, *prgbSrc, *pbLimSrc, *pbLimDst; byte bT; long xp, cbT; long cbRowDst = CbRoundToLong(rc.xpRight); // get the source if (!FAllocPv((void **)&prgbSrc, cbSrc, fmemNil, mprNormal)) goto LFail; if (!pfil->FReadRgb(prgbSrc, cbSrc, bmh.bmfh.bfOffBits) || !FAllocPv((void **)pprgb, cbBitmap, fmemNil, mprNormal)) { goto LBad; } pbDst = *pprgb; pbSrc = prgbSrc; pbLimSrc = pbSrc + cbSrc; pbLimDst = pbDst + cbBitmap; xp = 0; for (;;) { if (2 > pbLimSrc - pbSrc) goto LBad; bT = *pbSrc++; if (bT != 0) { if (bT > pbLimDst - pbDst || bT > cbRowDst - xp) goto LBad; FillPb(pbDst, bT, *pbSrc++); pbDst += bT; xp += bT; continue; } // escaped bT = *pbSrc++; switch (bT) { case 0: // end of line if (cbRowDst > xp) FillPb(pbDst, cbRowDst - xp, bTransparent); pbDst += cbRowDst - xp; xp = 0; break; case 1: // end of bitmap if (pbLimDst > pbDst) FillPb(pbDst, pbLimDst - pbDst, bTransparent); goto LRleDone; case 2: // delta if (2 > pbLimSrc - pbSrc) goto LBad; cbT = pbSrc[0] + cbRowDst * pbSrc[1]; if (cbT > pbLimDst - pbDst || pbSrc[0] > cbRowDst - xp) goto LBad; FillPb(pbDst, cbT, bTransparent); pbDst += cbT; xp += pbSrc[0]; pbSrc += 2; break; default: // literal run cbT = LwRoundAway(bT, 2); if (cbT > pbLimSrc - pbSrc || bT > pbLimDst - pbDst || bT > cbRowDst - xp) { goto LBad; } CopyPb(pbSrc, pbDst, bT); pbDst += bT; pbSrc += cbT; xp += bT; break; } } LBad: // rle encoding is bad FreePpv((void **)&prgbSrc); Warn("compressed bitmap is bad"); goto LFail; LRleDone: FreePpv((void **)&prgbSrc); } else { // non-rle: get the bits if (!FAllocPv((void **)pprgb, cbBitmap, fmemNil, mprNormal)) goto LFail; if (!pfil->FReadRgb(*pprgb, cbBitmap, bmh.bmfh.bfOffBits)) { FreePpv((void **)pprgb); LFail: PushErc(ercMbmpCantOpenBitmap); if (pvNil != pprgb) *pprgb = pvNil; if (pvNil != ppglclr) ReleasePpo(ppglclr); TrashVar(pdxp); TrashVar(pdyp); TrashVar(pfUpsideDown); ReleasePpo(&pfil); return fFalse; } } LDone: if (pvNil != pdxp) *pdxp = bmh.bmih.biWidth; if (pvNil != pdyp) *pdyp = LwAbs(bmh.bmih.biHeight); if (pvNil != pfUpsideDown) *pfUpsideDown = bmh.bmih.biHeight < 0; ReleasePpo(&pfil); return fTrue; #endif // WIN #ifdef MAC if (pvNil != pprgb) *pprgb = pvNil; if (pvNil != ppglclr) *ppglclr = pvNil; TrashVar(pdxp); TrashVar(pdyp); TrashVar(pfUpsideDown); RawRtn(); // REVIEW peted: Mac FReadBitmap NYI return fFalse; #endif // MAC } /*************************************************************************** Writes a given bitmap to a given file. Arguments: FNI *pfni -- the name of the file to write byte *prgb -- the bits in the bitmap PGL pglclr -- the palette of the bitmap long dxp -- the width of the bitmap long dyp -- the height of the bitmap bool fUpsideDown -- indicates if the rows should be inverted Returns: fTrue if it could write the file ***************************************************************************/ bool FWriteBitmap(FNI *pfni, byte *prgb, PGL pglclr, long dxp, long dyp, bool fUpsideDown) { AssertPo(pfni, ffniFile); AssertVarMem(prgb); AssertPo(pglclr, 0); Assert(pglclr->IvMac() == 256, "Invalid color palette"); Assert(dxp >= 0, "Invalid width"); Assert(dyp >= 0, "Invalid height"); #ifdef WIN Assert(pglclr->CbEntry() == size(RGBQUAD), "Palette has different format from Windows"); #pragma pack(2) // the stupid bmfh is an odd number of shorts struct BMH { BITMAPFILEHEADER bmfh; BITMAPINFOHEADER bmih; }; #pragma pack() bool fRet = fFalse; long cbSrc; PFIL pfil = pvNil; FP fpCur = 0; BMH bmh; cbSrc = CbRoundToLong(dxp) * dyp; /* Fill in the header */ bmh.bmfh.bfType = 'MB'; bmh.bmfh.bfSize = size(bmh) + LwMul(size(RGBQUAD), 256) + cbSrc; bmh.bmfh.bfOffBits = size(bmh) + LwMul(size(RGBQUAD), 256); bmh.bmfh.bfReserved1 = bmh.bmfh.bfReserved2 = 0; bmh.bmih.biSize = size(bmh.bmih); bmh.bmih.biWidth = dxp; bmh.bmih.biHeight = dyp; bmh.bmih.biPlanes = 1; bmh.bmih.biBitCount = 8; bmh.bmih.biCompression = BI_RGB; bmh.bmih.biSizeImage = 0; bmh.bmih.biXPelsPerMeter = 0; bmh.bmih.biYPelsPerMeter = 0; bmh.bmih.biClrUsed = 256; bmh.bmih.biClrImportant = 256; /* Write the header */ if (pvNil == (pfil = FIL::PfilCreate(pfni))) goto LFail; if (!pfil->FWriteRgbSeq(&bmh, size(BMH), &fpCur)) goto LFail; /* Write the palette */ if (!pfil->FWriteRgbSeq(pglclr->PvLock(0), LwMul(size(CLR), 256), &fpCur)) { pglclr->Unlock(); goto LFail; } pglclr->Unlock(); /* Write the bits */ Assert((ulong)fpCur == bmh.bmfh.bfOffBits, "Current file pos is wrong"); if (fUpsideDown) { byte *pbCur; long cbRow = CbRoundToLong(dxp); pbCur = prgb + dyp * cbRow; fRet = fTrue; while (pbCur > prgb && fRet) { pbCur -= cbRow; fRet = pfil->FWriteRgbSeq(pbCur, cbRow, &fpCur); } } else fRet = pfil->FWriteRgbSeq(prgb, cbSrc, &fpCur); LFail: if (pfil != pvNil) { if (!fRet) pfil->SetTemp(); ReleasePpo(&pfil); } return fRet; #endif // WIN #ifdef MAC RawRtn(); // REVIEW peted: Mac FWriteBitmap NYI return fFalse; #endif // MAC } ================================================ FILE: kauai/src/mbmp.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Masked Bitmap management code declarations. ***************************************************************************/ #ifndef MBMP_H #define MBMP_H const FTG kftgBmp = 'BMP'; enum { fmbmpNil = 0, fmbmpUpsideDown = 1, fmbmpMask = 2, }; typedef class MBMP *PMBMP; #define MBMP_PAR BACO #define kclsMBMP 'MBMP' class MBMP : public MBMP_PAR { RTCLASS_DEC ASSERT MARKMEM protected: // rc (in the MBMPH) is the bounding rectangle of the mbmp. It implicitly // holds the reference point. // _hqrgb holds an MBMPH followed by an array of the length of each row // (rgcb) followed by the actual pixel data. The rgcb is an array of shorts // of length rc.Dyp(). We store the whole MBMPH in the _hqrgb so that // loading the MBMP from a chunky file is fast. If the chunk is compressed, // storing anything less than the full chunk in _hqrgb requires another blt. // The pixel data is stored row by row with transparency encoded using // an RLE scheme. For each row, the first byte is the number of consecutive // tranparent pixels. The next byte is the number of consecutive // non-transparent pixels (cb). The next cb bytes are the values of // the non-transparent pixels. This order repeats itself for the rest of // the row, and then the next row begins. Rows should never end with a // transparent byte. // If fMask is true, the non-transparent pixels are not in _hqrgb. Instead, // all non-transparent pixels have the value bFill. long _cbRgcb; // size of the rgcb portion of _hqrgb HQ _hqrgb; // MBMPH, short rgcb[_rc.Dyp()] followed by the pixel data // MBMP header on file struct MBMPH { short bo; short osk; byte fMask; byte bFill; // if fMask, the color value to use short swReserved; // should be zero on file RC rc; long cb; // length of whole chunk, including the header }; MBMP(void) { } virtual bool _FInit(byte *prgbPixels, long cbRow, long dyp, RC *prc, long xpRef, long ypRef, byte bTransparent, ulong grfmbmp = fmbmpNil, byte bDefault = 0); short *_Qrgcb(void) { return (short *)PvAddBv(QvFromHq(_hqrgb), size(MBMPH)); } MBMPH *_Qmbmph(void) { return (MBMPH *)QvFromHq(_hqrgb); } public: ~MBMP(void); static PMBMP PmbmpNew(byte *prgbPixels, long cbRow, long dyp, RC *prc, long xpRef, long ypRef, byte bTransparent, ulong grfmbmp = fmbmpNil, byte bDefault = 0); static PMBMP PmbmpReadNative(FNI *pfni, byte bTransparent = 0, long xp = 0, long yp = 0, ulong grfmbmp = fmbmpNil, byte bDefault = 0); static PMBMP PmbmpRead(PBLCK pblck); void GetRc(RC *prc); void Draw(byte *prgbPixels, long cbRow, long dyp, long xpRef, long ypRef, RC *prcClip = pvNil, PREGN pregnClip = pvNil); void DrawMask(byte *prgbPixels, long cbRow, long dyp, long xpRef, long ypRef, RC *prcClip = pvNil); bool FPtIn(long xp, long yp); virtual bool FWrite(PBLCK pblck); virtual long CbOnFile(void); // a chunky resource reader for an MBMP static bool FReadMbmp(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb); }; const BOM kbomMbmph = 0xAFFC0000; // reads a bitmap from the given file bool FReadBitmap(FNI *pfni, byte **pprgb, PGL *ppglclr, long *pdxp, long *pdyp, bool *pfUpsideDown, byte bTransparent = 0); // writes a bitmap file bool FWriteBitmap(FNI *pfni, byte *prgb, PGL pglclr, long dxp, long dyp, bool fUpsideDown = fTrue); #endif //! MBMP_H ================================================ FILE: kauai/src/mbmpgui.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Masked bitmap stuff that a GUI app might need. ***************************************************************************/ #include "frame.h" ASSERTNAME /*************************************************************************** This routine is called to draw the masked bitmap onto prgbPixels. cbRow and dyp are the respective width and height of prgbPixels. xpRef and ypRef are the coordinates within the prgbPixels to place the reference point of the MBMP. The drawing will be clipped to both prcClip and pregnClip, which may be nil. ***************************************************************************/ void MBMP::Draw(byte *prgbPixels, long cbRow, long dyp, long xpRef, long ypRef, RC *prcClip, PREGN pregnClip) { AssertThis(0); AssertIn(cbRow, 1, kcbMax); AssertIn(dyp, 1, kcbMax); AssertPvCb(prgbPixels, LwMul(cbRow, dyp)); AssertNilOrVarMem(prcClip); AssertNilOrPo(pregnClip, 0); #ifdef IN_80386 // NOTE the "rep movsd" and "rep movsb" used for writing the bytes is // responsible for most of the speed improvement of this over the straight // C code. The remaining asm gives us an additional 5 - 15 percent depending // on the complexity of the transparency (the more complex, the more // improvement over the C version). long yp, dxpT, xpOn; byte *qbRowSrc, *qbLastSrc, *pbOff; short *qcb; byte bFill; long lwFill; REGSC regsc; RC rcClip(0, 0, cbRow, dyp); MBMPH *qmbmph = _Qmbmph(); RC rcMbmp = qmbmph->rc; bool fMask = qmbmph->fMask; // Intersect prcClip with the boundary of prgbPixels. if (pvNil != prcClip && !rcClip.FIntersect(prcClip)) return; // Translate the mbmp's rc into coordinate system of prgbPixel's rc rcMbmp.Offset(xpRef, ypRef); // Intersect rcClip with mbmp's translated rc. if (!rcClip.FIntersect(&rcMbmp)) return; // Set up the region scanner if (pvNil != pregnClip) regsc.Init(pregnClip, &rcClip); else regsc.InitRc(&rcClip, &rcClip); qcb = _Qrgcb(); qbRowSrc = (byte *)PvAddBv(qcb, _cbRgcb); prgbPixels += LwMul(rcClip.ypTop, cbRow) + rcClip.xpLeft; rcMbmp.Offset(-rcClip.xpLeft, -rcClip.ypTop); rcClip.OffsetToOrigin(); if (fMask) { bFill = qmbmph->bFill; lwFill = LwFromBytes(bFill, bFill, bFill, bFill); } // Step down through rgcb until to top of clipping rc for (yp = rcMbmp.ypTop; yp < 0; yp++) qbRowSrc += *qcb++; // copy each row appropriately for (;;) { if ((xpOn = regsc.XpCur()) == klwMax) { // empty strip of the region long dypT; dypT = regsc.DypCur(); if ((yp += dypT) >= rcClip.ypBottom) break; regsc.ScanNext(dypT); prgbPixels += LwMul(dypT, cbRow); for (; dypT > 0; dypT--) qbRowSrc += *qcb++; continue; } AssertIn(xpOn, 0, rcClip.xpRight); pbOff = prgbPixels + LwMin(regsc.XpFetch(), rcClip.xpRight); // register allocation: // esi: qbSrc // edi: pbDst // ebx: pbOn // edx: dxp // eax: temp value #define qbSrc esi #define pbDst edi #define pbOn ebx #define dxp edx #define lwT eax __asm { // qbSrc = qbRowSrc; mov qbSrc,qbRowSrc // lwT = *qcb++; mov lwT,qcb add qcb,2 movzx lwT,WORD PTR[lwT] // qbLastSrc = qbSrc + lwT lea lwT,DWORD PTR[qbSrc+lwT-1] mov qbLastSrc,lwT // pbDst = prgbPixels + rcMbmp.xpLeft; // pbOn = prgbPixels + xpOn; mov pbOn,xpOn mov pbDst,prgbPixels add pbOn,pbDst add pbDst,rcMbmp.xpLeft // dxp = 0; xor dxp,dxp LGetDxp: // if (qbLastSrc <= qbSrc) goto LNextRow cmp qbLastSrc,qbSrc jbe LNextRow // dxp = qbSrc[1]; pbDst += *qbSrc; qbSrc += 2; movzx lwT,BYTE PTR[qbSrc] movzx dxp,BYTE PTR[qbSrc+1] add pbDst,lwT add qbSrc,2 LTestDxp: // if (dxp == 0) goto LGetDxp test dxp,dxp je LGetDxp // if (pbDst + dxp > pbOn) goto LAfterOn; lea lwT,DWORD PTR[pbDst+dxp] cmp lwT,pbOn ja LAfterOn // pbDst += dxp; add pbDst,dxp // if (!fMask) qbSrc += dxp; goto LGetDxp test fMask,-1L jnz LGetDxp add qbSrc,dxp jmp LGetDxp LAfterOn: // Assert(pbDst + dxp > pbOn, 0); // if (pbDst < pbOff) goto LBeforeOff; cmp pbDst,pbOff jb LBeforeOff // save the value of dxp across C code mov dxpT,dxp } // destination is after pbOff - need to advance the region scan xpOn = regsc.XpFetch(); if (xpOn == klwMax) goto LNextRow; pbOff = prgbPixels + LwMin(regsc.XpFetch(), rcClip.xpRight); __asm { // restore the value of dxp mov dxp,dxpT // pbOn = prgbPixels + xpOn; mov pbOn,prgbPixels add pbOn,xpOn // goto LTestDxp; jmp LTestDxp LBeforeOff: // AssertIn(0, pbOn - pbDst - dxp + 1, pbOff - pbDst); // if (pbOn <= pbDst) goto LDstAfterOn; cmp pbOn,pbDst jbe LDstAfterOn // destination is before pbOn: use pbDst as a temporary value to // store (pbDst - pbOn), which should be negative. // // pbDst -= pbOn; // dxp += pbDst; sub pbDst,pbOn add dxp,pbDst // if (!fMask) qbSrc -= pbDst; test fMask,-1L jnz LMask sub qbSrc,pbDst LMask: // pbDst = pbOn; mov pbDst,pbOn LDstAfterOn: // AssertIn(0, pbOn - pbDst, pbOff - pbDst); // lwT = LwMin(dxp, pbOff - pbDst); mov lwT,pbOff sub lwT,pbDst cmp lwT,dxp jle LKeepLwT mov lwT,dxp LKeepLwT: // dxp -= lwT; sub dxp,lwT // if (fMask) goto LFill; test fMask,-1L jnz LFill // CopyPb(qbSrc, pbDst, lwT); // qbSrc += lwT; pbDst += lwT; // move the longs mov ecx,lwT shr ecx,2 rep movsd // move the extra bytes mov ecx,lwT and ecx,3 rep movsb // goto LTestDxp; jmp LTestDxp LFill: // FillPb(pbDst, lwT, _bFill); // pbDst += lwT; mov ecx,lwT mov eax,lwFill // fill the longs mov dxpT,ecx shr ecx,2 rep stosd // fill the bytes mov ecx,dxpT and ecx,3 rep stosb // goto LTestDxp; jmp LTestDxp } #undef qbSrc #undef pbDst #undef pbOn #undef dxp #undef lwT LNextRow: if (++yp >= rcClip.ypBottom) break; regsc.ScanNext(1); // advance row pointers prgbPixels += cbRow; qbRowSrc = qbLastSrc + 1; } #else //! IN_80386 long yp, dxp, dypT, dxpT; byte *qbRowSrc, *qbSrc, *qbLastSrc; byte *pbOn, *pbOff, *pbDst; short *qcb; REGSC regsc; RC rcClip(0, 0, cbRow, dyp); MBMPH *qmbmph = _Qmbmph(); RC rcMbmp = qmbmph->rc; bool fMask = qmbmph->fMask; // Intersect prcClip with the boundary of prgbPixels. if (pvNil != prcClip && !rcClip.FIntersect(prcClip)) return; // Translate the mbmp's rc into coordinate system of prgbPixel's rc rcMbmp.Offset(xpRef, ypRef); // Intersect rcClip with mbmp's translated rc. if (!rcClip.FIntersect(&rcMbmp)) return; // Set up the region scanner if (pvNil != pregnClip) regsc.Init(pregnClip, &rcClip); else regsc.InitRc(&rcClip, &rcClip); qcb = _Qrgcb(); qbRowSrc = (byte *)PvAddBv(qcb, _cbRgcb); prgbPixels += LwMul(rcClip.ypTop, cbRow) + rcClip.xpLeft; rcMbmp.Offset(-rcClip.xpLeft, -rcClip.ypTop); rcClip.OffsetToOrigin(); // Step down through rgcb until to top of clipping rc for (yp = rcMbmp.ypTop; yp < 0; yp++) qbRowSrc += *qcb++; // copy each row appropriately for (;;) { if (regsc.XpCur() == klwMax) { // empty strip of the region dypT = regsc.DypCur(); if ((yp += dypT) >= rcClip.ypBottom) break; regsc.ScanNext(dypT); prgbPixels += LwMul(dypT, cbRow); for (; dypT > 0; dypT--) qbRowSrc += *qcb++; continue; } AssertIn(regsc.XpCur(), 0, rcClip.xpRight); qbLastSrc = (qbSrc = qbRowSrc) + *qcb++ - 1; pbDst = prgbPixels + rcMbmp.xpLeft; pbOn = prgbPixels + regsc.XpCur(); pbOff = prgbPixels + LwMin(rcClip.xpRight, regsc.XpFetch()); dxp = 0; for (;;) { while (dxp == 0) { if (qbSrc >= qbLastSrc) goto LNextRow; pbDst += *qbSrc++; dxp = *qbSrc++; } if (pbDst + dxp <= pbOn) { pbDst += dxp; if (!fMask) qbSrc += dxp; dxp = 0; continue; } Assert(pbDst + dxp > pbOn, 0); if (pbDst >= pbOff) { // destination is after pbOff - need to advance the region scan if (regsc.XpFetch() == klwMax) break; pbOn = prgbPixels + regsc.XpCur(); pbOff = prgbPixels + LwMin(rcClip.xpRight, regsc.XpFetch()); continue; } AssertIn(0, pbOn - pbDst - dxp + 1, pbOff - pbDst); if (pbOn > pbDst) { // destination is before pbOn dxp -= pbOn - pbDst; if (!fMask) qbSrc += pbOn - pbDst; pbDst = pbOn; } AssertIn(0, pbOn - pbDst, pbOff - pbDst); dxp -= (dxpT = LwMin(dxp, pbOff - pbDst)); if (fMask) { FillPb(pbDst, dxpT, qmbmph->bFill); pbDst += dxpT; } else { while (dxpT--) *pbDst++ = *qbSrc++; } } LNextRow: if (++yp >= rcClip.ypBottom) break; regsc.ScanNext(1); // advance row pointers prgbPixels += cbRow; qbRowSrc = qbLastSrc + 1; } #endif //! IN_80386 } /*************************************************************************** This routine is called to draw the masked bitmap as a mask onto prgbPixels. prgbPixels is assumed to be 1 bit deep. Zeros are written where the MBMP is transparent and ones are written where it is non-transparent. ***************************************************************************/ void MBMP::DrawMask(byte *prgbPixels, long cbRow, long dyp, long xpRef, long ypRef, RC *prcClip) { AssertThis(0); AssertIn(cbRow, 1, kcbMax); AssertIn(dyp, 1, kcbMax); AssertPvCb(prgbPixels, LwMul(cbRow, dyp)); AssertNilOrVarMem(prcClip); long yp, xp, dxp; byte *qbRowSrc, *qbSrc, *qbLimSrc; short *qcb; bool fTrans; long ib, ibNext; byte bMask, bMaskNext; MBMPH *qmbmph = _Qmbmph(); RC rcClip(0, 0, LwMul(cbRow, 8), dyp); RC rcMbmp = qmbmph->rc; bool fMask = qmbmph->fMask; // Intersect prcClip with the boundary of prgbPixels. if (pvNil != prcClip && !rcClip.FIntersect(prcClip)) return; // Translate the mbmp's rc into coordinate system of prgbPixel's rc rcMbmp.Offset(xpRef, ypRef); // Intersect rcClip with mbmp's translated rc. if (!rcClip.FIntersect(&rcMbmp)) return; qcb = _Qrgcb(); qbRowSrc = (byte *)PvAddBv(qcb, _cbRgcb); prgbPixels += LwMul(rcClip.ypTop, cbRow); // Step down through rgcb until to top of clipping rc for (yp = rcMbmp.ypTop; yp < rcClip.ypTop; yp++) qbRowSrc += *qcb++; // copy each row appropriately for (; yp < rcClip.ypBottom; yp++) { qbLimSrc = qbRowSrc + *qcb++; qbSrc = qbRowSrc; xp = rcMbmp.xpLeft; fTrans = fTrue; // Step through row until at left edge of clipping rc for (;;) { if (qbSrc >= qbLimSrc) { xp = rcClip.xpLeft; dxp = rcClip.Dxp(); fTrans = fTrue; break; } dxp = *qbSrc++; if (!fTrans && !fMask) qbSrc += dxp; if (xp + dxp > rcClip.xpLeft) { dxp -= rcClip.xpLeft - xp; xp = rcClip.xpLeft; break; } xp += dxp; fTrans = !fTrans; } while (xp < rcClip.xpRight) { if (xp + dxp > rcClip.xpRight) dxp = rcClip.xpRight - xp; if (dxp > 0) { // set or clear dxp bits ib = xp >> 3; bMask = 0xFF >> (xp & 0x07); xp += dxp; ibNext = xp >> 3; bMaskNext = 0xFF >> (xp & 0x07); if (ib == ibNext) { if (fTrans) prgbPixels[ib] &= ~bMask | bMaskNext; else prgbPixels[ib] |= bMask & ~bMaskNext; } else { if (fTrans) prgbPixels[ib] &= ~bMask; else prgbPixels[ib] |= bMask; if (ib + 1 < ibNext) FillPb(prgbPixels + ib + 1, ibNext - ib - 1, fTrans ? 0 : 0xFF); if (fTrans) prgbPixels[ibNext] &= bMaskNext; else prgbPixels[ibNext] |= ~bMaskNext; } } if (xp >= rcClip.xpRight) break; if (qbSrc >= qbLimSrc) { dxp = rcClip.xpRight - xp; fTrans = fTrue; } else { fTrans = !fTrans; dxp = *qbSrc++; if (!fTrans && !fMask) qbSrc += dxp; } } // advance row pointers prgbPixels += cbRow; qbRowSrc = qbLimSrc; } } ================================================ FILE: kauai/src/mdev2pri.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Private declarations for mididev2 (streamed midi). ***************************************************************************/ #ifndef MDEV2PRI_H #define MDEV2PRI_H // This corresponds to the Win95 MIDIEVENT structure (with no optional data). // We're using the older headers, so need to define our own. struct MEV { DWORD dwDeltaTime; // midi ticks between this and previous event DWORD dwStreamID; // reserved - must be zero DWORD dwEvent; }; typedef MEV *PMEV; // This corresponds to the Win95 MIDIHDR structure. // We're using the older headers, so need to define our own. struct MH { byte *lpData; DWORD dwBufferLength; DWORD dwBytesRecorded; DWORD dwUser; DWORD dwFlags; MH *lpNext; DWORD reserved; DWORD dwOffset; DWORD dwReserved[8]; }; typedef MH *PMH; typedef MIDIHDR *PMHO; // A midi stream handle can be used as a midi out handle. typedef HMIDIOUT HMS; /*************************************************************************** This is the midi stream cached object. ***************************************************************************/ typedef class MDWS *PMDWS; #define MDWS_PAR BACO #define kclsMDWS 'MDWS' class MDWS : public MDWS_PAR { RTCLASS_DEC ASSERT MARKMEM protected: PGL _pglmev; ulong _dts; MDWS(void); bool _FInit(PMIDS pmids); public: static bool FReadMdws(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb); static PMDWS PmdwsRead(PBLCK pblck); ~MDWS(void); ulong Dts(void) { return _dts; } void *PvLockData(long *pcb); void UnlockData(void); }; // forward declaration typedef class MSMIX *PMSMIX; typedef class MISI *PMISI; /*************************************************************************** Midi stream queue. ***************************************************************************/ typedef class MSQUE *PMSQUE; #define MSQUE_PAR SNQUE #define kclsMSQUE 'msqu' class MSQUE : public MSQUE_PAR { RTCLASS_DEC ASSERT MARKMEM protected: MUTX _mutx; // restricts access to member variables ulong _tsStart; // when we started the current sound PMSMIX _pmsmix; MSQUE(void); virtual void _Enter(void); virtual void _Leave(void); virtual bool _FInit(PMSMIX pmsmix); virtual PBACO _PbacoFetch(PRCA prca, CTG ctg, CNO cno); virtual void _Queue(long isndinMin); virtual void _PauseQueue(long isndinMin); virtual void _ResumeQueue(long isndinMin); public: static PMSQUE PmsqueNew(PMSMIX pmsmix); ~MSQUE(void); void Notify(PMDWS pmdws); }; /*************************************************************************** Midi Stream "mixer". It really just chooses which midi stream to play (based on the (spr, sii) priority). ***************************************************************************/ typedef class MSMIX *PMSMIX; #define MSMIX_PAR BASE #define kclsMSMIX 'msmx' class MSMIX : public MSMIX_PAR { RTCLASS_DEC ASSERT MARKMEM protected: struct MSOS { PMSQUE pmsque; // the "channel" or queue that the sound is on PMDWS pmdws; // the sound long sii; // its sound id (for a priority tie breaker) long spr; // its priority long cactPlay; // how many times to play the sound ulong dts; // length of this sound ulong dtsStart; // position to start at long vlm; // volume to play at ulong tsStart; // when we "started" the sound (minus dtsStart) }; // Mutex to protect our member variables MUTX _mutx; HN _hevt; // to notify the thread that the sound list changed HN _hth; // thread to terminate non-playing sounds PMISI _pmisi; // the midi stream interface PGL _pglmsos; // the list of current sounds, in priority order long _cpvOut; // number of buffers submitted (0, 1, or 2) PGL _pglmevKey; // to accumulate state events for seeking bool _fPlaying : 1; // whether we're currently playing the first stream bool _fWaiting : 1; // we're waiting for our buffers to get returned bool _fDone : 1; // tells the aux thread to terminate long _vlmBase; // the base device volume long _vlmSound; // the volume for the current sound MSMIX(void); bool _FInit(void); void _StopStream(void); bool _FGetKeyEvents(PMDWS pmdws, ulong dtsSeek, long *pcbSkip); void _Restart(bool fNew = fFalse); void _WaitForBuffers(void); void _SubmitBuffers(ulong tsCur); static void _MidiProc(ulong luUser, void *pvData, ulong luData); void _Notify(void *pvData, PMDWS pmdws); static ulong __stdcall _ThreadProc(void *pv); ulong _LuThread(void); public: static PMSMIX PmsmixNew(void); ~MSMIX(void); bool FPlay(PMSQUE pmsque, PMDWS pmdws = pvNil, long sii = siiNil, long spr = 0, long cactPlay = 1, ulong dtsStart = 0, long vlm = kvlmFull); void Suspend(bool fSuspend); void SetVlm(long vlm); long VlmCur(void); }; // Define these so we can use old (msvc 2.1) header files #ifndef MEVT_SHORTMSG #define MEVT_SHORTMSG ((BYTE)0x00) // parm = shortmsg for midiOutShortMsg #define MEVT_TEMPO ((BYTE)0x01) // parm = new tempo in microsec/qn #define MEVT_NOP ((BYTE)0x02) // parm = unused; does nothing #define MIDIPROP_SET 0x80000000L #define MIDIPROP_GET 0x40000000L #define MIDIPROP_TIMEDIV 0x00000001L #endif //! MEVT_SHORTMSG /*************************************************************************** The midi stream interface. ***************************************************************************/ typedef void (*PFNMIDI)(ulong luUser, void *pvData, ulong luData); typedef class MISI *PMISI; #define MISI_PAR BASE #define kclsMISI 'MISI' class MISI : public MISI_PAR { RTCLASS_DEC protected: HMS _hms; // the midi stream handle PFNMIDI _pfnCall; // call back function ulong _luUser; // user data to send back // system volume level - to be saved and restored. The volume we set // is always relative to this tribool _tBogusDriver; // to indicate whether midiOutGetVolume really works ulong _luVolSys; long _vlmBase; // our current volume relative to _luVolSys. MISI(PFNMIDI pfn, ulong luUser); virtual bool _FOpen(void) = 0; virtual bool _FClose(void) = 0; void _Reset(void); void _GetSysVol(void); void _SetSysVol(ulong luVol); void _SetSysVlm(void); public: virtual void SetVlm(long vlm); virtual long VlmCur(void); virtual bool FActive(void); virtual bool FActivate(bool fActivate); virtual bool FQueueBuffer(void *pvData, long cb, long ibStart, long cactPlay, ulong luData) = 0; virtual void StopPlaying(void) = 0; }; /*************************************************************************** The midiStreamStop API has a bug in it where it doesn't reset the current "buffer position" so that after calling midiStreamStop, then midiStreamOut and midiStreamRestart, the new buffer isn't played immediately, but the system waits until the previous buffer position expires before playing the new buffer. When this bug is fixed, STREAM_BUG can be undefined. ***************************************************************************/ #define STREAM_BUG /*************************************************************************** The real midi stream interface. ***************************************************************************/ typedef class WMS *PWMS; #define WMS_PAR MISI #define kclsWMS 'WMS' class WMS : public WMS_PAR { RTCLASS_DEC ASSERT MARKMEM protected: #define kcmhMsir 2 struct MSIR { void *pvData; long cb; long cactPlay; ulong luData; long ibNext; MH rgmh[kcmhMsir]; long rgibLim[kcmhMsir]; }; typedef MSIR *PMSIR; MUTX _mutx; HINSTANCE _hlib; PGL _pglpmsir; long _ipmsirCur; long _cmhOut; HN _hevt; // event to wake up the thread HN _hth; // thread to do callbacks and cleanup after a notify #ifdef STREAM_BUG bool _fActive : 1; #endif // STREAM_BUG bool _fDone : 1; // tells the aux thread to terminate MMRESULT(WINAPI *_pfnOpen) (HMS *phms, LPUINT puDeviceID, DWORD cMidi, DWORD dwCallback, DWORD dwInstance, DWORD fdwOpen); MMRESULT(WINAPI *_pfnClose)(HMS hms); MMRESULT(WINAPI *_pfnProperty)(HMS hms, LPBYTE lpb, DWORD dwProperty); MMRESULT(WINAPI *_pfnPosition)(HMS hms, LPMMTIME lpmmt, UINT cbmmt); MMRESULT(WINAPI *_pfnOut)(HMS hms, LPMIDIHDR pmh, UINT cbmh); MMRESULT(WINAPI *_pfnPause)(HMS hms); MMRESULT(WINAPI *_pfnRestart)(HMS hms); MMRESULT(WINAPI *_pfnStop)(HMS hms); WMS(PFNMIDI pfn, ulong luUser); bool _FInit(void); virtual bool _FOpen(void); virtual bool _FClose(void); bool _FSubmit(PMH pmh); void _DoCallBacks(void); long _CmhSubmitBuffers(void); void _ResetStream(void); static void __stdcall _MidiProc(HMS hms, ulong msg, ulong luUser, ulong lu1, ulong lu2); void _Notify(HMS hms, PMH pmh); static ulong __stdcall _ThreadProc(void *pv); ulong _LuThread(void); public: static PWMS PwmsNew(PFNMIDI pfn, ulong luUser); ~WMS(void); #ifdef STREAM_BUG virtual bool FActive(void); virtual bool FActivate(bool fActivate); #endif // STREAM_BUG virtual bool FQueueBuffer(void *pvData, long cb, long ibStart, long cactPlay, ulong luData); virtual void StopPlaying(void); }; /*************************************************************************** Our fake midi stream class. ***************************************************************************/ typedef class OMS *POMS; #define OMS_PAR MISI #define kclsOMS 'OMS' class OMS : public OMS_PAR { RTCLASS_DEC ASSERT MARKMEM protected: struct MSB { void *pvData; long cb; long ibStart; long cactPlay; ulong luData; }; MUTX _mutx; HN _hevt; // event to notify the thread that the stream data has changed HN _hth; // thread to play the stream data bool _fChanged : 1; // the event has been signalled bool _fStop : 1; // tells the aux thread to stop all buffers bool _fDone : 1; // tells the aux thread to return long _imsbCur; PGL _pglmsb; PMEV _pmev; PMEV _pmevLim; ulong _tsCur; OMS(PFNMIDI pfn, ulong luUser); bool _FInit(void); virtual bool _FOpen(void); virtual bool _FClose(void); static ulong __stdcall _ThreadProc(void *pv); ulong _LuThread(void); void _ReleaseBuffers(void); public: static POMS PomsNew(PFNMIDI pfn, ulong luUser); ~OMS(void); virtual bool FQueueBuffer(void *pvData, long cb, long ibStart, long cactPlay, ulong luData); virtual void StopPlaying(void); }; #endif //! MDEV2PRI_H ================================================ FILE: kauai/src/memmac.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Macintosh memory management. ***************************************************************************/ #include "util.h" ASSERTNAME // REVIEW shonk: Mac: implement HQ statistics // HQ header - actually goes at the end of the hq. struct HQH { #ifdef DEBUG short swMagic; // to detect memory trashing short cactRef; // for marking memory schar *pszsFile; // source file that allocation request is coming from long lwLine; // line in file that allocation request is coming from HQ hqPrev; // previous hq in doubly linked list HQ hqNext; // next hq in doubly linked list #endif // DEBUG byte cactLock; // lock count byte cbExtra; // count of extra bytes }; #ifdef DEBUG HQ _hqFirst; // head of the doubly linked list long vcactSuspendCheckPointers = 0; #endif // DEBUG inline void *_QvFromHq(HQ hq) { return vadst.PvStrip(*(void **)hq); } inline HQH *_QhqhFromHq(HQ hq) { return (HQH *)PvAddBv(vadst.PvStrip(*(void **)hq), GetHandleSize((HN)hq) - size(HQH)); } inline HQH *_QhqhFromHqBv(HQ hq, long bv) { return (HQH *)PvAddBv(vadst.PvStrip(*(void **)hq), bv); } long __pascal _CbFreeStuff(long cb); ADST vadst; /*************************************************************************** This is the GrowZone proc (a call back from the Mac OS memory manager). If _fInAlloc is true, we don't do anything, cuz the code that's doing the allocation will free stuff and try again. If _fInAlloc is false, it probably means that the Toolbox is allocating something, in which case, the priority is critical. REVIEW shonk: should we just free an emergency buffer and return? ***************************************************************************/ long __pascal _CbFreeStuff(long cb) { if (_fInAlloc || pvNil == vpfnlib) return 0; _fInAlloc = fTrue; cb = (*vpfnlib)(cb, mprCritical); _fInAlloc = fFalse; return cb; } /*************************************************************************** Constructor for the address stripper - overloaded to also set the grow-zone proc. ***************************************************************************/ ADST::ADST(void) { _lwMaskAddress = (long)StripAddress((void *)0xFFFFFFFFL); SetGrowZone(&_CbFreeStuff); } /*************************************************************************** Allocates a new moveable block. ***************************************************************************/ #ifdef DEBUG bool FAllocHqDebug(HQ *phq, long cb, ulong grfmem, long mpr, schar *pszsFile, long lwLine) #else //! DEBUG bool FAllocHq(HQ *phq, long cb, ulong grfmem, long mpr) #endif //! DEBUG { AssertVarMem(phq); AssertIn(cb, 0, kcbMax); HQH hqh; if (_fInAlloc) { Bug("recursing in FAllocHq"); goto LFail; } #ifdef DEBUG if (_hqFirst != hqNil) AssertHq(_hqFirst); #endif // DEBUG if (cb > kcbMax) { BugVar("who's allocating a humongous block?", &cb); goto LFail; } hqh.cbExtra = (-cb) & 3; Assert((cb + hqh.cbExtra) % 4 == 0, 0); // assert we don't overflow (the limit of kcbMax should ensure this) Assert(cb + size(HQH) + hqh.cbExtra > cb, 0); cb += hqh.cbExtra + size(HQH); _fInAlloc = fTrue; do { *phq = (grfmem & fmemClear) ? NewHandleClear(cb) : NewHandle(cb); } while (hqNil == *phq && vpfnlib != pvNil && (*vpfnlib)(cb, mpr) > 0); _fInAlloc = fFalse; if (hqNil == *phq) { LFail: *phq = hqNil; PushErc(ercOomHq); return fFalse; } #ifdef DEBUG if (!(grfmem & fmemClear)) FillPb(_QvFromHq(*phq), cb, kbGarbage); hqh.swMagic = kswMagicMem; hqh.pszsFile = pszsFile; hqh.lwLine = lwLine; hqh.hqPrev = hqNil; hqh.hqNext = _hqFirst; if (_hqFirst != hqNil) { Assert(_QhqhFromHq(_hqFirst)->hqPrev == hqNil, "_hqFirst's prev is not nil"); _QhqhFromHq(_hqFirst)->hqPrev = *phq; } _hqFirst = *phq; #endif // DEBUG hqh.cactLock = 0; *_QhqhFromHqBv(*phq, cb - size(HQH)) = hqh; AssertHq(*phq); return fTrue; } /*************************************************************************** Resizes the given hq. *phq may change (on Windows). If fhqClear, clears any newly added space. ***************************************************************************/ bool FResizePhq(HQ *phq, long cb, ulong grfmem, long mpr) { AssertVarMem(phq); AssertHq(*phq); AssertIn(cb, 0, kcbMax); HQH hqh; long cbOld; bool fInAllocSave; short err; if (cb > kcbMax) { BugVar("who's resizing a humongous block?", &cb); goto LFail; } cbOld = GetHandleSize((HN)*phq) - size(HQH); if (_fInAlloc && cb > cbOld) { Bug("recursing in FResizePhq"); goto LFail; } hqh = *_QhqhFromHqBv(*phq, cbOld); if (hqh.cactLock != 0) { Bug("Resizing locked HQ"); goto LFail; } #ifdef DEBUG // trash the old stuff if (cbOld > cb) FillPb(PvAddBv(_QvFromHq(*phq), cb), cbOld + size(HQH) - cb, kbGarbage); #endif cbOld -= hqh.cbExtra; hqh.cbExtra = (-cb) & 3; Assert((cb + hqh.cbExtra) % 4 == 0, 0); // assert we don't overflow (the limit of kcbMax should ensure this) Assert(cb + size(HQH) + hqh.cbExtra > cb, 0); fInAllocSave = _fInAlloc; _fInAlloc = true; do { err = ErrSetHandleSize((HN)*phq, cb + hqh.cbExtra + size(HQH)); } while (err != noErr && cb > cbOld && vpfnlib != pvNil && (*vpfnlib)(cb - cbOld, mpr) > 0); _fInAlloc = fInAllocSave; if (err != noErr) { LFail: AssertHq(*phq); PushErc(ercOomHq); return false; } if (cbOld < cb) { if (grfmem & fmemClear) ClearPb(PvAddBv(_QvFromHq(*phq), cbOld), cb - cbOld); #ifdef DEBUG else // trash the new stuff FillPb(PvAddBv(_QvFromHq(*phq), cbOld), cb - cbOld, kbGarbage); // trash the rest of the block FillPb(PvAddBv(_QvFromHq(*phq), cb), hqh.cbExtra + size(HQH), kbGarbage); #endif // DEBUG } // put the HQH where it belongs *_QhqhFromHqBv(*phq, cb + hqh.cbExtra) = hqh; AssertHq(*phq); return true; } /*************************************************************************** If hq is not nil, frees it. ***************************************************************************/ void FreePhq(HQ *phq) { AssertVarMem(phq); if (*phq == hqNil) return; #ifdef DEBUG AssertHq(*phq); HQH hqh; hqh = *_QhqhFromHq(*phq); Assert(hqh.cactLock == 0, "Freeing locked HQ"); // update prev's next pointer if (hqh.hqPrev == hqNil) { Assert(_hqFirst == *phq, "prev is wrongly nil"); _hqFirst = hqh.hqNext; } else { AssertHq(hqh.hqPrev); Assert(_hqFirst != *phq, "prev should be nil"); _QhqhFromHq(hqh.hqPrev)->hqNext = hqh.hqNext; } // update next's prev pointer if (hqh.hqNext != hqNil) { AssertHq(hqh.hqNext); _QhqhFromHq(hqh.hqNext)->hqPrev = hqh.hqPrev; } // fill the block with garbage FillPb(_QvFromHq(*phq), GetHandleSize((HN)*phq), kbGarbage); #endif // DEBUG DisposHandle((HN)*phq); *phq = hqNil; } /*************************************************************************** Return the size of the hq (the client area of the block). ***************************************************************************/ long CbOfHq(HQ hq) { AssertHq(hq); long cbRaw; cbRaw = GetHandleSize((HN)hq) - size(HQH); return cbRaw - _QhqhFromHqBv(hq, cbRaw)->cbExtra; } /*************************************************************************** Copy an hq to a new block. ***************************************************************************/ bool FCopyHq(HQ hqSrc, HQ *phqDst, long mpr) { AssertHq(hqSrc); AssertVarMem(phqDst); HQH *qhqh; short err; if (_fInAlloc) { Bug("recursing in FCopyHq"); goto LFail; } *phqDst = hqSrc; _fInAlloc = fTrue; do { err = HandToHand((HN *)phqDst); } while (err != noErr && vpfnlib != pvNil && (*vpfnlib)(CbOfHq(hqSrc), mpr) > 0); _fInAlloc = fFalse; if (err != noErr) { LFail: *phqDst = hqNil; PushErc(ercOomHq); return fFalse; } qhqh = _QhqhFromHq(*phqDst); #ifdef DEBUG qhqh->swMagic = kswMagicMem; qhqh->pszsFile = __szsFile; qhqh->lwLine = __LINE__; qhqh->hqPrev = hqNil; qhqh->hqNext = _hqFirst; if (_hqFirst != hqNil) { Assert(_QhqhFromHq(_hqFirst)->hqPrev == hqNil, "_hqFirst's prev is not nil"); _QhqhFromHq(_hqFirst)->hqPrev = *phqDst; } _hqFirst = *phqDst; #endif // DEBUG qhqh->cactLock = 0; AssertHq(*phqDst); return fTrue; } #ifdef DEBUG /*************************************************************************** Returns a volatile pointer from an hq. ***************************************************************************/ void *QvFromHq(HQ hq) { AssertHq(hq); return _QvFromHq(hq); } #endif // DEBUG /*************************************************************************** Lock the hq and return a pointer to the data. ***************************************************************************/ void *PvLockHq(HQ hq) { AssertHq(hq); HQH *qhqh; qhqh = _QhqhFromHq(hq); if (qhqh->cactLock++ == 0) HLock((HN)hq); Assert(_QhqhFromHq(hq)->cactLock > 0, "overflow in cactLock"); return _QvFromHq(hq); } /*************************************************************************** Unlock the hq. Asserts and does nothing if the lock count is zero. ***************************************************************************/ void UnlockHq(HQ hq) { AssertHq(hq); HQH *qhqh; qhqh = _QhqhFromHq(hq); Assert(qhqh->cactLock > 0, "hq not locked"); if (qhqh->cactLock > 0) { if (--qhqh->cactLock == 0) HUnlock((HN)hq); } } #ifdef DEBUG /*************************************************************************** Assert that a given hq is valid. ***************************************************************************/ void AssertHq(HQ hq) { static void *_pvMinZone; void *pvLimZone; void *qv; HQH hqh; long cb; short sw; // make sure hq isn't nil or odd if (hq == hqNil || (long(hq) & 1) != 0) { BugVar("hq is nil or odd", &hq); return; } // make sure *hq is not nil or odd if ((qv = _QvFromHq(hq)) == pvNil || (long(qv) & 1) != 0) { BugVar("*hq is nil or odd", &qv); return; } // get the heap limits and make sure the hq is in it if (pvNil == _pvMinZone) _pvMinZone = ApplicZone(); pvLimZone = (void *)LMGetHeapEnd(); if (hq <= _pvMinZone || hq >= pvLimZone) { BugVar("hq not in application heap", &hq); return; } if ((qv = _QvFromHq(hq)) <= _pvMinZone || qv >= pvLimZone) { BugVar("*hq not in the appication heap", &qv); return; } cb = GetHandleSize((HN)hq); AssertVar(cb >= size(HQH), "hq block is too small", &cb); AssertVar(cb <= BvSubPvs(pvLimZone, _QvFromHq(hq)), "hq block runs past end of heap", &cb); // verify the HQH hqh = *_QhqhFromHqBv(hq, cb - size(HQH)); if (hqh.swMagic != kswMagicMem) { BugVar("end of hq block is trashed", &hqh); return; } AssertVar(cb >= size(HQH) + hqh.cbExtra, "cbExtra or cb is wrong", &cb); sw = HGetState((HN)hq); Assert((hqh.cactLock == 0) == !(sw & 0x0080), "lock count is wrong"); Assert((hqh.hqPrev == hqNil) == (hq == _hqFirst), "hqPrev is wrong"); // verify the links if (hqh.hqPrev != hqNil) Assert(_QhqhFromHq(hqh.hqPrev)->hqNext == hq, "hqNext in prev is wrong"); if (hqh.hqNext != hqNil) Assert(_QhqhFromHq(hqh.hqNext)->hqPrev == hq, "hqPrev in next is wrong"); } /*************************************************************************** Increment the ref count on an hq. ***************************************************************************/ void MarkHq(HQ hq) { if (hq != hqNil) { AssertHq(hq); _QhqhFromHq(hq)->cactRef++; } } /*************************************************************************** Asserts on all unmarked HQs. ***************************************************************************/ void _AssertUnmarkedHqs(void) { HQ hq; for (hq = _hqFirst; hq != hqNil; hq = _QhqhFromHq(hq)->hqNext) { AssertHq(hq); if (_QhqhFromHq(hq)->cactRef == 0) { HQH hqh; long cb; achar stz[kcbMaxStz]; cb = CbOfHq(hq); hqh = *_QhqhFromHq(hq); FFormatStzSz(stz, "Lost hq of size %d allocated at line %d of file '%z'", cb, hqh.lwLine, hqh.pszsFile); Bug(PszStz(stz)); } } } /*************************************************************************** Clears all reference counts. ***************************************************************************/ void _UnmarkAllHqs(void) { HQ hq; for (hq = _hqFirst; hq != hqNil; hq = _QhqhFromHq(hq)->hqNext) { AssertHq(hq); _QhqhFromHq(hq)->cactRef = 0; } } /*************************************************************************** Assert on obviously bogus pointers. Assert that [pv, pv+cb) resides in either the app zone or the system zone. If cb is zero, pv can be anything (including nil). ***************************************************************************/ void AssertPvCb(void *pv, long cb) { static long _lwStrip; static void *_pvMinZone, *_pvMinSysZone; void *pvLimZone, *pvLimSysZone; void *pvClean, *pvLim; if (vcactSuspendCheckPointers != 0 || cb == 0) return; if (_pvMinZone == 0) { _pvMinZone = ApplicZone(); _pvMinSysZone = SystemZone(); _lwStrip = (long)StripAddress((void *)-1L); } pvLimZone = (void *)LMGetCurrentA5(); pvLimSysZone = (void *)(*(long *)_pvMinSysZone & _lwStrip); pvClean = (void *)((long)pv & _lwStrip); pvLim = PvAddBv(pvClean, cb); if (pvClean < _pvMinZone || pvLim > pvLimZone) { AssertVar(pvClean >= _pvMinSysZone && pvLim <= pvLimSysZone, "(pv,cb) not in app or sys zone", &pv); } } #endif // DEBUG ================================================ FILE: kauai/src/memwin.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Windows memory management. ***************************************************************************/ #include "util.h" ASSERTNAME struct HQH { long cb; // size of client area long cactLock; // lock count #ifdef DEBUG long lwMagic; // for detecting memory trashing #endif // DEBUG }; #ifdef DEBUG long vcactSuspendCheckPointers = 0; #endif // DEBUG /*************************************************************************** Allocates a new moveable block. ***************************************************************************/ #ifdef DEBUG bool FAllocHqDebug(HQ *phq, long cb, ulong grfmem, long mpr, PSZS pszsFile, long lwLine) #else //! DEBUG bool FAllocHq(HQ *phq, long cb, ulong grfmem, long mpr) #endif //! DEBUG { AssertVarMem(phq); AssertIn(cb, 0, kcbMax); HQH *phqh; if (!FAllocPvDebug((void **)&phqh, cb + size(HQH), grfmem, mpr, pszsFile, lwLine, &vdmglob.dmaglHq)) { PushErc(ercOomHq); *phq = hqNil; } else { phqh->cb = cb; phqh->cactLock = 0; Debug(phqh->lwMagic = klwMagicMem;) *phq = (HQ)(phqh + 1); AssertHq(*phq); } return pvNil != *phq; } /*************************************************************************** Resizes the given hq. *phq may change. If fmemClear, clears any newly added space. ***************************************************************************/ bool FResizePhq(HQ *phq, long cb, ulong grfmem, long mpr) { AssertVarMem(phq); AssertHq(*phq); AssertIn(cb, 0, kcbMax); bool fRet = fFalse; HQH *phqh = (HQH *)PvSubBv(*phq, size(HQH)); if (phqh->cactLock > 0) { Bug("Resizing locked HQ"); PushErc(ercOomHq); } else if (!_FResizePpvDebug((void **)&phqh, cb + size(HQH), phqh->cb + size(HQH), grfmem, mpr, &vdmglob.dmaglHq)) { PushErc(ercOomHq); AssertHq(*phq); } else { phqh->cb = cb; *phq = (HQ)(phqh + 1); AssertHq(*phq); fRet = fTrue; } return fRet; } /*************************************************************************** If hq is not nil, frees it. ***************************************************************************/ void FreePhq(HQ *phq) { AssertVarMem(phq); if (*phq == hqNil) return; AssertHq(*phq); HQH *phqh = (HQH *)PvSubBv(*phq, size(HQH)); *phq = hqNil; Assert(phqh->cactLock == 0, "Freeing locked HQ"); FreePpvDebug((void **)&phqh, &vdmglob.dmaglHq); } /*************************************************************************** Create a new HQ the same size as hqSrc and copy hqSrc into it. ***************************************************************************/ bool FCopyHq(HQ hqSrc, HQ *phqDst, long mpr) { AssertHq(hqSrc); AssertVarMem(phqDst); long cb; if (!FAllocHq(phqDst, cb = CbOfHq(hqSrc), fmemNil, mpr)) return fFalse; CopyPb(QvFromHq(hqSrc), QvFromHq(*phqDst), cb); return fTrue; } /*************************************************************************** Return the size of the hq (the client area of the block). ***************************************************************************/ long CbOfHq(HQ hq) { AssertHq(hq); HQH *phqh = (HQH *)PvSubBv(hq, size(HQH)); return phqh->cb; } #ifdef DEBUG /*************************************************************************** Returns a volatile pointer from an hq. ***************************************************************************/ void *QvFromHq(HQ hq) { AssertHq(hq); return (void *)hq; } #endif // DEBUG /*************************************************************************** Lock the hq and return a pointer to the data. ***************************************************************************/ void *PvLockHq(HQ hq) { AssertHq(hq); HQH *phqh = (HQH *)PvSubBv(hq, size(HQH)); phqh->cactLock++; Assert(phqh->cactLock > 0, "overflow in cactLock"); return (void *)hq; } /*************************************************************************** Unlock the hq. Asserts and does nothing if the lock count is zero. ***************************************************************************/ void UnlockHq(HQ hq) { AssertHq(hq); HQH *phqh = (HQH *)PvSubBv(hq, size(HQH)); Assert(phqh->cactLock > 0, "hq not locked"); if (phqh->cactLock > 0) --phqh->cactLock; } #ifdef DEBUG /*************************************************************************** Assert that a given hq is valid. ***************************************************************************/ void AssertHq(HQ hq) { // make sure hq isn't nil if (hq == hqNil) { Bug("hq is nil"); return; } // verify the HQH HQH *phqh = (HQH *)PvSubBv(hq, size(HQH)); if (phqh->lwMagic != klwMagicMem) { BugVar("beginning of hq block is trashed", phqh); return; } AssertIn(phqh->cactLock, 0, kcbMax); AssertPvAlloced(phqh, phqh->cb + size(HQH)); } /*************************************************************************** Increment the ref count on an hq. ***************************************************************************/ void MarkHq(HQ hq) { if (hqNil != hq) { AssertHq(hq); MarkPv(PvSubBv(hq, size(HQH))); } } /*************************************************************************** Make sure we can access a pointer's memory. If cb is 0, pv can be anything (including nil). ***************************************************************************/ void AssertPvCb(void *pv, long cb) { if (vcactSuspendCheckPointers == 0 && cb != 0) { // This assert has been disabled because AssertPvCb is called on pointers to // globals which were previously read/write but are now read-only. // AssertVar(!IsBadWritePtr(pv, cb), "no write access to ptr", &pv); // I (ShonK) am assuming that write access implies read access for // memory, so it would just be a waste of time to call this. // AssertVar(!IsBadReadPtr(pv, cb), "no read access to ptr", &pv); } } #endif // DEBUG ================================================ FILE: kauai/src/menu.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Menu bar management. ***************************************************************************/ #ifndef MENU_H #define MENU_H // Menu Bar class typedef class MUB *PMUB; #define MUB_PAR BASE #define kclsMUB 'MUB' class MUB : public MUB_PAR { RTCLASS_DEC MARKMEM private: #ifdef MAC // System Menu typedef MenuInfo SMU; // System Menu Bar struct SMB { ushort cmid; ushort rgmid[1]; }; // Menu Item struct MNI { long cid; long lw0; }; // Menu struct MNU { long mid; SMU **hnsmu; PGL pglmni; }; // menu list struct MLST { long imnu; long imniBase; long cmni; long cid; bool fSeparator; }; HN _hnmbar; PGL _pglmnu; PGL _pglmlst; // menu lists bool _FInsertMni(long imnu, long imni, long cid, long lw0, PSTN pstn); void _DeleteMni(long imnu, long imni); bool _FFindMlst(long imnu, long imni, MLST *pmlst = pvNil, long *pimlst = pvNil); bool _FGetCmdFromCode(long lwCode, CMD *pcmd); void _Free(void); bool _FFetchRes(ulong ridMenuBar); #endif // MAC #ifdef WIN // menu list struct MLST { HMENU hmenu; long imniBase; long wcidList; long cid; bool fSeparator; PGL pgllw; }; HMENU _hmenu; // the menu bar long _cmnu; // number of menus on the menu bar PGL _pglmlst; // menu lists bool _FInitLists(void); bool _FFindMlst(long wcid, MLST *pmlst, long *pimlst = pvNil); bool _FGetCmdForWcid(long wcid, PCMD pcmd); #endif // WIN protected: MUB(void) { } public: ~MUB(void); static PMUB PmubNew(ulong ridMenuBar); virtual void Set(void); virtual void Clean(void); #ifdef MAC virtual bool FDoClick(EVT *pevt); virtual bool FDoKey(EVT *pevt); #endif // MAC #ifdef WIN virtual void EnqueueWcid(long wcid); #endif // WIN virtual bool FAddListCid(long cid, long lw0, PSTN pstn); virtual bool FRemoveListCid(long cid, long lw0, PSTN pstn = pvNil); virtual bool FChangeListCid(long cid, long lwOld, PSTN pstnOld, long lwNew, PSTN pstnNew); virtual bool FRemoveAllListCid(long cid); }; extern PMUB vpmubCur; #endif //! MENU_H ================================================ FILE: kauai/src/menumac.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Mac menu bar management. REVIEW shonk: this is broken! Menu item names should be stored as STNs in the GG, except for DA names, which should be raw schar's (since they can have zeros in them). ***************************************************************************/ #include "frame.h" ASSERTNAME const achar kchCid = '#'; const achar kchList = '_'; const achar kchFontList = '$'; PMUB vpmubCur; RTCLASS(MUB) /*************************************************************************** Destructor - make sure vpmubCur is not this mub. ***************************************************************************/ MUB::~MUB(void) { // REVIEW shonk: free the _hnmbar if (vpmubCur == this) vpmubCur = pvNil; _Free(); } /*************************************************************************** Static method to load and set a new menu bar. ***************************************************************************/ PMUB MUB::PmubNew(ulong ridMenuBar) { PMUB pmub; if ((pmub = NewObj MUB) == pvNil) return pvNil; if (!pmub->_FFetchRes(ridMenuBar)) { ReleasePpo(&pmub); return pvNil; } AssertPo(pmub, 0); return pmub; } /*************************************************************************** Frees all mem associated with the menu bar. ***************************************************************************/ void MUB::_Free(void) { long imnu; MNU mnu; ReleasePpo(&_pglmlst); if (_pglmnu == pvNil) return; for (imnu = _pglmnu->IvMac(); imnu-- != 0;) { _pglmnu->Get(imnu, &mnu); ReleasePpo(&mnu.pglmni); } ReleasePpo(&_pglmnu); } /*************************************************************************** Loads the menu bar with the given resource id and makes this MUB the current one. Can only be called once per mub. ***************************************************************************/ bool MUB::_FFetchRes(ulong ridMenuBar) { SMB **hnsmb; MNU mnu; long cmnu, imnu; // get the menu list and record the menu id's if ((hnsmb = (SMB **)GetResource('MBAR', (ushort)ridMenuBar)) == hNil) return fFalse; cmnu = (*hnsmb)->cmid; if ((_pglmnu = GL::PglNew(size(MNU), cmnu)) == pvNil) return fFalse; mnu.hnsmu = hNil; mnu.pglmni = pvNil; for (imnu = 0; imnu < cmnu; imnu++) { mnu.mid = (*hnsmb)->rgmid[imnu]; AssertDo(_pglmnu->FInsert(imnu, &mnu), "assured insert failed"); } ReleaseResource((HN)hnsmb); // get the mbar and set it if ((_hnmbar = GetNewMBar((ushort)ridMenuBar)) == hNil) goto LFail; SetMenuBar(_hnmbar); for (imnu = 0; imnu < cmnu; imnu++) { long cmni, imni; MNI mni; long rtg; _pglmnu->Get(imnu, &mnu); if (hNil == (mnu.hnsmu = GetMHandle((ushort)mnu.mid))) goto LFail; cmni = CountMItems(mnu.hnsmu); if ((mnu.pglmni = GL::PglNew(size(MNI), cmni)) == pvNil) goto LFail; _pglmnu->Put(imnu, &mnu); for (imni = 0; imni < cmni; imni++) { achar stName[kcbMaxSt]; achar stz[kcbMaxStz]; achar *pch, *pchLim; long cch; achar chList; MLST mlst; long onn; // This loop looks for kchCid and kchList in the menu name. // Following a kchCid, it extracts the number (in ascii). // Following a kchList, an optional resource type (rtg) // is extracted. rtg = 0; mni.cid = cidNil; mni.lw0 = 0; GetItem(mnu.hnsmu, imni + 1, (byte *)stName); pchLim = pvNil; chList = chNil; for (cch = CchSt(stName), pch = PrgchSt(stName); cch--; pch++) { if (pchLim != pvNil) { AssertIn(*pch, '0', '9' + 1); mni.cid = mni.cid * 10 + *pch - '0'; } else if (*pch == kchCid) pchLim = pch; else if ((*pch == kchList || *pch == kchFontList) && pch == PrgchSt(stName)) chList = *pch; else if (kchList == chList) rtg = (rtg << 8) | *pch; } switch (chList) { default: Assert(chList == chNil, "unknown list type"); // not a list if (pchLim != pvNil) { SetStCch(stName, pchLim - stName - 1); if (CchSt(stName) == 0) { SetStCch(stName, 1); stName[1] = ' '; } SetItem(mnu.hnsmu, imni + 1, (byte *)stName); } if (!mnu.pglmni->FInsert(imni, &mni)) goto LFail; break; case kchFontList: // insert all the fonts mlst.fSeparator = (0 < imni); mlst.cid = mni.cid; mlst.imnu = imnu; mlst.cmni = vntl.OnnMac(); if (!mlst.fSeparator) { DelMenuItem(mnu.hnsmu, imni + 1); imni--; cmni--; } else { SetItem(mnu.hnsmu, imni + 1, "\p-"); DisableItem(mnu.hnsmu, imni + 1); mni.cid = cidNil; if (!mnu.pglmni->FInsert(imni, &mni)) goto LFail; } mlst.imniBase = imni + 1; for (onn = 0; onn < mlst.cmni; onn++) { vntl.GetStz(onn, stz); if (!_FInsertMni(imnu, ++imni, mlst.cid, 0, stz)) goto LFail; cmni++; } goto LInsertMlst; case kchList: if (imni != cmni - 1) { Assert(rtg == 0, "a resource list can only be the last item in a menu"); rtg = 0; } mlst.fSeparator = 0 != rtg && 0 < imni; mlst.cid = mni.cid; mlst.imnu = imnu; mlst.cmni = 0; if (!mlst.fSeparator) { DelMenuItem(mnu.hnsmu, imni + 1); imni--; cmni--; } else { SetItem(mnu.hnsmu, imni + 1, "\p-"); DisableItem(mnu.hnsmu, imni + 1); mni.cid = cidNil; if (!mnu.pglmni->FInsert(imni, &mni)) goto LFail; } mlst.imniBase = imni + 1; if (0 != rtg) { AddResMenu(mnu.hnsmu, rtg); mlst.cmni = cvNil; } LInsertMlst: if (pvNil == _pglmlst && pvNil == (_pglmlst = GL::PglNew(size(MLST), 1)) || !_pglmlst->FPush(&mlst)) { goto LFail; } break; } } } DrawMenuBar(); vpmubCur = this; return fTrue; LFail: _Free(); if (pvNil != vpmubCur) SetMenuBar(vpmubCur->_hnmbar); return fFalse; } /*************************************************************************** Make this the current menu bar. ***************************************************************************/ void MUB::Set(void) { AssertThis(0); SetMenuBar(_hnmbar); DrawMenuBar(); vpmubCur = this; } /*************************************************************************** Handle a mouse down event in the menu bar. ***************************************************************************/ bool MUB::FDoClick(EVT *pevt) { AssertThis(0); AssertVarMem(pevt); long lwCode; CMD cmd; bool fRet = fFalse; Clean(); lwCode = MenuSelect(pevt->where); if (SwHigh(lwCode) != 0 && _FGetCmdFromCode(lwCode, &cmd)) { vpcex->EnqueueCmd(&cmd); fRet = fTrue; } HiliteMenu(0); return fRet; } /*************************************************************************** Handle a menu key event. ***************************************************************************/ bool MUB::FDoKey(EVT *pevt) { AssertThis(0); AssertVarMem(pevt); long lwCode; CMD cmd; bool fRet = fFalse; Clean(); lwCode = MenuKey(pevt->message & charCodeMask); if (SwHigh(lwCode) != 0 && _FGetCmdFromCode(lwCode, &cmd)) { vpcex->EnqueueCmd(&cmd); fRet = fTrue; } HiliteMenu(0); return fRet; } /*************************************************************************** Make sure the menu's are clean - ie, items are enabled/disabled/marked correctly. Called immediately before dropping the menus. ***************************************************************************/ void MUB::Clean(void) { AssertThis(0); long imnu, imni; ulong grfeds; MNU mnu; MNI mni; CMD cmd; achar st[kcbMaxSt]; long cch; for (imnu = _pglmnu->IvMac(); imnu-- > 0;) { _pglmnu->Get(imnu, &mnu); if ((imni = mnu.pglmni->IvMac()) == 0) continue; ClearPb(&cmd, size(cmd)); while (imni-- > 0) { mnu.pglmni->Get(imni, &mni); if (mni.cid == cidNil) continue; cmd.cid = mni.cid; cmd.rglw[0] = mni.lw0; if (_FFindMlst(imnu, imni)) { // need the item name in a GG GetItem(mnu.hnsmu, imni + 1, (byte *)st); cch = (long)*(byte *)st; if ((cmd.pgg = GG::PggNew(0, 1, cch)) != pvNil) AssertDo(cmd.pgg->FInsert(0, cch, st + 1), 0); } grfeds = vpcex->GrfedsForCmd(&cmd); ReleasePpo(&cmd.pgg); if (grfeds & fedsEnable) EnableItem(mnu.hnsmu, imni + 1); else if (grfeds & fedsDisable) DisableItem(mnu.hnsmu, imni + 1); if (grfeds & kgrfedsMark) { SetItemMark(mnu.hnsmu, imni + 1, (grfeds & fedsCheck) ? checkMark : (grfeds & fedsBullet) ? diamondMark : noMark); } } } } /*************************************************************************** See if the given item is in a list. ***************************************************************************/ bool MUB::_FFindMlst(long imnu, long imni, MLST *pmlst, long *pimlst) { AssertThis(0); AssertNilOrVarMem(pmlst); AssertNilOrVarMem(pimlst); long imlst; MLST mlst; if (pvNil == _pglmlst) return fFalse; for (imlst = _pglmlst->IvMac(); imlst-- > 0;) { _pglmlst->Get(imlst, &mlst); if (mlst.imnu == imnu && imni >= mlst.imniBase && (mlst.cmni == cvNil || imni < mlst.imniBase + mlst.cmni)) { if (pvNil != pmlst) *pmlst = mlst; if (pvNil != pimlst) *pimlst = imlst; return fTrue; } } TrashVar(pmlst); TrashVar(pimlst); return fFalse; } /*************************************************************************** Get a command struct for the command from the Mac menu item code. ***************************************************************************/ bool MUB::_FGetCmdFromCode(long lwCode, CMD *pcmd) { AssertThis(0); AssertVarMem(pcmd); long mid = SwHigh(lwCode); long imni = SwLow(lwCode); long cmni; long imnu, cmnu; MNU mnu; MNI mni; achar st[kcbMaxSt]; long cch; bool fNeedName; MLST mlst; // the code is one-based if (imni-- == 0) return fFalse; for (imnu = 0, cmnu = _pglmnu->IvMac();; imnu++) { if (imnu >= cmnu) return fFalse; _pglmnu->Get(imnu, &mnu); if (mnu.mid == mid) break; } cmni = mnu.pglmni->IvMac(); ClearPb(pcmd, size(*pcmd)); fNeedName = _FFindMlst(imnu, imni, &mlst); if (imni < cmni) { mnu.pglmni->Get(imni, &mni); if (mni.cid == cidNil) return fFalse; Assert(!fNeedName || mni.cid == mlst.cid, "bad list item"); pcmd->cid = mni.cid; pcmd->rglw[0] = mni.lw0; } else if (!fNeedName) return fFalse; else pcmd->cid = mlst.cid; if (fNeedName) { // need the item name in a GG GetItem(mnu.hnsmu, imni + 1, (byte *)st); cch = (long)*(byte *)st; if (pvNil == (pcmd->pgg = GG::PggNew(0, 1, cch))) return fFalse; AssertDo(pcmd->pgg->FInsert(0, cch, st + 1), 0); } return fTrue; } /*************************************************************************** Adds an item identified by the given list cid, long parameter and string. ***************************************************************************/ bool MUB::FAddListCid(long cid, long lw0, PSTZ pstz) { AssertThis(0); AssertStz(pstz); long imlst; MLST mlst; long imnuPrev; long dimni; bool fSeparator; bool fRet = fTrue; if (pvNil == _pglmlst) return fTrue; imnuPrev = ivNil; dimni = 0; for (imlst = 0; imlst < _pglmlst->IvMac(); imlst++) { _pglmlst->Get(imlst, &mlst); if (mlst.imnu == imnuPrev) { mlst.imniBase += dimni; _pglmlst->Put(imlst, &mlst); } else { imnuPrev = mlst.imnu; dimni = 0; } if (cid != mlst.cid || mlst.cmni == cvNil) goto LAdjustSeparator; if (!_FInsertMni(mlst.imnu, mlst.imniBase + mlst.cmni, cid, lw0, pstz)) { fRet = fFalse; goto LAdjustSeparator; } mlst.cmni++; _pglmlst->Put(imlst, &mlst); dimni++; LAdjustSeparator: fSeparator = mlst.imniBase > FPure(mlst.fSeparator) && (mlst.cmni > 0 || mlst.cmni == cvNil); if (fSeparator && !mlst.fSeparator) { // add a separator if (!_FInsertMni(mlst.imnu, mlst.imniBase, cidNil, 0, "\x2" "(-")) fRet = fFalse; else { mlst.imniBase++; mlst.fSeparator = fTrue; _pglmlst->Put(imlst, &mlst); dimni++; } } else if (!fSeparator && mlst.fSeparator) { // delete a separator _DeleteMni(mlst.imnu, --mlst.imniBase); mlst.fSeparator = fFalse; _pglmlst->Put(imlst, &mlst); dimni--; } } return fRet; } /*************************************************************************** Insert a new menu item. ***************************************************************************/ bool MUB::_FInsertMni(long imnu, long imni, long cid, long lw0, PSTZ pstz) { AssertThis(0); AssertIn(imnu, 0, _pglmnu->IvMac()); AssertStz(pstz); MNU mnu; MNI mni; long cmni; _pglmnu->Get(imnu, &mnu); AssertPo(mnu.pglmni, 0); AssertIn(imni, 0, mnu.pglmni->IvMac() + 1); mni.cid = cid; mni.lw0 = lw0; if (!mnu.pglmni->FInsert(imni, &mni)) return fFalse; cmni = CountMItems(mnu.hnsmu); InsMenuItem(mnu.hnsmu, (byte *)pstz, (short)imni); if (CountMItems(mnu.hnsmu) != cmni + 1) { mnu.pglmni->Delete(imni); return fFalse; } return fTrue; } /*************************************************************************** Delete a menu item. ***************************************************************************/ void MUB::_DeleteMni(long imnu, long imni) { AssertThis(0); AssertIn(imnu, 0, _pglmnu->IvMac()); MNU mnu; _pglmnu->Get(imnu, &mnu); AssertPo(mnu.pglmni, 0); AssertIn(imni, 0, mnu.pglmni->IvMac()); mnu.pglmni->Delete(imni); DelMenuItem(mnu.hnsmu, imni + 1); } /*************************************************************************** Removes all items identified by the given list cid, and long parameter or string. If pstz is non-nil, it is used to find the item. If pstz is nil, lw0 is used to identify the item. ***************************************************************************/ bool MUB::FRemoveListCid(long cid, long lw0, PSTZ pstz) { AssertThis(0); AssertNilOrStz(pstz); long imlst; MLST mlst; MNU mnu; MNI mni; achar st[kcbMaxSt]; long imnuPrev; long dimni, imni; bool fSeparator; bool fRet = fTrue; if (pvNil == _pglmlst) return fTrue; imnuPrev = ivNil; dimni = 0; for (imlst = 0; imlst < _pglmlst->IvMac(); imlst++) { _pglmlst->Get(imlst, &mlst); if (mlst.imnu == imnuPrev) { mlst.imniBase += dimni; Assert(mlst.imniBase >= FPure(mlst.fSeparator), "bad imniBase"); _pglmlst->Put(imlst, &mlst); } else { imnuPrev = mlst.imnu; dimni = 0; _pglmnu->Get(mlst.imnu, &mnu); } if (cid != mlst.cid || mlst.cmni <= 0) goto LAdjustSeparator; for (imni = mlst.imniBase; imni < mlst.imniBase + mlst.cmni; imni++) { if (pvNil == pstz) { mnu.pglmni->Get(imni, &mni); Assert(mni.cid == mlst.cid, "bad mni"); if (mni.lw0 != lw0) continue; } else { GetItem(mnu.hnsmu, imni + 1, (byte *)st); if (!FEqualSt(st, pstz)) continue; } _DeleteMni(mlst.imnu, imni--); mlst.cmni--; _pglmlst->Put(imlst, &mlst); dimni--; } LAdjustSeparator: fSeparator = mlst.imniBase > FPure(mlst.fSeparator) && (mlst.cmni > 0 || mlst.cmni == cvNil); if (fSeparator && !mlst.fSeparator) { // add a separator if (!_FInsertMni(mlst.imnu, mlst.imniBase, cidNil, 0, "\x2" "(-")) fRet = fFalse; else { mlst.imniBase++; mlst.fSeparator = fTrue; _pglmlst->Put(imlst, &mlst); dimni++; } } else if (!fSeparator && mlst.fSeparator) { // delete a separator _DeleteMni(mlst.imnu, --mlst.imniBase); mlst.fSeparator = fFalse; _pglmlst->Put(imlst, &mlst); dimni--; } } return fRet; } /*************************************************************************** Removes all items identified by the given list cid. ***************************************************************************/ bool MUB::FRemoveAllListCid(long cid) { AssertThis(0); long imlst; MLST mlst; long imnuPrev; long dimni; bool fSeparator; bool fRet = fTrue; if (pvNil == _pglmlst) return fTrue; imnuPrev = ivNil; dimni = 0; for (imlst = 0; imlst < _pglmlst->IvMac(); imlst++) { _pglmlst->Get(imlst, &mlst); if (mlst.imnu == imnuPrev) { mlst.imniBase += dimni; Assert(mlst.imniBase >= FPure(mlst.fSeparator), "bad imniBase"); _pglmlst->Put(imlst, &mlst); } else { imnuPrev = mlst.imnu; dimni = 0; } if (cid == mlst.cid) { while (mlst.cmni > 0) { _DeleteMni(mlst.imnu, mlst.imniBase); mlst.cmni--; dimni--; } } fSeparator = mlst.imniBase > FPure(mlst.fSeparator) && (mlst.cmni > 0 || mlst.cmni == cvNil); if (fSeparator && !mlst.fSeparator) { // add a separator if (!_FInsertMni(mlst.imnu, mlst.imniBase, cidNil, 0, "\x2" "(-")) fRet = fFalse; else { mlst.imniBase++; mlst.fSeparator = fTrue; _pglmlst->Put(imlst, &mlst); dimni++; } } else if (!fSeparator && mlst.fSeparator) { // delete a separator _DeleteMni(mlst.imnu, --mlst.imniBase); mlst.fSeparator = fFalse; _pglmlst->Put(imlst, &mlst); dimni--; } } return fRet; } /*************************************************************************** Changes the long parameter and the menu text associated with a menu list item. If pstzOld is non-nil, it is used to find the item. If pstzOld is nil, lwOld is used to identify the item. In either case lwNew is set as the new long parameter and if pstzNew is non-nil, it is used as the new menu item text. ***************************************************************************/ bool MUB::FChangeListCid(long cid, long lwOld, PSTZ pstzOld, long lwNew, PSTZ pstzNew) { AssertThis(0); AssertNilOrStz(pstzOld); AssertNilOrStz(pstzNew); long imlst; MLST mlst; long imni; MNI mni; MNU mnu; achar st[kcbMaxSt]; if (pvNil == _pglmlst) return fTrue; for (imlst = 0; imlst < _pglmlst->IvMac(); imlst++) { _pglmlst->Get(imlst, &mlst); if (cid != mlst.cid || mlst.cmni <= 0) continue; for (imni = mlst.imniBase; imni < mlst.imniBase + mlst.cmni; imni++) { _pglmnu->Get(mlst.imnu, &mnu); if (pvNil == pstzOld) { mnu.pglmni->Get(imni, &mni); if (mni.lw0 != lwOld) continue; } else { GetItem(mnu.hnsmu, imni + 1, (byte *)st); if (!FEqualSt(st, pstzOld)) continue; mnu.pglmni->Get(imni, &mni); } mni.lw0 = lwNew; mnu.pglmni->Put(imni, &mni); if (pvNil != pstzNew) { // change the string SetItem(mnu.hnsmu, imni + 1, (byte *)pstzNew); } } } return fTrue; } #ifdef DEBUG /*************************************************************************** Mark mem used by the menu bar. ***************************************************************************/ void MUB::MarkMem(void) { AssertThis(0); long imnu; MNU mnu; MUB_PAR::MarkMem(); MarkMemObj(_pglmnu); if (_pglmnu == pvNil || (imnu = _pglmnu->IvMac()) == 0) return; while (imnu--) { _pglmnu->Get(imnu, &mnu); MarkMemObj(mnu.pglmni); } } #endif // DEBUG ================================================ FILE: kauai/src/menuwin.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Windows menu code. REVIEW shonk: error codes ***************************************************************************/ #include "frame.h" ASSERTNAME const achar kchList = '_'; const achar kchFontList = '$'; PMUB vpmubCur; RTCLASS(MUB) /*************************************************************************** Destructor - make sure vpmubCur is not this mub. ***************************************************************************/ MUB::~MUB(void) { // REVIEW shonk: free mem and the _hmenu if (vpmubCur == this) vpmubCur = pvNil; } /*************************************************************************** Static method to load and set a new menu bar. ***************************************************************************/ PMUB MUB::PmubNew(ulong ridMenuBar) { PMUB pmub; if ((pmub = NewObj MUB) == pvNil) return pvNil; if ((pmub->_hmenu = LoadMenu(vwig.hinst, MIR(ridMenuBar))) == hNil) { ReleasePpo(&pmub); return pvNil; } pmub->_cmnu = GetMenuItemCount(pmub->_hmenu); if (!pmub->_FInitLists()) { ReleasePpo(&pmub); return pvNil; } pmub->Set(); return pmub; } /*************************************************************************** Make this the current menu bar. ***************************************************************************/ void MUB::Set(void) { if (vwig.hwndClient != hNil) { Assert(IsWindow(vwig.hwndClient), "bad client window"); SendMessage(vwig.hwndClient, WM_MDISETMENU, (WPARAM)_hmenu, hNil); } else SetMenu(vwig.hwndApp, _hmenu); vpmubCur = this; } /*************************************************************************** Make sure the menu's are clean - ie, items are enabled/disabled/marked correctly. Called immediately before dropping the menus. ***************************************************************************/ void MUB::Clean(void) { long imnu, imni, cmnu; ulong grfeds; HMENU hmenu; long wcid; CMD cmd; // adjust for the goofy mdi window's menu cmnu = GetMenuItemCount(_hmenu); Assert(cmnu >= _cmnu, "somebody took some menus out of the menu bar!"); if (cmnu > _cmnu) { imnu = 1; cmnu = _cmnu + 1; } else imnu = 0; for (; imnu < cmnu; imnu++) { if ((hmenu = GetSubMenu(_hmenu, imnu)) == hNil) continue; for (imni = GetMenuItemCount(hmenu); imni-- != 0;) { if ((wcid = GetMenuItemID(hmenu, imni)) == cidNil) continue; if (!_FGetCmdForWcid(wcid, &cmd)) grfeds = fedsDisable; else { grfeds = vpcex->GrfedsForCmd(&cmd); ReleasePpo(&cmd.pgg); } if (grfeds & fedsEnable) EnableMenuItem(hmenu, imni, MF_BYPOSITION | MF_ENABLED); else if (grfeds & fedsDisable) EnableMenuItem(hmenu, imni, MF_BYPOSITION | MF_GRAYED); if (grfeds & kgrfedsMark) { // REVIEW shonk: bullet doesn't work (uses a check mark) CheckMenuItem(hmenu, imni, (grfeds & (fedsCheck | fedsBullet)) ? MF_BYPOSITION | MF_CHECKED : MF_BYPOSITION | MF_UNCHECKED); } } } } /*************************************************************************** The given wcid is the value Windows handed us in a WM_COMMAND message. Remap it to a real command id and enqueue the result. ***************************************************************************/ void MUB::EnqueueWcid(long wcid) { CMD cmd; if (_FGetCmdForWcid(wcid, &cmd)) vpcex->EnqueueCmd(&cmd); } /*************************************************************************** Adds an item identified by the given list cid, long parameter and string. ***************************************************************************/ bool MUB::FAddListCid(long cid, long lw0, PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); long imlst, ilw; MLST mlst; HMENU hmenuPrev; long dimni; bool fSeparator; bool fRet = true; if (pvNil == _pglmlst) return fTrue; hmenuPrev = hNil; dimni = 0; for (imlst = 0; imlst < _pglmlst->IvMac(); imlst++) { _pglmlst->Get(imlst, &mlst); if (mlst.hmenu == hmenuPrev) { mlst.imniBase += dimni; _pglmlst->Put(imlst, &mlst); } else { hmenuPrev = mlst.hmenu; dimni = 0; } if (cid != mlst.cid) goto LAdjustSeparator; if (pvNil == mlst.pgllw) { if (pvNil == (mlst.pgllw = GL::PglNew(size(long)))) { fRet = fFalse; goto LAdjustSeparator; } _pglmlst->Put(imlst, &mlst); mlst.pgllw->SetMinGrow(10); } ilw = mlst.pgllw->IvMac(); if (!mlst.pgllw->FPush(&lw0)) { fRet = fFalse; goto LAdjustSeparator; } if (!InsertMenu(mlst.hmenu, mlst.imniBase + ilw, MF_BYPOSITION | MF_STRING, mlst.wcidList + ilw, pstn->Psz())) { fRet = fFalse; AssertDo(mlst.pgllw->FPop(), 0); goto LAdjustSeparator; } dimni++; LAdjustSeparator: fSeparator = mlst.imniBase > FPure(mlst.fSeparator) && pvNil != mlst.pgllw && mlst.pgllw->IvMac() > 0; if (fSeparator && !mlst.fSeparator) { // add a separator if (!InsertMenu(mlst.hmenu, mlst.imniBase, MF_BYPOSITION | MF_SEPARATOR, cidNil, pvNil)) { fRet = false; } else { mlst.imniBase++; mlst.fSeparator = true; _pglmlst->Put(imlst, &mlst); dimni++; } } else if (!fSeparator && mlst.fSeparator) { // delete a separator if (!DeleteMenu(mlst.hmenu, mlst.imniBase - 1, MF_BYPOSITION)) fRet = true; else { mlst.imniBase--; mlst.fSeparator = fFalse; _pglmlst->Put(imlst, &mlst); dimni--; } } } return fRet; } /*************************************************************************** Removes all items identified by the given list cid, and long parameter or string. If pstn is non-nil, it is used to find the item. If pstn is nil, lw0 is used to identify the item. ***************************************************************************/ bool MUB::FRemoveListCid(long cid, long lw0, PSTN pstn) { AssertThis(0); AssertNilOrPo(pstn, 0); long imlst, ilw, cch; MLST mlst; SZ sz; HMENU hmenuPrev; long dimni; long lw; bool fSeparator, fSetWcid; bool fRet = fTrue; if (pvNil == _pglmlst) return fTrue; hmenuPrev = hNil; dimni = 0; for (imlst = 0; imlst < _pglmlst->IvMac(); imlst++) { _pglmlst->Get(imlst, &mlst); if (mlst.hmenu == hmenuPrev) { mlst.imniBase += dimni; Assert(mlst.imniBase >= FPure(mlst.fSeparator), "bad imniBase"); _pglmlst->Put(imlst, &mlst); } else { hmenuPrev = mlst.hmenu; dimni = 0; } if (cid != mlst.cid || pvNil == mlst.pgllw) goto LAdjustSeparator; fSetWcid = fFalse; for (ilw = 0; ilw < mlst.pgllw->IvMac(); ilw++) { if (pvNil == pstn) { mlst.pgllw->Get(ilw, &lw); if (lw != lw0) goto LSetWcid; } else { cch = GetMenuString(mlst.hmenu, mlst.imniBase + ilw, sz, kcchMaxSz, MF_BYPOSITION); if (!pstn->FEqualRgch(sz, cch)) goto LSetWcid; } if (!DeleteMenu(mlst.hmenu, mlst.imniBase + ilw, MF_BYPOSITION)) { fRet = fFalse; LSetWcid: if (fSetWcid) { cch = GetMenuString(mlst.hmenu, mlst.imniBase + ilw, sz, kcchMaxSz, MF_BYPOSITION); if (cch == 0 || !ModifyMenu(mlst.hmenu, mlst.imniBase + ilw, MF_BYPOSITION, mlst.wcidList + ilw, sz)) { fRet = fFalse; } } continue; } mlst.pgllw->Delete(ilw--); dimni--; fSetWcid = fTrue; } LAdjustSeparator: fSeparator = mlst.imniBase > FPure(mlst.fSeparator) && pvNil != mlst.pgllw && mlst.pgllw->IvMac() > 0; if (fSeparator && !mlst.fSeparator) { // add a separator if (!InsertMenu(mlst.hmenu, mlst.imniBase, MF_BYPOSITION | MF_SEPARATOR, cidNil, pvNil)) { fRet = fFalse; } else { mlst.imniBase++; mlst.fSeparator = fTrue; _pglmlst->Put(imlst, &mlst); dimni++; } } else if (!fSeparator && mlst.fSeparator) { // delete a separator if (!DeleteMenu(mlst.hmenu, mlst.imniBase - 1, MF_BYPOSITION)) fRet = fFalse; else { mlst.imniBase--; mlst.fSeparator = fFalse; _pglmlst->Put(imlst, &mlst); dimni--; } } } return fRet; } /*************************************************************************** Removes all items identified by the given list cid. ***************************************************************************/ bool MUB::FRemoveAllListCid(long cid) { AssertThis(0); long imlst, ilw; MLST mlst; HMENU hmenuPrev; long dimni; bool fSeparator; bool fRet = fTrue; if (pvNil == _pglmlst) return fTrue; hmenuPrev = hNil; dimni = 0; for (imlst = 0; imlst < _pglmlst->IvMac(); imlst++) { _pglmlst->Get(imlst, &mlst); if (mlst.hmenu == hmenuPrev) { mlst.imniBase += dimni; Assert(mlst.imniBase >= FPure(mlst.fSeparator), "bad imniBase"); _pglmlst->Put(imlst, &mlst); } else { hmenuPrev = mlst.hmenu; dimni = 0; } if (cid == mlst.cid && pvNil != mlst.pgllw) { for (ilw = 0; ilw < mlst.pgllw->IvMac(); ilw++) { if (!DeleteMenu(mlst.hmenu, mlst.imniBase + ilw, MF_BYPOSITION)) { fRet = fFalse; continue; } mlst.pgllw->Delete(ilw--); dimni--; } } fSeparator = mlst.imniBase > FPure(mlst.fSeparator) && pvNil != mlst.pgllw && mlst.pgllw->IvMac() > 0; if (fSeparator && !mlst.fSeparator) { // add a separator if (!InsertMenu(mlst.hmenu, mlst.imniBase, MF_BYPOSITION | MF_SEPARATOR, cidNil, pvNil)) { fRet = fFalse; } else { mlst.imniBase++; mlst.fSeparator = fTrue; _pglmlst->Put(imlst, &mlst); dimni++; } } else if (!fSeparator && mlst.fSeparator) { // delete a separator if (!DeleteMenu(mlst.hmenu, mlst.imniBase - 1, MF_BYPOSITION)) fRet = fFalse; else { mlst.imniBase--; mlst.fSeparator = fFalse; _pglmlst->Put(imlst, &mlst); dimni--; } } } return fRet; } /*************************************************************************** Changes the long parameter and the menu text associated with a menu list item. If pstnOld is non-nil, it is used to find the item. If pstnOld is nil, lwOld is used to identify the item. In either case lwNew is set as the new long parameter and if pstnNew is non-nil, it is used as the new menu item text. ***************************************************************************/ bool MUB::FChangeListCid(long cid, long lwOld, PSTN pstnOld, long lwNew, PSTN pstnNew) { AssertThis(0); AssertNilOrPo(pstnOld, 0); AssertNilOrPo(pstnNew, 0); long imlst, ilw, cch, lw; MLST mlst; SZ sz; bool fRet = fTrue; if (pvNil == _pglmlst) return fTrue; for (imlst = 0; imlst < _pglmlst->IvMac(); imlst++) { _pglmlst->Get(imlst, &mlst); if (cid != mlst.cid || pvNil == mlst.pgllw) continue; for (ilw = 0; ilw < mlst.pgllw->IvMac(); ilw++) { if (pvNil == pstnOld) { mlst.pgllw->Get(ilw, &lw); if (lw != lwOld) continue; } else { cch = GetMenuString(mlst.hmenu, mlst.imniBase + ilw, sz, kcchMaxSz, MF_BYPOSITION); if (!pstnOld->FEqualRgch(sz, cch)) continue; } if (pvNil != pstnNew) { // change the string fRet = ModifyMenu(mlst.hmenu, mlst.imniBase + ilw, MF_BYPOSITION | MF_STRING, mlst.wcidList + ilw, pstnNew->Psz()) && fRet; } mlst.pgllw->Put(ilw, &lwNew); } } return fRet; } /*************************************************************************** Fill in the CMD structure for the given wcid. ***************************************************************************/ bool MUB::_FGetCmdForWcid(long wcid, PCMD pcmd) { AssertVarMem(pcmd); MLST mlst; ClearPb(pcmd, size(*pcmd)); if (wcid >= wcidListBase && _FFindMlst(wcid, &mlst)) { long lw, cch; SZ sz; STN stn; mlst.pgllw->Get(wcid - mlst.wcidList, &lw); cch = GetMenuString(mlst.hmenu, mlst.imniBase + wcid - mlst.wcidList, sz, kcchMaxSz, MF_BYPOSITION); stn = sz; if (cch == 0 || (pcmd->pgg = GG::PggNew(0, 1, stn.CbData())) == pvNil) return fFalse; AssertDo(pcmd->pgg->FInsert(0, stn.CbData(), pvNil), 0); stn.GetData(pcmd->pgg->PvLock(0)); pcmd->pgg->Unlock(); pcmd->cid = mlst.cid; pcmd->rglw[0] = lw; } else pcmd->cid = wcid; return fTrue; } /*************************************************************************** See if the given item is in a list. ***************************************************************************/ bool MUB::_FFindMlst(long wcid, MLST *pmlst, long *pimlst) { long imlst; MLST mlst; if (pvNil == _pglmlst) return fFalse; for (imlst = _pglmlst->IvMac(); imlst-- > 0;) { _pglmlst->Get(imlst, &mlst); if (wcid < mlst.wcidList || pvNil == mlst.pgllw) continue; if (wcid < mlst.pgllw->IvMac() + mlst.wcidList) { if (pvNil != pmlst) *pmlst = mlst; if (pvNil != pimlst) *pimlst = imlst; return fTrue; } } TrashVar(pmlst); TrashVar(pimlst); return fFalse; } /*************************************************************************** If the menu bar has a font list item or other list item, do the right thing. ***************************************************************************/ bool MUB::_FInitLists(void) { long imnu, imni, cmni, cmnu; HMENU hmenu; long cid; MLST mlst; SZ sz; STN stn; long onn; long wcidList = wcidListBase; cmnu = GetMenuItemCount(_hmenu); Assert(cmnu == _cmnu, "bad _cmnu"); for (imnu = 0; imnu < cmnu; imnu++) { if ((hmenu = GetSubMenu(_hmenu, imnu)) == hNil) continue; for (cmni = GetMenuItemCount(hmenu), imni = 0; imni < cmni; imni++) { if ((cid = GetMenuItemID(hmenu, imni)) == cidNil) continue; if (1 != GetMenuString(hmenu, imni, sz, kcchMaxSz, MF_BYPOSITION)) { continue; } switch (sz[0]) { default: break; case kchFontList: // insert all the fonts mlst.fSeparator = (0 < imni); if (!mlst.fSeparator) { if (!DeleteMenu(hmenu, imni, MF_BYPOSITION)) return fFalse; imni--; cmni--; } else if (!ModifyMenu(hmenu, imni, MF_BYPOSITION | MF_SEPARATOR, cidNil, pvNil)) { return fFalse; } mlst.imniBase = imni + 1; mlst.hmenu = hmenu; mlst.wcidList = wcidList; wcidList += dwcidList; mlst.cid = cid; if (pvNil == (mlst.pgllw = GL::PglNew(size(long), vntl.OnnMac()))) return fFalse; for (onn = 0; onn < vntl.OnnMac(); onn++) { vntl.GetStn(onn, &stn); if (!mlst.pgllw->FPush(&onn) || !InsertMenu(hmenu, ++imni, MF_BYPOSITION | MF_STRING, mlst.wcidList + onn, stn.Psz())) { ReleasePpo(&mlst.pgllw); return fFalse; } cmni++; } goto LInsertMlst; case kchList: mlst.hmenu = hmenu; mlst.imniBase = imni; mlst.wcidList = wcidList; wcidList += dwcidList; mlst.cid = cid; mlst.fSeparator = fFalse; mlst.pgllw = pvNil; if (!DeleteMenu(hmenu, imni, MF_BYPOSITION)) return fFalse; imni--; cmni--; LInsertMlst: if (pvNil == _pglmlst && pvNil == (_pglmlst = GL::PglNew(size(MLST), 1)) || !_pglmlst->FPush(&mlst)) { ReleasePpo(&mlst.pgllw); return fFalse; } break; } } } return fTrue; } #ifdef DEBUG /*************************************************************************** Mark mem used by the menu bar. ***************************************************************************/ void MUB::MarkMem(void) { AssertThis(0); long imlst; MLST mlst; MUB_PAR::MarkMem(); if (pvNil == _pglmlst) return; MarkMemObj(_pglmlst); for (imlst = _pglmlst->IvMac(); imlst-- > 0;) { _pglmlst->Get(imlst, &mlst); MarkMemObj(mlst.pgllw); } } #endif // DEBUG ================================================ FILE: kauai/src/midi.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Copyright (c) Microsoft Corporation Midi stream and midi stream parser classes. ***************************************************************************/ #include "frame.h" ASSERTNAME RTCLASS(MSTP) RTCLASS(MIDS) /*************************************************************************** Constructor for a midi stream parser. ***************************************************************************/ MSTP::MSTP(void) { AssertBaseThis(0); _pmids = pvNil; } /*************************************************************************** Destructor for a midi stream parser. ***************************************************************************/ MSTP::~MSTP(void) { AssertThis(0); if (pvNil != _pmids) UnlockHq(_pmids->_hqrgb); ReleasePpo(&_pmids); } /*************************************************************************** Initialize this midi stream parser to the given midi stream and use the given time as the start time. ***************************************************************************/ void MSTP::Init(PMIDS pmids, ulong tsStart, long lwTempo) { AssertThis(0); AssertNilOrPo(pmids, 0); if (_pmids != pmids) { if (pvNil != _pmids) { UnlockHq(_pmids->_hqrgb); ReleasePpo(&_pmids); } _pmids = pmids; if (pvNil == _pmids) return; _pmids->AddRef(); _prgb = (byte *)PvLockHq(_pmids->_hqrgb); _pbLim = _prgb + CbOfHq(_pmids->_hqrgb); } else if (pvNil == _pmids) return; _pbCur = _prgb; _tsCur = tsStart; _lwTempo = lwTempo; _bStatus = 0; AssertThis(0); } /*************************************************************************** Get the next midi event. If fAdvance is true, advance to the next event after getting this one. ***************************************************************************/ bool MSTP::FGetEvent(PMIDEV pmidev, bool fAdvance) { AssertThis(0); AssertNilOrVarMem(pmidev); byte bT; byte *pbCur; MIDEV midev; long cbT; long ibSend; ulong tsCur; ClearPb(&midev, size(midev)); midev.lwTempo = _lwTempo; if (pvNil == _pmids) goto LFail; tsCur = _tsCur; for (pbCur = _pbCur; midev.cb == 0;) { // read the delta time if (!_FReadVar(&pbCur, (long *)&midev.ts) || pbCur >= _pbLim) goto LFail; tsCur += midev.ts; midev.ts = tsCur; if ((bT = *pbCur) & 0x80) { // status byte _bStatus = bT; pbCur++; } // NOTE: we never return running status midev.rgbSend[0] = _bStatus; ibSend = 1; switch (_bStatus & 0xF0) { default: goto LFail; case 0x80: // note off case 0x90: // note on case 0xA0: // key pressure case 0xB0: // control change case 0xE0: // pitch wheel goto LTwoBytes; case 0xC0: // program change case 0xD0: // channel pressure goto LOneByte; case 0xF0: switch (_bStatus & 0x0F) { default: // unknown opcode goto LFail; case 0x02: LTwoBytes: // 2 bytes worth of parameters if (pbCur + 2 > _pbLim) goto LFail; midev.rgbSend[ibSend++] = *pbCur++; midev.rgbSend[ibSend++] = *pbCur++; midev.cb = ibSend; break; case 0x01: // quarter frame case 0x03: // song select LOneByte: // 1 byte worth of parameters if (pbCur >= _pbLim) goto LFail; midev.rgbSend[ibSend++] = *pbCur++; midev.cb = ibSend; break; case 0x06: case 0x08: case 0x0A: case 0x0B: case 0x0C: case 0x0E: // no parameters _bStatus = 0; // can't use running status on this! midev.cb = ibSend; break; case 0x00: case 0x07: // system exclusive messages - ignore them // read the length if (!_FReadVar(&pbCur, &cbT) || !FIn(cbT - 1, 0, _pbLim - pbCur)) { goto LFail; } pbCur += cbT; break; case 0x0F: // meta event if (pbCur >= _pbLim) goto LFail; bT = *pbCur++; if (!_FReadVar(&pbCur, &cbT) || !FIn(cbT, 0, _pbLim - pbCur + 1)) { goto LFail; } switch (bT) { default: pbCur += cbT; break; case 0x2F: // end of track goto LFail; case 0x51: // tempo change if (cbT != 3) goto LFail; midev.lwTempo = LwFromBytes(0, pbCur[0], pbCur[1], pbCur[2]); if (fAdvance) _lwTempo = midev.lwTempo; pbCur += 3; goto LSend; } break; } break; } } LSend: if (pvNil != pmidev) *pmidev = midev; if (fAdvance) { _pbCur = pbCur; _tsCur = tsCur; } return fTrue; LFail: _pbCur = _pbLim; TrashVar(pmidev); return fFalse; } /*************************************************************************** Read a variable length quantity. ***************************************************************************/ bool MSTP::_FReadVar(byte **ppbCur, long *plw) { AssertThis(0); AssertVarMem(ppbCur); byte bT; *plw = 0; do { if (*ppbCur >= _pbLim) return fFalse; bT = *(*ppbCur)++; *plw = (*plw << 7) + (bT & 0x7F); } while (bT & 0x80); return fTrue; } #ifdef DEBUG /*************************************************************************** Assert the validity of a MSTP. ***************************************************************************/ void MSTP::AssertValid(ulong grf) { MSTP_PAR::AssertValid(0); if (pvNil == _pmids) return; AssertPo(_pmids, 0); Assert(_prgb == (byte *)QvFromHq(_pmids->_hqrgb), 0); Assert(_pbLim == _prgb + CbOfHq(_pmids->_hqrgb), 0); AssertIn(_pbCur - _prgb, 0, _pbLim - _prgb + 1); } /*************************************************************************** Mark memory for the MSTP. ***************************************************************************/ void MSTP::MarkMem(void) { AssertValid(0); MSTP_PAR::MarkMem(); MarkMemObj(_pmids); } #endif // DEBUG /*************************************************************************** Constructor for a midi stream object. ***************************************************************************/ MIDS::MIDS(void) { } /*************************************************************************** Destructor for a midi stream object. ***************************************************************************/ MIDS::~MIDS(void) { FreePhq(&_hqrgb); } #ifdef DEBUG /*************************************************************************** Assert the validity of a MIDS. ***************************************************************************/ void MIDS::AssertValid(ulong grf) { MIDS_PAR::AssertValid(0); AssertHq(_hqrgb); } /*************************************************************************** Mark memory for the MIDS. ***************************************************************************/ void MIDS::MarkMem(void) { AssertValid(0); MIDS_PAR::MarkMem(); MarkHq(_hqrgb); } #endif // DEBUG /*************************************************************************** A baco reader for a midi stream. ***************************************************************************/ bool MIDS::FReadMids(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb) { AssertPo(pcrf, 0); AssertPo(pblck, fblckReadable); AssertNilOrVarMem(ppbaco); AssertVarMem(pcb); PMIDS pmids; *pcb = pblck->Cb(fTrue); if (pvNil == ppbaco) return fTrue; if (!pblck->FUnpackData()) goto LFail; *pcb = pblck->Cb(); if (pvNil == (pmids = PmidsRead(pblck))) { LFail: TrashVar(ppbaco); TrashVar(pcb); return fFalse; } *ppbaco = pmids; return fTrue; } /*************************************************************************** Read a midi stream from the given block. ***************************************************************************/ PMIDS MIDS::PmidsRead(PBLCK pblck) { AssertPo(pblck, 0); PMIDS pmids; if (pvNil == (pmids = NewObj MIDS)) return pvNil; if (!pblck->FUnpackData() || !pblck->FReadHq(&pmids->_hqrgb)) ReleasePpo(&pmids); AssertNilOrPo(pmids, 0); return pmids; } /*************************************************************************** Read a native standard midi file and create a midi stream from it. ***************************************************************************/ PMIDS MIDS::PmidsReadNative(FNI *pfni) { AssertPo(pfni, ffniFile); #pragma pack(1) // Midi chunk header struct MIDCHD { long lwSig; long cb; }; #define kbomMidchd 0xF0000000 // Midi file header chunk - should be first chunk struct MIDHED { MIDCHD midchd; short swFmt; short ctrk; short swDiv; }; #define kbomMidhed 0xF5400000 #pragma pack() struct MIDTR { PMSTP pmstp; MIDEV midevCur; }; FLO flo; FP fp; MIDHED midhed; MIDCHD midchd; MIDTR midtr; bool fSmpte; BSM bsm; RAT ratTempo; ulong tsTempo, tsRawTempo, tsLast, ts, dts; byte rgbT[5]; long cbT; bool fSeq; long imidtr, imidtrMin; ulong tsMin; PMIDS pmids = pvNil; PGL pglmidtr = pvNil; // open the file and set up the source flo if (pvNil == (flo.pfil = FIL::PfilOpen(pfni))) return pvNil; flo.fp = 0; flo.cb = flo.pfil->FpMac(); // get the header chunk if (flo.cb < size(MIDHED) || !flo.FReadRgb(&midhed, size(midhed), 0)) goto LFail; // byte order is always big endian #ifdef LITTLE_ENDIAN SwapBytesBom(&midhed, kbomMidhed); #endif // LITTLE_ENDIAN // make sure it's a valid header chunk if (midhed.midchd.lwSig != 'MThd' || !FIn(midhed.midchd.cb + size(midchd), size(midhed), flo.cb)) { goto LFail; } // allocate the list of tracks to parse if (pvNil == (pglmidtr = GL::PglNew(size(MIDTR)))) goto LFail; // build the track list... for (fp = midhed.midchd.cb + size(midchd); fp < flo.cb;) { // read the next midi chunk header if (fp + size(midchd) > flo.cb || !flo.FReadRgb(&midchd, size(midchd), fp)) { goto LFail; } fp += size(midchd); #ifdef LITTLE_ENDIAN SwapBytesBom(&midchd, kbomMidchd); #endif // LITTLE_ENDIAN // make sure the chunk length is valid if (!FIn(midchd.cb, 0, flo.cb - fp + 1)) goto LFail; // if it's not a track chunk ignore it if (midchd.lwSig != 'MTrk' || midchd.cb == 0) { fp += midchd.cb; continue; } // wrap a midi stream object around the track data if (pvNil == (pmids = NewObj MIDS) || !flo.FReadHq(&pmids->_hqrgb, midchd.cb, fp)) { goto LFail; } fp += midchd.cb; // create the midi stream parser for this stream if (pvNil == (midtr.pmstp = NewObj MSTP)) goto LFail; midtr.pmstp->Init(pmids, 0, 500000 /* microseconds per beat */); ReleasePpo(&pmids); // get the first event - if there isn't one, just free // the stream parser and continue if (!midtr.pmstp->FGetEvent(&midtr.midevCur)) { ReleasePpo(&midtr.pmstp); continue; } // add the track to the list if (!pglmidtr->FAdd(&midtr)) { ReleasePpo(&midtr.pmstp); goto LFail; } if (midhed.swFmt != 1 && midhed.swFmt != 2) { // we're only supposed to have one track and we have it, // so don't bother looking for more. break; } } ReleasePpo(&flo.pfil); // make sure we have at least one track if (pglmidtr->IvMac() == 0) goto LFail; // set the amount to grow the bsm by bsm.SetMinGrow(1024); if (FPure(fSmpte = (midhed.swDiv < 0))) { // SMPTE time long fps = (byte)(-BHigh(midhed.swDiv)); long ctickFrame = BLow(midhed.swDiv); if (fps == 29) fps = 30; // 29 is 30 drop frame - 30 is close enough for us if (ctickFrame <= 0 || fps <= 0) goto LFail; ratTempo.Set(1000, LwMul(fps, ctickFrame)); } else { // midhed.swDiv is the number of ticks per beat. if (midhed.swDiv == 0) goto LFail; // assume 120 beats per minute - gives us 500 ms per beat ratTempo.Set(500, midhed.swDiv); } // merge the tracks or play them in sequence (according to fSeq). fSeq = pglmidtr->IvMac() == 1 || midhed.swFmt == 2; tsTempo = tsRawTempo = 0; tsLast = 0; if (fSeq) { imidtrMin = 0; pglmidtr->Get(0, &midtr); } for (;;) { if (!fSeq) { // find the track with the next event imidtrMin = ivNil; tsMin = kluMax; for (imidtr = 0; imidtr < pglmidtr->IvMac(); imidtr++) { pglmidtr->Get(imidtr, &midtr); if (midtr.midevCur.ts < tsMin) { tsMin = midtr.midevCur.ts; imidtrMin = imidtr; } } Assert(imidtrMin != ivNil, 0); pglmidtr->Get(imidtrMin, &midtr); } // get the time of this event ts = ratTempo.LwScale(midtr.midevCur.ts - tsRawTempo) + tsTempo; if (midtr.midevCur.cb == 0) { // just a tempo change if (!fSmpte) { RAT ratTempoNew(midtr.midevCur.lwTempo, LwMul(1000, midhed.swDiv)); if (ratTempo != ratTempoNew) { ratTempo = ratTempoNew; tsRawTempo = midtr.midevCur.ts; tsTempo = ts; } } } else { // write the time out - in variable format Assert(midtr.midevCur.cb > 0, 0); dts = ts - tsLast; cbT = _CbEncodeLu(dts, rgbT); if (!bsm.FReplace(rgbT, cbT, bsm.IbMac(), 0)) goto LFail; if (!bsm.FReplace(midtr.midevCur.rgbSend, midtr.midevCur.cb, bsm.IbMac(), 0)) { goto LFail; } } tsLast = ts; if (midtr.pmstp->FGetEvent(&midtr.midevCur)) { if (!fSeq) pglmidtr->Put(imidtrMin, &midtr); } else { // imidtrMin is empty ReleasePpo(&midtr.pmstp); pglmidtr->Delete(imidtrMin); if (0 == pglmidtr->IvMac()) break; if (fSeq) { tsTempo = tsLast; tsRawTempo = 0; pglmidtr->Get(0, &midtr); } } } if (pvNil != (pmids = NewObj MIDS) && FAllocHq(&pmids->_hqrgb, bsm.IbMac(), fmemNil, mprNormal)) { bsm.FetchRgb(0, bsm.IbMac(), PvLockHq(pmids->_hqrgb)); UnlockHq(pmids->_hqrgb); } else { LFail: ReleasePpo(&pmids); } // clean up stuff ReleasePpo(&flo.pfil); if (pvNil != pglmidtr) { while (pglmidtr->FPop(&midtr)) ReleasePpo(&midtr.pmstp); ReleasePpo(&pglmidtr); } AssertNilOrPo(pmids, 0); return pmids; } /*************************************************************************** Static method to convert a long to its midi file variable length equivalent. ***************************************************************************/ long MIDS::_CbEncodeLu(ulong lu, byte *prgb) { AssertNilOrVarMem(prgb); long ib; if (pvNil != prgb) prgb[0] = (byte)(lu & 0x7F); for (ib = 1; (lu >>= 7) > 0; ib++) { if (pvNil != prgb) prgb[ib] = (byte)((lu & 0x7F) | 0x80); } if (pvNil != prgb) ReversePb(prgb, ib); return ib; } /*************************************************************************** Write a midi stream to the given block. ***************************************************************************/ bool MIDS::FWrite(PBLCK pblck) { AssertThis(0); AssertPo(pblck, 0); return pblck->FWriteHq(_hqrgb, 0); } /*************************************************************************** Return the length of this midi stream on file. ***************************************************************************/ long MIDS::CbOnFile(void) { AssertThis(0); return CbOfHq(_hqrgb); } ================================================ FILE: kauai/src/midi.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Copyright (c) Microsoft Corporation Midi playback class. ***************************************************************************/ #ifndef MIDI_H #define MIDI_H typedef class MIDS *PMIDS; // midi event struct MIDEV { ulong ts; // time stamp of this event long cb; // number of bytes to send (in rgbSend) long lwTempo; // the current tempo - at a tempo change, cb will be 0 union { byte rgbSend[4]; // bytes to send if pvLong is nil long lwSend; // for convenience }; }; typedef MIDEV *PMIDEV; /*************************************************************************** Midi stream parser. Knows how to parse standard MIDI streams. ***************************************************************************/ typedef class MSTP *PMSTP; #define MSTP_PAR BASE #define kclsMSTP 'MSTP' class MSTP : public MSTP_PAR { RTCLASS_DEC NOCOPY(MSTP) ASSERT MARKMEM protected: ulong _tsCur; long _lwTempo; byte *_prgb; byte *_pbLim; byte *_pbCur; byte _bStatus; Debug(long _cactLongLock;) PMIDS _pmids; bool _FReadVar(byte **ppbCur, long *plw); public: MSTP(void); ~MSTP(void); void Init(PMIDS pmids, ulong tsStart = 0, long lwTempo = 500000); bool FGetEvent(PMIDEV pmidev, bool fAdvance = fTrue); }; /*************************************************************************** Midi Stream object - this is like a MTrk chunk in a standard MIDI file, with timing in milliseconds. ***************************************************************************/ #define MIDS_PAR BACO #define kclsMIDS 'MIDS' class MIDS : public MIDS_PAR { RTCLASS_DEC ASSERT MARKMEM protected: HQ _hqrgb; friend MSTP; MIDS(void); static long _CbEncodeLu(ulong lu, byte *prgb); public: static bool FReadMids(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb); static PMIDS PmidsRead(PBLCK pblck); static PMIDS PmidsReadNative(FNI *pfni); ~MIDS(void); virtual bool FWrite(PBLCK pblck); virtual long CbOnFile(void); }; #endif //! MIDI_H ================================================ FILE: kauai/src/mididev.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Copyright (c) Microsoft Corporation The midi player device. ***************************************************************************/ #include "frame.h" #include ASSERTNAME RTCLASS(MIDP) const long kdtsMinSlip = kdtsSecond / 30; const long klwInfinite = klwMax; /*************************************************************************** Midi output object. ***************************************************************************/ enum { fmidoNil = 0x0, fmidoFirst = 0x1, fmidoFastFwd = 0x2, }; typedef class MIDO *PMIDO; #define MIDO_PAR BASE #define kclsMIDO 'MIDO' class MIDO : public MIDO_PAR { RTCLASS_DEC protected: typedef HMIDIOUT HMO; MUTX _mutx; // restricts access to member variables HMO _hmo; // the output device // system volume level - to be saved and restored. The volume we set // is always relative to this ulong _luVolSys; long _vlmBase; // our current volume relative to _luVolSys. long _vlm; // our current volume relative to _vlmBase long _sii; // the sound that owns the _hmo long _spr; // the priority of sound that owns the _hmo bool _fRestart : 1; // whether the device needs reset bool _fSetVol : 1; // whether the volume needs set void _GetSysVol(void); void _SetSysVol(ulong luVol); void _SetSysVlm(void); void _Reset(void); public: MIDO(void); ~MIDO(void); void Suspend(bool fSuspend); void SetVlm(long vlm); long VlmCur(void); bool FPlay(long sii, long spr, MIDEV *pmidev, long vlm, ulong grfmido); void Transition(long siiOld, long siiNew, long sprNew); void Close(long sii); }; static MIDO _mido; RTCLASS(MIDO) /*************************************************************************** Constructor for the low level midi output device. ***************************************************************************/ MIDO::MIDO(void) { _hmo = hNil; _sii = siiNil; _luVolSys = (ulong)(-1); _vlmBase = _vlm = kvlmFull; _fSetVol = fFalse; AssertThis(0); } /*************************************************************************** Destructor for the low level midi output device. ***************************************************************************/ MIDO::~MIDO(void) { AssertThis(0); _mutx.Enter(); Suspend(fTrue); _mutx.Leave(); } /*************************************************************************** Get the system volume level. ***************************************************************************/ void MIDO::_GetSysVol(void) { Assert(hNil != _hmo, "calling _VlmGetSys with nil _hmo"); if (0 != midiOutGetVolume(_hmo, &_luVolSys)) { // failed - assume full volume _luVolSys = ULONG_MAX; } } /*************************************************************************** Set the system volume level. ***************************************************************************/ void MIDO::_SetSysVol(ulong luVol) { Assert(hNil != _hmo, "calling _SetSysVol with nil _hmo"); midiOutSetVolume(_hmo, luVol); } /*************************************************************************** Set the system volume level from the current values of _vlm, _vlmBase and _luVolSys. We set the system volume to the result of scaling _luVolSys by _vlm and _vlmBase. ***************************************************************************/ void MIDO::_SetSysVlm(void) { ulong luVol; luVol = LuVolScale(_luVolSys, _vlmBase); luVol = LuVolScale(luVol, _vlm); _SetSysVol(luVol); } /*************************************************************************** Reset the midi device. Assumes that the mutx is already ours. ***************************************************************************/ void MIDO::_Reset(void) { AssertThis(0); if (hNil != _hmo) { // Reset channel pressure and pitch wheel on all channels MIDEV midev; long iv; midiOutReset(_hmo); for (iv = 0; iv < 16; iv++) { midev.lwSend = 0; midev.rgbSend[0] = (byte)(0xD0 | iv); midiOutShortMsg(_hmo, midev.lwSend); midev.rgbSend[0] = (byte)(0xE0 | iv); midev.rgbSend[2] = 0x40; midiOutShortMsg(_hmo, midev.lwSend); } } } /*************************************************************************** Release or grab the midi output device depending on fSuspend. ***************************************************************************/ void MIDO::Suspend(bool fSuspend) { AssertThis(0); _mutx.Enter(); if (FPure(fSuspend) != (hNil == _hmo)) { if (fSuspend) { // kill all notes _Reset(); // restore the volume level and free the device _SetSysVol(_luVolSys); midiOutClose(_hmo); _hmo = hNil; } else { if (MMSYSERR_NOERROR == midiOutOpen(&_hmo, MIDI_MAPPER, 0, 0, CALLBACK_NULL)) { _GetSysVol(); } else { _hmo = hNil; PushErc(ercSndMidiDeviceBusy); } } } _fSetVol = _fRestart = fTrue; _mutx.Leave(); } /*************************************************************************** Set the master volume for the device. ***************************************************************************/ void MIDO::SetVlm(long vlm) { AssertThis(0); if (vlm != _vlmBase) { _vlmBase = vlm; _fSetVol = fTrue; } } /*************************************************************************** Return the current master volume. ***************************************************************************/ long MIDO::VlmCur(void) { AssertThis(0); return _vlmBase; } /*************************************************************************** Play the given midi event. Returns false iff the midi stream should be started over from the beginning in fast forward mode. ***************************************************************************/ bool MIDO::FPlay(long sii, long spr, MIDEV *pmidev, long vlm, ulong grfmido) { AssertThis(0); AssertVarMem(pmidev); // assume we don't have to restart bool fRet = fTrue; _mutx.Enter(); // see if this sound has higher priority than the current one if (_sii == sii) Assert(_spr == spr, 0); else if (siiNil == _sii || spr >= _spr && (sii > _sii || spr > _spr)) { // this sound is higher priority so play it. _sii = sii; _spr = spr; _fRestart = fTrue; } // if this sound isn't the current one or the output we're deactivated // just pretend we played the event if (_sii != sii || hNil == _hmo) goto LDone; // If we need to restart, reset the device. If this is the first event // in the stream, go ahead and play it - otherwise, return false to tell // the client to restart. if (_fRestart) { _Reset(); _fRestart = fFalse; if (!(grfmido & fmidoFirst)) { fRet = fFalse; goto LDone; } } // do fast forward filtering if (grfmido & fmidoFastFwd) { // don't play notes or do other stuff that doesn't affect // the (long term) device state. switch (pmidev->rgbSend[0] & 0xF0) { default: goto LDone; case 0xB0: // control change case 0xC0: // program change case 0xD0: // channel pressure case 0xF0: // special stuff break; } } // make sure the volume is set correctly if (_fSetVol || _vlm != vlm) { _vlm = vlm; _fSetVol = fFalse; _SetSysVlm(); } // finally, we can play the event midiOutShortMsg(_hmo, pmidev->lwSend); LDone: _mutx.Leave(); return fRet; } /*************************************************************************** siiOld is being replaced by siiNew. ***************************************************************************/ void MIDO::Transition(long siiOld, long siiNew, long sprNew) { AssertThis(0); _mutx.Enter(); if (_sii == siiOld && siiNil != siiOld) { _sii = siiNew; _spr = sprNew; _Reset(); } _mutx.Leave(); } /*************************************************************************** sii is going away. ***************************************************************************/ void MIDO::Close(long sii) { AssertThis(0); _mutx.Enter(); if (_sii == sii && siiNil != sii) { _sii = siiNil; if (hNil != _hmo) _Reset(); } _mutx.Leave(); } /*************************************************************************** Midi player queue. ***************************************************************************/ typedef class MPQUE *PMPQUE; #define MPQUE_PAR SNQUE #define kclsMPQUE 'mpqu' class MPQUE : public MPQUE_PAR { RTCLASS_DEC ASSERT MARKMEM protected: HN _hevtQueue; // the queue event object - to signal new input bool _fChanged; // also signals new input - for extra protection HN _hth; // the thread handle MUTX _mutx; // mutex to restrict access to member variables MSTP _mstp; // midi stream parser long _dtsSlip; // amount of time we've slipped by long _sii; // id and priority of sound we're currently serving long _spr; long _vlm; // volume to play back at MIDEV _midev; // current midi event ulong _tsStart; // time current sound was started ulong _grfmido; // options for midi output device bool _fMidevValid : 1; // is _midev valid? bool _fDone : 1; // should the thread terminate? MPQUE(void); virtual void _Enter(void); virtual void _Leave(void); virtual bool _FInit(void); virtual PBACO _PbacoFetch(PRCA prca, CTG ctg, CNO cno); virtual void _Queue(long isndinMin); virtual void _PauseQueue(long isndinMin); virtual void _ResumeQueue(long isndinMin); static ulong __stdcall _ThreadProc(void *pv); ulong _LuThread(void); void _DoEvent(bool fRestart, long *pdtsWait); bool _FGetEvt(void); bool _FStartQueue(void); void _PlayEvt(void); public: static PMPQUE PmpqueNew(void); ~MPQUE(void); }; RTCLASS(MPQUE) /*************************************************************************** MT: Constructor for a midi player queue. ***************************************************************************/ MPQUE::MPQUE(void) { } /*************************************************************************** MP: Destructor for a midi player queue. ***************************************************************************/ MPQUE::~MPQUE(void) { AssertThis(0); if (hNil != _hth) { // tell the thread to end and wait for it to finish _fDone = fTrue; SetEvent(_hevtQueue); WaitForSingleObject(_hth, INFINITE); } _mutx.Enter(); if (hNil != _hevtQueue) CloseHandle(_hevtQueue); // clear the midi stream parser _mstp.Init(pvNil); _mutx.Leave(); } #ifdef DEBUG /*************************************************************************** Assert the validity of a MPQUE. ***************************************************************************/ void MPQUE::AssertValid(ulong grf) { _mutx.Enter(); MPQUE_PAR::AssertValid(0); AssertPo(&_mstp, 0); _mutx.Leave(); } /*************************************************************************** Mark memory for the MPQUE. ***************************************************************************/ void MPQUE::MarkMem(void) { AssertValid(0); MPQUE_PAR::MarkMem(); _mutx.Enter(); MarkMemObj(&_mstp); _mutx.Leave(); } #endif // DEBUG /*************************************************************************** MT: Static method to create a new midi player queue. ***************************************************************************/ PMPQUE MPQUE::PmpqueNew(void) { PMPQUE pmpque; if (pvNil == (pmpque = NewObj MPQUE)) return pvNil; if (!pmpque->_FInit()) ReleasePpo(&pmpque); AssertNilOrPo(pmpque, 0); return pmpque; } /*************************************************************************** MT: Initialize the midi queue. ***************************************************************************/ bool MPQUE::_FInit(void) { AssertBaseThis(0); ulong luThread; if (!MPQUE_PAR::_FInit()) return fFalse; // create an auto-reset event to signal that the midi stream at // the head of the queue has changed. _hevtQueue = CreateEvent(pvNil, fFalse, fFalse, pvNil); if (hNil == _hevtQueue) return fFalse; // create the thread in a suspended state _hth = CreateThread(pvNil, 1024, MPQUE::_ThreadProc, this, CREATE_SUSPENDED, &luThread); if (hNil == _hth) return fFalse; SetThreadPriority(_hth, THREAD_PRIORITY_TIME_CRITICAL); // set other members _sii = siiNil; // start the thread ResumeThread(_hth); AssertThis(0); return fTrue; } /*************************************************************************** Enter the critical section protecting member variables. ***************************************************************************/ void MPQUE::_Enter(void) { _mutx.Enter(); } /*************************************************************************** Leave the critical section protecting member variables. ***************************************************************************/ void MPQUE::_Leave(void) { _mutx.Leave(); } /*************************************************************************** MT: Fetch the given sound chunk as a midi stream. ***************************************************************************/ PBACO MPQUE::_PbacoFetch(PRCA prca, CTG ctg, CNO cno) { AssertThis(0); AssertPo(prca, 0); return prca->PbacoFetch(ctg, cno, &MIDS::FReadMids); } /*************************************************************************** The element at the head of the queue changed, notify the thread. ***************************************************************************/ void MPQUE::_Queue(long isndinMin) { AssertThis(0); _mutx.Enter(); if (_isndinCur == isndinMin) { // signal the thread that data changed SetEvent(_hevtQueue); _fChanged = fTrue; } _mutx.Leave(); } /*************************************************************************** Pause the sound at the head of the queue. ***************************************************************************/ void MPQUE::_PauseQueue(long isndinMin) { AssertThis(0); SNDIN sndin; _mutx.Enter(); if (_isndinCur == isndinMin && _pglsndin->IvMac() > _isndinCur) { _pglsndin->Get(_isndinCur, &sndin); sndin.dtsStart = TsCurrentSystem() - _tsStart; _pglsndin->Put(_isndinCur, &sndin); _Queue(_isndinCur); } _mutx.Leave(); } /*************************************************************************** Resume the sound at the head of the queue. ***************************************************************************/ void MPQUE::_ResumeQueue(long isndinMin) { AssertThis(0); _Queue(isndinMin); } /*************************************************************************** AT: Static method. Thread function for the midi thread object. ***************************************************************************/ ulong __stdcall MPQUE::_ThreadProc(void *pv) { PMPQUE pmpque = (PMPQUE)pv; AssertPo(pmpque, 0); return pmpque->_LuThread(); } /*************************************************************************** AT: The midi playback thread. ***************************************************************************/ ulong MPQUE::_LuThread(void) { AssertThis(0); bool fRestart; long dtsWait = klwInfinite; for (;;) { // wait until our time has expired or there is new data fRestart = dtsWait > 0 && WAIT_TIMEOUT != WaitForSingleObject(_hevtQueue, dtsWait == klwInfinite ? INFINITE : dtsWait); // check to see if this thread should end if (_fDone) return 0; _mutx.Enter(); if (_fChanged && !fRestart) dtsWait = klwInfinite; else { _fChanged = fFalse; _DoEvent(fRestart, &dtsWait); } _mutx.Leave(); } } /*************************************************************************** Called when it's time to send the next midi event or when the queue has changed. Assumes the mutx is already checked out. ***************************************************************************/ void MPQUE::_DoEvent(bool fRestart, long *pdtsWait) { if (fRestart && !_FStartQueue()) *pdtsWait = klwInfinite; else if (!_FGetEvt()) { // we're done playing this tune, so start the next one _isndinCur++; *pdtsWait = _FStartQueue() ? 0 : klwInfinite; } else { // we have a valid midi event *pdtsWait = (long)(_midev.ts - TsCurrentSystem()); if (*pdtsWait <= 0) { // go ahead and send it if (*pdtsWait < -kdtsMinSlip && !(_grfmido & fmidoFastFwd)) { _dtsSlip -= *pdtsWait; *pdtsWait = 0; } _PlayEvt(); } else _grfmido &= ~fmidoFastFwd; } } /*************************************************************************** AT: Start playing the sound at the head of the queue. Return non-zero iff the queue wasn't empty. Note that the sound is left in the queue. ***************************************************************************/ bool MPQUE::_FStartQueue(void) { SNDIN sndin; _mutx.Enter(); // set up the midi stream parser (_mstp). for (; _isndinCur < _pglsndin->IvMac(); _isndinCur++) { _pglsndin->Get(_isndinCur, &sndin); AssertPo(sndin.pbaco, 0); if (0 <= sndin.cactPause) break; } if (_isndinCur < _pglsndin->IvMac() && 0 == sndin.cactPause) { // transition to the new tune _mido.Transition(_sii, sndin.sii, sndin.spr); _sii = sndin.sii; _spr = sndin.spr; _vlm = sndin.vlm; _tsStart = TsCurrentSystem() - sndin.dtsStart; _mstp.Init((PMIDS)sndin.pbaco, _tsStart); _dtsSlip = TsCurrentSystem() - sndin.dtsStart - _tsStart; _grfmido = fmidoNil; _fMidevValid = fFalse; if (sndin.dtsStart > 0) _grfmido |= fmidoFastFwd; if (sndin.pbaco != pvNil) _grfmido |= fmidoFirst; } else { // close the old tune _mido.Close(_sii); _sii = siiNil; sndin.pbaco = pvNil; _mstp.Init(pvNil, 0); _fMidevValid = fFalse; } _mutx.Leave(); return sndin.pbaco != pvNil; } /*************************************************************************** AT: Get the next event. Assumes we already have the mutex. ***************************************************************************/ bool MPQUE::_FGetEvt(void) { AssertThis(0); ulong ts; SNDIN sndin; if (_fMidevValid) return fTrue; ts = kluMax; while (_mstp.FGetEvent(&_midev)) { _midev.ts += _dtsSlip; // skip empty events if (_midev.cb > 0) { _fMidevValid = fTrue; return fTrue; } ts = _midev.ts; } // see if we should repeat the current midi stream _pglsndin->Get(_isndinCur, &sndin); if (--sndin.cactPlay == 0) return fFalse; _pglsndin->Put(_isndinCur, &sndin); _tsStart = TsCurrentSystem(); if (ts != kluMax && ts > _tsStart) _tsStart = ts; _mstp.Init((PMIDS)sndin.pbaco, _tsStart); _dtsSlip = TsCurrentSystem() - _tsStart; if (!_mstp.FGetEvent(&_midev)) { // there's nothing in this midi stream return fFalse; } _midev.ts += _dtsSlip; _fMidevValid = fTrue; return fTrue; } /*************************************************************************** AT: Play the current event. Assumes we have the member mutex (_mutx). ***************************************************************************/ void MPQUE::_PlayEvt(void) { AssertThis(0); Assert(_fMidevValid, 0); if (!_mido.FPlay(_sii, _spr, &_midev, _vlm, _grfmido)) { // restart the stream in fast forward mode SNDIN sndin; _pglsndin->Get(_isndinCur, &sndin); _mstp.Init((PMIDS)sndin.pbaco, _tsStart); _grfmido |= fmidoFastFwd; } _fMidevValid = fFalse; _grfmido &= ~fmidoFirst; } /*************************************************************************** Constructor for the midi player device. ***************************************************************************/ MIDP::MIDP(void) { } /*************************************************************************** Destructor for the midi player device. ***************************************************************************/ MIDP::~MIDP(void) { _Suspend(fTrue); } /*************************************************************************** Static method to create the midiplayer device. ***************************************************************************/ PMIDP MIDP::PmidpNew(void) { PMIDP pmidp; if (pvNil == (pmidp = NewObj MIDP)) return pvNil; if (!pmidp->_FInit()) ReleasePpo(&pmidp); pmidp->_Suspend(!pmidp->_fActive || pmidp->_cactSuspend > 0); AssertNilOrPo(pmidp, 0); return pmidp; } /*************************************************************************** Allocate a new midi queue. ***************************************************************************/ PSNQUE MIDP::_PsnqueNew(void) { AssertThis(0); return MPQUE::PmpqueNew(); } /*************************************************************************** Get or release the HMIDIOUT depending on fSuspend. ***************************************************************************/ void MIDP::_Suspend(bool fSuspend) { _mido.Suspend(fSuspend); } /*************************************************************************** Set the volume. ***************************************************************************/ void MIDP::SetVlm(long vlm) { AssertThis(0); _mido.SetVlm(vlm); } /*************************************************************************** Get the volume. ***************************************************************************/ long MIDP::VlmCur(void) { AssertThis(0); return _mido.VlmCur(); } ================================================ FILE: kauai/src/mididev.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Copyright (c) Microsoft Corporation The midi player sound device. ***************************************************************************/ #ifndef MIDIDEV_H #define MIDIDEV_H /*************************************************************************** The midi player. ***************************************************************************/ typedef class MIDP *PMIDP; #define MIDP_PAR SNDMQ #define kclsMIDP 'MIDP' class MIDP : public MIDP_PAR { RTCLASS_DEC protected: MIDP(void); virtual PSNQUE _PsnqueNew(void); virtual void _Suspend(bool fSuspend); public: static PMIDP PmidpNew(void); ~MIDP(void); // inherited methods virtual void SetVlm(long vlm); virtual long VlmCur(void); }; #endif //! MIDIDEV_H ================================================ FILE: kauai/src/mididev2.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Copyright (c) Microsoft Corporation The midi player device using a Midi Stream. ***************************************************************************/ #include "frame.h" #include "mdev2pri.h" ASSERTNAME RTCLASS(MDWS) RTCLASS(MSQUE) RTCLASS(MDPS) RTCLASS(MSMIX) RTCLASS(MISI) RTCLASS(WMS) RTCLASS(OMS) const long kdtsMinSlip = kdtsSecond / 30; const long kcbMaxWmsBuffer = 0x0000FFFF / size(MEV) * size(MEV); /*************************************************************************** Constructor for the midi stream device. ***************************************************************************/ MDPS::MDPS(void) { } /*************************************************************************** Destructor for the midi stream device. ***************************************************************************/ MDPS::~MDPS(void) { AssertBaseThis(0); ReleasePpo(&_pmsmix); } #ifdef DEBUG /*************************************************************************** Assert the validity of a MDPS. ***************************************************************************/ void MDPS::AssertValid(ulong grf) { MDPS_PAR::AssertValid(0); AssertPo(_pmsmix, 0); } /*************************************************************************** Mark memory for the MDPS. ***************************************************************************/ void MDPS::MarkMem(void) { AssertValid(0); MDPS_PAR::MarkMem(); MarkMemObj(_pmsmix); } #endif // DEBUG /*************************************************************************** Static method to create the midi stream device. ***************************************************************************/ PMDPS MDPS::PmdpsNew(void) { PMDPS pmdps; if (pvNil == (pmdps = NewObj MDPS)) return pvNil; if (!pmdps->_FInit()) ReleasePpo(&pmdps); AssertNilOrPo(pmdps, 0); return pmdps; } /*************************************************************************** Initialize the midi stream device. ***************************************************************************/ bool MDPS::_FInit(void) { AssertBaseThis(0); if (!MDPS_PAR::_FInit()) return fFalse; // Create the midi stream output scheduler if (pvNil == (_pmsmix = MSMIX::PmsmixNew())) return fFalse; _Suspend(_cactSuspend > 0 || !_fActive); AssertThis(0); return fTrue; } /*************************************************************************** Allocate a new midi stream queue. ***************************************************************************/ PSNQUE MDPS::_PsnqueNew(void) { AssertThis(0); return MSQUE::PmsqueNew(_pmsmix); } /*************************************************************************** Activate or deactivate the midi stream device. ***************************************************************************/ void MDPS::_Suspend(bool fSuspend) { AssertThis(0); _pmsmix->Suspend(fSuspend); } /*************************************************************************** Set the volume. ***************************************************************************/ void MDPS::SetVlm(long vlm) { AssertThis(0); _pmsmix->SetVlm(vlm); } /*************************************************************************** Get the current volume. ***************************************************************************/ long MDPS::VlmCur(void) { AssertThis(0); return _pmsmix->VlmCur(); } /*************************************************************************** Constructor for a midi stream object. ***************************************************************************/ MDWS::MDWS(void) { } /*************************************************************************** Destructor for a Win95 midi stream object. ***************************************************************************/ MDWS::~MDWS(void) { ReleasePpo(&_pglmev); } #ifdef DEBUG /*************************************************************************** Assert the validity of a MDWS. ***************************************************************************/ void MDWS::AssertValid(ulong grf) { MDWS_PAR::AssertValid(0); AssertPo(_pglmev, 0); } /*************************************************************************** Mark memory for the MDWS. ***************************************************************************/ void MDWS::MarkMem(void) { AssertValid(0); MDWS_PAR::MarkMem(); MarkMemObj(_pglmev); } #endif // DEBUG /*************************************************************************** A baco reader for a midi stream. ***************************************************************************/ bool MDWS::FReadMdws(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb) { AssertPo(pcrf, 0); AssertPo(pblck, fblckReadable); AssertNilOrVarMem(ppbaco); AssertVarMem(pcb); PMDWS pmdws; *pcb = pblck->Cb(fTrue); if (pvNil == ppbaco) return fTrue; if (!pblck->FUnpackData()) goto LFail; if (pvNil == (pmdws = PmdwsRead(pblck))) { LFail: TrashVar(ppbaco); TrashVar(pcb); return fFalse; } *pcb = pmdws->_pglmev->IvMac() * size(MEV) + size(MDWS); *ppbaco = pmdws; return fTrue; } /*************************************************************************** Read a midi stream from the given block. ***************************************************************************/ PMDWS MDWS::PmdwsRead(PBLCK pblck) { AssertPo(pblck, 0); PMIDS pmids; PMDWS pmdws; if (pvNil == (pmids = MIDS::PmidsRead(pblck))) return pvNil; if (pvNil != (pmdws = NewObj MDWS) && !pmdws->_FInit(pmids)) ReleasePpo(&pmdws); ReleasePpo(&pmids); AssertNilOrPo(pmdws, 0); return pmdws; } /*************************************************************************** Initialize the MDWS with the midi data in *pmids. ***************************************************************************/ bool MDWS::_FInit(PMIDS pmids) { AssertPo(pmids, 0); MSTP mstp; ulong tsCur; MEV rgmev[100]; PMEV pmev, pmevLim; MIDEV midev; bool fEvt; if (pvNil == (_pglmev = GL::PglNew(size(MEV)))) return fFalse; Assert(MEVT_SHORTMSG == 0, "this code assumes MEVT_SHORTMSG is 0 and it's not"); ClearPb(rgmev, size(rgmev)); pmev = rgmev; pmevLim = rgmev + CvFromRgv(rgmev); // use 1 second per quarter. We'll use 1000 ticks per quarter when // setting up the stream. The net result is that milliseconds correspond // to ticks, so no conversion is necessary here. pmev->dwEvent = ((ulong)MEVT_TEMPO << 24) | 1000000; pmev++; mstp.Init(pmids, 0); tsCur = 0; for (;;) { fEvt = mstp.FGetEvent(&midev); if (pmev >= pmevLim || !fEvt) { // append the MEVs in rgmev to the _pglmev long imev, cmev; imev = _pglmev->IvMac(); cmev = pmev - rgmev; if (!_pglmev->FSetIvMac(imev + cmev)) return fFalse; CopyPb(rgmev, _pglmev->QvGet(imev), LwMul(cmev, size(MEV))); if (!fEvt) { // Add a final NOP so when we seek and there's only one // event left, it's not an important one. rgmev[0].dwDeltaTime = 0; rgmev[0].dwStreamID = 0; rgmev[0].dwEvent = (ulong)MEVT_NOP << 24; if (!_pglmev->FAdd(&rgmev[0])) return fFalse; _pglmev->FEnsureSpace(0, fgrpShrink); break; } pmev = rgmev; } if (midev.cb > 0) { pmev->dwDeltaTime = midev.ts - tsCur; pmev->dwEvent = midev.lwSend & 0x00FFFFFF; pmev++; tsCur = midev.ts; } } _dts = tsCur; return fTrue; } /*************************************************************************** Return a locked pointer to the data. ***************************************************************************/ void *MDWS::PvLockData(long *pcb) { AssertThis(0); AssertVarMem(pcb); *pcb = LwMul(_pglmev->IvMac(), size(MEV)); return _pglmev->PvLock(0); } /*************************************************************************** Balance a call to PvLockData. ***************************************************************************/ void MDWS::UnlockData(void) { AssertThis(0); _pglmev->Unlock(); } /*************************************************************************** Constructor for a midi stream queue. ***************************************************************************/ MSQUE::MSQUE(void) { } /*************************************************************************** Destructor for a midi stream queue. ***************************************************************************/ MSQUE::~MSQUE(void) { if (pvNil != _pmsmix) { _pmsmix->FPlay(this); ReleasePpo(&_pmsmix); } } #ifdef DEBUG /*************************************************************************** Assert the validity of a MSQUE. ***************************************************************************/ void MSQUE::AssertValid(ulong grf) { MSQUE_PAR::AssertValid(0); AssertPo(_pmsmix, 0); } /*************************************************************************** Mark memory for the MSQUE. ***************************************************************************/ void MSQUE::MarkMem(void) { AssertValid(0); MSQUE_PAR::MarkMem(); MarkMemObj(_pmsmix); } #endif // DEBUG /*************************************************************************** Static method to create a new midi stream queue. ***************************************************************************/ PMSQUE MSQUE::PmsqueNew(PMSMIX pmsmix) { AssertPo(pmsmix, 0); PMSQUE pmsque; if (pvNil == (pmsque = NewObj MSQUE)) return pvNil; if (!pmsque->_FInit(pmsmix)) ReleasePpo(&pmsque); AssertNilOrPo(pmsque, 0); return pmsque; } /*************************************************************************** Initialize the midi stream queue. ***************************************************************************/ bool MSQUE::_FInit(PMSMIX pmsmix) { AssertPo(pmsmix, 0); AssertBaseThis(0); if (!MSQUE_PAR::_FInit()) return fFalse; _pmsmix = pmsmix; _pmsmix->AddRef(); AssertThis(0); return fTrue; } /*************************************************************************** Enter the critical section protecting member variables. ***************************************************************************/ void MSQUE::_Enter(void) { _mutx.Enter(); } /*************************************************************************** Leave the critical section protecting member variables. ***************************************************************************/ void MSQUE::_Leave(void) { _mutx.Leave(); } /*************************************************************************** Fetch the given sound chunk as an MDWS. ***************************************************************************/ PBACO MSQUE::_PbacoFetch(PRCA prca, CTG ctg, CNO cno) { AssertThis(0); AssertPo(prca, 0); return prca->PbacoFetch(ctg, cno, &MDWS::FReadMdws); } /*************************************************************************** An item was added to or deleted from the queue. ***************************************************************************/ void MSQUE::_Queue(long isndinMin) { AssertThis(0); SNDIN sndin; _mutx.Enter(); if (_isndinCur == isndinMin && pvNil != _pglsndin) { for (; _isndinCur < _pglsndin->IvMac(); _isndinCur++) { _pglsndin->Get(_isndinCur, &sndin); if (0 < sndin.cactPause) break; if (0 == sndin.cactPause && _pmsmix->FPlay(this, (PMDWS)sndin.pbaco, sndin.sii, sndin.spr, sndin.cactPlay, sndin.dtsStart, sndin.vlm)) { _tsStart = TsCurrentSystem() - sndin.dtsStart; goto LDone; } } _pmsmix->FPlay(this); } LDone: _mutx.Leave(); } /*************************************************************************** One or more items in the queue were paused. ***************************************************************************/ void MSQUE::_PauseQueue(long isndinMin) { AssertThis(0); SNDIN sndin; _mutx.Enter(); if (_isndinCur == isndinMin && _pglsndin->IvMac() > _isndinCur) { _pglsndin->Get(_isndinCur, &sndin); sndin.dtsStart = TsCurrentSystem() - _tsStart; _pglsndin->Put(_isndinCur, &sndin); _Queue(isndinMin); } _mutx.Leave(); } /*************************************************************************** One or more items in the queue were resumed. ***************************************************************************/ void MSQUE::_ResumeQueue(long isndinMin) { AssertThis(0); _Queue(isndinMin); } /*************************************************************************** Called by the MSMIX to tell us that the indicated sound is done. WARNING: this is called in an auxillary thread. ***************************************************************************/ void MSQUE::Notify(PMDWS pmdws) { AssertThis(0); SNDIN sndin; _mutx.Enter(); if (pvNil != _pglsndin && _pglsndin->IvMac() > _isndinCur) { _pglsndin->Get(_isndinCur, &sndin); if (pmdws == sndin.pbaco) { _isndinCur++; _Queue(_isndinCur); } } _mutx.Leave(); } /*************************************************************************** Constructor for the midi stream output object. ***************************************************************************/ MSMIX::MSMIX(void) { _vlmBase = kvlmFull; _vlmSound = kvlmFull; } /*************************************************************************** Destructor for the midi stream output object. ***************************************************************************/ MSMIX::~MSMIX(void) { Assert(pvNil == _pmisi || !_pmisi->FActive(), "MISI still active!"); if (hNil != _hth) { // tell the thread to end and wait for it to finish _fDone = fTrue; SetEvent(_hevt); WaitForSingleObject(_hth, INFINITE); } if (hNil != _hevt) CloseHandle(_hevt); if (pvNil != _pglmsos) { Assert(_pglmsos->IvMac() == 0, "MSMIX still has active sounds"); ReleasePpo(&_pglmsos); } ReleasePpo(&_pmisi); ReleasePpo(&_pglmevKey); } /*************************************************************************** Static method to create a new MSMIX. ***************************************************************************/ PMSMIX MSMIX::PmsmixNew(void) { PMSMIX pmsmix; if (pvNil == (pmsmix = NewObj MSMIX)) return pvNil; if (!pmsmix->_FInit()) ReleasePpo(&pmsmix); AssertNilOrPo(pmsmix, 0); return pmsmix; } /*************************************************************************** Initialize the MSMIX - allocate the pglmsos and the midi stream api object. ***************************************************************************/ bool MSMIX::_FInit(void) { AssertBaseThis(0); ulong luThread; if (pvNil == (_pglmsos = GL::PglNew(size(MSOS)))) return fFalse; _pglmsos->SetMinGrow(1); if (pvNil == (_pmisi = WMS::PwmsNew(_MidiProc, (ulong)this)) && pvNil == (_pmisi = OMS::PomsNew(_MidiProc, (ulong)this))) { return fFalse; } if (hNil == (_hevt = CreateEvent(pvNil, fFalse, fFalse, pvNil))) return fFalse; // create the thread if (hNil == (_hth = CreateThread(pvNil, 1024, MSMIX::_ThreadProc, this, 0, &luThread))) { return fFalse; } return fTrue; } #ifdef DEBUG /*************************************************************************** Assert the validity of a MSMIX. ***************************************************************************/ void MSMIX::AssertValid(ulong grf) { MSMIX_PAR::AssertValid(0); _mutx.Enter(); Assert(hNil != _hevt, "nil event"); Assert(hNil != _hth, "nil thread"); AssertPo(_pglmsos, 0); AssertPo(_pmisi, 0); AssertNilOrPo(_pglmevKey, 0); _mutx.Leave(); } /*************************************************************************** Mark memory for the MSMIX. ***************************************************************************/ void MSMIX::MarkMem(void) { AssertValid(0); MSMIX_PAR::MarkMem(); _mutx.Enter(); MarkMemObj(_pglmsos); MarkMemObj(_pmisi); MarkMemObj(_pglmevKey); _mutx.Leave(); } #endif // DEBUG /*************************************************************************** Suspend or resume the midi stream mixer. ***************************************************************************/ void MSMIX::Suspend(bool fSuspend) { AssertThis(0); _mutx.Enter(); if (fSuspend) _StopStream(); if (!_pmisi->FActivate(!fSuspend) && !fSuspend) PushErc(ercSndMidiDeviceBusy); _Restart(); _mutx.Leave(); } /*************************************************************************** If we're currently playing a midi stream stop it. Assumes the mutx is already checked out exactly once. ***************************************************************************/ void MSMIX::_StopStream(void) { AssertThis(0); if (!_fPlaying) return; // set _fPlaying to false first so the call back knows that we're // aborting the current stream - so it doesn't notify us. _fPlaying = fFalse; _pmisi->StopPlaying(); // Wait for the buffers to be returned _fWaiting = fTrue; _mutx.Leave(); while (_cpvOut > 0) Sleep(0); _mutx.Enter(); _fWaiting = fFalse; } /*************************************************************************** Set the volume for the midi stream output device. ***************************************************************************/ void MSMIX::SetVlm(long vlm) { AssertThis(0); ulong luHigh, luLow; _mutx.Enter(); _vlmBase = vlm; MulLu(_vlmBase, _vlmSound, &luHigh, &luLow); _pmisi->SetVlm(LuHighLow(SuLow(luHigh), SuHigh(luLow))); _mutx.Leave(); } /*************************************************************************** Get the current volume. ***************************************************************************/ long MSMIX::VlmCur(void) { AssertThis(0); return _vlmBase; } /*************************************************************************** Play the given midi stream from the indicated queue. ***************************************************************************/ bool MSMIX::FPlay(PMSQUE pmsque, PMDWS pmdws, long sii, long spr, long cactPlay, ulong dtsStart, long vlm) { AssertThis(0); AssertPo(pmsque, 0); AssertNilOrPo(pmdws, 0); long imsos; MSOS msos; bool fNew = fFalse; bool fRet = fTrue; if (pvNil != pmdws && pmdws->Dts() == 0) return fFalse; _mutx.Enter(); // stop any current midi stream on this msque for (imsos = _pglmsos->IvMac(); imsos-- > 0;) { _pglmsos->Get(imsos, &msos); if (msos.pmsque == pmsque) { if (0 == imsos) _StopStream(); _pglmsos->Get(imsos, &msos); _pglmsos->Delete(imsos); break; } } // start up the new midi stream if (pvNil != pmdws) { // find the position to insert the new one for (imsos = 0; imsos < _pglmsos->IvMac(); imsos++) { _pglmsos->Get(imsos, &msos); if (msos.spr < spr || msos.spr == spr && msos.sii < sii) { // insert before the current one break; } } if (0 == imsos) { fNew = fTrue; _StopStream(); } ClearPb(&msos, size(msos)); msos.pmsque = pmsque; msos.pmdws = pmdws; msos.sii = sii; msos.spr = spr; msos.cactPlay = cactPlay; msos.dts = pmdws->Dts(); msos.dtsStart = dtsStart; msos.vlm = vlm; msos.tsStart = TsCurrentSystem() - msos.dtsStart; if (!_pglmsos->FInsert(imsos, &msos)) { fRet = fFalse; fNew = fFalse; } } _Restart(fNew); _mutx.Leave(); return fRet; } /*************************************************************************** The sound list changed so make sure we're playing the first tune. Assumes the mutx is already checked out. ***************************************************************************/ void MSMIX::_Restart(bool fNew) { AssertThis(0); if (_pmisi->FActive() && !_fPlaying && _pglmsos->IvMac() > 0) { // start playing the first MSOS MSOS msos; ulong tsCur = TsCurrentSystem(); if (fNew) { _pglmsos->Get(0, &msos); msos.tsStart = tsCur - msos.dtsStart; _pglmsos->Put(0, &msos); } _SubmitBuffers(tsCur); } // signal the aux thread that the list changed SetEvent(_hevt); } /*************************************************************************** Submit the buffer(s) for the current MSOS. Assumes the mutx is already checked out. ***************************************************************************/ void MSMIX::_SubmitBuffers(ulong tsCur) { Assert(!_fPlaying, "already playing!"); long cb, cbSkip; MSOS msos; long imsos; void *pvData; long cactSkip; for (imsos = 0; imsos < _pglmsos->IvMac(); imsos++) { _pglmsos->Get(imsos, &msos); cactSkip = (tsCur - msos.tsStart) / msos.dts; if (cactSkip > 0) { ulong dtsSeek; // we need to skip at least one loop of this sound if (msos.cactPlay > 0 && (msos.cactPlay -= cactSkip) <= 0) goto LTryNext; dtsSeek = (tsCur - msos.tsStart) % msos.dts; msos.tsStart = tsCur - dtsSeek; _pglmsos->Put(imsos, &msos); } // Calling SetVlm causes us to tell the MISI about the new volume _vlmSound = msos.vlm; SetVlm(_vlmBase); cbSkip = 0; if (tsCur != msos.tsStart) { // have to seek into the stream if (!_FGetKeyEvents(msos.pmdws, tsCur - msos.tsStart, &cbSkip)) goto LTryNext; cb = LwMul(_pglmevKey->IvMac(), size(MEV)); if (0 < cb) { pvData = _pglmevKey->PvLock(0); if (!_pmisi->FQueueBuffer(pvData, cb, 0, 1, 0)) { // streaming the key events failed _pglmevKey->Unlock(); goto LTryNext; } _cpvOut++; _fPlaying = fTrue; } } _cpvOut++; pvData = msos.pmdws->PvLockData(&cb); if (_pmisi->FQueueBuffer(pvData, cb, cbSkip, msos.cactPlay, (ulong)msos.pmdws)) { // it worked! _fPlaying = fTrue; break; } // submitting the buffer failed msos.pmdws->UnlockData(); _cpvOut--; LTryNext: // make this one disappear // stop the seek buffer from playing _StopStream(); // make this MSOS have lowest possible priority and 0 time // remaining to play - we'll move it to the end of _pglmsos // in the code below. msos.tsStart = tsCur - msos.dtsStart; msos.cactPlay = 1; msos.sii = klwMin; msos.spr = klwMin; _pglmsos->Put(imsos, &msos); } if (_fPlaying && imsos > 0) { // move the skipped ones to the end of the list long cmsos = _pglmsos->IvMac(); AssertIn(imsos, 1, cmsos); SwapBlocks(_pglmsos->QvGet(0), LwMul(imsos, size(MSOS)), LwMul(cmsos - imsos, size(MSOS))); } } /*************************************************************************** Seek into the pmdws the given amount of time, and accumulate key events in _pglmevKey. ***************************************************************************/ bool MSMIX::_FGetKeyEvents(PMDWS pmdws, ulong dtsSeek, long *pcbSkip) { AssertPo(pmdws, 0); AssertVarMem(pcbSkip); // This keeps track of which events we've seen (so we only record the // most recent one. We record tempo changes, program changes and // controller changes. struct MKEY { ushort grfbitProgram; ushort grfbitChannelPressure; ushort grfbitPitchWheel; ushort fTempo : 1; ushort rggrfbitControl[120]; }; MKEY mkey; PMEV pmev; PMEV pmevMin; PMEV pmevLim; MEV rgmev[100]; PMEV pmevDst; PMEV pmevLimDst; long cb; ulong dts; long igrfbit; ushort fbit; ushort *pgrfbit; byte bT; ClearPb(&mkey, size(mkey)); ClearPb(rgmev, size(rgmev)); if (pvNil == _pglmevKey && (pvNil == (_pglmevKey = GL::PglNew(size(MEV))))) return fFalse; _pglmevKey->FSetIvMac(0); pmevMin = (PMEV)pmdws->PvLockData(&cb); cb = LwRoundToward(cb, size(MEV)); pmevLim = (PMEV)PvAddBv(pmevMin, cb); dts = 0; for (pmev = pmevMin; pmev < pmevLim; pmev++) { dts += pmev->dwDeltaTime; if (dts >= dtsSeek) break; } if (pmev + 1 >= pmevLim) { // dtsSeek goes past the end! goto LFail; } // get the destination pointer - this walks backwards pmevLimDst = rgmev + CvFromRgv(rgmev); pmevDst = pmevLimDst; // put the first event in the key frame list with a smaller time --pmevDst; pmevDst->dwDeltaTime = dts - dtsSeek; pmevDst->dwEvent = pmev->dwEvent; *pcbSkip = BvSubPvs(pmev + 1, pmevMin); for (;;) { if (pmevDst <= rgmev || pmev <= pmevMin) { // destination buffer is full - write it out long cmev, cmevNew; PMEV qrgmev; cmev = _pglmevKey->IvMac(); cmevNew = pmevLimDst - pmevDst; if (!_pglmevKey->FSetIvMac(cmev + cmevNew)) { LFail: _pglmevKey->FSetIvMac(0); _pglmevKey->FEnsureSpace(0, fgrpShrink); pmdws->UnlockData(); return fFalse; } qrgmev = (PMEV)_pglmevKey->QvGet(0); BltPb(qrgmev, qrgmev + cmevNew, LwMul(cmev, size(MEV))); CopyPb(pmevDst, qrgmev, LwMul(cmevNew, size(MEV))); if (pmev <= pmevMin) break; pmevDst = pmevLimDst; } --pmev; switch (pmev->dwEvent >> 24) { case MEVT_SHORTMSG: bT = (byte)pmev->dwEvent; // The high nibble of bT is the status value // The low nibble is the channel switch (bT & 0xF0) { case 0xB0: // control change igrfbit = BHigh(SuLow(pmev->dwEvent)); if (!FIn(igrfbit, 0, CvFromRgv(mkey.rggrfbitControl))) break; pgrfbit = &mkey.rggrfbitControl[igrfbit]; goto LTest; case 0xC0: // program change pgrfbit = &mkey.grfbitProgram; goto LTest; case 0xD0: // channel pressure pgrfbit = &mkey.grfbitChannelPressure; goto LTest; case 0xE0: // pitch wheel pgrfbit = &mkey.grfbitPitchWheel; LTest: fbit = 1 << (bT & 0x0F); if (!(*pgrfbit & fbit)) { // first time we've seen this event on this channel *pgrfbit |= fbit; goto LCopy; } break; } break; case MEVT_TEMPO: if (!mkey.fTempo) { mkey.fTempo = fTrue; LCopy: pmevDst--; pmevDst->dwDeltaTime = 0; pmevDst->dwEvent = pmev->dwEvent; } break; } } _pglmevKey->FEnsureSpace(0, fgrpShrink); pmdws->UnlockData(); return fTrue; } /*************************************************************************** Call back from the midi stream stuff. ***************************************************************************/ void MSMIX::_MidiProc(ulong luUser, void *pvData, ulong luData) { PMSMIX pmsmix; PMDWS pmdws; pmsmix = (PMSMIX)luUser; AssertPo(pmsmix, 0); pmdws = (PMDWS)luData; AssertNilOrPo(pmdws, 0); pmsmix->_Notify(pvData, pmdws); } /*************************************************************************** The midi stream is done with the given header. ***************************************************************************/ void MSMIX::_Notify(void *pvData, PMDWS pmdws) { AssertNilOrPo(pmdws, 0); MSOS msos; _mutx.Enter(); Assert(_cpvOut > 0, "what buffer is this?"); _cpvOut--; if (pvNil != pmdws) { AssertVar(_pglmsos->IvMac() > 0 && ((MSOS *)_pglmsos->QvGet(0))->pmdws == pmdws, "Wrong pmdws", &pmdws); pmdws->UnlockData(); } else if (pvNil != _pglmevKey && pvData == _pglmevKey->QvGet(0)) _pglmevKey->Unlock(); else { Bug("Bad pvData/pmdws combo"); } if (!_fPlaying) { // we don't need to notify or start the next sound. _mutx.Leave(); return; } if (_fPlaying && _cpvOut == 0) { // all headers are in and we're supposed to be playing - so notify the // previous pmdws and start up the next one. _fPlaying = fFalse; if (0 < _pglmsos->IvMac()) { _pglmsos->Get(0, &msos); _pglmsos->Delete(0); _mutx.Leave(); // do the notify msos.pmsque->Notify(msos.pmdws); _mutx.Enter(); } if (_pglmsos->IvMac() > 0) _Restart(); } _mutx.Leave(); } /*************************************************************************** AT: Static method. Thread function for the MSMIX object. ***************************************************************************/ ulong __stdcall MSMIX::_ThreadProc(void *pv) { PMSMIX pmsmix = (PMSMIX)pv; AssertPo(pmsmix, 0); return pmsmix->_LuThread(); } /*************************************************************************** AT: This thread just sleeps until the next sound is due to expire, then wakes up and nukes any expired sounds. ***************************************************************************/ ulong MSMIX::_LuThread(void) { AssertThis(0); ulong tsCur; long imsos; MSOS msos; long cactSkip; ulong dtsNextStop = kluMax; for (;;) { WaitForSingleObject(_hevt, dtsNextStop); if (_fDone) return 0; _mutx.Enter(); if (_fWaiting) { // we're waiting for buffers to be returned, so don't touch // anything! dtsNextStop = 1; } else { // See if any sounds have expired... tsCur = TsCurrentSystem(); dtsNextStop = kluMax; for (imsos = _pglmsos->IvMac(); imsos-- > 0;) { if (imsos == 0 && _fPlaying) break; _pglmsos->Get(imsos, &msos); cactSkip = (tsCur - msos.tsStart) / msos.dts; if (cactSkip > 0) { ulong dtsSeek; if (msos.cactPlay > 0 && (msos.cactPlay -= cactSkip) <= 0) { // this sound is done _pglmsos->Delete(imsos); _mutx.Leave(); // do the notify msos.pmsque->Notify(msos.pmdws); _mutx.Enter(); dtsNextStop = 0; break; } // adjust the values in the MSOS dtsSeek = (tsCur - msos.tsStart) % msos.dts; msos.tsStart = tsCur - dtsSeek; _pglmsos->Put(imsos, &msos); } dtsNextStop = LuMin(dtsNextStop, msos.dts - (tsCur - msos.tsStart)); } } _mutx.Leave(); } } /*************************************************************************** Constructor for the MIDI stream interface. ***************************************************************************/ MISI::MISI(PFNMIDI pfn, ulong luUser) { AssertBaseThis(0); Assert(pvNil != pfn, 0); _pfnCall = pfn; _luUser = luUser; _tBogusDriver = tMaybe; _luVolSys = (ulong)(-1); _vlmBase = kvlmFull; } /*************************************************************************** Reset the midi device. ***************************************************************************/ void MISI::_Reset(void) { Assert(hNil != _hms, 0); long iv; midiOutReset(_hms); // Reset channel pressure and pitch wheel on all channels. // We shouldn't have to do this, but some drivers don't reset these. for (iv = 0; iv < 16; iv++) { midiOutShortMsg(_hms, 0xD0 | iv); midiOutShortMsg(_hms, 0x004000E0 | iv); } } /*************************************************************************** Get the system volume level. ***************************************************************************/ void MISI::_GetSysVol(void) { Assert(hNil != _hms, "calling _GetSysVol with nil _hms"); ulong lu0, lu1, lu2; switch (_tBogusDriver) { case tYes: // just use vluSysVolFake... _luVolSys = vluSysVolFake; return; case tMaybe: // need to determine if midiOutGetVolume really works for this // driver. // Some drivers will only ever tell us what we last gave them - // irregardless of what the user has set the value to. Those drivers // will always give us full volume the first time we ask. // We also look for drivers that give us nonsense values. if (0 != midiOutGetVolume(_hms, &_luVolSys) || _luVolSys == ULONG_MAX || 0 != midiOutSetVolume(_hms, 0ul) || 0 != midiOutGetVolume(_hms, &lu0) || 0 != midiOutSetVolume(_hms, 0x7FFF7FFFul) || 0 != midiOutGetVolume(_hms, &lu1) || 0 != midiOutSetVolume(_hms, 0xFFFFFFFFul) || 0 != midiOutGetVolume(_hms, &lu2) || lu0 >= lu1 || lu1 >= lu2) { _tBogusDriver = tYes; _luVolSys = vluSysVolFake; } else { _tBogusDriver = tNo; vluSysVolFake = _luVolSys; } midiOutSetVolume(_hms, _luVolSys); break; default: if (0 != midiOutGetVolume(_hms, &_luVolSys)) { // failed - use the fake value _luVolSys = vluSysVolFake; } else vluSysVolFake = _luVolSys; break; } } /*************************************************************************** Set the system volume level. ***************************************************************************/ void MISI::_SetSysVol(ulong luVol) { Assert(hNil != _hms, "calling _SetSysVol with nil _hms"); midiOutSetVolume(_hms, luVol); } /*************************************************************************** Set the system volume level from the current values of _vlmBase and _luVolSys. We set the system volume to the result of scaling _luVolSys by _vlmBase. ***************************************************************************/ void MISI::_SetSysVlm(void) { ulong luVol; luVol = LuVolScale(_luVolSys, _vlmBase); _SetSysVol(luVol); } /*************************************************************************** Set the volume for the midi stream output device. ***************************************************************************/ void MISI::SetVlm(long vlm) { AssertThis(0); if (vlm != _vlmBase) { _vlmBase = vlm; if (hNil != _hms) _SetSysVlm(); } } /*************************************************************************** Get the current volume. ***************************************************************************/ long MISI::VlmCur(void) { AssertThis(0); return _vlmBase; } /*************************************************************************** Return whether the midi stream output device is active. ***************************************************************************/ bool MISI::FActive(void) { return hNil != _hms; } /*************************************************************************** Activate or deactivate the Midi stream output object. ***************************************************************************/ bool MISI::FActivate(bool fActivate) { AssertThis(0); return fActivate ? _FOpen() : _FClose(); } /*************************************************************************** Constructor for the Win95 Midi stream class. ***************************************************************************/ WMS::WMS(PFNMIDI pfn, ulong luUser) : MISI(pfn, luUser) { } /*************************************************************************** Destructor for the Win95 Midi stream class. ***************************************************************************/ WMS::~WMS(void) { if (hNil != _hth) { // tell the thread to end and wait for it to finish _fDone = fTrue; SetEvent(_hevt); WaitForSingleObject(_hth, INFINITE); } if (hNil != _hevt) CloseHandle(_hevt); if (pvNil != _pglpmsir) { Assert(0 == _pglpmsir->IvMac(), "WMS still has some active buffers"); ReleasePpo(&_pglpmsir); } if (hNil != _hlib) { FreeLibrary(_hlib); _hlib = hNil; } } /*************************************************************************** Create a new WMS. ***************************************************************************/ PWMS WMS::PwmsNew(PFNMIDI pfn, ulong luUser) { PWMS pwms; if (pvNil == (pwms = NewObj WMS(pfn, luUser))) return pvNil; if (!pwms->_FInit()) ReleasePpo(&pwms); return pwms; } /*************************************************************************** Initialize the WMS: get the addresses of the stream API. ***************************************************************************/ bool WMS::_FInit(void) { OSVERSIONINFO osv; ulong luThread; // Make sure we're on Win95 and not NT, since the API exists on NT 3.51 // but it fails. osv.dwOSVersionInfoSize = size(osv); if (!GetVersionEx(&osv)) return fFalse; // Old header files don't have this defined! #ifndef VER_PLATFORM_WIN32_WINDOWS #define VER_PLATFORM_WIN32_WINDOWS 1 #endif //! VER_PLATFORM_WIN32_WINDOWS if (VER_PLATFORM_WIN32_WINDOWS != osv.dwPlatformId) { // don't bother trying - NT's scheduler works fine anyway. return fFalse; } if (hNil == (_hlib = LoadLibrary(PszLit("WINMM.DLL")))) return fFalse; #define _Get(n) \ if (pvNil == (*(void **)&_pfn##n = (void *)GetProcAddress(_hlib, "midiStream" #n))) \ { \ return fFalse; \ } _Get(Open); _Get(Close); _Get(Property); _Get(Position); _Get(Out); _Get(Pause); _Get(Restart); _Get(Stop); #undef _Get if (pvNil == (_pglpmsir = GL::PglNew(size(PMSIR)))) return fFalse; _pglpmsir->SetMinGrow(1); if (hNil == (_hevt = CreateEvent(pvNil, fFalse, fFalse, pvNil))) return fFalse; // create the thread if (hNil == (_hth = CreateThread(pvNil, 1024, WMS::_ThreadProc, this, 0, &luThread))) { return fFalse; } AssertThis(0); return fTrue; } #ifdef DEBUG /*************************************************************************** Assert the validity of a WMS. ***************************************************************************/ void WMS::AssertValid(ulong grf) { WMS_PAR::AssertValid(0); Assert(hNil != _hlib, 0); long cpmsir; _mutx.Enter(); Assert(hNil != _hevt, "nil event"); Assert(hNil != _hth, "nil thread"); AssertPo(_pglpmsir, 0); cpmsir = _pglpmsir->IvMac(); Assert(_cmhOut >= 0, "negative _cmhOut"); AssertIn(_ipmsirCur, 0, cpmsir + 1); _mutx.Leave(); } /*************************************************************************** Mark memory for the WMS. ***************************************************************************/ void WMS::MarkMem(void) { AssertValid(0); PMSIR pmsir; long ipmsir; WMS_PAR::MarkMem(); _mutx.Enter(); for (ipmsir = _pglpmsir->IvMac(); ipmsir-- > 0;) { _pglpmsir->Get(ipmsir, &pmsir); AssertVarMem(pmsir); MarkPv(pmsir); } MarkMemObj(_pglpmsir); _mutx.Leave(); } #endif // DEBUG /*************************************************************************** Opens the midi stream and sets the time division to 1000 ticks per quarter note. It is assumed that the midi data has a tempo record indicating 1 quarter note per second (1000000 microseconds per quarter). The end result is that ticks are milliseconds. ***************************************************************************/ bool WMS::_FOpen(void) { AssertThis(0); // MIDIPROPTIMEDIV struct struct MT { DWORD cbStruct; DWORD dwTimeDiv; }; MT mt; UINT uT = MIDI_MAPPER; _mutx.Enter(); if (hNil != _hms) goto LDone; if (MMSYSERR_NOERROR != (*_pfnOpen)(&_hms, &uT, 1, (ulong)_MidiProc, (ulong)this, CALLBACK_FUNCTION)) { goto LFail; } // We set the time division to 1000 ticks per beat, so clients can // use 1 beat per second and just use milliseconds for timing. // We also un-pause the stream. mt.cbStruct = size(mt); mt.dwTimeDiv = 1000; if (MMSYSERR_NOERROR != (*_pfnProperty)(_hms, (byte *)&mt, MIDIPROP_SET | MIDIPROP_TIMEDIV)) { (*_pfnClose)(_hms); LFail: _hms = hNil; _mutx.Leave(); return fFalse; } // we know there are no buffers submitted AssertVar(_cmhOut == 0, "why is _cmhOut non-zero?", &_cmhOut); _cmhOut = 0; // get the system volume level _GetSysVol(); // set our volume level _SetSysVlm(); LDone: _mutx.Leave(); return fTrue; } /*************************************************************************** Close the midi stream. ***************************************************************************/ bool WMS::_FClose(void) { AssertThis(0); _mutx.Enter(); if (hNil == _hms) { _mutx.Leave(); return fTrue; } if (0 < _cmhOut) { BugVar("closing a stream that still has buffers!", &_cmhOut); _mutx.Leave(); return fFalse; } // reset the device _Reset(); // restore the volume level _SetSysVol(_luVolSys); // free the device (*_pfnClose)(_hms); _hms = hNil; _mutx.Leave(); return fTrue; } #ifdef STREAM_BUG /*************************************************************************** Just return the value of our flag, not (hNil != _hms). ***************************************************************************/ bool WMS::FActive(void) { return _fActive; } /*************************************************************************** Need to set _fActive as well. ***************************************************************************/ bool WMS::FActivate(bool fActivate) { bool fRet; fRet = WMS_PAR::FActivate(fActivate); if (fRet) _fActive = FPure(fActivate); return fRet; } #endif // STREAM_BUG /*************************************************************************** Reset the midi stream so it's ready to accept new input. Assumes we already have the mutx. ***************************************************************************/ void WMS::_ResetStream(void) { if (!FActive()) return; #ifdef STREAM_BUG if (hNil == _hms) _FOpen(); else { (*_pfnStop)(_hms); _FClose(); _FOpen(); } #else //! STREAM_BUG (*_pfnStop)(_hms); _Reset(); #endif //! STREAM_BUG } /*************************************************************************** This submits a buffer and restarts the midi stream. If the data is bigger than 64K, this (in conjunction with _Notify) deals with it. ***************************************************************************/ bool WMS::FQueueBuffer(void *pvData, long cb, long ibStart, long cactPlay, ulong luData) { AssertThis(0); AssertPvCb(pvData, cb); AssertIn(ibStart, 0, cb); Assert(cb % size(MEV) == 0, "bad cb"); Assert(ibStart % size(MEV) == 0, "bad cb"); long ipmsir; PMSIR pmsir = pvNil; bool fRet = fTrue; _mutx.Enter(); if (hNil == _hms) goto LFail; if (!FAllocPv((void **)&pmsir, size(MSIR), fmemClear, mprNormal)) goto LFail; pmsir->pvData = pvData; pmsir->cb = cb; pmsir->cactPlay = cactPlay; pmsir->luData = luData; pmsir->ibNext = ibStart; if (_hms == hNil || !_pglpmsir->FAdd(&pmsir, &ipmsir)) goto LFail; if (0 == _CmhSubmitBuffers() && ipmsir == 0) { // submitting the buffers failed _pglpmsir->Delete(0); _ipmsirCur = 0; LFail: FreePpv((void **)pmsir); fRet = fFalse; } _mutx.Leave(); return fRet; } /*************************************************************************** Submits buffers. Assumes the _mutx is already ours. ***************************************************************************/ long WMS::_CmhSubmitBuffers(void) { PMSIR pmsir; long cbMh; PMH pmh; long imh; long cmh = 0; while (_ipmsirCur < _pglpmsir->IvMac()) { _pglpmsir->Get(_ipmsirCur, &pmsir); if (pmsir->ibNext >= pmsir->cb) { // see if the sound should be repeated if (pmsir->cactPlay == 1) { _ipmsirCur++; continue; } pmsir->cactPlay--; pmsir->ibNext = 0; } // see if one of the buffers is free for (imh = 0;; imh++) { if (imh >= kcmhMsir) { // all buffers are busy Assert(_cmhOut >= kcmhMsir, 0); return cmh; } if (pmsir->rgibLim[imh] == 0) break; } // fill the buffer and submit it pmh = &pmsir->rgmh[imh]; pmh->lpData = (byte *)PvAddBv(pmsir->pvData, pmsir->ibNext); cbMh = LwMin(pmsir->cb - pmsir->ibNext, kcbMaxWmsBuffer); pmh->dwBufferLength = cbMh; pmh->dwBytesRecorded = cbMh; pmh->dwUser = (ulong)pmsir; pmsir->ibNext += cbMh; pmsir->rgibLim[imh] = pmsir->ibNext; if (_FSubmit(pmh)) cmh++; else { // just play the previous buffers and forget about this one pmsir->ibNext = pmsir->cb; pmsir->rgibLim[imh] = 0; pmsir->cactPlay = 1; _ipmsirCur++; } } return cmh; } /*************************************************************************** Prepare and submit the given buffer. Assumes the mutx is ours. ***************************************************************************/ bool WMS::_FSubmit(PMH pmh) { bool fRestart = (0 == _cmhOut); if (hNil == _hms) return fFalse; // prepare and submit the buffer if (MMSYSERR_NOERROR != midiOutPrepareHeader(_hms, (PMHO)pmh, sizeof(*pmh))) return fFalse; if (MMSYSERR_NOERROR != (*_pfnOut)(_hms, (PMHO)pmh, size(*pmh))) { midiOutUnprepareHeader(_hms, (PMHO)pmh, size(*pmh)); return fFalse; } _cmhOut++; if (fRestart) (*_pfnRestart)(_hms); return fTrue; } /*************************************************************************** Stop the midi stream. ***************************************************************************/ void WMS::StopPlaying(void) { AssertThis(0); _mutx.Enter(); if (hNil != _hms && _cmhOut > 0) { (*_pfnStop)(_hms); _ipmsirCur = _pglpmsir->IvMac(); } _mutx.Leave(); } /*************************************************************************** Call back from the midi stream. If the number of active buffers returns to 0, this stops the midi stream. If the indicated sound is done, we notify the client. ***************************************************************************/ void __stdcall WMS::_MidiProc(HMS hms, ulong msg, ulong luUser, ulong lu1, ulong lu2) { PWMS pwms; PMH pmh; if (msg != MOM_DONE) return; pwms = (PWMS)luUser; AssertPo(pwms, 0); pmh = (PMH)lu1; AssertVarMem(pmh); pwms->_Notify(hms, pmh); } /*************************************************************************** The this-based callback. The mmsys guys claim that it's illegal to call midiOutUnprepareHeader, midiStreamStop and midiOutReset. So we just signal another thread to do this work. ***************************************************************************/ void WMS::_Notify(HMS hms, PMH pmh) { AssertThis(0); Assert(hNil != hms, 0); AssertVarMem(pmh); PMSIR pmsir; long imh; _mutx.Enter(); Assert(hms == _hms, "wrong hms"); midiOutUnprepareHeader(hms, (PMHO)pmh, size(*pmh)); pmsir = (PMSIR)pmh->dwUser; AssertVarMem(pmsir); AssertPvCb(pmsir->pvData, pmsir->cb); for (imh = 0;; imh++) { if (imh >= kcmhMsir) { Bug("corrupt msir"); _mutx.Leave(); return; } if (pmh == &pmsir->rgmh[imh]) break; } Assert(pmh->lpData == PvAddBv(pmsir->pvData, pmsir->rgibLim[imh] - pmh->dwBufferLength), "pmh->lpData is wrong"); // mark this buffer free pmsir->rgibLim[imh] = 0; // fill and submit buffers _CmhSubmitBuffers(); // update the submitted buffer count --_cmhOut; // wake up the auxillary thread to do callbacks and stop and reset // the device it there's nothing more to play SetEvent(_hevt); _mutx.Leave(); } /*************************************************************************** AT: Static method. Thread function for the WMS object. This thread just waits for the event to be triggered, indicating that we got a callback from the midiStream stuff and it's time to do our callbacks. ***************************************************************************/ ulong __stdcall WMS::_ThreadProc(void *pv) { PWMS pwms = (PWMS)pv; AssertPo(pwms, 0); return pwms->_LuThread(); } /*************************************************************************** AT: This thread just sleeps until the next sound is due to expire, then wakes up and nukes any expired sounds. ***************************************************************************/ ulong WMS::_LuThread(void) { AssertThis(0); for (;;) { WaitForSingleObject(_hevt, INFINITE); if (_fDone) return 0; _mutx.Enter(); if (hNil != _hms && 0 == _cmhOut) _ResetStream(); _DoCallBacks(); _mutx.Leave(); } } /*************************************************************************** Check for MSIRs that are done and do the callback on them and free them. Assumes the _mutx is checked out exactly once. ***************************************************************************/ void WMS::_DoCallBacks() { PMSIR pmsir; AssertIn(_ipmsirCur, 0, _pglpmsir->IvMac() + 1); while (0 < _ipmsirCur) { _pglpmsir->Get(0, &pmsir); if (_cmhOut > 0) { // see if the MSIR is done long imh; for (imh = 0; imh < kcmhMsir; imh++) { if (0 < pmsir->rgibLim[imh]) { // this one is busy return; } } } // this one is done _pglpmsir->Delete(0); _ipmsirCur--; _mutx.Leave(); // notify the client that we're done with the sound (*_pfnCall)(_luUser, pmsir->pvData, pmsir->luData); FreePpv((void **)&pmsir); _mutx.Enter(); AssertIn(_ipmsirCur, 0, _pglpmsir->IvMac() + 1); } } /*************************************************************************** Constructor for our own midi stream api implementation. ***************************************************************************/ OMS::OMS(PFNMIDI pfn, ulong luUser) : MISI(pfn, luUser) { } /*************************************************************************** Destructor for our midi stream. ***************************************************************************/ OMS::~OMS(void) { if (hNil != _hth) { // tell the thread to end and wait for it to finish _fDone = fTrue; SetEvent(_hevt); WaitForSingleObject(_hth, INFINITE); } _mutx.Enter(); if (hNil != _hevt) CloseHandle(_hevt); Assert(_hms == hNil, "Still have an HMS"); Assert(_pglmsb->IvMac() == 0, "Still have some buffers"); ReleasePpo(&_pglmsb); _mutx.Leave(); } /*************************************************************************** Create a new OMS. ***************************************************************************/ POMS OMS::PomsNew(PFNMIDI pfn, ulong luUser) { POMS poms; if (pvNil == (poms = NewObj OMS(pfn, luUser))) return pvNil; if (!poms->_FInit()) ReleasePpo(&poms); return poms; } /*************************************************************************** Initialize the OMS. ***************************************************************************/ bool OMS::_FInit(void) { AssertBaseThis(0); ulong luThread; if (pvNil == (_pglmsb = GL::PglNew(size(MSB)))) return fFalse; _pglmsb->SetMinGrow(1); if (hNil == (_hevt = CreateEvent(pvNil, fFalse, fFalse, pvNil))) return fFalse; // create the thread in a suspended state if (hNil == (_hth = CreateThread(pvNil, 1024, OMS::_ThreadProc, this, CREATE_SUSPENDED, &luThread))) { return fFalse; } SetThreadPriority(_hth, THREAD_PRIORITY_TIME_CRITICAL); // start the thread ResumeThread(_hth); return fTrue; } #ifdef DEBUG /*************************************************************************** Assert the validity of a OMS. ***************************************************************************/ void OMS::AssertValid(ulong grf) { OMS_PAR::AssertValid(0); _mutx.Enter(); Assert(hNil != _hth, "nil thread"); Assert(hNil != _hevt, "nil event"); AssertPo(_pglmsb, 0); _mutx.Leave(); } /*************************************************************************** Mark memory for the OMS. ***************************************************************************/ void OMS::MarkMem(void) { AssertValid(0); OMS_PAR::MarkMem(); _mutx.Enter(); MarkMemObj(_pglmsb); _mutx.Leave(); } #endif // DEBUG /*************************************************************************** Open the stream. ***************************************************************************/ bool OMS::_FOpen(void) { AssertThis(0); _mutx.Enter(); if (hNil != _hms) goto LDone; _fChanged = _fStop = fFalse; if (MMSYSERR_NOERROR != midiOutOpen(&_hms, MIDI_MAPPER, 0, 0, CALLBACK_NULL)) { _hms = hNil; _mutx.Leave(); return fFalse; } // get the system volume level _GetSysVol(); // set our volume level _SetSysVlm(); LDone: _mutx.Leave(); return fTrue; } /*************************************************************************** Close the stream. ***************************************************************************/ bool OMS::_FClose(void) { AssertThis(0); _mutx.Enter(); if (hNil == _hms) { _mutx.Leave(); return fTrue; } if (_pglmsb->IvMac() > 0) { Bug("closing a stream that still has buffers!"); _mutx.Leave(); return fFalse; } // reset the device _Reset(); // restore the volume level _SetSysVol(_luVolSys); midiOutClose(_hms); _hms = hNil; _mutx.Leave(); return fTrue; } /*************************************************************************** Queue a buffer to the midi stream. ***************************************************************************/ bool OMS::FQueueBuffer(void *pvData, long cb, long ibStart, long cactPlay, ulong luData) { AssertThis(0); AssertPvCb(pvData, cb); AssertIn(ibStart, 0, cb); Assert(cb % size(MEV) == 0, "bad cb"); Assert(ibStart % size(MEV) == 0, "bad cb"); MSB msb; _mutx.Enter(); if (hNil == _hms) goto LFail; msb.pvData = pvData; msb.cb = cb; msb.ibStart = ibStart; msb.cactPlay = cactPlay; msb.luData = luData; if (!_pglmsb->FAdd(&msb)) { LFail: _mutx.Leave(); return fFalse; } if (1 == _pglmsb->IvMac()) { // Start the buffer SetEvent(_hevt); _fChanged = fTrue; } _mutx.Leave(); return fTrue; } /*************************************************************************** Stop the stream and release all buffers. The buffer notifies are asynchronous. ***************************************************************************/ void OMS::StopPlaying(void) { AssertThis(0); _mutx.Enter(); if (hNil != _hms) { _fStop = fTrue; SetEvent(_hevt); _fChanged = fTrue; } _mutx.Leave(); } /*************************************************************************** AT: Static method. Thread function for the midi stream object. ***************************************************************************/ ulong __stdcall OMS::_ThreadProc(void *pv) { POMS poms = (POMS)pv; AssertPo(poms, 0); return poms->_LuThread(); } /*************************************************************************** AT: The midi stream playback thread. ***************************************************************************/ ulong OMS::_LuThread(void) { AssertThis(0); MSB msb; bool fChanged; // whether the event went off ulong tsCur; const long klwInfinite = klwMax; long dtsWait = klwInfinite; for (;;) { fChanged = dtsWait > 0 && WAIT_TIMEOUT != WaitForSingleObject(_hevt, dtsWait == klwInfinite ? INFINITE : dtsWait); if (_fDone) return 0; _mutx.Enter(); if (_fChanged && !fChanged) { // the event went off before we got the mutx. dtsWait = klwInfinite; goto LLoop; } _fChanged = fFalse; if (!fChanged) { // play the event if (_pmev < _pmevLim) { if (MEVT_SHORTMSG == (_pmev->dwEvent >> 24)) midiOutShortMsg(_hms, _pmev->dwEvent & 0x00FFFFFF); _pmev++; if (_pmev >= _pmevLim) dtsWait = 0; else { ulong tsNew = TsCurrentSystem(); tsCur += _pmev->dwDeltaTime; dtsWait = tsCur - tsNew; if (dtsWait < -kdtsMinSlip) { tsCur = tsNew; dtsWait = 0; } } goto LLoop; } // ran out of events in the current buffer - see if we should // repeat it _pglmsb->Get(0, &msb); if (msb.cactPlay == 1) { _imsbCur = 1; _ReleaseBuffers(); } else { // repeat the current buffer if (msb.cactPlay > 0) msb.cactPlay--; msb.ibStart = 0; _pglmsb->Put(0, &msb); } } else if (_fStop) { // release all buffers _fStop = fFalse; _imsbCur = _pglmsb->IvMac(); _ReleaseBuffers(); } if (0 == _pglmsb->IvMac()) { // no buffers to play dtsWait = klwInfinite; } else { // start playing the new buffers _pglmsb->Get(0, &msb); _pmev = (PMEV)PvAddBv(msb.pvData, msb.ibStart); _pmevLim = (PMEV)PvAddBv(msb.pvData, msb.cb); if (_pmev >= _pmevLim) dtsWait = 0; else { dtsWait = _pmev->dwDeltaTime; tsCur = TsCurrentSystem() + dtsWait; } } LLoop: _mutx.Leave(); } } /*************************************************************************** Release all buffers up to _imsbCur. Assumes that we have the mutx checked out exactly once. ***************************************************************************/ void OMS::_ReleaseBuffers(void) { MSB msb; if (_imsbCur >= _pglmsb->IvMac() && hNil != _hms) _Reset(); while (_imsbCur > 0) { _pglmsb->Get(0, &msb); _pglmsb->Delete(0); _imsbCur--; _mutx.Leave(); // call the notify proc (*_pfnCall)(_luUser, msb.pvData, msb.luData); _mutx.Enter(); } } ================================================ FILE: kauai/src/mididev2.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Copyright (c) Microsoft Corporation The midi player sound device. ***************************************************************************/ #ifndef MIDIDEV2_H #define MIDIDEV2_H typedef class MSMIX *PMSMIX; /*************************************************************************** The midi player using a Midi stream. ***************************************************************************/ typedef class MDPS *PMDPS; #define MDPS_PAR SNDMQ #define kclsMDPS 'MDPS' class MDPS : public MDPS_PAR { RTCLASS_DEC ASSERT MARKMEM protected: PMSMIX _pmsmix; MDPS(void); virtual bool _FInit(void); virtual PSNQUE _PsnqueNew(void); virtual void _Suspend(bool fSuspend); public: static PMDPS PmdpsNew(void); ~MDPS(void); // inherited methods virtual void SetVlm(long vlm); virtual long VlmCur(void); }; #endif //! MIDIDEV2_H ================================================ FILE: kauai/src/mssio.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Copyright (c) Microsoft Corporation A message sink (MSNK) wrapper around a stdio file. ***************************************************************************/ #include #include "util.h" #include "mssio.h" ASSERTNAME /*************************************************************************** Constructor for a standard I/O message sink. ***************************************************************************/ MSSIO::MSSIO(FILE *pfile) { _pfile = pfile; _fError = fFalse; } /*************************************************************************** Prints a message to stderr. ***************************************************************************/ void MSSIO::ReportLine(PSZ psz) { AssertThis(0); AssertSz(psz); #ifdef UNICODE _fError |= 0 > fwprintf(_pfile, PszLit("%s\n"), psz); #else _fError |= 0 > fprintf(_pfile, "%s\n", psz); #endif } /*************************************************************************** Dump a line to stdout. ***************************************************************************/ void MSSIO::Report(PSZ psz) { AssertThis(0); AssertSz(psz); #ifdef UNICODE _fError |= 0 > fwprintf(_pfile, PszLit("%s"), psz); #else _fError |= 0 > fprintf(_pfile, "%s", psz); #endif } /*************************************************************************** Return whether there has been an error writing to this message sink. ***************************************************************************/ bool MSSIO::FError(void) { AssertThis(0); return _fError; } ================================================ FILE: kauai/src/mssio.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Copyright (c) Microsoft Corporation A message sink (MSNK) wrapper around a stdio file. Include before including this file. ***************************************************************************/ #ifndef MSSIO_H #define MSSIO_H /*************************************************************************** Standard i/o message sink. ***************************************************************************/ typedef class MSSIO *PMSSIO; #define MSSIO_PAR MSNK class MSSIO : public MSSIO_PAR { protected: bool _fError; FILE *_pfile; public: MSSIO(FILE *pfile); virtual void ReportLine(PSTZ pstz); virtual void Report(PSTZ pstz); virtual bool FError(void); }; #endif //! MSSIO_H ================================================ FILE: kauai/src/pic.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Common OS-independent picture routines. ***************************************************************************/ #include "frame.h" ASSERTNAME RTCLASS(PIC) /*************************************************************************** Static method to create a new PIC based on the given HPIC with bounding rectangle *prc. If this fails, it is the callers responsibility to free the hpic. If it succeeds, the ppic returned owns the hpic. ***************************************************************************/ PPIC PIC::PpicNew(HPIC hpic, RC *prc) { Assert(hpic != hNil, "nil hpic"); AssertVarMem(prc); PPIC ppic; if (pvNil == (ppic = NewObj PIC)) return pvNil; ppic->_hpic = hpic; ppic->_rc = *prc; AssertPo(ppic, 0); return ppic; } /*************************************************************************** Get the natural rectangle for the picture. ***************************************************************************/ void PIC::GetRc(RC *prc) { AssertThis(0); *prc = _rc; } /*************************************************************************** Add the picture to the chunky file. The OS specific representation will be a child of the chunk and have the given chid value. ***************************************************************************/ bool PIC::FAddToCfl(PCFL pcfl, CTG ctg, CNO *pcno, CHID chid) { AssertThis(0); AssertPo(pcfl, 0); AssertVarMem(pcno); BLCK blck; CNO cnoKid; long cb; if (!pcfl->FAdd(0, ctg, pcno)) return fFalse; cb = CbOnFile(); if (!pcfl->FAddChild(ctg, *pcno, chid, cb, kctgPictNative, &cnoKid, &blck) || !FWrite(&blck)) { pcfl->Delete(ctg, *pcno); TrashVar(pcno); return fFalse; } return fTrue; } /*************************************************************************** Put the picture as the given ctg and cno in the chunky file. The OS specific representation will be a child of the chunk and have the given chid value. ***************************************************************************/ bool PIC::FPutInCfl(PCFL pcfl, CTG ctg, CNO cno, CHID chid) { AssertThis(0); AssertPo(pcfl, 0); bool fDelOnFail; long ikid; KID kid; BLCK blck; CNO cnoKid; long cb; fDelOnFail = !pcfl->FFind(ctg, cno); if (!pcfl->FPut(0, ctg, cno)) goto LFail; cb = CbOnFile(); if (!pcfl->FAddChild(ctg, cno, chid, cb, kctgPictNative, &cnoKid, &blck)) goto LFail; if (!FWrite(&blck)) { if (!fDelOnFail) pcfl->DeleteChild(ctg, cno, kctgPictNative, cnoKid, chid); LFail: if (fDelOnFail) pcfl->Delete(ctg, cno); return fFalse; } // delete all other reps with the same ctg and chid for (ikid = pcfl->Ckid(ctg, cno); ikid-- > 0;) { AssertDo(pcfl->FGetKid(ctg, cno, ikid, &kid), 0); if (kid.cki.ctg == kctgPictNative && kid.chid == chid && kid.cki.cno != cnoKid) pcfl->DeleteChild(ctg, cno, kid.cki.ctg, kid.cki.cno, kid.chid); } return fTrue; } #ifdef DEBUG /*************************************************************************** Assert the validity of a PIC. ***************************************************************************/ void PIC::AssertValid(ulong grf) { PIC_PAR::AssertValid(0); Assert(_hpic != hNil, "bad hpic"); } #endif // DEBUG /*************************************************************************** A PFNRPO to read PIC 0 from a GRAF chunk. ***************************************************************************/ bool FReadMainPic(PCFL pcfl, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb) { PPIC ppic; if (pvNil == ppbaco) { // REVIEW shonk: get a better estimate of the real size - *pcb = 1; return fTrue; } if (pvNil == (ppic = PIC::PpicFetch(pcfl, ctg, cno))) { TrashVar(pcb); TrashVar(ppbaco); return fFalse; } *pcb = ppic->CbOnFile(); *ppbaco = ppic; return fTrue; } ================================================ FILE: kauai/src/pic.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Picture management code declarations. ***************************************************************************/ #ifndef PIC_H #define PIC_H const FTG kftgPict = 'PICT'; const FTG kftgMeta = 'WMF'; const FTG kftgEnhMeta = 'EMF'; /*************************************************************************** Picture class. This is a wrapper around a system picture (Mac Pict or Win MetaFile). ***************************************************************************/ typedef class PIC *PPIC; #define PIC_PAR BACO #define kclsPIC 'PIC' class PIC : public PIC_PAR { RTCLASS_DEC ASSERT protected: struct PICH { RC rc; long cb; }; HPIC _hpic; RC _rc; PIC(void); #ifdef WIN static HPIC _HpicReadWmf(FNI *pfni); #endif // WIN public: ~PIC(void); static PPIC PpicFetch(PCFL pcfl, CTG ctg, CNO cno, CHID chid = 0); static PPIC PpicRead(PBLCK pblck); static PPIC PpicReadNative(FNI *pfni); static PPIC PpicNew(HPIC hpic, RC *prc); void GetRc(RC *prc); HPIC Hpic(void) { return _hpic; } bool FAddToCfl(PCFL pcfl, CTG ctg, CNO *pcno, CHID chid = 0); bool FPutInCfl(PCFL pcfl, CTG ctg, CNO cno, CHID chid = 0); virtual long CbOnFile(void); virtual bool FWrite(PBLCK pblck); }; // a chunky resource reader to read picture 0 from a GRAF chunk bool FReadMainPic(PCFL pcfl, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb); #endif //! PIC_H ================================================ FILE: kauai/src/picmac.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Macintosh picture routines. ***************************************************************************/ #include "frame.h" ASSERTNAME /*************************************************************************** Constructor for a picture. ***************************************************************************/ PIC::PIC(void) { _hpic = hNil; _rc.Zero(); } /*************************************************************************** Destructor for a picture. ***************************************************************************/ PIC::~PIC(void) { AssertBaseThis(0); if (hNil != _hpic) KillPicture(_hpic); } /*************************************************************************** Read a picture from a chunky file. This routine only reads or converts OS specific representations with the given chid value. ***************************************************************************/ PPIC PIC::PpicFetch(PCFL pcfl, CTG ctg, CNO cno, CHID chid) { AssertPo(pcfl, 0); KID kid; BLCK blck; if (!pcfl->FFind(ctg, cno)) return pvNil; if (pcfl->FGetKidChidCtg(ctg, cno, chid, kctgMacPict, &kid) && pcfl->FFind(kid.cki.ctg, kid.cki.cno, &blck)) { return PpicRead(&blck); } // REVIEW shonk: convert another type to a Mac Pict... return pvNil; } /*************************************************************************** Read a picture from a chunky file. This routine only reads a system specific pict (Mac PICT or Windows MetaFile) and its header. ***************************************************************************/ PPIC PIC::PpicRead(PBLCK pblck) { AssertPo(pblck, fblckReadable); HPIC hpic; PICH pich; PPIC ppic; RC rc; bool fT; if (!pblck->FUnpackData() || pblck->Cb() <= size(PICH) + size(Picture) || !pblck->FReadRgb(&pich, size(PICH), 0) || pich.rc.FEmpty() || pich.cb != pblck->Cb()) { return pvNil; } if (hNil == (hpic = (HPIC)NewHandle(pich.cb - size(PICH)))) return pvNil; HLock((HN)hpic); fT = pblck->FReadRgb(*hpic, pich.cb - size(PICH), size(PICH)); HUnlock((HN)hpic); if (!fT || pvNil == (ppic = NewObj PIC)) { KillPicture(hpic); return pvNil; } ppic->_hpic = hpic; ppic->_rc = pich.rc; AssertPo(ppic, 0); return ppic; } /*************************************************************************** Return the total size on file. ***************************************************************************/ long PIC::CbOnFile(void) { AssertThis(0); return GetHandleSize((HN)_hpic) + size(PICH); } /*************************************************************************** Write the meta file (and its header) to the given BLCK. ***************************************************************************/ bool PIC::FWrite(PBLCK pblck) { AssertThis(0); AssertPo(pblck, 0); long cb; bool fT; PICH pich; achar ch; cb = GetHandleSize((HN)_hpic); if ((pich.cb = cb + size(PICH)) != pblck->Cb()) return fFalse; ch = HGetState((HN)_hpic); HLock((HN)_hpic); pich.rc = _rc; fT = pblck->FWriteRgb(&pich, size(PICH), 0) && pblck->FWriteRgb(*_hpic, cb, size(PICH)); HSetState((HN)_hpic, ch); return fT; } /*************************************************************************** Static method to read the file as a native picture (PICT file on Mac). ***************************************************************************/ PPIC PIC::PpicReadNative(FNI *pfni) { AssertPo(pfni, ffniFile); PFIL pfil; FP fpMac; HPIC hpic; PPIC ppic; bool fT; RCS rcs; if (pfni->Ftg() != kftgPict || pvNil == (pfil = FIL::PfilOpen(pfni))) { return pvNil; } if (512 + size(Picture) >= (fpMac = pfil->FpMac())) goto LFail; if (hNil == (hpic = (HPIC)NewHandle(fpMac - 512))) { LFail: ReleasePpo(&pfil); return pvNil; } HLock((HN)hpic); fT = pfil->FReadRgb(*hpic, fpMac - 512, 512); rcs = (*hpic)->picFrame; HUnlock((HN)hpic); ReleasePpo(&pfil); if (!fT || pvNil == (ppic = NewObj PIC)) { DisposHandle((HN)hpic); return pvNil; } ppic->_hpic = hpic; ppic->_rc = RC(rcs); AssertPo(ppic, 0); return ppic; } ================================================ FILE: kauai/src/picwin.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Windows specific picture (metafile) routines. ***************************************************************************/ #include "frame.h" ASSERTNAME /*************************************************************************** Constructor for a picture. ***************************************************************************/ PIC::PIC(void) { _hpic = hNil; _rc.Zero(); } /*************************************************************************** Destructor for a picture. ***************************************************************************/ PIC::~PIC(void) { AssertBaseThis(0); if (hNil != _hpic) DeleteEnhMetaFile(_hpic); } /*************************************************************************** Read a picture from a chunky file. This routine only reads or converts OS specific representations with the given chid value. ***************************************************************************/ PPIC PIC::PpicFetch(PCFL pcfl, CTG ctg, CNO cno, CHID chid) { AssertPo(pcfl, 0); BLCK blck; KID kid; if (!pcfl->FFind(ctg, cno)) return pvNil; if (pcfl->FGetKidChidCtg(ctg, cno, chid, kctgMeta, &kid) && pcfl->FFind(kid.cki.ctg, kid.cki.cno, &blck)) { return PpicRead(&blck); } // REVIEW shonk: convert another type to a MetaFile... return pvNil; } /*************************************************************************** Read a picture from a chunky file. This routine only reads a system specific pict (Mac PICT or Windows MetaFile) and its header. ***************************************************************************/ PPIC PIC::PpicRead(PBLCK pblck) { AssertPo(pblck, fblckReadable); HPIC hpic; HQ hq; PICH *ppich; PPIC ppic; RC rc; long cb; if (!pblck->FUnpackData()) return pvNil; cb = pblck->Cb(); if (cb <= size(PICH)) return pvNil; if (hqNil == (hq = pblck->HqFree())) return pvNil; ppich = (PICH *)PvLockHq(hq); rc = ppich->rc; if (rc.FEmpty() || ppich->cb != cb) hpic = hNil; else hpic = SetEnhMetaFileBits(cb - size(PICH), (byte *)(ppich + 1)); UnlockHq(hq); FreePhq(&hq); if (hNil == hpic) return pvNil; if (pvNil == (ppic = NewObj PIC)) { DeleteEnhMetaFile(hpic); return pvNil; } ppic->_hpic = hpic; ppic->_rc = rc; AssertPo(ppic, 0); return ppic; } /*************************************************************************** Return the total size on file. ***************************************************************************/ long PIC::CbOnFile(void) { AssertThis(0); return GetEnhMetaFileBits(_hpic, 0, pvNil) + size(PICH); } /*************************************************************************** Write the meta file (and its header) to the given BLCK. ***************************************************************************/ bool PIC::FWrite(PBLCK pblck) { AssertThis(0); AssertPo(pblck, 0); long cb, cbTot; bool fT; PICH *ppich; cb = GetEnhMetaFileBits(_hpic, 0, pvNil); if (cb == 0 || (cbTot = cb + size(PICH)) != pblck->Cb()) return fFalse; if (!FAllocPv((void **)&ppich, cbTot, fmemNil, mprNormal)) return fFalse; ppich->rc = _rc; ppich->cb = cbTot; fT = (GetEnhMetaFileBits(_hpic, cb, (byte *)(ppich + 1)) == (ulong)cb) && pblck->FWrite(ppich); FreePpv((void **)&ppich); return fT; } /*************************************************************************** Static method to read the file as a native picture (EMF or WMF file). ***************************************************************************/ PPIC PIC::PpicReadNative(FNI *pfni) { AssertPo(pfni, ffniFile); HPIC hpic; PPIC ppic; RC rc; ENHMETAHEADER emh; STN stn; switch (pfni->Ftg()) { default: return pvNil; case kftgMeta: hpic = _HpicReadWmf(pfni); break; case kftgEnhMeta: pfni->GetStnPath(&stn); hpic = GetEnhMetaFile(stn.Psz()); break; } if (hNil == hpic) return pvNil; if (pvNil == (ppic = NewObj PIC)) { DeleteEnhMetaFile(hpic); return pvNil; } GetEnhMetaFileHeader(hpic, size(emh), &emh); rc.Set(LwMulDiv(emh.rclFrame.left, 72, 2540), LwMulDiv(emh.rclFrame.top, 72, 2540), LwMulDiv(emh.rclFrame.right, 72, 2540), LwMulDiv(emh.rclFrame.bottom, 72, 2540)); ppic->_hpic = hpic; ppic->_rc = rc; AssertPo(ppic, 0); return ppic; } /* placeable metafile data definitions */ #define lwMEFH 0x9AC6CDD7 /* placeable metafile header */ typedef struct _MEFH { DWORD lwKey; short w1; short xpLeft; short ypTop; short xpRight; short ypBottom; WORD w2; DWORD dw1; WORD w3; } MEFH; /*************************************************************************** Static method to read an old style WMF file. ***************************************************************************/ HPIC PIC::_HpicReadWmf(FNI *pfni) { MEFH mefh; METAHEADER mh; HPIC hpic; long lw; long cb; PFIL pfil; void *pv; bool fT; FP fp; const long kcbMefh = 22; const long kcbMetaHeader = 18; if (pvNil == (pfil = FIL::PfilOpen(pfni))) return hNil; // check for type of meta file if (!pfil->FReadRgb(&lw, size(long), 0)) goto LFail; // read placeable meta file header - NOTE: we can't just use size(MEFH) for // the cb because the MEFH is padded to a long boundary by the compiler fp = 0; if (lw == lwMEFH && !pfil->FReadRgbSeq(&mefh, kcbMefh, &fp)) goto LFail; // read METAHEADER structure - NOTE: we can't just use size(METAHEADER) for // the cb because the METAHEADER is padded to a long boundary by the // compiler if (!pfil->FReadRgbSeq(&mh, kcbMetaHeader, &fp) || mh.mtVersion < 0x0300 || 2 * mh.mtHeaderSize != kcbMetaHeader || !FIn(cb = 2 * mh.mtSize, kcbMetaHeader + 1, kcbMax)) { goto LFail; } if (!FAllocPv(&pv, cb, fmemNil, mprNormal)) { LFail: ReleasePpo(&pfil); return hNil; } *(METAHEADER *)pv = mh; fT = pfil->FReadRgbSeq(PvAddBv(pv, kcbMetaHeader), cb - kcbMetaHeader, &fp); ReleasePpo(&pfil); if (!fT) { FreePpv(&pv); return hNil; } // convert the old style metafile to an enhanced metafile hpic = SetWinMetaFileBits(cb, (byte *)pv, hNil, pvNil); FreePpv(&pv); return hpic; } ================================================ FILE: kauai/src/region.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Region code. ***************************************************************************/ #include "frame.h" ASSERTNAME RTCLASS(REGN) RTCLASS(REGSC) long const kcdxpBlock = 100; /*************************************************************************** Region builder class. For building the _pglxp of a region and getting its bounding rectangle and _dxp value. ***************************************************************************/ typedef class REGBL *PREGBL; #define REGBL_PAR BASE #define kclsREGBL 'rgbl' class REGBL : public REGBL_PAR { protected: long _ypCur; RC _rcRef; RC _rc; PGL _pglxp; bool _fResize; long _idypPrev; long _idypCur; long _ixpCur; public: REGBL(void) { _pglxp = pvNil; } ~REGBL(void) { ReleasePpo(&_pglxp); } bool FInit(RC *prcRef, PGL pglxp = pvNil); bool FStartRow(long dyp, long cxpMax); void EndRow(void); void AddXp(long xp) { // can only be called while building a row. AssertThis(0); Assert(_idypCur != ivNil, "calling AddXp outside a row"); Assert(_ixpCur < _pglxp->IvMac(), "overflow in AddXp"); if (_rc.xpLeft > xp) _rc.xpLeft = xp; if (_rc.xpRight < xp) _rc.xpRight = xp; *(long *)_pglxp->QvGet(_ixpCur++) = xp; } bool FDone(void) { AssertThis(0); return _ypCur >= _rcRef.ypBottom && _idypCur == ivNil; } PGL PglxpFree(RC *prc, long *pdxp); }; /*************************************************************************** Initialize a region builder. ***************************************************************************/ bool REGBL::FInit(RC *prcRef, PGL pglxp) { AssertVarMem(prcRef); AssertNilOrPo(pglxp, 0); Assert(!prcRef->FEmpty(), "empty reference rectangle"); ReleasePpo(&_pglxp); if (pvNil != pglxp) { _pglxp = pglxp; _pglxp->AddRef(); _fResize = fFalse; } else { if (pvNil == (_pglxp = GL::PglNew(size(long)))) return fFalse; _pglxp->SetMinGrow(kcdxpBlock); _fResize = fTrue; } _rcRef = *prcRef; _ypCur = _rc.ypTop = _rc.ypBottom = prcRef->ypTop; _rc.xpLeft = prcRef->Dxp(); _rc.xpRight = 0; _idypPrev = _idypCur = ivNil; _ixpCur = 0; return fTrue; } /*************************************************************************** Begin a row. ***************************************************************************/ bool REGBL::FStartRow(long dyp, long cxpMax) { AssertThis(0); Assert(_idypCur == ivNil, "row already started"); AssertIn(dyp, 0, kcbMax); Assert(_ypCur < _rcRef.ypBottom, "already filled"); AssertIn(cxpMax, 0, kcbMax); long ivLim; ivLim = _ixpCur + cxpMax + 2; if (_fResize) { ivLim = LwRoundAway(ivLim, kcdxpBlock); if (ivLim > _pglxp->IvMac() && !_pglxp->FSetIvMac(ivLim)) { ReleasePpo(&_pglxp); return fFalse; } } else if (ivLim > _pglxp->IvMac()) { Bug("overflowed provided pgl"); return fFalse; } dyp = LwMin(dyp, _rcRef.ypBottom - _ypCur); _idypCur = _ixpCur; *(long *)_pglxp->QvGet(_ixpCur++) = dyp; _ypCur += dyp; return fTrue; } /*************************************************************************** End a row in the region builder. ***************************************************************************/ void REGBL::EndRow(void) { AssertThis(0); Assert((_ixpCur - _idypCur) & 1, "not an even number of xp values"); Assert(_ixpCur < _pglxp->IvMac(), "overflow in EndRow"); long czp; long *qrgxp = (long *)_pglxp->QvGet(0); qrgxp[_ixpCur++] = klwMax; if ((czp = _ixpCur - _idypCur) > 2) _rc.ypBottom = _ypCur; // see if this row matches the last one if (ivNil != _idypPrev && czp == _idypCur - _idypPrev && FEqualRgb(&qrgxp[_idypPrev + 1], &qrgxp[_idypCur + 1], (czp - 1) * size(long))) { // this row matches the previous row qrgxp[_idypPrev] += qrgxp[_idypCur]; _ixpCur = _idypCur; } else if (0 == _idypCur && _ixpCur == 2) { // at the top and still empty _rc.ypTop = _rc.ypBottom = _ypCur; _ixpCur = 0; } else _idypPrev = _idypCur; _idypCur = ivNil; } /*************************************************************************** Clean up and return all the relevant information. ***************************************************************************/ PGL REGBL::PglxpFree(RC *prc, long *pdxp) { AssertThis(0); AssertVarMem(prc); AssertVarMem(pdxp); PGL pglxp; // see if the last row is empty if (_ypCur > _rc.ypBottom) { // last row is empty _ixpCur = _idypPrev; } *pdxp = 0; if (0 == _ixpCur) { // empty Assert(_rc.FEmpty(), 0); ReleasePpo(&_pglxp); _rc.Zero(); } else { Assert(!_rc.FEmpty(), 0); if (_ixpCur <= 4) { // rectangular ReleasePpo(&_pglxp); } else { AssertDo(_pglxp->FSetIvMac(_ixpCur), 0); AssertDo(_pglxp->FEnsureSpace(0, fgrpShrink), 0); *pdxp = -_rc.xpLeft; } _rc.Offset(_rcRef.xpLeft, 0); } *prc = _rc; pglxp = _pglxp; _pglxp = pvNil; return pglxp; } /*************************************************************************** Constructor for the region scanner class. ***************************************************************************/ REGSC::REGSC(void) { _pglxpSrc = pvNil; } /*************************************************************************** Destructor for the region scanner class. ***************************************************************************/ REGSC::~REGSC(void) { Free(); } /*************************************************************************** Release our hold on any memory. ***************************************************************************/ void REGSC::Free(void) { if (pvNil != _pglxpSrc) { _pglxpSrc->Unlock(); ReleasePpo(&_pglxpSrc); } } /*************************************************************************** Initializes a region scanner. The scanner implicitly intersects the region with *prcRel and returns xp values relative to prcRel->xpLeft. ***************************************************************************/ void REGSC::Init(PREGN pregn, RC *prcRel) { RC rc = pregn->_rc; rc.Offset(pregn->_dxp, 0); _InitCore(pregn->_pglxp, &rc, prcRel); } /*************************************************************************** Initializes a region scanner with the given rectangle. ***************************************************************************/ void REGSC::InitRc(RC *prc, RC *prcRel) { _InitCore(pvNil, prc, prcRel); } /*************************************************************************** Initializes a region scanner. The scanner implicitly intersects the region with *prcRel and returns xp values relative to prcRel->xpLeft. ***************************************************************************/ void REGSC::_InitCore(PGL pglxp, RC *prc, RC *prcRel) { Free(); RC rc = *prc; if (pvNil != (_pglxpSrc = pglxp)) { _pglxpSrc->AddRef(); _pxpLimCur = (long *)_pglxpSrc->PvLock(0); _pxpLimSrc = _pxpLimCur + _pglxpSrc->IvMac(); } else { rc.FIntersect(prcRel); _rgxpRect[0] = rc.Dyp(); _rgxpRect[1] = 0; _rgxpRect[2] = rc.Dxp(); _rgxpRect[3] = klwMax; _pxpLimCur = _rgxpRect; _pxpLimSrc = _rgxpRect + 4; } _dxp = rc.xpLeft - prcRel->xpLeft; _xpRight = prcRel->Dxp(); _dyp = rc.ypTop - prcRel->ypTop; _dypTot = prcRel->Dyp(); // initialize to an empty row _pxpLimRow = (_pxpMinRow = _pxpLimCur) - 1; _xpMinRow = klwMax; ScanNext(0); } /*************************************************************************** Scan the next horizontal strip of the region. ***************************************************************************/ void REGSC::_ScanNextCore(void) { long dxpT; Assert(_dyp <= 0, "why is _ScanNextCore being called?"); if (_dypTot <= 0) { // ran out of region! goto LEndRegion; } for (;;) { // do the next scan if (_pxpLimCur >= _pxpLimSrc) { // ran out of region! LEndRegion: // use kswMax, not klwMax, so clients can add this to // another yp value without fear of overflow _dyp = kswMax; _pxpLimRow = (_pxpMinRow = _pxpLimCur = _pxpLimSrc) - 1; _xpMinRow = klwMax; return; } if ((_dyp += *_pxpLimCur++) > 0) break; // find the start of the next row while (*_pxpLimCur != klwMax) { _pxpLimCur += 2; Assert(_pxpLimCur < _pxpLimSrc && _pxpLimCur[-1] != klwMax, "bad region 1"); } _pxpLimCur++; } //_pxpLimCur now points to the beginning of the correct row // find the first xp value in our range if (*_pxpLimCur < -_dxp) { do { _pxpLimCur += 2; Assert(_pxpLimCur < _pxpLimSrc && _pxpLimCur[-1] != klwMax, "bad region 2"); } while (*_pxpLimCur < -_dxp); // see if we went too far if (_pxpLimCur[-1] > -_dxp) { _xpMinRow = 0; _pxpMinRow = _pxpLimCur - 1; goto LFindLim; } } _xpMinRow = *_pxpLimCur++; _pxpMinRow = _pxpLimCur; if (_xpMinRow == klwMax) { // empty row _pxpLimRow = _pxpLimCur - 1; return; } if ((_xpMinRow += _dxp) >= _xpRight) { // empty row, but we need to find the start of the next row AssertIn(_xpMinRow, 0, kcbMax); Assert(*_pxpLimCur != klwMax, "bad region 3"); // find the start of the next row _pxpLimCur++; while (*_pxpLimCur != klwMax) { _pxpLimCur += 2; Assert(_pxpLimCur < _pxpLimSrc && _pxpLimCur[-1] != klwMax, "bad region 4"); } _pxpLimCur++; _pxpLimRow = (_pxpMinRow = _pxpLimCur) - 1; _xpMinRow = klwMax; return; } Assert(*_pxpLimCur != klwMax, "bad region 5"); _pxpLimCur++; LFindLim: dxpT = _xpRight - _dxp; while (*_pxpLimCur < dxpT) { _pxpLimCur += 2; Assert(_pxpLimCur < _pxpLimSrc && _pxpLimCur[-1] != klwMax, "bad region 6"); } _pxpLimRow = _pxpLimCur; while (*_pxpLimCur != klwMax) { _pxpLimCur += 2; Assert(_pxpLimCur < _pxpLimSrc && _pxpLimCur[-1] != klwMax, "bad region 6"); } _pxpLimCur++; Assert((_pxpLimRow - _pxpMinRow) & 1, "logic error above"); } /*************************************************************************** Static method to create a new region and set it to a rectangle. ***************************************************************************/ PREGN REGN::PregnNew(RC *prc) { PREGN pregn; if (pvNil == (pregn = NewObj REGN)) return pvNil; if (pvNil != prc) pregn->_rc = *prc; AssertPo(pregn, 0); return pregn; } /*************************************************************************** Destructor for a region. ***************************************************************************/ REGN::~REGN(void) { ReleasePpo(&_pglxp); FreePhrgn(&_hrgn); } /*************************************************************************** Make the region rectangular. ***************************************************************************/ void REGN::SetRc(RC *prc) { AssertThis(0); AssertNilOrVarMem(prc); if (pvNil == prc) _rc.Zero(); else _rc = *prc; ReleasePpo(&_pglxp); FreePhrgn(&_hrgn); _dxp = 0; AssertThis(0); } /*************************************************************************** Offset the region. ***************************************************************************/ void REGN::Offset(long xp, long yp) { AssertThis(0); _rc.Offset(xp, yp); _dptRgn.Offset(xp, yp); } /*************************************************************************** Return whether the region is empty and if prc is not nil, fill in *prc with the region's bounding rectangle. ***************************************************************************/ bool REGN::FEmpty(RC *prc) { AssertThis(0); AssertNilOrVarMem(prc); if (pvNil != prc) *prc = _rc; return _rc.FEmpty(); } /*************************************************************************** Return whether the region is rectangular and if prc is not nil, fill in *prc with the region's bounding rectangle. ***************************************************************************/ bool REGN::FIsRc(RC *prc) { AssertThis(0); if (pvNil != prc) *prc = _rc; return _pglxp == pvNil; } /*************************************************************************** Scale the x values of the region by the given amount. ***************************************************************************/ void REGN::Scale(long lwNumX, long lwDenX, long lwNumY, long lwDenY) { AssertThis(0); Assert(lwDenX > 0 && lwNumX >= 0, "bad X scaling"); Assert(lwDenY > 0 && lwNumY >= 0, "bad Y scaling"); RC rcScaled; long yp, ypScaled, dyp, dypScaled; long xp1, xp2; RAT ratXp(lwNumX, lwDenX); RAT ratYp(lwNumY, lwDenY); rcScaled.xpLeft = ratXp.LwScale(_rc.xpLeft); rcScaled.xpRight = ratXp.LwScale(_rc.xpRight); rcScaled.ypTop = ratYp.LwScale(_rc.ypTop); rcScaled.ypBottom = ratYp.LwScale(_rc.ypBottom); if (rcScaled.FEmpty()) { _rc.Zero(); ReleasePpo(&_pglxp); return; } if (pvNil == _pglxp) { _rc = rcScaled; _dxp = 0; return; } REGSC regsc; REGBL regbl; regsc.Init(this, &_rc); AssertDo(regbl.FInit(&rcScaled, _pglxp), 0); yp = _rc.ypTop; ypScaled = rcScaled.ypTop; for (;;) { dyp = regsc.DypCur(); dypScaled = ratYp.LwScale(yp + dyp) - ypScaled; yp += dyp; if (dypScaled <= 0) { regsc.ScanNext(dyp); continue; } ypScaled += dypScaled; AssertDo(regbl.FStartRow(dypScaled, regsc.CxpCur()), 0); if (regsc.XpCur() == klwMax) goto LEndRow; xp1 = ratXp.LwScale(regsc.XpCur()); xp2 = ratXp.LwScale(regsc.XpFetch()); for (;;) { if (xp1 >= xp2) { // empty run - ignore both values if (regsc.XpFetch() == klwMax) break; xp1 = ratXp.LwScale(regsc.XpCur()); } else { // write xp1 and advance regbl.AddXp(xp1); xp1 = xp2; } // fetch a new xp2 if (regsc.XpFetch() == klwMax) { // write the last off regbl.AddXp(xp1); break; } xp2 = ratXp.LwScale(regsc.XpCur()); } LEndRow: regbl.EndRow(); if (regbl.FDone()) break; regsc.ScanNext(dyp); } ReleasePpo(&_pglxp); FreePhrgn(&_hrgn); // force the region scanner to let go of the pglxp before the // region builder tries to resize it. regsc.Free(); _pglxp = regbl.PglxpFree(&_rc, &_dxp); } /*************************************************************************** Union the two regions and leave the result in this one. If pregn2 is nil, this region is used for pregn2. ***************************************************************************/ bool REGN::FUnion(PREGN pregn1, PREGN pregn2) { AssertThis(0); AssertPo(pregn1, 0); AssertNilOrPo(pregn2, 0); REGSC regsc1; REGSC regsc2; RC rc; if (pvNil == pregn2) { if (pregn1->FEmpty()) return fTrue; pregn2 = this; } rc.Union(&pregn1->_rc, &pregn2->_rc); if (pvNil == pregn1->_pglxp && rc == pregn1->_rc || pvNil == pregn2->_pglxp && rc == pregn2->_rc) { // union is a rectangle SetRc(&rc); return fTrue; } regsc1.Init(pregn1, &rc); regsc2.Init(pregn2, &rc); return _FUnionCore(&rc, ®sc1, ®sc2); } /*************************************************************************** Union the given rectangle and region and leave the result in this region. If pregn is nil, this region is used for pregn. ***************************************************************************/ bool REGN::FUnionRc(RC *prc, PREGN pregn) { AssertThis(0); AssertVarMem(prc); AssertNilOrPo(pregn, 0); REGSC regsc1; REGSC regsc2; RC rc; if (pvNil == pregn) { if (prc->FEmpty()) return fTrue; pregn = this; } rc.Union(prc, &pregn->_rc); if (rc == *prc) { // *prc totally contains the region SetRc(&rc); return fTrue; } // if this one is rectangular and already contains *prc, then // we're done if (this == pregn && pvNil == _pglxp && rc == _rc) return fTrue; regsc1.InitRc(prc, &rc); regsc2.Init(pregn, &rc); return _FUnionCore(&rc, ®sc1, ®sc2); } /*************************************************************************** Core union routine. ***************************************************************************/ bool REGN::_FUnionCore(RC *prc, PREGSC pregsc1, PREGSC pregsc2) { AssertThis(0); AssertPo(pregsc1, 0); AssertPo(pregsc2, 0); void *pvSwap; long dyp; REGBL regbl; if (!regbl.FInit(prc)) return fFalse; for (;;) { dyp = LwMin(pregsc1->DypCur(), pregsc2->DypCur()); if (!regbl.FStartRow(dyp, pregsc1->CxpCur() + pregsc2->CxpCur())) return fFalse; for (;;) { Assert(FPure(pregsc1->FOn()) == FPure(pregsc2->FOn()), "region scanners have different on/off states"); if (pregsc1->XpCur() > pregsc2->XpCur()) { // swap them pvSwap = pregsc1; pregsc1 = pregsc2; pregsc2 = (PREGSC)pvSwap; } if (pregsc2->XpCur() == klwMax) break; if (pregsc1->FOn()) { // both on regbl.AddXp(pregsc1->XpCur()); pregsc1->XpFetch(); // 1 off, 2 on if (pregsc1->XpCur() < pregsc2->XpCur()) { regbl.AddXp(pregsc1->XpCur()); pregsc1->XpFetch(); continue; } pregsc2->XpFetch(); } else { // both off pregsc1->XpFetch(); // 1 on, 2 off if (pregsc1->XpCur() <= pregsc2->XpCur()) { pregsc1->XpFetch(); continue; } regbl.AddXp(pregsc2->XpCur()); pregsc2->XpFetch(); } } Assert(pregsc1->FOn(), "bad regions"); Assert(pregsc2->XpCur() == klwMax, 0); // copy the remainder of this row from pregsc1 while (pregsc1->XpCur() < klwMax) { regbl.AddXp(pregsc1->XpCur()); pregsc1->XpFetch(); } Assert(pregsc1->FOn(), "bad region"); regbl.EndRow(); if (regbl.FDone()) break; pregsc1->ScanNext(dyp); pregsc2->ScanNext(dyp); } ReleasePpo(&_pglxp); FreePhrgn(&_hrgn); _pglxp = regbl.PglxpFree(&_rc, &_dxp); AssertThis(0); return fTrue; } /*************************************************************************** Intersect the two regions and leave the result in this one. If pregn2 is nil, this region is used for pregn2. ***************************************************************************/ bool REGN::FIntersect(PREGN pregn1, PREGN pregn2) { AssertThis(0); AssertPo(pregn1, 0); AssertNilOrPo(pregn2, 0); REGSC regsc1; REGSC regsc2; RC rc; if (pvNil == pregn2) pregn2 = this; if (!rc.FIntersect(&pregn1->_rc, &pregn2->_rc)) { // result is empty SetRc(&rc); return fTrue; } // if pregn1 is rectangular and contains this one, then // we're done if (this == pregn2 && pvNil == pregn1->_pglxp && rc == _rc) return fTrue; if (pvNil == pregn1->_pglxp && pvNil == pregn2->_pglxp) { // both rectangles, so the intersection is a rectangle SetRc(&rc); return fTrue; } regsc1.Init(pregn1, &rc); regsc2.Init(pregn2, &rc); return _FIntersectCore(&rc, ®sc1, ®sc2); } /*************************************************************************** Intersect the given rectangle and region and leave the result in this region. If pregn is nil, this region is used for pregn. ***************************************************************************/ bool REGN::FIntersectRc(RC *prc, PREGN pregn) { AssertThis(0); AssertVarMem(prc); AssertNilOrPo(pregn, 0); REGSC regsc1; REGSC regsc2; RC rc; if (pvNil == pregn) pregn = this; if (!rc.FIntersect(prc, &pregn->_rc)) { // result is empty SetRc(&rc); return fTrue; } // if *prc contains this region, then we're done if (this == pregn && rc == _rc) return fTrue; if (pvNil == pregn->_pglxp) { // both rectangles, so the intersection is a rectangle SetRc(&rc); return fTrue; } regsc1.InitRc(prc, &rc); regsc2.Init(pregn, &rc); return _FIntersectCore(&rc, ®sc1, ®sc2); } /*************************************************************************** Core intersect routine. ***************************************************************************/ bool REGN::_FIntersectCore(RC *prc, PREGSC pregsc1, PREGSC pregsc2) { AssertThis(0); AssertPo(pregsc1, 0); AssertPo(pregsc2, 0); long dyp; void *pvSwap; REGBL regbl; if (!regbl.FInit(prc)) return fFalse; for (;;) { dyp = LwMin(pregsc1->DypCur(), pregsc2->DypCur()); if (!regbl.FStartRow(dyp, pregsc1->CxpCur() + pregsc2->CxpCur())) return fFalse; while (pregsc1->XpCur() < klwMax && pregsc2->XpCur() < klwMax) { Assert(FPure(pregsc1->FOn()) == FPure(pregsc2->FOn()), "region scanners have different on/off states"); if (pregsc1->XpCur() > pregsc2->XpCur()) { // swap them pvSwap = pregsc1; pregsc1 = pregsc2; pregsc2 = (PREGSC)pvSwap; } // NOTE: this is pretty much the adjoint of what's in _FUnionCore - ie, // swap the sense of FOn if (pregsc1->FOn()) { // both on pregsc1->XpFetch(); // 1 off, 2 on if (pregsc1->XpCur() <= pregsc2->XpCur()) { pregsc1->XpFetch(); continue; } regbl.AddXp(pregsc2->XpCur()); pregsc2->XpFetch(); } else { // both off regbl.AddXp(pregsc1->XpCur()); pregsc1->XpFetch(); // 1 on, 2 off if (pregsc1->XpCur() < pregsc2->XpCur()) { regbl.AddXp(pregsc1->XpCur()); pregsc1->XpFetch(); continue; } pregsc2->XpFetch(); } } Assert(pregsc1->FOn(), "bad regions"); regbl.EndRow(); if (regbl.FDone()) break; pregsc1->ScanNext(dyp); pregsc2->ScanNext(dyp); } ReleasePpo(&_pglxp); FreePhrgn(&_hrgn); _pglxp = regbl.PglxpFree(&_rc, &_dxp); AssertThis(0); return fTrue; } /*************************************************************************** Compute regn2 minus regn1 and put the result in this region. If pregn2 is nil, this region is used. ***************************************************************************/ bool REGN::FDiff(PREGN pregn1, PREGN pregn2) { AssertThis(0); AssertPo(pregn1, 0); AssertNilOrPo(pregn2, 0); REGSC regsc1; REGSC regsc2; RC rc, rcT; if (pvNil == pregn2) { // use this region as the first operand if (!rc.FIntersect(&_rc, &pregn1->_rc)) return fTrue; pregn2 = this; } if (pregn2->_rc.FEmpty()) { rc.Zero(); SetRc(&rc); return fTrue; } rc = pregn2->_rc; regsc1.Init(pregn1, &rc); regsc2.Init(pregn2, &rc); return _FDiffCore(&rc, ®sc2, ®sc1); } /*************************************************************************** Compute regn minus the given rectangle and put the result in this region. If pregn is nil, this region is used. ***************************************************************************/ bool REGN::FDiffRc(RC *prc, PREGN pregn) { AssertThis(0); AssertVarMem(prc); AssertNilOrPo(pregn, 0); REGSC regsc1; REGSC regsc2; RC rc; if (pvNil == pregn) { if (!rc.FIntersect(&_rc, prc)) return fTrue; pregn = this; } if (pregn->_rc.FEmpty() || prc->FContains(&pregn->_rc)) { // the rectangle contains the entire region or the region is empty rc.Zero(); SetRc(&rc); return fTrue; } rc = pregn->_rc; regsc1.InitRc(prc, &rc); regsc2.Init(pregn, &rc); return _FDiffCore(&rc, ®sc2, ®sc1); } /*************************************************************************** Compute *prc minus the given region and put the result in this region. If pregn is nil, this region is used. ***************************************************************************/ bool REGN::FDiffFromRc(RC *prc, PREGN pregn) { AssertThis(0); AssertVarMem(prc); AssertNilOrPo(pregn, 0); REGSC regsc1; REGSC regsc2; RC rc; if (pvNil == pregn) pregn = this; if (!rc.FIntersect(prc, &pregn->_rc)) { SetRc(prc); return fTrue; } if (pvNil == pregn->_pglxp && pregn->_rc.FContains(prc)) { // the region is rectangle and contains *prc, so the diff is empty rc.Zero(); SetRc(&rc); return fTrue; } regsc1.InitRc(prc, prc); regsc2.Init(pregn, prc); return _FDiffCore(prc, ®sc1, ®sc2); } /*************************************************************************** Core diff routine. Compute pregsc1 minus pregsc2. ***************************************************************************/ bool REGN::_FDiffCore(RC *prc, PREGSC pregsc1, PREGSC pregsc2) { AssertThis(0); AssertPo(pregsc1, 0); AssertPo(pregsc2, 0); long dyp; long xp1, xp2; REGBL regbl; if (!regbl.FInit(prc)) return fFalse; for (;;) { dyp = LwMin(pregsc1->DypCur(), pregsc2->DypCur()); if (!regbl.FStartRow(dyp, pregsc1->CxpCur() + pregsc2->CxpCur())) return fFalse; xp1 = pregsc1->XpCur(); xp2 = pregsc2->XpCur(); while (xp1 < klwMax) { if (pregsc1->FOn()) { while (xp2 <= xp1) xp2 = pregsc2->XpFetch(); // xp1 < xp2 if (pregsc2->FOn()) { // both on regbl.AddXp(xp1); } xp1 = pregsc1->XpFetch(); } Assert(!pregsc1->FOn(), "why are we here?"); if (!pregsc2->FOn()) { // both off if (xp1 <= xp2) { xp1 = pregsc1->XpFetch(); continue; } // xp2 < xp1 regbl.AddXp(xp2); xp2 = pregsc2->XpFetch(); } Assert(!pregsc1->FOn() && pregsc2->FOn(), "we shouldn't be here"); // 1 off, 2 on if (xp2 < xp1) { regbl.AddXp(xp2); xp2 = pregsc2->XpFetch(); } else { regbl.AddXp(xp1); xp1 = pregsc1->XpFetch(); } } Assert(pregsc1->FOn(), "bad region"); regbl.EndRow(); if (regbl.FDone()) break; pregsc1->ScanNext(dyp); pregsc2->ScanNext(dyp); } ReleasePpo(&_pglxp); FreePhrgn(&_hrgn); _pglxp = regbl.PglxpFree(&_rc, &_dxp); AssertThis(0); return fTrue; } /*************************************************************************** Create a system region that is equivalent to the given region. ***************************************************************************/ HRGN REGN::HrgnCreate(void) { #ifdef WIN RGNDATAHEADER *prd; RCS *prcs; REGSC regsc; long crcMac, crc; HRGN hrgn; long yp, dyp; crcMac = _pglxp == pvNil ? 1 : _pglxp->IvMac() / 2; if (!FAllocPv((void **)&prd, size(RGNDATAHEADER) + LwMul(crcMac, size(RECT)), fmemNil, mprNormal)) { return hNil; } prcs = (RCS *)(prd + 1); regsc.Init(this, &_rc); crc = 0; if (!_rc.FEmpty()) { yp = _rc.ypTop; for (;;) { dyp = regsc.DypCur(); while (regsc.XpCur() < klwMax) { prcs->left = regsc.XpCur() + _rc.xpLeft; prcs->right = regsc.XpFetch() + _rc.xpLeft; regsc.XpFetch(); prcs->top = yp; prcs->bottom = yp + dyp; prcs++; crc++; } if ((yp += dyp) >= _rc.ypBottom) break; regsc.ScanNext(dyp); } } AssertIn(crc, 0, crcMac + 1); prd->dwSize = size(RGNDATAHEADER); prd->iType = RDH_RECTANGLES; prd->nCount = crc; prd->nRgnSize = 0; prd->rcBound = (RCS)_rc; hrgn = ExtCreateRegion(pvNil, size(RGNDATAHEADER) + LwMul(crc, size(RECT)), (RGNDATA *)prd); FreePpv((void **)&prd); return hrgn; #endif // WIN #ifdef MAC HRGN hrgn; if (pvNil == _pglxp) { RCS rcs; if (hNil == (hrgn = NewRgn())) return hNil; rcs = RCS(_rc); RectRgn(hrgn, &rcs); return hrgn; } REGSC regsc1; REGSC regsc2; RC rc; long yp; long cb; long xp1, xp2; short *psw; regsc1.Init(this, &_rc); rc = _rc; rc.ypTop--; regsc2.Init(this, &rc); for (yp = _rc.ypTop, cb = size(Region);;) { cb += size(short); xp1 = regsc1.XpCur(); xp2 = regsc2.XpCur(); for (;;) { if (xp1 == xp2) { if (xp1 == klwMax) break; xp1 = regsc1.XpFetch(); xp2 = regsc2.XpFetch(); continue; } else if (xp1 < xp2) { cb += size(short); xp1 = regsc1.XpFetch(); } else { cb += size(short); xp2 = regsc2.XpFetch(); } } cb += size(short); if (yp >= _rc.ypBottom) break; yp += regsc1.DypCur(); regsc1.ScanNext(regsc1.DypCur()); regsc2.ScanNext(regsc2.DypCur()); } cb += size(short); if (hNil == (hrgn = (HRGN)NewHandle(cb))) return hNil; HLock((HN)hrgn); (*hrgn)->rgnSize = (short)cb; (*hrgn)->rgnBBox = RCS(_rc); regsc1.Init(this, &_rc); rc = _rc; rc.ypTop--; regsc2.Init(this, &rc); for (yp = _rc.ypTop, psw = (short *)((*hrgn) + 1);;) { *psw++ = (short)yp; xp1 = regsc1.XpCur(); xp2 = regsc2.XpCur(); for (;;) { if (xp1 == xp2) { if (xp1 == klwMax) break; xp1 = regsc1.XpFetch(); xp2 = regsc2.XpFetch(); continue; } else if (xp1 < xp2) { *psw++ = (short)xp1; xp1 = regsc1.XpFetch(); } else { *psw++ = (short)xp2; xp2 = regsc2.XpFetch(); } } *psw++ = 0x7FFF; if (yp >= _rc.ypBottom) break; yp += regsc1.DypCur(); regsc1.ScanNext(regsc1.DypCur()); regsc2.ScanNext(regsc2.DypCur()); } *psw++ = 0x7FFF; Assert(psw == PvAddBv(*hrgn, cb), "wrong size!"); HUnlock((HN)hrgn); return hrgn; #endif // MAC } /*************************************************************************** If we don't have a cached HRGN equivalent of this region, create one. In either case return it. ***************************************************************************/ HRGN REGN::HrgnEnsure(void) { if (hNil != _hrgn) { if (_dptRgn.xp != 0 || _dptRgn.yp != 0) { OffsetRgn(_hrgn, (short)_dptRgn.xp, (short)_dptRgn.yp); _dptRgn.xp = _dptRgn.yp = 0; } return _hrgn; } _dptRgn.xp = _dptRgn.yp = 0; _hrgn = HrgnCreate(); return _hrgn; } #ifdef DEBUG /*************************************************************************** Assert the validity of a REGN. ***************************************************************************/ void REGN::AssertValid(ulong grf) { REGN_PAR::AssertValid(0); AssertNilOrPo(_pglxp, 0); Assert(_dxp <= 0, "bad _dxp"); Assert(_dxp == 0 || _pglxp != pvNil, "_dxp should be zero"); // REVIEW shonk: REGN::AssertValid: fill this in } /*************************************************************************** Mark memory for the REGN. ***************************************************************************/ void REGN::MarkMem(void) { AssertValid(0); REGN_PAR::MarkMem(); MarkMemObj(_pglxp); } #endif // DEBUG ================================================ FILE: kauai/src/region.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Region stuff. ***************************************************************************/ #ifndef REGION_H #define REGION_H typedef class REGSC *PREGSC; /*************************************************************************** The region class. ***************************************************************************/ typedef class REGN *PREGN; #define REGN_PAR BASE #define kclsREGN 'REGN' class REGN : public REGN_PAR { RTCLASS_DEC ASSERT MARKMEM protected: friend class REGSC; // The _pglxp contains a bunch of rows. Each row consists of: // dyp, xp0, xp1, ..., klwMax. // The dyp is the height of the strip in pixels, the xp's are boundary points // The xp's are relative to _rc.xpLeft + _dxp. _pglxp is nil iff the region // is strictly rectangular. RC _rc; // bounding rectangle long _dxp; // additional offset for xp values PGL _pglxp; // region data - see above HRGN _hrgn; // for HrgnEnsure PT _dptRgn; // offset of _hrgn relative to this region REGN(void) { } bool _FUnionCore(RC *prc, PREGSC pregsc1, PREGSC pregsc2); bool _FIntersectCore(RC *prc, PREGSC pregsc1, PREGSC pregsc2); bool _FDiffCore(RC *prc, PREGSC pregsc1, PREGSC pregsc2); public: static PREGN PregnNew(RC *prc = pvNil); ~REGN(void); void SetRc(RC *prc = pvNil); void Offset(long xp, long yp); bool FEmpty(RC *prc = pvNil); bool FIsRc(RC *prc = pvNil); void Scale(long lwNumX, long lwDenX, long lwNumY, long lwDenY); bool FUnion(PREGN pregn1, PREGN pregn2 = pvNil); bool FUnionRc(RC *prc, PREGN pregn2 = pvNil); bool FIntersect(PREGN pregn1, PREGN pregn2 = pvNil); bool FIntersectRc(RC *prc, PREGN pregn = pvNil); bool FDiff(PREGN pregn1, PREGN pregn2 = pvNil); bool FDiffRc(RC *prc, PREGN pregn = pvNil); bool FDiffFromRc(RC *prc, PREGN pregn = pvNil); HRGN HrgnCreate(void); HRGN HrgnEnsure(void); }; /*************************************************************************** Region scanner class. ***************************************************************************/ #define REGSC_PAR BASE #define kclsREGSC 'rgsc' class REGSC : public REGSC_PAR { RTCLASS_DEC protected: PGL _pglxpSrc; // the list of points long *_pxpLimSrc; // the end of the list long *_pxpLimCur; // the end of the current row long _xpMinRow; // the first xp value of the active part of the current row long *_pxpMinRow; // the beginning of the active part of the currrent row long *_pxpLimRow; // the end of the active part of the current row long *_pxp; // the current postion in the current row long _dxp; // this gets added to all source xp values long _xpRight; // the right edge of the active area - left edge is 0 // current state bool _fOn; // whether the current xp is a transition to on or off long _xp; // the current xp long _dyp; // the remaining height that this scan is effective for long _dypTot; // the remaining total height of the active area // When scanning rectangles, _pglxpSrc will be nil and _pxpSrc et al will // point into this. long _rgxpRect[4]; void _InitCore(PGL pglxp, RC *prc, RC *prcRel); void _ScanNextCore(void); public: REGSC(void); ~REGSC(void); void Free(void); void Init(PREGN pregn, RC *prcRel); void InitRc(RC *prc, RC *prcRel); void ScanNext(long dyp) { _dypTot -= dyp; if ((_dyp -= dyp) <= 0) _ScanNextCore(); _pxp = _pxpMinRow; _xp = _xpMinRow; _fOn = fTrue; } long XpFetch(void) { if (_pxp < _pxpLimRow - 1) { _xp = _dxp + *_pxp++; _fOn = !_fOn; } else if (_pxp < _pxpLimRow) { AssertH(_fOn); _xp = LwMin(_xpRight, _dxp + *_pxp++); _fOn = !_fOn; } else { _xp = klwMax; _fOn = fTrue; } return _xp; } bool FOn(void) { return _fOn; } long XpCur(void) { return _xp; } long DypCur(void) { return _dyp; } long CxpCur(void) { return _pxpLimRow - _pxpMinRow + 1; } }; #endif //! REGION_H ================================================ FILE: kauai/src/rtxt.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Rich text document and associated DDG. ***************************************************************************/ #include "frame.h" ASSERTNAME RTCLASS(TXTB) RTCLASS(TXPD) RTCLASS(TXRD) RTCLASS(TXTG) RTCLASS(TXLG) RTCLASS(TXRG) RTCLASS(RTUN) BEGIN_CMD_MAP(TXRG, DDG) ON_CID_GEN(cidPlain, &TXRG::FCmdApplyProperty, &TXRG::FEnablePropCmd) ON_CID_GEN(cidBold, &TXRG::FCmdApplyProperty, &TXRG::FEnablePropCmd) ON_CID_GEN(cidItalic, &TXRG::FCmdApplyProperty, &TXRG::FEnablePropCmd) ON_CID_GEN(cidUnderline, &TXRG::FCmdApplyProperty, &TXRG::FEnablePropCmd) ON_CID_GEN(cidJustifyLeft, &TXRG::FCmdApplyProperty, &TXRG::FEnablePropCmd) ON_CID_GEN(cidJustifyCenter, &TXRG::FCmdApplyProperty, &TXRG::FEnablePropCmd) ON_CID_GEN(cidJustifyRight, &TXRG::FCmdApplyProperty, &TXRG::FEnablePropCmd) ON_CID_GEN(cidIndentNone, &TXRG::FCmdApplyProperty, &TXRG::FEnablePropCmd) ON_CID_GEN(cidIndentFirst, &TXRG::FCmdApplyProperty, &TXRG::FEnablePropCmd) ON_CID_GEN(cidIndentRest, &TXRG::FCmdApplyProperty, &TXRG::FEnablePropCmd) ON_CID_GEN(cidIndentAll, &TXRG::FCmdApplyProperty, &TXRG::FEnablePropCmd) ON_CID_GEN(cidChooseFont, &TXRG::FCmdApplyProperty, &TXRG::FEnablePropCmd) ON_CID_GEN(cidChooseFontSize, &TXRG::FCmdApplyProperty, &TXRG::FEnablePropCmd) ON_CID_GEN(cidChooseSubSuper, &TXRG::FCmdApplyProperty, &TXRG::FEnablePropCmd) END_CMD_MAP_NIL() #ifdef DEBUG /*************************************************************************** Assert the validity of the rich text doc. ***************************************************************************/ void TXTB::AssertValid(ulong grfobj) { achar ch; long ibMac; long cpMac; TXTB_PAR::AssertValid(grfobj); AssertPo(_pbsf, 0); ibMac = _pbsf->IbMac(); cpMac = ibMac / size(achar); Assert(ibMac % size(achar) == 0, "ibMac not divisible by size(achar)"); AssertIn(ibMac, size(achar), kcbMax); AssertIn(_cpMinCache, 0, cpMac + 1); AssertIn(_cpLimCache, 0, cpMac + 1); AssertIn(_cpLimCache, _cpMinCache, _cpMinCache + size(_rgchCache) + 1); AssertNilOrPo(_pfil, 0); if (grfobj & fobjAssertFull) { _pbsf->FetchRgb(ibMac - size(achar), size(achar), &ch); Assert(ch == kchReturn, "stream doesn't end with a carriage return"); } } /*************************************************************************** Mark memory for the TXTB. ***************************************************************************/ void TXTB::MarkMem(void) { AssertThis(fobjAssertFull); TXTB_PAR::MarkMem(); MarkMemObj(_pbsf); } #endif // DEBUG /*************************************************************************** Constructor for the base text document class ***************************************************************************/ TXTB::TXTB(PDOCB pdocb, ulong grfdoc) : TXTB_PAR(pdocb, grfdoc) { _acrBack = kacrWhite; _dxpDef = kdxpDocDef; } /*************************************************************************** Destructor for the base text document class ***************************************************************************/ TXTB::~TXTB(void) { ReleasePpo(&_pbsf); ReleasePpo(&_pfil); } /*************************************************************************** Initializer for the base text document class. ***************************************************************************/ bool TXTB::_FInit(PFNI pfni, PBSF pbsf, short osk) { AssertNilOrPo(pfni, ffniFile); AssertNilOrPo(pbsf, 0); achar ch; if (pvNil != pfni && pvNil == (_pfil = FIL::PfilOpen(pfni))) return fFalse; if (pvNil != pbsf) { if (osk != koskCur) { Bug("Can't translate a BSF"); return fFalse; } if (pbsf->IbMac() % size(achar) != 0) { Bug("BSF has a partial character"); return fFalse; } pbsf->AddRef(); _pbsf = pbsf; } else if (pvNil == (_pbsf = NewObj BSF)) return fFalse; else if (!_FLoad(osk)) return fFalse; // append a return character ch = kchReturn; if (!_pbsf->FReplace(&ch, size(achar), _pbsf->IbMac(), 0)) return fFalse; AssertThis(fobjAssertFull); return fTrue; } /*************************************************************************** Load the document from its file ***************************************************************************/ bool TXTB::_FLoad(short osk) { // initialize the BSF to just point to the file FLO flo; bool fRet = fFalse; if (pvNil == (flo.pfil = _pfil) || 0 == (flo.cb = _pfil->FpMac())) return fTrue; flo.pfil->AddRef(); flo.fp = 0; if (flo.FTranslate(osk)) { fRet = flo.cb == 0 || _pbsf->FReplaceFlo(&flo, fFalse, 0, _pbsf->IbMac()); } ReleasePpo(&flo.pfil); return fRet; } /*************************************************************************** Return the length of the text in the text document. ***************************************************************************/ long TXTB::CpMac(void) { // Note: we don't do an AssertThis(0) here for debug performance AssertThisMem(); AssertVarMem(_pbsf); Assert(_pbsf->IbMac() % size(achar) == 0, "IbMac() not divisible by size(achar)"); return _pbsf->IbMac() / size(achar); } /*************************************************************************** Suspend undo. This increments a count. ***************************************************************************/ void TXTB::SuspendUndo(void) { AssertThis(0); _cactSuspendUndo++; } /*************************************************************************** Resume undo. This decrements a count. ***************************************************************************/ void TXTB::ResumeUndo(void) { AssertThis(0); Assert(_cactSuspendUndo > 0, "bad _cactSuspendUndo"); _cactSuspendUndo--; } /*************************************************************************** Set up undo for an action. If this succeeds, you must call either CancelUndo or CommitUndo. Default TXTB doesn't create an undo record. ***************************************************************************/ bool TXTB::FSetUndo(long cp1, long cp2, long ccpIns) { AssertThis(0); AssertIn(cp1, 0, CpMac() + 1); AssertIn(cp2, 0, CpMac() + 1); AssertIn(ccpIns, 0, kcbMax); _cactSuspendUndo++; return fTrue; } /*************************************************************************** Cancel undo. ***************************************************************************/ void TXTB::CancelUndo(void) { ResumeUndo(); } /*************************************************************************** Commit the setup undo. ***************************************************************************/ void TXTB::CommitUndo(void) { ResumeUndo(); } /*************************************************************************** Increments the _cactCombineUndo counter. This is used to determine whether the new undo record can be combined with the previous one (during typing etc). ***************************************************************************/ void TXTB::BumpCombineUndo(void) { AssertThis(0); if (_cactSuspendUndo <= 0) _cactCombineUndo++; } /*************************************************************************** Search for some text. If fCaseSensitive is false, we map prgch to all lower case. The pcpLim parameter is in case we support regular expressions in the future. ***************************************************************************/ bool TXTB::FFind(achar *prgch, long cch, long cpMin, long *pcpMin, long *pcpLim, bool fCaseSensitive) { AssertThis(fobjAssertFull); AssertIn(cch, 1, kcbMax); AssertPvCb(prgch, cch * size(achar)); AssertIn(cpMin, 0, CpMac() + 1); AssertVarMem(pcpMin); AssertVarMem(pcpLim); const long kcbCharSet = 256 / 8; byte grfbitUsed[kcbCharSet]; long ibit; achar *pch, *pchLast; achar ch; long cpT, cpMac; if (!fCaseSensitive) LowerRgch(prgch, cch); cch--; pchLast = prgch + cch; // calculate the grfbitUsed bit field - indicating, which characters // appear in the search string. ClearPb(grfbitUsed, size(grfbitUsed)); for (pch = prgch; pch <= pchLast; pch++) { ibit = (long)(byte)*pch; AssertIn(ibit, 0, 256); grfbitUsed[IbFromIbit(ibit)] |= Fbit(ibit); } for (cpMac = CpMac(); (cpT = cpMin + cch) < cpMac;) { for (pch = pchLast;; cpT--, pch--) { // get the character and map it to lower case if we're doing // a case insensitive search ch = _ChFetch(cpT); if (!fCaseSensitive) ch = ChLower(ch); // see if the character is used anywhere within the search string ibit = (long)(byte)ch; if (!(grfbitUsed[IbFromIbit(ibit)] & Fbit(ibit))) { // this character isn't anywhere in the search string, // so we can jump by a lot. cpMin = cpT + 1; break; } // see if the character matches the corresponding character in // the search string if (ch != *pch) { // character doesn't match, just jump by one cpMin++; break; } // if cpT is back to cpMin, we've got a match if (cpT == cpMin) { // we matched *pcpMin = cpMin; *pcpLim = cpMin + cch + 1; return fTrue; } } } TrashVar(pcpMin); TrashVar(pcpLim); return fFalse; } /*************************************************************************** Turn the selection of this TXTB's active DDG off. ***************************************************************************/ void TXTB::HideSel(void) { AssertThis(0); PDDG pddg; if (pvNil != (pddg = PddgActive()) && pddg->FIs(kclsTXTG)) ((PTXTG)pddg)->HideSel(); } /*************************************************************************** Set the selection of this TXTB's active DDG to the given range. ***************************************************************************/ void TXTB::SetSel(long cpAnchor, long cpOther, long gin) { AssertThis(0); PDDG pddg; if (pvNil != (pddg = PddgActive()) && pddg->FIs(kclsTXTG)) ((PTXTG)pddg)->SetSel(cpAnchor, cpOther, gin); } /*************************************************************************** Make sure the selection of this TXTB's acttive DDG is visible (at least the _cpOther end of it). ***************************************************************************/ void TXTB::ShowSel(void) { AssertThis(0); PDDG pddg; if (pvNil != (pddg = PddgActive()) && pddg->FIs(kclsTXTG)) ((PTXTG)pddg)->ShowSel(); } /*************************************************************************** Fetch a character of the stream through the cache. ***************************************************************************/ void TXTB::_CacheRange(long cpMin, long cpLim) { AssertThis(0); AssertIn(cpMin, 0, CpMac() + 1); AssertIn(cpLim, cpMin, CpMac() + 1); AssertIn(cpLim - cpMin, 0, kcchMaxTxtbCache + 1); long cpMac; if (cpMin >= _cpMinCache && cpLim <= _cpLimCache) return; cpMac = CpMac(); if (_cpLimCache <= _cpMinCache) { // nothing currently cached goto LNewCache; } if (cpMin < _cpMinCache) { long cpT; if (_cpMinCache >= cpMin + kcchMaxTxtbCache) goto LNewCache; // keep front end of old stuff cpT = LwMax(0, LwMin(cpMin, _cpLimCache - kcchMaxTxtbCache)); _cpLimCache = LwMin(cpT + kcchMaxTxtbCache, _cpLimCache); BltPb(_rgchCache, _rgchCache + (_cpMinCache - cpT), (_cpLimCache - _cpMinCache) * size(achar)); _pbsf->FetchRgb(cpT * size(achar), (_cpMinCache - cpT) * size(achar), _rgchCache); _cpMinCache = cpT; } else { Assert(cpLim > _cpLimCache, 0); if (cpLim >= _cpLimCache + kcchMaxTxtbCache) { LNewCache: // just cache around [cpMin, cpLim) _cpMinCache = LwMax(0, LwMin((cpMin + cpLim - kcchMaxTxtbCache) / 2, cpMac - kcchMaxTxtbCache)); _cpLimCache = LwMin(_cpMinCache + kcchMaxTxtbCache, cpMac); _pbsf->FetchRgb(_cpMinCache * size(achar), (_cpLimCache - _cpMinCache) * size(achar), _rgchCache); } else { // keep back end old stuff long cpLimCache, cpMinCache; cpLimCache = LwMin(cpMac, LwMax(cpLim, _cpMinCache + kcchMaxTxtbCache)); cpMinCache = LwMax(cpLimCache - kcchMaxTxtbCache, _cpMinCache); if (cpMinCache != _cpMinCache) { BltPb(_rgchCache + (cpMinCache - _cpMinCache), _rgchCache, (_cpLimCache - cpMinCache) * size(achar)); } _pbsf->FetchRgb(_cpLimCache * size(achar), (cpLimCache - _cpLimCache) * size(achar), _rgchCache + _cpLimCache - cpMinCache); _cpMinCache = cpMinCache; _cpLimCache = cpLimCache; } } } /*************************************************************************** Characters have changed, so fix the cache. ***************************************************************************/ void TXTB::_InvalCache(long cp, long ccpIns, long ccpDel) { long dcpFront, dcpBack; if (_cpLimCache <= cp || _cpLimCache <= _cpMinCache || ccpIns == 0 && ccpDel == 0) { // cache is before the edit or cache is already empty return; } if (_cpMinCache >= cp + ccpDel) { // cache is after the edit _cpMinCache += ccpIns - ccpDel; _cpLimCache += ccpIns - ccpDel; return; } dcpFront = cp - _cpMinCache; dcpBack = _cpLimCache - cp - ccpDel; if (dcpFront <= 0 && dcpBack <= 0) _cpMinCache = _cpLimCache = 0; else if (dcpFront >= dcpBack) { // keep the front end of the cache _cpLimCache = cp; } else { // keep the tail end of the cache BltPb(_rgchCache + cp + ccpDel - _cpMinCache, _rgchCache, dcpBack * size(achar)); _cpMinCache = cp + ccpIns; _cpLimCache = _cpMinCache + dcpBack; } } /*************************************************************************** Fetch a character of the stream through the cache. ***************************************************************************/ achar TXTB::_ChFetch(long cp) { AssertThis(0); AssertIn(cp, 0, CpMac() + 1); if (!FIn(cp, _cpMinCache, _cpLimCache)) { // not a cache hit _CacheRange(cp, cp + 1); } return _rgchCache[cp - _cpMinCache]; } /*************************************************************************** Fetch some characters from the text document. ***************************************************************************/ void TXTB::FetchRgch(long cp, long ccp, achar *prgch) { AssertThis(0); AssertIn(cp, 0, CpMac() + 1); AssertIn(ccp, 0, CpMac() - cp + 1); AssertPvCb(prgch, ccp * size(achar)); long ccpT; while (ccp > 0) { ccpT = LwMin(ccp, kcchMaxTxtbCache); _CacheRange(cp, cp + ccpT); CopyPb(_rgchCache + cp - _cpMinCache, prgch, ccpT * size(achar)); prgch += ccpT; cp += ccpT; ccp -= ccpT; } } /*************************************************************************** Returns non-zero iff cp is the beginning of a paragraph. ***************************************************************************/ bool TXTB::FMinPara(long cp) { AssertThis(0); ulong grfch; if (cp <= 0) return cp == 0; if (cp >= CpMac()) return fFalse; if (GrfchFromCh(_ChFetch(cp)) & fchIgnore) return fFalse; // return true iff the first non-ignore character we see // is a break character AssertIn(cp, 1, CpMac()); while (cp-- > 0) { grfch = GrfchFromCh(_ChFetch(cp)); if (fchBreak & grfch) return fTrue; if (!(fchIgnore & grfch)) return fFalse; } // just line feeds! Warn("isolated line feeds"); return fFalse; } /*************************************************************************** Find the beginning of the paragraph that cp is in. If cp <= 0, returns 0. If cp >= CpMac(), returns the beginning of the last paragraph. ***************************************************************************/ long TXTB::CpMinPara(long cp) { AssertThis(0); ulong grfch; long cpOrig; long dcpLine = 1; if (cp <= 0) return 0; if (cp >= CpMac()) cp = CpMac() - 1; else if (GrfchFromCh(_ChFetch(cp)) & fchIgnore) dcpLine++; cpOrig = cp; AssertIn(cp, 1, CpMac()); while (cp-- > 0) { grfch = GrfchFromCh(_ChFetch(cp)); if (fchBreak & grfch) { if (cp + dcpLine <= cpOrig) return cp + dcpLine; dcpLine = 1; } else if (fchIgnore & grfch) dcpLine++; else dcpLine = 1; } return 0; } /*************************************************************************** Find the end of the paragraph that cp is in. If cp < 0, returns 0. If cp >= CpMac(), returns CpMac(). ***************************************************************************/ long TXTB::CpLimPara(long cp) { AssertThis(0); ulong grfch; bool fCr = fFalse; long cpLim = CpMac(); if (cp < 0) return 0; if (cp >= cpLim) return cpLim; // cp should now be a legal index into the character stream AssertIn(cp, 0, cpLim); while (cp > 0 && (GrfchFromCh(_ChFetch(cp)) & fchIgnore)) cp--; for (; cp < cpLim; cp++) { grfch = GrfchFromCh(_ChFetch(cp)); if (fchBreak & grfch) { if (fCr) return cp; fCr = fTrue; } else if (!(fchIgnore & grfch) && fCr) return cp; } Assert(fCr, "last character is not a return character"); return cpLim; } /*************************************************************************** Return cp of the previous character, skipping line feed characters. If fWord is true, skip to the beginning of a word. ***************************************************************************/ long TXTB::CpPrev(long cp, bool fWord) { AssertThis(0); AssertIn(cp, 0, CpMac() + 1); if (!fWord) { while (cp > 0 && (fchIgnore & GrfchFromCh(_ChFetch(--cp)))) ; } else { while (cp > 0 && ((fchIgnore | fchMayBreak) & GrfchFromCh(_ChFetch(cp - 1)))) { cp--; } while (cp > 0 && !((fchIgnore | fchMayBreak) & GrfchFromCh(_ChFetch(cp - 1)))) { cp--; } } return cp; } /*************************************************************************** Return cp of the next character, skipping line feed characters. If fWord is true, skip to the beginning of the next word. ***************************************************************************/ long TXTB::CpNext(long cp, bool fWord) { AssertThis(0); AssertIn(cp, 0, CpMac() + 1); long cpMac = CpMac(); if (cp >= cpMac) return cpMac; if (!fWord) { while (++cp < cpMac && (fchIgnore & GrfchFromCh(_ChFetch(cp)))) ; } else { while (cp < cpMac && !((fchIgnore | fchMayBreak) & GrfchFromCh(_ChFetch(cp)))) { cp++; } while (cp < cpMac && ((fchIgnore | fchMayBreak) & GrfchFromCh(_ChFetch(cp)))) { cp++; } } return cp; } /*************************************************************************** Invalidate all DDGs on this text doc. Also dirties the document. Should be called by any code that edits the document. ***************************************************************************/ void TXTB::InvalAllDdg(long cp, long ccpIns, long ccpDel, ulong grfdoc) { AssertThis(0); AssertIn(cp, 0, CpMac() + 1); AssertIn(ccpIns, 0, CpMac() + 1 - cp); AssertIn(ccpDel, 0, kcbMax); long ipddg; PDDG pddg; // mark the document dirty SetDirty(); if (fdocNil == grfdoc) return; // inform the DDGs for (ipddg = 0; pvNil != (pddg = PddgGet(ipddg)); ipddg++) { if ((grfdoc & fdocUpdate) && pddg->FIs(kclsTXTG)) ((PTXTG)pddg)->InvalCp(cp, ccpIns, ccpDel); else pddg->InvalRc(pvNil); } } /*************************************************************************** Set the background color of the document. ***************************************************************************/ void TXTB::SetAcrBack(ACR acr, ulong grfdoc) { AssertThis(0); AssertPo(&acr, 0); Assert(acr != kacrInvert, "can't use invert as a background color"); if (_acrBack != acr) { _acrBack = acr; SetDirty(); if (grfdoc & (fdocUpdate | fdocInval)) InvalAllDdg(0, 0, 0, fdocInval); } } /*************************************************************************** Set the default width of the document. ***************************************************************************/ void TXTB::SetDxpDef(long dxp) { AssertThis(0); AssertIn(dxp, 1, kcbMax); long cpMac; if (_dxpDef == dxp) return; _dxpDef = dxp; SetDirty(); HideSel(); cpMac = CpMac(); InvalAllDdg(0, cpMac, cpMac); } /*************************************************************************** Replace cp to cp + ccpDel with ccpIns characters from prgch. If ccpIns is zero, prgch can be nil. The last character should never be replaced. ***************************************************************************/ bool TXTB::FReplaceRgch(void *prgch, long ccpIns, long cp, long ccpDel, ulong grfdoc) { AssertThis(fobjAssertFull); AssertIn(ccpIns, 0, kcbMax); AssertPvCb(prgch, ccpIns * size(achar)); AssertIn(cp, 0, CpMac()); AssertIn(ccpDel, 0, CpMac() - cp); if (!_pbsf->FReplace(prgch, ccpIns * size(achar), cp * size(achar), ccpDel * size(achar))) { return fFalse; } _InvalCache(cp, ccpIns, ccpDel); AssertThis(fobjAssertFull); InvalAllDdg(cp, ccpIns, ccpDel, grfdoc); return fTrue; } /*************************************************************************** Replace cp to cp + ccpDel with the characters in the given FLO. ***************************************************************************/ bool TXTB::FReplaceFlo(PFLO pflo, bool fCopy, long cp, long ccpDel, short osk, ulong grfdoc) { AssertThis(fobjAssertFull); AssertPo(pflo, 0); AssertIn(cp, 0, CpMac()); AssertIn(ccpDel, 0, CpMac() - cp); bool fRet = fFalse; FLO flo = *pflo; flo.pfil->AddRef(); if (flo.FTranslate(osk) && _pbsf->FReplaceFlo(&flo, fCopy && flo.pfil == pflo->pfil, cp * size(achar), ccpDel * size(achar))) { _InvalCache(cp, flo.cb / size(achar), ccpDel); AssertThis(fobjAssertFull); InvalAllDdg(cp, flo.cb / size(achar), ccpDel, grfdoc); fRet = fTrue; } ReleasePpo(&flo.pfil); return fRet; } /*************************************************************************** Replace cp to cpDst + ccpDel with ccpSrc characters from pbsfSrc starting at cpSrc. ***************************************************************************/ bool TXTB::FReplaceBsf(PBSF pbsfSrc, long cpSrc, long ccpSrc, long cpDst, long ccpDel, ulong grfdoc) { AssertThis(fobjAssertFull); AssertPo(pbsfSrc, 0); AssertIn(cpSrc, 0, pbsfSrc->IbMac() / size(achar) + 1); AssertIn(ccpSrc, 0, pbsfSrc->IbMac() / size(achar) + 1 - cpSrc); AssertIn(cpDst, 0, CpMac()); AssertIn(ccpDel, 0, CpMac() - cpDst); if (!_pbsf->FReplaceBsf(pbsfSrc, cpSrc * size(achar), ccpSrc * size(achar), cpDst * size(achar), ccpDel * size(achar))) { return fFalse; } _InvalCache(cpDst, ccpSrc, ccpDel); AssertThis(fobjAssertFull); InvalAllDdg(cpDst, ccpSrc, ccpDel, grfdoc); return fTrue; } /*************************************************************************** Replace cp to cpDst + ccpDel with ccpSrc characters from ptxtbSrc starting at cpSrc. ***************************************************************************/ bool TXTB::FReplaceTxtb(PTXTB ptxtbSrc, long cpSrc, long ccpSrc, long cpDst, long ccpDel, ulong grfdoc) { AssertPo(ptxtbSrc, 0); AssertIn(cpSrc, 0, ptxtbSrc->CpMac() + 1); AssertIn(ccpSrc, 0, ptxtbSrc->CpMac() + 1 - cpSrc); return FReplaceBsf(ptxtbSrc->_pbsf, cpSrc, ccpSrc, cpDst, ccpDel, grfdoc); } /*************************************************************************** Get the bounds of an object - since plain text doesn't have objects, just return false. ***************************************************************************/ bool TXTB::FGetObjectRc(long cp, PGNV pgnv, PCHP pchp, RC *prc) { AssertThis(0); AssertIn(cp, 0, CpMac()); AssertPo(pgnv, 0); AssertVarMem(pchp); AssertVarMem(prc); TrashVar(prc); return fFalse; } /*************************************************************************** Draw an object - since plain text doesn't have objects, just return false. ***************************************************************************/ bool TXTB::FDrawObject(long cp, PGNV pgnv, long *pxp, long yp, PCHP pchp, RC *prcClip) { AssertThis(0); AssertIn(cp, 0, CpMac()); AssertPo(pgnv, 0); AssertVarMem(pxp); AssertVarMem(pchp); AssertVarMem(prcClip); return fFalse; } /*************************************************************************** Get the current FNI for the doc. Return false if the doc is not currently based on an FNI (it's a new doc or an internal one). ***************************************************************************/ bool TXTB::FGetFni(FNI *pfni) { AssertThis(0); AssertBasePo(pfni, 0); if (pvNil == _pfil || _pfil->FTemp()) return fFalse; _pfil->GetFni(pfni); return fTrue; } /*************************************************************************** Export the text. ***************************************************************************/ void TXTB::ExportFormats(PCLIP pclip) { AssertThis(0); AssertPo(pclip, 0); void *pv; long ccp = CpMac() - 1; if (ccp <= 0) return; if (!pclip->FInitExport()) return; if (pvNil != (pv = pclip->PvExport(ccp * size(achar), kclfmText))) _pbsf->FetchRgb(0, ccp * size(achar), pv); pclip->EndExport(); } /*************************************************************************** Constructor for plain text doc. ***************************************************************************/ TXPD::TXPD(PDOCB pdocb, ulong grfdoc) : TXPD_PAR(pdocb, grfdoc) { } /*************************************************************************** Static method to create a new plain text document. ***************************************************************************/ PTXPD TXPD::PtxpdNew(PFNI pfni, PBSF pbsf, short osk, PDOCB pdocb, ulong grfdoc) { AssertNilOrPo(pfni, ffniFile); AssertNilOrPo(pbsf, 0); AssertNilOrPo(pdocb, 0); PTXPD ptxpd; if (pvNil != (ptxpd = NewObj TXPD(pdocb, grfdoc)) && !ptxpd->_FInit(pfni, pbsf, osk)) { ReleasePpo(&ptxpd); } return ptxpd; } /*************************************************************************** Create a new TXLG to display the TXPD. ***************************************************************************/ PDDG TXPD::PddgNew(PGCB pgcb) { AssertThis(fobjAssertFull); long onn = vpappb->OnnDefFixed(); long dypFont = vpappb->DypTextDef(); return TXLG::PtxlgNew(this, pgcb, onn, fontNil, dypFont, 4); } /*************************************************************************** Save the document and optionally set this fni as the current one. If the doc is currently based on an FNI, pfni may be nil, indicating that this is a normal save (not save as). If pfni is not nil and fSetFni is false, this just writes a copy of the doc but doesn't change the doc one bit. ***************************************************************************/ bool TXPD::FSaveToFni(FNI *pfni, bool fSetFni) { AssertThis(fobjAssertFull); AssertNilOrPo(pfni, ffniFile); FLO flo; FNI fniT; if (pvNil == pfni) { if (pvNil == _pfil) { Bug("Can't do a normal save - no file"); return fFalse; } _pfil->GetFni(&fniT); pfni = &fniT; fSetFni = fTrue; } if (pvNil == (flo.pfil = FIL::PfilCreateTemp(pfni))) goto LFail; flo.fp = 0; flo.cb = _pbsf->IbMac() - size(achar); #ifdef UNICODE flo.cb += size(achar); achar ch; ch = kchwUnicode; if (!flo.FWriteRgb(&ch, size(achar), 0)) goto LFail; flo.fp += size(achar); flo.cb -= size(achar); #endif // UNICODE if (!_pbsf->FWriteRgb(&flo)) goto LFail; // redirect the BSF to the new file if (fSetFni) _pbsf->FReplaceFlo(&flo, fFalse, 0, flo.cb); if (!flo.pfil->FSetFni(pfni)) { LFail: ReleasePpo(&flo.pfil); return fFalse; } flo.pfil->SetTemp(fFalse); if (fSetFni) { ReleasePpo(&_pfil); _pfil = flo.pfil; _fDirty = fFalse; } else ReleasePpo(&flo.pfil); return fTrue; } /*************************************************************************** Constructor for a rich text document. ***************************************************************************/ TXRD::TXRD(PDOCB pdocb, ulong grfdoc) : TXRD_PAR(pdocb, grfdoc) { } /*************************************************************************** Destructor for a rich text document. ***************************************************************************/ TXRD::~TXRD(void) { ReleasePpo(&_pglmpe); ReleasePpo(&_pagcact); ReleasePpo(&_pcfl); } #ifdef DEBUG /*************************************************************************** Assert the validity of a TXRD. ***************************************************************************/ void TXRD::AssertValid(ulong grfobj) { TXRD_PAR::AssertValid(grfobj); AssertPo(_pglmpe, 0); AssertNilOrPo(_pagcact, 0); AssertIn(_dypFontDef, 1, kswMax); AssertIn(_pbsf->IbMac() / size(achar), 1, kcpMaxTxrd); if (grfobj & fobjAssertFull) { MPE mpePrev, mpe; long impe; mpePrev.spcp = (ulong)-1; for (impe = _pglmpe->IvMac(); impe-- > 0;) { _pglmpe->Get(impe, &mpe); Assert(mpe.spcp < mpePrev.spcp, "non-increasing mpe's"); mpePrev = mpe; } // REVIEW shonk: TXRD::AssertValid: fill out } } /*************************************************************************** Mark memory for the TXRD. ***************************************************************************/ void TXRD::MarkMem(void) { AssertThis(fobjAssertFull); TXRD_PAR::MarkMem(); MarkMemObj(_pglmpe); MarkMemObj(_pagcact); } #endif // DEBUG /*************************************************************************** Static method to create or open a rich text document. ***************************************************************************/ PTXRD TXRD::PtxrdNew(PFNI pfni) { AssertNilOrPo(pfni, ffniFile); PTXRD ptxrd; if (pvNil != (ptxrd = NewObj TXRD) && !ptxrd->_FInit(pfni)) ReleasePpo(&ptxrd); return ptxrd; } /*************************************************************************** Initialize the rich text document. ***************************************************************************/ bool TXRD::_FInit(PFNI pfni, CTG ctg) { AssertBaseThis(0); AssertNilOrPo(pfni, 0); if (pvNil != pfni) { PCFL pcfl; CKI cki; if (pvNil == (pcfl = CFL::PcflOpen(pfni, fcflNil))) { PushErc(ercRtxdReadFailed); return fFalse; } if (!pcfl->FGetCkiCtg(ctg, 0, &cki) || !_FReadChunk(pcfl, cki.ctg, cki.cno, fFalse)) { ReleasePpo(&pcfl); PushErc(ercRtxdReadFailed); return fFalse; } _pcfl = pcfl; AssertThis(fobjAssertFull); return fTrue; } if (!TXRD_PAR::_FInit()) return fFalse; if (pvNil == (_pglmpe = GL::PglNew(size(MPE)))) return fFalse; _pglmpe->SetMinGrow(10); _onnDef = vpappb->OnnDefVariable(); _oskFont = koskCur; vntl.GetStn(_onnDef, &_stnFontDef); // NOTE: don't use vpappb->DypTextDef() so all TXRD's will have the // same _dypFontDef unless explicitly changed in code. _dypFontDef = 12; AssertThis(fobjAssertFull); return fTrue; } /*************************************************************************** Static method to read a rich text document from a chunk. ***************************************************************************/ PTXRD TXRD::PtxrdReadChunk(PCFL pcfl, CTG ctg, CNO cno, bool fCopyText) { AssertPo(pcfl, 0); PTXRD ptxrd; if (pvNil != (ptxrd = NewObj TXRD) && !ptxrd->_FReadChunk(pcfl, ctg, cno, fCopyText)) { PushErc(ercRtxdReadFailed); ReleasePpo(&ptxrd); } return ptxrd; } /*************************************************************************** Read the given chunk into this TXRD. ***************************************************************************/ bool TXRD::_FReadChunk(PCFL pcfl, CTG ctg, CNO cno, bool fCopyText) { AssertPo(pcfl, 0); BLCK blck; FLO floText; PFIL pfilT; KID kid; long icact; long cact; RDOP rdop; short bo, osk; if (!TXRD_PAR::_FInit()) return fFalse; if (!pcfl->FFind(ctg, cno, &blck) || !blck.FUnpackData() || blck.Cb() < size(RDOP) || !blck.FReadRgb(&rdop, size(RDOP), 0)) { return fFalse; } if (rdop.bo == kboOther) SwapBytesBom(&rdop, kbomRdop); else if (rdop.bo != kboCur) return fFalse; // do a sanity check on the default font size and width if (!FIn(rdop.dypFont, 4, 256) || !FIn(rdop.dxpDef, 1, kcbMax)) { Bug("bad default font size"); return fFalse; } _dxpDef = rdop.dxpDef; _dypFontDef = rdop.dypFont; _acrBack.SetFromLw(rdop.lwAcrBack); if (_stnFontDef.FRead(&blck, size(rdop)) && _stnFontDef.Cch() > 0) _oskFont = rdop.oskFont; else { _oskFont = koskCur; _stnFontDef.SetNil(); } _onnDef = vntl.OnnMapStn(&_stnFontDef, _oskFont); // get the text if (!pcfl->FGetKidChidCtg(ctg, cno, 0, kctgText, &kid) || !pcfl->FFindFlo(kid.cki.ctg, kid.cki.cno, &floText) || floText.cb < size(short) || !floText.FReadRgb(&osk, size(short), 0)) { return fFalse; } floText.fp += size(short); floText.cb -= size(short); floText.pfil->AddRef(); pfilT = floText.pfil; if (!floText.FTranslate(osk) || !_pbsf->FReplaceFlo(&floText, fCopyText && pfilT == floText.pfil, 0, CpMac() - 1)) { ReleasePpo(&floText.pfil); return fFalse; } ReleasePpo(&floText.pfil); // get the text properties if (!pcfl->FGetKidChidCtg(ctg, cno, 0, kctgTxtProps, &kid) || !pcfl->FFind(kid.cki.ctg, kid.cki.cno, &blck) || pvNil == (_pglmpe = GL::PglRead(&blck, &bo)) || size(MPE) != _pglmpe->CbEntry()) { return fFalse; } if (bo == kboOther) { SwapBytesRglw(_pglmpe->QvGet(0), LwMul(_pglmpe->IvMac(), size(MPE)) / size(long)); } // get the text property arguments if (pcfl->FGetKidChidCtg(ctg, cno, 0, kctgTxtPropArgs, &kid)) { if (!pcfl->FFind(kid.cki.ctg, kid.cki.cno, &blck) || pvNil == (_pagcact = AG::PagRead(&blck, &bo, &osk)) || size(long) != _pagcact->CbFixed()) { return fFalse; } for (icact = _pagcact->IvMac(); icact-- > 0;) { if (_pagcact->FFree(icact)) continue; _pagcact->GetFixed(icact, &cact); if (bo == kboOther) { SwapBytesRglw(&cact, 1); _pagcact->PutFixed(icact, &cact); } if (!_FOpenArg(icact, B3Lw(cact), bo, osk)) return fFalse; } } AssertThis(fobjAssertFull); return fTrue; } /*************************************************************************** Do any necessary munging of the AG entry on open. Return false if we don't recognize this argument type. ***************************************************************************/ bool TXRD::_FOpenArg(long icact, byte sprm, short bo, short osk) { AssertBaseThis(0); long onn, cb; byte *prgb; STN stn; cb = _pagcact->Cb(icact); switch (sprm) { case sprmFont: cb -= size(long) + size(short); // onn, osk if (cb < 0) { Bug("bad font entry"); return fFalse; } _pagcact->GetRgb(icact, size(long), size(short), &osk); prgb = (byte *)PvAddBv(_pagcact->PvLock(icact), size(long) + size(short)); if (!stn.FSetData(prgb, cb)) { Bug("bad font entry"); _pagcact->Unlock(); return fFalse; } _pagcact->Unlock(); onn = vntl.OnnMapStn(&stn, osk); _pagcact->PutRgb(icact, 0, size(long), &onn); break; default: return fFalse; } return fTrue; } /*************************************************************************** Get the current FNI for the doc. Return false if the doc is not currently based on an FNI (it's a new doc or an internal one). ***************************************************************************/ bool TXRD::FGetFni(FNI *pfni) { AssertThis(0); AssertBasePo(pfni, 0); if (pvNil == _pcfl) return fFalse; _pcfl->GetFni(pfni); return fTrue; } /*************************************************************************** Ask the user what file they want to save to. ***************************************************************************/ bool TXRD::FGetFniSave(FNI *pfni) { // REVIEW shonk: what file type to use on Mac? AssertThis(0); return FGetFniSaveMacro(pfni, 'CHN2', "\x9" "Save As: ", "", PszLit("All files\0*.*\0"), vwig.hwndApp); } /*************************************************************************** Save the rich text document and optionally set this fni as the current one. If the doc is currently based on an FNI, pfni may be nil, indicating that this is a normal save (not save as). If pfni is not nil and fSetFni is false, this just writes a copy of the doc but doesn't change the doc one bit. ***************************************************************************/ bool TXRD::FSaveToFni(FNI *pfni, bool fSetFni) { AssertThis(fobjAssertFull); AssertNilOrPo(pfni, ffniFile); FNI fni; PCFL pcfl; CKI cki; if (pvNil == pfni) { if (pvNil == _pcfl) { Bug("Can't do a normal save - no file"); return fFalse; } fSetFni = fTrue; _pcfl->GetFni(&fni); pfni = &fni; } if (pvNil == (pcfl = CFL::PcflCreateTemp(pfni))) goto LFail; if (!FSaveToChunk(pcfl, &cki, fSetFni) || !pcfl->FSave(kctgFramework, pvNil)) goto LFail; if (!pcfl->FSetFni(pfni)) { LFail: ReleasePpo(&pcfl); PushErc(ercRtxdSaveFailed); return fFalse; } pcfl->SetTemp(fFalse); if (fSetFni) { ReleasePpo(&_pcfl); _pcfl = pcfl; _fDirty = fFalse; } else ReleasePpo(&pcfl); return fTrue; } /*************************************************************************** Save a rich text document to the given chunky file. Fill in *pcki with where we put the root chunk. ***************************************************************************/ bool TXRD::FSaveToChunk(PCFL pcfl, CKI *pcki, bool fRedirectText) { AssertThis(fobjAssertFull); AssertPo(pcfl, 0); AssertVarMem(pcki); RDOP rdop; BLCK blck, blckText; CNO cno, cnoText; long cb; short osk = koskCur; pcki->ctg = kctgRichText; rdop.bo = kboCur; rdop.oskFont = _oskFont; rdop.dxpDef = _dxpDef; rdop.dypFont = _dypFontDef; rdop.lwAcrBack = _acrBack.LwGet(); cb = _stnFontDef.CbData(); if (!pcfl->FAdd(size(RDOP) + cb, pcki->ctg, &pcki->cno, &blck)) { PushErc(ercRtxdSaveFailed); return fFalse; } if (!blck.FWriteRgb(&rdop, size(RDOP), 0) || !_stnFontDef.FWrite(&blck, size(RDOP))) { goto LFail; } // add the text chunk and write it if (!pcfl->FAddChild(pcki->ctg, pcki->cno, 0, _pbsf->IbMac() - size(achar) + size(short), kctgText, &cnoText, &blckText) || !blckText.FWriteRgb(&osk, size(short), 0)) { goto LFail; } AssertDo(blckText.FMoveMin(size(short)), 0); if (!_pbsf->FWriteRgb(&blckText)) goto LFail; cb = _pglmpe->CbOnFile(); if (!pcfl->FAddChild(pcki->ctg, pcki->cno, 0, cb, kctgTxtProps, &cno, &blck) || !_pglmpe->FWrite(&blck)) { goto LFail; } if (pvNil != _pagcact && 0 < _pagcact->IvMac()) { cb = _pagcact->CbOnFile(); if (!pcfl->FAddChild(pcki->ctg, pcki->cno, 0, cb, kctgTxtPropArgs, &cno, &blck) || !_pagcact->FWrite(&blck)) { goto LFail; } } if (fRedirectText) { FLO flo; AssertDo(blckText.FGetFlo(&flo), 0); _pbsf->FReplaceFlo(&flo, fFalse, 0, _pbsf->IbMac() - size(achar)); ReleasePpo(&flo.pfil); } return fTrue; LFail: pcfl->Delete(pcki->ctg, pcki->cno); PushErc(ercRtxdSaveFailed); return fFalse; } /*************************************************************************** Create a new TXRG to display the TXRD. ***************************************************************************/ PDDG TXRD::PddgNew(PGCB pgcb) { AssertThis(fobjAssertFull); return TXRG::PtxrgNew(this, pgcb); } /*************************************************************************** Look for an MPE for the given spcp. Return false iff there isn't one. In either event, fill pimpe with where one would go if it did exist. ***************************************************************************/ bool TXRD::_FFindMpe(ulong spcp, MPE *pmpe, long *pcpLim, long *pimpe) { AssertThis(0); AssertNilOrVarMem(pmpe); AssertNilOrVarMem(pcpLim); AssertNilOrVarMem(pimpe); long impe, impeMin, impeLim; bool fRet; MPE mpe; byte sprm = _SprmFromSpcp(spcp); for (impeMin = 0, impeLim = _pglmpe->IvMac(); impeMin < impeLim;) { impe = (impeMin + impeLim) / 2; _pglmpe->Get(impe, &mpe); if (mpe.spcp < spcp) impeMin = impe + 1; else if (mpe.spcp > spcp) impeLim = impe; else { impeMin = impe + 1; goto LSuccess; } } // assume there isn't one if (pvNil != pimpe) *pimpe = impeMin; TrashVar(pmpe); fRet = fFalse; if (impeMin > 0) { _pglmpe->Get(impeMin - 1, &mpe); if (_SprmFromSpcp(mpe.spcp) == sprm) { LSuccess: if (pvNil != pimpe) *pimpe = impeMin - 1; if (pvNil != pmpe) *pmpe = mpe; fRet = fTrue; } else Assert(_SprmFromSpcp(mpe.spcp) < sprm, 0); } if (pvNil != pcpLim) { *pcpLim = CpMac(); if (impeMin < _pglmpe->IvMac()) { _pglmpe->Get(impeMin, &mpe); if (_SprmFromSpcp(mpe.spcp) == sprm) *pcpLim = _CpFromSpcp(mpe.spcp); } } return fRet; } /*************************************************************************** Fetch the impe'th property, returning all the relevant info about it. ***************************************************************************/ bool TXRD::_FFetchProp(long impe, byte *psprm, long *plw, long *pcpMin, long *pcpLim) { MPE mpe; if (!FIn(impe, 0, _pglmpe->IvMac())) return fFalse; _pglmpe->Get(impe, &mpe); if (pvNil != psprm) *psprm = _SprmFromSpcp(mpe.spcp); if (pvNil != plw) *plw = mpe.lw; if (pvNil != pcpMin) *pcpMin = _CpFromSpcp(mpe.spcp); if (pvNil != pcpLim) { *pcpLim = CpMac(); if (impe + 1 < _pglmpe->IvMac()) { MPE mpeNext; _pglmpe->Get(impe + 1, &mpeNext); if (_SprmFromSpcp(mpeNext.spcp) == _SprmFromSpcp(mpe.spcp)) *pcpLim = _CpFromSpcp(mpeNext.spcp); } } return fTrue; } /*************************************************************************** Adjust the MPE's after an edit. This may involve deleting some MPE's and/or updating the cp's. ***************************************************************************/ void TXRD::_AdjustMpe(long cp, long ccpIns, long ccpDel) { AssertBaseThis(0); AssertIn(cp, 0, CpMac()); AssertIn(ccpIns, 0, CpMac() - cp); AssertIn(ccpDel, 0, kcbMax); MPE *qmpe; long impe, impeMin, cpT; byte sprm; bool fBefore, fKeep; _cpMinChp = _cpLimChp = _cpMinPap = _cpLimPap = 0; for (impe = 0; impe < _pglmpe->IvMac();) { qmpe = (MPE *)_pglmpe->QvGet(impe); cpT = _CpFromSpcp(qmpe->spcp); AssertIn(cpT, 0, kcpMaxTxrd); if (cpT < cp) { impe++; continue; } sprm = _SprmFromSpcp(qmpe->spcp); if (cpT >= cp + ccpDel + (sprm < sprmMinObj)) { AssertIn(cpT + ccpIns - ccpDel, 0, kcpMaxTxrd); qmpe->spcp = _SpcpFromSprmCp(sprm, cpT + ccpIns - ccpDel); impe++; continue; } AssertIn(cpT, cp, cp + ccpDel + (sprm < sprmMinObj)); // special case object sprms if (sprm >= sprmMinObj) { // delete it AssertIn(cpT, cp, cp + ccpDel); _ReleaseSprmLw(sprm, qmpe->lw); _pglmpe->Delete(impe); continue; } // fBefore indicates if the last MPE for this sprm should go at cp // or at the beginning of the paragraph at or after cp + ccpIns. // This is only used for paragraph sprms. fBefore = (cpT == cp); impeMin = impe; while (cpT <= cp + ccpDel) { if (++impe >= _pglmpe->IvMac()) break; qmpe = (MPE *)_pglmpe->QvGet(impe); if (_SprmFromSpcp(qmpe->spcp) != sprm) break; cpT = _CpFromSpcp(qmpe->spcp); AssertIn(cpT, 0, kcpMaxTxrd); } // the entries from impeMin to impe are all in or // at the end of the deleted zone Assert(impe > impeMin, "no MPE's!"); // fKeep indicates whether we kept the last MPE fKeep = fTrue; if (sprm < sprmMinPap) { // a character sprm - put the last one at cp + ccpIns AssertIn(cp + ccpIns, 0, CpMac()); qmpe = (MPE *)_pglmpe->QvGet(--impe); qmpe->spcp = _SpcpFromSprmCp(sprm, cp + ccpIns); } else if (fBefore) { // a paragraph sprm - the last one goes at cp AssertIn(cp, 0, kcpMaxTxrd); qmpe = (MPE *)_pglmpe->QvGet(--impe); qmpe->spcp = _SpcpFromSprmCp(sprm, cp); } else { // a paragraph sprm - the last MPE goes at the beginning of the // next paragraph (if there is one and it doesn't already have an MPE). cpT = CpLimPara(cp + ccpIns - 1); if (cpT < CpMac() && (impe >= _pglmpe->IvMac() || _SprmFromSpcp((qmpe = (MPE *)_pglmpe->QvGet(impe))->spcp) != sprm || _CpFromSpcp(qmpe->spcp) + ccpIns - ccpDel > cpT)) { // put the last one at cpT - if there isn't already one AssertIn(cpT, 0, kcpMaxTxrd); qmpe = (MPE *)_pglmpe->QvGet(--impe); qmpe->spcp = _SpcpFromSprmCp(sprm, cpT); } else fKeep = fFalse; } // delete all the previous ones while (impeMin < impe) { qmpe = (MPE *)_pglmpe->QvGet(--impe); _ReleaseSprmLw(sprm, qmpe->lw); _pglmpe->Delete(impe); } // skip the one we kept at the end if (fKeep) impe++; } AssertThis(0); } /*************************************************************************** Make sure there is an entry in the AG with the given data. If it's already there, increment its reference count. Otherwise, set its reference count to 1. ***************************************************************************/ bool TXRD::_FEnsureInAg(byte sprm, void *pv, long cb, long *pjv) { AssertIn(cb, 1, kcbMax); AssertPvCb(pv, cb); AssertVarMem(pjv); long cact, iv, cbT; void *qv; if (pvNil == _pagcact && pvNil == (_pagcact = AG::PagNew(size(long), 1, cb))) { TrashVar(pjv); return fFalse; } // see if it's already there for (iv = _pagcact->IvMac(); iv-- > 0;) { if (_pagcact->FFree(iv)) continue; qv = _pagcact->QvGet(iv, &cbT); if (cb != cbT) continue; if (FEqualRgb(qv, pv, cb)) { _pagcact->GetFixed(iv, &cact); if (B3Lw(cact) == sprm) { *pjv = iv + 1; AssertIn(cact & 0x00FFFFFFL, 1, 0x00FFFFFFL); cact++; Assert(B3Lw(cact) == sprm, "cact overflowed"); _pagcact->PutFixed(iv, &cact); return fTrue; } } } // need to add it cact = (((ulong)sprm) << 24) | 1; if (!_pagcact->FAdd(cb, pjv, pv, &cact)) { TrashVar(pjv); return fFalse; } (*pjv)++; return fTrue; } /*************************************************************************** Decrement the reference count on the given element of the AG and if the reference count becomes zero, delete the element. ***************************************************************************/ void TXRD::_ReleaseInAg(long jv) { long cact, cactT; if (pvNil == _pagcact || !FIn(jv, 1, _pagcact->IvMac() + 1) || _pagcact->FFree(jv - 1)) { Bug("bad index into AG"); return; } _pagcact->GetFixed(jv - 1, &cact); cactT = cact & 0x00FFFFFFL; if (--cactT <= 0) _pagcact->Delete(jv - 1); else { cact--; _pagcact->PutFixed(jv - 1, &cact); } } /*************************************************************************** Increment the reference count on the given element of the AG. ***************************************************************************/ void TXRD::_AddRefInAg(long jv) { long cact; if (pvNil == _pagcact || !FIn(jv, 1, _pagcact->IvMac() + 1) || _pagcact->FFree(jv - 1)) { Bug("bad index into AG"); return; } _pagcact->GetFixed(jv - 1, &cact); AssertIn(cact & 0x00FFFFFFL, 1, 0x00FFFFFFL); ++cact; _pagcact->PutFixed(jv - 1, &cact); } /*************************************************************************** Static method: return true iff the given sprm has its argument in the _pagcact. ***************************************************************************/ bool TXRD::_FSprmInAg(byte sprm) { if (sprm < sprmMinChpClient || FIn(sprm, sprmMinPap, sprmMinPapClient)) { // a base TXRD sprm return sprm == sprmFont; } // The sprm is a client or object sprm. Even ones are in the AG, odd // ones aren't. See note in rtxt.h where the sprms are defined. return !(sprm & 1); } /*************************************************************************** If the sprm allocates stuff in the ag, release it. The inverse operation of _AddRefSprmLw. ***************************************************************************/ void TXRD::_ReleaseSprmLw(byte sprm, long lw) { if (lw > 0 && _FSprmInAg(sprm)) _ReleaseInAg(lw); } /*************************************************************************** If the sprm allocates stuff in the ag, addref it. The inverse operation of _ReleaseSprmLw. ***************************************************************************/ void TXRD::_AddRefSprmLw(byte sprm, long lw) { if (lw > 0 && _FSprmInAg(sprm)) _AddRefInAg(lw); } /*************************************************************************** Get an array of SPVM's that describe the differences between pchp and pchpDiff. If pchpDiff is nil, pchp is just described. If this succeeds, either _ApplyRgspvm or _ReleaseRgspvm should be called. ***************************************************************************/ bool TXRD::_FGetRgspvmFromChp(PCHP pchp, PCHP pchpDiff, SPVM *prgspvm, long *pcspvm) { AssertVarMem(pchp); AssertNilOrVarMem(pchpDiff); AssertPvCb(prgspvm, LwMul(size(SPVM), sprmLimChp - sprmMinChp)); AssertVarMem(pcspvm); byte sprm; long ispvm; SPVM spvm; // first get the values and masks for the sprm's we have to deal with ispvm = 0; for (sprm = sprmMinChp; sprm < sprmLimChp; sprm++) { switch (_TGetLwFromChp(sprm, pchp, pchpDiff, &spvm.lw, &spvm.lwMask)) { case tYes: spvm.sprm = sprm; prgspvm[ispvm++] = spvm; break; case tMaybe: _ReleaseRgspvm(prgspvm, ispvm); TrashVar(pcspvm); return fFalse; } } *pcspvm = ispvm; return fTrue; } /*************************************************************************** Get an array of SPVM's that describe the differences between ppap and ppapDiff. If ppapDiff is nil, ppap is just described. If this succeeds, either _ApplyRgspvm or _ReleaseRgspvm should be called. ***************************************************************************/ bool TXRD::_FGetRgspvmFromPap(PPAP ppap, PPAP ppapDiff, SPVM *prgspvm, long *pcspvm) { AssertVarMem(ppap); AssertNilOrVarMem(ppapDiff); AssertPvCb(prgspvm, LwMul(size(SPVM), sprmLimPap - sprmMinPap)); AssertVarMem(pcspvm); byte sprm; long ispvm; SPVM spvm; // first get the values and masks for the sprm's we have to deal with ispvm = 0; for (sprm = sprmMinPap; sprm < sprmLimPap; sprm++) { switch (_TGetLwFromPap(sprm, ppap, ppapDiff, &spvm.lw, &spvm.lwMask)) { case tYes: spvm.sprm = sprm; prgspvm[ispvm++] = spvm; break; case tMaybe: _ReleaseRgspvm(prgspvm, ispvm); TrashVar(pcspvm); return fFalse; } } *pcspvm = ispvm; return fTrue; } /*************************************************************************** Release the SPVM's. ***************************************************************************/ void TXRD::_ReleaseRgspvm(SPVM *prgspvm, long cspvm) { AssertIn(cspvm, 0, kcbMax); AssertPvCb(prgspvm, LwMul(size(SPVM), cspvm)); long ispvm; for (ispvm = 0; ispvm < cspvm; ispvm++) _ReleaseSprmLw(prgspvm[ispvm].sprm, prgspvm[ispvm].lw); } /*************************************************************************** Apply the SPVM's to the given range of characters. Assumes that the inserts can't fail. If you call this, don't also call _ReleaseRgspvm. The caller should have ensured that _pglmpe has room for 2 * cspvm additional entries. ***************************************************************************/ void TXRD::_ApplyRgspvm(long cp, long ccp, SPVM *prgspvm, long cspvm) { AssertIn(cp, 0, CpMac()); AssertIn(ccp, 1, CpMac() + 1 - cp); MPE mpe, mpeT; long lwRevert, lwLast; long cpLimT, cpLim; long ispvm, impe; SPVM spvm; _cpMinChp = _cpLimChp = _cpMinPap = _cpLimPap = 0; cpLim = LwMin(cp + ccp, CpMac()); for (ispvm = cspvm; ispvm-- > 0;) { spvm = prgspvm[ispvm]; mpe.spcp = _SpcpFromSprmCp(spvm.sprm, cp); mpe.lw = spvm.lw; if (!_FFindMpe(mpe.spcp, &mpeT, pvNil, &impe)) { // there are no MPE's for this sprm at or before this cp lwRevert = 0; if (mpe.lw != 0) { // add the mpe _AddRefSprmLw(spvm.sprm, mpe.lw); AssertDo(_pglmpe->FInsert(impe++, &mpe), 0); } lwLast = mpe.lw; } else { // see if the MPE we're in the range of starts before this cp // or at it lwRevert = mpeT.lw; if (_CpFromSpcp(mpeT.spcp) < cp) { // before impe++; if (mpe.lw != mpeT.lw) { // add an mpe mpeT.lw = mpe.lw | (mpeT.lw & ~spvm.lwMask); mpeT.spcp = mpe.spcp; _AddRefSprmLw(spvm.sprm, mpeT.lw); AssertDo(_pglmpe->FInsert(impe++, &mpeT), 0); } lwLast = mpeT.lw; } else { // at it - get the valid lwLast value Assert(_CpFromSpcp(mpeT.spcp) == cp, 0); lwLast = 0; if (impe > 0) { _pglmpe->Get(impe - 1, &mpeT); if (_SprmFromSpcp(mpeT.spcp) == spvm.sprm) lwLast = mpeT.lw; } } } _AddRefSprmLw(spvm.sprm, lwRevert); // adjust all mpe's before cpLim for (;;) { if (impe >= _pglmpe->IvMac()) goto LEndOfSprm; _pglmpe->Get(impe, &mpeT); if (_SprmFromSpcp(mpeT.spcp) != spvm.sprm) { LEndOfSprm: cpLimT = CpMac(); break; } if ((cpLimT = _CpFromSpcp(mpeT.spcp)) >= cpLim) { // see if this MPE can be deleted if (cpLimT == cpLim && lwLast == mpeT.lw) { _ReleaseSprmLw(spvm.sprm, mpeT.lw); _pglmpe->Delete(impe); } break; } // modify the mpeT _ReleaseSprmLw(spvm.sprm, lwRevert); lwRevert = mpeT.lw; mpeT.lw = mpe.lw | (mpeT.lw & ~spvm.lwMask); // note: the ref count for this MPE was transferred to lwRevert, // so a _ReleaseSprmLw call is not needed after the Delete and Put // below if (lwLast == mpeT.lw) _pglmpe->Delete(impe); else { _AddRefSprmLw(spvm.sprm, mpeT.lw); _pglmpe->Put(impe++, &mpeT); lwLast = mpeT.lw; } } Assert(cpLimT >= cpLim, 0); if (cpLimT > cpLim && lwRevert != lwLast) { // add another mpe at cpLim with lwRevert mpeT.spcp = _SpcpFromSprmCp(spvm.sprm, cpLim); mpeT.lw = lwRevert; AssertDo(_pglmpe->FInsert(impe, &mpeT), 0); } else _ReleaseSprmLw(spvm.sprm, lwRevert); _ReleaseSprmLw(spvm.sprm, spvm.lw); } } /*************************************************************************** Get the long associated with the sprm and the difference between the two CHPs. pchpOld may be nil. *plwMask indicates which portion of the lw is significant. Returns tYes or tNo depending on whether the values of pchpOld and pchpNew differ for the given sprm. Returns tMaybe on error. ***************************************************************************/ tribool TXRD::_TGetLwFromChp(byte sprm, PCHP pchpNew, PCHP pchpOld, long *plw, long *plwMask) { AssertIn(sprm, sprmMinChp, sprmLimChp); AssertVarMem(pchpNew); AssertNilOrVarMem(pchpOld); AssertVarMem(plw); AssertVarMem(plwMask); *plwMask = -1; switch (sprm) { default: *plwMask = 0; break; case sprmStyle: *plw = LwHighLow((short)(pchpNew->dypFont - _dypFontDef), SwHighLow((byte)pchpNew->dypOffset, (byte)pchpNew->grfont)); if (pvNil != pchpOld) { *plwMask = LwHighLow( -(pchpOld->dypFont != pchpNew->dypFont), SwHighLow(-(pchpNew->dypOffset != pchpOld->dypOffset), (byte)(pchpOld->grfont ^ pchpNew->grfont))); } break; case sprmFont: if (pvNil != pchpOld && pchpOld->onn == pchpNew->onn) *plwMask = 0; else if (pchpNew->onn == _onnDef) *plw = 0; else { // data for sprmFont is: long onn, short osk, stn data STN stn; long cb; short osk = koskCur; byte rgb[kcbMaxDataStn + size(long) + size(short)]; CopyPb(&pchpNew->onn, rgb, size(long)); CopyPb(&osk, rgb + size(long), size(short)); vntl.GetStn(pchpNew->onn, &stn); cb = size(long) + size(short); stn.GetData(rgb + cb); cb += stn.CbData(); if (!_FEnsureInAg(sprm, rgb, cb, plw)) { *plwMask = 0; TrashVar(plw); return tMaybe; } } break; case sprmForeColor: if (pvNil != pchpOld && pchpOld->acrFore == pchpNew->acrFore) *plwMask = 0; else *plw = pchpNew->acrFore.LwGet() - kacrBlack.LwGet(); break; case sprmBackColor: if (pvNil != pchpOld && pchpOld->acrBack == pchpNew->acrBack) *plwMask = 0; else *plw = pchpNew->acrBack.LwGet() - kacrClear.LwGet(); break; } if (0 != *plwMask) { *plw &= *plwMask; return tYes; } TrashVar(plw); return tNo; } /*************************************************************************** Get the character properties for the given character. ***************************************************************************/ void TXRD::FetchChp(long cp, PCHP pchp, long *pcpMin, long *pcpLim) { AssertThis(0); AssertIn(cp, 0, CpMac()); AssertVarMem(pchp); AssertNilOrVarMem(pcpMin); AssertNilOrVarMem(pcpLim); MPE mpe; byte sprm; ulong spcp; long cpLimT; long cb; bool fRet; if (FIn(cp, _cpMinChp, _cpLimChp)) goto LDone; _chp.Clear(); _chp.onn = _onnDef; _chp.dypFont = _dypFontDef; _chp.acrFore = kacrBlack; _chp.acrBack = kacrClear; _cpLimChp = CpMac(); _cpMinChp = 0; for (sprm = sprmMinChp; sprm < sprmLimChp; sprm++) { spcp = _SpcpFromSprmCp(sprm, cp); fRet = _FFindMpe(spcp, &mpe, &cpLimT); _cpLimChp = LwMin(_cpLimChp, cpLimT); if (!fRet) continue; _cpMinChp = LwMax(_cpMinChp, _CpFromSpcp(mpe.spcp)); switch (sprm) { case sprmStyle: _chp.grfont = B0Lw(mpe.lw); _chp.dypOffset = (long)(achar)B1Lw(mpe.lw); _chp.dypFont += SwHigh(mpe.lw); break; case sprmFont: if (mpe.lw > 0) { byte *qrgb; qrgb = (byte *)_pagcact->QvGet(mpe.lw - 1, &cb); cb -= size(long) + size(short); // onn, osk if (!FIn(cb, 0, kcbMaxDataStn + 1)) { Warn("bad group element"); break; } CopyPb(qrgb, &_chp.onn, size(long)); Assert(vntl.FValidOnn(_chp.onn), "invalid onn"); } break; case sprmForeColor: if (mpe.lw != 0) _chp.acrFore.SetFromLw(kacrBlack.LwGet() + mpe.lw); break; case sprmBackColor: if (mpe.lw != 0) _chp.acrBack.SetFromLw(kacrClear.LwGet() + mpe.lw); break; } } LDone: *pchp = _chp; if (pvNil != pcpMin) *pcpMin = _cpMinChp; if (pvNil != pcpLim) *pcpLim = _cpLimChp; } /*************************************************************************** Apply the given character properties to the given range of characters. ***************************************************************************/ bool TXRD::FApplyChp(long cp, long ccp, PCHP pchp, PCHP pchpDiff, ulong grfdoc) { AssertThis(fobjAssertFull); AssertIn(cp, 0, CpMac() - 1); AssertIn(ccp, 1, CpMac() - cp); long cspvm; SPVM rgspvm[sprmLimChp - sprmMinChp]; PRTUN prtun = pvNil; BumpCombineUndo(); if (!FSetUndo(cp, cp + ccp, ccp)) return fFalse; if (!_FGetRgspvmFromChp(pchp, pchpDiff, rgspvm, &cspvm)) { CancelUndo(); return fFalse; } // now make sure that _pglmpe has enough room - we need at most 2 // entries per sprm. if (!_pglmpe->FEnsureSpace(2 * cspvm)) { _ReleaseRgspvm(rgspvm, cspvm); CancelUndo(); AssertThis(fobjAssertFull); return fFalse; } _ApplyRgspvm(cp, ccp, rgspvm, cspvm); CommitUndo(); BumpCombineUndo(); AssertThis(fobjAssertFull); InvalAllDdg(cp, ccp, ccp, grfdoc); return fTrue; } /*************************************************************************** Find the bounds of the whole paragraphs overlapping the range [*pcpMin, *pcpMin + *pccp). If fExpand is false, the bounds are of whole paragraphs totally contained in the range, with the possible exception of the trailing end of paragraph marker. If fExpand is true, *pcpMin will only decrease and *pcpLim will only increase; while if fExpand is false, *pcpMin will only increase and *pcpLim may decrease or at most increase past an end of paragraph marker and its associated line feed characters. ***************************************************************************/ void TXRD::_GetParaBounds(long *pcpMin, long *pcpLim, bool fExpand) { AssertVarMem(pcpMin); AssertVarMem(pcpLim); AssertIn(*pcpMin, 0, CpMac()); AssertIn(*pcpLim, *pcpMin, CpMac() + 1); if (fExpand) { *pcpLim = CpLimPara(*pcpLim - (*pcpLim > 0 && *pcpLim > *pcpMin)); *pcpMin = CpMinPara(*pcpMin); } else { if (!FMinPara(*pcpMin)) *pcpMin = CpLimPara(*pcpMin); if (!FMinPara(*pcpLim)) { *pcpLim = CpNext(*pcpLim); if (*pcpLim < CpMac()) *pcpLim = CpMinPara(*pcpLim); } } } /*************************************************************************** Get the long associated with the sprm and the difference between the two PAPs. ppapOld may be nil. *plwMask indicates which portion of the lw is significant. Returns tYes or tNo depending on whether the values of pchpOld and pchpNew differ for the given sprm. Returns tMaybe on error. ***************************************************************************/ tribool TXRD::_TGetLwFromPap(byte sprm, PPAP ppapNew, PPAP ppapOld, long *plw, long *plwMask) { AssertIn(sprm, sprmMinPap, sprmLimPap); AssertVarMem(ppapNew); AssertNilOrVarMem(ppapOld); AssertVarMem(plw); *plwMask = -1; switch (sprm) { case sprmHorz: if (pvNil != ppapOld) { if (ppapOld->jc == ppapNew->jc) *plwMask &= 0x00FFFFFFL; if (ppapOld->nd == ppapNew->nd) *plwMask &= 0xFF00FFFFL; if (ppapOld->dxpTab == ppapNew->dxpTab) *plwMask &= 0xFFFF0000L; } *plw = LwHighLow(SwHighLow(ppapNew->jc, ppapNew->nd), ppapNew->dxpTab - kdxpTabDef); break; case sprmVert: if (pvNil != ppapOld) { if (ppapOld->numLine == ppapNew->numLine) *plwMask &= 0x0000FFFFL; if (ppapOld->dypExtraLine == ppapNew->dypExtraLine) *plwMask &= 0xFFFF0000L; } *plw = LwHighLow(ppapNew->numLine - kdenLine, ppapNew->dypExtraLine); break; case sprmAfter: if (pvNil != ppapOld) { if (ppapOld->numAfter == ppapNew->numAfter) *plwMask &= 0x0000FFFFL; if (ppapOld->dypExtraAfter == ppapNew->dypExtraAfter) *plwMask &= 0xFFFF0000L; } *plw = LwHighLow(ppapNew->numAfter - kdenAfter, ppapNew->dypExtraAfter); break; } if (0 != *plwMask) { *plw &= *plwMask; return tYes; } TrashVar(plw); return tNo; } /*************************************************************************** Get the paragraph properties for the paragraph containing the given character. ***************************************************************************/ void TXRD::FetchPap(long cp, PPAP ppap, long *pcpMin, long *pcpLim) { AssertThis(0); AssertIn(cp, 0, CpMac()); AssertVarMem(ppap); AssertNilOrVarMem(pcpMin); AssertNilOrVarMem(pcpLim); MPE mpe; byte sprm; ulong spcp; long cpLimT; bool fRet; if (FIn(cp, _cpMinPap, _cpLimPap)) goto LDone; ClearPb(&_pap, size(PAP)); _pap.dxpTab = kdxpTabDef; _pap.numLine = kdenLine; _pap.numAfter = kdenAfter; _cpLimPap = CpMac(); _cpMinPap = 0; for (sprm = sprmMinPap; sprm < sprmLimPap; sprm++) { spcp = _SpcpFromSprmCp(sprm, cp); fRet = _FFindMpe(spcp, &mpe, &cpLimT); _cpLimPap = LwMin(_cpLimPap, cpLimT); if (!fRet) continue; _cpMinPap = LwMax(_cpMinPap, _CpFromSpcp(mpe.spcp)); switch (sprm) { case sprmHorz: _pap.jc = B3Lw(mpe.lw); _pap.nd = B2Lw(mpe.lw); _pap.dxpTab += SwLow(mpe.lw); break; case sprmVert: _pap.numLine += SwHigh(mpe.lw); _pap.dypExtraLine = SwLow(mpe.lw); break; case sprmAfter: _pap.numAfter += SwHigh(mpe.lw); _pap.dypExtraAfter = SwLow(mpe.lw); break; } } LDone: *ppap = _pap; if (pvNil != pcpMin) *pcpMin = _cpMinPap; if (pvNil != pcpLim) *pcpLim = _cpLimPap; } /*************************************************************************** Apply the given paragraph properties to the given range of characters. If fExpand is true, the properties of the current paragraph containing cp are set regardless of whether cp is at the beginning of the paragraph. ***************************************************************************/ bool TXRD::FApplyPap(long cp, long ccp, PPAP ppap, PPAP ppapDiff, long *pcpMin, long *pcpLim, bool fExpand, ulong grfdoc) { AssertThis(fobjAssertFull); AssertIn(cp, 0, CpMac()); AssertIn(ccp, 0, CpMac() + 1 - cp); AssertVarMem(ppap); AssertNilOrVarMem(ppapDiff); AssertNilOrVarMem(pcpMin); AssertNilOrVarMem(pcpLim); long cpLim; long cspvm; SPVM rgspvm[sprmLimPap - sprmMinPap]; // see if there are any paragraphs to deal with cpLim = cp + ccp; _GetParaBounds(&cp, &cpLim, fExpand); if (pvNil != pcpMin) *pcpMin = cp; if (pvNil != pcpLim) *pcpLim = cpLim; if (cpLim <= cp) { // no paragraphs to affect return fTrue; } BumpCombineUndo(); if (!FSetUndo(cp, cpLim, cpLim - cp)) return fFalse; if (!_FGetRgspvmFromPap(ppap, ppapDiff, rgspvm, &cspvm)) { CancelUndo(); return fFalse; } // now make sure that _pglmpe has enough room - we need at most 2 // entries per sprm. if (!_pglmpe->FEnsureSpace(2 * cspvm)) { _ReleaseRgspvm(rgspvm, cspvm); CancelUndo(); AssertThis(fobjAssertFull); return fFalse; } _ApplyRgspvm(cp, cpLim - cp, rgspvm, cspvm); CommitUndo(); BumpCombineUndo(); AssertThis(fobjAssertFull); InvalAllDdg(cp, cpLim - cp, cpLim - cp, grfdoc); return fTrue; } /*************************************************************************** Set up undo for an action. If this succeeds, you must call either CancelUndo or CommitUndo. ***************************************************************************/ bool TXRD::FSetUndo(long cp1, long cp2, long ccpIns) { if (_cactSuspendUndo++ > 0 || _cundbMax == 0) return fTrue; Assert(_prtun == pvNil, "why is there an active undo record?"); if (cp1 == cp2 && ccpIns == 0) return fTrue; if (pvNil == (_prtun = RTUN::PrtunNew(_cactCombineUndo, this, cp1, cp2, ccpIns))) { ResumeUndo(); return fFalse; } return fTrue; } /*************************************************************************** Cancel undo. ***************************************************************************/ void TXRD::CancelUndo(void) { ResumeUndo(); if (_cactSuspendUndo == 0) ReleasePpo(&_prtun); } /*************************************************************************** Commit the setup undo. ***************************************************************************/ void TXRD::CommitUndo(void) { PRTUN prtunPrev; ResumeUndo(); if (_cactSuspendUndo != 0 || _prtun == pvNil) return; AssertPo(_prtun, 0); // see if this one can be combined with the last one if (_ipundbLimDone > 0) { _pglpundb->Get(_ipundbLimDone - 1, &prtunPrev); if (prtunPrev->FIs(kclsRTUN) && prtunPrev->FCombine(_prtun)) { ClearRedo(); goto LDone; } } FAddUndo(_prtun); LDone: ReleasePpo(&_prtun); } /*************************************************************************** Replace cp to cp + ccpDel with ccpIns characters from prgch. If ccpIns is zero, prgch can be nil. ***************************************************************************/ bool TXRD::FReplaceRgch(void *prgch, long ccpIns, long cp, long ccpDel, ulong grfdoc) { AssertThis(fobjAssertFull); AssertIn(ccpIns, 0, kcbMax); AssertPvCb(prgch, ccpIns * size(achar)); AssertIn(cp, 0, CpMac()); AssertIn(ccpDel, 0, CpMac() - cp); if (CpMac() + ccpIns >= kcpMaxTxrd) { PushErc(ercRtxdTooMuchText); return fFalse; } if (!FSetUndo(cp, cp + ccpDel, ccpIns)) return fFalse; if (!TXRD_PAR::FReplaceRgch(prgch, ccpIns, cp, ccpDel, fdocNil)) { CancelUndo(); return fFalse; } _AdjustMpe(cp, ccpIns, ccpDel); CommitUndo(); AssertThis(fobjAssertFull); InvalAllDdg(cp, ccpIns, ccpDel, grfdoc); return fTrue; } /*************************************************************************** Replace cp to cp + ccpDel with ccpIns characters from prgch, using the given chp and pap. If ccpIns is zero, prgch can be nil. pchp and/or ppap can be nil. ***************************************************************************/ bool TXRD::FReplaceRgch(void *prgch, long ccpIns, long cp, long ccpDel, PCHP pchp, PPAP ppap, ulong grfdoc) { AssertThis(0); AssertIn(ccpIns, 0, kcbMax); AssertPvCb(prgch, ccpIns * size(achar)); AssertIn(cp, 0, CpMac()); AssertIn(ccpDel, 0, CpMac() - cp); AssertNilOrVarMem(pchp); AssertNilOrVarMem(ppap); return _FReplaceCore(prgch, pvNil, fFalse, pvNil, 0, ccpIns, cp, ccpDel, pchp, ppap, grfdoc); } /*************************************************************************** Replace cp to cp + ccpDel with ccpIns characters from prgch, pflo or pbsf, using the given chp and pap. If ccpIns is zero, prgch can be nil. pchp and/or ppap can be nil. ***************************************************************************/ bool TXRD::_FReplaceCore(void *prgch, PFLO pflo, bool fCopy, PBSF pbsf, long cpSrc, long ccpIns, long cp, long ccpDel, PCHP pchp, PPAP ppap, ulong grfdoc) { AssertThis(fobjAssertFull); AssertIn(ccpIns, 0, kcbMax); AssertNilOrPvCb(prgch, ccpIns * size(achar)); AssertNilOrPo(pflo, 0); AssertNilOrPo(pbsf, 0); AssertIn(cp, 0, CpMac()); AssertIn(ccpDel, 0, CpMac() - cp); AssertNilOrVarMem(pchp); AssertNilOrVarMem(ppap); SPVM rgspvm[sprmLimChp - sprmMinChp + sprmLimPap - sprmMinPap]; long cspvmChp, cspvmPap; long cpMinUndo, cpLimUndo; if (CpMac() + ccpIns >= kcpMaxTxrd) { PushErc(ercRtxdTooMuchText); return fFalse; } cpMinUndo = cp; cpLimUndo = cp + ccpDel; cspvmChp = cspvmPap = 0; if (pvNil != pchp && ccpIns > 0 && !_FGetRgspvmFromChp(pchp, pvNil, rgspvm, &cspvmChp)) { return fFalse; } if (pvNil != ppap && ccpIns > 0) { _GetParaBounds(&cpMinUndo, &cpLimUndo, fFalse); if (cpMinUndo < cpLimUndo && !_FGetRgspvmFromPap(ppap, pvNil, rgspvm + cspvmChp, &cspvmPap)) { goto LFail; } cpMinUndo = LwMin(cp, cpMinUndo); cpLimUndo = LwMax(cp + ccpDel, cpLimUndo); } // now make sure that _pglmpe has enough room - we need at most 2 // entries per sprm. if (!_pglmpe->FEnsureSpace(2 * (cspvmChp + cspvmPap))) goto LFail; if (!FSetUndo(cpMinUndo, cpLimUndo, cpLimUndo - cpMinUndo - ccpDel + ccpIns)) goto LFail; if (pvNil != pflo) { Assert(cpSrc == 0 && ccpIns * size(achar) == pflo->cb, "bad flo"); if (!FReplaceFlo(pflo, fCopy, cp, ccpDel, koskCur, fdocNil)) goto LCancel; } else if (pvNil != pbsf) { if (!FReplaceBsf(pbsf, cpSrc, ccpIns, cp, ccpDel, fdocNil)) goto LCancel; } else { Assert(cpSrc == 0, "bad cpSrc"); AssertPvCb(prgch, ccpIns * size(achar)); if (!FReplaceRgch(prgch, ccpIns, cp, ccpDel, fdocNil)) { LCancel: CancelUndo(); LFail: _ReleaseRgspvm(rgspvm, cspvmChp + cspvmPap); return fFalse; } } if (cspvmChp > 0) _ApplyRgspvm(cp, ccpIns, rgspvm, cspvmChp); if (cspvmPap > 0) { long cpMin = cp; long cpLim = cp + ccpIns; _GetParaBounds(&cpMin, &cpLim, fFalse); Assert(cpMin >= cpMinUndo, "new para before old one"); Assert(cpLim <= cpLimUndo - ccpDel + ccpIns, "new para after old one"); _ApplyRgspvm(cpMin, cpLim - cpMin, rgspvm + cspvmChp, cspvmPap); } CommitUndo(); AssertThis(fobjAssertFull); InvalAllDdg(cpMinUndo, cpLimUndo - cpMinUndo - ccpDel + ccpIns, cpLimUndo - cpMinUndo, grfdoc); return fTrue; } /*************************************************************************** Replace cp to cp + ccpDel with the characters in the given FLO. ***************************************************************************/ bool TXRD::FReplaceFlo(PFLO pflo, bool fCopy, long cp, long ccpDel, short osk, ulong grfdoc) { AssertThis(fobjAssertFull); AssertPo(pflo, 0); AssertIn(cp, 0, CpMac()); AssertIn(ccpDel, 0, CpMac() - cp); long ccpIns; FLO flo = *pflo; flo.pfil->AddRef(); if (!flo.FTranslate(osk)) goto LFail; ccpIns = flo.cb / size(achar); if (CpMac() + ccpIns >= kcpMaxTxrd) { PushErc(ercRtxdTooMuchText); goto LFail; } if (!FSetUndo(cp, cp + ccpDel, ccpIns)) goto LFail; if (!TXRD_PAR::FReplaceFlo(&flo, fCopy, cp, ccpDel, koskCur, fdocNil)) { CancelUndo(); LFail: ReleasePpo(&flo.pfil); return fFalse; } ReleasePpo(&flo.pfil); _AdjustMpe(cp, ccpIns, ccpDel); CommitUndo(); AssertThis(fobjAssertFull); InvalAllDdg(cp, ccpIns, ccpDel, grfdoc); return fTrue; } /*************************************************************************** Replace cp to cp + ccpDel with the characters in the given FLO, using the given chp and pap. pchp and/or ppap can be nil. ***************************************************************************/ bool TXRD::FReplaceFlo(PFLO pflo, bool fCopy, long cp, long ccpDel, PCHP pchp, PPAP ppap, short osk, ulong grfdoc) { AssertThis(0); AssertPo(pflo, 0); AssertIn(cp, 0, CpMac()); AssertIn(ccpDel, 0, CpMac() - cp); AssertNilOrVarMem(pchp); AssertNilOrVarMem(ppap); bool fRet; FLO flo = *pflo; flo.pfil->AddRef(); fRet = flo.FTranslate(osk) && _FReplaceCore(pvNil, &flo, fCopy && pflo->pfil == flo.pfil, pvNil, 0, pflo->cb, cp, ccpDel, pchp, ppap, grfdoc); ReleasePpo(&flo.pfil); return fRet; } /*************************************************************************** Replace cp to cpDst + ccpDel with ccpSrc characters from pbsfSrc starting at cpSrc. ***************************************************************************/ bool TXRD::FReplaceBsf(PBSF pbsfSrc, long cpSrc, long ccpSrc, long cpDst, long ccpDel, ulong grfdoc) { AssertThis(fobjAssertFull); AssertPo(pbsfSrc, 0); AssertIn(cpSrc, 0, pbsfSrc->IbMac() / size(achar) + 1); AssertIn(ccpSrc, 0, pbsfSrc->IbMac() / size(achar) + 1 - cpSrc); AssertIn(cpDst, 0, CpMac()); AssertIn(ccpDel, 0, CpMac() - cpDst); if (CpMac() + ccpSrc >= kcpMaxTxrd) { PushErc(ercRtxdTooMuchText); return fFalse; } if (!FSetUndo(cpDst, cpDst + ccpDel, ccpSrc)) return fFalse; if (!TXRD_PAR::FReplaceBsf(pbsfSrc, cpSrc, ccpSrc, cpDst, ccpDel, fdocNil)) { CancelUndo(); return fFalse; } _AdjustMpe(cpDst, ccpSrc, ccpDel); CommitUndo(); AssertThis(fobjAssertFull); InvalAllDdg(cpDst, ccpSrc, ccpDel, grfdoc); return fTrue; } /*************************************************************************** Replace cp to cpDst + ccpDel with ccpSrc characters from pbsfSrc starting at cpSrc, using the given chp and pap. pchp and/or ppap can be nil. ***************************************************************************/ bool TXRD::FReplaceBsf(PBSF pbsfSrc, long cpSrc, long ccpSrc, long cpDst, long ccpDel, PCHP pchp, PPAP ppap, ulong grfdoc) { AssertThis(0); AssertPo(pbsfSrc, 0); AssertIn(cpSrc, 0, pbsfSrc->IbMac() + 1); AssertIn(ccpSrc, 0, pbsfSrc->IbMac() + 1 - cpSrc); AssertIn(cpDst, 0, CpMac()); AssertIn(ccpDel, 0, CpMac() - cpDst); AssertNilOrVarMem(pchp); AssertNilOrVarMem(ppap); return _FReplaceCore(pvNil, pvNil, fFalse, pbsfSrc, cpSrc, ccpSrc, cpDst, ccpDel, pchp, ppap, grfdoc); } /*************************************************************************** Replace cp to cpDst + ccpDel with ccpSrc characters from pbsfSrc starting at cpSrc, using the given chp and pap. pchp and/or ppap can be nil. ***************************************************************************/ bool TXRD::FReplaceTxtb(PTXTB ptxtbSrc, long cpSrc, long ccpSrc, long cpDst, long ccpDel, ulong grfdoc) { AssertThis(0); AssertPo(ptxtbSrc, 0); AssertIn(cpSrc, 0, ptxtbSrc->CpMac() + 1); AssertIn(ccpSrc, 0, ptxtbSrc->CpMac() + 1 - cpSrc); AssertIn(cpDst, 0, CpMac()); AssertIn(ccpDel, 0, CpMac() - cpDst); // NOTE: this cast to PTXRD is just a rude hack to get around // an oddity of C++. TXRD cannot access _pbsf in a TXTB, only in a TXRD. // ptxtbSrc is probably not a TXRD, but the cast still works. return FReplaceBsf(((PTXRD)ptxtbSrc)->_pbsf, cpSrc, ccpSrc, cpDst, ccpDel, grfdoc); } /*************************************************************************** Replace cp to cpDst + ccpDel with ccpSrc characters from pbsfSrc starting at cpSrc, using the given chp and pap. pchp and/or ppap can be nil. ***************************************************************************/ bool TXRD::FReplaceTxtb(PTXTB ptxtbSrc, long cpSrc, long ccpSrc, long cpDst, long ccpDel, PCHP pchp, PPAP ppap, ulong grfdoc) { AssertThis(0); AssertPo(ptxtbSrc, 0); AssertIn(cpSrc, 0, ptxtbSrc->CpMac() + 1); AssertIn(ccpSrc, 0, ptxtbSrc->CpMac() + 1 - cpSrc); AssertIn(cpDst, 0, CpMac()); AssertIn(ccpDel, 0, CpMac() - cpDst); AssertNilOrVarMem(pchp); AssertNilOrVarMem(ppap); // NOTE: this cast to PTXRD is just a rude hack to get around // an oddity of C++. TXRD cannot access _pbsf in a TXTB, only in a TXRD. // ptxtbSrc is probably not a TXRD, but the cast still works. return _FReplaceCore(pvNil, pvNil, fFalse, ((PTXRD)ptxtbSrc)->_pbsf, cpSrc, ccpSrc, cpDst, ccpDel, pchp, ppap, grfdoc); } /*************************************************************************** Replace stuff in this document with stuff in the given document. REVIEW shonk: this doesn't preserve font size if the two docs have different default font sizes! ***************************************************************************/ bool TXRD::FReplaceTxrd(PTXRD ptxrd, long cpSrc, long ccpSrc, long cpDst, long ccpDel, ulong grfdoc) { AssertThis(fobjAssertFull); AssertPo(ptxrd, 0); AssertIn(cpSrc, 0, ptxrd->CpMac()); AssertIn(ccpSrc, 0, ptxrd->CpMac() + 1 - cpSrc); AssertIn(cpDst, 0, CpMac()); AssertIn(ccpDel, 0, CpMac() + 1 - cpDst); Assert(ptxrd != this, "can't copy from a rich text doc to itself!"); long dcp = 0; // REVIEW shonk: is there an easy way to make this atomic? if (CpMac() + ccpSrc >= kcpMaxTxrd) { PushErc(ercRtxdTooMuchText); return fFalse; } if (!FSetUndo(cpDst, cpDst + ccpDel, ccpSrc)) return fFalse; // protect the trailing EOP if (cpDst + ccpDel == CpMac()) { #ifdef DEBUG achar ch; ptxrd->FetchRgch(cpSrc + ccpSrc - 1, 1, &ch); Assert(ch == kchReturn, "trying to replace trailing EOP"); #endif // DEBUG Assert(ccpDel > 0 && ccpSrc > 0, "bad parameters to FReplaceTxrd"); ccpDel--; ccpSrc--; dcp = 1; } // insert the text if ((ccpSrc > 0 || ccpDel > 0) && !FReplaceBsf(ptxrd->_pbsf, cpSrc, ccpSrc, cpDst, ccpDel, fdocNil)) { CancelUndo(); return fFalse; } if (ccpSrc > 0) _CopyProps(ptxrd, cpSrc, cpDst, ccpSrc, ccpSrc, 0, sprmMinPap); if (ccpSrc + dcp > 0) { long ccpSrcPap; long cpMinPap = cpDst; long cpLimPap = cpDst + ccpSrc; _GetParaBounds(&cpMinPap, &cpLimPap, fFalse); ccpSrcPap = ccpSrc - cpMinPap + cpDst; if (ccpSrcPap > 0 && cpMinPap < cpLimPap) { _CopyProps(ptxrd, cpSrc + cpMinPap - cpDst, cpMinPap, ccpSrcPap, cpLimPap - cpMinPap, sprmMinPap, sprmMinObj); } } if (ccpSrc > 0) { // object properties long cp; byte sprm; long impe, impeNew; MPE mpe, mpeNew; void *pv; bool fRet; ptxrd->_FFindMpe(_SpcpFromSprmCp(sprmMinObj, cpSrc), pvNil, pvNil, &impe); while (impe < ptxrd->_pglmpe->IvMac()) { ptxrd->_pglmpe->Get(impe++, &mpe); cp = _CpFromSpcp(mpe.spcp); if (!FIn(cp, cpSrc, cpSrc + ccpSrc)) continue; sprm = _SprmFromSpcp(mpe.spcp); mpeNew.spcp = _SpcpFromSprmCp(sprm, cpDst + cp - cpSrc); pv = ptxrd->_pagcact->PvLock(mpe.lw - 1); fRet = _FEnsureInAg(sprm, pv, ptxrd->_pagcact->Cb(mpe.lw - 1), &mpeNew.lw); ptxrd->_pagcact->Unlock(); if (!fRet) continue; // insert the object sprm if (_FFindMpe(mpeNew.spcp, pvNil, pvNil, &impeNew)) impeNew++; if (!_pglmpe->FInsert(impeNew, &mpeNew)) _ReleaseInAg(mpeNew.lw); } } CommitUndo(); AssertThis(fobjAssertFull); InvalAllDdg(cpDst, ccpSrc + dcp, ccpDel + dcp, grfdoc); return fTrue; } /*************************************************************************** Copy properties from a TXRD to this one. Properties from sprmMin to sprmLim are copied. ***************************************************************************/ void TXRD::_CopyProps(PTXRD ptxrd, long cpSrc, long cpDst, long ccpSrc, long ccpDst, byte sprmMin, byte sprmLim) { AssertThis(0); AssertPo(ptxrd, 0); AssertIn(cpSrc, 0, ptxrd->CpMac()); AssertIn(cpDst, 0, CpMac()); AssertIn(ccpSrc, 1, ptxrd->CpMac() + 1 - cpSrc); AssertIn(ccpDst, 1, CpMac() + 1 - cpDst); SPVM spvm; byte sprm; long impe; long cpMin, cpLim; bool fRet; long lw; long cb; void *pv; // zero the character properties over the inserted text spvm.sprm = sprmNil; spvm.lw = 0; spvm.lwMask = -1; _FFindMpe(_SpcpFromSprmCp(sprmMin, 0), pvNil, pvNil, &impe); while (_FFetchProp(impe++, &sprm) && sprm < sprmLim) { if (spvm.sprm == sprm) continue; spvm.sprm = sprm; if (_pglmpe->FEnsureSpace(2)) _ApplyRgspvm(cpDst, ccpDst, &spvm, 1); else Warn("growing _pglmpe failed"); } // apply the source properties ptxrd->_FFindMpe(_SpcpFromSprmCp(sprmMin, 0), pvNil, pvNil, &impe); while (ptxrd->_FFetchProp(impe++, &sprm, &lw, &cpMin, &cpLim) && sprm < sprmLim) { // if this MPE doesn't overlap our source range, ignore it. if (cpLim <= cpSrc || cpMin >= cpSrc + ccpSrc) continue; // if this MPE goes to the end of the source range, also carry it // to the end of the destination if (cpLim >= cpSrc + ccpSrc) cpLim = cpSrc + ccpDst; // adjust the min and lim to destination cp values and restrict // them to [cpDst, cpDst + ccpDst). if ((cpMin += cpDst - cpSrc) < cpDst) cpMin = cpDst; if ((cpLim += cpDst - cpSrc) > cpDst + ccpDst) cpLim = cpDst + ccpDst; // if the range is empty, ignore it if (cpMin >= cpLim) continue; spvm.sprm = sprm; if (_FSprmInAg(sprm) && lw > 0) { cb = ptxrd->_pagcact->Cb(lw - 1); pv = ptxrd->_pagcact->PvLock(lw - 1); fRet = _FEnsureInAg(sprm, pv, cb, &spvm.lw); ptxrd->_pagcact->Unlock(); if (!fRet) { Warn("ensure in ag failed"); continue; } } else spvm.lw = lw; if (_pglmpe->FEnsureSpace(2)) _ApplyRgspvm(cpMin, cpLim - cpMin, &spvm, 1); else { Warn("growing _pglmpe failed"); _ReleaseRgspvm(&spvm, 1); } } } /*************************************************************************** Find the first object at or after cpMin. Put its location in *pcp and allocate a buffer to hold its extra data and put it in *ppv (if ppv is not nil). If an object was found, but the buffer couldn't be allocated, *ppv is set to nil. ***************************************************************************/ bool TXRD::FFetchObject(long cpMin, long *pcp, void **ppv, long *pcb) { AssertThis(0); AssertIn(cpMin, 0, CpMac()); AssertVarMem(pcp); AssertNilOrVarMem(ppv); AssertNilOrVarMem(pcb); MPE mpe; long impe; long cb; bool fRet; fRet = _FFindMpe(_SpcpFromSprmCp(sprmObject, cpMin), &mpe, pcp, &impe); if (fRet && cpMin == _CpFromSpcp(mpe.spcp)) *pcp = cpMin; else if (*pcp >= CpMac()) return fFalse; else { if (fRet) impe++; Assert(impe < _pglmpe->IvMac(), "bad cpLim from _FFindMpe"); _pglmpe->Get(impe, &mpe); Assert(_CpFromSpcp(mpe.spcp) == *pcp, "_FFindMpe messed up"); } if (pvNil != pcb) *pcb = _pagcact->Cb(mpe.lw - 1); if (pvNil != ppv) { mpe.lw--; AssertIn(mpe.lw, 0, _pagcact->IvMac()); cb = _pagcact->Cb(mpe.lw); if (FAllocPv(ppv, cb, fmemNil, mprNormal)) CopyPb((byte *)_pagcact->QvGet(mpe.lw), *ppv, cb); } return fTrue; } /*************************************************************************** Insert a picture into the rich text document. ***************************************************************************/ bool TXRD::FInsertObject(void *pv, long cb, long cp, long ccpDel, PCHP pchp, ulong grfdoc) { AssertThis(fobjAssertFull); AssertPvCb(pv, cb); AssertIn(cp, 0, CpMac()); AssertIn(ccpDel, 0, CpMac() - cp); AssertNilOrVarMem(pchp); SPVM rgspvm[sprmLimChp - sprmMinChp]; MPE mpe; long impe; achar ch = kchObject; long cspvmChp = 0; BumpCombineUndo(); if (!FSetUndo(cp, cp + ccpDel, 1)) return fFalse; mpe.spcp = _SpcpFromSprmCp(sprmObject, cp); if (!_FEnsureInAg(sprmObject, pv, cb, &mpe.lw)) goto LFail; if (pvNil != pchp && !_FGetRgspvmFromChp(pchp, pvNil, rgspvm, &cspvmChp)) goto LFail; // now make sure that _pglmpe has enough room - we need at most 2 // entries per sprm, plus one for the object if (!_pglmpe->FEnsureSpace(2 * cspvmChp + 1)) goto LFail; if (!FReplaceRgch(&ch, 1, cp, ccpDel, fdocNil)) { _ReleaseRgspvm(rgspvm, cspvmChp); LFail: _ReleaseSprmLw(sprmObject, mpe.lw); CancelUndo(); return fFalse; } if (cspvmChp > 0) _ApplyRgspvm(cp, 1, rgspvm, cspvmChp); // insert the object sprm if (_FFindMpe(mpe.spcp, pvNil, pvNil, &impe)) impe++; AssertDo(_pglmpe->FInsert(impe, &mpe), "should have been ensured"); CommitUndo(); BumpCombineUndo(); AssertThis(fobjAssertFull); InvalAllDdg(cp, 1, ccpDel, grfdoc); return fTrue; } /*************************************************************************** Insert a picture into the rich text document. ***************************************************************************/ bool TXRD::FApplyObjectProps(void *pv, long cb, long cp, ulong grfdoc) { AssertThis(fobjAssertFull); AssertPvCb(pv, cb); AssertIn(cp, 0, CpMac()); MPE mpe; long impe; long lwOld; if (!_FFindMpe(_SpcpFromSprmCp(sprmObject, cp), &mpe, pvNil, &impe) || cp != _CpFromSpcp(mpe.spcp)) { Bug("cp not an object"); return fFalse; } BumpCombineUndo(); if (!FSetUndo(cp, cp + 1, 1)) return fFalse; lwOld = mpe.lw; if (!_FEnsureInAg(sprmObject, pv, cb, &mpe.lw)) { CancelUndo(); return fFalse; } _pglmpe->Put(impe, &mpe); _ReleaseSprmLw(sprmObject, lwOld); CommitUndo(); BumpCombineUndo(); AssertThis(fobjAssertFull); InvalAllDdg(cp, 1, 1, grfdoc); return fTrue; } /*************************************************************************** Get the bounds of an object. ***************************************************************************/ bool TXRD::FGetObjectRc(long cp, PGNV pgnv, PCHP pchp, RC *prc) { AssertThis(0); AssertIn(cp, 0, CpMac()); AssertPo(pgnv, 0); AssertVarMem(pchp); AssertVarMem(prc); MPE mpe; ulong spcp = _SpcpFromSprmCp(sprmObject, cp); if (!_FFindMpe(spcp, &mpe) || _CpFromSpcp(mpe.spcp) != cp) return fFalse; return _FGetObjectRc(mpe.lw - 1, _SprmFromSpcp(mpe.spcp), pgnv, pchp, prc); } /*************************************************************************** Get the object bounds from the AG entry. ***************************************************************************/ bool TXRD::_FGetObjectRc(long icact, byte sprm, PGNV pgnv, PCHP pchp, RC *prc) { AssertIn(icact, 0, _pagcact->IvMac()); Assert(sprm >= sprmObject, 0); AssertPo(pgnv, 0); AssertVarMem(pchp); AssertVarMem(prc); // TXRD has no acceptable object types TrashVar(prc); return fFalse; } /*************************************************************************** Draw an object. ***************************************************************************/ bool TXRD::FDrawObject(long cp, PGNV pgnv, long *pxp, long yp, PCHP pchp, RC *prcClip) { AssertThis(0); AssertIn(cp, 0, CpMac()); AssertPo(pgnv, 0); AssertVarMem(pxp); AssertVarMem(pchp); AssertVarMem(prcClip); MPE mpe; ulong spcp = _SpcpFromSprmCp(sprmObject, cp); if (!_FFindMpe(spcp, &mpe) || _CpFromSpcp(mpe.spcp) != cp) return fFalse; return _FDrawObject(mpe.lw - 1, _SprmFromSpcp(mpe.spcp), pgnv, pxp, yp, pchp, prcClip); } /*************************************************************************** Draw the object. ***************************************************************************/ bool TXRD::_FDrawObject(long icact, byte sprm, PGNV pgnv, long *pxp, long yp, PCHP pchp, RC *prcClip) { AssertIn(icact, 0, _pagcact->IvMac()); Assert(sprm >= sprmObject, 0); AssertPo(pgnv, 0); AssertVarMem(pxp); AssertVarMem(pchp); AssertVarMem(prcClip); // TXRD has no acceptable object types return fFalse; } /*************************************************************************** Create a new rich text undo object for the given rich text document. ***************************************************************************/ PRTUN RTUN::PrtunNew(long cactCombine, PTXRD ptxrd, long cp1, long cp2, long ccpIns) { AssertPo(ptxrd, 0); AssertIn(cp1, 0, ptxrd->CpMac() + 1); AssertIn(cp2, 0, ptxrd->CpMac() + 1); AssertIn(ccpIns, 0, kcbMax); PRTUN prtun; SortLw(&cp1, &cp2); AssertIn(cp1, 0, ptxrd->CpMac()); if (pvNil == (prtun = NewObj RTUN)) return pvNil; prtun->_cactCombine = cactCombine; prtun->_cpMin = cp1; prtun->_ccpIns = ccpIns; if (cp1 < cp2) { // copy the piece of the txrd. if (pvNil == (prtun->_ptxrd = TXRD::PtxrdNew(pvNil))) goto LFail; prtun->_ptxrd->SetInternal(); prtun->_ptxrd->SuspendUndo(); if (!prtun->_ptxrd->FReplaceTxrd(ptxrd, cp1, cp2 - cp1, 0, 0)) { LFail: ReleasePpo(&prtun); } } AssertNilOrPo(prtun, 0); return prtun; } /*************************************************************************** Destructor for a rich text undo object. ***************************************************************************/ RTUN::~RTUN(void) { ReleasePpo(&_ptxrd); } /*************************************************************************** Undo this rich text undo object on the given document. ***************************************************************************/ bool RTUN::FUndo(PDOCB pdocb) { AssertThis(0); AssertPo(pdocb, 0); PTXRD ptxrd; long ccpIns; PTXRD ptxrdNew = pvNil; if (!pdocb->FIs(kclsTXRD)) goto LAssert; ptxrd = (PTXRD)pdocb; AssertPo(ptxrd, 0); if (!FIn(_cpMin, 0, ptxrd->CpMac()) || !FIn(_ccpIns, 0, ptxrd->CpMac() + 1 - _cpMin)) { LAssert: Bug("This rich text undo object cannot be applied to this document"); return fFalse; } if (_ccpIns > 0) { // copy the piece of the txrd. if (pvNil == (ptxrdNew = TXRD::PtxrdNew(pvNil))) return fFalse; ptxrdNew->SetInternal(); ptxrdNew->SuspendUndo(); if (!ptxrdNew->FReplaceTxrd(ptxrd, _cpMin, _ccpIns, 0, 0)) goto LFail; } ptxrd->SuspendUndo(); ptxrd->HideSel(); if (pvNil == _ptxrd) { ccpIns = 0; if (!ptxrd->FReplaceRgch(pvNil, 0, _cpMin, _ccpIns)) goto LFail; } else { ccpIns = _ptxrd->CpMac() - 1; if (!ptxrd->FReplaceTxrd(_ptxrd, 0, ccpIns, _cpMin, _ccpIns)) { LFail: ReleasePpo(&ptxrdNew); ptxrd->ResumeUndo(); return fFalse; } } ptxrd->ResumeUndo(); ptxrd->SetSel(_cpMin, _cpMin + ccpIns, ginNil); ptxrd->ShowSel(); ptxrd->SetSel(_cpMin + ccpIns, _cpMin + ccpIns); ReleasePpo(&_ptxrd); _ptxrd = ptxrdNew; _ccpIns = ccpIns; return fTrue; } /*************************************************************************** Redo this rich text undo object on the given document. ***************************************************************************/ bool RTUN::FDo(PDOCB pdocb) { AssertThis(0); return FUndo(pdocb); } /*************************************************************************** If possible, combine the given rtun with this one. Returns success. ***************************************************************************/ bool RTUN::FCombine(PRTUN prtun) { AssertThis(0); AssertPo(prtun, 0); long ccp; // if the _cactCombine numbers are different, they can't be combined if (prtun->_cactCombine != _cactCombine) return fFalse; // if the new record doesn't delete anything and the new text is // at the end of the old text, just adjust _ccpIns. if (prtun->_ptxrd == pvNil && _cpMin + _ccpIns == prtun->_cpMin) { _ccpIns += prtun->_ccpIns; return fTrue; } // if either of the new records inserts anything, we can't combine the two if (prtun->_ccpIns != 0 || _ccpIns != 0) return fFalse; // handle repeated delete keys AssertPo(_ptxrd, 0); AssertPo(prtun->_ptxrd, 0); ccp = prtun->_ptxrd->CpMac() - 1; if (prtun->_cpMin == _cpMin) { return _ptxrd->FReplaceTxrd(prtun->_ptxrd, 0, ccp, _ptxrd->CpMac() - 1, 0); } // handle repeated backspace keys if (prtun->_cpMin + ccp == _cpMin) { if (!_ptxrd->FReplaceTxrd(prtun->_ptxrd, 0, ccp, 0, 0)) return fFalse; _cpMin = prtun->_cpMin; return fTrue; } return fFalse; } #ifdef DEBUG /*************************************************************************** Assert the validity of a RTUN. ***************************************************************************/ void RTUN::AssertValid(ulong grf) { RTUN_PAR::AssertValid(grf); AssertNilOrPo(_ptxrd, 0); AssertIn(_cpMin, 0, kcbMax); AssertIn(_ccpIns, 0, kcbMax); Assert(_ccpIns > 0 || _ptxrd != pvNil, "empty RTUN"); } /*************************************************************************** Mark memory for the RTUN. ***************************************************************************/ void RTUN::MarkMem(void) { AssertThis(fobjAssertFull); RTUN_PAR::MarkMem(); MarkMemObj(_ptxrd); } #endif // DEBUG ================================================ FILE: kauai/src/rtxt.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Rich text document and supporting views. ***************************************************************************/ #ifndef RTXT_H #define RTXT_H /*************************************************************************** Character properties - if you change this, make sure to update FetchChp and _TGetLwFromChp. ***************************************************************************/ struct CHP { ulong grfont; // bold, italic, etc long onn; // which font long dypFont; // size of the font long dypOffset; // sub/superscript (-128 to 127) ACR acrFore; // text color ACR acrBack; // background color void Clear(void) { ClearPb(this, offset(CHP, acrFore)); acrFore = kacrBlack; acrBack = kacrBlack; } }; typedef CHP *PCHP; /*************************************************************************** Paragraph properties - if you change these, make sure to update FetchPap and _TGetLwFromPap. The dypExtraLine and numLine fields are used to change the height of lines from their default. The line height used is calculated as (numLine / 256) * dyp + dypExtraLine, where dyp is the natural height of the line. ***************************************************************************/ enum { jcMin, jcLeft = jcMin, jcRight, jcCenter, jcLim }; enum { ndMin, ndNone = ndMin, ndFirst, // just on the left ndRest, // just on the left ndAll, // on both sides ndLim }; struct PAP { byte jc; byte nd; short dxpTab; short numLine; short dypExtraLine; short numAfter; short dypExtraAfter; }; typedef PAP *PPAP; const short kdenLine = 256; const short kdenAfter = 256; const short kdxpTabDef = (kdzpInch / 4); const short kdxpDocDef = (kdzpInch * 6); const achar kchObject = 1; /*************************************************************************** Generic text document base class ***************************************************************************/ const long kcchMaxTxtbCache = 512; typedef class TXTB *PTXTB; #define TXTB_PAR DOCB #define kclsTXTB 'TXTB' class TXTB : public TXTB_PAR { RTCLASS_DEC ASSERT MARKMEM protected: PFIL _pfil; PBSF _pbsf; ACR _acrBack; long _dxpDef; // default width of the document long _cpMinCache; long _cpLimCache; achar _rgchCache[kcchMaxTxtbCache]; long _cactSuspendUndo; // > 0 means don't set up undo records. long _cactCombineUndo; // determines whether we can combine undo records. TXTB(PDOCB pdocb = pvNil, ulong grfdoc = fdocNil); ~TXTB(void); virtual bool _FInit(PFNI pfni = pvNil, PBSF pbsf = pvNil, short osk = koskCur); virtual bool _FLoad(short osk = koskCur); virtual achar _ChFetch(long cp); virtual void _CacheRange(long cpMin, long cpLim); virtual void _InvalCache(long cp, long ccpIns, long ccpDel); public: virtual void InvalAllDdg(long cp, long ccpIns, long ccpDel, ulong grfdoc = fdocUpdate); // REVIEW shonk: this is needed for using a text document as input to a lexer. // The bsf returned is read-only!!!! PBSF Pbsf(void) { AssertThis(0); return _pbsf; } long CpMac(void); bool FMinPara(long cp); long CpMinPara(long cp); long CpLimPara(long cp); long CpPrev(long cp, bool fWord = fFalse); long CpNext(long cp, bool fWord = fFalse); ACR AcrBack(void) { return _acrBack; } void SetAcrBack(ACR acr, ulong grfdoc = fdocUpdate); long DxpDef(void) { return _dxpDef; } virtual void SetDxpDef(long dxp); virtual void FetchRgch(long cp, long ccp, achar *prgch); virtual bool FReplaceRgch(void *prgch, long ccpIns, long cp, long ccpDel, ulong grfdoc = fdocUpdate); virtual bool FReplaceFlo(PFLO pflo, bool fCopy, long cp, long ccpDel, short osk = koskCur, ulong grfdoc = fdocUpdate); virtual bool FReplaceBsf(PBSF pbsfSrc, long cpSrc, long ccpSrc, long cpDst, long ccpDel, ulong grfdoc = fdocUpdate); virtual bool FReplaceTxtb(PTXTB ptxtbSrc, long cpSrc, long ccpSrc, long cpDst, long ccpDel, ulong grfdoc = fdocUpdate); virtual bool FGetObjectRc(long cp, PGNV pgnv, PCHP pchp, RC *prc); virtual bool FDrawObject(long cp, PGNV pgnv, long *pxp, long yp, PCHP pchp, RC *prcClip); virtual bool FGetFni(FNI *pfni); virtual void HideSel(void); virtual void SetSel(long cp1, long cp2, long gin = kginDraw); virtual void ShowSel(void); virtual void SuspendUndo(void); virtual void ResumeUndo(void); virtual bool FSetUndo(long cp1, long cp2, long ccpIns); virtual void CancelUndo(void); virtual void CommitUndo(void); virtual void BumpCombineUndo(void); virtual bool FFind(achar *prgch, long cch, long cpStart, long *pcpMin, long *pcpLim, bool fCaseSensitive = fFalse); virtual void ExportFormats(PCLIP pclip); }; /*************************************************************************** Plain text document class ***************************************************************************/ typedef class TXPD *PTXPD; #define TXPD_PAR TXTB #define kclsTXPD 'TXPD' class TXPD : public TXPD_PAR { RTCLASS_DEC protected: TXPD(PDOCB pdocb = pvNil, ulong grfdoc = fdocNil); public: static PTXPD PtxpdNew(PFNI pfni = pvNil, PBSF pbsf = pvNil, short osk = koskCur, PDOCB pdocb = pvNil, ulong grfdoc = fdocNil); virtual PDDG PddgNew(PGCB pgcb); virtual bool FSaveToFni(FNI *pfni, bool fSetFni); }; /*************************************************************************** Rich text document class. ***************************************************************************/ const long kcpMaxTxrd = 0x00800000; // 8MB typedef class RTUN *PRTUN; typedef class TXRD *PTXRD; #define TXRD_PAR TXTB #define kclsTXRD 'TXRD' class TXRD : public TXRD_PAR { RTCLASS_DEC ASSERT MARKMEM protected: // WARNING: changing these values affects the file format // NOTE: Originally, _FSprmInAg was a virtual TXRD method called to // determine if a sprm stored its value in the AG. This didn't work // well when a subclass had a sprm in an AG (it broke undo for that // sprm). To fix this I (shonk) made _FSprmInAg static and made it // know exactly which sprms use the AG. For sprms in the client range // or above sprmMinObj, odd ones are _not_ in the AG and even ones _are_ // in the AG. I couldn't just use the odd/even rule throughout the // range, because that would have required changing values of old // sprms, which would have broken existing rich text documents. enum { sprmNil = 0, // character properties sprmMinChp = 1, sprmStyle = 1, // bold, italic, etc, font size, dypOffset sprmFont = 2, // font - in the AG sprmForeColor = 3, // foreground color sprmBackColor = 4, // background color sprmLimChp, // client character properties start at 64 sprmMinChpClient = 64, // for subclassed character properties // paragraph properties sprmMinPap = 128, sprmHorz = 128, // justification, indenting and dxpTab sprmVert = 129, // numLine and dypExtraLine sprmAfter = 130, // numAfter and dypExtraAfter sprmLimPap, // client paragraph properties sprmMinPapClient = 160, // for subclassed paragraph properties // objects - these apply to a single character, not a range sprmMinObj = 192, sprmObject = 192, }; // map property entry struct MPE { ulong spcp; // sprm in the high byte and cp in the low 3 bytes long lw; // the associated value - meaning depends on the sprm, // but 0 is _always_ the default }; // sprm, value, mask triple struct SPVM { byte sprm; long lw; long lwMask; }; // rich text document properties struct RDOP { short bo; short oskFont; long dxpDef; long dypFont; long lwAcrBack; // byte rgbStnFont[]; font name }; #define kbomRdop 0x5FC00000 PCFL _pcfl; PGL _pglmpe; PAG _pagcact; // for sprm's that have more than a long's worth of data long _onnDef; // default font and font size long _dypFontDef; short _oskFont; // osk for the default font STN _stnFontDef; // name of default font // cached CHP and PAP (from FetchChp and FetchPap) CHP _chp; long _cpMinChp, _cpLimChp; PAP _pap; long _cpMinPap, _cpLimPap; // current undo record PRTUN _prtun; TXRD(PDOCB pdocb = pvNil, ulong grfdoc = fdocNil); ~TXRD(void); bool _FInit(PFNI pfni = pvNil, CTG ctg = kctgRichText); virtual bool _FReadChunk(PCFL pcfl, CTG ctg, CNO cno, bool fCopyText); virtual bool _FOpenArg(long icact, byte sprm, short bo, short osk); ulong _SpcpFromSprmCp(byte sprm, long cp) { return ((ulong)sprm << 24) | (cp & 0x00FFFFFF); } byte _SprmFromSpcp(ulong spcp) { return B3Lw(spcp); } long _CpFromSpcp(ulong spcp) { return (long)(spcp & 0x00FFFFFF); } bool _FFindMpe(ulong spcp, MPE *pmpe, long *pcpLim = pvNil, long *pimpe = pvNil); bool _FFetchProp(long impe, byte *psprm, long *plw = pvNil, long *pcpMin = pvNil, long *pcpLim = pvNil); bool _FEnsureInAg(byte sprm, void *pv, long cb, long *pjv); void _ReleaseInAg(long jv); void _AddRefInAg(long jv); void _ReleaseSprmLw(byte sprm, long lw); void _AddRefSprmLw(byte sprm, long lw); tribool _TGetLwFromChp(byte sprm, PCHP pchpNew, PCHP pchpOld, long *plw, long *plwMask); tribool _TGetLwFromPap(byte sprm, PPAP ppapNew, PPAP ppapOld, long *plw, long *plwMask); bool _FGetRgspvmFromChp(PCHP pchp, PCHP pchpDiff, SPVM *prgspvm, long *pcspvm); bool _FGetRgspvmFromPap(PPAP ppap, PPAP ppapDiff, SPVM *prgspvm, long *pcspvm); void _ReleaseRgspvm(SPVM *prgspvm, long cspvm); void _ApplyRgspvm(long cp, long ccp, SPVM *prgspvm, long cspvm); void _GetParaBounds(long *pcpMin, long *pccp, bool fExpand); void _AdjustMpe(long cp, long ccpIns, long ccpDel); void _CopyProps(PTXRD ptxrd, long cpSrc, long cpDst, long ccpSrc, long ccpDst, byte sprmMin, byte sprmLim); virtual bool _FGetObjectRc(long icact, byte sprm, PGNV pgnv, PCHP pchp, RC *prc); virtual bool _FDrawObject(long icact, byte sprm, PGNV pgnv, long *pxp, long yp, PCHP pchp, RC *prcClip); bool _FReplaceCore(void *prgch, PFLO pflo, bool fCopy, PBSF pbsf, long cpSrc, long ccpIns, long cp, long ccpDel, PCHP pchp, PPAP ppap, ulong grfdoc); static bool _FSprmInAg(byte sprm); public: static PTXRD PtxrdNew(PFNI pfni = pvNil); static PTXRD PtxrdReadChunk(PCFL pcfl, CTG ctg, CNO cno, bool fCopyText = fTrue); virtual PDDG PddgNew(PGCB pgcb); void FetchChp(long cp, PCHP pchp, long *pcpMin = pvNil, long *pcpLim = pvNil); void FetchPap(long cp, PPAP ppap, long *pcpMin = pvNil, long *pcpLim = pvNil); bool FApplyChp(long cp, long ccp, PCHP pchp, PCHP pchpDiff = pvNil, ulong grfdoc = fdocUpdate); bool FApplyPap(long cp, long ccp, PPAP ppap, PPAP ppapDiff, long *pcpMin = pvNil, long *pcpLim = pvNil, bool fExpand = fTrue, ulong grfdoc = fdocUpdate); virtual bool FReplaceRgch(void *prgch, long ccpIns, long cp, long ccpDel, ulong grfdoc = fdocUpdate); virtual bool FReplaceFlo(PFLO pflo, bool fCopy, long cp, long ccpDel, short osk = koskCur, ulong grfdoc = fdocUpdate); virtual bool FReplaceBsf(PBSF pbsfSrc, long cpSrc, long ccpSrc, long cpDst, long ccpDel, ulong grfdoc = fdocUpdate); virtual bool FReplaceTxtb(PTXTB ptxtbSrc, long cpSrc, long ccpSrc, long cpDst, long ccpDel, ulong grfdoc = fdocUpdate); bool FReplaceRgch(void *prgch, long ccpIns, long cp, long ccpDel, PCHP pchp, PPAP ppap = pvNil, ulong grfdoc = fdocUpdate); bool FReplaceFlo(PFLO pflo, bool fCopy, long cp, long ccpDel, PCHP pchp, PPAP ppap = pvNil, short osk = koskCur, ulong grfdoc = fdocUpdate); bool FReplaceBsf(PBSF pbsfSrc, long cpSrc, long ccpSrc, long cpDst, long ccpDel, PCHP pchp, PPAP ppap = pvNil, ulong grfdoc = fdocUpdate); bool FReplaceTxtb(PTXTB ptxtbSrc, long cpSrc, long ccpSrc, long cpDst, long ccpDel, PCHP pchp, PPAP ppap = pvNil, ulong grfdoc = fdocUpdate); bool FReplaceTxrd(PTXRD ptxrd, long cpSrc, long ccpSrc, long cpDst, long ccpDel, ulong grfdoc = fdocUpdate); bool FFetchObject(long cpMin, long *pcp, void **ppv = pvNil, long *pcb = pvNil); virtual bool FInsertObject(void *pv, long cb, long cp, long ccpDel, PCHP pchp = pvNil, ulong grfdoc = fdocUpdate); virtual bool FApplyObjectProps(void *pv, long cb, long cp, ulong grfdoc = fdocUpdate); virtual bool FGetObjectRc(long cp, PGNV pgnv, PCHP pchp, RC *prc); virtual bool FDrawObject(long cp, PGNV pgnv, long *pxp, long yp, PCHP pchp, RC *prcClip); virtual bool FGetFni(FNI *pfni); virtual bool FGetFniSave(FNI *pfni); virtual bool FSaveToFni(FNI *pfni, bool fSetFni); virtual bool FSaveToChunk(PCFL pcfl, CKI *pcki, bool fRedirectText = fFalse); virtual bool FSetUndo(long cp1, long cp2, long ccpIns); virtual void CancelUndo(void); virtual void CommitUndo(void); }; /*************************************************************************** Rich text undo object. ***************************************************************************/ typedef class RTUN *PRTUN; #define RTUN_PAR UNDB #define kclsRTUN 'RTUN' class RTUN : public RTUN_PAR { RTCLASS_DEC ASSERT MARKMEM protected: long _cactCombine; // RTUNs with different values can't be combined PTXRD _ptxrd; // copy of replaced text long _cpMin; // where the text came from in the original RTXD long _ccpIns; // how many characters the original text was replaced with public: static PRTUN PrtunNew(long cactCombine, PTXRD ptxrd, long cp1, long cp2, long ccpIns); ~RTUN(void); virtual bool FUndo(PDOCB pdocb); virtual bool FDo(PDOCB pdocb); bool FCombine(PRTUN prtun); }; /*************************************************************************** Text document display GOB - DDG for a TXTB. ***************************************************************************/ const long kdxpIndentTxtg = (kdzpInch / 8); const long kcchMaxLineTxtg = 512; typedef class TRUL *PTRUL; enum { ftxtgNil = 0, ftxtgNoColor = 1, }; typedef class TXTG *PTXTG; #define TXTG_PAR DDG #define kclsTXTG 'TXTG' class TXTG : public TXTG_PAR { RTCLASS_DEC ASSERT MARKMEM protected: // line information struct LIN { long cpMin; // the cp of the first character in this line long dypTot; // the total height of lines up to this line short ccp; short xpLeft; short dyp; short dypAscent; }; PTXTB _ptxtb; PGL _pgllin; long _ilinDisp; long _cpDisp; long _dypDisp; long _ilinInval; // LINs from here on have wrong cpMin and dypTot values PGNV _pgnv; // the selection long _cpAnchor; long _cpOther; ulong _tsSel; long _xpSel; bool _fSelOn : 1; bool _fXpValid : 1; bool _fMark : 1; bool _fClear : 1; bool _fSelByWord : 1; // the ruler PTRUL _ptrul; TXTG(PTXTB ptxtb, PGCB pgcb); ~TXTG(void); virtual bool _FInit(void); virtual void _Activate(bool fActive); virtual long _DxpDoc(void); virtual void _FetchChp(long cp, PCHP pchp, long *pcpMin = pvNil, long *pcpLim = pvNil) = 0; virtual void _FetchPap(long cp, PPAP ppap, long *pcpMin = pvNil, long *pcpLim = pvNil) = 0; void _CalcLine(long cpMin, long dyp, LIN *plin); void _Reformat(long cp, long ccpIns, long ccpDel, long *pyp = pvNil, long *pdypIns = pvNil, long *pdypDel = pvNil); void _ReformatAndDraw(long cp, long ccpIns, long ccpDel); void _FetchLin(long ilin, LIN *plin, long *pilinActual = pvNil); void _FindCp(long cpFind, LIN *plin, long *pilin = pvNil, bool fCalcLines = fTrue); void _FindDyp(long dypFind, LIN *plin, long *pilin = pvNil, bool fCalcLines = fTrue); bool _FGetCpFromPt(long xp, long yp, long *pcp, bool fClosest = fTrue); bool _FGetCpFromXp(long xp, LIN *plin, long *pcp, bool fClosest = fTrue); void _GetXpYpFromCp(long cp, long *pypMin, long *pypLim, long *pxp, long *pdypBaseLine = pvNil, bool fView = fTrue); long _DxpFromCp(long cpLine, long cp); void _SwitchSel(bool fOn, long gin = kginDraw); void _InvertSel(PGNV pgnv, long gin = kginDraw); void _InvertCpRange(PGNV pgnv, long cp1, long cp2, long gin = kginDraw); virtual long _ScvMax(bool fVert); virtual void _Scroll(long scaHorz, long scaVert, long scvHorz = 0, long scvVert = 0); virtual void _ScrollDxpDyp(long dxp, long dyp); virtual long _DypTrul(void); virtual PTRUL _PtrulNew(PGCB pgcb); virtual void _DrawLinExtra(PGNV pgnv, RC *prcClip, LIN *plin, long dxp, long yp, ulong grftxtg); public: virtual void DrawLines(PGNV pgnv, RC *prcClip, long dxp, long dyp, long ilinMin, long ilinLim = klwMax, ulong grftxtg = ftxtgNil); virtual void Draw(PGNV pgnv, RC *prcClip); virtual bool FCmdTrackMouse(PCMD_MOUSE pcmd); virtual bool FCmdKey(PCMD_KEY pcmd); virtual bool FCmdSelIdle(PCMD pcmd); virtual void InvalCp(long cp, long ccpIns, long ccpDel); virtual void HideSel(void); virtual void GetSel(long *pcpAnchor, long *pcpOther); virtual void SetSel(long cpAnchor, long cpOther, long gin = kginDraw); virtual bool FReplace(achar *prgch, long cch, long cp1, long cp2); void ShowSel(void); PTXTB Ptxtb(void) { return _ptxtb; } virtual void ShowRuler(bool fShow = fTrue); virtual void SetDxpTab(long dxp); virtual void SetDxpDoc(long dxp); virtual void GetNaturalSize(long *pdxp, long *pdyp); }; /*************************************************************************** Line text document display gob ***************************************************************************/ typedef class TXLG *PTXLG; #define TXLG_PAR TXTG #define kclsTXLG 'TXLG' class TXLG : public TXLG_PAR { RTCLASS_DEC protected: // the font long _onn; ulong _grfont; long _dypFont; long _dxpChar; long _cchTab; TXLG(PTXTB ptxtb, PGCB pgcb, long onn, ulong grfont, long dypFont, long cchTab); virtual long _DxpDoc(void); virtual void _FetchChp(long cp, PCHP pchp, long *pcpMin = pvNil, long *pcpLim = pvNil); virtual void _FetchPap(long cp, PPAP ppap, long *pcpMin = pvNil, long *pcpLim = pvNil); // clipboard support virtual bool _FCopySel(PDOCB *ppdocb = pvNil); virtual void _ClearSel(void); virtual bool _FPaste(PCLIP pclip, bool fDoIt, long cid); public: static PTXLG PtxlgNew(PTXTB ptxtb, PGCB pgcb, long onn, ulong grfont, long dypFont, long cchTab); virtual void SetDxpTab(long dxp); virtual void SetDxpDoc(long dxp); }; /*************************************************************************** Rich text document display gob ***************************************************************************/ typedef class TXRG *PTXRG; #define TXRG_PAR TXTG #define kclsTXRG 'TXRG' class TXRG : public TXRG_PAR { RTCLASS_DEC CMD_MAP_DEC(TXRG) ASSERT protected: TXRG(PTXRD ptxrd, PGCB pgcb); CHP _chpIns; bool _fValidChp; virtual void _FetchChp(long cp, PCHP pchp, long *pcpMin = pvNil, long *pcpLim = pvNil); virtual void _FetchPap(long cp, PPAP ppap, long *pcpMin = pvNil, long *pcpLim = pvNil); virtual bool _FGetOtherSize(long *pdypFont); virtual bool _FGetOtherSubSuper(long *pdypOffset); // clipboard support virtual bool _FCopySel(PDOCB *ppdocb = pvNil); virtual void _ClearSel(void); virtual bool _FPaste(PCLIP pclip, bool fDoIt, long cid); void _FetchChpSel(long cp1, long cp2, PCHP pchp); void _EnsureChpIns(void); public: static PTXRG PtxrgNew(PTXRD ptxrd, PGCB pgcb); virtual void SetSel(long cpAnchor, long cpOther, long gin = kginDraw); virtual bool FReplace(achar *prgch, long cch, long cp1, long cp2); virtual bool FApplyChp(PCHP pchp, PCHP pchpDiff = pvNil); virtual bool FApplyPap(PPAP ppap, PPAP ppapDiff = pvNil, bool fExpand = fTrue); virtual bool FCmdApplyProperty(PCMD pcmd); virtual bool FEnablePropCmd(PCMD pcmd, ulong *pgrfeds); bool FSetColor(ACR *pacrFore, ACR *pacrBack); virtual void SetDxpTab(long dxp); }; /*************************************************************************** The ruler for a rich text document. ***************************************************************************/ typedef class TRUL *PTRUL; #define TRUL_PAR GOB #define kclsTRUL 'TRUL' class TRUL : public TRUL_PAR { RTCLASS_DEC protected: TRUL(GCB *pgcb) : TRUL_PAR(pgcb) { } public: virtual void SetDxpTab(long dxpTab) = 0; virtual void SetDxpDoc(long dxpDoc) = 0; virtual void SetXpLeft(long xpLeft) = 0; }; #endif //! RTXT_H ================================================ FILE: kauai/src/rtxt2.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Rich text document and associated DDG, continued ***************************************************************************/ #include "frame.h" ASSERTNAME RTCLASS(TRUL) const long kdxpMax = 0x01000000; /*************************************************************************** Character run data. ***************************************************************************/ typedef struct CHRD *PCHRD; struct CHRD { long cpLim; long cpLimDraw; long xpLim; long xpLimDraw; }; /*************************************************************************** Character run class. This is used to format a line, draw a line, map between cp and xp on a line, etc. ***************************************************************************/ const long kcchMaxChr = 128; class CHR { ASSERT private: CHP _chp; PAP _pap; PTXTB _ptxtb; PGNV _pgnv; bool _fMustAdvance : 1; bool _fBreak : 1; bool _fObject : 1; long _cpMin; long _cpLim; long _cpLimFetch; long _xpMin; long _xpBreak; CHRD _chrd; CHRD _chrdBop; long _dypAscent; long _dypDescent; achar _rgch[kcchMaxChr]; bool _FFit(void); void _SetToBop(void); void _SkipIgnores(void); void _DoTab(void); public: void Init(CHP *pchp, PAP *ppap, PTXTB ptxtb, PGNV pgnv, long cpMin, long cpLim, long xpBase, long xpLimLine, long xpBreak); void GetNextRun(bool fMustAdvance = fFalse); bool FBreak(void) { return _fBreak; } void GetChrd(PCHRD pchrd, PCHRD pchrdBop = pvNil) { AssertNilOrVarMem(pchrd); AssertNilOrVarMem(pchrdBop); if (pvNil != pchrd) *pchrd = _chrd; if (pvNil != pchrdBop) *pchrdBop = _chrdBop; } long DypAscent(void) { return _dypAscent; } long DypDescent(void) { return _dypDescent; } long XpMin(void) { return _xpMin; } long XpBreak(void) { return _xpBreak; } achar *Prgch(void) { return _rgch; } long CpMin(void) { return _cpMin; } bool FObject(void) { return _fObject; } }; #ifdef DEBUG /*************************************************************************** Assert the validity of a CHR. ***************************************************************************/ void CHR::AssertValid(ulong grf) { AssertThisMem(); AssertPo(_ptxtb, 0); AssertPo(_pgnv, 0); } #endif // DEBUG /*************************************************************************** Initialize the CHR. ***************************************************************************/ void CHR::Init(CHP *pchp, PAP *ppap, PTXTB ptxtb, PGNV pgnv, long cpMin, long cpLim, long xpBase, long xpLimLine, long xpBreak) { AssertVarMem(pchp); AssertVarMem(ppap); AssertPo(ptxtb, 0); AssertPo(pgnv, 0); AssertIn(cpMin, 0, ptxtb->CpMac()); AssertIn(cpLim, cpMin + 1, ptxtb->CpMac() + 1); Assert(xpBase <= xpLimLine, "xpBase > xpLimLine"); RC rc; _chp = *pchp; _pap = *ppap; _ptxtb = ptxtb; _pgnv = pgnv; _fBreak = fFalse; _cpMin = cpMin; _cpLim = cpLim; _cpLimFetch = cpMin; _xpMin = xpBase; _xpBreak = LwMin(xpBreak, xpLimLine); // apply any indenting if (0 == xpBase) { switch (_pap.nd) { case ndFirst: if (_ptxtb->FMinPara(_cpMin)) _xpMin += _pap.dxpTab; break; case ndRest: if (!_ptxtb->FMinPara(_cpMin)) _xpMin += _pap.dxpTab; break; case ndAll: _xpMin += _pap.dxpTab; break; } } if (ndAll == _pap.nd) _xpBreak = LwMin(_xpBreak, xpLimLine - _pap.dxpTab); _chrd.cpLim = _chrd.cpLimDraw = _cpMin; _chrd.xpLim = _chrd.xpLimDraw = _xpMin; _chrdBop = _chrd; // get the vertical dimensions _pgnv->SetFont(_chp.onn, _chp.grfont, _chp.dypFont, tahLeft, tavBaseline); #ifndef SOC_BUG_1500 // REVIEW shonk: Win95 bug workaround // If we don't draw to the _pgnv before getting the metrics, the metrics // can be different than after we draw! achar ch = kchSpace; _pgnv->DrawRgch(&ch, 1, 0, 0); #endif //! REVIEW _pgnv->GetRcFromRgch(&rc, pvNil, 0); _dypAscent = LwMax(0, -rc.ypTop - _chp.dypOffset); _dypDescent = LwMax(0, rc.ypBottom + _chp.dypOffset); AssertThis(0); } /*************************************************************************** Get the next run (within the bounds we were inited with). ***************************************************************************/ void CHR::GetNextRun(bool fMustAdvance) { AssertThis(0); ulong grfch; achar ch; RC rc; // Start the next run if (FIn(_chrd.cpLim, _cpMin + 1, _cpLimFetch)) BltPb(_rgch + _chrd.cpLim - _cpMin, _rgch, _cpLimFetch - _chrd.cpLim); _cpMin = _chrd.cpLimDraw = _chrd.cpLim; _xpMin = _chrd.xpLimDraw = _chrd.xpLim; _xpBreak = LwMax(_xpBreak, _xpMin); _chrdBop = _chrd; if (_cpMin >= _cpLim) return; // Refill the buffer if (_cpLimFetch < _cpLim && _cpLimFetch < _cpMin + kcchMaxChr) { long cpFetch = LwMax(_cpMin, _cpLimFetch); _cpLimFetch = LwMin(kcchMaxChr, _cpLim - _cpMin) + _cpMin; _ptxtb->FetchRgch(cpFetch, _cpLimFetch - cpFetch, _rgch + cpFetch - _cpMin); } _fMustAdvance = FPure(fMustAdvance); _fBreak = fFalse; _fObject = fFalse; _pgnv->SetFont(_chp.onn, _chp.grfont, _chp.dypFont, tahLeft, tavBaseline); for (;;) { if (_chrd.cpLim >= _cpLimFetch || (fchIgnore & (grfch = GrfchFromCh(ch = _rgch[_chrd.cpLim - _cpMin])))) { // we're out of characters or this is an ignoreable character - // return the run if (!_FFit()) _SetToBop(); else _SkipIgnores(); break; } if (grfch & fchTab) { // handle the string of tabs, then return the run _DoTab(); break; } if (grfch & fchBreak) { // This line must break after this character - return the run. if (!_FFit()) { _SetToBop(); break; } _chrd.cpLim++; _SkipIgnores(); // this is a BOP _chrdBop = _chrd; _fBreak = fTrue; break; } if (grfch & fchMayBreak) { _chrd.cpLimDraw = ++_chrd.cpLim; if (_FFit()) { // this is a BOP _chrdBop = _chrd; continue; } _fBreak = fTrue; if (grfch & fchWhiteOverhang) { // see if everything but this character fits long xp = _chrd.xpLim; _chrd.cpLimDraw--; if (_FFit()) { // fits with the overhang _chrd.xpLim = xp; _chrdBop = _chrd; _SkipIgnores(); break; } } _SetToBop(); break; } if (kchObject == ch) { // this is an object character if (_chrd.cpLim > _cpMin) { // return the run before processing the object - objects // go in their own run. if (!_FFit()) _SetToBop(); else _chrdBop = _chrd; break; } // return just the object (if it really is an object) if (!_ptxtb->FGetObjectRc(_chrd.cpLim, _pgnv, &_chp, &rc)) { // treat as a normal character _chrd.cpLimDraw = ++_chrd.cpLim; continue; } rc.Offset(0, _chp.dypOffset); Assert(!rc.FEmpty() && rc.xpRight >= 0, "bad rectangle for the object"); if (fMustAdvance || _xpMin + rc.xpRight <= _xpBreak) { _fObject = fTrue; _chrd.cpLimDraw = ++_chrd.cpLim; _chrd.xpLim = _chrd.xpLimDraw = _xpMin + rc.xpRight; _chrdBop = _chrd; _dypAscent = LwMax(_dypAscent, -rc.ypTop); _dypDescent = LwMax(_dypDescent, rc.ypBottom); if (_xpMin + rc.xpRight >= _xpBreak) _fBreak = fTrue; _SkipIgnores(); } break; } // normal character _chrd.cpLimDraw = ++_chrd.cpLim; } AssertThis(0); } /*************************************************************************** Test whether everything from _cpMin to _chrd.cpLimDraw fits. Assumes the font is set in the _pgnv. ***************************************************************************/ bool CHR::_FFit(void) { AssertThis(0); RC rc; if (_chrd.cpLimDraw == _cpMin) _chrd.xpLim = _chrd.xpLimDraw = _xpMin; else { _pgnv->GetRcFromRgch(&rc, _rgch, _chrd.cpLimDraw - _cpMin); _chrd.xpLim = _chrd.xpLimDraw = _xpMin + rc.Dxp(); } return _chrd.xpLimDraw <= _xpBreak; } /*************************************************************************** Set the CHR to the last break opportunity. If there wasn't one and _fMustAdvance is true, gobble as many characters as we can, but at least one. ***************************************************************************/ void CHR::_SetToBop(void) { AssertThis(0); _fBreak = fTrue; if (_chrdBop.cpLim <= _cpMin && _fMustAdvance) { // no break opportunity seen - gobble as many characters as we can, // but at least one. // do a binary search for the character to break at Assert(_chrd.cpLimDraw > _cpMin, "why is _chrd.cpLimDraw == _cpMin?"); RC rc; long ivMin, ivLim, iv; long dxp = _xpBreak - _xpMin; for (ivMin = 0, ivLim = _chrd.cpLimDraw - _cpMin; ivMin < ivLim;) { iv = (ivMin + ivLim) / 2 + 1; AssertIn(iv, ivMin + 1, ivLim + 1); _pgnv->GetRcFromRgch(&rc, _rgch, iv); if (rc.Dxp() <= dxp) ivMin = iv; else ivLim = iv - 1; } AssertIn(ivMin, 0, _chrd.cpLimDraw - _cpMin + 1); if (ivMin == 0) { // nothing fits - use one character ivMin = 1; } // set _chrd.cpLim and _chrd.cpLimDraw, then set the _xp values _chrd.cpLim = _chrd.cpLimDraw = _cpMin + ivMin; _FFit(); } else _chrd = _chrdBop; _SkipIgnores(); } /*************************************************************************** Skip any trailing ignore characters. Just changes _chrd.cpLim. ***************************************************************************/ void CHR::_SkipIgnores(void) { AssertThis(0); while (_chrd.cpLim < _cpLimFetch && (fchIgnore & GrfchFromCh(_rgch[_chrd.cpLim - _cpMin]))) { _chrd.cpLim++; } if (_chrd.cpLim == _cpLimFetch) { achar ch; long cpMac = _ptxtb->CpMac(); while (_chrd.cpLim < cpMac) { _ptxtb->FetchRgch(_chrd.cpLim, 1, &ch); if (!(fchIgnore & GrfchFromCh(ch))) return; _chrd.cpLim++; } } } /*************************************************************************** Swallow as many tabs as possible. ***************************************************************************/ void CHR::_DoTab(void) { AssertThis(0); if (!_FFit()) { _SetToBop(); return; } while (_chrd.cpLim < _cpLimFetch && (fchTab & GrfchFromCh(_rgch[_chrd.cpLim - _cpMin]))) { _chrd.cpLim++; _chrd.xpLim = LwRoundAway(_chrd.xpLim + 1, _pap.dxpTab); if (_chrd.xpLim > _xpBreak) { // this tab would carry us over the edge. if (_chrd.cpLim == _cpMin + 1 && _fMustAdvance) { // the line is empty, so we have to force the tab onto the line _SkipIgnores(); _fBreak = fTrue; } else _SetToBop(); return; } // this is a BOP _chrd.xpLimDraw = _chrd.xpLim; _chrdBop = _chrd; } _SkipIgnores(); } /*************************************************************************** Constructor for the text document display GOB. ***************************************************************************/ TXTG::TXTG(PTXTB ptxtb, PGCB pgcb) : TXTG_PAR(ptxtb, pgcb) { AssertBaseThis(0); _ptxtb = ptxtb; _fMark = (kginMark == pgcb->_gin || kginDefault == pgcb->_gin && kginMark == GOB::GinDefault()); _pgnv = pvNil; } /*************************************************************************** Destructor for TXTG. ***************************************************************************/ TXTG::~TXTG(void) { AssertBaseThis(0); ReleasePpo(&_pgllin); ReleasePpo(&_pgnv); } #ifdef DEBUG /*************************************************************************** Assert the validity of a TXTG. ***************************************************************************/ void TXTG::AssertValid(ulong grf) { TXTG_PAR::AssertValid(0); AssertPo(_pgllin, 0); AssertIn(_ilinInval, 0, _pgllin->IvMac() + 1); AssertPo(_pgnv, 0); AssertNilOrPo(_ptrul, 0); // REVIEW shonk: TXTG::AssertValid: fill out. } /*************************************************************************** Mark memory for the TXTG. ***************************************************************************/ void TXTG::MarkMem(void) { AssertValid(0); TXTG_PAR::MarkMem(); MarkMemObj(_pgllin); MarkMemObj(_pgnv); } #endif // DEBUG /*************************************************************************** Initialize the text document display gob. ***************************************************************************/ bool TXTG::_FInit(void) { AssertBaseThis(0); PGPT pgpt; if (!TXTG_PAR::_FInit()) return fFalse; if (pvNil == (_pgllin = GL::PglNew(size(LIN)))) return fFalse; // Allocate the GNV for formatting. Use an offscreen one iff _fMark // is set. if (_fMark) { RC rc(0, 0, 1, 1); if (pvNil == (pgpt = GPT::PgptNewOffscreen(&rc, 8))) return fFalse; } else { pgpt = Pgpt(); pgpt->AddRef(); } _pgnv = NewObj GNV(this, pgpt); ReleasePpo(&pgpt); if (pvNil == _pgnv) return fFalse; _pgllin->SetMinGrow(20); _ilinDisp = 0; _cpDisp = 0; _dypDisp = 0; _ilinInval = 0; if (_DxpDoc() > 0) { long cpMac = _ptxtb->CpMac(); _Reformat(0, cpMac, cpMac); } AssertThis(0); return fTrue; } /*************************************************************************** Deactivate the TXTG - turn off the selection. ***************************************************************************/ void TXTG::_Activate(bool fActive) { AssertThis(0); TXTG_PAR::_Activate(fActive); if (!fActive) _SwitchSel(fFalse, kginSysInval); } /*************************************************************************** Get the LIN for the given ilin. If ilin is past the end of _pgllin, _CalcLine is called repeatedly and new lines are added to _pgllin. The actual index of the returned line is put in *pilinActual (if not nil). ***************************************************************************/ void TXTG::_FetchLin(long ilin, LIN *plin, long *pilinActual) { AssertThis(0); AssertIn(ilin, 0, kcbMax); AssertVarMem(plin); AssertNilOrVarMem(pilinActual); long cpLim, cpMac; long dypTot; LIN *qlin; bool fAdd; long ilinLim = LwMin(_pgllin->IvMac(), ilin + 1); if (pvNil != pilinActual) *pilinActual = ilin; if (_ilinInval < ilinLim) { qlin = (LIN *)_pgllin->QvGet(_ilinInval); if (_ilinInval == 0) { cpLim = 0; dypTot = 0; } else { qlin--; cpLim = qlin->cpMin + qlin->ccp; dypTot = qlin->dypTot + qlin->dyp; qlin++; } // adjust LINs up to ilinLim for (; _ilinInval < ilinLim; _ilinInval++, qlin++) { qlin->cpMin = cpLim; qlin->dypTot = dypTot; cpLim += qlin->ccp; dypTot += qlin->dyp; } } Assert(_ilinInval >= ilinLim, 0); if (ilin < _ilinInval) { *plin = *(LIN *)_pgllin->QvGet(ilin); return; } Assert(ilinLim == _pgllin->IvMac(), 0); if (ilinLim == 0) { cpLim = 0; dypTot = 0; ClearPb(plin, size(LIN)); } else { // get the LIN in case we don't actuall calc any lines below *plin = *(LIN *)_pgllin->QvGet(ilinLim - 1); cpLim = plin->cpMin + plin->ccp; dypTot = plin->dypTot + plin->dyp; } cpMac = _ptxtb->CpMac(); fAdd = fTrue; for (; ilinLim <= ilin && cpLim < cpMac; ilinLim++) { _CalcLine(cpLim, dypTot, plin); fAdd = fAdd && _pgllin->FAdd(plin); cpLim += plin->ccp; dypTot += plin->dyp; } _ilinInval = _pgllin->IvMac(); if (pvNil != pilinActual) *pilinActual = ilinLim - 1; } /*************************************************************************** Find the LIN that contains the given cpFind. pilin and/or plin can be nil. If fCalcLines is false, we won't calculate any new lines and the returned LIN may be before cpFind. ***************************************************************************/ void TXTG::_FindCp(long cpFind, LIN *plin, long *pilin, bool fCalcLines) { AssertThis(0); AssertIn(cpFind, 0, _ptxtb->CpMac()); AssertNilOrVarMem(pilin); AssertNilOrVarMem(plin); LIN *qlin; LIN lin; long dypTot; long cpLim; long ilinMac; bool fAdd; // get the starting cp and dypTot values for _ilinInval qlin = (LIN *)_pgllin->QvGet(_ilinInval); if (_ilinInval == 0) { cpLim = 0; dypTot = 0; } else { qlin--; cpLim = qlin->cpMin + qlin->ccp; dypTot = qlin->dypTot + qlin->dyp; qlin++; } if (cpFind < cpLim) { // do a binary search to find the LIN containing cpFind long ivMin, ivLim, iv; for (ivMin = 0, ivLim = _ilinInval; ivMin < ivLim;) { iv = (ivMin + ivLim) / 2; qlin = (LIN *)_pgllin->QvGet(iv); if (cpFind < qlin->cpMin) ivLim = iv; else if (cpFind >= qlin->cpMin + qlin->ccp) ivMin = iv + 1; else { if (pvNil != pilin) *pilin = iv; if (pvNil != plin) *plin = *qlin; return; } } Bug("Invalid LINs"); cpLim = 0; dypTot = 0; _ilinInval = 0; } Assert(cpFind >= cpLim, "why isn't cpFind >= cpLim?"); if (_ilinInval < (ilinMac = _pgllin->IvMac())) { // adjust LINs up to cpFind qlin = (LIN *)_pgllin->QvGet(_ilinInval); for (; _ilinInval < ilinMac && cpFind >= cpLim; _ilinInval++, qlin++) { qlin->cpMin = cpLim; qlin->dypTot = dypTot; cpLim += qlin->ccp; dypTot += qlin->dyp; } if (cpFind < cpLim) { AssertIn(cpFind, qlin[-1].cpMin, cpLim); if (pvNil != pilin) *pilin = _ilinInval - 1; if (pvNil != plin) *plin = qlin[-1]; return; } } Assert(_ilinInval == ilinMac, "why isn't _ilinInval == ilinMac?"); Assert(cpFind >= cpLim, "why isn't cpFind >= cpLim?"); if (!fCalcLines) { if (pvNil != pilin) *pilin = ilinMac - (ilinMac > 0); if (pvNil != plin) { if (ilinMac > 0) *plin = *(LIN *)_pgllin->QvGet(ilinMac - 1); else ClearPb(plin, size(LIN)); } return; } // have to calculate some lines for (fAdd = fTrue; cpFind >= cpLim; ilinMac++) { _CalcLine(cpLim, dypTot, &lin); fAdd = fAdd && _pgllin->FAdd(&lin); cpLim += lin.ccp; dypTot += lin.dyp; } _ilinInval = _pgllin->IvMac(); if (pvNil != pilin) *pilin = ilinMac - 1; if (pvNil != plin) *plin = lin; } /*************************************************************************** Find the LIN that contains the given dypFind value (measured from the top of the document). pilin and/or plin can be nil. If fCalcLines is false, we won't calculate any new lines and the returned LIN may be before dypFind. ***************************************************************************/ void TXTG::_FindDyp(long dypFind, LIN *plin, long *pilin, bool fCalcLines) { AssertThis(0); AssertIn(dypFind, 0, kcbMax); AssertNilOrVarMem(pilin); AssertNilOrVarMem(plin); LIN *qlin; LIN lin; long dypTot; long cpLim, cpMac; long ilinMac; bool fAdd; // get the starting cp and dypTot values for _ilinInval qlin = (LIN *)_pgllin->QvGet(_ilinInval); if (_ilinInval == 0) { cpLim = 0; dypTot = 0; } else { qlin--; cpLim = qlin->cpMin + qlin->ccp; dypTot = qlin->dypTot + qlin->dyp; qlin++; } if (dypFind < dypTot) { // do a binary search to find the LIN containing dypFind long ivMin, ivLim, iv; for (ivMin = 0, ivLim = _ilinInval; ivMin < ivLim;) { iv = (ivMin + ivLim) / 2; qlin = (LIN *)_pgllin->QvGet(iv); if (dypFind < qlin->dypTot) ivLim = iv; else if (dypFind >= qlin->dypTot + qlin->dyp) ivMin = iv + 1; else { if (pvNil != pilin) *pilin = iv; if (pvNil != plin) *plin = *qlin; return; } } Bug("Invalid LINs"); cpLim = 0; dypTot = 0; _ilinInval = 0; } Assert(dypFind >= dypTot, "why isn't dypFind >= dypTot?"); if (_ilinInval < (ilinMac = _pgllin->IvMac())) { // adjust LINs up to cp qlin = (LIN *)_pgllin->QvGet(_ilinInval); for (; _ilinInval < ilinMac && dypFind >= dypTot; _ilinInval++, qlin++) { qlin->cpMin = cpLim; qlin->dypTot = dypTot; cpLim += qlin->ccp; dypTot += qlin->dyp; } if (dypFind < dypTot) { AssertIn(dypFind, qlin[-1].dypTot, dypTot); if (pvNil != pilin) *pilin = _ilinInval - 1; if (pvNil != plin) *plin = qlin[-1]; return; } } Assert(_ilinInval == ilinMac, "why isn't _ilinInval == ilinMac?"); Assert(dypFind >= dypTot, "why isn't dypFind >= dypTot?"); if (!fCalcLines) { if (pvNil != pilin) *pilin = ilinMac - (ilinMac > 0); if (pvNil != plin) { if (ilinMac > 0) *plin = *(LIN *)_pgllin->QvGet(ilinMac - 1); else ClearPb(plin, size(LIN)); } return; } cpMac = _ptxtb->CpMac(); if (cpLim >= cpMac) { if (pvNil != plin) { // Get a valid lin. if (ilinMac > 0) _pgllin->Get(ilinMac - 1, &lin); else ClearPb(&lin, size(LIN)); } _ilinInval = ilinMac; } else { Assert(dypFind >= dypTot && cpLim < cpMac, 0); for (fAdd = fTrue; dypFind >= dypTot && cpLim < cpMac; ilinMac++) { _CalcLine(cpLim, dypTot, &lin); fAdd = fAdd && _pgllin->FAdd(&lin); cpLim += lin.ccp; dypTot += lin.dyp; } _ilinInval = _pgllin->IvMac(); } if (pvNil != pilin) *pilin = ilinMac - 1; if (pvNil != plin) *plin = lin; } /*************************************************************************** Recalculate the _pgllin after an edit. Sets *pyp, *pdypIns, *pdypDel to indicate the vertical display space that was affected. ***************************************************************************/ void TXTG::_Reformat(long cp, long ccpIns, long ccpDel, long *pyp, long *pdypIns, long *pdypDel) { AssertThis(0); AssertIn(cp, 0, _ptxtb->CpMac()); AssertIn(ccpIns, 0, _ptxtb->CpMac() - cp + 1); AssertIn(ccpDel, 0, kcbMax); AssertNilOrVarMem(pyp); AssertNilOrVarMem(pdypIns); AssertNilOrVarMem(pdypDel); long ypDel, dypDel, dypIns, dypCur; long ccp, cpCur, cpNext, cpMac; long ilin, ilinOld; LIN linOld, lin, linT; _fClear = _ptxtb->AcrBack() == kacrClear; _fXpValid = fFalse; cpMac = _ptxtb->CpMac(); // Find the LIN that contains cp (if there is one) - don't calc any lines // to get the LIN. _FindCp(cp, &linOld, &ilinOld, fFalse); if (cp >= linOld.cpMin + linOld.ccp) { // the LIN for this cp was not cached - recalc from the beginning of // the last lin. ccpIns += cp - linOld.cpMin; ccpDel += cp - linOld.cpMin; cp = linOld.cpMin; } AssertIn(cp, linOld.cpMin, linOld.cpMin + linOld.ccp + (linOld.ccp == 0)); // make sure the previous line is formatted correctly if (ilinOld > 0 && !_ptxtb->FMinPara(linOld.cpMin)) { _FetchLin(ilinOld - 1, &lin); _CalcLine(lin.cpMin, lin.dypTot, &linT); if (linT.ccp != lin.ccp) { // edit affected previous line - so start // formatting from there ilinOld--; linOld = lin; } } AssertIn(cp, linOld.cpMin, cpMac); // remove deleted lines Assert(ilinOld <= _ilinInval, 0); _ilinInval = ilinOld; for (ccp = dypDel = 0; linOld.cpMin + ccp <= cp + ccpDel && ilinOld < _pgllin->IvMac();) { _pgllin->Get(ilinOld, &lin); dypDel += lin.dyp; ccp += lin.ccp; _pgllin->Delete(ilinOld); } // insert the new lines cpCur = linOld.cpMin; dypCur = linOld.dypTot; // cpNext is the cp of the next (possibly stale) LIN in _pgllin if (ilinOld < _pgllin->IvMac()) { cpNext = linOld.cpMin + ccp - ccpDel + ccpIns; AssertIn(cpNext, linOld.cpMin, cpMac + 1); } else cpNext = cpMac; AssertIn(ilinOld, 0, _pgllin->IvMac() + 1); dypIns = 0; for (ilin = ilinOld;;) { AssertIn(cpCur, linOld.cpMin, cpMac + 1); AssertIn(dypCur, linOld.dypTot, kcbMax); while (cpNext < cpCur && ilin < _pgllin->IvMac()) { _pgllin->Get(ilin, &lin); _pgllin->Delete(ilin); cpNext += lin.ccp; dypDel += lin.dyp; } AssertIn(cpNext, cpCur, cpMac + 1); if (ilin >= _pgllin->IvMac()) { // no more LINs that might be preservable, so we may as well // stop trying. ilin = _pgllin->IvMac(); if (cpNext < cpMac) dypDel = kswMax; if (cpCur < cpMac) dypIns = kswMax; break; } AssertIn(ilin, 0, _pgllin->IvMac()); if (cpCur == cpNext) { // everything from here on should be correct - we still need to // set _ilinDisp break; } _CalcLine(cpCur, dypCur, &lin); if (!_pgllin->FInsert(ilin, &lin)) { AssertIn(ilin, 0, _pgllin->IvMac()); _pgllin->Get(ilin, &linT); cpNext += linT.ccp; dypDel += linT.dyp; _pgllin->Put(ilin, &lin); } dypIns += lin.dyp; cpCur += lin.ccp; dypCur += lin.dyp; ilin++; } _ilinInval = ilin; if (_cpDisp <= linOld.cpMin) ypDel = linOld.dypTot - _dypDisp; else { if (_cpDisp > cp) { if (_cpDisp >= cp + ccpDel) _cpDisp += ccpIns - ccpDel; else if (_cpDisp >= cp + ccpIns) _cpDisp = cp + ccpIns; } ypDel = 0; _FindCp(_cpDisp, &lin, &_ilinDisp); _cpDisp = lin.cpMin; dypDel = LwMax(0, linOld.dypTot + dypDel - _dypDisp); _dypDisp = lin.dypTot; dypIns = LwMax(0, linOld.dypTot + dypIns - _dypDisp); } if (pvNil != pyp) *pyp = ypDel; if (pvNil != pdypIns) *pdypIns = dypIns; if (pvNil != pdypDel) *pdypDel = dypDel; } /*************************************************************************** Calculate the end of the line, the left position of the line, the height of the line and the ascent of the line. ***************************************************************************/ void TXTG::_CalcLine(long cpMin, long dypBase, LIN *plin) { AssertThis(0); AssertIn(cpMin, 0, _ptxtb->CpMac()); AssertVarMem(plin); struct RUN { long cpLim; long xpLim; long dypAscent; long dypDescent; }; long dxpDoc; PAP pap; CHP chp; long cpLimPap, cpLimChp; CHR chr; CHRD chrd, chrdBop; RUN run, runSure, runT; dxpDoc = _DxpDoc(); _FetchPap(cpMin, &pap, pvNil, &cpLimPap); cpLimChp = cpMin; run.cpLim = cpMin; run.xpLim = 0; run.dypAscent = run.dypDescent = 0; runSure = run; for (;;) { // make sure the chp is valid if (run.cpLim >= cpLimChp) { _FetchChp(run.cpLim, &chp, pvNil, &cpLimChp); cpLimChp = LwMin(cpLimChp, cpLimPap); if (cpLimChp <= run.cpLim) { Bug("why is run.cpLim >= cpLimChp?"); break; } chr.Init(&chp, &pap, _ptxtb, _pgnv, run.cpLim, cpLimChp, run.xpLim, dxpDoc, dxpDoc); } chr.GetNextRun(runSure.cpLim == cpMin); chr.GetChrd(&chrd, &chrdBop); if (chrd.cpLim == run.cpLim) { // didn't move forward - use runSure Assert(runSure.cpLim > cpMin, "why don't we have a BOP?"); run = runSure; break; } runT = run; run.cpLim = chrd.cpLim; run.xpLim = chrd.xpLimDraw; run.dypAscent = LwMax(run.dypAscent, chr.DypAscent()); run.dypDescent = LwMax(run.dypDescent, chr.DypDescent()); if (chr.FBreak()) { // we know that this is the end of the line - use run or runT if (run.xpLim > chr.XpBreak() && runT.cpLim > cpMin) run = runT; break; } if (chrdBop.cpLim > runT.cpLim) { // put chrdBop info into runSure runSure.cpLim = chrdBop.cpLim; runSure.xpLim = chrdBop.xpLimDraw; runSure.dypAscent = LwMax(runSure.dypAscent, chr.DypAscent()); runSure.dypDescent = LwMax(runSure.dypDescent, chr.DypDescent()); } } Assert(run.dypAscent > 0 || run.dypDescent > 0, "bad run"); Assert(run.cpLim > cpMin, "why is cch zero?"); switch (pap.jc) { default: plin->xpLeft = 0; break; case jcRight: plin->xpLeft = (short)(dxpDoc - run.xpLim); break; case jcCenter: plin->xpLeft = (dxpDoc - run.xpLim) / 2; break; } plin->ccp = (short)(run.cpLim - cpMin); plin->dyp = (short)(run.dypAscent + run.dypDescent); if (pap.numLine != kdenLine) plin->dyp = (short)LwMulDiv(plin->dyp, pap.numLine, kdenLine); plin->dyp += pap.dypExtraLine; if (_ptxtb->FMinPara(run.cpLim) || run.cpLim == _ptxtb->CpMac()) { if (pap.numAfter != kdenAfter) plin->dyp = (short)LwMulDiv(plin->dyp, pap.numAfter, kdenAfter); plin->dyp += pap.dypExtraAfter; } if (plin->dyp <= 0) plin->dyp = 1; plin->dypAscent = (short)run.dypAscent; if (plin->dypAscent <= 0) plin->dypAscent = 1; plin->cpMin = cpMin; plin->dypTot = dypBase; } /*************************************************************************** Get the cp that the point is in. If fClosest is true, this finds the cp boundary that the point is closest to (for traditional selection). If fClosest is false, it finds the character that the point is over. ***************************************************************************/ bool TXTG::_FGetCpFromPt(long xp, long yp, long *pcp, bool fClosest) { AssertThis(0); AssertVarMem(pcp); LIN lin; RC rc; GetRc(&rc, cooLocal); if (!FIn(yp, 0, rc.ypBottom)) return fFalse; _FindDyp(_dypDisp + yp, &lin); if (_dypDisp + yp >= lin.dypTot + lin.dyp) { *pcp = _ptxtb->CpMac() - 1; return fTrue; } // we've found the line, now get the cp on the line return _FGetCpFromXp(xp, &lin, pcp, fClosest); } /*************************************************************************** Get the cp on the line given by *plin that the xp is in. If fClosest is true, this finds the cp boundary that the point is closest to (for traditional selection). If fClosest is false, it finds the character that the xp is over. This only returns false if fClosest is false and the xp is before the beginning of the line. ***************************************************************************/ bool TXTG::_FGetCpFromXp(long xp, LIN *plin, long *pcp, bool fClosest) { AssertThis(0); AssertVarMem(plin); AssertIn(plin->cpMin, 0, _ptxtb->CpMac()); AssertVarMem(plin); AssertIn(plin->ccp, 1, _ptxtb->CpMac() + 1 - plin->cpMin); AssertVarMem(pcp); CHP chp; PAP pap; CHR chr; long cpCur, cpLimChp, cpLim; long xpCur, dxpDoc; CHRD chrd; xp -= plin->xpLeft + kdxpIndentTxtg - _scvHorz; if (xp <= 0) { *pcp = plin->cpMin; return FPure(fClosest); } if (xp >= (dxpDoc = _DxpDoc())) { *pcp = _ptxtb->CpPrev(plin->cpMin + plin->ccp); return fTrue; } cpLimChp = cpCur = plin->cpMin; cpLim = cpCur + plin->ccp; xpCur = 0; _FetchPap(cpCur, &pap); for (;;) { // make sure the chp is valid if (cpCur >= cpLimChp) { if (cpCur >= cpLim) { // everything fit *pcp = LwMax(plin->cpMin, _ptxtb->CpPrev(cpLim)); return fTrue; } _FetchChp(cpCur, &chp, pvNil, &cpLimChp); cpLimChp = LwMin(cpLimChp, cpLim); Assert(cpLimChp > cpCur, "why is cpCur >= cpLimChp?"); chr.Init(&chp, &pap, _ptxtb, _pgnv, cpCur, cpLimChp, xpCur, dxpDoc, xp); } chr.GetNextRun(fTrue); chr.GetChrd(&chrd); if (chr.FBreak() && (chrd.xpLim >= chr.XpBreak() || chrd.cpLim >= cpLim)) { long cpPrev = _ptxtb->CpPrev(chrd.cpLim); if (!fClosest || chrd.cpLim >= cpLim) goto LPrev; if (cpPrev > cpCur) { CHRD chrdT; // get the length from cpCur to cpPrev chr.Init(&chp, &pap, _ptxtb, _pgnv, cpCur, cpPrev, xpCur, dxpDoc, xp); chr.GetNextRun(fTrue); chr.GetChrd(&chrdT); cpCur = chrdT.cpLim; xpCur = chrdT.xpLim; } Assert(xp >= xpCur && chrd.xpLim >= xp, "what?"); if (xp - xpCur > chrd.xpLim - xp) { *pcp = chrd.cpLim; return fTrue; } LPrev: *pcp = LwMax(plin->cpMin, cpPrev); return fTrue; } xpCur = chrd.xpLim; cpCur = chrd.cpLim; } } /*************************************************************************** Get the vertical bounds of the line containing cp and the horizontal position of the cp on the line. If fView is true, the values are in view coordinates. If fView is false, the values are in logical values (independent of the current scrolling of the view). ***************************************************************************/ void TXTG::_GetXpYpFromCp(long cp, long *pypMin, long *pypLim, long *pxp, long *pypBaseLine, bool fView) { AssertThis(0); AssertIn(cp, 0, _ptxtb->CpMac()); AssertNilOrVarMem(pypMin); AssertNilOrVarMem(pypLim); AssertNilOrVarMem(pxp); AssertNilOrVarMem(pypBaseLine); LIN lin; long xp; _FindCp(cp, &lin); xp = lin.xpLeft; if (fView) { lin.dypTot -= _dypDisp; xp -= _scvHorz; } if (pvNil != pypMin) *pypMin = lin.dypTot; if (pvNil != pypLim) *pypLim = lin.dypTot + lin.dyp; if (pvNil != pxp) *pxp = xp + _DxpFromCp(lin.cpMin, cp); if (pvNil != pypBaseLine) *pypBaseLine = lin.dypTot + lin.dypAscent; } /*************************************************************************** Find the xp location of the given cp. Assumes that cpLine is the start of the line containing cp. This includes a buffer on the left of kdxpIndentTxtg, but doesn't include centering or right justification correction. ***************************************************************************/ long TXTG::_DxpFromCp(long cpLine, long cp) { AssertThis(0); AssertIn(cpLine, 0, _ptxtb->CpMac()); AssertIn(cp, cpLine, _ptxtb->CpMac()); CHP chp; PAP pap; CHR chr; long cpCur, cpLimChp, cpLim; long xpCur; CHRD chrd; cpLimChp = cpCur = cpLine; cpLim = cp + (cp == cpLine); xpCur = 0; _FetchPap(cpCur, &pap); for (;;) { // make sure the chp is valid if (cpCur >= cpLimChp) { _FetchChp(cpCur, &chp, pvNil, &cpLimChp); cpLimChp = LwMin(cpLimChp, cpLim); Assert(cpLimChp > cpCur, "why is cpCur >= cpLimChp?"); chr.Init(&chp, &pap, _ptxtb, _pgnv, cpCur, cpLimChp, xpCur, kdxpMax, kdxpMax); } chr.GetNextRun(); chr.GetChrd(&chrd); if (chrd.cpLim >= cp || chr.FBreak()) { if (cp == cpLine) return chr.XpMin() + kdxpIndentTxtg; else return chrd.xpLim + kdxpIndentTxtg; } cpCur = chrd.cpLim; xpCur = chrd.xpLim; } } /*************************************************************************** Replaces the characters between cp1 and cp2 with the given ones. ***************************************************************************/ bool TXTG::FReplace(achar *prgch, long cch, long cp1, long cp2) { AssertThis(0); AssertIn(cch, 0, kcbMax); AssertPvCb(prgch, cch); AssertIn(cp1, 0, _ptxtb->CpMac()); AssertIn(cp2, 0, _ptxtb->CpMac()); HideSel(); SortLw(&cp1, &cp2); if (!_ptxtb->FReplaceRgch(prgch, cch, cp1, cp2 - cp1)) return fFalse; cp1 += cch; SetSel(cp1, cp1); ShowSel(); return fTrue; } /*************************************************************************** Invalidate the display from cp. If we're the active TXTG, also redraw. ***************************************************************************/ void TXTG::InvalCp(long cp, long ccpIns, long ccpDel) { AssertThis(0); AssertIn(cp, 0, _ptxtb->CpMac() + 1); AssertIn(ccpIns, 0, _ptxtb->CpMac() + 1 - cp); AssertIn(ccpDel, 0, kcbMax); Assert(!_fSelOn, "selection is on in InvalCp!"); long cpAnchor, cpOther; // adjust the sel cpAnchor = _cpAnchor; cpOther = _cpOther; FAdjustIv(&cpAnchor, cp, ccpIns, ccpDel); FAdjustIv(&cpOther, cp, ccpIns, ccpDel); if (cpAnchor != _cpAnchor || cpOther != _cpOther) SetSel(cpAnchor, cpOther, ginNil); _ReformatAndDraw(cp, ccpIns, ccpDel); if (pvNil != _ptrul) { PAP pap; _FetchPap(LwMin(_cpAnchor, _cpOther), &pap); _ptrul->SetDxpTab(pap.dxpTab); _ptrul->SetDxpDoc(_DxpDoc()); } } /*************************************************************************** Reformat the TXTG and update the display. If this TXTG is not the active one, the display is invalidated instead of updated. ***************************************************************************/ void TXTG::_ReformatAndDraw(long cp, long ccpIns, long ccpDel) { RC rcLoc, rc; long yp, dypIns, dypDel; RC rcUpdate(0, 0, 0, 0); // reformat _Reformat(cp, ccpIns, ccpDel, &yp, &dypIns, &dypDel); // determine the dirty rectangles and if we're active, update them GetRc(&rcLoc, cooLocal); if (!_fActive) { rc = rcLoc; rc.ypTop = yp; if (dypIns == dypDel) rc.ypBottom = yp + dypIns; InvalRc(&rc); return; } rc = rcLoc; rc.ypTop = yp; rc.ypBottom = yp + dypIns; if (dypIns != dypDel) { // Have some bits to blt vertically. If the background isn't clear, // but _fMark is set, still do the scroll, since _fMark is intended // to avoid flashing (allowing offscreen drawing) and scrolling doesn't // flash anyway. if (_fClear) rc.ypBottom = rcLoc.ypBottom; else { rc = rcLoc; rc.ypTop = LwMax(rc.ypTop, yp + LwMin(dypIns, dypDel)); Scroll(&rc, 0, dypIns - dypDel, _fMark ? kginMark : kginDraw); rc.ypBottom = rc.ypTop; rc.ypTop = yp; } } if (!rc.FEmpty()) InvalRc(&rc, _fClear || _fMark ? kginMark : kginDraw); _fXpValid = fFalse; } /*************************************************************************** Perform a scroll according to scaHorz and scaVert. ***************************************************************************/ void TXTG::_Scroll(long scaHorz, long scaVert, long scvHorz, long scvVert) { RC rc; long dxp, dyp; GetRc(&rc, cooLocal); dxp = 0; switch (scaHorz) { case scaPageUp: dxp = -LwMulDiv(rc.Dxp(), 9, 10); goto LHorz; case scaPageDown: dxp = LwMulDiv(rc.Dxp(), 9, 10); goto LHorz; case scaLineUp: dxp = -rc.Dxp() / 10; goto LHorz; case scaLineDown: dxp = rc.Dxp() / 10; goto LHorz; case scaToVal: dxp = scvHorz - _scvHorz; LHorz: dxp = LwBound(_scvHorz + dxp, 0, _ScvMax(fFalse) + 1) - _scvHorz; _scvHorz += dxp; if (pvNil != _ptrul) _ptrul->SetXpLeft(kdxpIndentTxtg - _scvHorz); break; } dyp = 0; if (scaVert != scaNil) { long cpT; LIN lin, linDisp; long ilin; RC rc; switch (scaVert) { case scaToVal: cpT = LwBound(scvVert, 0, _ptxtb->CpMac()); _FindCp(cpT, &lin, &ilin); dyp = lin.dypTot - _dypDisp; _ilinDisp = ilin; _cpDisp = lin.cpMin; _dypDisp = lin.dypTot; break; case scaPageDown: // scroll down a page GetRc(&rc, cooLocal); _FindDyp(rc.Dyp() + _dypDisp, &lin, &ilin); if (lin.cpMin <= _cpDisp) { // we didn't go anywhere so force going down a line _FetchLin(_ilinDisp + 1, &lin, &ilin); } else if (lin.dypTot + lin.dyp > _dypDisp + rc.Dyp() && ilin > _ilinDisp + 1) { // the line crosses the bottom of the ddg so back up one Assert(ilin > 0, 0); _FetchLin(ilin - 1, &lin, &ilin); } dyp = lin.dypTot - _dypDisp; _ilinDisp = ilin; _cpDisp = lin.cpMin; _dypDisp = lin.dypTot; break; case scaLineDown: // scroll down a line _FetchLin(_ilinDisp + 1, &lin, &_ilinDisp); dyp = lin.dypTot - _dypDisp; _cpDisp = lin.cpMin; _dypDisp = lin.dypTot; break; case scaPageUp: // scroll down a page if (_ilinDisp <= 0) break; GetRc(&rc, cooLocal); _FetchLin(_ilinDisp, &linDisp); Assert(linDisp.dypTot == _dypDisp, 0); // determine where to scroll to - try to keep the top line // visible, but scroll up at least one line dyp = LwMax(0, linDisp.dypTot + linDisp.dyp - rc.Dyp()); _FindDyp(dyp, &lin, &ilin); if (lin.cpMin >= linDisp.cpMin) { // we didn't go anywhere so force going up a line _FetchLin(_ilinDisp - 1, &lin, &ilin); } else if (linDisp.dypTot + linDisp.dyp > lin.dypTot + rc.Dyp() && ilin < _ilinDisp - 1) { // the previous disp line crosses the bottom of the ddg, so move // down one line _FetchLin(ilin + 1, &lin, &ilin); } dyp = lin.dypTot - _dypDisp; _ilinDisp = ilin; _cpDisp = lin.cpMin; _dypDisp = lin.dypTot; break; case scaLineUp: // scroll up a line if (_ilinDisp <= 0) break; _FetchLin(_ilinDisp - 1, &lin, &_ilinDisp); dyp = lin.dypTot - _dypDisp; _cpDisp = lin.cpMin; _dypDisp = lin.dypTot; break; } AssertIn(_cpDisp, 0, _ptxtb->CpMac()); _scvVert = _cpDisp; } _SetScrollValues(); if (dxp != 0 || dyp != 0) _ScrollDxpDyp(dxp, dyp); } /*************************************************************************** Move the bits in the window. ***************************************************************************/ void TXTG::_ScrollDxpDyp(long dxp, long dyp) { AssertThis(0); RC rcLoc, rcBad1, rcBad2; // determine the dirty rectangles and update them GetRc(&rcLoc, cooLocal); if (_fClear) { InvalRc(&rcLoc, kginMark); vpappb->UpdateMarked(); return; } Scroll(&rcLoc, -dxp, -dyp, _fMark ? kginMark : kginDraw); if (_fMark) vpappb->UpdateMarked(); } /*************************************************************************** Update the display of the document. ***************************************************************************/ void TXTG::Draw(PGNV pgnv, RC *prcClip) { AssertPo(pgnv, 0); AssertVarMem(prcClip); DrawLines(pgnv, prcClip, kdxpIndentTxtg - _scvHorz, 0, _ilinDisp); if (_fSelOn) _InvertSel(pgnv); _SetScrollValues(); } /*************************************************************************** Draws some lines of the document. ***************************************************************************/ void TXTG::DrawLines(PGNV pgnv, RC *prcClip, long dxp, long dyp, long ilinMin, long ilinLim, ulong grftxtg) { AssertPo(pgnv, 0); AssertVarMem(prcClip); CHP chp; PAP pap; CHR chr; CHRD chrd; RC rc; long xpBase, xp, yp, xpChr, dxpDoc; long cpLine, cpCur, cpLimChp, cpLim, cpLimLine; LIN lin; long ilin; cpLim = _ptxtb->CpMac(); dxpDoc = _DxpDoc(); _FetchLin(ilinMin, &lin); cpLine = lin.cpMin; pgnv->FillRc(prcClip, _ptxtb->AcrBack()); yp = dyp; for (ilin = ilinMin; ilin < ilinLim; ilin++) { if (yp >= prcClip->ypBottom || cpLine >= cpLim) break; _FetchLin(ilin, &lin); if (yp + lin.dyp <= prcClip->ypTop) { yp += lin.dyp; cpLine += lin.ccp; continue; } _FetchPap(cpLine, &pap); xpBase = lin.xpLeft + dxp; cpLimChp = cpCur = cpLine; cpLimLine = cpLine + lin.ccp; xpChr = 0; // draw the line for (;;) { // make sure the chp is valid if (cpCur >= cpLimChp) { _FetchChp(cpCur, &chp, pvNil, &cpLimChp); cpLimChp = LwMin(cpLimChp, cpLimLine); Assert(cpLimChp > cpCur, "why is cpCur >= cpLimChp?"); chr.Init(&chp, &pap, _ptxtb, _pgnv, cpCur, cpLimChp, xpChr, dxpDoc, dxpDoc); } chr.GetNextRun(fTrue); chr.GetChrd(&chrd); if (chrd.cpLimDraw > cpCur) { // draw some text xp = xpBase + chr.XpMin(); if (chr.FObject()) { // draw the object _ptxtb->FDrawObject(chr.CpMin(), pgnv, &xp, yp + lin.dypAscent + chp.dypOffset, &chp, prcClip); } else { pgnv->SetFont(chp.onn, chp.grfont, chp.dypFont, tahLeft, tavBaseline); pgnv->DrawRgch(chr.Prgch(), chrd.cpLimDraw - chr.CpMin(), xp, yp + lin.dypAscent + chp.dypOffset, chp.acrFore, chp.acrBack); } } if (chrd.cpLim >= cpLimLine || chr.FBreak()) break; cpCur = chrd.cpLim; xpChr = chrd.xpLim; } _DrawLinExtra(pgnv, prcClip, &lin, dxp, yp, grftxtg); yp += lin.dyp; cpLine = cpLimLine; } } /*************************************************************************** Gives a subclass an opportunity to draw extra stuff associated with the line. Default does nothing. ***************************************************************************/ void TXTG::_DrawLinExtra(PGNV pgnv, PRC prcClip, LIN *plin, long dxp, long yp, ulong grftxtg) { } /*************************************************************************** Handle a mousedown in the TXTG. ***************************************************************************/ bool TXTG::FCmdTrackMouse(PCMD_MOUSE pcmd) { AssertThis(0); AssertVarMem(pcmd); RC rc; long cp; long scaHorz, scaVert; long xp = pcmd->xp; long yp = pcmd->yp; if (pcmd->cid == cidMouseDown) { Assert(vpcex->PgobTracking() == pvNil, "mouse already being tracked!"); _fSelByWord = (pcmd->cact > 1) && !(pcmd->grfcust & fcustShift); vpcex->TrackMouse(this); } else { Assert(vpcex->PgobTracking() == this, "not tracking mouse!"); Assert(pcmd->cid == cidTrackMouse, 0); } // do autoscrolling GetRc(&rc, cooLocal); if (!FIn(xp, rc.xpLeft, rc.xpRight)) { scaHorz = (xp < rc.xpLeft) ? scaLineUp : scaLineDown; xp = LwBound(xp, rc.xpLeft, rc.xpRight); } else scaHorz = scaNil; if (!FIn(yp, rc.ypTop, rc.ypBottom)) { scaVert = (yp < rc.ypTop) ? scaLineUp : scaLineDown; yp = LwBound(yp, rc.ypTop, rc.ypBottom); } else scaVert = scaNil; if (scaHorz != scaNil || scaVert != scaNil) _Scroll(scaHorz, scaVert); // set the selection if (_FGetCpFromPt(xp, yp, &cp, !_fSelByWord)) { if (pcmd->cid != cidMouseDown || (pcmd->grfcust & fcustShift)) { if (_fSelByWord) { cp = (cp < _cpAnchor) ? _ptxtb->CpPrev(cp + 1, fTrue) : _ptxtb->CpNext(cp, fTrue); } SetSel(_cpAnchor, cp); } else { if (_fSelByWord) cp = _ptxtb->CpPrev(cp + 1, fTrue); SetSel(cp, _fSelByWord ? _ptxtb->CpNext(cp, fTrue) : cp); } _fXpValid = fFalse; } _SwitchSel(fTrue); // make sure the selection is on if (!(pcmd->grfcust & fcustMouse)) vpcex->EndMouseTracking(); return fTrue; } /*************************************************************************** Do idle processing. If this handler has the active selection, make sure the selection is on or off according to rglw[0] (non-zero means on) and set rglw[0] to false. Always return false. ***************************************************************************/ bool TXTG::FCmdSelIdle(PCMD pcmd) { AssertThis(0); // if rglw[1] is this one's hid, don't change the sel state. if (pcmd->rglw[1] != Hid()) { if (!pcmd->rglw[0]) _SwitchSel(fFalse, kginDefault); else if (_cpAnchor != _cpOther || _tsSel == 0) _SwitchSel(fTrue); else if (DtsCaret() < TsCurrent() - _tsSel) _SwitchSel(!_fSelOn); } pcmd->rglw[0] = fFalse; return fFalse; } /*************************************************************************** Get the current selection. ***************************************************************************/ void TXTG::GetSel(long *pcpAnchor, long *pcpOther) { AssertThis(0); AssertVarMem(pcpAnchor); AssertVarMem(pcpOther); *pcpAnchor = _cpAnchor; *pcpOther = _cpOther; } /*************************************************************************** Set the selection. ***************************************************************************/ void TXTG::SetSel(long cpAnchor, long cpOther, long gin) { AssertThis(0); long cpMac = _ptxtb->CpMac(); cpAnchor = LwBound(cpAnchor, 0, cpMac); cpOther = LwBound(cpOther, 0, cpMac); if (cpAnchor == _cpAnchor && cpOther == _cpOther) return; if (_fSelOn) { if ((_fMark || _fClear) && gin == kginDraw) gin = kginMark; _pgnv->SetGobRc(this); if (_cpAnchor != cpAnchor || _cpAnchor == _cpOther || cpAnchor == cpOther) { _InvertSel(_pgnv, gin); _cpAnchor = cpAnchor; _cpOther = cpOther; _InvertSel(_pgnv, gin); _tsSel = TsCurrent(); } else { // they have the same anchor and neither is an insertion _InvertCpRange(_pgnv, _cpOther, cpOther, gin); _cpOther = cpOther; } } else { _cpAnchor = cpAnchor; _cpOther = cpOther; _tsSel = 0L; } } /*************************************************************************** Make sure the selection is visible (at least the _cpOther end of it). ***************************************************************************/ void TXTG::ShowSel(void) { AssertThis(0); long cpScroll; long ilinOther, ilinAnchor, ilin; long dxpScroll, dypSel; long xpMin, xpLim; RC rc; LIN linOther, linAnchor, lin; long cpAnchor = _cpAnchor; // find the lines we want to show _FindCp(_cpOther, &linOther, &ilinOther); _FindCp(_cpAnchor, &linAnchor, &ilinAnchor); linOther.dypTot -= _dypDisp; linAnchor.dypTot -= _dypDisp; GetRc(&rc, cooLocal); cpScroll = _cpDisp; if (!FIn(linOther.dypTot, 0, rc.Dyp() - linOther.dyp) || !FIn(linAnchor.dypTot, 0, rc.Dyp() - linAnchor.dyp)) { if (_cpOther < cpAnchor) dypSel = linAnchor.dypTot - linOther.dypTot + linAnchor.dyp; else dypSel = linOther.dypTot - linAnchor.dypTot + linOther.dyp; if (dypSel > rc.Dyp()) { // just show _cpOther cpAnchor = _cpOther; ilinAnchor = ilinOther; linAnchor = linOther; dypSel = linOther.dyp; } if (linOther.dypTot < 0 || linAnchor.dypTot < 0) { // scroll up cpScroll = LwMin(linOther.cpMin, linAnchor.cpMin); } else if (linOther.dypTot + linOther.dyp >= rc.Dyp() || linAnchor.dypTot + linAnchor.dyp >= rc.Dyp()) { // scroll down ilin = LwMin(ilinOther, ilinAnchor); cpScroll = LwMin(linOther.cpMin, linAnchor.cpMin); dypSel = rc.Dyp() - dypSel; for (;;) { if (--ilin < 0) break; _FetchLin(ilin, &lin); if (lin.dyp > dypSel) break; cpScroll -= lin.ccp; dypSel -= lin.dyp; } } } // now do the horizontal stuff xpMin = _DxpFromCp(linOther.cpMin, _cpOther) + linOther.xpLeft - _scvHorz; xpLim = _DxpFromCp(linAnchor.cpMin, cpAnchor) + linAnchor.xpLeft - _scvHorz; if (LwAbs(xpLim - xpMin) > rc.Dxp()) { // can't show both if (xpMin > xpLim) { xpLim = xpMin; xpMin = xpLim - rc.Dxp(); } else xpLim = xpMin + rc.Dxp(); } else SortLw(&xpMin, &xpLim); dxpScroll = LwMax(LwMin(0, rc.xpRight - xpLim), rc.xpLeft - xpMin); if (dxpScroll != 0 || cpScroll != _cpDisp) _Scroll(scaToVal, scaToVal, _scvHorz - dxpScroll, cpScroll); } /*************************************************************************** Turn the selection off. ***************************************************************************/ void TXTG::HideSel(void) { AssertThis(0); if (!_fSelOn) return; _SwitchSel(fFalse); _tsSel = 0; } /*************************************************************************** Turn the sel on or off according to fOn. ***************************************************************************/ void TXTG::_SwitchSel(bool fOn, long gin) { AssertThis(0); if (FPure(fOn) != FPure(_fSelOn)) { if ((_fMark || _fClear) && gin == kginDraw) gin = kginMark; _pgnv->SetGobRc(this); _InvertSel(_pgnv, gin); _fSelOn = FPure(fOn); _tsSel = TsCurrent(); } } /*************************************************************************** Invert the current selection. ***************************************************************************/ void TXTG::_InvertSel(PGNV pgnv, long gin) { AssertThis(0); AssertPo(pgnv, 0); RC rc, rcT; GetRc(&rc, cooLocal); if (_cpAnchor == _cpOther) { // insertion bar _GetXpYpFromCp(_cpAnchor, &rcT.ypTop, &rcT.ypBottom, &rcT.xpLeft); rcT.xpRight = --rcT.xpLeft + 2; if (rcT.FIntersect(&rc)) { if (kginDraw == gin) pgnv->FillRc(&rcT, kacrInvert); else InvalRc(&rcT, gin); } } else _InvertCpRange(pgnv, _cpAnchor, _cpOther, gin); } /*************************************************************************** Invert a range. ***************************************************************************/ void TXTG::_InvertCpRange(PGNV pgnv, long cp1, long cp2, long gin) { AssertThis(0); AssertPo(pgnv, 0); AssertIn(cp1, 0, _ptxtb->CpMac()); AssertIn(cp2, 0, _ptxtb->CpMac()); RC rc1, rc2, rcClip, rcT, rcDoc; if (cp1 == cp2) return; SortLw(&cp1, &cp2); _GetXpYpFromCp(cp1, &rc1.ypTop, &rc1.ypBottom, &rc1.xpLeft); _GetXpYpFromCp(cp2, &rc2.ypTop, &rc2.ypBottom, &rc2.xpRight); GetRc(&rcClip, cooLocal); if (rc1.ypTop >= rcClip.ypBottom || rc2.ypBottom <= rcClip.ypTop) return; if (rc1.ypTop == rc2.ypTop && rc1.ypBottom == rc2.ypBottom) { // only one line involved rc1.xpRight = rc2.xpRight; if (rcT.FIntersect(&rc1, &rcClip)) { if (kginDraw == gin) pgnv->HiliteRc(&rcT, kacrWhite); else InvalRc(&rcT, gin); } return; } // invert the sel on the first line rc1.xpRight = kdxpIndentTxtg - _scvHorz + _DxpDoc(); if (rcT.FIntersect(&rc1, &rcClip)) { if (kginDraw == gin) pgnv->HiliteRc(&rcT, kacrWhite); else InvalRc(&rcT, gin); } // invert the main rectangular block rc1.xpLeft = kdxpIndentTxtg - _scvHorz; rc1.ypTop = rc1.ypBottom; rc1.ypBottom = rc2.ypTop; if (rcT.FIntersect(&rc1, &rcClip)) { if (kginDraw == gin) pgnv->HiliteRc(&rcT, kacrWhite); else InvalRc(&rcT, gin); } // invert the last line rc2.xpLeft = rc1.xpLeft; if (rcT.FIntersect(&rc2, &rcClip)) { if (kginDraw == gin) pgnv->HiliteRc(&rcT, kacrWhite); else InvalRc(&rcT, gin); } } /*************************************************************************** Handle a key down. ***************************************************************************/ bool TXTG::FCmdKey(PCMD_KEY pcmd) { const long kcchInsBuf = 64; AssertThis(0); AssertVarMem(pcmd); ulong grfcust; long vkDone; long ichLim; long cact; long dcp, cpT; CMD cmd; LIN lin, linT; long ilin, ilinT; RC rc; achar rgch[kcchInsBuf + 1]; // keep fetching characters until we get a cursor key, delete key or // until the buffer is full. vkDone = vkNil; ichLim = 0; do { grfcust = pcmd->grfcust; switch (pcmd->vk) { // these keys all terminate the key fetching loop case kvkHome: case kvkEnd: case kvkLeft: case kvkRight: case kvkUp: case kvkDown: case kvkPageUp: case kvkPageDown: case kvkDelete: case kvkBack: vkDone = pcmd->vk; goto LInsert; default: if (chNil == pcmd->ch) break; for (cact = 0; cact < pcmd->cact && ichLim < kcchInsBuf; cact++) { rgch[ichLim++] = (achar)pcmd->ch; #ifdef WIN if ((achar)pcmd->ch == kchReturn) rgch[ichLim++] = kchLineFeed; #endif // WIN } break; } pcmd = (PCMD_KEY)&cmd; } while (ichLim < kcchInsBuf && vpcex->FGetNextKey(&cmd)); LInsert: if (ichLim > 0) { // have some characters to insert FReplace(rgch, ichLim, _cpAnchor, _cpOther); } dcp = 0; switch (vkDone) { case kvkHome: if (grfcust & fcustCmd) dcp = -_cpOther; else { _FindCp(_cpOther, &lin); dcp = lin.cpMin - _cpOther; } _fXpValid = fFalse; goto LSetSel; case kvkEnd: if (grfcust & fcustCmd) dcp = _ptxtb->CpMac() - _cpOther; else { _FindCp(_cpOther, &lin); cpT = _ptxtb->CpPrev(lin.cpMin + lin.ccp); AssertIn(cpT, _cpOther, _ptxtb->CpMac()); dcp = cpT - _cpOther; } _fXpValid = fFalse; goto LSetSel; case kvkLeft: dcp = _ptxtb->CpPrev(_cpOther, FPure(grfcust & fcustCmd)) - _cpOther; _fXpValid = fFalse; goto LSetSel; case kvkRight: dcp = _ptxtb->CpNext(_cpOther, FPure(grfcust & fcustCmd)) - _cpOther; _fXpValid = fFalse; goto LSetSel; case kvkUp: case kvkPageUp: case kvkDown: case kvkPageDown: // get the LIN for _cpOther and make sure _xpSel is up to date _FindCp(_cpOther, &lin, &ilin); if (!_fXpValid) { // get the xp of _cpOther _xpSel = lin.xpLeft + _DxpFromCp(lin.cpMin, _cpOther); _fXpValid = fTrue; } switch (vkDone) { case kvkUp: if (ilin == 0) { dcp = -_cpOther; goto LSetSel; } _FetchLin(ilin - 1, &lin); break; case kvkPageUp: if (ilin == 0) { dcp = -_cpOther; goto LSetSel; } GetRc(&rc, cooLocal); _FindDyp(LwMax(0, lin.dypTot - rc.Dyp() + lin.dyp), &linT, &ilinT); if (linT.cpMin >= lin.cpMin) { // we didn't go anywhere so force going up a line _FetchLin(ilin - 1, &lin); } else if (lin.dypTot + lin.dyp > linT.dypTot + rc.Dyp() && ilinT < ilin - 1) { // the previous line crosses the bottom of the ddg, so move // down one line _FetchLin(ilinT + 1, &lin); } else lin = linT; break; case kvkDown: if (lin.cpMin + lin.ccp >= _ptxtb->CpMac()) { dcp = _ptxtb->CpMac() - _cpOther; goto LSetSel; } _FetchLin(ilin + 1, &lin); break; case kvkPageDown: if (lin.cpMin + lin.ccp >= _ptxtb->CpMac()) { dcp = _ptxtb->CpMac() - _cpOther; goto LSetSel; } GetRc(&rc, cooLocal); _FindDyp(lin.dypTot + rc.Dyp(), &linT, &ilinT); if (linT.cpMin <= lin.cpMin) { // we didn't go anywhere so force going down a line _FetchLin(ilin + 1, &lin); } else if (linT.dypTot + linT.dyp > lin.dypTot + rc.Dyp() && ilinT > ilin + 1) { // the line crosses the bottom of the ddg so back up one line Assert(ilinT > 0, 0); _FetchLin(ilinT - 1, &lin); } else lin = linT; break; } // we have the line, now find the position on the line _FGetCpFromXp(_xpSel - _scvHorz, &lin, &dcp); dcp -= _cpOther; LSetSel: // move the selection if (grfcust & fcustShift) { // extend selection SetSel(_cpAnchor, _cpOther + dcp); ShowSel(); } else { cpT = _cpOther; if (cpT == _cpAnchor || (grfcust & fcustCmd)) cpT += dcp; else if ((dcp > 0) != (cpT > _cpAnchor)) cpT = _cpAnchor; SetSel(cpT, cpT); ShowSel(); } break; case kvkDelete: case kvkBack: if (_cpAnchor != _cpOther) dcp = _cpOther - _cpAnchor; else if (vkDone == kvkDelete) { dcp = _ptxtb->CpNext(_cpAnchor) - _cpAnchor; if (_cpAnchor + dcp >= _ptxtb->CpMac()) dcp = 0; } else dcp = _ptxtb->CpPrev(_cpAnchor) - _cpAnchor; if (dcp != 0) FReplace(pvNil, 0, _cpAnchor, _cpAnchor + dcp); break; } return fTrue; } /*************************************************************************** Return the maximum scroll value for this view of the doc. ***************************************************************************/ long TXTG::_ScvMax(bool fVert) { RC rc; long dxp; if (fVert) return _ptxtb->CpMac() - 1; dxp = _DxpDoc() + 2 * kdxpIndentTxtg; GetRc(&rc, cooLocal); return LwMax(0, dxp - rc.Dxp()); } /*************************************************************************** Return the logical width of the text "page". ***************************************************************************/ long TXTG::_DxpDoc(void) { return _ptxtb->DxpDef(); } /*************************************************************************** Set the tab width. Default does nothing. ***************************************************************************/ void TXTG::SetDxpTab(long dxp) { AssertThis(0); } /*************************************************************************** Set the document width. Default calls SetDxpDef on the TXTB. ***************************************************************************/ void TXTG::SetDxpDoc(long dxp) { AssertThis(0); dxp = LwBound(dxp, 1, kcbMax); _ptxtb->SetDxpDef(dxp); } /*************************************************************************** Show or hide the ruler. ***************************************************************************/ void TXTG::ShowRuler(bool fShow) { AssertThis(0); RC rcAbs, rcRel; long dyp; if (FPure(fShow) == (_ptrul != pvNil)) return; dyp = _DypTrul(); if (fShow) { PGOB pgob; GCB gcb; pgob = PgobPar(); if (pvNil == pgob || !pgob->FIs(kclsDSG)) return; GetPos(&rcAbs, &rcRel); rcAbs.ypTop += dyp; SetPos(&rcAbs, &rcRel); rcRel.ypBottom = rcRel.ypTop; rcAbs.ypBottom = rcAbs.ypTop; rcAbs.ypTop -= dyp; gcb.Set(HidUnique(), pgob, fgobNil, kginDefault, &rcAbs, &rcRel); if (pvNil == (_ptrul = _PtrulNew(&gcb))) goto LFail; } else { ReleasePpo(&_ptrul); LFail: GetPos(&rcAbs, &rcRel); rcAbs.ypTop -= dyp; SetPos(&rcAbs, &rcRel); } } /*************************************************************************** Return the height of the ruler. ***************************************************************************/ long TXTG::_DypTrul(void) { AssertThis(0); return 0; } /*************************************************************************** Create the ruler. ***************************************************************************/ PTRUL TXTG::_PtrulNew(PGCB pgcb) { AssertThis(0); return pvNil; } /*************************************************************************** Get the natural width and height of the view on the document. ***************************************************************************/ void TXTG::GetNaturalSize(long *pdxp, long *pdyp) { AssertThis(0); AssertNilOrVarMem(pdxp); AssertNilOrVarMem(pdyp); LIN lin; if (pvNil != pdxp) *pdxp = _DxpDoc() + 2 * kdxpIndentTxtg; if (pvNil == pdyp) return; _FetchLin(kcbMax - 1, &lin); *pdyp = lin.dypTot + lin.dyp; } /*************************************************************************** Constructor for the plain line text document display gob. ***************************************************************************/ TXLG::TXLG(PTXTB ptxtb, PGCB pgcb, long onn, ulong grfont, long dypFont, long cchTab) : TXLG_PAR(ptxtb, pgcb) { RC rc; achar ch = kchSpace; GNV gnv(this); gnv.SetFont(onn, fontNil, dypFont); gnv.GetRcFromRgch(&rc, &ch, 1); _dxpChar = rc.Dxp(); _onn = onn; _grfont = grfont; _dypFont = dypFont; _cchTab = LwBound(cchTab, 1, kcbMax); } /*************************************************************************** Static method to create a new plain line text doc display gob. ***************************************************************************/ PTXLG TXLG::PtxlgNew(PTXTB ptxtb, PGCB pgcb, long onn, ulong grfont, long dypFont, long cchTab) { PTXLG ptxlg; if (pvNil == (ptxlg = NewObj TXLG(ptxtb, pgcb, onn, grfont, dypFont, cchTab))) return pvNil; if (!ptxlg->_FInit()) { ReleasePpo(&ptxlg); return pvNil; } ptxlg->Activate(fTrue); return ptxlg; } /*************************************************************************** Get the width of the logical "page". For a TXLG, this is some big value, so we do no word wrap. ***************************************************************************/ long TXLG::_DxpDoc(void) { return kswMax; } /*************************************************************************** Set the tab width. ***************************************************************************/ void TXLG::SetDxpTab(long dxp) { AssertThis(0); long cch; cch = LwBound(dxp / _dxpChar, 1, kswMax / _dxpChar); if (cch != _cchTab) { _cchTab = cch; InvalCp(0, _ptxtb->CpMac(), _ptxtb->CpMac()); } } /*************************************************************************** Set the document width. Does nothing. ***************************************************************************/ void TXLG::SetDxpDoc(long dxp) { AssertThis(0); } /*************************************************************************** Get the character properties for display. These are the same for all characters in the TXLG. ***************************************************************************/ void TXLG::_FetchChp(long cp, PCHP pchp, long *pcpMin, long *pcpLim) { AssertIn(cp, 0, _ptxtb->CpMac()); AssertVarMem(pchp); AssertNilOrVarMem(pcpMin); AssertNilOrVarMem(pcpLim); pchp->Clear(); pchp->grfont = _grfont; pchp->onn = _onn; pchp->dypFont = _dypFont; pchp->acrFore = kacrBlack; pchp->acrBack = kacrWhite; if (pvNil != pcpMin) *pcpMin = 0; if (pvNil != pcpLim) *pcpLim = _ptxtb->CpMac(); } /*************************************************************************** Get the paragraph properties for disply. These are constant for all characters in the TXLG. ***************************************************************************/ void TXLG::_FetchPap(long cp, PPAP ppap, long *pcpMin, long *pcpLim) { AssertIn(cp, 0, _ptxtb->CpMac()); AssertVarMem(ppap); AssertNilOrVarMem(pcpMin); AssertNilOrVarMem(pcpLim); ClearPb(ppap, size(PAP)); ppap->dxpTab = (short)LwMul(_cchTab, _dxpChar); ppap->numLine = kdenLine; ppap->numAfter = kdenAfter; if (pvNil != pcpMin) *pcpMin = 0; if (pvNil != pcpLim) *pcpLim = _ptxtb->CpMac(); } /*************************************************************************** Copy the selection. ***************************************************************************/ bool TXLG::_FCopySel(PDOCB *ppdocb) { AssertThis(0); AssertNilOrVarMem(ppdocb); PTXPD ptxpd; if (_cpAnchor == _cpOther) return fFalse; if (pvNil == ppdocb) return fTrue; if (pvNil != (ptxpd = TXPD::PtxpdNew(pvNil))) { long cpMin = LwMin(_cpAnchor, _cpOther); long cpLim = LwMax(_cpAnchor, _cpOther); ptxpd->SuspendUndo(); if (!ptxpd->FReplaceBsf(_ptxtb->Pbsf(), cpMin, cpLim - cpMin, 0, 0, fdocNil)) { ReleasePpo(&ptxpd); } else ptxpd->ResumeUndo(); } *ppdocb = ptxpd; return pvNil != *ppdocb; } /*************************************************************************** Delete the selection. ***************************************************************************/ void TXLG::_ClearSel(void) { AssertThis(0); FReplace(pvNil, 0, _cpAnchor, _cpOther); ShowSel(); } /*************************************************************************** Paste the selection. ***************************************************************************/ bool TXLG::_FPaste(PCLIP pclip, bool fDoIt, long cid) { AssertThis(0); AssertPo(pclip, 0); long cp1, cp2; long ccp; PTXTB ptxtb; if (cid != cidPaste || !pclip->FGetFormat(kclsTXTB)) return fFalse; if (!fDoIt) return fTrue; if (!pclip->FGetFormat(kclsTXTB, (PDOCB *)&ptxtb)) return fFalse; AssertPo(ptxtb, 0); if ((ccp = ptxtb->CpMac() - 1) <= 0) { ReleasePpo(&ptxtb); return fTrue; } HideSel(); cp1 = LwMin(_cpAnchor, _cpOther); cp2 = LwMax(_cpAnchor, _cpOther); if (!_ptxtb->FReplaceTxtb(ptxtb, 0, ccp, cp1, cp2 - cp1)) { ReleasePpo(&ptxtb); return fFalse; } ReleasePpo(&ptxtb); cp1 += ccp; SetSel(cp1, cp1); ShowSel(); return fTrue; } /*************************************************************************** Constructor for a rich text document display gob. ***************************************************************************/ TXRG::TXRG(PTXRD ptxrd, PGCB pgcb) : TXRG_PAR(ptxrd, pgcb) { } /*************************************************************************** Create a new rich text document display GOB. ***************************************************************************/ PTXRG TXRG::PtxrgNew(PTXRD ptxrd, PGCB pgcb) { PTXRG ptxrg; if (pvNil == (ptxrg = NewObj TXRG(ptxrd, pgcb))) return pvNil; if (!ptxrg->_FInit()) { ReleasePpo(&ptxrg); return pvNil; } ptxrg->Activate(fTrue); return ptxrg; } #ifdef DEBUG /*************************************************************************** Assert the validity of a TXRG. ***************************************************************************/ void TXRG::AssertValid(ulong grf) { TXRG_PAR::AssertValid(0); AssertNilOrPo(_ptrul, 0); } #endif // DEBUG /*************************************************************************** Get the character properties for displaying the given cp. ***************************************************************************/ void TXRG::_FetchChp(long cp, PCHP pchp, long *pcpMin, long *pcpLim) { ((PTXRD)_ptxtb)->FetchChp(cp, pchp, pcpMin, pcpLim); } /*************************************************************************** Get the paragraph properties for displaying the given cp. ***************************************************************************/ void TXRG::_FetchPap(long cp, PPAP ppap, long *pcpMin, long *pcpLim) { ((PTXRD)_ptxtb)->FetchPap(cp, ppap, pcpMin, pcpLim); } /*************************************************************************** Set the tab width for the currently selected paragraph(s). ***************************************************************************/ void TXRG::SetDxpTab(long dxp) { AssertThis(0); long cpMin, cpLim, cpAnchor, cpOther; PAP papOld, papNew; dxp = LwRoundClosest(dxp, kdzpInch / 8); dxp = LwBound(dxp, kdzpInch / 8, 100 * kdzpInch); ClearPb(&papOld, size(PAP)); papNew = papOld; cpMin = LwMin(cpAnchor = _cpAnchor, cpOther = _cpOther); cpLim = LwMax(_cpAnchor, _cpOther); papNew.dxpTab = (short)dxp; _SwitchSel(fFalse, ginNil); if (!((PTXRD)_ptxtb)->FApplyPap(cpMin, cpLim - cpMin, &papNew, &papOld, &cpMin, &cpLim)) { _SwitchSel(fTrue, kginMark); } SetSel(cpAnchor, cpOther); ShowSel(); } /*************************************************************************** Set the selection for the TXRG. Invalidates _chpIns if the selection changes. ***************************************************************************/ void TXRG::SetSel(long cpAnchor, long cpOther, long gin) { AssertThis(0); long cpMac = _ptxtb->CpMac(); cpAnchor = LwBound(cpAnchor, 0, cpMac); cpOther = LwBound(cpOther, 0, cpMac); if (cpAnchor == _cpAnchor && cpOther == _cpOther) return; _fValidChp = fFalse; TXRG_PAR::SetSel(cpAnchor, cpOther, gin); if (pvNil != _ptrul) { PAP pap; _FetchPap(LwMin(_cpAnchor, _cpOther), &pap); _ptrul->SetDxpTab(pap.dxpTab); } } /*************************************************************************** Get the chp to use to replace the given range of characters. If the range is empty and not at the beginning of a paragraph, gets the chp of the previous character. Otherwise gets the chp of the character at LwMin(cp1, cp2). ***************************************************************************/ void TXRG::_FetchChpSel(long cp1, long cp2, PCHP pchp) { AssertThis(0); AssertVarMem(pchp); long cp = LwMin(cp1, cp2); if (cp1 == cp2 && cp1 > 0) { if (!_ptxtb->FMinPara(cp) || _ptxtb->FMinPara(cp2 = _ptxtb->CpNext(cp)) || cp2 >= _ptxtb->CpMac()) { cp = _ptxtb->CpPrev(cp); } } // NOTE: don't just call _FetchChp here. _FetchChp allows derived // classes to modify the chp used for display without affecting the // chp used for editing. This chp is an editing chp. Same note // applies several other places in this file. ((PTXRD)_ptxtb)->FetchChp(cp, pchp); } /*************************************************************************** Make sure the _chpIns is valid. ***************************************************************************/ void TXRG::_EnsureChpIns(void) { AssertThis(0); if (!_fValidChp) { _FetchChpSel(_cpAnchor, _cpOther, &_chpIns); _fValidChp = fTrue; } } /*************************************************************************** Replaces the characters between cp1 and cp2 with the given ones. ***************************************************************************/ bool TXRG::FReplace(achar *prgch, long cch, long cp1, long cp2) { AssertIn(cch, 0, kcbMax); AssertPvCb(prgch, cch); AssertIn(cp1, 0, _ptxtb->CpMac()); AssertIn(cp2, 0, _ptxtb->CpMac()); CHP chp; bool fSetChpIns = fFalse; HideSel(); SortLw(&cp1, &cp2); if (cp1 == LwMin(_cpAnchor, _cpOther) && cp2 == LwMax(_cpAnchor, _cpOther)) { _EnsureChpIns(); chp = _chpIns; fSetChpIns = fTrue; } else _FetchChpSel(cp1, cp2, &chp); if (!((PTXRD)_ptxtb)->FReplaceRgch(prgch, cch, cp1, cp2 - cp1, &chp)) return fFalse; cp1 += cch; SetSel(cp1, cp1); ShowSel(); if (fSetChpIns) { // preserve the _chpIns _chpIns = chp; _fValidChp = fTrue; } return fTrue; } /*************************************************************************** Copy the selection. ***************************************************************************/ bool TXRG::_FCopySel(PDOCB *ppdocb) { AssertNilOrVarMem(ppdocb); PTXRD ptxrd; if (_cpAnchor == _cpOther) return fFalse; if (pvNil == ppdocb) return fTrue; if (pvNil != (ptxrd = TXRD::PtxrdNew(pvNil))) { long cpMin = LwMin(_cpAnchor, _cpOther); long cpLim = LwMax(_cpAnchor, _cpOther); ptxrd->SuspendUndo(); if (!ptxrd->FReplaceTxrd((PTXRD)_ptxtb, cpMin, cpLim - cpMin, 0, 0, fdocNil)) { ReleasePpo(&ptxrd); } else ptxrd->ResumeUndo(); } *ppdocb = ptxrd; return pvNil != *ppdocb; } /*************************************************************************** Delete the selection. ***************************************************************************/ void TXRG::_ClearSel(void) { FReplace(pvNil, 0, _cpAnchor, _cpOther); ShowSel(); } /*************************************************************************** Paste the selection. ***************************************************************************/ bool TXRG::_FPaste(PCLIP pclip, bool fDoIt, long cid) { AssertThis(0); long cp1, cp2; long ccp; PTXTB ptxtb; bool fRet; if (cid != cidPaste || !pclip->FGetFormat(kclsTXTB)) return fFalse; if (!fDoIt) return fTrue; if (!pclip->FGetFormat(kclsTXRD, (PDOCB *)&ptxtb) && !pclip->FGetFormat(kclsTXTB, (PDOCB *)&ptxtb)) { return fFalse; } AssertPo(ptxtb, 0); if ((ccp = ptxtb->CpMac() - 1) <= 0) { ReleasePpo(&ptxtb); return fTrue; } HideSel(); cp1 = LwMin(_cpAnchor, _cpOther); cp2 = LwMax(_cpAnchor, _cpOther); _ptxtb->BumpCombineUndo(); if (ptxtb->FIs(kclsTXRD)) { fRet = ((PTXRD)_ptxtb)->FReplaceTxrd((PTXRD)ptxtb, 0, ccp, cp1, cp2 - cp1); } else { _EnsureChpIns(); fRet = ((PTXRD)_ptxtb)->FReplaceTxtb(ptxtb, 0, ccp, cp1, cp2 - cp1, &_chpIns); } ReleasePpo(&ptxtb); if (fRet) { _ptxtb->BumpCombineUndo(); cp1 += ccp; SetSel(cp1, cp1); ShowSel(); } return fRet; } /*************************************************************************** Apply the given character properties to the current selection. ***************************************************************************/ bool TXRG::FApplyChp(PCHP pchp, PCHP pchpDiff) { AssertThis(0); AssertVarMem(pchp); AssertNilOrVarMem(pchpDiff); long cpMin, cpLim, cpAnchor, cpOther; ulong grfont; cpMin = LwMin(cpAnchor = _cpAnchor, cpOther = _cpOther); cpLim = LwMax(_cpAnchor, _cpOther); if (cpMin == cpLim) { if (pvNil == pchpDiff) { _chpIns = *pchp; _fValidChp = fTrue; return fTrue; } _EnsureChpIns(); if (fontNil != (grfont = pchp->grfont ^ pchpDiff->grfont)) _chpIns.grfont = (_chpIns.grfont & ~grfont) | (pchp->grfont & grfont); if (pchp->onn != pchpDiff->onn) _chpIns.onn = pchp->onn; if (pchp->dypFont != pchpDiff->dypFont) _chpIns.dypFont = pchp->dypFont; if (pchp->dypOffset != pchpDiff->dypOffset) _chpIns.dypOffset = pchp->dypOffset; if (pchp->acrFore != pchpDiff->acrFore) _chpIns.acrFore = pchp->acrFore; if (pchp->acrBack != pchpDiff->acrBack) _chpIns.acrBack = pchp->acrBack; AssertThis(0); return fTrue; } _SwitchSel(fFalse, ginNil); if (!((PTXRD)_ptxtb)->FApplyChp(cpMin, cpLim - cpMin, pchp, pchpDiff)) { _SwitchSel(fTrue, kginMark); return fFalse; } _fValidChp = fFalse; SetSel(cpAnchor, cpOther); ShowSel(); return fTrue; } /*************************************************************************** Apply the given paragraph properties to the current selection. ***************************************************************************/ bool TXRG::FApplyPap(PPAP ppap, PPAP ppapDiff, bool fExpand) { AssertThis(0); AssertVarMem(ppap); AssertNilOrVarMem(ppapDiff); long cpMin, cpLim, cpAnchor, cpOther; cpMin = LwMin(cpAnchor = _cpAnchor, cpOther = _cpOther); cpLim = LwMax(_cpAnchor, _cpOther); _SwitchSel(fFalse, ginNil); if (!((PTXRD)_ptxtb)->FApplyPap(cpMin, cpLim - cpMin, ppap, ppapDiff, pvNil, pvNil, fExpand)) { _SwitchSel(fTrue, kginMark); return fFalse; } SetSel(cpAnchor, cpOther); ShowSel(); return fTrue; } /*************************************************************************** Apply a character or paragraph property ***************************************************************************/ bool TXRG::FCmdApplyProperty(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); CHP chpOld, chpNew; PAP papOld, papNew; long onn; STN stn; ClearPb(&papOld, size(PAP)); papNew = papOld; _EnsureChpIns(); chpOld = chpNew = _chpIns; switch (pcmd->cid) { case cidPlain: chpNew.grfont = fontNil; chpOld.grfont = (ulong)~fontNil; goto LApplyChp; case cidBold: chpNew.grfont ^= fontBold; goto LApplyChp; case cidItalic: chpNew.grfont ^= fontItalic; goto LApplyChp; case cidUnderline: chpNew.grfont ^= fontUnderline; goto LApplyChp; case cidChooseFont: if (pvNil == pcmd->pgg || pcmd->pgg->IvMac() != 1 || !stn.FSetData(pcmd->pgg->QvGet(0), pcmd->pgg->Cb(0))) { break; } if (!vntl.FGetOnn(&stn, &onn)) break; chpNew.onn = onn; chpOld.onn = ~onn; goto LApplyChp; case cidChooseSubSuper: // the amount to offset by is pcmd->rglw[0] ^ (1L << 31), so 0 can be // used to indicate that we're to ask the user. if (pcmd->rglw[0] == 0) { long dyp = _chpIns.dypOffset; // ask the user for the amount to sub/superscript by if (!_FGetOtherSubSuper(&dyp)) return fTrue; pcmd->rglw[0] = dyp ^ (1L << 31); } chpNew.dypOffset = pcmd->rglw[0] ^ (1L << 31); chpOld.dypOffset = ~chpNew.dypOffset; goto LApplyChp; case cidChooseFontSize: if (pcmd->rglw[0] == 0) { long dyp = _chpIns.dypFont; // ask the user for the font size if (!_FGetOtherSize(&dyp)) return fTrue; pcmd->rglw[0] = dyp; } if (!FIn(pcmd->rglw[0], 6, 256)) return fTrue; chpNew.dypFont = pcmd->rglw[0]; chpOld.dypFont = ~pcmd->rglw[0]; LApplyChp: FApplyChp(&chpNew, &chpOld); break; case cidJustifyLeft: papNew.jc = jcLeft; papOld.jc = jcLim; goto LApplyPap; case cidJustifyCenter: papNew.jc = jcCenter; papOld.jc = jcLim; goto LApplyPap; case cidJustifyRight: papNew.jc = jcRight; papOld.jc = jcLim; goto LApplyPap; case cidIndentNone: papNew.nd = ndNone; papOld.nd = ndLim; goto LApplyPap; case cidIndentFirst: papNew.nd = ndFirst; papOld.nd = ndLim; goto LApplyPap; case cidIndentRest: papNew.nd = ndRest; papOld.nd = ndLim; goto LApplyPap; case cidIndentAll: papNew.nd = ndAll; papOld.nd = ndLim; LApplyPap: FApplyPap(&papNew, &papOld); break; } return fTrue; } /*************************************************************************** Get a font size from the user. ***************************************************************************/ bool TXRG::_FGetOtherSize(long *pdypFont) { AssertThis(0); AssertVarMem(pdypFont); TrashVar(pdypFont); return fFalse; } /*************************************************************************** Get the amount to sub/superscript from the user. ***************************************************************************/ bool TXRG::_FGetOtherSubSuper(long *pdypOffset) { AssertThis(0); AssertVarMem(pdypOffset); TrashVar(pdypOffset); return fFalse; } /*************************************************************************** Apply a character or paragraph property ***************************************************************************/ bool TXRG::FSetColor(ACR *pacrFore, ACR *pacrBack) { AssertThis(0); AssertNilOrPo(pacrFore, 0); AssertNilOrPo(pacrBack, 0); CHP chp, chpDiff; chp.Clear(); chpDiff.Clear(); if (pvNil != pacrFore) { chp.acrFore = *pacrFore; chpDiff.acrFore.SetToInvert(); if (chpDiff.acrFore == chp.acrFore) chpDiff.acrFore.SetToClear(); } if (pvNil != pacrBack) { chp.acrBack = *pacrBack; chpDiff.acrBack.SetToInvert(); if (chpDiff.acrBack == chp.acrBack) chpDiff.acrBack.SetToClear(); } return FApplyChp(&chp, &chpDiff); } /*************************************************************************** Enable, check/uncheck property commands. ***************************************************************************/ bool TXRG::FEnablePropCmd(PCMD pcmd, ulong *pgrfeds) { PAP pap; bool fCheck; STN stn, stnT; _EnsureChpIns(); ((PTXRD)_ptxtb)->FetchPap(LwMin(_cpAnchor, _cpOther), &pap); switch (pcmd->cid) { case cidPlain: fCheck = (_chpIns.grfont == fontNil); break; case cidBold: fCheck = FPure(_chpIns.grfont & fontBold); break; case cidItalic: fCheck = FPure(_chpIns.grfont & fontItalic); break; case cidUnderline: fCheck = FPure(_chpIns.grfont & fontUnderline); break; case cidChooseFont: if (pvNil == pcmd->pgg || pcmd->pgg->IvMac() != 1) break; if (!stnT.FSetData(pcmd->pgg->PvLock(0), pcmd->pgg->Cb(0))) { pcmd->pgg->Unlock(); break; } pcmd->pgg->Unlock(); vntl.GetStn(_chpIns.onn, &stn); fCheck = stn.FEqual(&stnT); break; case cidChooseFontSize: fCheck = (_chpIns.dypFont == pcmd->rglw[0]); break; case cidChooseSubSuper: fCheck = (_chpIns.dypOffset == (pcmd->rglw[0] ^ (1L << 31))); break; case cidJustifyLeft: fCheck = (pap.jc == jcLeft); break; case cidJustifyCenter: fCheck = (pap.jc == jcCenter); break; case cidJustifyRight: fCheck = (pap.jc == jcRight); break; case cidIndentNone: fCheck = (pap.nd == ndNone); break; case cidIndentFirst: fCheck = (pap.nd == ndFirst); break; case cidIndentRest: fCheck = (pap.nd == ndRest); break; case cidIndentAll: fCheck = (pap.nd == ndAll); break; } *pgrfeds = fCheck ? fedsEnable | fedsCheck : fedsEnable | fedsUncheck; return fTrue; } ================================================ FILE: kauai/src/scrcom.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Script compiler. This supports a post-fix (RPN-style) stack base "assembly" language and an in-fix (standard) higher level language similar to "C" in its operator set and syntax. The only data type supported is 32 bit signed integers. The SCCB class can also "disassemble" a script. Compilation is case sensitive. The in-fix compiler supports all valid "C" expressions not involving arrays, pointers or structures, including the ternary operator (?:). Supported control structures include While and If blocks, with the following syntax: While (exp); // statements End; If (exp); // statements Elif (exp); // statements Else; // statements End; The semicolons after the keywords are required (they make compilation easier); the Elif and Else clauses are (of course) optional. A "Break;" primitive is also supported to exit a While loop early. The in-fix compiler also supports "IfGoto(exp, label$);" and "Goto(label$);". These are compiled directly to single op-codes (plus operands) so are treated differently than the control structures. See the _rgarop array below for other function-like primitives supported by the in-fix compiler. Label references appear in the in-fix source as a name followed by a $ sign, eg, "Goto(label$);". Label definitions are a name followed by an @ sign. In the post-fix source, label references are $label and label definitions are @label. Local variables as well as sub-class defined "this" variables and remote variables are supported. Variables are not declared, are case sensitive and have 8 significant characters. During execution, if a variable is used before being assigned to, its value is 0 and a warning is generated. For in-fix compilation, "this" variables are preceeded by a period and remote variables are preceeded by "exp->" where exp is a valid numeric expression. The -> operator has very high precedence, so it's common to have () around the expression. For post-fix compilation, this variables are again prefixed by a period and remote variables are preceeded by a ~. Remote variable accesses use the top stack value for their "address". Use the < operator to push a variable and > to pop the top stack value into a variable. Constants in the source are automatically pushed. Here's a sample post-fix script that computes the 10th Fibonacci number and stores it in a remote variable. The in-fix equivalent is given in the comments. Of course, an in-fix version of this could use a While loop. 1 Dup >a >b 10 >n // a = b = 1; n = 10; $LTest Go // Goto (LTest$); @LLoop // LLoop@ a >b // temp = a; a += b; b = temp; @LTest // LTest@ $LLoop n GoNz // IfGoto (--n, LLoop$); ~answer // 100->answer = a; A compiled script consists of a GL of longs. Each long is one of 3 types: 1) an opcode that acts on a variable: byte : opcode byte : number of immediate longs that follow (at least 1) short: 2 bytes of rtvn data, the other 4 bytes are in the next long 2) an opcode that doesn't involve a variable: byte : 0 byte : number of immediate longs that follow short: opcode 3) immediate data After executing an opcode that doesn't jump, the immediate data is placed on the execution stack en-masse. In the case of a variable opcode, the first long is used as part of the rtvn, so isn't placed on the stack. Label references are considered immediate data and consist of kbLabel in the high byte and the destination index (into the gl) in the low 3 bytes. The first long in the GL is version number information (a dver). ***************************************************************************/ #include "util.h" ASSERTNAME RTCLASS(SCCB) // common error messages PSZ _pszOom = PszLit("Out of memory"); PSZ _pszSyntax = PszLit("Syntax error"); // name to op lookup table for post-fix compilation SZOP _rgszop[] = { {kopAdd, PszLit("Add")}, {kopSub, PszLit("Sub")}, {kopMul, PszLit("Mul")}, {kopDiv, PszLit("Div")}, {kopMod, PszLit("Mod")}, {kopAbs, PszLit("Abs")}, {kopNeg, PszLit("Neg")}, {kopInc, PszLit("Inc")}, {kopDec, PszLit("Dec")}, {kopRnd, PszLit("Rnd")}, {kopMulDiv, PszLit("MulDiv")}, {kopBAnd, PszLit("BAnd")}, {kopBOr, PszLit("BOr")}, {kopBXor, PszLit("BXor")}, {kopBNot, PszLit("BNot")}, {kopLXor, PszLit("LXor")}, {kopLNot, PszLit("LNot")}, {kopEq, PszLit("Eq")}, {kopNe, PszLit("Ne")}, {kopGt, PszLit("Gt")}, {kopLt, PszLit("Lt")}, {kopGe, PszLit("Ge")}, {kopLe, PszLit("Le")}, {kopDup, PszLit("Dup")}, {kopPop, PszLit("Pop")}, {kopSwap, PszLit("Swap")}, {kopRot, PszLit("Rot")}, {kopRev, PszLit("Rev")}, {kopDupList, PszLit("DupList")}, {kopPopList, PszLit("PopList")}, {kopRndList, PszLit("RndList")}, {kopSelect, PszLit("Select")}, {kopGoEq, PszLit("GoEq")}, {kopGoNe, PszLit("GoNe")}, {kopGoGt, PszLit("GoGt")}, {kopGoLt, PszLit("GoLt")}, {kopGoGe, PszLit("GoGe")}, {kopGoLe, PszLit("GoLe")}, {kopGoZ, PszLit("GoZ")}, {kopGoNz, PszLit("GoNz")}, {kopGo, PszLit("Go")}, {kopExit, PszLit("Exit")}, {kopReturn, PszLit("Return")}, {kopSetReturn, PszLit("SetReturn")}, {kopShuffle, PszLit("Shuffle")}, {kopShuffleList, PszLit("ShuffleList")}, {kopNextCard, PszLit("NextCard")}, {kopMatch, PszLit("Match")}, {kopPause, PszLit("Pause")}, {kopCopyStr, PszLit("CopyStr")}, {kopMoveStr, PszLit("MoveStr")}, {kopNukeStr, PszLit("NukeStr")}, {kopMergeStrs, PszLit("MergeStrs")}, {kopScaleTime, PszLit("ScaleTime")}, {kopNumToStr, PszLit("NumToStr")}, {kopStrToNum, PszLit("StrToNum")}, {kopConcatStrs, PszLit("ConcatStrs")}, {kopLenStr, PszLit("LenStr")}, {kopCopySubStr, PszLit("CopySubStr")}, {opNil, pvNil}, }; // name to op look up table for in-fix compilation AROP _rgarop[] = { {kopAbs, PszLit("Abs"), 1, 0, 0, fFalse}, {kopRnd, PszLit("Rnd"), 1, 0, 0, fFalse}, {kopMulDiv, PszLit("MulDiv"), 3, 0, 0, fFalse}, {kopRndList, PszLit("RndList"), 0, 1, 1, fFalse}, {kopSelect, PszLit("Select"), 1, 1, 1, fFalse}, {kopGoNz, PszLit("IfGoto"), 2, 0, 0, fTrue}, {kopGo, PszLit("Goto"), 1, 0, 0, fTrue}, {kopExit, PszLit("Exit"), 0, 0, 0, fTrue}, {kopReturn, PszLit("Return"), 1, 0, 0, fTrue}, {kopSetReturn, PszLit("SetReturn"), 1, 0, 0, fTrue}, {kopShuffle, PszLit("Shuffle"), 1, 0, 0, fTrue}, {kopShuffleList, PszLit("ShuffleList"), 0, 1, 1, fTrue}, {kopNextCard, PszLit("NextCard"), 0, 0, 0, fFalse}, {kopMatch, PszLit("Match"), 2, 2, 1, fFalse}, {kopPause, PszLit("Pause"), 0, 0, 0, fTrue}, {kopCopyStr, PszLit("CopyStr"), 2, 0, 0, fFalse}, {kopMoveStr, PszLit("MoveStr"), 2, 0, 0, fFalse}, {kopNukeStr, PszLit("NukeStr"), 1, 0, 0, fTrue}, {kopMergeStrs, PszLit("MergeStrs"), 2, 0, 0, fTrue}, {kopScaleTime, PszLit("ScaleTime"), 1, 0, 0, fTrue}, {kopNumToStr, PszLit("NumToStr"), 2, 0, 0, fFalse}, {kopStrToNum, PszLit("StrToNum"), 3, 0, 0, fFalse}, {kopConcatStrs, PszLit("ConcatStrs"), 3, 0, 0, fFalse}, {kopLenStr, PszLit("LenStr"), 1, 0, 0, fFalse}, {kopCopySubStr, PszLit("CopySubStr"), 4, 0, 0, fFalse}, {opNil, pvNil, 0, 0, 0, fTrue}, }; PSZ _rgpszKey[] = { PszLit("If"), PszLit("Elif"), PszLit("Else"), PszLit("End"), PszLit("While"), PszLit("Break"), PszLit("Continue"), }; enum { kipszIf, kipszElif, kipszElse, kipszEnd, kipszWhile, kipszBreak, kipszContinue, }; // An opcode long can be followed by at most 255 immediate values #define kclwLimPush 256 // operator flags - for in-fix compilation enum { fopNil = 0, fopOp = 1, // an operator fopAssign = 2, // an assignment operator fopPostAssign = 4, // unary operator acts after using the value fopFunction = 8, // a function fopArray = 16, // an array reference }; // expression tree node - for in-fix compilation struct ETN { short tt; // the token type short op; // operator (or function) to generate short opl; // operator precedence level short grfop; // flags long lwValue; // value if a ttLong; an istn if a ttName long ietn1; // indices into _pgletnTree for the operands long ietn2; long ietn3; long cetnDeep; // depth of the etn tree to here }; // control structure types - these are the keywords that are followed // by a condition (which is why Else is not here). enum { cstNil, cstIf, cstElif, cstWhile, }; // control structure descriptor struct CSTD { long cst; long lwLabel1; // use depends on cst long lwLabel2; // use depends on cst long lwLabel3; // use depends on cst PGL pgletnTree; // for while loops - the expression tree long ietnTop; // the top of the expression tree }; /*************************************************************************** Constructor for a script compiler. ***************************************************************************/ SCCB::SCCB(void) { AssertBaseThis(0); _plexb = pvNil; _pscpt = pvNil; _pgletnTree = pvNil; _pgletnStack = pvNil; _pglcstd = pvNil; _pgstNames = pvNil; _pgstLabel = pvNil; _pgstReq = pvNil; _pmsnk = pvNil; AssertThis(0); } /*************************************************************************** Destructor for a script compiler. ***************************************************************************/ SCCB::~SCCB(void) { AssertThis(0); _Free(); } #ifdef DEBUG /*************************************************************************** Assert the validity of a SCCB. ***************************************************************************/ void SCCB::AssertValid(ulong grf) { SCCB_PAR::AssertValid(0); AssertNilOrPo(_plexb, 0); AssertNilOrPo(_pscpt, 0); AssertNilOrPo(_pgletnTree, 0); AssertNilOrPo(_pgletnStack, 0); AssertNilOrPo(_pglcstd, 0); AssertNilOrPo(_pgstNames, 0); AssertNilOrPo(_pgstLabel, 0); AssertNilOrPo(_pgstReq, 0); AssertNilOrPo(_pmsnk, 0); } /*************************************************************************** Mark memory for the SCCB. ***************************************************************************/ void SCCB::MarkMem(void) { AssertValid(0); SCCB_PAR::MarkMem(); MarkMemObj(_plexb); MarkMemObj(_pscpt); MarkMemObj(_pgletnTree); MarkMemObj(_pgletnStack); if (pvNil != _pglcstd) { long icstd; CSTD cstd; MarkMemObj(_pglcstd); for (icstd = _pglcstd->IvMac(); icstd-- > 0;) { _pglcstd->Get(icstd, &cstd); MarkMemObj(cstd.pgletnTree); } } MarkMemObj(_pgstNames); MarkMemObj(_pgstLabel); MarkMemObj(_pgstReq); MarkMemObj(_pmsnk); } #endif // DEBUG /*************************************************************************** Initializes the script compiler to compile the stream from the given lexer object. pmsnk is a message sink for error reporting. ***************************************************************************/ bool SCCB::_FInit(PLEXB plexb, bool fInFix, PMSNK pmsnk) { AssertThis(0); AssertPo(plexb, 0); AssertPo(pmsnk, 0); long lw; _Free(); _fError = fFalse; _fHitEnd = fFalse; _plexb = plexb; _plexb->AddRef(); _pmsnk = pmsnk; _pmsnk->AddRef(); if (fInFix) { // in-fix compilation requires an expression stack, expression parse // tree and a control structure stack if (pvNil == (_pgletnTree = GL::PglNew(size(ETN))) || pvNil == (_pgletnStack = GL::PglNew(size(ETN))) || pvNil == (_pglcstd = GL::PglNew(size(CSTD)))) { _Free(); return fFalse; } _pgletnTree->SetMinGrow(100); _pgletnStack->SetMinGrow(100); } if (pvNil == (_pscpt = NewObj SCPT) || pvNil == (_pscpt->_pgllw = GL::PglNew(size(long)))) { ReleasePpo(&_pscpt); } else _pscpt->_pgllw->SetMinGrow(100); // code starts at slot 1 because the version numbers are in slot 0. _ilwOpLast = 1; // compiled code must start with an operator _fForceOp = fTrue; // put version info in the script lw = LwHighLow(_SwCur(), _SwBack()); if (pvNil == _pscpt || !_pscpt->_pgllw->FPush(&lw)) _ReportError(_pszOom); _lwLastLabel = 0; // for internal labels AssertThis(0); return fTrue; } /*************************************************************************** Free all memory hanging off this SCCB. ***************************************************************************/ void SCCB::_Free(void) { AssertThis(0); CSTD cstd; ReleasePpo(&_pscpt); ReleasePpo(&_plexb); ReleasePpo(&_pmsnk); ReleasePpo(&_pgstLabel); ReleasePpo(&_pgstReq); ReleasePpo(&_pgletnTree); ReleasePpo(&_pgletnStack); if (pvNil != _pglcstd) { while (_pglcstd->FPop(&cstd)) ReleasePpo(&cstd.pgletnTree); ReleasePpo(&_pglcstd); } ReleasePpo(&_pgstNames); } /*************************************************************************** Compile a script given a lexer object. Compilation is terminated when the lexer's stream is exhausted or token ttEnd is encountered. ttEnd allows scripts to be embedded in source for other tools (such as chomp.exe). ***************************************************************************/ PSCPT SCCB::PscptCompileLex(PLEXB plexb, bool fInFix, PMSNK pmsnk, long ttEnd) { AssertThis(0); AssertPo(plexb, 0); AssertPo(pmsnk, 0); PSCPT pscpt; if (!_FInit(plexb, fInFix, pmsnk)) return pvNil; _ttEnd = ttEnd; if (fInFix) _CompileIn(); else _CompilePost(); // link all the label requests with the labels if (pvNil != _pgstReq) { AssertPo(_pgstReq, 0); long istn; long lw, ilw; STN stn; for (istn = _pgstReq->IstnMac(); istn-- > 0;) { _pgstReq->GetStn(istn, &stn); if (!_FFindLabel(&stn, &lw)) { // undefined label _ReportError(PszLit("Undefined label")); } else if (pvNil != _pscpt) { AssertPo(_pscpt, 0); _pgstReq->GetExtra(istn, &ilw); Assert(B3Lw(lw) == kbLabel, 0); AssertIn(ilw, 1, _pscpt->_pgllw->IvMac()); _pscpt->_pgllw->Put(ilw, &lw); } } } pscpt = _pscpt; _pscpt = pvNil; _Free(); return pscpt; } /*************************************************************************** Compile the given text file and return the executable script. Uses the in-fix or post-fix compiler according to fInFix. ***************************************************************************/ PSCPT SCCB::PscptCompileFil(PFIL pfil, bool fInFix, PMSNK pmsnk) { AssertThis(0); AssertPo(pfil, 0); AssertPo(pmsnk, 0); PSCPT pscpt; PLEXB plexb; if (pvNil == (plexb = NewObj LEXB(pfil))) return pvNil; pscpt = PscptCompileLex(plexb, fInFix, pmsnk); ReleasePpo(&plexb); return pscpt; } /*************************************************************************** Compile a script from the given text file name. ***************************************************************************/ PSCPT SCCB::PscptCompileFni(FNI *pfni, bool fInFix, PMSNK pmsnk) { AssertPo(pfni, ffniFile); AssertPo(pmsnk, 0); PFIL pfil; PSCPT pscpt; if (pvNil == (pfil = FIL::PfilOpen(pfni))) return pvNil; pscpt = PscptCompileFil(pfil, fInFix, pmsnk); ReleasePpo(&pfil); return pscpt; } /*************************************************************************** Get the next token. Returns false if the token is a _ttEnd. ***************************************************************************/ bool SCCB::_FGetTok(PTOK ptok) { AssertBaseThis(0); AssertPo(_plexb, 0); if (_fHitEnd || !_plexb->FGetTok(ptok) || ptok->tt == _ttEnd) { _fHitEnd = fTrue; return fFalse; } return fTrue; } /*************************************************************************** Return the current version number of the script compiler. This is a virtual method so subclasses of SCCB can provide their own version numbers. ***************************************************************************/ short SCCB::_SwCur(void) { AssertBaseThis(0); return kswCurSccb; } /*************************************************************************** Return the back version number of the script compiler. Versions back to here can read this script. ***************************************************************************/ short SCCB::_SwBack(void) { AssertBaseThis(0); return kswBackSccb; } /*************************************************************************** Return the min version number of the script compiler. We can read scripts back to this version. ***************************************************************************/ short SCCB::_SwMin(void) { AssertBaseThis(0); return kswMinSccb; } /*************************************************************************** An error occured. Report it to the message sink. ***************************************************************************/ void SCCB::_ReportError(PSZ psz) { AssertThis(0); AssertPo(_plexb, 0); AssertPo(_pmsnk, 0); STN stn; STN stnFile; ReleasePpo(&_pscpt); _fError = fTrue; _plexb->GetStnFile(&stnFile); stn.FFormatSz(PszLit("%s(%d:%d) : error : %z"), &stnFile, _plexb->LwLine(), _plexb->IchLine() + 1, psz); _pmsnk->ReportLine(stn.Psz()); } /*************************************************************************** The given long is immediate data to be pushed onto the execution stack. ***************************************************************************/ void SCCB::_PushLw(long lw) { AssertThis(0); if (_fError) return; AssertPo(_pscpt, 0); if (_fForceOp || _pscpt->_pgllw->IvMac() - _ilwOpLast >= kclwLimPush) _PushOp(opNil); if (!_fError && !_pscpt->_pgllw->FPush(&lw)) _ReportError(_pszOom); } /*************************************************************************** "Push" a string constant. Puts the string in the string table and emits code to push the corresponding internal variable. ***************************************************************************/ void SCCB::_PushString(PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); RTVN rtvn; long istn; if (_fError) return; AssertPo(_pscpt, 0); if (pvNil == _pscpt->_pgstLiterals && pvNil == (_pscpt->_pgstLiterals = GST::PgstNew()) || !_pscpt->_pgstLiterals->FAddStn(pstn, pvNil, &istn)) { _ReportError(_pszOom); return; } rtvn.lu1 = 0; rtvn.lu2 = istn; _PushVarOp(kopPushLocVar, &rtvn); } /*************************************************************************** Add an opcode to the compiled script. ***************************************************************************/ void SCCB::_PushOp(long op) { AssertThis(0); Assert((long)(short)op == op, "bad opcode"); long lw; if (_fError) return; AssertPo(_pscpt, 0); _EndOp(); // complete the previous opcode _ilwOpLast = _pscpt->_pgllw->IvMac(); lw = LwHighLow(0, (short)op); if (!_pscpt->_pgllw->FPush(&lw)) _ReportError(_pszOom); _fForceOp = fFalse; } /*************************************************************************** Close out an opcode by setting the number of immediate longs that follow. ***************************************************************************/ void SCCB::_EndOp(void) { AssertThis(0); long ilw; long lw; if (_fError) return; AssertPo(_pscpt, 0); ilw = _pscpt->_pgllw->IvMac(); if (_ilwOpLast < ilw - 1) { // set the count of longs in the previous op AssertIn(ilw - _ilwOpLast - 1, 1, kclwLimPush); _pscpt->_pgllw->Get(_ilwOpLast, &lw); lw = LwHighLow(SuHighLow(B3Lw(lw), (byte)(ilw - _ilwOpLast - 1)), SuLow(lw)); _pscpt->_pgllw->Put(_ilwOpLast, &lw); } } /*************************************************************************** Add an opcode that acts on a variable. ***************************************************************************/ void SCCB::_PushVarOp(long op, RTVN *prtvn) { AssertThis(0); Assert((long)(byte)op == op, "bad opcode"); AssertVarMem(prtvn); long lw; _PushOp(opNil); // push a nil op, then fill it in below if (_fError) return; // the high byte is op, the low word is part of the rtvn, the rest of the // rtvn is in the next long AssertPo(_pscpt, 0); Assert(SuHigh(prtvn->lu1) == 0, "bad rtvn"); lw = prtvn->lu1 | (op << 24); _pscpt->_pgllw->Put(_ilwOpLast, &lw); if (!_pscpt->_pgllw->FPush(&prtvn->lu2)) _ReportError(_pszOom); } /*************************************************************************** Look up the indicated label and put it's location in *plwLoc. ***************************************************************************/ bool SCCB::_FFindLabel(PSTN pstn, long *plwLoc) { AssertThis(0); AssertPo(pstn, 0); AssertVarMem(plwLoc); long istn; if (pvNil == _pgstLabel || !_pgstLabel->FFindStn(pstn, &istn, fgstSorted)) { TrashVar(plwLoc); return fFalse; } _pgstLabel->GetExtra(istn, plwLoc); return fTrue; } /*************************************************************************** Add the given label, giving it the current location. ***************************************************************************/ void SCCB::_AddLabel(PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); long lw; long istn; if (pvNil == _pgstLabel && pvNil == (_pgstLabel = GST::PgstNew(size(long), 5, 100))) { _ReportError(_pszOom); return; } if (_pgstLabel->FFindStn(pstn, &istn, fgstSorted)) { _ReportError(PszLit("duplicate label")); return; } lw = LwFromBytes(kbLabel, 0, 0, 0); if (pvNil != _pscpt) { AssertPo(_pscpt, 0); lw |= _pscpt->_pgllw->IvMac(); } Assert(B3Lw(lw) == kbLabel, 0); // a label must address an opcode, not immediate data _fForceOp = fTrue; if (!_pgstLabel->FInsertStn(istn, pstn, &lw)) _ReportError(_pszOom); } /*************************************************************************** Add the label request to the request gst and put an immediate value of 0 in the compiled script. When compilation is finished, we'll write the actual value for the label. ***************************************************************************/ void SCCB::_PushLabelRequest(PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); long lw; if (_fError) return; if (pvNil == _pgstReq && pvNil == (_pgstReq = GST::PgstNew(size(long), 10, 200))) { _ReportError(_pszOom); return; } _PushLw(0); if (_fError) return; AssertPo(_pscpt, 0); lw = _pscpt->_pgllw->IvMac() - 1; if (!_pgstReq->FAddStn(pstn, &lw)) _ReportError(_pszOom); } /*************************************************************************** Add an internal label. These are numeric to avoid conflicting with a user defined label. ***************************************************************************/ void SCCB::_AddLabelLw(long lw) { AssertThis(0); STN stn; stn.FFormatSz(PszLit("0%x"), lw); _AddLabel(&stn); } /*************************************************************************** Push an internal label request. ***************************************************************************/ void SCCB::_PushLabelRequestLw(long lw) { AssertThis(0); STN stn; stn.FFormatSz(PszLit("0%x"), lw); _PushLabelRequest(&stn); } /*************************************************************************** Find the opcode that corresponds to the given stn. ***************************************************************************/ long SCCB::_OpFromStn(PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); return _OpFromStnRgszop(pstn, _rgszop); } /*************************************************************************** Check the pstn against the strings in the prgszop and return the corresponding op code. ***************************************************************************/ long SCCB::_OpFromStnRgszop(PSTN pstn, SZOP *prgszop) { AssertThis(0); AssertPo(pstn, 0); AssertVarMem(prgszop); SZOP *pszop; for (pszop = prgszop; pszop->psz != pvNil; pszop++) { if (pstn->FEqualSz(pszop->psz)) return pszop->op; } return opNil; } /*************************************************************************** Find the string corresponding to the given opcode. This is used during disassembly. ***************************************************************************/ bool SCCB::_FGetStnFromOp(long op, PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); return _FGetStnFromOpRgszop(op, pstn, _rgszop); } /*************************************************************************** Check the op against the ops in the prgszop and return the corresponding string. ***************************************************************************/ bool SCCB::_FGetStnFromOpRgszop(long op, PSTN pstn, SZOP *prgszop) { AssertThis(0); AssertPo(pstn, 0); AssertVarMem(prgszop); SZOP *pszop; for (pszop = prgszop; pszop->psz != pvNil; pszop++) { if (op == pszop->op) { *pstn = pszop->psz; return fTrue; } } pstn->SetNil(); return fFalse; } /*************************************************************************** Compile the post-fix script source in _plexb. ***************************************************************************/ void SCCB::_CompilePost(void) { AssertThis(0); AssertPo(_plexb, 0); TOK tok; long op; RTVN rtvn; while (_FGetTok(&tok)) { switch (tok.tt) { default: _ReportError(_pszSyntax); break; case ttLong: _PushLw(tok.lw); break; case ttString: _PushString(&tok.stn); break; case ttSub: // handle unary minus on constants only if (!_FGetTok(&tok) || tok.tt != ttLong) _ReportError(_pszSyntax); else _PushLw(-tok.lw); break; case ttName: op = _OpFromStn(&tok.stn); if (opNil == op) _ReportError(PszLit("Unknown name")); else _PushOp(op); break; case ttGt: // pop into a variable if (!_FGetTok(&tok)) { _ReportError(_pszSyntax); break; } op = kopPopLocVar; switch (tok.tt) { case ttBNot: op = kopPopRemoteVar; goto LGetName; case ttDot: op = kopPopThisVar; goto LGetName; case ttScope: op = kopPopGlobalVar; goto LGetName; } goto LAcceptName; case ttLt: // push a variable if (!_FGetTok(&tok)) { _ReportError(_pszSyntax); break; } op = kopPushLocVar; switch (tok.tt) { case ttBNot: op = kopPushRemoteVar; goto LGetName; case ttDot: op = kopPushThisVar; goto LGetName; case ttScope: op = kopPushGlobalVar; LGetName: if (!_FGetTok(&tok)) { _ReportError(_pszSyntax); break; } break; } LAcceptName: if (tok.tt == ttBAnd) { // an array access op += kopPushLocArray - kopPushLocVar; if (!_FGetTok(&tok)) { _ReportError(_pszSyntax); break; } } if (tok.tt == ttName && _OpFromStn(&tok.stn) == opNil) { rtvn.SetFromStn(&tok.stn); _PushVarOp(op, &rtvn); } else _ReportError(PszLit("Variable expected")); break; case ttDollar: // label reference if (_FGetTok(&tok) && tok.tt == ttName && _OpFromStn(&tok.stn) == opNil) { _PushLabelRequest(&tok.stn); } else _ReportError(_pszSyntax); break; case ttAt: // label definition if (_FGetTok(&tok) && tok.tt == ttName && _OpFromStn(&tok.stn) == opNil) { _AddLabel(&tok.stn); } else _ReportError(_pszSyntax); break; } } // complete the last opcode _EndOp(); } /*************************************************************************** In-fix compiler declarations and tables. ***************************************************************************/ // operator precedence levels enum { oplNil = 0, koplComma, koplAssign, koplColon, koplLOr, koplLXor, koplLAnd, koplBOr, koplBXor, koplBAnd, koplEq, koplRel, koplShift, koplAdd, koplMul, koplPreUn, koplPostUn, koplGroup, koplNumber, koplRemoteName, koplThisName, koplGlobalName, koplArrayName, koplName, koplMax }; // token-operator map entry struct TOME { short tt; short grfop; short op; short oplResolve; short oplMinRes; short ttPop; short oplPush; }; #define _TomeCore(tt, grfop, op, oplRes, oplMin, ttPop, oplPush) \ { \ tt, grfop, op, oplRes, oplMin, ttPop, oplPush \ } #define _TomeRes(tt, op, oplRes) \ { \ tt, fopOp, op, oplRes, oplRes, ttNil, oplRes \ } #define _TomePush(tt, op, oplPush) \ { \ tt, fopOp, op, oplNil, oplNil, ttNil, oplPush \ } // following a non-operator TOME _rgtomeExp[] = { _TomeCore(ttOpenParen, fopOp | fopFunction, opNil, koplName, koplName, ttNil, oplNil), // function call _TomeCore(ttCloseParen, fopNil, opNil, koplComma, koplComma, ttOpenParen, koplGroup), _TomeCore(ttOpenRef, fopOp | fopArray, opNil, koplName, koplName, ttNil, oplNil), // array reference _TomeCore(ttCloseRef, fopNil, opNil, koplComma, koplComma, ttOpenRef, koplArrayName), _TomeRes(ttAdd, kopAdd, koplAdd), _TomeRes(ttSub, kopSub, koplAdd), _TomeRes(ttMul, kopMul, koplMul), _TomeRes(ttDiv, kopDiv, koplMul), _TomeRes(ttMod, kopMod, koplMul), _TomeCore(ttInc, fopAssign | fopPostAssign, kopInc, koplRemoteName, koplRemoteName, ttNil, koplPostUn), _TomeCore(ttDec, fopAssign | fopPostAssign, kopDec, koplRemoteName, koplRemoteName, ttNil, koplPostUn), _TomeRes(ttBOr, kopBOr, koplBOr), _TomeRes(ttBAnd, kopBAnd, koplBAnd), _TomeRes(ttBXor, kopBXor, koplBXor), _TomeRes(ttShr, kopShr, koplShift), _TomeRes(ttShl, kopShl, koplShift), _TomeRes(ttLOr, opNil, koplLOr), _TomeRes(ttLAnd, opNil, koplLAnd), _TomeRes(ttLXor, kopLXor, koplLXor), _TomeRes(ttEq, kopEq, koplEq), _TomeRes(ttNe, kopNe, koplEq), _TomeRes(ttGt, kopGt, koplRel), _TomeRes(ttGe, kopGe, koplRel), _TomeRes(ttLt, kopLt, koplRel), _TomeRes(ttLe, kopLe, koplRel), _TomeCore(ttAssign, fopAssign | fopOp, opNil, koplAssign + 1, koplRemoteName, ttNil, koplAssign), _TomeCore(ttAAdd, fopAssign | fopOp, kopAdd, koplAssign + 1, koplRemoteName, ttNil, koplAssign), _TomeCore(ttASub, fopAssign | fopOp, kopSub, koplAssign + 1, koplRemoteName, ttNil, koplAssign), _TomeCore(ttAMul, fopAssign | fopOp, kopMul, koplAssign + 1, koplRemoteName, ttNil, koplAssign), _TomeCore(ttADiv, fopAssign | fopOp, kopDiv, koplAssign + 1, koplRemoteName, ttNil, koplAssign), _TomeCore(ttAMod, fopAssign | fopOp, kopMod, koplAssign + 1, koplRemoteName, ttNil, koplAssign), _TomeCore(ttABOr, fopAssign | fopOp, kopBOr, koplAssign + 1, koplRemoteName, ttNil, koplAssign), _TomeCore(ttABAnd, fopAssign | fopOp, kopBAnd, koplAssign + 1, koplRemoteName, ttNil, koplAssign), _TomeCore(ttABXor, fopAssign | fopOp, kopBXor, koplAssign + 1, koplRemoteName, ttNil, koplAssign), _TomeCore(ttAShr, fopAssign | fopOp, kopShr, koplAssign + 1, koplRemoteName, ttNil, koplAssign), _TomeCore(ttAShl, fopAssign | fopOp, kopShl, koplAssign + 1, koplRemoteName, ttNil, koplAssign), _TomeCore(ttQuery, fopOp, opNil, koplLOr, koplLOr, ttNil, oplNil), _TomeCore(ttColon, fopOp, opNil, koplComma, koplComma, ttQuery, koplColon), _TomeRes(ttComma, opNil, koplComma), _TomeCore(ttArrow, fopOp, opNil, koplGroup, koplGroup, ttNil, koplRemoteName), _TomeCore(ttDollar, fopNil, opNil, koplName, koplName, ttNil, koplNumber), _TomeCore(ttAt, fopNil, opNil, koplComma, koplName, ttNil, koplComma), // end of list marker _TomeRes(ttNil, opNil, oplNil)}; // following an operator TOME _rgtomeOp[] = { _TomeCore(ttName, fopNil, opNil, oplNil, oplNil, ttNil, koplName), _TomeCore(ttLong, fopNil, opNil, oplNil, oplNil, ttNil, koplNumber), _TomeCore(ttString, fopNil, opNil, oplNil, oplNil, ttNil, koplNumber), _TomeCore(ttOpenParen, fopOp, opNil, oplNil, oplNil, ttNil, oplNil), // grouping _TomeCore(ttCloseParen, fopNil, opNil, oplNil, oplNil, ttOpenParen, koplGroup), // empty group _TomePush(ttSub, kopNeg, koplPreUn), _TomePush(ttLNot, kopLNot, koplPreUn), _TomePush(ttBNot, kopBNot, koplPreUn), _TomeCore(ttInc, fopOp | fopAssign, kopInc, oplNil, oplNil, ttNil, koplPreUn), _TomeCore(ttDec, fopOp | fopAssign, kopDec, oplNil, oplNil, ttNil, koplPreUn), _TomePush(ttAdd, opNil, koplPreUn), _TomePush(ttDot, opNil, koplThisName), _TomePush(ttScope, opNil, koplGlobalName), // end of list marker _TomeRes(ttNil, opNil, oplNil)}; /*************************************************************************** Find the TOME corresponding to this token and fOp. ***************************************************************************/ TOME *_PtomeFromTt(long tt, bool fOp) { TOME *ptome; for (ptome = fOp ? _rgtomeOp : _rgtomeExp; ttNil != ptome->tt; ptome++) { if (tt == ptome->tt) return ptome; } return pvNil; } /*************************************************************************** Resolve the ETN stack to something at the given opl. ***************************************************************************/ bool SCCB::_FResolveToOpl(long opl, long oplMin, long *pietn) { AssertThis(0); AssertIn(opl, oplNil + 1, koplMax); AssertIn(oplMin, oplNil, koplMax); AssertPo(_pgletnStack, 0); AssertPo(_pgletnTree, 0); AssertVarMem(pietn); ETN etn, etnT; long ietn, cetn; _pgletnStack->Get(_pgletnStack->IvMac() - 1, &etn); if (etn.grfop & fopOp) { Bug("I think this will only happen if a table entry is wrong"); _ReportError(_pszSyntax); return fFalse; } for (;;) { cetn = _pgletnStack->IvMac(); Assert(cetn > 1, "bad stack"); Assert(((ETN *)_pgletnStack->QvGet(cetn - 1))->opl >= opl, "bad opl on top of stack"); _pgletnStack->Get(cetn - 2, &etn); if (etn.opl < opl) break; AssertDo(_pgletnStack->FPop(&etnT), 0); if (!_FAddToTree(&etnT, &ietn)) { _ReportError(_pszOom); return fFalse; } if (ietn == ivNil) return fFalse; if (etn.ietn1 == ivNil) etn.ietn1 = ietn; else if (etn.ietn2 == ivNil) etn.ietn2 = ietn; else { Assert(etn.ietn3 == ivNil, "bad etn"); etn.ietn3 = ietn; } etn.grfop &= ~fopOp; _pgletnStack->Put(cetn - 2, &etn); } AssertDo(_pgletnStack->FPop(&etnT), 0); if (etnT.opl < oplMin) { _ReportError(_pszSyntax); return fFalse; } if (!_FAddToTree(&etnT, pietn)) { _ReportError(_pszOom); return fFalse; } return fTrue; } /*************************************************************************** See if we can simplify the expression because of constant operands and other optimizations, then add it to the tree. Most of this routine is not necessary for non-optimized compilation. This routine could be simplified to nuke () groupings and unary plus operators and just add the rest to _pgletnTree. ***************************************************************************/ bool SCCB::_FAddToTree(ETN *petn, long *pietn) { AssertThis(0); AssertVarMem(petn); AssertVarMem(pietn); long lw1, lw2, lw; bool fConst1, fConst2; ETN etnT1, etnT2, etn; long ietnConst; bool fCommute = fFalse; Assert((petn->ietn3 == ivNil || petn->ietn2 != ivNil) && (petn->ietn2 == ivNil || petn->ietn1 != ivNil), "bad etn"); // get rid of non-function call groupings - they aren't necessary in // the parse tree. if (petn->op == opNil && petn->tt == ttCloseParen) { if (petn->grfop & fopFunction) goto LAdd; Assert(petn->ietn2 == ivNil, "shouldn't be a second operand"); if (petn->ietn1 == ivNil) { _ReportError(_pszSyntax); *pietn = ivNil; return fTrue; } *pietn = petn->ietn1; return fTrue; } if (petn->ietn3 != ivNil || petn->ietn1 == ivNil) goto LAdd; // one or two operands fConst1 = _FConstEtn(petn->ietn1, &lw1); if (petn->ietn2 == ivNil) { // unary operators // nuke unary plus operator if (ttAdd == petn->tt && opNil == petn->op) { *pietn = petn->ietn1; return fTrue; } if (!fConst1) goto LAdd; // optimize unary operators with constant operand switch (petn->op) { default: goto LAdd; case kopNeg: lw = -lw1; break; case kopBNot: lw = ~lw1; break; case kopLNot: lw = !lw1; break; } *pietn = ietnConst = petn->ietn1; goto LSetConst; } // two operands - determine if they are constants fConst2 = _FConstEtn(petn->ietn2, &lw2); if (fConst1 && fConst2) { // optimize binary operators with both operands constants if (petn->op == opNil) { switch (petn->tt) { default: goto LAdd; case ttLOr: lw = lw1 || lw2; break; case ttLAnd: lw = lw1 && lw2; break; } } else if (!_FCombineConstValues(petn->op, lw1, lw2, &lw)) goto LAdd; *pietn = ietnConst = petn->ietn1; goto LSetConst; } // try to combine operand subtrees for the binary operators that are // commutative and associative Assert(!fConst1 || !fConst2, 0); switch (petn->op) { default: break; case kopSub: if (!fConst2) break; // the second argument is constant, but the first is not, so negate the // constant and change the operator to kopAdd _pgletnTree->Get(petn->ietn2, &etnT2); etnT2.lwValue = -etnT2.lwValue; _pgletnTree->Put(petn->ietn2, &etnT2); petn->op = kopAdd; // fall thru case kopAdd: case kopMul: case kopBOr: case kopBAnd: case kopBXor: case kopLXor: // get the two etn's fCommute = fTrue; _pgletnTree->Get(petn->ietn1, &etnT1); _pgletnTree->Get(petn->ietn2, &etnT2); if (fConst1) { // first operand is constant, so swap them Assert(!fConst2, 0); SwapVars(&petn->ietn1, &petn->ietn2); SwapVars(&fConst1, &fConst2); SwapVars(&etnT1, &etnT2); } if (fConst2) { // the second is constant // see if the first has the same op as petn if (etnT1.op != petn->op) break; // see if the first one has a constant second operand if (!_FConstEtn(etnT1.ietn2, &lw1)) break; // all we have to do is modify the first one's second operand AssertDo(_FCombineConstValues(petn->op, lw1, etnT2.lwValue, &lw), 0); *pietn = petn->ietn1; ietnConst = etnT1.ietn2; goto LSetConst; } // neither operand is constant Assert(!fConst1 && !fConst2, 0); // see if the right operands of the operands are constant fConst1 = (etnT1.op == petn->op) && _FConstEtn(etnT1.ietn2, &lw1); fConst2 = (etnT2.op == petn->op) && _FConstEtn(etnT2.ietn2, &lw2); if (fConst1 && fConst2) { // both are constant AssertDo(_FCombineConstValues(petn->op, lw1, lw2, &lw), 0); *pietn = petn->ietn2; etnT1.ietn2 = etnT2.ietn1; etnT2.ietn1 = petn->ietn1; _SetDepth(&etnT1, fTrue); _pgletnTree->Put(petn->ietn1, &etnT1); ietnConst = etnT2.ietn2; _SetDepth(&etnT2); Assert(ietnConst == etnT2.ietn2, "why did _SetDepth move this?"); _pgletnTree->Put(petn->ietn2, &etnT2); LSetConst: _pgletnTree->Get(ietnConst, &etn); Assert(opNil == etn.op && ttLong == etn.tt, 0); Assert(etn.cetnDeep == 1, 0); etn.lwValue = lw; _pgletnTree->Put(ietnConst, &etn); return fTrue; } if (fConst1) { // only the first is constant SwapVars(&etnT1.ietn2, &petn->ietn2); _SetDepth(&etnT1, fTrue); _pgletnTree->Put(petn->ietn1, &etnT1); break; } if (fConst2) { // only the second is constant goto LPivot; } // neither is constant Assert(!fConst1 && !fConst2, 0); if ((etnT1.op == petn->op) == (etnT2.op == petn->op)) { // both the same as petn->op or both different, let _SetDepth // do its thing break; } if (etnT1.op == petn->op) { if (etnT2.ietn1 == ivNil) break; // swap them SwapVars(&petn->ietn1, &petn->ietn2); SwapVars(&etnT1, &etnT2); } Assert(etnT1.op != petn->op && etnT2.op == petn->op, 0); // determine if we want to pivot or swap _pgletnTree->Get(etnT2.ietn2, &etn); if (etn.cetnDeep > etnT1.cetnDeep) { // swap them SwapVars(&petn->ietn1, &petn->ietn2); } else { LPivot: // pivot Assert(etnT2.op == petn->op, 0); etn = *petn; etn.ietn2 = etnT2.ietn2; etn.ietn1 = petn->ietn2; etnT2.ietn2 = etnT2.ietn1; etnT2.ietn1 = petn->ietn1; _SetDepth(&etnT2, fTrue); _pgletnTree->Put(petn->ietn2, &etnT2); petn = &etn; } break; } LAdd: _SetDepth(petn, fCommute); return _pgletnTree->FAdd(petn, pietn); } /*************************************************************************** Set the depth of the ETN from its children. If fCommute is true and the first two children are non-nil, puts the deepest child first. ***************************************************************************/ void SCCB::_SetDepth(ETN *petn, bool fCommute) { AssertThis(0); AssertVarMem(petn); AssertPo(_pgletnTree, 0); ETN etn1, etn2; if (fCommute && petn->ietn1 != ivNil && petn->ietn2 != ivNil) { // put the deeper guy on the left _pgletnTree->Get(petn->ietn1, &etn1); _pgletnTree->Get(petn->ietn2, &etn2); if (etn1.cetnDeep < etn2.cetnDeep || etn1.cetnDeep == etn2.cetnDeep && etn1.op == petn->op && etn2.op != petn->op) { // swap them SwapVars(&petn->ietn1, &petn->ietn2); SwapVars(&etn1, &etn2); } // put as much stuff on the left as we can while (etn2.op == petn->op) { etn1 = etn2; etn1.ietn1 = petn->ietn1; etn1.ietn2 = etn2.ietn1; petn->ietn1 = petn->ietn2; petn->ietn2 = etn2.ietn2; _SetDepth(&etn1, fTrue); _pgletnTree->Put(petn->ietn1, &etn1); _pgletnTree->Get(petn->ietn2, &etn2); } } petn->cetnDeep = 1; if (petn->ietn1 != ivNil) { _pgletnTree->Get(petn->ietn1, &etn1); petn->cetnDeep = LwMax(petn->cetnDeep, etn1.cetnDeep + 1); if (petn->ietn2 != ivNil) { _pgletnTree->Get(petn->ietn2, &etn2); petn->cetnDeep = LwMax(petn->cetnDeep, etn2.cetnDeep + 1); if (petn->ietn3 != ivNil) { _pgletnTree->Get(petn->ietn3, &etn1); petn->cetnDeep = LwMax(petn->cetnDeep, etn1.cetnDeep + 1); } } } } /*************************************************************************** Return true iff the given etn is constant. If so, set *plw to its value. ***************************************************************************/ bool SCCB::_FConstEtn(long ietn, long *plw) { AssertThis(0); AssertVarMem(plw); AssertPo(_pgletnTree, 0); ETN etn; if (ietn != ivNil) { AssertIn(ietn, 0, _pgletnTree->IvMac()); _pgletnTree->Get(ietn, &etn); if (etn.op == opNil && etn.tt == ttLong) { *plw = etn.lwValue; return fTrue; } } TrashVar(plw); return fFalse; } /*************************************************************************** Combine the constant values lw1 and lw2 using the given operator. Put the result in *plw. Return false if we can't combine the values using op. ***************************************************************************/ bool SCCB::_FCombineConstValues(long op, long lw1, long lw2, long *plw) { AssertBaseThis(0); AssertVarMem(plw); switch (op) { default: return fFalse; case kopAdd: *plw = lw1 + lw2; break; case kopSub: *plw = lw1 - lw2; break; case kopMul: *plw = lw1 * lw2; break; case kopDiv: case kopMod: if (lw2 == 0) { _ReportError(PszLit("divide by zero")); *plw = 0; } else *plw = op == kopDiv ? lw1 / lw2 : lw1 % lw2; break; case kopShr: *plw = (ulong)lw1 >> lw2; break; case kopShl: *plw = (ulong)lw1 << lw2; break; case kopBOr: *plw = lw1 | lw2; break; case kopBAnd: *plw = lw1 & lw2; break; case kopBXor: *plw = lw1 ^ lw2; break; case kopLXor: *plw = FPure(lw1) != FPure(lw2); break; case kopEq: *plw = lw1 == lw2; break; case kopNe: *plw = lw1 != lw2; break; case kopGt: *plw = lw1 > lw2; break; case kopLt: *plw = lw1 < lw2; break; case kopGe: *plw = lw1 >= lw2; break; case kopLe: *plw = lw1 <= lw2; break; } return fTrue; } /*************************************************************************** Emit code for the expression tree with top at ietnTop. If pclwArg is not nil, we are pushing function arguments, so the comma operator has to keep the values of both its operands. Otherwise, the comma operator discards the value of its left operand. Values of grfscc include fsccTop, indicating whether a control structure primitive is legal, and fsccWantVoid, indicating whether the emitted code should (not) leave a value on the execution stack. If fsccTop is set, fsccWantVoid should also be set. This is highly recursive, so limit the stack space needed. ***************************************************************************/ void SCCB::_EmitCode(long ietnTop, ulong grfscc, long *pclwArg) { AssertThis(0); AssertPo(_pgletnTree, 0); AssertIn(ietnTop, 0, _pgletnTree->IvMac()); Assert(!(grfscc & fsccTop) || (grfscc & fsccWantVoid), "fsccTop but not fsccWantVoid set"); AssertNilOrVarMem(pclwArg); ETN etn; RTVN rtvn; long opPush, opPop; long clwStack; long lw1, lw2; long cst; _pgletnTree->Get(ietnTop, &etn); // all non-nil operands should come before any nils Assert((etn.ietn3 == ivNil || etn.ietn2 != ivNil) && (etn.ietn2 == ivNil || etn.ietn1 != ivNil), "bad etn"); if (etn.grfop & fopAssign) { // an operator that changes the value of a variable Assert(ivNil != etn.ietn1, "nil ietn1"); Assert(ivNil == etn.ietn3, "non-nil ietn3"); // if we're doing an operation before assigning (eg, +=), // push the variable first if (etn.op != opNil) { _EmitVarAccess(etn.ietn1, &rtvn, &opPush, &opPop, &clwStack); if (clwStack == 1) _PushOp(kopDup); // duplicate the variable access id else if (clwStack > 0) { _PushLw(clwStack); _PushOp(kopDupList); } _PushVarOp(opPush, &rtvn); } // generate the second operand if (etn.ietn2 != ivNil) _EmitCode(etn.ietn2, fsccNil, pvNil); // do the operation (if not post-inc or post-dec) if (etn.op != opNil && !(etn.grfop & fopPostAssign)) _PushOp(etn.op); // duplicate the result if (!(grfscc & fsccWantVoid)) _PushOp(kopDup); // do the operation if post-inc or post-dec if (etn.op != opNil && (etn.grfop & fopPostAssign)) _PushOp(etn.op); // pop the result into the variable if (etn.op == opNil) _EmitVarAccess(etn.ietn1, &rtvn, pvNil, &opPop, pvNil); else if (clwStack == 1) { // need to bring the variable access result to the top if (grfscc & fsccWantVoid) _PushOp(kopSwap); else { // top two items on the stack are the result _PushLw(3); _PushOp(kopRev); } } else if (clwStack > 0) { // top one or two values are the result, next // clwStack values are the variable access values. _PushLw(clwStack + 1 + !(grfscc & fsccWantVoid)); _PushLw(clwStack); _PushOp(kopRot); } _PushVarOp(opPop, &rtvn); return; } if (opNil != etn.op) { if (ivNil != etn.ietn1) { _EmitCode(etn.ietn1, fsccNil, pvNil); if (ivNil != etn.ietn2) { _EmitCode(etn.ietn2, fsccNil, pvNil); if (ivNil != etn.ietn3) _EmitCode(etn.ietn3, fsccNil, pvNil); } } _PushOp(etn.op); if (grfscc & fsccWantVoid) _PushOp(kopPop); return; } // special cases switch (etn.tt) { default: Bug("what is this?"); break; case ttName: // first check for a control structure keyword if (_FHandleCst(ietnTop)) { // if we're not at the top of the parse tree, it's an error if (!(grfscc & fsccTop)) _ReportError(_pszSyntax); break; } // fall thru case ttCloseRef: case ttDot: case ttScope: case ttArrow: // handle pushing a variable _EmitVarAccess(ietnTop, &rtvn, &opPush, pvNil, pvNil); _PushVarOp(opPush, &rtvn); if (grfscc & fsccWantVoid) _PushOp(kopPop); break; case ttLong: // push a constant Assert(ivNil == etn.ietn1, "non-nil ietn1"); if (!(grfscc & fsccWantVoid)) _PushLw(etn.lwValue); break; case ttString: // "push" a constant string Assert(ivNil == etn.ietn1, "non-nil ietn1"); if (!(grfscc & fsccWantVoid)) _PushStringIstn(etn.lwValue); break; case ttDollar: // label reference Assert(ivNil != etn.ietn1, "nil ietn1"); Assert(ivNil == etn.ietn2, "non-nil ietn2"); if (!(grfscc & fsccWantVoid)) _PushLabelRequestIetn(etn.ietn1); break; case ttAt: // label declaration Assert(ivNil != etn.ietn1, "nil ietn1"); Assert(ivNil == etn.ietn2, "non-nil ietn2"); Assert(grfscc & fsccTop, "fsccTop not set for label"); _AddLabelIetn(etn.ietn1); break; case ttCloseParen: // a function call or control structure Assert(etn.grfop & fopFunction, 0); Assert(ivNil != etn.ietn1, "nil ietn1"); Assert(ivNil == etn.ietn3, "non-nil ietn3"); if ((grfscc & fsccTop) && cstNil != (cst = _CstFromName(etn.ietn1))) { // control structure _BeginCst(cst, etn.ietn2); } else { // get the arguments and count them long clwArg; if (etn.ietn2 == ivNil) clwArg = 0; else { clwArg = 1; _EmitCode(etn.ietn2, fsccNil, &clwArg); } _PushOpFromName(etn.ietn1, grfscc, clwArg); } break; case ttComma: if (pvNil != pclwArg) { // we're pushing function arguments Assert(!(grfscc & fsccWantVoid), "bad comma request"); // push function arguments from right to left! _EmitCode(etn.ietn2, fsccNil, pclwArg); (*pclwArg)++; _EmitCode(etn.ietn1, fsccNil, pclwArg); } else { _EmitCode(etn.ietn1, fsccWantVoid, pvNil); _EmitCode(etn.ietn2, grfscc & ~fsccTop, pvNil); } break; case ttColon: // ternary operator Assert(ivNil != etn.ietn3, "nil ietn3"); _PushLabelRequestLw(lw1 = ++_lwLastLabel); _EmitCode(etn.ietn1, fsccNil, pvNil); _PushOp(kopGoNz); _EmitCode(etn.ietn3, grfscc & ~fsccTop, pvNil); _PushLabelRequestLw(lw2 = ++_lwLastLabel); _PushOp(kopGo); _AddLabelLw(lw1); _EmitCode(etn.ietn2, grfscc & ~fsccTop, pvNil); _AddLabelLw(lw2); break; case ttLOr: // logical or - handles short circuiting if (!(grfscc & fsccWantVoid)) _PushLw(1); // assume true _PushLabelRequestLw(lw1 = ++_lwLastLabel); _EmitCode(etn.ietn1, fsccNil, pvNil); _PushOp(kopGoNz); if (!(grfscc & fsccWantVoid)) _PushLabelRequestLw(lw1); _EmitCode(etn.ietn2, grfscc & ~fsccTop, pvNil); if (!(grfscc & fsccWantVoid)) { _PushOp(kopGoNz); _PushOp(kopDec); } _AddLabelLw(lw1); break; case ttLAnd: // logical and - handles short circuiting if (!(grfscc & fsccWantVoid)) _PushLw(0); // assume false _PushLabelRequestLw(lw1 = ++_lwLastLabel); _EmitCode(etn.ietn1, fsccNil, pvNil); _PushOp(kopGoZ); if (!(grfscc & fsccWantVoid)) _PushLabelRequestLw(lw1); _EmitCode(etn.ietn2, grfscc & ~fsccTop, pvNil); if (!(grfscc & fsccWantVoid)) { _PushOp(kopGoZ); _PushOp(kopInc); } _AddLabelLw(lw1); break; } } /*************************************************************************** If the etn is for a control structure, return the cst. ***************************************************************************/ long SCCB::_CstFromName(long ietn) { AssertThis(0); long istn; STN stn; _GetIstnNameFromIetn(ietn, &istn); _GetStnFromIstn(istn, &stn); if (stn.FEqualSz(_rgpszKey[kipszIf])) return cstIf; if (stn.FEqualSz(_rgpszKey[kipszElif])) return cstElif; if (stn.FEqualSz(_rgpszKey[kipszWhile])) return cstWhile; return cstNil; } /*************************************************************************** Begin a new control structure. ***************************************************************************/ void SCCB::_BeginCst(long cst, long ietn) { AssertThis(0); AssertPo(_pglcstd, 0); CSTD cstd; CSTD cstdPrev; long cetn; ClearPb(&cstd, size(cstd)); cstd.cst = cst; cstd.lwLabel1 = ++_lwLastLabel; switch (cst) { default: Bug("why are we here?"); return; case cstWhile: // we do jump optimized loops (putting the conditional at the end). // label 1 is where Continue jumps to cstd.ietnTop = ietn; if (ietn == ivNil) { // no conditional expression, an "infinite" loop _AddLabelLw(cstd.lwLabel1); } else { // copy the etn tree cetn = _pgletnTree->IvMac(); if (pvNil == (cstd.pgletnTree = GL::PglNew(size(ETN), cetn))) { _ReportError(_pszOom); return; } AssertDo(cstd.pgletnTree->FSetIvMac(cetn), 0); CopyPb(_pgletnTree->QvGet(0), cstd.pgletnTree->QvGet(0), LwMul(cetn, size(ETN))); // jump to where the condition will be _PushLabelRequestLw(cstd.lwLabel1); _PushOp(kopGo); // add the label for the top of the loop cstd.lwLabel2 = ++_lwLastLabel; _AddLabelLw(cstd.lwLabel2); } break; case cstIf: // label 1 is used for where to jump if the condition fails goto LTest; case cstElif: // label 1 is used for where to jump if the condition fails // label 2 is used for the end of the entire if block cstd.cst = cstIf; if (_pglcstd->FPop(&cstdPrev)) { if (cstdPrev.cst != cstIf) { _pglcstd->FPush(&cstdPrev); goto LError; } } else { LError: _ReportError(PszLit("unexpected Elif")); ClearPb(&cstdPrev, size(cstdPrev)); cstdPrev.cst = cstIf; cstdPrev.lwLabel1 = ++_lwLastLabel; } // emit code for jumping to the end of the if block cstd.lwLabel2 = cstdPrev.lwLabel2; if (0 == cstd.lwLabel2) cstd.lwLabel2 = ++_lwLastLabel; _PushLabelRequestLw(cstd.lwLabel2); _PushOp(kopGo); // add label that previous condition jumps to on failure _AddLabelLw(cstdPrev.lwLabel1); LTest: // emit code for the expression testing _PushLabelRequestLw(cstd.lwLabel1); if (ietn == ivNil) _ReportError(_pszSyntax); else _EmitCode(ietn, fsccNil, pvNil); _PushOp(kopGoZ); break; } // put the cstd on the stack if (!_pglcstd->FPush(&cstd)) _ReportError(_pszOom); } /*************************************************************************** If this name token is "End", "Break", "Continue" or "Else", deal with it and return true. ***************************************************************************/ bool SCCB::_FHandleCst(long ietn) { AssertThis(0); AssertPo(_pglcstd, 0); long istn; STN stn; CSTD cstd; long icstd; long *plwLabel; _GetIstnNameFromIetn(ietn, &istn); _GetStnFromIstn(istn, &stn); if (stn.FEqualSz(_rgpszKey[kipszElse])) { // an Else if (0 == (icstd = _pglcstd->IvMac())) { _ReportError(PszLit("unexpected Else")); return fTrue; } _pglcstd->Get(--icstd, &cstd); if (cstd.cst != cstIf) { _ReportError(PszLit("unexpected Else")); return fTrue; } // emit code to jump to the end of the if block if (0 == cstd.lwLabel2) cstd.lwLabel2 = ++_lwLastLabel; _PushLabelRequestLw(cstd.lwLabel2); _PushOp(kopGo); // add label that previous condition jumps to on failure _AddLabelLw(cstd.lwLabel1); cstd.cst = cstNil; // so we don't accept another else cstd.lwLabel1 = cstd.lwLabel2; _pglcstd->Put(icstd, &cstd); return fTrue; } if (stn.FEqualSz(_rgpszKey[kipszBreak])) { // a Break - label 3 is where a Break jumps to plwLabel = &cstd.lwLabel3; goto LWhileJump; } if (stn.FEqualSz(_rgpszKey[kipszContinue])) { // a Continue - label 1 is where a Continue jumps to plwLabel = &cstd.lwLabel1; LWhileJump: // find the enclosing While for (icstd = _pglcstd->IvMac();;) { if (icstd-- <= 0) { _ReportError(plwLabel == &cstd.lwLabel1 ? PszLit("unexpected Continue") : PszLit("unexpected Break")); return fTrue; } _pglcstd->Get(icstd, &cstd); if (cstd.cst == cstWhile) break; } if (*plwLabel == 0) { Assert(plwLabel == &cstd.lwLabel3, 0); *plwLabel = ++_lwLastLabel; _pglcstd->Put(icstd, &cstd); } _PushLabelRequestLw(*plwLabel); _PushOp(kopGo); return fTrue; } if (stn.FEqualSz(_rgpszKey[kipszEnd])) { // an End if (!_pglcstd->FPop(&cstd)) { _ReportError(PszLit("unexpected End")); return fTrue; } switch (cstd.cst) { case cstWhile: if (cstd.ietnTop == ivNil) { // an "infinite" loop - jump to the top Assert(cstd.pgletnTree == pvNil, 0); Assert(cstd.lwLabel2 == 0, 0); _PushLabelRequestLw(cstd.lwLabel1); _PushOp(kopGo); } else { AssertPo(cstd.pgletnTree, 0); _AddLabelLw(cstd.lwLabel1); // emit code for the expression testing _PushLabelRequestLw(cstd.lwLabel2); SwapVars(&_pgletnTree, &cstd.pgletnTree); _EmitCode(cstd.ietnTop, fsccNil, pvNil); SwapVars(&_pgletnTree, &cstd.pgletnTree); ReleasePpo(&cstd.pgletnTree); _PushOp(kopGoNz); } // add the Break label if it was used if (cstd.lwLabel3 != 0) _AddLabelLw(cstd.lwLabel3); break; case cstIf: if (cstd.lwLabel2 != 0) _AddLabelLw(cstd.lwLabel2); _AddLabelLw(cstd.lwLabel1); break; default: Assert(cstd.cst == cstNil, "bad cstd"); _AddLabelLw(cstd.lwLabel1); break; } return fTrue; } return fFalse; } /*************************************************************************** Generate the code that handles remote variable access and fill *popPush and *popPop with the appropriate op-codes (kopPushLocVar, etc). Sets *pclwStack to the number of longs on the stack used to access the variable (iff the variable is a remote variable or an array access). Fills in *prtvn. ***************************************************************************/ void SCCB::_EmitVarAccess(long ietn, RTVN *prtvn, long *popPush, long *popPop, long *pclwStack) { AssertThis(0); AssertPo(_pgletnTree, 0); AssertIn(ietn, 0, _pgletnTree->IvMac()); AssertVarMem(prtvn); AssertNilOrVarMem(popPush); AssertNilOrVarMem(popPop); AssertNilOrVarMem(pclwStack); ETN etn; long opPop, opPush; long clwStack = 0; _pgletnTree->Get(ietn, &etn); switch (etn.tt) { default: opPop = kopPopLocVar; opPush = kopPushLocVar; break; case ttDot: Assert(etn.opl == koplThisName, "bad this name etn"); Assert(etn.ietn1 != ivNil && etn.ietn2 == ivNil, "bad this name etn 2"); ietn = etn.ietn1; opPop = kopPopThisVar; opPush = kopPushThisVar; break; case ttScope: Assert(etn.opl == koplGlobalName, "bad global name etn"); Assert(etn.ietn1 != ivNil && etn.ietn2 == ivNil, "bad global name etn 2"); ietn = etn.ietn1; opPop = kopPopGlobalVar; opPush = kopPushGlobalVar; break; case ttArrow: Assert(etn.opl == koplRemoteName, "bad remote name etn"); Assert(etn.ietn1 != ivNil && etn.ietn2 != ivNil && etn.ietn3 == ivNil, "bad remote name etn 2"); _EmitCode(etn.ietn1, fsccNil, pvNil); clwStack++; ietn = etn.ietn2; opPop = kopPopRemoteVar; opPush = kopPushRemoteVar; break; } _pgletnTree->Get(ietn, &etn); if (etn.tt == ttCloseRef) { // an array reference Assert(etn.opl == koplArrayName, "bad array name etn"); Assert(etn.ietn1 != ivNil && etn.ietn2 != ivNil && etn.ietn3 == ivNil, "bad array name etn 2"); _EmitCode(etn.ietn2, fsccNil, pvNil); clwStack++; ietn = etn.ietn1; opPop += kopPopLocArray - kopPopLocVar; opPush += kopPushLocArray - kopPushLocVar; } _GetIstnNameFromIetn(ietn, &etn.lwValue); _GetRtvnFromName(etn.lwValue, prtvn); if (pvNil != pclwStack) *pclwStack = clwStack; if (pvNil != popPush) *popPush = opPush; if (pvNil != popPop) *popPop = opPop; } /*************************************************************************** Push the opcode for a function and verify parameters and return type. ***************************************************************************/ void SCCB::_PushOpFromName(long ietn, ulong grfscc, long clwArg) { AssertThis(0); long istn; STN stn; long op, clwFixed, clwVar, cactMinVar; bool fVoid; _GetIstnNameFromIetn(ietn, &istn); _GetStnFromIstn(istn, &stn); if (!_FGetOpFromName(&stn, &op, &clwFixed, &clwVar, &cactMinVar, &fVoid)) _ReportError(PszLit("unknown function")); else if (clwArg < clwFixed || clwVar == 0 && clwArg > clwFixed || clwVar != 0 && (((clwArg - clwFixed) % clwVar) != 0 || (clwArg - clwFixed) / clwVar < cactMinVar)) { _ReportError(PszLit("Wrong number of parameters")); } else if (!(grfscc & fsccWantVoid) && fVoid) _ReportError(PszLit("Using void return value")); else { if (clwVar > 0) _PushLw((clwArg - clwFixed) / clwVar); _PushOp(op); if ((grfscc & fsccWantVoid) && !fVoid) _PushOp(kopPop); // toss the return value } } /*************************************************************************** Find the string in the given rgarop and get the associated parameter and return type information. ***************************************************************************/ bool SCCB::_FGetArop(PSTN pstn, AROP *prgarop, long *pop, long *pclwFixed, long *pclwVar, long *pcactMinVar, bool *pfVoid) { AssertThis(0); AssertPo(pstn, 0); AssertVarMem(prgarop); AssertVarMem(pop); AssertVarMem(pclwFixed); AssertVarMem(pclwVar); AssertVarMem(pcactMinVar); AssertVarMem(pfVoid); AROP *parop; for (parop = prgarop; parop->psz != pvNil; parop++) { if (pstn->FEqualSz(parop->psz)) { *pop = parop->op; *pclwFixed = parop->clwFixed; *pclwVar = parop->clwVar; *pcactMinVar = parop->cactMinVar; *pfVoid = parop->fVoid; return fTrue; } } return fFalse; } /*************************************************************************** See if the given name is a function and give argument and return type information. ***************************************************************************/ bool SCCB::_FGetOpFromName(PSTN pstn, long *pop, long *pclwFixed, long *pclwVar, long *pcactMinVar, bool *pfVoid) { AssertThis(0); return _FGetArop(pstn, _rgarop, pop, pclwFixed, pclwVar, pcactMinVar, pfVoid); } /*************************************************************************** Add the given string to _pgstNames. ***************************************************************************/ void SCCB::_AddNameRef(PSTN pstn, long *pistn) { AssertThis(0); AssertPo(pstn, 0); AssertVarMem(pistn); if (pvNil == _pgstNames && pvNil == (_pgstNames = GST::PgstNew(0, 5, 100))) { *pistn = 0; _ReportError(_pszOom); return; } // can't sort, because then indices can change if (_pgstNames->FFindStn(pstn, pistn, fgstNil)) return; if (!_pgstNames->FInsertStn(*pistn, pstn)) _ReportError(_pszOom); } /*************************************************************************** Make sure (assert) the given ietn is a name and get the istn for the name. ***************************************************************************/ void SCCB::_GetIstnNameFromIetn(long ietn, long *pistn) { AssertThis(0); AssertPo(_pgletnTree, 0); AssertIn(ietn, 0, _pgletnTree->IvMac()); AssertVarMem(pistn); ETN etn; _pgletnTree->Get(ietn, &etn); Assert(etn.tt == ttName && etn.opl == koplName && etn.op == opNil && etn.ietn1 == ivNil && etn.ietn2 == ivNil && etn.ietn3 == ivNil, "bad name etn"); *pistn = etn.lwValue; } /*************************************************************************** Get the rtvn for the given string (in _pgstNames). ***************************************************************************/ void SCCB::_GetStnFromIstn(long istn, PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); if (pvNil == _pgstNames || !FIn(istn, 0, _pgstNames->IstnMac())) { Assert(_fError, "bad istn"); pstn->SetNil(); return; } _pgstNames->GetStn(istn, pstn); } /*************************************************************************** Get the rtvn for the given string (in _pgstNames). ***************************************************************************/ void SCCB::_GetRtvnFromName(long istn, RTVN *prtvn) { AssertThis(0); AssertVarMem(prtvn); STN stn; _GetStnFromIstn(istn, &stn); if (_FKeyWord(&stn)) _ReportError(PszLit("Using keyword as variable")); prtvn->SetFromStn(&stn); } /*************************************************************************** Determine if the given string is a keyword. ***************************************************************************/ bool SCCB::_FKeyWord(PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); long op, clwFixed, clwVar, cactMinVar; bool fVoid; long ipsz; if (_FGetOpFromName(pstn, &op, &clwFixed, &clwVar, &cactMinVar, &fVoid)) return fTrue; for (ipsz = CvFromRgv(_rgpszKey); ipsz-- > 0;) { if (pstn->FEqualSz(_rgpszKey[ipsz])) return fTrue; } return fFalse; } /*************************************************************************** Push a label request using the name in the given ietn. ***************************************************************************/ void SCCB::_PushLabelRequestIetn(long ietn) { AssertThis(0); long istn; STN stn; _GetIstnNameFromIetn(ietn, &istn); _GetStnFromIstn(istn, &stn); _PushLabelRequest(&stn); } /*************************************************************************** Add the label here. ***************************************************************************/ void SCCB::_AddLabelIetn(long ietn) { AssertThis(0); long istn; STN stn; _GetIstnNameFromIetn(ietn, &istn); _GetStnFromIstn(istn, &stn); _AddLabel(&stn); } /*************************************************************************** "Push" a string constant that is currently in the name string table. ***************************************************************************/ void SCCB::_PushStringIstn(long istn) { AssertThis(0); STN stn; _GetStnFromIstn(istn, &stn); _PushString(&stn); } /*************************************************************************** Compile the in-fix script source. ***************************************************************************/ void SCCB::_CompileIn(void) { AssertThis(0); AssertPo(_plexb, 0); AssertPo(_pgletnStack, 0); AssertPo(_pgletnTree, 0); TOK tok; TOME *ptome; ETN etn, etnT; long ietn; bool fDone; // push the new record ClearPb(&etn, size(etn)); etn.tt = ttNil; etn.grfop = fopOp; if (!_pgletnStack->FPush(&etn)) { _ReportError(_pszOom); return; } for (;;) { fDone = !_FGetTok(&tok); if (fDone || tok.tt == ttSemi) { // end of a statement - emit the code if (_pgletnStack->IvMac() > 1) { // non-empty statement if (!_FResolveToOpl(koplComma, koplComma, &ietn)) { Assert(_fError, "why wasn't an error reported?"); _pgletnStack->FSetIvMac(1); } else if (_pgletnStack->IvMac() != 1) { _ReportError(_pszSyntax); _pgletnStack->FSetIvMac(1); } else _EmitCode(ietn, fsccTop | fsccWantVoid, pvNil); } _pgletnTree->FSetIvMac(0); if (fDone) { _EndOp(); if (_pglcstd->IvMac() != 0) _ReportError(PszLit("unexpected end of source")); break; } continue; } _pgletnStack->Get(_pgletnStack->IvMac() - 1, &etn); ptome = _PtomeFromTt(tok.tt, etn.grfop & fopOp); if (pvNil == ptome) { _ReportError(_pszSyntax); goto LNextLine; } ClearPb(&etn, size(etn)); etn.tt = (short)tok.tt; etn.lwValue = tok.lw; etn.op = ptome->op; etn.opl = ptome->oplPush; etn.grfop = ptome->grfop; etn.ietn1 = etn.ietn2 = etn.ietn3 = ivNil; if (tok.tt == ttName || tok.tt == ttString) _AddNameRef(&tok.stn, &etn.lwValue); // resolve if (oplNil != ptome->oplResolve) { if (!_FResolveToOpl(ptome->oplResolve, ptome->oplMinRes, &etn.ietn1)) { Assert(_fError, "error not set"); goto LNextLine; } } // pop an operator if (ttNil != ptome->ttPop) { if (!_pgletnStack->FPop(&etnT) || etnT.tt != ptome->ttPop || !(etnT.grfop & fopOp)) { _ReportError(_pszSyntax); goto LNextLine; } Assert(etnT.ietn2 == ivNil, "bad etn"); if (etnT.ietn1 != ivNil) { etn.ietn2 = etn.ietn1; etn.ietn1 = etnT.ietn1; if (etnT.grfop & fopFunction) etn.grfop |= fopFunction; } } // push the new record if (!_pgletnStack->FPush(&etn)) { _ReportError(_pszOom); goto LNextLine; } if (tok.tt == ttAt) { // label declaration - emit the code if (!_FResolveToOpl(koplComma, koplComma, &ietn)) { Assert(_fError, "error not set"); goto LNextLine; } if (_pgletnStack->IvMac() != 1) { _ReportError(_pszSyntax); LNextLine: // start parsing after the next semi-colon while (_FGetTok(&tok) && tok.tt != ttSemi) ; _pgletnStack->FSetIvMac(1); } else _EmitCode(ietn, fsccTop | fsccWantVoid, pvNil); _pgletnTree->FSetIvMac(0); } } } /*************************************************************************** Disassemble the script into a message sink (MSNK) and return whether there was an error. ***************************************************************************/ bool SCCB::FDisassemble(PSCPT pscpt, PMSNK pmsnk, PMSNK pmsnkError) { AssertThis(0); AssertPo(pscpt, 0); AssertPo(pmsnk, 0); AssertPo(pmsnkError, 0); RTVN rtvn; long ilwMac, ilw, clwPush; long lw; long op; STN stn; DVER dver; PGL pgllw = pscpt->_pgllw; PSZ pszError = pvNil; AssertPo(pgllw, 0); Assert(pgllw->CbEntry() == size(long), "bad script"); ilwMac = pgllw->IvMac(); if (ilwMac < 1) { pszError = PszLit("No version numbers on script"); goto LFail; } // check the version pgllw->Get(0, &lw); dver.Set(SwHigh(lw), SwLow(lw)); if (!dver.FReadable(_SwCur(), _SwMin())) { pszError = PszLit("Script version doesn't match script compiler version"); goto LFail; } for (ilw = 1;;) { // write the label stn.FFormatSz(PszLit("@L_%04x "), ilw); pmsnk->Report(stn.Psz()); if (ilw >= ilwMac) break; pgllw->Get(ilw++, &lw); clwPush = B2Lw(lw); if (!FIn(clwPush, 0, ilwMac - ilw + 1)) { pszError = PszLit("bad instruction"); goto LFail; } // write the op string if (opNil != (op = B3Lw(lw))) { // this instruction acts on a variable if (clwPush == 0) { pszError = PszLit("bad var instruction"); goto LFail; } clwPush--; rtvn.lu1 = (ulong)SuLow(lw); pgllw->Get(ilw++, &rtvn.lu2); if (rtvn.lu1 == 0) { if (op != kopPushLocVar) { pszError = PszLit("bad variable"); goto LFail; } // string literal if (pvNil == pscpt->_pgstLiterals || !FIn(rtvn.lu2, 0, pscpt->_pgstLiterals->IvMac())) { pszError = PszLit("bad internal variable"); goto LFail; } pscpt->_pgstLiterals->GetStn(rtvn.lu2, &stn); stn.FExpandControls(); pmsnk->Report(PszLit("\"")); pmsnk->Report(stn.Psz()); pmsnk->Report(PszLit("\" ")); } else { bool fArray = fFalse; if (FIn(op, kopMinArray, kopLimArray)) { op += kopPushLocVar - kopPushLocArray; fArray = fTrue; } stn.SetNil(); switch (op) { case kopPushLocVar: stn.FAppendCh(ChLit('<')); break; case kopPopLocVar: stn.FAppendCh(ChLit('>')); break; case kopPushThisVar: stn.FAppendSz(PszLit("<.")); break; case kopPopThisVar: stn.FAppendSz(PszLit(">.")); break; case kopPushGlobalVar: stn.FAppendSz(PszLit("<::")); break; case kopPopGlobalVar: stn.FAppendSz(PszLit(">::")); break; case kopPushRemoteVar: stn.FAppendSz(PszLit("<~")); break; case kopPopRemoteVar: stn.FAppendSz(PszLit(">~")); break; default: pszError = PszLit("bad var op"); goto LFail; } if (fArray) stn.FAppendCh(ChLit('&')); pmsnk->Report(stn.Psz()); rtvn.GetStn(&stn); stn.FAppendCh(kchSpace); pmsnk->Report(stn.Psz()); } } else if (opNil != (op = SuLow(lw))) { // normal opcode if (!_FGetStnFromOp(op, &stn)) { pszError = PszLit("bad op in script"); LFail: if (pmsnkError != pvNil && pszError != pvNil) pmsnkError->ReportLine(pszError); return fFalse; } stn.FAppendCh(kchSpace); pmsnk->Report(stn.Psz()); } // dump the stack stuff while (clwPush-- > 0) { pgllw->Get(ilw++, &lw); if (B3Lw(lw) == kbLabel && FIn(lw &= 0x00FFFFFF, 1, ilwMac + 1)) { // REVIEW shonk: label identification: this isn't foolproof stn.FFormatSz(PszLit("$L_%04x "), lw); pmsnk->Report(stn.Psz()); } else { stn.FFormatSz(PszLit("%d /*0x%x*/ "), lw, lw); pmsnk->Report(stn.Psz()); } } pmsnk->ReportLine(PszLit("")); } pmsnk->ReportLine(PszLit("")); return fTrue; } /*************************************************************************** Set the values of the RTVN from the given stn. Only the first 8 characters of the stn are significant. The high word of lu1 is guaranteed to be zero. ***************************************************************************/ void RTVN::SetFromStn(PSTN pstn) { AssertThisMem(); AssertPo(pstn, 0); byte rgb[8]; byte bT; long lw, ib, ibDst, cbit; long cch = pstn->Cch(); PSZ psz = pstn->Psz(); // There are 52 letters, plus 10 digits, plus the underscore character, // giving a total of 63 valid identifier characters. We encode these // from 1 to 63 and pack them into 6 bits each. This lets us put 8 // characters in 6 bytes. We pad the result with 0's. ClearPb(rgb, 8); ibDst = 0; cbit = 8; for (ib = 0; ib < 8; ib++) { // map the character to its encoded value if (ib >= cch) bT = 0; else { bT = (byte)(schar)psz[ib]; if (FIn(bT, '0', '9' + 1)) bT -= '0' - 1; else if (FIn(bT, 'A', 'Z' + 1)) bT -= 'A' - 11; else if (FIn(bT, 'a', 'z' + 1)) bT -= 'a' - 37; else { Assert(bT == '_', "bad identifier"); bT = 63; } } // pack the encoded value into its 6 bit slot AssertIn(bT, 0, 64); lw = (long)bT << (cbit + 2); rgb[ibDst] = rgb[ibDst] & (-1L << cbit) | B1Lw(lw); if ((cbit += 2) <= 8) rgb[++ibDst] = B0Lw(lw); else cbit -= 8; } // put the bytes together into the rtvn's ulongs. lu1 = LwFromBytes(0, 0, rgb[0], rgb[1]); lu2 = LwFromBytes(rgb[2], rgb[3], rgb[4], rgb[5]); } /*************************************************************************** Get the variable name that an rtvn stores. ***************************************************************************/ void RTVN::GetStn(PSTN pstn) { AssertThisMem(); AssertPo(pstn, 0); byte rgb[8]; byte bT; long ib; // unpack the individual bytes rgb[0] = (byte)((lu1 & 0x0000FC00) >> 10); rgb[1] = (byte)((lu1 & 0x000003F0) >> 4); rgb[2] = (byte)(((lu1 & 0x0000000F) << 2) | ((lu2 & 0xC0000000) >> 30)); rgb[3] = (byte)((lu2 & 0x3F000000) >> 24); rgb[4] = (byte)((lu2 & 0x00FC0000) >> 18); rgb[5] = (byte)((lu2 & 0x0003F000) >> 12); rgb[6] = (byte)((lu2 & 0x00000FC0) >> 6); rgb[7] = (byte)(lu2 & 0x0000003F); // convert the bytes to characters and append them to the stn pstn->SetNil(); for (ib = 0; ib < 8; ib++) { bT = rgb[ib]; if (bT == 0) break; if (FIn(bT, 1, 11)) bT += '0' - 1; else if (FIn(bT, 11, 37)) bT += 'A' - 11; else if (FIn(bT, 37, 63)) bT += 'a' - 37; else { Assert(bT == 63, 0); bT = '_'; } pstn->FAppendCh((achar)bT); } if (lu1 & 0xFFFF0000) { STN stn; stn.FFormatSz(PszLit("[%d]"), SuHigh(lu1)); pstn->FAppendStn(&stn); } } ================================================ FILE: kauai/src/scrcom.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Script compiler declarations. ***************************************************************************/ #ifndef SCRCOM_H #define SCRCOM_H /*************************************************************************** Opcodes for scripts - these are the opcodes that can actually exist in script. They don't necessarily map directly to the compiler's notion of an operator. ***************************************************************************/ // if you change this enum, bump the version numbers below enum { opNil, // ops that act on variables come first kopPushLocVar, kopPopLocVar, kopPushThisVar, kopPopThisVar, kopPushGlobalVar, kopPopGlobalVar, kopPushRemoteVar, kopPopRemoteVar, kopMinArray = 0x80, kopPushLocArray = kopMinArray, kopPopLocArray, kopPushThisArray, kopPopThisArray, kopPushGlobalArray, kopPopGlobalArray, kopPushRemoteArray, kopPopRemoteArray, kopLimArray, kopLimVarSccb = kopLimArray, // ops that just act on the stack - no variables // for the comments below, a is the top value on the execution stack // b is the next to top value on the stack, and c is next on the stack kopAdd = 0x100, // addition: b + a kopSub, // subtraction: b - a kopMul, // multiplication: b * a kopDiv, // integer division: b / a kopMod, // mod: b % a kopNeg, // unary negation: -a kopInc, // unary increment: a + 1 kopDec, // unary decrement: a - 1 kopShr, // shift right: b >> a kopShl, // shift left: b << a kopBOr, // bitwise or: b | a kopBAnd, // bitwise and: b & a kopBXor, // bitwise exclusive or: b ^ a kopBNot, // unary bitwise not: ~a kopLXor, // logical exclusive or: (b != 0) != (a != 0) kopLNot, // unary logical not: !a kopEq, // equality: b == a kopNe, // not equal: b != a kopGt, // greater than: b > a kopLt, // less than: b < a kopGe, // greater or equal: b >= a kopLe, // less or equal: b <= a kopAbs, // unary absolute value: LwAbs(a) kopRnd, // a random number between 0 and a - 1 (inclusive) kopMulDiv, // a * b / c without loss of precision kopDup, // duplicates the top value kopPop, // discards the top value kopSwap, // swaps the top two values kopRot, // rotates b values by a (c is placed a slots deeper in the stack) kopRev, // reverses the next a slots on the stack kopDupList, // duplicates the next a slots on the stack kopPopList, // pops the next a slots on the stack kopRndList, // picks one of the next a stack values at random kopSelect, // picks the b'th entry among the next a stack values kopGoEq, // if (b == a) jumps to label c kopGoNe, // if (b != a) jumps to label c kopGoGt, // if (b > a) jumps to label c kopGoLt, // if (b < a) jumps to label c kopGoGe, // if (b >= a) jumps to label c kopGoLe, // if (b <= a) jumps to label c kopGoZ, // if (a == 0) jumps to label b kopGoNz, // if (a != 0) jumps to label b kopGo, // jumps to label a kopExit, // terminates the script kopReturn, // terminates the script with return value a kopSetReturn, // sets the return value to a kopShuffle, // shuffles the numbers 0,1,..,a-1 for calls to NextCard kopShuffleList, // shuffles the top a values for calls to NextCard kopNextCard, // returns the next value from the shuffled values // when all values have been used, the values are reshuffled kopMatch, // a is a count of pairs, b is the key, c is the default value // if b matches the first of any of the a pairs, the second // value of the pair is pushed. if not, c is pushed. kopPause, // pause the script (can be resumed later from C code) kopCopyStr, // copy a string within the registry kopMoveStr, // move a string within the registry kopNukeStr, // delete a string from the registry kopMergeStrs, // merge a string table into the registry kopScaleTime, // scale the application clock kopNumToStr, // convert a number to a decimal string kopStrToNum, // convert a string to a number kopConcatStrs, // concatenate two strings kopLenStr, // return the number of characters in the string kopCopySubStr, // copy a piece of the string kopLimSccb }; // structure to map a string to an opcode (post-fix) struct SZOP { long op; PSZ psz; }; // structure to map a string to an opcode and argument information (in-fix) struct AROP { long op; PSZ psz; long clwFixed; // number of fixed arguments long clwVar; // number of arguments per variable group long cactMinVar; // minimum number of variable groups bool fVoid; // return a value? }; // script version numbers // if you bump these, also bump the numbers in scrcomg.h const short kswCurSccb = 0xA; // this version const short kswBackSccb = 0xA; // we can be read back to this version const short kswMinSccb = 0xA; // we can read back to this version // high byte of a label value const byte kbLabel = 0xCC; /*************************************************************************** Run-time variable name. The first 8 characters of the name are significant. These 8 characters are packed into lu2 and the low 2 bytes of lu1, so clients can store the info in 6 bytes. The high 2 bytes of lu1 are used for array subscripts. ***************************************************************************/ struct RTVN { ulong lu1; ulong lu2; void SetFromStn(PSTN pstn); void GetStn(PSTN pstn); }; /*************************************************************************** The script compiler base class. ***************************************************************************/ typedef class SCCB *PSCCB; #define SCCB_PAR BASE #define kclsSCCB 'SCCB' class SCCB : public SCCB_PAR { RTCLASS_DEC ASSERT MARKMEM protected: enum { fsccNil = 0, fsccWantVoid = 1, fsccTop = 2 }; PLEXB _plexb; // the lexer PSCPT _pscpt; // the script we're building PGL _pgletnTree; // expression tree (in-fix only) PGL _pgletnStack; // token stack for building expression tree (in-fix only) PGL _pglcstd; // control structure stack (in-fix only) PGST _pgstNames; // encountered names (in-fix only) PGST _pgstLabel; // encountered labels, sorted, extra long is label value PGST _pgstReq; // label references, extra long is address of reference long _ilwOpLast; // address of the last opcode long _lwLastLabel; // for internal temporary labels bool _fError : 1; // whether an error has occured during compiling bool _fForceOp : 1; // when pushing a constant, make sure the last long // is an opcode (because a label references this loc) bool _fHitEnd : 1; // we've exhausted our input stream long _ttEnd; // stop compiling when we see this PMSNK _pmsnk; // the message sink - for error reporting when compiling bool _FInit(PLEXB plexb, bool fInFix, PMSNK pmsnk); void _Free(void); // general compilation methods void _PushLw(long lw); void _PushString(PSTN pstn); void _PushOp(long op); void _EndOp(void); void _PushVarOp(long op, RTVN *prtvn); bool _FFindLabel(PSTN pstn, long *plwLoc); void _AddLabel(PSTN pstn); void _PushLabelRequest(PSTN pstn); void _AddLabelLw(long lw); void _PushLabelRequestLw(long lw); virtual void _ReportError(PSZ psz); virtual short _SwCur(void); virtual short _SwBack(void); virtual short _SwMin(void); virtual bool _FGetTok(PTOK ptok); // post-fix compiler routines virtual void _CompilePost(void); long _OpFromStnRgszop(PSTN pstn, SZOP *prgszop); virtual long _OpFromStn(PSTN pstn); bool _FGetStnFromOpRgszop(long op, PSTN pstn, SZOP *prgszop); virtual bool _FGetStnFromOp(long op, PSTN pstn); // in-fix compiler routines virtual void _CompileIn(void); bool _FResolveToOpl(long opl, long oplMin, long *pietn); void _EmitCode(long ietnTop, ulong grfscc, long *pclwArg); void _EmitVarAccess(long ietn, RTVN *prtvn, long *popPush, long *popPop, long *pclwStack); virtual bool _FGetOpFromName(PSTN pstn, long *pop, long *pclwFixed, long *pclwVar, long *pcactMinVar, bool *pfVoid); bool _FGetArop(PSTN pstn, AROP *prgarop, long *pop, long *pclwFixed, long *pclwVar, long *pcactMinVar, bool *pfVoid); void _PushLabelRequestIetn(long ietn); void _AddLabelIetn(long ietn); void _PushOpFromName(long ietn, ulong grfscc, long clwArg); void _GetIstnNameFromIetn(long ietn, long *pistn); void _GetRtvnFromName(long istn, RTVN *prtvn); bool _FKeyWord(PSTN pstn); void _GetStnFromIstn(long istn, PSTN pstn); void _AddNameRef(PSTN pstn, long *pistn); long _CstFromName(long ietn); void _BeginCst(long cst, long ietn); bool _FHandleCst(long ietn); bool _FAddToTree(struct ETN *petn, long *pietn); bool _FConstEtn(long ietn, long *plw); bool _FCombineConstValues(long op, long lw1, long lw2, long *plw); void _SetDepth(struct ETN *petn, bool fCommute = fFalse); void _PushStringIstn(long istn); public: SCCB(void); ~SCCB(void); virtual PSCPT PscptCompileLex(PLEXB plexb, bool fInFix, PMSNK pmsnk, long ttEnd = ttNil); virtual PSCPT PscptCompileFil(PFIL pfil, bool fInFix, PMSNK pmsnk); virtual PSCPT PscptCompileFni(FNI *pfni, bool fInFix, PMSNK pmsnk); virtual bool FDisassemble(PSCPT pscpt, PMSNK pmsnk, PMSNK pmsnkError = pvNil); }; #endif //! SCRCOM_H ================================================ FILE: kauai/src/scrcomg.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Script compiler for gob based scripts. The real compilation is done at the SCCB class level. The SCCG class just provides mapping of identifiers to opcodes for GOB specific script primitives. ***************************************************************************/ #include "kidframe.h" ASSERTNAME RTCLASS(SCCG) SZOP _rgszopSccg[] = { {kopCreateChildGob, PszLit("CreateChildGob")}, {kopCreateChildThis, PszLit("CreateChildThis")}, {kopDestroyGob, PszLit("DestroyGob")}, {kopDestroyThis, PszLit("DestroyThis")}, {kopResizeGob, PszLit("ResizeGob")}, {kopResizeThis, PszLit("ResizeThis")}, {kopMoveRelGob, PszLit("MoveRelGob")}, {kopMoveRelThis, PszLit("MoveRelThis")}, {kopMoveAbsGob, PszLit("MoveAbsGob")}, {kopMoveAbsThis, PszLit("MoveAbsThis")}, {kopGidThis, PszLit("GidThis")}, {kopGidParGob, PszLit("GidParGob")}, {kopGidParThis, PszLit("GidParThis")}, {kopGidNextSib, PszLit("GidNextSib")}, {kopGidPrevSib, PszLit("GidPrevSib")}, {kopGidChild, PszLit("GidChild")}, {kopFGobExists, PszLit("FGobExists")}, {kopCreateClock, PszLit("CreateClock")}, {kopDestroyClock, PszLit("DestroyClock")}, {kopStartClock, PszLit("StartClock")}, {kopStopClock, PszLit("StopClock")}, {kopTimeCur, PszLit("TimeCur")}, {kopSetAlarm, PszLit("SetAlarm")}, {kopEnqueueCid, PszLit("EnqueueCid")}, {kopAlert, PszLit("Alert")}, {kopRunScriptGob, PszLit("RunScriptGob")}, {kopRunScriptThis, PszLit("RunScriptThis")}, {kopStateGob, PszLit("StateGob")}, {kopStateThis, PszLit("StateThis")}, {kopChangeStateGob, PszLit("ChangeStateGob")}, {kopChangeStateThis, PszLit("ChangeStateThis")}, {kopAnimateGob, PszLit("AnimateGob")}, {kopAnimateThis, PszLit("AnimateThis")}, {kopSetPictureGob, PszLit("SetPictureGob")}, {kopSetPictureThis, PszLit("SetPictureThis")}, {kopSetRepGob, PszLit("SetRepGob")}, {kopSetRepThis, PszLit("SetRepThis")}, {kopXMouseGob, PszLit("XMouseGob")}, {kopXMouseThis, PszLit("XMouseThis")}, {kopYMouseGob, PszLit("YMouseGob")}, {kopYMouseThis, PszLit("YMouseThis")}, {kopGidUnique, PszLit("GidUnique")}, {kopXGob, PszLit("XGob")}, {kopXThis, PszLit("XThis")}, {kopYGob, PszLit("YGob")}, {kopYThis, PszLit("YThis")}, {kopZGob, PszLit("ZGob")}, {kopZThis, PszLit("ZThis")}, {kopSetZGob, PszLit("SetZGob")}, {kopSetZThis, PszLit("SetZThis")}, {kopSetColorTable, PszLit("SetColorTable")}, {kopCell, PszLit("Cell")}, {kopCellNoPause, PszLit("CellNoPause")}, {kopGetModifierState, PszLit("GetModifierState")}, {kopChangeModifierState, PszLit("ChangeModifierState")}, {kopCreateHelpGob, PszLit("CreateHelpGob")}, {kopCreateHelpThis, PszLit("CreateHelpThis")}, {kopTransition, PszLit("Transition")}, {kopGetEdit, PszLit("GetEdit")}, {kopSetEdit, PszLit("SetEdit")}, {kopAlertStr, PszLit("AlertStr")}, {kopGetProp, PszLit("GetProp")}, {kopSetProp, PszLit("SetProp")}, {kopLaunch, PszLit("Launch")}, {kopPlayGob, PszLit("PlayGob")}, {kopPlayThis, PszLit("PlayThis")}, {kopPlayingGob, PszLit("PlayingGob")}, {kopPlayingThis, PszLit("PlayingThis")}, {kopStopGob, PszLit("StopGob")}, {kopStopThis, PszLit("StopThis")}, {kopCurFrameGob, PszLit("CurFrameGob")}, {kopCurFrameThis, PszLit("CurFrameThis")}, {kopCountFramesGob, PszLit("CountFramesGob")}, {kopCountFramesThis, PszLit("CountFramesThis")}, {kopGotoFrameGob, PszLit("GotoFrameGob")}, {kopGotoFrameThis, PszLit("GotoFrameThis")}, {kopFilterCmdsGob, PszLit("FilterCmdsGob")}, {kopFilterCmdsThis, PszLit("FilterCmdsThis")}, {kopDestroyChildrenGob, PszLit("DestroyChildrenGob")}, {kopDestroyChildrenThis, PszLit("DestroyChildrenThis")}, {kopPlaySoundThis, PszLit("PlaySoundThis")}, {kopPlaySoundGob, PszLit("PlaySoundGob")}, {kopStopSound, PszLit("StopSound")}, {kopStopSoundClass, PszLit("StopSoundClass")}, {kopPlayingSound, PszLit("PlayingSound")}, {kopPlayingSoundClass, PszLit("PlayingSoundClass")}, {kopPauseSound, PszLit("PauseSound")}, {kopPauseSoundClass, PszLit("PauseSoundClass")}, {kopResumeSound, PszLit("ResumeSound")}, {kopResumeSoundClass, PszLit("ResumeSoundClass")}, {kopPlayMouseSoundGob, PszLit("PlayMouseSoundGob")}, {kopPlayMouseSoundThis, PszLit("PlayMouseSoundThis")}, {kopRunScriptCnoGob, PszLit("RunScriptCnoGob")}, {kopRunScriptCnoThis, PszLit("RunScriptCnoThis")}, {kopWidthGob, PszLit("WidthGob")}, {kopWidthThis, PszLit("WidthThis")}, {kopHeightGob, PszLit("HeightGob")}, {kopHeightThis, PszLit("HeightThis")}, {kopSetNoSlipGob, PszLit("SetNoSlipGob")}, {kopSetNoSlipThis, PszLit("SetNoSlipThis")}, {kopFIsDescendent, PszLit("FIsDescendent")}, {kopPrint, PszLit("Print")}, {kopPrintStr, PszLit("PrintStr")}, {kopSetMasterVolume, PszLit("SetMasterVolume")}, {kopGetMasterVolume, PszLit("GetMasterVolume")}, {kopStartLongOp, PszLit("StartLongOp")}, {kopEndLongOp, PszLit("EndLongOp")}, {kopSetToolTipSourceGob, PszLit("SetToolTipSourceGob")}, {kopSetToolTipSourceThis, PszLit("SetToolTipSourceThis")}, {kopSetAlarmGob, PszLit("SetAlarmGob")}, {kopSetAlarmThis, PszLit("SetAlarmThis")}, {kopModalHelp, PszLit("ModalHelp")}, {kopFlushUserEvents, PszLit("FlushUserEvents")}, {kopStreamGob, PszLit("StreamGob")}, {kopStreamThis, PszLit("StreamThis")}, {kopPrintStat, PszLit("PrintStat")}, {kopPrintStrStat, PszLit("PrintStrStat")}, {opNil, pvNil}, }; AROP _rgaropSccg[] = { {kopCreateChildGob, PszLit("CreateChildGob"), 3, 0, 0, fFalse}, {kopCreateChildThis, PszLit("CreateChildThis"), 2, 0, 0, fFalse}, {kopDestroyGob, PszLit("DestroyGob"), 1, 0, 0, fTrue}, {kopDestroyThis, PszLit("DestroyThis"), 0, 0, 0, fTrue}, {kopResizeGob, PszLit("ResizeGob"), 3, 0, 0, fTrue}, {kopResizeThis, PszLit("ResizeThis"), 2, 0, 0, fTrue}, {kopMoveRelGob, PszLit("MoveRelGob"), 3, 0, 0, fTrue}, {kopMoveRelThis, PszLit("MoveRelThis"), 2, 0, 0, fTrue}, {kopMoveAbsGob, PszLit("MoveAbsGob"), 3, 0, 0, fTrue}, {kopMoveAbsThis, PszLit("MoveAbsThis"), 2, 0, 0, fTrue}, {kopGidThis, PszLit("GidThis"), 0, 0, 0, fFalse}, {kopGidParGob, PszLit("GidParGob"), 1, 0, 0, fFalse}, {kopGidParThis, PszLit("GidParThis"), 0, 0, 0, fFalse}, {kopGidNextSib, PszLit("GidNextSib"), 1, 0, 0, fFalse}, {kopGidPrevSib, PszLit("GidPrevSib"), 1, 0, 0, fFalse}, {kopGidChild, PszLit("GidChild"), 1, 0, 0, fFalse}, {kopFGobExists, PszLit("FGobExists"), 1, 0, 0, fFalse}, {kopCreateClock, PszLit("CreateClock"), 1, 0, 0, fFalse}, {kopDestroyClock, PszLit("DestroyClock"), 1, 0, 0, fTrue}, {kopStartClock, PszLit("StartClock"), 2, 0, 0, fTrue}, {kopStopClock, PszLit("StopClock"), 1, 0, 0, fTrue}, {kopTimeCur, PszLit("TimeCur"), 1, 0, 0, fFalse}, {kopSetAlarm, PszLit("SetAlarm"), 2, 0, 0, fTrue}, {kopEnqueueCid, PszLit("EnqueueCid"), 6, 0, 0, fTrue}, {kopAlert, PszLit("Alert"), 0, 1, 1, fTrue}, {kopRunScriptGob, PszLit("RunScriptGob"), 2, 1, 0, fFalse}, {kopRunScriptThis, PszLit("RunScriptThis"), 1, 1, 0, fFalse}, {kopStateGob, PszLit("StateGob"), 1, 0, 0, fFalse}, {kopStateThis, PszLit("StateThis"), 0, 0, 0, fFalse}, {kopChangeStateGob, PszLit("ChangeStateGob"), 2, 0, 0, fTrue}, {kopChangeStateThis, PszLit("ChangeStateThis"), 1, 0, 0, fTrue}, {kopAnimateGob, PszLit("AnimateGob"), 2, 0, 0, fTrue}, {kopAnimateThis, PszLit("AnimateThis"), 1, 0, 0, fTrue}, {kopSetPictureGob, PszLit("SetPictureGob"), 2, 0, 0, fTrue}, {kopSetPictureThis, PszLit("SetPictureThis"), 1, 0, 0, fTrue}, {kopSetRepGob, PszLit("SetRepGob"), 2, 0, 0, fTrue}, {kopSetRepThis, PszLit("SetRepThis"), 1, 0, 0, fTrue}, {kopXMouseGob, PszLit("XMouseGob"), 1, 0, 0, fFalse}, {kopXMouseThis, PszLit("XMouseThis"), 0, 0, 0, fFalse}, {kopYMouseGob, PszLit("YMouseGob"), 1, 0, 0, fFalse}, {kopYMouseThis, PszLit("YMouseThis"), 0, 0, 0, fFalse}, {kopGidUnique, PszLit("GidUnique"), 0, 0, 0, fFalse}, {kopXGob, PszLit("XGob"), 1, 0, 0, fFalse}, {kopXThis, PszLit("XThis"), 0, 0, 0, fFalse}, {kopYGob, PszLit("YGob"), 1, 0, 0, fFalse}, {kopYThis, PszLit("YThis"), 0, 0, 0, fFalse}, {kopZGob, PszLit("ZGob"), 1, 0, 0, fFalse}, {kopZThis, PszLit("ZThis"), 0, 0, 0, fFalse}, {kopSetZGob, PszLit("SetZGob"), 2, 0, 0, fTrue}, {kopSetZThis, PszLit("SetZThis"), 1, 0, 0, fTrue}, {kopSetColorTable, PszLit("SetColorTable"), 1, 0, 0, fTrue}, {kopCell, PszLit("Cell"), 4, 0, 0, fTrue}, {kopCellNoPause, PszLit("CellNoPause"), 4, 0, 0, fTrue}, {kopGetModifierState, PszLit("GetModifierState"), 0, 0, 0, fFalse}, {kopChangeModifierState, PszLit("ChangeModifierState"), 2, 0, 0, fTrue}, {kopCreateHelpGob, PszLit("CreateHelpGob"), 2, 0, 0, fFalse}, {kopCreateHelpThis, PszLit("CreateHelpThis"), 1, 0, 0, fFalse}, {kopTransition, PszLit("Transition"), 5, 0, 0, fTrue}, {kopGetEdit, PszLit("GetEdit"), 2, 0, 0, fTrue}, {kopSetEdit, PszLit("SetEdit"), 2, 0, 0, fTrue}, {kopAlertStr, PszLit("AlertStr"), 0, 1, 1, fTrue}, {kopGetProp, PszLit("GetProp"), 1, 0, 0, fFalse}, {kopSetProp, PszLit("SetProp"), 2, 0, 0, fTrue}, {kopLaunch, PszLit("Launch"), 1, 0, 0, fFalse}, {kopPlayGob, PszLit("PlayGob"), 1, 0, 0, fTrue}, {kopPlayThis, PszLit("PlayThis"), 0, 0, 0, fTrue}, {kopPlayingGob, PszLit("PlayingGob"), 1, 0, 0, fFalse}, {kopPlayingThis, PszLit("PlayingThis"), 0, 0, 0, fFalse}, {kopStopGob, PszLit("StopGob"), 1, 0, 0, fTrue}, {kopStopThis, PszLit("StopThis"), 0, 0, 0, fTrue}, {kopCurFrameGob, PszLit("CurFrameGob"), 1, 0, 0, fFalse}, {kopCurFrameThis, PszLit("CurFrameThis"), 0, 0, 0, fFalse}, {kopCountFramesGob, PszLit("CountFramesGob"), 1, 0, 0, fFalse}, {kopCountFramesThis, PszLit("CountFramesThis"), 0, 0, 0, fFalse}, {kopGotoFrameGob, PszLit("GotoFrameGob"), 2, 0, 0, fTrue}, {kopGotoFrameThis, PszLit("GotoFrameThis"), 1, 0, 0, fTrue}, {kopFilterCmdsGob, PszLit("FilterCmdsGob"), 4, 0, 0, fTrue}, {kopFilterCmdsThis, PszLit("FilterCmdsThis"), 3, 0, 0, fTrue}, {kopDestroyChildrenGob, PszLit("DestroyChildrenGob"), 1, 0, 0, fTrue}, {kopDestroyChildrenThis, PszLit("DestroyChildrenThis"), 0, 0, 0, fTrue}, {kopPlaySoundThis, PszLit("PlaySoundThis"), 7, 0, 0, fFalse}, {kopPlaySoundGob, PszLit("PlaySoundGob"), 8, 0, 0, fFalse}, {kopStopSound, PszLit("StopSound"), 1, 0, 0, fTrue}, {kopStopSoundClass, PszLit("StopSoundClass"), 2, 0, 0, fTrue}, {kopPlayingSound, PszLit("PlayingSound"), 1, 0, 0, fFalse}, {kopPlayingSoundClass, PszLit("PlayingSoundClass"), 2, 0, 0, fFalse}, {kopPauseSound, PszLit("PauseSound"), 1, 0, 0, fTrue}, {kopPauseSoundClass, PszLit("PauseSoundClass"), 2, 0, 0, fTrue}, {kopResumeSound, PszLit("ResumeSound"), 1, 0, 0, fTrue}, {kopResumeSoundClass, PszLit("ResumeSoundClass"), 2, 0, 0, fTrue}, {kopPlayMouseSoundGob, PszLit("PlayMouseSoundGob"), 3, 0, 0, fTrue}, {kopPlayMouseSoundThis, PszLit("PlayMouseSoundThis"), 2, 0, 0, fTrue}, {kopRunScriptCnoGob, PszLit("RunScriptCnoGob"), 2, 1, 0, fFalse}, {kopRunScriptCnoThis, PszLit("RunScriptCnoThis"), 1, 1, 0, fFalse}, {kopWidthGob, PszLit("WidthGob"), 1, 0, 0, fFalse}, {kopWidthThis, PszLit("WidthThis"), 0, 0, 0, fFalse}, {kopHeightGob, PszLit("HeightGob"), 1, 0, 0, fFalse}, {kopHeightThis, PszLit("HeightThis"), 0, 0, 0, fFalse}, {kopSetNoSlipGob, PszLit("SetNoSlipGob"), 2, 0, 0, fTrue}, {kopSetNoSlipThis, PszLit("SetNoSlipThis"), 1, 0, 0, fTrue}, {kopFIsDescendent, PszLit("FIsDescendent"), 2, 0, 0, fFalse}, {kopPrint, PszLit("Print"), 0, 1, 1, fTrue}, {kopPrintStr, PszLit("PrintStr"), 0, 1, 1, fTrue}, {kopSetMasterVolume, PszLit("SetMasterVolume"), 1, 0, 0, fTrue}, {kopGetMasterVolume, PszLit("GetMasterVolume"), 0, 0, 0, fFalse}, {kopStartLongOp, PszLit("StartLongOp"), 0, 0, 0, fTrue}, {kopEndLongOp, PszLit("EndLongOp"), 1, 0, 0, fTrue}, {kopSetToolTipSourceGob, PszLit("SetToolTipSourceGob"), 2, 0, 0, fTrue}, {kopSetToolTipSourceThis, PszLit("SetToolTipSourceThis"), 1, 0, 0, fTrue}, {kopSetAlarmGob, PszLit("SetAlarmGob"), 4, 0, 0, fTrue}, {kopSetAlarmThis, PszLit("SetAlarmThis"), 3, 0, 0, fTrue}, {kopModalHelp, PszLit("ModalHelp"), 2, 0, 0, fFalse}, {kopFlushUserEvents, PszLit("FlushUserEvents"), 1, 0, 0, fTrue}, {kopStreamGob, PszLit("StreamGob"), 2, 0, 0, fTrue}, {kopStreamThis, PszLit("StreamThis"), 1, 0, 0, fTrue}, {kopPrintStat, PszLit("PrintStat"), 0, 1, 1, fTrue}, {kopPrintStrStat, PszLit("PrintStrStat"), 0, 1, 1, fTrue}, {opNil, pvNil, 0, 0, 0, fTrue}, }; /*************************************************************************** Map a string to an operator. ***************************************************************************/ long SCCG::_OpFromStn(PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); long op; if (opNil != (op = _OpFromStnRgszop(pstn, _rgszopSccg))) return op; return SCCG_PAR::_OpFromStn(pstn); } /*************************************************************************** Map an op code to a string. ***************************************************************************/ bool SCCG::_FGetStnFromOp(long op, PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); if (_FGetStnFromOpRgszop(op, pstn, _rgszopSccg)) return fTrue; return SCCG_PAR::_FGetStnFromOp(op, pstn); } /*************************************************************************** Map a string to an operator with argument information (for in-fix compiler). ***************************************************************************/ bool SCCG::_FGetOpFromName(PSTN pstn, long *pop, long *pclwFixed, long *pclwVar, long *pcactMinVar, bool *pfVoid) { if (_FGetArop(pstn, _rgaropSccg, pop, pclwFixed, pclwVar, pcactMinVar, pfVoid)) { return fTrue; } return SCCG_PAR::_FGetOpFromName(pstn, pop, pclwFixed, pclwVar, pcactMinVar, pfVoid); } /*************************************************************************** Return the current version number of the script compiler. ***************************************************************************/ short SCCG::_SwCur(void) { return kswCurSccg; } /*************************************************************************** Return the back version number of the script compiler. Versions back to here can read this script. ***************************************************************************/ short SCCG::_SwBack(void) { return kswBackSccg; } /*************************************************************************** Return the min version number of the script compiler. We can read scripts back to this version. ***************************************************************************/ short SCCG::_SwMin(void) { return kswMinSccg; } ================================================ FILE: kauai/src/scrcomg.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Script compiler for the gob based scripts. ***************************************************************************/ #ifndef SCRCOMG_H #define SCRCOMG_H // if you change this enum, bump the version numbers below enum { kopCreateChildGob = 0x1000, kopCreateChildThis, kopDestroyGob, kopDestroyThis, kopResizeGob, kopResizeThis, kopMoveRelGob, kopMoveRelThis, kopMoveAbsGob, kopMoveAbsThis, kopGidThis, kopGidParGob, kopGidParThis, kopGidNextSib, kopGidPrevSib, kopGidChild, kopFGobExists, kopCreateClock, kopDestroyClock, kopStartClock, kopStopClock, kopTimeCur, kopSetAlarm, kopEnqueueCid, kopAlert, kopRunScriptGob, kopRunScriptThis, kopStateGob, kopStateThis, kopChangeStateGob, kopChangeStateThis, kopAnimateGob, kopAnimateThis, kopSetPictureGob, kopSetPictureThis, kopSetRepGob, kopSetRepThis, kopUNUSED100, kopUNUSED101, kopRunScriptCnoGob, kopRunScriptCnoThis, kopXMouseGob, kopXMouseThis, kopYMouseGob, kopYMouseThis, kopGidUnique, kopXGob, kopXThis, kopYGob, kopYThis, kopZGob, kopZThis, kopSetZGob, kopSetZThis, kopSetColorTable, kopCell, kopCellNoPause, kopGetModifierState, kopChangeModifierState, kopCreateHelpGob, kopCreateHelpThis, kopTransition, kopGetEdit, kopSetEdit, kopAlertStr, kopGetProp, kopSetProp, kopLaunch, kopPlayGob, kopPlayThis, kopPlayingGob, kopPlayingThis, kopStopGob, kopStopThis, kopCurFrameGob, kopCurFrameThis, kopCountFramesGob, kopCountFramesThis, kopGotoFrameGob, kopGotoFrameThis, kopFilterCmdsGob, kopFilterCmdsThis, kopDestroyChildrenGob, kopDestroyChildrenThis, kopPlaySoundThis, kopPlaySoundGob, kopStopSound, kopStopSoundClass, kopPlayingSound, kopPlayingSoundClass, kopPauseSound, kopPauseSoundClass, kopResumeSound, kopResumeSoundClass, kopPlayMouseSoundThis, kopPlayMouseSoundGob, kopWidthGob, kopWidthThis, kopHeightGob, kopHeightThis, kopSetNoSlipGob, kopSetNoSlipThis, kopFIsDescendent, kopPrint, kopPrintStr, kopSetMasterVolume, kopGetMasterVolume, kopStartLongOp, kopEndLongOp, kopSetToolTipSourceGob, kopSetToolTipSourceThis, kopSetAlarmGob, kopSetAlarmThis, kopModalHelp, kopFlushUserEvents, kopStreamGob, kopStreamThis, kopPrintStat, kopPrintStrStat, kopLimSccg }; const short kswCurSccg = 0x101D; // this version const short kswBackSccg = 0x101D; // we can be read back to this version const short kswMinSccg = 0x1015; // we can read back to this version /**************************************** Gob based script compiler ****************************************/ typedef class SCCG *PSCCG; #define SCCG_PAR SCCB #define kclsSCCG 'SCCG' class SCCG : public SCCG_PAR { RTCLASS_DEC protected: virtual short _SwCur(void); virtual short _SwBack(void); virtual short _SwMin(void); virtual long _OpFromStn(PSTN pstn); virtual bool _FGetOpFromName(PSTN pstn, long *pop, long *pclwFixed, long *pclwVar, long *pcactMinVar, bool *pfVoid); virtual bool _FGetStnFromOp(long op, PSTN pstn); }; #endif //! SCRCOMG_H ================================================ FILE: kauai/src/screxe.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Script interpreter. See scrcom.cpp for an explanation of the format of compiled scripts. ***************************************************************************/ #include "util.h" ASSERTNAME RTCLASS(SCEB) RTCLASS(SCPT) RTCLASS(STRG) #ifdef DEBUG // these strings are for debug only error messages static STN _stn; #endif // DEBUG /*************************************************************************** Constructor for the script interpreter. ***************************************************************************/ SCEB::SCEB(PRCA prca, PSTRG pstrg) { AssertNilOrPo(prca, 0); AssertNilOrPo(pstrg, 0); _pgllwStack = pvNil; _pglrtvm = pvNil; _pscpt = pvNil; _fPaused = fFalse; _prca = prca; if (pvNil != _prca) _prca->AddRef(); _pstrg = pstrg; if (pvNil != _pstrg) _pstrg->AddRef(); AssertThis(0); } /*************************************************************************** Destructor for the script interpreter. ***************************************************************************/ SCEB::~SCEB(void) { Free(); ReleasePpo(&_prca); ReleasePpo(&_pstrg); } /*************************************************************************** Free our claim to all this stuff. ***************************************************************************/ void SCEB::Free(void) { AssertThis(0); // nuke literal strings left in the global string table if (pvNil != _pscpt && pvNil != _pstrg && pvNil != _pscpt->_pgstLiterals && pvNil != _pglrtvm) { RTVN rtvn; long stid; rtvn.lu1 = 0; for (rtvn.lu2 = _pscpt->_pgstLiterals->IvMac(); rtvn.lu2-- > 0;) { if (FFindRtvm(_pglrtvm, &rtvn, &stid, pvNil)) _pstrg->Delete(stid); } } ReleasePpo(&_pgllwStack); ReleasePpo(&_pglrtvm); ReleasePpo(&_pscpt); _fPaused = fFalse; } #ifdef DEBUG /*************************************************************************** Assert the validity of a SCEB. ***************************************************************************/ void SCEB::AssertValid(ulong grfsceb) { SCEB_PAR::AssertValid(0); if (grfsceb & fscebRunnable) { Assert(pvNil != _pgllwStack, "nil stack"); Assert(pvNil != _pscpt, "nil script"); Assert(_ilwMac == _pscpt->_pgllw->IvMac(), 0); AssertIn(_ilwCur, 1, _ilwMac + 1); Assert(!_fError, 0); } AssertNilOrPo(_pgllwStack, 0); AssertNilOrPo(_pscpt, 0); AssertNilOrPo(_pglrtvm, 0); AssertNilOrPo(_pstrg, 0); AssertNilOrPo(_prca, 0); } /*************************************************************************** Mark memory for the SCEB. ***************************************************************************/ void SCEB::MarkMem(void) { AssertValid(0); SCEB_PAR::MarkMem(); MarkMemObj(_pgllwStack); MarkMemObj(_pscpt); MarkMemObj(_pglrtvm); MarkMemObj(_prca); } #endif // DEBUG /*************************************************************************** Run the given script. (prglw, clw) is the list of parameters for the script. ***************************************************************************/ bool SCEB::FRunScript(PSCPT pscpt, long *prglw, long clw, long *plwReturn, bool *pfPaused) { AssertThis(0); return FAttachScript(pscpt, prglw, clw) && FResume(plwReturn, pfPaused); } /*************************************************************************** Attach a script to this SCEB and pause the script. ***************************************************************************/ bool SCEB::FAttachScript(PSCPT pscpt, long *prglw, long clw) { AssertThis(0); AssertPo(pscpt, 0); AssertIn(clw, 0, kcbMax); AssertPvCb(prglw, LwMul(clw, size(long))); long lw; DVER dver; Free(); _lwReturn = 0; _fError = fFalse; // create the stack GL if (pvNil == (_pgllwStack = GL::PglNew(size(long), 10))) goto LFail; _pgllwStack->SetMinGrow(10); // stake our claim on the code GL. _pscpt = pscpt; _pscpt->AddRef(); // check the version // get and check the version number if ((_ilwMac = _pscpt->_pgllw->IvMac()) < 1) { Bug("No version info on script"); goto LFail; } _pscpt->_pgllw->Get(0, &lw); dver.Set(SwHigh(lw), SwLow(lw)); if (!dver.FReadable(_SwCur(), _SwMin())) { Bug("Script version doesn't match script interpreter version"); goto LFail; } // add the parameters and literal strings if (clw > 0) _AddParameters(prglw, clw); if (pvNil != _pscpt->_pgstLiterals && !_fError) _AddStrings(_pscpt->_pgstLiterals); if (_fError) { LFail: Free(); return fFalse; } // set the pc and claim we're paused _ilwCur = 1; _fPaused = fTrue; AssertThis(fscebRunnable); return fTrue; } /*************************************************************************** Resume a paused script. ***************************************************************************/ bool SCEB::FResume(long *plwReturn, bool *pfPaused) { AssertThis(fscebRunnable); AssertNilOrVarMem(plwReturn); AssertNilOrVarMem(pfPaused); RTVN rtvn; long ilw, clwPush; long lw; long op; TrashVar(plwReturn); TrashVar(pfPaused); if (!_fPaused || _fError) { Bug("script not paused"); goto LFail; } AssertIn(_ilwCur, 1, _ilwMac + 1); for (_fPaused = fFalse; _ilwCur < _ilwMac && !_fError && !_fPaused;) { lw = *(long *)_pscpt->_pgllw->QvGet(_ilwCur++); clwPush = B2Lw(lw); if (!FIn(clwPush, 0, _ilwMac - _ilwCur + 1)) { Bug("bad instruction"); goto LFail; } ilw = _ilwCur; if (opNil != (op = B3Lw(lw))) { // this instruction acts on a variable if (clwPush == 0) { Bug("bad var instruction"); goto LFail; } clwPush--; rtvn.lu1 = (ulong)lw & 0x0000FFFF; rtvn.lu2 = *(ulong *)_pscpt->_pgllw->QvGet(_ilwCur++); ilw = _ilwCur; if (!_FExecVarOp(op, &rtvn)) goto LFail; } else if (opNil != (op = SuLow(lw))) { // normal opcode if (!_FExecOp(op)) goto LFail; } // push the stack stuff (if we didn't do a jump) if (clwPush > 0 && ilw == _ilwCur) { ilw = _pgllwStack->IvMac(); if (!_pgllwStack->FSetIvMac(ilw + clwPush)) { LFail: _Error(fFalse); break; } CopyPb(_pscpt->_pgllw->QvGet(_ilwCur), _pgllwStack->QvGet(ilw), LwMul(clwPush, size(long))); _ilwCur += clwPush; } } if (_ilwCur >= _ilwMac || _fError) _fPaused = fFalse; if (!_fPaused) Free(); if (!_fError && pvNil != plwReturn) *plwReturn = _lwReturn; if (pvNil != pfPaused) *pfPaused = _fPaused; AssertThis(0); return !_fError; } /*************************************************************************** Put the parameters in the local variable list. ***************************************************************************/ void SCEB::_AddParameters(long *prglw, long clw) { AssertThis(0); AssertIn(clw, 1, kcbMax); AssertPvCb(prglw, LwMul(clw, size(long))); STN stn; long ilw; RTVN rtvn; // put the parameters in the local variable gl stn = PszLit("_cparm"); rtvn.SetFromStn(&stn); _AssignVar(&_pglrtvm, &rtvn, clw); stn = PszLit("_parm"); rtvn.SetFromStn(&stn); for (ilw = 0; ilw < clw; ilw++) { rtvn.lu1 = LwHighLow(SwLow(ilw), SwLow(rtvn.lu1)); _AssignVar(&_pglrtvm, &rtvn, prglw[ilw]); } } /*************************************************************************** Put the literal strings into the registry. And assign the string id's to the internal string variables. ***************************************************************************/ void SCEB::_AddStrings(PGST pgst) { AssertThis(0); AssertPo(pgst, 0); RTVN rtvn; long stid; STN stn; if (pvNil == _pstrg) { _Error(fFalse); return; } rtvn.lu1 = 0; for (rtvn.lu2 = 0; (long)rtvn.lu2 < pgst->IvMac(); rtvn.lu2++) { pgst->GetStn(rtvn.lu2, &stn); if (!_pstrg->FAdd(&stid, &stn)) { _Error(fFalse); break; } _AssignVar(&_pglrtvm, &rtvn, stid); if (_fError) { _pstrg->Delete(stid); break; } } } /*************************************************************************** Return the current version number of the script compiler. ***************************************************************************/ short SCEB::_SwCur(void) { AssertBaseThis(0); return kswCurSccb; } /*************************************************************************** Return the min version number of the script compiler. Read can read scripts back to this version. ***************************************************************************/ short SCEB::_SwMin(void) { AssertBaseThis(0); return kswMinSccb; } /*************************************************************************** Execute an instruction that has a variable as an argument. ***************************************************************************/ bool SCEB::_FExecVarOp(long op, RTVN *prtvn) { AssertThis(0); AssertVarMem(prtvn); long lw; if (FIn(op, kopMinArray, kopLimArray)) { // an array access, munge the rtvn lw = _LwPop(); if (_fError) return fFalse; prtvn->lu1 = LwHighLow(SwLow(lw), SwLow(prtvn->lu1)); op += kopPushLocVar - kopPushLocArray; } switch (op) { case kopPushLocVar: _PushVar(_pglrtvm, prtvn); break; case kopPopLocVar: _AssignVar(&_pglrtvm, prtvn, _LwPop()); break; case kopPushThisVar: _PushVar(_PglrtvmThis(), prtvn); break; case kopPopThisVar: _AssignVar(_PpglrtvmThis(), prtvn, _LwPop()); break; case kopPushGlobalVar: _PushVar(_PglrtvmGlobal(), prtvn); break; case kopPopGlobalVar: _AssignVar(_PpglrtvmGlobal(), prtvn, _LwPop()); break; case kopPushRemoteVar: lw = _LwPop(); if (!_fError) _PushVar(_PglrtvmRemote(lw), prtvn); break; case kopPopRemoteVar: lw = _LwPop(); if (!_fError) _AssignVar(_PpglrtvmRemote(lw), prtvn, _LwPop()); break; default: _Error(fTrue); break; } return !_fError; } /*************************************************************************** Execute an instruction. ***************************************************************************/ bool SCEB::_FExecOp(long op) { AssertThis(0); double dou; long lw1, lw2, lw3; // OP's that don't have any arguments switch (op) { case kopExit: // jump to the end _ilwCur = _ilwMac; return fTrue; case kopNextCard: _Push(vsflUtil.LwNext(0)); return fTrue; case kopPause: _fPaused = fTrue; return fTrue; } // OP's that have at least one argument lw1 = _LwPop(); switch (op) { case kopAdd: _Push(_LwPop() + lw1); break; case kopSub: _Push(_LwPop() - lw1); break; case kopMul: _Push(_LwPop() * lw1); break; case kopDiv: if (lw1 == 0) _Error(fTrue); else _Push(_LwPop() / lw1); break; case kopMod: if (lw1 == 0) _Error(fTrue); else _Push(_LwPop() % lw1); break; case kopNeg: _Push(-lw1); break; case kopInc: _Push(lw1 + 1); break; case kopDec: _Push(lw1 - 1); break; case kopShr: _Push((ulong)_LwPop() >> lw1); break; case kopShl: _Push((ulong)_LwPop() << lw1); break; case kopBOr: _Push(_LwPop() | lw1); break; case kopBAnd: _Push(_LwPop() & lw1); break; case kopBXor: _Push(_LwPop() ^ lw1); break; case kopBNot: _Push(~lw1); break; case kopLXor: _Push(FPure(_LwPop()) != FPure(lw1)); break; case kopLNot: _Push(!lw1); break; case kopEq: _Push(_LwPop() == lw1); break; case kopNe: _Push(_LwPop() != lw1); break; case kopGt: _Push(_LwPop() > lw1); break; case kopLt: _Push(_LwPop() < lw1); break; case kopGe: _Push(_LwPop() >= lw1); break; case kopLe: _Push(_LwPop() <= lw1); break; case kopAbs: _Push(LwAbs(lw1)); break; case kopRnd: if (lw1 <= 0) _Error(fTrue); else _Push(vrndUtil.LwNext(lw1)); break; case kopMulDiv: lw2 = _LwPop(); lw3 = _LwPop(); if (lw3 == 0) _Error(fTrue); else { dou = (double)lw1 * lw2 / lw3; if (dou < (double)klwMin || dou > (double)klwMax) _Error(fTrue); else _Push((long)dou); } break; case kopDup: _Push(lw1); _Push(lw1); break; case kopPop: break; case kopSwap: lw2 = _LwPop(); _Push(lw1); _Push(lw2); break; case kopRot: lw2 = _LwPop(); _Rotate(lw2, lw1); break; case kopRev: _Reverse(lw1); break; case kopDupList: _DupList(lw1); break; case kopPopList: _PopList(lw1); break; case kopRndList: _RndList(lw1); break; case kopSelect: _Select(lw1, _LwPop()); break; case kopGoEq: lw1 = (_LwPop() == lw1); goto LGoNz; case kopGoNe: lw1 = (_LwPop() != lw1); goto LGoNz; case kopGoGt: lw1 = (_LwPop() > lw1); goto LGoNz; case kopGoLt: lw1 = (_LwPop() < lw1); goto LGoNz; case kopGoGe: lw1 = (_LwPop() >= lw1); goto LGoNz; case kopGoLe: lw1 = (_LwPop() <= lw1); goto LGoNz; case kopGoZ: lw1 = !lw1; // fall through case kopGoNz: LGoNz: lw2 = _LwPop(); // labels should have their high byte equal to kbLabel if (B3Lw(lw2) != kbLabel || (lw2 &= 0x00FFFFFF) > _ilwMac) _Error(fTrue); else if (lw1 != 0) { // perform the goto _ilwCur = lw2; } break; case kopGo: // labels should have their high byte equal to kbLabel if (B3Lw(lw1) != kbLabel || (lw1 &= 0x00FFFFFF) > _ilwMac) _Error(fTrue); else { // perform the goto _ilwCur = lw1; } break; case kopReturn: // jump to the end _ilwCur = _ilwMac; // fall through case kopSetReturn: _lwReturn = lw1; break; case kopShuffle: if (lw1 <= 0) _Error(fTrue); else vsflUtil.Shuffle(lw1); break; case kopShuffleList: if (lw1 <= 0) _Error(fTrue); else { long *prglw; _pgllwStack->Lock(); prglw = _QlwGet(lw1); if (pvNil != prglw) vsflUtil.ShuffleRglw(lw1, prglw); _pgllwStack->Unlock(); } break; case kopMatch: _Match(lw1); break; case kopCopyStr: _CopySubStr(lw1, 0, kcchMaxStn, _LwPop()); break; case kopMoveStr: if (pvNil == _pstrg) _Error(fTrue); else if (_pstrg->FMove(lw1, lw2 = _LwPop())) _Push(lw2); else _Push(stidNil); break; case kopNukeStr: if (pvNil == _pstrg) _Error(fTrue); else _pstrg->Delete(lw1); break; case kopMergeStrs: _MergeStrings(lw1, _LwPop()); break; case kopScaleTime: vpusac->Scale(lw1); break; case kopNumToStr: _NumToStr(lw1, _LwPop()); break; case kopStrToNum: lw2 = _LwPop(); _StrToNum(lw1, lw2, _LwPop()); break; case kopConcatStrs: lw2 = _LwPop(); _ConcatStrs(lw1, lw2, _LwPop()); break; case kopLenStr: _LenStr(lw1); break; case kopCopySubStr: lw2 = _LwPop(); lw3 = _LwPop(); _CopySubStr(lw1, lw2, lw3, _LwPop()); break; default: _Error(fTrue); break; } return !_fError; } /*************************************************************************** Pop a long off the stack. ***************************************************************************/ long SCEB::_LwPop(void) { long lw, ilw; if (_fError) return 0; // this is faster than just doing FPop if ((ilw = _pgllwStack->IvMac()) == 0) { _Error(fTrue); return 0; } lw = *(long *)_pgllwStack->QvGet(--ilw); AssertDo(_pgllwStack->FSetIvMac(ilw), 0); return lw; } /*************************************************************************** Get a pointer to the element that is clw elements down from the top. ***************************************************************************/ long *SCEB::_QlwGet(long clw) { long ilwMac; if (_fError) return pvNil; ilwMac = _pgllwStack->IvMac(); if (!FIn(clw, 1, ilwMac + 1)) { _Error(fTrue); return pvNil; } return (long *)_pgllwStack->QvGet(ilwMac - clw); } /*************************************************************************** Register an error. ***************************************************************************/ void SCEB::_Error(bool fAssert) { AssertThis(0); if (!_fError) { Assert(!fAssert, "Runtime error in script"); Debug(_WarnSz(PszLit("Runtime error"))); _fError = fTrue; } } #ifdef DEBUG /*************************************************************************** Emits a warning with the given format string and optional parameters. ***************************************************************************/ void SCEB::_WarnSz(PSZ psz, ...) { AssertThis(0); AssertSz(psz); STN stn1, stn2; SZS szs; stn1.FFormatRgch(psz, CchSz(psz), (ulong *)(&psz + 1)); stn2.FFormatSz(PszLit("Script ('%f', 0x%x, %d): %s"), _pscpt->Ctg(), _pscpt->Cno(), _ilwCur, &stn1); stn2.GetSzs(szs); Warn(szs); } #endif // DEBUG /*************************************************************************** Rotate clwTot entries on the stack left by clwShift positions. ***************************************************************************/ void SCEB::_Rotate(long clwTot, long clwShift) { AssertThis(0); long *qlw; if (clwTot == 0 || clwTot == 1) return; qlw = _QlwGet(clwTot); if (qlw != pvNil) { clwShift %= clwTot; if (clwShift < 0) clwShift += clwTot; AssertIn(clwShift, 0, clwTot); if (clwShift != 0) { SwapBlocks(qlw, LwMul(clwShift, size(long)), LwMul(clwTot - clwShift, size(long))); } } } /*************************************************************************** Reverse clw entries on the stack. ***************************************************************************/ void SCEB::_Reverse(long clw) { AssertThis(0); long *qlw, *qlw2; long lw; if (clw == 0 || clw == 1) return; qlw = _QlwGet(clw); if (qlw != pvNil) { for (qlw2 = qlw + clw - 1; qlw2 > qlw;) { lw = *qlw; *qlw++ = *qlw2; *qlw2-- = lw; } } } /*************************************************************************** Duplicate clw entries on the stack. ***************************************************************************/ void SCEB::_DupList(long clw) { AssertThis(0); long *qlw; if (clw == 0) return; //_QlwGet checks for bad values of clw if (_QlwGet(clw) == pvNil) return; if (!_pgllwStack->FSetIvMac(_pgllwStack->IvMac() + clw)) _Error(fFalse); else { qlw = _QlwGet(clw * 2); Assert(qlw != pvNil, "why did _QlwGet fail?"); CopyPb(qlw, qlw + clw, LwMul(clw, size(long))); } } /*************************************************************************** Removes clw entries from the stack. ***************************************************************************/ void SCEB::_PopList(long clw) { AssertThis(0); long ilwMac; if (clw == 0 || _fError) return; ilwMac = _pgllwStack->IvMac(); if (!FIn(clw, 1, ilwMac + 1)) _Error(fTrue); else AssertDo(_pgllwStack->FSetIvMac(ilwMac - clw), "why fail?"); } /*************************************************************************** Select the ilw'th entry from the top clw entries. ilw is indexed from the top entry in and is zero based. ***************************************************************************/ void SCEB::_Select(long clw, long ilw) { AssertThis(0); long *qlw; if (pvNil == (qlw = _QlwGet(clw))) return; if (!FIn(ilw, 0, clw)) _Error(fTrue); else if (clw > 1) { qlw[0] = qlw[clw - 1 - ilw]; _PopList(clw - 1); } } /*************************************************************************** The top value is the key, the next is the default return, then come clw pairs of test values and return values. If the key matches a test value, push the correspongind return value. Otherwise, push the default return value. ***************************************************************************/ void SCEB::_Match(long clw) { AssertThis(0); long *qrglw; long lwKey, lwPush, ilwTest; lwKey = _LwPop(); lwPush = _LwPop(); if (pvNil == (qrglw = _QlwGet(2 * clw))) return; // start at high memory (top of the stack). for (ilwTest = 2 * clw - 1; ilwTest > 0; ilwTest -= 2) { if (qrglw[ilwTest] == lwKey) { lwPush = qrglw[ilwTest - 1]; break; } } qrglw[0] = lwPush; _PopList(2 * clw - 1); } /*************************************************************************** Generates a random entry from a list of numbers on the stack. ***************************************************************************/ void SCEB::_RndList(long clw) { AssertThis(0); if (clw <= 0) _Error(fTrue); else _Select(clw, vrndUtil.LwNext(clw)); } /*************************************************************************** Copy the string from stidSrc to stidDst. ***************************************************************************/ void SCEB::_CopySubStr(long stidSrc, long ichMin, long cch, long stidDst) { AssertThis(0); STN stn; if (pvNil == _pstrg) _Error(fTrue); if (_fError) return; if (!_pstrg->FGet(stidSrc, &stn)) Debug(_WarnSz(PszLit("Source string doesn't exist (stid = %d)"), stidSrc)); if (ichMin > 0) stn.Delete(0, ichMin); if (cch < stn.Cch()) stn.Delete(cch); if (!_pstrg->FPut(stidDst, &stn)) { Debug(_WarnSz(PszLit("Setting dst string failed"))); _Push(stidNil); } else _Push(stidDst); } /*************************************************************************** Concatenate two strings and put the result in a third. Push the id of the destination. ***************************************************************************/ void SCEB::_ConcatStrs(long stidSrc1, long stidSrc2, long stidDst) { AssertThis(0); STN stn1, stn2; if (pvNil == _pstrg) _Error(fTrue); if (_fError) return; if (!_pstrg->FGet(stidSrc1, &stn1)) { Debug(_WarnSz(PszLit("Source string 1 doesn't exist (stid = %d)"), stidSrc1)); } if (!_pstrg->FGet(stidSrc2, &stn2)) { Debug(_WarnSz(PszLit("Source string 2 doesn't exist (stid = %d)"), stidSrc2)); } stn1.FAppendStn(&stn2); if (!_pstrg->FPut(stidDst, &stn1)) { Debug(_WarnSz(PszLit("Setting dst string failed"))); _Push(stidNil); } else _Push(stidDst); } /*************************************************************************** Push the length of the given string. ***************************************************************************/ void SCEB::_LenStr(long stid) { AssertThis(0); STN stn; if (pvNil == _pstrg) _Error(fTrue); if (!_pstrg->FGet(stid, &stn)) { Debug(_WarnSz(PszLit("Source string doesn't exist (stid = %d)"), stid)); } _Push(stn.Cch()); } /*************************************************************************** CRF reader function to read a string registry string table. ***************************************************************************/ bool _FReadStringReg(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb) { AssertPo(pcrf, 0); AssertPo(pblck, fblckReadable); AssertNilOrVarMem(ppbaco); AssertVarMem(pcb); PGST pgst; PCABO pcabo; short bo; *pcb = pblck->Cb(fTrue); if (pvNil == ppbaco) return fTrue; if (!pblck->FUnpackData()) return fFalse; *pcb = pblck->Cb(); if (pvNil == (pgst = GST::PgstRead(pblck, &bo)) || pgst->CbExtra() != size(long)) { goto LFail; } if (kboOther == bo) { long istn, stid; for (istn = pgst->IvMac(); istn-- > 0;) { pgst->GetExtra(istn, &stid); SwapBytesRglw(&stid, 1); pgst->PutExtra(istn, &stid); } } if (pvNil == (pcabo = NewObj CABO(pgst))) { LFail: ReleasePpo(&pgst); TrashVar(pcb); TrashVar(ppbaco); return fFalse; } *ppbaco = pcabo; return fTrue; } /*************************************************************************** Merge a string table into the string registry. ***************************************************************************/ void SCEB::_MergeStrings(CNO cno, RSC rsc) { AssertThis(0); PCABO pcabo; PGST pgst; long istn, stid; STN stn; bool fFail; if (_fError) return; if (pvNil == _pstrg) { Bug("no string registry to put the string in"); _Error(fFalse); return; } if (pvNil == _prca) { Bug("no rca to read string table from"); _Error(fFalse); return; } if (pvNil == (pcabo = (PCABO)_prca->PbacoFetch(kctgStringReg, cno, &_FReadStringReg, pvNil, rsc))) { Debug(_WarnSz(PszLit("Reading string table failed (cno = 0x%x)"), cno)); return; } Assert(pcabo->po->FIs(kclsGST), 0); pgst = (PGST)pcabo->po; Assert(pgst->CbExtra() == size(long), 0); fFail = fFalse; for (istn = pgst->IvMac(); istn-- > 0;) { pgst->GetStn(istn, &stn); pgst->GetExtra(istn, &stid); fFail |= !_pstrg->FPut(stid, &stn); } #ifdef DEBUG if (fFail) _WarnSz(PszLit("Merging string table failed")); #endif // DEBUG pcabo->SetCrep(crepTossFirst); ReleasePpo(&pcabo); } /*************************************************************************** Convert a number to a string and add the string to the registry. ***************************************************************************/ void SCEB::_NumToStr(long lw, long stid) { AssertThis(0); STN stn; if (pvNil == _pstrg) _Error(fTrue); if (_fError) return; stn.FFormatSz(PszLit("%d"), lw); if (!_pstrg->FPut(stid, &stn)) { Debug(_WarnSz(PszLit("Putting string in registry failed"))); stid = stidNil; } _Push(stid); } /*************************************************************************** Convert a string to a number and push the result. If the string is empty, push lwEmpty; if there is an error, push lwError. ***************************************************************************/ void SCEB::_StrToNum(long stid, long lwEmpty, long lwError) { AssertThis(0); STN stn; long lw; if (pvNil == _pstrg) _Error(fTrue); if (_fError) return; _pstrg->FGet(stid, &stn); if (0 == stn.Cch()) lw = lwEmpty; else if (!stn.FGetLw(&lw, 0)) lw = lwError; _Push(lw); } /*************************************************************************** Push the value of a variable onto the runtime stack. ***************************************************************************/ void SCEB::_PushVar(PGL pglrtvm, RTVN *prtvn) { AssertThis(0); AssertVarMem(prtvn); AssertNilOrPo(pglrtvm, 0); long lw; if (_fError) return; if (pvNil == pglrtvm || !FFindRtvm(pglrtvm, prtvn, &lw, pvNil)) { #ifdef DEBUG prtvn->GetStn(&_stn); _WarnSz(PszLit("Pushing uninitialized script variable: %s"), &_stn); #endif // DEBUG _Push(0); } else _Push(lw); } /*************************************************************************** Pop the top value off the runtime stack into a variable. ***************************************************************************/ void SCEB::_AssignVar(PGL *ppglrtvm, RTVN *prtvn, long lw) { AssertThis(0); AssertVarMem(prtvn); AssertNilOrVarMem(ppglrtvm); if (_fError) return; if (pvNil == ppglrtvm) { _Error(fTrue); return; } if (!FAssignRtvm(ppglrtvm, prtvn, lw)) _Error(fFalse); } /*************************************************************************** Get the variable map for "this" object. ***************************************************************************/ PGL SCEB::_PglrtvmThis(void) { PGL *ppgl = _PpglrtvmThis(); if (pvNil == ppgl) return pvNil; return *ppgl; } /*************************************************************************** Get the adress of the variable map master pointer for "this" object (so we can create the variable map if need be). ***************************************************************************/ PGL *SCEB::_PpglrtvmThis(void) { return pvNil; } /*************************************************************************** Get the variable map for "global" variables. ***************************************************************************/ PGL SCEB::_PglrtvmGlobal(void) { PGL *ppgl = _PpglrtvmGlobal(); if (pvNil == ppgl) return pvNil; return *ppgl; } /*************************************************************************** Get the adress of the variable map master pointer for "global" variables (so we can create the variable map if need be). ***************************************************************************/ PGL *SCEB::_PpglrtvmGlobal(void) { return pvNil; } /*************************************************************************** Get the variable map for a remote object. ***************************************************************************/ PGL SCEB::_PglrtvmRemote(long lw) { PGL *ppgl = _PpglrtvmRemote(lw); if (pvNil == ppgl) return pvNil; return *ppgl; } /*************************************************************************** Get the adress of the variable map master pointer for a remote object (so we can create the variable map if need be). ***************************************************************************/ PGL *SCEB::_PpglrtvmRemote(long lw) { return pvNil; } /*************************************************************************** Find a RTVM in the pglrtvm. Assumes the pglrtvm is sorted by rtvn. If the RTVN is not in the GL, sets *pirtvm to where it would be if it were. ***************************************************************************/ bool FFindRtvm(PGL pglrtvm, RTVN *prtvn, long *plw, long *pirtvm) { AssertPo(pglrtvm, 0); AssertVarMem(prtvn); AssertNilOrVarMem(plw); AssertNilOrVarMem(pirtvm); RTVM *qrgrtvm, *qrtvm; long irtvm, irtvmMin, irtvmLim; qrgrtvm = (RTVM *)pglrtvm->QvGet(0); for (irtvmMin = 0, irtvmLim = pglrtvm->IvMac(); irtvmMin < irtvmLim;) { irtvm = (irtvmMin + irtvmLim) / 2; qrtvm = qrgrtvm + irtvm; if (qrtvm->rtvn.lu1 < prtvn->lu1) irtvmMin = irtvm + 1; else if (qrtvm->rtvn.lu1 > prtvn->lu1) irtvmLim = irtvm; else if (qrtvm->rtvn.lu2 < prtvn->lu2) irtvmMin = irtvm + 1; else if (qrtvm->rtvn.lu2 > prtvn->lu2) irtvmLim = irtvm; else { // we found it if (pvNil != plw) *plw = qrtvm->lwValue; if (pvNil != pirtvm) *pirtvm = irtvm; return fTrue; } } TrashVar(plw); if (pvNil != pirtvm) *pirtvm = irtvmMin; return fFalse; } /*************************************************************************** Put the given value into a runtime variable. ***************************************************************************/ bool FAssignRtvm(PGL *ppglrtvm, RTVN *prtvn, long lw) { AssertVarMem(ppglrtvm); AssertNilOrPo(*ppglrtvm, 0); AssertVarMem(prtvn); RTVM rtvm; long irtvm; rtvm.lwValue = lw; rtvm.rtvn = *prtvn; if (pvNil == *ppglrtvm) { if (pvNil == (*ppglrtvm = GL::PglNew(size(RTVM)))) return fFalse; (*ppglrtvm)->SetMinGrow(10); irtvm = 0; } else if (FFindRtvm(*ppglrtvm, prtvn, pvNil, &irtvm)) { (*ppglrtvm)->Put(irtvm, &rtvm); return fTrue; } return (*ppglrtvm)->FInsert(irtvm, &rtvm); } /*************************************************************************** A chunky resource reader to read a script. ***************************************************************************/ bool SCPT::FReadScript(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb) { AssertPo(pcrf, 0); AssertPo(pblck, fblckReadable); AssertNilOrVarMem(ppbaco); *pcb = pblck->Cb(fTrue); if (pvNil == ppbaco) return fTrue; *ppbaco = PscptRead(pcrf->Pcfl(), ctg, cno); return pvNil != *ppbaco; } /*************************************************************************** Static method to read a script. ***************************************************************************/ PSCPT SCPT::PscptRead(PCFL pcfl, CTG ctg, CNO cno) { AssertPo(pcfl, 0); short bo; KID kid; BLCK blck; PSCPT pscpt = pvNil; PGL pgllw = pvNil; PGST pgst = pvNil; if (!pcfl->FFind(ctg, cno, &blck)) goto LFail; if (pvNil == (pgllw = GL::PglRead(&blck, &bo)) || pgllw->CbEntry() != size(long)) { goto LFail; } if (pcfl->FGetKidChidCtg(ctg, cno, 0, kctgScriptStrs, &kid)) { if (!pcfl->FFind(kid.cki.ctg, kid.cki.cno, &blck) || pvNil == (pgst = GST::PgstRead(&blck))) { goto LFail; } } if (pvNil == (pscpt = NewObj SCPT)) { LFail: ReleasePpo(&pgllw); ReleasePpo(&pgst); return pvNil; } if (kboOther == bo) SwapBytesRglw(pgllw->QvGet(0), pgllw->IvMac()); pscpt->_pgllw = pgllw; pscpt->_pgstLiterals = pgst; return pscpt; } /*************************************************************************** Destructor for a script. ***************************************************************************/ SCPT::~SCPT(void) { AssertBaseThis(0); ReleasePpo(&_pgllw); ReleasePpo(&_pgstLiterals); } /*************************************************************************** Save the script to the given chunky file. ***************************************************************************/ bool SCPT::FSaveToChunk(PCFL pcfl, CTG ctg, CNO cno, bool fPack) { AssertThis(0); AssertPo(pcfl, 0); BLCK blck; CNO cnoT, cnoStrs; long cb; // write the script chunk cb = _pgllw->CbOnFile(); if (!blck.FSetTemp(cb) || !_pgllw->FWrite(&blck)) return fFalse; if (fPack) blck.FPackData(); if (!pcfl->FFind(ctg, cno)) { // chunk doesn't exist, just write it if (!pcfl->FPutBlck(&blck, ctg, cnoT = cno)) return fFalse; } else { // chunk already exists - add a new temporary one if (!pcfl->FAddBlck(&blck, ctg, &cnoT)) return fFalse; } // write the string table if there is one. The cno for this is allocated // via FAdd. if (pvNil != _pgstLiterals) { cb = _pgstLiterals->CbOnFile(); if (!blck.FSetTemp(cb) || !_pgstLiterals->FWrite(&blck)) goto LFail; if (fPack) blck.FPackData(); if (!pcfl->FAddBlck(&blck, kctgScriptStrs, &cnoStrs)) goto LFail; if (!pcfl->FAdoptChild(ctg, cnoT, kctgScriptStrs, cnoStrs)) { pcfl->Delete(kctgScriptStrs, cnoStrs); LFail: pcfl->Delete(ctg, cnoT); return fFalse; } } // swap the data and children of the temporary chunk and the destination if (cno != cnoT) { pcfl->SwapData(ctg, cno, ctg, cnoT); pcfl->SwapChildren(ctg, cno, ctg, cnoT); pcfl->Delete(ctg, cnoT); } return fTrue; } #ifdef DEBUG /*************************************************************************** Assert the validity of a SCPT. ***************************************************************************/ void SCPT::AssertValid(ulong grf) { SCPT_PAR::AssertValid(0); AssertPo(_pgllw, 0); AssertNilOrPo(_pgstLiterals, 0); } /*************************************************************************** Mark memory for the SCPT. ***************************************************************************/ void SCPT::MarkMem(void) { AssertValid(0); SCPT_PAR::MarkMem(); MarkMemObj(_pgllw); MarkMemObj(_pgstLiterals); } #endif // DEBUG /*************************************************************************** Constructor for the runtime string registry. ***************************************************************************/ STRG::STRG(void) { _pgst = pvNil; AssertThis(0); } /*************************************************************************** Constructor for the runtime string registry. ***************************************************************************/ STRG::~STRG(void) { AssertThis(0); ReleasePpo(&_pgst); } #ifdef DEBUG /*************************************************************************** Assert the validity of a STRG. ***************************************************************************/ void STRG::AssertValid(ulong grf) { STRG_PAR::AssertValid(0); AssertNilOrPo(_pgst, 0); } /*************************************************************************** Mark memory for the STRG. ***************************************************************************/ void STRG::MarkMem(void) { AssertValid(0); STRG_PAR::MarkMem(); MarkMemObj(_pgst); } #endif // DEBUG /*************************************************************************** Put the string in the registry with the given string id. ***************************************************************************/ bool STRG::FPut(long stid, PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); long istn; if (!_FEnsureGst()) return fFalse; if (_FFind(stid, &istn)) return _pgst->FPutStn(istn, pstn); return _pgst->FInsertStn(istn, pstn, &stid); } /*************************************************************************** Get the string with the given string id. If the string isn't in the registry, sets pstn to an empty string and returns false. ***************************************************************************/ bool STRG::FGet(long stid, PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); long istn; if (!_FFind(stid, &istn)) { pstn->SetNil(); return fFalse; } _pgst->GetStn(istn, pstn); return fTrue; } /*************************************************************************** Add a string to the registry, assigning it an unused id. The assigned id's are not repeated in the near future. All assigned id's have their high bit set. ***************************************************************************/ bool STRG::FAdd(long *pstid, PSTN pstn) { AssertThis(0); AssertVarMem(pstid); AssertPo(pstn, 0); long istn; for (;;) { _stidLast = (_stidLast + 1) | 0x80000000L; if (!_FFind(_stidLast, &istn)) break; } *pstid = _stidLast; return FPut(_stidLast, pstn); } /*************************************************************************** Delete a string from the registry. ***************************************************************************/ void STRG::Delete(long stid) { AssertThis(0); long istn; if (_FFind(stid, &istn)) _pgst->Delete(istn); } /*************************************************************************** Change the id of a string from stidSrc to stidDst. If stidDst already exists, it is replaced. Returns false if the source string doesn't exist. Can't fail if the source does exist. ***************************************************************************/ bool STRG::FMove(long stidSrc, long stidDst) { AssertThis(0); long istnSrc, istnDst; if (stidSrc == stidDst) return _FFind(stidSrc, &istnSrc); if (!_FFind(stidDst, &istnSrc)) return fFalse; if (_FFind(stidDst, &istnDst)) { _pgst->Delete(istnDst); if (istnSrc > istnDst) istnSrc--; } _pgst->PutExtra(istnSrc, &stidDst); _pgst->Move(istnSrc, istnDst); return fTrue; } /*************************************************************************** Do a binary search for the string id. Returns true iff the string is in the registry. In either case, sets *pistn with where the string should go. ***************************************************************************/ bool STRG::_FFind(long stid, long *pistn) { AssertThis(0); AssertVarMem(pistn); long ivMin, ivLim, iv; long stidT; if (pvNil == _pgst) { *pistn = 0; return fFalse; } for (ivMin = 0, ivLim = _pgst->IvMac(); ivMin < ivLim;) { iv = (ivMin + ivLim) / 2; _pgst->GetExtra(iv, &stidT); if (stidT < stid) ivMin = iv + 1; else if (stidT > stid) ivLim = iv; else { *pistn = iv; return fTrue; } } *pistn = ivMin; return fFalse; } /*************************************************************************** Make sure the GST exists. ***************************************************************************/ bool STRG::_FEnsureGst(void) { AssertThis(0); if (pvNil != _pgst) return fTrue; _pgst = GST::PgstNew(size(long)); AssertThis(0); return pvNil != _pgst; } ================================================ FILE: kauai/src/screxe.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Script interpreter. See scrcom.h and scrcom.cpp for the script compiler and an explanation of what a compiled script consists of. ***************************************************************************/ #ifndef SCREXE_H #define SCREXE_H /**************************************** Run-Time Variable Map structure ****************************************/ struct RTVM { RTVN rtvn; long lwValue; }; bool FFindRtvm(PGL pglrtvm, RTVN *prtvn, long *plwValue, long *pirtvm); bool FAssignRtvm(PGL *ppglrtvm, RTVN *prtvn, long lw); /*************************************************************************** A script. This is here rather than in scrcom.* because scrcom is rarely included in shipping products, but screxe.* is. ***************************************************************************/ typedef class SCPT *PSCPT; #define SCPT_PAR BACO #define kclsSCPT 'SCPT' class SCPT : public SCPT_PAR { RTCLASS_DEC MARKMEM ASSERT protected: PGL _pgllw; PGST _pgstLiterals; SCPT(void) { } friend class SCEB; friend class SCCB; public: static bool FReadScript(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb); static PSCPT PscptRead(PCFL pcfl, CTG ctg, CNO cno); ~SCPT(void); bool FSaveToChunk(PCFL pcfl, CTG ctg, CNO cno, bool fPack = fFalse); }; /*************************************************************************** Runtime string registry. ***************************************************************************/ typedef class STRG *PSTRG; #define STRG_PAR BASE #define kclsSTRG 'STRG' class STRG : public STRG_PAR { RTCLASS_DEC ASSERT MARKMEM NOCOPY(STRG) protected: long _stidLast; PGST _pgst; bool _FFind(long stid, long *pistn); bool _FEnsureGst(void); public: STRG(void); ~STRG(void); bool FPut(long stid, PSTN pstn); bool FGet(long stid, PSTN pstn); bool FAdd(long *pstid, PSTN pstn); bool FMove(long stidSrc, long stidDst); void Delete(long stid); }; /*************************************************************************** The script interpreter. ***************************************************************************/ enum { fscebNil = 0, fscebRunnable = 1, }; typedef class SCEB *PSCEB; #define SCEB_PAR BASE #define kclsSCEB 'SCEB' class SCEB : public SCEB_PAR { RTCLASS_DEC ASSERT MARKMEM protected: PRCA _prca; // the chunky resource file list (may be nil) PSTRG _pstrg; PGL _pgllwStack; // the execution stack PGL _pglrtvm; // the local variables PSCPT _pscpt; // the script long _ilwMac; // the length of the script long _ilwCur; // the current location in the script bool _fError : 1; // an error has occured bool _fPaused : 1; // if we're paused long _lwReturn; // the return value from the script void _Push(long lw) { if (!_fError && !_pgllwStack->FPush(&lw)) _Error(fFalse); } long _LwPop(void); long *_QlwGet(long clw); void _Error(bool fAssert); void _Rotate(long clwTot, long clwShift); void _Reverse(long clw); void _DupList(long clw); void _PopList(long clw); void _Select(long clw, long ilw); void _RndList(long clw); void _Match(long clw); void _CopySubStr(long stidSrc, long ichMin, long cch, long stidDst); void _MergeStrings(CNO cno, RSC rsc); void _NumToStr(long lw, long stid); void _StrToNum(long stid, long lwEmpty, long lwError); void _ConcatStrs(long stidSrc1, long stidSrc2, long stidDst); void _LenStr(long stid); virtual void _AddParameters(long *prglw, long clw); virtual void _AddStrings(PGST pgst); virtual bool _FExecVarOp(long op, RTVN *prtvn); virtual bool _FExecOp(long op); virtual void _PushVar(PGL pglrtvm, RTVN *prtvn); virtual void _AssignVar(PGL *ppglrtvm, RTVN *prtvn, long lw); virtual PGL _PglrtvmThis(void); virtual PGL *_PpglrtvmThis(void); virtual PGL _PglrtvmGlobal(void); virtual PGL *_PpglrtvmGlobal(void); virtual PGL _PglrtvmRemote(long lw); virtual PGL *_PpglrtvmRemote(long lw); virtual short _SwCur(void); virtual short _SwMin(void); #ifdef DEBUG void _WarnSz(PSZ psz, ...); #endif // DEBUG public: SCEB(PRCA prca = pvNil, PSTRG pstrg = pvNil); ~SCEB(void); virtual bool FRunScript(PSCPT pscpt, long *prglw = pvNil, long clw = 0, long *plwReturn = pvNil, bool *pfPaused = pvNil); virtual bool FResume(long *plwReturn = pvNil, bool *pfPaused = pvNil); virtual bool FAttachScript(PSCPT pscpt, long *prglw = pvNil, long clw = 0); virtual void Free(void); }; #endif //! SCREXE_H ================================================ FILE: kauai/src/screxeg.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Script interpreter for GOB based scripts. ***************************************************************************/ #include "kidframe.h" ASSERTNAME RTCLASS(SCEG) #ifdef DEBUG // these strings are for debug only error messages static STN _stn; #endif // DEBUG /*************************************************************************** Constructor for a GOB based script interpreter. We don't just keep the pgob in case the GOB goes away while the script is running. ***************************************************************************/ SCEG::SCEG(PWOKS pwoks, PRCA prca, PGOB pgob) : SCEG_PAR(prca, pwoks->Pstrg()) { AssertPo(pwoks, 0); AssertPo(prca, 0); AssertPo(pgob, 0); _pwoks = pwoks; _hid = pgob->Hid(); _grid = pgob->Grid(); _pgob = pvNil; AssertThis(0); } #ifdef DEBUG /*************************************************************************** Assert the validity of a SCEG. ***************************************************************************/ void SCEG::AssertValid(ulong grf) { SCEG_PAR::AssertValid(0); Assert(hidNil != _hid, 0); AssertPo(_pwoks, 0); Assert(_prca != pvNil, 0); } #endif // DEBUG /*************************************************************************** The script is being resumed, so set _pgob to nil (don't know whether it exists). ***************************************************************************/ bool SCEG::FResume(long *plwReturn, bool *pfPaused) { GobMayDie(); return SCEG_PAR::FResume(plwReturn, pfPaused); } /*************************************************************************** Return the gob that corresponds to this script interpreter. ***************************************************************************/ PGOB SCEG::_PgobThis(void) { AssertThis(0); if (pvNil != _pgob) { AssertPo(_pgob, 0); Assert(_pgob->Grid() == _grid, "bad value of _pgob"); return _pgob; } _pgob = _pwoks->PgobFromGrid(_grid); return _pgob; } /*************************************************************************** Return the gob that is accessible to this script interpreter and has the given hid. ***************************************************************************/ PGOB SCEG::_PgobFromHid(long hid) { AssertThis(0); if (hid == _hid) return _PgobThis(); return _pwoks->PgobFromHid(hid); } /*************************************************************************** Return the address of the variable table for the GOB associated with this script interpreter. ***************************************************************************/ PGL *SCEG::_PpglrtvmThis(void) { PGOB pgob = _PgobThis(); if (pvNil == pgob) return pvNil; return pgob->Ppglrtvm(); } /*************************************************************************** Return the address of the variable table for the WOKS associated with this script interpreter. ***************************************************************************/ PGL *SCEG::_PpglrtvmGlobal(void) { AssertThis(0); return _pwoks->Ppglrtvm(); } /*************************************************************************** Return the address of the variable table for the GOB with given hid. ***************************************************************************/ PGL *SCEG::_PpglrtvmRemote(long lw) { PGOB pgob = _PgobFromHid(lw); if (pvNil == pgob) return pvNil; return pgob->Ppglrtvm(); } /*************************************************************************** Return the current version number of the script compiler. ***************************************************************************/ short SCEG::_SwCur(void) { return kswCurSccg; } /*************************************************************************** Return the min version number of the script compiler. Read can read scripts back to this version. ***************************************************************************/ short SCEG::_SwMin(void) { return kswMinSccg; } /*************************************************************************** Execute a script command. ***************************************************************************/ bool SCEG::_FExecOp(long op) { CMD cmd; PGOB pgob; PCLOK pclok; long hid; long dtim; long dxp, dyp; long lw1, lw2, lw3, lw4, clw; long *qrglw; void *pv; hid = _hid; // for "this" operations switch (op) { case kopDestroyGob: hid = _LwPop(); // fall through case kopDestroyThis: if (!_fError && pvNil != (pgob = _PgobFromHid(hid))) { GobMayDie(); if (pgob == _pwoks) { Debug(_WarnSz(PszLit("Can't Destroy WOKS - destroying all its children"))); PGOB pgobT; while (pvNil != (pgobT = pgob->PgobFirstChild())) ReleasePpo(&pgobT); } else ReleasePpo(&pgob); } break; case kopCreateChildGob: hid = _LwPop(); // fall through case kopCreateChildThis: lw1 = _LwPop(); lw2 = _LwPop(); pgob = pvNil; if (!_fError && pvNil != (pgob = _PgobFromHid(hid))) { GobMayDie(); pgob = _pwoks->PgokNew(pgob, lw1, lw2, _prca); } else { Debug(_WarnSz(PszLit("Missing parent GOB for CreateChild(Gob|This) (gid = %d)"), hid)); } _Push(pvNil == pgob ? hidNil : pgob->Hid()); break; case kopCreateHelpGob: hid = _LwPop(); // fall through case kopCreateHelpThis: lw1 = _LwPop(); pgob = pvNil; if (!_fError && pvNil != (pgob = _PgobFromHid(hid))) { GobMayDie(); pgob = _pwoks->PhbalNew(pgob, _prca, lw1); } else { Debug(_WarnSz(PszLit("Missing parent GOB for CreateHelp(Gob|This) (gid = %d)"), hid)); } _Push(pvNil == pgob ? hidNil : pgob->Hid()); break; case kopResizeGob: hid = _LwPop(); // fall through case kopResizeThis: dxp = _LwPop(); dyp = _LwPop(); // REVIEW shonk: should we handle hwnd based gob's? if (!_fError && pvNil != (pgob = _PgobFromHid(hid)) && hNil == pgob->Hwnd()) { RC rc; pgob->GetRc(&rc, cooParent); rc.xpRight = rc.xpLeft + LwMax(0, dxp); rc.ypBottom = rc.ypTop + LwMax(0, dyp); pgob->SetPos(&rc, pvNil); } else { Debug(_WarnSz(PszLit("Missing GOB for Resize(Gob|This) (gid = %d)"), hid)); } break; case kopMoveRelGob: hid = _LwPop(); // fall through case kopMoveRelThis: dxp = _LwPop(); dyp = _LwPop(); // REVIEW shonk: should we handle hwnd based gob's? if (!_fError && pvNil != (pgob = _PgobFromHid(hid)) && hNil == pgob->Hwnd()) { RC rc; pgob->GetRc(&rc, cooParent); rc.Offset(dxp, dyp); pgob->SetPos(&rc, pvNil); } else { Debug(_WarnSz(PszLit("Missing GOB for MoveRel(Gob|This) (gid = %d)"), hid)); } break; case kopMoveAbsGob: hid = _LwPop(); // fall through case kopMoveAbsThis: dxp = _LwPop(); dyp = _LwPop(); // REVIEW shonk: should we handle hwnd based gob's? if (!_fError && pvNil != (pgob = _PgobFromHid(hid)) && hNil == pgob->Hwnd()) { RC rc; pgob->GetRc(&rc, cooParent); if (pgob->FIs(kclsGOK)) { PT pt; ((PGOK)pgob)->GetPtReg(&pt, cooLocal); dxp -= pt.xp; dyp -= pt.yp; } rc.Offset(dxp - rc.xpLeft, dyp - rc.ypTop); pgob->SetPos(&rc, pvNil); } else { Debug(_WarnSz(PszLit("Missing GOB for MoveAbs(Gob|This) (gid = %d)"), hid)); } break; case kopRunScriptGob: case kopRunScriptThis: case kopRunScriptCnoGob: case kopRunScriptCnoThis: clw = _LwPop(); // the number of parameters if (kopRunScriptGob == op || kopRunScriptCnoGob == op) hid = _LwPop(); lw1 = _LwPop(); // the chid of the script if (_fError) break; if (clw > 0) { if (pvNil == _QlwGet(clw)) break; if (!FAllocPv(&pv, LwMul(size(long), clw), fmemNil, mprNormal)) { Debug(_WarnSz(PszLit("OOM attempting to run script"))); _PopList(clw); clw = 0; pv = pvNil; } else { CopyPb(_QlwGet(clw), pv, LwMul(size(long), clw)); ReverseRglw(pv, clw); _PopList(clw); } } else pv = pvNil; if (pvNil == (pgob = _PgobFromHid(hid)) || !pgob->FIs(kclsGOK)) { Debug(_WarnSz(PszLit("Missing GOB for RunScript[Cno](Gob|This) (gid = %d)"), hid)); lw2 = 0; } else { tribool tRet; GobMayDie(); if (kopRunScriptCnoGob == op || kopRunScriptCnoThis == op) ((PGOK)pgob)->FRunScriptCno(lw1, (long *)pv, clw, &lw2, &tRet); else ((PGOK)pgob)->FRunScript(lw1, (long *)pv, clw, &lw2, &tRet); if (tYes != tRet) { Debug(_WarnSz(PszLit("Running script failed (chid = 0x%x, gid = %d)"), lw1, hid)); lw2 = 0; } } FreePpv(&pv); _Push(lw2); break; case kopChangeStateGob: hid = _LwPop(); // fall through case kopChangeStateThis: lw1 = _LwPop(); if (_fError || pvNil == (pgob = _PgobFromHid(hid)) || !pgob->FIs(kclsGOK) || !FIn(lw1, 0, kswMax)) { Debug(_WarnSz(PszLit("Missing GOB or state out of range for ") PszLit("ChangeState(Gob|This) (gid = %d, sno = %d)"), hid, lw1)); } else { GobMayDie(); ((PGOK)pgob)->FChangeState(lw1); } break; case kopAnimateGob: hid = _LwPop(); // fall through case kopAnimateThis: lw1 = _LwPop(); if (_fError || pvNil == (pgob = _PgobFromHid(hid)) || !pgob->FIs(kclsGOK)) { Debug(_WarnSz(PszLit("Missing GOB for Animate(Gob|This) (gid = %d)"), hid)); } else { GobMayDie(); ((PGOK)pgob)->FSetRep(lw1, fgokNil, kctgAnimation); } break; case kopSetPictureGob: hid = _LwPop(); // fall through case kopSetPictureThis: lw1 = _LwPop(); if (_fError || pvNil == (pgob = _PgobFromHid(hid)) || !pgob->FIs(kclsGOK)) { Debug(_WarnSz(PszLit("Missing GOB for SetPicture(Gob|This) (gid = %d)"), hid)); } else { GobMayDie(); ((PGOK)pgob)->FSetRep(lw1, fgokKillAnim, kctgMbmp); } break; case kopSetRepGob: hid = _LwPop(); // fall through case kopSetRepThis: lw1 = _LwPop(); if (_fError || pvNil == (pgob = _PgobFromHid(hid)) || !pgob->FIs(kclsGOK)) { Debug(_WarnSz(PszLit("Missing GOB for SetRep(Gob|This) (gid = %d)"), hid)); } else { GobMayDie(); ((PGOK)pgob)->FSetRep(lw1); } break; case kopStateGob: hid = _LwPop(); // fall through case kopStateThis: if (_fError || pvNil == (pgob = _PgobFromHid(hid)) || !pgob->FIs(kclsGOK)) { lw1 = 0; Debug(_WarnSz(PszLit("Missing GOB for State(Gob|This) (gid = %d)"), hid)); } else lw1 = ((PGOK)pgob)->Sno(); _Push(lw1); break; case kopGidThis: _Push(_hid); break; case kopGidParGob: hid = _LwPop(); // fall through case kopGidParThis: if (pvNil != (pgob = _PgobFromHid(hid))) pgob = _pwoks->PgobParGob(pgob); _Push(pvNil == pgob ? hidNil : pgob->Hid()); break; case kopGidNextSib: if (pvNil != (pgob = _PgobFromHid(_LwPop()))) pgob = pgob->PgobNextSib(); _Push(pvNil == pgob ? hidNil : pgob->Hid()); break; case kopGidPrevSib: if (pvNil != (pgob = _PgobFromHid(_LwPop()))) pgob = pgob->PgobPrevSib(); _Push(pvNil == pgob ? hidNil : pgob->Hid()); break; case kopGidChild: if (pvNil != (pgob = _PgobFromHid(_LwPop()))) pgob = pgob->PgobFirstChild(); _Push(pvNil == pgob ? hidNil : pgob->Hid()); break; case kopFGobExists: pgob = _PgobFromHid(_LwPop()); _Push(pvNil != pgob); break; case kopEnqueueCid: cmd.cid = _LwPop(); cmd.pgg = pvNil; hid = _LwPop(); if (hidNil == hid) cmd.pcmh = pvNil; else cmd.pcmh = _pwoks->PcmhFromHid(hid); cmd.rglw[0] = _LwPop(); cmd.rglw[1] = _LwPop(); cmd.rglw[2] = _LwPop(); cmd.rglw[3] = _LwPop(); if (!_fError) vpcex->EnqueueCmd(&cmd); break; case kopAlert: case kopPrint: case kopPrintStat: case kopAlertStr: case kopPrintStr: case kopPrintStrStat: GobMayDie(); _DoAlert(op); break; case kopCreateClock: hid = _LwPop(); if (hidNil != hid && pvNil != (pclok = _pwoks->PclokFromHid(hid))) { Debug(_WarnSz(PszLit("Clock already exists - incrementing ref count (hid = %d)"), hid)); pclok->AddRef(); } else { if (hidNil == hid) hid = CMH::HidUnique(); if (pvNil == NewObj CLOK(hid)) hid = hidNil; } _Push(hid); break; case kopDestroyClock: if (pvNil != (pclok = _pwoks->PclokFromHid(_LwPop()))) ReleasePpo(&pclok); break; case kopStartClock: hid = _LwPop(); lw1 = _LwPop(); if (!_fError && pvNil != (pclok = _pwoks->PclokFromHid(hid))) pclok->Start(lw1); else { Debug(_WarnSz(PszLit("Missing clock for StartClock (hid = %d)"), hid)); } break; case kopStopClock: if (pvNil != (pclok = _pwoks->PclokFromHid(_LwPop()))) pclok->Stop(); else { Debug(_WarnSz(PszLit("Missing clock for StopClock (hid = %d)"), hid)); } break; case kopTimeCur: if (pvNil != (pclok = _pwoks->PclokFromHid(_LwPop()))) _Push(pclok->TimCur()); else { Debug(_WarnSz(PszLit("Missing clock for TimeCur (hid = %d)"), hid)); _Push(0); } break; case kopSetAlarmGob: hid = _LwPop(); case kopSetAlarmThis: case kopSetAlarm: lw1 = _LwPop(); dtim = _LwPop(); if (kopSetAlarm == op) lw2 = chidNil; else lw2 = _LwPop(); if (_fError || pvNil == (pgob = _PgobFromHid(hid)) || pvNil == (pclok = _pwoks->PclokFromHid(lw1)) || !pclok->FSetAlarm(dtim, pgob, lw2)) { Debug(_WarnSz(PszLit("Setting Alarm failed (hid = %d)"), lw1)); } break; case kopXMouseGob: case kopYMouseGob: hid = _LwPop(); // fall through case kopXMouseThis: case kopYMouseThis: if (_fError || pvNil == (pgob = _PgobFromHid(hid))) { Debug(_WarnSz(PszLit("Missing GOB for (X|Y)Mouse(Gob|This) (gid = %d)"), hid)); _Push(0); } else { PT pt; bool fDown; pgob->GetPtMouse(&pt, &fDown); _Push(op == kopXMouseThis || op == kopXMouseGob ? pt.xp : pt.yp); } break; case kopGidUnique: _Push(CMH::HidUnique()); break; case kopXGob: case kopYGob: hid = _LwPop(); // fall through case kopXThis: case kopYThis: if (_fError || pvNil == (pgob = _PgobFromHid(hid))) { Debug(_WarnSz(PszLit("Missing GOB for (X|Y)(Gob|This) (gid = %d)"), hid)); _Push(0); } else if (pgob->FIs(kclsGOK)) { PT pt; ((PGOK)pgob)->GetPtReg(&pt); _Push(op == kopXThis || op == kopXGob ? pt.xp : pt.yp); } else { RC rc; pgob->GetRc(&rc, cooParent); _Push(op == kopXThis || op == kopXGob ? rc.xpLeft : rc.ypTop); } break; case kopZGob: hid = _LwPop(); // fall through case kopZThis: if (_fError || pvNil == (pgob = _PgobFromHid(hid)) || !pgob->FIs(kclsGOK)) { Debug(_WarnSz(PszLit("Missing GOB for Z(Gob|This) (gid = %d)"), hid)); _Push(0); } else _Push(((PGOK)pgob)->ZPlane()); break; case kopSetZGob: hid = _LwPop(); // fall through case kopSetZThis: lw1 = _LwPop(); if (_fError || pvNil == (pgob = _PgobFromHid(hid)) || !pgob->FIs(kclsGOK)) { Debug(_WarnSz(PszLit("Missing GOB for SetZ(Gob|This) (gid = %d)"), hid)); } else ((PGOK)pgob)->SetZPlane(lw1); break; case kopSetColorTable: _SetColorTable(_LwPop()); break; case kopCell: _fPaused = fTrue; // fall through case kopCellNoPause: lw1 = _LwPop(); dxp = _LwPop(); dyp = _LwPop(); dtim = _LwPop(); if (_fError || pvNil == (pgob = _PgobThis())) { Debug(_WarnSz(PszLit("Missing GOB for Cell[NoPause] (gid = %d)"), hid)); } else { GobMayDie(); ((PGOK)pgob)->FSetRep(lw1, fgokNoAnim, ctgNil, dxp, dyp, dtim); } break; case kopGetModifierState: _Push(_pwoks->GrfcustCur()); break; case kopChangeModifierState: lw1 = _LwPop(); lw2 = _LwPop(); if (!_fError) _pwoks->ModifyGrfcust(lw1, lw2); break; case kopTransition: lw1 = _LwPop(); lw2 = _LwPop(); dtim = _LwPop(); lw3 = _LwPop(); lw4 = _LwPop(); if (!_fError) { ACR acr; PGL pglclr = _PglclrGet((CNO)lw4); acr.SetFromLw(lw3); vpappb->SetGft(lw1, lw2, LuMulDiv(dtim, kdtsSecond, kdtimSecond), pglclr, acr); ReleasePpo(&pglclr); } break; case kopGetEdit: lw1 = _LwPop(); _DoEditControl(lw1, _LwPop(), fTrue); break; case kopSetEdit: lw1 = _LwPop(); _DoEditControl(lw1, _LwPop(), fFalse); break; case kopGetProp: lw1 = _LwPop(); if (!_fError) { GobMayDie(); if (!vpappb->FGetProp(lw1, &lw2)) { Debug(_WarnSz(PszLit("GetProp failed (prid = %d)"), lw1)); lw2 = 0; } _Push(lw2); } break; case kopSetProp: lw1 = _LwPop(); lw2 = _LwPop(); GobMayDie(); if (!_fError && !vpappb->FSetProp(lw1, lw2)) { Debug(_WarnSz(PszLit("SetProp failed (prid = %d, val = %d)"), lw1, lw2)); } break; case kopLaunch: lw1 = _LwPop(); GobMayDie(); if (!_fError) _Push(_FLaunch(lw1)); break; case kopPlayGob: hid = _LwPop(); // fall through case kopPlayThis: if (_fError || pvNil == (pgob = _PgobFromHid(hid)) || !pgob->FIs(kclsGOK)) { Debug(_WarnSz(PszLit("Missing GOB for Play(Gob|This) (gid = %d)"), hid)); } else ((PGOK)pgob)->FPlay(); break; case kopPlayingGob: hid = _LwPop(); // fall through case kopPlayingThis: if (_fError || pvNil == (pgob = _PgobFromHid(hid)) || !pgob->FIs(kclsGOK)) { Debug(_WarnSz(PszLit("Missing GOB for Playing(Gob|This) (gid = %d)"), hid)); _Push(fFalse); } else _Push(((PGOK)pgob)->FPlaying()); break; case kopStopGob: hid = _LwPop(); // fall through case kopStopThis: if (_fError || pvNil == (pgob = _PgobFromHid(hid)) || !pgob->FIs(kclsGOK)) { Debug(_WarnSz(PszLit("Missing GOB for Stop(Gob|This) (gid = %d)"), hid)); } else ((PGOK)pgob)->Stop(); break; case kopCurFrameGob: hid = _LwPop(); // fall through case kopCurFrameThis: if (_fError || pvNil == (pgob = _PgobFromHid(hid)) || !pgob->FIs(kclsGOK)) { Debug(_WarnSz(PszLit("Missing GOB for (CurFrame(Gob|This) (gid = %d)"), hid)); _Push(0); } else _Push(((PGOK)pgob)->NfrCur()); break; case kopCountFramesGob: hid = _LwPop(); // fall through case kopCountFramesThis: if (_fError || pvNil == (pgob = _PgobFromHid(hid)) || !pgob->FIs(kclsGOK)) { Debug(_WarnSz(PszLit("Missing GOB for CountFrames(Gob|This) (gid = %d)"), hid)); _Push(0); } else _Push(((PGOK)pgob)->NfrMac()); break; case kopGotoFrameGob: hid = _LwPop(); // fall through case kopGotoFrameThis: lw1 = _LwPop(); if (_fError || pvNil == (pgob = _PgobFromHid(hid)) || !pgob->FIs(kclsGOK)) { Debug(_WarnSz(PszLit("Missing GOB for GotoFrame(Gob|This) (gid = %d)"), hid)); } else ((PGOK)pgob)->GotoNfr(lw1); break; case kopFilterCmdsGob: hid = _LwPop(); // fall through case kopFilterCmdsThis: lw1 = _LwPop(); lw2 = _LwPop(); lw3 = _LwPop(); if (_fError || pvNil == (pgob = _PgobFromHid(hid)) || !pgob->FIs(kclsGOK)) { Debug(_WarnSz(PszLit("Missing GOB for FilterCmds(Gob|This) (gid = %d)"), hid)); } else if (!((PGOK)pgob)->FFilterCidHid(lw1, lw2, lw3)) { Debug(_WarnSz(PszLit("Filtering failed (gid = %d)"), hid)); } break; case kopDestroyChildrenGob: hid = _LwPop(); // fall through case kopDestroyChildrenThis: if (!_fError && pvNil != (pgob = _PgobFromHid(hid))) { PGOB pgobT; GobMayDie(); while (pvNil != (pgobT = pgob->PgobFirstChild())) ReleasePpo(&pgobT); } break; case kopPlaySoundGob: hid = _LwPop(); // fall through case kopPlaySoundThis: lw1 = siiNil; if (!_fError) { pgob = (hidNil == hid) ? pvNil : _PgobFromHid(hid); if (pvNil != pgob && pgob->FIs(kclsGOK)) { if (pvNil != (qrglw = _QlwGet(7))) { lw1 = ((PGOK)pgob) ->SiiPlaySound(qrglw[6], qrglw[5], qrglw[4], qrglw[3], qrglw[2], 0, qrglw[1], qrglw[0]); } } else { #ifdef DEBUG if (hidNil != hid) { _WarnSz(PszLit("No GOK for PlaySound(Gob|This) (gid = %d)"), hid); } #endif // DEBUG if (pvNil != vpsndm && pvNil != (qrglw = _QlwGet(7))) { lw1 = vpsndm->SiiPlay(_prca, qrglw[6], qrglw[5], qrglw[4], qrglw[3], qrglw[2], 0, qrglw[1], qrglw[0]); } } _PopList(7); } _Push(lw1); break; case kopStopSound: lw1 = _LwPop(); if (!_fError && pvNil != vpsndm) vpsndm->Stop(lw1); break; case kopStopSoundClass: lw1 = _LwPop(); lw2 = _LwPop(); if (!_fError && pvNil != vpsndm) vpsndm->StopAll(lw1, lw2); break; case kopPlayingSound: lw1 = _LwPop(); if (!_fError && pvNil != vpsndm) _Push(vpsndm->FPlaying(lw1)); break; case kopPlayingSoundClass: lw1 = _LwPop(); lw2 = _LwPop(); if (!_fError && pvNil != vpsndm) _Push(vpsndm->FPlayingAll(lw1, lw2)); break; case kopPauseSound: lw1 = _LwPop(); if (!_fError && pvNil != vpsndm) vpsndm->Pause(lw1); break; case kopPauseSoundClass: lw1 = _LwPop(); lw2 = _LwPop(); if (!_fError && pvNil != vpsndm) vpsndm->PauseAll(lw1, lw2); break; case kopResumeSound: lw1 = _LwPop(); if (!_fError && pvNil != vpsndm) vpsndm->Resume(lw1); break; case kopResumeSoundClass: lw1 = _LwPop(); lw2 = _LwPop(); if (!_fError && pvNil != vpsndm) vpsndm->ResumeAll(lw1, lw2); break; case kopPlayMouseSoundGob: hid = _LwPop(); // fall through case kopPlayMouseSoundThis: lw1 = _LwPop(); lw2 = _LwPop(); if (!_fError && pvNil != (pgob = _PgobFromHid(hid)) && pgob->FIs(kclsGOK)) { _Push(((PGOK)pgob)->SiiPlayMouseSound(lw1, lw2)); } else _Push(siiNil); break; case kopWidthGob: case kopHeightGob: hid = _LwPop(); // fall thru case kopWidthThis: case kopHeightThis: if (!_fError && pvNil != (pgob = _PgobFromHid(hid))) { RC rc; pgob->GetRc(&rc, cooLocal); if (kopWidthGob == op || kopWidthThis == op) _Push(rc.Dxp()); else _Push(rc.Dyp()); } else { Debug(_WarnSz(PszLit("Missing GOB for (Width|Height)(Gob|This) (gid = %d)"), hid)); _Push(0); } break; case kopSetNoSlipGob: hid = _LwPop(); // fall through case kopSetNoSlipThis: lw1 = _LwPop(); if (!_fError && pvNil != (pgob = _PgobFromHid(hid)) && pgob->FIs(kclsGOK)) { ((PGOK)pgob)->SetNoSlip(lw1); } else { Debug(_WarnSz(PszLit("Missing GOB for SetNoSlip(Gob|This) (gid = %d)"), hid)); } break; case kopFIsDescendent: lw1 = _LwPop(); lw2 = _LwPop(); if (!_fError) { PGOB pgobPar = _PgobFromHid(lw2); if (pvNil == pgobPar || pvNil == (pgob = _PgobFromHid(lw1))) _Push(0); else { while (pgob != pvNil && pgob != pgobPar) pgob = _pwoks->PgobParGob(pgob); _Push(pgob == pgobPar); } } break; case kopSetMasterVolume: lw1 = _LwPop(); if (!_fError && pvNil != vpsndm) vpsndm->SetVlm(lw1); break; case kopGetMasterVolume: if (pvNil != vpsndm) _Push(vpsndm->VlmCur()); else _Push(0); break; case kopStartLongOp: vpappb->BeginLongOp(); break; case kopEndLongOp: vpappb->EndLongOp(_LwPop()); break; case kopSetToolTipSourceGob: hid = _LwPop(); // fall through case kopSetToolTipSourceThis: lw1 = _LwPop(); if (!_fError && pvNil != (pgob = _PgobFromHid(hid)) && pgob->FIs(kclsGOK)) { ((PGOK)pgob)->SetHidToolTip(lw1); } else { Debug(_WarnSz(PszLit("Missing GOB for SetToolTipSource(Gob|This) (gid = %d)"), hid)); } break; case kopModalHelp: lw1 = _LwPop(); lw2 = _LwPop(); if (!_fError) { GobMayDie(); if (_pwoks->FModalTopic(_prca, lw1, &lw3)) lw2 = lw3; _Push(lw2); } break; case kopFlushUserEvents: vpappb->FlushUserEvents(_LwPop()); break; case kopStreamGob: hid = _LwPop(); // fall through case kopStreamThis: lw1 = _LwPop(); if (_fError || pvNil == (pgob = _PgobFromHid(hid)) || !pgob->FIs(kclsGOK)) { Debug(_WarnSz(PszLit("Missing GOB for Stream(Gob|This) (gid = %d)"), hid)); } else ((PGOK)pgob)->Stream(FPure(lw1)); break; default: return SCEG_PAR::_FExecOp(op); } return !_fError; } /*************************************************************************** Put up an alert containing a list of numbers. ***************************************************************************/ void SCEG::_DoAlert(long op) { STN stn1; STN stn2; long lw; bool fStrings; long clw = _LwPop(); switch (op) { default: return; #ifdef CHUNK_STATS case kopPrintStat: #endif // CHUNK_STATS case kopAlert: case kopPrint: fStrings = fFalse; break; #ifdef CHUNK_STATS case kopPrintStrStat: #endif // CHUNK_STATS case kopAlertStr: case kopPrintStr: fStrings = fTrue; break; } if (fStrings && pvNil == _pstrg) { _Error(fTrue); return; } stn1.FFormatSz(PszLit("Script Message ('%f', 0x%x, %d): "), _pscpt->Ctg(), _pscpt->Cno(), _ilwCur); while (clw-- > 0) { lw = _LwPop(); if (fStrings) _pstrg->FGet(lw, &stn2); else stn2.FFormatSz(PszLit("%d (0x%x) "), lw, lw); stn1.FAppendStn(&stn2); } switch (op) { #ifdef CHUNK_STATS case kopPrintStat: case kopPrintStrStat: CFL::DumpStn(&stn1); break; #endif // CHUNK_STATS case kopAlert: case kopAlertStr: _pwoks->TGiveAlert(&stn1, bkOk, cokInformation); break; case kopPrint: case kopPrintStr: _pwoks->Print(&stn1); break; } } /*************************************************************************** Get or set the string in an edit control. ***************************************************************************/ void SCEG::_DoEditControl(long hid, long stid, bool fGet) { PEDCB pedcb; long cch; achar rgch[kcchMaxStn]; STN stn; if (_fError || pvNil == (pedcb = (PEDCB)_PgobFromHid(hid)) || !pedcb->FIs(kclsEDCB)) { Debug(_WarnSz(PszLit("Missing edit control for (Get|Set)Edit (gid = %d)"), hid)); return; } if (pvNil == _pstrg) { _Error(fTrue); return; } cch = pedcb->IchMac(); if (fGet) { cch = pedcb->CchFetch(rgch, 0, LwMin(kcchMaxStn, cch)); stn.SetRgch(rgch, cch); _pstrg->FPut(stid, &stn); } else { _pstrg->FGet(stid, &stn); pedcb->FReplace(stn.Psz(), stn.Cch(), 0, cch); } } /*************************************************************************** Set the current color table. ***************************************************************************/ void SCEG::_SetColorTable(CNO cno) { PGL pglclr; if (pvNil == (pglclr = _PglclrGet(cno))) return; GPT::SetActiveColors(pglclr, fpalIdentity); ReleasePpo(&pglclr); } /*************************************************************************** Read the indicated color table and return a reference to it. ***************************************************************************/ PGL SCEG::_PglclrGet(CNO cno) { PCABO pcabo; PGL pglclr; if (cnoNil == cno) return pvNil; pcabo = (PCABO)_prca->PbacoFetch(kctgColorTable, cno, FReadColorTable); if (pvNil == pcabo) return pvNil; pglclr = (PGL)pcabo->po; AssertPo(pglclr, 0); pglclr->AddRef(); pcabo->SetCrep(crepTossFirst); ReleasePpo(&pcabo); return pglclr; } /*************************************************************************** A chunky resource reader to read a color table. Wraps the color table in a CABO. ***************************************************************************/ bool FReadColorTable(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb) { PCABO pcabo; PGL pglclr = pvNil; *pcb = pblck->Cb(fTrue); if (pvNil == ppbaco) return fTrue; if (!pblck->FUnpackData()) goto LFail; *pcb = pblck->Cb(); if (pvNil == (pglclr = GL::PglRead(pblck)) || pglclr->CbEntry() != size(CLR)) goto LFail; if (pvNil == (pcabo = NewObj CABO(pglclr))) { LFail: ReleasePpo(&pglclr); TrashVar(pcb); TrashVar(ppbaco); return fFalse; } *ppbaco = pcabo; return fTrue; } /*************************************************************************** Launch an app with the given command line. Return true iff the launch was successful. ***************************************************************************/ bool SCEG::_FLaunch(long stid) { AssertThis(0); STN stn; if (pvNil == _pstrg) { _Error(fTrue); return fFalse; } if (!_pstrg->FGet(stid, &stn)) { Debug(_WarnSz(PszLit("String missing for Launch (stid = %d)"), stid)); Warn("string missing"); return fFalse; } #ifdef WIN STARTUPINFO sui; PROCESS_INFORMATION pi; ClearPb(&sui, size(sui)); sui.cb = size(sui); return CreateProcess(pvNil, stn.Psz(), pvNil, pvNil, fFalse, DETACHED_PROCESS, pvNil, pvNil, &sui, &pi); #else //! WIN RawRtn(); // REVIEW shonk: Mac: implement SCEG::_FLaunch return fFalse; #endif //! WIN } ================================================ FILE: kauai/src/screxeg.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Script interpreter for the gob based scripts. ***************************************************************************/ #ifndef SCREXEG_H #define SCREXEG_H /**************************************** Gob based script interpreter ****************************************/ typedef class SCEG *PSCEG; #define SCEG_PAR SCEB #define kclsSCEG 'SCEG' class SCEG : public SCEG_PAR { RTCLASS_DEC ASSERT protected: // CAUTION: _pgob may be nil (even if the gob still exists)! Always access // thru _PgobThis. When something is done that may cause the gob to be // freed (such as calling another script), set this to nil. PGOB _pgob; long _hid; // the handler id of the initialization gob long _grid; // the unique gob run-time id of the initialization gob PWOKS _pwoks; // the kidspace world this script belongs to virtual PGOB _PgobThis(void); virtual PGOB _PgobFromHid(long hid); virtual bool _FExecOp(long op); virtual PGL *_PpglrtvmThis(void); virtual PGL *_PpglrtvmGlobal(void); virtual PGL *_PpglrtvmRemote(long lw); virtual short _SwCur(void); virtual short _SwMin(void); void _DoAlert(long op); void _SetColorTable(CHID chid); void _DoEditControl(long hid, long stid, bool fGet); PGL _PglclrGet(CNO cno); bool _FLaunch(long stid); public: SCEG(PWOKS pwoks, PRCA prca, PGOB pgob); void GobMayDie(void) { _pgob = pvNil; } virtual bool FResume(long *plwReturn = pvNil, bool *pfPaused = pvNil); }; // a Chunky resource reader for a color table bool FReadColorTable(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb); #endif //! SCREXEG_H ================================================ FILE: kauai/src/sndam.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Copyright (c) Microsoft Corporation Audioman based sound classes. ***************************************************************************/ #include "frame.h" #include "audioman.h" #include "sndampri.h" ASSERTNAME // CHECK_AUDIO_DEVCAPS turns on using waveOutGetDevCaps to check for // audio device characteristics, to workaround AudioMan 1.0 always returning // whatever device was asked for, regardless if device actually supports format. // In case of asking for a 16 bit device, and there is only an 8 bit device, the // open will succeed, causing sub-optimal audioman performance on an 8 bit card. // With AudioMan 1.5, this should go away. #define CHECK_AUDIO_DEVCAPS // Initialize the maximum mem footprint of wave sounds. long SDAM::vcbMaxMemWave = 40 * 1024; static IAMMixer *_pamix; // the audioman mixer static ulong _luGroup; // the group number static bool _fGrouped; // whether new sounds are grouped static long _cactGroup; // group nesting count static ulong _luFormat; // format mixer is in static ulong _luCacheTime; // buffer size for mixer RTCLASS(SDAM) RTCLASS(CAMS) RTCLASS(AMQUE) /*************************************************************************** Constructor for a streamed block. ***************************************************************************/ STBL::STBL(void) { AssertThisMem(); // WARNING: this is not allocated using our NewObj because STBL is not // based on BASE. So fields are not automatically initialized to 0. _cactRef = 1; _ib = 0; } /*************************************************************************** Destructor for a streamed block. ***************************************************************************/ STBL::~STBL(void) { AssertThisMem(); } /*************************************************************************** QueryInterface for STBL. ***************************************************************************/ STDMETHODIMP STBL::QueryInterface(REFIID riid, void **ppv) { AssertThis(0); if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IStream)) { *ppv = (void *)this; AddRef(); return S_OK; } *ppv = pvNil; return E_NOINTERFACE; } /*************************************************************************** Increment the reference count. ***************************************************************************/ STDMETHODIMP_(ULONG) STBL::AddRef(void) { AssertThis(0); return ++_cactRef; } /*************************************************************************** Decrement the reference count. ***************************************************************************/ STDMETHODIMP_(ULONG) STBL::Release(void) { AssertThis(0); long cactRef; if ((cactRef = --_cactRef) == 0) delete this; return cactRef; } /*************************************************************************** Read some stuff. ***************************************************************************/ STDMETHODIMP STBL::Read(void *pv, ULONG cb, ULONG *pcb) { AssertThis(0); AssertPvCb(pv, cb); AssertNilOrVarMem(pcb); cb = LwMin(_blck.Cb() - _ib, cb); if (_blck.FReadRgb(pv, cb, _ib)) { _ib += cb; if (pvNil != pcb) *pcb = cb; return NOERROR; } if (pvNil != pcb) *pcb = 0; return ResultFromScode(STG_E_READFAULT); } /*************************************************************************** Seek to a place. ***************************************************************************/ STDMETHODIMP STBL::Seek(LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition) { AssertThis(0); AssertNilOrVarMem(plibNewPosition); switch (dwOrigin) { case STREAM_SEEK_SET: break; case STREAM_SEEK_CUR: dlibMove.QuadPart += _ib; break; case STREAM_SEEK_END: dlibMove.QuadPart += _blck.Cb(); break; } if (dlibMove.QuadPart < 0 || dlibMove.QuadPart > _blck.Cb()) { if (pvNil != plibNewPosition) plibNewPosition->QuadPart = _ib; return E_INVALIDARG; } _ib = (long)dlibMove.QuadPart; if (pvNil != plibNewPosition) plibNewPosition->QuadPart = _ib; return S_OK; } /*************************************************************************** Static method to create a new stream wrapper around a flo. ***************************************************************************/ PSTBL STBL::PstblNew(FLO *pflo, bool fPacked) { AssertPo(pflo, ffloReadable); PSTBL pstbl; BLCK blck; PBLCK pblck; if (pvNil == (pstbl = new STBL)) return pvNil; pblck = &pstbl->_blck; if (fPacked) { // unpack the block pblck->Set(pflo, fPacked); if (!pblck->FUnpackData()) { delete pstbl; return pvNil; } // see if it's too big to keep in memory if (pstbl->CbMem() > SDAM::vcbMaxMemWave) { // try to put the sound on disk HQ hq = pblck->HqFree(); AssertHq(hq); if (pblck->FSetTemp(CbOfHq(hq), fTrue) && pblck->FWriteHq(hq, 0)) { FreePhq(&hq); } else pblck->SetHq(&hq); } } else { // see if it's on a removeable disk FNI fni; pflo->pfil->GetFni(&fni); if (fni.Grfvk() & (fvkFloppy | fvkCD | fvkRemovable)) { // cache to the hard drive or memory, depending on the size BLCK blck(pflo); if (!pblck->FSetTemp(pflo->cb, blck.Cb() + size(STBL) > SDAM::vcbMaxMemWave) || !blck.FWriteToBlck(pblck)) { delete pstbl; return pvNil; } } else pblck->Set(pflo); } AssertPo(pstbl, 0); return pstbl; } #ifdef DEBUG /*************************************************************************** Assert the validity of a STBL. ***************************************************************************/ void STBL::AssertValid(ulong grf) { AssertThisMem(); AssertPo(&_blck, 0); AssertIn(_ib, 0, _blck.Cb() + 1); } /*************************************************************************** Mark memory for the STBL. ***************************************************************************/ void STBL::MarkMem(void) { AssertValid(0); MarkMemObj(&_blck); } #endif // DEBUG /*************************************************************************** Constructor for a cached AudioMan sound. ***************************************************************************/ CAMS::CAMS(void) { AssertBaseThis(fobjAllocated); } /*************************************************************************** Destructor for a cached AudioMan sound. ***************************************************************************/ CAMS::~CAMS(void) { AssertBaseThis(fobjAllocated); ReleasePpo(&psnd); ReleasePpo(&_pstbl); } /*************************************************************************** Static BACO reader method to put together a Cached AudioMan sound. ***************************************************************************/ bool CAMS::FReadCams(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb) { AssertPo(pcrf, 0); AssertPo(pblck, 0); AssertNilOrVarMem(ppbaco); AssertVarMem(pcb); FLO flo; bool fPacked; PCAMS pcams = pvNil; PSTBL pstbl = pvNil; *pcb = size(CAMS) + size(STBL); if (pvNil == ppbaco) return fTrue; *ppbaco = pvNil; if (!pcrf->Pcfl()->FFindFlo(ctg, cno, &flo)) return fFalse; fPacked = pcrf->Pcfl()->FPacked(ctg, cno); if (pvNil == (pstbl = STBL::PstblNew(&flo, fPacked))) return fFalse; *pcb = size(CAMS) + pstbl->CbMem(); if (pvNil == (pcams = NewObj CAMS) || FAILED(AllocSoundFromStream(&pcams->psnd, pstbl, fTrue, pvNil))) { ReleasePpo(&pcams); } if (pvNil != pcams) pcams->_pstbl = pstbl; else ReleasePpo(&pstbl); AssertNilOrPo(pcams, 0); *ppbaco = pcams; return pvNil != *ppbaco; } /*************************************************************************** Static BACO reader method to put together a Cached AudioMan sound. ***************************************************************************/ PCAMS CAMS::PcamsNewLoop(PCAMS pcamsSrc, long cactPlay) { AssertPo(pcamsSrc, 0); Assert(cactPlay != 1, "bad loop count"); PCAMS pcams = pvNil; if (pvNil == (pcams = NewObj CAMS) || FAILED(AllocLoopFilter(&pcams->psnd, pcamsSrc->psnd, cactPlay - 1))) { ReleasePpo(&pcams); } if (pvNil != pcams) { pcams->_pstbl = pcamsSrc->_pstbl; pcams->_pstbl->AddRef(); } AssertNilOrPo(pcams, 0); return pcams; } #ifdef DEBUG /*************************************************************************** Assert the validity of a CAMS. ***************************************************************************/ void CAMS::AssertValid(ulong grf) { CAMS_PAR::AssertValid(0); AssertPo(_pstbl, 0); Assert(psnd != pvNil, 0); } /*************************************************************************** Mark memory for the CAMS. ***************************************************************************/ void CAMS::MarkMem(void) { AssertValid(0); CAMS_PAR::MarkMem(); if (pvNil != _pstbl) _pstbl->MarkMem(); } #endif // DEBUG /*************************************************************************** Constructor for our notify sink. ***************************************************************************/ AMNOT::AMNOT(void) { _cactRef = 1; _pamque = pvNil; } /*************************************************************************** Set the AMQUE that we're to notify. ***************************************************************************/ void AMNOT::Set(PAMQUE pamque) { AssertNilOrVarMem(pamque); _pamque = pamque; } #ifdef DEBUG /*************************************************************************** Assert the validity of a AMNOT. ***************************************************************************/ void AMNOT::AssertValid(ulong grf) { AssertThisMem(); AssertNilOrVarMem(_pamque); } #endif // DEBUG /*************************************************************************** QueryInterface for AMNOT. ***************************************************************************/ STDMETHODIMP AMNOT::QueryInterface(REFIID riid, void **ppv) { AssertThis(0); if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IAMNotifySink)) { *ppv = (void *)this; AddRef(); return S_OK; } *ppv = pvNil; return E_NOINTERFACE; } /*************************************************************************** Increment the reference count. ***************************************************************************/ STDMETHODIMP_(ULONG) AMNOT::AddRef(void) { AssertThis(0); return ++_cactRef; } /*************************************************************************** Decrement the reference count. ***************************************************************************/ STDMETHODIMP_(ULONG) AMNOT::Release(void) { AssertThis(0); long cactRef; if ((cactRef = --_cactRef) == 0) delete this; return cactRef; } /*************************************************************************** The indicated sound is done. Just tell the AMQUE that we got a notify. ***************************************************************************/ STDMETHODIMP_(void) AMNOT::OnCompletion(LPSOUND pSound, DWORD dwPosition) { AssertThis(0); if (pvNil != _pamque) _pamque->Notify(pSound); } /*************************************************************************** Constructor for an audioman queue. ***************************************************************************/ AMQUE::AMQUE(void) { } /*************************************************************************** Destructor for an audioman queue. ***************************************************************************/ AMQUE::~AMQUE(void) { if (pvNil != _pchan) StopAll(); ReleasePpo(&_pchan); } #ifdef DEBUG /*************************************************************************** Assert the validity of a AMQUE. ***************************************************************************/ void AMQUE::AssertValid(ulong grf) { AMQUE_PAR::AssertValid(0); Assert(pvNil != _pchan, 0); } #endif // DEBUG /*************************************************************************** Static method to create a new audioman queue. ***************************************************************************/ PAMQUE AMQUE::PamqueNew(void) { PAMQUE pamque; if (pvNil == (pamque = NewObj AMQUE)) return pvNil; if (!pamque->_FInit()) ReleasePpo(&pamque); AssertNilOrPo(pamque, 0); return pamque; } /*************************************************************************** Initialize the audioman queue. Allocate the audioman channel and the _pglsndin. ***************************************************************************/ bool AMQUE::_FInit(void) { AssertBaseThis(0); if (!AMQUE_PAR::_FInit()) return fFalse; if (FAILED(_pamix->AllocChannel(&_pchan))) { _pchan = pvNil; return fFalse; } if (pvNil == _pchan) { Bug("Audioman messed up!"); return fFalse; } _amnot.Set(this); if (FAILED(_pchan->RegisterNotify(&_amnot, NOTIFYSINK_ONCOMPLETION))) return fFalse; AssertThis(0); return fTrue; } /*************************************************************************** Enter the critical section protecting member variables. ***************************************************************************/ void AMQUE::_Enter(void) { _mutx.Enter(); } /*************************************************************************** Leave the critical section protecting member variables. ***************************************************************************/ void AMQUE::_Leave(void) { _mutx.Leave(); } /*************************************************************************** Fetch the given sound chunk as a CAMS. ***************************************************************************/ PBACO AMQUE::_PbacoFetch(PRCA prca, CTG ctg, CNO cno) { AssertThis(0); AssertPo(prca, 0); return prca->PbacoFetch(ctg, cno, &CAMS::FReadCams); } /*************************************************************************** An item was added to or deleted from the queue. ***************************************************************************/ void AMQUE::_Queue(long isndinMin) { AssertThis(0); SNDIN sndin; long isndin; _Enter(); if (pvNil != _pglsndin) { PCAMS pcams; for (isndin = isndinMin; isndin < _pglsndin->IvMac(); isndin++) { _pglsndin->Get(isndin, &sndin); if (1 == sndin.cactPlay) continue; // put a loop filter around it to get seamless sample based looping if (pvNil != (pcams = CAMS::PcamsNewLoop((PCAMS)sndin.pbaco, sndin.cactPlay))) { sndin.cactPlay = 1; // now it's just one sound ReleasePpo(&sndin.pbaco); sndin.pbaco = pcams; _pglsndin->Put(isndin, &sndin); } } } if (_isndinCur == isndinMin && pvNil != _pglsndin) { for (; _isndinCur < _pglsndin->IvMac(); _isndinCur++) { _pglsndin->Get(_isndinCur, &sndin); if (0 <= sndin.cactPause) break; } if (_isndinCur < _pglsndin->IvMac() && 0 == sndin.cactPause) { // stop the channel _pchan->Stop(); // set the volume _pchan->SetVolume(LuVolScale((ulong)(-1), sndin.vlm)); // if the sound is in memory if (((PCAMS)sndin.pbaco)->FInMemory()) { // set the sound source, with no cache (Since it's in memory) _pchan->SetSoundSrc(((PCAMS)sndin.pbaco)->psnd); } else { CacheConfig cc; cc.dwSize = size(cc); cc.fSrcFormat = fTrue; cc.lpFormat = pvNil; cc.dwFormat = _luFormat; cc.dwCacheTime = 2 * _luCacheTime; // set the sound src, using cache cause it's not in memory _pchan->SetCachedSrc(((PCAMS)sndin.pbaco)->psnd, &cc); } // if there is a starting offset, apply it if (sndin.dtsStart != 0) _pchan->SetTimePos(sndin.dtsStart); if (!_fGrouped || FAILED(_pamix->EnlistGroup(_pchan, _luGroup))) { // start the channel _pchan->Play(); } _tsStart = TsCurrentSystem() - sndin.dtsStart; } else { _pchan->Stop(); _pchan->SetSoundSrc(pvNil); } } _Leave(); } /*************************************************************************** One or more items in the queue were paused. ***************************************************************************/ void AMQUE::_PauseQueue(long isndinMin) { AssertThis(0); SNDIN sndin; _mutx.Enter(); if (_isndinCur == isndinMin && _pglsndin->IvMac() > _isndinCur) { _pglsndin->Get(_isndinCur, &sndin); sndin.dtsStart = TsCurrentSystem() - _tsStart; _pglsndin->Put(_isndinCur, &sndin); _Queue(isndinMin); } _mutx.Leave(); } /*************************************************************************** One or more items in the queue were resumed. ***************************************************************************/ void AMQUE::_ResumeQueue(long isndinMin) { AssertThis(0); _Queue(isndinMin); } /*************************************************************************** Called by our notify sink to tell us that the indicated sound is done. WARNING: this is called in an auxillary thread. ***************************************************************************/ void AMQUE::Notify(LPSOUND psnd) { AssertThis(0); SNDIN sndin; _Enter(); if (pvNil != _pglsndin && _pglsndin->IvMac() > _isndinCur) { _pglsndin->Get(_isndinCur, &sndin); if (psnd == ((PCAMS)sndin.pbaco)->psnd) { if (--sndin.cactPlay == 0) { _isndinCur++; _Queue(_isndinCur); } else { // play the sound again _pglsndin->Put(_isndinCur, &sndin); _pchan->SetSoundSrc(((PCAMS)sndin.pbaco)->psnd); _tsStart = TsCurrentSystem(); } } } _Leave(); } /*************************************************************************** Constructor for the audioman device. ***************************************************************************/ SDAM::SDAM(void) { _vlm = kvlmFull; _luVolSys = (ulong)(-1); } /*************************************************************************** Destructor for the audioman device. ***************************************************************************/ SDAM::~SDAM(void) { AssertBaseThis(0); if (_fAudioManInited && 0 == _pamix->Release()) _pamix = pvNil; } #ifdef DEBUG /*************************************************************************** Assert the validity of a SDAM. ***************************************************************************/ void SDAM::AssertValid(ulong grf) { SDAM_PAR::AssertValid(0); Assert(_pamix != pvNil, 0); } #endif // DEBUG /*************************************************************************** Static method to create the audioman device. ***************************************************************************/ PSDAM SDAM::PsdamNew(long wav) { PSDAM psdam; if (pvNil == (psdam = NewObj SDAM)) return pvNil; if (!psdam->_FInit(wav)) ReleasePpo(&psdam); AssertNilOrPo(psdam, 0); return psdam; } static long _mpwavfmt[] = { WAVE_FORMAT_1M08, WAVE_FORMAT_2M08, WAVE_FORMAT_4M08, WAVE_FORMAT_1S08, WAVE_FORMAT_2S08, WAVE_FORMAT_4S08, WAVE_FORMAT_1M16, WAVE_FORMAT_2M16, WAVE_FORMAT_4M16, WAVE_FORMAT_1S16, WAVE_FORMAT_2S16, WAVE_FORMAT_4S16, }; #ifdef CHECK_AUDIO_DEVCAPS /****************************************************************************** @func WORD | wHaveWaveDevice | Do we have a wave device capable of playing the passed PCM format(s). @parm DWORD | dwFormats | WAVE formats needed to be supported. These can be a bitwise combination of WAVE_FORMAT_???? flags which are defined in mmsystem.h. If you don't care what formats are supported you can pass zero. ******************************************************************************/ bool FHaveWaveDevice(DWORD dwReqFormats) { WORD wNumWavDev; WAVEOUTCAPS WOC; WORD wDevID; WORD wErr; // Determine how many WAVE devices are in the user's system wNumWavDev = waveOutGetNumDevs(); // If there are none, return indicating that if (0 == wNumWavDev) return (fFalse); // Cycle through the WAVE devices to determine if any support // the desired format. for (wDevID = 0; wDevID < wNumWavDev; wDevID++) { wErr = waveOutGetDevCaps(wDevID, &WOC, sizeof(WAVEOUTCAPS)); // If we obtain a WAVE device's capabilities OK // and it supports the desired format if ((0 == wErr) && ((WOC.dwFormats & dwReqFormats) == dwReqFormats)) { // then return success - we have a device that supports what we want return fTrue; } } // it doesn't support this device return fFalse; } #endif /*************************************************************************** Initialize the audioman device. ***************************************************************************/ bool SDAM::_FInit(long wav) { AssertBaseThis(0); MIXERCONFIG mixc; ADVMIXCONFIG amxc; if (!SDAM_PAR::_FInit()) return fFalse; // get IAMMixer interface if (pvNil != _pamix) { _pamix->AddRef(); _fAudioManInited = fTrue; } else { if (pvNil == (_pamix = GetAudioManMixer())) return fFalse; _fAudioManInited = fTrue; // REVIEW shonk: what values should we use? mixc.dwSize = size(mixc); mixc.lpFormat = pvNil; if (!FIn(wav, 0, kwavLim)) wav = kwav22M16; mixc.dwFormat = _mpwavfmt[wav]; amxc.dwSize = size(amxc); amxc.uVoices = 12; amxc.fRemixEnabled = fTrue; amxc.uBufferTime = 600; #ifdef CHECK_AUDIO_DEVCAPS // if we don't have a device of this format... if (!FHaveWaveDevice(mixc.dwFormat)) { // failed, so try dropping to 8 bit wav += kwav22M8 - kwav22M16; if (!FIn(wav, 0, kwavLim)) return fFalse; mixc.dwFormat = _mpwavfmt[wav]; // we'll try to open at 8, cause if the card doesn't // support it, then WAVE_MAPPER will actually convert // to the 8 bit format. } _luFormat = mixc.dwFormat; _luCacheTime = amxc.uBufferTime; // initialize it (done only once...) if (FAILED(_pamix->Init(vwig.hinst, pvNil, &mixc, &amxc))) return fFalse; #else _luFormat = mixc.dwFormat; _luCacheTime = amxc.uBufferTime; // initialize it (done only once...) if (FAILED(_pamix->Init(vwig.hinst, pvNil, &mixc, &amxc))) { // failed, so try at 8 bit wav += kwav22M8 - kwav22M16; if (!FIn(wav, 0, kwavLim)) return fFalse; if (FAILED(_pamix->Init(vwig.hinst, pvNil, &mixc, &amxc))) return fFalse; } #endif if (FAILED(_pamix->Activate(fTrue))) return fFalse; } _Suspend(_cactSuspend > 0 || !_fActive); AssertThis(0); return fTrue; } /*************************************************************************** Allocate a new audioman queue. ***************************************************************************/ PSNQUE SDAM::_PsnqueNew(void) { AssertThis(0); return AMQUE::PamqueNew(); } /*************************************************************************** Activate or deactivate audioman. ***************************************************************************/ void SDAM::_Suspend(bool fSuspend) { AssertThis(0); if (fSuspend) _pamix->SetMixerVolume(_luVolSys); if (FAILED(_pamix->Suspend(fSuspend)) && !fSuspend) PushErc(ercSndamWaveDeviceBusy); else if (!fSuspend) { // becoming active _pamix->GetMixerVolume(&_luVolSys); vluSysVolFake = _luVolSys; _pamix->SetMixerVolume(LuVolScale(_luVolSys, _vlm)); } } /*************************************************************************** Set the volume. ***************************************************************************/ void SDAM::SetVlm(long vlm) { AssertThis(0); if (_vlm != vlm) { _vlm = vlm; if (_cactSuspend <= 0 && _fActive) _pamix->SetMixerVolume(LuVolScale(_luVolSys, vlm)); } } /*************************************************************************** Get the current volume. ***************************************************************************/ long SDAM::VlmCur(void) { AssertThis(0); return _vlm; } /*************************************************************************** Begin a synchronization group. ***************************************************************************/ void SDAM::BeginSynch(void) { AssertThis(0); if (0 == _cactGroup++) _fGrouped = SUCCEEDED(_pamix->AllocGroup(&_luGroup)); } /*************************************************************************** End a synchronization group. ***************************************************************************/ void SDAM::EndSynch(void) { AssertThis(0); if ((0 == --_cactGroup) && _fGrouped) { _pamix->StartGroup(_luGroup, fTrue); _pamix->FreeGroup(_luGroup); _fGrouped = fFalse; } } ================================================ FILE: kauai/src/sndam.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Copyright (c) Microsoft Corporation Audioman sound support. Contains the audioman sound sink, audioman channel and audioman cached sound classes. ***************************************************************************/ #ifndef SNDAM_H #define SNDAM_H // allowable formats for the audioman device // WARNING: code assumes that (kwav*16 - kwav*8) is constant! enum { kwav11M8, kwav22M8, kwav44M8, kwav11S8, kwav22S8, kwav44S8, kwav11M16, kwav22M16, kwav44M16, kwav11S16, kwav22S16, kwav44S16, kwavLim }; /*************************************************************************** Audioman sound device class. ***************************************************************************/ typedef class SDAM *PSDAM; #define SDAM_PAR SNDMQ #define kclsSDAM 'SDAM' class SDAM : public SDAM_PAR { RTCLASS_DEC ASSERT protected: ulong _luVolSys; long _vlm; bool _fAudioManInited : 1; SDAM(void); virtual bool _FInit(long wav); // inherited methods virtual PSNQUE _PsnqueNew(void); virtual void _Suspend(bool fSuspend); public: static long vcbMaxMemWave; static PSDAM PsdamNew(long wav); ~SDAM(void); virtual void SetVlm(long vlm); virtual long VlmCur(void); virtual void BeginSynch(void); virtual void EndSynch(void); }; #endif //! SNDAM_H ================================================ FILE: kauai/src/sndampri.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Private audioman sound device header file. ***************************************************************************/ #ifndef SNDAMPRI_H #define SNDAMPRI_H /*************************************************************************** IStream interface for a BLCK. ***************************************************************************/ typedef class STBL *PSTBL; #define STBL_PAR IStream class STBL : public STBL_PAR { ASSERT MARKMEM protected: long _cactRef; long _ib; BLCK _blck; STBL(void); ~STBL(void); public: // IUnknown methods STDMETHODIMP QueryInterface(REFIID riid, void **ppv); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); // IStream methods STDMETHODIMP Read(void *pv, ULONG cb, ULONG *pcb); STDMETHODIMP Write(VOID const *pv, ULONG cb, ULONG *pcb) { if (pvNil != pcb) *pcb = 0; return E_NOTIMPL; } STDMETHODIMP Seek(LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition); STDMETHODIMP SetSize(ULARGE_INTEGER libNewSize) { return E_NOTIMPL; } STDMETHODIMP CopyTo(IStream *pStm, ULARGE_INTEGER cb, ULARGE_INTEGER *pcbRead, ULARGE_INTEGER *pcbWritten) { if (pvNil != pcbRead) pcbRead->LowPart = pcbRead->HighPart = 0; if (pvNil != pcbWritten) pcbWritten->LowPart = pcbWritten->HighPart = 0; return E_NOTIMPL; } STDMETHODIMP Commit(DWORD grfCommitFlags) { return E_NOTIMPL; } STDMETHODIMP Revert(void) { return E_NOTIMPL; } STDMETHODIMP LockRegion(ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType) { return E_NOTIMPL; } STDMETHODIMP UnlockRegion(ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType) { return E_NOTIMPL; } STDMETHODIMP Stat(STATSTG *pstatstg, DWORD grfStatFlag) { return E_NOTIMPL; } STDMETHODIMP Clone(THIS_ IStream **ppstm) { *ppstm = pvNil; return E_NOTIMPL; } static PSTBL PstblNew(FLO *pflo, bool fPacked); long CbMem(void) { return size(STBL) + _blck.CbMem(); } bool FInMemory(void) { return _blck.CbMem() > 0; } }; /*************************************************************************** Cached AudioMan Sound. ***************************************************************************/ typedef class CAMS *PCAMS; #define CAMS_PAR BACO #define kclsCAMS 'CAMS' class CAMS : public CAMS_PAR { RTCLASS_DEC ASSERT MARKMEM protected: // this is just so we can do a MarkMemObj on it while AudioMan has it PSTBL _pstbl; CAMS(void); public: ~CAMS(void); static PCAMS PcamsNewLoop(PCAMS pcamsSrc, long cactPlay); IAMSound *psnd; // the sound to use static bool FReadCams(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb); bool FInMemory(void) { return _pstbl->FInMemory(); } }; /*************************************************************************** Notify sink class. ***************************************************************************/ typedef class AMQUE *PAMQUE; // forward declaration typedef class AMNOT *PAMNOT; #define AMNOT_PAR IAMNotifySink class AMNOT : public AMNOT_PAR { ASSERT protected: long _cactRef; PAMQUE _pamque; // the amque to notify public: // IUnknown methods STDMETHODIMP QueryInterface(REFIID riid, void **ppv); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); // IAMNotifySink methods STDMETHODIMP_(void) OnStart(LPSOUND pSound, DWORD dwPosition) { } STDMETHODIMP_(void) OnCompletion(LPSOUND pSound, DWORD dwPosition); STDMETHODIMP_(void) OnError(LPSOUND pSound, DWORD dwPosition, HRESULT hrError) { } STDMETHODIMP_(void) OnSyncObject(LPSOUND pSound, DWORD dwPosition, void *pvObject) { } AMNOT(void); void Set(PAMQUE pamque); }; /*************************************************************************** Audioman queue. ***************************************************************************/ #define AMQUE_PAR SNQUE #define kclsAMQUE 'amqu' class AMQUE : public AMQUE_PAR { RTCLASS_DEC ASSERT protected: MUTX _mutx; // restricts access to member variables IAMChannel *_pchan; // the audioman channel ulong _tsStart; // when we started the current sound AMNOT _amnot; // notify sink AMQUE(void); virtual void _Enter(void); virtual void _Leave(void); virtual bool _FInit(void); virtual PBACO _PbacoFetch(PRCA prca, CTG ctg, CNO cno); virtual void _Queue(long isndinMin); virtual void _PauseQueue(long isndinMin); virtual void _ResumeQueue(long isndinMin); public: static PAMQUE PamqueNew(void); ~AMQUE(void); void Notify(LPSOUND psnd); }; #endif //! SNDAMPRI_H ================================================ FILE: kauai/src/sndm.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Copyright (c) Microsoft Corporation Sound manager class implementation. ***************************************************************************/ #include "frame.h" ASSERTNAME RTCLASS(SNDV) RTCLASS(SNDM) RTCLASS(SNDMQ) RTCLASS(SNQUE) long SNDV::_siiLast; /*************************************************************************** This is the volume to use as the system volume if it is determined by a device that the system lies when asked what the current volume setting is. Eg, for many drivers, midiOutGetVolume on Win95 always returns full volume. When we determine that this is the case, we'll use this value instead. Any device that determines that its reading is valid should set this so other devices can use the same value. ***************************************************************************/ ulong vluSysVolFake = (ulong)-1; /*************************************************************************** Start a synchronized group. ***************************************************************************/ void SNDV::BeginSynch(void) { } /*************************************************************************** End a synchronized group. ***************************************************************************/ void SNDV::EndSynch(void) { } /*************************************************************************** Constructor for the sound manager. ***************************************************************************/ SNDM::SNDM(void) { } /*************************************************************************** Destructor for the sound manager. ***************************************************************************/ SNDM::~SNDM(void) { AssertBaseThis(0); SNDMPE sndmpe; long isndmpe; if (pvNil != _pglsndmpe) { for (isndmpe = 0; isndmpe < _pglsndmpe->IvMac(); isndmpe++) { _pglsndmpe->Get(isndmpe, &sndmpe); ReleasePpo(&sndmpe.psndv); } ReleasePpo(&_pglsndmpe); } } #ifdef DEBUG /*************************************************************************** Assert the validity of a SNDM. ***************************************************************************/ void SNDM::AssertValid(ulong grf) { SNDM_PAR::AssertValid(0); AssertPo(_pglsndmpe, 0); } /*************************************************************************** Mark memory for the SNDM. ***************************************************************************/ void SNDM::MarkMem(void) { AssertValid(0); long isndmpe; SNDMPE sndmpe; SNDM_PAR::MarkMem(); MarkMemObj(_pglsndmpe); for (isndmpe = 0; isndmpe < _pglsndmpe->IvMac(); isndmpe++) { _pglsndmpe->Get(isndmpe, &sndmpe); MarkMemObj(sndmpe.psndv); } } #endif // DEBUG /*************************************************************************** Create the sound manager. ***************************************************************************/ PSNDM SNDM::PsndmNew(void) { PSNDM psndm; if (pvNil == (psndm = NewObj SNDM)) return pvNil; if (!psndm->_FInit()) ReleasePpo(&psndm); AssertNilOrPo(psndm, 0); return psndm; } /*************************************************************************** Initialize the sound manager. ***************************************************************************/ bool SNDM::_FInit(void) { AssertBaseThis(0); if (pvNil == (_pglsndmpe = GL::PglNew(size(SNDMPE)))) return fFalse; _pglsndmpe->SetMinGrow(1); _fActive = fTrue; AssertThis(0); return fTrue; } /*************************************************************************** Find the device that sounds of the given ctg are to be played on. ***************************************************************************/ bool SNDM::_FFindCtg(CTG ctg, SNDMPE *psndmpe, long *pisndmpe) { AssertThis(0); AssertNilOrVarMem(psndmpe); AssertNilOrVarMem(pisndmpe); long isndmpe; SNDMPE sndmpe; for (isndmpe = 0; isndmpe < _pglsndmpe->IvMac(); isndmpe++) { _pglsndmpe->Get(isndmpe, &sndmpe); if (sndmpe.ctg == ctg) { if (pvNil != psndmpe) *psndmpe = sndmpe; if (pvNil != pisndmpe) *pisndmpe = isndmpe; return fTrue; } } TrashVar(psndmpe); if (pvNil != pisndmpe) *pisndmpe = _pglsndmpe->IvMac(); return fFalse; } /*************************************************************************** Add a device to the device map to handle the particular ctg. ***************************************************************************/ bool SNDM::FAddDevice(CTG ctg, PSNDV psndv) { AssertThis(0); AssertPo(psndv, 0); SNDMPE sndmpe; long isndmpe; long cact; psndv->AddRef(); if (_FFindCtg(ctg, &sndmpe, &isndmpe)) { ReleasePpo(&sndmpe.psndv); sndmpe.psndv = psndv; _pglsndmpe->Put(isndmpe, &sndmpe); } else { sndmpe.ctg = ctg; sndmpe.psndv = psndv; if (!_pglsndmpe->FInsert(isndmpe, &sndmpe)) { ReleasePpo(&psndv); return fFalse; } } psndv->Activate(_fActive); for (cact = 0; cact < _cactSuspend; cact++) psndv->Suspend(fTrue); return fTrue; } /*************************************************************************** Return the sound device that is registered for the given ctg. ***************************************************************************/ PSNDV SNDM::PsndvFromCtg(CTG ctg) { AssertThis(0); SNDMPE sndmpe; if (!_FFindCtg(ctg, &sndmpe)) return pvNil; return sndmpe.psndv; } /*************************************************************************** Remove the sound device for the given ctg. ***************************************************************************/ void SNDM::RemoveSndv(CTG ctg) { AssertThis(0); SNDMPE sndmpe; long isndmpe; if (!_FFindCtg(ctg, &sndmpe, &isndmpe)) return; _pglsndmpe->Delete(isndmpe); ReleasePpo(&sndmpe.psndv); } /*************************************************************************** Return whether the sound manager is active. ***************************************************************************/ bool SNDM::FActive(void) { AssertThis(0); return _fActive; } /*************************************************************************** Activate or deactivate the sound manager. ***************************************************************************/ void SNDM::Activate(bool fActive) { AssertThis(0); SNDMPE sndmpe; long isndmpe; if (FPure(fActive) == FPure(_fActive)) return; _fActive = FPure(fActive); for (isndmpe = 0; isndmpe < _pglsndmpe->IvMac(); isndmpe++) { _pglsndmpe->Get(isndmpe, &sndmpe); sndmpe.psndv->Activate(fActive); } } /*************************************************************************** Suspend or resume the sound manager. ***************************************************************************/ void SNDM::Suspend(bool fSuspend) { AssertThis(0); SNDMPE sndmpe; long isndmpe; if (fSuspend) _cactSuspend++; else _cactSuspend--; Assert(_cactSuspend >= FPure(fSuspend), "bad _cactSuspend"); for (isndmpe = 0; isndmpe < _pglsndmpe->IvMac(); isndmpe++) { _pglsndmpe->Get(isndmpe, &sndmpe); sndmpe.psndv->Suspend(fSuspend); } } /*************************************************************************** Set the volume of all the devices. ***************************************************************************/ void SNDM::SetVlm(long vlm) { AssertThis(0); SNDMPE sndmpe; long isndmpe; for (isndmpe = 0; isndmpe < _pglsndmpe->IvMac(); isndmpe++) { _pglsndmpe->Get(isndmpe, &sndmpe); sndmpe.psndv->SetVlm(vlm); } } /*************************************************************************** Get the max of the volumes of all the devices. ***************************************************************************/ long SNDM::VlmCur(void) { AssertThis(0); SNDMPE sndmpe; long isndmpe; long vlm; vlm = 0; for (isndmpe = 0; isndmpe < _pglsndmpe->IvMac(); isndmpe++) { _pglsndmpe->Get(isndmpe, &sndmpe); vlm = LwMax(vlm, sndmpe.psndv->VlmCur()); } return vlm; } /*************************************************************************** Play the given sound. ***************************************************************************/ long SNDM::SiiPlay(PRCA prca, CTG ctg, CNO cno, long sqn, long vlm, long cactPlay, ulong dtsStart, long spr, long scl) { AssertThis(0); AssertPo(prca, 0); SNDMPE sndmpe; if (!_FFindCtg(ctg, &sndmpe)) return _SiiAlloc(); return sndmpe.psndv->SiiPlay(prca, ctg, cno, sqn, vlm, cactPlay, dtsStart, spr, scl); } /*************************************************************************** Stop the given sound instance. ***************************************************************************/ void SNDM::Stop(long sii) { AssertThis(0); SNDMPE sndmpe; long isndmpe; for (isndmpe = 0; isndmpe < _pglsndmpe->IvMac(); isndmpe++) { _pglsndmpe->Get(isndmpe, &sndmpe); sndmpe.psndv->Stop(sii); } } /*************************************************************************** Stop all sounds of the given queue and class (one or both may be nil). ***************************************************************************/ void SNDM::StopAll(long sqn, long scl) { AssertThis(0); SNDMPE sndmpe; long isndmpe; for (isndmpe = 0; isndmpe < _pglsndmpe->IvMac(); isndmpe++) { _pglsndmpe->Get(isndmpe, &sndmpe); sndmpe.psndv->StopAll(sqn, scl); } } /*************************************************************************** Pause the given sound. ***************************************************************************/ void SNDM::Pause(long sii) { AssertThis(0); SNDMPE sndmpe; long isndmpe; for (isndmpe = 0; isndmpe < _pglsndmpe->IvMac(); isndmpe++) { _pglsndmpe->Get(isndmpe, &sndmpe); sndmpe.psndv->Pause(sii); } } /*************************************************************************** Pause all sounds of the given queue and class (one or both may be nil). ***************************************************************************/ void SNDM::PauseAll(long sqn, long scl) { AssertThis(0); SNDMPE sndmpe; long isndmpe; for (isndmpe = 0; isndmpe < _pglsndmpe->IvMac(); isndmpe++) { _pglsndmpe->Get(isndmpe, &sndmpe); sndmpe.psndv->PauseAll(sqn, scl); } } /*************************************************************************** Resume the given sound. ***************************************************************************/ void SNDM::Resume(long sii) { AssertThis(0); SNDMPE sndmpe; long isndmpe; for (isndmpe = 0; isndmpe < _pglsndmpe->IvMac(); isndmpe++) { _pglsndmpe->Get(isndmpe, &sndmpe); sndmpe.psndv->Resume(sii); } } /*************************************************************************** Resume all sounds of the given queue and class (one or both may be nil). ***************************************************************************/ void SNDM::ResumeAll(long sqn, long scl) { AssertThis(0); SNDMPE sndmpe; long isndmpe; for (isndmpe = 0; isndmpe < _pglsndmpe->IvMac(); isndmpe++) { _pglsndmpe->Get(isndmpe, &sndmpe); sndmpe.psndv->ResumeAll(sqn, scl); } } /*************************************************************************** Return whether the given sound is playing. ***************************************************************************/ bool SNDM::FPlaying(long sii) { AssertThis(0); SNDMPE sndmpe; long isndmpe; for (isndmpe = 0; isndmpe < _pglsndmpe->IvMac(); isndmpe++) { _pglsndmpe->Get(isndmpe, &sndmpe); if (sndmpe.psndv->FPlaying(sii)) return fTrue; } return fFalse; } /*************************************************************************** Return whether any sounds of the given queue and class are playing (one or both of (sqn, scl) may be nil). ***************************************************************************/ bool SNDM::FPlayingAll(long sqn, long scl) { AssertThis(0); SNDMPE sndmpe; long isndmpe; for (isndmpe = 0; isndmpe < _pglsndmpe->IvMac(); isndmpe++) { _pglsndmpe->Get(isndmpe, &sndmpe); if (sndmpe.psndv->FPlayingAll(sqn, scl)) return fTrue; } return fFalse; } /*************************************************************************** Free anything that's no longer in use. ***************************************************************************/ void SNDM::Flush(void) { AssertThis(0); SNDMPE sndmpe; long isndmpe; for (isndmpe = 0; isndmpe < _pglsndmpe->IvMac(); isndmpe++) { _pglsndmpe->Get(isndmpe, &sndmpe); sndmpe.psndv->Flush(); } } /*************************************************************************** Start a synchronized group. ***************************************************************************/ void SNDM::BeginSynch(void) { AssertThis(0); SNDMPE sndmpe; long isndmpe; for (isndmpe = 0; isndmpe < _pglsndmpe->IvMac(); isndmpe++) { _pglsndmpe->Get(isndmpe, &sndmpe); sndmpe.psndv->BeginSynch(); } } /*************************************************************************** End a synchronized group. ***************************************************************************/ void SNDM::EndSynch(void) { AssertThis(0); SNDMPE sndmpe; long isndmpe; for (isndmpe = 0; isndmpe < _pglsndmpe->IvMac(); isndmpe++) { _pglsndmpe->Get(isndmpe, &sndmpe); sndmpe.psndv->EndSynch(); } } /*************************************************************************** A convenient base class for a multiple queue sound device. ***************************************************************************/ /*************************************************************************** Destructor for a multiple queue sound device. ***************************************************************************/ SNDMQ::~SNDMQ(void) { AssertBaseThis(0); long isnqd; SNQD snqd; if (pvNil != _pglsnqd) { for (isnqd = 0; isnqd < _pglsnqd->IvMac(); isnqd++) { _pglsnqd->Get(isnqd, &snqd); ReleasePpo(&snqd.psnque); } ReleasePpo(&_pglsnqd); } } #ifdef DEBUG /*************************************************************************** Assert the validity of a SNDMQ. ***************************************************************************/ void SNDMQ::AssertValid(ulong grf) { SNDMQ_PAR::AssertValid(0); AssertPo(_pglsnqd, 0); } /*************************************************************************** Mark memory for the SNDMQ. ***************************************************************************/ void SNDMQ::MarkMem(void) { AssertValid(0); long isnqd; SNQD snqd; SNDMQ_PAR::MarkMem(); MarkMemObj(_pglsnqd); for (isnqd = 0; isnqd < _pglsnqd->IvMac(); isnqd++) { _pglsnqd->Get(isnqd, &snqd); MarkMemObj(snqd.psnque); } } #endif // DEBUG /*************************************************************************** Initialize the multiple queue device. ***************************************************************************/ bool SNDMQ::_FInit(void) { AssertBaseThis(0); if (pvNil == (_pglsnqd = GL::PglNew(size(SNQD)))) return fFalse; _fActive = fTrue; AssertThis(0); return fTrue; } /*************************************************************************** Ensure a queue exists for the given sqn and return it. ***************************************************************************/ bool SNDMQ::_FEnsureQueue(long sqn, SNQD *psnqd, long *pisnqd) { AssertThis(0); AssertNilOrVarMem(psnqd); AssertNilOrVarMem(pisnqd); long isnqd, isnqdEmpty; SNQD snqd; isnqdEmpty = ivNil; for (isnqd = _pglsnqd->IvMac(); isnqd-- > 0;) { _pglsnqd->Get(isnqd, &snqd); if (snqd.sqn == sqn && sqn != ksqnNone) { // we found it goto LFound; } if (ivNil == isnqdEmpty && !snqd.psnque->FPlayingAll()) { // here's an empty queue isnqdEmpty = isnqd; if (sqn == ksqnNone) break; } } if (ivNil != (isnqd = isnqdEmpty)) { _pglsnqd->Get(isnqd, &snqd); snqd.sqn = sqn; _pglsnqd->Put(isnqd, &snqd); goto LFound; } snqd.sqn = sqn; if (pvNil == (snqd.psnque = _PsnqueNew()) || !_pglsnqd->FAdd(&snqd, &isnqd)) { ReleasePpo(&snqd.psnque); TrashVar(psnqd); TrashVar(pisnqd); return fFalse; } LFound: if (pvNil != psnqd) *psnqd = snqd; if (pvNil != pisnqd) *pisnqd = isnqd; return fTrue; } /*************************************************************************** Return whether the device is active. ***************************************************************************/ bool SNDMQ::FActive(void) { AssertThis(0); return _fActive; } /*************************************************************************** Activate or deactivate the device. ***************************************************************************/ void SNDMQ::Activate(bool fActive) { AssertThis(0); if (FPure(fActive) == FPure(_fActive)) return; _fActive = FPure(fActive); _Suspend(_cactSuspend > 0 || !_fActive); } /*************************************************************************** Suspend or resume the device. ***************************************************************************/ void SNDMQ::Suspend(bool fSuspend) { AssertThis(0); if (fSuspend) _cactSuspend++; else _cactSuspend--; Assert(_cactSuspend >= FPure(fSuspend), "bad _cactSuspend"); _Suspend(_cactSuspend > 0 || !_fActive); } /*************************************************************************** Play the given sound. ***************************************************************************/ long SNDMQ::SiiPlay(PRCA prca, CTG ctg, CNO cno, long sqn, long vlm, long cactPlay, ulong dtsStart, long spr, long scl) { AssertThis(0); AssertPo(prca, 0); long isnqd; SNQD snqd; long sii = _SiiAlloc(); if (sqn == sqnNil) sqn = ksqnNone; if (_FEnsureQueue(sqn, &snqd, &isnqd)) { snqd.psnque->Enqueue(sii, prca, ctg, cno, vlm, cactPlay, dtsStart, spr, scl); } else Warn("couldn't allocate queue"); return sii; } /*************************************************************************** Stop the given sound instance. ***************************************************************************/ void SNDMQ::Stop(long sii) { AssertThis(0); long isnqd; SNQD snqd; for (isnqd = 0; isnqd < _pglsnqd->IvMac(); isnqd++) { _pglsnqd->Get(isnqd, &snqd); snqd.psnque->Stop(sii); } } /*************************************************************************** Stop all sounds of the given queue and class (one or both may be nil). ***************************************************************************/ void SNDMQ::StopAll(long sqn, long scl) { AssertThis(0); long isnqd; SNQD snqd; for (isnqd = 0; isnqd < _pglsnqd->IvMac(); isnqd++) { _pglsnqd->Get(isnqd, &snqd); if (sqnNil == sqn || snqd.sqn == sqn) snqd.psnque->StopAll(scl); } } /*************************************************************************** Pause the given sound. ***************************************************************************/ void SNDMQ::Pause(long sii) { AssertThis(0); long isnqd; SNQD snqd; for (isnqd = 0; isnqd < _pglsnqd->IvMac(); isnqd++) { _pglsnqd->Get(isnqd, &snqd); snqd.psnque->Pause(sii); } } /*************************************************************************** Pause all sounds of the given queue and class (one or both may be nil). ***************************************************************************/ void SNDMQ::PauseAll(long sqn, long scl) { AssertThis(0); long isnqd; SNQD snqd; for (isnqd = 0; isnqd < _pglsnqd->IvMac(); isnqd++) { _pglsnqd->Get(isnqd, &snqd); if (sqnNil == sqn || snqd.sqn == sqn) snqd.psnque->PauseAll(scl); } } /*************************************************************************** Resume the given sound. ***************************************************************************/ void SNDMQ::Resume(long sii) { AssertThis(0); long isnqd; SNQD snqd; for (isnqd = 0; isnqd < _pglsnqd->IvMac(); isnqd++) { _pglsnqd->Get(isnqd, &snqd); snqd.psnque->Resume(sii); } } /*************************************************************************** Resume all sounds of the given queue and class (one or both may be nil). ***************************************************************************/ void SNDMQ::ResumeAll(long sqn, long scl) { AssertThis(0); long isnqd; SNQD snqd; for (isnqd = 0; isnqd < _pglsnqd->IvMac(); isnqd++) { _pglsnqd->Get(isnqd, &snqd); if (sqnNil == sqn || snqd.sqn == sqn) snqd.psnque->ResumeAll(scl); } } /*************************************************************************** Return whether the given sound is playing. ***************************************************************************/ bool SNDMQ::FPlaying(long sii) { AssertThis(0); long isnqd; SNQD snqd; for (isnqd = 0; isnqd < _pglsnqd->IvMac(); isnqd++) { _pglsnqd->Get(isnqd, &snqd); if (snqd.psnque->FPlaying(sii)) return fTrue; } return fFalse; } /*************************************************************************** Return whether any sounds of the given queue and class are playing (one or both of (sqn, scl) may be nil). ***************************************************************************/ bool SNDMQ::FPlayingAll(long sqn, long scl) { AssertThis(0); long isnqd; SNQD snqd; for (isnqd = 0; isnqd < _pglsnqd->IvMac(); isnqd++) { _pglsnqd->Get(isnqd, &snqd); if ((sqnNil == sqn || snqd.sqn == sqn) && snqd.psnque->FPlayingAll(scl)) { return fTrue; } } return fFalse; } /*************************************************************************** Free anything that's no longer being used. ***************************************************************************/ void SNDMQ::Flush() { AssertThis(0); long isnqd; SNQD snqd; // Don't free the last channel for (isnqd = _pglsnqd->IvMac(); isnqd-- > 0;) { _pglsnqd->Get(isnqd, &snqd); snqd.psnque->Flush(); if (!snqd.psnque->FPlayingAll() && _pglsnqd->IvMac() > 1) { ReleasePpo(&snqd.psnque); _pglsnqd->Delete(isnqd); } } } /*************************************************************************** Constructor for an sound queue. ***************************************************************************/ SNQUE::SNQUE(void) { } /*************************************************************************** Destructor for an sound queue. ***************************************************************************/ SNQUE::~SNQUE(void) { AssertBaseThis(0); _Enter(); if (pvNil != _pglsndin) { long isndin; SNDIN sndin; for (isndin = _pglsndin->IvMac(); isndin-- > 0;) { _pglsndin->Get(isndin, &sndin); ReleasePpo(&sndin.pbaco); } ReleasePpo(&_pglsndin); } _Leave(); } #ifdef DEBUG /*************************************************************************** Assert the validity of a SNQUE. ***************************************************************************/ void SNQUE::AssertValid(ulong grf) { SNQUE_PAR::AssertValid(0); _Enter(); AssertPo(_pglsndin, 0); AssertIn(_isndinCur, 0, _pglsndin->IvMac() + 1); _Leave(); } /*************************************************************************** Mark memory for the SNQUE. ***************************************************************************/ void SNQUE::MarkMem(void) { AssertValid(0); long isndin; SNDIN sndin; SNQUE_PAR::MarkMem(); _Enter(); MarkMemObj(_pglsndin); for (isndin = 0; isndin < _pglsndin->IvMac(); isndin++) { _pglsndin->Get(isndin, &sndin); MarkMemObj(sndin.pbaco); } _Leave(); } #endif // DEBUG /*************************************************************************** Initialize the sound queue. Allocate the _pglsndin. ***************************************************************************/ bool SNQUE::_FInit(void) { AssertBaseThis(0); if (pvNil == (_pglsndin = GL::PglNew(size(SNDIN)))) return fFalse; AssertThis(0); return fTrue; } /*************************************************************************** Enter any critical section that's necessary to ensure access to member variables. ***************************************************************************/ void SNQUE::_Enter(void) { AssertBaseThis(0); } /*************************************************************************** Leave any critical section that's necessary to ensure access to member variables. ***************************************************************************/ void SNQUE::_Leave(void) { AssertBaseThis(0); } /*************************************************************************** Free any sounds below _isndinCur. ***************************************************************************/ void SNQUE::_Flush(void) { AssertThis(0); SNDIN sndin; _Enter(); while (_isndinCur > 0) { _isndinCur--; _pglsndin->Get(_isndinCur, &sndin); _pglsndin->Delete(_isndinCur); ReleasePpo(&sndin.pbaco); } _Leave(); } /*************************************************************************** Put the given sound on the queue. ***************************************************************************/ void SNQUE::Enqueue(long sii, PRCA prca, CTG ctg, CNO cno, long vlm, long cactPlay, ulong dtsStart, long spr, long scl) { AssertThis(0); AssertPo(prca, 0); SNDIN sndin; long isndin; if (pvNil == (sndin.pbaco = _PbacoFetch(prca, ctg, cno))) return; _Enter(); _Flush(); sndin.sii = sii; sndin.vlm = vlm; sndin.cactPlay = cactPlay; sndin.dtsStart = dtsStart; sndin.spr = spr; sndin.scl = scl; sndin.cactPause = 0; if (!_pglsndin->FAdd(&sndin, &isndin)) { ReleasePpo(&sndin.pbaco); _Leave(); return; } _Queue(isndin); _Leave(); } /*************************************************************************** Return the priority of the frontmost sound in the queue. ***************************************************************************/ long SNQUE::SprCur(void) { AssertThis(0); SNDIN sndin; long spr; _Enter(); _Flush(); if (_pglsndin->IvMac() >= _isndinCur) spr = klwMin; else { _pglsndin->Get(_isndinCur, &sndin); spr = sndin.spr; } _Leave(); return spr; } /*************************************************************************** If the given sound is in our queue, nuke it. ***************************************************************************/ void SNQUE::Stop(long sii) { AssertThis(0); long isndin; SNDIN sndin; _Enter(); _Flush(); for (isndin = _pglsndin->IvMac(); isndin-- > _isndinCur;) { _pglsndin->Get(isndin, &sndin); if (sndin.sii == sii) { if (0 <= sndin.cactPause) { sndin.cactPause = -1; _pglsndin->Put(isndin, &sndin); _Queue(isndin); } _Leave(); return; } } _Leave(); } /*************************************************************************** Nuke all sounds of the given sound class. sclNil means nuke all. ***************************************************************************/ void SNQUE::StopAll(long scl) { AssertThis(0); long isndin; SNDIN sndin; long isndinMin = klwMax; _Enter(); _Flush(); for (isndin = _pglsndin->IvMac(); isndin-- > _isndinCur;) { _pglsndin->Get(isndin, &sndin); if (0 <= sndin.cactPause && (sclNil == scl || sndin.scl == scl)) { sndin.cactPause = -1; _pglsndin->Put(isndin, &sndin); isndinMin = isndin; } } if (isndinMin < klwMax) _Queue(isndinMin); _Leave(); } /*************************************************************************** If the given sound is in our queue, pause it. ***************************************************************************/ void SNQUE::Pause(long sii) { AssertThis(0); long isndin; SNDIN sndin; _Enter(); _Flush(); for (isndin = _pglsndin->IvMac(); isndin-- > _isndinCur;) { _pglsndin->Get(isndin, &sndin); if (sndin.sii == sii) { if (0 <= sndin.cactPause) { sndin.cactPause++; _pglsndin->Put(isndin, &sndin); if (1 == sndin.cactPause) _PauseQueue(isndin); } _Leave(); return; } } _Leave(); } /*************************************************************************** Pause all sounds of the given sound class. sclNil means nuke all. ***************************************************************************/ void SNQUE::PauseAll(long scl) { AssertThis(0); long isndin; SNDIN sndin; long isndinMin = klwMax; _Enter(); _Flush(); for (isndin = _pglsndin->IvMac(); isndin-- > _isndinCur;) { _pglsndin->Get(isndin, &sndin); if (0 <= sndin.cactPause && (sclNil == scl || sndin.scl == scl)) { if (0 == sndin.cactPause++) isndinMin = isndin; _pglsndin->Put(isndin, &sndin); } } if (isndinMin < klwMax) _PauseQueue(isndinMin); _Leave(); } /*************************************************************************** If the given sound is in our queue, make sure it's not paused. ***************************************************************************/ void SNQUE::Resume(long sii) { AssertThis(0); long isndin; SNDIN sndin; _Enter(); _Flush(); for (isndin = _pglsndin->IvMac(); isndin-- > _isndinCur;) { _pglsndin->Get(isndin, &sndin); if (sndin.sii == sii) { if (0 < sndin.cactPause) { sndin.cactPause--; _pglsndin->Put(isndin, &sndin); if (0 == sndin.cactPause) _ResumeQueue(isndin); } _Leave(); return; } } _Leave(); } /*************************************************************************** Resume all sounds of the given sound class. sclNil means nuke all. ***************************************************************************/ void SNQUE::ResumeAll(long scl) { AssertThis(0); long isndin; SNDIN sndin; long isndinMin = klwMax; _Enter(); _Flush(); for (isndin = _pglsndin->IvMac(); isndin-- > _isndinCur;) { _pglsndin->Get(isndin, &sndin); if (0 < sndin.cactPause && (sclNil == scl || sndin.scl == scl)) { if (0 == --sndin.cactPause) isndinMin = isndin; _pglsndin->Put(isndin, &sndin); } } if (isndinMin < klwMax) _ResumeQueue(isndinMin); _Leave(); } /*************************************************************************** Return whether the given sound is in our queue. ***************************************************************************/ bool SNQUE::FPlaying(long sii) { AssertThis(0); long isndin; SNDIN sndin; _Enter(); _Flush(); for (isndin = _pglsndin->IvMac(); isndin-- > _isndinCur;) { _pglsndin->Get(isndin, &sndin); if (sndin.sii == sii) { _Leave(); return 0 <= sndin.cactPause; } } _Leave(); return fFalse; } /*************************************************************************** Return whether any sounds of the given sound class are in our queue. sclNil means any sounds at all. ***************************************************************************/ bool SNQUE::FPlayingAll(long scl) { AssertThis(0); long isndin; SNDIN sndin; _Enter(); _Flush(); for (isndin = _pglsndin->IvMac(); isndin-- > _isndinCur;) { _pglsndin->Get(isndin, &sndin); if (0 <= sndin.cactPause && (sclNil == scl || sndin.scl == scl)) { _Leave(); return fTrue; } } _Leave(); return fFalse; } /*************************************************************************** Free anything that's not being used. This should only be called from the main thread. ***************************************************************************/ void SNQUE::Flush(void) { AssertThis(0); _Flush(); } /*************************************************************************** Scale the given system volume by the given Kauai volume. ***************************************************************************/ ulong LuVolScale(ulong luVol, long vlm) { Assert(kvlmFull == 0x10000, "this code assumes kvlmFull is 0x10000"); ulong luHigh, luLow; ushort suHigh, suLow; MulLu(SuLow(luVol), vlm, &luHigh, &luLow); suLow = (luHigh > 0) ? (ushort)(-1) : SuHigh(luLow); MulLu(SuHigh(luVol), vlm, &luHigh, &luLow); suHigh = (luHigh > 0) ? (ushort)(-1) : SuHigh(luLow); return LuHighLow(suHigh, suLow); } ================================================ FILE: kauai/src/sndm.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Sound Management class for WAVE and MIDI support ***************************************************************************/ #ifndef SNDM_H #define SNDM_H const long siiNil = 0; const FTG kftgMidi = MacWin('MIDI', 'MID'); // REVIEW shonk: Mac: file type const FTG kftgWave = MacWin('WAVE', 'WAV'); // REVIEW shonk: Mac: file type /*************************************************************************** Sound device - like audioman or our midi player. ***************************************************************************/ typedef class SNDV *PSNDV; #define SNDV_PAR BASE #define kclsSNDV 'SNDV' class SNDV : public SNDV_PAR { RTCLASS_DEC protected: static long _siiLast; static long _SiiAlloc(void) { return ++_siiLast; } public: virtual bool FActive(void) = 0; virtual void Activate(bool fActive) = 0; // boolean state virtual void Suspend(bool fSuspend) = 0; // reference count virtual void SetVlm(long vlm) = 0; virtual long VlmCur(void) = 0; virtual long SiiPlay(PRCA prca, CTG ctg, CNO cno, long sqn = ksqnNone, long vlm = kvlmFull, long cactPlay = 1, ulong dtsStart = 0, long spr = 0, long scl = sclNil) = 0; virtual void Stop(long sii) = 0; virtual void StopAll(long sqn = sqnNil, long scl = sclNil) = 0; virtual void Pause(long sii) = 0; virtual void PauseAll(long sqn = sqnNil, long scl = sclNil) = 0; virtual void Resume(long sii) = 0; virtual void ResumeAll(long sqn = sqnNil, long scl = sclNil) = 0; virtual bool FPlaying(long sii) = 0; virtual bool FPlayingAll(long sqn = sqnNil, long scl = sclNil) = 0; virtual void Flush(void) = 0; virtual void BeginSynch(void); virtual void EndSynch(void); }; /**************************************** Sound manager class ****************************************/ typedef class SNDM *PSNDM; #define SNDM_PAR SNDV #define kclsSNDM 'SNDM' class SNDM : public SNDM_PAR { RTCLASS_DEC ASSERT MARKMEM protected: struct SNDMPE { CTG ctg; PSNDV psndv; }; PGL _pglsndmpe; // sound type to device mapper long _cactSuspend; // nesting level for suspending bool _fActive : 1; // whether the app is active bool _fFreeing : 1; // we're in the destructor SNDM(void); bool _FInit(void); bool _FFindCtg(CTG ctg, SNDMPE *psndmpe, long *pisndmpe = pvNil); public: static PSNDM PsndmNew(void); ~SNDM(void); // new methods virtual bool FAddDevice(CTG ctg, PSNDV psndv); virtual PSNDV PsndvFromCtg(CTG ctg); virtual void RemoveSndv(CTG ctg); // inherited methods virtual bool FActive(void); virtual void Activate(bool fActive); virtual void Suspend(bool fSuspend); virtual void SetVlm(long vlm); virtual long VlmCur(void); virtual long SiiPlay(PRCA prca, CTG ctg, CNO cno, long sqn = ksqnNone, long vlm = kvlmFull, long cactPlay = 1, ulong dtsStart = 0, long spr = 0, long scl = sclNil); virtual void Stop(long sii); virtual void StopAll(long sqn = sqnNil, long scl = sclNil); virtual void Pause(long sii); virtual void PauseAll(long sqn = sqnNil, long scl = sclNil); virtual void Resume(long sii); virtual void ResumeAll(long sqn = sqnNil, long scl = sclNil); virtual bool FPlaying(long sii); virtual bool FPlayingAll(long sqn = sqnNil, long scl = sclNil); virtual void Flush(void); virtual void BeginSynch(void); virtual void EndSynch(void); }; /*************************************************************************** A useful base class for devices that support multiple queues. ***************************************************************************/ typedef class SNQUE *PSNQUE; typedef class SNDMQ *PSNDMQ; #define SNDMQ_PAR SNDV #define kclsSNDMQ 'snmq' class SNDMQ : public SNDMQ_PAR { RTCLASS_DEC ASSERT MARKMEM protected: // queue descriptor struct SNQD { PSNQUE psnque; long sqn; }; PGL _pglsnqd; // the queues long _cactSuspend; bool _fActive : 1; virtual bool _FInit(void); virtual bool _FEnsureQueue(long sqn, SNQD *psnqd, long *pisnqd); virtual PSNQUE _PsnqueNew(void) = 0; virtual void _Suspend(bool fSuspend) = 0; public: ~SNDMQ(void); // inherited methods virtual bool FActive(void); virtual void Activate(bool fActive); virtual void Suspend(bool fSuspend); virtual long SiiPlay(PRCA prca, CTG ctg, CNO cno, long sqn = ksqnNone, long vlm = kvlmFull, long cactPlay = 1, ulong dtsStart = 0, long spr = 0, long scl = sclNil); virtual void Stop(long sii); virtual void StopAll(long sqn = sqnNil, long scl = sclNil); virtual void Pause(long sii); virtual void PauseAll(long sqn = sqnNil, long scl = sclNil); virtual void Resume(long sii); virtual void ResumeAll(long sqn = sqnNil, long scl = sclNil); virtual bool FPlaying(long sii); virtual bool FPlayingAll(long sqn = sqnNil, long scl = sclNil); virtual void Flush(void); }; /*************************************************************************** The sound instance structure. ***************************************************************************/ struct SNDIN { PBACO pbaco; // the sound to play long sii; // the sound instance id long vlm; // volume to play at long cactPlay; // how many times to play ulong dtsStart; // offset to start at long spr; // sound priority long scl; // sound class // 0 means play, < 0 means skip, > 0 means pause long cactPause; }; /*************************************************************************** Sound queue for a SNDMQ ***************************************************************************/ #define SNQUE_PAR BASE #define kclsSNQUE 'snqu' class SNQUE : public SNQUE_PAR { RTCLASS_DEC ASSERT MARKMEM protected: PGL _pglsndin; // the queue long _isndinCur; // SNDIN that we should be playing SNQUE(void); virtual bool _FInit(void); virtual void _Queue(long isndinMin) = 0; virtual void _PauseQueue(long isndinMin) = 0; virtual void _ResumeQueue(long isndinMin) = 0; virtual PBACO _PbacoFetch(PRCA prca, CTG ctg, CNO cno) = 0; virtual void _Enter(void); virtual void _Leave(void); virtual void _Flush(void); public: ~SNQUE(void); void Enqueue(long sii, PRCA prca, CTG ctg, CNO cno, long vlm, long cactPlay, ulong dtsStart, long spr, long scl); long SprCur(void); void Stop(long sii); void StopAll(long scl = sclNil); void Pause(long sii); void PauseAll(long scl = sclNil); void Resume(long sii); void ResumeAll(long scl = sclNil); bool FPlaying(long sii); bool FPlayingAll(long scl = sclNil); void Flush(void); }; extern ulong LuVolScale(ulong luVolSys, long vlm); extern ulong vluSysVolFake; #endif //! SNDM_H ================================================ FILE: kauai/src/spell.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Copyright (c) Microsoft Corporation Spell checker support using CSAPI compliant spell checkers. ***************************************************************************/ #include "frame.h" ASSERTNAME RTCLASS(SPLC) /*************************************************************************** Constructor for the spell checker. ***************************************************************************/ SPLC::SPLC(void) { } /*************************************************************************** Destructor for the spell checker. ***************************************************************************/ SPLC::~SPLC(void) { AssertThis(0); if (_fSplidValid) { if (_fMdrsValid) SpellCloseMdr(_splid, &_mdrs); if (_fUdrValid) SpellCloseUdr(_splid, _udr, fTrue); SpellTerminate(_splid, fTrue); } #ifdef WIN if (hNil != _hlib) FreeLibrary(_hlib); #endif // WIN } /*************************************************************************** Static method to create a new spell checker. ***************************************************************************/ PSPLC SPLC::PsplcNew(SC_LID sclid, PSTN pstnCustom) { PSPLC psplc; AssertNilOrPo(pstnCustom, 0); if (pvNil == (psplc = NewObj SPLC)) return pvNil; if (!psplc->_FInit(sclid, pstnCustom)) ReleasePpo(&psplc); AssertNilOrPo(psplc, 0); return psplc; } /*************************************************************************** Initializes the spell checker - finds the dll, loads the default dictionary. ***************************************************************************/ bool SPLC::_FInit(SC_LID sclid, PSTN pstnCustom) { AssertThis(0); AssertNilOrPo(pstnCustom, 0); SC_WSC wsc; FNI fni; if (!_FEnsureDll(sclid)) return fFalse; ClearPb(&wsc, size(wsc)); wsc.bHyphenHard = '-'; wsc.bEmDash = 151; wsc.bEnDash = 150; wsc.bEllipsis = 133; wsc.rgParaBreak[0] = kchReturn; Win(wsc.rgParaBreak[1] = kchLineFeed;) if (secNOERRORS != SpellInit(&_splid, &wsc)) return fFalse; _fSplidValid = fTrue; if (!_FEnsureMainDict(sclid, &fni)) return fFalse; if (pvNil != pstnCustom && !_FEnsureUserDict(pstnCustom, &fni)) return fFalse; return fTrue; } /*************************************************************************** Find the spelling dll and link the functions we need. ***************************************************************************/ bool SPLC::_FEnsureDll(SC_LID sclid) { AssertThis(0); #ifdef WIN AssertVar(_hlib == hNil, "why is _hlib not nil?", &_hlib); HKEY hkey; long cb, lwType; STN stn; SZ sz; stn.FFormatSz(PszLit("SOFTWARE\\Microsoft\\Shared Tools\\Proofing Tools") PszLit("\\Spelling\\%d\\Normal"), sclid); if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, stn.Psz(), 0, KEY_QUERY_VALUE, &hkey)) { goto LError; } if (ERROR_SUCCESS != RegQueryValueEx(hkey, PszLit("Engine"), pvNil, (ulong *)&lwType, pvNil, (ulong *)&cb) || lwType != REG_SZ || cb >= size(sz) || ERROR_SUCCESS != RegQueryValueEx(hkey, PszLit("Engine"), pvNil, (ulong *)&lwType, (byte *)sz, (ulong *)&cb)) { RegCloseKey(hkey); goto LError; } RegCloseKey(hkey); if (hNil == (_hlib = LoadLibrary(sz))) goto LError; if (pvNil == (*(void **)&_pfnInit = (void *)GetProcAddress(_hlib, MIR(2))) || pvNil == (*(void **)&_pfnOptions = (void *)GetProcAddress(_hlib, MIR(3))) || pvNil == (*(void **)&_pfnCheck = (void *)GetProcAddress(_hlib, MIR(4))) || pvNil == (*(void **)&_pfnTerminate = (void *)GetProcAddress(_hlib, MIR(5))) || pvNil == (*(void **)&_pfnOpenMdr = (void *)GetProcAddress(_hlib, MIR(7))) || pvNil == (*(void **)&_pfnOpenUdr = (void *)GetProcAddress(_hlib, MIR(8))) || pvNil == (*(void **)&_pfnAddUdr = (void *)GetProcAddress(_hlib, MIR(9))) || pvNil == (*(void **)&_pfnAddChangeUdr = (void *)GetProcAddress(_hlib, MIR(10))) || pvNil == (*(void **)&_pfnClearUdr = (void *)GetProcAddress(_hlib, MIR(12))) || pvNil == (*(void **)&_pfnCloseMdr = (void *)GetProcAddress(_hlib, MIR(15))) || pvNil == (*(void **)&_pfnCloseUdr = (void *)GetProcAddress(_hlib, MIR(16)))) { goto LError; } AssertThis(0); return fTrue; LError: PushErc(ercSpellNoDll); return fFalse; #else //! WIN RawRtn(); // REVIEW shonk: Mac: implement _FEnsureDll return fFalse; #endif //! WIN } /*************************************************************************** Find the main dictionary and load it ***************************************************************************/ bool SPLC::_FEnsureMainDict(SC_LID sclid, PFNI pfni) { AssertThis(0); AssertNilOrPo(pfni, 0); #ifdef WIN HKEY hkey; long cb, lwType; STN stn; SZ sz; stn.FFormatSz(PszLit("SOFTWARE\\Microsoft\\Shared Tools\\Proofing Tools") PszLit("\\Spelling\\%d\\Normal"), sclid); if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, stn.Psz(), 0, KEY_QUERY_VALUE, &hkey)) { goto LError; } if (ERROR_SUCCESS != RegQueryValueEx(hkey, PszLit("Dictionary"), pvNil, (ulong *)&lwType, pvNil, (ulong *)&cb) || lwType != REG_SZ || cb >= size(sz) || ERROR_SUCCESS != RegQueryValueEx(hkey, PszLit("Dictionary"), pvNil, (ulong *)&lwType, (byte *)sz, (ulong *)&cb)) { RegCloseKey(hkey); goto LError; } RegCloseKey(hkey); if (pvNil != pfni) { STN stn = sz; if (!pfni->FBuildFromPath(&stn)) goto LError; } if (!_FLoadDictionary(sclid, sz, &_mdrs)) goto LError; _fMdrsValid = fTrue; AssertThis(0); return fTrue; LError: PushErc(ercSpellNoDict); return fFalse; #else //! WIN RawRtn(); // REVIEW shonk: Mac: implement _FEnsureMainDict return fFalse; #endif //! WIN } /*************************************************************************** Find the main dictionary and load it ***************************************************************************/ bool SPLC::_FEnsureUserDict(PSTN pstnCustom, PFNI pfniDef) { AssertThis(0); AssertPo(pstnCustom, 0); #ifdef WIN HKEY hkey; long cb, lwType; SZ sz; STN stn; FNI fni; if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, PszLit("SOFTWARE\\Microsoft\\Shared Tools Location"), 0, KEY_QUERY_VALUE, &hkey)) { goto LNoKey; } if (ERROR_SUCCESS != RegQueryValueEx(hkey, PszLit("PROOF"), pvNil, (ulong *)&lwType, pvNil, (ulong *)&cb) || lwType != REG_SZ || cb >= size(sz) || ERROR_SUCCESS != RegQueryValueEx(hkey, PszLit("PROOF"), pvNil, (ulong *)&lwType, (byte *)sz, (ulong *)&cb)) { RegCloseKey(hkey); LNoKey: if (pvNil == pfniDef) goto LError; fni = *pfniDef; } else { RegCloseKey(hkey); stn = sz; if (!fni.FBuildFromPath(&stn, kftgDir)) goto LError; } if (!fni.FSetLeaf(pstnCustom, kftgDictionary)) goto LError; fni.GetStnPath(&stn); if (!_FLoadUserDictionary(stn.Psz(), &_udr, fTrue)) goto LError; _fUdrValid = fTrue; AssertThis(0); return fTrue; LError: PushErc(ercSpellNoUserDict); return fFalse; #else //! WIN RawRtn(); // REVIEW shonk: Mac: implement _FEnsureUserDict return fFalse; #endif //! WIN } /*************************************************************************** Load a particular dictionary given its path. ***************************************************************************/ bool SPLC::_FLoadDictionary(SC_LID sclid, PSZ psz, SC_MDRS *pmdrs) { AssertThis(0); AssertSz(psz); AssertVarMem(pmdrs); if (!_fSplidValid) { Bug("spell checker not initialized"); return fFalse; } if (secNOERRORS != SpellOpenMdr(_splid, psz, pvNil, fFalse, fTrue, sclid, pmdrs)) { return fFalse; } return fTrue; } /*************************************************************************** Load a particular user dictionary given its path. ***************************************************************************/ bool SPLC::_FLoadUserDictionary(PSZ psz, SC_UDR *pudr, bool fCreate) { AssertThis(0); AssertSz(psz); AssertVarMem(pudr); SC_BOOL fReadOnly; if (!_fSplidValid) { Bug("spell checker not initialized"); return fFalse; } if (secNOERRORS != SpellOpenUdr(_splid, psz, FPure(fCreate), IgnoreAlwaysProp, pudr, &fReadOnly)) { return fFalse; } return fTrue; } /*************************************************************************** Set spelling options. ***************************************************************************/ bool SPLC::FSetOptions(ulong grfsplc) { AssertThis(0); if (!_fSplidValid) { Bug("spell checker not initialized"); return fFalse; } if (secNOERRORS != SpellOptions(_splid, grfsplc)) return fFalse; return fTrue; } /*************************************************************************** Check the spelling of stuff in the given buffer. ***************************************************************************/ bool SPLC::FCheck(achar *prgch, long cch, long *pichMinBad, long *pichLimBad, PSTN pstnReplace, long *pscrs) { AssertThis(0); AssertIn(cch, 0, ksuMax); AssertPvCb(prgch, cch * size(achar)); AssertVarMem(pichMinBad); AssertVarMem(pichLimBad); AssertPo(pstnReplace, 0); AssertVarMem(pscrs); SC_SIB sib; SC_SRB srb; SC_SEC sec; SZ sz; byte bRate; pstnReplace->SetNil(); *pichMinBad = *pichLimBad = cch; if (!_fSplidValid) { Bug("spell checker not initialized"); return fFalse; } ClearPb(&sib, size(sib)); sib.cch = (ushort)cch; sib.lrgch = prgch; sib.cMdr = 1; sib.lrgMdr = &_mdrs.mdr; if (_fUdrValid) { sib.cUdr = 1; sib.lrgUdr = &_udr; } ClearPb(&srb, size(srb)); srb.lrgsz = sz; srb.cch = size(sz) / size(achar); srb.lrgbRating = &bRate; srb.cbRate = 1; sec = SpellCheck(_splid, sccVerifyBuffer, &sib, &srb); if (sec != secNOERRORS) return fFalse; *pscrs = srb.scrs; switch (srb.scrs) { case scrsNoErrors: return fTrue; case scrsReturningChangeAlways: case scrsReturningChangeOnce: *pstnReplace = srb.lrgsz; break; } *pichMinBad = srb.ichError; *pichLimBad = srb.ichError + srb.cchError; return fTrue; } /*************************************************************************** Get the istn'th suggestion for the given word. ***************************************************************************/ bool SPLC::FSuggest(achar *prgch, long cch, bool fFirst, PSTN pstn) { AssertThis(0); AssertIn(cch, 1, ksuMax); AssertPvCb(prgch, cch * size(achar)); AssertPo(pstn, 0); SC_SIB sib; SC_SRB srb; SC_SEC sec; SC_CC sccc; pstn->SetNil(); if (!_fSplidValid) { Bug("spell checker not initialized"); return fFalse; } if (!fFirst && _ichSuggest < CvFromRgv(_rgchSuggest) && _rgchSuggest[_ichSuggest] != 0) { // have another suggestion in the buffer *pstn = _rgchSuggest + _ichSuggest; _ichSuggest += CchSz(_rgchSuggest + _ichSuggest) + 1; return fTrue; } ClearPb(&sib, size(sib)); sib.cch = (ushort)cch; sib.lrgch = prgch; sib.cMdr = 1; sib.lrgMdr = &_mdrs.mdr; if (_fUdrValid) { sib.cUdr = 1; sib.lrgUdr = &_udr; } ClearPb(&srb, size(srb)); srb.lrgsz = _rgchSuggest; srb.cch = CvFromRgv(_rgchSuggest); _ichSuggest = 0; sccc = fFirst ? sccSuggest : sccSuggestMore; for (;; sccc = sccSuggestMore) { ClearPb(_rgchSuggest, size(_rgchSuggest)); sec = SpellCheck(_splid, sccc, &sib, &srb); if (sec != secNOERRORS) { // invalidate the buffer _ichSuggest = CvFromRgv(_rgchSuggest); return fFalse; } switch (srb.scrs) { case scrsNoMoreSuggestions: // invalidate the buffer _ichSuggest = CvFromRgv(_rgchSuggest); return fFalse; default: if (srb.csz > 0) { *pstn = _rgchSuggest; _ichSuggest = CchSz(_rgchSuggest) + 1; return fTrue; } break; } } } /*************************************************************************** Add this word to the ignore all list. ***************************************************************************/ bool SPLC::FIgnoreAll(PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); if (!_fSplidValid) { Bug("spell checker not initialized"); return fFalse; } return secNOERRORS == SpellAddUdr(_splid, udrIgnoreAlways, pstn->Psz()); } /*************************************************************************** Add this word pair to the change once list. ***************************************************************************/ bool SPLC::FChange(PSTN pstnSrc, PSTN pstnDst, bool fAll) { AssertThis(0); AssertPo(pstnSrc, 0); AssertPo(pstnDst, 0); if (!_fSplidValid) { Bug("spell checker not initialized"); return fFalse; } return secNOERRORS == SpellAddChangeUdr(_splid, fAll ? udrChangeAlways : udrChangeOnce, pstnSrc->Psz(), pstnDst->Psz()); } /*************************************************************************** Add this word pair to the user dictionary. ***************************************************************************/ bool SPLC::FAddToUser(PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); if (!_fUdrValid) { Bug("user dictionary not loaded"); return fFalse; } return secNOERRORS == SpellAddUdr(_splid, _udr, pstn->Psz()); } /*************************************************************************** Add this word to the ignore all list. ***************************************************************************/ void SPLC::FlushIgnoreList(void) { AssertThis(0); if (!_fSplidValid) { Bug("spell checker not initialized"); return; } SpellClearUdr(_splid, udrIgnoreAlways); } /*************************************************************************** Add this word pair to the change once list. ***************************************************************************/ void SPLC::FlushChangeList(bool fAll) { AssertThis(0); if (!_fSplidValid) { Bug("spell checker not initialized"); return; } SpellClearUdr(_splid, fAll ? udrChangeAlways : udrChangeOnce); } /*************************************************************************** These are the stubs for the dll entry points. ***************************************************************************/ #ifdef WIN /*************************************************************************** Stub for SpellInit ***************************************************************************/ SC_SEC SPLC::SpellInit(SC_SPLID *psplid, SC_WSC *pwsc) { AssertThis(0); if (pvNil == _pfnInit) { Bug("nil _pfnInit"); return secModuleError; } return (*_pfnInit)(psplid, pwsc); } /*************************************************************************** Stub for SpellOptions ***************************************************************************/ SC_SEC SPLC::SpellOptions(SC_SPLID splid, long grfso) { AssertThis(0); if (pvNil == _pfnOptions) { Bug("nil _pfnOptions"); return secModuleError; } return (*_pfnOptions)(splid, grfso); } /*************************************************************************** Stub for SpellCheck ***************************************************************************/ SC_SEC SPLC::SpellCheck(SC_SPLID splid, SC_CC sccc, LPSC_SIB psib, LPSC_SRB psrb) { AssertThis(0); if (pvNil == _pfnCheck) { Bug("nil _pfnCheck"); return secModuleError; } return (*_pfnCheck)(splid, sccc, psib, psrb); } /*************************************************************************** Stub for SpellTerminate ***************************************************************************/ SC_SEC SPLC::SpellTerminate(SC_SPLID splid, SC_BOOL fForce) { AssertThis(0); if (pvNil == _pfnTerminate) { Bug("nil _pfnTerminate"); return secModuleError; } return (*_pfnTerminate)(splid, fForce); } /*************************************************************************** Stub for SpellOpenMdr ***************************************************************************/ SC_SEC SPLC::SpellOpenMdr(SC_SPLID splid, LPSC_PATH ppath, LPSC_PATH ppathExclude, SC_BOOL fCreateExclude, SC_BOOL fCache, SC_LID sclidExpected, LPSC_MDRS pmdrs) { AssertThis(0); if (pvNil == _pfnOpenMdr) { Bug("nil _pfnOpenMdr"); return secModuleError; } return (*_pfnOpenMdr)(splid, ppath, ppathExclude, fCreateExclude, fCache, sclidExpected, pmdrs); } /*************************************************************************** Stub for SpellOpenUdr ***************************************************************************/ SC_SEC SPLC::SpellOpenUdr(SC_SPLID splid, LPSC_PATH ppath, SC_BOOL fCreate, SC_WORD udrprop, SC_UDR *pudr, SC_BOOL *pfReadOnly) { AssertThis(0); if (pvNil == _pfnOpenUdr) { Bug("nil _pfnOpenUdr"); return secModuleError; } return (*_pfnOpenUdr)(splid, ppath, fCreate, udrprop, pudr, pfReadOnly); } /*************************************************************************** Add a word to the given user dictionary ***************************************************************************/ SC_SEC SPLC::SpellAddUdr(SC_SPLID splid, SC_UDR udr, SC_CHAR *pszAdd) { AssertThis(0); if (pvNil == _pfnAddUdr) { Bug("nil _pfnAddUdr"); return secModuleError; } return (*_pfnAddUdr)(splid, udr, pszAdd); } /*************************************************************************** Add a word pair to the given user dictionary ***************************************************************************/ SC_SEC SPLC::SpellAddChangeUdr(SC_SPLID splid, SC_UDR udr, SC_CHAR *pszAdd, SC_CHAR *pszChange) { AssertThis(0); if (pvNil == _pfnAddChangeUdr) { Bug("nil _pfnAddChangeUdr"); return secModuleError; } return (*_pfnAddChangeUdr)(splid, udr, pszAdd, pszChange); } /*************************************************************************** Stub for SpellClearUdr ***************************************************************************/ SC_SEC SPLC::SpellClearUdr(SC_SPLID splid, SC_UDR udr) { AssertThis(0); if (pvNil == _pfnClearUdr) { Bug("nil _pfnClearUdr"); return secModuleError; } return (*_pfnClearUdr)(splid, udr); } /*************************************************************************** Stub for SpellCloseMdr ***************************************************************************/ SC_SEC SPLC::SpellCloseMdr(SC_SPLID splid, LPSC_MDRS pmdrs) { AssertThis(0); if (pvNil == _pfnCloseMdr) { Bug("nil _pfnCloseMdr"); return secModuleError; } return (*_pfnCloseMdr)(splid, pmdrs); } /*************************************************************************** Stub for SpellCloseUdr ***************************************************************************/ SC_SEC SPLC::SpellCloseUdr(SC_SPLID splid, SC_UDR udr, SC_BOOL fForce) { AssertThis(0); if (pvNil == _pfnCloseUdr) { Bug("nil _pfnCloseUdr"); return secModuleError; } return (*_pfnCloseUdr)(splid, udr, fForce); } #endif // WIN #ifdef DEBUG /*************************************************************************** Assert the validity of a SPLC. ***************************************************************************/ void SPLC::AssertValid(ulong grf) { SPLC_PAR::AssertValid(0); } /*************************************************************************** Mark memory for the SPLC. ***************************************************************************/ void SPLC::MarkMem(void) { AssertValid(0); SPLC_PAR::MarkMem(); } #endif // DEBUG ================================================ FILE: kauai/src/spell.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Copyright (c) Microsoft Corporation Spell checker support using CSAPI compliant spell checkers. ***************************************************************************/ #ifndef SPELL_H #define SPELL_H // REVIEW shonk: dictionary type on Mac const FTG kftgDictionary = MacWin('DICT', 'DIC'); // include the standard spell checker API header #ifdef WIN #define NT #endif // WIN extern "C" { #include "csapi.h" }; enum { fsplcNil = 0, fsplcSuggestFromUserDict = soSuggestFromUserDict, fsplcIgnoreAllCaps = soIgnoreAllCaps, fsplcIgnoreMixedDigits = soIgnoreMixedDigits, fsplcIgnoreRomanNumerals = soIgnoreRomanNumerals, fsplcFindUncappedSentences = soFindUncappedSentences, fsplcFindMissingSpaces = soFindMissingSpaces, fsplcFindRepeatWord = soFindRepeatWord, fsplcFindExtraSpaces = soFindExtraSpaces, fsplcFindSpacesBeforePunc = soFindSpacesBeforePunc, fsplcFindSpacesAfterPunc = soFindSpacesAfterPunc, fsplcFindInitialNumerals = soFindInitialNumerals, fsplcQuickSuggest = soQuickSuggest, fsplcUseAllOpenUdr = soUseAllOpenUdr, fsplcSglStepSugg = soSglStepSugg, fsplcIgnoreSingleLetter = soIgnoreSingleLetter, }; typedef class SPLC *PSPLC; #define SPLC_PAR BASE #define kclsSPLC 'SPLC' class SPLC : public SPLC_PAR { RTCLASS_DEC MARKMEM ASSERT protected: bool _fSplidValid : 1; bool _fMdrsValid : 1; bool _fUdrValid : 1; ulong _splid; SC_MDRS _mdrs; SC_UDR _udr; achar _rgchSuggest[512]; long _ichSuggest; #ifdef WIN HINSTANCE _hlib; SC_SEC(__cdecl *_pfnInit)(SC_SPLID *psplid, SC_WSC *pwsc); SC_SEC(__cdecl *_pfnOptions)(SC_SPLID splid, long grfso); SC_SEC(__cdecl *_pfnCheck)(SC_SPLID splid, SC_CC sccc, LPSC_SIB psib, LPSC_SRB psrb); SC_SEC(__cdecl *_pfnTerminate)(SC_SPLID splid, SC_BOOL fForce); SC_SEC(__cdecl *_pfnOpenMdr) (SC_SPLID splid, LPSC_PATH ppath, LPSC_PATH ppathExclude, SC_BOOL fCreateExclude, SC_BOOL fCache, SC_LID lidExpected, LPSC_MDRS pmdrs); SC_SEC(__cdecl *_pfnOpenUdr) (SC_SPLID splid, LPSC_PATH ppath, SC_BOOL fCreate, SC_WORD udrprop, SC_UDR *pudr, SC_BOOL *pfReadOnly); SC_SEC(__cdecl *_pfnAddUdr)(SC_SPLID splid, SC_UDR udr, SC_CHAR *pszAdd); SC_SEC(__cdecl *_pfnAddChangeUdr)(SC_SPLID splid, SC_UDR udr, SC_CHAR *pszAdd, SC_CHAR *pszChange); SC_SEC(__cdecl *_pfnClearUdr)(SC_SPLID splid, SC_UDR udr); SC_SEC(__cdecl *_pfnCloseMdr)(SC_SPLID splid, LPSC_MDRS pmdrs); SC_SEC(__cdecl *_pfnCloseUdr)(SC_SPLID splid, SC_UDR udr, SC_BOOL fForce); // SC_SEC SpellVer(SC_WORD *pwVer, SC_WORD *pwEngine, SC_WORD *pwType); SC_SEC SpellInit(SC_SPLID *psplid, SC_WSC *pwsc); SC_SEC SpellOptions(SC_SPLID splid, long grfso); SC_SEC SpellCheck(SC_SPLID splid, SC_CC sccc, LPSC_SIB psib, LPSC_SRB psrb); SC_SEC SpellTerminate(SC_SPLID splid, SC_BOOL fForce); // SC_SEC SpellVerifyMdr(LPSC_PATH ppath, SC_LID lidExpected, SC_LID *plid); SC_SEC SpellOpenMdr(SC_SPLID splid, LPSC_PATH ppath, LPSC_PATH ppathExclude, SC_BOOL fCreateExclude, SC_BOOL fCache, SC_LID lidExpected, LPSC_MDRS pmdrs); SC_SEC SpellOpenUdr(SC_SPLID splid, LPSC_PATH ppath, SC_BOOL fCreate, SC_WORD udrprop, SC_UDR *pudr, SC_BOOL *pfReadOnly); SC_SEC SpellAddUdr(SC_SPLID splid, SC_UDR udr, SC_CHAR *pszAdd); SC_SEC SpellAddChangeUdr(SC_SPLID splid, SC_UDR udr, SC_CHAR *pszAdd, SC_CHAR *pszChange); // SC_SEC SpellDelUdr(SC_SPLID splid, SC_UDR udr, SC_CHAR *pszDel); SC_SEC SpellClearUdr(SC_SPLID splid, SC_UDR udr); // SC_SEC SpellGetSizeUdr(SC_SPLID splid, SC_UDR udr, int *pcsz); // SC_SEC SpellGetListUdr(SC_SPLID splid, SC_UDR udr, SC_WORD iszStart, // LPSC_SRB psrb); SC_SEC SpellCloseMdr(SC_SPLID splid, LPSC_MDRS pmdrs); SC_SEC SpellCloseUdr(SC_SPLID splid, SC_UDR udr, SC_BOOL fForce); #endif // WIN SPLC(void); virtual bool _FInit(SC_LID sclid, PSTN pstnCustom = pvNil); virtual bool _FEnsureDll(SC_LID sclid); virtual bool _FEnsureMainDict(SC_LID sclid, PFNI pfniDic = pvNil); virtual bool _FEnsureUserDict(PSTN pstnCustom, PFNI pfniDef = pvNil); virtual bool _FLoadDictionary(SC_LID sclid, PSZ psz, SC_MDRS *pmdrs); virtual bool _FLoadUserDictionary(PSZ psz, SC_UDR *pudr, bool fCreate = fFalse); public: ~SPLC(void); static PSPLC PsplcNew(SC_LID sclid, PSTN pstnCustom = pvNil); virtual bool FSetOptions(ulong grfsplc); virtual bool FCheck(achar *prgch, long cch, long *pichMinBad, long *pichLimBad, PSTN pstn, long *pscrs); virtual bool FSuggest(achar *prgch, long cch, bool fFirst, PSTN pstn); virtual bool FIgnoreAll(PSTN pstn); virtual bool FChange(PSTN pstnSrc, PSTN pstnDst, bool fAll); virtual bool FAddToUser(PSTN pstn); virtual void FlushIgnoreList(void); virtual void FlushChangeList(bool fAll); }; #endif //! SPELL_H ================================================ FILE: kauai/src/stream.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Stream classes. BSM is totally in memory. BSF allows a stream to have pieces in files and other pieces in memory. ***************************************************************************/ #include "util.h" ASSERTNAME // min size of initial piece on file const long kcbMinFloFile = 2048; RTCLASS(BSM) RTCLASS(BSF) /*************************************************************************** Constructor for an in-memory byte stream. ***************************************************************************/ BSM::BSM(void) { _hqrgb = hqNil; _ibMac = 0; _cbMinGrow = 0; AssertThis(fobjAssertFull); } /*************************************************************************** Destructor for an in-memory byte stream. ***************************************************************************/ BSM::~BSM(void) { AssertThis(fobjAssertFull); FreePhq(&_hqrgb); } /*************************************************************************** Set the amount to grow by. ***************************************************************************/ void BSM::SetMinGrow(long cb) { AssertThis(0); AssertIn(cb, 0, kcbMax); _cbMinGrow = cb; } /*************************************************************************** Make sure there is at least cb bytes of space. If fShrink is true, the amount of memory allocated by the BSM may decrease. ***************************************************************************/ bool BSM::FEnsureSpace(long cb, bool fShrink) { AssertThis(0); return _FEnsureSize(_ibMac + cb, fShrink); } /*************************************************************************** Return a locked pointer into the byte stream. The stream is stored contiguously. ***************************************************************************/ void *BSM::PvLock(long ib) { AssertThis(0); AssertIn(ib, 0, _ibMac + 1); if (hqNil == _hqrgb) return pvNil; return PvAddBv(PvLockHq(_hqrgb), ib); } /*************************************************************************** Unlock the stream. ***************************************************************************/ void BSM::Unlock(void) { AssertThis(0); if (hqNil != _hqrgb) UnlockHq(_hqrgb); } /*************************************************************************** Fetch some bytes from the stream. ***************************************************************************/ void BSM::FetchRgb(long ib, long cb, void *prgb) { AssertThis(0); AssertIn(ib, 0, _ibMac + 1); AssertIn(cb, 0, _ibMac + 1 - ib); AssertPvCb(prgb, cb); if (cb > 0) CopyPb(PvAddBv(QvFromHq(_hqrgb), ib), prgb, cb); } /*************************************************************************** Replace the range [ib,ib + cbDel) with cbIns bytes from prgb. If cbIns is zero, prgb may be nil. ***************************************************************************/ bool BSM::FReplace(void *prgb, long cbIns, long ib, long cbDel) { AssertThis(fobjAssertFull); AssertIn(cbIns, 0, kcbMax); AssertPvCb(prgb, cbIns); AssertIn(ib, 0, _ibMac + 1); AssertIn(cbDel, 0, _ibMac + 1 - ib); byte *qrgb; if (!_FEnsureSize(_ibMac + cbIns - cbDel, fFalse)) return fFalse; qrgb = (byte *)QvFromHq(_hqrgb); if (ib < _ibMac - cbDel && cbDel != cbIns) BltPb(qrgb + ib + cbDel, qrgb + ib + cbIns, _ibMac - cbDel - ib); if (cbIns > 0) CopyPb(prgb, qrgb + ib, cbIns); _ibMac += cbIns - cbDel; AssertThis(fobjAssertFull); return fTrue; } /*************************************************************************** Write the byte stream to a file. ***************************************************************************/ bool BSM::FWriteRgb(PFLO pflo, long ib) { AssertThis(0); AssertPo(pflo, 0); BLCK blck(pflo); return FWriteRgb(&blck, ib); } /*************************************************************************** Write the byte stream to a block. ***************************************************************************/ bool BSM::FWriteRgb(PBLCK pblck, long ib) { AssertThis(fobjAssertFull); AssertPo(pblck, 0); AssertIn(ib, 0, CbOfHq(_hqrgb) - pblck->Cb() + 1); bool fRet; if (ib + pblck->Cb() > _ibMac) { Bug("blck is too big"); return fFalse; } if (pblck->Cb() == 0) return fTrue; fRet = pblck->FWrite(PvAddBv(PvLockHq(_hqrgb), ib)); UnlockHq(_hqrgb); return fRet; } /*************************************************************************** Make sure the hq is at least cbMin bytes. If fShrink is true, make the hq exactly cbMin bytes long. ***************************************************************************/ bool BSM::_FEnsureSize(long cbMin, bool fShrink) { AssertThis(fobjAssertFull); AssertIn(cbMin, 0, kcbMax); long cb = hqNil == _hqrgb ? 0 : CbOfHq(_hqrgb); if (cbMin <= cb && (!fShrink || cbMin == cb)) return fTrue; if (cbMin == 0) { if (fShrink) FreePhq(&_hqrgb); return fTrue; } if (hqNil == _hqrgb) { return FAllocHq(&_hqrgb, LwMax(cbMin, _cbMinGrow), fmemNil, mprNormal) || _cbMinGrow > cbMin && FAllocHq(&_hqrgb, cbMin, fmemNil, mprNormal); } return FResizePhq(&_hqrgb, LwMax(cbMin, cb + _cbMinGrow), fmemNil, mprNormal) || cb + _cbMinGrow > cbMin && FResizePhq(&_hqrgb, cbMin, fmemNil, mprNormal); } #ifdef DEBUG /*************************************************************************** Assert the validity of a byte stream (BSF). ***************************************************************************/ void BSM::AssertValid(ulong grf) { BSM_PAR::AssertValid(grf); AssertIn(_ibMac, 0, kcbMax); AssertIn(_cbMinGrow, 0, kcbMax); if (_ibMac > 0) { AssertHq(_hqrgb); AssertIn(_ibMac, 0, CbOfHq(_hqrgb) + 1); } else if (hqNil != _hqrgb) AssertHq(_hqrgb); } /*************************************************************************** Mark memory for the BSM. ***************************************************************************/ void BSM::MarkMem(void) { AssertValid(fobjAssertFull); BSM_PAR::MarkMem(); MarkHq(_hqrgb); } #endif // DEBUG /*************************************************************************** Constructor for a stream. ***************************************************************************/ BSF::BSF(void) { _pggflo = pvNil; _ibMac = 0; AssertThis(fobjAssertFull); } /*************************************************************************** Destructor for a stream. ***************************************************************************/ BSF::~BSF(void) { AssertThis(fobjAssertFull); long iflo; FLO flo; if (0 < _ibMac) { // release all our reference counts for (iflo = _pggflo->IvMac(); iflo-- > 0;) { _pggflo->GetFixed(iflo, &flo); if (pvNil != flo.pfil) ReleasePpo(&flo.pfil); } } ReleasePpo(&_pggflo); } /*************************************************************************** Find the flo that contains the given ib and assign *pib the postion of the first byte in the flo and *pcb the size of the flo. ***************************************************************************/ long BSF::_IfloFind(long ib, long *pib, long *pcb) { AssertBaseThis(0); AssertIn(ib, 0, _ibMac + 1); AssertVarMem(pib); AssertNilOrVarMem(pcb); long iflo, cb; FLO flo; iflo = 0; if (_ibMac > 0) { for (cb = ib; iflo < _pggflo->IvMac(); iflo++) { _pggflo->GetFixed(iflo, &flo); if (flo.cb > cb) { *pib = ib - cb; if (pvNil != pcb) *pcb = flo.cb; return iflo; } cb -= flo.cb; } } *pib = _ibMac; if (pvNil != pcb) *pcb = 0; return iflo; } /*************************************************************************** Make sure ib is on a piece boundary. ***************************************************************************/ bool BSF::_FEnsureSplit(long ib, long *piflo) { AssertBaseThis(0); AssertIn(ib, 0, _ibMac + 1); AssertNilOrVarMem(piflo); long iflo, ibMin, cbT; FLO flo; if (pvNil == _pggflo) { if (pvNil == (_pggflo = GG::PggNew(size(FLO)))) return fFalse; // REVIEW shonk: what values should we use for SetMinGrow? //_pggflo->SetMinGrow(2, 100); } iflo = _IfloFind(ib, &ibMin, &cbT); AssertIn(ib, ibMin, ibMin + cbT + (ibMin == _ibMac)); if (ib == ibMin) { if (pvNil != piflo) *piflo = iflo; return fTrue; } _pggflo->GetFixed(iflo, &flo); Assert(cbT == flo.cb, 0); cbT = ib - ibMin; flo.cb -= cbT; if (pvNil != flo.pfil) flo.fp += cbT; if (!_pggflo->FInsert(iflo + 1, 0, pvNil, &flo)) { TrashVar(piflo); return fFalse; } if (pvNil == flo.pfil && !_pggflo->FMoveRgb(iflo, cbT, iflo + 1, 0, flo.cb)) { _pggflo->Delete(iflo + 1); TrashVar(piflo); return fFalse; } flo.cb = cbT; if (pvNil != flo.pfil) { flo.fp -= cbT; flo.pfil->AddRef(); } _pggflo->PutFixed(iflo, &flo); if (pvNil != piflo) *piflo = iflo + 1; return fTrue; } /*************************************************************************** Enumerate over all pieces spanning ibMin to ibLim and attempt to merge any adjacent ones. ***************************************************************************/ void BSF::_AttemptMerge(long ibMin, long ibLim) { AssertBaseThis(0); AssertIn(ibMin, 0, _ibMac + 1); AssertIn(ibLim, ibMin, _ibMac + 1); long iflo, ib; FLO flo, floT; if (pvNil == _pggflo) return; iflo = _IfloFind(LwMax(0, ibMin - 1), &ib); while (ib < ibLim && iflo < _pggflo->IvMac() - 1) { _pggflo->GetFixed(iflo, &flo); _pggflo->GetFixed(iflo + 1, &floT); if (flo.pfil != floT.pfil || pvNil != flo.pfil && flo.fp + flo.cb != floT.fp) { // cant merge them, try the next iflo++; ib += flo.cb; continue; } if (pvNil == flo.pfil) _pggflo->Merge(iflo + 1, iflo); else { // merge the two file based flo's _pggflo->Delete(iflo + 1); ReleasePpo(&floT.pfil); AssertPo(flo.pfil, 0); } flo.cb += floT.cb; _pggflo->PutFixed(iflo, &flo); } } /*************************************************************************** Replace a range in this bsf with the range in the given bsf. This does the complete insertion, then the deletion. ***************************************************************************/ bool BSF::FReplaceBsf(PBSF pbsfSrc, long ibSrc, long cbSrc, long ibDst, long cbDel) { AssertThis(fobjAssertFull); AssertPo(pbsfSrc, 0); AssertIn(ibSrc, 0, pbsfSrc->_ibMac + 1); AssertIn(cbSrc, 0, pbsfSrc->_ibMac + 1 - ibSrc); AssertIn(ibDst, 0, _ibMac + 1); AssertIn(cbDel, 0, _ibMac + 1 - ibDst); long ifloMinSrc, ifloLimSrc, ifloMinWhole, ifloDst, iflo; long ibMinSrc, ibLimSrc, ibMinWhole, ib; long cbMinFlo, cbLimFlo, cbIns, cbT; FLO flo; byte *pb; bool fRet; // REVIEW shonk: if we're only inserting a non-file piece of pbsfSrc, should // we optimize and redirect this to FReplace? if (cbSrc == 0 && cbDel == 0) return fTrue; // make sure the piece table exists and is split at ibDst if (!_FEnsureSplit(ibDst, &ifloDst)) return fFalse; // cbIns is the number of bytes already inserted (for cleanup) cbIns = 0; // get the flo's to insert ifloMinSrc = pbsfSrc->_IfloFind(ibSrc, &ibMinSrc, &cbMinFlo); ifloLimSrc = pbsfSrc->_IfloFind(ibSrc + cbSrc, &ibLimSrc, &cbLimFlo); if (ifloMinSrc < ifloLimSrc) { // first insert the whole pieces if (ibSrc > ibMinSrc) { ifloMinWhole = ifloMinSrc + 1; ibMinWhole = ibMinSrc + cbMinFlo; } else { ifloMinWhole = ifloMinSrc; ibMinWhole = ibMinSrc; } if (ifloMinWhole < ifloLimSrc) { if (!_pggflo->FCopyEntries(pbsfSrc->_pggflo, ifloMinWhole, ifloDst, ifloLimSrc - ifloMinWhole)) { goto LFail; } cbIns = ibLimSrc - ibMinWhole; _ibMac += cbIns; // adjust the usage counts on the file pieces for (iflo = ifloDst + ifloLimSrc - ifloMinWhole; iflo-- > ifloDst;) { _pggflo->GetFixed(iflo, &flo); if (pvNil != flo.pfil) flo.pfil->AddRef(); } } // insert the front piece if (ifloMinSrc < ifloMinWhole) { cbT = cbMinFlo - ibSrc + ibMinSrc; pbsfSrc->_pggflo->GetFixed(ifloMinSrc, &flo); if (pvNil == flo.pfil) { // a memory piece pb = (byte *)pbsfSrc->_pggflo->PvLock(ifloMinSrc); fRet = FReplace(pb + ibSrc - ibMinSrc, cbT, ibDst, 0); pbsfSrc->_pggflo->Unlock(); } else { // a file piece flo.fp += ibSrc - ibMinSrc; flo.cb = cbT; fRet = FReplaceFlo(&flo, fFalse, ibDst, 0); } if (!fRet) goto LFail; cbIns += cbT; } else _AttemptMerge(ibDst, ibDst); } // insert the back piece Assert(ibLimSrc <= ibSrc + cbSrc, 0); if (ibLimSrc < ibSrc + cbSrc || cbDel > 0) { ib = LwMax(ibSrc, ibLimSrc); cbT = ibSrc + cbSrc - ib; Assert(cbIns + cbT == cbSrc, "didn't insert the correct amount!"); if (cbT <= 0) fRet = FReplace(pvNil, 0, ibDst + cbIns, cbDel); else { pbsfSrc->_pggflo->GetFixed(ifloLimSrc, &flo); if (pvNil == flo.pfil) { // a memory piece pb = (byte *)pbsfSrc->_pggflo->PvLock(ifloLimSrc); fRet = FReplace(pb + ib - ibLimSrc, cbT, ibDst + cbIns, cbDel); pbsfSrc->_pggflo->Unlock(); } else { // a file piece flo.fp += ib - ibLimSrc; flo.cb = cbT; fRet = FReplaceFlo(&flo, fFalse, ibDst + cbIns, cbDel); } } if (!fRet) { LFail: if (cbIns > 0) AssertDo(FReplace(pvNil, 0, ibDst, cbIns), "cleanup failed!"); AssertThis(fobjAssertFull); return fFalse; } } else { Assert(cbIns == cbSrc, "didn't insert the correct amount!"); _AttemptMerge(ibDst + cbSrc, ibDst + cbSrc); } AssertThis(fobjAssertFull); return fTrue; } /*************************************************************************** Replace the range [ib, ib + cbDel) with cbIns bytes from prgb. ***************************************************************************/ bool BSF::FReplace(void *prgb, long cbIns, long ib, long cbDel) { AssertThis(fobjAssertFull); AssertIn(ib, 0, _ibMac + 1); AssertIn(cbDel, 0, _ibMac - ib + 1); AssertIn(cbIns, 0, kcbMax); AssertPvCb(prgb, cbIns); long ibT; long iflo, cbT; FLO flo; if (cbDel == 0 && cbIns == 0) return fTrue; // make sure the _pggflo exists if (!_FEnsureSplit(0)) return fFalse; // get the flo of interest and the ibMin of the flo iflo = _IfloFind(ib, &ibT); // from here on, ibT is the offset into the current flo (iflo) ibT = ib - ibT; // if ib is in a file flo, split it if (ibT > 0) { _pggflo->GetFixed(iflo, &flo); if (pvNil != flo.pfil) { if (!_FEnsureSplit(ib, &iflo)) goto LFail; ibT = 0; } } if (cbIns > 0 && !_pggflo->FEnsureSpace(1, cbIns)) { LFail: _AttemptMerge(ib, ib); AssertThis(fobjAssertFull); return fFalse; } if (ibT > 0 && cbDel > 0) { // we need to start deleting in the middle of a piece _pggflo->GetFixed(iflo, &flo); Assert(pvNil == flo.pfil, "why wasn't this flo split?"); if (ibT + cbDel < flo.cb) { // deleting just part of this piece and no others _pggflo->DeleteRgb(iflo, ibT, cbDel); flo.cb -= cbDel; _pggflo->PutFixed(iflo, &flo); _ibMac -= cbDel; cbDel = 0; } else { // deleting to the end of this piece cbT = flo.cb - ibT; _pggflo->DeleteRgb(iflo, ibT, cbT); flo.cb = ibT; _pggflo->PutFixed(iflo, &flo); _ibMac -= cbT; cbDel -= cbT; iflo++; ibT = 0; } } Assert(ibT == 0 || cbDel == 0, "wrong ib"); while (cbDel > 0 && iflo < _pggflo->IvMac()) { // deleting from the beginning of the flo _pggflo->GetFixed(iflo, &flo); if (cbDel < flo.cb) { // just remove the first part if (pvNil != flo.pfil) flo.fp += cbDel; else _pggflo->DeleteRgb(iflo, 0, cbDel); flo.cb -= cbDel; _ibMac -= cbDel; cbDel = 0; _pggflo->PutFixed(iflo, &flo); } else { // delete the whole flo ReleasePpo(&flo.pfil); _pggflo->Delete(iflo); cbDel -= flo.cb; _ibMac -= flo.cb; } } // now insert the new stuff if (cbIns > 0) { if (iflo < _pggflo->IvMac()) { _pggflo->GetFixed(iflo, &flo); if (pvNil == flo.pfil) goto LInsertInMem; } Assert(ibT == 0, "wrong ib 2"); if (iflo > 0) { // see if the previous flow is a memory one _pggflo->GetFixed(iflo - 1, &flo); if (pvNil == flo.pfil) { iflo--; ibT = flo.cb; LInsertInMem: AssertDo(_pggflo->FInsertRgb(iflo, ibT, cbIns, prgb), "this shouldn't fail!"); flo.cb += cbIns; _pggflo->PutFixed(iflo, &flo); _ibMac += cbIns; goto LTryMerge; } } // create a new memory flo flo.pfil = pvNil; flo.cb = cbIns; flo.fp = 0; AssertDo(_pggflo->FInsert(iflo, cbIns, prgb, &flo), "why fail?"); _ibMac += cbIns; } LTryMerge: _AttemptMerge(ib, ib + cbIns); AssertThis(fobjAssertFull); return fTrue; } /*************************************************************************** Replace the range [ib, ib + cbDel) with the flo. ***************************************************************************/ bool BSF::FReplaceFlo(PFLO pflo, bool fCopy, long ib, long cbDel) { AssertThis(fobjAssertFull); AssertPo(pflo, ffloReadable); AssertIn(ib, 0, _ibMac + 1); AssertIn(cbDel, 0, _ibMac - ib + 1); long iflo; FLO flo; bool fRet; if (pflo->cb <= 0) return FReplace(pvNil, 0, ib, cbDel); if (pflo->cb < kcbMinFloFile) { // use a memory piece HQ hq; if (!pflo->FReadHq(&hq)) return fFalse; fRet = FReplace(PvLockHq(hq), pflo->cb, ib, cbDel); UnlockHq(hq); FreePhq(&hq); return fRet; } // insert a file flo if (fCopy) { if (pvNil == (flo.pfil = FIL::PfilCreateTemp())) return fFalse; flo.cb = pflo->cb; flo.fp = 0; if (!pflo->FCopy(&flo)) { ReleasePpo(&flo.pfil); AssertThis(fobjAssertFull); return fFalse; } pflo = &flo; } else pflo->pfil->AddRef(); if (!_FEnsureSplit(ib, &iflo) || !_pggflo->FInsert(iflo, 0, pvNil, pflo)) { pflo->pfil->Release(); _AttemptMerge(ib, ib); AssertThis(fobjAssertFull); return fFalse; } _ibMac += pflo->cb; if (cbDel > 0) { // this shouldn't fail because we've already ensured a split // at ib + pflo->cb AssertDo(FReplace(pvNil, 0, ib + pflo->cb, cbDel), 0); } _AttemptMerge(ib, ib + pflo->cb); AssertThis(fobjAssertFull); return fTrue; } /*************************************************************************** Fetch cb bytes from position ib into prgb. ***************************************************************************/ void BSF::FetchRgb(long ib, long cb, void *prgb) { AssertThis(fobjAssertFull); AssertIn(ib, 0, _ibMac + 1); AssertIn(cb, 0, _ibMac - ib + 1); AssertPvCb(prgb, cb); long iflo, cbT, ibMin; FLO flo; iflo = _IfloFind(ib, &ibMin); ib -= ibMin; for (; cb > 0 && iflo < _pggflo->IvMac(); iflo++) { _pggflo->GetFixed(iflo, &flo); Assert(flo.cb > ib, "_IfloFind messed up"); // get min(cb, flo.cb - ib) bytes from position ib // then set ib to 0 and update cb cbT = LwMin(cb, flo.cb - ib); if (pvNil == flo.pfil) { // the data is in the GG Assert(_pggflo->Cb(iflo) == flo.cb, "group element wrong size"); _pggflo->GetRgb(iflo, ib, cbT, prgb); } else { // the data is on file if (!flo.FReadRgb(prgb, cbT, ib)) { Warn("read failed in fetch"); FillPb(prgb, cbT, kbGarbage); } } prgb = PvAddBv(prgb, cbT); ib = 0; cb -= cbT; } } /*************************************************************************** Write a portion of a BSF to the given flo. ***************************************************************************/ bool BSF::FWriteRgb(PFLO pflo, long ib) { AssertThis(0); AssertPo(pflo, 0); BLCK blck(pflo); return FWriteRgb(&blck, ib); } /*************************************************************************** Write a portion of a BSF to the given block. ***************************************************************************/ bool BSF::FWriteRgb(PBLCK pblck, long ib) { AssertThis(fobjAssertFull); AssertPo(pblck, 0); AssertIn(ib, 0, _ibMac + 1); AssertIn(pblck->Cb(), 0, kcbMax); long iflo; FLO flo; long cb, ibT, ibDst; long cbWrite = pblck->Cb(); bool fRet = fTrue; if (ib + cbWrite > _ibMac) { Bug("blck is too big"); return fFalse; } if (cbWrite <= 0) return fTrue; iflo = _IfloFind(ib, &ibT); ib -= ibT; _pggflo->Lock(); AssertDo(pblck->FMoveLim(-cbWrite), 0); for (ibDst = 0; fRet && ibDst < cbWrite && iflo < _pggflo->IvMac(); iflo++) { Assert(pblck->Cb() == 0, 0); _pggflo->GetFixed(iflo, &flo); Assert(flo.cb > ib, "_IfloFind messed up"); // write min(cbWrite, flo.cb - ib) bytes from position ib // then set ib to 0 and update cbWrite cb = LwMin(cbWrite, flo.cb - ib); AssertDo(pblck->FMoveLim(cb), 0); Assert(pblck->Cb() == cb, 0); if (pvNil == flo.pfil) { // the data is in the GG Assert(_pggflo->Cb(iflo) == flo.cb, "group element wrong size"); fRet = pblck->FWrite(PvAddBv(_pggflo->QvGet(iflo), ib)); } else { // the data is on file BLCK blck(flo.pfil, flo.fp + ib, cb); fRet = blck.FWriteToBlck(pblck); } ib = 0; ibDst += cb; AssertDo(pblck->FMoveMin(cb), 0); } Assert(!fRet || ibDst == cbWrite, "wrong number of bytes written!"); Assert(pblck->Cb() == 0, 0); AssertDo(pblck->FMoveMin(-ibDst), 0); AssertDo(pblck->FMoveLim(cbWrite - ibDst), 0); Assert(pblck->Cb() == cbWrite, 0); _pggflo->Unlock(); return fRet; } /*************************************************************************** Write the stream out to a temp file and redirect the stream to just refernce the temp file. This makes the stream's memory footprint minimal. ***************************************************************************/ bool BSF::FCompact(void) { AssertThis(fobjAssertFull); FLO flo; bool fRet = fFalse; if (_ibMac == 0 || _pggflo->IvMac() == 1 && _pggflo->Cb(1) == 0) { fRet = fTrue; goto LShrinkGg; } if (pvNil == (flo.pfil = FIL::PfilCreateTemp())) goto LShrinkGg; flo.fp = 0; flo.cb = _ibMac; fRet = FWriteRgb(&flo) && FReplaceFlo(&flo, fFalse, 0, _ibMac); ReleasePpo(&flo.pfil); LShrinkGg: if (pvNil != _pggflo) _pggflo->FEnsureSpace(0, fgrpShrink); AssertThis(fobjAssertFull); return fRet; } #ifdef DEBUG /*************************************************************************** Assert the validity of a byte stream (BSF). ***************************************************************************/ void BSF::AssertValid(ulong grfobj) { BSF_PAR::AssertValid(grfobj); if (pvNil == _pggflo) { AssertVar(0 == _ibMac, "wrong _ibMac", &_ibMac); return; } AssertPo(_pggflo, 0); if (!(grfobj & fobjAssertFull)) return; long cb, cbT, iflo; FLO flo; for (cb = 0, iflo = _pggflo->IvMac(); iflo-- > 0;) { _pggflo->GetFixed(iflo, &flo); cbT = _pggflo->Cb(iflo); if (pvNil == flo.pfil) Assert(cbT == flo.cb, "wrong sized entry"); else { AssertPo(flo.pfil, 0); Assert(cbT == 0, "wrong sized file entry"); AssertIn(flo.fp, 0, kcbMax); AssertIn(flo.cb, 0, kcbMax); cbT = flo.cb; } cb += cbT; } AssertVar(cb == _ibMac, "bad _ibMac", &_ibMac); } /*************************************************************************** Mark memory for the BSF. ***************************************************************************/ void BSF::MarkMem(void) { AssertThis(fobjAssertFull); BSF_PAR::MarkMem(); MarkMemObj(_pggflo); } #endif // DEBUG ================================================ FILE: kauai/src/stream.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Stream classes. A BSM is a byte stream in memory. The data is stored contiguously, so should be used only for relatively small streams. A BSF is a byte stream with pieces stored in files and other pieces stored in memory. ***************************************************************************/ #ifndef STREAM_H #define STREAM_H /*************************************************************************** Byte stream in memory. The entire stream is in contiguous memory. ***************************************************************************/ typedef class BSM *PBSM; #define BSM_PAR BASE #define kclsBSM 'BSM' class BSM : public BSM_PAR { RTCLASS_DEC ASSERT MARKMEM NOCOPY(BSM) protected: HQ _hqrgb; long _ibMac; long _cbMinGrow; bool _FEnsureSize(long cbMin, bool fShrink); public: BSM(void); ~BSM(void); void SetMinGrow(long cb); bool FEnsureSpace(long cb, bool fShrink); void *PvLock(long ib); void Unlock(void); long IbMac(void) { return _ibMac; } void FetchRgb(long ib, long cb, void *prgb); bool FReplace(void *prgb, long cbIns, long ib, long cbDel); bool FWriteRgb(PFLO pflo, long ib = 0); bool FWriteRgb(PBLCK pblck, long ib = 0); }; /*************************************************************************** Byte stream on file. Parts of the stream may be in files. ***************************************************************************/ typedef class BSF *PBSF; #define BSF_PAR BASE #define kclsBSF 'BSF' class BSF : public BSF_PAR { RTCLASS_DEC ASSERT MARKMEM NOCOPY(BSF) protected: PGG _pggflo; long _ibMac; long _IfloFind(long ib, long *pib, long *pcb = pvNil); bool _FEnsureSplit(long ib, long *piflo = pvNil); void _AttemptMerge(long ibMin, long ibLim); bool _FReplaceCore(void *prgb, long cbIns, PFLO pflo, long ib, long cbDel); public: BSF(void); ~BSF(void); long IbMac(void) { return _ibMac; } void FetchRgb(long ib, long cb, void *prgb); bool FReplace(void *prgb, long cbIns, long ib, long cbDel); bool FReplaceFlo(PFLO pflo, bool fCopy, long ib, long cbDel); bool FReplaceBsf(PBSF pbsfSrc, long ibSrc, long cbSrc, long ibDst, long cbDel); bool FWriteRgb(PFLO pflo, long ib = 0); bool FWriteRgb(PBLCK pblck, long ib = 0); bool FCompact(void); }; #endif //! STREAM_H ================================================ FILE: kauai/src/stub.cpp ================================================ extern "C" __declspec(dllexport) void __cdecl _adj_fdiv_r() { } extern "C" int _adjust_fdiv{}; ================================================ FILE: kauai/src/test.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai test app Reviewed: Copyright (c) Microsoft Corporation Test code used in both ut and ft. ***************************************************************************/ #include "util.h" ASSERTNAME #ifdef DEBUG extern void CheckForLostMem(BASE *po); #else //! DEBUG #define CheckForLostMem(po) #endif //! DEBUG void TestInt(void); void TestMem(void); void TestGl(void); void TestFni(void); void TestFil(void); void TestGg(void); void TestCfl(void); void TestErs(void); void TestCrf(void); /****************************************************************************** Test util code. ******************************************************************************/ void TestUtil(void) { Bug("Assert Test"); long lw = 0x12345678; BugVar("AssertVar test", &lw); TestInt(); TestMem(); TestErs(); TestGl(); TestGg(); // TestFni(); // TestFil(); // TestCfl(); TestCrf(); } /*************************************************************************** Test utilint stuff. ***************************************************************************/ void TestInt(void) { AssertDo(SwHigh(0x12345678) == (short)0x1234, 0); AssertDo(SwHigh(0xABCDEF01) == (short)0xABCD, 0); AssertDo(SwLow(0x12345678) == (short)0x5678, 0); AssertDo(SwLow(0xABCDEF01) == (short)0xEF01, 0); AssertDo(LwHighLow(0x1234, 0x5678) == 0x12345678, 0); AssertDo(LwHighLow((short)0xABCD, (short)0xEF01) == 0xABCDEF01, 0); AssertDo(BHigh(0x1234) == 0x12, 0); AssertDo(BHigh((short)0xABCD) == 0xAB, 0); AssertDo(BLow(0x1234) == 0x34, 0); AssertDo(BLow((short)0xABCD) == 0xCD, 0); AssertDo(SwHighLow(0x12, 0x56) == (short)0x1256, 0); AssertDo(SwHighLow(0xAB, 0xEF) == (short)0xABEF, 0); AssertDo(SwMin(kswMax, kswMin) == kswMin, 0); AssertDo(SwMin(kswMin, kswMax) == kswMin, 0); AssertDo(SwMax(kswMax, kswMin) == kswMax, 0); AssertDo(SwMax(kswMin, kswMax) == kswMax, 0); AssertDo(SuMin(ksuMax, 0) == 0, 0); AssertDo(SuMin(0, ksuMax) == 0, 0); AssertDo(SuMax(ksuMax, 0) == ksuMax, 0); AssertDo(SuMax(0, ksuMax) == ksuMax, 0); AssertDo(LwMin(klwMax, klwMin) == klwMin, 0); AssertDo(LwMin(klwMin, klwMax) == klwMin, 0); AssertDo(LwMax(klwMax, klwMin) == klwMax, 0); AssertDo(LwMax(klwMin, klwMax) == klwMax, 0); AssertDo(LuMin(kluMax, 0) == 0, 0); AssertDo(LuMin(0, kluMax) == 0, 0); AssertDo(LuMax(kluMax, 0) == kluMax, 0); AssertDo(LuMax(0, kluMax) == kluMax, 0); AssertDo(SwAbs(kswMax) == kswMax, 0); AssertDo(SwAbs(kswMin) == -kswMin, 0); AssertDo(LwAbs(klwMax) == klwMax, 0); AssertDo(LwAbs(klwMin) == -klwMin, 0); AssertDo(LwMulSw(kswMax, kswMax) == 0x3FFF0001, 0); AssertDo(LwMulSw(kswMin, kswMin) == 0x3FFF0001, 0); AssertDo(LwMulSw(kswMax, kswMin) == -0x3FFF0001, 0); AssertDo(LwMulDiv(klwMax, klwMax, klwMin) == klwMin, 0); AssertDo(LwMulDiv(klwMax, klwMin, klwMax) == klwMin, 0); AssertDo(CbRoundToLong(0) == 0, 0); AssertDo(CbRoundToLong(1) == 4, 0); AssertDo(CbRoundToLong(2) == 4, 0); AssertDo(CbRoundToLong(3) == 4, 0); AssertDo(CbRoundToLong(4) == 4, 0); AssertDo(CbRoundToLong(5) == 8, 0); AssertDo(CbRoundToShort(0) == 0, 0); AssertDo(CbRoundToShort(1) == 2, 0); AssertDo(CbRoundToShort(2) == 2, 0); AssertDo(CbRoundToShort(3) == 4, 0); AssertDo(CbRoundToShort(4) == 4, 0); AssertDo(CbRoundToShort(5) == 6, 0); AssertDo(LwGcd(10000, 350) == 50, 0); AssertDo(LwGcd(10000, -560) == 80, 0); AssertDo(FcmpCompareFracs(50000, 30000, 300000, 200000) == fcmpGt, 0); AssertDo(FcmpCompareFracs(-50000, 30000, -300000, 200000) == fcmpLt, 0); AssertDo(FcmpCompareFracs(-50000, 30000, 300000, 200000) == fcmpLt, 0); AssertDo(FcmpCompareFracs(50000, 30000, -300000, 200000) == fcmpGt, 0); AssertDo(FcmpCompareFracs(50000, 30000, 500000, 300000) == fcmpEq, 0); AssertDo(FcmpCompareFracs(0x1FFF0000, 0x10, 0x11000000, 0x10) == fcmpGt, 0); } /*************************************************************************** Test the memory manager. ***************************************************************************/ void TestMem(void) { #define kchq 18 static HQ rghq[kchq]; // static so it's initially zeros HQ hqT, hq; long cb, ihq; for (ihq = 0; ihq < kchq; ihq++) { cb = (1L << ihq) - 1 + ihq; if (!FAllocHq(&hq, cb, fmemNil, mprDebug)) { BugVar("HqAlloc failed on size:", &cb); break; } rghq[ihq] = hq; AssertDo(CbOfHq(hq) == cb, 0); FillPb(QvFromHq(hq), cb, (byte)cb); if (cb > 0) { AssertDo(*(byte *)QvFromHq(hq) == (byte)cb, 0); AssertDo(*(byte *)PvAddBv(QvFromHq(hq), cb - 1) == (byte)cb, 0); } AssertDo(PvLockHq(hq) == QvFromHq(hq), 0); if (!FCopyHq(hq, &hqT, mprDebug)) Bug("FCopyHq failed"); else { AssertDo(CbOfHq(hqT) == cb, 0); if (cb > 0) { AssertDo(*(byte *)QvFromHq(hqT) == (byte)cb, 0); AssertDo(*(byte *)PvAddBv(QvFromHq(hqT), cb - 1) == (byte)cb, 0); } FreePhq(&hqT); } Assert(hqT == hqNil, 0); FreePhq(&hqT); UnlockHq(hq); } for (ihq = 0; ihq < kchq; ihq++) { hq = rghq[ihq]; if (hqNil == hq) break; cb = CbOfHq(hq); if (!FResizePhq(&rghq[ihq], 2 * cb, fmemClear, mprDebug)) { Bug("FResizePhq failed"); break; } hq = rghq[ihq]; if (cb > 0) { AssertDo(*(byte *)QvFromHq(hq) == (byte)cb, 0); AssertDo(*(byte *)PvAddBv(QvFromHq(hq), cb - 1) == (byte)cb, 0); AssertDo(*(byte *)PvAddBv(QvFromHq(hq), cb) == 0, 0); AssertDo(*(byte *)PvAddBv(QvFromHq(hq), 2 * cb - 1) == 0, 0); } } for (ihq = 0; ihq < kchq; ihq++) { if (hqNil != rghq[ihq]) { cb = (1L << (kchq - 1 - ihq)) - 1 + (kchq - 1 - ihq); AssertDo(FResizePhq(&rghq[ihq], cb, fmemNil, mprDebug), "FResizePhq failed"); } FreePhq(&rghq[ihq]); } } /*************************************************************************** Test list code. ***************************************************************************/ void TestGl(void) { short sw; long isw; short *qsw; PGL pglsw; pglsw = GL::PglNew(size(short)); if (pvNil == pglsw) { Bug("PglNew failed"); return; } for (sw = 0; sw < 10; sw++) { AssertDo(pglsw->FAdd(&sw, &isw), 0); AssertDo(isw == sw, 0); } AssertDo(pglsw->IvMac() == 10, 0); for (isw = 0; isw < 10; isw++) { qsw = (short *)pglsw->QvGet(isw); AssertDo(*qsw == isw, 0); pglsw->Get(isw, &sw); AssertDo(sw == isw, 0); } for (isw = 10; isw > 0;) pglsw->Delete(isw -= 2); AssertDo(pglsw->IvMac() == 5, 0); for (isw = 0; isw < 5; isw++) { pglsw->Get(isw, &sw); AssertDo(sw == isw * 2 + 1, 0); sw = (short)isw * 100; pglsw->Put(isw, &sw); qsw = (short *)pglsw->QvGet(isw); AssertDo(*qsw == isw * 100, 0); *qsw = (short)isw; } AssertDo(pglsw->IvMac() == 5, 0); AssertDo(pglsw->FEnsureSpace(0, fgrpShrink), 0); AssertDo(pglsw->IvMac() == 5, 0); for (isw = 5; isw-- != 0;) { sw = (short)isw; pglsw->FInsert(isw, &sw); } AssertDo(pglsw->IvMac() == 10, 0); for (isw = 10; isw-- != 0;) { pglsw->Get(isw, &sw); AssertDo(sw == isw / 2, 0); } ReleasePpo(&pglsw); } /*************************************************************************** Test the fni code. ***************************************************************************/ void TestFni(void) { FNI fni1, fni2; STN stn1, stn2, stn3; AssertDo(fni1.FGetTemp(), 0); AssertDo(fni1.Ftg() == vftgTemp, 0); AssertDo(!fni1.FDir(), 0); fni2 = fni1; fni1.GetLeaf(&stn3); fni2.GetLeaf(&stn2); AssertDo(stn3.FEqual(&stn2), 0); AssertDo(fni1.FSetLeaf(pvNil, kftgDir), 0); AssertDo(fni1.FDir(), 0); AssertDo(fni1.Ftg() == kftgDir, 0); AssertDo(fni1.FUpDir(&stn1, ffniNil), 0); AssertDo(fni1.FUpDir(&stn2, ffniMoveToDir), 0); AssertDo(stn1.FEqual(&stn2), 0); AssertDo(!fni1.FSameDir(&fni2), 0); AssertDo(!fni1.FEqual(&fni2), 0); AssertDo(fni1.Ftg() == kftgDir, 0); AssertDo(fni1.FDownDir(&stn1, ffniNil), 0); AssertDo(!fni1.FSameDir(&fni2), 0); AssertDo(fni1.FDownDir(&stn1, ffniMoveToDir), 0); AssertDo(fni1.FSameDir(&fni2), 0); AssertDo(fni1.FSetLeaf(&stn3, vftgTemp), 0); AssertDo(fni1.FEqual(&fni2), 0); AssertDo(fni1.TExists() == tNo, 0); AssertDo(fni2.FSetLeaf(pvNil, kftgDir), 0); AssertDo(fni2.FGetUnique(vftgTemp), 0); AssertDo(!fni1.FEqual(&fni2), 0); } /*************************************************************************** File test code. ***************************************************************************/ void TestFil(void) { PFIL pfil; FNI fni; while (FGetFniSaveMacro(&fni, 'TEXT', "\x9" "Save As: ", "\x4" "Junk", PszLit("All files\0*.*\0"), NULL)) { AssertDo(fni.TExists() == tNo, 0); pfil = FIL::PfilCreate(&fni); AssertPo(pfil, 0); AssertDo(pfil->FSetFpMac(100), 0); AssertDo(pfil->FpMac() == 100, 0); AssertDo(pfil->FWriteRgb(&fni, size(fni), 0), 0); pfil->SetTemp(fTrue); pfil->Mark(); ReleasePpo(&pfil); } FIL::CloseUnmarked(); FIL::ClearMarks(); FIL::CloseUnmarked(); } /*************************************************************************** Test the group api. ***************************************************************************/ void TestGg(void) { PGG pgg; ulong grf; long cb, iv; byte *qb; PSZ psz = PszLit("0123456789ABCDEFG"); achar rgch[100]; AssertDo((pgg = GG::PggNew(0)) != pvNil, 0); for (iv = 0; iv < 10; iv++) { AssertDo(pgg->FInsert(iv / 2, iv + 1, psz), 0); } AssertDo(pgg->FAdd(16, &iv, psz), 0); AssertDo(iv == 10, 0); AssertDo(pgg->IvMac() == 11, 0); grf = 0; for (iv = pgg->IvMac(); iv--;) { cb = pgg->Cb(iv); qb = (byte *)pgg->QvGet(iv); AssertDo(FEqualRgb(psz, qb, cb), 0); grf |= 1L << cb; if (cb & 1) pgg->Delete(iv); } AssertDo(grf == 0x000107FE, 0); grf = 0; for (iv = pgg->IvMac(); iv--;) { cb = pgg->Cb(iv); AssertDo(!(cb & 1), 0); pgg->Get(iv, rgch); qb = (byte *)pgg->QvGet(iv); AssertDo(FEqualRgb(rgch, qb, cb), 0); AssertDo(FEqualRgb(rgch, psz, cb), 0); grf |= 1L << cb; CopyPb(psz, rgch + cb, cb); AssertDo(pgg->FPut(iv, cb + cb, rgch), 0); } AssertDo(grf == 0x00010554, 0); grf = 0; for (iv = pgg->IvMac(); iv--;) { cb = pgg->Cb(iv); AssertDo(!(cb & 3), 0); cb /= 2; grf |= 1L << cb; pgg->DeleteRgb(iv, LwMin(cb, iv), cb); qb = (byte *)pgg->QvGet(iv); AssertDo(FEqualRgb(psz, qb, cb), 0); } AssertDo(grf == 0x00010554, 0); ReleasePpo(&pgg); } /*************************************************************************** Test the chunky file stuff. ***************************************************************************/ void TestCfl(void) { enum { relPaul, relMarge, relTig, relCarl, relPriscilla, relGreg, relShon, relClaire, relMike, relStephen, relBaby, relCathy, relJoshua, relRachel, relLim }; struct EREL { CTG ctg; CNO cno; PSZ psz; short relPar1, relPar2; }; const CTG kctgLan = 0x41414141; const CTG kctgKatz = 0x42424242; const CTG kctgSandy = 0x43434343; EREL dnrel[relLim] = { {kctgLan, 0, PszLit("Paul"), relLim, relLim}, {kctgLan, 0, PszLit("Marge"), relLim, relLim}, {kctgLan, 0, PszLit("Tig"), relPaul, relMarge}, {kctgKatz, 0, PszLit("Carl"), relLim, relLim}, {kctgKatz, 0, PszLit("Priscilla"), relLim, relLim}, {kctgKatz, 0, PszLit("Greg"), relCarl, relPriscilla}, {kctgKatz, 0, PszLit("Shon"), relCarl, relPriscilla}, {kctgKatz, 0, PszLit("Claire"), relPaul, relMarge}, {kctgKatz, 0, PszLit("Mike"), relCarl, relPriscilla}, {kctgKatz, 0, PszLit("Stephen"), relGreg, relLim}, {kctgKatz, 0, PszLit("Baby"), relShon, relClaire}, {kctgSandy, 0, PszLit("Cathy"), relCarl, relPriscilla}, {kctgSandy, 0, PszLit("Joshua"), relCathy, relLim}, {kctgSandy, 0, PszLit("Rachel"), relCathy, relLim}, }; FNI fni, fniDst; PCFL pcfl, pcflDst; BLCK blck; short rel; long icki; CNO cno; CKI cki; EREL *perel, *perelPar; STN stn; achar rgch[kcchMaxSz]; while (FGetFniSaveMacro(&fni, 'TEXT', "\x9" "Save As: ", "\x4" "Junk", PszLit("All files\0*.*\0"), NULL)) { AssertDo((pcfl = CFL::PcflCreate(&fni, fcflNil)) != pvNil, 0); AssertDo(fniDst.FGetTemp(), 0); AssertDo((pcflDst = CFL::PcflCreate(&fniDst, fcflNil)) != pvNil, 0); for (rel = 0; rel < relLim; rel++) { perel = &dnrel[rel]; AssertDo(pcfl->FAddPv(perel->psz, CchSz(perel->psz), perel->ctg, &perel->cno), 0); stn = perel->psz; AssertDo(pcfl->FSetName(perel->ctg, perel->cno, &stn), 0); if (perel->relPar1 < relLim) { perelPar = &dnrel[perel->relPar1]; AssertDo(pcfl->FAdoptChild(perelPar->ctg, perelPar->cno, perel->ctg, perel->cno), 0); } if (perel->relPar2 < relLim) { perelPar = &dnrel[perel->relPar2]; AssertDo(pcfl->FAdoptChild(perelPar->ctg, perelPar->cno, perel->ctg, perel->cno), 0); } AssertDo(pcfl->FCopy(perel->ctg, perel->cno, pcflDst, &cno), "copy failed"); } AssertDo(pcfl->Ccki() == 14, 0); for (rel = 0; rel < relLim; rel++) { perel = &dnrel[rel]; pcfl->FGetName(perel->ctg, perel->cno, &stn); AssertDo(FEqualRgb(stn.Prgch(), perel->psz, stn.Cch()), 0); AssertDo(pcfl->FFind(perel->ctg, perel->cno, &blck), 0); AssertDo(blck.FRead(rgch), 0); AssertDo(FEqualRgb(rgch, perel->psz, CchSz(perel->psz) * size(achar)), 0); } // copy all the chunks - they should already be there, but this // should set up all the child links for (rel = 0; rel < relLim; rel++) { perel = &dnrel[rel]; AssertDo(pcfl->FCopy(perel->ctg, perel->cno, pcflDst, &cno), "copy failed"); } AssertPo(pcflDst, fcflFull); // this should delete relShon, but not relBaby perelPar = &dnrel[relCarl]; perel = &dnrel[relShon]; pcfl->DeleteChild(perelPar->ctg, perelPar->cno, perel->ctg, perel->cno); perelPar = &dnrel[relPriscilla]; pcfl->DeleteChild(perelPar->ctg, perelPar->cno, perel->ctg, perel->cno); AssertDo(pcfl->Ccki() == 13, 0); // this should delete relGreg and relStephen perelPar = &dnrel[relCarl]; perel = &dnrel[relGreg]; pcfl->DeleteChild(perelPar->ctg, perelPar->cno, perel->ctg, perel->cno); perelPar = &dnrel[relPriscilla]; pcfl->DeleteChild(perelPar->ctg, perelPar->cno, perel->ctg, perel->cno); AssertDo(pcfl->Ccki() == 11, 0); // this should delete relCarl, relPriscilla, relCathy, relJoshua, // relRachel and relMike pcfl->Delete(perelPar->ctg, perelPar->cno); perelPar = &dnrel[relCarl]; pcfl->Delete(perelPar->ctg, perelPar->cno); AssertDo(pcfl->Ccki() == 5, 0); for (icki = 0; pcfl->FGetCki(icki, &cki); icki++) { AssertDo(pcfl->FGetName(cki.ctg, cki.cno, &stn), 0); AssertDo(pcfl->FFind(cki.ctg, cki.cno, &blck), 0); AssertDo(blck.FRead(rgch), 0); AssertDo(FEqualRgb(rgch, stn.Prgch(), stn.Cch() * size(achar)), 0); AssertDo(stn.Cch() * size(achar) == blck.Cb(), 0); } // copy all the chunks back for (icki = 0; pcflDst->FGetCki(icki, &cki); icki++) { AssertDo(pcflDst->FCopy(cki.ctg, cki.cno, pcfl, &cno), "copy failed"); } AssertPo(pcfl, fcflFull); AssertDo(pcfl->Ccki() == 14, 0); ReleasePpo(&pcflDst); AssertDo(pcfl->FSave(BigLittle('JUNK', 'KNUJ'), pvNil), 0); ReleasePpo(&pcfl); } while (FGetFniOpenMacro(&fni, pvNil, 0, PszLit("All files\0*.*\0"), NULL)) { AssertDo(fni.TExists() == tYes, 0); pcfl = CFL::PcflOpen(&fni, fcflNil); if (pcfl == pvNil) continue; AssertPo(pcfl, 0); if (FGetFniSaveMacro(&fni, 'TEXT', "\x9" "Save As: ", "\x4" "Junk", PszLit("All files\0*.*\0"), NULL)) { AssertDo(pcfl->FSave(BigLittle('JUNK', 'KNUJ'), &fni), 0); } ReleasePpo(&pcfl); } CFL::CloseUnmarked(); CFL::ClearMarks(); CFL::CloseUnmarked(); } /****************************************************************************** Test the error registration code. ******************************************************************************/ void TestErs(void) { const long cercTest = 30; long erc, ercT; vpers->Clear(); Assert(vpers->Cerc() == 0, "bad count of error codes on stack"); for (erc = 0; erc < cercTest; erc++) { Assert(vpers->Cerc() == LwMin(erc, kcerdMax), "bad count of error codes on stack"); PushErc(erc); AssertVar(vpers->FIn(erc), "error code not found", &erc); } for (erc = cercTest - 1; vpers->FIn(erc); erc--) ; AssertVar(erc == cercTest - kcerdMax - 1, "lost error code", &erc); for (erc = 0; erc < vpers->Cerc(); erc++) { AssertVar((ercT = vpers->ErcGet(erc)) == cercTest - kcerdMax + erc, "invalid error code", &ercT); } for (erc = cercTest - 1; vpers->FPop(&ercT); erc--) AssertVar(ercT == erc, "bogus error code returned", &ercT); AssertVar(erc == cercTest - kcerdMax - 1, "lost error code", &erc); for (erc = 0; erc < cercTest; erc++) { Assert(vpers->Cerc() == LwMin(erc, kcerdMax), "bad count of error codes on stack"); PushErc(erc); AssertVar(vpers->FIn(erc), "error code not found", &erc); } vpers->Clear(); Assert(vpers->Cerc() == 0, "bad count of error codes on stack"); } /****************************************************************************** Test chunky resource file ******************************************************************************/ void TestCrf(void) { const CNO cnoLim = 10; FNI fni; CTG ctg = 'JUNK'; CNO cno; PGHQ rgpghq[cnoLim]; PCFL pcfl; PCRF pcrf; HQ hq; PGHQ pghq; if (!fni.FGetTemp() || pvNil == (pcfl = CFL::PcflCreate(&fni, fcflWriteEnable | fcflTemp))) { Bug("creating chunky file failed"); return; } for (cno = 0; cno < cnoLim; cno++) { AssertDo(pcfl->FPutPv("Test string", 11, ctg, cno), 0); } if (pvNil == (pcrf = CRF::PcrfNew(pcfl, 50))) { Bug("creating CRF failed"); ReleasePpo(&pcfl); return; } ReleasePpo(&pcfl); for (cno = 0; cno < cnoLim; cno++) pcrf->TLoad(ctg, cno, GHQ::FReadGhq, rscNil, 10); for (cno = 0; cno < cnoLim; cno++) pcrf->TLoad(ctg, cno, GHQ::FReadGhq, rscNil, 20); for (cno = 0; cno < cnoLim; cno++) pcrf->TLoad(ctg, cno, GHQ::FReadGhq, rscNil, 20 + cno); for (cno = 0; cno < cnoLim; cno++) { pghq = (PGHQ)pcrf->PbacoFetch(ctg, cno, GHQ::FReadGhq); if (pvNil == pghq) continue; hq = pghq->hq; Assert(CbOfHq(hq) == 11, "wrong length"); Assert(FEqualRgb(QvFromHq(hq), "Test string", 11), "bad bytes"); ReleasePpo(&pghq); } for (cno = 0; cno < cnoLim; cno++) { pghq = (PGHQ)pcrf->PbacoFetch(ctg, cno, GHQ::FReadGhq); rgpghq[cno] = pghq; if (pvNil == pghq) continue; hq = pghq->hq; Assert(CbOfHq(hq) == 11, "wrong length"); Assert(FEqualRgb(QvFromHq(hq), "Test string", 11), "bad bytes"); } for (cno = 0; cno < cnoLim; cno++) { ReleasePpo(&rgpghq[cno]); } ReleasePpo(&pcrf); } ================================================ FILE: kauai/src/text.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Text management classes. ***************************************************************************/ #include "frame.h" ASSERTNAME RTCLASS(EDCB) RTCLASS(EDSL) RTCLASS(EDPL) RTCLASS(EDML) RTCLASS(EDMW) const long kdxpInsetEdcb = 2; const long kdxpInsetSled = 2; /*************************************************************************** Constructor for edit control parameter block. ***************************************************************************/ EDPAR::EDPAR(long hid, PGOB pgob, ulong grfgob, long gin, RC *prcAbs, RC *prcRel, long onn, ulong grfont, long dypFont, long tah, long tav, ACR acrFore, ACR acrBack, long cmhl) : _gcb(hid, pgob, grfgob, gin, prcAbs, prcRel) { _onn = onn; _grfont = grfont; _dypFont = dypFont; _tah = tah; _tav = tav; _acrFore = acrFore; _acrBack = acrBack; _cmhl = cmhl; } /*************************************************************************** Set the data in the EDPAR. ***************************************************************************/ void EDPAR::Set(long hid, PGOB pgob, ulong grfgob, long gin, RC *prcAbs, RC *prcRel, long onn, ulong grfont, long dypFont, long tah, long tav, ACR acrFore, ACR acrBack, long cmhl) { _gcb.Set(hid, pgob, grfgob, gin, prcAbs, prcRel); _onn = onn; _grfont = grfont; _dypFont = dypFont; _tah = tah; _tav = tav; _acrFore = acrFore; _acrBack = acrBack; _cmhl = cmhl; } /*************************************************************************** Set the font portion of the EDPAR. ***************************************************************************/ void EDPAR::SetFont(long onn, ulong grfont, long dypFont, long tah, long tav, ACR acrFore, ACR acrBack) { _onn = onn; _grfont = grfont; _dypFont = dypFont; _tah = tah; _tav = tav; _acrFore = acrFore; _acrBack = acrBack; } /*************************************************************************** Constructor for edit control. ***************************************************************************/ EDCB::EDCB(PGCB pgcb, long cmhl) : GOB(pgcb) { AssertBaseThis(0); _cmhl = cmhl; _fMark = (kginMark == pgcb->_gin || kginDefault == pgcb->_gin && kginMark == GOB::GinDefault()); _pgnv = pvNil; } /*************************************************************************** Constructor for edit control. ***************************************************************************/ EDCB::~EDCB(void) { AssertBaseThis(0); ReleasePpo(&_pgnv); } /*************************************************************************** Initialize the edit control. ***************************************************************************/ bool EDCB::_FInit(void) { AssertBaseThis(0); PGPT pgpt; if (_fMark) { RC rc(0, 0, 1, 1); if (pvNil == (pgpt = GPT::PgptNewOffscreen(&rc, 8))) return fFalse; } else { pgpt = Pgpt(); pgpt->AddRef(); } _pgnv = NewObj GNV(this, pgpt); ReleasePpo(&pgpt); return pvNil != _pgnv; } /*************************************************************************** Draw the contents of the gob. ***************************************************************************/ void EDCB::Draw(PGNV pgnv, RC *prcClip) { AssertThis(0); AssertPo(pgnv, 0); AssertVarMem(prcClip); long ln, lnLast; RC rc; _GetRcContent(&rc); if (rc.FIntersect(prcClip)) { pgnv->IntersectRcVis(&rc); ln = _LnFromYp(prcClip->ypTop); lnLast = _LnFromYp(prcClip->ypBottom - 1); for (; ln <= lnLast; ln++) _DrawLine(pgnv, ln); if (_fSelOn) _InvertSel(pgnv); } } /*************************************************************************** Handle a mousedown in the edit control. ***************************************************************************/ bool EDCB::FCmdTrackMouse(PCMD_MOUSE pcmd) { AssertThis(0); AssertVarMem(pcmd); long ln, ich; if (pcmd->cid == cidMouseDown) { Assert(vpcex->PgobTracking() == pvNil, "mouse already being tracked!"); vpcex->TrackMouse(this); _fSelByWord = (pcmd->cact > 1) && !(pcmd->grfcust & fcustShift); } else { Assert(vpcex->PgobTracking() == this, "not tracking mouse!"); Assert(pcmd->cid == cidTrackMouse, 0); } ln = _LnFromYp(pcmd->yp); ich = _IchFromLnXp(ln, pcmd->xp, !_fSelByWord); ich = LwBound(ich, 0, IchMac() + 1); if (pcmd->cid != cidMouseDown || (pcmd->grfcust & fcustShift)) { if (_fSelByWord) { ich = (ich < _ichAnchor) ? _IchPrev(ich + 1, fTrue) : _IchNext(ich, fTrue); } SetSel(_ichAnchor, ich); } else { if (_fSelByWord) ich = _IchPrev(ich + 1, fTrue); SetSel(ich, _fSelByWord ? _IchNext(ich, fTrue) : ich); } _fXpValid = fFalse; _SwitchSel(fTrue); // make sure the selection is on ShowSel(fFalse); if (!(pcmd->grfcust & fcustMouse)) vpcex->EndMouseTracking(); return fTrue; } /*************************************************************************** Handle a key down. ***************************************************************************/ bool EDCB::FCmdKey(PCMD_KEY pcmd) { const long kcchInsBuf = 64; AssertThis(0); AssertVarMem(pcmd); ulong grfcust; long vkDone; long dich, ichLim; long dlnSel, ln, lnMac; long cact; CMD cmd; achar rgch[kcchInsBuf + 1]; bool fPage; // keep fetching characters until we get a cursor key, delete key or // until the buffer is full. vkDone = vkNil; ichLim = 0; do { grfcust = pcmd->grfcust; switch (pcmd->vk) { // these keys all terminate the key fetching loop case kvkHome: case kvkEnd: case kvkLeft: case kvkRight: case kvkUp: case kvkDown: case kvkPageUp: case kvkPageDown: case kvkDelete: case kvkBack: vkDone = pcmd->vk; goto LInsert; default: if (chNil == pcmd->ch) break; if (!_FFilterCh((achar)pcmd->ch)) { cmd = *(CMD *)pcmd; cmd.cid = cidBadKey; cmd.pcmh = PgobPar(); ((PCMD_BADKEY)&cmd)->hid = Hid(); vpcex->PushCmd(&cmd); goto LInsert; } for (cact = 0; cact < pcmd->cact && ichLim < kcchInsBuf; cact++) { rgch[ichLim++] = (achar)pcmd->ch; #ifdef WIN if ((achar)pcmd->ch == kchReturn) rgch[ichLim++] = kchLineFeed; #endif // WIN } break; } pcmd = (PCMD_KEY)&cmd; } while (ichLim < kcchInsBuf && vpcex->FGetNextKey(&cmd)); LInsert: if (ichLim > 0) { // have some characters to insert FReplace(rgch, ichLim, _ichAnchor, _ichOther); } dich = 0; fPage = fFalse; switch (vkDone) { case kvkHome: if (grfcust & fcustCmd) dich = -_ichOther; else dich = _IchMinLn(_LnFromIch(_ichOther)) - _ichOther; _fXpValid = fFalse; goto LSetSel; case kvkEnd: if (grfcust & fcustCmd) dich = IchMac() - _ichOther; else { dich = _IchMinLn(_LnFromIch(_ichOther) + 1); dich = _IchPrev(dich) - _ichOther; } _fXpValid = fFalse; goto LSetSel; case kvkLeft: dich = _IchPrev(_ichOther, FPure(grfcust & fcustCmd)) - _ichOther; _fXpValid = fFalse; goto LSetSel; case kvkRight: dich = _IchNext(_ichOther, FPure(grfcust & fcustCmd)) - _ichOther; _fXpValid = fFalse; goto LSetSel; case kvkPageUp: fPage = fTrue; case kvkUp: dlnSel = -1; goto LMoveVert; case kvkPageDown: fPage = fTrue; case kvkDown: dlnSel = 1; LMoveVert: lnMac = _LnMac(); ln = _LnFromIch(_ichOther); if (dlnSel < 0 && ln == 0) { // do the same as the home key dich = -_ichOther; _fXpValid = fFalse; } else if (dlnSel > 0 && ln >= lnMac - 1) { // do the same as the end key dich = IchMac() - _ichOther; _fXpValid = fFalse; } else { if (!_fXpValid) { _xpSel = _XpFromIch(_ichOther) - _xp; _fXpValid = fTrue; } if (fPage) { // determine dlnSel RC rc; long yp, dyp; _GetRcContent(&rc); yp = _YpFromLn(ln); dyp = _YpFromLn(ln + 1) - yp; dyp = rc.Dyp() - dyp; Assert(LwAbs(dlnSel) == 1, "bad dlnSel"); yp = yp + dlnSel * dyp; // the target yp dlnSel = dlnSel * LwMax(1, LwAbs(_LnFromYp(yp) - ln)); } // to play it safe... ln = LwBound(ln + dlnSel, 0, lnMac); dich = _IchFromLnXp(ln, _xpSel + _xp) - _ichOther; } LSetSel: // move the selection if (grfcust & fcustShift) { // extend selection SetSel(_ichAnchor, _ichOther + dich); ShowSel(); } else { long ichT = _ichOther; if (ichT == _ichAnchor || (grfcust & fcustCmd)) ichT += dich; else if ((dich > 0) != (ichT > _ichAnchor)) ichT = _ichAnchor; SetSel(ichT, ichT); ShowSel(); } break; case kvkDelete: case kvkBack: if (_ichAnchor != _ichOther) dich = _ichOther - _ichAnchor; else if (vkDone == kvkDelete) dich = _IchNext(_ichAnchor) - _ichAnchor; else dich = _IchPrev(_ichAnchor) - _ichAnchor; if (dich != 0) FReplace(pvNil, 0, _ichAnchor, _ichAnchor + dich); break; } return fTrue; } /*************************************************************************** Do idle processing. If this handler has the active selection, make sure the selection is on or off according to rglw[0] (non-zero means on) and set rglw[0] to false. Always return false. ***************************************************************************/ bool EDCB::FCmdSelIdle(PCMD pcmd) { AssertThis(0); // if rglw[1] is this one's hid, don't change the sel state. if (pcmd->rglw[1] != Hid()) { if (!pcmd->rglw[0]) _SwitchSel(fFalse, kginDefault); else if (_ichAnchor != _ichOther || _tsSel == 0) _SwitchSel(fTrue); else if (DtsCaret() < TsCurrent() - _tsSel) _SwitchSel(!_fSelOn); } pcmd->rglw[0] = fFalse; return fFalse; } /*************************************************************************** Handle an activate sel command. ***************************************************************************/ bool EDCB::FCmdActivateSel(PCMD pcmd) { Activate(fTrue); return fTrue; } /*************************************************************************** Either make the selection for the EDCB active or inactive. ***************************************************************************/ void EDCB::Activate(bool fActive) { AssertThis(0); vpcex->RemoveCmh(this, _cmhl); if (fActive) vpcex->FAddCmh(this, _cmhl); else _SwitchSel(fFalse, kginDefault); } /*************************************************************************** Get the rectangle that is to contain the text. This allows derived classes to have borders, etc. ***************************************************************************/ void EDCB::_GetRcContent(RC *prc) { GetRc(prc, cooLocal); } /*************************************************************************** Set the vis for the GNV to be the intersection of the GOB's vis and the content rc. ***************************************************************************/ void EDCB::_InitGnv(PGNV pgnv) { RC rc; _GetRcContent(&rc); pgnv->IntersectRcVis(&rc); } /*************************************************************************** The rectangle has changed - show the selection. ***************************************************************************/ void EDCB::_NewRc(void) { ShowSel(fTrue, ginNil); } /*************************************************************************** Set the selection. ***************************************************************************/ void EDCB::SetSel(long ichAnchor, long ichOther, long gin) { AssertThis(0); long ichMac = IchMac(); ichAnchor = LwBound(ichAnchor, 0, ichMac + 1); ichOther = LwBound(ichOther, 0, ichMac + 1); if (ichAnchor == _ichAnchor && ichOther == _ichOther) return; if (_fSelOn) { if ((_fMark || _fClear) && gin == kginDraw) gin = kginMark; _InitGnv(_pgnv); if (_ichAnchor != ichAnchor || _ichAnchor == _ichOther || ichAnchor == ichOther) { _InvertSel(_pgnv, gin); _ichAnchor = ichAnchor; _ichOther = ichOther; _InvertSel(_pgnv, gin); _tsSel = TsCurrent(); } else { // they have the same anchor and neither is an insertion _InvertIchRange(_pgnv, _ichOther, ichOther, gin); _ichOther = ichOther; } } else { _ichAnchor = ichAnchor; _ichOther = ichOther; _tsSel = 0L; } } /*************************************************************************** Turn the sel on or off according to fOn. ***************************************************************************/ void EDCB::_SwitchSel(bool fOn, long gin) { AssertThis(0); if (FPure(fOn) != FPure(_fSelOn)) { if ((_fMark || _fClear) && gin == kginDraw) gin = kginMark; _InitGnv(_pgnv); _InvertSel(_pgnv, gin); _fSelOn = FPure(fOn); _tsSel = TsCurrent(); } } /*************************************************************************** Make sure the selection is visible (or at least _ichOther is). ***************************************************************************/ void EDCB::ShowSel(bool fForceJustification, long gin) { AssertThis(0); long ln, lnHope; long dxpScroll, dypScroll; long zpMin, zpLim; RC rc; long ichAnchor = _ichAnchor; // find the lines we want to show ln = _LnFromIch(_ichOther); lnHope = _LnFromIch(ichAnchor); _GetRcContent(&rc); rc.Inset(kdxpInsetEdcb, 0); // find the height needed to display these zpMin = _YpFromLn(LwMin(ln, lnHope)); zpLim = _YpFromLn(LwMax(ln, lnHope) + 1); if (zpLim > zpMin + rc.Dyp() && ln != lnHope) { // can't show both if (lnHope > ln) { zpMin = _YpFromLn(ln); zpLim = zpMin + rc.Dyp(); } else { zpLim = _YpFromLn(ln + 1); zpMin = zpLim - rc.Dyp(); } ichAnchor = _ichOther; } dypScroll = fForceJustification ? -_yp : 0; dypScroll = LwMax(LwMin(dypScroll, rc.ypBottom - zpLim), rc.ypTop - zpMin); // now do the horizontal stuff zpMin = _XpFromIch(_ichOther); zpLim = _XpFromIch(ichAnchor); if (LwAbs(zpLim - zpMin) > rc.Dxp()) { // can't show both if (zpMin > zpLim) { zpLim = zpMin; zpMin = zpLim - rc.Dxp(); } else zpLim = zpMin + rc.Dxp(); } else SortLw(&zpMin, &zpLim); dxpScroll = fForceJustification ? -_xp : 0; dxpScroll = LwMax(LwMin(dxpScroll, rc.xpRight - zpLim), rc.xpLeft - zpMin); if (dxpScroll != 0 || dypScroll != 0) { if ((_fMark || _fClear) && gin == kginDraw) gin = kginMark; _Scroll(dxpScroll, dypScroll, gin); } } /*************************************************************************** Invert the current selection. ***************************************************************************/ void EDCB::_InvertSel(PGNV pgnv, long gin) { AssertThis(0); AssertPo(pgnv, 0); RC rc, rcT; long ln; if (_ichAnchor == _ichOther) { // insertion bar ln = _LnFromIch(_ichAnchor); rc.xpLeft = _XpFromIch(_ichAnchor) - 1; rc.xpRight = rc.xpLeft + 2; rc.ypTop = _YpFromLn(ln); rc.ypBottom = _YpFromLn(ln + 1); _GetRcContent(&rcT); if (rcT.FIntersect(&rc)) { if (kginDraw == gin) pgnv->FillRc(&rcT, kacrInvert); else InvalRc(&rcT, gin); } } else _InvertIchRange(pgnv, _ichAnchor, _ichOther, gin); } /*************************************************************************** Invert a range. ***************************************************************************/ void EDCB::_InvertIchRange(PGNV pgnv, long ich1, long ich2, long gin) { AssertThis(0); AssertPo(pgnv, 0); AssertIn(ich1, 0, IchMac() + 1); AssertIn(ich2, 0, IchMac() + 1); RC rc, rcClip, rcT; long ln1, ln2, xp2; if (ich1 == ich2) return; SortLw(&ich1, &ich2); ln1 = _LnFromIch(ich1); ln2 = _LnFromIch(ich2); _GetRcContent(&rcClip); rc.xpLeft = _XpFromIch(ich1); rc.ypTop = _YpFromLn(ln1); rc.ypBottom = _YpFromLn(ln1 + 1); xp2 = _XpFromIch(ich2); if (ln2 == ln1) { // only one line involved rc.xpRight = xp2; if (rcT.FIntersect(&rc, &rcClip)) { if (kginDraw == gin) _HiliteRc(pgnv, &rcT); else InvalRc(&rcT, gin); } return; } // invert the sel on the first line rc.xpRight = rcClip.xpRight; if (rcT.FIntersect(&rc, &rcClip)) { if (kginDraw == gin) _HiliteRc(pgnv, &rcT); else InvalRc(&rcT, gin); } // invert the main rectangular block rc.xpLeft = rcClip.xpLeft; rc.ypTop = rc.ypBottom; rc.ypBottom = _YpFromLn(ln2); if (rcT.FIntersect(&rc, &rcClip)) { if (kginDraw == gin) _HiliteRc(pgnv, &rcT); else InvalRc(&rcT, gin); } // invert the last line rc.ypTop = rc.ypBottom; rc.ypBottom = _YpFromLn(ln2 + 1); rc.xpRight = xp2; if (rcT.FIntersect(&rc, &rcClip)) { if (kginDraw == gin) _HiliteRc(pgnv, &rcT); else InvalRc(&rcT, gin); } } /*************************************************************************** Update the correct lines on screen. ***************************************************************************/ void EDCB::_UpdateLn(long ln, long clnIns, long clnDel, long dypDel, long gin) { AssertThis(0); AssertIn(ln, 0, _LnMac()); AssertIn(clnIns, 0, _LnMac() + 1 - ln); AssertIn(clnDel, 0, kcbMax); AssertIn(dypDel, 0, kcbMax); RC rcLoc, rc; long yp, dypIns; long lnMac = _LnFromIch(IchMac()); _GetRcContent(&rcLoc); yp = _YpFromLn(ln); dypIns = _YpFromLn(ln + clnIns) - yp; rc = rcLoc; rc.ypTop = yp; rc.ypBottom = yp + dypIns; if (lnMac > ln + clnIns - clnDel && dypIns != dypDel) { // Have some bits to blt vertically. If the background isn't clear, // but _fMark is set, still do the scroll, since _fMark is intended // to avoid flashing (allowing offscreen drawing) and scrolling // doesn't flash anyway. if (_fClear && kginDraw == gin) gin = kginMark; if (kginDraw != gin) rc.ypBottom = rcLoc.ypBottom; else { if (_fMark) gin = kginMark; rc = rcLoc; rc.ypTop = LwMax(rc.ypTop, yp + LwMin(dypIns, dypDel)); Scroll(&rc, 0, dypIns - dypDel, gin); rc.ypBottom = rc.ypTop; rc.ypTop = yp; } } else if ((_fMark || _fClear) && gin == kginDraw) gin = kginMark; if (!rc.FEmpty()) InvalRc(&rc, gin); ShowSel(fTrue, gin); _fXpValid = fFalse; } /*************************************************************************** Scroll the text in the edit control. ***************************************************************************/ void EDCB::_Scroll(long dxp, long dyp, long gin) { AssertThis(0); RC rc; _xp += dxp; _yp += dyp; _GetRcContent(&rc); Scroll(&rc, dxp, dyp, gin); } /*************************************************************************** Return the yp for the given character. ***************************************************************************/ long EDCB::_YpFromIch(long ich) { return _YpFromLn(_LnFromIch(ich)); } /*************************************************************************** Return the single character at ich. ***************************************************************************/ achar EDCB::_ChFetch(long ich) { AssertThis(0); AssertIn(ich, 0, IchMac()); achar ch; CchFetch(&ch, ich, 1); return ch; } /*************************************************************************** Return ich of the previous character, skipping line feed characters. If fWord is true, skip to the beginning of a word. ***************************************************************************/ long EDCB::_IchPrev(long ich, bool fWord) { AssertThis(0); AssertIn(ich, 0, IchMac() + 2); if (ich > IchMac()) return IchMac(); if (!fWord) { while (ich > 0 && (fchIgnore & GrfchFromCh(_ChFetch(--ich)))) ; } else { while (ich > 0 && ((fchIgnore | fchMayBreak) & GrfchFromCh(_ChFetch(ich - 1)))) { ich--; } while (ich > 0 && !((fchIgnore | fchMayBreak) & GrfchFromCh(_ChFetch(ich - 1)))) { ich--; } } return ich; } /*************************************************************************** Return ich of the next character, skipping line feed characters. If fWord is true, skip to the beginning of the next word. ***************************************************************************/ long EDCB::_IchNext(long ich, bool fWord) { AssertThis(0); AssertIn(ich, 0, IchMac() + 1); long ichMac = IchMac(); if (ich >= ichMac) return ichMac; if (!fWord) { while (++ich < ichMac && (fchIgnore & GrfchFromCh(_ChFetch(ich)))) ; } else { while (ich < ichMac && !((fchIgnore | fchMayBreak) & GrfchFromCh(_ChFetch(ich)))) { ich++; } while (ich < ichMac && ((fchIgnore | fchMayBreak) & GrfchFromCh(_ChFetch(ich)))) { ich++; } } return ich; } #ifdef DEBUG /*************************************************************************** Assert the validity of the EDCB ***************************************************************************/ void EDCB::AssertValid(ulong grf) { EDCB_PAR::AssertValid(0); AssertIn(_ichAnchor, 0, kcbMax); AssertIn(_ichOther, 0, kcbMax); AssertPo(_pgnv, 0); // REVIEW shonk: fill in EDCB::AssertValid } /*************************************************************************** Mark memory for the EDML. ***************************************************************************/ void EDCB::MarkMem(void) { AssertValid(0); EDCB_PAR::MarkMem(); MarkMemObj(_pgnv); } #endif /*************************************************************************** Constructor for plain edit control. ***************************************************************************/ EDPL::EDPL(PEDPAR pedpar) : EDCB(&pedpar->_gcb, pedpar->_cmhl) { // inputs are all asserted in AssertThis _onn = pedpar->_onn; _grfont = pedpar->_grfont; _dypFont = pedpar->_dypFont; _tah = pedpar->_tah; _tav = pedpar->_tav; _acrFore = pedpar->_acrFore; _acrBack = pedpar->_acrBack; _fClear = kacrClear == _acrBack; _dypLine = 0; } /*************************************************************************** Initialize the EDPL. ***************************************************************************/ bool EDPL::_FInit(void) { AssertBaseThis(0); RC rc; if (!EDPL_PAR::_FInit()) return fFalse; // get the _dypLine value _pgnv->SetFont(_onn, _grfont, _dypFont, _tah); _pgnv->GetRcFromRgch(&rc, pvNil, 0, 0, 0); _dypLine = rc.Dyp(); return fTrue; } /*************************************************************************** Return the yp for the given line. ***************************************************************************/ long EDPL::_YpFromLn(long ln) { AssertThis(0); AssertIn(ln, 0, _LnMac() + 1); RC rc; _GetRcContent(&rc); switch (_tav) { default: return rc.ypTop + _yp + LwMul(ln, _dypLine); case tavBottom: return rc.ypBottom + _yp - LwMul(_LnMac() - ln, _dypLine); case tavCenter: return rc.YpCenter() + _yp - LwMul(_LnMac(), _dypLine) / 2 + LwMul(ln, _dypLine); } } /*************************************************************************** Return which line the yp belongs in. ***************************************************************************/ long EDPL::_LnFromYp(long yp) { AssertThis(0); long yp0 = _YpFromLn(0); return LwBound((yp - yp0) / _dypLine, 0, _LnMac() + 1); } /*************************************************************************** Hilite the rectangle. ***************************************************************************/ void EDPL::_HiliteRc(PGNV pgnv, RC *prc) { AssertThis(0); AssertVarMem(prc); pgnv->HiliteRc(prc, _acrBack); } /*************************************************************************** Return the xp for the given character. ***************************************************************************/ long EDPL::_XpFromIch(long ich) { AssertThis(0); AssertIn(ich, 0, IchMac() + 1); RC rc; achar *prgch; long ln, ichMin, cch; long xp = _XpOrigin(); ln = _LnFromIch(ich); ichMin = _IchMinLn(ln); if (!_FLockLn(ln, &prgch, &cch)) return xp; AssertPvCb(prgch, cch * size(achar)); AssertIn(ich, ichMin, ichMin + cch + 1); _pgnv->SetFont(_onn, _grfont, _dypFont, _tah); if (tahLeft != _tah) { RC rcAll; _pgnv->GetRcFromRgch(&rcAll, prgch, cch, xp, _yp); xp = rcAll.xpLeft; _pgnv->SetFontAlign(tahLeft, tavTop); } _pgnv->GetRcFromRgch(&rc, prgch, ich - ichMin, xp, _yp); _UnlockLn(ln, prgch); return rc.xpRight; } /*************************************************************************** Find the character that the xp is in on the given line. If fClosest is true, this finds the character boundary that the point is closest to (for traditional selection). If fClosest is false, it finds the character that the xp value is over. ***************************************************************************/ long EDPL::_IchFromLnXp(long ln, long xp, bool fClosest) { AssertThis(0); long xpT; long ich; long ichMin = _IchMinLn(ln); long ichMinLn = ichMin; long ichLim = _IchPrev(_IchMinLn(ln + 1)); while (ichMin < ichLim) { ich = (ichMin + ichLim) / 2; xpT = _XpFromIch(ich); if (xpT < xp) ichMin = ich + 1; else ichLim = ich; } ich = LwMax(ichMinLn, _IchPrev(ichMin)); if (fClosest && ich < ichMin) { // determine whether we should return ich or _IchNext(ich). if ((ichLim = _IchNext(ich)) <= ichMin && LwAbs(xp - _XpFromIch(ichLim)) < LwAbs(xp - _XpFromIch(ich))) { ich = ichLim; } } return ich; } /*************************************************************************** Draw the given line in the given GNV. ***************************************************************************/ void EDPL::_DrawLine(PGNV pgnv, long ln) { AssertThis(0); AssertIn(ln, 0, _LnMac() + 1); RC rcSrc; achar *prgch; long cch; long ypTop; _GetRcContent(&rcSrc); ypTop = _YpFromLn(ln); if (_FLockLn(ln, &prgch, &cch)) { AssertPvCb(prgch, cch * size(achar)); long xp = _XpOrigin(); pgnv->SetFont(_onn, _grfont, _dypFont, _tah); if (ln > 0) rcSrc.ypTop = ypTop; rcSrc.ypBottom = _YpFromLn(ln + 1); pgnv->FillRc(&rcSrc, _acrBack); pgnv->DrawRgch(prgch, cch, xp, ypTop, _acrFore, _acrBack); _UnlockLn(ln, prgch); } else { // fill to the bottom rcSrc.ypTop = ypTop; pgnv->FillRc(&rcSrc, _acrBack); } } /*************************************************************************** Return the origin for drawing text. ***************************************************************************/ long EDPL::_XpOrigin(void) { AssertThis(0); RC rc; _GetRcContent(&rc); switch (_tah) { default: return rc.xpLeft + _xp + kdxpInsetEdcb; case tahRight: return rc.xpRight + _xp - kdxpInsetEdcb; case tahCenter: return rc.XpCenter() + _xp; } } #ifdef DEBUG /*************************************************************************** Assert the validity of a single-line edit control. ***************************************************************************/ void EDPL::AssertValid(ulong grf) { EDPL_PAR::AssertValid(0); Assert(vntl.FValidOnn(_onn), 0); AssertIn(_dypFont, 1, kswMax); AssertIn(_tah, 0, tahLim); AssertIn(_tav, 0, tavLim); Assert(_tav != tavBaseline, "baseline not supported"); AssertPo(&_acrFore, facrRgb | facrIndex); AssertPo(&_acrBack, facrRgb | facrIndex); AssertIn(_dypLine, 1, kcbMax); } #endif // DEBUG /*************************************************************************** Constructor for single line edit control. ***************************************************************************/ EDSL::EDSL(PEDPAR pedpar) : EDPL(pedpar) { AssertBaseThis(0); } /*************************************************************************** Create a new EDSL (single line edit control). ***************************************************************************/ PEDSL EDSL::PedslNew(PEDPAR pedpar) { PEDSL pedsl; if (pvNil == (pedsl = NewObj EDSL(pedpar))) return pvNil; if (!pedsl->_FInit()) ReleasePpo(&pedsl); AssertNilOrPo(pedsl, 0); return pedsl; } /*************************************************************************** Get a pointer to the characters for the given line. ***************************************************************************/ bool EDSL::_FLockLn(long ln, achar **pprgch, long *pcch) { AssertBaseThis(0); AssertVarMem(pprgch); AssertVarMem(pcch); if (ln > 0) { *pprgch = pvNil; *pcch = 0; return fFalse; } *pcch = _cch; *pprgch = _rgch; return fTrue; } /*************************************************************************** Unlock a line. ***************************************************************************/ void EDSL::_UnlockLn(long ln, achar *prgch) { AssertBaseThis(0); Assert(prgch == _rgch, "bad call to _UnlockLn"); } /*************************************************************************** Return the line that ich is on. ***************************************************************************/ long EDSL::_LnFromIch(long ich) { AssertBaseThis(0); AssertIn(ich, 0, kcbMax); return ich <= IchMac() ? 0 : 1; } /*************************************************************************** Return the first ich for the given line. ***************************************************************************/ long EDSL::_IchMinLn(long ln) { AssertBaseThis(0); return ln == 0 ? 0 : IchMac() + 1; } /*************************************************************************** Return the number of characters. ***************************************************************************/ long EDSL::IchMac(void) { AssertBaseThis(0); return _cch; } /*************************************************************************** Return the number of lines. ***************************************************************************/ long EDSL::_LnMac(void) { AssertBaseThis(0); return 1; } /*************************************************************************** Replace the characters between ich1 and ich2 with those in (prgch, cchIns). Calls _UpdateLn() to clean up the display. ***************************************************************************/ bool EDSL::FReplace(achar *prgch, long cchIns, long ich1, long ich2, long gin) { AssertThis(0); AssertIn(cchIns, 0, kcbMax); AssertPvCb(prgch, cchIns * size(achar)); AssertIn(ich1, 0, IchMac() + 1); AssertIn(ich2, 0, IchMac() + 1); ich1 = LwBound(ich1, 0, _cch + 1); ich2 = LwBound(ich2, 0, _cch + 1); if (ich1 == ich2 && cchIns == 0) return fTrue; _SwitchSel(fFalse, gin); _tsSel = 0; if (ich1 != ich2) { SortLw(&ich1, &ich2); if (_cch > ich2) BltPb(_rgch + ich2, _rgch + ich1, _cch - ich2); _cch -= (ich2 - ich1); _ichAnchor = _ichOther = ich1; } cchIns = LwBound(cchIns, 0, kcchMaxEdsl - ich1); if (0 < cchIns) { if (_cch > kcchMaxEdsl - cchIns) _cch = kcchMaxEdsl - cchIns; if (_cch > ich1) BltPb(_rgch + ich1, _rgch + ich1 + cchIns, _cch - ich1); CopyPb(prgch, _rgch + ich1, cchIns); _cch += cchIns; _ichAnchor = _ichOther = ich1 + cchIns; } _UpdateLn(0, 1, 1, _dypLine, gin); AssertThis(0); return fTrue; } /*************************************************************************** If this is a character we can't accept, return false. ***************************************************************************/ bool EDSL::_FFilterCh(achar ch) { return !(fchControl & GrfchFromCh(ch)); } /*************************************************************************** Get the text in the edit control. ***************************************************************************/ void EDSL::GetStn(PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); pstn->SetRgch(_rgch, _cch); } /*************************************************************************** Set the text in the edit control. Sets the selection to an insertion point at the end of the text. ***************************************************************************/ void EDSL::SetStn(PSTN pstn, long gin) { AssertThis(0); AssertPo(pstn, 0); FReplace(pstn->Prgch(), pstn->Cch(), 0, IchMac(), gin); } /*************************************************************************** Get some text. ***************************************************************************/ long EDSL::CchFetch(achar *prgch, long ich, long cchWant) { AssertThis(0); AssertIn(cchWant, 0, kcbMax); AssertIn(ich, 0, IchMac() + 1); AssertPvCb(prgch, cchWant * size(achar)); if (0 < (cchWant = LwBound(cchWant, 0, IchMac() + 1 - ich))) CopyPb(_rgch + ich, prgch, cchWant); return cchWant; } #ifdef DEBUG /*************************************************************************** Assert the validity of a single-line edit control. ***************************************************************************/ void EDSL::AssertValid(ulong grf) { long ich; EDSL_PAR::AssertValid(0); AssertIn(_cch, 0, kcchMaxEdsl + 1); for (ich = _cch; ich-- > 0;) { Assert(_rgch[ich] != 0, "null character in EDSL"); } AssertIn(_ichAnchor, 0, _cch + 1); AssertIn(_ichOther, 0, _cch + 1); } #endif // DEBUG /*************************************************************************** Constructor for multi line edit control. ***************************************************************************/ EDML::EDML(PEDPAR pedpar) : EDPL(pedpar) { _bsm.SetMinGrow(256); } EDML::~EDML(void) { ReleasePpo(&_pglich); } /*************************************************************************** Create a new EDML (multi line edit control). ***************************************************************************/ PEDML EDML::PedmlNew(PEDPAR pedpar) { PEDML pedml; if (pvNil == (pedml = NewObj EDML(pedpar))) return pvNil; if (!pedml->_FInit()) { ReleasePpo(&pedml); return pvNil; } AssertPo(pedml, 0); return pedml; } /*************************************************************************** Initialize the multi line edit control. ***************************************************************************/ bool EDML::_FInit(void) { long ich; if (pvNil == (_pglich = GL::PglNew(size(long)))) return fFalse; _pglich->SetMinGrow(20); ich = 0; return _pglich->FPush(&ich); } /*************************************************************************** Get a pointer to the characters for the given line. ***************************************************************************/ bool EDML::_FLockLn(long ln, achar **pprgch, long *pcch) { AssertThis(0); AssertIn(ln, 0, _pglich->IvMac() + 1); AssertVarMem(pprgch); AssertVarMem(pcch); long ich; if (ln >= _pglich->IvMac()) { *pprgch = pvNil; *pcch = 0; return fFalse; } _pglich->Get(ln, &ich); if (ln + 1 == _pglich->IvMac()) *pcch = IchMac() - ich; else { long ichT; _pglich->Get(ln + 1, pcch); ichT = LwMax(ich, _IchPrev(*pcch)); if (ichT < *pcch && ((fchControl | fchMayBreak) & GrfchFromCh(_ChFetch(ichT)))) { // don't include the break character(s) *pcch = ichT; } *pcch -= ich; } *pprgch = (achar *)_bsm.PvLock(ich * size(achar)); return fTrue; } /*************************************************************************** Unlock a line. ***************************************************************************/ void EDML::_UnlockLn(long ln, achar *prgch) { AssertThis(0); _bsm.Unlock(); } /*************************************************************************** Return the line that ich is on. ***************************************************************************/ long EDML::_LnFromIch(long ich) { AssertThis(fobjAssertFull); AssertIn(ich, 0, IchMac() + 1); long lnMin, lnLim, ln; long ichT; if (ich > IchMac()) { Bug("Why did this happen?"); return _pglich->IvMac(); } for (lnMin = 0, lnLim = _pglich->IvMac(); lnMin < lnLim;) { ln = (lnMin + lnLim) / 2; _pglich->Get(ln, &ichT); if (ich < ichT) lnLim = ln; else if (ich > ichT) lnMin = ln + 1; else return ln; } Assert(lnMin > 0, "bad lnMin"); return lnMin - 1; } /*************************************************************************** Return the first ich for the given line. ***************************************************************************/ long EDML::_IchMinLn(long ln) { AssertThis(0); long ich; if (ln >= _pglich->IvMac()) return IchMac() + 1; _pglich->Get(ln, &ich); return ich; } /*************************************************************************** Return the number of characters. ***************************************************************************/ long EDML::IchMac(void) { AssertBaseThis(0); Assert(_bsm.IbMac() % size(achar) == 0, "ibMac not divisible by size(achar)"); return _bsm.IbMac() / size(achar); } /*************************************************************************** Return the number of lines. ***************************************************************************/ long EDML::_LnMac(void) { AssertThis(0); return _pglich->IvMac(); } /*************************************************************************** Replace the characters between ich1 and ich2 with those in (prgch, cchIns). Calls _UpdateLn() to clean up the display. ***************************************************************************/ bool EDML::FReplace(achar *prgch, long cchIns, long ich1, long ich2, long gin) { AssertThis(fobjAssertFull); AssertIn(cchIns, 0, kcbMax); AssertPvCb(prgch, cchIns * size(achar)); AssertIn(ich1, 0, IchMac() + 1); AssertIn(ich2, 0, IchMac() + 1); long lnMin, clnDel, clnDel2, clnIns, ln; long dich; long ypOld, ypNew; ich1 = LwBound(ich1, 0, dich = IchMac() + 1); ich2 = LwBound(ich2, 0, dich); if (ich1 == ich2 && cchIns == 0) return fTrue; SortLw(&ich1, &ich2); lnMin = _LnFromIch(ich1); clnDel = _LnFromIch(ich2) - lnMin; ypOld = _YpFromLn(lnMin); // estimate the number of inserted lines clnIns = _ClnEstimate(prgch, cchIns); if (clnIns > clnDel && !_pglich->FEnsureSpace(clnIns - clnDel)) return fFalse; _SwitchSel(fFalse, gin); _tsSel = 0; if (!_FReplaceCore(prgch, cchIns, ich1, ich2 - ich1)) return fFalse; // delete lines { lnMin + 1, ..., lnMin + clnDel } for (ln = lnMin + clnDel; ln > lnMin; ln--) _pglich->Delete(ln); // adjust the ich's further in the _pglich if (0 != (dich = cchIns - ich2 + ich1)) { long *pich; long lnLim; pich = (long *)_pglich->QvGet(++ln); for (lnLim = _pglich->IvMac(); ln < lnLim; ln++, pich++) *pich += dich; } // update the selection _ichAnchor = _ichOther = ich1 + cchIns; // reformat the lines ln = _LnReformat(lnMin, &clnDel2, &clnIns); clnDel += clnDel2; // keep the text in the same position vertically ypNew = _YpFromLn(lnMin); _yp += ypOld - ypNew; _UpdateLn(ln, clnIns + 1, clnDel + 1, LwMul(_dypLine, clnDel + 1), gin); AssertThis(fobjAssertFull); return fTrue; } /*************************************************************************** Do a replace operation just on the text. ***************************************************************************/ bool EDML::_FReplaceCore(achar *prgch, long cchIns, long ich, long cchDel) { return _bsm.FReplace(prgch, cchIns, ich, cchDel); } /*************************************************************************** Estimate the number of new lines (exact for a simple EDML). ***************************************************************************/ long EDML::_ClnEstimate(achar *prgch, long cch) { long cln; long ich; cln = 0; for (ich = 0; ich < cch; ich++) { if (fchBreak & GrfchFromCh(prgch[ich])) cln++; } return cln; } /*************************************************************************** Find new line starts starting at lnMin. ***************************************************************************/ long EDML::_LnReformat(long lnMin, long *pclnDel, long *pclnIns) { long ln; long ichPrev; long ich = _IchMinLn(lnMin); long ichNext = _IchMinLn(lnMin + 1); ln = lnMin + 1; while ((ich = _IchNext(ichPrev = ich)) < ichNext && ichPrev < ich) { if (fchBreak & GrfchFromCh(_ChFetch(ichPrev))) { if (!_pglich->FInsert(ln, &ich)) { Warn("format failed"); break; } ln++; } } *pclnDel = 0; *pclnIns = ln - lnMin - 1; return lnMin; } /*************************************************************************** If this is a character we can't accept, return false. ***************************************************************************/ bool EDML::_FFilterCh(achar ch) { ulong grfch = GrfchFromCh(ch); return !(fchControl & grfch) || (fchBreak & grfch); } /*************************************************************************** Get some text. ***************************************************************************/ long EDML::CchFetch(achar *prgch, long ich, long cchWant) { AssertThis(0); AssertIn(cchWant, 0, kcbMax); AssertIn(ich, 0, IchMac() + 1); AssertPvCb(prgch, cchWant * size(achar)); if (0 < (cchWant = LwBound(cchWant, 0, IchMac() + 1 - ich))) _bsm.FetchRgb(ich, cchWant, prgch); return cchWant; } #ifdef DEBUG /*************************************************************************** Assert the validity of a multi-line edit control. ***************************************************************************/ void EDML::AssertValid(ulong grf) { EDML_PAR::AssertValid(0); AssertPo(_pglich, 0); AssertPo(&_bsm, 0); AssertIn(_pglich->IvMac(), 1, kcbMax); long ibMac = _bsm.IbMac(); long ichMac = ibMac / size(achar); Assert(ibMac % size(achar) == 0, "ibMac not a divisible by size(achar)"); AssertIn(_ichAnchor, 0, ichMac + 1); AssertIn(_ichOther, 0, ichMac + 1); if (grf & fobjAssertFull) { long ichPrev, ich, ln; ichPrev = ichMac + 1; for (ln = _pglich->IvMac(); ln-- > 0;) { _pglich->Get(ln, &ich); AssertIn(ich, 0, ichPrev); ichPrev = ich; } Assert(ichPrev == 0, "bad first ich"); } } /*************************************************************************** Mark memory for the EDML. ***************************************************************************/ void EDML::MarkMem(void) { AssertValid(0); EDML_PAR::MarkMem(); MarkMemObj(&_bsm); MarkMemObj(_pglich); } #endif // DEBUG /*************************************************************************** Constructor for multi line edit control. ***************************************************************************/ EDMW::EDMW(PEDPAR pedpar) : EDML(pedpar) { } /*************************************************************************** Create a new multi-line wrapping edit control. ***************************************************************************/ PEDMW EDMW::PedmwNew(PEDPAR pedpar) { PEDMW pedmw; if (pvNil == (pedmw = NewObj EDMW(pedpar))) return pvNil; if (!pedmw->_FInit()) { ReleasePpo(&pedmw); return pvNil; } AssertPo(pedmw, 0); return pedmw; } /*************************************************************************** Return an estimate of how many new lines there are in the text to insert. ***************************************************************************/ long EDMW::_ClnEstimate(achar *prgch, long cch) { // the common case if (cch <= 1) return 1; RC rc; long dxp, cln; _GetRcContent(&rc); rc.Inset(kdxpInsetEdcb, 0); dxp = LwMax(10, rc.Dxp()); _pgnv->SetFont(_onn, _grfont, _dypFont); _pgnv->GetRcFromRgch(&rc, prgch, cch); cln = LwMin(cch, 2 * rc.Dxp() / dxp); return cln + EDML::_ClnEstimate(prgch, cch); } /*************************************************************************** Determine the line starts from line lnMin on. This may also affect lnMin's line start. Returns the first line that changed (1 less than the first line start that changed). ***************************************************************************/ long EDMW::_LnReformat(long lnMin, long *pclnDel, long *pclnIns) { const long kcichMax = 128; long rgich[kcichMax]; RC rc; long dxp; long ich, cich, ivMin, ivLim, iv, ichNew; long iichCur; long lnCur; ulong grfch; achar *prgch; long clnIns = 0, clnDel = 0; _GetRcContent(&rc); rc.Inset(kdxpInsetEdcb, 0); dxp = rc.Dxp(); _pgnv->SetFont(_onn, _grfont, _dypFont, _tah); ich = _IchMinLn(lnMin); Assert((ich > 0) == (lnMin > 0), "bad beginning"); prgch = (achar *)_bsm.PvLock(0); cich = _CichGetBreakables(prgch, ich, rgich, kcichMax); Assert(cich > 0, "bad cich"); if (lnMin > 0 && !(fchBreak & GrfchFromCh(prgch[_IchPrev(ich)]))) { // see if some of the text will fit on the previous line long ichPrev = _IchMinLn(lnMin - 1); _pgnv->GetRcFromRgch(&rc, prgch + ichPrev, rgich[0] - ichPrev); if (rc.Dxp() <= dxp) { // need to reformat the previous line _pglich->Delete(lnMin); clnDel++; ich = ichPrev; lnMin--; cich = _CichGetBreakables(prgch, ich, rgich, kcichMax); } } lnCur = lnMin + 1; for (iichCur = 0;;) { if (ich > rgich[cich - 1]) { cich = _CichGetBreakables(prgch, ich, rgich, kcichMax); iichCur = 0; } while (cich == kcichMax) { _pgnv->GetRcFromRgch(&rc, prgch + ich, rgich[cich - 1] - ich); if (rc.Dxp() >= dxp) break; // keep the last one and refill rgich[0] = rgich[cich - 1]; cich = _CichGetBreakables(prgch, rgich[0], rgich + 1, kcichMax - 1); iichCur = 0; } for (ivMin = iichCur, ivLim = cich; ivMin < ivLim;) { iv = (ivMin + ivLim) / 2; _pgnv->GetRcFromRgch(&rc, prgch + ich, rgich[iv] - ich); if (rc.Dxp() > dxp) ivLim = iv; else ivMin = iv + 1; } if (ivMin == iichCur) { // have to break a non-breaking stream - oh well for (ivMin = ich, ivLim = rgich[iichCur]; ivMin < ivLim;) { iv = (ivMin + ivLim) / 2; _pgnv->GetRcFromRgch(&rc, prgch + ich, iv - ich); if (rc.Dxp() > dxp) ivLim = iv; else ivMin = iv + 1; } Assert(ivMin >= ich, "bad ivMin"); ichNew = _IchPrev(ivMin); } else { // we found our break location Assert(rgich[ivMin - 1] >= ich, "bad entry in rgich"); ichNew = rgich[ivMin - 1]; iichCur = ivMin; } if (ichNew <= ich) ichNew = _IchNext(ich); if (ichNew >= IchMac()) { // we've run out of text - delete all remaining lines clnDel += _pglich->IvMac() - lnCur; AssertDo(_pglich->FSetIvMac(lnCur), 0); break; // we're done } grfch = GrfchFromCh(_ChFetch(ichNew)); if ((fchBreak | fchMayBreak) & grfch) ichNew = _IchNext(ichNew); ich = ichNew; while (lnCur < _pglich->IvMac()) { _pglich->Get(lnCur, &iv); if (ich < iv) break; if (ich == iv) goto LDone; // we're done // delete this line start _pglich->Delete(lnCur); clnDel++; } if (!_pglich->FInsert(lnCur, &ich)) { Warn("memory failure in EDMW::_LnReformat"); break; } clnIns++; lnCur++; } LDone: *pclnDel = clnDel; *pclnIns = clnIns; _bsm.Unlock(); return lnMin; } /*************************************************************************** Get the locations of possible breaking characters from prgch + ich. Doesn't continue past a return character. Return the number of locations found. ***************************************************************************/ long EDMW::_CichGetBreakables(achar *prgch, long ich, long *prgich, long cichMax) { AssertIn(ich, 0, IchMac() + 1); AssertPvCb(prgch, IchMac() * size(achar)); AssertPvCb(prgich, LwMul(cichMax, size(long))); long cich; ulong grfch; for (cich = 0; ich < IchMac(); ich++) { grfch = GrfchFromCh(prgch[ich]); if (grfch & fchBreak) { prgich[cich++] = ich; return cich; } if (grfch & fchMayBreak) { prgich[cich++] = ich; if (cich >= cichMax) return cich; } } // add the end of stream loaction Assert(cich < cichMax, "what?"); prgich[cich++] = IchMac(); return cich; } /*************************************************************************** The size of the GOB changed - relayout. ***************************************************************************/ void EDMW::_NewRc(void) { AssertThis(0); long clnDel, clnIns; AssertDo(_pglich->FSetIvMac(1), 0); _LnReformat(0, &clnDel, &clnIns); ShowSel(fTrue, ginNil); } ================================================ FILE: kauai/src/text.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Header file for edit controls and rich text editing. ***************************************************************************/ #ifndef TEXT_H #define TEXT_H // edit control parameters typedef class EDPAR *PEDPAR; class EDPAR { public: GCB _gcb; long _onn; ulong _grfont; long _dypFont; long _tah; long _tav; ACR _acrFore; ACR _acrBack; long _cmhl; EDPAR(void) { } EDPAR(long hid, PGOB pgob, ulong grfgob, long gin, RC *prcAbs, RC *prcRel, long onn, ulong grfont, long dypFont, long tah = tahLeft, long tav = tavTop, ACR acrFore = kacrBlack, ACR acrBack = kacrWhite, long cmhl = 0); void Set(long hid, PGOB pgob, ulong grfgob, long gin, RC *prcAbs, RC *prcRel, long onn, ulong grfont, long dypFont, long tah = tahLeft, long tav = tavTop, ACR acrFore = kacrBlack, ACR acrBack = kacrWhite, long cmhl = 0); void SetFont(long onn, ulong grfont, long dypFont, long tah = tahLeft, long tav = tavTop, ACR acrFore = kacrBlack, ACR acrBack = kacrWhite); }; /*************************************************************************** Edit control base class. ***************************************************************************/ typedef class EDCB *PEDCB; #define EDCB_PAR GOB #define kclsEDCB 'EDCB' class EDCB : public EDCB_PAR { RTCLASS_DEC ASSERT MARKMEM protected: // handler level long _cmhl; // the selection PGNV _pgnv; long _ichAnchor; long _ichOther; bool _fSelOn : 1; bool _fXpValid : 1; bool _fSelByWord : 1; bool _fMark : 1; bool _fClear : 1; ulong _tsSel; long _xpSel; // for avoiding migration when changing selection by lines // the origin long _xp; long _yp; EDCB(PGCB pgcb, long cmhl); virtual bool _FInit(void); // pure virtual functions virtual long _LnFromIch(long ich) = 0; virtual long _IchMinLn(long ln) = 0; virtual long _XpFromIch(long ich) = 0; virtual long _YpFromIch(long ich); virtual long _YpFromLn(long ln) = 0; virtual long _LnFromYp(long yp) = 0; virtual long _IchFromLnXp(long ln, long xp, bool fClosest = fTrue) = 0; virtual long _LnMac(void) = 0; virtual void _DrawLine(PGNV pgnv, long ln) = 0; virtual void _HiliteRc(PGNV pgnv, RC *prc) = 0; virtual bool _FFilterCh(achar ch) = 0; void _SwitchSel(bool fOn, long gin = kginDraw); void _InvertSel(PGNV pgnv, long gin = kginDraw); void _InvertIchRange(PGNV pgnv, long ich1, long ich2, long gin = kginDraw); void _Scroll(long dxp, long dyp, long gin = kginDraw); void _UpdateLn(long ln, long clnIns, long dlnDel, long dypDel, long gin = kginDraw); long _IchPrev(long ich, bool fWord = fFalse); long _IchNext(long ich, bool fWord = fFalse); achar _ChFetch(long ich); virtual void _NewRc(void); virtual void _GetRcContent(RC *prc); virtual void _InitGnv(PGNV pgnv); public: ~EDCB(void); virtual void Draw(PGNV pgnv, RC *prcClip); virtual bool FCmdTrackMouse(PCMD_MOUSE pcmd); virtual bool FCmdKey(PCMD_KEY pcmd); virtual bool FCmdSelIdle(PCMD pcmd); virtual bool FCmdActivateSel(PCMD pcmd); virtual void Activate(bool fActive); long IchAnchor(void) { return _ichAnchor; } long IchOther(void) { return _ichOther; } void SetSel(long ichAnchor, long ichOther, long gin = kginDraw); void ShowSel(bool fForceJustification = fTrue, long gin = kginDraw); virtual long IchMac(void) = 0; virtual bool FReplace(achar *prgch, long cchIns, long ich1, long ich2, long gin = kginDraw) = 0; virtual long CchFetch(achar *prgch, long ich, long cchWant) = 0; }; /*************************************************************************** Plain edit control - virtual class supporting single line and multi line edit controls with a single font. ***************************************************************************/ typedef class EDPL *PEDPL; #define EDPL_PAR EDCB #define kclsEDPL 'EDPL' class EDPL : public EDPL_PAR { RTCLASS_DEC ASSERT protected: // drawing parameters long _onn; ulong _grfont; long _dypFont; long _tah; long _tav; ACR _acrFore; ACR _acrBack; long _dypLine; EDPL(PEDPAR pedpar); // methods of EDCB virtual bool _FInit(void); virtual long _XpFromIch(long ich); virtual long _YpFromLn(long ln); virtual long _LnFromYp(long yp); virtual long _IchFromLnXp(long ln, long xp, bool fClosest = fTrue); virtual void _DrawLine(PGNV pgnv, long ln); virtual void _HiliteRc(PGNV pgnv, RC *prc); long _XpOrigin(void); virtual bool _FLockLn(long ln, achar **pprgch, long *pcch) = 0; virtual void _UnlockLn(long ln, achar *prgch) = 0; }; /*************************************************************************** Single line edit control. ***************************************************************************/ const long kcchMaxEdsl = kcchMaxStn; typedef class EDSL *PEDSL; #define EDSL_PAR EDPL #define kclsEDSL 'EDSL' class EDSL : public EDSL_PAR { RTCLASS_DEC ASSERT protected: // the text long _cch; achar _rgch[kcchMaxEdsl]; EDSL(PEDPAR pedpar); // methods of EDCB virtual long _LnFromIch(long ich); virtual long _IchMinLn(long ln); virtual long _LnMac(void); virtual bool _FFilterCh(achar ch); // methods of EDPL virtual bool _FLockLn(long ln, achar **pprgch, long *pcch); virtual void _UnlockLn(long ln, achar *prgch); public: static PEDSL PedslNew(PEDPAR pedpar); virtual long IchMac(void); virtual bool FReplace(achar *prgch, long cchIns, long ich1, long ich2, long gin = kginDraw); virtual long CchFetch(achar *prgch, long ich, long cchWant); // additional text APIs void GetStn(PSTN pstn); void SetStn(PSTN pstn, long gin = kginDraw); }; /*************************************************************************** Multi line edit control. ***************************************************************************/ typedef class EDML *PEDML; #define EDML_PAR EDPL #define kclsEDML 'EDML' class EDML : public EDML_PAR { RTCLASS_DEC ASSERT MARKMEM protected: // the text BSM _bsm; PGL _pglich; EDML(PEDPAR pedpar); // methods of EDCB virtual bool _FInit(void); virtual long _LnFromIch(long ich); virtual long _IchMinLn(long ln); virtual long _LnMac(void); virtual bool _FFilterCh(achar ch); // methods of EDPL virtual bool _FLockLn(long ln, achar **pprgch, long *pcch); virtual void _UnlockLn(long ln, achar *prgch); virtual long _ClnEstimate(achar *prgch, long cch); virtual long _LnReformat(long lnMin, long *pclnDel, long *pclnIns); virtual bool _FReplaceCore(achar *prgch, long cchIns, long ich, long cchDel); public: static PEDML PedmlNew(PEDPAR pedpar); ~EDML(void); virtual long IchMac(void); virtual bool FReplace(achar *prgch, long cchIns, long ich1, long ich2, long gin = kginDraw); virtual long CchFetch(achar *prgch, long ich, long cchWant); }; /*************************************************************************** Multi line wrapping edit control. ***************************************************************************/ typedef class EDMW *PEDMW; #define EDMW_PAR EDML #define kclsEDMW 'EDMW' class EDMW : public EDMW_PAR { RTCLASS_DEC protected: EDMW(PEDPAR pedpar); // methods EDMW virtual long _ClnEstimate(achar *prgch, long cch); virtual long _LnReformat(long lnMin, long *pclnDel, long *pclnIns); long _CichGetBreakables(achar *prgch, long ich, long *prgich, long cichMax); virtual void _NewRc(void); public: static PEDMW PedmwNew(PEDPAR pedpar); }; #endif //! TEXT_H ================================================ FILE: kauai/src/textdoc.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation For editing a text file or text stream as a document. Unlike the edit controls in text.h/text.cpp, all the text need not be in memory (this uses a BSF) and there can be multiple views on the same text. ***************************************************************************/ #include "frame.h" ASSERTNAME RTCLASS(TXDC) RTCLASS(TXDD) /*************************************************************************** Constructor for a text document. ***************************************************************************/ TXDC::TXDC(PDOCB pdocb, ulong grfdoc) : DOCB(pdocb, grfdoc) { _pbsf = pvNil; _pfil = pvNil; } /*************************************************************************** Destructor for a text document. ***************************************************************************/ TXDC::~TXDC(void) { ReleasePpo(&_pbsf); ReleasePpo(&_pfil); } /*************************************************************************** Create a new document based on the given text file and or text stream. ***************************************************************************/ PTXDC TXDC::PtxdcNew(PFNI pfni, PBSF pbsf, PDOCB pdocb, ulong grfdoc) { AssertNilOrPo(pfni, ffniFile); AssertNilOrPo(pbsf, 0); AssertNilOrPo(pdocb, 0); PTXDC ptxdc; if (pvNil == (ptxdc = NewObj TXDC(pdocb, grfdoc))) return pvNil; if (!ptxdc->_FInit(pfni, pbsf)) ReleasePpo(&ptxdc); return ptxdc; } /*************************************************************************** Initialize the TXDC. ***************************************************************************/ bool TXDC::_FInit(PFNI pfni, PBSF pbsf) { AssertNilOrPo(pfni, ffniFile); AssertNilOrPo(pbsf, 0); if (pvNil != pfni) { if (pvNil == (_pfil = FIL::PfilOpen(pfni))) return fFalse; } if (pvNil != pbsf) { pbsf->AddRef(); _pbsf = pbsf; } else if (pvNil == (_pbsf = NewObj BSF)) return fFalse; else if (pvNil != _pfil && _pfil->FpMac() > 0) { // initialize the BSF to just point to the file FLO flo; flo.pfil = _pfil; flo.fp = 0; flo.cb = _pfil->FpMac(); if (!_pbsf->FReplaceFlo(&flo, fFalse, 0, 0)) return fFalse; } AssertThis(0); return fTrue; } /*************************************************************************** Create a new TXDD to display the TXDC. ***************************************************************************/ PDDG TXDC::PddgNew(PGCB pgcb) { AssertThis(0); return TXDD::PtxddNew(this, pgcb, _pbsf, vpappb->OnnDefFixed(), fontNil, vpappb->DypTextDef()); } /*************************************************************************** Get the current FNI for the doc. Return false if the doc is not currently based on an FNI (it's a new doc or an internal one). ***************************************************************************/ bool TXDC::FGetFni(FNI *pfni) { AssertThis(0); AssertBasePo(pfni, 0); if (pvNil == _pfil || _pfil->FTemp()) return fFalse; _pfil->GetFni(pfni); return fTrue; } /*************************************************************************** Save the document and optionally set this fni as the current one. If the doc is currently based on an FNI, pfni may be nil, indicating that this is a normal save (not save as). If pfni is not nil and fSetFni is false, this just writes a copy of the doc but doesn't change the doc one bit. ***************************************************************************/ bool TXDC::FSaveToFni(FNI *pfni, bool fSetFni) { AssertThis(0); AssertNilOrPo(pfni, ffniFile); FLO flo; FNI fniT; if (pvNil == pfni) { if (pvNil == _pfil) { Bug("Can't do a normal save - no file"); return fFalse; } _pfil->GetFni(&fniT); pfni = &fniT; fSetFni = fTrue; } if (pvNil == (flo.pfil = FIL::PfilCreateTemp(pfni))) goto LFail; flo.fp = 0; flo.cb = _pbsf->IbMac(); if (!_pbsf->FWriteRgb(&flo)) goto LFail; // redirect the BSF to the new file if (fSetFni) _pbsf->FReplaceFlo(&flo, fFalse, 0, flo.cb); if (!flo.pfil->FSetFni(pfni)) { LFail: ReleasePpo(&flo.pfil); return fFalse; } flo.pfil->SetTemp(fFalse); if (fSetFni) { ReleasePpo(&_pfil); _pfil = flo.pfil; _fDirty = fFalse; } else ReleasePpo(&flo.pfil); return fTrue; } #ifdef DEBUG /*************************************************************************** Assert the validity of a TXDC. ***************************************************************************/ void TXDC::AssertValid(ulong grf) { TXDC_PAR::AssertValid(0); AssertPo(_pbsf, 0); AssertNilOrPo(_pfil, 0); } /*************************************************************************** Mark memory for the TXDC. ***************************************************************************/ void TXDC::MarkMem(void) { AssertValid(0); TXDC_PAR::MarkMem(); MarkMemObj(_pbsf); } #endif // DEBUG /*************************************************************************** Constructor for a text document display gob. ***************************************************************************/ TXDD::TXDD(PDOCB pdocb, PGCB pgcb, PBSF pbsf, long onn, ulong grfont, long dypFont) : DDG(pdocb, pgcb) { AssertPo(pbsf, 0); Assert(vntl.FValidOnn(onn), "bad onn"); AssertIn(dypFont, 1, kswMax); _pbsf = pbsf; _onn = onn; _grfont = grfont; _dypFont = dypFont; // get the _dypLine and _dxpTab values RC rc; achar ch = kchSpace; GNV gnv(this); gnv.SetFont(_onn, _grfont, _dypFont); gnv.GetRcFromRgch(&rc, &ch, 1, 0, 0); _dypLine = rc.Dyp(); _dxpTab = LwMul(rc.Dxp(), 4); } /*************************************************************************** Destructor for TXDD. ***************************************************************************/ TXDD::~TXDD(void) { ReleasePpo(&_pglichStarts); } /*************************************************************************** Create a new TXDD. ***************************************************************************/ PTXDD TXDD::PtxddNew(PDOCB pdocb, PGCB pgcb, PBSF pbsf, long onn, ulong grfont, long dypFont) { PTXDD ptxdd; if (pvNil == (ptxdd = NewObj TXDD(pdocb, pgcb, pbsf, onn, grfont, dypFont))) return pvNil; if (!ptxdd->_FInit()) { ReleasePpo(&ptxdd); return pvNil; } ptxdd->Activate(fTrue); AssertPo(ptxdd, 0); return ptxdd; } /*************************************************************************** Initialize the TXDD. ***************************************************************************/ bool TXDD::_FInit(void) { long ib; if (!TXDD_PAR::_FInit()) return fFalse; if (pvNil == (_pglichStarts = GL::PglNew(size(long)))) return fFalse; _pglichStarts->SetMinGrow(20); ib = 0; if (!_pglichStarts->FPush(&ib)) return fFalse; _Reformat(0); AssertThis(0); return fTrue; } /*************************************************************************** The TXDD has changed sizes, set the _clnDisp. ***************************************************************************/ void TXDD::_NewRc(void) { AssertThis(0); RC rc; GetRc(&rc, cooLocal); _clnDisp = LwMax(1, LwDivAway(rc.Dyp(), _dypLine)); _clnDispWhole = LwMax(1, rc.Dyp() / _dypLine); _Reformat(_clnDisp); TXDD_PAR::_NewRc(); } /*************************************************************************** Deactivate the TXDD - turn off the selection. ***************************************************************************/ void TXDD::_Activate(bool fActive) { AssertThis(0); TXDD_PAR::_Activate(fActive); if (!fActive) _SwitchSel(fFalse, fFalse); } /*************************************************************************** Find new line starts starting at lnMin. ***************************************************************************/ void TXDD::_Reformat(long lnMin, long *pclnIns, long *pclnDel) { AssertThis(0); AssertIn(lnMin, 0, kcbMax); long ich, ichT; long ln, clnIns, clnDel; lnMin = LwMin(lnMin, _pglichStarts->IvMac() - 1); ich = *_QichLn(lnMin); clnIns = clnDel = 0; for (ln = lnMin + 1; ln <= _clnDisp; ln++) { if (!_FFindNextLineStart(ich, &ich)) { _pglichStarts->FSetIvMac(ln); return; } // delete starts that are before ich for (;;) { if (ln >= _pglichStarts->IvMac()) break; ichT = *_QichLn(ln); if (ichT == ich) goto LDone; if (ichT > ich) break; _pglichStarts->Delete(ln); clnDel++; } // add the new line start if (!_pglichStarts->FInsert(ln, &ich)) { if (ln >= _pglichStarts->IvMac()) { Warn("Reformatting failed"); return; } *_QichLn(ln) = ich; } clnIns++; } LDone: // truncate the list of line starts if (_pglichStarts->IvMac() > _clnDisp + 1) _pglichStarts->FSetIvMac(_clnDisp + 1); if (pvNil != pclnIns) *pclnIns = clnIns; if (pvNil != pclnDel) *pclnDel = clnDel; } /*************************************************************************** Find new line starts starting at lnMin. ***************************************************************************/ void TXDD::_ReformatEdit(long ichMinEdit, long cchIns, long cchDel, long *plnNew, long *pclnIns, long *pclnDel) { AssertThis(0); AssertIn(ichMinEdit, 0, kcbMax); AssertIn(cchIns, 0, _pbsf->IbMac() - ichMinEdit + 1); AssertIn(cchDel, 0, kcbMax); AssertNilOrVarMem(plnNew); AssertNilOrVarMem(pclnIns); AssertNilOrVarMem(pclnDel); long ich; long ln, clnDel; // if the first displayed character was affected, reset it // to a valid line start if (FIn(*_QichLn(0) - 1, ichMinEdit, ichMinEdit + cchDel)) { AssertDo(_FFindLineStart(ichMinEdit, &ich), 0); *_QichLn(0) = ich; } // skip unaffected lines for (ln = 0; ln < _pglichStarts->IvMac() && *_QichLn(ln) <= ichMinEdit; ln++) ; clnDel = 0; if (cchDel > 0) { // remove any deleted lines while (ln < _pglichStarts->IvMac() && *_QichLn(ln) <= ichMinEdit + cchDel) { _pglichStarts->Delete(ln); clnDel++; } } if (cchIns != cchDel) { long lnT; for (lnT = ln; lnT < _pglichStarts->IvMac(); lnT++) *_QichLn(lnT) += cchIns - cchDel; } _Reformat(LwMax(0, ln - 1), pclnIns); _Reformat(_clnDisp); if (pvNil != plnNew) *plnNew = ln; if (pvNil != pclnDel) *pclnDel = clnDel; } /*************************************************************************** Fetch a character of the stream through the cache. ***************************************************************************/ bool TXDD::_FFetchCh(long ich, achar *pch) { AssertThis(0); AssertIn(_ichMinCache, 0, _pbsf->IbMac() + 1); AssertIn(_ichLimCache, _ichMinCache, _pbsf->IbMac() + 1); if (!FIn(ich, _ichMinCache, _ichLimCache)) { // not a cache hit long ichMinCache, ichLimCache; long ichLim = _pbsf->IbMac(); if (!FIn(ich, 0, ichLim)) { TrashVar(pch); return fFalse; } // need to fetch some characters - try to center ich in the new cached data ichMinCache = LwMax(0, LwMin(ich - size(_rgchCache) / 2, ichLim - size(_rgchCache))); ichLimCache = LwMin(ichLim, ichMinCache + size(_rgchCache)); AssertIn(ich, ichMinCache, ichLimCache); // see if we can use some of the currently cached characters if (_ichMinCache >= _ichLimCache) goto LFetchAll; if (FIn(_ichMinCache, ich, ichLimCache)) { if (ichLimCache > _ichLimCache) { ichLimCache = _ichLimCache; ichMinCache = LwMax(0, ichLimCache - size(_rgchCache)); } BltPb(_rgchCache, _rgchCache + (_ichMinCache - ichMinCache), ichLimCache - _ichMinCache); _pbsf->FetchRgb(ichMinCache, _ichMinCache - ichMinCache, _rgchCache); } else if (FIn(_ichLimCache, ichMinCache, ich + 1)) { if (ichMinCache < _ichMinCache) { ichMinCache = _ichMinCache; ichLimCache = LwMin(ichLim, ichMinCache + size(_rgchCache)); } BltPb(_rgchCache + (ichMinCache - _ichMinCache), _rgchCache, _ichLimCache - ichMinCache); _pbsf->FetchRgb(_ichLimCache, ichLimCache - _ichLimCache, _rgchCache + (_ichLimCache - ichMinCache)); } else { LFetchAll: _pbsf->FetchRgb(ichMinCache, ichLimCache - ichMinCache, _rgchCache); } _ichMinCache = ichMinCache; _ichLimCache = ichLimCache; AssertIn(ich, _ichMinCache, _ichLimCache); } *pch = _rgchCache[ich - _ichMinCache]; return fTrue; } /*************************************************************************** Find the start of the line that ich is on. ***************************************************************************/ bool TXDD::_FFindLineStart(long ich, long *pich) { AssertThis(0); AssertVarMem(pich); achar ch; long dichLine = 0; long ichOrig = ich; if (ich > 0 && _FFetchCh(ich, &ch) && ch == kchLineFeed) dichLine++; for (;;) { if (!_FFetchCh(--ich, &ch)) { if (ich == -1) { *pich = 0; return fTrue; } TrashVar(pich); return fFalse; } switch (ch) { case kchLineFeed: dichLine++; break; case kchReturn: if ((*pich = ich + 1 + dichLine) <= ichOrig) return fTrue; // fall through default: dichLine = 0; break; } } Bug("How did we get here?"); } /*************************************************************************** Find the next line start after ich. If prgch is not nil, fills it with the characters between ich and the line start (but not more than cchMax characters). ***************************************************************************/ bool TXDD::_FFindNextLineStart(long ich, long *pich, achar *prgch, long cchMax) { AssertThis(0); AssertVarMem(pich); AssertIn(cchMax, 0, kcbMax); achar ch; bool fCr = fFalse; if (pvNil != prgch) AssertPvCb(prgch, cchMax); else cchMax = 0; for (;; ich++) { if (!_FFetchCh(ich, &ch)) { if (fCr && ich == _pbsf->IbMac()) { *pich = ich; return fTrue; } TrashVar(pich); return fFalse; } switch (ch) { case kchLineFeed: break; case kchReturn: if (!fCr) { fCr = fTrue; break; } // fall through default: if (fCr) { *pich = ich; return fTrue; } break; } if (cchMax > 0) { *prgch++ = ch; cchMax--; } } Bug("how did we get here?"); } /*************************************************************************** Find the start of the line that ich is on. This routine assumes that _pglichStarts is valid and tries to use it. ***************************************************************************/ bool TXDD::_FFindLineStartCached(long ich, long *pich) { AssertThis(0); long ln = _LnFromIch(ich); if (FIn(ln, 0, _clnDisp)) { *pich = *_QichLn(ln); return fTrue; } return _FFindLineStart(ich, pich); } /*************************************************************************** Find the next line start after ich. If prgch is not nil, fills it with the characters between ich and the line start (but not more than cchMax characters). ***************************************************************************/ bool TXDD::_FFindNextLineStartCached(long ich, long *pich, achar *prgch, long cchMax) { AssertThis(0); if (pvNil == prgch || cchMax == 0) { long ln = _LnFromIch(ich); if (FIn(ln, 0, _pglichStarts->IvMac() - 1)) { *pich = *_QichLn(ln + 1); return fTrue; } } return _FFindNextLineStart(ich, pich, prgch, cchMax); } /*************************************************************************** Draw the contents of the gob. ***************************************************************************/ void TXDD::Draw(PGNV pgnv, RC *prcClip) { AssertThis(0); AssertPo(pgnv, 0); AssertVarMem(prcClip); RC rc; long yp; long ln, lnLim; long cchDraw; achar rgch[kcchMaxLine]; GetRc(&rc, cooLocal); if (!rc.FIntersect(prcClip)) return; pgnv->SetFont(_onn, _grfont, _dypFont); ln = rc.ypTop / _dypLine; yp = LwMul(ln, _dypLine); lnLim = LwMin(_pglichStarts->IvMac(), LwDivAway(rc.ypBottom, _dypLine)); for (; ln < lnLim; yp += _dypLine) { _FetchLineLn(ln++, rgch, size(rgch), &cchDraw); _DrawLine(pgnv, prcClip, yp, rgch, cchDraw); } rc.ypTop = yp; pgnv->FillRc(&rc, kacrWhite); if (_fSelOn) _InvertSel(pgnv, fTrue); } /*************************************************************************** Fetch the characters for the given line. ***************************************************************************/ void TXDD::_FetchLineLn(long ln, achar *prgch, long cchMax, long *pcch, long *pichMin) { AssertThis(0); long ichMin, ichLim; ichMin = _IchMinLn(ln); ichLim = _IchMinLn(ln + 1); *pcch = LwMin(cchMax, ichLim - ichMin); _pbsf->FetchRgb(ichMin, *pcch, prgch); if (pvNil != pichMin) *pichMin = ichMin; } /*************************************************************************** Fetch the characters for the given line. ***************************************************************************/ void TXDD::_FetchLineIch(long ich, achar *prgch, long cchMax, long *pcch, long *pichMin) { AssertThis(0); long ichMin, ichLim; AssertDo(_FFindLineStartCached(ich, &ichMin), 0); if (!_FFindNextLineStartCached(ichMin, &ichLim, prgch, cchMax)) ichLim = _pbsf->IbMac(); *pcch = LwMin(cchMax, ichLim - ichMin); if (pvNil != pichMin) *pichMin = ichMin; } /*************************************************************************** Draw the line in the given GNV. ***************************************************************************/ void TXDD::_DrawLine(PGNV pgnv, RC *prcClip, long yp, achar *prgch, long cch) { AssertThis(0); long xp, xpOrigin, xpPrev; long ich, ichMin; RC rc; xpPrev = 0; xp = xpOrigin = kdxpIndentTxdd - _scvHorz; ich = 0; while (ich < cch) { while (ich < cch) { switch (prgch[ich]) { case kchTab: xp = xpOrigin + LwRoundAway(xp - xpOrigin + 1, _dxpTab); break; case kchReturn: case kchLineFeed: break; default: goto LNonWhite; } ich++; } LNonWhite: // erase any blank portion of the line if (xp > xpPrev && xp > prcClip->xpLeft && xpPrev < prcClip->xpRight) { rc.Set(xpPrev, yp, xp, yp + _dypLine); pgnv->FillRc(&rc, kacrWhite); } ichMin = ich; while (ich < cch) { switch (prgch[ich]) { case kchTab: case kchReturn: case kchLineFeed: goto LEndRun; } ich++; } LEndRun: if (ich > ichMin) { pgnv->GetRcFromRgch(&rc, prgch + ichMin, ich - ichMin); if (xp + rc.Dxp() > prcClip->xpLeft && xp < prcClip->xpRight) pgnv->DrawRgch(prgch + ichMin, ich - ichMin, xp, yp, kacrBlack, kacrWhite); xp += rc.Dxp(); } xpPrev = xp; } // erase any remaining portion of the line if (xpPrev < prcClip->xpRight) { rc.Set(xpPrev, yp, prcClip->xpRight, yp + _dypLine); pgnv->FillRc(&rc, kacrWhite); } } /*************************************************************************** Return the maximum scroll value for this view of the doc. ***************************************************************************/ long TXDD::_ScvMax(bool fVert) { if (fVert) { long ich; if (!_FFindLineStartCached(_pbsf->IbMac() - 1, &ich)) ich = 0; return ich; } return LwMul(_dxpTab, 100); } /*************************************************************************** Perform a scroll according to scaHorz and scaVert. ***************************************************************************/ void TXDD::_Scroll(long scaHorz, long scaVert, long scvHorz, long scvVert) { AssertThis(0); RC rc; long dxp, dyp; GetRc(&rc, cooLocal); dxp = 0; switch (scaHorz) { default: Assert(scaHorz == scaNil, "bad scaHorz"); break; case scaPageUp: dxp = -LwMulDiv(rc.Dxp(), 9, 10); goto LHorz; case scaPageDown: dxp = LwMulDiv(rc.Dxp(), 9, 10); goto LHorz; case scaLineUp: dxp = -rc.Dxp() / 10; goto LHorz; case scaLineDown: dxp = rc.Dxp() / 10; goto LHorz; case scaToVal: dxp = scvHorz - _scvHorz; LHorz: dxp = LwBound(_scvHorz + dxp, 0, _ScvMax(fFalse) + 1) - _scvHorz; _scvHorz += dxp; break; } dyp = 0; if (scaVert != scaNil) { long ichMin; long ichMinNew; long cln; long ichT; ichMin = *_QichLn(0); switch (scaVert) { default: Bug("bad scaVert"); ichMinNew = ichMin; break; case scaToVal: scvVert = LwBound(scvVert, 0, _ScvMax(fTrue) + 1); AssertDo(_FFindLineStartCached(scvVert, &ichMinNew), 0); for (cln = 0, ichT = LwMin(ichMin, ichMinNew); cln < _clnDisp && _FFindNextLineStartCached(ichT, &ichT) && (ichT <= ichMin || ichT <= ichMinNew);) { cln++; } if (ichMin > ichMinNew) cln = -cln; dyp = LwMul(cln, _dypLine); break; case scaPageDown: cln = LwMax(1, _clnDispWhole - 1); goto LDown; case scaLineDown: cln = 1; LDown: cln = LwMin(cln, _pglichStarts->IvMac() - 1); dyp = LwMul(cln, _dypLine); ichMinNew = *_QichLn(cln); break; case scaPageUp: cln = LwMax(1, _clnDispWhole - 1); goto LUp; case scaLineUp: cln = 1; LUp: ichMinNew = ichMin; while (cln-- > 0 && _FFindLineStart(ichMinNew - 1, &ichT)) { dyp -= _dypLine; ichMinNew = ichT; } break; } _scvVert = ichMinNew; if (ichMinNew != ichMin) { *_QichLn(0) = ichMinNew; _Reformat(0); _Reformat(_clnDisp); } } _SetScrollValues(); if (dxp != 0 || dyp != 0) _ScrollDxpDyp(dxp, dyp); } /*************************************************************************** Do idle processing. If this handler has the active selection, make sure the selection is on or off according to rglw[0] (non-zero means on) and set rglw[0] to false. Always return false. ***************************************************************************/ bool TXDD::FCmdSelIdle(PCMD pcmd) { AssertThis(0); // if rglw[1] is this one's hid, don't change the sel state. if (pcmd->rglw[1] != Hid()) { if (!pcmd->rglw[0]) _SwitchSel(fFalse, fFalse); else if (_ichAnchor != _ichOther || _tsSel == 0) _SwitchSel(fTrue, fTrue); else if (DtsCaret() < TsCurrent() - _tsSel) _SwitchSel(!_fSelOn, fTrue); } pcmd->rglw[0] = fFalse; return fFalse; } /*************************************************************************** Set the selection. ***************************************************************************/ void TXDD::SetSel(long ichAnchor, long ichOther, bool fDraw) { AssertThis(0); long ichMac = _pbsf->IbMac(); ichAnchor = LwBound(ichAnchor, 0, ichMac + 1); ichOther = LwBound(ichOther, 0, ichMac + 1); if (ichAnchor == _ichAnchor && ichOther == _ichOther) return; if (_fSelOn) { GNV gnv(this); if (_ichAnchor != ichAnchor || _ichAnchor == _ichOther || ichAnchor == ichOther) { _InvertSel(&gnv, fDraw); _ichAnchor = ichAnchor; _ichOther = ichOther; _InvertSel(&gnv, fDraw); _tsSel = TsCurrent(); } else { // they have the same anchor and neither is an insertion _InvertIchRange(&gnv, _ichOther, ichOther, fDraw); _ichOther = ichOther; } } else { _ichAnchor = ichAnchor; _ichOther = ichOther; _tsSel = 0L; } } /*************************************************************************** Turn the sel on or off according to fOn. ***************************************************************************/ void TXDD::_SwitchSel(bool fOn, bool fDraw) { AssertThis(0); if (FPure(fOn) != FPure(_fSelOn)) { GNV gnv(this); _InvertSel(&gnv, fDraw); _fSelOn = FPure(fOn); _tsSel = TsCurrent(); } } /*************************************************************************** Invert the current selection. ***************************************************************************/ void TXDD::_InvertSel(PGNV pgnv, bool fDraw) { AssertThis(0); AssertPo(pgnv, 0); RC rc, rcT; long ln; if (_ichAnchor == _ichOther) { // insertion bar ln = _LnFromIch(_ichAnchor); if (!FIn(ln, 0, _clnDisp)) return; rc.xpLeft = _XpFromLnIch(pgnv, ln, _ichAnchor) - 1; rc.xpRight = rc.xpLeft + 2; rc.ypTop = LwMul(ln, _dypLine); rc.ypBottom = rc.ypTop + _dypLine; GetRc(&rcT, cooLocal); if (rcT.FIntersect(&rc)) { if (fDraw) pgnv->FillRc(&rcT, kacrInvert); else InvalRc(&rcT, kginMark); } } else _InvertIchRange(pgnv, _ichAnchor, _ichOther, fDraw); } /*************************************************************************** Invert a range. ***************************************************************************/ void TXDD::_InvertIchRange(PGNV pgnv, long ich1, long ich2, bool fDraw) { AssertThis(0); AssertPo(pgnv, 0); AssertIn(ich1, 0, _pbsf->IbMac() + 1); AssertIn(ich2, 0, _pbsf->IbMac() + 1); RC rc, rcClip, rcT; long ln1, ln2, xp2; if (ich1 == ich2) return; SortLw(&ich1, &ich2); ln1 = _LnFromIch(ich1); ln2 = _LnFromIch(ich2); if (ln1 >= _clnDisp || ln2 < 0) return; GetRc(&rcClip, cooLocal); rc.xpLeft = _XpFromLnIch(pgnv, ln1, ich1); rc.ypTop = LwMul(ln1, _dypLine); rc.ypBottom = LwMul(ln1 + 1, _dypLine); xp2 = _XpFromLnIch(pgnv, ln2, ich2); if (ln2 == ln1) { // only one line involved rc.xpRight = xp2; if (rcT.FIntersect(&rc, &rcClip)) { if (fDraw) pgnv->HiliteRc(&rcT, kacrWhite); else InvalRc(&rcT); } return; } // invert the sel on the first line rc.xpRight = rcClip.xpRight; if (rcT.FIntersect(&rc, &rcClip)) { if (fDraw) pgnv->HiliteRc(&rcT, kacrWhite); else InvalRc(&rcT); } // invert the main rectangular block rc.xpLeft = kdxpIndentTxdd - _scvHorz; rc.ypTop = rc.ypBottom; rc.ypBottom = LwMul(ln2, _dypLine); if (rcT.FIntersect(&rc, &rcClip)) { if (fDraw) pgnv->HiliteRc(&rcT, kacrWhite); else InvalRc(&rcT); } // invert the last line rc.ypTop = rc.ypBottom; rc.ypBottom = LwMul(ln2 + 1, _dypLine); rc.xpRight = xp2; if (rcT.FIntersect(&rc, &rcClip)) { if (fDraw) pgnv->HiliteRc(&rcT, kacrWhite); else InvalRc(&rcT); } } /*************************************************************************** Find the line in the TXDD that is displaying the given ich. Returns -1 if the ich is before the first displayed ich and returns _clnDisp if ich is after the last displayed ich. ***************************************************************************/ long TXDD::_LnFromIch(long ich) { AssertThis(0); long lnMin, lnLim, ln; long ichT; lnMin = 0; lnLim = LwMin(_clnDisp + 1, _pglichStarts->IvMac()); while (lnMin < lnLim) { ln = (lnMin + lnLim) / 2; ichT = *_QichLn(ln); if (ichT < ich) lnMin = ln + 1; else if (ichT > ich) lnLim = ln; else return ln; } return lnMin - 1; } /*************************************************************************** Return the ich of the first character on the given line. If ln < 0, returns 0; if ln >= _clnDisp, returns IbMac(). ***************************************************************************/ long TXDD::_IchMinLn(long ln) { AssertThis(0); long ich; if (ln < 0) return 0; if (ln >= _pglichStarts->IvMac()) return _pbsf->IbMac(); ich = *_QichLn(ln); return ich; } /*************************************************************************** Return the xp location of the given ich on the given line. ***************************************************************************/ long TXDD::_XpFromLnIch(PGNV pgnv, long ln, long ich) { AssertThis(0); AssertPo(pgnv, 0); RC rc; long cch, ichT; achar rgch[kcchMaxLine]; if (!FIn(ln, 0, LwMin(_clnDisp, _pglichStarts->IvMac()))) return 0; ichT = *_QichLn(ln); _FetchLineLn(ln, rgch, LwMin(ich - ichT, size(rgch)), &cch); return _XpFromRgch(pgnv, rgch, cch); } /*************************************************************************** Return the xp location of the given ich. ***************************************************************************/ long TXDD::_XpFromIch(long ich) { AssertThis(0); long ichMin, cch; achar rgch[kcchMaxLine]; if (!_FFindLineStartCached(ich, &ichMin)) return 0; GNV gnv(this); cch = LwMin(size(rgch), ich - ichMin); _pbsf->FetchRgb(ichMin, cch, rgch); return _XpFromRgch(&gnv, rgch, cch); } /*************************************************************************** Return the xp location of the end of the given (rgch, cch), assuming it starts at the beginning of a line. ***************************************************************************/ long TXDD::_XpFromRgch(PGNV pgnv, achar *prgch, long cch) { AssertThis(0); long xp, xpOrigin; long ich, ichMin; RC rc; pgnv->SetFont(_onn, _grfont, _dypFont); xp = xpOrigin = kdxpIndentTxdd - _scvHorz; ich = 0; while (ich < cch) { while (ich < cch) { switch (prgch[ich]) { case kchTab: xp = xpOrigin + LwRoundAway(xp - xpOrigin + 1, _dxpTab); break; case kchReturn: case kchLineFeed: break; default: goto LNonWhite; } ich++; } LNonWhite: ichMin = ich; while (ich < cch) { switch (prgch[ich]) { case kchTab: case kchReturn: case kchLineFeed: goto LEndRun; } ich++; } LEndRun: if (ich > ichMin) { pgnv->GetRcFromRgch(&rc, prgch + ichMin, ich - ichMin); xp += rc.Dxp(); } } return xp; } /*************************************************************************** Find the character that is closest to xp on the given line. ***************************************************************************/ long TXDD::_IchFromLnXp(long ln, long xp) { AssertThis(0); long ichMin, cch; achar rgch[kcchMaxLine]; if (ln < 0) return 0; _FetchLineLn(ln, rgch, size(rgch), &cch, &ichMin); return _IchFromRgchXp(rgch, cch, ichMin, xp); } /*************************************************************************** Find the character that is closest to xp on the same line as the given character. ***************************************************************************/ long TXDD::_IchFromIchXp(long ich, long xp) { AssertThis(0); long ichMin, cch; achar rgch[kcchMaxLine]; _FetchLineIch(ich, rgch, size(rgch), &cch, &ichMin); return _IchFromRgchXp(rgch, cch, ichMin, xp); } /*************************************************************************** Find the character that is closest to xp on the given line. ***************************************************************************/ long TXDD::_IchFromRgchXp(achar *prgch, long cch, long ichMinLine, long xp) { AssertThis(0); long xpT; long ich, ichMin, ichLim; GNV gnv(this); while (cch > 0 && (prgch[cch - 1] == kchReturn || prgch[cch - 1] == kchLineFeed)) cch--; ichLim = ichMinLine + cch; ichMin = ichMinLine; while (ichMin < ichLim) { ich = (ichMin + ichLim) / 2; xpT = _XpFromRgch(&gnv, prgch, ich - ichMinLine); if (xpT < xp) ichMin = ich + 1; else ichLim = ich; } if (ichMin > ichMinLine && LwAbs(xp - _XpFromRgch(&gnv, prgch, ichMin - 1 - ichMinLine)) < LwAbs(xp - _XpFromRgch(&gnv, prgch, ichMin - ichMinLine))) { ichMin--; } return ichMin; } /*************************************************************************** Make sure the selection is visible (or at least _ichOther is). ***************************************************************************/ void TXDD::ShowSel(bool fDraw) { AssertThis(0); long ln, lnHope; long dxpScroll, dichScroll; long xpMin, xpLim; RC rc; long ichAnchor = _ichAnchor; // find the lines we want to show ln = _LnFromIch(_ichOther); lnHope = _LnFromIch(ichAnchor); GetRc(&rc, cooLocal); dichScroll = 0; if (!FIn(ln, 0, _clnDispWhole) || !FIn(lnHope, 0, _clnDispWhole)) { // count the number of lines between _ichOther and ichAnchor long ichMinLine, ich; long ichMin = LwMin(ichAnchor, _ichOther); long ichLim = LwMax(ichAnchor, _ichOther); long cln = 0; AssertDo(_FFindLineStartCached(ichMin, &ichMinLine), 0); for (ich = ichMin; cln < _clnDispWhole && _FFindNextLineStartCached(ich, &ich) && ich < ichLim; cln++) { } if (cln >= _clnDispWhole) { // just show _ichOther AssertDo(_FFindLineStartCached(_ichOther, &ichMinLine), 0); ichAnchor = _ichOther; lnHope = ln; cln = 0; } if (ln < 0 || lnHope < 0) { // scroll up dichScroll = ichMinLine - _scvVert; } else if (ln >= _clnDispWhole || lnHope >= _clnDispWhole) { // scroll down cln = LwMax(0, _clnDispWhole - cln - 1); // move cln lines back from ichMinLine while (cln-- > 0 && _FFindLineStartCached(ichMinLine - 1, &ichMin)) ichMinLine = ichMin; dichScroll = ichMinLine - _scvVert; } } // now do the horizontal stuff xpMin = _XpFromIch(_ichOther); xpLim = _XpFromIch(ichAnchor); if (LwAbs(xpLim - xpMin) > rc.Dxp()) { // can't show both if (xpMin > xpLim) { xpLim = xpMin; xpMin = xpLim - rc.Dxp(); } else xpLim = xpMin + rc.Dxp(); } else SortLw(&xpMin, &xpLim); dxpScroll = LwMax(LwMin(0, rc.xpRight - xpLim), rc.xpLeft - xpMin); if (dxpScroll != 0 || dichScroll != 0) { _Scroll(scaToVal, scaToVal, _scvHorz - dxpScroll, _scvVert + dichScroll); } } /*************************************************************************** Handle a mousedown in the TXDD. ***************************************************************************/ bool TXDD::FCmdTrackMouse(PCMD_MOUSE pcmd) { AssertThis(0); AssertVarMem(pcmd); RC rc; long ich; long scaHorz, scaVert; long xp = pcmd->xp; long yp = pcmd->yp; if (pcmd->cid == cidMouseDown) { Assert(vpcex->PgobTracking() == pvNil, "mouse already being tracked!"); vpcex->TrackMouse(this); } else { Assert(vpcex->PgobTracking() == this, "not tracking mouse!"); Assert(pcmd->cid == cidTrackMouse, 0); } // do autoscrolling GetRc(&rc, cooLocal); if (!FIn(xp, rc.xpLeft, rc.xpRight)) { scaHorz = (xp < rc.xpLeft) ? scaLineUp : scaLineDown; xp = LwBound(xp, rc.xpLeft, rc.xpRight); } else scaHorz = scaNil; if (!FIn(yp, rc.ypTop, rc.ypBottom)) { scaVert = (yp < rc.ypTop) ? scaLineUp : scaLineDown; yp = LwBound(yp, rc.ypTop, rc.ypBottom); } else scaVert = scaNil; if (scaHorz != scaNil || scaVert != scaNil) _Scroll(scaHorz, scaVert); // set the selection ich = _IchFromLnXp(yp / _dypLine, xp); if (pcmd->cid != cidMouseDown || (pcmd->grfcust & fcustShift)) SetSel(_ichAnchor, ich, fTrue); else SetSel(ich, ich, fTrue); _SwitchSel(fTrue, fTrue); // make sure the selection is on ShowSel(fTrue); if (!(pcmd->grfcust & fcustMouse)) vpcex->EndMouseTracking(); return fTrue; } /*************************************************************************** Handle a key down. ***************************************************************************/ bool TXDD::FCmdKey(PCMD_KEY pcmd) { AssertThis(0); const long kcchInsBuf = 64; AssertThis(0); AssertVarMem(pcmd); ulong grfcust; long vkDone; long dich, dln, ichLim, ichT, ichMin; achar ch; long cact; CMD cmd; achar rgch[kcchInsBuf + 1]; // keep fetching characters until we get a cursor key, delete key or // until the buffer is full. vkDone = vkNil; ichLim = 0; do { grfcust = pcmd->grfcust; switch (pcmd->vk) { // these keys all terminate the key fetching loop case kvkHome: case kvkEnd: case kvkLeft: case kvkRight: case kvkUp: case kvkDown: case kvkPageUp: case kvkPageDown: case kvkDelete: case kvkBack: vkDone = pcmd->vk; goto LInsert; default: if (chNil == pcmd->ch) break; for (cact = 0; cact < pcmd->cact && ichLim < kcchInsBuf; cact++) { rgch[ichLim++] = (achar)pcmd->ch; #ifdef WIN if ((achar)pcmd->ch == kchReturn) rgch[ichLim++] = kchLineFeed; #endif // WIN } break; } pcmd = (PCMD_KEY)&cmd; } while (ichLim < kcchInsBuf && vpcex->FGetNextKey(&cmd)); LInsert: if (ichLim > 0) { // have some characters to insert FReplace(rgch, ichLim, _ichAnchor, _ichOther, fTrue); } dich = 0; dln = 0; switch (vkDone) { case kvkHome: if (grfcust & fcustCmd) dich = -_pbsf->IbMac() - ichLim - 1; else if (_FFindLineStartCached(_ichOther, &ichT)) dich = ichT - _ichOther; _fXpValid = fFalse; goto LSetSel; case kvkEnd: if (grfcust & fcustCmd) dich = _pbsf->IbMac() + ichLim + 1; else { if (!_FFindNextLineStartCached(_ichOther, &ichT)) ichT = _pbsf->IbMac(); // don't advance past trailing line feed and return characters while (ichT > _ichOther && _FFetchCh(ichT - 1, &ch) && (ch == kchReturn || ch == kchLineFeed)) { ichT--; } dich = ichT - _ichOther; } _fXpValid = fFalse; goto LSetSel; case kvkLeft: dich = -1; while (_FFetchCh(_ichOther + dich, &ch) && ch == kchLineFeed) dich--; _fXpValid = fFalse; goto LSetSel; case kvkRight: dich = 1; while (_FFetchCh(_ichOther + dich, &ch) && ch == kchLineFeed) dich++; _fXpValid = fFalse; goto LSetSel; case kvkUp: dln = -1; goto LLineSel; case kvkDown: dln = 1; goto LLineSel; case kvkPageUp: dln = -LwMax(1, _clnDispWhole - 1); goto LLineSel; case kvkPageDown: dln = LwMax(1, _clnDispWhole - 1); LLineSel: if (!_fXpValid) { // get the xp of _ichOther _xpSel = _XpFromIch(_ichOther) + _scvHorz; _fXpValid = fTrue; } if (dln > 0) { ichMin = _ichOther; while (dln-- > 0 && _FFindNextLineStartCached(ichMin, &ichT)) ichMin = ichT; if (dln >= 0) { // goto end of doc dich = _pbsf->IbMac() - _ichOther; _fXpValid = fFalse; } else goto LFindIch; } else { AssertDo(_FFindLineStartCached(_ichOther, &ichT), 0); ichMin = ichT; while (dln++ < 0 && _FFindLineStartCached(ichMin - 1, &ichT)) ichMin = ichT; if (dln <= 0) { // goto top of doc dich = -_ichOther; _fXpValid = fFalse; } else { LFindIch: // ichMin is the start of the line to move the selection to dich = _IchFromIchXp(ichMin, _xpSel - _scvHorz) - _ichOther; } } LSetSel: // move the selection if (grfcust & fcustShift) { // extend selection SetSel(_ichAnchor, _ichOther + dich, fTrue); ShowSel(fTrue); } else { long ichAnchor = _ichAnchor; if (ichAnchor == _ichOther) ichAnchor += dich; else if ((dich > 0) != (ichAnchor > _ichOther)) ichAnchor = _ichOther; SetSel(ichAnchor, ichAnchor, fTrue); ShowSel(fTrue); } break; case kvkDelete: dich = 1; goto LDelete; case kvkBack: dich = -1; LDelete: if (_ichAnchor != _ichOther) dich = _ichOther - _ichAnchor; else dich = LwBound(_ichAnchor + dich, 0, _pbsf->IbMac() + 1) - _ichAnchor; if (dich != 0) FReplace(pvNil, 0, _ichAnchor, _ichAnchor + dich, fTrue); break; } return fTrue; } /*************************************************************************** Replaces the characters between ich1 and ich2 with the given ones. ***************************************************************************/ bool TXDD::FReplace(achar *prgch, long cch, long ich1, long ich2, bool fDraw) { AssertThis(0); _SwitchSel(fFalse, fTrue); SortLw(&ich1, &ich2); if (!_pbsf->FReplace(prgch, cch, ich1, ich2 - ich1)) return fFalse; _InvalAllTxdd(ich1, cch, ich2 - ich1); ich1 += cch; SetSel(ich1, ich1, fTrue); ShowSel(fTrue); return fTrue; } /*************************************************************************** Invalidate all TXDDs on this text doc. Also dirties the document. Should be called by any code that edits the document. ***************************************************************************/ void TXDD::_InvalAllTxdd(long ich, long cchIns, long cchDel) { AssertThis(0); long ipddg; PDDG pddg; // mark the document dirty _pdocb->SetDirty(); // inform the TXDDs for (ipddg = 0; pvNil != (pddg = _pdocb->PddgGet(ipddg)); ipddg++) { if (pddg->FIs(kclsTXDD)) ((PTXDD)pddg)->_InvalIch(ich, cchIns, cchDel); } } /*************************************************************************** Invalidate the display from ich. If we're the active TXDD, also redraw. ***************************************************************************/ void TXDD::_InvalIch(long ich, long cchIns, long cchDel) { AssertThis(0); Assert(!_fSelOn, "why is the sel on during an invalidation?"); RC rcLoc, rc; long ichAnchor, ichOther; long lnNew, clnIns, clnDel; long yp, dypIns, dypDel; // adjust the sel ichAnchor = _ichAnchor; ichOther = _ichOther; FAdjustIv(&ichAnchor, ich, cchIns, cchDel); FAdjustIv(&ichOther, ich, cchIns, cchDel); if (ichAnchor != _ichAnchor || ichOther != _ichOther) SetSel(ichAnchor, ichOther, fFalse); // adjust the cache if (_ichLimCache > _ichMinCache) { if (FPure(_ichLimCache <= ich) != FPure(_ichMinCache <= ich) || FPure(_ichLimCache >= ich + cchDel) != FPure(_ichMinCache >= ich + cchDel) || !FAdjustIv(&_ichLimCache, ich, cchIns, cchDel) || !FAdjustIv(&_ichMinCache, ich, cchIns, cchDel)) { _ichMinCache = _ichLimCache = 0; } } // reformat _ReformatEdit(ich, cchIns, cchDel, &lnNew, &clnIns, &clnDel); if (lnNew > 0) { lnNew--; clnIns++; clnDel++; } // determine the dirty rectangles and if we're active, update them GetRc(&rcLoc, cooLocal); if (!_fActive) { rc = rcLoc; rc.ypTop = LwMul(lnNew, _dypLine); if (clnIns == clnDel) rc.ypBottom = LwMul(lnNew + clnIns, _dypLine); InvalRc(&rc); return; } dypIns = LwMul(clnIns, _dypLine); dypDel = LwMul(clnDel, _dypLine); yp = LwMul(lnNew, _dypLine); rc = rcLoc; rc.ypTop = yp; rc.ypBottom = yp + LwMin(dypIns, dypDel); if (_clnDisp > lnNew + clnIns - clnDel && clnIns != clnDel) { // have some bits to blt vertically rc = rcLoc; rc.ypTop = yp + LwMin(dypIns, dypDel); Scroll(&rc, 0, dypIns - dypDel, kginDraw); rc.ypBottom = rc.ypTop; rc.ypTop = yp; } if (!rc.FEmpty()) InvalRc(&rc, kginDraw); _fXpValid = fFalse; } /*************************************************************************** If ppdocb != pvNil, copy the selection to a new document and return true. If ppdocb == pvNil just return whether the selection is non-empty. ***************************************************************************/ bool TXDD::_FCopySel(PDOCB *ppdocb) { AssertThis(0); PTXDC ptxdc; long ich1, ich2; if ((ich1 = _ichOther) == (ich2 = _ichAnchor)) return fFalse; if (pvNil == ppdocb) return fTrue; SortLw(&ich1, &ich2); if (pvNil != (ptxdc = TXDC::PtxdcNew())) { if (!ptxdc->Pbsf()->FReplaceBsf(_pbsf, ich1, ich2 - ich1, 0, 0)) ReleasePpo(&ptxdc); } *ppdocb = ptxdc; return pvNil != *ppdocb; } /*************************************************************************** Clear (delete) the current selection. ***************************************************************************/ void TXDD::_ClearSel(void) { AssertThis(0); FReplace(pvNil, 0, _ichAnchor, _ichOther, fTrue); } /*************************************************************************** Paste the given doc into this one. ***************************************************************************/ bool TXDD::_FPaste(PCLIP pclip, bool fDoIt, long cid) { AssertThis(0); AssertPo(pclip, 0); long ich1, ich2, cch; PTXDC ptxdc; PBSF pbsf; if (cidPaste != cid || !pclip->FGetFormat(kclsTXDC)) return fFalse; if (!fDoIt) return fTrue; if (!pclip->FGetFormat(kclsTXDC, (PDOCB *)&ptxdc)) return fFalse; AssertPo(ptxdc, 0); if (pvNil == (pbsf = ptxdc->Pbsf()) || 0 >= (cch = pbsf->IbMac())) { ReleasePpo(&ptxdc); return fTrue; } _SwitchSel(fFalse, fTrue); ich1 = _ichAnchor; ich2 = _ichOther; SortLw(&ich1, &ich2); if (!_pbsf->FReplaceBsf(pbsf, 0, cch, ich1, ich2 - ich1)) { ReleasePpo(&ptxdc); return fFalse; } ReleasePpo(&ptxdc); _InvalAllTxdd(ich1, cch, ich2 - ich1); ich1 += cch; SetSel(ich1, ich1, fTrue); ShowSel(fTrue); return fTrue; } #ifdef DEBUG /*************************************************************************** Assert the validity of a TXDD. ***************************************************************************/ void TXDD::AssertValid(ulong grf) { // REVIEW shonk: fill in more TXDD_PAR::AssertValid(0); AssertPo(_pbsf, 0); AssertPo(_pglichStarts, 0); } /*************************************************************************** Mark memory for the TXDD. ***************************************************************************/ void TXDD::MarkMem(void) { AssertValid(0); TXDD_PAR::MarkMem(); MarkMemObj(_pbsf); MarkMemObj(_pglichStarts); } #endif // DEBUG ================================================ FILE: kauai/src/textdoc.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation For editing a text file or text stream as a document. Unlike the edit controls in text.h/text.cpp, all the text need not be in memory (this uses a BSF) and there can be multiple views on the same text. ***************************************************************************/ #ifndef TEXTDOC_H #define TEXTDOC_H /*************************************************************************** Text document. A doc wrapper for a BSF. ***************************************************************************/ typedef class TXDC *PTXDC; #define TXDC_PAR DOCB #define kclsTXDC 'TXDC' class TXDC : public TXDC_PAR { RTCLASS_DEC ASSERT MARKMEM protected: PBSF _pbsf; PFIL _pfil; TXDC(PDOCB pdocb = pvNil, ulong grfdoc = fdocNil); ~TXDC(void); bool _FInit(PFNI pfni = pvNil, PBSF pbsf = pvNil); public: static PTXDC PtxdcNew(PFNI pfni = pvNil, PBSF pbsf = pvNil, PDOCB pdocb = pvNil, ulong grfdoc = fdocNil); PBSF Pbsf(void) { return _pbsf; } virtual PDDG PddgNew(PGCB pgcb); virtual bool FGetFni(FNI *pfni); virtual bool FSaveToFni(FNI *pfni, bool fSetFni); }; /*************************************************************************** Text document display GOB - DDG for a TXDC. ***************************************************************************/ const long kcchMaxLine = 512; const long kdxpIndentTxdd = 5; typedef class TXDD *PTXDD; #define TXDD_PAR DDG #define kclsTXDD 'TXDD' class TXDD : public TXDD_PAR { RTCLASS_DEC ASSERT MARKMEM protected: PBSF _pbsf; long _clnDisp; long _clnDispWhole; PGL _pglichStarts; // the selection long _ichAnchor; long _ichOther; bool _fSelOn : 1; ulong _tsSel; long _xpSel; bool _fXpValid; // the font long _onn; ulong _grfont; long _dypFont; long _dypLine; long _dxpTab; // the cache achar _rgchCache[kcchMaxLine]; long _ichMinCache; long _ichLimCache; TXDD(PDOCB pdocb, PGCB pgcb, PBSF pbsf, long onn, ulong grfont, long dypFont); ~TXDD(void); virtual bool _FInit(void); virtual void _NewRc(void); virtual void _Activate(bool fActive); void _Reformat(long lnMin, long *pclnIns = pvNil, long *pclnDel = pvNil); void _ReformatEdit(long ichMinEdit, long cchIns, long cchDel, long *pln, long *pclnIns = pvNil, long *pclnDel = pvNil); bool _FFetchCh(long ich, achar *pch); void _FetchLineLn(long ln, achar *prgch, long cchMax, long *pcch, long *pichMin = pvNil); void _FetchLineIch(long ich, achar *prgch, long cchMax, long *pcch, long *pichMin = pvNil); bool _FFindNextLineStart(long ich, long *pich, achar *prgch = pvNil, long cchMax = 0); bool _FFindLineStart(long ich, long *pich); bool _FFindNextLineStartCached(long ich, long *pich, achar *prgch = pvNil, long cchMax = 0); bool _FFindLineStartCached(long ich, long *pich); void _DrawLine(PGNV pgnv, RC *prcClip, long yp, achar *prgch, long cch); void _SwitchSel(bool fOn, bool fDraw); void _InvertSel(PGNV pgnv, bool fDraw); void _InvertIchRange(PGNV pgnv, long ich1, long ich2, bool fDraw); long _LnFromIch(long ich); long _IchMinLn(long ln); long _XpFromLnIch(PGNV pgnv, long ln, long ich); long _XpFromIch(long ich); long _XpFromRgch(PGNV pgnv, achar *prgch, long cch); long _IchFromLnXp(long ln, long xp); long _IchFromIchXp(long ich, long xp); long _IchFromRgchXp(achar *prgch, long cch, long ichMinLine, long xp); long *_QichLn(long ln) { return (long *)_pglichStarts->QvGet(ln); } void _InvalAllTxdd(long ich, long cchIns, long cchDel); void _InvalIch(long ich, long cchIns, long cchDel); // scrolling support virtual long _ScvMax(bool fVert); virtual void _Scroll(long scaHorz, long scaVert, long scvHorz = 0, long scvVert = 0); // clipboard support virtual bool _FCopySel(PDOCB *ppdocb = pvNil); virtual void _ClearSel(void); virtual bool _FPaste(PCLIP pclip, bool fDoIt, long cid); public: static PTXDD PtxddNew(PDOCB pdocb, PGCB pgcb, PBSF pbsf, long onn, ulong grfont, long dypFont); virtual void Draw(PGNV pgnv, RC *prcClip); virtual bool FCmdTrackMouse(PCMD_MOUSE pcmd); virtual bool FCmdKey(PCMD_KEY pcmd); virtual bool FCmdSelIdle(PCMD pcmd); void SetSel(long ichAnchor, long ichOther, bool fDraw); void ShowSel(bool fDraw); bool FReplace(achar *prgch, long cch, long ich1, long ich2, bool fDraw); }; #endif //! TEXTDOC_H ================================================ FILE: kauai/src/ut.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai test app Reviewed: Copyright (c) Microsoft Corporation Utility tester. ***************************************************************************/ #include "util.h" #include ASSERTNAME void TestUtil(void); void CheckForLostMem(void); bool FFindPrime(long lwMax, long lwMaxRoot, long *plwPrime, long *plwRoot); /*************************************************************************** Call test routines. ***************************************************************************/ void __cdecl main(long cpszs, char **prgpszs) { #ifdef REVIEW // shonk: for counting lines FNE fne; FNI fniDir, fni; FTG rgftg[2]; byte rgb[512]; FP fpMac, fp; long cbTot, clnTot, ib, cbT, cln; PFIL pfil; STN stn; if (!fniDir.FGetOpen("All files\0*.*\0", hNil)) return; fniDir.FSetLeaf(pvNil, kftgDir); rgftg[0] = 'H'; rgftg[1] = 'CPP'; if (!fne.FInit(&fniDir, rgftg, 2)) return; cbTot = 0; clnTot = 0; while (fne.FNextFni(&fni)) { fni.GetStnPath(&stn); if (pvNil == (pfil = FIL::PfilOpen(&fni))) return; fpMac = pfil->FpMac(); cbTot += fpMac; fp = 0; cln = 0; while (fp < fpMac) { cbT = LwMin(fpMac - fp, size(rgb)); if (!pfil->FReadRgbSeq(rgb, cbT, &fp)) return; for (ib = 0; ib < cbT; ib++) { if (rgb[ib] == kchReturn) cln++; } } clnTot += cln; printf("%s: %d, %d\n", stn.Psz(), cln, fpMac); } printf("Total bytes: %d; Total lines: %d\n", cbTot, clnTot); #endif // REVIEW #ifndef REVIEW // shonk: for finding a prime and a primitive root for the prime long lwPrime, lwRoot, lw; STN stn; lwPrime = 6000; if (cpszs > 1) { stn.SetSzs(prgpszs[1]); if (stn.FGetLw(&lw) && FIn(lw, 2, kcbMax)) lwPrime = lw; } lwRoot = lwPrime / 2; if (cpszs > 2) { stn.SetSzs(prgpszs[2]); if (stn.FGetLw(&lw) && FIn(lw, 2, kcbMax)) lwRoot = lw; } if (FFindPrime(lwPrime, lwRoot, &lwPrime, &lwRoot)) printf("prime = %ld, primitive root = %ld\n", lwPrime, lwRoot); #endif // REVIEW #ifdef REVIEW // shonk: general testing stuff CheckForLostMem(); TestUtil(); CheckForLostMem(); #endif } #ifdef DEBUG /*************************************************************************** Returning true breaks into the debugger. ***************************************************************************/ bool FAssertProc(PSZS pszsFile, long lwLine, PSZS pszsMsg, void *pv, long cb) { printf("An assert occurred: \n\r"); if (pszsMsg != pvNil) printf(" Msg: %s\n\r", pszsMsg); if (pv != pvNil) { printf(" Address %x\n\r", pv); if (cb != 0) { printf(" Value: "); switch (cb) { default: { byte *pb; byte *pbLim; for (pb = (byte *)pv, pbLim = pb + cb; pb < pbLim; pb++) printf("%2x", (int)*pb); } break; case 2: printf("%4x", (int)*(short *)pv); break; case 4: printf("%8x", *(long *)pv); break; } printf("\n\r"); } } printf(" File: %s\n\r", pszsFile); printf(" Line: %ld\n\r", lwLine); return fFalse; } /*************************************************************************** Callback from util for warnings. ***************************************************************************/ void WarnProc(PSZS pszsFile, long lwLine, PSZS pszsMsg) { printf("Warning\n\r"); if (pszsMsg != pvNil) printf(" Msg: %s\n\r", pszsMsg); printf(" File: %s\n\r", pszsFile); printf(" Line: %ld\n\r", lwLine); } #endif // DEBUG /*************************************************************************** Unmarks all hqs, marks all hqs known to be in use, then asserts on all unmarked hqs. ***************************************************************************/ void CheckForLostMem(void) { UnmarkAllMem(); UnmarkAllObjs(); MarkUtilMem(); // marks all util memory AssertUnmarkedMem(); AssertUnmarkedObjs(); } /*************************************************************************** Find the largest prime that is less than lwMax and find a primitive root for it. ***************************************************************************/ bool FFindPrime(long lwMax, long lwMaxRoot, long *plwPrime, long *plwRoot) { AssertIn(lwMax, 3, kcbMax); AssertVarMem(plwPrime); AssertVarMem(plwRoot); byte *prgb; long cb; long lw, ibit, lwT, clwHit; // make sure lwMax is even. lwMax = (lwMax + 1) & ~1; cb = LwDivAway(lwMax, 16); if (!FAllocPv((void **)&prgb, cb, fmemClear, mprNormal)) return fFalse; for (lw = 3; lw < lwMax / 3; lw += 2) { ibit = lw / 2; if (prgb[ibit / 8] & (1 << (ibit % 8))) continue; for (lwT = 3 * lw; lwT < lwMax; lwT += 2 * lw) { ibit = lwT / 2; prgb[ibit / 8] |= (1 << (ibit % 8)); } } for (lw = lwMax - 1;; lw -= 2) { ibit = lw / 2; if (!(prgb[ibit / 8] & (1 << (ibit % 8)))) break; } *plwPrime = lw; FreePpv((void **)&prgb); for (lw = LwMin(lwMaxRoot, *plwPrime - 1);; lw--) { if (lw <= 1) { Assert(lw > 1, "bug"); break; } for (lwT = lw, clwHit = 0;;) { clwHit++; LwMulDivMod(lwT, lw, *plwPrime, &lwT); if (lwT == lw) break; } if (clwHit == *plwPrime - 1) break; } *plwRoot = lw; return fTrue; } ================================================ FILE: kauai/src/util.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Core routines for the utility layer. ***************************************************************************/ #include "util.h" ASSERTNAME #ifdef DEBUG /*************************************************************************** Mark all util-level memory and objects. ***************************************************************************/ void MarkUtilMem(void) { PCFL pcfl; PFIL pfil; MarkMemObj(&vsflUtil); MarkMemObj(&vrndUtil); MarkMemObj(&vkcdcUtil); MarkMemObj(&vcodmUtil); MarkMemObj(vpcodmUtil); for (pcfl = CFL::PcflFirst(); pcfl != pvNil; pcfl = pcfl->PcflNext()) MarkMemObj(pcfl); for (pfil = FIL::PfilFirst(); pfil != pvNil; pfil = pfil->PfilNext()) MarkMemObj(pfil); } #endif // DEBUG ================================================ FILE: kauai/src/util.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Main include file for util files. ***************************************************************************/ #ifndef UTIL_H #define UTIL_H #include // define the endian-ness #ifdef IN_80386 #define LITTLE_ENDIAN #endif // IN_80386 #ifdef LITTLE_ENDIAN #define BigLittle(a, b) b #define Big(a) #define Little(a) a #else //! LITTLE_ENDIAN #define BigLittle(a, b) a #define Big(a) a #define Little(a) #endif //! LITTLE_ENDIAN #ifdef MAC #include "mac.h" #elif defined(WIN) #define CONST // so we don't have to use const everywhere that Windows wants it #ifdef UNICODE #define _UNICODE #endif // UNICODE // windef.h typedef's PSZ to char *, this fools it into using PSZS instead #define PSZ PSZS #include #include #include #undef PSZ #define MIR(foo) MAKEINTRESOURCE(foo) typedef HBITMAP HBMP; typedef HENHMETAFILE HPIC; typedef HPALETTE HPAL; typedef HCURSOR HCRS; #define hBadWin INVALID_HANDLE_VALUE // some windows APIs return this #endif // WIN #define size(foo) ((long)sizeof(foo)) #define offset(FOO, field) ((int)&((FOO *)0)->field) #define CvFromRgv(rgv) (size(rgv) / size(rgv[0])) #define BLOCK #ifdef DEBUG #define priv #else //! DEBUG #define priv static #endif //! DEBUG // standard scalar types typedef unsigned char byte; const byte kbMax = 0xFF; const byte kbMin = 0; typedef unsigned short ushort; const short kswMax = (short)0x7FFF; const short kswMin = -kswMax; // so -kswMin is positive const ushort ksuMax = 0xFFFF; const ushort ksuMin = 0; typedef unsigned int uint; typedef unsigned long ulong; const long klwMax = 0x7FFFFFFF; const long klwMin = -klwMax; // so -klwMin is positive const ulong kluMax = 0xFFFFFFFF; const ulong kluMin = 0; // typedef int bool; // standard character types: // schar - short (skinny) character (1 byte) // wchar - wide character (unicode) // achar - application character #ifdef MAC typedef byte schar; const schar kschMax = (schar)0xFF; const schar kschMin = (schar)0; #else //! MAC typedef char schar; const schar kschMax = (schar)0x7F; const schar kschMin = (schar)0x80; #endif //! MAC typedef ushort wchar; const wchar kwchMax = ksuMax; const wchar kwchMin = ksuMin; #ifdef UNICODE typedef wchar achar; typedef unsigned short uchar; const achar kchMax = kwchMax; const achar kchMin = kwchMin; #define PszLit(sz) L##sz #define ChLit(ch) L##ch #else //! UNICODE typedef schar achar; typedef unsigned char uchar; const achar kchMax = kschMax; const achar kchMin = kschMin; #define PszLit(sz) sz #define ChLit(ch) ch #endif //! UNICODE typedef class GRPB *PGRPB; typedef class GLB *PGLB; typedef class GL *PGL; typedef class AL *PAL; typedef class GGB *PGGB; typedef class GG *PGG; typedef class AG *PAG; typedef class GSTB *PGSTB; typedef class GST *PGST; typedef class AST *PAST; typedef class SCPT *PSCPT; typedef class BLCK *PBLCK; #include "framedef.h" #include "debug.h" #include "base.h" #include "utilint.h" #include "utilcopy.h" #include "utilstr.h" #include "utilmem.h" #include "fni.h" #include "file.h" #include "groups.h" #include "utilerro.h" #include "chunk.h" #include "utilrnd.h" #include "crf.h" #include "codec.h" // optional #include "stream.h" #include "lex.h" #include "scrcom.h" #include "screxe.h" #include "chse.h" #include "midi.h" #include "utilglob.h" #endif //! UTIL_H ================================================ FILE: kauai/src/utilcopy.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Data movement routines. WARNING: Must be in a fixed (pre-loaded) seg on Mac. ***************************************************************************/ #include "util.h" ASSERTNAME /*************************************************************************** Fill a block with a specific byte value. ***************************************************************************/ void FillPb(void *pv, long cb, byte b) { AssertIn(cb, 0, kcbMax); AssertPvCb(pv, cb); #ifdef IN_80386 __asm { // Setup the registers for using REP STOS instruction to set memory. // NOTE: Alignment does not effect the speed of STOS. // // edi -> memory to set // eax = value to store in destination // direction flag is clear for auto-increment mov edi,pv mov al,b // set the longs mov ecx,cb shr ecx,2 jz LBytes shl eax,8 mov al,b mov ebx,eax shl eax,16 mov ax,bx rep stosd // set the extra bytes LBytes: mov ecx,cb and ecx,3 rep stosb } #else //! IN_80386 byte *pb; for (pb = (byte *)pv; cb != 0; cb--) *pb++ = b; #endif //! IN_80386 } /*************************************************************************** Clear a block. ***************************************************************************/ void ClearPb(void *pv, long cb) { AssertIn(cb, 0, kcbMax); AssertPvCb(pv, cb); #ifdef IN_80386 __asm {// Setup the registers for using REP STOS instruction to set memory. // NOTE: Alignment does not effect the speed of STOS. // // edi -> memory to set // eax = value to store in destination // direction flag is clear for auto-increment mov edi,pv xor eax,eax // clear the longs mov ecx,cb shr ecx,2 rep stosd // clear the extra bytes mov ecx,cb and ecx,3 rep stosb } #else //! IN_80386 byte *pb; for (pb = (byte *)pv; cb != 0; cb--) *pb++ = 0; #endif //! IN_80386 } /*************************************************************************** Reverse a block. Useful for exchanging two blocks or avoiding recursion. ***************************************************************************/ void ReversePb(void *pv, long cb) { AssertIn(cb, 0, kcbMax); AssertPvCb(pv, cb); #ifdef IN_80386 __asm { // esi - high end of block // edi - low end of block // ecx - number of bytes to swap mov edi,pv mov esi,edi add esi,cb mov ecx,cb shr ecx,1 or ecx,ecx jz LDone LLoop: dec esi mov al,[edi] mov bl,[esi] mov [edi],bl mov [esi],al inc edi dec ecx jnz LLoop LDone: } #else //! IN_80386 byte *pb1, *pb2; byte b; for (pb2 = (pb1 = (byte *)pv) + cb - 1; pb1 < pb2;) { b = *pb1; *pb1++ = *pb2; *pb2-- = b; } #endif //! IN_80386 } /*************************************************************************** Reverse a list of shorts. ***************************************************************************/ void ReverseRgsw(void *pv, long csw) { AssertIn(csw, 0, kcbMax); AssertPvCb(pv, csw * size(short)); #ifdef IN_80386 __asm { // esi - high end of block // edi - low end of block // ecx - number of shorts to swap mov edi,pv mov esi,edi mov ecx,csw shl ecx,1 add esi,ecx shr ecx,2 or ecx,ecx jz LDone LLoop: sub esi,2 mov ax,[edi] mov bx,[esi] mov [edi],bx mov [esi],ax add edi,2 dec ecx jnz LLoop LDone: } #else //! IN_80386 long *psw1, *psw2; long sw; for (psw2 = (psw1 = reinterpret_cast(pv)) + csw - 1; psw1 < psw2;) { sw = *psw1; *psw1++ = *psw2; *psw2-- = sw; } #endif //! IN_80386 } /*************************************************************************** Reverse a list of longs. ***************************************************************************/ void ReverseRglw(void *pv, long clw) { AssertIn(clw, 0, kcbMax); AssertPvCb(pv, clw * size(long)); #ifdef IN_80386 __asm { // esi - high end of block // edi - low end of block // ecx - number of longs to swap mov edi,pv mov esi,edi mov ecx,clw shl ecx,2 add esi,ecx shr ecx,3 or ecx,ecx jz LDone LLoop: sub esi,4 mov eax,[edi] mov ebx,[esi] mov [edi],ebx mov [esi],eax add edi,4 dec ecx jnz LLoop LDone: } #else //! IN_80386 long *plw1, *plw2; long lw; for (plw2 = (plw1 = (long *)pv) + clw - 1; plw1 < plw2;) { lw = *plw1; *plw1++ = *plw2; *plw2-- = lw; } #endif //! IN_80386 } /*************************************************************************** Swap two adjacent blocks of size cb1 and cb2 respectively. ***************************************************************************/ void SwapBlocks(void *pv, long cb1, long cb2) { AssertIn(cb1, 0, kcbMax); AssertIn(cb2, 0, kcbMax); AssertPvCb(pv, cb1 + cb2); ReversePb(pv, cb1); ReversePb(PvAddBv(pv, cb1), cb2); ReversePb(pv, cb1 + cb2); } /*************************************************************************** Swap the contents of two blocks of the same size. ***************************************************************************/ void SwapPb(void *pv1, void *pv2, long cb) { AssertPvCb(pv1, cb); AssertPvCb(pv2, cb); AssertIn(cb, 0, kcbMax); #ifdef IN_80386 __asm { // edi -> memory to swap, first pointer // esi -> memory to swap, second pointer mov edi,pv1 mov esi,pv2 mov ecx,cb shr ecx,2 jz LBytes LLongLoop: mov eax,[edi] mov ebx,[esi] mov [edi],ebx mov [esi],eax add edi,4 add esi,4 dec ecx jnz LLongLoop; LBytes: mov ecx,cb and ecx,3 jz LDone LByteLoop: mov al,[edi] mov bl,[esi] mov [edi],bl mov [esi],al inc edi inc esi dec ecx jnz LByteLoop LDone: } #else //! IN_80386 byte *pb1 = (byte *)pv1; byte *pb2 = (byte *)pv2; byte b; Assert(pb1 + cb <= pb2 || pb2 + cb <= pb1, "blocks overlap"); while (cb-- > 0) { b = *pb1; *pb1++ = *pb2; *pb2++ = b; } #endif //! IN_80386 } /*************************************************************************** Move the entry at ivSrc to be immediately before the element that is currently at ivTarget. If ivTarget > ivSrc, the entry actually ends up at (ivTarget - 1) and the entry at ivTarget doesn't move. If ivTarget < ivSrc, the entry ends up at ivTarget and the entry at ivTarget moves to (ivTarget + 1). Everything in between is shifted appropriately. prgv is the array of elements and cbElement is the size of each element. ***************************************************************************/ void MoveElement(void *prgv, long cbElement, long ivSrc, long ivTarget) { AssertIn(cbElement, 0, kcbMax); AssertIn(ivSrc, 0, kcbMax); AssertIn(ivTarget, 0, kcbMax); AssertPvCb(prgv, LwMul(cbElement, ivSrc + 1)); AssertPvCb(prgv, LwMul(cbElement, ivTarget)); if (ivTarget == ivSrc || ivTarget == ivSrc + 1) return; // swap the blocks if (ivSrc < ivTarget) { SwapBlocks(PvAddBv(prgv, LwMul(ivSrc, cbElement)), cbElement, LwMul(ivTarget - 1 - ivSrc, cbElement)); } else { SwapBlocks(PvAddBv(prgv, LwMul(ivTarget, cbElement)), LwMul(ivSrc - ivTarget, cbElement), cbElement); } } /*************************************************************************** Check for equality of two blocks. ***************************************************************************/ bool FEqualRgb(void *pv1, void *pv2, long cb) { AssertIn(cb, 0, kcbMax); AssertPvCb(pv1, cb); AssertPvCb(pv2, cb); #ifdef IN_80386 tribool fRet; __asm { // edi -> memory to compare, first pointer // esi -> memory to compare, second pointer xor eax,eax // assume false return mov edi,pv1 mov esi,pv2 // compare longs mov ecx,cb // (ecx) = length in bytes shr ecx,2 // (ecx) = length in longs repe cmpsd // compare longs jnz LDone // mismatch, go report // compare extra bytes mov ecx,cb and ecx,3 // (ecx) = length mod 4 repe cmpsb // compare odd bytes jnz LDone // mismatch, go report inc eax // successful compare LDone: mov fRet,eax } return fRet; #else //! IN_80386 byte *pb1 = (byte *)pv1; byte *pb2 = (byte *)pv2; while (cb != 0 && *pb1++ == *pb2++) cb--; return cb == 0; #endif //! IN_80386 } /*************************************************************************** Compare the two buffers byte for byte and return a the number of bytes that match. ***************************************************************************/ long CbEqualRgb(void *pv1, void *pv2, long cb) { AssertIn(cb, 0, kcbMax); AssertPvCb(pv1, cb); AssertPvCb(pv2, cb); #ifdef IN_80386 byte *pb; __asm { // edi -> memory to swap, first pointer // esi -> memory to swap, second pointer mov edi,pv1 mov esi,pv2 // compare extra bytes. mov ecx,cb and ecx,3 // (ecx) = length mod 4 repe cmpsb // compare odd bytes jnz LMiss // mismatch, go report how far we got // compare longs mov ecx,cb // (ecx) = length in bytes shr ecx,2 // (ecx) = length in longs repe cmpsd // compare longs jz LHit // matched all the way // esi (and edi) points to the long after the one which caused the // mismatch. Back up 1 long and find the byte. Since we know the // long didn't match, we can assume one of the bytes won't. sub esi,4 // back up sub edi,4 // back up mov ecx,5 // ensure that ecx doesn't count out repe cmpsb // find mismatch byte // esi points to the byte after the one that did not match. LMiss: dec esi dec edi mov pb,edi } return pb - (byte *)pv1; LHit: // We matched all the way to the end. return cb; #else //! IN_80386 byte *pb1 = (byte *)pv1; byte *pb2 = (byte *)pv2; for (; cb-- > 0 && *pb1 == *pb2; pb1++, pb2++) ; return pb1 - (byte *)pv1; #endif //! IN_80386 } /*************************************************************************** Compare the two buffers byte for byte and return an fcmp indicating their relationship to each other. ***************************************************************************/ ulong FcmpCompareRgb(void *pv1, void *pv2, long cb) { AssertIn(cb, 0, kcbMax); AssertPvCb(pv1, cb); AssertPvCb(pv2, cb); long cbMatch = CbEqualRgb(pv1, pv2, cb); AssertIn(cbMatch, 0, cb + 1); if (cb == cbMatch) return fcmpEq; return ((byte *)pv1)[cbMatch] < ((byte *)pv2)[cbMatch] ? fcmpLt : fcmpGt; } /*************************************************************************** Copy data without overlap. ****************************************************************************/ void CopyPb(void *pv1, void *pv2, long cb) { AssertIn(cb, 0, kcbMax); AssertPvCb(pv1, cb); AssertPvCb(pv2, cb); Assert((byte *)pv1 + cb <= (byte *)pv2 || (byte *)pv2 + cb <= (byte *)pv1, "blocks overlap"); #ifdef IN_80386 __asm {// Setup the registers for using REP MOVS instruction to move memory. // // esi -> memory to move // edi -> destination of move // direction flag is clear for auto-increment mov esi,pv1 mov edi,pv2 // move the longs mov ecx,cb shr ecx,2 rep movsd // move the extra bytes mov ecx,cb and ecx,3 rep movsb } #else //! IN_80386 byte *pb1 = (byte *)pv1; byte *pb2 = (byte *)pv2; while (cb-- != 0) *pb2++ = *pb1++; #endif //! IN_80386 } /*************************************************************************** Copy data with possible overlap. ***************************************************************************/ void BltPb(void *pv1, void *pv2, long cb) { AssertIn(cb, 0, kcbMax); AssertPvCb(pv1, cb); AssertPvCb(pv2, cb); #ifdef IN_80386 __asm { // Setup the registers for using REP MOVS instruction to move memory. // // esi -> memory to move // edi -> destination of move // direction flag is clear for auto-increment mov esi,pv1 mov edi,pv2 mov ecx,cb cmp esi,edi ja LForward // if source > destination je LDone // if source == destination // source < destination, see if they overlap mov eax,edi sub eax,esi cmp ecx,eax jbe LForward // they overlap with source < destination, so have to do a backward copy std add esi,ecx add edi,ecx dec esi dec edi // move the extra bytes and ecx,3 rep movsb // move the longs mov ecx,cb shr ecx,2 jz LDone sub esi,3 sub edi,3 rep movsd jmp LDone LForward: // move the longs shr ecx,2 rep movsd // move the extra bytes mov ecx,cb and ecx,3 rep movsb LDone: cld } #else //! IN_80386 byte *pb1 = (byte *)pv1; byte *pb2 = (byte *)pv2; if (pb1 > pb2) { while (cb-- != 0) *pb2++ = *pb1++; } else { pb1 += cb; pb2 += cb; while (cb-- != 0) *--pb2 = *--pb1; } #endif //! IN_80386 } ================================================ FILE: kauai/src/utilcopy.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Data movement declarations ***************************************************************************/ #ifndef UTILCOPY_H #define UTILCOPY_H void BltPb(void *pv1, void *pv2, long cb); void CopyPb(void *pv1, void *pv2, long cb); void ClearPb(void *pv, long cb); void FillPb(void *pv1, long cb, byte b); void ReversePb(void *pv, long cb); void ReverseRgsw(void *pv, long csw); void ReverseRglw(void *pv, long clw); void SwapBlocks(void *pv, long cb1, long cb2); void SwapPb(void *pv1, void *pv2, long cb); void MoveElement(void *prgv, long cbElement, long ivSrc, long ivTarget); bool FEqualRgb(void *pv1, void *pv2, long cb); long CbEqualRgb(void *pv1, void *pv2, long cbMax); ulong FcmpCompareRgb(void *pv1, void *pv2, long cb); #ifdef DEBUG #define SwapVars(pv1, pv2) \ if (size(*pv1) != size(*pv2)) \ Bug("sizes don't match"); \ else \ SwapPb(pv1, pv2, size(*pv1)) #else //! DEBUG #define SwapVars(pv1, pv2) SwapPb(pv1, pv2, size(*pv1)) #endif //! DEBUG #endif // UTILCOPY_H ================================================ FILE: kauai/src/utilerro.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Error registration and reporting. Uses a stack of error code. Not based on lists (which seem like an obvious choice), since we don't want to do any allocation when registering an error. ***************************************************************************/ #include "util.h" ASSERTNAME ERS _ers; ERS *vpers = &_ers; RTCLASS(ERS) /*************************************************************************** Initialize the error code stack. ***************************************************************************/ ERS::ERS(void) { _cerd = 0; } /*************************************************************************** Push an error code onto the stack. If overflow occurs, blt the top kcerdMax - 1 entries down by one (and lose the bottom entry). ***************************************************************************/ #ifdef DEBUG void ERS::Push(long erc, PSZS pszsFile, long lwLine) #else //! DEBUG void ERS::Push(long erc) #endif //! DEBUG { AssertThis(0); #ifdef DEBUG STN stn; SZS szs; stn.FFormatSz(PszLit("Error %d"), erc); stn.GetSzs(szs); WarnProc(pszsFile, lwLine, szs); #endif // DEBUG _mutx.Enter(); if (_cerd > 0 && erc == _rgerd[_cerd - 1].erc) goto LDone; if (_cerd == kcerdMax) { Warn("Warning: error code stack has filled"); BltPb(_rgerd + 1, _rgerd, LwMul(size(_rgerd[0]), kcerdMax - 1)); _cerd--; } #ifdef DEBUG _rgerd[_cerd].pszsFile = pszsFile; _rgerd[_cerd].lwLine = lwLine; #endif // DEBUG _rgerd[_cerd++].erc = erc; LDone: _mutx.Leave(); AssertThis(0); } /*************************************************************************** Pop the top error from the stack. Return fFalse if underflow. ***************************************************************************/ bool ERS::FPop(long *perc) { AssertThis(0); AssertNilOrVarMem(perc); _mutx.Enter(); if (_cerd == 0) { TrashVar(perc); _mutx.Leave(); return fFalse; } --_cerd; if (pvNil != perc) *perc = _rgerd[_cerd].erc; _mutx.Leave(); AssertThis(0); return fTrue; } /*************************************************************************** Clear the error stack. ***************************************************************************/ void ERS::Clear(void) { AssertThis(0); _mutx.Enter(); _cerd = 0; _mutx.Leave(); } /*************************************************************************** Return the size of the error stack. ***************************************************************************/ long ERS::Cerc(void) { AssertThis(0); return _cerd; } /*************************************************************************** See if the given error code is on the stack. ***************************************************************************/ bool ERS::FIn(long erc) { AssertThis(0); long ierd; _mutx.Enter(); for (ierd = 0; ierd < _cerd; ierd++) { if (_rgerd[ierd].erc == erc) { _mutx.Leave(); return fTrue; } } _mutx.Leave(); return fFalse; } /*************************************************************************** Return the i'th entry. ***************************************************************************/ long ERS::ErcGet(long ierc) { AssertThis(0); long erc; _mutx.Enter(); if (!::FIn(ierc, 0, _cerd)) erc = ercNil; else erc = _rgerd[ierc].erc; _mutx.Leave(); return erc; } /*************************************************************************** Flush all instances of the given error code from the error stack. ***************************************************************************/ void ERS::Flush(long erc) { AssertThis(0); long ierdSrc, ierdDst; _mutx.Enter(); for (ierdSrc = ierdDst = 0; ierdSrc < _cerd; ierdSrc++) { if (_rgerd[ierdSrc].erc != erc) { if (ierdDst < ierdSrc) _rgerd[ierdDst] = _rgerd[ierdSrc]; ierdDst++; } } _cerd = ierdDst; _mutx.Leave(); } #ifdef DEBUG /*************************************************************************** Assert the error stack is valid. ***************************************************************************/ void ERS::AssertValid(ulong grf) { ERS_PAR::AssertValid(0); AssertIn(_cerd, 0, kcerdMax + 1); } #endif // DEBUG ================================================ FILE: kauai/src/utilerro.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /****************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Error registration and reporting. All error codes go here. ******************************************************************************/ #ifndef UTILERROR_H #define UTILERROR_H const long kcerdMax = 20; /*************************************************************************** Error stack class ***************************************************************************/ #define ERS_PAR BASE #define kclsERS 'ERS' class ERS : public ERS_PAR { RTCLASS_DEC ASSERT private: struct ERD { long erc; #ifdef DEBUG PSZS pszsFile; long lwLine; #endif // DEBUG }; MUTX _mutx; long _cerd; ERD _rgerd[kcerdMax]; public: ERS(void); #ifdef DEBUG virtual void Push(long erc, schar *pszsFile, long lwLine); #else //! DEBUG virtual void Push(long erc); #endif //! DEBUG virtual bool FPop(long *perc = pvNil); virtual bool FIn(long erc); virtual long Cerc(void); virtual long ErcGet(long ierc); virtual void Clear(void); virtual void Flush(long erc); }; extern ERS *vpers; #ifdef DEBUG #define PushErc(erc) vpers->Push(erc, __szsFile, __LINE__) #else //! DEBUG #define PushErc(erc) vpers->Push(erc) #endif //! DEBUG #endif //! UTILERROR_H ================================================ FILE: kauai/src/utilglob.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Contains the declarations of all globals used by util. The order of the globals within this file is critical. C++ specifies that constructors get called in source order within a module. It leaves construction order unspecified between modules. The mutexes at the top of this file should be constructed before anything else in the app. One way to guarantee this is for all globals to be in a single module. The app's global .cpp file can include utilglob.cpp (before any of its global declarations). For the MSVC tools, constructors seem to be executed in link order. ***************************************************************************/ #include "util.h" ASSERTNAME RTCLASS(USAC) // Allocate globals in utilglob before any other globals to avoid crashes on exit #pragma init_seg(lib) #ifdef DEBUG // protects our debug linked list object management MUTX vmutxBase; #endif // DEBUG MUTX vmutxMem; // Shuffler and random number generator for the script interpreter SFL vsflUtil; RND vrndUtil; // Standard Kauai codec KCDC vkcdcUtil; // Standard compression manager - gets initialized with the standard // Kauai codec. Clients can add additional codecs or redirect vpcodmUtil // to a different compression manager with their own codecs CODM vcodmUtil(&vkcdcUtil, kcfmtKauai2); PCODM vpcodmUtil = &vcodmUtil; // Standard scalable application clok. USAC _usac; PUSAC vpusac = &_usac; #ifdef DEBUG // Debug memory globals DMGLOB vdmglob; #endif // DEBUG ================================================ FILE: kauai/src/utilglob.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation These are globals common to the util layer. ***************************************************************************/ #ifndef UTILGLOB_H #define UTILGLOB_H /*************************************************************************** Universal scalable application clock and other time stuff ***************************************************************************/ const ulong kdtsSecond = MacWin(60, 1000); const ulong kluTimeScaleNormal = 0x00010000; typedef class USAC *PUSAC; #define USAC_PAR BASE #define kclsUSAC 'USAC' class USAC : public USAC_PAR { RTCLASS_DEC private: ulong _tsBaseSys; // base system time ulong _tsBaseApp; // base application time ulong _luScale; public: USAC(void); ulong TsCur(void); void Scale(ulong luScale); ulong LuScale(void) { return _luScale; } void Jump(ulong dtsJump) { _tsBaseApp += dtsJump; } }; extern PUSAC vpusac; inline ulong TsCurrent(void) { return vpusac->TsCur(); } inline ulong TsCurrentSystem(void) { // n.b. WIN: timeGetTime is more accurate than GetTickCount return MacWin(TickCount(), timeGetTime()); } inline ulong DtsCaret(void) { return MacWin(GetCaretTime(), GetCaretBlinkTime()); } /*************************************************************************** Mutexes to protect various global linked lists, etc. ***************************************************************************/ #ifdef DEBUG extern MUTX vmutxBase; #endif // DEBUG extern MUTX vmutxMem; /*************************************************************************** Global random number generator and shuffler. These are used by the script interpreter. ***************************************************************************/ extern SFL vsflUtil; extern RND vrndUtil; /*************************************************************************** Global standard Kauai codec, compression manager, and pointer to a compression manager. The blck-level compression uses vpcodmUtil. Clients are free to redirect this to their own compression manager. ***************************************************************************/ extern KCDC vkcdcUtil; extern CODM vcodmUtil; extern PCODM vpcodmUtil; /*************************************************************************** Debug memory globals ***************************************************************************/ #ifdef DEBUG extern DMGLOB vdmglob; #endif // DEBUG #endif //! UTILGLOB_H ================================================ FILE: kauai/src/utilint.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Integer, rectangle and point utilities. WARNING: Must be in a fixed (pre-loaded) seg on Mac. ***************************************************************************/ #include "util.h" #include ASSERTNAME /*************************************************************************** Calculates the GCD of two longs. ***************************************************************************/ long LwGcd(long lw1, long lw2) { return LuGcd(LwAbs(lw1), LwAbs(lw2)); } /*************************************************************************** Calculates the GCD of two unsigned longs. ***************************************************************************/ ulong LuGcd(ulong lu1, ulong lu2) { // Euclidean algorithm - keep mod'ing until we hit zero if (lu1 == 0) { // if both are zero, return 1. return lu2 == 0 ? 1 : lu2; } for (;;) { lu2 %= lu1; if (lu2 == 0) return lu1 == 0 ? 1 : lu1; lu1 %= lu2; if (lu1 == 0) return lu2; } } /*************************************************************************** Sort the two longs so the smaller is in *plw1. ***************************************************************************/ void SortLw(long *plw1, long *plw2) { if (*plw1 > *plw2) { long lwT = *plw1; *plw1 = *plw2; *plw2 = lwT; } } #ifndef MC_68020 // 68020 version in utilmc.asm #ifndef IN_80386 // 80386 version inline in utilint.h /*************************************************************************** Multiply lw by lwMul and divide by lwDiv without losing precision. ***************************************************************************/ long LwMulDiv(long lw, long lwMul, long lwDiv) { Assert(lwDiv != 0, "divide by zero error"); double dou; dou = (double)lw * lwMul / lwDiv; Assert(dou <= klwMax && dou >= klwMin, "overflow in LwMulDiv"); return (long)dou; } /*************************************************************************** Return the quotient and set *plwRem to the remainder when (lw * lwMul) is divided by lwDiv. ***************************************************************************/ long LwMulDivMod(long lw, long lwMul, long lwDiv, long *plwRem) { Assert(lwDiv != 0, "moding by 0"); AssertVarMem(plwRem); double dou; dou = (double)lw * lwMul; *plwRem = static_cast(std::fmod(dou, lwDiv)); dou /= lwDiv; Assert(dou <= klwMax && dou >= klwMin, "overflow in LwMulDiv"); return (long)dou; } #endif // IN_80386 /*************************************************************************** Multiply two longs to get a 64 bit (signed) result. ***************************************************************************/ void MulLw(long lw1, long lw2, long *plwHigh, ulong *pluLow) { #ifdef IN_80386 __asm { mov eax,lw1 imul lw2 mov ebx,plwHigh mov [ebx],edx mov ebx,pluLow mov [ebx],eax } #else //! IN_80386 double dou; bool fNeg; fNeg = 0 > (dou = (double)lw1 * lw2); if (fNeg) dou = -dou; *plwHigh = (long)(dou / ((double)0x10000 * 0x10000)); *pluLow = dou - *plwHigh * ((double)0x10000 * 0x10000); if (fNeg) { if (*pluLow == 0) *plwHigh = -*plwHigh; else { *pluLow = -*pluLow; *plwHigh = ~*plwHigh; } } #endif //! IN_80386 } /*************************************************************************** Multiply lu by luMul and divide by luDiv without losing precision. ***************************************************************************/ ulong LuMulDiv(ulong lu, ulong luMul, ulong luDiv) { Assert(luDiv != 0, "divide by zero error"); #ifdef IN_80386 // REVIEW shonk: this will fault on overflow! __asm { mov eax,lu mul luMul div luDiv mov lu,eax } return lu; #else //! IN_80386 double dou; dou = (double)lu * luMul / luDiv; Assert(dou <= kluMax && dou >= 0, "overflow in LuMulDiv"); return (ulong)dou; #endif //! IN_80386 } /*************************************************************************** Multiply two unsigned longs to get a 64 bit (unsigned) result. ***************************************************************************/ void MulLu(ulong lu1, ulong lu2, ulong *pluHigh, ulong *pluLow) { #ifdef IN_80386 __asm { mov eax,lu1 mul lu2 mov ebx,pluHigh mov [ebx],edx mov ebx,pluLow mov [ebx],eax } #else //! IN_80386 double dou; dou = (double)lu1 * lu2; *pluHigh = (ulong)(dou / ((double)0x10000 * 0x10000)); *pluLow = dou - *pluHigh * ((double)0x10000 * 0x10000); #endif //! IN_80386 } #endif //! MC_68020 /*************************************************************************** Does a multiply and divide without losing precision, rounding away from zero during the divide. ***************************************************************************/ long LwMulDivAway(long lw, long lwMul, long lwDiv) { Assert(lwDiv != 0, "divide by zero error"); long lwT, lwRem; lwT = LwMulDivMod(lw, lwMul, lwDiv, &lwRem); if (lwRem != 0) { // divide wasn't exact if (lwT < 0) lwT--; else lwT++; } return lwT; } /*************************************************************************** Does a multiply and divide without losing precision, rounding away from zero during the divide. ***************************************************************************/ ulong LuMulDivAway(ulong lu, ulong luMul, ulong luDiv) { Assert(luDiv != 0, "divide by zero error"); ulong luT; // get rid of common factors if (1 < (luT = LuGcd(lu, luDiv))) { lu /= luT; luDiv /= luT; } if (1 < (luT = LuGcd(luMul, luDiv))) { luMul /= luT; luDiv /= luT; } return LuMulDiv(lu, luMul, luDiv) + (luDiv > 1); } /*************************************************************************** Returns lwNum divided by lwDen rounded away from zero. ***************************************************************************/ long LwDivAway(long lwNum, long lwDen) { Assert(lwDen != 0, "divide by zero"); // make sure lwDen is greater than zero if (lwDen < 0) { lwDen = -lwDen; lwNum = -lwNum; } if (lwNum < 0) lwNum -= (lwDen - 1); else lwNum += (lwDen - 1); return lwNum / lwDen; } /*************************************************************************** Returns lwNum divided by lwDen rounded toward the closest integer. ***************************************************************************/ long LwDivClosest(long lwNum, long lwDen) { Assert(lwDen != 0, "divide by zero"); // make sure lwDen is greater than zero if (lwDen < 0) { lwDen = -lwDen; lwNum = -lwNum; } if (lwNum < 0) lwNum -= lwDen / 2; else lwNum += lwDen / 2; return lwNum / lwDen; } /*************************************************************************** Rounds lwSrc to a multiple of lwBase. The rounding is done away from zero. Equivalent to LwDivAway(lwSrc, lwBase) * lwBase. ***************************************************************************/ long LwRoundAway(long lwSrc, long lwBase) { Assert(lwBase != 0, "divide by zero"); // make sure lwBase is greater than zero if (lwBase < 0) lwBase = -lwBase; if (lwSrc < 0) lwSrc -= (lwBase - 1); else lwSrc += (lwBase - 1); return lwSrc - (lwSrc % lwBase); } /*************************************************************************** Rounds lwSrc to a multiple of lwBase. The rounding is done toward zero. Equivalent to (lwSrc / lwBase) * lwBase. ***************************************************************************/ long LwRoundToward(long lwSrc, long lwBase) { Assert(lwBase != 0, "divide by zero"); // make sure lwBase is greater than zero if (lwBase < 0) lwBase = -lwBase; return lwSrc - (lwSrc % lwBase); } /*************************************************************************** Rounds lwSrc to the closest multiple of lwBase. Equivalent to LwDivClosest(lwSrc, lwBase) * lwBase. ***************************************************************************/ long LwRoundClosest(long lwSrc, long lwBase) { Assert(lwBase != 0, "divide by zero"); // make sure lwBase is greater than zero if (lwBase < 0) lwBase = -lwBase; if (lwSrc < 0) lwSrc -= lwBase / 2; else lwSrc += lwBase / 2; return lwSrc - (lwSrc % lwBase); } /*************************************************************************** Returns fcmpGt, fcmpEq or fcmpLt according to whether (lwNum1 / lwDen2) is greater than, equal to or less than (lwNum2 / lwDen2). ***************************************************************************/ ulong FcmpCompareFracs(long lwNum1, long lwDen1, long lwNum2, long lwDen2) { long lwHigh1, lwHigh2; // must be signed ulong luLow1, luLow2; // must be unsigned MulLw(lwNum1, lwDen2, &lwHigh1, &luLow1); MulLw(lwNum2, lwDen1, &lwHigh2, &luLow2); if (lwHigh1 > lwHigh2) return fcmpGt; if (lwHigh1 < lwHigh2) return fcmpLt; // the high 32 bits are the same, so just compare the low 32 bits // (as unsigned longs) Assert(lwHigh1 == lwHigh2, 0); if (luLow1 > luLow2) return fcmpGt; if (luLow1 < luLow2) return fcmpLt; return fcmpEq; } /*************************************************************************** Adjusts an index after an edit. *piv is the index to adjust, iv is the index where the edit occurred, cvIns is the number of things inserted and cvDel is the number deleted. Returns true iff *piv is not in (iv, iv + cvDel). If *piv is in this interval, mins *piv with iv + cvIns and returns false. ***************************************************************************/ bool FAdjustIv(long *piv, long iv, long cvIns, long cvDel) { AssertVarMem(piv); AssertIn(iv, 0, kcbMax); AssertIn(cvIns, 0, kcbMax); AssertIn(cvDel, 0, kcbMax); if (*piv <= iv) return fTrue; if (*piv < iv + cvDel) { *piv = LwMin(*piv, iv + cvIns); return fFalse; } *piv += cvIns - cvDel; return fTrue; } #ifdef DEBUG /*************************************************************************** Multiplies two longs. Asserts on overflow. ***************************************************************************/ long LwMul(long lw1, long lw2) { if (lw1 == 0) return 0; Assert((lw1 * lw2) / lw1 == lw2, "overflow"); return lw1 * lw2; } /*************************************************************************** Asserts that the lw is >= lwMin and < lwLim. ***************************************************************************/ void AssertIn(long lw, long lwMin, long lwLim) { Assert(lw >= lwMin, "long too small"); Assert(lw < lwLim, "long too big"); } #endif // DEBUG /*************************************************************************** Swap bytes in pv according to bom. bom consists of up to 16 2-bit opcodes (packed from hi bit to low bit). The high bit of each opcode indicates a long field (1) or short field (0). The low bit of each opcode indicates whether the bytes are to be swapped in the field (1) or left alone (0). ***************************************************************************/ void SwapBytesBom(void *pv, BOM bom) { byte b; byte *pb = (byte *)pv; Assert(size(short) == 2 && size(long) == 4, "code broken"); while (bom != 0) { if (bom & 0x80000000L) { // long field AssertPvCb(pb, 4); if (bom & 0x40000000L) { b = pb[3]; pb[3] = pb[0]; pb[0] = b; b = pb[2]; pb[2] = pb[1]; pb[1] = b; } pb += 4; } else { // short field AssertPvCb(pb, 2); if (bom & 0x40000000L) { b = pb[1]; pb[1] = pb[0]; pb[0] = b; } pb += 2; } bom <<= 2; } } /*************************************************************************** Swap bytes within an array of short words. ***************************************************************************/ void SwapBytesRgsw(void *psw, long csw) { AssertIn(csw, 0, kcbMax); AssertPvCb(psw, LwMul(csw, size(short))); byte b; byte *pb = (byte *)psw; Assert(size(short) == 2, "code broken"); for (; csw > 0; csw--, pb += 2) { b = pb[1]; pb[1] = pb[0]; pb[0] = b; } } /*************************************************************************** Swap bytes within an array of long words. ***************************************************************************/ void SwapBytesRglw(void *plw, long clw) { AssertIn(clw, 0, kcbMax); AssertPvCb(plw, LwMul(clw, size(long))); byte b; byte *pb = (byte *)plw; Assert(size(long) == 4, "code broken"); for (; clw > 0; clw--, pb += 4) { b = pb[3]; pb[3] = pb[0]; pb[0] = b; b = pb[2]; pb[2] = pb[1]; pb[1] = b; } } #ifdef DEBUG /*************************************************************************** Asserts that the given BOM indicates a struct having cb/size(long) longs to be swapped (so SwapBytesRglw can legally be used on an array of these). ***************************************************************************/ void AssertBomRglw(BOM bom, long cb) { BOM bomT; long clw; clw = cb / size(long); Assert(cb == clw * size(long), "cb is not a multiple of size(long)"); AssertIn(clw, 1, 17); bomT = -1L << 2 * (16 - clw); Assert(bomT == bom, "wrong bom"); } /*************************************************************************** Asserts that the given BOM indicates a struct having cb/size(short) shorts to be swapped (so SwapBytesRgsw can legally be used on an array of these). ***************************************************************************/ void AssertBomRgsw(BOM bom, long cb) { BOM bomT; long csw; csw = cb / size(short); Assert(cb == csw * size(short), "cb is not a multiple of size(short)"); AssertIn(csw, 1, 17); bomT = 0x55555555 << 2 * (16 - csw); Assert(bomT == bom, "wrong bom"); } #endif // DEBUG /*************************************************************************** Truncates a util point to a system point. REVIEW shonk: should we assert on truncation? Should we truncate on windows? ***************************************************************************/ PT::operator PTS(void) { AssertThisMem(); PTS pts; MacWin(pts.h, pts.x) = SwTruncLw(xp); MacWin(pts.v, pts.y) = SwTruncLw(yp); return pts; } /*************************************************************************** Copies a system point to a util point. ***************************************************************************/ PT &PT::operator=(PTS &pts) { AssertThisMem(); xp = MacWin(pts.h, pts.x); yp = MacWin(pts.v, pts.y); return *this; } /*************************************************************************** Map a point from prcSrc coordinates to prcDst coordinates. ***************************************************************************/ void PT::Map(RC *prcSrc, RC *prcDst) { AssertThisMem(); AssertVarMem(prcSrc); AssertVarMem(prcDst); long dzpSrc, dzpDst; if ((dzpDst = prcDst->Dxp()) == (dzpSrc = prcSrc->Dxp())) { AssertVar(dzpSrc > 0, "empty map rectangle", prcSrc); xp += prcDst->xpLeft - prcSrc->xpLeft; } else { AssertVar(dzpSrc > 0, "empty map rectangle", prcSrc); xp = prcDst->xpLeft + LwMulDiv(xp - prcSrc->xpLeft, dzpDst, dzpSrc); } if ((dzpDst = prcDst->Dyp()) == (dzpSrc = prcSrc->Dyp())) { AssertVar(dzpSrc > 0, "empty map rectangle", prcSrc); yp += prcDst->ypTop - prcSrc->ypTop; } else { AssertVar(dzpSrc > 0, "empty map rectangle", prcSrc); yp = prcDst->ypTop + LwMulDiv(yp - prcSrc->ypTop, dzpDst, dzpSrc); } } /*************************************************************************** Map a point from prcSrc coordinates to prcDst coordinates. ***************************************************************************/ PT PT::PtMap(RC *prcSrc, RC *prcDst) { AssertThisMem(); PT pt = *this; pt.Map(prcSrc, prcDst); return pt; } /*************************************************************************** Transform the xp and yp values according to grfpt. Negating comes before transposition. ***************************************************************************/ void PT::Transform(ulong grfpt) { AssertThisMem(); long zp; if (grfpt & fptNegateXp) xp = -xp; if (grfpt & fptNegateYp) yp = -yp; if (grfpt & fptTranspose) { zp = xp; xp = yp; yp = zp; } } /*************************************************************************** Check for equality, special casing empty. ***************************************************************************/ bool RC::operator==(RC &rc) { AssertThisMem(); if (FEmpty()) return rc.FEmpty(); return xpLeft == rc.xpLeft && ypTop == rc.ypTop && xpRight == rc.xpRight && ypBottom == rc.ypBottom; } /*************************************************************************** Check for non-equality, special casing empty. ***************************************************************************/ bool RC::operator!=(RC &rc) { AssertThisMem(); if (FEmpty()) return !rc.FEmpty(); return xpLeft != rc.xpLeft || ypTop != rc.ypTop || xpRight != rc.xpRight || ypBottom != rc.ypBottom; } /*************************************************************************** Unionize the rects. ***************************************************************************/ void RC::Union(RC *prc1, RC *prc2) { AssertThisMem(); AssertVarMem(prc1); AssertVarMem(prc2); *this = *prc1; Union(prc2); } /*************************************************************************** Unionize the rects. ***************************************************************************/ void RC::Union(RC *prc) { AssertThisMem(); AssertVarMem(prc); // if a rect is empty, it shouldn't contribute to the union if (!prc->FEmpty()) { if (FEmpty()) *this = *prc; else { xpLeft = LwMin(xpLeft, prc->xpLeft); xpRight = LwMax(xpRight, prc->xpRight); ypTop = LwMin(ypTop, prc->ypTop); ypBottom = LwMax(ypBottom, prc->ypBottom); } } } /*************************************************************************** Intersect the rects and return whether the result is non-empty. ***************************************************************************/ bool RC::FIntersect(RC *prc1, RC *prc2) { AssertThisMem(); AssertVarMem(prc1); AssertVarMem(prc2); xpLeft = LwMax(prc1->xpLeft, prc2->xpLeft); xpRight = LwMin(prc1->xpRight, prc2->xpRight); ypTop = LwMax(prc1->ypTop, prc2->ypTop); ypBottom = LwMin(prc1->ypBottom, prc2->ypBottom); if (FEmpty()) { Zero(); return fFalse; } return fTrue; } /*************************************************************************** Intersect this rect with the given rect and return whether the result is non-empty. ***************************************************************************/ bool RC::FIntersect(RC *prc) { AssertThisMem(); AssertVarMem(prc); xpLeft = LwMax(xpLeft, prc->xpLeft); xpRight = LwMin(xpRight, prc->xpRight); ypTop = LwMax(ypTop, prc->ypTop); ypBottom = LwMin(ypBottom, prc->ypBottom); if (FEmpty()) { Zero(); return fFalse; } return fTrue; } /*************************************************************************** Inset a rectangle (into another) ***************************************************************************/ void RC::InsetCopy(RC *prc, long dxp, long dyp) { AssertThisMem(); AssertVarMem(prc); xpLeft = prc->xpLeft + dxp; xpRight = prc->xpRight - dxp; ypTop = prc->ypTop + dyp; ypBottom = prc->ypBottom - dyp; } /*************************************************************************** Inset a rectangle (in place) ***************************************************************************/ void RC::Inset(long dxp, long dyp) { AssertThisMem(); xpLeft += dxp; xpRight -= dxp; ypTop += dyp; ypBottom -= dyp; } /*************************************************************************** Map this rectangle through the two rectangles (from prcSrc coordinates to prcDst coordinates). This cannot be either prcSrc or prcDst. ***************************************************************************/ void RC::Map(RC *prcSrc, RC *prcDst) { AssertThisMem(); AssertVarMem(prcSrc); AssertVarMem(prcDst); long dzpSrc, dzpDst; if ((dzpDst = prcDst->Dxp()) == (dzpSrc = prcSrc->Dxp())) { AssertVar(dzpSrc > 0, "empty map rectangle", prcSrc); xpLeft += prcDst->xpLeft - prcSrc->xpLeft; xpRight += prcDst->xpLeft - prcSrc->xpLeft; } else { AssertVar(dzpSrc > 0, "empty map rectangle", prcSrc); xpLeft = prcDst->xpLeft + LwMulDiv(xpLeft - prcSrc->xpLeft, dzpDst, dzpSrc); xpRight = prcDst->xpLeft + LwMulDiv(xpRight - prcSrc->xpLeft, dzpDst, dzpSrc); } if ((dzpDst = prcDst->Dyp()) == (dzpSrc = prcSrc->Dyp())) { AssertVar(dzpSrc > 0, "empty map rectangle", prcSrc); ypTop += prcDst->ypTop - prcSrc->ypTop; ypBottom += prcDst->ypTop - prcSrc->ypTop; } else { AssertVar(dzpSrc > 0, "empty map rectangle", prcSrc); ypTop = prcDst->ypTop + LwMulDiv(ypTop - prcSrc->ypTop, dzpDst, dzpSrc); ypBottom = prcDst->ypTop + LwMulDiv(ypBottom - prcSrc->ypTop, dzpDst, dzpSrc); } } /*************************************************************************** Transform the xp and yp values according to grfpt. Negating comes before transposition. ***************************************************************************/ void RC::Transform(ulong grfpt) { AssertThisMem(); long zp; if (grfpt & fptNegateXp) { zp = xpLeft; xpLeft = -xpRight; xpRight = -zp; } if (grfpt & fptNegateYp) { zp = ypTop; ypTop = -ypBottom; ypBottom = -zp; } if (grfpt & fptTranspose) { zp = xpLeft; xpLeft = ypTop; ypTop = zp; zp = xpRight; xpRight = ypBottom; ypBottom = zp; } } /*************************************************************************** Move a rectangle (into another) ***************************************************************************/ void RC::OffsetCopy(RC *prc, long dxp, long dyp) { AssertThisMem(); AssertVarMem(prc); xpLeft = prc->xpLeft + dxp; xpRight = prc->xpRight + dxp; ypTop = prc->ypTop + dyp; ypBottom = prc->ypBottom + dyp; } /*************************************************************************** Move a rectangle (in place) ***************************************************************************/ void RC::Offset(long dxp, long dyp) { AssertThisMem(); xpLeft += dxp; xpRight += dxp; ypTop += dyp; ypBottom += dyp; } /*************************************************************************** Move the rectangle so the top left is (0, 0). ***************************************************************************/ void RC::OffsetToOrigin(void) { AssertThisMem(); xpRight -= xpLeft; ypBottom -= ypTop; xpLeft = ypTop = 0; } /*************************************************************************** Move this rectangle so it is centered over *prcBase. ***************************************************************************/ void RC::CenterOnRc(RC *prcBase) { AssertThisMem(); AssertVarMem(prcBase); long dxp = Dxp(); long dyp = Dyp(); xpLeft = (prcBase->xpLeft + prcBase->xpRight - dxp) / 2; xpRight = xpLeft + dxp; ypTop = (prcBase->ypTop + prcBase->ypBottom - dyp) / 2; ypBottom = ypTop + dyp; } /*************************************************************************** Centers this rectangle on (xp, yp). ***************************************************************************/ void RC::CenterOnPt(long xp, long yp) { AssertThisMem(); long dxp = Dxp(); long dyp = Dyp(); xpLeft = xp - dxp / 2; xpRight = xpLeft + dxp; ypTop = yp - dyp / 2; ypBottom = ypTop + dyp; } /*************************************************************************** Center this rectangle over *prcBase. If it doesn't fit inside *prcBase, scale it down so it does. ***************************************************************************/ void RC::SqueezeIntoRc(RC *prcBase) { AssertThisMem(); AssertVarMem(prcBase); if (Dxp() <= prcBase->Dxp() && Dyp() <= prcBase->Dyp()) CenterOnRc(prcBase); else StretchToRc(prcBase); } /*************************************************************************** Scale this rectangle proportionally (and translate it) so it is centered on *prcBase and as large as possible but still inside *prcBase. ***************************************************************************/ void RC::StretchToRc(RC *prcBase) { AssertThisMem(); AssertVarMem(prcBase); long dxp = Dxp(); long dyp = Dyp(); long dxpBase = prcBase->Dxp(); long dypBase = prcBase->Dyp(); if (dxp <= 0 || dyp <= 0) { Bug("empty rc to stretch"); Zero(); return; } if (FcmpCompareFracs(dxp, dyp, dxpBase, dypBase) & fcmpLt) { // height dominated dxp = LwMulDiv(dxp, dypBase, dyp); dyp = dypBase; } else { // width dominated dyp = LwMulDiv(dyp, dxpBase, dxp); dxp = dxpBase; } xpRight = xpLeft + dxp; ypBottom = ypTop + dyp; CenterOnRc(prcBase); } /*************************************************************************** Determine if the given point is in the rectangle ***************************************************************************/ bool RC::FPtIn(long xp, long yp) { AssertThisMem(); return xp >= xpLeft && xp < xpRight && yp >= ypTop && yp < ypBottom; } /*************************************************************************** Pin the point to the rectangle. ***************************************************************************/ void RC::PinPt(PT *ppt) { AssertThisMem(); AssertVarMem(ppt); ppt->xp = LwBound(ppt->xp, xpLeft, xpRight); ppt->yp = LwBound(ppt->yp, ypTop, ypBottom); } /*************************************************************************** Pin this rectangle to the given one. ***************************************************************************/ void RC::PinToRc(RC *prc) { AssertThisMem(); AssertVarMem(prc); long dxp, dyp; dxp = LwMax(LwMin(0, prc->xpRight - xpRight), prc->xpLeft - xpLeft); dyp = LwMax(LwMin(0, prc->ypBottom - ypBottom), prc->ypTop - ypTop); if (dxp != 0 || dyp != 0) Offset(dxp, dyp); } /*************************************************************************** Copies a system rectangle to a util rectangle. ***************************************************************************/ RC &RC::operator=(RCS &rcs) { AssertThisMem(); xpLeft = (long)rcs.left; xpRight = (long)rcs.right; ypTop = (long)rcs.top; ypBottom = (long)rcs.bottom; return *this; } /*************************************************************************** Truncates util rectangle to a system rectangle. REVIEW shonk: should we assert on truncation? ***************************************************************************/ RC::operator RCS(void) { AssertThisMem(); RCS rcs; rcs.left = SwTruncLw(xpLeft); rcs.right = SwTruncLw(xpRight); rcs.top = SwTruncLw(ypTop); rcs.bottom = SwTruncLw(ypBottom); return rcs; } /*************************************************************************** Return the area of the rectangle. ***************************************************************************/ long RC::LwArea(void) { AssertThisMem(); if (FEmpty()) return 0; return LwMul(xpRight - xpLeft, ypBottom - ypTop); } /*************************************************************************** Return whether this rectangle fully contains *prc. ***************************************************************************/ bool RC::FContains(RC *prc) { AssertThisMem(); AssertVarMem(prc); return prc->FEmpty() || prc->xpLeft >= xpLeft && prc->xpRight <= xpRight && prc->ypTop >= ypTop && prc->ypBottom <= ypBottom; } /*************************************************************************** Imagine *prcSrc divided into a crcWidth by crcHeight grid. This sets this rc to the (ircWidth, ircHeight) cell of the grid. prcSrc cannot be equal to this. ***************************************************************************/ void RC::SetToCell(RC *prcSrc, long crcWidth, long crcHeight, long ircWidth, long ircHeight) { AssertThisMem(); AssertVarMem(prcSrc); AssertIn(crcWidth, 1, kcbMax); AssertIn(crcHeight, 1, kcbMax); AssertIn(ircWidth, 0, crcWidth); AssertIn(ircHeight, 0, crcHeight); Assert(this != prcSrc, "this can't be prcSrc"); xpLeft = prcSrc->xpLeft + LwMulDiv(prcSrc->Dxp(), ircWidth, crcWidth); xpRight = prcSrc->xpLeft + LwMulDiv(prcSrc->Dxp(), ircWidth + 1, crcWidth); ypTop = prcSrc->ypTop + LwMulDiv(prcSrc->Dyp(), ircHeight, crcHeight); ypBottom = prcSrc->ypTop + LwMulDiv(prcSrc->Dyp(), ircHeight + 1, crcHeight); } /*************************************************************************** Determines which cell the given (xp, yp) is in. This is essentially the inverse of SetToCell. ***************************************************************************/ bool RC::FMapToCell(long xp, long yp, long crcWidth, long crcHeight, long *pircWidth, long *pircHeight) { AssertThisMem(); AssertIn(crcWidth, 1, kcbMax); AssertIn(crcHeight, 1, kcbMax); AssertVarMem(pircWidth); AssertVarMem(pircHeight); if (!FPtIn(xp, yp)) return fFalse; *pircWidth = LwMulDiv(xp - xpLeft, crcWidth, Dxp()); *pircHeight = LwMulDiv(yp - ypTop, crcHeight, Dyp()); return fTrue; } #ifdef DEBUG /*************************************************************************** Asserts the validity of a fraction. ***************************************************************************/ void RAT::AssertValid(ulong grf) { AssertIn(_lwDen, 1, klwMax); long lwGcd = LwGcd(_lwNum, _lwDen); Assert(lwGcd == 1, "fraction not in lowest terms"); } #endif // DEBUG /*************************************************************************** Constructor for the master clock. ***************************************************************************/ USAC::USAC(void) { AssertThisMem(); _tsBaseSys = MacWin(TickCount(), timeGetTime()); _tsBaseApp = 0; _luScale = kluTimeScaleNormal; } /*************************************************************************** Return the current application time. ***************************************************************************/ ulong USAC::TsCur(void) { AssertThisMem(); ulong dtsSys = TsCurrentSystem() - _tsBaseSys; if (_luScale != kluTimeScaleNormal) { ulong luHigh; MulLu(dtsSys, _luScale, &luHigh, &dtsSys); dtsSys = LwHighLow(SuLow(luHigh), SuHigh(dtsSys)); } return _tsBaseApp + dtsSys; } /*************************************************************************** Scale the time. ***************************************************************************/ void USAC::Scale(ulong luScale) { AssertThisMem(); ulong tsSys, dts; if (luScale == _luScale) return; // set the _tsBaseSys and _tsBaseApp to now and set _luScale to luScale. tsSys = TsCurrentSystem(); dts = tsSys - _tsBaseSys; if (_luScale != kluTimeScaleNormal) { ulong luHigh; MulLu(dts, _luScale, &luHigh, &dts); dts = LwHighLow(SuLow(luHigh), SuHigh(dts)); } _tsBaseApp += dts; _tsBaseSys = tsSys; _luScale = luScale; } /*************************************************************************** Set the DVER structure. ***************************************************************************/ void DVER::Set(short swCur, short swBack) { _swBack = swBack; _swCur = swCur; } /*************************************************************************** Determines if the DVER structure is compatible with (swCur and swMin). Asserts that 0 <= swMin <= swCur. ***************************************************************************/ bool DVER::FReadable(short swCur, short swMin) { AssertIn(_swBack, 0, _swCur + 1); AssertIn(_swCur, 0, kswMax); AssertIn(swMin, 0, swCur + 1); AssertIn(swCur, 0, kswMax); return _swCur >= swMin && _swBack <= swCur; } ================================================ FILE: kauai/src/utilint.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Scalar, rectangle and point declarations ***************************************************************************/ #ifndef UTILINT_H #define UTILINT_H /**************************************** Scalar constants ****************************************/ const bool fTrue = 1; const bool fFalse = 0; enum tribool { tNo, tYes, tMaybe, tLim }; #define AssertT(t) AssertIn(t, 0, tLim) // standard comparison flags enum { fcmpEq = 0x0001, fcmpGt = 0x0002, fcmpLt = 0x0004, }; const ulong kgrfcmpGe = (fcmpEq | fcmpGt); const ulong kgrfcmpLe = (fcmpEq | fcmpLt); const ulong kgrfcmpNe = (fcmpGt | fcmpLt); #define FPure(f) ((f) != fFalse) #define ivNil (-1L) #define bvNil (-1L) #define cvNil (-1L) #define pvNil 0 /**************************************** Memory access asserts ****************************************/ #ifdef DEBUG void AssertPvCb(void *pv, long cb); inline void AssertNilOrPvCb(void *pv, long cb) { if (pv != pvNil) AssertPvCb(pv, cb); } #else //! DEBUG #define AssertPvCb(pv, cb) #define AssertNilOrPvCb(pv, cb) #endif //! DEBUG #define AssertThisMem() AssertPvCb(this, size(*this)) #define AssertVarMem(pvar) AssertPvCb(pvar, size(*(pvar))) #define AssertNilOrVarMem(pvar) AssertNilOrPvCb(pvar, size(*(pvar))) /**************************************** Scalar APIs ****************************************/ inline bool FIn(long lw, long lwMin, long lwLim) { return lw >= lwMin && lw < lwLim; } inline long LwBound(long lw, long lwMin, long lwMax) { return lw < lwMin ? lwMin : lw >= lwMax ? lwMax - 1 : lw; } void SortLw(long *plw1, long *plw2); inline short SwHigh(long lw) { return (short)(lw >> 16); } inline short SwLow(long lw) { return (short)lw; } inline long LwHighLow(short swHigh, short swLow) { return ((long)swHigh << 16) | (long)(ushort)swLow; } inline ulong LuHighLow(ushort suHigh, ushort suLow) { return ((ulong)suHigh << 16) | (ulong)suLow; } inline byte B0Lw(long lw) { return (byte)lw; } inline byte B1Lw(long lw) { return (byte)(lw >> 8); } inline byte B2Lw(long lw) { return (byte)(lw >> 16); } inline byte B3Lw(long lw) { return (byte)(lw >> 24); } inline long LwFromBytes(byte b3, byte b2, byte b1, byte b0) { return ((long)b3 << 24) | ((long)b2 << 16) | ((long)b1 << 8) | (long)b0; } inline ushort SuHigh(long lw) { return (ushort)((ulong)lw >> 16); } inline ushort SuLow(long lw) { return (ushort)lw; } inline byte BHigh(short sw) { return (byte)((ushort)sw >> 8); } inline byte BLow(short sw) { return (byte)sw; } inline short SwHighLow(byte bHigh, byte bLow) { return ((short)bHigh << 8) | (short)bLow; } inline ushort SuHighLow(byte bHigh, byte bLow) { return ((ushort)bHigh << 8) | (ushort)bLow; } inline short SwTruncLw(long lw) { return lw <= kswMax ? (lw >= kswMin ? (short)lw : kswMin) : kswMax; } inline short SwMin(short sw1, short sw2) { return sw1 < sw2 ? sw1 : sw2; } inline short SwMax(short sw1, short sw2) { return sw1 >= sw2 ? sw1 : sw2; } inline ushort SuMin(ushort su1, ushort su2) { return su1 < su2 ? su1 : su2; } inline ushort SuMax(ushort su1, ushort su2) { return su1 >= su2 ? su1 : su2; } inline long LwMin(long lw1, long lw2) { return lw1 < lw2 ? lw1 : lw2; } inline long LwMax(long lw1, long lw2) { return lw1 >= lw2 ? lw1 : lw2; } inline ulong LuMin(ulong lu1, ulong lu2) { return lu1 < lu2 ? lu1 : lu2; } inline ulong LuMax(ulong lu1, ulong lu2) { return lu1 >= lu2 ? lu1 : lu2; } inline short SwAbs(short sw) { return sw < 0 ? -sw : sw; } inline long LwAbs(long lw) { return lw < 0 ? -lw : lw; } inline long LwMulSw(short sw1, short sw2) { return (long)sw1 * sw2; } #ifdef MC_68020 /*************************************************************************** Motorola 68020 routines. ***************************************************************************/ extern "C" { long __cdecl LwMulDiv(long lw, long lwMul, long lwDiv); void __cdecl MulLw(long lw1, long lw2, long *plwHigh, ulong *pluLow); ulong __cdecl LuMulDiv(ulong lu, ulong luMul, ulong luDiv); void __cdecl MulLu(ulong lu1, ulong lu2, ulong *pluHigh, ulong *pluLow); } long LwMulDivMod(long lw, long lwMul, long lwDiv, long *plwRem); #elif defined(IN_80386) /*************************************************************************** Intel 80386 routines. ***************************************************************************/ inline long LwMulDiv(long lw, long lwMul, long lwDiv) { AssertH(lwDiv != 0); __asm { mov eax,lw imul lwMul idiv lwDiv mov lw,eax } return lw; } inline long LwMulDivMod(long lw, long lwMul, long lwDiv, long *plwRem) { AssertH(lwDiv != 0); AssertVarMem(plwRem); __asm { mov eax,lw imul lwMul idiv lwDiv mov ecx,plwRem mov DWORD PTR[ecx],edx mov lw,eax } return lw; } void MulLw(long lw1, long lw2, long *plwHigh, ulong *pluLow); ulong LuMulDiv(ulong lu, ulong luMul, ulong luDiv); void MulLu(ulong lu1, ulong lu2, ulong *pluHigh, ulong *pluLow); #else //! MC_68020 && !IN_80386 /*************************************************************************** Other processors. These generally use floating point. ***************************************************************************/ long LwMulDiv(long lw, long lwMul, long lwDiv); long LwMulDivMod(long lw, long lwMul, long lwDiv, long *plwRem); void MulLw(long lw1, long lw2, long *plwHigh, ulong *pluLow); ulong LuMulDiv(ulong lu, ulong luMul, ulong luDiv); void MulLu(ulong lu1, ulong lu2, ulong *pluHigh, ulong *pluLow); #endif //! MC_68020 && !IN_80386 long LwMulDivAway(long lw, long lwMul, long lwDiv); ulong LuMulDivAway(ulong lu, ulong luMul, ulong luDiv); ulong FcmpCompareFracs(long lwNum1, long lwDen1, long lwNum2, long lwDen2); long LwDivAway(long lwNum, long lwDen); long LwDivClosest(long lwNum, long lwDen); long LwRoundAway(long lwSrc, long lwBase); long LwRoundToward(long lwSrc, long lwBase); long LwRoundClosest(long lwSrc, long lwBase); inline long CbRoundToLong(long cb) { return (cb + size(long) - 1) & ~(long)(size(long) - 1); } inline long CbRoundToShort(long cb) { return (cb + size(short) - 1) & ~(long)(size(short) - 1); } inline long CbFromCbit(long cbit) { return (cbit + 7) / 8; } inline byte Fbit(long ibit) { return 1 << (ibit & 0x0007); } inline long IbFromIbit(long ibit) { return ibit >> 3; } long LwGcd(long lw1, long lw2); ulong LuGcd(ulong lu1, ulong lu2); bool FAdjustIv(long *piv, long iv, long cvIns, long cvDel); #ifdef DEBUG void AssertIn(long lw, long lwMin, long lwLim); long LwMul(long lw1, long lw2); #else //! DEBUG #define AssertIn(lw, lwMin, lwLim) inline long LwMul(long lw1, long lw2) { return lw1 * lw2; } #endif //! DEBUG /**************************************** Byte Swapping ****************************************/ // byte order mask typedef ulong BOM; void SwapBytesBom(void *pv, BOM bom); void SwapBytesRgsw(void *psw, long csw); void SwapBytesRglw(void *plw, long clw); const BOM bomNil = 0; const BOM kbomSwapShort = 0x40000000; const BOM kbomSwapLong = 0xC0000000; const BOM kbomLeaveShort = 0x00000000; const BOM kbomLeaveLong = 0x80000000; /* You can chain up to 16 of these (2 bits each) */ #define BomField(bomNew, bomLast) ((bomNew) | ((bomLast) >> 2)) #ifdef DEBUG void AssertBomRglw(BOM bom, long cb); void AssertBomRgsw(BOM bom, long cb); #else //! DEBUG #define AssertBomRglw(bom, cb) #define AssertBomRgsw(bom, cb) #endif //! DEBUG /**************************************** OS level rectangle and point ****************************************/ #ifdef MAC typedef Rect RCS; typedef Point PTS; #elif defined(WIN) typedef RECT RCS; typedef POINT PTS; #endif // WIN /**************************************** Rectangle and point stuff ****************************************/ // options for PT::Transform and RC::Transform enum { fptNil, fptNegateXp = 1, // negate xp values (and swap them in an RC) fptNegateYp = 2, // negate yp values (and swap them in an RC) fptTranspose = 4, // swap xp and yp values (done after negating) }; class RC; typedef class RC *PRC; class PT { public: long xp; long yp; public: // constructors PT(void) { } PT(long xpT, long ypT) { xp = xpT, yp = ypT; } // for assigning to/from a PTS operator PTS(void); PT &operator=(PTS &pts); PT(PTS &pts) { *this = pts; } // interaction with other points bool operator==(PT &pt) { return xp == pt.xp && yp == pt.yp; } bool operator!=(PT &pt) { return xp != pt.xp || yp != pt.yp; } PT operator+(PT &pt) { return PT(xp + pt.xp, yp + pt.yp); } PT operator-(PT &pt) { return PT(xp - pt.xp, yp - pt.yp); } PT &operator+=(PT &pt) { xp += pt.xp; yp += pt.yp; return *this; } PT &operator-=(PT &pt) { xp -= pt.xp; yp -= pt.yp; return *this; } void Offset(long dxp, long dyp) { xp += dxp; yp += dyp; } // map the point from prcSrc to prcDst coordinates void Map(RC *prcSrc, RC *prcDst); PT PtMap(RC *prcSrc, RC *prcDst); void Transform(ulong grfpt); }; class RC { public: long xpLeft; long ypTop; long xpRight; long ypBottom; public: // constructors RC(void) { } RC(long xpLeftT, long ypTopT, long xpRightT, long ypBottomT) { AssertThisMem(); xpLeft = xpLeftT; ypTop = ypTopT; xpRight = xpRightT; ypBottom = ypBottomT; } // for assigning to/from an RCS operator RCS(void); RC &operator=(RCS &rcs); RC(RCS &rcs) { *this = rcs; } void Zero(void) { AssertThisMem(); xpLeft = ypTop = xpRight = ypBottom = 0; } void Set(long xp1, long yp1, long xp2, long yp2) { AssertThisMem(); xpLeft = xp1; ypTop = yp1; xpRight = xp2; ypBottom = yp2; } // use klwMin / 2 and klwMax / 2 so Dxp and Dyp are correct void Max(void) { AssertThisMem(); xpLeft = ypTop = klwMin / 2; xpRight = ypBottom = klwMax / 2; } bool FMax(void) { AssertThisMem(); return xpLeft == klwMin / 2 && ypTop == klwMin / 2 && xpRight == klwMax / 2 && ypBottom == klwMax / 2; } // interaction with other rc's and pt's bool operator==(RC &rc); bool operator!=(RC &rc); RC &operator+=(PT &pt) { xpLeft += pt.xp; ypTop += pt.yp; xpRight += pt.xp; ypBottom += pt.yp; return *this; } RC &operator-=(PT &pt) { xpLeft -= pt.xp; ypTop -= pt.yp; xpRight -= pt.xp; ypBottom -= pt.yp; return *this; } RC operator+(PT &pt) { return RC(xpLeft + pt.xp, ypTop + pt.yp, xpRight + pt.xp, ypBottom + pt.yp); } RC operator-(PT &pt) { return RC(xpLeft - pt.xp, ypTop - pt.yp, xpRight - pt.xp, ypBottom - pt.yp); } PT PtTopLeft(void) { return PT(xpLeft, ypTop); } PT PtBottomRight(void) { return PT(xpRight, ypBottom); } PT PtTopRight(void) { return PT(xpRight, ypTop); } PT PtBottomLeft(void) { return PT(xpLeft, ypBottom); } // map the rectangle from prcSrc to prcDst coordinates void Map(RC *prcSrc, RC *prcDst); void Transform(ulong grfpt); long Dxp(void) { AssertThisMem(); return xpRight - xpLeft; } long Dyp(void) { AssertThisMem(); return ypBottom - ypTop; } long XpCenter(void) { AssertThisMem(); return (xpLeft + xpRight) / 2; } long YpCenter(void) { AssertThisMem(); return (ypTop + ypBottom) / 2; } bool FEmpty(void) { AssertThisMem(); return ypBottom <= ypTop || xpRight <= xpLeft; } void CenterOnRc(RC *prcBase); void CenterOnPt(long xp, long yp); bool FIntersect(RC *prc1, RC *prc2); bool FIntersect(RC *prc); bool FPtIn(long xp, long yp); void InsetCopy(RC *prc, long dxp, long dyp); void Inset(long dxp, long dyp); void OffsetCopy(RC *prc, long dxp, long dyp); void Offset(long dxp, long dyp); void OffsetToOrigin(void); void PinPt(PT *ppt); void PinToRc(RC *prc); void SqueezeIntoRc(RC *prcBase); void StretchToRc(RC *prcBase); void Union(RC *prc1, RC *prc2); void Union(RC *prc); long LwArea(void); bool FContains(RC *prc); void SetToCell(RC *prcSrc, long crcWidth, long crcHeight, long ircWidth, long ircHeight); bool FMapToCell(long xp, long yp, long crcWidth, long crcHeight, long *pircWidth, long *pircHeight); }; /**************************************** fractions (ratio/rational) ****************************************/ class RAT { ASSERT private: long _lwNum; long _lwDen; // the third argument of this constructor is bogus. This constructor is // provided so the GCD calculation can be skipped when we already know // the numerator and denominator are relatively prime. RAT(long lwNum, long lwDen, long lwJunk) { // lwNum and lwDen are already relatively prime if (lwDen > 0) { _lwNum = lwNum; _lwDen = lwDen; } else { _lwNum = -lwNum; _lwDen = -lwDen; } AssertThis(0); } public: // constructors RAT(void) { _lwDen = 0; } RAT(long lw) { _lwNum = lw; _lwDen = 1; } RAT(long lwNum, long lwDen) { Set(lwNum, lwDen); } void Set(long lwNum, long lwDen) { long lwGcd = LwGcd(lwNum, lwDen); if (lwDen < 0) lwGcd = -lwGcd; _lwNum = lwNum / lwGcd; _lwDen = lwDen / lwGcd; AssertThis(0); } // unary minus RAT operator-(void) const { return RAT(-_lwNum, _lwDen, 0); } // access functions long LwNumerator(void) { return _lwNum; } long LwDenominator(void) { return _lwDen; } long LwAway(void) { return LwDivAway(_lwNum, _lwDen); } long LwToward(void) { return _lwNum / _lwDen; } long LwClosest(void) { return LwDivClosest(_lwNum, _lwDen); } operator long(void) { return _lwNum / _lwDen; } // applying to a long (as a multiplicative operator) long LwScale(long lw) { return (_lwNum != _lwDen) ? LwMulDiv(lw, _lwNum, _lwDen) : lw; } long LwUnscale(long lw) { return (_lwNum != _lwDen) ? LwMulDiv(lw, _lwDen, _lwNum) : lw; } // operator functions friend RAT operator+(const RAT &rat1, const RAT &rat2); friend RAT operator+(const RAT &rat, long lw) { return RAT(rat._lwNum + LwMul(rat._lwDen, lw), rat._lwDen); } friend RAT operator+(long lw, const RAT &rat) { return RAT(rat._lwNum + LwMul(rat._lwDen, lw), rat._lwDen); } friend RAT operator-(const RAT &rat1, const RAT &rat2) { return rat1 + (-rat2); } friend RAT operator-(const RAT &rat, long lw) { return RAT(rat._lwNum + LwMul(rat._lwDen, -lw), rat._lwDen); } friend RAT operator-(long lw, const RAT &rat) { return RAT(rat._lwNum + LwMul(rat._lwDen, -lw), rat._lwDen); } friend RAT operator*(const RAT &rat1, const RAT &rat2) { long lwGcd1 = LwGcd(rat1._lwNum, rat2._lwDen); long lwGcd2 = LwGcd(rat1._lwDen, rat2._lwNum); return RAT(LwMul(rat1._lwNum / lwGcd1, rat2._lwNum / lwGcd2), LwMul(rat1._lwDen / lwGcd2, rat2._lwDen / lwGcd1), 0); } friend RAT operator*(const RAT &rat, long lw) { long lwGcd = LwGcd(rat._lwDen, lw); return RAT(LwMul(lw / lwGcd, rat._lwNum), rat._lwDen / lwGcd, 0); } friend RAT operator*(long lw, const RAT &rat) { long lwGcd = LwGcd(rat._lwDen, lw); return RAT(LwMul(lw / lwGcd, rat._lwNum), rat._lwDen / lwGcd, 0); } friend RAT operator/(const RAT &rat1, const RAT &rat2) { long lwGcd1 = LwGcd(rat1._lwNum, rat2._lwNum); long lwGcd2 = LwGcd(rat1._lwDen, rat2._lwDen); return RAT(LwMul(rat1._lwNum / lwGcd1, rat2._lwDen / lwGcd2), LwMul(rat1._lwDen / lwGcd2, rat2._lwNum / lwGcd1), 0); } friend RAT operator/(const RAT &rat, long lw) { long lwGcd = LwGcd(rat._lwNum, lw); return RAT(rat._lwNum / lwGcd, LwMul(lw / lwGcd, rat._lwDen), 0); } friend RAT operator/(long lw, const RAT &rat) { long lwGcd = LwGcd(rat._lwNum, lw); return RAT(LwMul(lw / lwGcd, rat._lwDen), rat._lwNum / lwGcd, 0); } friend int operator==(const RAT &rat1, const RAT &rat2) { return rat1._lwNum == rat2._lwNum && rat1._lwDen == rat2._lwDen; } friend int operator==(const RAT &rat, long lw) { return rat._lwDen == 1 && rat._lwNum == lw; } friend int operator==(long lw, const RAT &rat) { return rat._lwDen == 1 && rat._lwNum == lw; } friend int operator!=(const RAT &rat1, const RAT &rat2) { return rat1._lwNum != rat2._lwNum || rat1._lwDen != rat2._lwDen; } friend int operator!=(const RAT &rat, long lw) { return rat._lwDen != 1 || rat._lwNum != lw; } friend int operator!=(long lw, const RAT &rat) { return rat._lwDen != 1 || rat._lwNum != lw; } // operator methods RAT &operator=(long lw) { _lwNum = lw; _lwDen = 1; return *this; } RAT &operator+=(const RAT &rat) { *this = *this + rat; return *this; } RAT &operator+=(long lw) { *this = *this + lw; return *this; } RAT &operator-=(const RAT &rat) { *this = *this - rat; return *this; } RAT &operator-=(long lw) { *this = *this + (-lw); return *this; } RAT &operator*=(const RAT &rat) { *this = *this * rat; return *this; } RAT &operator*=(long lw) { *this = *this * lw; return *this; } RAT &operator/=(const RAT &rat) { *this = *this / rat; return *this; } RAT &operator/=(long lw) { *this = *this / lw; return *this; } }; /*************************************************************************** Data versioning utility ***************************************************************************/ struct DVER { short _swCur; short _swBack; void Set(short swCur, short swBack); bool FReadable(short swCur, short swMin); }; #endif // UTILINT_H ================================================ FILE: kauai/src/utilmc.asm ================================================ ; ; Author: ShonK ; Project: Kauai ; Reviewed: ; Copyright (c) Microsoft Corporation ; ; Asm code for the MC_68020 build. ; code ; long LwMulDiv(long lw, long lwMul, long lwDiv) ; ; Multiply lw by lwMul and divide by lwDiv without losing precision. ; Assumes a 68020 or better. cProc LwMulDiv,PUBLIC,,0 ; parmD lw ; parmD lwMul ; parmD lwDiv cBegin nogen move.l 4(a7),d0 ;lw ;following hex is: muls.l 8(A7),d1:d0 dc.w 0x4C2F dc.w 0x0C01 dc.w 0x0008 ;following hex is: divs.l 0x0C(A7),d1:d0 dc.w 0x4C6F dc.w 0x0C01 dc.w 0x000C rts cEnd nogen ; void MulLw(long lw1, long lw2, long *plwHigh, ulong *pluLow) ; ; Multiplies 2 longs to get a 64 bit (signed) value. Assumes a 68020 ; or better. cProc MulLw,PUBLIC,,0 ; parmD lw1 ; parmD lw2 ; parmD plwHigh ; parmD pluLow cBegin nogen move.l 4(a7),d0 ;lw1 ;following hex is: muls.l 8(A7),d1:d0 dc.w 0x4C2F dc.w 0x0C01 dc.w 0x0008 move.l 0x0C(a7),a0 ;plwHigh move.l d1,(a0) move.l 0x10(a7),a0 ;pluLow move.l d0,(a0) rts cEnd nogen ; ulong LuMulDiv(ulong lu, ulong luMul, ulong luDiv) ; ; Multiply lu by luMul and divide by luDiv without losing precision. ; Assumes a 68020 or better. cProc LuMulDiv,PUBLIC,,0 ; parmD lu ; parmD luMul ; parmD luDiv cBegin nogen move.l 4(a7),d0 ;lw ;following hex is: mulu.l 8(A7),d1:d0 dc.w 0x4C2F dc.w 0x0401 dc.w 0x0008 ;following hex is: divu.l 0x0C(A7),d1:d0 dc.w 0x4C6F dc.w 0x0401 dc.w 0x000C rts cEnd nogen ; void MulLu(long lu1, long lu2, ulong *pluHigh, ulong *pluLow) ; ; Multiplies 2 unsigned longs to get a 64 bit (unsigned) value. Assumes a ; 68020 or better. cProc MulLu,PUBLIC,,0 ; parmD lu1 ; parmD lu2 ; parmD pluHigh ; parmD pluLow cBegin nogen move.l 4(a7),d0 ;lu1 ;following hex is: mulu.l 8(A7),d1:d0 dc.w 0x4C2F dc.w 0x0401 dc.w 0x0008 move.l 0x0C(a7),a0 ;pluHigh move.l d1,(a0) move.l 0x10(a7),a0 ;pluLow move.l d0,(a0) rts cEnd nogen ================================================ FILE: kauai/src/utilmem.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Shared (between Mac and Win) memory allocation routines. The APIs in this module implement fixed block (non-moveable, non-resizeable) memory management. On win, we use GlobalAlloc; on Mac we use ::operator new. The win hq is based on FAllocPv. The mac hq is a Mac handle. _FResizePpv is win only (needed for resizing HQs) and considered private to the memory management code (if the implementation of Win HQs changes, it will go away). ***************************************************************************/ #include "util.h" ASSERTNAME #ifdef DEBUG const long kclwStackMbh = 5; // memory block header struct MBH { long cb; // size of block, including header and footer PSZS pszsFile; // source file that allocation request is coming from long lwLine; // line in file that allocation request is coming from long lwThread; // thread id MBH *pmbhPrev; // previous allocated block (in doubly linked list) MBH *pmbhNext; // next allocated block long rglwStack[kclwStackMbh]; // the EBP/A6 chain short cactRef; // for marking memory short swMagic; // magic number, to detect memory trashing }; // memory block footer struct MBF { short swMagic; // magic number, to detect memory trashing }; MBH *_pmbhFirst; // head of the doubly linked list priv void _LinkMbh(MBH *pmbh); priv void _UnlinkMbh(MBH *pmbh, MBH *pmbhOld); priv void _AssertMbh(MBH *pmbh); #endif // DEBUG #ifdef MAC #define malloc(cb) ::operator new(cb) #define free(pv) delete (pv) #endif // MAC #ifdef WIN #define malloc(cb) (void *)GlobalAlloc(GMEM_FIXED, cb) #define free(pv) GlobalFree((HGLOBAL)pv) #define _msize(pv) GlobalSize((HGLOBAL)pv) #define realloc(pv, cb) (void *)GlobalReAlloc((HGLOBAL)pv, cb, GMEM_MOVEABLE) #endif // WIN PFNLIB vpfnlib = pvNil; bool _fInLiberator = fFalse; #ifdef DEBUG /*************************************************************************** Do simulated failure testing. ***************************************************************************/ bool DMAGL::FFail(void) { bool fRet = fFalse; vmutxMem.Enter(); if (cactFail > 0) { if (cactDo <= 0) { cactFail--; fRet = fTrue; } else cactDo--; } vmutxMem.Leave(); return fRet; } /*************************************************************************** Update values after an allocation ***************************************************************************/ void DMAGL::Allocate(long cbT) { vmutxMem.Enter(); if (cvRun < ++cv) cvRun = cv; cvTot++; if (cbRun < (cb += cbT)) cbRun = cb; vmutxMem.Leave(); } /*************************************************************************** Update values after a resize ***************************************************************************/ void DMAGL::Resize(long dcb) { vmutxMem.Enter(); if (cbRun < (cb += dcb)) cbRun = cb; vmutxMem.Leave(); } /*************************************************************************** Update values after a block is freed ***************************************************************************/ void DMAGL::Free(long cbT) { --cv; cb -= cbT; } #endif // DEBUG /*************************************************************************** Allocates a fixed block. ***************************************************************************/ #ifdef DEBUG bool FAllocPvDebug(void **ppv, long cb, ulong grfmem, long mpr, PSZS pszsFile, long lwLine, DMAGL *pdmagl) #else //! DEBUG bool FAllocPv(void **ppv, long cb, ulong grfmem, long mpr) #endif //! DEBUG { AssertVarMem(ppv); AssertIn(cb, 0, kcbMax); long cbFree; if (cb > kcbMax) { BugVar("who's allocating a humongous block?", &cb); goto LFail; } #ifdef DEBUG // do simulated failure if (pdmagl->FFail()) goto LFail; vmutxMem.Enter(); if (pvNil != _pmbhFirst) _AssertMbh(_pmbhFirst); vmutxMem.Leave(); Assert(cb + size(MBH) + size(MBF) > cb, 0); cb += size(MBH) + size(MBF); #endif // DEBUG for (;;) { *ppv = malloc(cb); if (pvNil != *ppv || pvNil == vpfnlib) break; vmutxMem.Enter(); if (_fInLiberator) cbFree = 0; else { _fInLiberator = fTrue; vmutxMem.Leave(); cbFree = (*vpfnlib)(cb, mpr); vmutxMem.Enter(); _fInLiberator = fFalse; } vmutxMem.Leave(); if (cbFree <= 0) break; } if (pvNil == *ppv) { LFail: *ppv = pvNil; PushErc(ercOomPv); return fFalse; } if (grfmem & fmemClear) ClearPb(*ppv, cb); #ifdef DEBUG else FillPb(*ppv, cb, kbGarbage); // fill in the header MBH *pmbh = (MBH *)*ppv; *ppv = pmbh + 1; pmbh->cb = cb; pmbh->swMagic = kswMagicMem; pmbh->pszsFile = pszsFile; pmbh->lwLine = lwLine; pmbh->lwThread = LwThreadCur(); #ifdef WIN // follow the EBP chain.... long *plw; long ilw; __asm { mov plw,ebp } for (ilw = 0; ilw < kclwStackMbh; ilw++) { if (pvNil == plw || IsBadReadPtr(plw, 2 * size(long)) || *plw <= (long)plw) { pmbh->rglwStack[ilw] = 0; plw = pvNil; } else { pmbh->rglwStack[ilw] = plw[1]; plw = (long *)*plw; } } #endif // WIN // write the footer MBF mbf; mbf.swMagic = kswMagicMem; CopyPb(&mbf, PvAddBv(pmbh, cb - size(MBF)), size(MBF)); // link the block _LinkMbh(pmbh); // update statistics pdmagl->Allocate(cb - size(MBF) - size(MBH)); AssertPvAlloced(*ppv, cb - size(MBF) - size(MBH)); #endif // DEBUG return fTrue; } #ifdef WIN /*************************************************************************** Resizes the given block. *ppv may change. If fmemClear, clears any newly added space. ***************************************************************************/ #ifdef DEBUG bool _FResizePpvDebug(void **ppv, long cbNew, long cbOld, ulong grfmem, long mpr, DMAGL *pdmagl) #else //! DEBUG bool _FResizePpv(void **ppv, long cbNew, long cbOld, ulong grfmem, long mpr) #endif //! DEBUG { AssertVarMem(ppv); AssertIn(cbNew, 0, kcbMax); AssertIn(cbOld, 0, kcbMax); AssertPvAlloced(*ppv, cbOld); long cbFree; void *pvNew, *pvOld; #ifdef DEBUG MBH *pmbh = (MBH *)PvSubBv(*ppv, size(MBH)); _AssertMbh(pmbh); #endif // DEBUG if (cbNew > kcbMax) { BugVar("who's resizing a humongous block?", &cbNew); goto LFail; } pvOld = *ppv; #ifdef DEBUG // do simulated failure - we can only fail if the block is growing if (cbNew > cbOld && pdmagl->FFail()) goto LFail; // assert we don't overflow (the limit of kcbMax should ensure this) Assert(cbOld + size(MBH) + size(MBF) > cbOld, 0); Assert(cbNew + size(MBH) + size(MBF) > cbNew, 0); cbOld += size(MBH) + size(MBF); cbNew += size(MBH) + size(MBF); AssertVar(pmbh->cb == cbOld, "bad cbOld value passed to _FResizePpv", &cbOld); // trash the old stuff if (cbOld > cbNew) FillPb(PvAddBv(pmbh, cbNew), cbOld - cbNew, kbGarbage); pvOld = pmbh; #endif // DEBUG for (;;) { pvNew = realloc(pvOld, cbNew); if (pvNil != pvNew || pvNil == vpfnlib) break; vmutxMem.Enter(); if (_fInLiberator) cbFree = 0; else { _fInLiberator = fTrue; vmutxMem.Leave(); cbFree = (*vpfnlib)(cbNew - cbOld, mpr); vmutxMem.Enter(); _fInLiberator = fFalse; } vmutxMem.Leave(); if (cbFree <= 0) break; } if (pvNil == pvNew) { Assert(cbOld < cbNew, "why did shrinking fail?"); LFail: AssertPvAlloced(*ppv, cbOld - size(MBH) - size(MBF)); PushErc(ercOomPv); return fFalse; } *ppv = pvNew; if ((grfmem & fmemClear) && cbOld < cbNew) { // Clear the new stuff ClearPb(PvAddBv(pvNew, cbOld), cbNew - cbOld); } #ifdef DEBUG if ((grfmem & fmemClear) && cbOld < cbNew) ClearPb(PvAddBv(pvNew, cbOld - size(MBF)), size(MBF)); else if (cbOld < cbNew) { // fill the new stuff with garbage FillPb(PvAddBv(pvNew, cbOld - size(MBF)), cbNew - cbOld + size(MBF), kbGarbage); } // update the header if (pvNew != pmbh) { _UnlinkMbh((MBH *)pvNew, pmbh); pmbh = (MBH *)pvNew; _LinkMbh(pmbh); } *ppv = pmbh + 1; pmbh->cb = cbNew; // write the footer MBF mbf; mbf.swMagic = kswMagicMem; CopyPb(&mbf, PvAddBv(pmbh, cbNew - size(MBF)), size(MBF)); AssertPvAlloced(*ppv, cbNew - size(MBF) - size(MBH)); // update statistics pdmagl->Resize(cbNew - cbOld); #endif // DEBUG return fTrue; } #endif // WIN /*************************************************************************** If *ppv is not nil, frees it and sets *ppv to nil. ***************************************************************************/ #ifdef DEBUG void FreePpvDebug(void **ppv, DMAGL *pdmagl) #else //! DEBUG void FreePpv(void **ppv) #endif //! DEBUG { AssertVarMem(ppv); if (*ppv == pvNil) return; #ifdef DEBUG MBH *pmbh = (MBH *)PvSubBv(*ppv, size(MBH)); _AssertMbh(pmbh); _UnlinkMbh(pmbh, pmbh); // update statistics pdmagl->Free(pmbh->cb - size(MBF) - size(MBH)); // fill the block with garbage before freeing it FillPb(pmbh, pmbh->cb, kbGarbage); *ppv = pmbh; #endif // DEBUG free(*ppv); *ppv = pvNil; } #ifdef DEBUG /*************************************************************************** Link the Mbh into the debug-only doubly linked list. ***************************************************************************/ priv void _LinkMbh(MBH *pmbh) { AssertVarMem(pmbh); vmutxMem.Enter(); pmbh->pmbhPrev = pvNil; pmbh->pmbhNext = _pmbhFirst; if (_pmbhFirst != pvNil) { Assert(_pmbhFirst->pmbhPrev == pvNil, "_pmbhFirst's prev is not nil"); _pmbhFirst->pmbhPrev = pmbh; } _pmbhFirst = pmbh; vmutxMem.Leave(); } /*************************************************************************** Unlink the MBH from the debug-only doubly linked list. pmbhOld is the previous value of the linked block. pmbhOld may not be a valid pointer now (when mem is resized). ***************************************************************************/ priv void _UnlinkMbh(MBH *pmbh, MBH *pmbhOld) { AssertVarMem(pmbh); Assert(pmbhOld != pvNil, 0); vmutxMem.Enter(); // update prev's next pointer if (pvNil == pmbh->pmbhPrev) { Assert(_pmbhFirst == pmbhOld, "prev is wrongly nil"); _pmbhFirst = pmbh->pmbhNext; } else { Assert(_pmbhFirst != pmbhOld, "prev should be nil"); Assert(pmbh->pmbhPrev->pmbhNext == pmbhOld, "prev's next wrong"); pmbh->pmbhPrev->pmbhNext = pmbh->pmbhNext; } // update next's prev pointer if (pvNil != pmbh->pmbhNext) { Assert(pmbh->pmbhNext->pmbhPrev == pmbhOld, "next's prev wrong"); pmbh->pmbhNext->pmbhPrev = pmbh->pmbhPrev; } vmutxMem.Leave(); } /*************************************************************************** Validate the MBH and the block that it is the head of. ***************************************************************************/ void _AssertMbh(MBH *pmbh) { short sw; if (vcactSuspendCheckPointers != 0) return; vmutxMem.Enter(); AssertVarMem(pmbh); Assert(pmbh->swMagic == kswMagicMem, "bad magic number"); AssertIn(pmbh->cb - size(MBH) - size(MBF), 0, kcbMax); Win(Assert(pmbh->cb <= (long)_msize(pmbh), "bigger than malloced block");) AssertPvCb(pmbh, pmbh->cb); if (pmbh->pmbhPrev != pvNil) { AssertVarMem(pmbh->pmbhPrev); Assert(pmbh->pmbhPrev->pmbhNext == pmbh, "wrong next in prev"); Assert(pmbh != _pmbhFirst, "first has prev!"); } if (pmbh->pmbhNext != pvNil) { AssertVarMem(pmbh->pmbhNext); Assert(pmbh->pmbhNext->pmbhPrev == pmbh, "wrong prev in next"); } ((byte *)&sw)[0] = *(byte *)PvAddBv(pmbh, pmbh->cb - 2); ((byte *)&sw)[1] = *(byte *)PvAddBv(pmbh, pmbh->cb - 1); Assert(sw == kswMagicMem, "bad tail magic number"); vmutxMem.Leave(); } /*************************************************************************** Assert the validity of an allocated fixed block. Cb is the size. If cb is unknown, pass cvNil. ***************************************************************************/ void AssertPvAlloced(void *pv, long cb) { if (vcactSuspendCheckPointers != 0) return; Assert(pv != pvNil, "nil pv"); MBH *pmbh = (MBH *)PvSubBv(pv, size(MBH)); _AssertMbh(pmbh); if (cb != cvNil) Assert(pmbh->cb == cb + size(MBH) + size(MBF), "wrong cb"); } /*************************************************************************** Asserts on unmarked blocks. ***************************************************************************/ void AssertUnmarkedMem(void) { MBH *pmbh; long lwThread = LwThreadCur(); // enter the critical section vmutxMem.Enter(); for (pmbh = _pmbhFirst; pmbh != pvNil; pmbh = pmbh->pmbhNext) { _AssertMbh(pmbh); if (pmbh->cactRef == 0 && pmbh->lwThread == lwThread) { STN stn; SZS szs; stn.FFormatSz(PszLit("\nLost block: size=%d, StackTrace=(use map file)"), pmbh->cb); stn.GetSzs(szs); if (FAssertProc(pmbh->pszsFile, pmbh->lwLine, szs, pmbh->rglwStack, kclwStackMbh * size(long))) { Debugger(); } } } Mac(_AssertUnmarkedHqs();) // leave the critical section vmutxMem.Leave(); } /*************************************************************************** Clears all marks on memory blocks. ***************************************************************************/ void UnmarkAllMem(void) { MBH *pmbh; long lwThread = LwThreadCur(); // enter the critical section vmutxMem.Enter(); for (pmbh = _pmbhFirst; pmbh != pvNil; pmbh = pmbh->pmbhNext) { _AssertMbh(pmbh); if (pmbh->lwThread == lwThread) pmbh->cactRef = 0; } Mac(_UnmarkAllHqs();) // leave the critical section vmutxMem.Leave(); } /*************************************************************************** Increment the ref count on an allocated pv. ***************************************************************************/ void MarkPv(void *pv) { if (pvNil != pv) { AssertPvAlloced(pv, cvNil); MBH *pmbh = (MBH *)PvSubBv(pv, size(MBH)); pmbh->cactRef++; } } #endif // DEBUG ================================================ FILE: kauai/src/utilmem.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Memory handling ***************************************************************************/ #ifndef UTILMEM_H #define UTILMEM_H // used for asserts and limiting memory const byte kbGarbage = 0xA3; // new blocks are filled with this const long kcbMax = 0x08000000; // 128 Megabytes const short kswMagicMem = (short)0xA253; const long klwMagicMem = (long)0xA253A253; /*************************************************************************** When an allocation fails, vpfnlib is called to free some memory (if it's not nil). ***************************************************************************/ typedef long (*PFNLIB)(long cb, long mpr); extern PFNLIB vpfnlib; extern bool _fInAlloc; /**************************************** OS memory handles and management ****************************************/ #ifdef MAC typedef Handle HN; // version of SetHandleSize that returns an error code inline short ErrSetHandleSize(HN hn, Size cb) { SetHandleSize(hn, cb); return MemError(); } // address stipper class ADST { private: long _lwMaskAddress; public: ADST(void); void *PvStrip(void *pv) { return (void *)((long)pv & _lwMaskAddress); } }; extern ADST vadst; #elif defined(WIN) typedef HGLOBAL HN; #endif /**************************************** Moveable/resizeable memory management ****************************************/ typedef void *HQ; #define hNil 0 #define hqNil ((HQ)0) // memory request priority enum { // lower priority mprDebug, mprForSpeed, mprNormal, mprCritical, // higher priority }; // memory allocation options enum { fmemNil = 0, fmemClear = 1, }; void FreePhq(HQ *phq); long CbOfHq(HQ hq); bool FCopyHq(HQ hqSrc, HQ *phqDst, long mpr); bool FResizePhq(HQ *phq, long cb, ulong grfmem, long mpr); void *PvLockHq(HQ hq); void UnlockHq(HQ hq); #ifdef DEBUG // debug memory allocator globals // enter vmutxMem before modifying these... struct DMAGL { long cv; // number of allocations long cvTot; // total number of allocations over all time long cvRun; // running max of cv long cb; // total size of allocations long cbRun; // running max of cb long cactDo; // number of times to succeed before failing long cactFail; // number of times to fail bool FFail(void); void Allocate(long cbT); void Resize(long dcb); void Free(long cbT); }; // debug memory globals struct DMGLOB { DMAGL dmaglBase; // for NewObj DMAGL dmaglHq; // for HQs DMAGL dmaglPv; // for FAllocPv, etc }; extern DMGLOB vdmglob; extern long vcactSuspendCheckPointers; #define SuspendCheckPointers() vcactSuspendCheckPointers++; #define ResumeCheckPointers() vcactSuspendCheckPointers--; bool FAllocHqDebug(HQ *phq, long cb, ulong grfmem, long mpr, schar *pszsFile, long lwLine); #define FAllocHq(phq, cb, grfmem, mpr) FAllocHqDebug(phq, cb, grfmem, mpr, __szsFile, __LINE__) void *QvFromHq(HQ hq); void AssertHq(HQ hq); void MarkHq(HQ hq); #ifdef MAC void _AssertUnmarkedHqs(void); void _UnmarkAllHqs(void); #endif // MAC #else //! DEBUG #define FAllocHqDebug(phq, cb, grfmem, mpr, pszsFile, luLine) FAllocHq(phq, cb, grfmem, mpr) bool FAllocHq(HQ *phq, long cb, ulong grfmem, long mpr); #ifdef MAC inline void *QvFromHq(HQ hq) { return vadst.PvStrip(*(void **)hq); } #elif defined(WIN) inline void *QvFromHq(HQ hq) { return (void *)hq; } #endif // WIN #define AssertHq(hq) #define MarkHq(hq) #endif //! DEBUG /**************************************** Fixed (non-moveable) memory. ****************************************/ #ifdef DEBUG // allocation routine bool FAllocPvDebug(void **ppv, long cb, ulong grfmem, long mpr, schar *pszsFile, long lwLine, DMAGL *pdmagl); #define FAllocPv(ppv, cb, grfmem, mpr) FAllocPvDebug(ppv, cb, grfmem, mpr, __szsFile, __LINE__, &vdmglob.dmaglPv) // resizing routine - WIN only #ifdef WIN bool _FResizePpvDebug(void **ppv, long cbNew, long cbOld, ulong grfmem, long mpr, DMAGL *pdmagl); #endif // WIN // freeing routine void FreePpvDebug(void **ppv, DMAGL *pdmagl); #define FreePpv(ppv) FreePpvDebug(ppv, &vdmglob.dmaglPv) void AssertPvAlloced(void *pv, long cb); void AssertUnmarkedMem(void); void UnmarkAllMem(void); void MarkPv(void *pv); #else //! DEBUG #define SuspendCheckPointers() #define ResumeCheckPointers() // allocation routine #define FAllocPvDebug(ppv, cb, grfmem, mpr, pszsFile, luLine, pdmagl) FAllocPv(ppv, cb, grfmem, mpr) bool FAllocPv(void **ppv, long cb, ulong grfmem, long mpr); // resizing routine - WIN only #ifdef WIN #define _FResizePpvDebug(ppv, cbNew, cbOld, grfmem, mpr, pdmagl) _FResizePpv(ppv, cbNew, cbOld, grfmem, mpr) bool _FResizePpv(void **ppv, long cbNew, long cbOld, ulong grfmem, long mpr); #endif // WIN // freeing routine #define FreePpvDebug(ppv, pdmagl) FreePpv(ppv) void FreePpv(void **ppv); #define AssertPvAlloced(pv, cb) #define AssertUnmarkedMem() #define UnmarkAllMem() #define MarkPv(pv) #endif //! DEBUG /**************************************** Memory trashing ****************************************/ #ifdef DEBUG #define TrashVar(pfoo) \ if (pvNil != (pfoo)) \ FillPb(pfoo, size(*(pfoo)), kbGarbage); \ else \ (void)0 #define TrashVarIf(f, pfoo) \ if ((f) && pvNil != (pfoo)) \ FillPb(pfoo, size(*(pfoo)), kbGarbage); \ else \ (void)0 #define TrashPvCb(pv, cb) \ if (pvNil != (pv)) \ FillPb(pv, cb, kbGarbage); \ else \ (void)0 #define TrashPvCbIf(f, pv, cb) \ if ((f) && pvNil != (pv)) \ FillPb(pv, cb, kbGarbage); \ else \ (void)0 #else //! DEBUG #define TrashVar(pfoo) #define TrashVarIf(f, pfoo) #define TrashPvCb(pv, cb) #define TrashPvCbIf(f, pv, cb) #endif //! DEBUG /**************************************** Pointer arithmetic ****************************************/ inline void *PvAddBv(void *pv, long bv) { return (byte *)pv + bv; } inline void *PvSubBv(void *pv, long bv) { return (byte *)pv - bv; } inline long BvSubPvs(void *pv1, void *pv2) { return (byte *)pv1 - (byte *)pv2; } /**************************************** Mutex (critical section) object ****************************************/ typedef class MUTX *PMUTX; class MUTX { protected: #ifdef WIN CRITICAL_SECTION _crit; #endif // WIN public: MUTX(void) { Win(InitializeCriticalSection(&_crit);) } ~MUTX(void) { Win(DeleteCriticalSection(&_crit);) } void Enter(void) { Win(EnterCriticalSection(&_crit);) } void Leave(void) { Win(LeaveCriticalSection(&_crit);) } }; extern MUTX vmutxMem; /**************************************** Current thread id ****************************************/ inline long LwThreadCur(void) { return MacWin(0, GetCurrentThreadId()); } #endif //! UTILMEM_H ================================================ FILE: kauai/src/utilrnd.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Some "random" stuff ***************************************************************************/ #include "util.h" ASSERTNAME RTCLASS(RND) RTCLASS(SFL) /*************************************************************************** Constructs a pseudo-random number generator. If luSeed is zero, generates a seed from the current system time (TsCurrentSystem). ***************************************************************************/ RND::RND(ulong luSeed) { if (0 == luSeed) { luSeed = TsCurrentSystem(); SwapBytesRglw((long *)&luSeed, 1); } _luSeed = luSeed; AssertThis(0); } /*************************************************************************** Return the next pseudo-random number within the range 0 to lwLim - 1, inclusive. ***************************************************************************/ long RND::LwNext(long lwLim) { AssertThis(0); AssertIn(lwLim, 1, kcbMax); // high bits are more random than the low ones // See Knuth vol 2, page 102, line 24 of table 1. // value of kdluRand doesn't matter much const ulong kluRandMul = 1566083941L; const long kdluRand = 2531011L; long lw; _luSeed = _luSeed * kluRandMul + kdluRand; // multiply lw by lwLim and divide by 2^32 #ifdef IN_80386 ulong luSeedT = _luSeed; __asm { mov eax,luSeedT mul lwLim mov lw,edx } #else //! IN_80386 double dou; dou = (double)_luSeed * lwLim / (double)0x40000000 / 4; lw = (long)dou; #endif //! IN_80386 Assert(lw < lwLim, "random number out of range"); return lw; } /*************************************************************************** Constructs a shuffled array. ***************************************************************************/ SFL::SFL(ulong luSeed) : RND(luSeed) { _clw = 0; _ilw = 0; _fCustom = fFalse; _hqrglw = hqNil; AssertThis(0); } /*************************************************************************** Destructs a shuffled array. ***************************************************************************/ SFL::~SFL(void) { AssertThis(0); FreePhq(&_hqrglw); } #ifdef DEBUG /*************************************************************************** Assert the validity of a SFL. ***************************************************************************/ void SFL::AssertValid(ulong grf) { SFL_PAR::AssertValid(0); if (_hqrglw != hqNil) { AssertHq(_hqrglw); Assert(CbOfHq(_hqrglw) == LwMul(_clw, size(long)), "HQ wrong size"); } else Assert(0 == _clw, "_clw wrong"); } /*************************************************************************** Mark memory for the SFL. ***************************************************************************/ void SFL::MarkMem(void) { AssertValid(0); SFL_PAR::MarkMem(); MarkHq(_hqrglw); } #endif // DEBUG /*************************************************************************** Shuffle the numbers [0, lwLim). ***************************************************************************/ void SFL::Shuffle(long lwLim) { AssertThis(0); AssertIn(lwLim, 0, kcbMax); long ilw; long *qrglw; if (!_FEnsureHq(lwLim)) return; _ilw = 0; Assert(_clw == lwLim, "wrong _clw"); qrglw = (long *)QvFromHq(_hqrglw); // fill the array with [0, _clw) for (ilw = 0; ilw < _clw; ilw++) qrglw[ilw] = ilw; _fCustom = fFalse; _ShuffleCore(); } /*************************************************************************** Fill the SFL with the values in prglw and shuffle them. ***************************************************************************/ void SFL::ShuffleRglw(long clw, long *prglw) { AssertThis(0); AssertIn(clw, 0, kcbMax); AssertPvCb(prglw, LwMul(clw, size(long))); if (!_FEnsureHq(clw)) return; _ilw = 0; Assert(_clw == clw, "wrong _clw"); // fill the HQ with the stuff in prglw CopyPb(prglw, QvFromHq(_hqrglw), LwMul(clw, size(long))); _fCustom = fTrue; _ShuffleCore(); } /*************************************************************************** Shuffle the entries in the HQ. ***************************************************************************/ void SFL::_ShuffleCore(void) { AssertThis(0); Assert(_clw > 0, 0); long lw; long ilw, ilwSwap; long *qrglw; // swap stuff qrglw = (long *)QvFromHq(_hqrglw); for (ilw = _clw; --ilw > 0;) { ilwSwap = RND::LwNext(ilw + 1); if (ilwSwap < ilw) { lw = qrglw[ilw]; qrglw[ilw] = qrglw[ilwSwap]; qrglw[ilwSwap] = lw; } } } /*************************************************************************** Make sure the HQ is the correct size and set clw appropriately. ***************************************************************************/ bool SFL::_FEnsureHq(long clw) { AssertThis(0); AssertIn(clw, 0, kcbMax); if (clw <= 0) goto LFail; if (_hqrglw == hqNil && !FAllocHq(&_hqrglw, LwMul(_clw = clw, size(long)), fmemNil, mprNormal)) { goto LFail; } if (clw != _clw && !FResizePhq(&_hqrglw, LwMul(_clw = clw, size(long)), fmemNil, mprNormal)) { LFail: // we are low on memory, so be nice and give some up FreePhq(&_hqrglw); _clw = 0; AssertThis(0); return fFalse; ; } AssertThis(0); return fTrue; } /*************************************************************************** Returns the next number in a shuffled array of numbers. If lwLim is zero, uses the numbers already in the SFL. Otherwise, numbers range from 0 to (lwLim - 1), inclusive. ***************************************************************************/ long SFL::LwNext(long lwLim) { AssertThis(0); AssertIn(lwLim, 0, kcbMax); if (lwLim > 0 && (lwLim != _clw || _fCustom)) { // need to reshuffle with standard values Shuffle(lwLim); _ilw = 0; if (0 == _clw) { // shuffling failed, just use the regular random number return RND::LwNext(lwLim); } } else if (_clw == 0) { // no values in the HQ, just return 0 _ilw = 0; return 0; } else if (_ilw >= _clw) { // need to reshuffle the values already in the HQ _ShuffleCore(); _ilw = 0; } AssertIn(_ilw, 0, _clw); return ((long *)QvFromHq(_hqrglw))[_ilw++]; } ================================================ FILE: kauai/src/utilrnd.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation Random number generator and shuffler stuff. ***************************************************************************/ #ifndef UTILRND_H #define UTILRND_H /*************************************************************************** A pseudo-random number generator. LwNext returns values from 0 to (lwLim - 1), inclusive. ***************************************************************************/ typedef class RND *PRND; #define RND_PAR BASE #define kclsRND 'RND' class RND : public RND_PAR { RTCLASS_DEC NOCOPY(RND) protected: ulong _luSeed; public: RND(ulong luSeed = 0L); virtual long LwNext(long lwLim); }; /*************************************************************************** A shuffled array of numbers. ***************************************************************************/ typedef class SFL *PSFL; #define SFL_PAR RND #define kclsSFL 'SFL' class SFL : public SFL_PAR { RTCLASS_DEC ASSERT MARKMEM NOCOPY(SFL) protected: long _clw; long _ilw; HQ _hqrglw; bool _fCustom; // false iff the values in the hq are [0, _clw) bool _FEnsureHq(long clw); void _ShuffleCore(void); public: SFL(ulong luSeed = 0L); ~SFL(void); void Shuffle(long lwLim); void ShuffleRglw(long clw, long *prglw); virtual long LwNext(long lwLim = 0); }; #endif // UTILRND_H ================================================ FILE: kauai/src/utilstr.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Copyright (c) Microsoft Corporation String manipulation. WARNING: Must be in a fixed (pre-loaded) seg on Mac. ***************************************************************************/ #include "util.h" ASSERTNAME #include "chtrans.h" const achar vrgchHex[] = PszLit("0123456789ABCDEF"); /*************************************************************************** Constructor for a string based on another string. ***************************************************************************/ STN::STN(STN &stnSrc) { AssertPo(&stnSrc, 0); CopyPb(stnSrc._rgch, _rgch, (stnSrc.Cch() + 2) * size(achar)); AssertThis(0); } /*************************************************************************** Constructor for a string based on an sz. ***************************************************************************/ STN::STN(PSZ pszSrc) { long cch = LwBound(CchSz(pszSrc), 0, kcchMaxStn + 1); AssertIn(cch, 0, kcchMaxStn + 1); CopyPb(pszSrc, _rgch + 1, cch * size(achar)); _rgch[0] = (achar)cch; _rgch[cch + 1] = 0; AssertThis(0); } /*************************************************************************** Assignment of one string to another. ***************************************************************************/ STN &STN::operator=(STN &stnSrc) { AssertThis(0); AssertPo(&stnSrc, 0); CopyPb(stnSrc._rgch, _rgch, (stnSrc.Cch() + 2) * size(achar)); AssertThis(0); return *this; } /*************************************************************************** Set the string to the given array of characters. ***************************************************************************/ void STN::SetRgch(achar *prgchSrc, long cch) { AssertThis(0); AssertIn(cch, 0, kcbMax); AssertPvCb(prgchSrc, cch * size(achar)); if (cch > kcchMaxStn) cch = kcchMaxStn; if (cch > 0) CopyPb(prgchSrc, _rgch + 1, cch * size(achar)); else cch = 0; // for safety _rgch[0] = (achar)cch; _rgch[cch + 1] = 0; AssertThis(0); } /*************************************************************************** Put the zero terminated short character string into the STN. ***************************************************************************/ void STN::SetSzs(PSZS pszsSrc) { AssertThis(0); AssertVarMem(pszsSrc); #ifdef UNICODE #ifdef WIN // REVIEW shonk: is this correct? long cch = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, pszsSrc, -1, _rgch + 1, kcchMaxStn); AssertIn(cch, 1, kcchMaxStn + 1); _rgch[0] = (achar)(cch - 1); _rgch[cch] = 0; #endif // WIN #ifdef MAC RawRtn(); // REVIEW shonk: Mac: implement #endif // MAC #else //! UNICODE SetSz(pszsSrc); #endif // UNICODE } /*************************************************************************** Delete (at most) cch characters starting at position ich. ***************************************************************************/ void STN::Delete(long ich, long cch) { AssertThis(0); AssertIn(cch, 0, kcbMax); long cchCur = Cch(); if (!FIn(ich, 0, cchCur)) { Assert(ich == cchCur, "Bad character position to delete from"); return; } if (ich + cch >= cchCur) { // delete to the end of the string _rgch[0] = (achar)ich; _rgch[ich + 1] = 0; } else { BltPb(_rgch + ich + cch + 1, _rgch + ich + 1, (cchCur - ich - cch) * size(achar)); _rgch[0] = (achar)(cchCur - cch); _rgch[cchCur - cch + 1] = 0; } AssertThis(0); } /*************************************************************************** Append some characters to the end of the string. ***************************************************************************/ bool STN::FAppendRgch(achar *prgchSrc, long cch) { AssertThis(0); AssertIn(cch, 0, kcbMax); AssertPvCb(prgchSrc, cch * size(achar)); bool fRet = fTrue; long cchCur = Cch(); if (cch > kcchMaxStn - cchCur) { cch = kcchMaxStn - cchCur; fRet = fFalse; } if (cch > 0) { CopyPb(prgchSrc, _rgch + cchCur + 1, cch * size(achar)); _rgch[0] = (achar)(cchCur + cch); _rgch[cchCur + cch + 1] = 0; } AssertThis(0); return fRet; } /*************************************************************************** Insert some characters into the middle of a string. ***************************************************************************/ bool STN::FInsertRgch(long ich, achar *prgchSrc, long cch) { AssertThis(0); AssertIn(cch, 0, kcbMax); AssertPvCb(prgchSrc, cch * size(achar)); bool fRet = fTrue; long cchCur = Cch(); ich = LwBound(ich, 0, cchCur + 1); if (cch > kcchMaxStn - ich) { cchCur = ich; cch = kcchMaxStn - ich; fRet = fFalse; } else if (cch > kcchMaxStn - cchCur) { cchCur = kcchMaxStn - cch - ich; fRet = fFalse; } Assert(cchCur + cch <= kcchMaxStn, 0); if (cch > 0) { if (cchCur > ich) { BltPb(_rgch + ich + 1, _rgch + ich + cch + 1, (cchCur - ich) * size(achar)); } CopyPb(prgchSrc, _rgch + ich + 1, cch * size(achar)); _rgch[0] = (achar)(cchCur + cch); _rgch[cchCur + cch + 1] = 0; } AssertThis(0); return fRet; } /*************************************************************************** Test whether the given rgch is equal to this string. This does bytewise compare - not user level comparison. ***************************************************************************/ bool STN::FEqualRgch(achar *prgch, long cch) { AssertThis(0); AssertIn(cch, 0, kcbMax); AssertPvCb(prgch, cch * size(achar)); return cch == Cch() && FEqualRgb(_rgch + 1, prgch, cch * size(achar)); } /*************************************************************************** Do user level string equality testing with the options given in grfstn. ***************************************************************************/ bool STN::FEqualUserRgch(achar *prgch, long cch, ulong grfstn) { AssertThis(0); AssertIn(cch, 0, kcbMax); AssertPvCb(prgch, cch * size(achar)); return ::FEqualUserRgch(Prgch(), Cch(), prgch, cch, grfstn); } /*************************************************************************** Return the buffer size needed by GetData, or the block size needed by STN::FWrite. ***************************************************************************/ long STN::CbData(void) { AssertThis(0); return size(short) + (Cch() + 2) * size(achar); } /*************************************************************************** Get the streamed data for the stn. pv should point to a buffer CbData() bytes long. ***************************************************************************/ void STN::GetData(void *pv) { AssertThis(0); AssertPvCb(pv, CbData()); short osk = koskCur; CopyPb(&osk, pv, size(short)); CopyPb(_rgch, PvAddBv(pv, size(short)), (Cch() + 2) * size(achar)); } /*************************************************************************** Writes the string data to the given block starting at position ib. ***************************************************************************/ bool STN::FWrite(PBLCK pblck, long ib) { AssertThis(0); AssertPo(pblck, 0); long cbWrite = CbData(); long cbTot = pblck->Cb(); short osk = koskCur; if (!FIn(ib, 0, cbTot - cbWrite + 1)) { Bug("BLCK is not big enough"); return fFalse; } if (!pblck->FWriteRgb(&osk, size(osk), ib)) return fFalse; if (!pblck->FWriteRgb(_rgch, cbWrite - size(short), ib + size(short))) return fFalse; return fTrue; } /*************************************************************************** Set the string from the given data. ***************************************************************************/ bool STN::FSetData(void *pv, long cbMax, long *pcbRead) { AssertThis(0); AssertIn(cbMax, 0, kcbMax); AssertPvCb(pv, cbMax); AssertNilOrVarMem(pcbRead); long cch, ich, ibT, cbT; wchar chw; short osk; ibT = 0; if (cbMax < size(short) + ibT) goto LFail; CopyPb(pv, &osk, size(short)); ibT += size(short); if (osk == koskCur) { // no translation needed - read the length prefix if (cbMax < ibT + size(achar)) goto LFail; CopyPb(PvAddBv(pv, ibT), &_rgch[0], size(achar)); ibT += size(achar); cch = (long)(uchar)_rgch[0]; if (!FIn(cch, 0, kcchMaxStn + 1)) goto LFail; // read the rest of the string cbT = size(achar) * (cch + 1); if (cbMax < ibT + cbT) goto LFail; CopyPb(PvAddBv(pv, ibT), _rgch + 1, cbT); ibT += cbT; // make sure the terminating zero is there if (_rgch[cch + 1] != 0) goto LFail; goto LCheck; } switch (CbCharOsk(osk)) { case size(schar): if (ibT + 2 > cbMax) goto LFail; cch = (long)(byte) * (schar *)PvAddBv(pv, ibT++); if (cch > kcchMaxStn || ibT + cch >= cbMax || *(schar *)PvAddBv(pv, ibT + cch) != 0) { goto LFail; } _rgch[0] = (achar)CchTranslateRgb(PvAddBv(pv, ibT), cch, osk, _rgch + 1, kcchMaxStn); ibT += cch + 1; cch = (long)(uchar)_rgch[0]; _rgch[cch + 1] = 0; goto LCheck; case size(wchar): if (ibT + 2 * size(wchar) > cbMax) goto LFail; CopyPb(PvAddBv(pv, ibT), &chw, size(wchar)); ibT += size(wchar); if (osk == MacWin(koskUniWin, koskUniMac)) SwapBytesRgsw(&chw, 1); cch = (long)(ushort)chw; if (cch > kcchMaxStn || ibT + (cch + 1) * size(wchar) > cbMax) goto LFail; CopyPb(PvAddBv(pv, ibT + cch * size(wchar)), &chw, size(wchar)); if (chw != 0) goto LFail; _rgch[0] = (achar)CchTranslateRgb(PvAddBv(pv, ibT), cch * size(wchar), osk, _rgch + 1, kcchMaxStn); ibT += (cch + 1) * size(wchar); cch = (long)(uchar)_rgch[0]; _rgch[cch + 1] = 0; LCheck: // make sure there aren't any other zeros. for (ich = 1; ich <= cch; ich++) { if (_rgch[ich] == 0) goto LFail; } if (pvNil != pcbRead) *pcbRead = ibT; else if (ibT != cbMax) goto LFail; AssertThis(0); return fTrue; default: LFail: PushErc(ercStnRead); Warn("bad STN data"); SetNil(); TrashVar(pcbRead); return fFalse; } } /*************************************************************************** Read a string from a block. ***************************************************************************/ bool STN::FRead(PBLCK pblck, long ib, long *pcbRead) { AssertThis(0); AssertPo(pblck, 0); AssertNilOrVarMem(pcbRead); long cch, ich, ibT, cbT, cbMax; short osk; schar chs; wchar chw; byte rgb[kcbMaxDataStn]; if (!pblck->FUnpackData()) return fFalse; cbMax = pblck->Cb(); ibT = ib; if (cbMax < size(short) + ibT || !pblck->FReadRgb(&osk, size(short), ibT)) goto LFail; ibT += size(short); if (osk == koskCur) { // no translation needed - read the length prefix if (cbMax < ibT + size(achar) || !pblck->FReadRgb(&_rgch[0], size(achar), ibT)) { goto LFail; } ibT += size(achar); cch = (long)(uchar)_rgch[0]; if (!FIn(cch, 0, kcchMaxStn + 1)) goto LFail; // read the rest of the string cbT = size(achar) * (cch + 1); if (cbMax < ibT + cbT || !pblck->FReadRgb(_rgch + 1, cbT, ibT)) goto LFail; ibT += cbT; // make sure the terminating zero is there if (_rgch[cch + 1] != 0) goto LFail; goto LCheck; } switch (CbCharOsk(osk)) { case size(schar): if (ibT + 2 > cbMax || !pblck->FReadRgb(&chs, 1, ibT++)) goto LFail; cch = (long)(byte)chs; if (cch > kcchMaxStn || ibT + cch >= cbMax || !pblck->FReadRgb(rgb, cch + 1, ibT) || rgb[cch] != 0) { goto LFail; } ibT += cch + 1; _rgch[0] = (achar)CchTranslateRgb(rgb, cch, osk, _rgch + 1, kcchMaxStn); cch = (long)(uchar)_rgch[0]; _rgch[cch + 1] = 0; goto LCheck; case size(wchar): if (ibT + 2 * size(wchar) > cbMax || !pblck->FReadRgb(&chw, size(wchar), ibT)) { goto LFail; } ibT += size(wchar); if (osk == MacWin(koskUniWin, koskUniMac)) SwapBytesRgsw(&chw, 1); cch = (long)(ushort)chw; if (cch > kcchMaxStn || ibT + (cch + 1) * size(wchar) > cbMax || !pblck->FReadRgb(rgb, (cch + 1) * size(wchar), ibT) || ((wchar *)rgb)[cch] != 0) { goto LFail; } ibT += (cch + 1) * size(wchar); _rgch[0] = (achar)CchTranslateRgb(rgb, cch * size(wchar), osk, _rgch + 1, kcchMaxStn); cch = (long)(uchar)_rgch[0]; _rgch[cch + 1] = 0; LCheck: // make sure there aren't any other zeros. for (ich = 1; ich <= cch; ich++) { if (_rgch[ich] == 0) goto LFail; } if (pvNil != pcbRead) *pcbRead = ibT; else if (ibT != cbMax) goto LFail; AssertThis(0); return fTrue; default: LFail: PushErc(ercStnRead); Warn("bad STN data or read failure"); SetNil(); TrashVar(pcbRead); return fFalse; } } /*************************************************************************** Get a zero terminated short string from this string. ***************************************************************************/ void STN::GetSzs(PSZS pszs) { AssertThis(0); AssertPvCb(pszs, kcchTotSz); #ifdef UNICODE #ifdef WIN long cchs = WideCharToMultiByte(CP_ACP, 0, _rgch + 1, -1, pszs, kcchMaxSz, pvNil, pvNil); pszs[cchs] = 0; #endif // WIN #ifdef MAC RawRtn(); // REVIEW shonk: Mac: implement pszs[0] = 0; #endif // MAC #else //! UNICODE CopyPb(_rgch + 1, pszs, Cch() + 1); #endif // UNICODE } /*************************************************************************** Format this string using the given template string and any additional parameters (ala sprintf). All parameters are assumed to be 4 bytes long. Returns false if the string ended up being too long to fit in an stn. The following controls are supported: %c (long)achar %s pstn %z psz %d signed decimal (long) %u unsigned decimal (long) %x hex %f long as a 4 character value: 'xxxx' (ala FTG and CTG values) %% a percent sign Supports the following options, in this order: Argument reordering ('<', 0 based decimal number, '>') Left justify ('-') Explicit plus sign ('+') Zero padding instead of space padding ('0') Minimum field width (decimal number) These all go between the '%' and the control letter. Note that argument reordering affects everything after the reordered arg in the control string. Eg, "%<1>d %<0>d %d %d" will use arguments in the order { 1, 0, 1, 2 }. If you just want to switch two arguments, the one following needs a number also. So the above example would be "%<1>d %<0>d %<2>d %d", producing { 1, 0, 2, 3 }. WARNING: all arguments should be 4 bytes long. ***************************************************************************/ bool STN::FFormat(PSTN pstnFormat, ...) { AssertThis(0); AssertPo(pstnFormat, 0); return FFormatRgch(pstnFormat->Prgch(), pstnFormat->Cch(), (ulong *)(&pstnFormat + 1)); } /*************************************************************************** See comments for STN::FFormat ***************************************************************************/ bool STN::FFormatSz(PSZ pszFormat, ...) { AssertThis(0); AssertSz(pszFormat); return FFormatRgch(pszFormat, CchSz(pszFormat), (ulong *)(&pszFormat + 1)); } /*************************************************************************** Core routine for sprintf functionality. ***************************************************************************/ bool STN::FFormatRgch(achar *prgchFormat, long cchFormat, ulong *prgluData) { AssertThis(0); AssertIn(cchFormat, 0, kcchMaxStn + 1); AssertPvCb(prgchFormat, cchFormat * size(achar)); AssertVarMem(prgluData); // Data Write Order - these dwo values are pcode for when to add what enum { dwoPadFirst = 0x0321, dwoPadSecond = 0x0312, dwoPadLast = 0x0132 }; achar *pchOut, *pchOutLim; achar *pchIn, *pchInLim; long cch; long cchMin; long ivArg; ulong lu, luRad; achar ch; achar rgchT[kcchMaxStn]; achar *prgchTerm; achar chSign, chPad; ulong dwo; PSTN pstn; bool fRet = fFalse; pchInLim = (pchIn = prgchFormat) + cchFormat; pchOutLim = (pchOut = _rgch + 1) + kcchMaxStn; ivArg = 0; while (pchIn < pchInLim && pchOut < pchOutLim) { if ((ch = *pchIn++) != ChLit('%')) { *pchOut++ = ch; continue; } // pre-fetch the next character if (pchIn >= pchInLim) goto LBug; ch = *pchIn++; if (ch == ChLit('%')) { *pchOut++ = ChLit('%'); continue; } dwo = dwoPadFirst; chSign = 0; chPad = kchSpace; if (ch == ChLit('<')) { ivArg = 0; for (;;) { if (ch < ChLit('0') || ch > ChLit('9')) break; ivArg = ivArg * 10 + ch - ChLit('0'); // pre-fetch the next character if (pchIn >= pchInLim) goto LBug; ch = *pchIn++; } if (ch != ChLit('>')) goto LBug; } // get qualifiers (print sign, left justify, etc) for (;;) { switch (ch) { default: goto LGetCchMin; case ChLit('-'): dwo = dwoPadLast; break; case ChLit('+'): chSign = ChLit('+'); break; case ChLit('0'): chPad = ChLit('0'); dwo = dwoPadSecond; break; } // pre-fetch the next character if (pchIn >= pchInLim) goto LBug; ch = *pchIn++; } LGetCchMin: cchMin = 0; for (;;) { if (ch < ChLit('0') || ch > ChLit('9')) break; cchMin = cchMin * 10 + ch - ChLit('0'); // pre-fetch the next character if (pchIn >= pchInLim) goto LBug; ch = *pchIn++; } // code after the switch assumes that prgchTerm points to the // characters to add to the stream and cch is the number of characters AssertPvCb(prgluData, LwMul(ivArg + 1, size(ulong))); lu = prgluData[ivArg++]; prgchTerm = rgchT; switch (ch) { case ChLit('c'): rgchT[0] = (achar)lu; cch = 1; break; case ChLit('s'): pstn = (PSTN)lu; AssertPo(pstn, 0); prgchTerm = pstn->Prgch(); cch = pstn->Cch(); break; case ChLit('z'): AssertSz((achar *)lu); prgchTerm = (achar *)lu; cch = CchSz(prgchTerm); break; case ChLit('f'): for (cch = 4; cch-- > 0; lu >>= 8) { ch = (achar)(byte)lu; if (0 == ch) ch = 1; rgchT[cch] = ch; } cch = 4; break; case ChLit('x'): // if cchMin is not 0, don't make it longer than cchMin if (cchMin > 0 && cchMin < 8) lu &= (1L << (cchMin * 4)) - 1; luRad = 16; goto LUnsigned; case ChLit('d'): if ((long)lu < 0) { chSign = ChLit('-'); lu = -(long)lu; } luRad = 10; goto LUnsigned; case ChLit('u'): luRad = 10; LUnsigned: prgchTerm = rgchT + CvFromRgv(rgchT); cch = 0; do { *--prgchTerm = vrgchHex[lu % luRad]; cch++; lu /= luRad; } while (lu != 0); break; default: LBug: Bug("bad format string"); goto LFail; } // set cchMin to the number of characters to pad cchMin = LwMax(0, cchMin - cch - (chSign != 0)); if (pchOutLim - pchOut <= cch + cchMin + (chSign != 0)) { // overflowed the output buffer goto LFail; } // arrange the sign, padding and rgch according to dwo while (dwo != 0) { switch (dwo & 0x0F) { case 1: // add padding for (; cchMin > 0; cchMin--) *pchOut++ = chPad; break; case 2: // add the sign if (chSign != 0) *pchOut++ = chSign; break; case 3: // add the text CopyPb(prgchTerm, pchOut, cch * size(achar)); pchOut += cch; break; default: BugVar("bad dwo value", &dwo); break; } dwo >>= 4; } Assert(pchOut <= pchOutLim, "bad logic above - overflowed the rgch"); } fRet = pchIn == pchInLim; LFail: cch = pchOut - _rgch - 1; AssertIn(cch, 0, kcchMaxStn + 1); _rgch[0] = (achar)cch; _rgch[cch + 1] = 0; return fRet; } /*************************************************************************** Parses the STN as a number. If lwBase is 0, automatically determines the base as one of 10, 8 or 16 (as in standard C) and allows leading spaces, '+' and '-' signs, and trailing spaces. Doesn't deal with overflow. ***************************************************************************/ bool STN::FGetLw(long *plw, long lwBase) { AssertThis(0); AssertVarMem(plw); AssertIn(lwBase, 0, 36); Assert(lwBase != 1, "base can't be 1"); long lwDigit; achar ch; bool fNegative = fFalse; PSZ psz = Psz(); if (lwBase < 2) { for (;; psz++) { switch (*psz) { case ChLit('-'): fNegative = !fNegative; continue; case ChLit('+'): case kchSpace: continue; } break; } } *plw = 0; if (*psz == 0) goto LFail; // determine the base if lwBase is zero if (0 == lwBase) { // determine the base if (ChLit('0') == psz[0]) { psz++; if (ChLit('x') == psz[0] || ChLit('X') == psz[0]) { psz++; lwBase = 16; } else lwBase = 8; } else lwBase = 10; } while (0 != (ch = *psz++)) { if (FIn(ch, ChLit('0'), ChLit('9') + 1)) lwDigit = ch - ChLit('0'); else { if (FIn(ch, ChLit('A'), ChLit('Z') + 1)) ch += ChLit('a') - ChLit('A'); else if (!FIn(ch, ChLit('a'), ChLit('z') + 1)) { // not a letter, so only spaces should follow for (; ch != 0; ch = *psz++) { if (ch != kchSpace) goto LFail; } break; } lwDigit = ch - ChLit('a') + 10; } if (lwDigit > lwBase) { LFail: TrashVar(plw); return fFalse; } *plw = *plw * lwBase + lwDigit; } if (fNegative) *plw = -*plw; return fTrue; } /*************************************************************************** Doubles any backslash characters in the string and replaces " literals with \". ***************************************************************************/ bool STN::FExpandControls(void) { AssertThis(0); achar rgch[kcchMaxStn]; achar *pchSrc, *pchDst, *pchLim, ch; long cch; bool fAny; bool fRet = fFalse; fAny = fFalse; pchSrc = Psz(); pchDst = rgch; pchLim = pchDst + kcchMaxStn; for (cch = Cch(); cch-- > 0;) { if (pchDst >= pchLim) goto LFail; ch = *pchSrc++; switch (ch) { case kchTab: ch = ChLit('t'); goto LExpand; case kchReturn: ch = ChLit('n'); goto LExpand; case ChLit('\\'): case ChLit('"'): LExpand: if (pchDst + 1 >= pchLim) goto LFail; *pchDst++ = ChLit('\\'); fAny = fTrue; break; } *pchDst++ = ch; } fRet = fTrue; LFail: if (fAny) SetRgch(rgch, pchDst - rgch); return fRet; } #ifdef DEBUG /*************************************************************************** Assert the validity of a STN. ***************************************************************************/ void STN::AssertValid(ulong grf) { AssertThisMem(); achar *pch; long cch = (long)(uchar)_rgch[0]; AssertIn(cch, 0, kcchMaxStn + 1); Assert(_rgch[cch + 1] == 0, "missing termination byte"); for (pch = _rgch + 1; *pch != 0; pch++) ; Assert(pch - _rgch == cch + 1, "internal null characters"); } #endif // DEBUG /*************************************************************************** Check the validity of an st (make sure no zeros are in it). ***************************************************************************/ bool FValidSt(PST pst) { AssertVarMem(pst); achar *pch; long cch = (long)(uchar)pst[0]; if (!FIn(cch, 0, kcchMaxSt + 1)) return fFalse; AssertPvCb(pst, (cch + kcchExtraSt) * size(achar)); for (pch = PrgchSt(pst); cch > 0 && *pch != 0; cch--, pch++) ; return (cch == 0); } /*************************************************************************** Check the validity of an stz ***************************************************************************/ bool FValidStz(PSTZ pstz) { AssertVarMem(pstz); return FValidSt(pstz) && 0 == PszStz(pstz)[CchSt(pstz)]; } /*************************************************************************** Find the length of a zero terminated string. ***************************************************************************/ long CchSz(PSZ psz) { // WARNING: don't call AssertSz, since AssertSz calls CchSz! AssertVarMem(psz); achar *pch; for (pch = psz; *pch != 0; pch++) ; Assert(pch - psz <= kcchMaxSz, "sz too long"); AssertPvCb(psz, (pch - psz + 1) * size(achar)); return pch - psz; } /*************************************************************************** Do string equality testing. This does byte-wise comparison for internal (non-user) use only! ***************************************************************************/ bool FEqualRgch(achar *prgch1, long cch1, achar *prgch2, long cch2) { AssertIn(cch1, 0, kcbMax); AssertPvCb(prgch1, cch1 * size(achar)); AssertIn(cch2, 0, kcbMax); AssertPvCb(prgch2, cch2 * size(achar)); return cch1 == cch2 && FEqualRgb(prgch1, prgch2, cch1 * size(achar)); } /*************************************************************************** Do string comparison for sorting. This is byte-wise for internal (non-user) sorting only! The sorting is byte-order independent. fcmpLt means that string 1 is less than string 2. ***************************************************************************/ ulong FcmpCompareRgch(achar *prgch1, long cch1, achar *prgch2, long cch2) { AssertIn(cch1, 0, kcbMax); AssertPvCb(prgch1, cch1 * size(achar)); AssertIn(cch2, 0, kcbMax); AssertPvCb(prgch2, cch2 * size(achar)); long ich, cbTot, cbMatch; if (cch1 < cch2) return fcmpLt; if (cch1 > cch2) return fcmpGt; cbTot = cch1 * size(achar); cbMatch = CbEqualRgb(prgch1, prgch2, cbTot); AssertIn(cbMatch, 0, cbTot + 1); if (cbTot == cbMatch) return fcmpEq; ich = cbMatch / size(achar); Assert(prgch1[ich] != prgch2[ich], 0); return prgch1[ich] < prgch2[ich] ? fcmpLt : fcmpGt; } /*************************************************************************** User level equality testing of strings. ***************************************************************************/ bool FEqualUserRgch(achar *prgch1, long cch1, achar *prgch2, long cch2, ulong grfstn) { AssertIn(cch1, 0, kcbMax); AssertPvCb(prgch1, cch1 * size(achar)); AssertIn(cch2, 0, kcbMax); AssertPvCb(prgch2, cch2 * size(achar)); long cchBuf; achar rgch1[kcchMaxStn]; achar rgch2[kcchMaxStn]; // REVIEW shonk: implement for real if (!(grfstn & fstnIgnoreCase)) return cch1 == cch2 && FEqualRgb(prgch1, prgch2, cch1 * size(achar)); if (cch1 != cch2) return fFalse; while (cch1 > 0) { cchBuf = LwMin(kcchMaxStn, cch1); CopyPb(prgch1, rgch1, cchBuf * size(achar)); CopyPb(prgch2, rgch2, cchBuf * size(achar)); #ifdef WIN CharUpperBuff(rgch1, cchBuf); CharUpperBuff(rgch2, cchBuf); #else //! WIN RawRtn(); // REVIEW shonk: Mac: implement #endif //! WIN if (!FEqualRgb(rgch1, rgch2, cchBuf * size(achar))) return fFalse; prgch1 += cchBuf; prgch2 += cchBuf; cch1 -= cchBuf; } return fTrue; } /*************************************************************************** Do user level string comparison with the given options. ***************************************************************************/ ulong FcmpCompareUserRgch(achar *prgch1, long cch1, achar *prgch2, long cch2, ulong grfstn) { AssertIn(cch1, 0, kcbMax); AssertPvCb(prgch1, cch1 * size(achar)); AssertIn(cch2, 0, kcbMax); AssertPvCb(prgch2, cch2 * size(achar)); #ifdef WIN long lw; lw = CompareString(LOCALE_USER_DEFAULT, (grfstn & fstnIgnoreCase) ? NORM_IGNORECASE : 0, prgch1, cch1, prgch2, cch2); switch (lw) { case 1: return fcmpLt; case 2: return fcmpEq; case 3: return fcmpGt; default: Bug("why did CompareString fail?"); return FcmpCompareRgch(prgch1, cch1, prgch2, cch2); } #else //! WIN RawRtn(); // REVIEW shonk: Mac: implement for real return FcmpCompareRgch(prgch1, cch1, prgch2, cch2); #endif //! WIN } /*************************************************************************** Map an array of short characters to upper case equivalents. ***************************************************************************/ void UpperRgchs(schar *prgchs, long cchs) { AssertIn(cchs, 0, kcbMax); AssertPvCb(prgchs, cchs); long ichs; static bool _fInited; if (!_fInited) { for (ichs = 0; ichs < 256; ichs++) _mpchschsUpper[ichs] = (byte)ichs; MacWin(UppercaseText(_mpchschsUpper, 256, smSystemScript), CharUpperBuffA(_mpchschsUpper, 256)); _fInited = fTrue; } for (; cchs-- != 0; prgchs++) *prgchs = _mpchschsUpper[(byte)*prgchs]; } /*************************************************************************** Map an array of characters to lower case equivalents. ***************************************************************************/ void LowerRgchs(schar *prgchs, long cchs) { AssertIn(cchs, 0, kcbMax); AssertPvCb(prgchs, cchs); long ichs; static bool _fInited; if (!_fInited) { for (ichs = 0; ichs < 256; ichs++) _mpchschsLower[ichs] = (byte)ichs; MacWin(LowercaseText(_mpchschsLower, 256, smSystemScript), CharLowerBuffA(_mpchschsLower, 256)); _fInited = fTrue; } for (; cchs-- != 0; prgchs++) *prgchs = _mpchschsLower[(byte)*prgchs]; } /*************************************************************************** Map an array of unicode characters to upper case equivalents. ***************************************************************************/ void UpperRgchw(wchar *prgchw, long cchw) { AssertIn(cchw, 0, kcbMax); AssertPvCb(prgchw, cchw * size(wchar)); #if defined(WIN) #if defined(UNICODE) CharUpperBuffW(prgchw, cchw); #else CharUpperBuffA(reinterpret_cast(prgchw), cchw); #endif //! UNICODE #else //! WIN RawRtn(); // REVIEW shonk: Mac: implement UpperRgchw #endif //! WIN } /*************************************************************************** Map an array of unicode characters to lower case equivalents. ***************************************************************************/ void LowerRgchw(wchar *prgchw, long cchw) { AssertIn(cchw, 0, kcbMax); AssertPvCb(prgchw, cchw * size(wchar)); AssertIn(cchw, 0, kcbMax); AssertPvCb(prgchw, cchw * size(wchar)); #if defined(WIN) #if defined(UNICODE) CharLowerBuffW(prgchw, cchw); #else CharLowerBuffA(reinterpret_cast(prgchw), cchw); #endif #else //! WIN RawRtn(); // REVIEW shonk: Mac: implement UpperRgchw #endif //! WIN } /*************************************************************************** Translate text from the indicated source character set to koskCur. ***************************************************************************/ long CchTranslateRgb(void *pvSrc, long cbSrc, short oskSrc, achar *prgchDst, long cchMaxDst) { AssertPvCb(pvSrc, cbSrc); AssertOsk(oskSrc); AssertPvCb(prgchDst, cchMaxDst * size(achar)); long cchT; #ifdef WIN #ifdef UNICODE switch (oskSrc) { default: return 0; case koskSbWin: case koskSbMac: return MultiByteToWideChar(oskSrc == koskSbWin ? CP_ACP : CP_MACCP, MB_PRECOMPOSED, (LPSTR)pvSrc, cbSrc, prgchDst, cchMaxDst); case koskUniMac: if (cbSrc % size(wchar) != 0) return 0; cchT = cbSrc / size(wchar); if (0 == cchMaxDst) return cchT; if (cchT > cchMaxDst) return 0; CopyPb(pvSrc, prgchDst, cchT * size(achar)); SwapBytesRgsw(prgchDst, cchT); return cchT; } #else //! UNICODE achar *pchSrc, *pchDst; switch (oskSrc) { default: return 0; case koskSbMac: if (0 == cchMaxDst) return cbSrc; if (cbSrc > cchMaxDst) return 0; pchSrc = (achar *)pvSrc; for (pchDst = prgchDst, cchT = cbSrc; cchT > 0; cchT--) { byte bT = (byte)*pchSrc++; if (bT >= (byte)0x80) *pchDst++ = _mpchschsMacToWin[bT - (byte)0x80]; else *pchDst++ = (achar)bT; } return cbSrc; case koskUniWin: case koskUniMac: if (cbSrc % size(wchar) != 0) return 0; // swap byte order if (oskSrc == koskUniMac) SwapBytesRgsw(pvSrc, cbSrc / size(wchar)); cchT = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)pvSrc, cbSrc / size(wchar), prgchDst, cchMaxDst, pvNil, pvNil); if (oskSrc == koskUniMac) SwapBytesRgsw(pvSrc, cbSrc / size(wchar)); return cchT; } #endif //! UNICODE #endif // WIN #ifdef MAC #ifdef UNICODE long cchDst; schar *pchsSrc; achar *pchDst; switch (oskSrc) { default: return 0; case koskSbWin: if (0 == cchMaxDst) return cbSrc; if (cbSrc > cchMaxDst) return 0; pchsSrc = (schar *)pvSrc; for (pchDst = prgch, cchT = cbSrc; cchT > 0; cchT--) *pchDst++ = (achar)(byte)*pchsSrc++; return cbSrc; case koskSbMac: if (0 == cchMaxDst) return cbSrc; if (cbSrc > cchMaxDst) return 0; pchsSrc = (schar *)pvSrc; for (pchDst = prgch, cchT = cbSrc; cchT > 0; cchT--) pchsSrc = (schar *)pvSrc; { byte bT = (byte)*pchsSrc++; if (bT >= (byte)0x80) *pchDst++ = (achar)_mpchschsMacToWin[bT - (byte)0x80]; else *pchDst++ = (achar)bT; } return cbSrc; case koskUniWin: if (cbSrc % size(wchar) != 0) return 0; cchT = cbSrc / size(wchar); if (0 == cchMaxDst) return cchT; if (cchT > cchMaxDst) return 0; CopyPb(pvSrc, prgchDst, cchT * size(achar)); SwapBytesRgsw(prgchDst, cchT); return cchT; } #else //! UNICODE achar *pchSrc, *pchDst; switch (oskSrc) { default: return fFalse; case koskSbWin: if (0 == cchMaxDst) return cbSrc; if (cbSrc > cchMaxDst) return 0; pchSrc = (achar *)pvSrc; for (pchDst = prgchDst, cchT = cbSrc; cchT > 0; cchT--) { byte bT = (byte)*pchSrc++; if (bT >= (byte)0x80) *pchDst++ = _mpchschsWinToMac[bT - (byte)0x80]; else *pchDst++ = (achar)bT; } return cbSrc; case koskUniWin: case koskUniMac: RawRtn(); // REVIEW shonk: Mac: implement koskUniWin, koskUniMac -> koskSbMac return 0; } #endif //! UNICODE #endif // MAC } /*************************************************************************** Translates a string between the current platform and another. If fToCur is true, the translation is from osk to koskCur, otherwise from koskCur to osk. ***************************************************************************/ void TranslateRgch(achar *prgch, long cch, short osk, bool fToCur) { AssertPvCb(prgch, cch); AssertOsk(osk); Assert(osk == koskMac || osk == koskWin, "TranslateRgch can't handle this osk"); if (koskCur == osk) return; #ifdef UNICODE // for unicode, we just have to change the byte ordering SwapBytesRgsw(prgch, cch); #else //! UNICODE auto pmpchschs = MacWin(!fToCur, fToCur) ? _mpchschsMacToWin : _mpchschsWinToMac; for (; cch > 0; cch--, prgch++) { if ((byte)*prgch >= (byte)0x80) *prgch = pmpchschs[(byte)*prgch - (byte)0x80]; } #endif //! UNICODE } /*************************************************************************** Return the type of the character. This must follow these implications: fchBreak -> fchMayBreak fchBreak -> fchControl fchIgnore -> fchControl REVIEW shonk: make GrfchFromCh handle all unicode characters. ***************************************************************************/ ulong GrfchFromCh(achar ch) { switch ((uchar)ch) { case kchReturn: return fchBreak | fchMayBreak | fchControl; case kchLineFeed: return fchIgnore | fchControl; case kchTab: return fchTab | fchMayBreak | fchControl; case kchSpace: return fchWhiteOverhang | fchMayBreak; #ifdef REVIEW // shonk: implement correctly once we get the tables from MSKK. #ifdef UNICODE // REVIEW shonk: others? 148 case (uchar)',': case (uchar)'.': case (uchar)')': case (uchar)']': case (uchar)'}': case (uchar)':': case (uchar)';': case (uchar)'?': case (uchar)'!': case (uchar)'.': case (uchar)',': return fchTestBreak; #endif // UNICODE #endif // REVIEW case 0x7F: return fchControl; default: if ((uchar)ch < kchSpace) return fchControl; return fchNil; } } #ifdef DEBUG /*************************************************************************** Validate an osk. ***************************************************************************/ void AssertOsk(short osk) { switch (osk) { case koskSbMac: case koskSbWin: case koskUniMac: case koskUniWin: break; default: BugVar("bad osk", &osk); } } /*************************************************************************** Check the validity of an st (make sure no zeros are in it). ***************************************************************************/ void AssertSt(PST pst) { Assert(FValidSt(pst), "bad st"); } /*************************************************************************** Check the validity of an stz. ***************************************************************************/ void AssertStz(PSTZ pstz) { Assert(FValidStz(pstz), "bad stz"); } /*************************************************************************** Make sure the sz isn't too long. ***************************************************************************/ void AssertSz(PSZ psz) { // CchSz does all the asserting we need long cch = CchSz(psz); } /*************************************************************************** Check the validity of an st, nil is allowed. ***************************************************************************/ void AssertNilOrSt(PST pst) { if (pst != pvNil) AssertSt(pst); } /*************************************************************************** Check the validity of an stz, nil is allowed. ***************************************************************************/ void AssertNilOrStz(PSTZ pstz) { if (pstz != pvNil) AssertStz(pstz); } /*************************************************************************** Check the validity of an sz, nil is allowed. ***************************************************************************/ void AssertNilOrSz(PSZ psz) { if (psz != pvNil) AssertSz(psz); } #endif // DEBUG ================================================ FILE: kauai/src/utilstr.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Reviewed: Copyright (c) Microsoft Corporation String manipulation declarations. We use four types of strings: stn, stz, st, sz. Unless there's good reason not to, all code should use stn's. sz - zero terminated (standard C) string. st - length byte prefixed (standard Pascal) string. stz - zero terminated and length prefixed string. stn - string class. ***************************************************************************/ #ifndef UTILSTR_H #define UTILSTR_H /*************************************************************************** OS kind for string translation - these should always have their high and low bytes equal. ***************************************************************************/ const short oskNil = 0; // signifies unknown const short koskSbMac = 0x0202; const short koskSbWin = 0x0303; const short koskUniMac = 0x0404; // big endian unicode const short koskUniWin = 0x0505; // little endian unicode #ifdef UNICODE const short koskMac = koskUniMac; const short koskWin = koskUniWin; #else //! UNICODE const short koskMac = koskSbMac; const short koskWin = koskSbWin; #endif //! UNICODE const short koskCur = MacWin(koskMac, koskWin); const short koskSb = MacWin(koskSbMac, koskSbWin); const short koskUni = MacWin(koskUniMac, koskUniWin); #ifdef DEBUG void AssertOsk(short osk); #else //! DEBUG #define AssertOsk(osk) #endif //! DEBUG /*************************************************************************** Return the number of bytes a character occupies in the given osk. ***************************************************************************/ inline long CbCharOsk(short osk) { switch (osk) { case koskSbMac: case koskSbWin: return size(schar); case koskUniMac: case koskUniWin: return size(wchar); default: return 0; } } /*************************************************************************** Constants ***************************************************************************/ const achar chNil = ChLit('\x0'); const achar kchReturn = ChLit('\xD'); const achar kchLineFeed = ChLit('\xA'); const achar kchTab = ChLit('\x9'); const achar kchSpace = ChLit(' '); const wchar kchwUnicode = 0xFEFF; const wchar kchwUnicodeSwap = 0xFFFE; const long kcchMaxSz = 255; const long kcchMaxSt = 255; const long kcchMaxStz = 255; const long kcchExtraSz = 1; const long kcchExtraSt = 1; const long kcchExtraStz = 2; const long kcchTotSz = kcchMaxSz + kcchExtraSz; const long kcchTotSt = kcchMaxSt + kcchExtraSt; const long kcchTotStz = kcchMaxStz + kcchExtraStz; const long kcchMaxStn = 255; const long kcbMaxDataStn = kcchTotStz * size(wchar) + size(short); enum { fstnNil = 0, fstnIgnoreCase, }; /*************************************************************************** String types ***************************************************************************/ typedef achar *PSZ; typedef achar *PST; typedef achar *PSTZ; typedef achar SZ[kcchTotSz]; typedef achar ST[kcchTotSt]; typedef achar STZ[kcchTotStz]; typedef schar *PSZS; typedef schar SZS[kcchTotSz]; /*************************************************************************** String related asserts ***************************************************************************/ #ifdef DEBUG void AssertRgch(achar *prgch, long cch); void AssertStz(PSTZ pstz); void AssertSt(PST pst); void AssertSz(PSZ psz); void AssertNilOrSz(PSZ psz); #else #define AssertRgch(prgch, cch) #define AssertStz(pstz) #define AssertSt(pst) #define AssertSz(psz) #define AssertNilOrSz(psz) #endif /*************************************************************************** Testing validity of an stz or st ***************************************************************************/ bool FValidStz(PSTZ pstz); bool FValidSt(PST pst); /*************************************************************************** Cch means the number of characters (not including prefix and termination bytes) and CchTot means the total number of characters including overhead. ***************************************************************************/ long CchSz(PSZ psz); inline long CchTotSz(PSZ psz) { return CchSz(psz) + kcchExtraSz; } inline long CchSt(PST pst) { AssertSt(pst); return (long)(byte)pst[0]; } inline long CchTotSt(PST pst) { AssertSt(pst); return (long)(byte)pst[0] + kcchExtraSt; } inline long CchStz(PSTZ pstz) { AssertStz(pstz); return (long)(byte)pstz[0]; } inline long CchTotStz(PSTZ pstz) { AssertStz(pstz); return (long)(byte)pstz[0] + kcchExtraStz; } inline achar *PrgchSt(PST pst) { return pst + 1; } inline PSZ PszStz(PSTZ pstz) { return pstz + 1; } /*************************************************************************** Byte-wise comparison and sorting. WARNING: these don't do normal UI level compares they do byte-wise comparison, including any length and/or terminating bytes and should be used only for internal sorting (for binary search etc). ***************************************************************************/ bool FEqualRgch(achar *prgch1, long cch1, achar *prgch2, long cch2); ulong FcmpCompareRgch(achar *prgch1, long cch1, achar *prgch2, long cch2); /*************************************************************************** User level (case insensitive, locale aware) comparison and sorting. ***************************************************************************/ bool FEqualUserRgch(achar *prgch1, long cch1, achar *prgch2, long cch2, ulong grfstn = fstnIgnoreCase); ulong FcmpCompareUserRgch(achar *prgch1, long cch1, achar *prgch2, long cch2, ulong grfstn = fstnIgnoreCase); /*************************************************************************** Upper and lower case utilies ***************************************************************************/ void UpperRgchs(schar *prgchs, long cchs); void LowerRgchs(schar *prgchs, long cchs); inline schar ChsUpper(schar chs) { UpperRgchs(&chs, 1); return chs; } inline schar ChsLower(schar chs) { LowerRgchs(&chs, 1); return chs; } void UpperRgchw(wchar *prgchw, long cchw); void LowerRgchw(wchar *prgchw, long cchw); inline wchar ChwUpper(wchar chw) { UpperRgchw(&chw, 1); return chw; } inline wchar ChwLower(wchar chw) { LowerRgchw(&chw, 1); return chw; } #ifdef UNICODE inline void UpperRgch(achar *prgch, long cch) { UpperRgchw(prgch, cch); } inline void LowerRgch(achar *prgch, long cch) { LowerRgchw(prgch, cch); } inline achar ChUpper(achar ch) { UpperRgchw(&ch, 1); return ch; } inline achar ChLower(achar ch) { LowerRgchw(&ch, 1); return ch; } #else //! UNICODE inline void UpperRgch(achar *prgch, long cch) { UpperRgchs(prgch, cch); } inline void LowerRgch(achar *prgch, long cch) { LowerRgchs(prgch, cch); } inline achar ChUpper(achar ch) { UpperRgchs(&ch, 1); return ch; } inline achar ChLower(achar ch) { LowerRgchs(&ch, 1); return ch; } #endif //! UNICODE /*************************************************************************** Translation from one OS to another (eg, Win to Mac, single byte to unicode, etc). ***************************************************************************/ long CchTranslateRgb(void *pvSrc, long cbSrc, short oskSrc, achar *prgchDst, long cchMaxDst); /*************************************************************************** These APIs assert if osk specifies a different sized character than koskCur uses. ***************************************************************************/ void TranslateRgch(achar *prgch, long cch, short osk, bool fToCur = fTrue); inline void TranslateSt(PST pst, short osk, bool fToCur = fTrue) { TranslateRgch(pst + 1, CchSt(pst), osk, fToCur); } inline void TranslateStz(PSTZ pstz, short osk, bool fToCur = fTrue) { TranslateRgch(pstz + 1, CchStz(pstz), osk, fToCur); } inline void TranslateSz(PSZ psz, short osk, bool fToCur = fTrue) { TranslateRgch(psz, CchSz(psz), osk, fToCur); } /*************************************************************************** Testing for type of character. ***************************************************************************/ enum { fchNil = 0x00, // can overhang the end of a line and doesn't need to be draw fchWhiteOverhang = 0x01, // should break a line fchBreak = 0x02, // may break a line fchMayBreak = 0x04, // should be totally ignored (and not draw) fchIgnore = 0x08, // some sort of control character fchControl = 0x10, // a tab character fchTab = 0x20, }; ulong GrfchFromCh(achar ch); /*************************************************************************** The hexadecimal digits 0 - 9, A - F. ***************************************************************************/ extern const achar vrgchHex[]; /*************************************************************************** General string class. ***************************************************************************/ typedef class STN *PSTN; class STN { ASSERT private: achar _rgch[kcchMaxStn + 2]; public: STN(void) { _rgch[0] = _rgch[1] = 0; AssertThis(0); } STN(STN &stnSrc); STN(PSZ pszSrc); // pointers to the data - these should be considered readonly! achar *Prgch(void) { AssertThis(0); return _rgch + 1; } PSZ Psz(void) { AssertThis(0); return _rgch + 1; } PST Pst(void) { AssertThis(0); return _rgch; } PSTZ Pstz(void) { AssertThis(0); return _rgch; } long Cch(void) { AssertThis(0); return (uchar)_rgch[0]; } // setting the string void SetNil(void) { AssertThis(0); _rgch[0] = _rgch[1] = 0; } void SetRgch(achar *prgchSrc, long cch); void SetSz(PSZ pszSrc) { SetRgch(pszSrc, CchSz(pszSrc)); } void SetSt(PST pstSrc) { SetRgch(PrgchSt(pstSrc), CchSt(pstSrc)); } void SetStz(PSTZ pstzSrc) { SetRgch(PszStz(pstzSrc), CchStz(pstzSrc)); } void SetSzs(PSZS pszsSrc); // assignment operators STN &operator=(STN &stnSrc); STN &operator=(PSZ pszSrc) { SetSz(pszSrc); return *this; } // getting the string into a buffer void GetRgch(achar *prgchDst) { AssertThis(0); CopyPb(Prgch(), prgchDst, Cch() * size(achar)); } void GetSz(PSZ pszDst) { AssertThis(0); CopyPb(Psz(), pszDst, (Cch() + kcchExtraSz) * size(achar)); } void GetSt(PST pstDst) { AssertThis(0); CopyPb(Pst(), pstDst, (Cch() + kcchExtraSt) * size(achar)); } void GetStz(PSTZ pstzDst) { AssertThis(0); CopyPb(Pstz(), pstzDst, (Cch() + kcchExtraStz) * size(achar)); } void GetSzs(PSZS pszs); // modifying the string void Delete(long ich, long cch = kcchMaxStn); bool FAppendRgch(achar *prgchSrc, long cch); bool FAppendCh(achar chSrc) { return FAppendRgch(&chSrc, 1); } bool FAppendSz(achar *pszSrc) { return FAppendRgch(pszSrc, CchSz(pszSrc)); } bool FAppendStn(PSTN pstnSrc) { return FAppendRgch(pstnSrc->Prgch(), pstnSrc->Cch()); } bool FInsertRgch(long ich, achar *prgchSrc, long cch); bool FInsertCh(long ich, achar chSrc) { return FInsertRgch(ich, &chSrc, 1); } bool FInsertStn(long ich, PSTN pstnSrc) { return FInsertRgch(ich, pstnSrc->Prgch(), pstnSrc->Cch()); } // for testing equality bool FEqualRgch(achar *prgch, long cch); bool FEqualSz(PSZ psz) { return FEqualRgch(psz, CchSz(psz)); } bool FEqual(PSTN pstn) { return FEqualRgch(pstn->Prgch(), pstn->Cch()); } bool FEqualUserRgch(achar *prgch, long cch, ulong grfstn = fstnIgnoreCase); bool FEqualUserSz(PSZ psz, ulong grfstn = fstnIgnoreCase) { return FEqualUserRgch(psz, CchSz(psz), grfstn); } bool FEqualUser(PSTN pstn, ulong grfstn = fstnIgnoreCase) { return FEqualUserRgch(pstn->Prgch(), pstn->Cch(), grfstn); } // for sorting ulong FcmpCompare(PSTN pstn) { return ::FcmpCompareRgch(Prgch(), Cch(), pstn->Prgch(), pstn->Cch()); } ulong FcmpCompareUser(PSTN pstn, ulong grfstn = fstnIgnoreCase) { return ::FcmpCompareUserRgch(Prgch(), Cch(), pstn->Prgch(), pstn->Cch(), grfstn); } // storing and retrieving strings to other buffers (or file). long CbData(void); void GetData(void *pv); bool FSetData(void *pv, long cbMax, long *pcbRead = pvNil); bool FWrite(PBLCK pblck, long ib); bool FRead(PBLCK pblck, long ib, long *pcbRead = pvNil); bool FFormat(PSTN pstnFormat, ...); bool FFormatSz(PSZ pszFormat, ...); bool FFormatRgch(achar *prgchFormat, long cchFormat, ulong *prgluData); bool FGetLw(long *plw, long lwBase = 0); bool FExpandControls(void); }; #endif // UTILSTR_H ================================================ FILE: kauai/src/video.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Copyright (c) Microsoft Corporation Graphical video object implementation. ***************************************************************************/ #include "frame.h" #ifdef WIN #include "mciavi.h" #endif // WIN ASSERTNAME RTCLASS(GVID) RTCLASS(GVDS) RTCLASS(GVDW) BEGIN_CMD_MAP_BASE(GVDS) END_CMD_MAP(&GVDS::FCmdAll, pvNil, kgrfcmmAll) const long kcmhlGvds = kswMin; // put videos at the head of the list /*************************************************************************** Create a video - either an HWND based one, or just a video stream, depending on fHwndBased. pgobBase is assumed to be valid for the life of the video. ***************************************************************************/ PGVID GVID::PgvidNew(PFNI pfni, PGOB pgobBase, bool fHwndBased, long hid) { AssertPo(pfni, ffniFile); AssertPo(pgobBase, 0); if (fHwndBased) return GVDW::PgvdwNew(pfni, pgobBase, hid); return GVDS::PgvdsNew(pfni, pgobBase, hid); } /*************************************************************************** Constructor for a generic video. ***************************************************************************/ GVID::GVID(long hid) : GVID_PAR(hid) { AssertBaseThis(0); } /*************************************************************************** Constructor for video stream class. ***************************************************************************/ GVDS::GVDS(long hid) : GVDS_PAR(hid) { AssertBaseThis(0); #ifdef WIN AVIFileInit(); #endif // WIN } /*************************************************************************** Destructor for video stream class. ***************************************************************************/ GVDS::~GVDS(void) { AssertBaseThis(0); #ifdef WIN if (hNil != _hdd) DrawDibClose(_hdd); if (pvNil != _pavig) AVIStreamGetFrameClose(_pavig); if (pvNil != _pavis) AVIStreamRelease(_pavis); if (pvNil != _pavif) AVIFileRelease(_pavif); AVIFileExit(); #endif // WIN } /*************************************************************************** Initialize a video stream object. ***************************************************************************/ bool GVDS::_FInit(PFNI pfni, PGOB pgobBase) { AssertBaseThis(0); AssertPo(pfni, ffniFile); AssertPo(pgobBase, 0); #ifdef WIN STN stn; AVIFILEINFO afi; _pgobBase = pgobBase; pfni->GetStnPath(&stn); if (0 != AVIFileOpen(&_pavif, stn.Psz(), OF_READ | OF_SHARE_DENY_WRITE, pvNil)) { _pavif = pvNil; goto LFail; } if (0 != AVIFileGetStream(_pavif, &_pavis, streamtypeVIDEO, 0)) { _pavis = pvNil; goto LFail; } if (pvNil == (_pavig = AVIStreamGetFrameOpen(_pavis, pvNil))) goto LFail; if (0 != AVIFileInfo(_pavif, &afi, size(afi))) goto LFail; _dxp = afi.dwWidth; _dyp = afi.dwHeight; if (0 > (_nfrMac = AVIStreamLength(_pavis))) goto LFail; if (0 > (_dnfr = AVIStreamStart(_pavis))) goto LFail; if (hNil == (_hdd = DrawDibOpen())) { LFail: PushErc(ercCantOpenVideo); return fFalse; } _nfrCur = 0; _nfrMarked = -1; return fTrue; #else //! WIN RawRtn(); return fFalse; #endif //! WIN } /*************************************************************************** Create a new video stream object. ***************************************************************************/ PGVDS GVDS::PgvdsNew(PFNI pfni, PGOB pgobBase, long hid) { AssertPo(pfni, ffniFile); PGVDS pgvds; if (hid == hidNil) hid = CMH::HidUnique(); if (pvNil == (pgvds = NewObj GVDS(hid))) return pvNil; if (!pgvds->_FInit(pfni, pgobBase)) { ReleasePpo(&pgvds); return pvNil; } return pgvds; } /*************************************************************************** Return the number of frames in the video. ***************************************************************************/ long GVDS::NfrMac(void) { AssertThis(0); return _nfrMac; } /*************************************************************************** Return the current frame of the video. ***************************************************************************/ long GVDS::NfrCur(void) { AssertThis(0); return _nfrCur; } /*************************************************************************** Advance to a particular frame. If we are playing, stop playing. This only changes internal state and doesn't mark anything. ***************************************************************************/ void GVDS::GotoNfr(long nfr) { AssertThis(0); AssertIn(nfr, 0, _nfrMac); Stop(); _nfrCur = nfr; } /*************************************************************************** Return whether or not the video is playing. ***************************************************************************/ bool GVDS::FPlaying(void) { AssertThis(0); return _fPlaying; } /*************************************************************************** Start playing at the current frame. This assumes the gob is valid until the video is stopped or nuked. The gob should call this video's Draw method in its Draw method. ***************************************************************************/ bool GVDS::FPlay(RC *prc) { AssertThis(0); AssertNilOrVarMem(prc); Stop(); if (!vpcex->FAddCmh(this, kcmhlGvds, kgrfcmmAll)) return fFalse; SetRcPlay(prc); _fPlaying = fTrue; #ifdef WIN _tsPlay = TsCurrent() - AVIStreamSampleToTime(_pavis, _nfrCur + _dnfr); #endif // WIN return fTrue; } /*************************************************************************** Set the rectangle to play into. ***************************************************************************/ void GVDS::SetRcPlay(RC *prc) { AssertThis(0); AssertNilOrVarMem(prc); if (pvNil == prc) _rcPlay.Set(0, 0, _dxp, _dyp); else _rcPlay = *prc; } /*************************************************************************** Stop playing. ***************************************************************************/ void GVDS::Stop(void) { AssertThis(0); vpcex->RemoveCmh(this, kcmhlGvds); _fPlaying = fFalse; } /*************************************************************************** Intercepts all commands, so we get to play our movie no matter what. ***************************************************************************/ bool GVDS::FCmdAll(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); if (!_fPlaying) { Stop(); return fFalse; } // update _nfrCur #ifdef WIN _nfrCur = AVIStreamTimeToSample(_pavis, TsCurrent() - _tsPlay) - _dnfr; if (_nfrCur >= _nfrMac) _nfrCur = _nfrMac - 1; else if (_nfrCur < 0) _nfrCur = 0; #endif // WIN if (_nfrCur != _nfrMarked) { _pgobBase->InvalRc(&_rcPlay, kginMark); _nfrMarked = _nfrCur; } if (_nfrCur >= _nfrMac - 1) Stop(); return fFalse; } /*************************************************************************** Call this to draw the current state of the video image. ***************************************************************************/ void GVDS::Draw(PGNV pgnv, RC *prc) { AssertThis(0); AssertPo(pgnv, 0); AssertVarMem(prc); RC rc; #ifdef WIN BITMAPINFOHEADER *pbi; if (pvNil == (pbi = (BITMAPINFOHEADER *)AVIStreamGetFrame(_pavig, _nfrCur + _dnfr))) { return; } pgnv->DrawDib(_hdd, pbi, prc); #endif // WIN } /*************************************************************************** Get the normal rectangle for the movie (top-left at (0, 0)). ***************************************************************************/ void GVDS::GetRc(RC *prc) { AssertThis(0); AssertVarMem(prc); prc->Set(0, 0, _dxp, _dyp); } #ifdef DEBUG /*************************************************************************** Assert the validity of a GVDS. ***************************************************************************/ void GVDS::AssertValid(ulong grf) { GVDS_PAR::AssertValid(0); AssertPo(_pgobBase, 0); // REVIEW shonk: fill in GVDS::AssertValid } #endif // DEBUG /*************************************************************************** Create a new video window. ***************************************************************************/ PGVDW GVDW::PgvdwNew(PFNI pfni, PGOB pgobBase, long hid) { AssertPo(pfni, ffniFile); PGVDW pgvdw; if (hid == hidNil) hid = CMH::HidUnique(); if (pvNil == (pgvdw = NewObj GVDW(hid))) return pvNil; if (!pgvdw->_FInit(pfni, pgobBase)) { ReleasePpo(&pgvdw); return pvNil; } return pgvdw; } /*************************************************************************** Constructor for a video window. ***************************************************************************/ GVDW::GVDW(long hid) : GVDW_PAR(hid) { AssertBaseThis(0); } /*************************************************************************** Destructor for a video window. ***************************************************************************/ GVDW::~GVDW(void) { AssertBaseThis(0); #ifdef WIN if (_fDeviceOpen) { MCI_GENERIC_PARMS mci; PSNDV psndv; mciSendCommand(_lwDevice, MCI_CLOSE, MCI_WAIT, (long)&mci); if (pvNil != vpsndm && pvNil != (psndv = vpsndm->PsndvFromCtg(kctgWave))) { psndv->Suspend(fFalse); } } #endif // WIN } /*************************************************************************** Initialize the GVDW. ***************************************************************************/ bool GVDW::_FInit(PFNI pfni, PGOB pgobBase) { AssertPo(pfni, ffniFile); AssertPo(pgobBase, 0); _pgobBase = pgobBase; #ifdef WIN MCI_ANIM_OPEN_PARMS mciOpen; MCI_STATUS_PARMS mciStatus; MCI_ANIM_RECT_PARMS mciRect; STN stn; PSNDV psndv; pfni->GetStnPath(&stn); ClearPb(&mciOpen, size(mciOpen)); mciOpen.lpstrDeviceType = PszLit("avivideo"); mciOpen.lpstrElementName = stn.Psz(); mciOpen.dwStyle = WS_CHILD | WS_CLIPSIBLINGS | WS_DISABLED; mciOpen.hWndParent = _pgobBase->HwndContainer(); if (0 != mciSendCommand(0, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT | MCI_ANIM_OPEN_PARENT | MCI_ANIM_OPEN_WS, (long)&mciOpen)) { goto LFail; } _lwDevice = mciOpen.wDeviceID; _fDeviceOpen = fTrue; if (pvNil != vpsndm && pvNil != (psndv = vpsndm->PsndvFromCtg(kctgWave))) { psndv->Suspend(fTrue); } // get the hwnd ClearPb(&mciStatus, size(mciStatus)); // REVIEW shonk: mmsystem.h defines MCI_ANIM_STATUS_HWND as 0x00004003, // which doesn't give us the hwnd. 4001 does! mciStatus.dwItem = 0x00004001; if (0 != mciSendCommand(_lwDevice, MCI_STATUS, MCI_STATUS_ITEM, (long)&mciStatus)) { goto LFail; } _hwndMovie = (HWND)mciStatus.dwReturn; // get the length ClearPb(&mciStatus, size(mciStatus)); mciStatus.dwItem = MCI_STATUS_LENGTH; mciStatus.dwTrack = 1; if (0 != mciSendCommand(_lwDevice, MCI_STATUS, MCI_STATUS_ITEM, (long)&mciStatus)) { goto LFail; } _nfrMac = mciStatus.dwReturn; // get the rectangle if (0 != mciSendCommand(_lwDevice, MCI_WHERE, MCI_ANIM_WHERE_SOURCE, (long)&mciRect)) { goto LFail; } _rcPlay = (RC)mciRect.rc; _dxp = _rcPlay.Dxp(); _dyp = _rcPlay.Dyp(); mciSendCommand(_lwDevice, MCI_REALIZE, MCI_ANIM_REALIZE_BKGD, 0); _cactPal = vcactRealize; return fTrue; LFail: #endif // WIN #ifdef MAC RawRtn(); // REVIEW shonk: Mac: implement GVDW::_FInit #endif // MAC PushErc(ercCantOpenVideo); return fFalse; } /*************************************************************************** Return the number of frames in the video. ***************************************************************************/ long GVDW::NfrMac(void) { AssertThis(0); return _nfrMac; } /*************************************************************************** Return the current frame of the video. ***************************************************************************/ long GVDW::NfrCur(void) { AssertThis(0); #ifdef WIN MCI_STATUS_PARMS mciStatus; // get the position ClearPb(&mciStatus, size(mciStatus)); mciStatus.dwItem = MCI_STATUS_POSITION; mciStatus.dwTrack = 1; if (0 != mciSendCommand(_lwDevice, MCI_STATUS, MCI_STATUS_ITEM, (long)&mciStatus)) { Warn("getting position failed"); return 0; } return mciStatus.dwReturn; #endif // WIN #ifdef MAC RawRtn(); // REVIEW shonk: Mac: implement GVDW::NfrCur return 0; #endif // MAC } /*************************************************************************** Advance to a particular frame. If we are playing, stop playing. This only changes internal state and doesn't mark anything. ***************************************************************************/ void GVDW::GotoNfr(long nfr) { AssertThis(0); AssertIn(nfr, 0, _nfrMac); #ifdef WIN MCI_SEEK_PARMS mciSeek; ClearPb(&mciSeek, size(mciSeek)); mciSeek.dwTo = nfr; if (0 != mciSendCommand(_lwDevice, MCI_SEEK, MCI_TO, (long)&mciSeek)) { Warn("seeking failed"); } #endif // WIN #ifdef MAC RawRtn(); // REVIEW shonk: Mac: implement GVDW::GotoNfr #endif // MAC } /*************************************************************************** Return whether or not the video is playing. ***************************************************************************/ bool GVDW::FPlaying(void) { AssertThis(0); if (!_fPlaying) return fFalse; #ifdef WIN MCI_STATUS_PARMS mciStatus; // get the mode ClearPb(&mciStatus, size(mciStatus)); mciStatus.dwItem = MCI_STATUS_MODE; mciStatus.dwTrack = 1; if (0 == mciSendCommand(_lwDevice, MCI_STATUS, MCI_STATUS_ITEM, (long)&mciStatus) && (MCI_MODE_STOP == mciStatus.dwReturn || MCI_MODE_PAUSE == mciStatus.dwReturn)) { _fPlaying = fFalse; } #endif // WIN #ifdef MAC RawRtn(); // REVIEW shonk: Mac: implement GVDW::NfrCur #endif // MAC return _fPlaying; } /*************************************************************************** Start playing at the current frame. This assumes the gob is valid until the video is stopped or nuked. The gob should call this video's Draw method in its Draw method. ***************************************************************************/ bool GVDW::FPlay(RC *prc) { AssertThis(0); AssertNilOrVarMem(prc); Stop(); #ifdef WIN MCI_ANIM_PLAY_PARMS mciPlay; // get the play rectangle SetRcPlay(prc); // position the hwnd _SetRc(); // start the movie playing ClearPb(&mciPlay, size(mciPlay)); if (0 != mciSendCommand(_lwDevice, MCI_PLAY, MCI_MCIAVI_PLAY_WINDOW, (long)&mciPlay)) { return fFalse; } _fPlaying = fTrue; return fTrue; #endif // WIN #ifdef MAC RawRtn(); // REVIEW shonk: Mac: implement GVDW::NfrCur return fFalse; #endif // MAC } /*************************************************************************** Set the rectangle to play into. ***************************************************************************/ void GVDW::SetRcPlay(RC *prc) { AssertThis(0); AssertNilOrVarMem(prc); if (pvNil == prc) _rcPlay.Set(0, 0, _dxp, _dyp); else _rcPlay = *prc; } /*************************************************************************** Stop playing. ***************************************************************************/ void GVDW::Stop(void) { AssertThis(0); if (!_fPlaying) return; #ifdef WIN MCI_GENERIC_PARMS mciPause; ClearPb(&mciPause, size(mciPause)); mciSendCommand(_lwDevice, MCI_PAUSE, 0, (long)&mciPause); #endif // WIN #ifdef MAC RawRtn(); // REVIEW shonk: Mac: implement GVDW::Stop #endif // MAC _fPlaying = fFalse; } /*************************************************************************** Call this to draw the current state of the video image. ***************************************************************************/ void GVDW::Draw(PGNV pgnv, RC *prc) { AssertThis(0); AssertPo(pgnv, 0); AssertVarMem(prc); _SetRc(); } /*************************************************************************** Position the hwnd associated with the video to match the GOB's position. ***************************************************************************/ void GVDW::_SetRc(void) { AssertThis(0); RC rcGob, rc; _pgobBase->GetRc(&rcGob, cooHwnd); rc = _rcPlay; rc.Offset(rcGob.xpLeft, rcGob.ypTop); if (_rc != rc || !_fVisible) { #ifdef WIN MoveWindow(_hwndMovie, rc.xpLeft, rc.ypTop, rc.Dxp(), rc.Dyp(), fTrue); if (!_fVisible) { MCI_ANIM_WINDOW_PARMS mciWindow; // show the playback window ClearPb(&mciWindow, size(mciWindow)); mciWindow.nCmdShow = SW_SHOW; mciSendCommand(_lwDevice, MCI_WINDOW, MCI_ANIM_WINDOW_STATE, (long)&mciWindow); _fVisible = fTrue; } #endif // WIN #ifdef MAC RawRtn(); // REVIEW shonk: Mac: implement GVDW::_SetRc #endif // MAC _rc = rc; } if (_cactPal != vcactRealize) { #ifdef WIN mciSendCommand(_lwDevice, MCI_REALIZE, MCI_ANIM_REALIZE_BKGD, 0); #endif // WIN #ifdef MAC RawRtn(); // REVIEW shonk: Mac: implement GVDW::_SetRc #endif // MAC _cactPal = vcactRealize; } } /*************************************************************************** Get the normal rectangle for the movie (top-left at (0, 0)). ***************************************************************************/ void GVDW::GetRc(RC *prc) { AssertThis(0); AssertVarMem(prc); prc->Set(0, 0, _dxp, _dyp); } #ifdef DEBUG /*************************************************************************** Assert the validity of a GVDW. ***************************************************************************/ void GVDW::AssertValid(ulong grf) { GVDW_PAR::AssertValid(0); Assert(_hwndMovie != hNil, 0); AssertPo(_pgobBase, 0); } #endif // DEBUG ================================================ FILE: kauai/src/video.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Copyright (c) Microsoft Corporation Video playback. ***************************************************************************/ #ifndef VIDEO_H #define VIDEO_H /*************************************************************************** Generic video class. This is an interface that supports the GVDS (video stream) and GVDW (video window) classes. ***************************************************************************/ typedef class GVID *PGVID; #define GVID_PAR CMH #define kclsGVID 'GVID' class GVID : public GVID_PAR { RTCLASS_DEC protected: GVID(long hid); ~GVID(void) { } public: static PGVID PgvidNew(PFNI pfni, PGOB pgobBase, bool fHwndBased = fFalse, long hid = hidNil); virtual long NfrMac(void) = 0; virtual long NfrCur(void) = 0; virtual void GotoNfr(long nfr) = 0; virtual bool FPlaying(void) = 0; virtual bool FPlay(RC *prc = pvNil) = 0; virtual void Stop(void) = 0; virtual void Draw(PGNV pgnv, RC *prc) = 0; virtual void GetRc(RC *prc) = 0; virtual void SetRcPlay(RC *prc) = 0; }; /**************************************** Video stream class. ****************************************/ typedef class GVDS *PGVDS; #define GVDS_PAR GVID #define kclsGVDS 'GVDS' class GVDS : public GVDS_PAR { RTCLASS_DEC CMD_MAP_DEC(GVDS) ASSERT protected: long _nfrMac; long _nfrCur; long _nfrMarked; long _dxp; long _dyp; PGOB _pgobBase; RC _rcPlay; ulong _tsPlay; bool _fPlaying; #ifdef WIN long _dnfr; PAVIFILE _pavif; PAVISTREAM _pavis; PGETFRAME _pavig; HDRAWDIB _hdd; #endif // WIN GVDS(long hid); ~GVDS(void); virtual bool _FInit(PFNI pfni, PGOB pgobBase); public: static PGVDS PgvdsNew(PFNI pfni, PGOB pgobBase, long hid = hidNil); virtual long NfrMac(void); virtual long NfrCur(void); virtual void GotoNfr(long nfr); virtual bool FPlaying(void); virtual bool FPlay(RC *prc = pvNil); virtual void Stop(void); virtual void Draw(PGNV pgnv, RC *prc); virtual void GetRc(RC *prc); virtual void SetRcPlay(RC *prc); virtual bool FCmdAll(PCMD pcmd); }; /**************************************** Video in a window class. ****************************************/ typedef class GVDW *PGVDW; #define GVDW_PAR GVID #define kclsGVDW 'GVDW' class GVDW : public GVDW_PAR { RTCLASS_DEC ASSERT protected: HWND _hwndMovie; long _lwDevice; long _dxp; long _dyp; RC _rc; RC _rcPlay; long _nfrMac; PGOB _pgobBase; long _cactPal; bool _fDeviceOpen : 1; bool _fPlaying : 1; bool _fVisible : 1; GVDW(long hid); ~GVDW(void); virtual bool _FInit(PFNI pfni, PGOB pgobBase); virtual void _SetRc(void); public: static PGVDW PgvdwNew(PFNI pfni, PGOB pgobBase, long hid = hidNil); virtual long NfrMac(void); virtual long NfrCur(void); virtual void GotoNfr(long nfr); virtual bool FPlaying(void); virtual bool FPlay(RC *prc = pvNil); virtual void Stop(void); virtual void Draw(PGNV pgnv, RC *prc); virtual void GetRc(RC *prc); virtual void SetRcPlay(RC *prc); }; #endif //! VIDEO_H ================================================ FILE: kauai/tools/chdoc.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Chunky editor document management ***************************************************************************/ #include "ched.h" ASSERTNAME BEGIN_CMD_MAP(DCD, DDG) ON_CID_GEN(cidAddChunk, &DCD::FCmdAddChunk, pvNil) ON_CID_GEN(cidAddPicChunk, &DCD::FCmdAddPicChunk, pvNil) ON_CID_GEN(cidAddMbmpChunk, &DCD::FCmdAddBitmapChunk, pvNil) ON_CID_GEN(cidAddMaskChunk, &DCD::FCmdAddBitmapChunk, pvNil) ON_CID_GEN(cidCompilePostScript, &DCD::FCmdImportScript, pvNil) ON_CID_GEN(cidCompileInScript, &DCD::FCmdImportScript, pvNil) ON_CID_GEN(cidTestScript, &DCD::FCmdTestScript, &DCD::FEnableDcdCmd) ON_CID_GEN(cidRunScriptCache, &DCD::FCmdTestScript, &DCD::FEnableDcdCmd) ON_CID_GEN(cidAddFileChunk, &DCD::FCmdAddFileChunk, pvNil) ON_CID_GEN(cidAdoptChunk, &DCD::FCmdAdoptChunk, pvNil) ON_CID_GEN(cidDeleteChunk, &DCD::FCmdDeleteChunk, &DCD::FEnableDcdCmd) ON_CID_GEN(cidUndeleteChunk, &DCD::FCmdDeleteChunk, &DCD::FEnableDcdCmd) ON_CID_GEN(cidUnadoptChunk, &DCD::FCmdUnadoptChunk, &DCD::FEnableDcdCmd) ON_CID_GEN(cidEditNatural, &DCD::FCmdEditChunk, &DCD::FEnableDcdCmd) ON_CID_GEN(cidEditHex, &DCD::FCmdEditChunk, &DCD::FEnableDcdCmd) ON_CID_GEN(cidEditGL, &DCD::FCmdEditChunk, &DCD::FEnableDcdCmd) ON_CID_GEN(cidEditAL, &DCD::FCmdEditChunk, &DCD::FEnableDcdCmd) ON_CID_GEN(cidEditGG, &DCD::FCmdEditChunk, &DCD::FEnableDcdCmd) ON_CID_GEN(cidEditAG, &DCD::FCmdEditChunk, &DCD::FEnableDcdCmd) ON_CID_GEN(cidEditGST, &DCD::FCmdEditChunk, &DCD::FEnableDcdCmd) ON_CID_GEN(cidEditAST, &DCD::FCmdEditChunk, &DCD::FEnableDcdCmd) ON_CID_GEN(cidEditPic, &DCD::FCmdEditChunk, &DCD::FEnableDcdCmd) ON_CID_GEN(cidEditMbmp, &DCD::FCmdEditChunk, &DCD::FEnableDcdCmd) ON_CID_GEN(cidPlaySound, &DCD::FCmdEditChunk, &DCD::FEnableDcdCmd) ON_CID_GEN(cidStopSound, &DCD::FCmdStopSound, pvNil) ON_CID_GEN(cidDisassembleScript, &DCD::FCmdDisasmScript, &DCD::FEnableDcdCmd) ON_CID_GEN(cidEditChunkInfo, &DCD::FCmdEditChunkInfo, &DCD::FEnableDcdCmd) ON_CID_GEN(cidChangeChid, &DCD::FCmdChangeChid, &DCD::FEnableDcdCmd) ON_CID_GEN(cidSetColorTable, &DCD::FCmdSetColorTable, &DCD::FEnableDcdCmd) ON_CID_GEN(cidFilterChunk, &DCD::FCmdFilterChunk, pvNil) ON_CID_GEN(cidPack, &DCD::FCmdPack, &DCD::FEnableDcdCmd) ON_CID_GEN(cidTogglePack, &DCD::FCmdPack, &DCD::FEnableDcdCmd) ON_CID_GEN(cidCloneChunk, &DCD::FCmdCloneChunk, &DCD::FEnableDcdCmd) ON_CID_GEN(cidReopen, &DCD::FCmdReopen, pvNil) END_CMD_MAP_NIL() BEGIN_CMD_MAP(TSCG, GOB) ON_CID_GEN(cidClose, &GOB::FCmdCloseWnd, pvNil) END_CMD_MAP_NIL() bool _FGetCtg(PDLG pdlg, long idit, CTG *pctg); void _PutCtgStn(PDLG pdlg, long idit, CTG ctg); RTCLASS(DOC) RTCLASS(DOCE) RTCLASS(DCLB) RTCLASS(DCD) RTCLASS(SEL) RTCLASS(TSCG) /**************************************** Add Chunk dialog ****************************************/ enum { kiditOkInfo, kiditCancelInfo, kiditCtgInfo, kiditCnoInfo, kiditNameInfo, kiditLimInfo }; // add chunk data struct ADCD { PCFL pcfl; bool fCkiValid; CKI cki; }; bool _FDlgAddChunk(PDLG pdlg, long *pidit, void *pv); /*************************************************************************** Dialog proc for Add Chunk dialog. pv should be a padcd. ***************************************************************************/ bool _FDlgAddChunk(PDLG pdlg, long *pidit, void *pv) { AssertPo(pdlg, 0); AssertVarMem(pidit); CTG ctg; long lw; bool fEmpty; ADCD *padcd = (ADCD *)pv; switch (*pidit) { case kiditCancelInfo: return fTrue; // dismiss the dialog case kiditOkInfo: if (!pdlg->FGetValues(0, kiditLimInfo)) { *pidit = ivNil; return fTrue; } if (!_FGetCtg(pdlg, kiditCtgInfo, &ctg)) { vpappb->TGiveAlertSz(PszLit("CTG is bad"), bkOk, cokStop); pdlg->SelectDit(kiditCtgInfo); return fFalse; } if (!pdlg->FGetLwFromEdit(kiditCnoInfo, &lw, &fEmpty) && !fEmpty) { vpappb->TGiveAlertSz(PszLit("CNO is bad"), bkOk, cokStop); pdlg->SelectDit(kiditCnoInfo); return fFalse; } AssertPo(padcd->pcfl, 0); if (!fEmpty && (!padcd->fCkiValid || ctg != padcd->cki.ctg || lw != (long)padcd->cki.cno) && padcd->pcfl->FFind(ctg, lw)) { tribool tRet = vpappb->TGiveAlertSz(PszLit("A chunk with this CTG & CNO") PszLit(" already exists. Replace the existing chunk?"), bkYesNoCancel, cokQuestion); switch (tRet) { case tMaybe: *pidit = kiditCancelInfo; return fTrue; case tNo: pdlg->SelectDit(kiditCnoInfo); return fFalse; } } return fTrue; default: break; } return fFalse; } /*************************************************************************** Constructor for DOC class. ***************************************************************************/ DOC::DOC(void) { _pcfl = pvNil; } /*************************************************************************** Destructor for DOC class. ***************************************************************************/ DOC::~DOC(void) { ReleasePpo(&_pcfl); } /*************************************************************************** Static method to create a new document based on the given fni. Use pfni == pvNil to create a new file, non-nil to open an existing file. ***************************************************************************/ PDOC DOC::PdocNew(FNI *pfni) { PCFL pcfl; PDOC pdoc; if (pvNil == pfni) pcfl = CFL::PcflCreateTemp(); else { AssertPo(pfni, ffniFile); // make sure no other docs are based on this pcfl. if (pvNil != DOCB::PdocbFromFni(pfni)) return pvNil; pcfl = CFL::PcflOpen(pfni, fcflNil); } if (pvNil == pcfl) return pvNil; if (pvNil == (pdoc = NewObj DOC())) { ReleasePpo(&pcfl); return pvNil; } pdoc->_pcfl = pcfl; AssertPo(pdoc, 0); return pdoc; } /*************************************************************************** Create a new DDG for the doc. ***************************************************************************/ PDDG DOC::PddgNew(PGCB pgcb) { AssertThis(0); return DCD::PdcdNew(this, _pcfl, pgcb); } /*************************************************************************** Get the current FNI for the doc. Return false if the doc is not currently based on an FNI (it's a new doc or an internal one). ***************************************************************************/ bool DOC::FGetFni(FNI *pfni) { AssertThis(0); AssertBasePo(pfni, 0); if (_pcfl->FTemp()) return fFalse; _pcfl->GetFni(pfni); return fTrue; } /*************************************************************************** Save the document and optionally set this fni as the current one. If the doc is currently based on an FNI, pfni may be nil, indicating that this is a normal save (not save as). If pfni is not nil and fSetFni is false, this just writes a copy of the doc but doesn't change the doc one bit. ***************************************************************************/ bool DOC::FSaveToFni(FNI *pfni, bool fSetFni) { AssertThis(0); if (!fSetFni && pvNil != pfni) { if (!_pcfl->FSaveACopy(kctgChed, pfni)) goto LFail; return fTrue; } if (!_pcfl->FSave(kctgChed, pfni)) { LFail: vpappb->TGiveAlertSz(PszLit("Saving chunky file failed!"), bkOk, cokExclamation); return fFalse; } _fDirty = fFalse; _pcfl->SetTemp(fFalse); return fTrue; } /*************************************************************************** Ask the user what file they want to save to. ***************************************************************************/ bool DOC::FGetFniSave(FNI *pfni) { AssertThis(0); return FGetFniSaveMacro(pfni, 'CHN2', "\x9" "Save As: ", "", PszLit("All files\0*.*\0"), vwig.hwndApp); } #ifdef DEBUG /*************************************************************************** Assert the validity of the DOC. ***************************************************************************/ void DOC::AssertValid(ulong grf) { DOC_PAR::AssertValid(grf); AssertPo(_pcfl, 0); } #endif // DEBUG /*************************************************************************** Constructor for chunk editing doc. ***************************************************************************/ DOCE::DOCE(PDOCB pdocb, PCFL pcfl, CTG ctg, CNO cno) : DOCB(pdocb) { _pcfl = pcfl; _ctg = ctg; _cno = cno; AssertThis(0); } /*************************************************************************** Initialize the DOCH - initialize the stream. ***************************************************************************/ bool DOCE::_FInit(void) { BLCK blck; if (!_pcfl->FFind(_ctg, _cno, &blck)) { Bug("Chunk not found"); return fFalse; } if (!_FRead(&blck)) return fFalse; return fTrue; } /*************************************************************************** Static method to look for a DOCE for the given chunk. ***************************************************************************/ PDOCE DOCE::PdoceFromChunk(PDOCB pdocb, PCFL pcfl, CTG ctg, CNO cno) { PDOCE pdoce; for (pdocb = pdocb->PdocbChd(); pvNil != pdocb; pdocb = pdocb->PdocbSib()) { if (!pdocb->FIs(kclsDOCE)) continue; pdoce = (PDOCE)pdocb; AssertPo(pdoce, 0); if (pdoce->_pcfl == pcfl && pdoce->_ctg == ctg && pdoce->_cno == cno) return pdoce; } return pvNil; } /*************************************************************************** Static method: For all DOCE children of the DOCB, checks if the chunk still exists and nukes the DOCE if not. ***************************************************************************/ void DOCE::CloseDeletedDoce(PDOCB pdocb) { PDOCB pdocbNext; PDOCE pdoce; for (pdocb = pdocb->PdocbChd(); pvNil != pdocb; pdocb = pdocbNext) { pdocbNext = pdocb->PdocbSib(); if (!pdocb->FIs(kclsDOCE)) continue; pdoce = (PDOCE)pdocb; // NOTE: can't assert the pdoce here because the chunk may be gone // AssertPo(pdoce, 0); AssertPo(pdoce->_pcfl, 0); if (!pdoce->_pcfl->FFind(pdoce->_ctg, pdoce->_cno)) pdoce->CloseAllDdg(); else AssertPo(pdoce, 0); } } /*************************************************************************** Get the name of the item document. ***************************************************************************/ void DOCE::GetName(PSTN pstn) { AssertThis(0); STN stn; stn.FFormatSz(PszLit(": %f %08x"), _ctg, _cno); _pdocbPar->GetName(pstn); pstn->FAppendStn(&stn); } /*************************************************************************** Save the document. Handles cidSave, cidSaveAs and cidSaveCopy. ***************************************************************************/ bool DOCE::FSave(long cid) { AssertThis(0); CTG ctg; CNO cno; bool fCreated = fFalse; PDLG pdlg = pvNil; switch (cid) { case cidSave: ctg = _ctg; cno = _cno; break; case cidSaveAs: case cidSaveCopy: long idit; long lw; ADCD adcd; // put up the dialog adcd.pcfl = _pcfl; adcd.fCkiValid = fTrue; adcd.cki.ctg = _ctg; adcd.cki.cno = _cno; pdlg = DLG::PdlgNew(dlidChunkInfo, _FDlgAddChunk, &adcd); if (pvNil == pdlg) goto LCancel; _PutCtgStn(pdlg, kiditCtgInfo, _ctg); idit = kiditCnoInfo; idit = pdlg->IditDo(idit); if (idit != kiditOkInfo) goto LCancel; if (!_FGetCtg(pdlg, kiditCtgInfo, &ctg) || !pdlg->FGetLwFromEdit(kiditCnoInfo, &lw, &fCreated) && !fCreated) { goto LFail; } ReleasePpo(&pdlg); cno = lw; if (fCreated) { if (!_pcfl->FAdd(0, ctg, &cno)) goto LFail; } break; default: return fFalse; } if (_FSaveToChunk(ctg, cno, cid != cidSaveCopy)) { PDOCB pdocb; PDDG pddg; if (pvNil != (pdocb = PdocbPar()) && pvNil != (pddg = pdocb->PddgGet(0)) && pddg->FIs(kclsDCD)) { ((PDCD)pddg)->InvalAllDcd(pdocb, _pcfl); } if (cid != cidSaveCopy) UpdateName(); return fTrue; } // saving failed if (fCreated) _pcfl->Delete(ctg, cno); LFail: vpappb->TGiveAlertSz(PszLit("Saving chunk failed"), bkOk, cokExclamation); LCancel: ReleasePpo(&pdlg); return fFalse; } /*************************************************************************** Save the chunk data to a chunk. ***************************************************************************/ bool DOCE::_FSaveToChunk(CTG ctg, CNO cno, bool fRedirect) { AssertThis(0); CNO cnoT; CKI cki; BLCK blck; long cb = _CbOnFile(); // if the chunk already exists, add a temporary chunk, swap the data // between the two chunks, then delete the temporary chunk. // if the chunk doesn't yet exist, create it. if (!_pcfl->FFind(ctg, cno)) { cnoT = cno; if (!_pcfl->FPut(cb, ctg, cno, &blck)) return fFalse; } else if (!_pcfl->FAdd(cb, ctg, &cnoT, &blck)) return fFalse; if (!_FWrite(&blck, fRedirect)) { _pcfl->Delete(ctg, cnoT); return fFalse; } if (cno != cnoT) { _pcfl->SwapData(ctg, cno, ctg, cnoT); _pcfl->Delete(ctg, cnoT); } if (fRedirect) { _ctg = ctg; _cno = cno; _fDirty = fFalse; } // need to invalidate the line cki.ctg = ctg; cki.cno = cno; DCD::InvalAllDcd(_pdocbPar, _pcfl, &cki); return fTrue; } #ifdef DEBUG /*************************************************************************** Assert the validity of an object. ***************************************************************************/ void DOCE::AssertValid(ulong grf) { DOCE_PAR::AssertValid(0); AssertPo(_pcfl, 0); Assert(_pcfl->FFind(_ctg, _cno), "chunk not in CFL"); } #endif // DEBUG /*************************************************************************** Constructor for a DCLB. ***************************************************************************/ DCLB::DCLB(PDOCB pdocb, PGCB pgcb) : DDG(pdocb, pgcb) { achar ch; RC rc; GNV gnv(this); _dypHeader = 0; _onn = vpappb->OnnDefFixed(); gnv.SetOnn(_onn); ch = 'A'; gnv.GetRcFromRgch(&rc, &ch, 1, 0, 0); _dypLine = rc.Dyp(); _dxpChar = rc.Dxp(); AssertThis(0); } /*************************************************************************** Return the ln that corresponds with the given yp value. If yp is in the header, returns lnNil. ***************************************************************************/ long DCLB::_LnFromYp(long yp) { AssertThis(0); if (yp < _dypHeader) return lnNil; return _scvVert + (yp - _dypHeader) / _dypLine; } /*************************************************************************** Perform a scroll according to scaHorz and scaVert. ***************************************************************************/ void DCLB::_Scroll(long scaHorz, long scaVert, long scvHorz, long scvVert) { AssertThis(0); RC rc; long dscvHorz, dscvVert; long dxp, dyp; _GetContent(&rc); dscvHorz = dscvVert = 0; dxp = 0; switch (scaHorz) { case scaPageUp: dscvHorz = -LwMax(1, LwMulDiv(rc.Dxp(), 9, 10) / _dxpChar); goto LHorz; case scaPageDown: dscvHorz = LwMax(1, LwMulDiv(rc.Dxp(), 9, 10) / _dxpChar); goto LHorz; case scaLineUp: dscvHorz = -LwMax(1, rc.Dxp() / 10 / _dxpChar); goto LHorz; case scaLineDown: dscvHorz = LwMax(1, rc.Dxp() / 10 / _dxpChar); goto LHorz; case scaToVal: dscvHorz = scvHorz - _scvHorz; LHorz: dscvHorz = LwBound(_scvHorz + dscvHorz, 0, _ScvMax(fFalse) + 1) - _scvHorz; _scvHorz += dscvHorz; dxp = LwMul(dscvHorz, _dxpChar); break; } dyp = 0; switch (scaVert) { case scaPageUp: dscvVert = -LwMax(1, rc.Dyp() / _dypLine - 1); goto LVert; case scaPageDown: dscvVert = LwMax(1, rc.Dyp() / _dypLine - 1); goto LVert; case scaLineUp: dscvVert = -1; goto LVert; case scaLineDown: dscvVert = 1; goto LVert; case scaToVal: dscvVert = scvVert - _scvVert; LVert: dscvVert = LwBound(_scvVert + dscvVert, 0, _ScvMax(fTrue) + 1) - _scvVert; _scvVert += dscvVert; dyp = LwMul(dscvVert, _dypLine); break; } _SetScrollValues(); if (dxp != 0 || dyp != 0) _ScrollDxpDyp(dxp, dyp); } /*************************************************************************** Move the bits in the window. ***************************************************************************/ void DCLB::_ScrollDxpDyp(long dxp, long dyp) { AssertThis(0); RC rc; _GetContent(&rc); Scroll(&rc, -dxp, -dyp, kginDraw); if (0 != dxp) { // scroll the header rc.ypTop = 0; rc.ypBottom = _dypHeader - 1; Scroll(&rc, -dxp, 0, kginDraw); } } /*************************************************************************** Get the content part of the DCLB minus header (and any future footer). ***************************************************************************/ void DCLB::_GetContent(RC *prc) { GetRc(prc, cooLocal); prc->ypTop += _dypHeader; } /*************************************************************************** Fill in reasonable minimum and maximum sizes. ***************************************************************************/ void DCLB::GetMinMax(RC *prcMinMax) { prcMinMax->xpLeft = 20 * _dxpChar; prcMinMax->ypTop = _dypHeader + 2 * _dypLine; prcMinMax->xpRight = kswMax; prcMinMax->ypBottom = kswMax; } #ifdef DEBUG /*************************************************************************** Assert the validity of an object. ***************************************************************************/ void DCLB::AssertValid(ulong grf) { DCLB_PAR::AssertValid(0); AssertIn(_dypLine, 1, 1000); AssertIn(_dxpChar, 1, 1000); AssertIn(_dypHeader, 0, 1000); } #endif // DEBUG /*************************************************************************** Constructor for the DCD. ***************************************************************************/ DCD::DCD(PDOCB pdocb, PCFL pcfl, PGCB pgcb) : DCLB(pdocb, pgcb), _sel(pcfl) { _pcfl = pcfl; _dypBorder = 1; _dypLine += _dypBorder; _dypHeader = _dypLine; AssertThis(0); } /*************************************************************************** Static method to create a new DCD. ***************************************************************************/ PDCD DCD::PdcdNew(PDOCB pdocb, PCFL pcfl, PGCB pgcb) { PDCD pdcd; if (pvNil == (pdcd = NewObj DCD(pdocb, pcfl, pgcb))) return pvNil; if (!pdcd->_FInit()) { ReleasePpo(&pdcd); return pvNil; } pdcd->Activate(fTrue); AssertPo(pdcd, 0); return pdcd; } /*************************************************************************** We're being activated or deactivated, invert the sel. ***************************************************************************/ void DCD::_Activate(bool fActive) { AssertThis(0); DDG::_Activate(fActive); GNV gnv(this); _DrawSel(&gnv); } /*************************************************************************** Static method: should be called by any code that edits the pcfl. *pcki and *pkid should be at or before the first line modified. pcki and pkid can be nil. ***************************************************************************/ void DCD::InvalAllDcd(PDOCB pdocb, PCFL pcfl, CKI *pcki, KID *pkid) { AssertPo(pdocb, 0); AssertPo(pcfl, 0); AssertNilOrVarMem(pcki); AssertNilOrVarMem(pkid); long ipddg; PDDG pddg; PDCD pdcd; // mark the document dirty pdocb->SetDirty(); // inform the DCDs for (ipddg = 0; pvNil != (pddg = pdocb->PddgGet(ipddg)); ipddg++) { if (!pddg->FIs(kclsDCD)) continue; pdcd = (PDCD)pddg; AssertPo(pdcd, 0); if (pdcd->_pcfl == pcfl) pdcd->_InvalCkiKid(pcki, pkid); } } /*************************************************************************** Invalidate the display from (pcki, pkid) to the end of the display. If we're the active DCD, also redraw. ***************************************************************************/ void DCD::_InvalCkiKid(CKI *pcki, KID *pkid) { AssertThis(0); AssertNilOrVarMem(pcki); AssertNilOrVarMem(pkid); RC rc; long lnMin; // we need to recalculate the lnLim _sel.InvalLim(); if (pvNil != pcki) { SEL sel = _sel; sel.FSetCkiKid(pcki, pkid, fFalse); lnMin = sel.Ln(); } else lnMin = lnNil; // correct the sel if (lnNil != _sel.Ln() && _sel.Ln() >= lnMin) _sel.Adjust(); GetRc(&rc, cooLocal); rc.ypTop = LwMax(0, _YpFromLn(lnMin) - _dypBorder); if (rc.FEmpty()) return; if (_fActive) { ValidRc(&rc, kginDraw); InvalRc(&rc, kginDraw); } else InvalRc(&rc); } /*************************************************************************** Draw the chunk list ***************************************************************************/ void DCD::Draw(PGNV pgnv, RC *prcClip) { AssertThis(0); AssertPo(pgnv, 0); AssertVarMem(prcClip); STN stn; STN stnT; RC rc; long yp, xp; long ikid, cckiRef; CKI cki; KID kid; BLCK blck; ulong grfsel; SEL sel = _sel; pgnv->ClipRc(prcClip); pgnv->SetOnn(_onn); xp = _XpFromIch(0); // draw the header rc = *prcClip; rc.ypTop = 0; rc.ypBottom = _dypHeader - _dypBorder; pgnv->FillRc(&rc, kacrWhite); stn.FFormatSz(PszLit("LPF PARS SIZE (CHID) CTG CNO Name Lines: %d"), _sel.LnLim()); pgnv->DrawStn(&stn, xp, 0); rc = *prcClip; rc.ypTop = _dypHeader - _dypBorder; rc.ypBottom = _dypHeader; pgnv->FillRc(&rc, kacrBlack); // use the sel to find the first (icki, ikid) to draw if (!sel.FSetLn(_LnFromYp(LwMax(prcClip->ypTop, _dypHeader)))) { // no visible lines rc = *prcClip; rc.ypTop = _dypHeader; pgnv->FillRc(&rc, kacrWhite); return; } for (yp = _YpFromLn(sel.Ln()); yp < prcClip->ypBottom;) { if (sel.Ln() == lnNil) { rc = *prcClip; rc.ypTop = yp; pgnv->FillRc(&rc, kacrWhite); break; } grfsel = sel.GrfselGetCkiKid(&cki, &kid); rc = *prcClip; rc.ypTop = yp; rc.ypBottom = yp + _dypLine; pgnv->FillRc(&rc, kacrWhite); if (grfsel & fselKid) { stn.FFormatSz(PszLit(" %08x %f %08x"), kid.chid, kid.cki.ctg, kid.cki.cno); pgnv->DrawStn(&stn, xp, yp); yp += _dypLine; } else { Assert(grfsel & fselCki, "bad grfsel"); // draw the cki description _pcfl->FFind(cki.ctg, cki.cno, &blck); _pcfl->FGetName(cki.ctg, cki.cno, &stnT); cckiRef = _pcfl->CckiRef(cki.ctg, cki.cno); ikid = _pcfl->Ckid(cki.ctg, cki.cno); stn.FFormatSz(PszLit("%c%c%c %3d %08x -------- %f %08x \"%s\""), _pcfl->FLoner(cki.ctg, cki.cno) ? ChLit('L') : ChLit(' '), blck.FPacked() ? ChLit('P') : ChLit(' '), _pcfl->FForest(cki.ctg, cki.cno) ? ChLit('F') : ChLit(' '), cckiRef, blck.Cb(fTrue), cki.ctg, cki.cno, &stnT); pgnv->DrawStn(&stn, xp, yp); yp += _dypLine; } sel.FAdvance(); // draw seperating line if (yp > _dypHeader) { rc = *prcClip; rc.ypTop = yp - _dypBorder; rc.ypBottom = yp; pgnv->FillRc(&rc, (sel.Ikid() == ivNil) ? kacrGray : kacrWhite); } } // draw the selection if (_fActive) _DrawSel(pgnv); } /*************************************************************************** Hilite the selection (if there is one) ***************************************************************************/ void DCD::_DrawSel(PGNV pgnv) { AssertThis(0); AssertPo(pgnv, 0); RC rc; long ln; if (lnNil == (ln = _sel.Ln())) return; pgnv->GetRcSrc(&rc); rc.ypTop = _YpFromLn(ln); rc.ypBottom = rc.ypTop + _dypLine - _dypBorder; rc.ypTop = LwMax(rc.ypTop, _dypHeader); pgnv->HiliteRc(&rc, kacrWhite); } /*************************************************************************** Set the selection to the given ln. ***************************************************************************/ void DCD::_SetSel(long ln, CKI *pcki, KID *pkid) { AssertThis(0); AssertNilOrVarMem(pcki); AssertNilOrVarMem(pkid); SEL sel = _sel; if (pvNil != pcki) { Assert(lnNil == ln, "ln and pcki both not nil"); sel.FSetCkiKid(pcki, pkid); } else { Assert(pvNil == pkid, 0); sel.FSetLn(ln); } if (_sel.Ln() == sel.Ln()) return; GNV gnv(this); // erase the old sel if (_fActive) _DrawSel(&gnv); // set the new sel and draw it _sel = sel; if (_fActive) _DrawSel(&gnv); } /*************************************************************************** Scroll the sel into view. ***************************************************************************/ void DCD::_ShowSel(void) { AssertThis(0); RC rc; long ln, lnLim; if (lnNil == (ln = _sel.Ln())) _Scroll(scaNil, scaToVal, 0, _scvVert); else if (ln < _scvVert) _Scroll(scaNil, scaToVal, 0, ln); else { _GetContent(&rc); lnLim = LwMax(_scvVert + 1, _LnFromYp(rc.ypBottom)); if (ln >= lnLim) _Scroll(scaNil, scaToVal, 0, _scvVert + ln + 1 - lnLim); } } /*************************************************************************** Handle a mouse down in our content. ***************************************************************************/ void DCD::MouseDown(long xp, long yp, long cact, ulong grfcust) { AssertThis(0); PGOB pgob; PDCD pdcd, pdcdNew; PT pt, ptT; bool fDown; long ln, lnNew; CKI cki, ckiNew; KID kid; ulong grfsel; ln = _sel.Ln(); if (lnNil != (lnNew = _LnFromYp(yp))) { _SetSel(lnNew); grfsel = _sel.GrfselGetCkiKid(&cki, &kid); if ((grfsel & fselCki) && !(grfsel & fselKid)) { kid.cki = cki; kid.chid = 0; } lnNew = _sel.Ln(); } if (!_fActive) Activate(fTrue); if (lnNil == lnNew) return; // handle a control/command click--edit chunk information/change CHID if (grfcust & fcustCmd) { _SetSel(lnNil); if (grfsel & fselKid) { if (_FChangeChid(&cki, &kid)) InvalAllDcd(_pdocb, _pcfl); _SetSel(lnNil, &cki, &kid); _ShowSel(); } else { if (_FEditChunkInfo(&cki)) InvalAllDcd(_pdocb, _pcfl); _SetSel(lnNil, &cki); _ShowSel(); } return; } // handle a double click - edit or goto the item if (cact > 1 && ln == lnNew) { if (!(grfsel & fselKid)) _EditCki(&cki, cidEditNatural); else { _SetSel(lnNil, &kid.cki); _ShowSel(); } return; } pt.xp = xp; pt.yp = yp; pdcd = pvNil; ln = lnNil; for (fDown = fTrue; fDown; GetPtMouse(&pt, &fDown)) { ptT = pt; MapPt(&ptT, cooLocal, cooGlobal); pgob = GOB::PgobFromPtGlobal(ptT.xp, ptT.yp, &ptT); if (pgob != this && (pvNil == pgob || !pgob->FIs(kclsDCD) || _pcfl != ((PDCD)pgob)->_pcfl)) { pdcdNew = pvNil; } else { pdcdNew = (PDCD)pgob; lnNew = pdcdNew->_LnFromYp(ptT.yp); SEL sel = pdcdNew->_sel; sel.FSetLn(lnNew); grfsel = sel.GrfselGetCkiKid(&ckiNew, pvNil); if (!(grfsel & fselCki) || tNo != _pcfl->TIsDescendent(kid.cki.ctg, kid.cki.cno, ckiNew.ctg, ckiNew.cno) || (pdcdNew == this && _sel.Ln() == sel.Ln())) { pdcdNew = pvNil; } else { if (grfsel & fselKid) sel.FSetCkiKid(&ckiNew); lnNew = sel.Ln(); if (lnNew < pdcdNew->_scvVert) pdcdNew = pvNil; } } if (pvNil == pdcdNew) lnNew = lnNil; if (pdcd != pdcdNew || ln != lnNew) { // target change if (pvNil != pdcdNew) pdcdNew->_HiliteLn(lnNew); if (pvNil != pdcd) pdcd->_HiliteLn(ln); pdcd = pdcdNew; ln = lnNew; } } if (pvNil != pdcd) { pdcd->_HiliteLn(ln); if (pdcd != this || ln != _sel.Ln()) _FDoAdoptChunkDlg(&ckiNew, &kid); } } /*************************************************************************** Hilite the line (to indicate a drag target) ***************************************************************************/ void DCD::_HiliteLn(long ln) { AssertThis(0); RC rc; GNV gnv(this); gnv.GetRcSrc(&rc); rc.ypTop = _YpFromLn(ln); rc.ypBottom = rc.ypTop + _dypLine - _dypBorder; gnv.SetPenSize(2 * _dypBorder, 2 * _dypBorder); gnv.FrameRcApt(&rc, &vaptGray, kacrInvert, kacrClear); } /*************************************************************************** Reopen the file - nuking all changes since last saved. ***************************************************************************/ bool DCD::FCmdReopen(PCMD pcmd) { AssertThis(0); AssertPo(pcmd, 0); PDOCB pdocb; CKI cki; KID kid; ulong grfsel; long lnOld; if (tYes != vpappb->TGiveAlertSz(PszLit("Nuke all changes since the last save?"), bkYesNo, cokQuestion)) { return fTrue; } grfsel = _sel.GrfselGetCkiKid(&cki, &kid); lnOld = _sel.Ln(); _SetSel(lnNil); if (!_pcfl->FReopen()) { _SetSel(lnOld); return fTrue; } InvalAllDcd(_pdocb, _pcfl); if (lnNil != lnOld) { _SetSel(lnNil, &cki, (grfsel & fselKid) ? &kid : pvNil); _ShowSel(); } // get rid of all child documents while (pvNil != (pdocb = _pdocb->PdocbChd())) { pdocb->CloseAllDdg(); if (pdocb == _pdocb->PdocbChd()) { // REVIEW shonk: Release: is this the right thing to do? What if // someone else has a reference count to this child DOCB? Bug("why wasn't this child doc released?"); ReleasePpo(&pdocb); } } _pdocb->SetDirty(fFalse); return fTrue; } /*************************************************************************** Handle key input. ***************************************************************************/ bool DCD::FCmdKey(PCMD_KEY pcmd) { AssertThis(0); long ln, lnLim, lnNew, cln; ulong grfsel; KID kid; CKI cki; RC rc; ln = _sel.Ln(); lnLim = _sel.LnLim(); switch (pcmd->vk) { case kvkDown: lnNew = (0 > ln) ? 0 : (ln + 1) % lnLim; goto LChangeSel; case kvkUp: lnNew = (0 > ln) ? lnLim - 1 : (ln + lnLim - 1) % lnLim; goto LChangeSel; case kvkPageUp: case kvkPageDown: _GetContent(&rc); cln = LwMax(1, rc.Dyp() / _dypLine - 1); if (pcmd->vk == kvkPageDown) lnNew = LwMin(lnLim - 1, lnNil == ln ? cln : ln + cln); else lnNew = LwMax(0, lnNil == ln ? 0 : ln - cln); goto LChangeSel; case kvkHome: lnNew = 0; goto LChangeSel; case kvkEnd: lnNew = lnLim - 1; LChangeSel: if (lnLim == 0) { Assert(lnNil == ln, "no lines, but non-nil sel"); break; } AssertIn(lnNew, 0, lnLim); _SetSel(lnNew); _ShowSel(); break; case kvkDelete: case kvkBack: _ClearSel(); break; case kvkReturn: grfsel = _sel.GrfselGetCkiKid(&cki, &kid); if (pcmd->grfcust & fcustCmd) { _SetSel(lnNil); if (grfsel & fselKid) { if (_FChangeChid(&cki, &kid)) InvalAllDcd(_pdocb, _pcfl); _SetSel(lnNil, &cki, &kid); _ShowSel(); } else { if (_FEditChunkInfo(&cki)) InvalAllDcd(_pdocb, _pcfl); _SetSel(lnNil, &cki); _ShowSel(); } } else { if (grfsel & fselKid) { _SetSel(lnNil, &kid.cki); _ShowSel(); } else if (grfsel & fselCki) { // edit the chunk _ShowSel(); _EditCki(&cki, cidEditNatural); } } break; default: break; } return fTrue; } /*************************************************************************** Return the maximum for the indicated scroll bar. ***************************************************************************/ long DCD::_ScvMax(bool fVert) { AssertThis(0); if (fVert) { RC rc; _GetContent(&rc); return LwMax(0, _sel.LnLim() - rc.Dyp() / _dypLine + 1); } return 320; } /*************************************************************************** Handle enabling/disabling DCD commands. ***************************************************************************/ bool DCD::FEnableDcdCmd(PCMD pcmd, ulong *pgrfeds) { AssertThis(0); AssertVarMem(pcmd); AssertVarMem(pgrfeds); CKI cki; switch (pcmd->cid) { case cidUnadoptChunk: case cidChangeChid: if (ivNil == _sel.Ikid()) goto LDisable; break; case cidPlaySound: if (fselCki != _sel.GrfselGetCkiKid(&cki, pvNil)) goto LDisable; if (cki.ctg != kctgWave && cki.ctg != kctgMidi) goto LDisable; break; case cidDeleteChunk: case cidUndeleteChunk: case cidEditNatural: case cidEditHex: case cidEditGL: case cidEditAL: case cidEditGG: case cidEditAG: case cidEditGST: case cidEditAST: case cidEditPic: case cidEditMbmp: case cidTestScript: case cidRunScriptCache: case cidDisassembleScript: case cidEditChunkInfo: case cidSetColorTable: case cidPack: case cidTogglePack: case cidCloneChunk: if (fselCki != _sel.GrfselGetCkiKid(pvNil, pvNil)) goto LDisable; break; default: BugVar("unhandled command in FEnableDcdCmd", &pcmd->cid); LDisable: *pgrfeds = fedsDisable; return fTrue; } *pgrfeds = fedsEnable; return fTrue; } /*************************************************************************** Put up the dialog and add the chunk. ***************************************************************************/ bool DCD::_FAddChunk(CTG ctgDef, CKI *pcki, bool *pfCreated) { AssertVarMem(pcki); AssertVarMem(pfCreated); long idit; long lw; bool fEmpty; PDLG pdlg; ADCD adcd; STN stn; // put up the dialog adcd.pcfl = _pcfl; adcd.fCkiValid = fFalse; pdlg = DLG::PdlgNew(dlidChunkInfo, _FDlgAddChunk, &adcd); if (pvNil == pdlg) goto LCancel; if (ctgNil != ctgDef) { _PutCtgStn(pdlg, kiditCtgInfo, ctgDef); idit = kiditCnoInfo; } else idit = kiditCtgInfo; idit = pdlg->IditDo(idit); if (idit != kiditOkInfo) goto LCancel; if (!_FGetCtg(pdlg, kiditCtgInfo, &pcki->ctg) || !pdlg->FGetLwFromEdit(kiditCnoInfo, &lw, &fEmpty) && !fEmpty) { goto LFail; } pcki->cno = lw; pdlg->GetStn(kiditNameInfo, &stn); ReleasePpo(&pdlg); if (fEmpty) { if (!_pcfl->FAdd(0, pcki->ctg, &pcki->cno)) goto LFail; *pfCreated = fTrue; } else { *pfCreated = !_pcfl->FFind(pcki->ctg, pcki->cno); if (*pfCreated && !_pcfl->FPut(0, pcki->ctg, pcki->cno)) { LFail: vpappb->TGiveAlertSz(PszLit("Writing chunk failed"), bkOk, cokExclamation); LCancel: ReleasePpo(&pdlg); TrashVar(pcki); TrashVar(pfCreated); return fFalse; } } if (stn.Cch() != 0) { if (!_pcfl->FSetName(pcki->ctg, pcki->cno, &stn)) Warn("can't set name"); } return fTrue; } /*************************************************************************** Handle command to add a chunk. ***************************************************************************/ bool DCD::FCmdAddChunk(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); CKI cki; long lnOld; bool fCreated; // save and clear the sel lnOld = _sel.Ln(); _SetSel(lnNil); if (!_FAddChunk(ctgNil, &cki, &fCreated)) { pcmd->cid = cidNil; // don't record _SetSel(lnOld); return fTrue; } InvalAllDcd(_pdocb, _pcfl); _SetSel(lnNil, &cki); _ShowSel(); return fTrue; } /*************************************************************************** Handle command to add a chunk. ***************************************************************************/ bool DCD::FCmdAddPicChunk(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); CKI cki; BLCK blck; long cb; long lnOld; FNI fni; bool fCreated; PPIC ppic = pvNil; // save and clear the sel lnOld = _sel.Ln(); _SetSel(lnNil); // get the fni of the file to add Mac(FTG ftg = 'PICT';) if (!FGetFniOpenMacro(&fni, &ftg, 1, PszLit("MetaFiles\0*.EMF;*.WMF\0"), vwig.hwndApp)) { goto LCancel; } if (pvNil == (ppic = PIC::PpicReadNative(&fni))) { vpappb->TGiveAlertSz(PszLit("Reading picture file failed"), bkOk, cokExclamation); goto LCancel; } // add the chunk and write the data if (!_FAddChunk(kctgPictNative, &cki, &fCreated)) goto LCancel; cb = ppic->CbOnFile(); if (!_pcfl->FPut(cb, cki.ctg, cki.cno, &blck) || !ppic->FWrite(&blck)) { if (fCreated) _pcfl->Delete(cki.ctg, cki.cno); vpappb->TGiveAlertSz(PszLit("Writing chunk failed"), bkOk, cokExclamation); LCancel: ReleasePpo(&ppic); pcmd->cid = cidNil; // don't record _SetSel(lnOld); return fTrue; } ReleasePpo(&ppic); InvalAllDcd(_pdocb, _pcfl); _SetSel(lnNil, &cki); _ShowSel(); return fTrue; } /*************************************************************************** Masked bitmap dialog ***************************************************************************/ enum { kiditOkMbmp, kiditCancelMbmp, kiditPixelMbmp, kiditXPosMbmp, kiditYPosMbmp, kiditDefaultMbmp, kiditLimMbmp }; bool _FDlgMbmp(PDLG pdlg, long *pidit, void *pv); /**************************************************************************** Dialog proc for input of transparent pixel value and reference point ****************************************************************************/ bool _FDlgMbmp(PDLG pdlg, long *pidit, void *pv) { AssertPo(pdlg, 0); AssertVarMem(pidit); long lw; switch (*pidit) { case kiditCancelMbmp: return fTrue; case kiditOkMbmp: if (!pdlg->FGetValues(0, kiditLimMbmp)) { *pidit = ivNil; return fTrue; } if (!pdlg->FGetLwFromEdit(kiditPixelMbmp, &lw) || !FIn(lw, 0, (long)kbMax + 1)) { vpappb->TGiveAlertSz(PszLit("The transparent pixel value must be ") PszLit("between 0 and 255."), bkOk, cokStop); pdlg->SelectDit(kiditPixelMbmp); return fFalse; } if (!pdlg->FGetLwFromEdit(kiditXPosMbmp, &lw)) { vpappb->TGiveAlertSz(PszLit("The X Position must be an integer."), bkOk, cokStop); pdlg->SelectDit(kiditXPosMbmp); return fFalse; } if (!pdlg->FGetLwFromEdit(kiditYPosMbmp, &lw)) { vpappb->TGiveAlertSz(PszLit("The Y Position must be an integer."), bkOk, cokStop); pdlg->SelectDit(kiditYPosMbmp); return fFalse; } return fTrue; default: break; } return fFalse; } /*************************************************************************** Handle command to add Mbmp or chunk. ***************************************************************************/ bool DCD::FCmdAddBitmapChunk(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); CKI cki; BLCK blck; long lw; long lnOld; FNI fni; bool fCreated; byte bTransparent; long xp, yp; bool fMask = pcmd->cid != cidAddMbmpChunk; PBACO pbaco = pvNil; CTG ctg; PDLG pdlg = pvNil; // save and clear the sel lnOld = _sel.Ln(); _SetSel(lnNil); // get the fni of the file to add Mac(FTG ftg = '\0BMP';) // REVIEW shonk: this is bogus if (!FGetFniOpenMacro(&fni, &ftg, 1, PszLit("Bitmaps\0*.BMP\0"), vwig.hwndApp)) goto LCancel; // get the transparent pixel value pdlg = DLG::PdlgNew(dlidMbmp, _FDlgMbmp); if (pvNil == pdlg) goto LCancel; // put up the initial values pdlg->FPutLwInEdit(kiditPixelMbmp, 0); pdlg->FPutLwInEdit(kiditXPosMbmp, 0); pdlg->FPutLwInEdit(kiditYPosMbmp, 0); if (pdlg->IditDo(kiditPixelMbmp) != kiditOkMbmp) goto LErrDlg; if (!pdlg->FGetLwFromEdit(kiditPixelMbmp, &lw) || !FIn(lw, 0, (long)kbMax + 1)) { goto LErrDlg; } bTransparent = (byte)lw; if (!pdlg->FGetLwFromEdit(kiditXPosMbmp, &lw)) goto LErrDlg; xp = lw; if (!pdlg->FGetLwFromEdit(kiditXPosMbmp, &lw)) { LErrDlg: ReleasePpo(&pdlg); goto LCancel; } yp = lw; ReleasePpo(&pdlg); if (pvNil == (pbaco = MBMP::PmbmpReadNative(&fni, bTransparent, xp, yp, fMask ? fmbmpMask : fmbmpNil))) { vpappb->TGiveAlertSz(PszLit("Reading bitmap file failed"), bkOk, cokExclamation); goto LCancel; } ctg = fMask ? kctgMask : kctgMbmp; // add the chunk and write the data if (!_FAddChunk(ctg, &cki, &fCreated)) goto LCancel; if (!_pcfl->FPut(pbaco->CbOnFile(), cki.ctg, cki.cno, &blck) || !pbaco->FWrite(&blck)) { if (fCreated) _pcfl->Delete(cki.ctg, cki.cno); vpappb->TGiveAlertSz(PszLit("Writing chunk failed"), bkOk, cokExclamation); LCancel: ReleasePpo(&pbaco); pcmd->cid = cidNil; // don't record _SetSel(lnOld); return fTrue; } ReleasePpo(&pbaco); InvalAllDcd(_pdocb, _pcfl); _SetSel(lnNil, &cki); _ShowSel(); return fTrue; } /*************************************************************************** Handle command to add a chunk that is a copy of a file's contents. ***************************************************************************/ bool DCD::FCmdAddFileChunk(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); CKI cki; PFIL pfil; BLCK blck; long lnOld; FNI fni; bool fCreated; // save and clear the sel lnOld = _sel.Ln(); _SetSel(lnNil); // get the fni of the file to add if (!FGetFniOpenMacro(&fni, pvNil, 0, PszLit("All files\0*.*\0"), vwig.hwndApp)) goto LCancel; if (pvNil == (pfil = FIL::PfilOpen(&fni))) { vpappb->TGiveAlertSz(PszLit("Opening file failed"), bkOk, cokExclamation); goto LCancel; } blck.Set(pfil, 0, pfil->FpMac()); ReleasePpo(&pfil); // add the chunk and write the data if (!_FAddChunk(ctgNil, &cki, &fCreated)) goto LCancel; if (!_pcfl->FPutBlck(&blck, cki.ctg, cki.cno)) { if (fCreated) _pcfl->Delete(cki.ctg, cki.cno); vpappb->TGiveAlertSz(PszLit("Writing chunk failed"), bkOk, cokExclamation); LCancel: pcmd->cid = cidNil; // don't record _SetSel(lnOld); return fTrue; } InvalAllDcd(_pdocb, _pcfl); _SetSel(lnNil, &cki); _ShowSel(); return fTrue; } /************************************************************************** Edit Chunk Information dialog **************************************************************************/ // This struct is needed so _FDlgEditChunkInfo() has access to the chunk // and chunky file and so _FDlgChangeChunk() has access to the parent and // child chunks and the chunky file. struct CLAN { CKI cki; KID kid; PCFL pcfl; }; bool _FDlgEditChunkInfo(PDLG pdlg, long *pidit, void *pv); /************************************************************************** Dialog proc for Edit Chunk Info dialog. *pv should be a CLAN *, with the cki and pcfl fields filled in (the kid field is not used). **************************************************************************/ bool _FDlgEditChunkInfo(PDLG pdlg, long *pidit, void *pv) { AssertPo(pdlg, 0); AssertVarMem(pidit); CKI cki; long lw; bool fEmpty; CLAN *pclan = (CLAN *)pv; AssertVarMem(pclan); AssertPo(pclan->pcfl, 0); switch (*pidit) { case kiditCancelInfo: return fTrue; // dismiss the dialog case kiditOkInfo: if (!pdlg->FGetValues(0, kiditLimInfo)) { *pidit = ivNil; return fTrue; } // check the chunk if (!_FGetCtg(pdlg, kiditCtgInfo, &cki.ctg)) { vpappb->TGiveAlertSz(PszLit("CTG is bad"), bkOk, cokStop); pdlg->SelectDit(kiditCtgInfo); return fFalse; } if (!pdlg->FGetLwFromEdit(kiditCnoInfo, &lw, &fEmpty)) { vpappb->TGiveAlertSz(PszLit("CNO is bad"), bkOk, cokStop); pdlg->SelectDit(kiditCnoInfo); return fFalse; } cki.cno = lw; if (pclan->pcfl->FFind(cki.ctg, cki.cno) && (cki.ctg != pclan->cki.ctg || cki.cno != pclan->cki.cno)) { vpappb->TGiveAlertSz(PszLit("That CTG/CNO pair already exists"), bkOk, cokStop); pdlg->SelectDit(kiditCtgInfo); return fFalse; } return fTrue; default: break; } return fFalse; } /**************************************************************************** Put up the dialog with initial values and edit the chunk. This function will update *pckiOld to contain the new ctg and cno values. ****************************************************************************/ bool DCD::_FEditChunkInfo(CKI *pckiOld) { AssertVarMem(pckiOld); long idit; long lw; PDLG pdlg; STN stn; CLAN clan; CKI cki; clan.pcfl = _pcfl; clan.cki = *pckiOld; TrashVar(&clan.kid); // put up the dialog pdlg = DLG::PdlgNew(dlidChunkInfo, _FDlgEditChunkInfo, &clan); if (pvNil == pdlg) return fFalse; // set the initial values idit = kiditCtgInfo; _PutCtgStn(pdlg, kiditCtgInfo, pckiOld->ctg); pdlg->FPutLwInEdit(kiditCnoInfo, pckiOld->cno); _pcfl->FGetName(pckiOld->ctg, pckiOld->cno, &stn); pdlg->FPutStn(kiditNameInfo, &stn); idit = pdlg->IditDo(idit); if (idit != kiditOkInfo || !_FGetCtg(pdlg, kiditCtgInfo, &cki.ctg) || !pdlg->FGetLwFromEdit(kiditCnoInfo, &lw)) { ReleasePpo(&pdlg); return fFalse; } pdlg->GetStn(kiditNameInfo, &stn); ReleasePpo(&pdlg); cki.cno = lw; if (cki.ctg != pckiOld->ctg || cki.cno != pckiOld->cno) _pcfl->Move(pckiOld->ctg, pckiOld->cno, cki.ctg, cki.cno); // set the original cki to the new cki so the caller has the new chunk pckiOld->ctg = cki.ctg; pckiOld->cno = cki.cno; if (!_pcfl->FSetName(cki.ctg, cki.cno, &stn)) Warn("can't set new name"); return fTrue; } /************************************************************************** Handle command to edit chunk information. **************************************************************************/ bool DCD::FCmdEditChunkInfo(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); CKI cki; long lnOld; // record, save, and clear the sel if (fselCki != _sel.GrfselGetCkiKid(&cki, pvNil)) goto LFail; lnOld = _sel.Ln(); _SetSel(lnNil); if (!_FEditChunkInfo(&cki)) { _SetSel(lnOld); LFail: pcmd->cid = cidNil; // don't record return fTrue; } // refresh the window and reset the selection InvalAllDcd(_pdocb, _pcfl); _SetSel(lnNil, &cki); _ShowSel(); return fTrue; } /*************************************************************************** Handle command to delete a chunk. ***************************************************************************/ bool DCD::FCmdDeleteChunk(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); CKI cki; if (fselCki != _sel.GrfselGetCkiKid(&cki, pvNil)) goto LCancel; if (pcmd->cid == cidDeleteChunk) { _pcfl->SetLoner(cki.ctg, cki.cno, fFalse); DOCE::CloseDeletedDoce(_pdocb); InvalAllDcd(_pdocb, _pcfl); _ShowSel(); } else { _pcfl->SetLoner(cki.ctg, cki.cno, fTrue); InvalAllDcd(_pdocb, _pcfl, &cki); _ShowSel(); } return fTrue; LCancel: pcmd->cid = cidNil; // don't record return fTrue; } /************************************************************************** Change CHID dialog **************************************************************************/ enum { kiditOkChid, kiditCancelChid, kiditChidChid, kiditLimChid }; bool _FDlgChangeChid(PDLG pdlg, long *pidit, void *pv); /************************************************************************** Dialog proc for Change CHID dialog. **************************************************************************/ bool _FDlgChangeChid(PDLG pdlg, long *pidit, void *pv) { AssertPo(pdlg, 0); AssertVarMem(pidit); CHID chid; long lw; long ikid; CLAN *pclan = (CLAN *)pv; AssertVarMem(pclan); AssertPo(pclan->pcfl, 0); switch (*pidit) { case kiditCancelChid: return fTrue; // dismiss the dialog case kiditOkChid: if (!pdlg->FGetValues(kiditChidChid, kiditLimChid)) { *pidit = ivNil; return fTrue; } // get the new chid if (!pdlg->FGetLwFromEdit(kiditChidChid, &lw)) { vpappb->TGiveAlertSz(PszLit("CHID value is bad"), bkOk, cokStop); pdlg->SelectDit(kiditChidChid); return fFalse; } chid = lw; // check the new chid to make sure that the CTG/CNO/new CHID does not // already exist if (pclan->pcfl->FGetIkid(pclan->cki.ctg, pclan->cki.cno, pclan->kid.cki.ctg, pclan->kid.cki.cno, chid, &ikid) && chid != pclan->kid.chid) { vpappb->TGiveAlertSz(PszLit("This parent/child relationship already exists."), bkOk, cokStop); pdlg->SelectDit(kiditChidChid); return fFalse; } return fTrue; default: break; } return fFalse; } /**************************************************************************** Put up the dialog with initial values and change the CHID. *pkid will be affected to reflect this change. ****************************************************************************/ bool DCD::_FChangeChid(CKI *pcki, KID *pkid) { AssertVarMem(pcki); AssertVarMem(pkid); long idit; CHID chid; PDLG pdlg; long lw; CLAN clan; clan.cki = *pcki; clan.kid = *pkid; clan.pcfl = _pcfl; // put up the dialog pdlg = DLG::PdlgNew(dlidChangeChid, _FDlgChangeChid, &clan); if (pvNil == pdlg) return fFalse; // set the initial value pdlg->FPutLwInEdit(kiditChidChid, pkid->chid); idit = pdlg->IditDo(kiditChidChid); if (idit != kiditOkChid || !pdlg->FGetLwFromEdit(kiditChidChid, &lw)) { ReleasePpo(&pdlg); return fFalse; } chid = lw; ReleasePpo(&pdlg); // If new CHID is different, unadopt and adopt child to change CHID. // This is easier than directly changing the GG which keeps track of the // parent and its children. if (chid != pkid->chid) { _pcfl->ChangeChid(pcki->ctg, pcki->cno, pkid->cki.ctg, pkid->cki.cno, pkid->chid, chid); // set the new CHID so the caller has the right kid pkid->chid = chid; } return fTrue; } /************************************************************************** Handle command to change the CHID. **************************************************************************/ bool DCD::FCmdChangeChid(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); CKI cki; KID kid; long lnOld; // record, save, and clear the sel if (ivNil == _sel.Icki() || ivNil == _sel.Ikid()) goto LFail; _sel.GrfselGetCkiKid(&cki, &kid); lnOld = _sel.Ln(); _SetSel(lnNil); if (!_FChangeChid(&cki, &kid)) { _SetSel(lnOld); LFail: pcmd->cid = cidNil; // don't record return fTrue; } InvalAllDcd(_pdocb, _pcfl); _SetSel(lnNil, &cki, &kid); _ShowSel(); return fTrue; } /**************************************** Adopt Chunk dialog ****************************************/ enum { kiditOkAdopt, kiditCancelAdopt, kiditCtgParAdopt, kiditCnoParAdopt, kiditCtgChdAdopt, kiditCnoChdAdopt, kiditChidAdopt, kiditLimAdopt }; bool _FDlgAdoptChunk(PDLG pdlg, long *pidit, void *pv); /*************************************************************************** Dialog proc for Adopt Chunk dialog. ***************************************************************************/ bool _FDlgAdoptChunk(PDLG pdlg, long *pidit, void *pv) { AssertPo(pdlg, 0); AssertVarMem(pidit); long lw; CKI cki; KID kid; long ikid; bool fEmpty; PCFL pcfl = (PCFL)pv; AssertPo(pcfl, 0); switch (*pidit) { case kiditCancelAdopt: return fTrue; // dismiss the dialog case kiditOkAdopt: if (!pdlg->FGetValues(0, kiditLimAdopt)) { *pidit = ivNil; return fTrue; } // check the parent if (!_FGetCtg(pdlg, kiditCtgParAdopt, &cki.ctg)) { vpappb->TGiveAlertSz(PszLit("Parent CTG is bad"), bkOk, cokStop); pdlg->SelectDit(kiditCtgParAdopt); return fFalse; } if (!pdlg->FGetLwFromEdit(kiditCnoParAdopt, &lw)) { vpappb->TGiveAlertSz(PszLit("Parent CNO is bad"), bkOk, cokStop); pdlg->SelectDit(kiditCnoParAdopt); return fFalse; } cki.cno = lw; if (!pcfl->FFind(cki.ctg, cki.cno)) { vpappb->TGiveAlertSz(PszLit("Parent chunk doesn't exist"), bkOk, cokStop); pdlg->SelectDit(kiditCtgParAdopt); return fFalse; } // check the child if (!_FGetCtg(pdlg, kiditCtgChdAdopt, &kid.cki.ctg)) { vpappb->TGiveAlertSz(PszLit("Child CTG is bad"), bkOk, cokStop); pdlg->SelectDit(kiditCtgChdAdopt); return fFalse; } if (!pdlg->FGetLwFromEdit(kiditCnoChdAdopt, &lw)) { vpappb->TGiveAlertSz(PszLit("Child CNO is bad"), bkOk, cokStop); pdlg->SelectDit(kiditCnoChdAdopt); return fFalse; } kid.cki.cno = lw; if (!pcfl->FFind(kid.cki.ctg, kid.cki.cno)) { vpappb->TGiveAlertSz(PszLit("Child chunk doesn't exist"), bkOk, cokStop); pdlg->SelectDit(kiditCtgChdAdopt); return fFalse; } // check the chid if (!pdlg->FGetLwFromEdit(kiditChidAdopt, &lw, &fEmpty) && !fEmpty) { vpappb->TGiveAlertSz(PszLit("Child ID value is bad"), bkOk, cokStop); pdlg->SelectDit(kiditChidAdopt); return fFalse; } kid.chid = lw; // see if this child-parent relationship already exists if (pcfl->FGetIkid(cki.ctg, cki.cno, kid.cki.ctg, kid.cki.cno, kid.chid, &ikid) && !fEmpty) { vpappb->TGiveAlertSz(PszLit("This parent/child relationship already exists."), bkOk, cokStop); pdlg->SelectDit(kiditChidAdopt); return fFalse; } // see if a loop would be formed if (pcfl->TIsDescendent(kid.cki.ctg, kid.cki.cno, cki.ctg, cki.cno)) { vpappb->TGiveAlertSz(PszLit("Adopting this child would form a loop") PszLit(" in the chunky file graph structure"), bkOk, cokStop); return fFalse; } return fTrue; default: break; } return fFalse; } /*************************************************************************** Put up and handle the adopt dialog with the given initial values (if not nil). ***************************************************************************/ bool DCD::_FDoAdoptChunkDlg(CKI *pcki, KID *pkid) { AssertThis(0); AssertNilOrVarMem(pcki); AssertNilOrVarMem(pkid); long idit; CKI cki; KID kid; long lnOld; long lw1, lw2, lw3; bool fEmptyChid; PDLG pdlg = pvNil; // put up the dialog pdlg = DLG::PdlgNew(dlidAdoptChunk, _FDlgAdoptChunk, _pcfl); if (pvNil == pdlg) return fFalse; // set the initial values idit = kiditCtgParAdopt; if (pvNil != pcki) { _PutCtgStn(pdlg, kiditCtgParAdopt, pcki->ctg); pdlg->FPutLwInEdit(kiditCnoParAdopt, pcki->cno); idit = kiditCtgChdAdopt; } if (pvNil != pkid) { _PutCtgStn(pdlg, kiditCtgChdAdopt, pkid->cki.ctg); pdlg->FPutLwInEdit(kiditCnoChdAdopt, pkid->cki.cno); pdlg->FPutLwInEdit(kiditChidAdopt, pkid->chid); idit = kiditChidAdopt; } // save and clear the old sel lnOld = _sel.Ln(); _SetSel(lnNil); idit = pdlg->IditDo(idit); if (idit != kiditOkAdopt) goto LCancel; if (!_FGetCtg(pdlg, kiditCtgParAdopt, &cki.ctg) || !pdlg->FGetLwFromEdit(kiditCnoParAdopt, &lw1) || !_FGetCtg(pdlg, kiditCtgChdAdopt, &kid.cki.ctg) || !pdlg->FGetLwFromEdit(kiditCnoChdAdopt, &lw2) || !pdlg->FGetLwFromEdit(kiditChidAdopt, &lw3, &fEmptyChid) && !fEmptyChid) { goto LFail; } ReleasePpo(&pdlg); cki.cno = lw1; kid.cki.cno = lw2; kid.chid = lw3; if (!_pcfl->FFind(cki.ctg, cki.cno) || !_pcfl->FFind(kid.cki.ctg, kid.cki.cno)) { goto LFail; } if (!_pcfl->FAdoptChild(cki.ctg, cki.cno, kid.cki.ctg, kid.cki.cno, kid.chid)) { LFail: vpappb->TGiveAlertSz(PszLit("Adopting chunk failed."), bkOk, cokExclamation); LCancel: ReleasePpo(&pdlg); _SetSel(lnOld); return fFalse; } InvalAllDcd(_pdocb, _pcfl); _SetSel(lnNil, &cki, &kid); _ShowSel(); return fTrue; } /*************************************************************************** Handle command to adopt a chunk. ***************************************************************************/ bool DCD::FCmdAdoptChunk(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); CKI cki; CKI *pcki; PDLG pdlg = pvNil; if (fselCki & _sel.GrfselGetCkiKid(&cki, pvNil)) pcki = &cki; else pcki = pvNil; if (!_FDoAdoptChunkDlg(pcki, pvNil)) pcmd->cid = cidNil; return fTrue; } /*************************************************************************** Handle command to unadopt a chunk. ***************************************************************************/ bool DCD::FCmdUnadoptChunk(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); CKI cki; KID kid; if (!(_sel.GrfselGetCkiKid(&cki, &kid) & fselKid)) { pcmd->cid = cidNil; // don't record return fTrue; } _pcfl->DeleteChild(cki.ctg, cki.cno, kid.cki.ctg, kid.cki.cno, kid.chid); InvalAllDcd(_pdocb, _pcfl); _ShowSel(); return fTrue; } /*************************************************************************** Handles commands to edit a chunk. ***************************************************************************/ bool DCD::FCmdEditChunk(PCMD pcmd) { CKI cki; if (fselCki != _sel.GrfselGetCkiKid(&cki, pvNil)) return fFalse; _EditCki(&cki, pcmd->cid); return fTrue; } /*************************************************************************** Opens a window onto the CKI's data. ***************************************************************************/ void DCD::_EditCki(CKI *pcki, long cid) { AssertThis(0); AssertVarMem(pcki); PDOCE pdoce; long cls; CTG ctg; // check for a doce already open on the chunk. if (pvNil != (pdoce = DOCE::PdoceFromChunk(_pdocb, _pcfl, pcki->ctg, pcki->cno))) { pdoce->ActivateDmd(); return; } switch (cid) { case cidEditNatural: ctg = pcki->ctg; // handle 4 character ctg's switch (ctg) { case kctgPictNative: goto LPic; case kctgMbmp: case kctgMask: goto LMbmp; case kctgWave: case kctgMidi: goto LSound; default: break; } // handle 3 character ctg's ctg = ctg & 0xFFFFFF00L | 0x00000020L; switch (ctg) { case kctgGst: cls = kclsGST; goto LDocg; case kctgAst: cls = kclsAST; goto LDocg; default: break; } // handle 2 character ctg's ctg = ctg & 0xFFFF0000L | 0x00002020L; switch (ctg) { case kctgGl: cls = kclsGL; goto LDocg; case kctgAl: cls = kclsAL; goto LDocg; case kctgGg: cls = kclsGG; goto LDocg; case kctgAg: cls = kclsAG; goto LDocg; default: break; } // fall through case cidEditHex: LHex: cid = cidEditHex; pdoce = DOCH::PdochNew(_pdocb, _pcfl, pcki->ctg, pcki->cno); break; case cidEditGL: cls = kclsGL; goto LDocg; case cidEditAL: cls = kclsAL; goto LDocg; case cidEditGG: cls = kclsGG; goto LDocg; case cidEditAG: cls = kclsAG; goto LDocg; case cidEditGST: cls = kclsGST; goto LDocg; case cidEditAST: cls = kclsAST; LDocg: pdoce = DOCG::PdocgNew(_pdocb, _pcfl, pcki->ctg, pcki->cno, cls); break; case cidEditPic: LPic: pdoce = DOCPIC::PdocpicNew(_pdocb, _pcfl, pcki->ctg, pcki->cno); break; case cidEditMbmp: LMbmp: pdoce = DOCMBMP::PdocmbmpNew(_pdocb, _pcfl, pcki->ctg, pcki->cno); break; case cidPlaySound: LSound: if ((pcki->ctg == kctgMidi || pcki->ctg == kctgWave) && pvNil != vpsndm) { // play once PCRF pcrf; if (pvNil == (pcrf = CRF::PcrfNew(_pcfl, 1))) { ReleasePpo(&pcrf); // edit as hex break; } vpsndm->SiiPlay(pcrf, pcki->ctg, pcki->cno); ReleasePpo(&pcrf); return; } // edit as hex break; default: BugVar("unknown cid", &cid); return; } if (pvNil == pdoce) { if (cid == cidEditNatural) { // our guess at a natural type may have been wrong, so just // edit as hex goto LHex; } else if (cid != cidEditHex) { vpappb->TGiveAlertSz(PszLit("This chunk doesn't fit that format."), bkOk, cokInformation); } return; } pdoce->PdmdNew(); ReleasePpo(&pdoce); } /*************************************************************************** Handle command to compile and add a script chunk. ***************************************************************************/ bool DCD::FCmdImportScript(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); SCCG sccg; CKI cki; long lnOld; FNI fni; bool fCreated; MSFIL msfil; PSCPT pscpt = pvNil; // save and clear the sel lnOld = _sel.Ln(); _SetSel(lnNil); // get the fni of the file to add Mac(FTG ftg = 'TEXT';) if (!FGetFniOpenMacro(&fni, &ftg, 1, PszLit("All files\0*.*\0"), vwig.hwndApp)) goto LCancel; if (pvNil == (pscpt = sccg.PscptCompileFni(&fni, pcmd->cid == cidCompileInScript, &msfil))) { // if the error file isn't empty, open it vpappb->TGiveAlertSz(PszLit("Compiling script failed"), bkOk, cokExclamation); pcmd->cid = cidNil; // don't record _SetSel(lnOld); OpenSinkDoc(&msfil); return fTrue; } // add the chunk and write the data if (!_FAddChunk(kctgScript, &cki, &fCreated)) goto LCancel; if (!pscpt->FSaveToChunk(_pcfl, cki.ctg, cki.cno)) { if (fCreated) _pcfl->Delete(cki.ctg, cki.cno); vpappb->TGiveAlertSz(PszLit("Writing chunk failed"), bkOk, cokExclamation); LCancel: ReleasePpo(&pscpt); pcmd->cid = cidNil; // don't record _SetSel(lnOld); return fTrue; } ReleasePpo(&pscpt); InvalAllDcd(_pdocb, _pcfl, &cki); _SetSel(lnNil, &cki); _ShowSel(); return fTrue; } /*************************************************************************** Draw routine for a test-script gob - just erase the gob. ***************************************************************************/ void TSCG::Draw(PGNV pgnv, RC *prcClip) { pgnv->FillRc(prcClip, kacrWhite); } enum { kiditOkScript, kiditCancelScript, kiditSizeScript, kiditLimScript }; /*************************************************************************** Open a new window and run a script in it. ***************************************************************************/ bool DCD::FCmdTestScript(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); CKI cki; long cbCache; if (fselCki != _sel.GrfselGetCkiKid(&cki, pvNil)) return fFalse; if (pcmd->cid == cidRunScriptCache) { // get the cache size from the user PDLG pdlg; // get the cache size pdlg = DLG::PdlgNew(dlidScriptCache); if (pvNil == pdlg) return fTrue; // put up the initial values pdlg->FPutLwInEdit(kiditSizeScript, 3072); if (pdlg->IditDo(kiditSizeScript) != kiditOkScript) goto LCancel; if (!pdlg->FGetLwFromEdit(kiditPixelMbmp, &cbCache) || !FIn(cbCache, 0, kcbMax / 1024)) { LCancel: ReleasePpo(&pdlg); return fTrue; } cbCache *= 1024; ReleasePpo(&pdlg); } else cbCache = 0x00300000L; FTestScript(cki.ctg, cki.cno, cbCache); return fTrue; } /*************************************************************************** Command handler to Edit a WAVE chunk ***************************************************************************/ bool DCD::FCmdStopSound(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); if (pvNil != vpsndm) vpsndm->StopAll(); return fTrue; } /*************************************************************************** Command handler to pack or unpack (toggle) a chunk. Also handle just toggling the packed flag. ***************************************************************************/ bool DCD::FCmdPack(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); CKI cki; bool fPack; if (fselCki != _sel.GrfselGetCkiKid(&cki, pvNil)) return fFalse; fPack = !_pcfl->FPacked(cki.ctg, cki.cno); if (cidPack == pcmd->cid) { // actually pack or unpack the data if (fPack ? _pcfl->FPackData(cki.ctg, cki.cno) : _pcfl->FUnpackData(cki.ctg, cki.cno)) { InvalAllDcd(_pdocb, _pcfl, &cki); } else { vpappb->TGiveAlertSz(fPack ? PszLit("Packing failed - chunk may be incompressible...") : PszLit("Unpacking failed - chunk may be corrupt"), bkOk, cokExclamation); } } else { // just toggle the packed flag _pcfl->SetPacked(cki.ctg, cki.cno, fPack); InvalAllDcd(_pdocb, _pcfl, &cki); } return fTrue; } /*************************************************************************** Run a script. Make the crf cache cbCache large. ***************************************************************************/ bool DCD::FTestScript(CTG ctg, CNO cno, long cbCache) { AssertThis(0); AssertIn(cbCache, 0, kcbMax); STN stn; PTSCG ptscg; PSCPT pscpt = pvNil; PSCEG psceg = pvNil; PCRF pcrf = pvNil; GCB gcb(khidMdi, GOB::PgobScreen()); if (pvNil == (ptscg = NewObj TSCG(&gcb))) goto LFail; vpcex->FAddCmh(ptscg, 0); stn.FFormatSz(PszLit("Run Script: %f %08x"), ctg, cno); if (!ptscg->FCreateAndAttachMdi(&stn) || pvNil == (pcrf = CRF::PcrfNew(_pcfl, cbCache)) || pvNil == (psceg = ptscg->PscegNew(pcrf, ptscg)) || pvNil == (pscpt = (PSCPT)pcrf->PbacoFetch(ctg, cno, SCPT::FReadScript)) || !psceg->FRunScript(pscpt)) { LFail: vpappb->TGiveAlertSz(PszLit("Running script failed"), bkOk, cokExclamation); } ReleasePpo(&psceg); ReleasePpo(&pcrf); ReleasePpo(&pscpt); return fFalse; } /*************************************************************************** Disassemble a script and display it in a new window. ***************************************************************************/ bool DCD::FCmdDisasmScript(PCMD pcmd) { CKI cki; PSCPT pscpt; SCCG sccg; FNI fni; MSFIL msfil, msfilError; if (fselCki != _sel.GrfselGetCkiKid(&cki, pvNil)) return fFalse; if (pvNil == (pscpt = SCPT::PscptRead(_pcfl, cki.ctg, cki.cno))) { vpappb->TGiveAlertSz(PszLit("Error reading script (or it's not a script)"), bkOk, cokExclamation); return fTrue; } if (!sccg.FDisassemble(pscpt, &msfil, &msfilError)) { vpappb->TGiveAlertSz(PszLit("Error disassembling script"), bkOk, cokExclamation); OpenSinkDoc(&msfilError); } else OpenSinkDoc(&msfil); ReleasePpo(&pscpt); return fTrue; } /*************************************************************************** Copy the selection to a new document. ***************************************************************************/ bool DCD::_FCopySel(PDOCB *ppdocb) { AssertNilOrVarMem(ppdocb); CKI cki; PDOC pdoc; if (fselCki != _sel.GrfselGetCkiKid(&cki, pvNil)) return fFalse; if (pvNil == ppdocb) return fTrue; if (pvNil != (pdoc = DOC::PdocNew(pvNil))) { if (!_pcfl->FCopy(cki.ctg, cki.cno, pdoc->Pcfl(), &cki.cno)) ReleasePpo(&pdoc); } *ppdocb = pdoc; return pvNil != *ppdocb; } /*************************************************************************** Delete the current selection. ***************************************************************************/ void DCD::_ClearSel(void) { ulong grfsel; CMD cmd; grfsel = _sel.GrfselGetCkiKid(pvNil, pvNil); if (!(grfsel & fselCki)) return; ClearPb(&cmd, size(cmd)); cmd.pcmh = this; if (grfsel & fselKid) cmd.cid = cidUnadoptChunk; else cmd.cid = cidDeleteChunk; FDoCmd(&cmd); ReleasePpo(&cmd.pgg); } /*************************************************************************** Paste all non-child chunk of the given document into the current document. REVIEW shonk: should this delete the current selection? REVIEW shonk: is there an easy way to make this atomic? ***************************************************************************/ bool DCD::_FPaste(PCLIP pclip, bool fDoIt, long cid) { AssertThis(0); AssertPo(pclip, 0); PDOC pdoc; PCFL pcfl; long icki; CKI cki, ckiSel; bool fFailed = fFalse; if (!pclip->FGetFormat(kclsDOC)) return fFalse; if (!fDoIt) return fTrue; if (!pclip->FGetFormat(kclsDOC, (PDOCB *)&pdoc)) return fFalse; if (pvNil == (pcfl = pdoc->Pcfl()) || pcfl->Ccki() <= 0) { ReleasePpo(&pdoc); return fTrue; } _SetSel(lnNil); for (icki = 0; pcfl->FGetCki(icki, &cki); icki++) { if (!pcfl->FLoner(cki.ctg, cki.cno)) continue; if (cid == cidPasteSpecial) fFailed |= !pcfl->FClone(cki.ctg, cki.cno, _pcfl, &ckiSel.cno); else fFailed |= !pcfl->FCopy(cki.ctg, cki.cno, _pcfl, &ckiSel.cno); ckiSel.ctg = cki.ctg; } InvalAllDcd(_pdocb, _pcfl); ReleasePpo(&pdoc); if (fFailed) { vpappb->TGiveAlertSz(PszLit("Couldn't paste everything"), bkOk, cokExclamation); } else { _SetSel(lnNil, &ckiSel); _ShowSel(); } return fTrue; } /*************************************************************************** Use the selected chunk as the current color table. ***************************************************************************/ bool DCD::FCmdSetColorTable(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); CKI cki; BLCK blck; PGL pglclr; if (fselCki != _sel.GrfselGetCkiKid(&cki, pvNil)) return fFalse; if (!_pcfl->FFind(cki.ctg, cki.cno, &blck)) return fFalse; if (pvNil != (pglclr = GL::PglRead(&blck)) && pglclr->CbEntry() == size(CLR)) GPT::SetActiveColors(pglclr, fpalIdentity); ReleasePpo(&pglclr); return fTrue; } enum { kiditOkFilter, kiditCancelFilter, kiditHideKidsFilter, kiditHideListFilter, kiditCtgEditFilter, kiditLimFilter, }; /*************************************************************************** Change the filtering. ***************************************************************************/ bool DCD::FCmdFilterChunk(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); STN stn; STN stnT; PDLG pdlg; ulong grfsel; CKI cki; KID kid; CTG ctg; long ictg; achar *prgch; achar chQuote, *psz; grfsel = _sel.GrfselGetCkiKid(&cki, &kid); _SetSel(lnNil); // put up the dialog pdlg = DLG::PdlgNew(dlidFilter); if (pvNil == pdlg) goto LCancel; stn.SetNil(); for (ictg = 0; _sel.FGetCtgFilter(ictg, &ctg); ictg++) { stnT.FFormatSz(PszLit("'%f'"), ctg); if (stn.Cch() > 0) stn.FAppendCh(kchSpace); stn.FAppendStn(&stnT); } pdlg->FPutStn(kiditCtgEditFilter, &stn); pdlg->PutCheck(kiditHideKidsFilter, _sel.FHideKids()); pdlg->PutCheck(kiditHideListFilter, _sel.FHideList()); if (kiditOkFilter != pdlg->IditDo(kiditCtgEditFilter)) goto LCancel; // set the filtering on the sel _sel.HideKids(pdlg->FGetCheck(kiditHideKidsFilter)); _sel.HideList(pdlg->FGetCheck(kiditHideListFilter)); pdlg->GetStn(kiditCtgEditFilter, &stn); _sel.FreeFilterList(); for (psz = stn.Psz();;) { while (*psz == kchSpace) psz++; if (!*psz) break; stnT.SetNil(); chQuote = 0; while (*psz && (chQuote != 0 || *psz != kchSpace)) { if (chQuote == 0 && (*psz == ChLit('"') || *psz == ChLit('\''))) chQuote = *psz; if (*psz == chQuote) chQuote = 0; else stnT.FAppendCh(*psz); psz++; } if (stnT.Cch() == 0) continue; while (stnT.Cch() < 4) stnT.FAppendCh(kchSpace); prgch = stnT.Psz(); ctg = LwFromBytes((byte)prgch[0], (byte)prgch[1], (byte)prgch[2], (byte)prgch[3]); _sel.FAddCtgFilter(ctg); } LCancel: ReleasePpo(&pdlg); _InvalCkiKid(); _SetSel(lnNil, (grfsel & fselCki) ? &cki : pvNil, (grfsel & fselKid) ? &kid : pvNil); _ShowSel(); return fTrue; } /*************************************************************************** Clone a chunk and its subgraph ***************************************************************************/ bool DCD::FCmdCloneChunk(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); CKI cki, ckiNew; if (fselCki != _sel.GrfselGetCkiKid(&cki, pvNil)) goto LFail; _SetSel(lnNil); ckiNew.ctg = cki.ctg; if (!_pcfl->FClone(cki.ctg, cki.cno, _pcfl, &ckiNew.cno)) { _SetSel(lnNil, &cki); vpappb->TGiveAlertSz(PszLit("Cloning failed"), bkOk, cokExclamation); LFail: pcmd->cid = cidNil; // don't record return fTrue; } InvalAllDcd(_pdocb, _pcfl); _SetSel(lnNil, &ckiNew); _ShowSel(); return fTrue; } #ifdef DEBUG /*************************************************************************** Assert the validity of an object. ***************************************************************************/ void DCD::AssertValid(ulong grf) { DCD_PAR::AssertValid(0); AssertPo(&_sel, 0); AssertPo(_pcfl, 0); } /*************************************************************************** Mark memory for the DCD. ***************************************************************************/ void DCD::MarkMem(void) { AssertValid(0); DCD_PAR::MarkMem(); _sel.MarkMem(); } #endif // DEBUG /*************************************************************************** Parses the stn as a ctg. Pads with spaces. Fails if pstn is longer than 4 characters or empty. ***************************************************************************/ bool FGetCtgFromStn(CTG *pctg, PSTN pstn) { achar rgch[4]; AssertVarMem(pctg); AssertPo(pstn, 0); if (!FIn(pstn->Cch(), 1, 5)) { TrashVar(pctg); return fFalse; } rgch[0] = rgch[1] = rgch[2] = rgch[3] = kchSpace; CopyPb(pstn->Psz(), rgch, pstn->Cch() * size(achar)); // first character becomes the high byte *pctg = LwFromBytes((byte)rgch[0], (byte)rgch[1], (byte)rgch[2], (byte)rgch[3]); return fTrue; } /*************************************************************************** Get the indicated edit item from the dialog and convert it to a CTG. Pads with spaces. Fails if the text in the edit item is longer than 4 characters or empty. ***************************************************************************/ bool _FGetCtg(PDLG pdlg, long idit, CTG *pctg) { AssertPo(pdlg, 0); AssertVarMem(pctg); STN stn; pdlg->GetStn(idit, &stn); return FGetCtgFromStn(pctg, &stn); } /*************************************************************************** Put the ctg into the indicated edit item. ***************************************************************************/ void _PutCtgStn(PDLG pdlg, long idit, CTG ctg) { AssertPo(pdlg, 0); STN stn; stn.FFormatSz(PszLit("%f"), ctg); pdlg->FPutStn(idit, &stn); } /*************************************************************************** Constructor for SEL class. ***************************************************************************/ SEL::SEL(PCFL pcfl) { AssertPo(pcfl, 0); _pcfl = pcfl; _lnLim = lnNil; _pglctg = pvNil; _SetNil(); AssertThis(0); } /*************************************************************************** Constructor for a selection based on another selection. If the source selection is filtered, this selection will share the same filter list. ***************************************************************************/ SEL::SEL(SEL &selT) { _pglctg = pvNil; *this = selT; } /*************************************************************************** Destructor for a selection. Release the GL of ctg's to filter on. ***************************************************************************/ SEL::~SEL(void) { ReleasePpo(&_pglctg); } /*************************************************************************** Assignment operator from one selection to another. If the source selection is filtered, this selection will share the same filter list. ***************************************************************************/ SEL &SEL::operator=(SEL &selT) { PGL pglctgOld = _pglctg; SEL_PAR::operator=(selT); CopyPb(PvAddBv(&selT, size(SEL_PAR)), PvAddBv(this, size(SEL_PAR)), size(SEL) - size(SEL_PAR)); if (pvNil != _pglctg) _pglctg->AddRef(); ReleasePpo(&pglctgOld); return *this; } /*************************************************************************** Set the selection to a nil selection. ***************************************************************************/ void SEL::_SetNil(void) { _icki = ivNil; _ikid = ivNil; _ln = lnNil; AssertThis(0); } /*************************************************************************** Get the cki and kid. Return which of the elements are valid. One or both of pcki, pkid may be nil. ***************************************************************************/ ulong SEL::GrfselGetCkiKid(CKI *pcki, KID *pkid) { AssertThis(0); AssertNilOrVarMem(pcki); AssertNilOrVarMem(pkid); TrashVar(pcki); TrashVar(pkid); if (ivNil == _icki) return fselNil; if (pvNil != pcki) *pcki = _cki; if (ivNil == _ikid) return fselCki; if (pvNil != pkid) *pkid = _kid; return fselCki | fselKid; } /*************************************************************************** Set the selection to the given line. Return true iff the resulting selection is not nil. ***************************************************************************/ bool SEL::FSetLn(long ln) { AssertThis(0); Assert(ln == lnNil || ln >= 0 && ln < kcbMax, "bad ln"); if (ln == _ln) return fTrue; if (lnNil == ln || lnNil != _lnLim && ln >= _lnLim) { _SetNil(); return fFalse; } if (_ln > ln) { if (_ln - ln < ln) { // move backwards SuspendAssertValid(); SuspendCheckPointers(); while (_ln > ln) AssertDo(FRetreat(), 0); ResumeAssertValid(); ResumeCheckPointers(); return fTrue; } _SetNil(); } Assert(_ln < ln, "what?"); SuspendAssertValid(); SuspendCheckPointers(); while (_ln < ln) { if (!FAdvance()) return fFalse; } ResumeCheckPointers(); ResumeAssertValid(); return fTrue; } /*************************************************************************** Get the number of active lines in the sel. ***************************************************************************/ long SEL::LnLim(void) { AssertThis(0); if (lnNil == _lnLim) { SEL sel = *this; _lnLim = (lnNil == _ln) ? 0 : _ln + 1; SuspendAssertValid(); SuspendCheckPointers(); while (sel.FAdvance()) _lnLim++; ResumeAssertValid(); ResumeCheckPointers(); } return _lnLim; } /*************************************************************************** Advance the selection to the next item. If the selection is nil, advances it to the first item. Returns false and makes the selection nil iff there is no next item. ***************************************************************************/ bool SEL::FAdvance(void) { AssertThis(0); if (lnNil == _ln) { _ln = 0; _icki = 0; } else { _ln++; if (!_fHideKids) { // check for the next child for (_ikid = (ivNil == _ikid) ? 0 : _ikid + 1; _pcfl->FGetKid(_cki.ctg, _cki.cno, _ikid, &_kid); _ikid++) { if (_FFilter(_kid.cki.ctg, _kid.cki.cno)) return fTrue; } } _icki++; } _ikid = ivNil; for (; _pcfl->FGetCki(_icki, &_cki); _icki++) { if (_FFilter(_cki.ctg, _cki.cno)) return fTrue; } _SetNil(); return fFalse; } /*************************************************************************** Move the selection to the previous item. If the selection is nil or at the first item, this sets the selection nil and returns false. ***************************************************************************/ bool SEL::FRetreat(void) { AssertThis(0); if (lnNil == _ln) return fFalse; if (0 == _ln) goto LSetNil; _ln--; if (ivNil == _ikid) { // find the previous cki do { if (_icki-- <= 0) { Bug("initial _ln was wrong"); LSetNil: _SetNil(); return fFalse; } AssertDo(_pcfl->FGetCki(_icki, &_cki, &_ikid), 0); } while (!_FFilter(_cki.ctg, _cki.cno)); if (_ikid == 0 || _fHideKids) { _ikid = ivNil; return fTrue; } } // move to the previous child while (--_ikid >= 0) { AssertDo(_pcfl->FGetKid(_cki.ctg, _cki.cno, _ikid, &_kid), 0); if (_FFilter(_kid.cki.ctg, _kid.cki.cno)) return fTrue; } _ikid = ivNil; return fTrue; } /*************************************************************************** Set the selection to represent *pcki, *pkid. pkid may be nil. If fExact is false, this sets the sel to the last item at or before the given (pcki, pkid). ***************************************************************************/ bool SEL::FSetCkiKid(CKI *pcki, KID *pkid, bool fExact) { AssertThis(0); AssertVarMem(pcki); AssertNilOrVarMem(pkid); _cki = *pcki; _icki = 0; if (pvNil == pkid) _ikid = ivNil; else { _kid = *pkid; _ikid = 0; } _ln = 0; Adjust(fExact); AssertThis(0); return ivNil != _icki; } /*************************************************************************** Adjust the sel after an edit to the doc. Assume icki and ikid are wrong (except as indicators of invalid cki and kid fields), and assume ln is wrong. If fExact is false and the current (cki, kid) is no longer in the CFL or our filtering on it, we select the item immediately before where this one would be. ***************************************************************************/ void SEL::Adjust(bool fExact) { AssertPo(_pcfl, 0); long icki, ikid; if (ivNil == _icki) goto LSetNil; // get the icki and ikid if (!_pcfl->FGetIcki(_cki.ctg, _cki.cno, &icki) || !_FFilter(_cki.ctg, _cki.cno)) { if (fExact) goto LSetNil; ikid = ivNil; } else if (ivNil != (ikid = _ikid)) { if (_fHideKids) { if (fExact) goto LSetNil; ikid = ivNil; } else if (!_pcfl->FGetIkid(_cki.ctg, _cki.cno, _kid.cki.ctg, _kid.cki.cno, _kid.chid, &ikid) && fExact) { LSetNil: _SetNil(); return; } } // find the icki and ikid _SetNil(); SEL sel = *this; SuspendAssertValid(); SuspendCheckPointers(); while (sel.FAdvance()) { if (sel._icki >= icki && (sel._icki > icki || sel._ikid > ikid)) break; *this = sel; } ResumeAssertValid(); ResumeCheckPointers(); if (fExact && (_icki != icki || _ikid != ikid)) _SetNil(); } /*************************************************************************** Hide or show children according to fHide. ***************************************************************************/ void SEL::HideKids(bool fHide) { AssertThis(0); if (FPure(fHide) == _fHideKids) return; _fHideKids = FPure(fHide); Adjust(); } /*************************************************************************** Hide or show the filter list according to fHide. ***************************************************************************/ void SEL::HideList(bool fHide) { AssertThis(0); if (FPure(fHide) == _fHideList) return; _fHideList = FPure(fHide); Adjust(); } /*************************************************************************** Get the ictg'th ctg that we're filtering on. ***************************************************************************/ bool SEL::FGetCtgFilter(long ictg, CTG *pctg) { AssertThis(0); AssertVarMem(pctg); if (pvNil == _pglctg || !FIn(ictg, 0, _pglctg->IvMac())) return fFalse; _pglctg->Get(ictg, pctg); return fTrue; } /*************************************************************************** Reset the filter list to be empty. ***************************************************************************/ void SEL::FreeFilterList(void) { AssertThis(0); if (pvNil != _pglctg) { ReleasePpo(&_pglctg); Adjust(); } } /*************************************************************************** Add an element to the filter list. ***************************************************************************/ bool SEL::FAddCtgFilter(CTG ctg) { AssertThis(0); if (pvNil == _pglctg && pvNil == (_pglctg = GL::PglNew(size(CTG), 1))) return fFalse; if (!_pglctg->FAdd(&ctg)) return fFalse; Adjust(); return fTrue; } /*************************************************************************** Return true iff (ctg, cno) passes our filtering criteria. ***************************************************************************/ bool SEL::_FFilter(CTG ctg, CNO cno) { long cctg; CTG *qctg; if (pvNil == _pglctg || 0 == (cctg = _pglctg->IvMac())) return fTrue; for (qctg = (CTG *)_pglctg->QvGet(0); cctg-- > 0; qctg++) { if (*qctg == ctg) return !_fHideList; } return _fHideList; } #ifdef DEBUG /*************************************************************************** Assert the validity of the sel. ***************************************************************************/ void SEL::AssertValid(ulong grf) { SEL_PAR::AssertValid(0); AssertPo(_pcfl, 0); Assert((_ln == lnNil) == (_icki == ivNil && _ikid == ivNil), "nil values not in sync"); AssertNilOrPo(_pglctg, 0); } /*************************************************************************** Mark memory for the SEL. ***************************************************************************/ void SEL::MarkMem(void) { AssertValid(0); SEL_PAR::MarkMem(); MarkMemObj(_pglctg); } #endif // DEBUG ================================================ FILE: kauai/tools/chdoc.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** CHED document class ***************************************************************************/ #ifndef CHDOC_H #define CHDOC_H typedef class DOC *PDOC; typedef class DOCE *PDOCE; typedef class DOCH *PDOCH; typedef class DOCG *PDOCG; typedef class DOCI *PDOCI; typedef class DOCPIC *PDOCPIC; typedef class DOCMBMP *PDOCMBMP; typedef class SEL *PSEL; typedef class DCD *PDCD; typedef class DCH *PDCH; typedef class DCGB *PDCGB; typedef class DCGL *PDCGL; typedef class DCGG *PDCGG; typedef class DCST *PDCST; typedef class DCPIC *PDCPIC; typedef class DCMBMP *PDCMBMP; bool FGetCtgFromStn(CTG *pctg, PSTN pstn); #define lnNil (-1L) /*************************************************************************** Various document classes. DOC is the chunky file based document. DOCE is a virtual class for documents that represent an individual chunk in a DOC. A DOCE is a child document of a DOC. All other document classes in this header are derived from DOCE. ***************************************************************************/ /*************************************************************************** chunky file doc ***************************************************************************/ #define DOC_PAR DOCB #define kclsDOC 'DOC' class DOC : public DOC_PAR { RTCLASS_DEC ASSERT protected: PCFL _pcfl; // the chunky file DOC(void); ~DOC(void); public: static PDOC PdocNew(FNI *pfni); PCFL Pcfl(void) { return _pcfl; } virtual PDDG PddgNew(PGCB pgcb); virtual bool FGetFni(FNI *pfni); virtual bool FGetFniSave(FNI *pfni); virtual bool FSaveToFni(FNI *pfni, bool fSetFni); }; /*************************************************************************** Chunky editing doc - abstract class for editing a single chunk in a Chunky file. An instance of this class is a child doc of a DOC. Many document classes below are all derived from this. ***************************************************************************/ #define DOCE_PAR DOCB #define kclsDOCE 'DOCE' class DOCE : public DOCE_PAR { RTCLASS_DEC ASSERT protected: PCFL _pcfl; // which chunk is being edited CTG _ctg; CNO _cno; DOCE(PDOCB pdocb, PCFL pcfl, CTG ctg, CNO cno); bool _FInit(void); virtual bool _FSaveToChunk(CTG ctg, CNO cno, bool fRedirect); virtual bool _FWrite(PBLCK pblck, bool fRedirect) = 0; virtual long _CbOnFile(void) = 0; virtual bool _FRead(PBLCK pblck) = 0; public: static PDOCE PdoceFromChunk(PDOCB pdocb, PCFL pcfl, CTG ctg, CNO cno); static void CloseDeletedDoce(PDOCB pdocb); virtual void GetName(PSTN pstn); virtual bool FSave(long cid); }; /*************************************************************************** Hex editor document - for editing any chunk as a hex stream. ***************************************************************************/ #define DOCH_PAR DOCE #define kclsDOCH 'DOCH' class DOCH : public DOCH_PAR { RTCLASS_DEC ASSERT MARKMEM protected: BSF _bsf; // the byte stream DOCH(PDOCB pdocb, PCFL pcfl, CTG ctg, CNO cno); virtual bool _FWrite(PBLCK pblck, bool fRedirect); virtual long _CbOnFile(void); virtual bool _FRead(PBLCK pblck); public: static PDOCH PdochNew(PDOCB pdocb, PCFL pcfl, CTG ctg, CNO cno); virtual PDDG PddgNew(PGCB pgcb); }; /*************************************************************************** Group editor document - for editing GL, AL, GG, AG, GST, and AST. ***************************************************************************/ #define DOCG_PAR DOCE #define kclsDOCG 'DOCG' class DOCG : public DOCG_PAR { RTCLASS_DEC ASSERT MARKMEM protected: PGRPB _pgrpb; long _cls; // which class the group belongs to short _bo; short _osk; DOCG(PDOCB pdocb, PCFL pcfl, CTG ctg, CNO cno, long cls); ~DOCG(void); virtual bool _FWrite(PBLCK pblck, bool fRedirect); virtual long _CbOnFile(void); virtual bool _FRead(PBLCK pblck); public: static PDOCG PdocgNew(PDOCB pdocb, PCFL pcfl, CTG ctg, CNO cno, long cls); virtual PDDG PddgNew(PGCB pgcb); PDOCI PdociFromItem(long iv, long dln); void CloseDeletedDoci(long iv, long cvDel); PGRPB Pgrpb(void) { return _pgrpb; } }; /*************************************************************************** Item hex editor document - for editing an item in a GRPB. An instance of this class is normally a child doc of a DOCG (but doesn't have to be). ***************************************************************************/ #define DOCI_PAR DOCB #define kclsDOCI 'DOCI' class DOCI : public DOCI_PAR { RTCLASS_DEC ASSERT MARKMEM protected: PGRPB _pgrpb; // the group the data came from and gets written to. long _cls; long _iv; // which item is being edited long _dln; bool _fFixed; // indicates if the data is fixed length BSF _bsf; // the byte stream we're editing DOCI(PDOCB pdocb, PGRPB pgrpb, long cls, long iv, long dln); bool _FInit(void); virtual bool _FSaveToItem(long iv, bool fRedirect); virtual bool _FWrite(long iv); virtual HQ _HqRead(); public: static PDOCI PdociNew(PDOCB pdocb, PGRPB pgrpb, long cls, long iv, long dln); virtual PDDG PddgNew(PGCB pgcb); long Iv(void) { return _iv; } long Dln(void) { return _dln; } virtual void GetName(PSTN pstn); virtual bool FSave(long cid); }; /*************************************************************************** Picture display document. ***************************************************************************/ #define DOCPIC_PAR DOCE #define kclsDOCPIC 'dcpc' class DOCPIC : public DOCPIC_PAR { RTCLASS_DEC ASSERT MARKMEM protected: PPIC _ppic; DOCPIC(PDOCB pdocb, PCFL pcfl, CTG ctg, CNO cno); ~DOCPIC(void); virtual bool _FWrite(PBLCK pblck, bool fRedirect); virtual long _CbOnFile(void); virtual bool _FRead(PBLCK pblck); public: static PDOCPIC PdocpicNew(PDOCB pdocb, PCFL pcfl, CTG ctg, CNO cno); virtual PDDG PddgNew(PGCB pgcb); PPIC Ppic(void) { return _ppic; } }; /*************************************************************************** MBMP display document. ***************************************************************************/ #define DOCMBMP_PAR DOCE #define kclsDOCMBMP 'docm' class DOCMBMP : public DOCMBMP_PAR { RTCLASS_DEC ASSERT MARKMEM protected: PMBMP _pmbmp; DOCMBMP(PDOCB pdocb, PCFL pcfl, CTG ctg, CNO cno); ~DOCMBMP(void); virtual bool _FWrite(PBLCK pblck, bool fRedirect); virtual long _CbOnFile(void); virtual bool _FRead(PBLCK pblck); public: static PDOCMBMP PdocmbmpNew(PDOCB pdocb, PCFL pcfl, CTG ctg, CNO cno); virtual PDDG PddgNew(PGCB pgcb); PMBMP Pmbmp(void) { return _pmbmp; } }; /*************************************************************************** Document editing window classes follow. These are all DDG's. Most are also DCLB's (the first class defined below). DCLB is an abstract class that handles a line based editing window. The DCD class is for displaying a DOC (chunky file document). ***************************************************************************/ /*************************************************************************** abstract class for line based document windows ***************************************************************************/ #define DCLB_PAR DDG #define kclsDCLB 'DCLB' class DCLB : public DCLB_PAR { RTCLASS_DEC ASSERT protected: long _onn; // fixed width font to use long _dypHeader; // height of the header long _dypLine; // height of one line long _dxpChar; // width of a character DCLB(PDOCB pdocb, PGCB pgcb); virtual void _Scroll(long scaHorz, long scaVert, long scvHorz = 0, long scvVert = 0); virtual void _ScrollDxpDyp(long dxp, long dyp); virtual void GetMinMax(RC *prcMinMax); long _YpFromLn(long ln) { return LwMul(ln - _scvVert, _dypLine) + _dypHeader; } long _XpFromIch(long ich) { return LwMul(ich - _scvHorz + 1, _dxpChar); } long _LnFromYp(long yp); void _GetContent(RC *prc); }; /*************************************************************************** SEL: used to track a selection in a chunky file doc ***************************************************************************/ enum { fselNil = 0, fselCki = 1, fselKid = 2 }; #define SEL_PAR BASE #define kclsSEL 'SEL' class SEL : public SEL_PAR { RTCLASS_DEC ASSERT MARKMEM protected: PCFL _pcfl; long _icki; long _ikid; CKI _cki; KID _kid; long _ln; long _lnLim; // this is lnNil if we haven't yet calculated the lim PGL _pglctg; // the ctgs to filter on bool _fHideList : 1; // whether to hide the ctgs in the list or show them bool _fHideKids : 1; // whether to hide the kids void _SetNil(void); bool _FFilter(CTG ctg, CNO cno); public: SEL(PCFL pcfl); SEL(SEL &selT); ~SEL(void); SEL &operator=(SEL &selT); void Adjust(bool fExact = fFalse); long Icki(void) { return _icki; } long Ikid(void) { return _ikid; } long Ln(void) { return _ln; } ulong GrfselGetCkiKid(CKI *pcki, KID *pkid); bool FSetLn(long ln); bool FAdvance(void); bool FRetreat(void); bool FSetCkiKid(CKI *pcki, KID *pkid = pvNil, bool fExact = fTrue); long LnLim(void); void InvalLim(void) { _lnLim = lnNil; } bool FHideKids(void) { return _fHideKids; } void HideKids(bool fHide); bool FHideList(void) { return _fHideList; } void HideList(bool fHide); bool FGetCtgFilter(long ictg, CTG *pctg); void FreeFilterList(void); bool FAddCtgFilter(CTG ctg); }; /*************************************************************************** Display for chunky document - displays a DOC. ***************************************************************************/ #define DCD_PAR DCLB #define kclsDCD 'DCD' class DCD : public DCD_PAR { RTCLASS_DEC CMD_MAP_DEC(DCD) ASSERT MARKMEM protected: long _dypBorder; // height of border (included in _dypLine) PCFL _pcfl; // the chunky file SEL _sel; // the current selection DCD(PDOCB pdocb, PCFL pcfl, PGCB pgcb); void _DrawSel(PGNV pgnv); void _HiliteLn(long ln); void _SetSel(long ln, CKI *pcki = pvNil, KID *pkid = pvNil); void _ShowSel(void); virtual void _Activate(bool fActive); virtual long _ScvMax(bool fVert); bool _FAddChunk(CTG ctgDef, CKI *pcki, bool *pfCreated); bool _FEditChunkInfo(CKI *pckiOld); bool _FChangeChid(CKI *pcki, KID *pkid); bool _FDoAdoptChunkDlg(CKI *pcki, KID *pkid); void _EditCki(CKI *pcki, long cid); void _InvalCkiKid(CKI *pcki = pvNil, KID *pkid = pvNil); // clipboard support virtual bool _FCopySel(PDOCB *ppdocb = pvNil); virtual void _ClearSel(void); virtual bool _FPaste(PCLIP pclip, bool fDoIt, long cid); public: static PDCD PdcdNew(PDOCB pdocb, PCFL pcfl, PGCB pgcb); static void InvalAllDcd(PDOCB pdocb, PCFL pcfl, CKI *pcki = pvNil, KID *pkid = pvNil); virtual void Draw(PGNV pgnv, RC *prcClip); virtual void MouseDown(long xp, long yp, long cact, ulong grfcust); virtual bool FCmdKey(PCMD_KEY pcmd); virtual bool FEnableDcdCmd(PCMD pcmd, ulong *pgrfeds); virtual bool FCmdAddChunk(PCMD pcmd); virtual bool FCmdDeleteChunk(PCMD pcmd); virtual bool FCmdAdoptChunk(PCMD pcmd); virtual bool FCmdUnadoptChunk(PCMD pcmd); virtual bool FCmdEditChunk(PCMD pcmd); virtual bool FCmdAddPicChunk(PCMD pcmd); virtual bool FCmdAddBitmapChunk(PCMD pcmd); virtual bool FCmdImportScript(PCMD pcmd); virtual bool FCmdTestScript(PCMD pcmd); virtual bool FCmdDisasmScript(PCMD pcmd); virtual bool FCmdAddFileChunk(PCMD pcmd); virtual bool FCmdEditChunkInfo(PCMD pcmd); virtual bool FCmdChangeChid(PCMD pcmd); virtual bool FCmdSetColorTable(PCMD pcmd); virtual bool FCmdFilterChunk(PCMD pcmd); virtual bool FCmdPack(PCMD pcmd); virtual bool FCmdStopSound(PCMD pcmd); virtual bool FCmdCloneChunk(PCMD pcmd); virtual bool FCmdReopen(PCMD pcmd); bool FTestScript(CTG ctg, CNO cno, long cbCache = 0x00300000L); bool FPlayMidi(CTG ctg, CNO cno); bool FPlayWave(CTG ctg, CNO cno); }; /*************************************************************************** Display chunk in hex - displays a BSF (byte stream), but doesn't necessarily display a DOCH. ***************************************************************************/ #define DCH_PAR DCLB #define kclsDCH 'DCH' class DCH : public DCH_PAR { RTCLASS_DEC ASSERT MARKMEM protected: PBSF _pbsf; // the byte stream long _cbLine; // number of bytes per line // the selection long _ibAnchor; long _ibOther; bool _fSelOn : 1; // selection is showing bool _fRightSel : 1; // selection if on a line boundary is at the right edge bool _fHalfSel : 1; // second half of hex character is selected bool _fHexSel : 1; // hex area active bool _fFixed : 1; // indicates if the data is fixed length DCH(PDOCB pdocb, PBSF pbsf, bool fFixed, PGCB pgcb); virtual void _Activate(bool fActive); virtual long _ScvMax(bool fVert); long _IchFromCb(long cb, bool fHex, bool fNoTrailSpace = fFalse); long _XpFromCb(long cb, bool fHex, bool fNoTrailSpace = fFalse); long _XpFromIb(long ib, bool fHex); long _YpFromIb(long ib); long _IbFromPt(long xp, long yp, tribool *ptHex, bool *pfRight = pvNil); void _SetSel(long ibAnchor, long ibOther, bool fRight); void _SetHalfSel(long ib); void _SetHexSel(bool fHex); void _SwitchSel(bool fOn); void _ShowSel(void); void _InvertSel(PGNV pgnv); void _InvertIbRange(PGNV pgnv, long ib1, long ib2, bool fHex); bool _FReplace(byte *prgb, long cb, long ibMin, long ibLim, bool fHalfSel = fFalse); void _InvalAllDch(long ib, long cbIns, long cbDel); void _InvalIb(long ib, long cbIns, long cbDel); void _DrawHeader(PGNV pgnv); // clipboard support virtual bool _FCopySel(PDOCB *ppdocb = pvNil); virtual void _ClearSel(void); virtual bool _FPaste(PCLIP pclip, bool fDoIt, long cid); public: static PDCH PdchNew(PDOCB pdocb, PBSF pbsf, bool fFixed, PGCB pgcb); virtual void Draw(PGNV pgnv, RC *prcClip); virtual void MouseDown(long xp, long yp, long cact, ulong grfcust); virtual bool FCmdKey(PCMD_KEY pcmd); }; /*************************************************************************** Virtual class that supports displaying a group chunk - displays a GRPB. Usually displays a DOCG, but doesn't have to. ***************************************************************************/ #define DCGB_PAR DCLB #define kclsDCGB 'DCGB' class DCGB : public DCGB_PAR { RTCLASS_DEC CMD_MAP_DEC(DCGB) ASSERT MARKMEM protected: long _dypBorder; // height of border (included in _dypLine) long _clnItem; // number of lines for each item long _ivCur; // which item is selected long _dlnCur; // which line in the item is selected PGRPB _pgrpb; // the group we're displaying long _cls; // the class of the group bool _fAllocated; // whether the class is allocated or general DCGB(PDOCB pdocb, PGRPB pgrpb, long cls, long clnItem, PGCB pgcb); virtual void _Activate(bool fActive); virtual long _ScvMax(bool fVert); long _YpFromIvDln(long iv, long dln) { return _YpFromLn(LwMul(iv, _clnItem) + dln); } long _LnFromIvDln(long iv, long dln) { return LwMul(iv, _clnItem) + dln; } long _LnLim(void) { return LwMul(_pgrpb->IvMac(), _clnItem); } void _SetSel(long ln); void _ShowSel(void); void _DrawSel(PGNV pgnv); void _InvalIv(long iv, long cvIns, long cvDel); void _EditIvDln(long iv, long dln); void _DeleteIv(long iv); public: static void InvalAllDcgb(PDOCB pdocb, PGRPB pgrpb, long iv, long cvIns, long cvDel); virtual bool FCmdKey(PCMD_KEY pcmd); virtual void MouseDown(long xp, long yp, long cact, ulong grfcust); virtual bool FEnableDcgbCmd(PCMD pcmd, ulong *pgrfeds); virtual bool FCmdEditItem(PCMD pcmd); virtual bool FCmdDeleteItem(PCMD pcmd); virtual bool FCmdAddItem(PCMD pcmd) = 0; }; /*************************************************************************** Display GL or AL chunk. ***************************************************************************/ #define DCGL_PAR DCGB #define kclsDCGL 'DCGL' class DCGL : public DCGL_PAR { RTCLASS_DEC protected: DCGL(PDOCB pdocb, PGLB pglb, long cls, PGCB pgcb); public: static PDCGL PdcglNew(PDOCB pdocb, PGLB pglb, long cls, PGCB pgcb); virtual void Draw(PGNV pgnv, RC *prcClip); virtual bool FCmdAddItem(PCMD pcmd); }; /*************************************************************************** Display GG or AG chunk. ***************************************************************************/ #define DCGG_PAR DCGB #define kclsDCGG 'DCGG' class DCGG : public DCGG_PAR { RTCLASS_DEC protected: DCGG(PDOCB pdocb, PGGB pggb, long cls, PGCB pgcb); public: static PDCGG PdcggNew(PDOCB pdocb, PGGB pggb, long cls, PGCB pgcb); virtual void Draw(PGNV pgnv, RC *prcClip); virtual bool FCmdAddItem(PCMD pcmd); }; /*************************************************************************** Display GST or AST chunk. ***************************************************************************/ #define DCST_PAR DCGB #define kclsDCST 'DCST' class DCST : public DCST_PAR { RTCLASS_DEC protected: DCST(PDOCB pdocb, PGSTB pgstb, long cls, PGCB pgcb); public: static PDCST PdcstNew(PDOCB pdocb, PGSTB pgstb, long cls, PGCB pgcb); virtual void Draw(PGNV pgnv, RC *prcClip); virtual bool FCmdAddItem(PCMD pcmd); }; /*************************************************************************** Display a picture chunk. ***************************************************************************/ #define DCPIC_PAR DDG #define kclsDCPIC 'dpic' class DCPIC : public DCPIC_PAR { RTCLASS_DEC ASSERT MARKMEM protected: PPIC _ppic; DCPIC(PDOCB pdocb, PPIC ppic, PGCB pgcb); virtual void GetMinMax(RC *prcMinMax); public: static PDCPIC PdcpicNew(PDOCB pdocb, PPIC ppic, PGCB pgcb); virtual void Draw(PGNV pgnv, RC *prcClip); }; /*************************************************************************** Display a MBMP chunk. ***************************************************************************/ #define DCMBMP_PAR DDG #define kclsDCMBMP 'dmbp' class DCMBMP : public DCMBMP_PAR { RTCLASS_DEC ASSERT MARKMEM protected: PMBMP _pmbmp; DCMBMP(PDOCB pdocb, PMBMP pmbmp, PGCB pgcb); virtual void GetMinMax(RC *prcMinMax); public: static PDCMBMP PdcmbmpNew(PDOCB pdocb, PMBMP pmbmp, PGCB pgcb); virtual void Draw(PGNV pgnv, RC *prcClip); }; /*************************************************************************** Main Kidspace world for testing a script. ***************************************************************************/ typedef class TSCG *PTSCG; #define TSCG_PAR WOKS #define kclsTSCG 'TSCG' class TSCG : public TSCG_PAR { RTCLASS_DEC CMD_MAP_DEC(TSCG) public: TSCG(PGCB pgcb) : TSCG_PAR(pgcb) { } virtual void Draw(PGNV pgnv, RC *prcClip); }; /*************************************************************************** Text doc for the chunky editor. ***************************************************************************/ typedef class CHTXD *PCHTXD; #define CHTXD_PAR TXPD #define kclsCHTXD 'chtx' class CHTXD : public CHTXD_PAR { protected: CHTXD(PDOCB pdocb = pvNil, ulong grfdoc = fdocNil); public: static PCHTXD PchtxdNew(PFNI pfni = pvNil, PBSF pbsf = pvNil, short osk = koskCur, PDOCB pdocb = pvNil, ulong grfdoc = fdocNil); virtual PDDG PddgNew(PGCB pgcb); }; /*************************************************************************** Text display gob for the chunky editor. ***************************************************************************/ typedef class CHTDD *PCHTDD; #define CHTDD_PAR TXLG #define kclsCHTDD 'chtd' class CHTDD : public CHTDD_PAR { CMD_MAP_DEC(CHTDD) protected: CHTDD(PTXTB ptxtb, PGCB pgcb, long onn, ulong grfont, long dypFont, long cchTab); public: static PCHTDD PchtddNew(PTXTB ptxtb, PGCB pgcb, long onn, ulong grfont, long dypFont, long cchTab); virtual bool FCmdCompileChunky(PCMD pcmd); virtual bool FCmdCompileScript(PCMD pcmd); }; void OpenSinkDoc(PMSFIL pmsfil); #endif //! CHDOC_H ================================================ FILE: kauai/tools/ched.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Chunky editor. ***************************************************************************/ #include "ched.h" ASSERTNAME BEGIN_CMD_MAP(APP, APPB) ON_CID_GEN(cidNew, &APP::FCmdOpen, pvNil) ON_CID_GEN(cidOpen, &APP::FCmdOpen, pvNil) ON_CID_GEN(cidNewText, &APP::FCmdOpen, pvNil) ON_CID_GEN(cidOpenText, &APP::FCmdOpen, pvNil) END_CMD_MAP_NIL() APP vapp; RTCLASS(APP) /*************************************************************************** Main for a frame app. ***************************************************************************/ void FrameMain(void) { vapp.Run(fappNil, fgobNil, kginDefault); } /*************************************************************************** Initialize the APP - do the command line parsing thing. ***************************************************************************/ bool APP::_FInit(ulong grfapp, ulong grfgob, long ginDef) { if (!APP_PAR::_FInit(grfapp, grfgob, ginDef)) return fFalse; #ifdef WIN // parse the command line and load any resource files and help files FNI fni; STN stn; bool fQuote, fScript, fSkip; PDMD pdmd; PDDG pddg; PDOCB pdocb; long lw; PSZ psz = vwig.pszCmdLine; fSkip = fTrue; fScript = fFalse; for (;;) { while (*psz == kchSpace) psz++; if (!*psz) break; stn.SetNil(); fQuote = fFalse; while (*psz && (fQuote || *psz != kchSpace)) { if (*psz == ChLit('"')) fQuote = !fQuote; else stn.FAppendCh(*psz); psz++; } if (stn.Cch() == 0) continue; if (fSkip) { // application path fSkip = fFalse; continue; } if (stn.Cch() == 2 && (stn.Psz()[0] == ChLit('/') || stn.Psz()[0] == ChLit('-'))) { // command line switch switch (stn.Psz()[1]) { case ChLit('s'): fScript = fTrue; break; } continue; } if (fScript) { // this arg should be a cno fScript = fFalse; if (!stn.FGetLw(&lw)) continue; if (pvNil == (pdmd = DMD::PdmdTop())) continue; if (pvNil == (pddg = pdmd->Pdocb()->PddgActive()) || !pddg->FIs(kclsDCD)) { continue; } ((PDCD)pddg)->FTestScript(kctgScript, lw); continue; } if (!fni.FBuildFromPath(&stn) || fni.Ftg() == kftgDir) continue; if (pvNil != (pdocb = DOCB::PdocbFromFni(&fni))) { pdocb->ActivateDmd(); continue; } if (pvNil == (pdocb = (PDOCB)DOC::PdocNew(&fni))) continue; pdocb->PdmdNew(); ReleasePpo(&pdocb); } #endif // WIN return fTrue; } /*************************************************************************** Get the name for the frame tester app. ***************************************************************************/ void APP::GetStnAppName(PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); #ifdef UNICODE STN stnDate; STN stnTime; stnDate.SetSzs(__DATE__); stnTime.SetSzs(__TIME__); pstn->FFormatSz(Debug(PszLit("Debug ")) PszLit("Ched (Unicode; %s; %s)"), &stnDate, &stnTime); #else //! UNICODE *pstn = Debug("Debug ") "Ched (Ansi; " __DATE__ "; " __TIME__ ")"; #endif //! UNICODE } /*************************************************************************** Update the given window. *prc is the bounding rectangle of the update region. ***************************************************************************/ void APP::UpdateHwnd(HWND hwnd, RC *prc, ulong grfapp) { AssertThis(0); PGOB pgob; if (pvNil == (pgob = GOB::PgobFromHwnd(hwnd))) return; // for script windows, do offscreen updating if (pgob->FIs(kclsTSCG)) grfapp |= fappOffscreen; APP_PAR::UpdateHwnd(hwnd, prc, grfapp); } /*************************************************************************** Do a fast update of the gob and its descendents into the given gpt. ***************************************************************************/ void APP::_FastUpdate(PGOB pgob, PREGN pregnClip, ulong grfapp, PGPT pgpt) { AssertThis(0); AssertPo(pgob, 0); AssertPo(pregnClip, 0); AssertNilOrPo(pgpt, 0); if (pgob->FIs(kclsTSCG)) grfapp |= fappOffscreen; APP_PAR::_FastUpdate(pgob, pregnClip, grfapp, pgpt); } /*************************************************************************** Open an existing or new chunky file for editing. Handles cidNew and cidOpen. ***************************************************************************/ bool APP::FCmdOpen(PCMD pcmd) { FNI fni; FNI *pfni; PDOCB pdocb; pfni = pvNil; switch (pcmd->cid) { default: Bug("why are we here?"); return fTrue; case cidOpen: // do the standard dialog if (!FGetFniOpenMacro(&fni, pvNil, 0, PszLit("Chunky Files\0*.chk;*.cfl\0All Files\0*.*\0"), vwig.hwndApp)) { return fTrue; } pfni = &fni; if (pvNil != (pdocb = DOCB::PdocbFromFni(&fni))) { pdocb->ActivateDmd(); return fTrue; } // fall through case cidNew: pdocb = (PDOCB)DOC::PdocNew(pfni); break; case cidOpenText: // do the standard dialog if (!FGetFniOpenMacro(&fni, pvNil, 0, PszLit("Text Files\0*.txt;*.cht\0All Files\0*.*\0"), vwig.hwndApp)) { return fTrue; } pfni = &fni; if (pvNil != (pdocb = DOCB::PdocbFromFni(&fni))) { pdocb->ActivateDmd(); return fTrue; } // fall through case cidNewText: pdocb = (PDOCB)CHTXD::PchtxdNew(pfni, pvNil, oskNil); break; } if (pvNil == pdocb) return fTrue; pdocb->PdmdNew(); ReleasePpo(&pdocb); return fTrue; } ================================================ FILE: kauai/tools/ched.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Chunky editor main header file ***************************************************************************/ #ifndef CHED_H #define CHED_H #include "kidframe.h" #include "chedres.h" // creator type for the chunky editor #define kctgChed 'CHED' #include "chdoc.h" #define APP_PAR APPB #define kclsAPP 'APP' class APP : public APP_PAR { RTCLASS_DEC CMD_MAP_DEC(APP) protected: virtual bool _FInit(ulong grfapp, ulong grfgob, long ginDef); virtual void _FastUpdate(PGOB pgob, PREGN pregnClip, ulong grfapp = fappNil, PGPT pgpt = pvNil); public: virtual void GetStnAppName(PSTN pstn); virtual void UpdateHwnd(HWND hwnd, RC *prc, ulong grfapp = fappNil); virtual bool FCmdOpen(PCMD pcmd); }; #endif //! CHED_H ================================================ FILE: kauai/tools/ched.rc ================================================ //Microsoft Visual C++ generated resource script. // #include "chedres.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #define APSTUDIO_HIDDEN_SYMBOLS #include "windows.h" #undef APSTUDIO_HIDDEN_SYMBOLS #include "framedef.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Menu // 128 MENU DISCARDABLE BEGIN POPUP "&File" BEGIN MENUITEM "&New\tCtrl+N", cidNew MENUITEM "&Open...\tCtrl+O", cidOpen MENUITEM "&Reopen", cidReopen MENUITEM SEPARATOR MENUITEM "New &Text", cidNewText MENUITEM "Open T&ext...", cidOpenText MENUITEM SEPARATOR MENUITEM "&Close\tCtrl+W", cidClose MENUITEM "Sa&ve and Close \tCtrl+E", cidSaveAndClose MENUITEM "&Save\tCtrl+S", cidSave MENUITEM "Save &As...", cidSaveAs MENUITEM "Save a Cop&y...", cidSaveCopy MENUITEM SEPARATOR MENUITEM "E&xit\tCtrl+Q", cidQuit END POPUP "&Edit" BEGIN MENUITEM "&Undo\tCtrl+Z", cidUndo MENUITEM "&Redo\tCtrl+A", cidRedo MENUITEM SEPARATOR MENUITEM "Cu&t\tCtrl+X", cidCut MENUITEM "&Copy\tCtrl+C", cidCopy MENUITEM "&Paste\tCtrl+V", cidPaste MENUITEM "Paste Clo&ne\tCtrl+K", cidPasteSpecial MENUITEM "&Delete\tDel", cidClear MENUITEM SEPARATOR MENUITEM "&Show Clipboard", cidShowClipboard END POPUP "&Chunk" BEGIN MENUITEM "&New Chunk...", cidAddChunk MENUITEM "&Delete Chunk", cidDeleteChunk MENUITEM "&Undelete Chunk", cidUndeleteChunk MENUITEM "Clone Chunk\tCtrl+L", cidCloneChunk MENUITEM SEPARATOR MENUITEM "Fil&ter...", cidFilterChunk MENUITEM "&Edit Chunk Information...\tCtrl+Enter", cidEditChunkInfo MENUITEM "C&hange CHID...\tCtrl+Enter", cidChangeChid MENUITEM SEPARATOR MENUITEM "&Add Child...", cidAdoptChunk MENUITEM "De&lete Child", cidUnadoptChunk MENUITEM SEPARATOR MENUITEM "Pac&k / Unpack", cidPack MENUITEM "T&oggle Pack Flag", cidTogglePack MENUITEM SEPARATOR MENUITEM "Import &Bitmap...", cidAddMbmpChunk MENUITEM "Import &Mask...", cidAddMaskChunk MENUITEM "Import &Picture...", cidAddPicChunk MENUITEM "Import &File...", cidAddFileChunk MENUITEM SEPARATOR MENUITEM "Compile &Script...", cidCompileInScript MENUITEM "Assemble Sc&ript...", cidCompilePostScript MENUITEM SEPARATOR MENUITEM "&Compile To Chunky File", cidCompileChunky MENUITEM "Compile Script (&GLOP)", cidCompileScript MENUITEM "Assemble Scr&ipt (GLOP)", cidAssembleScript END POPUP "Edit &As" BEGIN MENUITEM "Use as &Color Table (GLCR)", cidSetColorTable MENUITEM "Run Script (GLO&P) (3MB)\tCtrl+R", cidTestScript MENUITEM "R&un Script (GLOP)...\tCtrl+T", cidRunScriptCache MENUITEM "&Disassemble Script (GLOP)", cidDisassembleScript MENUITEM SEPARATOR MENUITEM "&Natural\tEnter", cidEditNatural MENUITEM "&Hex\tCtrl+H", cidEditHex MENUITEM SEPARATOR MENUITEM "General &List (GL)", cidEditGL MENUITEM "Allocated L&ist (AL)", cidEditAL MENUITEM "General &Group (GG)", cidEditGG MENUITEM "Allocated G&roup (AG)", cidEditAG MENUITEM "General &String Table (GST)", cidEditGST MENUITEM "Allocated S&tring Table (AST)", cidEditAST MENUITEM SEPARATOR MENUITEM "Picture (&META)", cidEditPic MENUITEM "Masked Bitmap (M&BMP)", cidEditMbmp MENUITEM "Play Sound (&WAVE or MIDI)", cidPlaySound MENUITEM "St&op Sound", cidStopSound END POPUP "&Item" BEGIN MENUITEM "&Insert", cidInsertItem MENUITEM "&Add", cidAddItem MENUITEM "&Delete", cidDeleteItem END POPUP "&Window" BEGIN MENUITEM "_", cidChooseWnd END END #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE DISCARDABLE BEGIN "chedres.h\0" END 2 TEXTINCLUDE DISCARDABLE BEGIN "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" "#include ""windows.h""\r\n" "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" "#include ""framedef.h""\r\n" "\0" END 3 TEXTINCLUDE DISCARDABLE BEGIN "#include ""frame.rc""\r\n" "\0" END ///////////////////////////////////////////////////////////////////////////// #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Dialog // dlidChunkInfo DIALOG DISCARDABLE 50, 50, 185, 71 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Chunk Info" FONT 10, "System" BEGIN DEFPUSHBUTTON "&OK",1,111,9,50,14 PUSHBUTTON "&Cancel",2,111,29,50,14 EDITTEXT 3,55,10,40,12,ES_AUTOHSCROLL EDITTEXT 4,55,30,40,12,ES_AUTOHSCROLL EDITTEXT 5,55,50,106,12,ES_AUTOHSCROLL RTEXT "CTG:",10,15,10,30,8 RTEXT "CNO:",11,15,30,30,8 RTEXT "Name:",12,18,52,28,8 END dlidAdoptChunk DIALOG DISCARDABLE 50, 50, 201, 118 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Adopt Chunk" FONT 10, "System" BEGIN DEFPUSHBUTTON "&OK",1,145,10,50,14 PUSHBUTTON "&Cancel",2,145,30,50,14 EDITTEXT 3,80,10,40,12,ES_AUTOHSCROLL EDITTEXT 4,80,30,40,12,ES_AUTOHSCROLL EDITTEXT 5,80,55,40,12,ES_AUTOHSCROLL EDITTEXT 6,80,75,40,12,ES_AUTOHSCROLL EDITTEXT 7,80,95,40,12,ES_AUTOHSCROLL RTEXT "Parent CTG:",100,15,10,55,8 RTEXT "Parent CNO:",101,15,30,55,8 RTEXT "Child CTG:",102,15,55,55,8 RTEXT "Child CNO:",dlidAdoptChunk,15,75,55,8 RTEXT "CHID:",104,15,95,55,8 END dlidGlbNew DIALOG DISCARDABLE 100, 100, 185, 68 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "New GL/AL" FONT 10, "System" BEGIN DEFPUSHBUTTON "OK",1,129,6,50,14 PUSHBUTTON "Cancel",2,129,25,50,14 EDITTEXT 3,70,40,43,12,ES_AUTOHSCROLL LTEXT "Enter the size (in bytes) of each element of the GL/AL.", 4,10,10,113,20 RTEXT "Size:",5,25,42,35,8 END dlidGgbNew DIALOG DISCARDABLE 100, 100, 185, 78 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "New GG/AG" FONT 10, "System" BEGIN DEFPUSHBUTTON "OK",1,129,6,50,14 PUSHBUTTON "Cancel",2,129,25,50,14 EDITTEXT 3,65,50,43,12,ES_AUTOHSCROLL LTEXT "Enter the size (in bytes) of the fixed-sized portion of each element of the GG/AG.", 4,10,5,113,30 RTEXT "Size:",5,25,52,35,8 END dlidGstbNew DIALOG DISCARDABLE 100, 100, 185, 78 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "New GST/AST" FONT 10, "System" BEGIN DEFPUSHBUTTON "OK",1,129,6,50,14 PUSHBUTTON "Cancel",2,129,25,50,14 EDITTEXT 3,70,50,43,12,ES_AUTOHSCROLL LTEXT "Enter the size (in LONGs) of the extra data for each element of the GST/AST.", 4,10,10,113,30 RTEXT "Size:",5,25,52,35,8 END dlidChangeChid DIALOG DISCARDABLE 50, 50, 121, 42 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Change CHID" FONT 10, "System" BEGIN DEFPUSHBUTTON "&OK",1,7,20,50,14 PUSHBUTTON "&Cancel",2,63,20,50,14 EDITTEXT 3,57,4,40,12,ES_AUTOHSCROLL RTEXT "CHID:",10,14,6,39,8 END dlidMbmp DIALOG DISCARDABLE 50, 50, 167, 69 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Masked Bitmap" FONT 10, "System" BEGIN DEFPUSHBUTTON "OK",1,26,50,50,14 PUSHBUTTON "Cancel",2,91,50,50,14 EDITTEXT 3,122,3,40,12,ES_AUTOHSCROLL EDITTEXT 4,35,33,40,12,ES_AUTOHSCROLL EDITTEXT 5,106,32,40,12,ES_AUTOHSCROLL LTEXT "Transparent Pixel Value (0 ... 255):",10,3,4,119,13 LTEXT "Reference Point [upper left is (0,0)]:",11,16,18,125,12 LTEXT "X Pos:",12,9,34,25,7 LTEXT "Y Pos:",13,81,34,24,7 END dlidFilter DIALOG DISCARDABLE 100, 100, 185, 92 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Filter Chunks" FONT 10, "System" BEGIN DEFPUSHBUTTON "OK",IDOK,129,6,50,14 PUSHBUTTON "Cancel",IDCANCEL,129,23,50,14 CONTROL "Hide &Children",3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, 13,10,94,10 CONTROL "&Hide Listed Chunks",4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,29,94,10 EDITTEXT 5,34,56,132,12,ES_AUTOHSCROLL RTEXT "CTGs:",6,6,58,24,7 END dlidScriptCache DIALOG DISCARDABLE 0, 0, 211, 56 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Run Script" FONT 10, "System" BEGIN DEFPUSHBUTTON "OK",1,155,6,50,14 PUSHBUTTON "Cancel",2,155,23,50,14 EDITTEXT 3,85,17,40,12,ES_AUTOHSCROLL RTEXT "Cache Size (in KB):",4,12,19,71,9 END ///////////////////////////////////////////////////////////////////////////// // // Accelerator // acidMain ACCELERATORS DISCARDABLE BEGIN "A", cidRedo, VIRTKEY, CONTROL, NOINVERT "C", cidCopy, VIRTKEY, CONTROL, NOINVERT "E", cidSaveAndClose, VIRTKEY, CONTROL, NOINVERT "H", cidEditHex, VIRTKEY, CONTROL, NOINVERT "K", cidPasteSpecial, VIRTKEY, CONTROL, NOINVERT "L", cidCloneChunk, VIRTKEY, CONTROL, NOINVERT "N", cidNew, VIRTKEY, CONTROL, NOINVERT "O", cidOpen, VIRTKEY, CONTROL, NOINVERT "Q", cidQuit, VIRTKEY, CONTROL, NOINVERT "R", cidTestScript, VIRTKEY, CONTROL, NOINVERT "S", cidSave, VIRTKEY, CONTROL, NOINVERT "T", cidRunScriptCache, VIRTKEY, CONTROL, NOINVERT "V", cidPaste, VIRTKEY, CONTROL, NOINVERT "W", cidClose, VIRTKEY, CONTROL, NOINVERT "X", cidCut, VIRTKEY, CONTROL, NOINVERT "Z", cidUndo, VIRTKEY, CONTROL, NOINVERT END #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // #include "frame.rc" ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED ================================================ FILE: kauai/tools/chedres.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ //{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by ched.rc // #define dlidChunkInfo 200 #define dlidAdoptChunk 201 #define dlidGlbNew 202 #define dlidGgbNew 203 #define dlidGstbNew 204 #define dlidChangeChid 205 #define dlidMbmp 206 #define dlidFilter 207 #define dlidScriptCache 208 #define cidAddChunk 40010 #define cidAdoptChunk 40011 #define cidUnadoptChunk 40012 #define cidDeleteChunk 40013 #define cidUndeleteChunk 40014 #define cidEditHex 40016 #define cidEditGL 40017 #define cidEditNatural 40018 #define cidEditAL 40019 #define cidEditGG 40020 #define cidEditAG 40021 #define cidEditGST 40022 #define cidEditAST 40023 #define cidInsertItem 40024 #define cidAddItem 40025 #define cidDeleteItem 40026 #define cidEditPic 40027 #define cidAddPicChunk 40028 #define cidCompilePostScript 40029 #define cidAddFileChunk 40030 #define cidTestScript 40031 #define cidCompileInScript 40032 #define cidNewText 40033 #define cidOpenText 40034 #define cidDisassembleScript 40035 #define cidEditChunkInfo 40036 #define cidChangeChid 40037 #define cidAddMbmpChunk 40038 #define cidEditMbmp 40039 #define cidSetColorTable 40040 #define cidCompileChunky 40043 #define cidCompileScript 40044 #define cidAssembleScript 40045 #define cidAddMaskChunk 40046 #define cidFilterChunk 40049 #define cidPlaySound 40051 #define cidPack 40054 #define cidTogglePack 40055 #define cidStopSound 40056 #define cidCloneChunk 40058 #define cidRunScriptCache 40059 #define cidReopen 40060 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 209 #define _APS_NEXT_COMMAND_VALUE 40061 #define _APS_NEXT_CONTROL_VALUE 1019 #define _APS_NEXT_SYMED_VALUE 128 #endif #endif ================================================ FILE: kauai/tools/chelp.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Help authoring tool. ***************************************************************************/ #include "chelp.h" ASSERTNAME BEGIN_CMD_MAP(APP, APPB) ON_CID_GEN(cidNew, &APP::FCmdOpen, pvNil) ON_CID_GEN(cidOpen, &APP::FCmdOpen, pvNil) ON_CID_GEN(cidOpenText, &APP::FCmdOpen, pvNil) ON_CID_GEN(cidOpenRichText, &APP::FCmdOpen, pvNil) ON_CID_GEN(cidLoadResFile, &APP::FCmdLoadResFile, pvNil) ON_CID_GEN(cidChooseLanguage, &APP::FCmdChooseLanguage, &APP::FEnableChooseLanguage) END_CMD_MAP_NIL() BEGIN_CMD_MAP(LIG, GOB) ON_CID_ME(cidDoScroll, &LIG::FCmdScroll, pvNil) ON_CID_ME(cidEndScroll, &LIG::FCmdScroll, pvNil) END_CMD_MAP_NIL() APP vapp; RTCLASS(APP) RTCLASS(LIG) RTCLASS(LID) RTCLASS(CCG) RTCLASS(CCGT) STRG _strg; PSTRG vpstrg; SC_LID vsclid = ksclidAmerican; PSPLC vpsplc; /*************************************************************************** Main for a frame app. ***************************************************************************/ void FrameMain(void) { vpstrg = &_strg; vapp.Run(fappNil, fgobNil, kginDefault); ReleasePpo(&vpsplc); } #ifdef DEBUG /*************************************************************************** Assert the validity of a APP. ***************************************************************************/ void APP::AssertValid(ulong grf) { APP_PAR::AssertValid(0); AssertNilOrPo(_pcrm, 0); AssertNilOrPo(_plidPicture, 0); AssertNilOrPo(_plidButton, 0); } /*************************************************************************** Mark memory for the APP. ***************************************************************************/ void APP::MarkMem(void) { AssertValid(0); APP_PAR::MarkMem(); MarkMemObj(_pcrm); MarkMemObj(_plidPicture); MarkMemObj(_plidButton); MarkMemObj(&_strg); MarkMemObj(vpsplc); } #endif // DEBUG /*************************************************************************** Initialize the app. Add some stuff to the menus and do the command line parsing thing. ***************************************************************************/ bool APP::_FInit(ulong grfapp, ulong grfgob, long ginDef) { static long _rgdypFont[] = {10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 24, 28, 32, 36, 0}; struct LANG { PSZ psz; long sclid; }; static LANG _rglang[] = { {PszLit("American"), ksclidAmerican}, {PszLit("Australian"), ksclidAustralian}, {PszLit("British"), ksclidBritish}, {PszLit("German"), ksclidGerman}, {PszLit("Swiss German"), ksclidSwissGerman}, {PszLit("French"), ksclidFrench}, {PszLit("French Canadian"), ksclidFrenchCanadian}, {PszLit("Spanish"), ksclidSpanish}, {PszLit("Catalan"), ksclidCatalan}, {PszLit("Italian"), ksclidItalian}, {PszLit("Other..."), 0}, }; long iv, dyp; STN stn; if (!APP_PAR::_FInit(grfapp, grfgob, ginDef)) return fFalse; vpmubCur->FRemoveAllListCid(cidChooseFontSize); stn = PszLit("Other..."); vpmubCur->FAddListCid(cidChooseFontSize, 0, &stn); for (iv = 0; (dyp = _rgdypFont[iv]) != 0; iv++) { stn.FFormatSz(PszLit("%d"), dyp); vpmubCur->FAddListCid(cidChooseFontSize, dyp, &stn); } for (iv = 0; iv < CvFromRgv(_rglang); iv++) { stn = _rglang[iv].psz; vpmubCur->FAddListCid(cidChooseLanguage, _rglang[iv].sclid, &stn); } #ifdef WIN // parse the command line and load any resource files and help files FNI fni; bool fQuote, fRes, fSkip; PSZ psz = vwig.pszCmdLine; // skip the first token since it is the path fSkip = fTrue; fRes = fFalse; for (;;) { while (*psz == kchSpace) psz++; if (!*psz) break; stn.SetNil(); fQuote = fFalse; while (*psz && (fQuote || *psz != kchSpace)) { if (*psz == ChLit('"')) fQuote = !fQuote; else stn.FAppendCh(*psz); psz++; } if (stn.Cch() == 0) continue; if (fSkip) { fSkip = fFalse; continue; } if (stn.Cch() == 2 && (stn.Psz()[0] == ChLit('/') || stn.Psz()[0] == ChLit('-'))) { // command line switch switch (stn.Psz()[1]) { case ChLit('r'): case ChLit('R'): fRes = fTrue; break; } continue; } if (!fni.FBuildFromPath(&stn) || fni.Ftg() == kftgDir) { fRes = fFalse; continue; } if (fRes) FLoadResFile(&fni); else FOpenDocFile(&fni); fRes = fFalse; } #endif // WIN return fTrue; } /*************************************************************************** Get the name for the help editor app. ***************************************************************************/ void APP::GetStnAppName(PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); #ifdef UNICODE STN stnDate; STN stnTime; stnDate.SetSzs(__DATE__); stnTime.SetSzs(__TIME__); pstn->FFormatSz(Debug(PszLit("Debug ")) PszLit("Chelp (Unicode; %s; %s)"), &stnDate, &stnTime); #else //! UNICODE *pstn = Debug("Debug ") "Chelp (Ansi; " __DATE__ "; " __TIME__ ")"; #endif //! UNICODE } /*************************************************************************** Update the given window. *prc is the bounding rectangle of the update region. ***************************************************************************/ void APP::UpdateHwnd(HWND hwnd, RC *prc, ulong grfapp) { AssertThis(0); PGOB pgob; if (pvNil == (pgob = GOB::PgobFromHwnd(hwnd))) return; // for text windows, do offscreen updating if (pgob->FIs(kclsDMD) && ((PDMD)pgob)->Pdocb()->FIs(kclsTXRD)) grfapp |= fappOffscreen; APP_PAR::UpdateHwnd(hwnd, prc, grfapp); } /*************************************************************************** Do a fast update of the gob and its descendents into the given gpt. ***************************************************************************/ void APP::_FastUpdate(PGOB pgob, PREGN pregnClip, ulong grfapp, PGPT pgpt) { AssertThis(0); // for text windows, do offscreen updating if (pgob->FIs(kclsDMD) && ((PDMD)pgob)->Pdocb()->FIs(kclsTXRD)) grfapp |= fappOffscreen; APP_PAR::_FastUpdate(pgob, pregnClip, grfapp, pgpt); } /*************************************************************************** Open an existing or new chunky file for editing. Handles cidNew and cidOpen. ***************************************************************************/ bool APP::FCmdOpen(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); FNI fni; FNI *pfni; pfni = pvNil; switch (pcmd->cid) { default: Bug("why are we here?"); return fTrue; case cidOpen: // do the standard dialog if (!FGetFniOpenMacro(&fni, pvNil, 0, PszLit("Kid Help Files\0*.khp;*.chk\0All Files\0*.*\0"), vwig.hwndApp)) { return fTrue; } pfni = &fni; break; case cidOpenText: // do the standard dialog if (!FGetFniOpenMacro(&fni, pvNil, 0, PszLit("Text files\0*.txt\0All Files\0*.*\0"), vwig.hwndApp)) { return fTrue; } pfni = &fni; break; case cidOpenRichText: // do the standard dialog if (!FGetFniOpenMacro(&fni, pvNil, 0, PszLit("Rich Text files\0*.rtx\0All Files\0*.*\0"), vwig.hwndApp)) { return fTrue; } pfni = &fni; break; case cidNew: break; } FOpenDocFile(pfni, pcmd->cid); return fTrue; } /*************************************************************************** Load a document file. ***************************************************************************/ bool APP::FOpenDocFile(PFNI pfni, long cid) { AssertThis(0); AssertNilOrPo(pfni, 0); bool fRet; PDOCB pdocb; PHEDO phedo; PTXRD ptxrd; if (pvNil != pfni && pvNil != (pdocb = DOCB::PdocbFromFni(pfni))) { pdocb->ActivateDmd(); return fTrue; } pdocb = pvNil; switch (cid) { case cidOpenText: if (pvNil == (ptxrd = TXRD::PtxrdNew(pvNil))) return fFalse; fRet = fFalse; if (pvNil != pfni) { FLO flo; if (pvNil == (flo.pfil = FIL::PfilOpen(pfni))) goto LFail; flo.fp = 0; flo.cb = flo.pfil->FpMac(); fRet = ptxrd->FReplaceFlo(&flo, fTrue, 0, 0); ReleasePpo(&flo.pfil); if (!fRet) { LFail: ReleasePpo(&ptxrd); return fFalse; } } pdocb = ptxrd; break; case cidOpenRichText: if (pvNil == (pdocb = TXRD::PtxrdNew(pfni))) return fFalse; break; default: if (pvNil == _pcrm && pvNil == (_pcrm = CRM::PcrmNew(1))) return fFalse; if (pvNil == _plidPicture && pvNil == (_plidPicture = LID::PlidNew(_pcrm, kctgMbmp))) { return fFalse; } if (pvNil == _plidButton && pvNil == (_plidButton = LID::PlidNew(_pcrm, kctgGokd, ChidFromSnoDchid(ksnoInit, 0)))) { return fFalse; } phedo = HEDO::PhedoNew(pfni, _pcrm); if (pvNil == phedo) return fFalse; pdocb = phedo; break; } fRet = (pdocb->PdmdNew() != pvNil); ReleasePpo(&pdocb); return fRet; } /*************************************************************************** Open an existing or new chunky file for editing. Handles cidNew and cidOpen. ***************************************************************************/ bool APP::FCmdLoadResFile(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); FNI fni; if (!FGetFniOpenMacro(&fni, pvNil, 0, PszLit("Chunky Resource Files\0*.chk\0All Files\0*.*\0"), vwig.hwndApp)) { return fTrue; } FLoadResFile(&fni); return fTrue; } /*************************************************************************** Load a resource file. ***************************************************************************/ bool APP::FLoadResFile(PFNI pfni) { AssertThis(0); AssertPo(pfni, ffniFile); PCFL pcfl; long ipcrf; PCRF pcrf; BLCK blck; if (pvNil == _pcrm && pvNil == (_pcrm = CRM::PcrmNew(1))) return fFalse; if (pvNil == (pcfl = CFL::PcflOpen(pfni, fcflNil))) { vpappb->TGiveAlertSz(PszLit("Can't open that file"), bkOk, cokStop); return fFalse; } // see if it's already in the crm. for (ipcrf = _pcrm->Ccrf(); ipcrf-- > 0;) { pcrf = _pcrm->PcrfGet(ipcrf); if (pcfl == pcrf->Pcfl()) return fTrue; } if (!_pcrm->FAddCfl(pcfl, 0x100000L)) { ReleasePpo(&pcfl); return fFalse; } if (pcfl->FGetCkiCtg(kctgColorTable, 0, pvNil, pvNil, &blck)) { PGL pglclr; if (pvNil != (pglclr = GL::PglRead(&blck)) && pglclr->CbEntry() == size(CLR)) { GPT::SetActiveColors(pglclr, fpalIdentity); } ReleasePpo(&pglclr); } ReleasePpo(&pcfl); if (pvNil != _plidPicture) _plidPicture->FRefresh(); if (pvNil != _plidButton) _plidButton->FRefresh(); return fTrue; } /*************************************************************************** Check or uncheck the language as appropriate. ***************************************************************************/ bool APP::FEnableChooseLanguage(PCMD pcmd, ulong *pgrfeds) { AssertThis(0); AssertPo(pcmd, 0); AssertVarMem(pgrfeds); *pgrfeds = fedsEnable | fedsUncheck; if (vsclid == pcmd->rglw[0]) *pgrfeds = fedsEnable | fedsCheck; return fTrue; } enum { kiditOkLang, kiditCancelLang, kiditCodeLang, kiditLimLang }; /*************************************************************************** Command to choose the language (for spelling). ***************************************************************************/ bool APP::FCmdChooseLanguage(PCMD pcmd) { AssertThis(0); AssertPo(pcmd, 0); if (pcmd->rglw[0] == 0) { // ask the user PDLG pdlg; bool fRet; if (pvNil == (pdlg = DLG::PdlgNew(dlidFontSize))) return fTrue; pdlg->FPutLwInEdit(kiditCodeLang, vsclid); if (kiditOkLang != pdlg->IditDo(kiditCodeLang)) { ReleasePpo(&pdlg); return fFalse; } fRet = pdlg->FGetLwFromEdit(kiditCodeLang, &pcmd->rglw[0]); ReleasePpo(&pdlg); if (!fRet) return fTrue; } if ((SC_LID)pcmd->rglw[0] == vsclid) return fTrue; ReleasePpo(&vpsplc); vsclid = (SC_LID)pcmd->rglw[0]; return fTrue; } /*************************************************************************** Create a new LIG for the given help text document. ***************************************************************************/ PLIG APP::PligNew(bool fButton, PGCB pgcb, PTXHD ptxhd) { PLID plid = fButton ? _plidButton : _plidPicture; if (pvNil == plid) return pvNil; return LIG::PligNew(plid, pgcb, ptxhd); } /*************************************************************************** Constructor for the list display gob. ***************************************************************************/ LID::LID(void) : LID_PAR() { } /*************************************************************************** Desctructor for the list display gob. ***************************************************************************/ LID::~LID(void) { ReleasePpo(&_pcrm); ReleasePpo(&_pglcach); } #ifdef DEBUG /*************************************************************************** Assert the validity of a LID. ***************************************************************************/ void LID::AssertValid(ulong grf) { LID_PAR::AssertValid(0); AssertPo(_pcrm, 0); AssertPo(_pglcach, 0); } /*************************************************************************** Mark memory for the LIG. ***************************************************************************/ void LID::MarkMem(void) { AssertValid(0); LID_PAR::MarkMem(); MarkMemObj(_pcrm); MarkMemObj(_pglcach); } #endif // DEBUG /*************************************************************************** Static method to create a new list document. ***************************************************************************/ PLID LID::PlidNew(PCRM pcrm, CTG ctg, CHID chid) { AssertPo(pcrm, 0); PLID plid; if (pvNil == (plid = NewObj LID)) return pvNil; if (!plid->_FInit(pcrm, ctg, chid)) ReleasePpo(&plid); return plid; } /*************************************************************************** Initialization for the list document. ***************************************************************************/ bool LID::_FInit(PCRM pcrm, CTG ctg, CHID chid) { AssertPo(pcrm, 0); GCB gcb; if (pvNil == (_pglcach = GL::PglNew(size(CACH)))) return fFalse; _pglcach->SetMinGrow(100); _pcrm = pcrm; _pcrm->AddRef(); _ctg = ctg; _chid = chid; return FRefresh(); } /*************************************************************************** Rebuild the list and update the DDGs. The pcrm has changed. ***************************************************************************/ bool LID::FRefresh(void) { AssertThis(0); long ipcrf, icki; CACH cach, cachT; PCRF pcrf; PCFL pcfl; CKI cki; long ivMin, ivLim, iv; KID kid; long ipddg; PDDG pddg; bool fRet = fFalse; _pglcach->FSetIvMac(0); for (ipcrf = 0; ipcrf < _pcrm->Ccrf(); ipcrf++) { pcrf = _pcrm->PcrfGet(ipcrf); pcfl = pcrf->Pcfl(); for (icki = 0; pcfl->FGetCkiCtg(_ctg, icki, &cki); icki++) { cach.pcrf = pcrf; cach.cno = cach.cnoMbmp = cki.cno; if (kctgMbmp != _ctg) { if (!pcfl->FGetKidChidCtg(_ctg, cki.cno, _chid, kctgMbmp, &kid)) continue; cach.cnoMbmp = kid.cki.cno; } // determine where this cno goes. for (ivMin = 0, ivLim = _pglcach->IvMac(); ivMin < ivLim;) { iv = (ivMin + ivLim) / 2; _pglcach->Get(iv, &cachT); if (cachT.cno < cach.cno) ivMin = iv + 1; else ivLim = iv; } if (ivMin < _pglcach->IvMac()) { _pglcach->Get(ivMin, &cachT); if (cachT.cno == cach.cno) continue; } if (!_pglcach->FInsert(ivMin, &cach)) goto LFail; } } fRet = fTrue; LFail: // invalidate the LIGs for (ipddg = 0; pvNil != (pddg = PddgGet(ipddg)); ipddg++) { Assert(pddg->FIs(kclsLIG), 0); ((PLIG)pddg)->Refresh(); } return fTrue; } /*************************************************************************** Return the number of items in the list. ***************************************************************************/ long LID::Ccki(void) { AssertThis(0); return _pglcach->IvMac(); } /*************************************************************************** Get the CKI for the indicated item. ***************************************************************************/ void LID::GetCki(long icki, CKI *pcki, PCRF *ppcrf) { AssertThis(0); AssertIn(icki, 0, _pglcach->IvMac()); AssertVarMem(pcki); AssertNilOrVarMem(ppcrf); CACH cach; _pglcach->Get(icki, &cach); pcki->ctg = _ctg; pcki->cno = cach.cno; if (pvNil != ppcrf) *ppcrf = cach.pcrf; } /*************************************************************************** Get an MBMP for the indicated item. ***************************************************************************/ PMBMP LID::PmbmpGet(long icki) { AssertThis(0); AssertIn(icki, 0, _pglcach->IvMac()); CACH cach; _pglcach->Get(icki, &cach); return (PMBMP)cach.pcrf->PbacoFetch(kctgMbmp, cach.cnoMbmp, MBMP::FReadMbmp); } /*************************************************************************** Constructor for the list display gob. ***************************************************************************/ LIG::LIG(PLID plid, GCB *pgcb) : LIG_PAR(plid, pgcb) { } #ifdef DEBUG /*************************************************************************** Assert the validity of a LIG. ***************************************************************************/ void LIG::AssertValid(ulong grf) { LIG_PAR::AssertValid(0); AssertPo(_pscb, 0); AssertPo(_ptxhd, 0); AssertIn(_dypCell, 1, kswMax); } /*************************************************************************** Mark memory for the LIG. ***************************************************************************/ void LIG::MarkMem(void) { AssertValid(0); LIG_PAR::MarkMem(); MarkMemObj(_ptxhd); } #endif // DEBUG /*************************************************************************** Static method to create a new list display gob. ***************************************************************************/ PLIG LIG::PligNew(PLID plid, GCB *pgcb, PTXHD ptxhd, long dypCell) { AssertPo(plid, 0); AssertVarMem(pgcb); AssertPo(ptxhd, 0); AssertIn(dypCell, 1, kswMax); PLIG plig; if (pvNil == (plig = NewObj LIG(plid, pgcb))) return pvNil; if (!plig->_FInit(ptxhd, dypCell)) ReleasePpo(&plig); return plig; } /*************************************************************************** Return the LID for this LIG. ***************************************************************************/ PLID LIG::Plid(void) { AssertPo(_pdocb, 0); Assert(_pdocb->FIs(kclsLID), 0); return (PLID)_pdocb; } /*************************************************************************** Initialization for the list display gob. ***************************************************************************/ bool LIG::_FInit(PTXHD ptxhd, long dypCell) { AssertPo(ptxhd, 0); AssertIn(dypCell, 1, kswMax); GCB gcb; if (!LIG_PAR::_FInit()) return fFalse; _ptxhd = ptxhd; _dypCell = dypCell; gcb.Set(khidVScroll, this); gcb._rcRel.Set(krelOne, 0, krelOne, krelOne); gcb._rcAbs.Set(-SCB::DxpNormal(), -1, 0, 1 - kdxpFrameCcg); if (pvNil == (_pscb = SCB::PscbNew(&gcb, fscbVert, 0, 0, Plid()->Ccki() - 1))) { return fFalse; } AssertThis(0); return fTrue; } /*************************************************************************** The LID has changed, reset the scroll bounds and invalidate the display area. ***************************************************************************/ void LIG::Refresh(void) { AssertThis(0); long val; InvalRc(pvNil); val = LwMax(0, LwMin(_pscb->Val(), Plid()->Ccki() - 1)); _pscb->SetValMinMax(val, 0, Plid()->Ccki() - 1); } /*************************************************************************** Draw the list. ***************************************************************************/ void LIG::Draw(PGNV pgnv, RC *prcClip) { AssertThis(0); AssertPo(pgnv, 0); AssertVarMem(prcClip); RC rc, rcT, rcCell, rcClip; long icki; PMBMP pmbmp; PLID plid; long ccki; plid = Plid(); ccki = plid->Ccki(); GetRc(&rc, cooLocal); rcT = rc; rc.ypBottom = rcT.ypTop = rcT.ypBottom - kdxpFrameCcg; pgnv->FillRc(&rcT, kacrBlack); _pscb->GetRc(&rcT, cooParent); rc.xpRight = rcT.xpLeft; rcCell = rc; if (!rc.FIntersect(prcClip)) return; pgnv->FillRc(&rc, kacrWhite); rcCell.ypTop = LwRoundToward(rc.ypTop, _dypCell); icki = _pscb->Val() + rcCell.ypTop / _dypCell; for (; rcCell.ypTop < rc.ypBottom && icki < ccki; rcCell.ypTop += _dypCell, icki++) { rcCell.ypBottom = rcCell.ypTop + _dypCell; pmbmp = plid->PmbmpGet(icki); if (pvNil == pmbmp) continue; pmbmp->GetRc(&rcT); rcT.CenterOnRc(&rcCell); if (rcClip.FIntersect(&rc, &rcCell)) { pgnv->ClipRc(&rcClip); pgnv->DrawMbmp(pmbmp, &rcT); } ReleasePpo(&pmbmp); } } /*************************************************************************** Handles a scroll command. ***************************************************************************/ bool LIG::FCmdScroll(PCMD pcmd) { long dval, val; RC rc, rcT; GetRc(&rc, cooLocal); rc.ypBottom -= kdxpFrameCcg; _pscb->GetRc(&rcT, cooParent); rc.xpRight = rcT.xpLeft; val = _pscb->Val(); switch (pcmd->cid) { case cidDoScroll: switch (pcmd->rglw[1]) { default: Bug("unknown sca"); return fTrue; case scaLineUp: dval = -1; break; case scaPageUp: dval = -LwMax(1, rc.Dyp() / _dypCell - 1); break; case scaLineDown: dval = 1; break; case scaPageDown: dval = LwMax(1, rc.Dyp() / _dypCell - 1); break; case scaToVal: dval = pcmd->rglw[2] - val; break; } break; case cidEndScroll: dval = pcmd->rglw[1] - val; break; } dval = LwMax(0, LwMin(dval + val, _pscb->ValMax())) - val; if (dval == 0) return fTrue; _pscb->SetVal(val + dval); Scroll(&rc, 0, -dval * _dypCell, kginDraw); return fTrue; } /*************************************************************************** The mouse was clicked in the LIG. Insert the object in the active DDG. ***************************************************************************/ void LIG::MouseDown(long xp, long yp, long cact, ulong grfcust) { AssertThis(0); long icki; CKI cki; RC rc, rcT; PHETG phetg; PCRF pcrf; PLID plid; plid = (PLID)_pdocb; Assert(plid->FIs(kclsLID), 0); AssertPo(plid, 0); GetRc(&rc, cooLocal); _pscb->GetRc(&rcT, cooParent); rc.xpRight = rcT.xpLeft; if (!rc.FPtIn(xp, yp)) return; icki = _pscb->Val() + yp / _dypCell; if (!FIn(icki, 0, plid->Ccki())) return; phetg = (PHETG)_ptxhd->PddgActive(); if (pvNil == phetg || !phetg->FIs(kclsHETG)) return; plid->GetCki(icki, &cki, &pcrf); switch (cki.ctg) { case kctgMbmp: phetg->FInsertPicture(pcrf, cki.ctg, cki.cno); break; case kctgGokd: phetg->FInsertButton(pcrf, cki.ctg, cki.cno); break; } } /*************************************************************************** Constructor for the CCG. ***************************************************************************/ CCG::CCG(GCB *pgcb, PTXHD ptxhd, bool fForeColor, long cacrRow) : CCG_PAR(pgcb) { AssertPo(ptxhd, 0); AssertIn(cacrRow, 1, 257); _ptxhd = ptxhd; _cacrRow = cacrRow; _fForeColor = FPure(fForeColor); } /*************************************************************************** Handle mousedown in a CCG. Set the foreground or background color of the text in the active of DDG of the ptxhd. ***************************************************************************/ void CCG::MouseDown(long xp, long yp, long cact, ulong grfcust) { AssertThis(0); PHETG phetg; ACR acr; if (!_FGetAcrFromPt(xp, yp, &acr)) return; phetg = (PHETG)_ptxhd->PddgActive(); if (pvNil != phetg && phetg->FIs(kclsHETG)) phetg->FSetColor(_fForeColor ? &acr : pvNil, _fForeColor ? pvNil : &acr); } /*************************************************************************** Draw the Color chooser gob. ***************************************************************************/ void CCG::Draw(PGNV pgnv, RC *prcClip) { AssertThis(0); AssertPo(pgnv, 0); AssertVarMem(prcClip); long crcHeight, ircHeight, ircWidth; long iscr; RC rc, rcT; ACR acr; GetRc(&rc, cooLocal); rc.ypTop -= kdxpFrameCcg; rc.xpLeft -= kdxpFrameCcg; pgnv->SetPenSize(kdxpFrameCcg, kdxpFrameCcg); pgnv->FrameRc(&rc, kacrBlack); rc.Inset(kdxpFrameCcg, kdxpFrameCcg); pgnv->FillRc(&rc, kacrWhite); rc.Inset(kdxpFrameCcg, kdxpFrameCcg); crcHeight = LwDivAway(257, _cacrRow); for (iscr = 0, ircHeight = 0; ircHeight < crcHeight; ircHeight++) { for (ircWidth = 0; ircWidth < _cacrRow; ircWidth++, iscr++) { rcT.SetToCell(&rc, _cacrRow, crcHeight, ircWidth, ircHeight); switch (iscr) { default: acr.SetToIndex((byte)iscr); pgnv->FillRc(&rcT, acr); break; case 0: pgnv->FillRc(&rcT, kacrBlack); break; case 256: if (!_fForeColor) pgnv->FillRcApt(&rcT, &vaptGray, kacrBlack, kacrWhite); return; } } } } /*************************************************************************** Map the given point to a color. ***************************************************************************/ bool CCG::_FGetAcrFromPt(long xp, long yp, ACR *pacr, RC *prc, long *piscr) { AssertThis(0); AssertVarMem(pacr); AssertNilOrVarMem(prc); AssertNilOrVarMem(piscr); RC rc; long iscr; long ircWidth, ircHeight; GetRc(&rc, cooLocal); rc.ypTop += kdxpFrameCcg; rc.xpLeft += kdxpFrameCcg; rc.ypBottom -= 2 * kdxpFrameCcg; rc.xpRight -= 2 * kdxpFrameCcg; if (!rc.FMapToCell(xp, yp, _cacrRow, LwDivAway(257, _cacrRow), &ircWidth, &ircHeight)) { TrashVar(prc); TrashVar(piscr); return fFalse; } iscr = LwMul(ircHeight, _cacrRow) + ircWidth; switch (iscr) { default: if (!FIn(iscr, 1, 256)) return fFalse; pacr->SetToIndex((byte)iscr); break; case 0: *pacr = kacrBlack; break; case 256: if (_fForeColor) return fFalse; pacr->SetToClear(); break; } if (pvNil != prc) { prc->SetToCell(&rc, _cacrRow, LwDivAway(257, _cacrRow), ircWidth, ircHeight); } if (pvNil != piscr) *piscr = iscr; return fTrue; } /*************************************************************************** Put up the CCG's tool tip. ***************************************************************************/ bool CCG::FEnsureToolTip(PGOB *ppgobCurTip, long xpMouse, long ypMouse) { AssertThis(0); AssertVarMem(ppgobCurTip); AssertNilOrPo(*ppgobCurTip, 0); RC rc; ACR acr; ReleasePpo(ppgobCurTip); GCB gcb(khidToolTip, this, fgobNil, kginMark); *ppgobCurTip = NewObj CCGT(&gcb, kacrBlack); return fTrue; } /*************************************************************************** When the mouse moves over the CCG, update the tool tip. ***************************************************************************/ bool CCG::FCmdMouseMove(PCMD_MOUSE pcmd) { AssertThis(0); AssertVarMem(pcmd); PCCGT pccgt; RC rc, rcOld; ACR acr; STN stn; long iscr; if (pvNil == (pccgt = (PCCGT)PgobFromHid(khidToolTip)) || !pccgt->FIs(kclsCCGT)) { return fTrue; } if (!_FGetAcrFromPt(pcmd->xp, pcmd->yp, &acr, &rc, &iscr)) { rc.Zero(); acr = kacrBlack; } else { rc.ypBottom = rc.ypTop; rc.ypTop -= 30; rc.Inset(-20, 0); if (acr == kacrClear) stn = PszLit(" Clear "); else stn.FFormatSz(PszLit(" %d "), iscr); } if (rc.ypTop < 0 && pcmd->yp < rc.Dyp()) rc.Offset(0, 60); GetRc(&rcOld, cooLocal); rcOld.ypBottom -= kdxpFrameCcg; rcOld.xpRight -= kdxpFrameCcg; rc.PinToRc(&rcOld); pccgt->GetPos(&rcOld, pvNil); if (rcOld != rc) pccgt->SetPos(&rc); pccgt->SetAcr(acr, &stn); return fTrue; } #ifdef DEBUG /*************************************************************************** Assert the validity of a CCG. ***************************************************************************/ void CCG::AssertValid(ulong grf) { CCG_PAR::AssertValid(0); AssertPo(_ptxhd, 0); AssertIn(_cacrRow, 1, 257); } #endif // DEBUG /*************************************************************************** Constructor for color chooser tool tip. ***************************************************************************/ CCGT::CCGT(PGCB pgcb, ACR acr, PSTN pstn) : CCGT_PAR(pgcb) { AssertBaseThis(0); _acr = acr; if (pvNil != pstn) _stn = *pstn; } /*************************************************************************** Set the color for the tool tip. ***************************************************************************/ void CCGT::SetAcr(ACR acr, PSTN pstn) { AssertThis(0); AssertPo(&acr, 0); AssertNilOrPo(pstn, 0); if (_acr != acr || pvNil == pstn && _stn.Cch() > 0 || !_stn.FEqual(pstn)) { _acr = acr; if (pvNil == pstn) _stn.SetNil(); else _stn = *pstn; InvalRc(pvNil, kginMark); } } /*************************************************************************** Draw the color tool tip. ***************************************************************************/ void CCGT::Draw(PGNV pgnv, RC *prcClip) { AssertThis(0); AssertPo(pgnv, 0); AssertVarMem(prcClip); RC rc; ACR acr; GetRc(&rc, cooLocal); pgnv->SetPenSize(1, 1); pgnv->FrameRc(&rc, kacrBlack); rc.Inset(1, 1); pgnv->FrameRc(&rc, kacrWhite); rc.Inset(1, 1); if (_acr == kacrClear) pgnv->FillRcApt(&rc, &vaptGray, kacrBlack, kacrWhite); else pgnv->FillRc(&rc, _acr); if (_stn.Cch() > 0) { pgnv->ClipRc(&rc); pgnv->SetFont(vpappb->OnnDefVariable(), fontBold, 12, tahCenter, tavCenter); if (_acr == kacrClear) { pgnv->DrawStn(&_stn, rc.XpCenter(), rc.YpCenter(), kacrBlack, kacrWhite); } else pgnv->DrawStn(&_stn, rc.XpCenter(), rc.YpCenter(), _acr, kacrInvert); } } ================================================ FILE: kauai/tools/chelp.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Main include file for the help authoring tool. ***************************************************************************/ #ifndef CHELP_H #define CHELP_H #include "kidframe.h" #include "chelpexp.h" #include "chelpres.h" extern PSTRG vpstrg; extern SC_LID vsclid; extern PSPLC vpsplc; enum { khidLigButton = khidLimFrame, khidLigPicture, }; // creator type for the help editor #define kctgChelp 'CHLP' typedef class LID *PLID; typedef class LIG *PLIG; typedef class HETD *PHETD; /*************************************************************************** App class ***************************************************************************/ #define APP_PAR APPB #define kclsAPP 'APP' class APP : public APP_PAR { RTCLASS_DEC ASSERT MARKMEM CMD_MAP_DEC(APP) protected: PCRM _pcrm; PLID _plidPicture; PLID _plidButton; virtual bool _FInit(ulong grfapp, ulong grfgob, long ginDef); virtual void _FastUpdate(PGOB pgob, PREGN pregnClip, ulong grfapp = fappNil, PGPT pgpt = pvNil); public: virtual void GetStnAppName(PSTN pstn); virtual void UpdateHwnd(HWND hwnd, RC *prc, ulong grfapp = fappNil); virtual bool FCmdOpen(PCMD pcmd); virtual bool FCmdLoadResFile(PCMD pcmd); virtual bool FCmdChooseLanguage(PCMD pcmd); virtual bool FEnableChooseLanguage(PCMD pcmd, ulong *pgrfeds); PLIG PligNew(bool fButton, PGCB pgcb, PTXHD ptxhd); bool FLoadResFile(PFNI pfni); bool FOpenDocFile(PFNI pfni, long cid = cidOpen); }; extern APP vapp; /*************************************************************************** List document ***************************************************************************/ #define LID_PAR DOCB #define kclsLID 'LID' class LID : public LID_PAR { RTCLASS_DEC ASSERT MARKMEM protected: struct CACH { PCRF pcrf; CNO cno; CNO cnoMbmp; }; PCRM _pcrm; // where to look for the chunks CTG _ctg; // what ctg to look for CHID _chid; // what chid value the MBMP should be at (if _ctg is not MBMP) PGL _pglcach; // list of the chunks that we found LID(void); ~LID(void); bool _FInit(PCRM pcrm, CTG ctg, CHID chid); public: static PLID PlidNew(PCRM pcrm, CTG ctg, CHID chid = 0); bool FRefresh(void); long Ccki(void); void GetCki(long icki, CKI *pcki, PCRF *ppcrf = pvNil); PMBMP PmbmpGet(long icki); }; /*************************************************************************** List display gob ***************************************************************************/ const long kdxpCellLig = kdzpInch * 2; const long kdypCellLig = kdzpInch; typedef class LIG *PLIG; #define LIG_PAR DDG #define kclsLIG 'LIG' class LIG : public LIG_PAR { RTCLASS_DEC ASSERT MARKMEM CMD_MAP_DEC(LIG) protected: PTXHD _ptxhd; // the document to put the chunk in PSCB _pscb; // our scroll bar long _dypCell; // how tall are our cells LIG(PLID plid, GCB *pgcb); bool _FInit(PTXHD ptxhd, long dypCell); public: static PLIG PligNew(PLID plid, GCB *pgcb, PTXHD ptxhd, long dypCell = kdypCellLig); PLID Plid(void); void Refresh(void); virtual void MouseDown(long xp, long yp, long cact, ulong grfcust); virtual void Draw(PGNV pgnv, RC *prcClip); virtual bool FCmdScroll(PCMD pcmd); }; /*************************************************************************** Color chooser GOB. ***************************************************************************/ const long kcacrCcg = 8; const long kdxpCcg = 78; const long kdxpFrameCcg = 2; typedef class CCG *PCCG; #define CCG_PAR GOB #define kclsCCG 'CCG' class CCG : public CCG_PAR { RTCLASS_DEC ASSERT protected: PTXHD _ptxhd; // the document to put the color in long _cacrRow; // how many colors to put on a row bool _fForeColor; // whether this sets the foreground or background color bool _FGetAcrFromPt(long xp, long yp, ACR *pacr, RC *prc = pvNil, long *piscr = pvNil); public: CCG(GCB *pgcb, PTXHD ptxhd, bool fForeColor, long cacrRow = kcacrCcg); virtual void MouseDown(long xp, long yp, long cact, ulong grfcust); virtual void Draw(PGNV pgnv, RC *prcClip); virtual bool FCmdMouseMove(PCMD_MOUSE pcmd); virtual bool FEnsureToolTip(PGOB *ppgobCurTip, long xpMouse, long ypMouse); }; /*************************************************************************** Color chooser tool tip. ***************************************************************************/ typedef class CCGT *PCCGT; #define CCGT_PAR GOB #define kclsCCGT 'CCGT' class CCGT : public CCGT_PAR { RTCLASS_DEC protected: ACR _acr; STN _stn; public: CCGT(PGCB pgcb, ACR acr = kacrBlack, PSTN pstn = pvNil); void SetAcr(ACR acr, PSTN pstn = pvNil); ACR AcrCur(void) { return _acr; } virtual void Draw(PGNV pgnv, RC *prcClip); }; /*************************************************************************** Help editor doc - consists of a CFL containing (possibly) multiple topics. ***************************************************************************/ typedef class HEDO *PHEDO; #define HEDO_PAR DOCB #define kclsHEDO 'HEDO' class HEDO : public HEDO_PAR { RTCLASS_DEC ASSERT protected: PCFL _pcfl; // the chunky file PRCA _prca; // the resources HEDO(void); ~HEDO(void); public: static PHEDO PhedoNew(FNI *pfni, PRCA prca); PCFL Pcfl(void) { return _pcfl; } PRCA Prca(void) { return _prca; } virtual PDDG PddgNew(PGCB pgcb); virtual bool FGetFni(FNI *pfni); virtual bool FGetFniSave(FNI *pfni); virtual bool FSaveToFni(FNI *pfni, bool fSetFni); virtual void InvalAllDdg(CNO cno); virtual bool FExportText(void); virtual void DoFindNext(PHETD phetd, CNO cno, bool fAdvance = fTrue); virtual PHETD PhetdOpenNext(PHETD phetd); virtual PHETD PhetdOpenPrev(PHETD phetd); }; /*************************************************************************** TSEL: used to track a selection in a chunky file doc ***************************************************************************/ #define TSEL_PAR BASE #define kclsTSEL 'TSEL' class TSEL : public TSEL_PAR { RTCLASS_DEC ASSERT protected: PCFL _pcfl; long _icki; CNO _cno; void _SetNil(void); public: TSEL(PCFL pcfl); void Adjust(void); long Icki(void) { return _icki; } CNO Cno(void) { return _cno; } bool FSetIcki(long icki); bool FSetCno(CNO cno); }; /*************************************************************************** Help editor document display GOB - displays a HEDO. ***************************************************************************/ typedef class HEDG *PHEDG; #define HEDG_PAR DDG #define kclsHEDG 'HEDG' class HEDG : public HEDG_PAR { RTCLASS_DEC CMD_MAP_DEC(HEDG) ASSERT protected: long _onn; // fixed width font to use long _dypHeader; // height of the header long _dypLine; // height of one line long _dxpChar; // width of a character long _dypBorder; // height of border (included in _dypLine) PCFL _pcfl; // the chunky file TSEL _tsel; // the selection HEDG(PHEDO phedo, PCFL pcfl, PGCB pgcb); virtual void _Scroll(long scaHorz, long scaVert, long scvHorz = 0, long scvVert = 0); virtual void _ScrollDxpDyp(long dxp, long dyp); long _YpFromIcki(long icki) { return LwMul(icki - _scvVert, _dypLine) + _dypHeader; } long _XpFromIch(long ich) { return LwMul(ich - _scvHorz + 1, _dxpChar); } long _IckiFromYp(long yp); void _GetContent(RC *prc); void _DrawSel(PGNV pgnv); void _SetSel(long icki, CNO cno = cnoNil); void _ShowSel(void); void _EditTopic(CNO cno); virtual void _Activate(bool fActive); virtual long _ScvMax(bool fVert); // clipboard support virtual bool _FCopySel(PDOCB *ppdocb = pvNil); virtual void _ClearSel(void); virtual bool _FPaste(PCLIP pclip, bool fDoIt, long cid); #ifdef WIN void _StartPage(PGNV pgnv, PSTN pstnDoc, long lwPage, RC *prcPage, long onn); #endif // WIN public: static PHEDG PhedgNew(PHEDO phedo, PCFL pcfl, PGCB pgcb); virtual void Draw(PGNV pgnv, RC *prcClip); virtual void MouseDown(long xp, long yp, long cact, ulong grfcust); virtual bool FCmdKey(PCMD_KEY pcmd); virtual void InvalCno(CNO cno); virtual bool FEnableHedgCmd(PCMD pcmd, ulong *pgrfeds); virtual bool FCmdNewTopic(PCMD pcmd); virtual bool FCmdEditTopic(PCMD pcmd); virtual bool FCmdDeleteTopic(PCMD pcmd); virtual bool FCmdExport(PCMD pcmd); virtual bool FCmdFind(PCMD pcmd); virtual bool FCmdPrint(PCMD pcmd); virtual bool FCmdCheckSpelling(PCMD pcmd); virtual bool FCmdDump(PCMD pcmd); PHEDO Phedo(void) { return (PHEDO)_pdocb; } }; /*************************************************************************** Help editor topic doc - for editing a single topic in a HEDO. An instance of this class is a child doc of a HEDO. ***************************************************************************/ #define HETD_PAR TXHD #define kclsHETD 'HETD' class HETD : public HETD_PAR { RTCLASS_DEC ASSERT MARKMEM protected: PCFL _pcfl; // which chunk is being edited CNO _cno; PGST _pgst; // string versions of stuff in HTOP STN _stnDesc; // description HETD(PDOCB pdocb, PRCA prca, PCFL pcfl, CNO cno); ~HETD(void); virtual bool _FReadChunk(PCFL pcfl, CTG ctg, CNO cno, bool fCopyText); public: static PHETD PhetdNew(PDOCB pdocb, PRCA prca, PCFL pcfl, CNO cno); static PHETD PhetdFromChunk(PDOCB pdocb, CNO cno); static void CloseDeletedHetd(PDOCB pdocb); virtual PDMD PdmdNew(void); virtual PDDG PddgNew(PGCB pgcb); virtual void GetName(PSTN pstn); virtual bool FSave(long cid); virtual bool FSaveToChunk(PCFL pcfl, CKI *pcki, bool fRedirectText = fFalse); void EditHtop(void); bool FDoFind(long cpMin, long *pcpMin, long *pcpLim); bool FDoReplace(long cp1, long cp2, long *pcpMin, long *pcpLim); PHEDO Phedo(void) { return (PHEDO)PdocbPar(); } CNO Cno(void) { return _cno; } void GetHtopStn(long istn, PSTN pstn); }; /*************************************************************************** DDG for an HETD. Help text document editing gob. ***************************************************************************/ typedef class HETG *PHETG; #define HETG_PAR TXRG #define kclsHETG 'HETG' class HETG : public HETG_PAR { RTCLASS_DEC CMD_MAP_DEC(HETG) protected: HETG(PHETD phetd, PGCB pgcb); // clipboard support virtual bool _FCopySel(PDOCB *ppdocb = pvNil); // override these so we can put up our dialogs virtual bool _FGetOtherSize(long *pdypFont); virtual bool _FGetOtherSubSuper(long *pdypOffset); // we have our own ruler virtual long _DypTrul(void); virtual PTRUL _PtrulNew(PGCB pgcb); // override _DrawLinExtra so we can put boxes around grouped text. virtual void _DrawLinExtra(PGNV pgnv, PRC prcClip, LIN *plin, long dxp, long yp, ulong grftxtg); public: static PHETG PhetgNew(PHETD phetd, PGCB pgcb); virtual void InvalCp(long cp, long ccpIns, long ccpDel); virtual void Draw(PGNV pgnv, RC *prcClip); virtual bool FInsertPicture(PCRF pcrf, CTG ctg, CNO cno); virtual bool FInsertButton(PCRF pcrf, CTG ctg, CNO cno); virtual bool FCmdGroupText(PCMD pcmd); virtual bool FCmdFormatPicture(PCMD pcmd); virtual bool FCmdFormatButton(PCMD pcmd); virtual bool FEnableHetgCmd(PCMD pcmd, ulong *pgrfeds); virtual bool FCmdEditHtop(PCMD pcmd); virtual bool FCmdInsertEdit(PCMD pcmd); virtual bool FCmdFormatEdit(PCMD pcmd); virtual bool FCmdFind(PCMD pcmd); virtual bool FCmdPrint(PCMD pcmd); virtual bool FCmdLineSpacing(PCMD pcmd); virtual bool FCmdNextTopic(PCMD pcmd); virtual bool FCmdCheckSpelling(PCMD pcmd); virtual bool FCmdFontDialog(PCMD pcmd); virtual bool FCheckSpelling(long *pcactChanges); PHETD Phetd(void) { return (PHETD)_ptxtb; } long DypLine(long ilin); }; const long kstidFind = 1; const long kstidReplace = 2; /*************************************************************************** The ruler for a help text document. ***************************************************************************/ typedef class HTRU *PHTRU; #define HTRU_PAR TRUL #define kclsHTRU 'HTRU' class HTRU : public HTRU_PAR { RTCLASS_DEC ASSERT protected: // ruler track type enum { rttNil, krttTab, krttDoc }; PTXTG _ptxtg; long _dxpTab; long _dxpDoc; long _dyp; long _xpLeft; long _dxpTrack; long _rtt; long _onn; long _dypFont; ulong _grfont; HTRU(GCB *pgcb, PTXTG ptxtg); public: static PHTRU PhtruNew(GCB *pgcb, PTXTG ptxtg, long dxpTab, long dxpDoc, long dypDoc, long xpLeft, long onn, long dypFont, ulong grfont); virtual void Draw(PGNV pgnv, RC *prcClip); virtual bool FCmdTrackMouse(PCMD_MOUSE pcmd); virtual void SetDxpTab(long dxpTab); virtual void SetDxpDoc(long dxpDoc); virtual void SetXpLeft(long xpLeft); virtual void SetDypHeight(long dyp); }; #endif //! CHELP_H ================================================ FILE: kauai/tools/chelp.rc ================================================ //Microsoft Visual C++ generated resource script. // #include "chelpres.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #define APSTUDIO_HIDDEN_SYMBOLS #include "windows.h" #undef APSTUDIO_HIDDEN_SYMBOLS #include "framedef.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Menu // 128 MENU DISCARDABLE BEGIN POPUP "&File" BEGIN MENUITEM "&New\tCtrl+N", cidNew MENUITEM "&Open...\tCtrl+O", cidOpen MENUITEM "Open &Text...", cidOpenText MENUITEM "Open &Rich Text...", cidOpenRichText MENUITEM "&Load Resources...", cidLoadResFile MENUITEM SEPARATOR MENUITEM "&Close\tCtrl+W", cidClose MENUITEM "Sa&ve and Close \tCtrl+E", cidSaveAndClose MENUITEM "&Save\tCtrl+S", cidSave MENUITEM "Save &As...", cidSaveAs MENUITEM "Save a Cop&y...", cidSaveCopy MENUITEM "&Export Text...", cidExportText MENUITEM "&Dump Text...", cidDumpText MENUITEM SEPARATOR MENUITEM "&Print...\tCtrl+P", cidPrint MENUITEM SEPARATOR MENUITEM "E&xit\tCtrl+Q", cidQuit END POPUP "&Edit" BEGIN MENUITEM "&Undo\tCtrl+Z", cidUndo MENUITEM "&Redo\tCtrl+A", cidRedo MENUITEM SEPARATOR MENUITEM "Cu&t\tCtrl+X", cidCut MENUITEM "&Copy\tCtrl+C", cidCopy MENUITEM "&Paste\tCtrl+V", cidPaste MENUITEM "&Delete\tDel", cidClear MENUITEM SEPARATOR MENUITEM "&Show Clipboard", cidShowClipboard MENUITEM SEPARATOR MENUITEM "&Find...\tCtrl+F", cidFind MENUITEM "Find A&gain\tCtrl+G", cidFindAgain MENUITEM "Find in &Next Topic\tCtrl+Y", cidFindNextTopic MENUITEM "R&eplace then Find\tCtrl+H", cidReplaceFind MENUITEM "Rep&lace Selection\tCtrl+J", cidReplace MENUITEM SEPARATOR MENUITEM "C&heck Spelling", cidSpellCheck MENUITEM "_", cidChooseLanguage END POPUP "To&pic" BEGIN MENUITEM "&New", cidNewTopic MENUITEM "&Delete\tDel", cidDeleteTopic MENUITEM "&Edit\tEnter", cidEditTopic MENUITEM "Ne&xt Topic\tCtrl+Shift+N", cidNextTopic MENUITEM "&Previous Topic\tCtrl+Shift+B", cidPrevTopic MENUITEM SEPARATOR MENUITEM "Edit &Info...\tCtrl+Shift+I", cidEditHtop MENUITEM "Insert Edit &Control...\tCtrl+Shift+E", cidInsertEdit END POPUP "Forma&t" BEGIN MENUITEM "&Plain\tCtrl+Shift+P", cidPlain MENUITEM "&Bold\tCtrl+B", cidBold MENUITEM "&Italic\tCtrl+I", cidItalic MENUITEM "&Underline\tCtrl+U", cidUnderline MENUITEM SEPARATOR MENUITEM "Pic&ture...", cidFormatPicture MENUITEM "Butt&on...", cidFormatButton MENUITEM "&Edit Control...", cidFormatEdit MENUITEM "&Group...", cidGroupText MENUITEM "&Vertical Adjustment...", cidChooseSubSuper MENUITEM "Li&ne Spacing...", cidLineSpacing MENUITEM SEPARATOR MENUITEM "&Left Justify\tCtrl+L", cidJustifyLeft MENUITEM "&Center Justify\tCtrl+T", cidJustifyCenter MENUITEM "&Right Justify\tCtrl+R", cidJustifyRight MENUITEM SEPARATOR MENUITEM "No In&dent", cidIndentNone MENUITEM "Indent &First", cidIndentFirst MENUITEM "Indent Re&st", cidIndentRest MENUITEM "Indent &All", cidIndentAll MENUITEM "_", cidChooseFontSize END POPUP "F&ont" BEGIN MENUITEM "Choose F&ont...\tCtrl+Shift+F", cidFontDialog MENUITEM "$", cidChooseFont END POPUP "&Window" BEGIN MENUITEM "_", cidChooseWnd END END #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE DISCARDABLE BEGIN "chelpres.h\0" END 2 TEXTINCLUDE DISCARDABLE BEGIN "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" "#include ""windows.h""\r\n" "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" "#include ""framedef.h""\r\n" "\0" END 3 TEXTINCLUDE DISCARDABLE BEGIN "#include ""frame.rc""\r\n" "\0" END ///////////////////////////////////////////////////////////////////////////// #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Accelerator // acidMain ACCELERATORS DISCARDABLE BEGIN "A", cidRedo, VIRTKEY, CONTROL, NOINVERT "B", cidBold, VIRTKEY, CONTROL, NOINVERT "B", cidPrevTopic, VIRTKEY, SHIFT, CONTROL, NOINVERT "C", cidCopy, VIRTKEY, CONTROL, NOINVERT "E", cidSaveAndClose, VIRTKEY, CONTROL, NOINVERT "E", cidInsertEdit, VIRTKEY, SHIFT, CONTROL, NOINVERT "F", cidFind, VIRTKEY, CONTROL, NOINVERT "F", cidFontDialog, VIRTKEY, SHIFT, CONTROL, NOINVERT "G", cidFindAgain, VIRTKEY, CONTROL, NOINVERT "H", cidReplaceFind, VIRTKEY, CONTROL, NOINVERT "I", cidItalic, VIRTKEY, CONTROL, NOINVERT "I", cidEditHtop, VIRTKEY, SHIFT, CONTROL, NOINVERT "J", cidReplace, VIRTKEY, CONTROL, NOINVERT "L", cidJustifyLeft, VIRTKEY, CONTROL, NOINVERT "N", cidNew, VIRTKEY, CONTROL, NOINVERT "N", cidNextTopic, VIRTKEY, SHIFT, CONTROL, NOINVERT "O", cidOpen, VIRTKEY, CONTROL, NOINVERT "P", cidPrint, VIRTKEY, CONTROL, NOINVERT "P", cidPlain, VIRTKEY, SHIFT, CONTROL, NOINVERT "Q", cidQuit, VIRTKEY, CONTROL, NOINVERT "R", cidJustifyRight, VIRTKEY, CONTROL, NOINVERT "S", cidSave, VIRTKEY, CONTROL, NOINVERT "T", cidJustifyCenter, VIRTKEY, CONTROL, NOINVERT "U", cidUnderline, VIRTKEY, CONTROL, NOINVERT "V", cidPaste, VIRTKEY, CONTROL, NOINVERT "W", cidClose, VIRTKEY, CONTROL, NOINVERT "X", cidCut, VIRTKEY, CONTROL, NOINVERT "Y", cidFindNextTopic, VIRTKEY, CONTROL, NOINVERT "Z", cidUndo, VIRTKEY, CONTROL, NOINVERT END ///////////////////////////////////////////////////////////////////////////// // // Dialog // dlidFormatPicture DIALOG DISCARDABLE 100, 100, 185, 49 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Picture Properties" FONT 10, "System" BEGIN DEFPUSHBUTTON "OK",1,129,7,50,14 PUSHBUTTON "Cancel",2,129,25,50,14 EDITTEXT 3,42,11,70,12,ES_AUTOHSCROLL RTEXT "Name:",4,10,12,27,9 END dlidFormatButton DIALOG DISCARDABLE 100, 100, 214, 67 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Button Properties" FONT 10, "System" BEGIN DEFPUSHBUTTON "OK",IDOK,147,6,50,14 PUSHBUTTON "Cancel",IDCANCEL,147,25,50,14 EDITTEXT 3,76,8,62,12,ES_AUTOHSCROLL RTEXT "Resource Name:",6,8,11,65,10 EDITTEXT 4,76,27,62,12,ES_AUTOHSCROLL RTEXT "Topic Number:",7,9,30,64,10 EDITTEXT 5,76,46,62,12,ES_AUTOHSCROLL RTEXT "Topic Name:",8,16,49,57,10 END dlidGroupText DIALOG DISCARDABLE 100, 100, 255, 77 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Group Text" FONT 10, "System" BEGIN DEFPUSHBUTTON "OK",1,187,6,50,14 PUSHBUTTON "Cancel",2,187,22,50,14 EDITTEXT 3,123,11,40,12,ES_AUTOHSCROLL EDITTEXT 4,123,30,40,12,ES_AUTOHSCROLL EDITTEXT 5,123,49,112,12,ES_AUTOHSCROLL RTEXT "Group Number (0 for none):",10,5,12,112,10 RTEXT "Topic Number:",11,20,31,97,9 RTEXT "TopicName:",12,20,51,97,9 END dlidTopicInfo DIALOG DISCARDABLE 100, 100, 357, 203 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Topic Information" FONT 10, "System" BEGIN DEFPUSHBUTTON "OK",1,284,6,50,14 PUSHBUTTON "Cancel",2,284,22,50,14 EDITTEXT 3,77,9,48,12,ES_AUTOHSCROLL EDITTEXT 4,165,9,102,12,ES_AUTOHSCROLL EDITTEXT 5,165,26,102,12,ES_AUTOHSCROLL EDITTEXT 6,77,43,48,12,ES_AUTOHSCROLL EDITTEXT 7,165,43,102,12,ES_AUTOHSCROLL EDITTEXT 8,77,60,48,12,ES_AUTOHSCROLL EDITTEXT 9,165,60,102,12,ES_AUTOHSCROLL EDITTEXT 10,77,77,48,12,ES_AUTOHSCROLL EDITTEXT 11,165,77,102,12,ES_AUTOHSCROLL EDITTEXT 12,77,100,36,12,ES_AUTOHSCROLL EDITTEXT 13,165,100,40,12,ES_AUTOHSCROLL EDITTEXT 14,165,120,102,12,ES_AUTOHSCROLL EDITTEXT 15,77,139,36,12,ES_AUTOHSCROLL EDITTEXT 16,77,156,48,12,ES_AUTOHSCROLL EDITTEXT 17,165,156,102,12,ES_AUTOHSCROLL EDITTEXT 18,165,176,40,12,ES_AUTOHSCROLL RTEXT "Balloon (GOKD)#:",100,2,11,72,8 RTEXT "Name:",101,128,11,35,8 RTEXT "Topic Name:",102,100,28,63,8 RTEXT "Gob ID #:",103,14,45,60,8 RTEXT "Name:",104,132,45,31,8 RTEXT "Target Gob ID #:",105,7,62,67,8 RTEXT "Name:",106,129,62,34,8 RTEXT "Script #:",107,14,79,60,8 RTEXT "Name:",108,126,79,37,8 RTEXT "X Offset:",109,17,102,57,7 RTEXT "Y Offset:",110,118,102,45,7 RTEXT "Topic Description:",111,82,123,82,8 RTEXT "Sound CTG:",112,16,141,58,7 RTEXT "Sound CNO:",115,14,158,60,8 RTEXT "Name:",116,130,158,33,8 RTEXT "Topic Width (Pixels):",114,77,178,85,9 END dlidFontSize DIALOG DISCARDABLE 100, 100, 185, 49 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Font size" FONT 10, "System" BEGIN DEFPUSHBUTTON "OK",1,129,6,50,14 PUSHBUTTON "Cancel",2,129,23,50,14 EDITTEXT 3,59,11,33,12,ES_AUTOHSCROLL RTEXT "Size:",4,24,13,30,7 END dlidSubSuper DIALOG DISCARDABLE 100, 100, 210, 50 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Subscript/Superscript" FONT 10, "System" BEGIN DEFPUSHBUTTON "OK",1,147,6,50,14 PUSHBUTTON "Cancel",2,147,23,50,14 EDITTEXT 3,90,11,33,12,ES_AUTOHSCROLL RTEXT "Offset (0 to 127):",5,10,13,77,10 CONTROL "&Superscript",4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, 48,31,63,10 END dlidFormatEdit DIALOG DISCARDABLE 100, 100, 166, 48 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Format Edit Control" FONT 10, "System" BEGIN DEFPUSHBUTTON "OK",1,102,6,50,14 PUSHBUTTON "Cancel",2,102,23,50,14 EDITTEXT 3,39,10,40,12,ES_AUTOHSCROLL RTEXT "Width:",20,5,12,30,7 END dlidFind DIALOG DISCARDABLE 100, 100, 212, 84 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Find" FONT 10, "System" BEGIN DEFPUSHBUTTON "OK",1,134,6,50,14 PUSHBUTTON "Cancel",2,134,23,50,14 EDITTEXT 3,42,9,81,12,ES_AUTOHSCROLL EDITTEXT 4,42,26,81,12,ES_AUTOHSCROLL CONTROL "&Case Sensitive",5,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,41,49,99,10 CONTROL "&All Topics",6,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,41, 63,99,10 RTEXT "Find:",10,6,11,33,7 RTEXT "Replace:",11,3,27,36,10 END dlidSpacing DIALOG DISCARDABLE 100, 100, 185, 100 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Line & Para Spacing" FONT 10, "System" BEGIN DEFPUSHBUTTON "OK",1,129,6,50,14 PUSHBUTTON "Cancel",2,129,23,50,14 EDITTEXT 3,78,9,40,12,ES_AUTOHSCROLL EDITTEXT 4,78,31,40,12,ES_AUTOHSCROLL EDITTEXT 5,78,53,40,12,ES_AUTOHSCROLL EDITTEXT 6,78,75,40,12,ES_AUTOHSCROLL RTEXT "Line Extra:",7,5,11,70,9 RTEXT "Line Numerator:",8,5,33,70,9 RTEXT "Para Extra:",9,5,55,70,9 RTEXT "Para Numerator:",10,5,77,70,9 END dlidCheckSpelling DIALOG DISCARDABLE 100, 100, 250, 136 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Spelling" FONT 10, "System" BEGIN DEFPUSHBUTTON "&Ignore",1,194,6,50,14 PUSHBUTTON "Cancel",2,194,23,50,14 PUSHBUTTON "&Change",3,194,51,50,14 PUSHBUTTON "C&hange All",4,194,68,50,14 PUSHBUTTON "I&gnore All",5,194,98,50,14 PUSHBUTTON "&Add",6,194,115,50,14 COMBOBOX 7,68,37,81,87,CBS_SIMPLE | WS_VSCROLL | WS_TABSTOP EDITTEXT 8,73,13,92,12,ES_AUTOHSCROLL | ES_READONLY | WS_DISABLED | NOT WS_TABSTOP RTEXT "Change To:",100,10,39,54,10 RTEXT "Not in Dictionary:",101,6,14,65,10 END dlidChooseLanguage DIALOG DISCARDABLE 100, 100, 185, 49 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Language" FONT 10, "System" BEGIN DEFPUSHBUTTON "OK",1,129,6,50,14 PUSHBUTTON "Cancel",2,129,23,50,14 EDITTEXT 3,84,11,33,12,ES_AUTOHSCROLL RTEXT "Language Code:",4,3,13,78,10 END dlidChooseFont DIALOG DISCARDABLE 0, 0, 235, 195 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Choose Font" FONT 8, "System" BEGIN DEFPUSHBUTTON "OK",1,179,9,50,14 PUSHBUTTON "Cancel",2,179,28,50,14 COMBOBOX 3,44,12,118,166,CBS_SIMPLE | WS_VSCROLL | WS_TABSTOP RTEXT "Font:",10,6,15,34,11 END #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // #include "frame.rc" ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED ================================================ FILE: kauai/tools/chelpdmp.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Copyright (c) Microsoft Corporation Tool to dump chomp source for the help topics contained in a chunky file. ***************************************************************************/ #include #include "util.h" #include "mssio.h" #include "chelpexp.h" ASSERTNAME /*************************************************************************** Main routine. Returns non-zero iff there's an error. ***************************************************************************/ int __cdecl main(int cpszs, char *prgpszs[]) { schar chs; STN stn; FNI fni; PFIL pfil = pvNil; PMSNK pmsnk = pvNil; PCFL pcflSrc = pvNil; #ifdef UNICODE fprintf(stderr, "\nMicrosoft (R) Chunky Help Dump Utility (Unicode; " Debug("Debug; ") __DATE__ "; " __TIME__ ")\n"); #else //! UNICODE fprintf(stderr, "\nMicrosoft (R) Chunky Help Dump Utility (Ansi; " Debug("Debug; ") __DATE__ "; " __TIME__ ")\n"); #endif //! UNICODE fprintf(stderr, "Copyright (C) Microsoft Corp 1995. All rights reserved.\n\n"); for (prgpszs++; --cpszs > 0; prgpszs++) { chs = (*prgpszs)[0]; if (chs == '/' || chs == '-') { // no command line switches goto LUsage; } else if (pvNil == pcflSrc) { // this is the first file name stn.SetSzs(*prgpszs); if (!fni.FBuildFromPath(&stn)) { fprintf(stderr, "Error: Bad file name: %s\n\n", *prgpszs); goto LUsage; } if (pvNil == (pcflSrc = CFL::PcflOpen(&fni, fcflNil))) { fprintf(stderr, "Error: Couldn't open %s\n\n", *prgpszs); goto LUsage; } fni.SetNil(); } else if (fni.Ftg() == ftgNil) { // get the destination file name stn.SetSzs(*prgpszs); if (!fni.FBuildFromPath(&stn)) { fprintf(stderr, "Error: Bad file name: %s\n\n", *prgpszs); goto LUsage; } } else { fprintf(stderr, "Too many file names"); goto LUsage; } } if (pvNil == pcflSrc) goto LUsage; if (fni.Ftg() == ftgNil) pmsnk = NewObj MSSIO(stdout); else { if (pvNil == (pfil = FIL::PfilCreate(&fni))) { fprintf(stderr, "Couldn't create destination file"); goto LFail; } pmsnk = NewObj MSFIL(pfil); } if (pvNil == pmsnk) { fprintf(stderr, "Memory failure"); goto LFail; } // do the export if (!FExportHelpText(pcflSrc, pmsnk)) { fprintf(stderr, "Dump failed"); goto LFail; } FIL::ShutDown(); return 0; LUsage: // print usage fprintf(stderr, "%s", "Usage: chelpdmp []\n\n"); LFail: if (pvNil != pfil) pfil->SetTemp(); FIL::ShutDown(); return 1; } #ifdef DEBUG bool _fEnableWarnings = fTrue; /*************************************************************************** Warning proc called by Warn() macro ***************************************************************************/ void WarnProc(PSZS pszsFile, long lwLine, PSZS pszsMessage) { if (_fEnableWarnings) { fprintf(stderr, "%s(%ld) : warning", pszsFile, lwLine); if (pszsMessage != pvNil) { fprintf(stderr, ": %s", pszsMessage); } fprintf(stderr, "\n"); } } /*************************************************************************** Returning true breaks into the debugger. ***************************************************************************/ bool FAssertProc(PSZS pszsFile, long lwLine, PSZS pszsMessage, void *pv, long cb) { fprintf(stderr, "An assert occurred: \n"); if (pszsMessage != pvNil) fprintf(stderr, " Message: %s\n", pszsMessage); if (pv != pvNil) { fprintf(stderr, " Address %x\n", pv); if (cb != 0) { fprintf(stderr, " Value: "); switch (cb) { default: { byte *pb; byte *pbLim; for (pb = (byte *)pv, pbLim = pb + cb; pb < pbLim; pb++) fprintf(stderr, "%02x", (int)*pb); } break; case 2: fprintf(stderr, "%04x", (int)*(short *)pv); break; case 4: fprintf(stderr, "%08lx", *(long *)pv); break; } printf("\n"); } } fprintf(stderr, " File: %s\n", pszsFile); fprintf(stderr, " Line: %ld\n", lwLine); return fFalse; } #endif // DEBUG ================================================ FILE: kauai/tools/chelpexp.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Copyright (c) Microsoft Corporation Routines to export help topics to chomp input format. ***************************************************************************/ #include "kidframe.h" #include "chelpexp.h" ASSERTNAME static bool _FWriteHelpChunk(PCFL pcfl, PCHSE pchse, KID *pkid, CKI *pckiPar); static bool _FWriteHelpPropAg(PCFL pcfl, PCHSE pchse, KID *pkid, CKI *pckiPar); static void _AppendHelpStnLw(PSTN pstn, PGST pgst, long istn, long lw); /*************************************************************************** Export the help topics in their textual representation for compilation by chomp. REVIEW shonk: this code is a major hack and very fragile. ***************************************************************************/ bool FExportHelpText(PCFL pcfl, PMSNK pmsnk) { AssertPo(pcfl, 0); BLCK blck; PGST pgst; long icki; CKI cki, ckiPar; KID kid; CGE cge; ulong grfcge; HTOPF htopf; CHSE chse; STN stn, stnT; bool fRet = fFalse; chse.Init(pmsnk); chse.DumpSz(PszLit("#undef __HELP_NAME")); chse.DumpSz(PszLit("#undef __HELP_SYMBOL")); chse.DumpSz(PszLit("#undef __HELP_PACK")); chse.DumpSz(PszLit("#undef __HELP_PACK2")); chse.DumpSz(PszLit("#ifdef NO_HELP_NAMES")); chse.DumpSz(PszLit("#define __HELP_NAME(name) \"\"")); chse.DumpSz(PszLit("#else")); chse.DumpSz(PszLit("#define __HELP_NAME(name) name")); chse.DumpSz(PszLit("#endif")); chse.DumpSz(PszLit("#ifdef NO_HELP_SYMBOLS")); chse.DumpSz(PszLit("#define __HELP_SYMBOL(stuff)")); chse.DumpSz(PszLit("#else")); chse.DumpSz(PszLit("#define __HELP_SYMBOL(stuff) stuff")); chse.DumpSz(PszLit("#endif")); chse.DumpSz(PszLit("#ifdef PACK_HELP")); chse.DumpSz(PszLit("#define __HELP_PACK PACK")); chse.DumpSz(PszLit("#else")); chse.DumpSz(PszLit("#define __HELP_PACK")); chse.DumpSz(PszLit("#endif")); chse.DumpSz(PszLit("#ifdef HELP_SINGLE_CHUNK")); chse.DumpSz(PszLit("#define __HELP_PACK2")); chse.DumpSz(PszLit("#else")); chse.DumpSz(PszLit("#define __HELP_PACK2 __HELP_PACK")); chse.DumpSz(PszLit("#endif")); pgst = pvNil; for (icki = 0; pcfl->FGetCkiCtg(kctgHelpTopic, icki, &cki); icki++) { // read the string table if it's there if (pcfl->FGetKidChidCtg(cki.ctg, cki.cno, 0, kctgGst, &kid) && (!pcfl->FFind(kid.cki.ctg, kid.cki.cno, &blck) || pvNil == (pgst = GST::PgstRead(&blck)) || pgst->IvMac() != 6 && (pgst->IvMac() != 5 || !pgst->FAddRgch(PszLit(""), 0)))) { goto LFail; } // read the topic if (!pcfl->FFind(cki.ctg, cki.cno, &blck) || !blck.FUnpackData() || blck.Cb() != size(HTOPF) || !blck.FRead(&htopf)) { goto LFail; } if (htopf.bo == kboOther) SwapBytesBom(&htopf.htop, kbomHtop); else if (htopf.bo != kboCur) goto LFail; // dump the htop's cno definition chse.DumpSz(PszLit("")); stn.FFormatSz(PszLit("SET _help_%x_%x="), cki.ctg, cki.cno); _AppendHelpStnLw(&stn, pgst, 1, cki.cno); chse.DumpSz(stn.Psz()); // dump the single chunk prefix pcfl->FGetName(cki.ctg, cki.cno, &stnT); stnT.FExpandControls(); chse.DumpSz(PszLit("")); chse.DumpSz(PszLit("#ifdef HELP_SINGLE_CHUNK")); stn.FFormatSz(PszLit("CHUNK('%f', _help_%x_%x, __HELP_NAME(\"%s\")) __HELP_PACK"), cki.ctg, cki.ctg, cki.cno, &stnT); chse.DumpSz(stn.Psz()); chse.DumpSz(PszLit("SUBFILE")); chse.DumpSz(PszLit("#endif //HELP_SINGLE_CHUNK")); stn.FAppendCh(ChLit('2')); // dump the HTOPF chse.DumpSz(PszLit("")); chse.DumpSz(stn.Psz()); stn = PszLit("\tBO OSK LONG"); _AppendHelpStnLw(&stn, pgst, 0, htopf.htop.cnoBalloon); _AppendHelpStnLw(&stn, pgst, 2, htopf.htop.hidThis); _AppendHelpStnLw(&stn, pgst, 3, htopf.htop.hidTarget); _AppendHelpStnLw(&stn, pgst, 4, htopf.htop.cnoScript); stnT.FFormatSz(PszLit(" 0x%x 0x%x 0x%x"), htopf.htop.dxp, htopf.htop.dyp, htopf.htop.ckiSnd.ctg); stn.FAppendStn(&stnT); _AppendHelpStnLw(&stn, pgst, 5, htopf.htop.ckiSnd.cno); chse.DumpSz(stn.Psz()); ReleasePpo(&pgst); chse.DumpSz(PszLit("ENDCHUNK")); // dump child chunks cge.Init(pcfl, cki.ctg, cki.cno); while (cge.FNextKid(&kid, &ckiPar, &grfcge, fcgeNil)) { if (fcgeError & grfcge) goto LFail; if ((fcgeRoot & grfcge) || !(fcgePre & grfcge)) continue; chse.DumpSz(PszLit("")); if (kid.cki.ctg == kctgTxtPropArgs) { // special handling of argument AG if (!_FWriteHelpPropAg(pcfl, &chse, &kid, &ckiPar)) goto LFail; } else { if (kid.cki.ctg == kctgGst) { // put "#ifndef NO_HELP_SYMBOLS" before it chse.DumpSz(PszLit("#ifndef NO_HELP_SYMBOLS")); } if (!_FWriteHelpChunk(pcfl, &chse, &kid, &ckiPar)) goto LFail; if (kid.cki.ctg == kctgGst) { // put "#endif //!NO_HELP_SYMBOLS" after it chse.DumpSz(PszLit("#endif //!NO_HELP_SYMBOLS")); } } } chse.DumpSz(PszLit("")); chse.DumpSz(PszLit("#ifdef HELP_SINGLE_CHUNK")); chse.DumpSz(PszLit("ENDCHUNK")); chse.DumpSz(PszLit("#endif //HELP_SINGLE_CHUNK")); chse.DumpSz(PszLit("")); } fRet = fTrue; LFail: chse.Uninit(); ReleasePpo(&pgst); return fRet; } /*************************************************************************** Dump a chunk as text to the given chse. ***************************************************************************/ bool _FWriteHelpChunk(PCFL pcfl, PCHSE pchse, KID *pkid, CKI *pckiPar) { AssertPo(pcfl, 0); AssertPo(pchse, 0); AssertVarMem(pkid); AssertVarMem(pckiPar); STN stn; STN stnT; BLCK blck; if (!pcfl->FFind(pkid->cki.ctg, pkid->cki.cno, &blck)) return fFalse; // dump the CHUNK declaration pchse->DumpSz(PszLit("SET _help_cno++")); stn.FFormatSz(PszLit("SET _help_%x_%x=_help_cno"), pkid->cki.ctg, pkid->cki.cno); pchse->DumpSz(stn.Psz()); pcfl->FGetName(pkid->cki.ctg, pkid->cki.cno, &stnT); stnT.FExpandControls(); stn.FFormatSz(PszLit("CHUNK('%f', _help_cno, __HELP_NAME(\"%s\")) __HELP_PACK2"), pkid->cki.ctg, &stnT); pchse->DumpSz(stn.Psz()); // dump the PARENT declaration stn.FFormatSz(PszLit("PARENT('%f', _help_%x_%x, 0x%x)"), pckiPar->ctg, pckiPar->ctg, pckiPar->cno, pkid->chid); pchse->DumpSz(stn.Psz()); if (pkid->cki.ctg == kctgGst) { PGST pgst; short bo, osk; bool fPacked = blck.FPacked(); bool fRet; pgst = GST::PgstRead(&blck, &bo, &osk); if (pvNil == pgst) return fFalse; if (fPacked) pchse->DumpSz(PszLit("PACK")); if (bo != kboCur) pchse->DumpSz(MacWin(PszLit("WINBO"), PszLit("MACBO"))); fRet = pchse->FDumpStringTable(pgst); ReleasePpo(&pgst); if (bo != kboCur) pchse->DumpSz(MacWin(PszLit("MACBO"), PszLit("WINBO"))); if (!fRet) return fFalse; } else { // dump the data pchse->DumpBlck(&blck); } // dump the ENDCHUNK pchse->DumpSz(PszLit("ENDCHUNK")); return fTrue; } /*************************************************************************** Write the property AG. This requires special processing ***************************************************************************/ bool _FWriteHelpPropAg(PCFL pcfl, PCHSE pchse, KID *pkid, CKI *pckiPar) { AssertPo(pcfl, 0); AssertPo(pchse, 0); AssertVarMem(pkid); AssertVarMem(pckiPar); PAG pag; short bo, osk; STN stn, stnT, stnT2; byte rgb[2 * kcbMaxDataStn]; BLCK blck; long iv, lw, cb, ib, cbRead; CKI cki; pag = pvNil; if (!pcfl->FFind(pkid->cki.ctg, pkid->cki.cno, &blck) || pvNil == (pag = AG::PagRead(&blck, &bo, &osk)) || bo != kboCur || osk != koskCur || size(long) != pag->CbFixed()) { ReleasePpo(&pag); return fFalse; } // dump the CHUNK declaration pchse->DumpSz(PszLit("SET _help_cno++")); stn.FFormatSz(PszLit("SET _help_%x_%x=_help_cno"), pkid->cki.ctg, pkid->cki.cno); pchse->DumpSz(stn.Psz()); pcfl->FGetName(pkid->cki.ctg, pkid->cki.cno, &stnT); stnT.FExpandControls(); stn.FFormatSz(PszLit("CHUNK('%f', _help_cno, __HELP_NAME(\"%s\")) __HELP_PACK2"), pkid->cki.ctg, &stnT); pchse->DumpSz(stn.Psz()); // dump the PARENT declaration stn.FFormatSz(PszLit("PARENT('%f', _help_%x_%x, 0x%x)"), pckiPar->ctg, pckiPar->ctg, pckiPar->cno, pkid->chid); pchse->DumpSz(stn.Psz()); // dump the AG declaration pchse->DumpSz(PszLit("AG(4)")); // dump the items for (iv = 0; iv < pag->IvMac(); iv++) { if (pag->FFree(iv)) { pchse->DumpSz(PszLit("\tFREE")); continue; } pag->GetFixed(iv, &lw); stn.FFormatSz(PszLit("\tITEM LONG 0x%x"), lw); pchse->DumpSz(stn.Psz()); cb = pag->Cb(iv); if (0 == cb) continue; switch (B3Lw(lw)) { case 64: // sprmGroup if (cb <= size(byte) + size(CNO)) goto LWriteCore; if (cb > size(rgb)) { Bug("bad group data"); goto LWriteCore; } pag->GetRgb(iv, 0, cb, rgb); ib = size(byte) + size(CNO); if (!stnT.FSetData(rgb + ib, cb - ib) || stnT.Cch() == 0) { Bug("bad group data"); goto LWriteCore; } stn.FFormatSz(PszLit("\t\tVAR BYTE %d LONG %s __HELP_SYMBOL( STN \""), (long)rgb[0], &stnT); stnT.FExpandControls(); stn.FAppendStn(&stnT); stn.FAppendSz(PszLit("\" )")); pchse->DumpSz(stn.Psz()); break; case 192: // sprmObject if (cb <= size(CKI)) goto LWriteCore; // an object pag->GetRgb(iv, 0, size(CKI), &cki); switch (cki.ctg) { default: goto LWriteCore; case kctgMbmp: ib = size(CKI); if (ib >= cb) goto LWriteCore; if ((cb -= ib) > kcbMaxDataStn) { Bug("bad picture data"); goto LWriteCore; } pag->GetRgb(iv, ib, cb, rgb); if (!stnT.FSetData(rgb, cb) || stnT.Cch() == 0) { Bug("bad picture data 2"); goto LWriteCore; } stn.FFormatSz(PszLit("\t\tVAR LONG '%f' %s __HELP_SYMBOL( STN \""), cki.ctg, &stnT); stnT.FExpandControls(); stn.FAppendStn(&stnT); stn.FAppendSz(PszLit("\" )")); pchse->DumpSz(stn.Psz()); break; case kctgGokd: ib = size(CKI) + size(long); if (ib >= cb) goto LWriteCore; if ((cb -= ib) > size(rgb)) { Bug("bad button data"); goto LWriteCore; } pag->GetRgb(iv, ib, cb, rgb); if (!stnT.FSetData(rgb, cb, &cbRead) || cbRead >= cb || !stnT2.FSetData(rgb + cbRead, cb - cbRead)) { Bug("bad picture data 2"); goto LWriteCore; } stn.FFormatSz(PszLit("\t\tVAR LONG '%f' "), cki.ctg); if (stnT.Cch() > 0) { stn.FAppendStn(&stnT); stnT.FExpandControls(); } else { stnT.FFormatSz(PszLit("0x%x"), cki.cno); stn.FAppendStn(&stnT); stnT.SetNil(); } stn.FAppendCh(kchSpace); if (stnT2.Cch() > 0) { stn.FAppendStn(&stnT2); stnT2.FExpandControls(); } else { pag->GetRgb(iv, size(CKI), size(long), &lw); stnT2.FFormatSz(PszLit("0x%x"), lw); stn.FAppendStn(&stnT2); stnT2.SetNil(); } stn.FAppendSz(PszLit(" __HELP_SYMBOL( STN ")); if (stnT.Cch() > 0) { stn.FAppendCh(ChLit('"')); stn.FAppendStn(&stnT); stn.FAppendSz(PszLit("\" ")); } if (stnT2.Cch() > 0) { if (stnT.Cch() > 0) stn.FAppendSz(PszLit("; ")); stn.FAppendCh(ChLit('"')); stn.FAppendStn(&stnT2); stn.FAppendSz(PszLit("\" ")); } stn.FAppendCh(ChLit(')')); pchse->DumpSz(stn.Psz()); break; } break; default: LWriteCore: // just write the data pchse->DumpSz(PszLit("\t\tVAR")); pchse->DumpRgb(pag->PvLock(iv), cb, 3); pag->Unlock(); break; } } // dump the ENDCHUNK ReleasePpo(&pag); pchse->DumpSz(PszLit("ENDCHUNK")); return fTrue; } /*************************************************************************** Append a string or number. ***************************************************************************/ void _AppendHelpStnLw(PSTN pstn, PGST pgst, long istn, long lw) { AssertPo(pstn, 0); AssertNilOrPo(pgst, 0); STN stn; stn.SetNil(); if (pvNil != pgst) pgst->GetStn(istn, &stn); if (stn.Cch() == 0) stn.FFormatSz(PszLit(" 0x%x"), lw); else pstn->FAppendCh(kchSpace); pstn->FAppendStn(&stn); } ================================================ FILE: kauai/tools/chelpexp.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Copyright (c) Microsoft Corporation Chunky help exporting. Only one API is exported by this module. It writes chomp source for the help topics contained in a chunky file. ***************************************************************************/ #ifndef CHELPEXP_H #define CHELPEXP_H bool FExportHelpText(PCFL pcfl, PMSNK pmsnk); #endif //! CHELPEXP_H ================================================ FILE: kauai/tools/chelpres.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ //{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by chelp.rc // #define dlidInsertPicture 208 #define dlidFormatPicture 208 #define dlidInsertButton 209 #define dlidFormatButton 209 #define dlidGroupText 210 #define dlidTopicInfo 211 #define dlidFontSize 212 #define dlidSubSuper 213 #define dlidFormatEdit 214 #define dlidFind 215 #define dlidSpacing 217 #define dlidCheckSpelling 218 #define dlidChooseLanguage 219 #define dlidChooseFont 220 #define cidOpenRichText 40047 #define cidLoadResFile 40048 #define cidNewTopic 40049 #define cidDeleteTopic 40050 #define cidEditTopic 40051 #define cidGroupText 40052 #define cidUngroupText 40053 #define cidEditHtop 40054 #define cidExportText 40055 #define cidFormatPicture 40056 #define cidFormatButton 40057 #define cidFormatEdit 40058 #define cidInsertEdit 40059 #define cidFind 40060 #define cidFindAgain 40061 #define cidReplace 40062 #define cidReplaceFind 40063 #define cidFindNextTopic 40064 #define cidFormatDocument 40065 #define cidOpenText 40066 #define cidLineSpacing 40067 #define cidNextTopic 40068 #define cidPrevTopic 40069 #define cidSpellCheck 40070 #define cidDumpText 40071 #define cidChooseLanguage 40072 #define cidFontDialog 40073 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 221 #define _APS_NEXT_COMMAND_VALUE 40074 #define _APS_NEXT_CONTROL_VALUE 1044 #define _APS_NEXT_SYMED_VALUE 128 #endif #endif ================================================ FILE: kauai/tools/chgrp.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Handles editing a chunk consisting of a group (GL, AL, GG, AG, GST, AST) ***************************************************************************/ #include "ched.h" ASSERTNAME #define kcbMaxDispGrp 16 bool _FDlgGrpbNew(PDLG pdlg, long *pidit, void *pv); BEGIN_CMD_MAP(DCGB, DDG) ON_CID_GEN(cidEditNatural, &DCGB::FCmdEditItem, &DCGB::FEnableDcgbCmd) ON_CID_GEN(cidEditHex, &DCGB::FCmdEditItem, &DCGB::FEnableDcgbCmd) ON_CID_GEN(cidInsertItem, &DCGB::FCmdAddItem, &DCGB::FEnableDcgbCmd) ON_CID_GEN(cidAddItem, &DCGB::FCmdAddItem, pvNil) ON_CID_GEN(cidDeleteItem, &DCGB::FCmdDeleteItem, &DCGB::FEnableDcgbCmd) END_CMD_MAP_NIL() RTCLASS(DOCG) RTCLASS(DOCI) RTCLASS(DCGB) RTCLASS(DCGL) RTCLASS(DCGG) RTCLASS(DCST) /*************************************************************************** Constructor for a group document. cls indicates which group class the edited chunk belongs to. cls should be one of GL, AL, GG, AG, GST, AST. ***************************************************************************/ DOCG::DOCG(PDOCB pdocb, PCFL pcfl, CTG ctg, CNO cno, long cls) : DOCE(pdocb, pcfl, ctg, cno) { _pgrpb = pvNil; _cls = cls; } /*************************************************************************** Destructor for DOCG. Free the GRPB. ***************************************************************************/ DOCG::~DOCG(void) { ReleasePpo(&_pgrpb); } /*************************************************************************** Static method to create a new document based on a group in a chunk. Asserts that there are no other editing docs open on this chunk. ***************************************************************************/ PDOCG DOCG::PdocgNew(PDOCB pdocb, PCFL pcfl, CTG ctg, CNO cno, long cls) { AssertPo(pdocb, 0); AssertPo(pcfl, 0); Assert(pvNil == DOCE::PdoceFromChunk(pdocb, pcfl, ctg, cno), "DOCE already exists for the chunk"); PDOCG pdocg; if (pvNil == (pdocg = NewObj DOCG(pdocb, pcfl, ctg, cno, cls))) return pvNil; if (!pdocg->_FInit()) { ReleasePpo(&pdocg); return pvNil; } AssertPo(pdocg, 0); return pdocg; } enum { kiditOkGrpbNew, kiditCancelGrpbNew, kiditSizeGrpbNew, kiditLimGrpbNew }; /*************************************************************************** Dialog proc for Adopt Chunk dialog. ***************************************************************************/ bool _FDlgGrpbNew(PDLG pdlg, long *pidit, void *pv) { AssertPo(pdlg, 0); AssertVarMem(pidit); long cb; bool fEmpty; switch (*pidit) { case kiditCancelGrpbNew: return fTrue; // dismiss the dialog case kiditOkGrpbNew: if (!pdlg->FGetValues(0, kiditLimGrpbNew)) { *pidit = ivNil; return fTrue; } // check the size if (!pdlg->FGetLwFromEdit(kiditSizeGrpbNew, &cb, &fEmpty) && !fEmpty || !FIn(cb, *(long *)pv, kcbMax)) { vpappb->TGiveAlertSz(PszLit("Bad Size"), bkOk, cokStop); pdlg->SelectDit(kiditSizeGrpbNew); return fFalse; } return fTrue; default: break; } return fFalse; } /*************************************************************************** Read the group from the given flo. ***************************************************************************/ bool DOCG::_FRead(PBLCK pblck) { AssertPo(pblck, 0); Assert(pvNil == _pgrpb, "group not nil"); if (0 == pblck->Cb(fTrue)) { // create a new one - need to ask for a size from the user PDLG pdlg; long dlid, idit; long cb, cbMin; bool fEmpty; // determine which dialog to use cbMin = 0; switch (_cls) { case kclsGL: case kclsAL: dlid = dlidGlbNew; cbMin = 1; break; case kclsGG: case kclsAG: dlid = dlidGgbNew; break; case kclsGST: case kclsAST: dlid = dlidGstbNew; break; default: BugVar("bad cls value", &_cls); return fFalse; } pdlg = DLG::PdlgNew(dlid, _FDlgGrpbNew, &cbMin); pdlg->FPutLwInEdit(kiditSizeGrpbNew, cbMin); if (pvNil == pdlg) goto LFail; idit = pdlg->IditDo(kiditSizeGrpbNew); if (idit != kiditOkGrpbNew) goto LFail; if (!pdlg->FGetLwFromEdit(kiditSizeGrpbNew, &cb, &fEmpty) && !fEmpty || !FIn(cb, cbMin, kcbMax / size(long))) { goto LFail; } switch (_cls) { case kclsGL: _pgrpb = GL::PglNew(cb); break; case kclsAL: _pgrpb = AL::PalNew(cb); break; case kclsGG: _pgrpb = GG::PggNew(cb); break; case kclsAG: _pgrpb = AG::PagNew(cb); break; case kclsGST: _pgrpb = GST::PgstNew(cb * size(long)); break; case kclsAST: _pgrpb = AST::PastNew(cb * size(long)); break; default: BugVar("bad cls value", &_cls); return fFalse; } LFail: ReleasePpo(&pdlg); _bo = kboCur; _osk = koskCur; _fDirty = fTrue; } else { switch (_cls) { case kclsGL: _pgrpb = GL::PglRead(pblck, &_bo, &_osk); break; case kclsAL: _pgrpb = AL::PalRead(pblck, &_bo, &_osk); break; case kclsGG: _pgrpb = GG::PggRead(pblck, &_bo, &_osk); break; case kclsAG: _pgrpb = AG::PagRead(pblck, &_bo, &_osk); break; case kclsGST: _pgrpb = GST::PgstRead(pblck, &_bo, &_osk); break; case kclsAST: _pgrpb = AST::PastRead(pblck, &_bo, &_osk); break; default: BugVar("bad cls value", &_cls); return fFalse; } } return pvNil != _pgrpb; } /*************************************************************************** Create a new DDG onto the document. ***************************************************************************/ PDDG DOCG::PddgNew(PGCB pgcb) { AssertThis(0); PDDG pddg; pddg = pvNil; switch (_cls) { case kclsGL: case kclsAL: pddg = DCGL::PdcglNew(this, (PGLB)_pgrpb, _cls, pgcb); break; case kclsGG: case kclsAG: pddg = DCGG::PdcggNew(this, (PGGB)_pgrpb, _cls, pgcb); break; case kclsGST: case kclsAST: pddg = DCST::PdcstNew(this, (PGSTB)_pgrpb, _cls, pgcb); break; default: BugVar("bad cls value", &_cls); break; } return pddg; } /*************************************************************************** Write the group to disk. ***************************************************************************/ bool DOCG::_FWrite(PBLCK pblck, bool fRedirect) { AssertThis(0); AssertPo(pblck, 0); return _pgrpb->FWrite(pblck, _bo, _osk); } /*************************************************************************** Get the size of the group on file. ***************************************************************************/ long DOCG::_CbOnFile(void) { AssertThis(0); return _pgrpb->CbOnFile(); } #ifdef DEBUG /*************************************************************************** Assert the validity of an object. ***************************************************************************/ void DOCG::AssertValid(ulong grf) { DOCG_PAR::AssertValid(0); AssertPo(_pgrpb, 0); Assert(_pgrpb->FIs(_cls), "group doesn't match cls"); switch (_cls) { case kclsGL: case kclsAL: case kclsGG: case kclsAG: case kclsGST: case kclsAST: break; default: BugVar("bad cls value", &_cls); break; } } /*************************************************************************** Mark memory for the DOCG. ***************************************************************************/ void DOCG::MarkMem(void) { AssertValid(0); DOCG_PAR::MarkMem(); MarkMemObj(_pgrpb); } #endif // DEBUG /*************************************************************************** Constructor for a DCGB. ***************************************************************************/ DCGB::DCGB(PDOCB pdocb, PGRPB pgrpb, long cls, long clnItem, PGCB pgcb) : DCLB(pdocb, pgcb) { AssertIn(clnItem, 1, 10); _dypBorder = 1; _dypLine = _dypLine + _dypBorder; _clnItem = clnItem; _ivCur = ivNil; _dlnCur = 0; _pgrpb = pgrpb; _cls = cls; switch (_cls) { default: #ifdef DEBUG BugVar("bad cls value", &_cls); case kclsGL: case kclsGG: case kclsGST: #endif // DEBUG _fAllocated = fFalse; break; case kclsAL: case kclsAG: case kclsAST: _fAllocated = fTrue; break; } } /*************************************************************************** Static method to invalidate all DCGB's on this GRPB. Also dirties the document. Should be called by any code that edits the document. ***************************************************************************/ void DCGB::InvalAllDcgb(PDOCB pdocb, PGRPB pgrpb, long iv, long cvIns, long cvDel) { long ipddg; PDDG pddg; PDCGB pdcgb; // mark the document dirty pdocb->SetDirty(); // inform the DCGB's for (ipddg = 0; pvNil != (pddg = pdocb->PddgGet(ipddg)); ipddg++) { if (!pddg->FIs(kclsDCGB)) continue; pdcgb = (PDCGB)pddg; if (pdcgb->_pgrpb == pgrpb) pdcgb->_InvalIv(iv, cvIns, cvDel); } } /*************************************************************************** Invalidate the display from iv to the end of the display. If we're the active DCGB, also redraw. ***************************************************************************/ void DCGB::_InvalIv(long iv, long cvIns, long cvDel) { AssertThis(0); AssertIn(iv, 0, kcbMax); AssertIn(cvIns, 0, kcbMax); AssertIn(cvDel, 0, kcbMax); RC rc; // adjust the sel if (_ivCur > iv) { if (_ivCur < iv + cvDel) { _ivCur = ivNil; _dlnCur = 0; } else _ivCur += cvIns - cvDel; } // caclculate the invalid rectangle GetRc(&rc, cooLocal); rc.ypTop = _YpFromIvDln(iv, 0); if (cvIns == cvDel) rc.ypBottom = _YpFromIvDln(iv + cvIns, 0); if (rc.FEmpty()) return; if (_fActive) { ValidRc(&rc, kginDraw); InvalRc(&rc, kginDraw); } else InvalRc(&rc); } /*************************************************************************** We're being activated or deactivated so invert the sel. ***************************************************************************/ void DCGB::_Activate(bool fActive) { AssertThis(0); DDG::_Activate(fActive); GNV gnv(this); _DrawSel(&gnv); } /*************************************************************************** Return the max for the scroll bar. ***************************************************************************/ long DCGB::_ScvMax(bool fVert) { AssertThis(0); RC rc; long ichLim; _GetContent(&rc); if (fVert) { return LwMax(0, LwMul(_clnItem, _pgrpb->IvMac()) - rc.Dyp() / _dypLine + 1); } ichLim = 3 * kcbMaxDispGrp + kcbMaxDispGrp / 4 + 12; return LwMax(0, ichLim - rc.Dxp() / _dxpChar); } /*************************************************************************** Set the selection to the given line. ***************************************************************************/ void DCGB::_SetSel(long ln) { AssertThis(0); long iv, dln; if (ln < 0 || ln >= _LnLim()) { Assert(ln == lnNil, "bad non-nil selection requested"); iv = ivNil; dln = 0; } else { iv = ln / _clnItem; dln = ln % _clnItem; } if (_ivCur == iv && _dlnCur == dln) return; if (_fActive) { GNV gnv(this); // erase the old sel if (_fActive) _DrawSel(&gnv); // set the new sel and draw it _ivCur = iv; _dlnCur = dln; if (_fActive) _DrawSel(&gnv); } else { // just set the new selection _ivCur = iv; _dlnCur = dln; } } /*************************************************************************** Scroll the sel into view. ***************************************************************************/ void DCGB::_ShowSel(void) { AssertThis(0); RC rc; long cln, ln; if (ivNil == _ivCur) return; ln = _LnFromIvDln(_ivCur, _dlnCur) - _scvVert; if (ln < 0) _Scroll(scaNil, scaToVal, 0, _scvVert + ln); else { _GetContent(&rc); cln = LwMax(1, rc.Dyp() / _dypLine); if (ln >= cln) _Scroll(scaNil, scaToVal, 0, _scvVert + ln - cln + 1); } } /*************************************************************************** Hilite the selection (if there is one) ***************************************************************************/ void DCGB::_DrawSel(PGNV pgnv) { AssertThis(0); AssertPo(pgnv, 0); RC rc; if (ivNil != _ivCur) { pgnv->GetRcSrc(&rc); rc.ypTop = _YpFromIvDln(_ivCur, _dlnCur); rc.ypBottom = rc.ypTop + _dypLine - _dypBorder; pgnv->HiliteRc(&rc, kacrWhite); } } /*************************************************************************** Handle key input. ***************************************************************************/ bool DCGB::FCmdKey(PCMD_KEY pcmd) { AssertThis(0); long ln, lnLim, lnNew, cln; RC rc; ln = _LnFromIvDln(_ivCur, _dlnCur); lnLim = _LnLim(); switch (pcmd->vk) { case kvkDown: lnNew = (0 > ln) ? 0 : (ln + 1) % lnLim; goto LChangeSel; case kvkUp: lnNew = (0 > ln) ? lnLim - 1 : (ln + lnLim - 1) % lnLim; goto LChangeSel; case kvkPageUp: case kvkPageDown: _GetContent(&rc); cln = LwMax(1, rc.Dyp() / _dypLine - 1); if (pcmd->vk == kvkPageDown) lnNew = LwMin(lnLim - 1, lnNil == ln ? cln : ln + cln); else lnNew = LwMax(0, lnNil == ln ? 0 : ln - cln); goto LChangeSel; case kvkHome: lnNew = 0; goto LChangeSel; case kvkEnd: lnNew = lnLim - 1; LChangeSel: if (lnLim == 0) { Assert(lnNil == ln, "no lines, but non-nil sel"); break; } AssertIn(lnNew, 0, lnLim); _SetSel(lnNew); _ShowSel(); break; case kvkDelete: case kvkBack: if (ivNil != _ivCur && !_pgrpb->FFree(_ivCur)) _DeleteIv(_ivCur); break; default: switch (pcmd->ch) { case kchReturn: if (ivNil != _ivCur && !_pgrpb->FFree(_ivCur)) _EditIvDln(_ivCur, _dlnCur); break; } break; } return fTrue; } /*************************************************************************** Handle mouse-down in a DCGB - track the mouse and select the last item the mouse is over. ***************************************************************************/ void DCGB::MouseDown(long xp, long yp, long cact, ulong grfcust) { AssertThis(0); bool fDown; PT pt, ptT; long ln, ivCur, dlnCur; RC rc; // do this before the activate to avoid flashing the selection ivCur = _ivCur; dlnCur = _dlnCur; ln = _LnFromYp(yp); if (ln >= _LnLim()) ln = lnNil; _SetSel(ln); if (!_fActive) Activate(fTrue); if (cact > 1 && ivCur == _ivCur && dlnCur == _dlnCur && _ivCur != ivNil && !_pgrpb->FFree(_ivCur)) { // edit the thing _EditIvDln(_ivCur, _dlnCur); return; } Clean(); _GetContent(&rc); for (GetPtMouse(&pt, &fDown); fDown; GetPtMouse(&pt, &fDown)) { if (!rc.FPtIn(pt.xp, pt.yp)) { // do autoscroll ptT = pt; rc.PinPt(&pt); _Scroll(scaToVal, scaToVal, _scvHorz + LwDivAway(ptT.xp - pt.xp, _dxpChar), _scvVert + LwDivAway(ptT.yp - pt.yp, _dypLine)); } if (!rc.FPtIn(pt.xp, pt.yp) || (ln = _LnFromYp(pt.yp)) >= _LnLim()) ln = lnNil; _SetSel(ln); } } /*************************************************************************** Handle enabling/disabling commands. ***************************************************************************/ bool DCGB::FEnableDcgbCmd(PCMD pcmd, ulong *pgrfeds) { bool fT; switch (pcmd->cid) { case cidEditNatural: case cidEditHex: case cidDeleteItem: fT = (ivNil != _ivCur) && !_pgrpb->FFree(_ivCur); break; case cidInsertItem: fT = (ivNil != _ivCur) && !_fAllocated; break; default: BugVar("unhandled cid", &pcmd->cid); fT = fFalse; break; } *pgrfeds = fT ? fedsEnable : fedsDisable; return fTrue; } /*************************************************************************** Handles commands to edit the current line of the group. ***************************************************************************/ bool DCGB::FCmdEditItem(PCMD pcmd) { if (ivNil == _ivCur) return fFalse; _EditIvDln(_ivCur, _dlnCur); return fTrue; } /*************************************************************************** Edit the indicated line of the group. ***************************************************************************/ void DCGB::_EditIvDln(long iv, long dln) { PDOCI pdoci; if (pvNil == (pdoci = DOCI::PdociNew(_pdocb, _pgrpb, _cls, iv, dln))) return; pdoci->PdmdNew(); ReleasePpo(&pdoci); } /*************************************************************************** Handle cidDeleteItem. ***************************************************************************/ bool DCGB::FCmdDeleteItem(PCMD pcmd) { _DeleteIv(_ivCur); return fTrue; } /*************************************************************************** Delete the indicated item. ***************************************************************************/ void DCGB::_DeleteIv(long iv) { long ivMac; if (ivNil == iv || _pgrpb->FFree(iv)) return; // turn off the selection, delete the element and invalidate stuff _SetSel(lnNil); _pgrpb->Delete(iv); ivMac = _pgrpb->IvMac(); if (iv < ivMac) { InvalAllDcgb(_pdocb, _pgrpb, iv, _fAllocated ? 1 : 0, 1); _SetSel(_LnFromIvDln(iv, 0)); } else { InvalAllDcgb(_pdocb, _pgrpb, ivMac, 0, iv - ivMac + 1); if (ivMac > 0) _SetSel(_LnFromIvDln(ivMac - 1, 0)); } _ShowSel(); } #ifdef DEBUG /*************************************************************************** Assert the validity of a DCGB. ***************************************************************************/ void DCGB::AssertValid(ulong grf) { // REVIEW shonk: fill out DCGB_PAR::AssertValid(0); AssertPo(_pgrpb, 0); } /*************************************************************************** Mark memory for the DCGB. ***************************************************************************/ void DCGB::MarkMem(void) { AssertValid(0); DCGB_PAR::MarkMem(); MarkMemObj(_pgrpb); } #endif // DEBUG /*************************************************************************** Constructor for the DCGL class. This class displays (and allows editing of) a GL or AL. ***************************************************************************/ DCGL::DCGL(PDOCB pdocb, PGLB pglb, long cls, PGCB pgcb) : DCGB(pdocb, pglb, cls, 1, pgcb) { } /*************************************************************************** Static method to create a new DCGL for the GL or AL. ***************************************************************************/ PDCGL DCGL::PdcglNew(PDOCB pdocb, PGLB pglb, long cls, PGCB pgcb) { AssertVar(cls == kclsGL || cls == kclsAL, "bad cls", &cls); PDCGL pdcgl; if (pvNil == (pdcgl = NewObj DCGL(pdocb, pglb, cls, pgcb))) return pvNil; if (!pdcgl->_FInit()) { ReleasePpo(&pdcgl); return pvNil; } pdcgl->Activate(fTrue); AssertPo(pdcgl, 0); return pdcgl; } /*************************************************************************** Draw the contents of the DCGL. ***************************************************************************/ void DCGL::Draw(PGNV pgnv, RC *prcClip) { AssertThis(0); AssertPo(pgnv, 0); AssertVarMem(prcClip); PGLB pglb; STN stn; byte rgb[kcbMaxDispGrp]; long ivMac, iv; long cbDisp, cbEntry; long xp, yp, ibT; byte bT; pgnv->ClipRc(prcClip); pgnv->FillRc(prcClip, kacrWhite); pgnv->SetOnn(_onn); pglb = (PGLB)_pgrpb; ivMac = pglb->IvMac(); xp = _XpFromIch(0); cbDisp = cbEntry = pglb->CbEntry(); if (cbDisp > kcbMaxDispGrp) { // the rest will be filled with periods to indicate that // not everything is displayed cbDisp = kcbMaxDispGrp - 2; } iv = _LnFromYp(LwMax(_dypHeader, prcClip->ypTop)); yp = _YpFromIvDln(iv, 0); for (; iv < ivMac && yp < prcClip->ypBottom; iv++) { if (pglb->FFree(iv)) { stn.FFormatSz(PszLit("%5d) FREE"), iv); goto LDisplay; } CopyPb(pglb->QvGet(iv), rgb, cbDisp); // first comes the item number stn.FFormatSz(PszLit("%5d) "), iv); // now add the bytes in hex, with a space after every four bytes for (ibT = 0; ibT < cbDisp; ibT++) { bT = rgb[ibT]; if ((ibT & 0x03) == 0) stn.FAppendCh(kchSpace); stn.FAppendCh(vrgchHex[(bT >> 4) & 0x0F]); stn.FAppendCh(vrgchHex[bT & 0x0F]); } // add the periods if (cbDisp < cbEntry) stn.FAppendSz(PszLit("....")); stn.FAppendSz(PszLit(" ")); // now comes the ascii characters. for (ibT = 0; ibT < cbDisp; ibT++) { bT = rgb[ibT]; if (bT < 32 || bT == 0x7F) bT = '?'; stn.FAppendCh((achar)bT); } // add the periods if (cbDisp < cbEntry) stn.FAppendSz(PszLit("..")); LDisplay: pgnv->DrawStn(&stn, xp, yp); yp += _dypLine; } // draw the selection if (_fActive) _DrawSel(pgnv); } /*************************************************************************** Handle cidAddItem and cidInsertItem. ***************************************************************************/ bool DCGL::FCmdAddItem(PCMD pcmd) { HQ hq; long cb; void *pv; long ivNew; bool fT; PGLB pglb; pglb = (PGLB)_pgrpb; cb = pglb->CbEntry(); if (!FAllocHq(&hq, cb, fmemClear, mprNormal)) return fTrue; pv = PvLockHq(hq); fT = fFalse; switch (pcmd->cid) { case cidAddItem: fT = pglb->FAdd(pv, &ivNew); break; case cidInsertItem: if (_fAllocated) break; Assert(pglb->FIs(kclsGL), "bad grpb"); fT = ((PGL)pglb)->FInsert(ivNew = _ivCur, pv); } UnlockHq(hq); FreePhq(&hq); if (!fT) return fTrue; // turn off the selection and invalidate stuff _SetSel(lnNil); InvalAllDcgb(_pdocb, pglb, ivNew, 1, (_fAllocated && ivNew == pglb->IvMac() - 1) ? 1 : 0); _SetSel(_LnFromIvDln(ivNew, 0)); _ShowSel(); return fTrue; } /*************************************************************************** Constructor for the DCGG class. This class displays (and allows editing of) a GG or AG. ***************************************************************************/ DCGG::DCGG(PDOCB pdocb, PGGB pggb, long cls, PGCB pgcb) : DCGB(pdocb, pggb, cls, pggb->CbFixed() > 0 ? 2 : 1, pgcb) { } /*************************************************************************** Static method to create a new DCGG for the GG or AG. ***************************************************************************/ PDCGG DCGG::PdcggNew(PDOCB pdocb, PGGB pggb, long cls, PGCB pgcb) { AssertVar(cls == kclsGG || cls == kclsAG, "bad cls", &cls); PDCGG pdcgg; if (pvNil == (pdcgg = NewObj DCGG(pdocb, pggb, cls, pgcb))) return pvNil; if (!pdcgg->_FInit()) { ReleasePpo(&pdcgg); return pvNil; } pdcgg->Activate(fTrue); AssertPo(pdcgg, 0); return pdcgg; } /*************************************************************************** Draw the contents of the DCGL. ***************************************************************************/ void DCGG::Draw(PGNV pgnv, RC *prcClip) { AssertThis(0); AssertPo(pgnv, 0); AssertVarMem(prcClip); PGGB pggb; STN stn; byte rgb[kcbMaxDispGrp]; long ivMac, iv, dln; long cbDisp, cbEntry; long xp, yp, ibT; byte bT; RC rc; pgnv->ClipRc(prcClip); pgnv->GetRcSrc(&rc); pgnv->FillRc(prcClip, kacrWhite); pgnv->SetOnn(_onn); pggb = (PGGB)_pgrpb; ivMac = pggb->IvMac(); xp = _XpFromIch(0); iv = _LnFromYp(LwMax(_dypHeader, prcClip->ypTop)) / _clnItem; yp = _YpFromIvDln(iv, 0); for (; iv < ivMac && yp < prcClip->ypBottom; iv++) { if (pggb->FFree(iv)) { stn.FFormatSz(PszLit("%5d) FREE"), iv); pgnv->DrawStn(&stn, xp, yp); yp += _clnItem * _dypLine; goto LDrawBorder; } for (dln = 0; dln < _clnItem; dln++) { if (dln == 0) cbEntry = pggb->Cb(iv); else cbEntry = pggb->CbFixed(); if ((cbDisp = cbEntry) > kcbMaxDispGrp) { // the rest will be filled with periods to indicate that // not everything is displayed cbDisp = kcbMaxDispGrp - 2; } if (dln == 0) { CopyPb(pggb->QvGet(iv), rgb, cbDisp); stn.FFormatSz(PszLit("%5d) "), iv); } else { CopyPb(pggb->QvFixedGet(iv), rgb, cbDisp); stn = PszLit(" "); } // now add the bytes in hex, with a space after every four bytes for (ibT = 0; ibT < cbDisp; ibT++) { bT = rgb[ibT]; if ((ibT & 0x03) == 0) stn.FAppendCh(kchSpace); stn.FAppendCh(vrgchHex[(bT >> 4) & 0x0F]); stn.FAppendCh(vrgchHex[bT & 0x0F]); } // add the periods if (cbDisp < cbEntry) stn.FAppendSz(PszLit("....")); else if (cbDisp < kcbMaxDispGrp) { for (; ibT < kcbMaxDispGrp; ibT++) { stn.FAppendRgch(PszLit(" "), (ibT & 0x03) == 0 ? 3 : 2); } } stn.FAppendSz(PszLit(" ")); // now comes the ascii characters. for (ibT = 0; ibT < cbDisp; ibT++) { bT = rgb[ibT]; if (bT < 32 || bT == 0x7F) bT = '?'; stn.FAppendCh((achar)bT); } // add the periods if (cbDisp < cbEntry) stn.FAppendSz(PszLit("..")); pgnv->DrawStn(&stn, xp, yp); yp += _dypLine; } LDrawBorder: rc.ypTop = yp - _dypBorder; rc.ypBottom = yp; pgnv->FillRc(&rc, kacrBlack); } // draw the selection if (_fActive) _DrawSel(pgnv); } /*************************************************************************** Handle cidAddItem and cidInsertItem. ***************************************************************************/ bool DCGG::FCmdAddItem(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); long cb; long ivNew; bool fT; PGGB pggb; pggb = (PGGB)_pgrpb; cb = (pggb->CbFixed() == 0); fT = fFalse; switch (pcmd->cid) { case cidAddItem: fT = pggb->FAdd(cb, &ivNew); break; case cidInsertItem: if (_fAllocated) break; Assert(pggb->FIs(kclsGG), "bad grpb"); fT = ((PGG)pggb)->FInsert(ivNew = _ivCur, cb); } if (!fT) return fTrue; if (cb > 0) ClearPb(pggb->QvGet(ivNew), cb); else ClearPb(pggb->QvFixedGet(ivNew), pggb->CbFixed()); // turn off the selection and invalidate stuff _SetSel(lnNil); InvalAllDcgb(_pdocb, pggb, ivNew, 1, (_fAllocated && ivNew == pggb->IvMac() - 1) ? 1 : 0); _SetSel(_LnFromIvDln(ivNew, 0)); _ShowSel(); return fTrue; } /*************************************************************************** Constructor for the DCST class. This class displays (and allows editing of) a GST or AST. ***************************************************************************/ DCST::DCST(PDOCB pdocb, PGSTB pgstb, long cls, PGCB pgcb) : DCGB(pdocb, pgstb, cls, pgstb->CbExtra() > 0 ? 2 : 1, pgcb) { } /*************************************************************************** Static method to create a new DCST for the GST or AST. ***************************************************************************/ PDCST DCST::PdcstNew(PDOCB pdocb, PGSTB pgstb, long cls, PGCB pgcb) { AssertVar(cls == kclsGST || cls == kclsAST, "bad cls", &cls); PDCST pdcst; if (pvNil == (pdcst = NewObj DCST(pdocb, pgstb, cls, pgcb))) return pvNil; if (!pdcst->_FInit()) { ReleasePpo(&pdcst); return pvNil; } pdcst->Activate(fTrue); AssertPo(pdcst, 0); return pdcst; } /*************************************************************************** Draw the contents of the DCGL. ***************************************************************************/ void DCST::Draw(PGNV pgnv, RC *prcClip) { AssertThis(0); AssertPo(pgnv, 0); AssertVarMem(prcClip); PGSTB pgstb; STN stn; STN stnT; byte rgb[1024]; long ivMac, iv; long cbDisp, cbExtra; long xp, yp, ibT; byte bT; RC rc; HQ hqExtra = hqNil; byte *pbExtra = rgb; Assert(size(rgb) >= kcbMaxDispGrp, "rgb too small"); pgnv->ClipRc(prcClip); pgnv->GetRcSrc(&rc); pgnv->FillRc(prcClip, kacrWhite); pgnv->SetOnn(_onn); pgstb = (PGSTB)_pgrpb; if (size(rgb) < (cbExtra = pgstb->CbExtra())) { if (FAllocHq(&hqExtra, cbExtra, fmemNil, mprNormal)) pbExtra = (byte *)PvLockHq(hqExtra); else pbExtra = pvNil; } if ((cbDisp = cbExtra) > kcbMaxDispGrp) { // the rest will be filled with periods to indicate that // not everything is displayed cbDisp = kcbMaxDispGrp - 2; } ivMac = pgstb->IvMac(); xp = _XpFromIch(0); iv = _LnFromYp(LwMax(_dypHeader, prcClip->ypTop)) / _clnItem; yp = _YpFromIvDln(iv, 0); for (; iv < ivMac && yp < prcClip->ypBottom; iv++) { if (pgstb->FFree(iv)) { stn.FFormatSz(PszLit("%5d) FREE"), iv); pgnv->DrawStn(&stn, xp, yp); goto LDrawBorder; } pgstb->GetStn(iv, &stnT); stn.FFormatSz(PszLit("%5d) \"%s\""), iv, &stnT); pgnv->DrawStn(&stn, xp, yp); if (_clnItem > 1 && pvNil != pbExtra) { pgstb->GetExtra(iv, pbExtra); stn = PszLit(" "); // now add the bytes in hex, with a space after every four bytes for (ibT = 0; ibT < cbDisp; ibT++) { bT = pbExtra[ibT]; if ((ibT & 0x03) == 0) stn.FAppendCh(kchSpace); stn.FAppendCh(vrgchHex[(bT >> 4) & 0x0F]); stn.FAppendCh(vrgchHex[bT & 0x0F]); } // add the periods if (cbDisp < cbExtra) stn.FAppendSz(PszLit("....")); stn.FAppendSz(PszLit(" ")); // now comes the ascii characters. for (ibT = 0; ibT < cbDisp; ibT++) { bT = pbExtra[ibT]; if (bT < 32 || bT == 0x7F) bT = '?'; stn.FAppendCh((achar)bT); } // add the periods if (cbDisp < cbExtra) stn.FAppendSz(PszLit("..")); pgnv->DrawStn(&stn, xp, yp + _dypLine); } LDrawBorder: yp += _clnItem * _dypLine; rc.ypTop = yp - _dypBorder; rc.ypBottom = yp; pgnv->FillRc(&rc, kacrBlack); } if (hqNil != hqExtra) { UnlockHq(hqExtra); FreePhq(&hqExtra); } // draw the selection if (_fActive) _DrawSel(pgnv); } /*************************************************************************** Handle cidAddItem and cidInsertItem. ***************************************************************************/ bool DCST::FCmdAddItem(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); long ivNew; bool fT; PGSTB pgstb; HQ hq; long cb; STN stn; stn.SetNil(); pgstb = (PGSTB)_pgrpb; fT = fFalse; switch (pcmd->cid) { case cidAddItem: fT = pgstb->FAddStn(&stn, pvNil, &ivNew); break; case cidInsertItem: if (_fAllocated) break; Assert(pgstb->FIs(kclsGST), "bad grpb"); fT = ((PGST)pgstb)->FInsertStn(ivNew = _ivCur, &stn, pvNil); } if (!fT) return fTrue; if ((cb = pgstb->CbExtra()) > 0 && FAllocHq(&hq, cb, fmemClear, mprNormal)) { pgstb->PutExtra(ivNew, PvLockHq(hq)); UnlockHq(hq); FreePhq(&hq); } // turn off the selection and invalidate stuff _SetSel(lnNil); InvalAllDcgb(_pdocb, pgstb, ivNew, 1, (_fAllocated && ivNew == pgstb->IvMac() - 1) ? 1 : 0); _SetSel(_LnFromIvDln(ivNew, 0)); _ShowSel(); return fTrue; } /*************************************************************************** Constructor for DOCI. DOCI holds an item in a GRPB contained in a chunky file. Doesn't free the GRPB when the doc goes away. ***************************************************************************/ DOCI::DOCI(PDOCB pdocb, PGRPB pgrpb, long cls, long iv, long dln) : DOCB(pdocb) { AssertPo(pgrpb, 0); AssertVar(pgrpb->FIs(cls), "wrong cls value", &cls); AssertIn(iv, 0, pgrpb->IvMac()); _pgrpb = pgrpb; _cls = cls; _iv = iv; _dln = dln; } /*************************************************************************** Static member to create a new DOCI. ***************************************************************************/ PDOCI DOCI::PdociNew(PDOCB pdocb, PGRPB pgrpb, long cls, long iv, long dln) { AssertPo(pgrpb, 0); AssertPo(pdocb, 0); PDOCI pdoci; if (pvNil == (pdoci = NewObj DOCI(pdocb, pgrpb, cls, iv, dln))) return pvNil; if (!pdoci->_FInit()) { ReleasePpo(&pdoci); return pvNil; } AssertPo(pdoci, 0); return pdoci; } /*************************************************************************** Reads the data (from the GRPB) and initializes the stream. ***************************************************************************/ bool DOCI::_FInit(void) { bool fRet; HQ hq; long cb; if (hqNil == (hq = _HqRead())) return fFalse; if (0 < (cb = CbOfHq(hq))) { fRet = _bsf.FReplace(PvLockHq(hq), cb, 0, 0); UnlockHq(hq); } else fRet = fTrue; FreePhq(&hq); return fRet; } /*************************************************************************** Create a new DDG for this doc. ***************************************************************************/ PDDG DOCI::PddgNew(PGCB pgcb) { return DCH::PdchNew(this, &_bsf, _fFixed, pgcb); } /*************************************************************************** Get the document's name. ***************************************************************************/ void DOCI::GetName(PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); STN stn; stn.FFormatSz(PszLit(": item %d"), _iv); _pdocbPar->GetName(pstn); pstn->FAppendStn(&stn); } /*************************************************************************** Handle saving. This is a virtual member of DOCB. ***************************************************************************/ bool DOCI::FSave(long cid) { AssertThis(0); long iv; switch (cid) { case cidSave: iv = _iv; break; case cidSaveAs: case cidSaveCopy: RawRtn(); // REVIEW shonk: implement return fFalse; default: return fFalse; } return _FSaveToItem(iv, cid != cidSaveCopy); } /*************************************************************************** Save the data to an item. ***************************************************************************/ bool DOCI::_FSaveToItem(long iv, bool fRedirect) { if (!_FWrite(iv)) return fFalse; // REVIEW shonk: update window names if (fRedirect) { _iv = iv; _fDirty = fFalse; } DCGB::InvalAllDcgb(_pdocbPar, _pgrpb, iv, 1, 1); return fTrue; } /*************************************************************************** Write the data to the GRPB at the given item number. ***************************************************************************/ bool DOCI::_FWrite(long iv) { long cb; HQ hq; void *pv; bool fRet; cb = _bsf.IbMac(); if (!FAllocHq(&hq, LwMax(1, cb), fmemNil, mprNormal)) return fFalse; _bsf.FetchRgb(0, cb, pv = PvLockHq(hq)); fRet = fTrue; switch (_cls) { case kclsGL: case kclsAL: Assert(cb == ((PGLB)_pgrpb)->CbEntry(), "bad cb in GL/AL"); ((PGLB)_pgrpb)->Put(iv, pv); break; case kclsGG: case kclsAG: if (_dln == 0) fRet = ((PGGB)_pgrpb)->FPut(iv, cb, pv); else { Assert(cb == ((PGGB)_pgrpb)->CbFixed(), "bad cb in GG/AG"); ((PGGB)_pgrpb)->PutFixed(iv, pv); } break; case kclsGST: case kclsAST: if (_dln == 0) { cb = LwMin(cb, kcchMaxStz); fRet = ((PGSTB)_pgrpb)->FPutRgch(iv, (achar *)pv, cb / size(achar)); } else { Assert(cb == ((PGSTB)_pgrpb)->CbExtra(), "bad cb in GST/AST"); ((PGSTB)_pgrpb)->PutExtra(iv, pv); } break; default: BugVar("bad cls value", &_cls); fRet = fFalse; break; } UnlockHq(hq); FreePhq(&hq); return fRet; } /*************************************************************************** Read the data from the GRPB and return it in an hq. Also set the _fFixed flag (which indicates if the data is fixed length). ***************************************************************************/ HQ DOCI::_HqRead(void) { long cb; HQ hq; void *pv; STN stn; _fFixed = fTrue; switch (_cls) { case kclsGL: case kclsAL: cb = ((PGLB)_pgrpb)->CbEntry(); break; case kclsGG: case kclsAG: if (_dln == 0) { cb = ((PGGB)_pgrpb)->Cb(_iv); _fFixed = fFalse; } else cb = ((PGGB)_pgrpb)->CbFixed(); break; case kclsGST: case kclsAST: if (_dln == 0) { ((PGSTB)_pgrpb)->GetStn(_iv, &stn); cb = stn.Cch() * size(achar); _fFixed = fFalse; } else cb = ((PGSTB)_pgrpb)->CbExtra(); break; default: BugVar("bad cls value", &_cls); return hqNil; } if (!FAllocHq(&hq, cb, fmemNil, mprNormal)) return hqNil; pv = PvLockHq(hq); switch (_cls) { case kclsGL: case kclsAL: ((PGLB)_pgrpb)->Get(_iv, pv); break; case kclsGG: case kclsAG: if (_dln == 0) ((PGGB)_pgrpb)->Get(_iv, pv); else ((PGGB)_pgrpb)->GetFixed(_iv, pv); break; case kclsGST: case kclsAST: if (_dln == 0) CopyPb(stn.Prgch(), pv, stn.Cch() * size(achar)); else ((PGSTB)_pgrpb)->GetExtra(_iv, pv); break; } UnlockHq(hq); return hq; } #ifdef DEBUG /*************************************************************************** Assert the validity of a DOCI. ***************************************************************************/ void DOCI::AssertValid(ulong grf) { DOCI_PAR::AssertValid(0); AssertPo(_pgrpb, 0); } /*************************************************************************** Mark memory for the DOCI. ***************************************************************************/ void DOCI::MarkMem(void) { AssertValid(0); DOCI_PAR::MarkMem(); MarkMemObj(_pgrpb); } #endif // DEBUG ================================================ FILE: kauai/tools/chhex.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Classes for the hex editor. ***************************************************************************/ #include "ched.h" ASSERTNAME #define kcbMaxLineDch 16 /*************************************************************************** A document class that holds a stream and is naturally displayed by the hex editor (DCH). Used for the clipboard. ***************************************************************************/ typedef class DHEX *PDHEX; #define DHEX_PAR DOCB #define kclsDHEX 'DHEX' class DHEX : public DHEX_PAR { RTCLASS_DEC ASSERT MARKMEM protected: BSF _bsf; DHEX(PDOCB pdocb = pvNil, ulong grfdoc = fdocNil) : DHEX_PAR(pdocb, grfdoc) { } public: static PDHEX PdhexNew(void); PBSF Pbsf(void) { return &_bsf; } virtual PDDG PddgNew(PGCB pgcb); }; RTCLASS(DCH) RTCLASS(DOCH) RTCLASS(DHEX) /*************************************************************************** Static method to create a new text stream document to be displayed by the hex editor. ***************************************************************************/ PDHEX DHEX::PdhexNew(void) { PDHEX pdhex; if (pvNil == (pdhex = NewObj DHEX())) return pvNil; return pdhex; } /*************************************************************************** Create a new DCH displaying this stream. ***************************************************************************/ PDDG DHEX::PddgNew(PGCB pgcb) { return DCH::PdchNew(this, &_bsf, fFalse, pgcb); } #ifdef DEBUG /*************************************************************************** Assert the validity of a DHEX. ***************************************************************************/ void DHEX::AssertValid(ulong grf) { DHEX_PAR::AssertValid(0); AssertPo(&_bsf, 0); } /*************************************************************************** Mark memory for the DHEX. ***************************************************************************/ void DHEX::MarkMem(void) { AssertValid(0); DHEX_PAR::MarkMem(); MarkMemObj(&_bsf); } #endif // DEBUG /*************************************************************************** Constructor for the DCH. ***************************************************************************/ DCH::DCH(PDOCB pdocb, PBSF pbsf, bool fFixed, PGCB pgcb) : DCLB(pdocb, pgcb) { _pbsf = pbsf; _cbLine = kcbMaxLineDch; _dypHeader = _dypLine + 1; _fFixed = FPure(fFixed); } /*************************************************************************** Static method to create a new DCH. ***************************************************************************/ PDCH DCH::PdchNew(PDOCB pdocb, PBSF pbsf, bool fFixed, PGCB pgcb) { PDCH pdch; if (pvNil == (pdch = NewObj DCH(pdocb, pbsf, fFixed, pgcb))) return pvNil; if (!pdch->_FInit()) { ReleasePpo(&pdch); return pvNil; } pdch->Activate(fTrue); AssertPo(pdch, 0); return pdch; } /*************************************************************************** We're being activated or deactivated, invert the sel. ***************************************************************************/ void DCH::_Activate(bool fActive) { AssertThis(0); RC rc; DDG::_Activate(fActive); GetRc(&rc, cooLocal); rc.ypBottom = _dypHeader; InvalRc(&rc); _SwitchSel(fActive); } /*************************************************************************** Draw the Hex doc in the port. ***************************************************************************/ void DCH::Draw(PGNV pgnv, RC *prcClip) { AssertThis(0); AssertPo(pgnv, 0); AssertVarMem(prcClip); STN stn; byte rgb[kcbMaxLineDch]; RC rc, rcSrc; long xp, yp, cb, ib, cbT, ibT; byte bT; pgnv->ClipRc(prcClip); pgnv->GetRcSrc(&rcSrc); pgnv->SetOnn(_onn); if (prcClip->ypTop < _dypHeader) _DrawHeader(pgnv); Assert(_cbLine <= size(rgb), "lines too long"); cb = _pbsf->IbMac(); xp = _XpFromIch(0); ib = LwMul(_cbLine, _LnFromYp(LwMax(_dypHeader, prcClip->ypTop))); yp = _YpFromIb(ib); rc.xpLeft = _XpFromCb(_cbLine, fFalse); rc.xpRight = prcClip->xpRight; rc.ypTop = yp; rc.ypBottom = prcClip->ypBottom; pgnv->FillRc(&rc, kacrWhite); if (xp > 0) { // erase to the left of the text rc.xpLeft = 0; rc.xpRight = xp; pgnv->FillRc(&rc, kacrWhite); } for (; ib < cb && yp < prcClip->ypBottom; ib += _cbLine) { cbT = LwMin(_cbLine, cb - ib); _pbsf->FetchRgb(ib, cbT, rgb); // first comes the address of the first byte of the line stn.FFormatSz(PszLit("%08x "), ib); // now add the line's bytes in hex, with a space after every // four bytes for (ibT = 0; ibT < cbT; ibT++) { bT = rgb[ibT]; if ((ibT & 0x03) == 0) stn.FAppendCh(kchSpace); stn.FAppendCh(vrgchHex[(bT >> 4) & 0x0F]); stn.FAppendCh(vrgchHex[bT & 0x0F]); } // pad the line with spaces if (ibT < _cbLine) { ibT = _cbLine - ibT; ibT = 2 * ibT + ibT / 4; while (ibT-- > 0) stn.FAppendCh(kchSpace); } stn.FAppendSz(PszLit(" ")); // now comes the ascii characters. for (ibT = 0; ibT < cbT; ibT++) { bT = rgb[ibT]; if (bT < 32 || bT == 0x7F) bT = '?'; stn.FAppendCh((achar)bT); } // pad the line with spaces while (ibT++ < _cbLine) stn.FAppendCh(kchSpace); pgnv->DrawStn(&stn, xp, yp, kacrBlack, kacrWhite); yp += _dypLine; } if (yp < prcClip->ypBottom) { rc = rcSrc; rc.ypTop = yp; pgnv->FillRc(&rc, kacrWhite); } // draw the selection if (_fSelOn) _InvertSel(pgnv); } /*************************************************************************** Draw the header for the DCH. ***************************************************************************/ void DCH::_DrawHeader(PGNV pgnv) { STN stn; RC rc, rcSrc; pgnv->SetOnn(_onn); pgnv->GetRcSrc(&rcSrc); // erase the first part of the line rc.xpLeft = 0; rc.xpRight = _XpFromIch(0); rc.ypTop = 0; rc.ypBottom = _dypLine; pgnv->FillRc(&rc, kacrWhite); // draw the text stn.FFormatSz(PszLit("%08x"), _pbsf->IbMac()); pgnv->DrawStn(&stn, rc.xpRight, 0, kacrBlack, kacrWhite); // erase the rest of the line rc.xpLeft = _XpFromIch(8); rc.xpRight = rcSrc.xpRight; pgnv->FillRc(&rc, kacrWhite); // draw the _fHex Marker rc.xpLeft = _XpFromCb(0, _fHexSel); rc.xpRight = rc.xpLeft + rc.Dyp(); rc.Inset(rc.Dyp() / 6, rc.Dyp() / 6); if (_fActive) pgnv->FillRc(&rc, kacrBlack); else pgnv->FillRcApt(&rc, &vaptGray, kacrBlack, kacrWhite); // draw the line seperating the header from the data rc = rcSrc; rc.ypTop = _dypHeader - 1; rc.ypBottom = _dypHeader; pgnv->FillRc(&rc, kacrBlack); } /*************************************************************************** Handle key input. ***************************************************************************/ bool DCH::FCmdKey(PCMD_KEY pcmd) { AssertThis(0); ulong grfcust; long dibSel, dibDel, ibLim; long cact; CMD cmd; byte rgb[64], bT; bool fRight = fFalse; // keep fetching characters until we get a cursor key, delete key or // until the buffer is full. dibSel = 0; dibDel = 0; ibLim = 0; do { switch (pcmd->vk) { case kvkHome: dibSel = -_pbsf->IbMac() - ibLim - 1; break; case kvkEnd: dibSel = _pbsf->IbMac() + ibLim + 1; break; case kvkLeft: dibSel = -1; break; case kvkRight: dibSel = 1; fRight = fTrue; break; case kvkUp: dibSel = -_cbLine; fRight = _fRightSel; break; case kvkDown: dibSel = _cbLine; fRight = _fRightSel; break; case kvkDelete: if (!_fFixed) dibDel = 1; break; case kvkBack: if (!_fFixed) dibDel = -1; break; default: if (chNil == pcmd->ch) break; if (!_fHexSel) bT = (byte)pcmd->ch; else { // hex typing if (FIn(pcmd->ch, '0', '9' + 1)) bT = pcmd->ch - '0'; else if (FIn(pcmd->ch, 'A', 'F' + 1)) bT = pcmd->ch - 'A' + 10; else if (FIn(pcmd->ch, 'a', 'f' + 1)) bT = pcmd->ch - 'a' + 10; else break; } for (cact = 0; cact < pcmd->cact && ibLim < size(rgb); cact++) rgb[ibLim++] = bT; break; } grfcust = pcmd->grfcust; pcmd = (PCMD_KEY)&cmd; } while (0 == dibSel && 0 == dibDel && ibLim < size(rgb) && vpcex->FGetNextKey(&cmd)); if (ibLim > 0) { // have some characters to insert if (!_fHexSel) { // just straight characters to insert _FReplace(rgb, ibLim, _ibAnchor, _ibOther); } else { // hex typing byte bT; long ibSrc, ibDst; long ibAnchor = _ibAnchor; if (_fHalfSel && ibAnchor > 0) { // complete the byte _pbsf->FetchRgb(--ibAnchor, 1, &bT); rgb[0] = (bT & 0xF0) | (rgb[0] & 0x0F); ibSrc = 1; } else ibSrc = 0; for (ibDst = ibSrc; ibSrc + 1 < ibLim; ibSrc += 2) rgb[ibDst++] = (rgb[ibSrc] << 4) | (rgb[ibSrc + 1] & 0x0F); if (ibSrc < ibLim) { Assert(ibSrc + 1 == ibLim, 0); rgb[ibDst++] = rgb[ibSrc] << 4; } _FReplace(rgb, ibDst, ibAnchor, _ibOther, ibSrc < ibLim); } } if (dibSel != 0) { // move the selection if (grfcust & fcustShift) { // extend selection _SetSel(_ibAnchor, _ibOther + dibSel, fRight); _ShowSel(); } else { long ibOther = _ibOther; long ibAnchor = _ibAnchor; if (_fHalfSel) { if (dibSel < 0) { ibAnchor--; fRight = fFalse; } else fRight = fTrue; } else if (ibAnchor == ibOther) ibAnchor += dibSel; else if ((dibSel > 0) != (ibAnchor > ibOther)) { ibAnchor = ibOther; fRight = dibSel > 0; } _SetSel(ibAnchor, ibAnchor, fRight); _ShowSel(); } } else if (dibDel != 0) { if (_ibAnchor != _ibOther) dibDel = _ibOther - _ibAnchor; else dibDel = LwBound(_ibAnchor + dibDel, 0, _pbsf->IbMac() + 1) - _ibAnchor; if (dibDel != 0) _FReplace(pvNil, 0, _ibAnchor, _ibAnchor + dibDel); } return fTrue; } /*************************************************************************** Replaces the bytes between ib1 and ib2 with the given bytes. ***************************************************************************/ bool DCH::_FReplace(byte *prgb, long cb, long ib1, long ib2, bool fHalfSel) { _SwitchSel(fFalse); SortLw(&ib1, &ib2); if (_fFixed) { cb = LwMin(cb, _pbsf->IbMac() - ib1); ib2 = ib1 + cb; } if (!_pbsf->FReplace(prgb, cb, ib1, ib2 - ib1)) return fFalse; _InvalAllDch(ib1, cb, ib2 - ib1); ib1 += cb; if (fHalfSel) _SetHalfSel(ib1); else _SetSel(ib1, ib1, fFalse /*REVIEW shonk*/); _ShowSel(); return fTrue; } /*************************************************************************** Invalidate all DCHs on this byte stream. Also dirties the document. Should be called by any code that edits the document. ***************************************************************************/ void DCH::_InvalAllDch(long ib, long cbIns, long cbDel) { AssertThis(0); long ipddg; PDDG pddg; // mark the document dirty _pdocb->SetDirty(); // inform the DCDs for (ipddg = 0; pvNil != (pddg = _pdocb->PddgGet(ipddg)); ipddg++) { if (pddg->FIs(kclsDCH)) ((PDCH)pddg)->_InvalIb(ib, cbIns, cbDel); } } /*************************************************************************** Invalidate the display from ib to the end of the display. If we're the active DCH, also redraw. ***************************************************************************/ void DCH::_InvalIb(long ib, long cbIns, long cbDel) { AssertThis(0); Assert(!_fSelOn, "why is the sel on during an invalidation?"); RC rc; long ibAnchor, ibOther; // adjust the sel ibAnchor = _ibAnchor; ibOther = _ibOther; FAdjustIv(&ibAnchor, ib, cbIns, cbDel); FAdjustIv(&ibOther, ib, cbIns, cbDel); if (ibAnchor != _ibAnchor || ibOther != _ibOther) _SetSel(ibAnchor, ibOther, _fRightSel); // caclculate the invalid rectangle GetRc(&rc, cooLocal); rc.ypTop = _YpFromIb(ib); if (cbIns == cbDel) rc.ypBottom = rc.ypTop + _dypLine; if (rc.FEmpty()) return; if (_fActive) { ValidRc(&rc, kginDraw); InvalRc(&rc, kginDraw); } else InvalRc(&rc); if (cbIns != cbDel) { // invalidate the length GetRc(&rc, cooLocal); rc.xpLeft = _XpFromIch(0); rc.xpRight = _XpFromIch(8); rc.ypTop = 0; rc.ypBottom = _dypHeader; InvalRc(&rc); } } /*************************************************************************** Turn the selection on or off. ***************************************************************************/ void DCH::_SwitchSel(bool fOn) { if (FPure(fOn) != FPure(_fSelOn)) { GNV gnv(this); _InvertSel(&gnv); _fSelOn = FPure(fOn); } } /*************************************************************************** Make sure the ibOther of the selection is visible. If possible, show both ends of the selection. ***************************************************************************/ void DCH::_ShowSel(void) { long ln, lnHope, cln, dscv; RC rc; // find the line we definitely need to show ln = _ibOther / _cbLine; if (_ibOther % _cbLine == 0 && ln > 0) { // may have to adjust ln down by one if (_ibAnchor < _ibOther || _ibAnchor == _ibOther && _fRightSel) ln--; } // find the other end of the selection - which we hope to be able to show lnHope = _ibAnchor / _cbLine; _GetContent(&rc); cln = LwMax(1, rc.Dyp() / _dypLine); if (LwAbs(ln - lnHope) >= cln) lnHope = ln; // can't show both if (FIn(ln, _scvVert, _scvVert + cln) && FIn(lnHope, _scvVert, _scvVert + cln)) { // both are showing return; } Assert(LwAbs(lnHope - ln) < cln, "ln and lnHope too far apart"); SortLw(&ln, &lnHope); if (ln < _scvVert) dscv = ln - _scvVert; else { dscv = lnHope - _scvVert - cln + 1; Assert(dscv > 0, "bad dscv (bad logic above)"); } _Scroll(scaNil, scaToVal, 0, _scvVert + dscv); } /*************************************************************************** Invert the selection. Doesn't touch _fSelOn. ***************************************************************************/ void DCH::_InvertSel(PGNV pgnv) { Assert(!_fFixed || _ibAnchor == _ibOther, "non-ins sel in fixed"); long cb; RC rcClip; RC rc, rcT; _GetContent(&rcClip); if (_fFixed && _pbsf->IbMac() > 0 && !_fHalfSel) { rc.xpLeft = _XpFromIb(_ibAnchor, fTrue); rc.xpRight = rc.xpLeft + 2 * _dxpChar; rc.ypTop = _YpFromIb(_ibAnchor); rc.ypBottom = rc.ypTop + _dypLine; if (rcT.FIntersect(&rc, &rcClip)) pgnv->HiliteRc(&rcT, kacrWhite); rc.xpLeft = _XpFromIb(_ibAnchor, fFalse); rc.xpRight = rc.xpLeft + _dxpChar; if (rcT.FIntersect(&rc, &rcClip)) pgnv->HiliteRc(&rcT, kacrWhite); } else if (_ibAnchor == _ibOther) { // insertion or half sel Assert(!_fHalfSel || _fRightSel, "_fHalfSel set but not _fRightSel"); cb = _ibAnchor % _cbLine; if (_fRightSel && cb == 0 && _ibAnchor > 0) { rc.ypTop = _YpFromIb(_ibAnchor - 1); cb = _cbLine; } else rc.ypTop = _YpFromIb(_ibAnchor); rc.ypBottom = rc.ypTop + _dypLine; // do the hex sel rc.xpLeft = _XpFromCb(cb, fTrue, _fRightSel); if (_fHalfSel && _ibAnchor > 0) { rc.xpRight = rc.xpLeft; rc.xpLeft -= _dxpChar; if (rcT.FIntersect(&rc, &rcClip)) pgnv->HiliteRc(&rcT, kacrWhite); } else { rc.xpRight = --rc.xpLeft + 2; if (rcT.FIntersect(&rc, &rcClip)) pgnv->FillRc(&rcT, kacrInvert); } // do the ascii sel rc.xpLeft = _XpFromCb(cb, fFalse) - 1; rc.xpRight = rc.xpLeft + 2; if (rcT.FIntersect(&rc, &rcClip)) pgnv->FillRc(&rcT, kacrInvert); } else { _InvertIbRange(pgnv, _ibAnchor, _ibOther, fTrue); _InvertIbRange(pgnv, _ibAnchor, _ibOther, fFalse); } } /*************************************************************************** Inverts a range on screen. Does not mark insertion bars or half sels. ***************************************************************************/ void DCH::_InvertIbRange(PGNV pgnv, long ib1, long ib2, bool fHex) { long ibMin, ibMac; long xp2, yp2; RC rc, rcT, rcClip; ibMin = _scvVert * _cbLine; ibMac = _pbsf->IbMac(); ib1 = LwBound(ib1, ibMin, ibMac + 1); ib2 = LwBound(ib2, ibMin, ibMac + 1); if (ib1 == ib2) return; SortLw(&ib1, &ib2); _GetContent(&rcClip); rc.xpLeft = _XpFromIb(ib1, fHex); rc.ypTop = _YpFromIb(ib1); xp2 = _XpFromIb(ib2, fHex); yp2 = _YpFromIb(ib2); rc.ypBottom = rc.ypTop + _dypLine; if (yp2 == rc.ypTop) { // only one line involved rc.xpRight = xp2; if (rcT.FIntersect(&rc, &rcClip)) pgnv->HiliteRc(&rcT, kacrWhite); return; } // invert the sel on the first line rc.xpRight = _XpFromCb(_cbLine, fHex); if (rcT.FIntersect(&rc, &rcClip)) pgnv->HiliteRc(&rcT, kacrWhite); // invert the main rectangular block rc.xpLeft = _XpFromCb(0, fHex); rc.ypTop += _dypLine; rc.ypBottom = yp2; if (rcT.FIntersect(&rc, &rcClip)) pgnv->HiliteRc(&rcT, kacrWhite); // invert the last line rc.ypTop = yp2; rc.ypBottom = yp2 + _dypLine; rc.xpRight = xp2; if (rcT.FIntersect(&rc, &rcClip)) pgnv->HiliteRc(&rcT, kacrWhite); } /*************************************************************************** Select the second half of the byte before ib. ***************************************************************************/ void DCH::_SetHalfSel(long ib) { ib = LwBound(ib, 0, _pbsf->IbMac() + 1); if (ib == 0) { _SetSel(ib, ib, fFalse); return; } GNV gnv(this); if (_fSelOn) { // turn off the sel _InvertSel(&gnv); _fSelOn = fFalse; } _ibAnchor = _ibOther = ib; _fHalfSel = fTrue; _fRightSel = fTrue; if (_fActive) { _InvertSel(&gnv); _fSelOn = fTrue; } } /*************************************************************************** Set the selection. fRight is ignored for non-insertion bar selections. ***************************************************************************/ void DCH::_SetSel(long ibAnchor, long ibOther, bool fRight) { long ibMac = _pbsf->IbMac(); GNV gnv(this); if (_fFixed && ibMac > 0) { ibOther = ibAnchor = LwBound(ibOther, 0, ibMac); fRight = fFalse; } else { ibAnchor = LwBound(ibAnchor, 0, ibMac + 1); ibOther = LwBound(ibOther, 0, ibMac + 1); if (ibAnchor == ibOther) { if (fRight && ibAnchor == 0) fRight = fFalse; else if (!fRight && ibAnchor == ibMac) fRight = fTrue; } else fRight = fFalse; } if (!_fHalfSel && ibAnchor == _ibAnchor && ibOther == _ibOther && FPure(fRight) == FPure(_fRightSel)) { goto LDrawSel; } if (_fSelOn) { if (_ibAnchor != ibAnchor || _ibAnchor == _ibOther || ibAnchor == ibOther) { _InvertSel(&gnv); _fSelOn = fFalse; } else { // they have the same anchor and neither is an insertion _InvertIbRange(&gnv, _ibOther, ibOther, fTrue); _InvertIbRange(&gnv, _ibOther, ibOther, fFalse); } } _ibAnchor = ibAnchor; _ibOther = ibOther; _fRightSel = FPure(fRight); _fHalfSel = fFalse; LDrawSel: if (!_fSelOn && _fActive) { _InvertSel(&gnv); _fSelOn = fTrue; } } /*************************************************************************** Changes the selection type from hex to ascii or vice versa. ***************************************************************************/ void DCH::_SetHexSel(bool fHex) { if (FPure(fHex) == FPure(_fHexSel)) return; _fHexSel = FPure(fHex); GNV gnv(this); _DrawHeader(&gnv); } /*************************************************************************** Find the column for the given horizontal byte position. cb is the number of bytes in from the left edge. fHex indicates whether we want the position in the hex area or the ascii area. fNoTrailSpace is ignored if fHex is false. If fHex is true, fNoTrailSpace indicates whether a trailing space should be included (if the cb is divisible by 4). ***************************************************************************/ long DCH::_IchFromCb(long cb, bool fHex, bool fNoTrailSpace) { AssertIn(cb, 0, _cbLine + 1); // skip over the address long ich = 10; if (fHex) { // account for the spaces every four hex digits ich += 2 * cb + cb / 4; if (fNoTrailSpace && (cb % 4) == 0 && cb > 0) ich--; } else { // skip over the hex area ich += 2 * _cbLine + _cbLine / 4 + 1 + cb; } return ich; } /*************************************************************************** Find the xp for the given byte. fHex indicates whether we want the postion in the hex area or the ascii area. ***************************************************************************/ long DCH::_XpFromIb(long ib, bool fHex) { return _XpFromIch(_IchFromCb(ib % _cbLine, fHex)); } /*************************************************************************** Find the xp for the given horizontal byte position. cb is the number of bytes in from the left edge. fHex indicates whether we want the postion in the hex area or the ascii area. ***************************************************************************/ long DCH::_XpFromCb(long cb, bool fHex, bool fNoTrailSpace) { return _XpFromIch(_IchFromCb(cb, fHex, fNoTrailSpace)); } /*************************************************************************** Find the yp for the given byte. ***************************************************************************/ long DCH::_YpFromIb(long ib) { AssertIn(ib, 0, kcbMax); return LwMul((ib / _cbLine) - _scvVert, _dypLine) + _dypHeader; } /*************************************************************************** Finds the byte that the given point is over. *ptHex is both input and output. If *ptHex is tMaybe on input, it will be set to tYes or tNo on output (unless the point is not in the edit area of the DCH). If *ptHex is tYes or tNo on input, the ib is determined using *ptHex. ***************************************************************************/ long DCH::_IbFromPt(long xp, long yp, tribool *ptHex, bool *pfRight) { AssertVarMem(ptHex); AssertNilOrVarMem(pfRight); RC rc; long cbMin, cbLim, cb, ib; long xpFind, xpT; bool fHex; _GetContent(&rc); if (!rc.FPtIn(xp, yp)) return ivNil; if (*ptHex == tMaybe) { xpT = (_XpFromCb(_cbLine, fTrue, fTrue) + _XpFromCb(0, fFalse)) / 2; if (xp <= xpT) *ptHex = tYes; else *ptHex = tNo; } xpFind = xp - _dxpChar; if (*ptHex == tYes) { if (_fFixed) xpFind -= _dxpChar; fHex = fTrue; } else { if (!_fFixed) xpFind = xp - _dxpChar / 2; fHex = fFalse; } for (cbMin = 0, cbLim = _cbLine; cbMin < cbLim;) { cb = (cbMin + cbLim) / 2; xpT = _XpFromCb(cb, fHex); if (xpT < xpFind) cbMin = cb + 1; else cbLim = cb; } if (_fFixed && cbMin == _cbLine) cbMin--; ib = cbMin + _cbLine * _LnFromYp(yp); ib = LwMin(ib, _pbsf->IbMac()); if (pvNil != pfRight) *pfRight = cbMin == _cbLine; return ib; } /*************************************************************************** Handle a mouse down in our content. ***************************************************************************/ void DCH::MouseDown(long xp, long yp, long cact, ulong grfcust) { AssertThis(0); tribool tHex; bool fDown, fRight; PT pt, ptT; long ib; RC rc; // doing this before the activate avoids flashing the old selection tHex = tMaybe; ib = _IbFromPt(xp, yp, &tHex, &fRight); if (ivNil != ib) _SetSel((grfcust & fcustShift) ? _ibAnchor : ib, ib, fRight); if (!_fActive) Activate(fTrue); if (ivNil == ib) return; _SetHexSel(tYes == tHex); Clean(); _GetContent(&rc); for (GetPtMouse(&pt, &fDown); fDown; GetPtMouse(&pt, &fDown)) { if (!rc.FPtIn(pt.xp, pt.yp)) { // do autoscroll ptT = pt; rc.PinPt(&pt); _Scroll(scaToVal, scaToVal, _scvHorz + LwDivAway(ptT.xp - pt.xp, _dxpChar), _scvVert + LwDivAway(ptT.yp - pt.yp, _dypLine)); } ib = _IbFromPt(pt.xp, pt.yp, &tHex, &fRight); if (ivNil != ib) _SetSel(_ibAnchor, ib, fRight); } } /*************************************************************************** Return the maximum for the indicated scroll bar. ***************************************************************************/ long DCH::_ScvMax(bool fVert) { RC rc; _GetContent(&rc); return LwMax(0, fVert ? (_pbsf->IbMac() + _cbLine - 1) / _cbLine + 1 - rc.Dyp() / _dypLine : _IchFromCb(_cbLine, fFalse) + 2 - rc.Dxp() / _dxpChar); } /*************************************************************************** Copy the selection. ***************************************************************************/ bool DCH::_FCopySel(PDOCB *ppdocb) { PDHEX pdhex; long ib1, ib2; ib1 = _ibOther; ib2 = _fFixed ? _pbsf->IbMac() : _ibAnchor; if (_ibOther == ib2) return fFalse; if (pvNil == ppdocb) return fTrue; SortLw(&ib1, &ib2); if (pvNil != (pdhex = DHEX::PdhexNew())) { if (!pdhex->Pbsf()->FReplaceBsf(_pbsf, ib1, ib2 - ib1, 0, 0)) ReleasePpo(&pdhex); } *ppdocb = pdhex; return pvNil != *ppdocb; } /*************************************************************************** Clear (delete) the selection. ***************************************************************************/ void DCH::_ClearSel(void) { _FReplace(pvNil, 0, _ibAnchor, _ibOther, fFalse); } /*************************************************************************** Paste over the selection. ***************************************************************************/ bool DCH::_FPaste(PCLIP pclip, bool fDoIt, long cid) { AssertThis(0); AssertPo(pclip, 0); long ib1, ib2, cb; PDOCB pdocb; PBSF pbsf; if (cidPaste != cid) return fFalse; if (!pclip->FGetFormat(kclsDHEX) && !pclip->FGetFormat(kclsTXTB)) return fFalse; if (!fDoIt) return fTrue; if (pclip->FGetFormat(kclsDHEX, &pdocb)) { if (pvNil == (pbsf = ((PDHEX)pdocb)->Pbsf()) || 0 >= (cb = pbsf->IbMac())) { ReleasePpo(&pdocb); return fFalse; } } else if (pclip->FGetFormat(kclsTXTB, &pdocb)) { if (pvNil == (pbsf = ((PTXTB)pdocb)->Pbsf()) || 0 >= (cb = pbsf->IbMac() - size(achar))) { ReleasePpo(&pdocb); return fFalse; } } else return fFalse; ib1 = _ibAnchor; ib2 = _ibOther; _SwitchSel(fFalse); SortLw(&ib1, &ib2); if (_fFixed) { cb = LwMin(cb, _pbsf->IbMac() - ib1); ib2 = ib1 + cb; } if (!_pbsf->FReplaceBsf(pbsf, 0, cb, ib1, ib2 - ib1)) { ReleasePpo(&pdocb); return fFalse; } _InvalAllDch(ib1, cb, ib2 - ib1); ib1 += cb; _SetSel(ib1, ib1, fFalse /*REVIEW shonk*/); _ShowSel(); ReleasePpo(&pdocb); return fTrue; } #ifdef DEBUG /*************************************************************************** Assert the validity of an object. ***************************************************************************/ void DCH::AssertValid(ulong grf) { DCH_PAR::AssertValid(0); AssertPo(_pbsf, 0); AssertIn(_cbLine, 1, kcbMaxLineDch + 1); AssertIn(_ibAnchor, 0, kcbMax); AssertIn(_ibOther, 0, kcbMax); } /*************************************************************************** Mark memory for the DCH. ***************************************************************************/ void DCH::MarkMem(void) { AssertValid(0); DCH_PAR::MarkMem(); MarkMemObj(_pbsf); } #endif // DEBUG /*************************************************************************** Constructor for a chunk hex editing doc. ***************************************************************************/ DOCH::DOCH(PDOCB pdocb, PCFL pcfl, CTG ctg, CNO cno) : DOCE(pdocb, pcfl, ctg, cno) { } /*************************************************************************** Creates a new hex editing doc based on the given chunk. Asserts that there are no open editing docs based on the chunk. ***************************************************************************/ PDOCH DOCH::PdochNew(PDOCB pdocb, PCFL pcfl, CTG ctg, CNO cno) { AssertPo(pdocb, 0); AssertPo(pcfl, 0); Assert(pvNil == DOCE::PdoceFromChunk(pdocb, pcfl, ctg, cno), "DOCE already exists for the chunk"); PDOCH pdoch; if (pvNil == (pdoch = NewObj DOCH(pdocb, pcfl, ctg, cno))) return pvNil; if (!pdoch->_FInit()) { ReleasePpo(&pdoch); return pvNil; } AssertPo(pdoch, 0); return pdoch; } /*************************************************************************** Initialize the stream from the given flo. ***************************************************************************/ bool DOCH::_FRead(PBLCK pblck) { FLO flo; bool fRet; if (!pblck->FUnpackData()) return fFalse; if (pvNil == (flo.pfil = FIL::PfilCreateTemp())) return fFalse; flo.fp = 0; flo.cb = pblck->Cb(); if (!pblck->FWriteToFlo(&flo)) { ReleasePpo(&flo.pfil); return fFalse; } fRet = _bsf.FReplaceFlo(&flo, fFalse, 0, _bsf.IbMac()); ReleasePpo(&flo.pfil); return fRet; } /*************************************************************************** Create a new DDG for the doc. ***************************************************************************/ PDDG DOCH::PddgNew(PGCB pgcb) { AssertThis(0); return DCH::PdchNew(this, &_bsf, fFalse, pgcb); } /*************************************************************************** Returns the length of the data on file ***************************************************************************/ long DOCH::_CbOnFile(void) { AssertThis(0); return _bsf.IbMac(); } /*************************************************************************** Writes the data and returns success/failure. ***************************************************************************/ bool DOCH::_FWrite(PBLCK pblck, bool fRedirect) { AssertThis(0); if (!_bsf.FWriteRgb(pblck)) return fFalse; _FRead(pblck); return fTrue; } #ifdef DEBUG /*************************************************************************** Assert the validity of an object. ***************************************************************************/ void DOCH::AssertValid(ulong grf) { DOCH_PAR::AssertValid(0); AssertPo(&_bsf, 0); } /*************************************************************************** Mark memory used by the DOCH. ***************************************************************************/ void DOCH::MarkMem(void) { AssertThis(0); DOCH_PAR::MarkMem(); MarkMemObj(&_bsf); } #endif // DEBUG ================================================ FILE: kauai/tools/chmbmp.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /**************************************************************************** DOCMBMP methods. ****************************************************************************/ #include "ched.h" ASSERTNAME RTCLASS(DOCMBMP) RTCLASS(DCMBMP) /**************************************************************************** Constructor for a MBMP document. ****************************************************************************/ DOCMBMP::DOCMBMP(PDOCB pdocb, PCFL pcfl, CTG ctg, CNO cno) : DOCE(pdocb, pcfl, ctg, cno) { _pmbmp = pvNil; } /**************************************************************************** Destructor for a MBMP document. ****************************************************************************/ DOCMBMP::~DOCMBMP(void) { ReleasePpo(&_pmbmp); } /**************************************************************************** Static method to create a new MBMP document. ****************************************************************************/ PDOCMBMP DOCMBMP::PdocmbmpNew(PDOCB pdocb, PCFL pcfl, CTG ctg, CNO cno) { PDOCMBMP pdocmbmp; if (pvNil == (pdocmbmp = NewObj DOCMBMP(pdocb, pcfl, ctg, cno))) return pvNil; if (!pdocmbmp->_FInit()) { ReleasePpo(&pdocmbmp); return pvNil; } AssertPo(pdocmbmp, 0); return pdocmbmp; } /**************************************************************************** Create a new display gob for the MBMP document. ****************************************************************************/ PDDG DOCMBMP::PddgNew(PGCB pgcb) { return DCMBMP::PdcmbmpNew(this, _pmbmp, pgcb); } /*************************************************************************** Return the size of the thing on file. ***************************************************************************/ long DOCMBMP::_CbOnFile(void) { return _pmbmp->CbOnFile(); } /**************************************************************************** Write the data out. ****************************************************************************/ bool DOCMBMP::_FWrite(PBLCK pblck, bool fRedirect) { AssertThis(0); AssertPo(pblck, 0); return _pmbmp->FWrite(pblck); } /***************************************************************************** Read the MBMP. *****************************************************************************/ bool DOCMBMP::_FRead(PBLCK pblck) { Assert(pvNil == _pmbmp, "losing existing MBMP"); AssertPo(pblck, 0); _pmbmp = MBMP::PmbmpRead(pblck); return pvNil != _pmbmp; } #ifdef DEBUG /*************************************************************************** Assert the validity of a DOCMBMP. ***************************************************************************/ void DOCMBMP::AssertValid(ulong grf) { DOCMBMP_PAR::AssertValid(0); AssertPo(_pmbmp, 0); } /*************************************************************************** Mark memory for the DOCMBMP. ***************************************************************************/ void DOCMBMP::MarkMem(void) { AssertValid(0); DOCMBMP_PAR::MarkMem(); MarkMemObj(_pmbmp); } #endif // DEBUG /***************************************************************************** Constructor for a pic display gob. *****************************************************************************/ DCMBMP::DCMBMP(PDOCB pdocb, PMBMP pmbmp, PGCB pgcb) : DDG(pdocb, pgcb) { _pmbmp = pmbmp; } /***************************************************************************** Get the min-max for a DCMBMP. *****************************************************************************/ void DCMBMP::GetMinMax(RC *prcMinMax) { prcMinMax->Set(0, 0, kswMax, kswMax); } /***************************************************************************** Static method to create a new DCMBMP. *****************************************************************************/ PDCMBMP DCMBMP::PdcmbmpNew(PDOCB pdocb, PMBMP pmbmp, PGCB pgcb) { PDCMBMP pdcmbmp; if (pvNil == (pdcmbmp = NewObj DCMBMP(pdocb, pmbmp, pgcb))) return pvNil; if (!pdcmbmp->_FInit()) { ReleasePpo(&pdcmbmp); return pvNil; } pdcmbmp->Activate(fTrue); AssertPo(pdcmbmp, 0); return pdcmbmp; } /*************************************************************************** Draw the MBMP. ***************************************************************************/ void DCMBMP::Draw(PGNV pgnv, RC *prcClip) { RC rcMbmp, rcDdg; // retrieve appropriate rectangles GetRc(&rcDdg, cooLocal); _pmbmp->GetRc(&rcMbmp); rcMbmp.CenterOnRc(&rcDdg); // erase *prcClip pgnv->FillRc(prcClip, kacrWhite); pgnv->FillRcApt(&rcMbmp, &vaptLtGray, kacrLtGray, kacrWhite); // draw mbmp in GPT pgnv->DrawMbmp(_pmbmp, &rcMbmp); } #ifdef DEBUG /*************************************************************************** Assert the validity of a DCMBMP. ***************************************************************************/ void DCMBMP::AssertValid(ulong grf) { DCMBMP_PAR::AssertValid(0); AssertPo(_pmbmp, 0); } /*************************************************************************** Mark memory for the DCMBMP. ***************************************************************************/ void DCMBMP::MarkMem(void) { AssertValid(0); DCMBMP_PAR::MarkMem(); MarkMemObj(_pmbmp); } #endif // DEBUG ================================================ FILE: kauai/tools/chmerge.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Copyright (c) Microsoft Corporation Tool to merge two or more chunky files. ***************************************************************************/ #include #include "util.h" ASSERTNAME /*************************************************************************** Main routine. Returns non-zero iff there's an error. ***************************************************************************/ int __cdecl main(int cpszs, char *prgpszs[]) { schar chs; STN stn; FNI fniSrc, fniT; CKI cki; long icki; CNO cnoDst; PCFL pcflSrc; bool fPreOrder = fFalse; PCFL pcflMerge = pvNil; #ifdef UNICODE fprintf(stderr, "\nMicrosoft (R) Chunky File Merge Utility (Unicode; " Debug("Debug; ") __DATE__ "; " __TIME__ ")\n"); #else //! UNICODE fprintf(stderr, "\nMicrosoft (R) Chunky File Merge Utility (Ansi; " Debug("Debug; ") __DATE__ "; " __TIME__ ")\n"); #endif //! UNICODE fprintf(stderr, "Copyright (C) Microsoft Corp 1995. All rights reserved.\n\n"); for (prgpszs++; --cpszs > 0; prgpszs++) { chs = (*prgpszs)[0]; if (chs == '/' || chs == '-') { // -r means final chunks should be layed out in subgraph pre-order switch ((*prgpszs)[1]) { case 'r': case 'R': fPreOrder = fTrue; if (pvNil != pcflMerge) { fprintf(stderr, "-r must come before any file names"); goto LUsage; } if (pvNil == (pcflMerge = CFL::PcflCreateTemp())) goto LFail; break; default: goto LUsage; } } else if (pvNil == pcflMerge) { // this is the first file name stn.SetSzs(*prgpszs); if (!fniSrc.FBuildFromPath(&stn)) { fprintf(stderr, "Error: Bad file name: %s\n\n", *prgpszs); goto LUsage; } if (pvNil == (pcflMerge = CFL::PcflOpen(&fniSrc, fcflNil))) { fprintf(stderr, "Error: Couldn't open %s\n\n", *prgpszs); goto LUsage; } fniSrc.SetNil(); } else { // open the file to merge into pcflMerge stn.SetSzs(*prgpszs); if (!fniT.FBuildFromPath(&stn)) { fprintf(stderr, "Error: Bad file name: %s\n\n", *prgpszs); goto LUsage; } if (fniSrc.Ftg() == ftgNil) { fniSrc = fniT; continue; } // merge fniSrc into pcflMerge if (pvNil == (pcflSrc = CFL::PcflOpen(&fniSrc, fcflNil))) { fprintf(stderr, "Error: Couldn't open %s\n\n", *prgpszs); goto LUsage; } fniSrc = fniT; for (icki = 0; pcflSrc->FGetCki(icki, &cki); icki++) { if (!pcflSrc->FLoner(cki.ctg, cki.cno)) continue; if (!pcflSrc->FCopy(cki.ctg, cki.cno, pcflMerge, &cnoDst)) { fprintf(stderr, "Error: Copying chunk failed\n\n"); goto LFail; } if (cnoDst != cki.cno) { fprintf(stderr, "Error: Duplicate chunks: '%c%c%c%c', 0x%08X\n", B3Lw(cki.ctg), B2Lw(cki.ctg), B1Lw(cki.ctg), B0Lw(cki.ctg), cki.cno); } } ReleasePpo(&pcflSrc); } } if (fniSrc.Ftg() == ftgNil) { fprintf(stderr, "Error: Not enough chunky files\n\n"); goto LUsage; } if (fPreOrder) { FLO floSrc, floDst; if (!pcflMerge->FSave('CHMR')) goto LFail; pcflMerge->GetFni(&fniT); if (pvNil == (floSrc.pfil = FIL::PfilFromFni(&fniT))) { Bug("what happened?"); goto LFail; } floSrc.fp = 0; floSrc.cb = floSrc.pfil->FpMac(); if (pvNil == (floDst.pfil = FIL::PfilCreate(&fniSrc))) goto LFail; floDst.fp = 0; floDst.cb = floSrc.cb; if (!floSrc.FCopy(&floDst)) { floDst.pfil->SetTemp(fTrue); goto LFail; } } else { // do a save as of the file that we merged into. if (!pcflMerge->FSave('CHMR', &fniSrc)) goto LFail; } FIL::ShutDown(); return 0; LUsage: // print usage fprintf(stderr, "%s", "Usage: chmerge [-r] [ ...] \n\n"); LFail: FIL::ShutDown(); fprintf(stderr, "Something failed\n"); return 1; } #ifdef DEBUG bool _fEnableWarnings = fTrue; /*************************************************************************** Warning proc called by Warn() macro ***************************************************************************/ void WarnProc(PSZS pszsFile, long lwLine, PSZS pszsMessage) { if (_fEnableWarnings) { fprintf(stderr, "%s(%ld) : warning", pszsFile, lwLine); if (pszsMessage != pvNil) { fprintf(stderr, ": %s", pszsMessage); } fprintf(stderr, "\n"); } } /*************************************************************************** Returning true breaks into the debugger. ***************************************************************************/ bool FAssertProc(PSZS pszsFile, long lwLine, PSZS pszsMessage, void *pv, long cb) { fprintf(stderr, "An assert occurred: \n"); if (pszsMessage != pvNil) fprintf(stderr, " Message: %s\n", pszsMessage); if (pv != pvNil) { fprintf(stderr, " Address %x\n", pv); if (cb != 0) { fprintf(stderr, " Value: "); switch (cb) { default: { byte *pb; byte *pbLim; for (pb = (byte *)pv, pbLim = pb + cb; pb < pbLim; pb++) fprintf(stderr, "%02x", (int)*pb); } break; case 2: fprintf(stderr, "%04x", (int)*(short *)pv); break; case 4: fprintf(stderr, "%08lx", *(long *)pv); break; } printf("\n"); } } fprintf(stderr, " File: %s\n", pszsFile); fprintf(stderr, " Line: %ld\n", lwLine); return fFalse; } #endif // DEBUG ================================================ FILE: kauai/tools/chomp.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** CHOMP.CPP Main routine for Chomp, the chunky compiler ***************************************************************************/ #include "chomp.h" ASSERTNAME /*************************************************************************** Main routine for the stand-alone chunky compiler. Returns non-zero iff there's an error. ***************************************************************************/ int __cdecl main(int cpszs, char *prgpszs[]) { FNI fniSrc, fniDst; PCFL pcfl; STN stn; char *pszs; MSSIO mssioError(stderr); bool fCompile = fTrue; #ifdef UNICODE fprintf(stderr, "\nMicrosoft (R) Chunky File Compiler (Unicode; " Debug("Debug; ") __DATE__ "; " __TIME__ ")\n"); #else //! UNICODE fprintf(stderr, "\nMicrosoft (R) Chunky File Compiler (Ansi; " Debug("Debug; ") __DATE__ "; " __TIME__ ")\n"); #endif //! UNICODE fprintf(stderr, "Copyright (C) Microsoft Corp 1995. All rights reserved.\n\n"); for (prgpszs++; --cpszs > 0; prgpszs++) { pszs = *prgpszs; if (pszs[0] == '-' || pszs[0] == '/') { // option switch (pszs[1]) { case 'c': case 'C': fCompile = fTrue; break; case 'd': case 'D': fCompile = fFalse; break; default: fprintf(stderr, "Bad command line option\n\n"); goto LUsage; } if (pszs[2] != 0) { fprintf(stderr, "Bad command line option\n\n"); goto LUsage; } continue; } if (fniDst.Ftg() != ftgNil) { fprintf(stderr, "Too many files specified\n\n"); goto LUsage; } stn.SetSzs(pszs); if (!fniDst.FBuildFromPath(&stn)) { fprintf(stderr, "Bad file name\n\n"); goto LUsage; } if (fniSrc.Ftg() == ftgNil) { fniSrc = fniDst; fniDst.SetNil(); } } if (fniSrc.Ftg() == ftgNil) { fprintf(stderr, "Missing source file name\n\n"); goto LUsage; } if (fCompile) { CHCM chcm; if (fniDst.Ftg() == ftgNil) { fprintf(stderr, "Missing destination file name\n\n"); goto LUsage; } pcfl = chcm.PcflCompile(&fniSrc, &fniDst, &mssioError); FIL::ShutDown(); return pvNil == pcfl; } else { bool fRet; MSSIO mssioDump(stdout); MSFIL msfilDump; CHDC chdc; if (pvNil == (pcfl = CFL::PcflOpen(&fniSrc, fcflNil))) { fprintf(stderr, "Couldn't open source file as a chunky file\n\n"); goto LUsage; } if (fniDst.Ftg() != ftgNil) { PFIL pfil; if (pvNil == (pfil = FIL::PfilCreate(&fniDst))) { fprintf(stderr, "Couldn't create destination file\n\n"); FIL::ShutDown(); return 1; } msfilDump.SetFile(pfil); } fRet = chdc.FDecompile(pcfl, fniDst.Ftg() == ftgNil ? (PMSNK)&mssioDump : (PMSNK)&msfilDump, &mssioError); ReleasePpo(&pcfl); FIL::ShutDown(); return !fRet; } // print usage LUsage: fprintf(stderr, "%s", "Usage:\n" " chomp [/c] - compile chunky file\n" " chomp /d [] - decompile chunky file\n\n"); FIL::ShutDown(); return 1; } #ifdef DEBUG bool _fEnableWarnings = fTrue; /*************************************************************************** Warning proc called by Warn() macro ***************************************************************************/ void WarnProc(PSZS pszsFile, long lwLine, PSZS pszsMessage) { if (_fEnableWarnings) { fprintf(stderr, "%s(%ld) : warning", pszsFile, lwLine); if (pszsMessage != pvNil) { fprintf(stderr, ": %s", pszsMessage); } fprintf(stderr, "\n"); } } /*************************************************************************** Returning true breaks into the debugger. ***************************************************************************/ bool FAssertProc(PSZS pszsFile, long lwLine, PSZS pszsMessage, void *pv, long cb) { fprintf(stderr, "An assert occurred: \n"); if (pszsMessage != pvNil) fprintf(stderr, " Message: %s\n", pszsMessage); if (pv != pvNil) { fprintf(stderr, " Address %x\n", pv); if (cb != 0) { fprintf(stderr, " Value: "); switch (cb) { default: { byte *pb; byte *pbLim; for (pb = (byte *)pv, pbLim = pb + cb; pb < pbLim; pb++) fprintf(stderr, "%02x", (int)*pb); } break; case 2: fprintf(stderr, "%04x", (int)*(short *)pv); break; case 4: fprintf(stderr, "%08lx", *(long *)pv); break; } printf("\n"); } } fprintf(stderr, " File: %s\n", pszsFile); fprintf(stderr, " Line: %ld\n", lwLine); return fFalse; } #endif // DEBUG ================================================ FILE: kauai/tools/chomp.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** CHOMP.H Header file for Chomp, the chunky compiler ***************************************************************************/ #ifndef CHOMP_H #define CHOMP_H #include #include "frame.h" #include "mssio.h" #endif //! CHOMP_H ================================================ FILE: kauai/tools/chpic.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** DOCPIC methods. ***************************************************************************/ #include "ched.h" ASSERTNAME RTCLASS(DOCPIC) RTCLASS(DCPIC) /*************************************************************************** Constructor for picture document. ***************************************************************************/ DOCPIC::DOCPIC(PDOCB pdocb, PCFL pcfl, CTG ctg, CNO cno) : DOCE(pdocb, pcfl, ctg, cno) { _ppic = pvNil; } /*************************************************************************** Destructor for picture document. ***************************************************************************/ DOCPIC::~DOCPIC(void) { ReleasePpo(&_ppic); } /*************************************************************************** Static method to create a new picture document. ***************************************************************************/ PDOCPIC DOCPIC::PdocpicNew(PDOCB pdocb, PCFL pcfl, CTG ctg, CNO cno) { DOCPIC *pdocpic; if (pvNil == (pdocpic = NewObj DOCPIC(pdocb, pcfl, ctg, cno))) return pvNil; if (!pdocpic->_FInit()) { ReleasePpo(&pdocpic); return pvNil; } AssertPo(pdocpic, 0); return pdocpic; } /*************************************************************************** Create a new display gob for the document. ***************************************************************************/ PDDG DOCPIC::PddgNew(PGCB pgcb) { return DCPIC::PdcpicNew(this, _ppic, pgcb); } /*************************************************************************** Return the size of the thing on file. ***************************************************************************/ long DOCPIC::_CbOnFile(void) { return _ppic->CbOnFile(); } /*************************************************************************** Write the data out. ***************************************************************************/ bool DOCPIC::_FWrite(PBLCK pblck, bool fRedirect) { AssertThis(0); AssertPo(pblck, 0); return _ppic->FWrite(pblck); } /*************************************************************************** Read the PIC. ***************************************************************************/ bool DOCPIC::_FRead(PBLCK pblck) { Assert(_ppic == pvNil, "losing existing PIC"); AssertPo(pblck, 0); _ppic = PIC::PpicRead(pblck); return _ppic != pvNil; } #ifdef DEBUG /*************************************************************************** Assert the validity of a DOCPIC. ***************************************************************************/ void DOCPIC::AssertValid(ulong grf) { DOCPIC_PAR::AssertValid(0); AssertPo(_ppic, 0); } /*************************************************************************** Mark memory for the DOCPIC. ***************************************************************************/ void DOCPIC::MarkMem(void) { AssertValid(0); DOCPIC_PAR::MarkMem(); MarkMemObj(_ppic); } #endif // DEBUG /*************************************************************************** Constructor for a pic display gob. ***************************************************************************/ DCPIC::DCPIC(PDOCB pdocb, PPIC ppic, PGCB pgcb) : DDG(pdocb, pgcb) { _ppic = ppic; } /*************************************************************************** Get the min-max for a DCPIC. ***************************************************************************/ void DCPIC::GetMinMax(RC *prcMinMax) { prcMinMax->Set(20, 20, kswMax, kswMax); } /*************************************************************************** Static method to create a new DCPIC. ***************************************************************************/ PDCPIC DCPIC::PdcpicNew(PDOCB pdocb, PPIC ppic, PGCB pgcb) { PDCPIC pdcpic; if (pvNil == (pdcpic = NewObj DCPIC(pdocb, ppic, pgcb))) return pvNil; if (!pdcpic->_FInit()) { ReleasePpo(&pdcpic); return pvNil; } pdcpic->Activate(fTrue); AssertPo(pdcpic, 0); return pdcpic; } /*************************************************************************** Draw the picture. ***************************************************************************/ void DCPIC::Draw(PGNV pgnv, RC *prcClip) { RC rc, rcSrc; pgnv->GetRcSrc(&rcSrc); pgnv->FillRc(&rcSrc, kacrWhite); _ppic->GetRc(&rc); rcSrc.Inset(5, 5); rc.StretchToRc(&rcSrc); pgnv->DrawPic(_ppic, &rc); } #ifdef DEBUG /*************************************************************************** Assert the validity of a DCPIC. ***************************************************************************/ void DCPIC::AssertValid(ulong grf) { DCPIC_PAR::AssertValid(0); AssertPo(_ppic, 0); } /*************************************************************************** Mark memory for the DCPIC. ***************************************************************************/ void DCPIC::MarkMem(void) { AssertValid(0); DCPIC_PAR::MarkMem(); MarkMemObj(_ppic); } #endif // DEBUG ================================================ FILE: kauai/tools/chtop.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Chunky help topic editor documents and their DDGs. ***************************************************************************/ #include "chelp.h" ASSERTNAME RTCLASS(HEDO) RTCLASS(TSEL) RTCLASS(HEDG) RTCLASS(HETD) RTCLASS(HETG) RTCLASS(HTRU) #ifndef UNICODE #define SPELL #else // UNICODE #undef SPELL #endif // UNICODE BEGIN_CMD_MAP(HEDG, DDG) ON_CID_GEN(cidDeleteTopic, &HEDG::FCmdDeleteTopic, &HEDG::FEnableHedgCmd) ON_CID_GEN(cidEditTopic, &HEDG::FCmdEditTopic, &HEDG::FEnableHedgCmd) ON_CID_GEN(cidNewTopic, &HEDG::FCmdNewTopic, pvNil) ON_CID_GEN(cidExportText, &HEDG::FCmdExport, pvNil) ON_CID_GEN(cidFind, &HEDG::FCmdFind, &HEDG::FEnableHedgCmd) ON_CID_GEN(cidFindAgain, &HEDG::FCmdFind, &HEDG::FEnableHedgCmd) ON_CID_GEN(cidPrint, &HEDG::FCmdPrint, &HEDG::FEnableHedgCmd) ON_CID_GEN(cidSpellCheck, &HEDG::FCmdCheckSpelling, &HEDG::FEnableHedgCmd) ON_CID_GEN(cidDumpText, &HEDG::FCmdDump, &HEDG::FEnableHedgCmd) END_CMD_MAP_NIL() BEGIN_CMD_MAP(HETG, TXRG) ON_CID_GEN(cidGroupText, &HETG::FCmdGroupText, &HETG::FEnableHetgCmd) ON_CID_GEN(cidLineSpacing, &HETG::FCmdLineSpacing, pvNil) ON_CID_GEN(cidFormatPicture, &HETG::FCmdFormatPicture, &HETG::FEnableHetgCmd) ON_CID_GEN(cidFormatButton, &HETG::FCmdFormatButton, &HETG::FEnableHetgCmd) ON_CID_GEN(cidFormatEdit, &HETG::FCmdFormatEdit, &HETG::FEnableHetgCmd) ON_CID_GEN(cidInsertEdit, &HETG::FCmdInsertEdit, pvNil) ON_CID_GEN(cidEditHtop, &HETG::FCmdEditHtop, pvNil) ON_CID_GEN(cidNextTopic, &HETG::FCmdNextTopic, pvNil) ON_CID_GEN(cidPrevTopic, &HETG::FCmdNextTopic, pvNil) ON_CID_GEN(cidFind, &HETG::FCmdFind, pvNil) ON_CID_GEN(cidFindAgain, &HETG::FCmdFind, &HETG::FEnableHetgCmd) ON_CID_GEN(cidReplace, &HETG::FCmdFind, &HETG::FEnableHetgCmd) ON_CID_GEN(cidReplaceFind, &HETG::FCmdFind, &HETG::FEnableHetgCmd) ON_CID_GEN(cidFindNextTopic, &HETG::FCmdFind, pvNil) ON_CID_GEN(cidPrint, &HETG::FCmdPrint, pvNil) ON_CID_GEN(cidSpellCheck, &HETG::FCmdCheckSpelling, pvNil) ON_CID_GEN(cidSaveAs, pvNil, pvNil) ON_CID_GEN(cidSaveCopy, pvNil, pvNil) ON_CID_GEN(cidFontDialog, &HETG::FCmdFontDialog, pvNil) END_CMD_MAP_NIL() bool _fCaseSensitive; void _TokenizeStn(PSTN pstn); bool _FDoFindDlg(void); /*************************************************************************** Constructor for HEDO class. ***************************************************************************/ HEDO::HEDO(void) { } /*************************************************************************** Destructor for HEDO class. ***************************************************************************/ HEDO::~HEDO(void) { ReleasePpo(&_pcfl); } /*************************************************************************** Static method to create a new document based on the given fni. Use pfni == pvNil to create a new file, non-nil to open an existing file. ***************************************************************************/ PHEDO HEDO::PhedoNew(FNI *pfni, PRCA prca) { AssertNilOrPo(pfni, ffniFile); AssertPo(prca, 0); PCFL pcfl; PHEDO phedo; if (pvNil == pfni) pcfl = CFL::PcflCreateTemp(); else { AssertPo(pfni, ffniFile); // make sure no other docs are based on this pcfl. if (pvNil != DOCB::PdocbFromFni(pfni)) return pvNil; pcfl = CFL::PcflOpen(pfni, fcflNil); } if (pvNil == pcfl) return pvNil; if (pvNil == (phedo = NewObj HEDO())) { ReleasePpo(&pcfl); return pvNil; } phedo->_pcfl = pcfl; phedo->_prca = prca; AssertPo(phedo, 0); return phedo; } /*************************************************************************** Create a new DDG for the HEDO. ***************************************************************************/ PDDG HEDO::PddgNew(PGCB pgcb) { AssertThis(0); return HEDG::PhedgNew(this, _pcfl, pgcb); } /*************************************************************************** Get the current FNI for the doc. Return false if the doc is not currently based on an FNI (it's a new doc or an internal one). ***************************************************************************/ bool HEDO::FGetFni(FNI *pfni) { AssertThis(0); AssertBasePo(pfni, 0); if (_pcfl->FTemp()) return fFalse; _pcfl->GetFni(pfni); return fTrue; } /*************************************************************************** Save the document and optionally set this fni as the current one. If the doc is currently based on an FNI, pfni may be nil, indicating that this is a normal save (not save as). If pfni is not nil and fSetFni is false, this just writes a copy of the doc but doesn't change the doc one bit. ***************************************************************************/ bool HEDO::FSaveToFni(FNI *pfni, bool fSetFni) { AssertThis(0); if (!fSetFni && pvNil != pfni) return _pcfl->FSaveACopy(kctgChelp, pfni); if (!_pcfl->FSave(kctgChelp, pfni)) return fFalse; _fDirty = fFalse; _pcfl->SetTemp(fFalse); return fTrue; } /*************************************************************************** Ask the user what file they want to save to. ***************************************************************************/ bool HEDO::FGetFniSave(FNI *pfni) { AssertThis(0); AssertPo(pfni, 0); return FGetFniSaveMacro(pfni, 'CHN2', "\x9" "Save As: ", "", PszLit("All files\0*.*\0"), vwig.hwndApp); } /*************************************************************************** Invalidate all DDGs on this HEDO. Also dirties the document. Should be called by any code that edits the document. ***************************************************************************/ void HEDO::InvalAllDdg(CNO cno) { AssertThis(0); long ipddg; PDDG pddg; // mark the document dirty SetDirty(); // inform the DDGs for (ipddg = 0; pvNil != (pddg = PddgGet(ipddg)); ipddg++) { if (pddg->FIs(kclsHEDG)) ((PHEDG)pddg)->InvalCno(cno); else pddg->InvalRc(pvNil); } } /*************************************************************************** Export the help topics in their textual representation for compilation by chomp. REVIEW shonk: this code is a major hack and very fragile. ***************************************************************************/ bool HEDO::FExportText(void) { AssertThis(0); FNI fni; PFIL pfil; MSFIL msfil; if (!FGetFniSaveMacro(&fni, 'TEXT', "\x9" "Save As: ", "", PszLit("Chomp files\0*.cht\0"), vwig.hwndApp)) { return fFalse; } if (pvNil == (pfil = FIL::PfilCreate(&fni))) { vpappb->TGiveAlertSz(PszLit("Can't create destination file!"), bkOk, cokExclamation); return fFalse; } msfil.SetFile(pfil); if (!FExportHelpText(_pcfl, &msfil)) { vpappb->TGiveAlertSz(PszLit("Exporting file failed"), bkOk, cokExclamation); pfil->SetTemp(); ReleasePpo(&pfil); return fFalse; } ReleasePpo(&pfil); return fTrue; } /*************************************************************************** Resume searching in the topic at or after the given one, according to fAdvance. ***************************************************************************/ void HEDO::DoFindNext(PHETD phetd, CNO cno, bool fAdvance) { AssertThis(0); AssertNilOrPo(phetd, 0); Assert(pvNil == phetd || phetd->PdocbPar() == this, "bad topic doc"); long cpMin, cpLim; STN stn; PHETG phetg; PHETD phetdT; if (!vpstrg->FGet(kstidFind, &stn) || stn.Cch() <= 0) { vpappb->TGiveAlertSz(PszLit("Empty search string"), bkOk, cokExclamation); return; } if (cnoNil != cno) { if (pvNil != (phetd = HETD::PhetdFromChunk(this, cno))) phetd->AddRef(); else if (pvNil == (phetd = HETD::PhetdNew(this, _prca, _pcfl, cno))) { // couldn't load the thing return; } } else if (pvNil != phetd) phetd->AddRef(); if (fAdvance || pvNil == phetd) { phetdT = PhetdOpenNext(phetd); ReleasePpo(&phetd); phetd = phetdT; } while (pvNil != phetd) { // search phetd AssertPo(phetd, 0); if (phetd->FFind(stn.Prgch(), stn.Cch(), 0, &cpMin, &cpLim, _fCaseSensitive)) { // found it! if (phetd->Cddg() == 0) { // need to open a window onto the doc. phetd->PdmdNew(); } else phetd->ActivateDmd(); phetg = (PHETG)phetd->PddgActive(); if (pvNil != phetg) { AssertPo(phetg, 0); phetg->SetSel(cpMin, cpLim); phetg->ShowSel(); ReleasePpo(&phetd); return; } } phetdT = PhetdOpenNext(phetd); ReleasePpo(&phetd); phetd = phetdT; } } /*************************************************************************** Open the next topic subdocument. If phetd is nil, open the first one. ***************************************************************************/ PHETD HEDO::PhetdOpenNext(PHETD phetd) { AssertThis(0); AssertNilOrPo(phetd, 0); Assert(pvNil == phetd || phetd->PdocbPar() == this, "bad topic doc"); long icki; CKI cki; PDOCB pdocb; if (pvNil == phetd) { // start the search _pcfl->FGetIcki(kctgHelpTopic, 0, &icki); } else if (cnoNil != (cki.cno = phetd->Cno())) { _pcfl->FGetIcki(kctgHelpTopic, cki.cno + 1, &icki); phetd = pvNil; } if (pvNil == (pdocb = phetd)) { // icki is valid if (_pcfl->FGetCki(icki, &cki) && cki.ctg == kctgHelpTopic) { if (pvNil != (phetd = HETD::PhetdFromChunk(this, cki.cno))) { phetd->AddRef(); return phetd; } return HETD::PhetdNew(this, _prca, _pcfl, cki.cno); } // we're done with the saved topics - get the first // new unsaved one if (pvNil == (pdocb = PdocbChd())) return pvNil; if (pdocb->FIs(kclsHETD) && ((PHETD)pdocb)->Cno() == cnoNil) { pdocb->AddRef(); return (PHETD)pdocb; } } for (;;) { AssertPo(pdocb, 0); pdocb = pdocb->PdocbSib(); if (pvNil == pdocb) break; if (pdocb->FIs(kclsHETD) && ((PHETD)pdocb)->Cno() == cnoNil) { pdocb->AddRef(); return (PHETD)pdocb; } } return pvNil; } /*************************************************************************** Open the previous topic subdocument. If phetd is nil, open the last one. ***************************************************************************/ PHETD HEDO::PhetdOpenPrev(PHETD phetd) { AssertThis(0); AssertNilOrPo(phetd, 0); Assert(pvNil == phetd || phetd->PdocbPar() == this, "bad topic doc"); long icki; CKI cki; PDOCB pdocb; PHETD phetdNew; if (pvNil == phetd || (cki.cno = phetd->Cno()) == cnoNil) { // look for the last unsaved topic before phetd phetdNew = pvNil; for (pdocb = PdocbChd(); phetd != pdocb && pvNil != pdocb; pdocb = pdocb->PdocbSib()) { if (pdocb->FIs(kclsHETD) && ((PHETD)pdocb)->Cno() == cnoNil) phetdNew = (PHETD)pdocb; } if (pvNil != phetdNew) { AssertPo(phetdNew, 0); phetdNew->AddRef(); return phetdNew; } _pcfl->FGetIcki(kctgHelpTopic + 1, 0, &icki); } else _pcfl->FGetIcki(kctgHelpTopic, cki.cno, &icki); if (icki > 0 && _pcfl->FGetCki(icki - 1, &cki) && cki.ctg == kctgHelpTopic) { if (pvNil != (phetdNew = HETD::PhetdFromChunk(this, cki.cno))) { phetdNew->AddRef(); return phetdNew; } return HETD::PhetdNew(this, _prca, _pcfl, cki.cno); } return pvNil; } #ifdef DEBUG /*************************************************************************** Assert the validity of the HEDO. ***************************************************************************/ void HEDO::AssertValid(ulong grf) { HEDO_PAR::AssertValid(grf); AssertPo(_pcfl, 0); } #endif // DEBUG /*************************************************************************** Constructor for TSEL class. ***************************************************************************/ TSEL::TSEL(PCFL pcfl) { AssertPo(pcfl, 0); _pcfl = pcfl; _SetNil(); AssertThis(0); } /*************************************************************************** Set the selection to a nil selection. ***************************************************************************/ void TSEL::_SetNil(void) { _icki = ivNil; _cno = cnoNil; AssertThis(0); } /*************************************************************************** Set the selection to the given line. Return true iff the resulting selection is not nil. ***************************************************************************/ bool TSEL::FSetIcki(long icki) { AssertThis(0); CKI cki; if (icki == ivNil || !_pcfl->FGetCkiCtg(kctgHelpTopic, icki, &cki)) { _SetNil(); return fFalse; } _cno = cki.cno; _icki = icki; AssertThis(0); return fTrue; } /*************************************************************************** Set the selection to the given cno. ***************************************************************************/ bool TSEL::FSetCno(CNO cno) { AssertThis(0); _cno = cno; _icki = 0; Adjust(); AssertThis(0); return ivNil != _icki; } /*************************************************************************** Adjust the sel after an edit to the doc. Assume icki is wrong (except as indicators of invalid cno). ***************************************************************************/ void TSEL::Adjust(void) { AssertPo(_pcfl, 0); long dicki; if (ivNil == _icki || !_pcfl->FGetIcki(kctgHelpTopic, _cno, &_icki)) _SetNil(); _pcfl->FGetIcki(kctgHelpTopic, 0, &dicki); _icki -= dicki; AssertThis(0); } #ifdef DEBUG /*************************************************************************** Assert the validity of the sel. ***************************************************************************/ void TSEL::AssertValid(ulong grf) { TSEL_PAR::AssertValid(0); AssertPo(_pcfl, 0); Assert((_cno == cnoNil) == (_icki == ivNil), "nil values not in sync"); } #endif // DEBUG /*************************************************************************** Constructor for the HEDG. ***************************************************************************/ HEDG::HEDG(PHEDO phedo, PCFL pcfl, PGCB pgcb) : DDG(phedo, pgcb), _tsel(pcfl) { AssertPo(pcfl, 0); RC rc; achar ch = kchSpace; GNV gnv(this); _pcfl = pcfl; _onn = vpappb->OnnDefFixed(); gnv.SetOnn(_onn); gnv.GetRcFromRgch(&rc, &ch, 1, 0, 0); _dypLine = rc.Dyp(); _dxpChar = rc.Dxp(); _dypHeader = _dypLine; AssertThis(0); } /*************************************************************************** Static method to create a new HEDG. ***************************************************************************/ PHEDG HEDG::PhedgNew(PHEDO phedo, PCFL pcfl, PGCB pgcb) { PHEDG phedg; if (pvNil == (phedg = NewObj HEDG(phedo, pcfl, pgcb))) return pvNil; if (!phedg->_FInit()) { ReleasePpo(&phedg); return pvNil; } phedg->Activate(fTrue); AssertPo(phedg, 0); return phedg; } /*************************************************************************** We're being activated or deactivated, invert the sel. ***************************************************************************/ void HEDG::_Activate(bool fActive) { AssertThis(0); DDG::_Activate(fActive); GNV gnv(this); _DrawSel(&gnv); } /*************************************************************************** Invalidate the display from cno to the end of the display. If we're the active HEDG, also redraw. ***************************************************************************/ void HEDG::InvalCno(CNO cno) { AssertThis(0); long icki, ickiT; RC rc; // we need to recalculate the lnLim _pcfl->FGetIcki(kctgHelpTopic, cno, &icki); _pcfl->FGetIcki(kctgHelpTopic, 0, &ickiT); icki -= ickiT; // correct the sel ickiT = _tsel.Icki(); if (ivNil != ickiT && ickiT >= icki) _tsel.Adjust(); GetRc(&rc, cooLocal); rc.ypTop = LwMax(0, _YpFromIcki(icki)); if (rc.FEmpty()) return; if (_fActive) { ValidRc(&rc, kginDraw); InvalRc(&rc, kginDraw); } else InvalRc(&rc); } /*************************************************************************** Draw the topic list. ***************************************************************************/ void HEDG::Draw(PGNV pgnv, RC *prcClip) { AssertThis(0); AssertPo(pgnv, 0); AssertVarMem(prcClip); STN stn, stnT; RC rc; long yp, xp; long icki; CKI cki; pgnv->ClipRc(prcClip); pgnv->FillRc(prcClip, kacrWhite); pgnv->SetOnn(_onn); xp = _XpFromIch(0); // draw the header stn = PszLit(" Hex CNO Name"); pgnv->DrawStn(&stn, xp, 0); pgnv->GetRcSrc(&rc); rc.ypTop = _dypHeader - 1; rc.ypBottom = _dypHeader; pgnv->FillRc(&rc, kacrBlack); // use the sel to find the first icki to draw icki = _IckiFromYp(LwMax(prcClip->ypTop, _dypHeader)); for (yp = _YpFromIcki(icki); yp < prcClip->ypBottom && _pcfl->FGetCkiCtg(kctgHelpTopic, icki, &cki); icki++) { // draw the cki description _pcfl->FGetName(cki.ctg, cki.cno, &stnT); stn.FFormatSz(PszLit("%08x %10d \"%s\""), cki.cno, cki.cno, &stnT); pgnv->DrawStn(&stn, xp, yp); yp += _dypLine; } // draw the selection if (_fActive) _DrawSel(pgnv); } /*************************************************************************** Hilite the selection (if there is one) ***************************************************************************/ void HEDG::_DrawSel(PGNV pgnv) { AssertThis(0); AssertPo(pgnv, 0); RC rc; long icki; if (ivNil == (icki = _tsel.Icki())) return; pgnv->GetRcSrc(&rc); rc.ypTop = _YpFromIcki(icki); rc.ypBottom = rc.ypTop + _dypLine; rc.ypTop = LwMax(rc.ypTop, _dypHeader); pgnv->HiliteRc(&rc, kacrWhite); } /*************************************************************************** Set the selection to the given icki or cno. If cno is not cnoNil, this uses the cno, otherwise it uses the icki. If both are nil, it clears the selection. ***************************************************************************/ void HEDG::_SetSel(long icki, CNO cno) { AssertThis(0); if (cnoNil != cno) { TSEL tsel(_pcfl); tsel.FSetCno(cno); icki = tsel.Icki(); } if (_tsel.Icki() == icki) return; GNV gnv(this); // erase the old sel if (_fActive) _DrawSel(&gnv); // set the new sel and draw it _tsel.FSetIcki(icki); if (_fActive) _DrawSel(&gnv); } /*************************************************************************** Scroll the sel into view. ***************************************************************************/ void HEDG::_ShowSel(void) { AssertThis(0); RC rc; long icki, ccki; if (ivNil == (icki = _tsel.Icki())) return; if (icki < _scvVert) _Scroll(scaNil, scaToVal, 0, icki); else { _GetContent(&rc); ccki = LwMax(_scvVert + 1, _IckiFromYp(rc.ypBottom)); if (icki >= ccki) _Scroll(scaNil, scaToVal, 0, _scvVert + icki + 1 - ccki); } } /*************************************************************************** Handle a mouse down in our content. ***************************************************************************/ void HEDG::MouseDown(long xp, long yp, long cact, ulong grfcust) { AssertThis(0); long icki, ickiNew; if (ivNil != (ickiNew = _IckiFromYp(yp))) { if ((icki = _tsel.Icki()) != ickiNew) _SetSel(ickiNew); ickiNew = _tsel.Icki(); } if (!_fActive) Activate(fTrue); if (ivNil == ickiNew) return; if (cact > 1 && icki == ickiNew) _EditTopic(_tsel.Cno()); } /*************************************************************************** Handle key input. ***************************************************************************/ bool HEDG::FCmdKey(PCMD_KEY pcmd) { AssertThis(0); long icki, ccki, ickiNew, cckiPage; RC rc; icki = _tsel.Icki(); ccki = _pcfl->CckiCtg(kctgHelpTopic); switch (pcmd->vk) { case kvkDown: ickiNew = (0 > icki) ? 0 : (icki + 1) % ccki; goto LChangeSel; case kvkUp: ickiNew = (0 > icki) ? ccki - 1 : (icki + ccki - 1) % ccki; goto LChangeSel; case kvkPageUp: case kvkPageDown: _GetContent(&rc); cckiPage = LwMax(1, rc.Dyp() / _dypLine - 1); if (pcmd->vk == kvkPageDown) ickiNew = LwMin(ccki - 1, ivNil == icki ? cckiPage : icki + cckiPage); else ickiNew = LwMax(0, ivNil == icki ? 0 : icki - cckiPage); goto LChangeSel; case kvkHome: ickiNew = 0; goto LChangeSel; case kvkEnd: ickiNew = ccki - 1; LChangeSel: if (ccki == 0) { Assert(ivNil == icki, "no lines, but non-nil sel"); break; } AssertIn(ickiNew, 0, ccki); _SetSel(ickiNew); _ShowSel(); break; case kvkDelete: case kvkBack: if (ivNil != icki && tYes == vpappb->TGiveAlertSz(PszLit("Are you sure you want to delete this topic?"), bkYesNo, cokQuestion)) { _ClearSel(); } break; case kvkReturn: // edit the topic if (ivNil != icki) _EditTopic(_tsel.Cno()); break; default: break; } return fTrue; } /*************************************************************************** Return the maximum for the indicated scroll bar. ***************************************************************************/ long HEDG::_ScvMax(bool fVert) { AssertThis(0); if (fVert) { RC rc; _GetContent(&rc); return LwMax(0, _pcfl->CckiCtg(kctgHelpTopic) - rc.Dyp() / _dypLine + 1); } return 320; } /*************************************************************************** Handle enabling/disabling HEDG commands. ***************************************************************************/ bool HEDG::FEnableHedgCmd(PCMD pcmd, ulong *pgrfeds) { AssertThis(0); AssertVarMem(pcmd); AssertVarMem(pgrfeds); CKI cki; STN stn; *pgrfeds = fedsEnable; switch (pcmd->cid) { default: if (ivNil == _tsel.Icki()) *pgrfeds = fedsDisable; break; case cidFindAgain: if (!vpstrg->FGet(kstidFind, &stn) || stn.Cch() <= 0) *pgrfeds = fedsDisable; // fall thru case cidFind: case cidPrint: case cidSpellCheck: case cidDumpText: if (!_pcfl->FGetCkiCtg(kctgHelpTopic, 0, &cki) && pvNil == Phedo()->PdocbChd()) { *pgrfeds = fedsDisable; } break; } return fTrue; } /*************************************************************************** Handle command to delete a chunk. ***************************************************************************/ bool HEDG::FCmdDeleteTopic(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); _ClearSel(); return fTrue; } /*************************************************************************** Handles commands to edit a topic. ***************************************************************************/ bool HEDG::FCmdEditTopic(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); if (ivNil == _tsel.Icki()) return fTrue; _EditTopic(_tsel.Cno()); return fTrue; } /*************************************************************************** Create and edit a new topic in the help file. ***************************************************************************/ bool HEDG::FCmdNewTopic(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); _EditTopic(cnoNil); return fTrue; } /*************************************************************************** Create and edit a new topic in the help file. ***************************************************************************/ bool HEDG::FCmdExport(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); Phedo()->FExportText(); return fTrue; } /*************************************************************************** Opens a window onto the given topic. ***************************************************************************/ void HEDG::_EditTopic(CNO cno) { AssertThis(0); PHETD phetd; // check for a hetd already open on the chunk. if (cnoNil != cno && pvNil != (phetd = HETD::PhetdFromChunk(_pdocb, cno))) { phetd->ActivateDmd(); return; } phetd = HETD::PhetdNew(_pdocb, Phedo()->Prca(), _pcfl, cno); if (pvNil != phetd) phetd->PdmdNew(); ReleasePpo(&phetd); } /*************************************************************************** Copy the selection to a new document. ***************************************************************************/ bool HEDG::_FCopySel(PDOCB *ppdocb) { AssertThis(0); AssertNilOrVarMem(ppdocb); CNO cno; PHEDO phedo; if (ivNil == _tsel.Icki()) return fFalse; if (pvNil == ppdocb) return fTrue; if (pvNil != (phedo = HEDO::PhedoNew(pvNil, Phedo()->Prca())) && !_pcfl->FCopy(kctgHelpTopic, _tsel.Cno(), phedo->Pcfl(), &cno)) { ReleasePpo(&phedo); } *ppdocb = phedo; return pvNil != *ppdocb; } /*************************************************************************** Delete the current selection. ***************************************************************************/ void HEDG::_ClearSel(void) { AssertThis(0); CNO cno; if (ivNil == _tsel.Icki()) return; cno = _tsel.Cno(); _pcfl->Delete(kctgHelpTopic, cno); Phedo()->InvalAllDdg(cno); HETD::CloseDeletedHetd(_pdocb); } /*************************************************************************** Paste all the topics of the given document into the current document. ***************************************************************************/ bool HEDG::_FPaste(PCLIP pclip, bool fDoIt, long cid) { AssertThis(0); AssertPo(pclip, 0); PHEDO phedo; PCFL pcfl; long icki; CKI cki; CNO cnoSel; bool fFailed = fFalse; if (cidPaste != cid || !pclip->FGetFormat(kclsHEDO)) return fFalse; if (!fDoIt) return fTrue; if (!pclip->FGetFormat(kclsHEDO, (PDOCB *)&phedo)) return fFalse; if (pvNil == (pcfl = phedo->Pcfl()) || pcfl->CckiCtg(kctgHelpTopic) <= 0) { ReleasePpo(&phedo); return fTrue; } _SetSel(ivNil); for (icki = 0; pcfl->FGetCkiCtg(kctgHelpTopic, icki, &cki); icki++) fFailed |= !pcfl->FClone(cki.ctg, cki.cno, _pcfl, &cnoSel); Phedo()->InvalAllDdg(0); if (fFailed) vpappb->TGiveAlertSz(PszLit("Couldn't paste everything"), bkOk, cokExclamation); else { _SetSel(ivNil, cnoSel); _ShowSel(); } ReleasePpo(&phedo); return fTrue; } /*************************************************************************** Get the content part of the HEDG minus header (and any future footer). ***************************************************************************/ void HEDG::_GetContent(RC *prc) { GetRc(prc, cooLocal); prc->ypTop += _dypHeader; } /*************************************************************************** Return the icki that corresponds with the given yp value. If yp is in the header, returns ivNil. ***************************************************************************/ long HEDG::_IckiFromYp(long yp) { AssertThis(0); if (yp < _dypHeader) return ivNil; return _scvVert + (yp - _dypHeader) / _dypLine; } /*************************************************************************** Perform a scroll according to scaHorz and scaVert. ***************************************************************************/ void HEDG::_Scroll(long scaHorz, long scaVert, long scvHorz, long scvVert) { AssertThis(0); RC rc; long dscvHorz, dscvVert; long dxp, dyp; _GetContent(&rc); dscvHorz = dscvVert = 0; dxp = 0; switch (scaHorz) { case scaPageUp: dscvHorz = -LwMax(1, LwMulDiv(rc.Dxp(), 9, 10) / _dxpChar); goto LHorz; case scaPageDown: dscvHorz = LwMax(1, LwMulDiv(rc.Dxp(), 9, 10) / _dxpChar); goto LHorz; case scaLineUp: dscvHorz = -LwMax(1, rc.Dxp() / 10 / _dxpChar); goto LHorz; case scaLineDown: dscvHorz = LwMax(1, rc.Dxp() / 10 / _dxpChar); goto LHorz; case scaToVal: dscvHorz = scvHorz - _scvHorz; LHorz: dscvHorz = LwBound(_scvHorz + dscvHorz, 0, _ScvMax(fFalse) + 1) - _scvHorz; _scvHorz += dscvHorz; dxp = LwMul(dscvHorz, _dxpChar); break; } dyp = 0; switch (scaVert) { case scaPageUp: dscvVert = -LwMax(1, rc.Dyp() / _dypLine - 1); goto LVert; case scaPageDown: dscvVert = LwMax(1, rc.Dyp() / _dypLine - 1); goto LVert; case scaLineUp: dscvVert = -1; goto LVert; case scaLineDown: dscvVert = 1; goto LVert; case scaToVal: dscvVert = scvVert - _scvVert; LVert: dscvVert = LwBound(_scvVert + dscvVert, 0, _ScvMax(fTrue) + 1) - _scvVert; _scvVert += dscvVert; dyp = LwMul(dscvVert, _dypLine); break; } _SetScrollValues(); if (dxp != 0 || dyp != 0) _ScrollDxpDyp(dxp, dyp); } /*************************************************************************** Move the bits in the window. ***************************************************************************/ void HEDG::_ScrollDxpDyp(long dxp, long dyp) { AssertThis(0); RC rc; _GetContent(&rc); Scroll(&rc, -dxp, -dyp, kginDraw); if (0 != dxp) { // scroll the header rc.ypTop = 0; rc.ypBottom = _dypHeader - 1; Scroll(&rc, -dxp, 0, kginDraw); } } /*************************************************************************** Do a find in some topics. ***************************************************************************/ bool HEDG::FCmdFind(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); switch (pcmd->cid) { case cidFind: if (!_FDoFindDlg()) break; // fall thru case cidFindAgain: Phedo()->DoFindNext(pvNil, _tsel.Cno(), fFalse); break; } return fTrue; } /*************************************************************************** Print some topics. ***************************************************************************/ bool HEDG::FCmdPrint(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); #ifdef WIN const long kdypFontTitle = 9; const long kdzpBox = 2; long icki; CKI cki; PDOCB pdocb; PRINTDLG pd; DOCINFO di; STN stn, stnT; STN stnDoc; RC rcPage, rcSrc, rcDst, rcT; long onnDef; long yp, ypTopic; long dxpTopic; long dypLine, dyp; long ilin; HTOP htop; PHETD phetd = pvNil; PHETG phetg = pvNil; PGPT pgpt = pvNil; PGNV pgnv = pvNil; long lwPage = 1; bool fInPage = fFalse; PHEDO phedo = Phedo(); // set up the print dialog structure ClearPb(&pd, size(pd)); pd.lStructSize = size(pd); pd.Flags = PD_RETURNDC | PD_HIDEPRINTTOFILE | PD_NOPAGENUMS | PD_NOSELECTION | PD_USEDEVMODECOPIES; pd.hwndOwner = vwig.hwndApp; if (!PrintDlg(&pd)) goto LFail; // see if the device supports BitBlt if (!(GetDeviceCaps(pd.hDC, RASTERCAPS) & RC_BITBLT)) goto LFail; if (pvNil == (pgpt = GPT::PgptNew(pd.hDC))) goto LFail; if (pvNil == (pgnv = NewObj GNV(pgpt))) goto LFail; rcDst.Zero(); rcDst.xpRight = GetDeviceCaps(pd.hDC, LOGPIXELSX); rcDst.ypBottom = GetDeviceCaps(pd.hDC, LOGPIXELSY); pgnv->SetRcDst(&rcDst); rcSrc.Zero(); rcSrc.xpRight = kdzpInch; rcSrc.ypBottom = kdzpInch; pgnv->SetRcSrc(&rcSrc); phedo->GetName(&stnDoc); di.cbSize = size(di); di.lpszDocName = stnDoc.Psz(); di.lpszOutput = pvNil; if (SP_ERROR == StartDoc(pd.hDC, &di)) goto LFail; rcPage.Set(0, 0, GetDeviceCaps(pd.hDC, HORZRES), GetDeviceCaps(pd.hDC, VERTRES)); rcPage.Map(&rcDst, &rcSrc); rcPage.Inset(kdzpInch, kdzpInch); onnDef = vpappb->OnnDefVariable(); if (0 >= StartPage(pd.hDC)) goto LFail; yp = rcPage.ypTop; _StartPage(pgnv, &stnDoc, lwPage++, &rcPage, onnDef); // set the topic info font and get its height pgnv->SetFont(onnDef, fontNil, kdypFontTitle, tahLeft, tavTop); pgnv->GetRcFromRgch(&rcT, pvNil, 0, 0, 0); dypLine = rcT.Dyp(); // print the topics for (icki = 0, pdocb = pvNil;;) { if (ivNil != icki && _pcfl->FGetCkiCtg(kctgHelpTopic, icki++, &cki)) { // get a saved topic if (pvNil != (phetd = HETD::PhetdFromChunk(phedo, cki.cno))) phetd->AddRef(); else if (pvNil == (phetd = HETD::PhetdNew(phedo, phedo->Prca(), _pcfl, cki.cno))) { // couldn't load the thing continue; } } else { // get an unsaved topic icki = ivNil; if (pvNil == pdocb) pdocb = Phedo()->PdocbChd(); else pdocb = pdocb->PdocbSib(); if (pvNil == pdocb) break; AssertPo(pdocb, 0); if (!pdocb->FIs(kclsHETD) || ((PHETD)pdocb)->Cno() != cnoNil) continue; phetd = (PHETD)pdocb; } AssertPo(phetd, 0); if (pvNil == (phetg = (PHETG)phetd->PddgGet(0))) { // need to open a window onto the doc. GCB gcb(khidDdg, this); if (pvNil == (phetg = (PHETG)phetd->PddgNew(&gcb))) goto LFail; } else phetg->AddRef(); AssertPo(phetg, 0); phetd->GetHtop(&htop); dxpTopic = phetd->DxpDef(); if (yp > rcPage.ypTop) { // see if we should start a new page before the topic yp += 3 * dypLine; if (yp + phetg->DypLine(0) + dypLine * 3 > rcPage.ypBottom) { // start a new page if (0 >= EndPage(pd.hDC)) goto LFail; if (0 >= StartPage(pd.hDC)) goto LFail; yp = rcPage.ypTop; _StartPage(pgnv, &stnDoc, lwPage++, &rcPage, onnDef); } } // draw the topic header stuff rcT = rcPage; rcT.ypTop = yp; rcT.ypBottom = yp + 3 * dypLine; rcT.Inset(-3, -3); pgnv->SetFont(onnDef, fontNil, kdypFontTitle, tahLeft, tavTop); phetd->GetHtopStn(1, &stnT); stn.FFormatSz(PszLit("Topic 0x%08x (%s): "), phetd->Cno(), &stnT); phetd->GetHtopStn(-1, &stnT); stn.FAppendStn(&stnT); pgnv->DrawStn(&stn, rcPage.xpLeft, yp); yp += dypLine; phetd->GetHtopStn(4, &stnT); stn.FFormatSz(PszLit("Script: 0x%08x (%s); Sound: '%f', 0x%08x ("), htop.cnoScript, &stnT, htop.ckiSnd.ctg, htop.ckiSnd.cno); phetd->GetHtopStn(5, &stnT); stn.FAppendStn(&stnT); stn.FAppendCh(ChLit(')')); pgnv->DrawStn(&stn, rcPage.xpLeft, yp); yp += dypLine; stn.FFormatSz(PszLit("Topic Width: %d"), dxpTopic); pgnv->DrawStn(&stn, rcPage.xpLeft, yp); yp += 2 * dypLine; ypTopic = yp; pgnv->SetPenSize(1, 1); pgnv->FrameRc(&rcT, kacrBlack); // draw the start box rcT.Set(rcPage.xpLeft, yp - kdzpBox, rcPage.xpLeft + dxpTopic, yp); pgnv->FillRc(&rcT, kacrBlack); // draw the lines for (ilin = 0;; ilin++) { dyp = phetg->DypLine(ilin); if (0 >= dyp) break; if (ilin > 0 && yp + dyp > rcPage.ypBottom) { // end the page and start a new one ypTopic = -1; // draw the topic end box rcT.Set(rcPage.xpLeft, yp, rcPage.xpLeft + dxpTopic, yp + kdzpBox / 2); pgnv->FillRcApt(&rcT, &vaptGray, kacrGray, kacrWhite); if (0 >= EndPage(pd.hDC)) goto LFail; if (0 >= StartPage(pd.hDC)) goto LFail; yp = rcPage.ypTop; // draw the start box rcT.Set(rcPage.xpLeft, yp - kdzpBox / 2, rcPage.xpLeft + dxpTopic, yp); pgnv->FillRcApt(&rcT, &vaptGray, kacrGray, kacrWhite); _StartPage(pgnv, &stnDoc, lwPage++, &rcPage, onnDef); } phetg->DrawLines(pgnv, &rcPage, rcPage.xpLeft, yp, ilin, ilin + 1, ftxtgNoColor); yp += dyp; } // draw the topic end box rcT.Set(rcPage.xpLeft, yp, rcPage.xpLeft + dxpTopic, yp + kdzpBox); pgnv->FillRc(&rcT, kacrBlack); ReleasePpo(&phetg); ReleasePpo(&phetd); } if (0 >= EndPage(pd.hDC)) goto LFail; // end the print job if (0 >= EndDoc(pd.hDC)) { LFail: vpappb->TGiveAlertSz(PszLit("Printing failed"), bkOk, cokExclamation); ReleasePpo(&phetd); ReleasePpo(&phetg); } if (pd.hDC != hNil) DeleteDC(pd.hDC); if (pd.hDevMode != hNil) GlobalFree(pd.hDevMode); if (pd.hDevNames != hNil) GlobalFree(pd.hDevNames); ReleasePpo(&pgnv); ReleasePpo(&pgpt); #endif // WIN return fTrue; } #ifdef WIN /*************************************************************************** Print the page number and document name. ***************************************************************************/ void HEDG::_StartPage(PGNV pgnv, PSTN pstnDoc, long lwPage, RC *prcPage, long onn) { STN stn; // draw the document name and page number pgnv->SetFont(onn, fontNil, 10, tahLeft, tavTop); pgnv->DrawStn(pstnDoc, prcPage->xpLeft, prcPage->ypBottom + 12); stn.FFormatSz(PszLit("- %d -"), lwPage); pgnv->SetFont(onn, fontNil, 10, tahCenter, tavTop); pgnv->DrawStn(&stn, prcPage->XpCenter(), prcPage->ypBottom + 12); } #endif // WIN /*************************************************************************** Check spelling in topics from the selected one on. ***************************************************************************/ bool HEDG::FCmdCheckSpelling(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); #ifdef SPELL CNO cno; PDMD pdmd; long cactT; PHETD phetd, phetdT; PHETG phetg; long cactTotal = 0; bool fContinue = fTrue; PHEDO phedo = Phedo(); cno = _tsel.Cno(); if (cnoNil == cno) phetd = phedo->PhetdOpenNext(pvNil); else { if (pvNil != (phetd = HETD::PhetdFromChunk(phedo, cno))) phetd->AddRef(); else phetd = HETD::PhetdNew(phedo, phedo->Prca(), _pcfl, cno); } if (pvNil != vpsplc) { vpsplc->FlushIgnoreList(); vpsplc->FlushChangeList(fTrue); } while (pvNil != phetd) { // check phetd AssertPo(phetd, 0); if (phetd->Cddg() == 0) { // need to open a window onto the doc. pdmd = phetd->PdmdNew(); } else { phetd->ActivateDmd(); pdmd = pvNil; } phetg = (PHETG)phetd->PddgActive(); if (pvNil != phetg) { AssertPo(phetg, 0); fContinue = phetg->FCheckSpelling(&cactT); cactTotal += cactT; } if (pdmd != pvNil) { if (phetd->FQueryCloseDmd(pdmd)) ReleasePpo(&pdmd); } phetdT = fContinue ? phedo->PhetdOpenNext(phetd) : pvNil; ReleasePpo(&phetd); phetd = phetdT; } if (fContinue) { STN stn; if (cactTotal == 0) stn = PszLit("No corrections made."); else stn.FFormatSz(PszLit("Corrected %d words."), cactTotal); vpappb->TGiveAlertSz(stn.Psz(), bkOk, cokExclamation); } #else //! SPELL vpappb->TGiveAlertSz(PszLit("Spell checking not available"), bkOk, cokExclamation); #endif //! SPELL return fTrue; } /*************************************************************************** Dump the text of all topics. ***************************************************************************/ bool HEDG::FCmdDump(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); const long kcchMax = 1024; achar rgch[kcchMax]; const long kcchEop = MacWin(1, 2); achar rgchEop[] = {kchReturn, kchLineFeed}; long icki; CKI cki; PDOCB pdocb; FNI fni; PFIL pfil; long cpMac; long cp; long cch; bool fFirst; FP fpCur; PHETD phetd = pvNil; PHEDO phedo = Phedo(); if (!FGetFniSaveMacro(&fni, kftgText, "\pFile to dump text to:", "\pDump", PszLit("Text Files\0*.txt\0"), vwig.hwndApp)) { return fTrue; } if (pvNil == (pfil = FIL::PfilCreate(&fni))) return fTrue; fpCur = 0; #ifdef UNICODE rgch[0] = kchwUnicode; pfil->FWriteRgbSeq(rgch, size(achar), &fpCur); #endif // UNICODE // dump the topics for (icki = 0, pdocb = pvNil, fFirst = fTrue;;) { if (ivNil != icki && _pcfl->FGetCkiCtg(kctgHelpTopic, icki++, &cki)) { // get a saved topic if (pvNil != (phetd = HETD::PhetdFromChunk(phedo, cki.cno))) phetd->AddRef(); else if (pvNil == (phetd = HETD::PhetdNew(phedo, phedo->Prca(), _pcfl, cki.cno))) { // couldn't load the thing continue; } } else { // get an unsaved topic icki = ivNil; if (pvNil == pdocb) pdocb = Phedo()->PdocbChd(); else pdocb = pdocb->PdocbSib(); if (pvNil == pdocb) break; AssertPo(pdocb, 0); if (!pdocb->FIs(kclsHETD) || ((PHETD)pdocb)->Cno() != cnoNil) continue; phetd = (PHETD)pdocb; } AssertPo(phetd, 0); if (!fFirst) { pfil->FWriteRgbSeq(rgchEop, kcchEop, &fpCur); pfil->FWriteRgbSeq(PszLit("------------------------------"), 30 * size(achar), &fpCur); pfil->FWriteRgbSeq(rgchEop, kcchEop, &fpCur); pfil->FWriteRgbSeq(rgchEop, kcchEop, &fpCur); } else fFirst = fFalse; cpMac = phetd->CpMac() - 1; for (cp = 0; cp < cpMac; cp += cch) { cch = LwMin(cpMac - cp, kcchMax); phetd->FetchRgch(cp, cch, rgch); pfil->FWriteRgbSeq(rgch, cch * size(achar), &fpCur); } pfil->FWriteRgbSeq(rgchEop, kcchEop, &fpCur); ReleasePpo(&phetd); } ReleasePpo(&pfil); return fTrue; } #ifdef DEBUG /*************************************************************************** Assert the validity of an object. ***************************************************************************/ void HEDG::AssertValid(ulong grf) { HEDG_PAR::AssertValid(0); AssertPo(&_tsel, 0); AssertPo(_pcfl, 0); } #endif // DEBUG /*************************************************************************** Static method: For all HETD children of the DOCB, checks if the chunk still exists and nukes the HETD if not. ***************************************************************************/ void HETD::CloseDeletedHetd(PDOCB pdocb) { PDOCB pdocbNext; PHETD phetd; for (pdocb = pdocb->PdocbChd(); pvNil != pdocb; pdocb = pdocbNext) { pdocbNext = pdocb->PdocbSib(); if (!pdocb->FIs(kclsHETD)) continue; phetd = (PHETD)pdocb; // NOTE: can't assert the phetd here because the chunk may be gone // AssertPo(phetd, 0); AssertBasePo(phetd, 0); AssertNilOrPo(phetd->_pcfl, 0); if (phetd->_cno != cnoNil && pvNil != phetd->_pcfl && !phetd->_pcfl->FFind(kctgHelpTopic, phetd->_cno)) { phetd->CloseAllDdg(); } else AssertPo(phetd, 0); } } /*************************************************************************** Static method to look for a HETD for the given chunk. ***************************************************************************/ PHETD HETD::PhetdFromChunk(PDOCB pdocb, CNO cno) { AssertPo(pdocb, 0); Assert(cnoNil != cno, 0); PHETD phetd; for (pdocb = pdocb->PdocbChd(); pvNil != pdocb; pdocb = pdocb->PdocbSib()) { if (!pdocb->FIs(kclsHETD)) continue; phetd = (PHETD)pdocb; AssertPo(phetd, 0); if (phetd->_cno == cno) return phetd; } return pvNil; } /*************************************************************************** Constructor for a help topic document. ***************************************************************************/ HETD::HETD(PDOCB pdocb, PRCA prca, PCFL pcfl, CNO cno) : TXHD(prca, pdocb) { AssertNilOrPo(pcfl, 0); _pcfl = pcfl; _cno = cno; } /*************************************************************************** Destructor for a help topic editing document. ***************************************************************************/ HETD::~HETD(void) { ReleasePpo(&_pgst); } /*************************************************************************** Static method to read a help topic document from the given (pcfl, cno) and using the given prca as the source for pictures and buttons. ***************************************************************************/ PHETD HETD::PhetdNew(PDOCB pdocb, PRCA prca, PCFL pcfl, CNO cno) { AssertNilOrPo(pdocb, 0); AssertPo(prca, 0); AssertNilOrPo(pcfl, 0); Assert(pcfl != pvNil || cnoNil == cno, "non-nil cno with nil CFL"); PHETD phetd; if (pvNil == (phetd = NewObj HETD(pdocb, prca, pcfl, cno))) return pvNil; if ((cnoNil == cno) ? !phetd->_FInit() : !phetd->_FReadChunk(pcfl, kctgHelpTopic, cno, fTrue)) { PushErc(ercHelpReadFailed); ReleasePpo(&phetd); return pvNil; } if (cnoNil == cno) phetd->_dxpDef = 200; // force the default font to be Comic Sans MS phetd->_stnFontDef = PszLit("Comic Sans MS"); if (!vntl.FGetOnn(&phetd->_stnFontDef, &phetd->_onnDef)) phetd->_onnDef = vpappb->OnnDefVariable(); phetd->_oskFont = koskCur; // force the background color to clear phetd->SetAcrBack(kacrClear); return phetd; } /*************************************************************************** Read the given chunk into this TXRD. ***************************************************************************/ bool HETD::_FReadChunk(PCFL pcfl, CTG ctg, CNO cno, bool fCopyText) { AssertPo(pcfl, 0); BLCK blck; KID kid; if (!HETD_PAR::_FReadChunk(pcfl, ctg, cno, pvNil, fCopyText ? ftxhdCopyText : ftxhdNil)) { return fFalse; } if (pcfl->FGetKidChidCtg(ctg, cno, 0, kctgGst, &kid)) { // read the string table if (!pcfl->FFind(kid.cki.ctg, kid.cki.cno, &blck) || pvNil == (_pgst = GST::PgstRead(&blck)) || _pgst->IvMac() != 6 && (_pgst->IvMac() != 5 || !_pgst->FAddRgch(PszLit(""), 0))) { return fFalse; } } pcfl->FGetName(ctg, cno, &_stnDesc); AssertThis(0); return fTrue; } /*************************************************************************** Get the name of the document. ***************************************************************************/ void HETD::GetName(PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); if (pvNil == _pdocbPar) HETD_PAR::GetName(pstn); else { STN stn; if (cnoNil == _cno) { if (_cactUntitled == 0) _cactUntitled = ++_cactLast; stn.FFormatSz(PszLit(": Untitled Topic %d"), _cactUntitled); } else if (pvNil != _pdocbPar) stn.FFormatSz(PszLit(": Topic %08x"), _cno); _pdocbPar->GetName(pstn); pstn->FAppendStn(&stn); } } /*************************************************************************** Save the document. Handles only cidSave. Asserts on cidSaveAs and cidSaveCopy. ***************************************************************************/ bool HETD::FSave(long cid) { AssertThis(0); CKI cki; if (cidSave != cid) { Bug("Bad cid"); return fFalse; } if (pvNil == _pcfl) { vpappb->TGiveAlertSz(PszLit("Can't save this topic - it doesn't belong to a topic file"), bkOk, cokExclamation); return fFalse; } if (!FSaveToChunk(_pcfl, &cki, fFalse)) { vpappb->TGiveAlertSz(PszLit("Saving topic failed"), bkOk, cokExclamation); return fFalse; } Assert(cki.ctg == kctgHelpTopic, "wrong ctg"); if (cnoNil != _cno) { _pcfl->Delete(kctgHelpTopic, _cno); _pcfl->Move(cki.ctg, cki.cno, kctgHelpTopic, _cno); } else _cno = cki.cno; _pcfl->FSetName(cki.ctg, _cno, &_stnDesc); _fDirty = fFalse; if (Phedo() != pvNil) Phedo()->InvalAllDdg(0); UpdateName(); return fTrue; } /*************************************************************************** Save a help topic to the given chunky file. Fill in *pcki with where we put the root chunk. ***************************************************************************/ bool HETD::FSaveToChunk(PCFL pcfl, CKI *pcki, bool fRedirectText) { AssertThis(0); AssertPo(pcfl, 0); AssertVarMem(pcki); BLCK blck; CNO cno; if (!HETD_PAR::FSaveToChunk(pcfl, pcki, fRedirectText)) return fFalse; if (pvNil != _pgst) { // add the string table chunk and write it if (!pcfl->FAddChild(pcki->ctg, pcki->cno, 0, _pgst->CbOnFile(), kctgGst, &cno, &blck) || !_pgst->FWrite(&blck)) { pcfl->Delete(pcki->ctg, pcki->cno); PushErc(ercHelpSaveFailed); return fFalse; } } return fTrue; } /*************************************************************************** Create a new Document MDI window for this help topic. ***************************************************************************/ PDMD HETD::PdmdNew(void) { AssertThis(0); PDMD pdmd; PGOB pgob; RC rcRel, rcAbs; long dxpLig, ypT; GCB gcb; if (pvNil == (pdmd = HETD_PAR::PdmdNew())) return pvNil; dxpLig = kdxpCellLig + SCB::DxpNormal(); if (pvNil == (pgob = pdmd->PgobFromHid(khidDmw))) goto LFail; pgob->GetPos(&rcAbs, &rcRel); rcAbs.xpLeft += dxpLig + kdxpCcg; pgob->SetPos(&rcAbs, &rcRel); rcRel.xpRight = rcRel.xpLeft; ypT = rcRel.ypBottom; rcRel.ypBottom = rcRel.YpCenter(); rcAbs.xpRight = rcAbs.xpLeft; rcAbs.xpLeft = rcAbs.xpRight - kdxpCcg; rcAbs.ypTop = 0; rcAbs.ypBottom = kdxpFrameCcg / 2; gcb.Set(CMH::HidUnique(), pgob, fgobSibling, kginDefault, &rcAbs, &rcRel); if (pvNil == NewObj CCG(&gcb, this, fTrue)) goto LFail; rcAbs.xpRight = rcAbs.xpLeft; rcAbs.xpLeft = rcAbs.xpRight - dxpLig; gcb.Set(khidLigButton, pgob, fgobSibling, kginDefault, &rcAbs, &rcRel); if (pvNil == vapp.PligNew(fTrue, &gcb, this)) goto LFail; rcAbs.ypTop = rcAbs.ypBottom; rcAbs.ypBottom = kdxpFrameCcg; rcRel.ypTop = rcRel.ypBottom; rcRel.ypBottom = ypT; gcb.Set(khidLigPicture, pgob, fgobSibling, kginDefault, &rcAbs, &rcRel); if (pvNil == vapp.PligNew(fFalse, &gcb, this)) goto LFail; rcAbs.xpLeft = rcAbs.xpRight; rcAbs.xpRight = rcAbs.xpLeft + kdxpCcg; gcb.Set(CMH::HidUnique(), pgob, fgobSibling, kginDefault, &rcAbs, &rcRel); if (pvNil == NewObj CCG(&gcb, this, fFalse)) { LFail: ReleasePpo(&pdmd); return pvNil; } AssertPo(pdmd, 0); return pdmd; } /*************************************************************************** Create a new DDG for the HETD. ***************************************************************************/ PDDG HETD::PddgNew(PGCB pgcb) { AssertThis(0); return HETG::PhetgNew(this, pgcb); } enum { kiditOkTopic, kiditCancelTopic, kiditBalnTopic, kiditBalnStnTopic, kiditHtopStnTopic, kiditHidTopic, kiditHidStnTopic, kiditHidTargetTopic, kiditHidTargetStnTopic, kiditScriptTopic, kiditScriptStnTopic, kiditDxpTopic, kiditDypTopic, kiditDescriptionTopic, kiditCtgSoundTopic, kiditCnoSoundTopic, kiditCnoSoundStnTopic, kiditWidthTopic, kiditLimTopic }; /*************************************************************************** Put up a dialog for the user to edit the help topic properties. ***************************************************************************/ void HETD::EditHtop(void) { AssertThis(0); PDLG pdlg; long dxp; STN stn; if (pvNil == (pdlg = DLG::PdlgNew(dlidTopicInfo))) return; if (pvNil != _pgst) { // initialize the string fields _pgst->GetStn(0, &stn); pdlg->FPutStn(kiditBalnStnTopic, &stn); _pgst->GetStn(1, &stn); pdlg->FPutStn(kiditHtopStnTopic, &stn); _pgst->GetStn(2, &stn); pdlg->FPutStn(kiditHidStnTopic, &stn); _pgst->GetStn(3, &stn); pdlg->FPutStn(kiditHidTargetStnTopic, &stn); _pgst->GetStn(4, &stn); pdlg->FPutStn(kiditScriptStnTopic, &stn); _pgst->GetStn(5, &stn); pdlg->FPutStn(kiditCnoSoundStnTopic, &stn); } else if (pvNil == (_pgst = GST::PgstNew(0, 6, 0))) return; else { stn.SetNil(); if (!_pgst->FAddStn(&stn) || !_pgst->FAddStn(&stn) || !_pgst->FAddStn(&stn) || !_pgst->FAddStn(&stn) || !_pgst->FAddStn(&stn) || !_pgst->FAddStn(&stn)) { ReleasePpo(&_pgst); return; } } pdlg->FPutStn(kiditDescriptionTopic, &_stnDesc); // initialize the numeric fields pdlg->FPutLwInEdit(kiditBalnTopic, _htop.cnoBalloon); pdlg->FPutLwInEdit(kiditHidTopic, _htop.hidThis); pdlg->FPutLwInEdit(kiditHidTargetTopic, _htop.hidTarget); pdlg->FPutLwInEdit(kiditScriptTopic, _htop.cnoScript); pdlg->FPutLwInEdit(kiditDxpTopic, _htop.dxp); pdlg->FPutLwInEdit(kiditDypTopic, _htop.dyp); if (_htop.ckiSnd.ctg == ctgNil) stn = PszLit("WAVE"); else stn.FFormatSz(PszLit("%f"), _htop.ckiSnd.ctg); pdlg->FPutStn(kiditCtgSoundTopic, &stn); pdlg->FPutLwInEdit(kiditCnoSoundTopic, _htop.ckiSnd.cno); pdlg->FPutLwInEdit(kiditWidthTopic, DxpDef()); if (kiditOkTopic != pdlg->IditDo(kiditBalnTopic)) { ReleasePpo(&pdlg); return; } if (!pdlg->FGetLwFromEdit(kiditBalnTopic, (long *)&_htop.cnoBalloon)) _htop.cnoBalloon = cnoNil; if (!pdlg->FGetLwFromEdit(kiditHidTopic, &_htop.hidThis)) _htop.hidThis = hidNil; if (!pdlg->FGetLwFromEdit(kiditHidTargetTopic, &_htop.hidTarget)) _htop.hidTarget = hidNil; if (!pdlg->FGetLwFromEdit(kiditScriptTopic, (long *)&_htop.cnoScript)) _htop.cnoScript = cnoNil; if (!pdlg->FGetLwFromEdit(kiditDxpTopic, &_htop.dxp)) _htop.dxp = 0; if (!pdlg->FGetLwFromEdit(kiditDypTopic, &_htop.dyp)) _htop.dyp = 0; if (pdlg->FGetLwFromEdit(kiditWidthTopic, &dxp) && FIn(dxp, 1, kcbMax)) SetDxpDef(dxp); if (!pdlg->FGetLwFromEdit(kiditCnoSoundTopic, (long *)&_htop.ckiSnd.cno)) { _htop.ckiSnd.cno = cnoNil; _htop.ckiSnd.ctg = kctgWave; } else { pdlg->GetStn(kiditCtgSoundTopic, &stn); if (!FIn(stn.Cch(), 1, 5)) { _htop.ckiSnd.cno = cnoNil; _htop.ckiSnd.ctg = kctgWave; } else { achar rgch[4]; rgch[0] = rgch[1] = rgch[2] = rgch[3] = kchSpace; stn.GetRgch(rgch); // first character becomes the high byte _htop.ckiSnd.ctg = LwFromBytes((byte)rgch[0], (byte)rgch[1], (byte)rgch[2], (byte)rgch[3]); } } pdlg->GetStn(kiditBalnStnTopic, &stn); _TokenizeStn(&stn); _pgst->FPutStn(0, &stn); pdlg->GetStn(kiditHtopStnTopic, &stn); _TokenizeStn(&stn); _pgst->FPutStn(1, &stn); pdlg->GetStn(kiditHidStnTopic, &stn); _TokenizeStn(&stn); _pgst->FPutStn(2, &stn); pdlg->GetStn(kiditHidTargetStnTopic, &stn); _TokenizeStn(&stn); _pgst->FPutStn(3, &stn); pdlg->GetStn(kiditScriptStnTopic, &stn); _TokenizeStn(&stn); _pgst->FPutStn(4, &stn); pdlg->GetStn(kiditCnoSoundStnTopic, &stn); _TokenizeStn(&stn); _pgst->FPutStn(5, &stn); pdlg->GetStn(kiditDescriptionTopic, &_stnDesc); ReleasePpo(&pdlg); SetDirty(); } /*************************************************************************** Do a search on this topic document. ***************************************************************************/ bool HETD::FDoFind(long cpMin, long *pcpMin, long *pcpLim) { AssertThis(0); AssertVarMem(pcpMin); AssertVarMem(pcpLim); STN stn; if (!vpstrg->FGet(kstidFind, &stn) || stn.Cch() == 0 || !FFind(stn.Psz(), stn.Cch(), cpMin, pcpMin, pcpLim, _fCaseSensitive)) { TrashVar(pcpMin); TrashVar(pcpLim); return fFalse; } return fTrue; } /*************************************************************************** Do a replace on this topic document. ***************************************************************************/ bool HETD::FDoReplace(long cp1, long cp2, long *pcpMin, long *pcpLim) { AssertThis(0); AssertVarMem(pcpMin); AssertVarMem(pcpLim); STN stn; SortLw(&cp1, &cp2); vpstrg->FGet(kstidReplace, &stn); *pcpMin = cp1; *pcpLim = cp1 + stn.Cch(); HideSel(); return FReplaceRgch(stn.Psz(), stn.Cch(), cp1, cp2 - cp1); } /*************************************************************************** Get a string corresponding to an entry in the HTOP. -1 means get the topic description. ***************************************************************************/ void HETD::GetHtopStn(long istn, PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); if (istn == -1) *pstn = _stnDesc; else if (pvNil != _pgst && istn < _pgst->IvMac()) _pgst->GetStn(istn, pstn); else pstn->SetNil(); } #ifdef DEBUG /*************************************************************************** Assert the validity of a HETD. ***************************************************************************/ void HETD::AssertValid(ulong grf) { HETD_PAR::AssertValid(0); AssertNilOrPo(_pcfl, 0); Assert(cnoNil == _cno || pvNil != _pcfl && _pcfl->FFind(kctgHelpTopic, _cno), "bad _cno"); AssertNilOrPo(_pgst, 0); } /*************************************************************************** Mark memory for the HETD. ***************************************************************************/ void HETD::MarkMem(void) { AssertValid(0); HETD_PAR::MarkMem(); MarkMemObj(_pgst); } #endif // DEBUG /*************************************************************************** Constructor for a help text editing gob. ***************************************************************************/ HETG::HETG(PHETD phetd, PGCB pgcb) : HETG_PAR(phetd, pgcb) { _fMark = fTrue; } /*************************************************************************** Create a new help text editing gob. ***************************************************************************/ PHETG HETG::PhetgNew(PHETD phetd, PGCB pgcb) { AssertPo(phetd, 0); AssertVarMem(pgcb); PHETG phetg; if (pvNil == (phetg = NewObj HETG(phetd, pgcb))) return pvNil; if (!phetg->_FInit()) { ReleasePpo(&phetg); return pvNil; } phetg->ShowRuler(); phetg->Activate(fTrue); return phetg; } /*************************************************************************** Return the height of the ruler. ***************************************************************************/ long HETG::_DypTrul(void) { AssertThis(0); return kdzpInch / 2 + 1; } /*************************************************************************** Create the ruler. ***************************************************************************/ PTRUL HETG::_PtrulNew(PGCB pgcb) { AssertThis(0); PAP pap; long dyp; _FetchPap(LwMin(_cpAnchor, _cpOther), &pap); GetNaturalSize(pvNil, &dyp); return HTRU::PhtruNew(pgcb, this, pap.dxpTab, _DxpDoc(), dyp, kdxpIndentTxtg - _scvHorz, vpappb->OnnDefVariable(), 12, fontNil); } enum { kiditOkPicture, kiditCancelPicture, kiditNamePicture, kiditLimPicture }; /*************************************************************************** Insert a picture into the help text document. ***************************************************************************/ bool HETG::FInsertPicture(PCRF pcrf, CTG ctg, CNO cno) { AssertThis(0); AssertPo(pcrf, 0); Assert(ctg == kctgMbmp, "bad mbmp chunk"); long cpMin, cpLim; PDLG pdlg; STN stn; long cb; byte rgb[kcbMaxDataStn]; pdlg = DLG::PdlgNew(dlidFormatPicture); if (pvNil == pdlg) return fFalse; pcrf->Pcfl()->FGetName(ctg, cno, &stn); _TokenizeStn(&stn); pdlg->FPutStn(kiditNamePicture, &stn); _SwitchSel(fFalse, ginNil); cpMin = LwMin(_cpAnchor, _cpOther); cpLim = LwMax(_cpAnchor, _cpOther); if (kiditOkPicture != pdlg->IditDo(kiditNamePicture)) { ReleasePpo(&pdlg); goto LFail; } pdlg->GetStn(kiditNamePicture, &stn); _TokenizeStn(&stn); cb = stn.CbData(); stn.GetData(rgb); ReleasePpo(&pdlg); if (Phetd()->FInsertPicture(cno, rgb, cb, cpMin, cpLim - cpMin, _fValidChp ? &_chpIns : pvNil)) { cpMin++; SetSel(cpMin, cpMin); } else { LFail: _SwitchSel(fTrue, kginMark); } ShowSel(); return fTrue; } enum { kiditOkButton, kiditCancelButton, kiditNameButton, kiditTopicButton, kiditTopicNameButton, kiditLimButton }; bool _FDlgFormatButton(PDLG pdlg, long *pidit, void *pv); /*************************************************************************** Dialog proc for formatting a button. ***************************************************************************/ bool _FDlgFormatButton(PDLG pdlg, long *pidit, void *pv) { AssertPo(pdlg, 0); AssertVarMem(pidit); long lw; switch (*pidit) { case kiditCancelButton: return fTrue; // dismiss the dialog case kiditOkButton: if (!pdlg->FGetValues(0, kiditLimButton)) { *pidit = ivNil; return fTrue; } if (!pdlg->FGetLwFromEdit(kiditTopicButton, &lw)) { vpappb->TGiveAlertSz(PszLit("Topic number is bad"), bkOk, cokStop); pdlg->SelectDit(kiditTopicButton); return fFalse; } return fTrue; default: break; } return fFalse; } /*************************************************************************** Insert a button into the help text document. ***************************************************************************/ bool HETG::FInsertButton(PCRF pcrf, CTG ctg, CNO cno) { AssertThis(0); AssertPo(pcrf, 0); Assert(ctg == kctgGokd, "bad button chunk"); long cpMin, cpLim; long lw; PDLG pdlg; STN stn; byte rgb[2 * kcbMaxDataStn]; long cb; pdlg = DLG::PdlgNew(dlidFormatButton, _FDlgFormatButton); if (pvNil == pdlg) return fFalse; pcrf->Pcfl()->FGetName(ctg, cno, &stn); _TokenizeStn(&stn); pdlg->FPutStn(kiditNameButton, &stn); pdlg->FPutLwInEdit(kiditTopicButton, cnoNil); _SwitchSel(fFalse, ginNil); cpMin = LwMin(_cpAnchor, _cpOther); cpLim = LwMax(_cpAnchor, _cpOther); if (kiditOkButton != pdlg->IditDo(kiditNameButton) || !pdlg->FGetLwFromEdit(kiditTopicButton, &lw)) { ReleasePpo(&pdlg); goto LFail; } pdlg->GetStn(kiditNameButton, &stn); _TokenizeStn(&stn); cb = stn.CbData(); stn.GetData(rgb); pdlg->GetStn(kiditTopicNameButton, &stn); _TokenizeStn(&stn); stn.GetData(rgb + cb); cb += stn.CbData(); ReleasePpo(&pdlg); if (Phetd()->FInsertButton(cno, (CNO)lw, rgb, cb, cpMin, cpLim - cpMin, _fValidChp ? &_chpIns : pvNil)) { cpMin++; SetSel(cpMin, cpMin); } else { LFail: _SwitchSel(fTrue, kginMark); } ShowSel(); return fTrue; } enum { kiditOkEdit, kiditCancelEdit, kiditWidthEdit, kiditLimEdit }; bool _FDlgFormatEdit(PDLG pdlg, long *pidit, void *pv); /*************************************************************************** Dialog proc for formatting an edit control. ***************************************************************************/ bool _FDlgFormatEdit(PDLG pdlg, long *pidit, void *pv) { AssertPo(pdlg, 0); AssertVarMem(pidit); long lw; switch (*pidit) { case kiditCancelEdit: return fTrue; // dismiss the dialog case kiditOkEdit: if (!pdlg->FGetValues(0, kiditLimEdit)) { *pidit = ivNil; return fTrue; } if (!pdlg->FGetLwFromEdit(kiditWidthEdit, &lw) || !FIn(lw, 10, 20000)) { vpappb->TGiveAlertSz(PszLit("Width is bad"), bkOk, cokStop); pdlg->SelectDit(kiditWidthEdit); return fFalse; } return fTrue; default: break; } return fFalse; } /*************************************************************************** Insert a text edit control into the help text document. ***************************************************************************/ bool HETG::FCmdInsertEdit(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); long cpMin, cpLim; PDLG pdlg; ECOS ecos; ecos.ctg = 'EDIT'; pdlg = DLG::PdlgNew(dlidFormatEdit, _FDlgFormatEdit); if (pvNil == pdlg) return fFalse; _SwitchSel(fFalse, ginNil); cpMin = LwMin(_cpAnchor, _cpOther); cpLim = LwMax(_cpAnchor, _cpOther); if (kiditOkEdit != pdlg->IditDo(kiditWidthEdit)) goto LFail; if (!pdlg->FGetLwFromEdit(kiditWidthEdit, &ecos.dxp)) goto LFail; ReleasePpo(&pdlg); if (Phetd()->FInsertObject(&ecos, size(ecos), cpMin, cpLim - cpMin, _fValidChp ? &_chpIns : pvNil)) { cpMin++; SetSel(cpMin, cpMin); } else { LFail: ReleasePpo(&pdlg); _SwitchSel(fTrue, kginMark); } ShowSel(); return fTrue; } /*************************************************************************** Copy the selection. ***************************************************************************/ bool HETG::_FCopySel(PDOCB *ppdocb) { AssertNilOrVarMem(ppdocb); PHETD phetd; if (_cpAnchor == _cpOther) return fFalse; if (pvNil == ppdocb) return fTrue; if (pvNil != (phetd = HETD::PhetdNew(pvNil, Phetd()->Prca(), pvNil, cnoNil))) { long cpMin = LwMin(_cpAnchor, _cpOther); long cpLim = LwMax(_cpAnchor, _cpOther); phetd->SetInternal(); phetd->SuspendUndo(); if (!phetd->FReplaceTxrd((PTXRD)_ptxtb, cpMin, cpLim - cpMin, 0, 0, fdocNil)) { ReleasePpo(&phetd); } else phetd->ResumeUndo(); } *ppdocb = phetd; return pvNil != *ppdocb; } /*************************************************************************** Draw extra stuff for the line. In our case we put a box around grouped text. ***************************************************************************/ void HETG::_DrawLinExtra(PGNV pgnv, PRC prcClip, LIN *plin, long dxp, long yp, ulong grftxtg) { AssertThis(0); AssertPo(pgnv, 0); AssertVarMem(prcClip); AssertVarMem(plin); long cp, cpLimBox; long cpLim = plin->cpMin + plin->ccp; PHETD phetd = Phetd(); RC rc; for (cp = plin->cpMin; cp < cpLim;) { if (phetd->FGrouped(cp, pvNil, &cpLimBox)) { rc.ypTop = yp; rc.ypBottom = yp + plin->dyp; rc.xpLeft = plin->xpLeft + dxp + _DxpFromCp(plin->cpMin, cp) - kdxpIndentTxtg; if (cpLimBox >= cpLim) rc.xpRight = dxp + _DxpDoc(); else { rc.xpRight = plin->xpLeft + dxp + _DxpFromCp(plin->cpMin, cpLimBox) - kdxpIndentTxtg; } pgnv->SetPenSize(1, 1); pgnv->FrameRcApt(&rc, &vaptGray, kacrInvert, kacrClear); } cp = cpLimBox; } } /*************************************************************************** Draw the view on the help topic. ***************************************************************************/ void HETG::Draw(PGNV pgnv, RC *prcClip) { AssertThis(0); RC rc; APT apt = {0x88, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00}; GetRc(&rc, cooLocal); pgnv->FillRcApt(prcClip, &apt, kacrLtGray, kacrWhite); HETG_PAR::Draw(pgnv, prcClip); } enum { kiditOkGroupText, kiditCancelGroupText, kiditLwGroupText, kiditTopicGroupText, kiditTopicStnGroupText, kiditLimGroupText, }; /*************************************************************************** Handle grouping text. ***************************************************************************/ bool HETG::FCmdGroupText(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); long cpAnchor, cpOther; PDLG pdlg; CNO cnoTopic; STN stnTopic; byte bGroup; long lw; if (_cpAnchor == _cpOther) return fTrue; _SwitchSel(fFalse, ginNil); pdlg = DLG::PdlgNew(dlidGroupText); if (pvNil == pdlg) goto LCancel; Phetd()->FGrouped(LwMin(_cpAnchor, _cpOther), pvNil, pvNil, &bGroup, &cnoTopic, &stnTopic); pdlg->FPutLwInEdit(kiditLwGroupText, (long)bGroup); pdlg->FPutLwInEdit(kiditTopicGroupText, cnoTopic); _TokenizeStn(&stnTopic); pdlg->FPutStn(kiditTopicStnGroupText, &stnTopic); if (kiditOkGroupText != pdlg->IditDo(kiditLwGroupText)) { ReleasePpo(&pdlg); goto LCancel; } if (!pdlg->FGetLwFromEdit(kiditLwGroupText, &lw) || !FIn(lw, 0, 256)) { vpappb->TGiveAlertSz(PszLit("Group number must be between 0 and 255!"), bkOk, cokExclamation); lw = 0; } bGroup = (byte)lw; if (bGroup != 0) { pdlg->GetStn(kiditTopicStnGroupText, &stnTopic); _TokenizeStn(&stnTopic); if (!pdlg->FGetLwFromEdit(kiditTopicGroupText, &lw)) { vpappb->TGiveAlertSz(PszLit("Topic number was bad!"), bkOk, cokExclamation); cnoTopic = cnoNil; } else cnoTopic = lw; } ReleasePpo(&pdlg); if (Phetd()->FGroupText(cpAnchor = _cpAnchor, cpOther = _cpOther, bGroup, cnoTopic, &stnTopic)) { SetSel(cpAnchor, cpOther); ShowSel(); } else { LCancel: _SwitchSel(fTrue, kginMark); } return fTrue; } enum { kiditOkSpace, kiditCancelSpace, kiditExtraLineSpace, kiditNumLineSpace, kiditExtraAfterSpace, kiditNumAfterSpace, kiditLimSpace, }; /*************************************************************************** Put up the line & paragraph spacing dialog and handle any changes. ***************************************************************************/ bool HETG::FCmdLineSpacing(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); PDLG pdlg; PAP pap, papOld; long lw; pdlg = DLG::PdlgNew(dlidSpacing); if (pvNil == pdlg) return fTrue; _FetchPap(LwMin(_cpAnchor, _cpOther), &pap); pdlg->FPutLwInEdit(kiditExtraLineSpace, pap.dypExtraLine); pdlg->FPutLwInEdit(kiditNumLineSpace, pap.numLine); pdlg->FPutLwInEdit(kiditExtraAfterSpace, pap.dypExtraAfter); pdlg->FPutLwInEdit(kiditNumAfterSpace, pap.numAfter); if (kiditOkSpace != pdlg->IditDo(kiditExtraLineSpace)) { ReleasePpo(&pdlg); return fTrue; } papOld = pap; if (pdlg->FGetLwFromEdit(kiditExtraLineSpace, &lw)) { pap.dypExtraLine = (short)lw; papOld.dypExtraLine = (short)~lw; } if (pdlg->FGetLwFromEdit(kiditNumLineSpace, &lw)) { pap.numLine = (short)lw; papOld.numLine = (short)~lw; } if (pdlg->FGetLwFromEdit(kiditExtraAfterSpace, &lw)) { pap.dypExtraAfter = (short)lw; papOld.dypExtraAfter = (short)~lw; } if (pdlg->FGetLwFromEdit(kiditNumAfterSpace, &lw)) { pap.numAfter = (short)lw; papOld.numAfter = (short)~lw; } ReleasePpo(&pdlg); FApplyPap(&pap, &papOld); return fTrue; } /*************************************************************************** Handle enabling/disabling HETG commands. ***************************************************************************/ bool HETG::FEnableHetgCmd(PCMD pcmd, ulong *pgrfeds) { AssertThis(0); AssertVarMem(pcmd); AssertVarMem(pgrfeds); void *pv; long cp, cpT, cb; STN stn; *pgrfeds = fedsDisable; switch (pcmd->cid) { default: if (_cpAnchor != _cpOther) *pgrfeds = fedsEnable; break; case cidFormatPicture: case cidFormatButton: case cidFormatEdit: if (LwAbs(_cpAnchor - _cpOther) > 1) break; cp = LwMin(_cpAnchor, _cpOther); if (!Phetd()->FFetchObject(cp, &cpT, &pv, &cb)) break; if (cp == cpT && cb >= size(CKI)) { switch (*(CTG *)pv) { case kctgMbmp: if (pcmd->cid == cidFormatPicture) *pgrfeds = fedsEnable; break; case kctgGokd: if (pcmd->cid == cidFormatButton) *pgrfeds = fedsEnable; break; case kctgEditControl: if (pcmd->cid == cidFormatEdit) *pgrfeds = fedsEnable; break; } } FreePpv(&pv); break; case cidFindAgain: case cidReplace: case cidReplaceFind: if (vpstrg->FGet(kstidFind, &stn) && stn.Cch() > 0) *pgrfeds = fedsEnable; break; } return fTrue; } /*************************************************************************** Allow the user to edit the properties of an embedded picture. ***************************************************************************/ bool HETG::FCmdFormatPicture(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); void *pv; PDLG pdlg; long cp, cpT, cb; byte rgb[size(CKI) + kcbMaxDataStn]; STN stn; CKI *pcki = (CKI *)rgb; if (LwAbs(_cpAnchor - _cpOther) > 1) return fTrue; cp = LwMin(_cpAnchor, _cpOther); if (!Phetd()->FFetchObject(cp, &cpT, &pv, &cb)) return fTrue; if (cp != cpT || !FIn(cb, size(CKI), size(rgb) + 1) || ((CKI *)pv)->ctg != kctgMbmp) { FreePpv(&pv); return fFalse; } CopyPb(pv, rgb, cb); FreePpv(&pv); pdlg = DLG::PdlgNew(dlidFormatPicture); if (pvNil == pdlg) return fFalse; if (cb > size(CKI) && stn.FSetData(rgb + size(CKI), cb - size(CKI))) { _TokenizeStn(&stn); pdlg->FPutStn(kiditNamePicture, &stn); } _SwitchSel(fFalse, ginNil); if (kiditOkPicture != pdlg->IditDo(kiditNamePicture)) { ReleasePpo(&pdlg); goto LFail; } pdlg->GetStn(kiditNamePicture, &stn); _TokenizeStn(&stn); cb = stn.CbData() + size(CKI); stn.GetData(rgb + size(CKI)); ReleasePpo(&pdlg); if (Phetd()->FApplyObjectProps(rgb, cb, cp)) SetSel(cp, cp + 1); else { LFail: _SwitchSel(fTrue, kginMark); } ShowSel(); return fTrue; } /*************************************************************************** Allow the user to edit the properties of an embedded button. ***************************************************************************/ bool HETG::FCmdFormatButton(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); void *pv; PDLG pdlg; long cp, cpT, cb, ib, cbRead; STN stn; byte rgb[size(CKI) + size(long) + 2 * kcbMaxDataStn]; CKI *pcki = (CKI *)rgb; long *plw = (long *)(pcki + 1); if (LwAbs(_cpAnchor - _cpOther) > 1) return fTrue; cp = LwMin(_cpAnchor, _cpOther); if (!Phetd()->FFetchObject(cp, &cpT, &pv, &cb)) return fTrue; if (cp != cpT || !FIn(cb, size(CKI) + size(long), size(rgb) + 1) || ((CKI *)pv)->ctg != kctgGokd) { FreePpv(&pv); return fFalse; } CopyPb(pv, rgb, cb); FreePpv(&pv); pdlg = DLG::PdlgNew(dlidFormatButton, _FDlgFormatButton); if (pvNil == pdlg) return fFalse; ib = size(CKI) + size(long); if (cb > ib && stn.FSetData(rgb + ib, cb - ib, &cbRead)) { _TokenizeStn(&stn); pdlg->FPutStn(kiditNameButton, &stn); if ((ib += cbRead) < cb && stn.FSetData(rgb + ib, cb - ib)) { _TokenizeStn(&stn); pdlg->FPutStn(kiditTopicNameButton, &stn); } } pdlg->FPutLwInEdit(kiditTopicButton, *plw); _SwitchSel(fFalse, ginNil); if (kiditOkButton != pdlg->IditDo(kiditNameButton) || !pdlg->FGetLwFromEdit(kiditTopicButton, plw)) { ReleasePpo(&pdlg); goto LFail; } pdlg->GetStn(kiditNameButton, &stn); _TokenizeStn(&stn); ib = size(CKI) + size(long); stn.GetData(rgb + ib); ib += stn.CbData(); pdlg->GetStn(kiditTopicNameButton, &stn); _TokenizeStn(&stn); stn.GetData(rgb + ib); ib += stn.CbData(); ReleasePpo(&pdlg); if (Phetd()->FApplyObjectProps(rgb, ib, cp)) SetSel(cp, cp + 1); else { LFail: _SwitchSel(fTrue, kginMark); } ShowSel(); return fTrue; } /*************************************************************************** Allow the user to edit the properties of an embedded edit control. ***************************************************************************/ bool HETG::FCmdFormatEdit(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); void *pv; PDLG pdlg; long cp, cpT, cb; ECOS ecos; if (LwAbs(_cpAnchor - _cpOther) > 1) return fTrue; cp = LwMin(_cpAnchor, _cpOther); if (!Phetd()->FFetchObject(cp, &cpT, &pv, &cb)) return fTrue; if (cp != cpT || cb != size(ecos) || *(CTG *)pv != kctgEditControl) { FreePpv(&pv); return fFalse; } CopyPb(pv, &ecos, size(ecos)); FreePpv(&pv); pdlg = DLG::PdlgNew(dlidFormatEdit, _FDlgFormatEdit); if (pvNil == pdlg) return fFalse; pdlg->FPutLwInEdit(kiditWidthEdit, ecos.dxp); _SwitchSel(fFalse, ginNil); if (kiditOkEdit != pdlg->IditDo(kiditWidthEdit) || !pdlg->FGetLwFromEdit(kiditWidthEdit, &ecos.dxp)) { ReleasePpo(&pdlg); goto LFail; } ReleasePpo(&pdlg); if (Phetd()->FApplyObjectProps(&ecos, size(ecos), cp)) SetSel(cp, cp + 1); else { LFail: _SwitchSel(fTrue, kginMark); } ShowSel(); return fTrue; } /*************************************************************************** Edit the topic info. ***************************************************************************/ bool HETG::FCmdEditHtop(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); Phetd()->EditHtop(); return fTrue; } /*************************************************************************** Open the next or previous topic. ***************************************************************************/ bool HETG::FCmdNextTopic(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); PHETD phetd; PHETD phetdThis = Phetd(); PHEDO phedo = phetdThis->Phedo(); if (pvNil == phedo) return fTrue; phetd = pcmd->cid == cidNextTopic ? phedo->PhetdOpenNext(phetdThis) : phedo->PhetdOpenPrev(phetdThis); if (pvNil == phetd) { phetd = pcmd->cid == cidNextTopic ? phedo->PhetdOpenNext(pvNil) : phedo->PhetdOpenPrev(pvNil); } if (pvNil == phetd || phetd == phetdThis) { ReleasePpo(&phetd); return fTrue; } if (phetdThis->Cno() == cnoNil || phetdThis->FDirty()) phetdThis = pvNil; // open a DMD onto the topic if (phetd->Cddg() == 0) { // need to open a window onto the doc. if (phetd->PdmdNew() != pvNil && pvNil != phetdThis) phetdThis->CloseAllDdg(); } else { phetd->ActivateDmd(); if (pvNil != phetd->PddgActive() && pvNil != phetdThis) phetdThis->CloseAllDdg(); } ReleasePpo(&phetd); return fTrue; } /*************************************************************************** Handle cidFind and cidFindAgain. Search for some text. ***************************************************************************/ bool HETG::FCmdFind(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); long cpMin, cpLim; PHETD phetd; switch (pcmd->cid) { case cidReplace: case cidReplaceFind: if (!Phetd()->FDoReplace(_cpAnchor, _cpOther, &cpMin, &cpLim)) { vpappb->TGiveAlertSz(PszLit("Replace failed."), bkOk, cokStop); break; } SetSel(cpMin, cpLim); ShowSel(); if (pcmd->cid == cidReplace) break; vpappb->UpdateMarked(); cpMin = LwMin(cpMin + 1, cpLim); goto LFind; case cidFind: if (!_FDoFindDlg()) break; cpMin = LwMin(_cpAnchor, _cpOther); goto LFind; case cidFindAgain: cpMin = LwMin(_cpAnchor, _cpOther); cpMin = LwMin(cpMin + 1, LwMax(_cpAnchor, _cpOther)); LFind: if (!Phetd()->FDoFind(cpMin, &cpMin, &cpLim)) { vpappb->TGiveAlertSz(PszLit("Search string not found."), bkOk, cokStop); break; } SetSel(cpMin, cpLim); ShowSel(); break; case cidFindNextTopic: phetd = Phetd(); if (phetd->Phedo() != pvNil) phetd->Phedo()->DoFindNext(phetd, phetd->Cno()); break; } return fTrue; } /*************************************************************************** Handle printing of a topic. ***************************************************************************/ bool HETG::FCmdPrint(PCMD pcmd) { #ifdef WIN PRINTDLG pd; DOCINFO di; PGPT pgpt = pvNil; PGNV pgnv = pvNil; STN stn; RC rc; // set up the print dialog structure ClearPb(&pd, size(pd)); pd.lStructSize = size(pd); pd.Flags = PD_RETURNDC | PD_HIDEPRINTTOFILE | PD_NOPAGENUMS | PD_NOSELECTION | PD_USEDEVMODECOPIES; pd.hwndOwner = vwig.hwndApp; if (!PrintDlg(&pd)) goto LFail; // see if the device supports BitBlt if (!(GetDeviceCaps(pd.hDC, RASTERCAPS) & RC_BITBLT)) goto LFail; if (pvNil == (pgpt = GPT::PgptNew(pd.hDC))) goto LFail; if (pvNil == (pgnv = NewObj GNV(pgpt))) goto LFail; rc.Zero(); rc.xpRight = GetDeviceCaps(pd.hDC, LOGPIXELSX); rc.ypBottom = GetDeviceCaps(pd.hDC, LOGPIXELSY); pgnv->SetRcDst(&rc); rc.xpRight = kdzpInch; rc.ypBottom = kdzpInch; pgnv->SetRcSrc(&rc); Phetd()->GetName(&stn); di.cbSize = size(di); di.lpszDocName = stn.Psz(); di.lpszOutput = pvNil; if (SP_ERROR == StartDoc(pd.hDC, &di)) goto LFail; if (0 >= StartPage(pd.hDC)) goto LFail; rc.Set(0, 0, GetDeviceCaps(pd.hDC, HORZRES), GetDeviceCaps(pd.hDC, VERTRES)); rc.Inset(kdzpInch, kdzpInch); DrawLines(pgnv, &rc, rc.xpLeft, rc.ypTop, 0, klwMax, ftxtgNoColor); if (0 >= EndPage(pd.hDC)) goto LFail; if (0 >= EndDoc(pd.hDC)) { LFail: vpappb->TGiveAlertSz(PszLit("Printing failed"), bkOk, cokExclamation); } if (pd.hDC != hNil) DeleteDC(pd.hDC); if (pd.hDevMode != hNil) GlobalFree(pd.hDevMode); if (pd.hDevNames != hNil) GlobalFree(pd.hDevNames); ReleasePpo(&pgnv); ReleasePpo(&pgpt); #endif // WIN return fTrue; } enum { kiditIgnoreSpell, kiditCancelSpell, kiditChangeSpell, kiditChangeAllSpell, kiditIgnoreAllSpell, kiditAddSpell, kiditComboSpell, kiditBadSpell, kiditLimSpell }; /*************************************************************************** Spell check the topic. ***************************************************************************/ bool HETG::FCmdCheckSpelling(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); #ifdef SPELL STN stn; long cactChanges; if (pvNil != vpsplc) { vpsplc->FlushIgnoreList(); vpsplc->FlushChangeList(fTrue); } if (FCheckSpelling(&cactChanges)) { if (cactChanges == 0) stn = PszLit("No corrections made."); else stn.FFormatSz(PszLit("Corrected %d words."), cactChanges); vpappb->TGiveAlertSz(stn.Psz(), bkOk, cokExclamation); } #else //! SPELL vpappb->TGiveAlertSz(PszLit("Spell checking not available"), bkOk, cokExclamation); #endif //! SPELL return fTrue; } /*************************************************************************** Spell check the topic. ***************************************************************************/ bool HETG::FCheckSpelling(long *pcactChanges) { AssertThis(0); AssertVarMem(pcactChanges); #ifdef SPELL achar rgch[1024]; long cpMin, cpMac; long cchBuf; long ichMin, ichLim; long idit; long cstn; STN stnSrc, stnDst; long scrs; PDLG pdlg = pvNil; *pcactChanges = 0; if (pvNil == vpsplc) { if (ksclidAmerican == vsclid) stnSrc = PszLit("Chelp"); else stnSrc.FFormatSz(PszLit("Chp%d"), vsclid); if (pvNil == (vpsplc = SPLC::PsplcNew(vsclid, &stnSrc))) { vpappb->TGiveAlertSz(PszLit("Couldn't load the main dictionary"), bkOk, cokExclamation); return fFalse; } } cpMin = 0; cpMac = _ptxtb->CpMac() - 1; for (cchBuf = 0; cpMin < cpMac;) { if (cchBuf <= 0) { // fetch more text if ((cchBuf = CvFromRgv(rgch)) + cpMin < cpMac) { // make sure we end on a word boundary long cpT = _ptxtb->CpPrev(cpMin + cchBuf, fTrue); if (cpT > cpMin) cchBuf = cpT - cpMin; } else cchBuf = cpMac - cpMin; AssertIn(cchBuf, 1, CvFromRgv(rgch) + 1); _ptxtb->FetchRgch(cpMin, cchBuf, rgch); } AssertIn(cchBuf, 1, CvFromRgv(rgch) + 1); if (!vpsplc->FCheck(rgch, cchBuf, &ichMin, &ichLim, &stnDst, &scrs)) { vpappb->TGiveAlertSz(PszLit("Spell checking failed!"), bkOk, cokExclamation); return fFalse; } if (ichMin >= cchBuf || ichMin >= ichLim) { cpMin += cchBuf; cchBuf = 0; continue; } // misspelled word SetSel(cpMin + ichMin, cpMin + ichLim); if (scrs == scrsReturningChangeAlways) { // change all word - change it and continue on goto LChange; } // put up the dialog if (pvNil == pdlg && pvNil == (pdlg = DLG::PdlgNew(dlidCheckSpelling))) { vpappb->TGiveAlertSz(PszLit("Couldn't create spelling dialog!"), bkOk, cokExclamation); return fFalse; } stnSrc.SetRgch(rgch + ichMin, ichLim - ichMin); pdlg->FPutStn(kiditBadSpell, &stnSrc); if (scrs == scrsReturningChangeOnce) pdlg->FPutStn(kiditComboSpell, &stnDst); else pdlg->FPutStn(kiditComboSpell, &stnSrc); // fill in the suggestions pdlg->ClearList(kiditComboSpell); for (cstn = 0; cstn < 20 && vpsplc->FSuggest(rgch + ichMin, ichLim - ichMin, cstn == 0, &stnDst); cstn++) { pdlg->FAddToList(kiditComboSpell, &stnDst); } Clean(); idit = pdlg->IditDo(kiditComboSpell); switch (idit) { default: Bug("unknown button"); ReleasePpo(&pdlg); return fFalse; case kiditAddSpell: vpsplc->FAddToUser(&stnSrc); goto LIgnore; case kiditIgnoreAllSpell: vpsplc->FIgnoreAll(&stnSrc); // fall thru case kiditIgnoreSpell: LIgnore: if (cchBuf > ichLim) BltPb(rgch + ichLim, rgch, (cchBuf - ichLim) * size(achar)); cchBuf -= ichLim; cpMin += ichLim; break; case kiditChangeSpell: case kiditChangeAllSpell: pdlg->GetStn(kiditComboSpell, &stnDst); if (!stnDst.FEqualRgch(rgch + ichMin, ichLim - ichMin)) { // tell the spell checker that we're doing a change vpsplc->FChange(&stnSrc, &stnDst, idit == kiditChangeAllSpell); LChange: (*pcactChanges)++; HideSel(); if (!_ptxtb->FReplaceRgch(stnDst.Prgch(), stnDst.Cch(), cpMin + ichMin, ichLim - ichMin)) { vpappb->TGiveAlertSz(PszLit("Couldn't replace wrong word!"), bkOk, cokExclamation); ReleasePpo(&pdlg); return fFalse; } } if (cchBuf > ichLim) BltPb(rgch + ichLim, rgch, (cchBuf - ichLim) * size(achar)); cchBuf -= ichLim; cpMac += stnDst.Cch() + ichMin - ichLim; cpMin += stnDst.Cch() + ichMin; break; case kiditCancelSpell: ReleasePpo(&pdlg); return fFalse; } } ReleasePpo(&pdlg); #else //! SPELL vpappb->TGiveAlertSz(PszLit("Spell checking not available"), bkOk, cokExclamation); *pcactChanges = 0; #endif //! SPELL return fTrue; } /*************************************************************************** Handle idle stuff - update the ruler with our new height. ***************************************************************************/ void HETG::InvalCp(long cp, long ccpIns, long ccpDel) { AssertThis(0); long dyp; HETG_PAR::InvalCp(cp, ccpIns, ccpDel); if (pvNil == _ptrul || !_ptrul->FIs(kclsHTRU)) return; GetNaturalSize(pvNil, &dyp); ((PHTRU)_ptrul)->SetDypHeight(dyp); } enum { kiditOkSize, kiditCancelSize, kiditSizeSize, kiditLimSize }; /*************************************************************************** Get a font size from the user. ***************************************************************************/ bool HETG::_FGetOtherSize(long *pdypFont) { AssertThis(0); AssertVarMem(pdypFont); PDLG pdlg; bool fRet; if (pvNil == (pdlg = DLG::PdlgNew(dlidFontSize))) return fFalse; pdlg->FPutLwInEdit(kiditSizeSize, *pdypFont); if (kiditOkSize != pdlg->IditDo(kiditSizeSize)) { ReleasePpo(&pdlg); return fFalse; } fRet = pdlg->FGetLwFromEdit(kiditSizeSize, pdypFont); ReleasePpo(&pdlg); return fRet; } enum { kiditOkOffset, kiditCancelOffset, kiditSizeOffset, kiditSuperOffset, kiditLimOffset }; /*************************************************************************** Get the amount to sub/superscript from the user. ***************************************************************************/ bool HETG::_FGetOtherSubSuper(long *pdypOffset) { AssertThis(0); AssertVarMem(pdypOffset); PDLG pdlg; bool fRet; if (pvNil == (pdlg = DLG::PdlgNew(dlidSubSuper))) return fFalse; pdlg->FPutLwInEdit(kiditSizeSize, LwAbs(*pdypOffset)); pdlg->PutCheck(kiditSuperOffset, *pdypOffset < 0); if (kiditOkOffset != pdlg->IditDo(kiditSizeOffset)) { ReleasePpo(&pdlg); return fFalse; } fRet = pdlg->FGetLwFromEdit(kiditSizeOffset, pdypOffset); if (pdlg->FGetCheck(kiditSuperOffset)) *pdypOffset = -*pdypOffset; ReleasePpo(&pdlg); return fRet; } /*************************************************************************** Get the height of a particular line. Returns 0 if the line is past the end of the document. ***************************************************************************/ long HETG::DypLine(long ilin) { AssertThis(0); AssertIn(ilin, 0, kcbMax); LIN lin; long ilinT; _FetchLin(ilin, &lin, &ilinT); if (ilin > ilinT) return 0; return LwMax(1, lin.dyp); } /*************************************************************************** Constructor for a text ruler. ***************************************************************************/ HTRU::HTRU(GCB *pgcb, PTXTG ptxtg) : HTRU_PAR(pgcb) { AssertPo(ptxtg, 0); _ptxtg = ptxtg; } /*************************************************************************** Create a new text ruler. ***************************************************************************/ PHTRU HTRU::PhtruNew(GCB *pgcb, PTXTG ptxtg, long dxpTab, long dxpDoc, long dypDoc, long xpLeft, long onn, long dypFont, ulong grfont) { AssertVarMem(pgcb); AssertPo(ptxtg, 0); AssertIn(dxpTab, 1, kcbMax); AssertIn(dxpDoc, 1, kcbMax); PHTRU phtru; if (pvNil == (phtru = NewObj HTRU(pgcb, ptxtg))) return pvNil; phtru->_dxpTab = dxpTab; phtru->_dxpDoc = dxpDoc; phtru->_dyp = dypDoc; phtru->_xpLeft = xpLeft; phtru->_onn = onn; phtru->_dypFont = dypFont; phtru->_grfont = grfont; AssertPo(phtru, 0); return phtru; } /*************************************************************************** Draw the ruler. ***************************************************************************/ void HTRU::Draw(PGNV pgnv, RC *prcClip) { AssertThis(0); AssertPo(pgnv, 0); AssertVarMem(prcClip); RC rc, rcT; STN stn; GetRc(&rc, cooLocal); pgnv->SetPenSize(0, 1); pgnv->FrameRc(&rc, kacrBlack); rc.Inset(0, 1); pgnv->FillRc(&rc, kacrWhite); rcT = rc; rcT.ypTop = rc.YpCenter(); rcT.ypBottom = rcT.ypTop + 1; pgnv->FillRc(&rcT, kacrBlack); stn.FFormatSz(PszLit("Width = %d; Tab = %d; Height = %d"), _dxpDoc, _dxpTab, _dyp); pgnv->SetFont(_onn, _grfont, _dypFont); pgnv->DrawStn(&stn, rc.xpLeft + 8, rc.ypTop); rc.ypTop = rcT.ypBottom; rcT = rc; rcT.xpLeft = _xpLeft - 1; rcT.xpRight = _xpLeft + 1; pgnv->FillRcApt(&rcT, &vaptGray, kacrBlack, kacrWhite); rcT.Offset(_dxpDoc, 0); pgnv->FillRc(&rcT, kacrBlack); rcT.Inset(0, 2); rcT.Offset(_dxpTab - _dxpDoc, 0); pgnv->FillRc(&rcT, kacrBlack); } /*************************************************************************** Track the mouse. ***************************************************************************/ bool HTRU::FCmdTrackMouse(PCMD_MOUSE pcmd) { AssertThis(0); AssertVarMem(pcmd); if (pcmd->cid == cidMouseDown) { Assert(vpcex->PgobTracking() == pvNil, "mouse already being tracked!"); RC rc; GetRc(&rc, cooLocal); if (pcmd->yp < rc.YpCenter()) { _rtt = rttNil; return fTrue; } if (LwAbs(pcmd->xp - _xpLeft - _dxpTab) < 3) { _rtt = krttTab; _dxpTrack = _dxpTab - pcmd->xp; } else if (LwAbs(pcmd->xp - _xpLeft - _dxpDoc) < 3) { _rtt = krttDoc; _dxpTrack = _dxpDoc - pcmd->xp; } else { _rtt = rttNil; return fTrue; } vpcex->TrackMouse(this); } else { Assert(vpcex->PgobTracking() == this, "not tracking mouse!"); Assert(pcmd->cid == cidTrackMouse, 0); Assert(_rtt != rttNil, "no track type"); } switch (_rtt) { case krttTab: _ptxtg->SetDxpTab(pcmd->xp + _dxpTrack); break; case krttDoc: _ptxtg->SetDxpDoc(pcmd->xp + _dxpTrack); break; } if (pcmd->cid == cidMouseDown) _ptxtg->Ptxtb()->SuspendUndo(); if (!(pcmd->grfcust & fcustMouse)) { _ptxtg->Ptxtb()->ResumeUndo(); vpcex->EndMouseTracking(); _rtt = rttNil; } return fTrue; } enum { kiditOkFont, kiditCancelFont, kiditComboFont, kiditLimFont }; /*************************************************************************** Give the fonts in a dialog. ***************************************************************************/ bool HETG::FCmdFontDialog(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); PDLG pdlg; CHP chpNew, chpOld; STN stn; long onn; if (pvNil == (pdlg = DLG::PdlgNew(dlidChooseFont))) return fTrue; // fill in the font list pdlg->ClearList(kiditComboFont); for (onn = 0; onn < vntl.OnnMac(); onn++) { vntl.GetStn(onn, &stn); pdlg->FAddToList(kiditComboFont, &stn); } _EnsureChpIns(); vntl.GetStn(_chpIns.onn, &stn); pdlg->FPutStn(kiditComboFont, &stn); if (kiditOkFont == pdlg->IditDo(kiditComboFont)) { pdlg->GetStn(kiditComboFont, &stn); if (vntl.FGetOnn(&stn, &onn)) { chpNew.Clear(); chpOld.Clear(); chpNew.onn = onn; chpOld.onn = ~onn; FApplyChp(&chpNew, &chpOld); } } ReleasePpo(&pdlg); return fTrue; } /*************************************************************************** Set the tab width. ***************************************************************************/ void HTRU::SetDxpTab(long dxpTab) { AssertThis(0); if (dxpTab == _dxpTab) return; _dxpTab = dxpTab; AssertThis(0); InvalRc(pvNil, kginMark); } /*************************************************************************** Set the document width. ***************************************************************************/ void HTRU::SetDxpDoc(long dxpDoc) { AssertThis(0); if (dxpDoc == _dxpDoc) return; _dxpDoc = dxpDoc; AssertThis(0); InvalRc(pvNil, kginMark); } /*************************************************************************** Change the location of the left edge of the document. ***************************************************************************/ void HTRU::SetXpLeft(long xpLeft) { AssertThis(0); if (xpLeft == _xpLeft) return; _xpLeft = xpLeft; AssertThis(0); InvalRc(pvNil, kginMark); } /*************************************************************************** Set the text height. ***************************************************************************/ void HTRU::SetDypHeight(long dyp) { AssertThis(0); if (dyp == _dyp) return; _dyp = dyp; AssertThis(0); InvalRc(pvNil, kginMark); } #ifdef DEBUG /*************************************************************************** Assert the validity of a HTRU. ***************************************************************************/ void HTRU::AssertValid(ulong grf) { HTRU_PAR::AssertValid(0); AssertPo(_ptxtg, 0); AssertIn(_dxpTab, 1, kcbMax); AssertIn(_dxpDoc, 1, kcbMax); } #endif // DEBUG /*************************************************************************** Munge the string so it is a valid token or empty. ***************************************************************************/ void _TokenizeStn(PSTN pstn) { AssertPo(pstn, 0); bool fDigitOk; SZ sz; achar ch; achar *pch; fDigitOk = fFalse; pstn->GetSz(sz); for (pch = sz; *pch; pch++, fDigitOk = fTrue) { ch = *pch; if (!FIn(ch, ChLit('A'), ChLit('Z') + 1) && !FIn(ch, ChLit('a'), ChLit('z') + 1)) { if (!fDigitOk || !FIn(ch, ChLit('0'), ChLit('9') + 1)) { *pch = ChLit('_'); } } } *pch = 0; *pstn = sz; } enum { kiditOkFind, kiditCancelFind, kiditFindFind, kiditReplaceFind, kiditCaseSensitiveFind, kiditLimFind }; bool _FDlgFind(PDLG pdlg, long *pidit, void *pv); /*************************************************************************** Dialog proc for searching. ***************************************************************************/ bool _FDlgFind(PDLG pdlg, long *pidit, void *pv) { AssertPo(pdlg, 0); AssertVarMem(pidit); STN stn; switch (*pidit) { case kiditCancelFind: return fTrue; // dismiss the dialog case kiditOkFind: if (!pdlg->FGetValues(0, kiditLimFind)) { *pidit = ivNil; return fTrue; } pdlg->GetStn(kiditFindFind, &stn); if (stn.Cch() <= 0) { vpappb->TGiveAlertSz(PszLit("Empty search string"), bkOk, cokStop); pdlg->SelectDit(kiditFindFind); return fFalse; } return fTrue; default: break; } return fFalse; } /*************************************************************************** Do the find dialog. Return true if the user OK'ed the dialog. ***************************************************************************/ bool _FDoFindDlg(void) { PDLG pdlg; STN stn; bool fRet = fFalse; if (pvNil == (pdlg = DLG::PdlgNew(dlidFind, _FDlgFind))) return fFalse; vpstrg->FGet(kstidFind, &stn); pdlg->FPutStn(kiditFindFind, &stn); vpstrg->FGet(kstidReplace, &stn); pdlg->FPutStn(kiditReplaceFind, &stn); pdlg->PutCheck(kiditCaseSensitiveFind, _fCaseSensitive); if (kiditOkFind != pdlg->IditDo(kiditFindFind)) goto LFail; pdlg->GetStn(kiditFindFind, &stn); if (stn.Cch() <= 0) goto LFail; vpstrg->FPut(kstidFind, &stn); pdlg->GetStn(kiditReplaceFind, &stn); vpstrg->FPut(kstidReplace, &stn); _fCaseSensitive = FPure(pdlg->FGetCheck(kiditCaseSensitiveFind)); fRet = fTrue; LFail: ReleasePpo(&pdlg); return fRet; } ================================================ FILE: kauai/tools/chtxt.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Chunky editor text document management ***************************************************************************/ #include "ched.h" ASSERTNAME /*************************************************************************** Constructor for a chunky text doc. ***************************************************************************/ CHTXD::CHTXD(PDOCB pdocb, ulong grfdoc) : CHTXD_PAR(pdocb, grfdoc) { } /*************************************************************************** Create a new chunky text doc. ***************************************************************************/ PCHTXD CHTXD::PchtxdNew(PFNI pfni, PBSF pbsf, short osk, PDOCB pdocb, ulong grfdoc) { AssertNilOrPo(pfni, ffniFile); AssertNilOrPo(pbsf, 0); AssertNilOrPo(pdocb, 0); PCHTXD pchtxd; if (pvNil == (pchtxd = NewObj CHTXD(pdocb, grfdoc))) return pvNil; if (!pchtxd->_FInit(pfni, pbsf, osk)) ReleasePpo(&pchtxd); return pchtxd; } /*************************************************************************** Create a new document display gob for the chunky text doc. ***************************************************************************/ PDDG CHTXD::PddgNew(PGCB pgcb) { return CHTDD::PchtddNew(this, pgcb, vpappb->OnnDefFixed(), fontNil, vpappb->DypTextDef(), 4); } BEGIN_CMD_MAP(CHTDD, DDG) ON_CID_GEN(cidCompileChunky, &CHTDD::FCmdCompileChunky, pvNil) ON_CID_GEN(cidCompileScript, &CHTDD::FCmdCompileScript, pvNil) ON_CID_GEN(cidAssembleScript, &CHTDD::FCmdCompileScript, pvNil) END_CMD_MAP_NIL() /*************************************************************************** Constructor. ***************************************************************************/ CHTDD::CHTDD(PTXTB ptxtb, PGCB pgcb, long onn, ulong grfont, long dypFont, long cchTab) : CHTDD_PAR(ptxtb, pgcb, onn, grfont, dypFont, cchTab) { _fMark = fFalse; } /*************************************************************************** Create a new one. ***************************************************************************/ PCHTDD CHTDD::PchtddNew(PTXTB ptxtb, PGCB pgcb, long onn, ulong grfont, long dypFont, long cchTab) { PCHTDD pchtdd; if (pvNil == (pchtdd = NewObj CHTDD(ptxtb, pgcb, onn, grfont, dypFont, cchTab))) { return pvNil; } if (!pchtdd->_FInit()) { ReleasePpo(&pchtdd); return pvNil; } pchtdd->Activate(fTrue); AssertPo(pchtdd, 0); return pchtdd; } /*************************************************************************** Compile this text file into a chunky file and open it. ***************************************************************************/ bool CHTDD::FCmdCompileChunky(PCMD pcmd) { FNI fni; PCFL pcfl; STN stnFile; MSFIL msfil; CHCM chcm; PDOC pdoc; if (!fni.FGetTemp()) return fTrue; Ptxtb()->GetName(&stnFile); pcfl = chcm.PcflCompile(Ptxtb()->Pbsf(), &stnFile, &fni, &msfil); if (pvNil == pcfl) { vpappb->TGiveAlertSz(PszLit("Compiling chunky file failed"), bkOk, cokExclamation); pcmd->cid = cidNil; // don't record // if the error file isn't empty, open it OpenSinkDoc(&msfil); return fTrue; } pdoc = DOC::PdocNew(&fni); pcfl->SetTemp(fTrue); ReleasePpo(&pcfl); if (pvNil == pdoc) { vpappb->TGiveAlertSz(PszLit("Can't open new chunky file"), bkOk, cokExclamation); pcmd->cid = cidNil; // don't record return fTrue; } pdoc->PdmdNew(); ReleasePpo(&pdoc); return fTrue; } /*************************************************************************** Compile this text file into a script and put it in a chunky file and open it. ***************************************************************************/ bool CHTDD::FCmdCompileScript(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); SCCG sccg; MSFIL msfil; STN stnFile; PSCPT pscpt; PDOC pdoc = pvNil; Ptxtb()->GetName(&stnFile); LEXB lexb(Ptxtb()->Pbsf(), &stnFile); pscpt = sccg.PscptCompileLex(&lexb, pcmd->cid == cidCompileScript, &msfil); if (pvNil == pscpt) { vpappb->TGiveAlertSz(PszLit("Compiling script failed"), bkOk, cokExclamation); pcmd->cid = cidNil; // don't record // if the error file isn't empty, open it OpenSinkDoc(&msfil); return fTrue; } // add the chunk and write the data if (pvNil == (pdoc = DOC::PdocNew(pvNil))) goto LFail; if (!pscpt->FSaveToChunk(pdoc->Pcfl(), kctgScript, 0)) { LFail: vpappb->TGiveAlertSz(PszLit("Can't create new chunky file"), bkOk, cokExclamation); ReleasePpo(&pscpt); ReleasePpo(&pdoc); pcmd->cid = cidNil; // don't record return fTrue; } ReleasePpo(&pscpt); pdoc->PdmdNew(); ReleasePpo(&pdoc); return fTrue; } /*************************************************************************** Open the file based message sink file as a chunky text document. ***************************************************************************/ void OpenSinkDoc(PMSFIL pmsfil) { PDOCB pdocb; PFIL pfil; FNI fni; bool fTemp; if (pvNil == (pfil = pmsfil->PfilRelease())) return; if (pfil->FpMac() == 0) { ReleasePpo(&pfil); return; } pfil->GetFni(&fni); fTemp = pfil->FTemp(); pdocb = (PDOCB)CHTXD::PchtxdNew(&fni); pfil->SetTemp(fTemp); ReleasePpo(&pfil); if (pvNil != pdocb) { pdocb->PdmdNew(); ReleasePpo(&pdocb); } } ================================================ FILE: kauai/tools/kpack.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Author: ShonK Project: Kauai Copyright (c) Microsoft Corporation Command line tool to pack or unpack a file. ***************************************************************************/ #include #include "frame.h" ASSERTNAME bool _FGetLwFromSzs(PSZS pszs, long *plw); /*************************************************************************** Main routine. Returns non-zero iff there's an error. ***************************************************************************/ int __cdecl main(int cpszs, char *prgpszs[]) { FNI fniSrc, fniDst; STN stn; char chs; FLO floSrc, floDst; long lwSig; BLCK blck; bool fPacked; bool fCompress = fTrue; long cfni = 0; long cfmt = vpcodmUtil->CfmtDefault(); #ifdef UNICODE fprintf(stderr, "\nMicrosoft (R) Kauai Pack Utility (Unicode; " Debug("Debug; ") __DATE__ "; " __TIME__ ")\n"); #else //! UNICODE fprintf(stderr, "\nMicrosoft (R) Kauai Pack Utility (Ansi; " Debug("Debug; ") __DATE__ "; " __TIME__ ")\n"); #endif //! UNICODE fprintf(stderr, "Copyright (C) Microsoft Corp 1995. All rights reserved.\n\n"); floSrc.pfil = pvNil; floDst.pfil = pvNil; for (prgpszs++; --cpszs > 0; prgpszs++) { chs = (*prgpszs)[0]; if (chs == '/' || chs == '-') { switch ((*prgpszs)[1]) { case 'd': case 'D': fCompress = fFalse; break; case 'c': case 'C': fCompress = fTrue; switch ((*prgpszs)[2]) { case '\0': cfmt = vpcodmUtil->CfmtDefault(); break; case '0': cfmt = cfmtNil; break; case '1': cfmt = kcfmtKauai; break; case '2': cfmt = kcfmtKauai2; break; default: fprintf(stderr, "Bad compression format\n\n"); goto LUsage; } break; case 'p': case 'P': fCompress = fTrue; if (cpszs <= 0 || !_FGetLwFromSzs(prgpszs[1], &cfmt)) { fprintf(stderr, "Bad compression format\n\n"); goto LUsage; } cpszs--; prgpszs++; break; default: goto LUsage; } } else if (cfni >= 2) { fprintf(stderr, "Too many file names\n\n"); goto LUsage; } else { stn.SetSzs(prgpszs[0]); if (!fniDst.FBuildFromPath(&stn)) { fprintf(stderr, "Bad file name\n\n"); goto LUsage; } if (cfni == 0) fniSrc = fniDst; cfni++; } } if (cfni != 2) { fprintf(stderr, "Wrong number of file names\n\n"); goto LUsage; } if (fCompress && cfmtNil != cfmt && !vpcodmUtil->FCanDo(cfmt, fTrue)) { fprintf(stderr, "Bad compression type\n\n"); goto LUsage; } if (pvNil == (floSrc.pfil = FIL::PfilOpen(&fniSrc))) { fprintf(stderr, "Can't open source file\n\n"); goto LFail; } floSrc.fp = 0; floSrc.cb = floSrc.pfil->FpMac(); if (fniDst.FEqual(&fniSrc) || pvNil == (floDst.pfil = FIL::PfilCreate(&fniDst))) { fprintf(stderr, "Can't create destination file\n\n"); goto LFail; } if (!fCompress) { long lwSwapped; if (floSrc.cb < size(long)) goto LBadSrc; if (!floSrc.FReadRgb(&lwSig, size(long), 0)) { fprintf(stderr, "Reading source file failed\n\n"); goto LFail; } lwSwapped = lwSig; SwapBytesRglw(&lwSwapped, 1); if (lwSig == klwSigPackedFile || lwSwapped == klwSigPackedFile) fPacked = fTrue; else if (lwSig == klwSigUnpackedFile || lwSwapped == klwSigUnpackedFile) fPacked = fFalse; else { LBadSrc: fprintf(stderr, "Source file is not packed\n\n"); goto LFail; } blck.Set(floSrc.pfil, size(long), floSrc.cb - size(long), fPacked); if (fPacked && !blck.FUnpackData()) { fprintf(stderr, "Unpacking source failed\n\n"); goto LFail; } floDst.fp = 0; floDst.cb = blck.Cb(); } else { blck.Set(floSrc.pfil, 0, floSrc.cb, fFalse); if (cfmtNil != cfmt) blck.FPackData(cfmt); // write the signature if (blck.FPacked()) lwSig = klwSigPackedFile; else lwSig = klwSigUnpackedFile; if (!floDst.pfil->FWriteRgb(&lwSig, size(long), 0)) { fprintf(stderr, "Writing destination failed\n\n"); goto LFail; } floDst.fp = size(long); floDst.cb = blck.Cb(fTrue); } if (!blck.FWriteToFlo(&floDst, fTrue)) { fprintf(stderr, "Writing destination failed\n\n"); goto LFail; } ReleasePpo(&floSrc.pfil); ReleasePpo(&floDst.pfil); FIL::ShutDown(); return 0; LUsage: // print usage fprintf(stderr, "%s", "Usage: kpack [-d] [-c[0|1|2]] [-p ] \n\n"); LFail: if (pvNil != floDst.pfil) floDst.pfil->SetTemp(); ReleasePpo(&floDst.pfil); ReleasePpo(&floSrc.pfil); FIL::ShutDown(); return 1; } /*************************************************************************** Get a long value from a string. If the string isn't a number and the length is <= 4, assumes the characters are to be packed into a long (ala CTGs and FTGs). ***************************************************************************/ bool _FGetLwFromSzs(PSZS pszs, long *plw) { STN stn; long ich; stn.SetSzs(pszs); if (stn.FGetLw(plw)) return fTrue; if (stn.Cch() > 4) return fFalse; *plw = 0; for (ich = 0; ich < stn.Cch(); ich++) *plw = (*plw << 8) + (byte)stn.Prgch()[ich]; return fTrue; } #ifdef DEBUG bool _fEnableWarnings = fTrue; /*************************************************************************** Warning proc called by Warn() macro ***************************************************************************/ void WarnProc(PSZS pszsFile, long lwLine, PSZS pszsMessage) { if (_fEnableWarnings) { fprintf(stderr, "%s(%ld) : warning", pszsFile, lwLine); if (pszsMessage != pvNil) { fprintf(stderr, ": %s", pszsMessage); } fprintf(stderr, "\n"); } } /*************************************************************************** Returning true breaks into the debugger. ***************************************************************************/ bool FAssertProc(PSZS pszsFile, long lwLine, PSZS pszsMessage, void *pv, long cb) { fprintf(stderr, "An assert occurred: \n"); if (pszsMessage != pvNil) fprintf(stderr, " Message: %s\n", pszsMessage); if (pv != pvNil) { fprintf(stderr, " Address %x\n", pv); if (cb != 0) { fprintf(stderr, " Value: "); switch (cb) { default: { byte *pb; byte *pbLim; for (pb = (byte *)pv, pbLim = pb + cb; pb < pbLim; pb++) fprintf(stderr, "%02x", (int)*pb); } break; case 2: fprintf(stderr, "%04x", (int)*(short *)pv); break; case 4: fprintf(stderr, "%08lx", *(long *)pv); break; } printf("\n"); } } fprintf(stderr, " File: %s\n", pszsFile); fprintf(stderr, " Line: %ld\n", lwLine); return fFalse; } #endif // DEBUG ================================================ FILE: kauai/tools/makefile ================================================ #---tools.mak # # Builds Ched, Chelp, and Chomp !IFNDEF MAKEFILE_KAUAI_TOOLS MAKEFILE_KAUAI_TOOLS = 1 !INCLUDE $(KAUAI_ROOT)\makefile.def #KAUAI SOURCE DIRECTORIES KAUAI_SRC_DIR = $(KAUAI_ROOT)\src KAUAI_TOOLS_DIR = $(KAUAI_ROOT)\tools #KAUAI OBJ DIRECTORIES KAUAI_OBJ_ROOT_DIR = $(KAUAI_ROOT)\obj KAUAI_OBJ_DIR = $(KAUAI_OBJ_ROOT_DIR)\$(BLD_TYPE_DIR) !IF "$(LOCAL_BUILD)" == "1" TARGET_DIR = !ELSE # LOCAL_BUILD TARGET_DIR = $(KAUAI_OBJ_DIR)^\ !ENDIF CHED_TARGETS =\ $(BASE_OBJS)\ $(FILE_OBJS)\ $(GUI_OBJS)\ $(KID_OBJS)\ $(KIDCOM_OBJS)\ $(PLAINTEXT_OBJS)\ $(DOC_OBJS)\ $(CHCM_OBJS)\ $(LEXER_OBJS)\ $(CHSE_OBJS)\ $(STREAM_OBJS)\ $(SCRCOM_OBJS)\ $(SCREXE_OBJS)\ $(GROUP_OBJS)\ $(RICHTEXT_OBJS)\ $(SOUND_OBJS)\ $(DLG_OBJS)\ $(CTL_OBJS)\ $(VIDEO_OBJS)\ $(TEXTEDIT_OBJS)\ $(MBMPIO_OBJS)\ $(CHED_OBJS)\ $(TARGET_DIR)ched.res CHELP_TARGETS =\ $(BASE_OBJS)\ $(GUI_OBJS)\ $(GROUP_OBJS)\ $(MBMPIO_OBJS)\ $(SOUND_OBJS)\ $(VIDEO_OBJS)\ $(KID_OBJS)\ $(SCREXE_OBJS)\ $(RICHTEXT_OBJS)\ $(DOC_OBJS)\ $(STREAM_OBJS)\ $(FILE_OBJS)\ $(CHSE_OBJS)\ $(DLG_OBJS)\ $(SCRCOM_OBJS)\ $(LEXER_OBJS)\ $(CTL_OBJS)\ $(TEXTEDIT_OBJS)\ !IF "$(UNICODE)" == "" $(SPELL_OBJS)\ !ENDIF $(CHELP_OBJS)\ $(TARGET_DIR)chelp.res #Chomp Special Case #Needs only pic*.cpp from Kauai Gui Objs PIC_OBJS =\ !IF "$(ARCH)" == "WIN" $(TARGET_DIR)picwin.obj\ !ELSEIF "$(ARCH)" == "MAC" $(TARGET_DIR)picmac.obj\ !ENDIF $(TARGET_DIR)pic.obj CHOMP_TARGETS =\ $(BASE_OBJS)\ $(FILE_OBJS)\ $(CHCM_OBJS)\ $(CHSE_OBJS)\ $(GROUP_OBJS)\ $(LEXER_OBJS)\ $(STREAM_OBJS)\ $(KIDCOM_OBJS)\ $(SCRCOM_OBJS)\ $(SCREXE_OBJS)\ $(MBMPIO_OBJS)\ $(KAUAI_OBJ_DIR)\midi.obj\ $(PIC_OBJS)\ $(CHOMP_OBJS) MKMBMP_TARGETS =\ $(BASE_OBJS)\ $(FILE_OBJS)\ $(GROUP_OBJS)\ $(MBMPIO_OBJS)\ $(TARGET_DIR)mkmbmp.obj KPACK_TARGETS =\ $(BASE_OBJS)\ $(FILE_OBJS)\ $(GROUP_OBJS)\ $(TARGET_DIR)kpack.obj CHMERGE_TARGETS =\ $(BASE_OBJS)\ $(FILE_OBJS)\ $(GROUP_OBJS)\ $(TARGET_DIR)chmerge.obj\ CHELPDMP_TARGETS =\ $(BASE_OBJS)\ $(FILE_OBJS)\ $(GROUP_OBJS)\ $(LEXER_OBJS)\ $(STREAM_OBJS)\ $(SCRCOM_OBJS)\ $(SCREXE_OBJS)\ $(CHSE_OBJS)\ $(TARGET_DIR)chelpdmp.obj\ $(TARGET_DIR)chelpexp.obj\ $(TARGET_DIR)mssio.obj #-Compile rules------------------------------------------------------------- PROGRAM_DATABASE = $(KAUAI_ROOT)\obj\$(BLD_TYPE_DIR)\kauai.pdb PRECOMPILED_HEADER = $(KAUAI_ROOT)\obj\$(BLD_TYPE_DIR)\kauai.pch CPPEXTRA = /Zi /Fd$(PROGRAM_DATABASE) /Fp$(PRECOMPILED_HEADER) !INCLUDE $(KAUAI_ROOT)\src\makefile SRC_DIR = $(KAUAI_TOOLS_DIR) OBJ_DIR = $(KAUAI_OBJ_DIR) TGT_NAME = Kauai Tools !INCLUDE $(KAUAI_ROOT)\makefile.rul #-Targets------------------------------------------------------------------- ALL_KAUAI_TOOLS = $(TARGET_DIR)ched.exe \ $(TARGET_DIR)chelp.exe \ $(TARGET_DIR)chomp.exe \ $(TARGET_DIR)mkmbmp.exe \ $(TARGET_DIR)kpack.exe \ $(TARGET_DIR)chmerge.exe \ $(TARGET_DIR)chelpdmp.exe ALL_TARGETS_ROOT = $(ALL_TARGETS_ROOT) $(ALL_KAUAI_TOOLS) CLEAN_KAUAI_TOOLS = CLEAN_CHED CLEAN_CHELP CLEAN_CHOMP CLEAN_MKMBMP CLEAN_KPACK CLEAN_CHMERGE CLEAN_CHELPDMP CLEAN_TARGETS_ROOT = $(CLEAN_TARGETS_ROOT) $(CLEAN_KAUAI_TOOLS) !IF "$(LOCAL_BUILD)" != "1" !IF "$(LOCAL_BUILD)" != "0" # Kauai src\makefile knows how to make this dir # $(KAUAI_OBJ_DIR) : # @echo Making Directories $(KAUAI_OBJ_DIR)... # if not exist $(KAUAI_OBJ_ROOT_DIR)/nul mkdir $(KAUAI_OBJ_ROOT_DIR) # if not exist $(KAUAI_OBJ_DIR)/nul mkdir $(KAUAI_OBJ_DIR) ALL: $(KAUAI_OBJ_DIR) $(ALL_KAUAI_TOOLS) CLEAN : RM ALL RM : @echo Cleaning $(KAUAI_OBJ_DIR)\ directory @DEL /q $(KAUAI_OBJ_DIR)\*.obj 2>nul @DEL /q $(KAUAI_OBJ_DIR)\*.pch 2>nul @DEL /q $(KAUAI_OBJ_DIR)\*.pdb 2>nul @DEL /q $(KAUAI_OBJ_DIR)\*.exe 2>nul @DEL /q $(KAUAI_OBJ_DIR)\*.res 2>nul @DEL /q $(KAUAI_OBJ_DIR)\*.cod 2>nul @DEL /q $(KAUAI_OBJ_DIR)\*.map 2>nul @DEL /q $(KAUAI_OBJ_DIR)\*.lib 2>nul @DEL /q $(KAUAI_OBJ_DIR)\*.i 2>nul @DEL /q $(KAUAI_OBJ_DIR)\*.lnk 2>nul !ENDIF # LOCAL_BUILD != 0 RMOBJ : $(CLEAN_KAUAI_TOOLS) !ENDIF # !LOCAL_BUILD CLEAN_CHED: @echo <nul^ DEL /q dummy.nul ) 2>nul <nul^ DEL /q dummy.nul ) 2>nul <nul^ DEL /q dummy.nul ) 2>nul <nul^ DEL /q dummy.nul ) 2>nul <nul^ DEL /q dummy.nul ) 2>nul <nul^ DEL /q dummy.nul ) 2>nul <nul^ DEL /q dummy.nul ) 2>nul < #include "frame.h" ASSERTNAME bool _FGetLwFromSzs(PSZS pszs, long *plw); /*************************************************************************** Main routine. Returns non-zero iff there's an error. ***************************************************************************/ int __cdecl main(int cpszs, char *prgpszs[]) { FNI fniSrc, fniDst; STN stn; char chs; FLO flo; long lwSig; PMBMP pmbmp = pvNil; long cfni = 0; long xp = 0; long yp = 0; long lwTrans = 0; long cfmt = cfmtNil; #ifdef UNICODE fprintf(stderr, "\nMicrosoft (R) Make Mbmp Utility (Unicode; " Debug("Debug; ") __DATE__ "; " __TIME__ ")\n"); #else //! UNICODE fprintf(stderr, "\nMicrosoft (R) Make Mbmp Utility (Ansi; " Debug("Debug; ") __DATE__ "; " __TIME__ ")\n"); #endif //! UNICODE fprintf(stderr, "Copyright (C) Microsoft Corp 1995. All rights reserved.\n\n"); flo.pfil = pvNil; for (prgpszs++; --cpszs > 0; prgpszs++) { chs = (*prgpszs)[0]; if (chs == '/' || chs == '-') { switch ((*prgpszs)[1]) { case 'c': case 'C': switch ((*prgpszs)[2]) { case '\0': cfmt = vpcodmUtil->CfmtDefault(); break; case '0': cfmt = cfmtNil; break; case '1': cfmt = kcfmtKauai; break; case '2': cfmt = kcfmtKauai2; break; default: fprintf(stderr, "Bad compression format\n\n"); goto LUsage; } break; case 'p': case 'P': if (cpszs <= 0 || !_FGetLwFromSzs(prgpszs[1], &cfmt)) { fprintf(stderr, "Bad compression format\n\n"); goto LUsage; } cpszs--; prgpszs++; break; case 'o': case 'O': // get the coordinates of the reference point if (cpszs < 2) goto LUsage; cpszs -= 2; stn.SetSzs(prgpszs[1]); if (!stn.FGetLw(&xp)) goto LUsage; stn.SetSzs(prgpszs[2]); if (!stn.FGetLw(&yp)) goto LUsage; prgpszs += 2; break; case 't': case 'T': // get the transparent pixel value if (cpszs < 1) goto LUsage; cpszs--; stn.SetSzs(prgpszs[1]); if (!stn.FGetLw(&lwTrans)) goto LUsage; prgpszs++; break; default: goto LUsage; } } else if (cfni >= 2) { fprintf(stderr, "Too many file names\n\n"); goto LUsage; } else { stn.SetSzs(prgpszs[0]); if (!fniDst.FBuildFromPath(&stn)) { fprintf(stderr, "Bad file name\n\n"); goto LUsage; } if (cfni == 0) fniSrc = fniDst; cfni++; } } if (cfni != 2) { fprintf(stderr, "Wrong number of file names\n\n"); goto LUsage; } if (cfmtNil != cfmt && !vpcodmUtil->FCanDo(cfmt, fTrue)) { fprintf(stderr, "Bad compression type\n\n"); goto LUsage; } pmbmp = MBMP::PmbmpReadNative(&fniSrc, B0Lw(lwTrans), xp, yp); if (pvNil == pmbmp) { fprintf(stderr, "reading bitmap failed\n\n"); goto LFail; } if (pvNil == (flo.pfil = FIL::PfilCreate(&fniDst))) { fprintf(stderr, "Couldn't create destination file\n\n"); goto LFail; } flo.fp = size(long); flo.cb = pmbmp->CbOnFile(); if (cfmtNil != cfmt) { BLCK blck; if (!blck.FSetTemp(flo.cb) || !pmbmp->FWrite(&blck)) { fprintf(stderr, "allocation failure\n\n"); goto LFail; } ReleasePpo(&pmbmp); if (!blck.FPackData(cfmt)) lwSig = klwSigUnpackedFile; else { lwSig = klwSigPackedFile; flo.cb = blck.Cb(fTrue); } if (!flo.pfil->FWriteRgb(&lwSig, size(long), 0) || !blck.FWriteToFlo(&flo, fTrue)) { fprintf(stderr, "writing to destination file failed\n\n"); goto LFail; } } else { lwSig = klwSigUnpackedFile; if (!flo.pfil->FWriteRgb(&lwSig, size(long), 0) || !pmbmp->FWriteFlo(&flo)) { fprintf(stderr, "writing to destination file failed\n\n"); goto LFail; } ReleasePpo(&pmbmp); } ReleasePpo(&flo.pfil); FIL::ShutDown(); return 0; LUsage: // print usage fprintf(stderr, "%s", "Usage: mkmbmp [-c[0|1|2]] [-p ] [-o ] [-t ] \n\n"); LFail: ReleasePpo(&pmbmp); if (pvNil != flo.pfil) flo.pfil->SetTemp(); ReleasePpo(&flo.pfil); FIL::ShutDown(); return 1; } /*************************************************************************** Get a long value from a string. If the string isn't a number and the length is <= 4, assumes the characters are to be packed into a long (ala CTGs and FTGs). ***************************************************************************/ bool _FGetLwFromSzs(PSZS pszs, long *plw) { STN stn; long ich; stn.SetSzs(pszs); if (stn.FGetLw(plw)) return fTrue; if (stn.Cch() > 4) return fFalse; *plw = 0; for (ich = 0; ich < stn.Cch(); ich++) *plw = (*plw << 8) + (byte)stn.Prgch()[ich]; return fTrue; } #ifdef DEBUG bool _fEnableWarnings = fTrue; /*************************************************************************** Warning proc called by Warn() macro ***************************************************************************/ void WarnProc(PSZS pszsFile, long lwLine, PSZS pszsMessage) { if (_fEnableWarnings) { fprintf(stderr, "%s(%ld) : warning", pszsFile, lwLine); if (pszsMessage != pvNil) { fprintf(stderr, ": %s", pszsMessage); } fprintf(stderr, "\n"); } } /*************************************************************************** Returning true breaks into the debugger. ***************************************************************************/ bool FAssertProc(PSZS pszsFile, long lwLine, PSZS pszsMessage, void *pv, long cb) { fprintf(stderr, "An assert occurred: \n"); if (pszsMessage != pvNil) fprintf(stderr, " Message: %s\n", pszsMessage); if (pv != pvNil) { fprintf(stderr, " Address %x\n", pv); if (cb != 0) { fprintf(stderr, " Value: "); switch (cb) { default: { byte *pb; byte *pbLim; for (pb = (byte *)pv, pbLim = pb + cb; pb < pbLim; pb++) fprintf(stderr, "%02x", (int)*pb); } break; case 2: fprintf(stderr, "%04x", (int)*(short *)pv); break; case 4: fprintf(stderr, "%08lx", *(long *)pv); break; } printf("\n"); } } fprintf(stderr, " File: %s\n", pszsFile); fprintf(stderr, " Line: %ld\n", lwLine); return fFalse; } #endif // DEBUG ================================================ FILE: makefile ================================================ #--- $(SOC_ROOT)\makefile.mak !INCLUDE $(KAUAI_ROOT)\makefile.def !INCLUDE $(SOC_ROOT)\version.def .SILENT: ALL: ENSURE_OBJ_DIR ALL_BREN ALL_SRC ALL_TOOLS ALL_BREN: cd $(SOC_ROOT)\bren @echo Making Bren All... $(MAKE) /NOLOGO all cd $(SOC_ROOT) ALL_SRC: cd $(SOC_ROOT)\src @echo Making Soc\src All... $(MAKE) /NOLOGO all cd $(SOC_ROOT) ALL_TOOLS: cd $(SOC_ROOT)\tools @echo Making Soc\tools All... $(MAKE) /NOLOGO all cd $(SOC_ROOT) SOC_OBJ_ROOT_DIR = $(SOC_ROOT)\obj SOC_OBJ_DIR = $(SOC_OBJ_ROOT_DIR)\$(BLD_TYPE_DIR) DIST_ROOT = $(SOC_ROOT)\DIST ENSURE_OBJ_DIR: if not exist $(SOC_OBJ_ROOT_DIR)/nul mkdir $(SOC_OBJ_ROOT_DIR) if not exist $(SOC_OBJ_DIR)/nul mkdir $(SOC_OBJ_DIR) DIST: ALL_SRC -mkdir $(DIST_ROOT) 2>nul -mkdir $(DIST_ROOT)\"Microsoft Kids" -mkdir $(DIST_ROOT)\"Microsoft Kids"\"3D Movie Maker" -mkdir $(DIST_ROOT)\"Microsoft Kids"\Users" -mkdir $(DIST_ROOT)\"Microsoft Kids"\Users\Melanie" copy /Y $(SOC_ROOT)\cd9\*.* $(DIST_ROOT)\"Microsoft Kids"\"3D Movie Maker" copy /Y $(SOC_OBJ_DIR)\*.chk $(DIST_ROOT)\"Microsoft Kids"\"3D Movie Maker" copy /Y $(SOC_OBJ_DIR)\3dmovie.exe $(DIST_ROOT)\ ZIP: DIST cd $(DIST_ROOT) 7z a -r 3DMMForever_$(RELEASE_VERSION).zip 3dmovie.exe "Microsoft Kids" CLEAN: CLEAN_REST CLEAN_BREN BUILD_REST CLEAN_BREN: cd $(SOC_ROOT)\bren @echo Making Bren Clean... $(MAKE) /NOLOGO clean cd $(SOC_ROOT) CLEAN_REST: @echo Cleaning $(SOC_ROOT)\obj\$(BLD_TYPE_DIR)\ directory del /q $(SOC_ROOT)\obj\$(BLD_TYPE_DIR)\*.obj 2>nul del /q $(SOC_ROOT)\obj\$(BLD_TYPE_DIR)\*.pch 2>nul del /q $(SOC_ROOT)\obj\$(BLD_TYPE_DIR)\*.pdb 2>nul del /q $(SOC_ROOT)\obj\$(BLD_TYPE_DIR)\*.exe 2>nul del /q $(SOC_ROOT)\obj\$(BLD_TYPE_DIR)\*.res 2>nul del /q $(SOC_ROOT)\obj\$(BLD_TYPE_DIR)\*.chk 2>nul del /q $(SOC_ROOT)\obj\$(BLD_TYPE_DIR)\*.cht 2>nul del /q $(SOC_ROOT)\obj\$(BLD_TYPE_DIR)\*.cod 2>nul del /q $(SOC_ROOT)\obj\$(BLD_TYPE_DIR)\*.map 2>nul del /q $(SOC_ROOT)\obj\$(BLD_TYPE_DIR)\*.thd 2>nul del /q $(SOC_ROOT)\obj\$(BLD_TYPE_DIR)\*.lib 2>nul del /q $(SOC_ROOT)\obj\$(BLD_TYPE_DIR)\*.i 2>nul del /q $(SOC_ROOT)\obj\$(BLD_TYPE_DIR)\*.lnk 2>nul BUILD_REST: cd $(SOC_ROOT)\src @echo Making Src Clean... $(MAKE) /NOLOGO cd $(SOC_ROOT)\tools @echo Making Tools Clean... $(MAKE) /NOLOGO cd $(SOC_ROOT)  ================================================ FILE: makefile.kmk ================================================ # makefile.kmk # # This is the makefile used by kmake.bat. It knows how to build everything # in Socrates. LOCAL_BUILD=1 # Included files should append targets as follows: # *** Any target that should be executed for a clean should be appended # to "CLEAN_TARGETS_ROOT" # *** Any target that should be built by default should be appended to # "ALL_TARGETS_ROOT". Note that there *will* be targets defined which # should not be appended to this, because they are only interesting # when used as dependents to something else. CLEAN_TARGETS_ROOT= ALL_TARGETS_ROOT= ############################################################################# ## Process ERRLVL ## ############################################################################# # CHKERR is used in any build rule that should cause the build to stop !IF "$(ERRLVL)" == "FATAL" CHKERR=@@if errorlevel 1 goto error !ELSE CHKERR=@@if errorlevel 1 (echo Removing goodmake.log & rm goodmake.log) !ENDIF # CHKERRW is used in any build rule that should report an error, but should # never cause the build to stop, even if ERRLVL == FATAL CHKERRW=@@if errorlevel 1 (echo Removing goodmake.log & rm goodmake.log) .SUFFIXES: .cpp .asm .c .obj .rc # NOTE: we don't want to build all Kauai targets; we use Kauai's makefiles # only for their dependencies. Also, we don't want Kauai sources built in # our current directory. !IF "$(ALL_TARGETS_ROOT)" != "" !ERROR Should not have any ALL targets defined yet !ENDIF !IF "$(CLEAN_TARGETS_ROOT)" != "" !ERROR Should not have any CLEAN targets defined yet !ENDIF LOCAL_BUILD=0 # These guys always get built elsewhere !INCLUDE $(KAUAI_ROOT)\makefile.def !INCLUDE $(KAUAI_ROOT)\src\makefile # Bren gets built elsewhere, but should still be cleaned as part of a SOC clean ALL_TARGETS_ROOT= CLEAN_TARGETS_ROOT= !INCLUDE $(SOC_ROOT)\bren\makefile LOCAL_BUILD=1 !INCLUDE $(SOC_ROOT)\src\engine\makefile !INCLUDE $(SOC_ROOT)\src\studio\makefile !IF "$(TYPE)" == "DBSHIP" || "$(TYPE)" == "SHIP" || "$(BLDG_DEBUG)" != "" !INCLUDE $(SOC_ROOT)\src\building\makefile !ENDIF !IF "$(TYPE)" == "DBSHIP" || "$(TYPE)" == "SHIP" || "$(HELP_DEBUG)" != "" !INCLUDE $(SOC_ROOT)\src\help\makefile !ENDIF !IF "$(TYPE)" == "DBSHIP" || "$(TYPE)" == "SHIP" || "$(HELPA_DEBUG)" != "" !INCLUDE $(SOC_ROOT)\src\helpaud\makefile !ENDIF !IF "$(TYPE)" == "DBSHIP" || "$(TYPE)" == "SHIP" || "$(SHARED_DEBUG)" != "" !INCLUDE $(SOC_ROOT)\src\shared\makefile !ENDIF !INCLUDE $(SOC_ROOT)\tools\makefile # Leave this name blank, since it's hardly ever correct anyway TGT_NAME= # NOTE: unlike the other "CLEAN" targets, this does not actually do a build. # This is intentional (BY DESIGN). CLEAN: CLEAN_BREN_OBJ -del $(SOC_ROOT)\obj\$(BLD_TYPE_DIR)\*.obj 2> nul -del $(SOC_ROOT)\obj\$(BLD_TYPE_DIR)\*.pch 2> nul -del $(SOC_ROOT)\obj\$(BLD_TYPE_DIR)\*.pdb 2> nul -del $(SOC_ROOT)\obj\$(BLD_TYPE_DIR)\*.exe 2> nul -del $(SOC_ROOT)\obj\$(BLD_TYPE_DIR)\*.res 2> nul -del $(SOC_ROOT)\obj\$(BLD_TYPE_DIR)\*.chk 2> nul -del $(SOC_ROOT)\obj\$(BLD_TYPE_DIR)\*.cht 2> nul -del $(SOC_ROOT)\obj\$(BLD_TYPE_DIR)\*.cod 2> nul -del $(SOC_ROOT)\obj\$(BLD_TYPE_DIR)\*.map 2> nul -del $(SOC_ROOT)\obj\$(BLD_TYPE_DIR)\*.thd 2> nul -del $(SOC_ROOT)\obj\$(BLD_TYPE_DIR)\*.lib 2> nul -del $(SOC_ROOT)\obj\$(BLD_TYPE_DIR)\*.lnk 2> nul -del $(SOC_ROOT)\obj\$(BLD_TYPE_DIR)\*.ilk 2> nul -del $(SOC_ROOT)\obj\$(BLD_TYPE_DIR)\*.i 2> nul -del $(SOC_ROOT)\obj\$(BLD_TYPE_DIR)\*.thd 2> nul CLEAN_BY_FILE: $(CLEAN_TARGETS_ROOT) @echo on ALL: $(ALL_TARGETS_ROOT) ================================================ FILE: makefile.rul ================================================ # Use this file to automatically declare rules for a group of targets. # Set the "SRC_DIR" variable to the appropriate directory, set OBJ_DIR # to the appropriate target directory and then include this file. # If the "LOCAL_BUILD" variable is defined and set to "1", this indicates that # we're already cd'd to the target directory. This allows nmake to use a much # simpler set of make rules. #-Compile rules------------------------------------------------------------- !IF "$(LOCAL_BUILD)" != "1" !IF "$(LOCAL_BUILD)" != "0" {$(SRC_DIR)}.cpp.obj: @nmake /NOLOGO $(OBJ_DIR)\%|fF.obj {$(SRC_DIR)}.cpp.exe: @nmake /NOLOGO $(OBJ_DIR)\%|fF.exe {$(SRC_DIR)}.asm.obj: @nmake /NOLOGO $(OBJ_DIR)\%|fF.obj {$(SRC_DIR)}.rc.res: @nmake /NOLOGO $(OBJ_DIR)\%|fF.res {$(SRC_DIR)}.cht.chk: @nmake /NOLOGO $(OBJ_DIR)\%|fF.chk {$(SRC_DIR)}.cht.thd: @nmake /NOLOGO $(OBJ_DIR)\%|fF.chk {$(SRC_DIR)}.cpp.i: @nmake /NOLOGO $(OBJ_DIR)\%|fF.i {$(SRC_DIR)}.cpp.cod: @nmake /NOLOGO $(OBJ_DIR)\%|fF.cod !ENDIF # LOCAL_BUILD != 0 {$(SRC_DIR)}.cpp{$(OBJ_DIR)}.obj: !@echo Compiling $(TGT_NAME) Src... $< $(CPP) $(CPPFLAGS) /Zi /Fd$(SOC_OBJ_DIR)\soc.pdb /Fp$(SOC_OBJ_DIR)\soc.pch /Fo$@ $(DEFS) $< $(CHKERR) {$(SRC_DIR)}.c{$(OBJ_DIR)}.obj: !@echo Compiling $(TGT_NAME) Src... $< $(CPP) $(CPPFLAGS) /Zi /Fd$(SOC_OBJ_DIR)\soc.pdb /Fp$(SOC_OBJ_DIR)\soc.pch /Fo$@ $(DEFS) $< $(CHKERR) {$(SRC_DIR)}.asm{$(OBJ_DIR)}.obj: !@echo Compiling $(TGT_NAME) Assembly Src... $< $(ASM) $(ASMFLAGS) /Fo$@ $(DEFS) $< $(CHKERR) {$(SRC_DIR)}.rc{$(OBJ_DIR)}.res: !@echo Compiling $(TGT_NAME) Resource... $< $(RC) $(DEFS) /Fo$@ $< $(CHKERR) {$(SRC_DIR)}.cht{$(OBJ_DIR)}.chk: cl /E -I%|pF -I$(@D) $(DEFS) /Tp$< > $*.i $(CHKERR) $(CHOMP) $*.i $@ $(CHKERR) {$(SRC_DIR)}.cht{$(OBJ_DIR)}.thd: cl /E -I%|pF -I$(@D) $(DEFS) /Tp$< > $*.i $(CHKERR) $(CHOMP) $*.i $@ $(CHKERR) {$(SRC_DIR)}.cpp{$(OBJ_DIR)}.i: !@echo Compiling $(TGT_NAME) Src... $< $(CPP) /E $(DEFS) $< > $@ $(CHKERR) {$(SRC_DIR)}.cpp{$(OBJ_DIR)}.cod: !@echo Compiling $(TGT_NAME) Src... $< $(CPP) /FAcs $(CPPFLAGS) /Zi /Fd$(SOC_OBJ_DIR)\soc.pdb /Fp$(SOC_OBJ_DIR)\soc.pch $(DEFS) /Fa$@ $< $(CHKERR) !ELSE # !LOCAL_BUILD {$(SRC_DIR)}.cpp.obj: $(CPP) $(CPPFLAGS) /Zi /Fdsoc.pdb /Fpsoc.pch $(DEFS) $< $(CHKERR) {$(SRC_DIR)}.c.obj: $(CPP) $(CPPFLAGS) /Zi /Fdsoc.pdb /Fpsoc.pch $(DEFS) $< $(CHKERR) {$(SRC_DIR)}.asm.obj: $(ASM) $(ASMFLAGS) /Fo$@ $(DEFS) $< {$(SRC_DIR)}.rc.res: $(RC) $(DEFS) /Fo$@ $< $(CHKERR) {$(SRC_DIR)}.cht.chk: cl /P -I%|pF -I. $(DEFS) /Tp$< $(CHKERR) $(CHOMP) $(@B).i $@ $(CHKERR) {$(SRC_DIR)}.cht.thd: cl /P -I%|pF -I. $(DEFS) /Tp$< $(CHKERR) $(CHOMP) $(@B).i $@ $(CHKERR) {$(SRC_DIR)}.cpp.i: $(CPP) /P $(DEFS) $< $(CHKERR) {$(SRC_DIR)}.cpp.cod: $(CPP) /FAcs $(CPPFLAGS) /Zi /Fdsoc.pdb /Fpsoc.pch $(DEFS) /Fa$@ $< $(CHKERR) !ENDIF # LOCAL_BUILD ================================================ FILE: setvars.bat ================================================ :: Copyright (c) Microsoft Corporation. :: Licensed under the MIT License. :: Variables documented in README.md :: Setup the Socrates Directory Environment Variable set SOC_ROOT=%cd% :: Setup the Kauai dir that's needed by most things set KAUAI_ROOT=%SOC_ROOT%\kauai :: Update includes to cover whats needed set include=%include%;%SOC_ROOT%\INC;%SOC_ROOT%\BREN\INC;%KAUAI_ROOT%\SRC;%SOC_ROOT%\SRC :: Set project set PROJ=SOC :: Set operating system to compile for set ARCH=WIN :: Uncomment this to compile for Unicode :: set UNICODE=1 :: Set build type set TYPE=DBSHIP :: Use optimized assembly for Intel 80386 set CHIP=IN_80386 :: BLD_TYPE_DIR will be set automatically ================================================ FILE: src/building/backstag.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ WAVE_CHUNK( "building\sound\backstag\GOIDA.wav", kwavVO40 ) WAVE_CHUNK( "building\sound\backstag\GOSTU.wav", kwavVO41 ) WAVE_CHUNK( "building\sound\backstag\GOPRJ.wav", kwavVO43 ) OBJECT( "Backstage: mczee!", kgobBackstageMcZee, 200, kcrsHand1 ) // ------------------------------------------------------------- // State 1: Default creation state. And the dispatch state. // Use the global kstEntry to decide which state to enter next. // ------------------------------------------------------------- REP_ANIM( CHID( kst1, krepEnterAnimation ), "Backstage McZee dispatch." ) ASSERT((GLOBAL(kstEntry) >= kst2 && GLOBAL(kstEntry) <= kst6) || GLOBAL(kstEntry) == 10); // The following flag will control whether or not mczee audio accompanies // balloon creation. ie. in toggling help on and off McZee doesn't keep talking! // If set to false, Mz audio and then the flag is set to TRUE. If true, no audio // This is reset each time you create the lobby object. .f1sthelp=fFalse; .fLipsink = fFalse; // If we're doing the quick passthru to the Studio, we want to go // directly into the Tools. If (GLOBAL(kstEntry) == kst6); .nxtPlcState = kst2; End; ChangeStateThis(GLOBAL(kstEntry)); ENDCHUNK // ------------------------------------------------------------------- // State 2: The waiting McZee state, where the help balloon pops. // Click McZee: turns help on and off // Exits: Click doors to enter other rooms. // ------------------------------------------------------------------- REP_ANIM( CHID( kst2, krepDefault ), "Backstage. Entry 2. Wait state and map" ) PLAYMIDI( kmidBackstage ); If( GLOBAL( fBackstagePS ) ); SETKEYS(kflgBuildingMin); SETGLOBAL( fBackstagePS, fFalse ); WAIT_FOR_TRANSITION(); // Wait for a complete palette transition. CreateChildGob( kgobBackstage1, kgobBackstageMcZeeAVI, kgobBackstageMcZeeAVI ); While( PlayingGob( kgobBackstageMcZeeAVI )); Cell( kcellNull, 0,0, 6 ); // Cell command being used as a timer. End; DestroyGob( kgobBackstageMcZeeAVI ); SETKEYS(kflgBuildingAll); End; If( !FGobExists( kgobBackstage1Bag ) ); CreateChildGob( kgobBackstage1, kgobBackstage1Bag, kgobBackstage1Bag ); End; Cell( kcell101, 0, 0, 0 ); // This cell is necessary to give this state a representation if // the AVI does not play. A representation is needed for the help // balloon to position itself properly. // Help stuff If( GLOBAL(fHelpOn) ); CreateHelpGob( kgobBackstage1, ktpcBackstage ); Elif( GLOBAL( fBkstg1stHelp ) ); SETGLOBAL( fBkstg1stHelp, fFalse ); SETGLOBAL( fHelpOn, fTrue ); CreateHelpGob( kgobBackstage1, ktpcBackstage ); End; While( fTrue ); If( .fLipsink ); .fLipsink = fFalse; cnt = kcell501; VOICE( kwavVO59, ktpcVO59 ); While( cnt < kcell520 ); Cell( cnt++, 0, 0, 6); End; End; cnt = kcell1; While( cnt <= kcell12 ); Cell( cnt, 0,0, 6 ); cnt++; End; rnd=Rnd(10); If( rnd == 0 ); cnt = kcell21; While( cnt <= kcell32 ); Cell( cnt, 0,0, 6 ); cnt++; End; Elif( rnd == 1 ); cnt = kcell32; While( cnt >= kcell21 ); Cell( cnt, 0,0, 6 ); cnt--; End; Elif( rnd == 2 ); // spin faster and faster and faster! Cell( kcell21, 0,0, 11 ); Cell( kcell22, 0,0, 10 ); Cell( kcell23, 0,0, 9 ); Cell( kcell24, 0,0, 8 ); Cell( kcell25, 0,0, 7 ); Cell( kcell26, 0,0, 6 ); Cell( kcell27, 0,0, 4 ); Cell( kcell28, 0,0, 4 ); Cell( kcell29, 0,0, 4 ); Cell( kcell30, 0,0, 4 ); Cell( kcell23, 0,0, 4 ); Cell( kcell24, 0,0, 4 ); Cell( kcell25, 0,0, 4 ); Cell( kcell26, 0,0, 4 ); Cell( kcell27, 0,0, 6 ); Cell( kcell28, 0,0, 7 ); Cell( kcell29, 0,0, 8 ); Cell( kcell30, 0,0, 9 ); Cell( kcell31, 0,0, 10 ); Cell( kcell32, 0,0, 11 ); End; End; ENDCHUNK REP_ANIM( CHID( kst3, krepDefault ), "Studio welcome" ) PLAYMIDI( kmidStudio ); WAIT_FOR_TRANSITION(); // Wait for a complete palette transition. CreateChildGob( kgobBackstage1, kgobBackstageMcZeeAVI3, kgobBackstageMcZeeAVI3 ); DISABLEHOTSPOTS(kflgBuildingMin); While( PlayingGob( kgobBackstageMcZeeAVI3 )); Cell( kcellNull, 0,0, 6 ); // Cell command being used as a timer. End; DestroyGob( kgobBackstageMcZeeAVI3 ); NEXTPLACE1(kgobStudio1, kst2 ); ENDCHUNK REP_ANIM(CHID(kst4, krepDefault), "Ideas welcome") PLAYMIDI( kmidIdeas ); WAIT_FOR_TRANSITION(); // Wait for a complete palette transition. CreateChildGob( kgobBackstage1, kgobBackstageMcZeeAVI2, kgobBackstageMcZeeAVI2 ); DISABLEHOTSPOTS(kflgBuildingMin); While( PlayingGob( kgobBackstageMcZeeAVI2 )); Cell( kcellNull, 0,0, 6 ); // Cell command being used as a timer. End; DestroyGob( kgobBackstageMcZeeAVI2 ); NEXTPLACE1(kgobInspiration1, kst2 ); ENDCHUNK REP_ANIM( CHID(kst5, krepDefault), "Projects welcome") PLAYMIDI( kmidProject ); WAIT_FOR_TRANSITION(); // Wait for a complete palette transition. CreateChildGob( kgobBackstage1, kgobBackstageMcZeeAVI1, kgobBackstageMcZeeAVI1 ); DISABLEHOTSPOTS(kflgBuildingMin); While( PlayingGob( kgobBackstageMcZeeAVI1 )); Cell( kcellNull, 0,0, 6 ); // Cell command being used as a timer. End; DestroyGob( kgobBackstageMcZeeAVI1 ); NEXTPLACE1(kgobProjects1, kst1); ENDCHUNK REP_ANIM( CHID(kst6, krepDefault), "Plunger opens studio") Cell( kcell21, 0,0, 1 ); // draw one cell (to place McZee) If( !FGobExists( kgobBackstage1Bag ) ); CreateChildGob( kgobBackstage1, kgobBackstage1Bag, kgobBackstage1Bag ); End; WAIT_FOR_TRANSITION(); // Wait for a complete palette transition. // destroy the help balloon SETGLOBAL( fHelpOn, fFalse ); DestroyGob( kgobBalloon1d ); // This destroys the balloon that holds the tip DISABLEHOTSPOTS(kflgBuildingMin); PLAYMIDI( kmidStudio ); CreateChildGob( kgobBackstage1, kgobBackstageMcZeeAVI6, kgobBackstageMcZeeAVI6 ); While( PlayingGob( kgobBackstageMcZeeAVI6 )); Cell( kcellNull, 0,0, 6 ); // Cell command being used as a timer. End; DestroyGob( kgobBackstageMcZeeAVI6 ); NEXTPLACE1( kgobStudio1, .nxtPlcState ); // The next state is determined from ENDCHUNK // the entry state into this place. REP_ANIM( CHID( kst8, krepDefault ), "Plunger opens ideas" ) // destroy the help balloon SETGLOBAL( fHelpOn, fFalse ); DestroyGob( kgobBalloon1d ); // This destroys the balloon that holds the tip DISABLEHOTSPOTS(kflgBuildingMin); PLAYMIDI( kmidIdeas ); CreateChildGob( kgobBackstage1, kgobBackstageMcZeeAVI4, kgobBackstageMcZeeAVI4 ); While( PlayingGob( kgobBackstageMcZeeAVI4 )); Cell( kcellNull, 0,0, 6 ); // Cell command being used as a timer. End; DestroyGob( kgobBackstageMcZeeAVI4 ); NEXTPLACE1( kgobInspiration1, kst2 ); ENDCHUNK REP_ANIM( CHID( kst9, krepDefault ), "Plunger opens projects" ) // destroy the help balloon SETGLOBAL( fHelpOn, fFalse ); DestroyGob( kgobBalloon1d ); // This destroys the balloon that holds the tip DISABLEHOTSPOTS(kflgBuildingMin); PLAYMIDI( kmidProject ); CreateChildGob( kgobBackstage1, kgobBackstageMcZeeAVI5, kgobBackstageMcZeeAVI5 ); While( PlayingGob( kgobBackstageMcZeeAVI5 )); Cell( kcellNull, 0,0, 6 ); // Cell command being used as a timer. End; DestroyGob( kgobBackstageMcZeeAVI5 ); NEXTPLACE1( kgobProjects1, kst1 ); ENDCHUNK REP_ANIM( CHID( kst10, krepDefault ), "Camera pull to backstage" ) Cell( kcell401, 0,0, 6 ); // This first cell is full screen so put it up and fade into it. WAIT_FOR_TRANSITION(); // Wait for a complete palette transition. PLAYMIDI( kmidBackstage ); cnt=kcell402; While( cnt <= kcell421 ); Cell( cnt++, 0,0, 6 ); End; // The above animation ends with McZee off stage. If the long // intro (1 time per session) animation is going to play, it ends // with McZee in the idle loop. Otherwise a short animation is need // to bring McZee from off screen to the idle loop. // Here is the "Otherwise" animation: If( !GLOBAL( fBackstagePS ) ); cnt=kcell451; CreateChildGob( kgobBackstage1, kgobBackstage1Bag, kgobBackstage1Bag ); ChangeStateGob( kgobBackstage1Bag, kst2 ); CreateChildGob( kgobBackstage1, kgobBackstage1Shadow, kgobBackstage1Shadow ); While( cnt <= kcell484 ); Cell( cnt++, 0,0, 8 ); End; End; ChangeStateThis( kst2 ); ENDCHUNK CLICK_SCRIPT("Clicked Mz, toggle help") If( GLOBAL( fHelpOn ) ); SETGLOBAL( fHelpOn, fFalse ); DestroyGob( kgobBalloon1d ); // This destroys the balloon that holds the tip Else; SETGLOBAL( fHelpOn, fTrue ); CreateHelpGob( kgobBackstage1, ktpcBackstage ); End; ENDCHUNK REP_RECT( kcellNull, "No representation.", 0,0,1,1 ) #include "mzbkstg.seq" HELP_SCRIPT( ktpcBackstage ) If( _parm[0] == 0 ); If( !kgobBackstageMcZee->f1sthelp ); kgobBackstageMcZee->fLipsink = fTrue; kgobBackstageMcZee->f1sthelp = fTrue; End; Elif( _parm[0] == 1 ); // Work on a project. DestroyGob( kgobBalloon1d ); DISABLEHOTSPOTS(kflgBuildingMin); ChangeStateGob( kgobBackstageMcZee, kst9 ); Elif( _parm[0] == 2 ); // Get ideas for your movie. DestroyGob( kgobBalloon1d ); DISABLEHOTSPOTS(kflgBuildingMin); ChangeStateGob( kgobBackstageMcZee, kst8 ); Elif( _parm[0] == 3 ); // Work on your own movie. DestroyGob( kgobBalloon1d ); DISABLEHOTSPOTS(kflgBuildingMin); kgobBackstageMcZee->nxtPlcState = kst2; ChangeStateGob( kgobBackstageMcZee, kst6 ); End; ENDCHUNK OBJECT( "Project room opening door", kgobProjectDoor, 150, kcrsArrow1 ) REP_ANIM( CHID( kst1, krepEnterAnimation ), "Ideas rm door opening anim" ) cnt=kcell1; While( cnt <= kcell16 ); Cell( cnt++, 0,0, 6 ); End; ENDCHUNK #include "PrDoor.seq" OBJECT( "Studio room opening door", kgobStudioDoor, 150, kcrsArrow1 ) REP_ANIM( CHID( kst1, krepEnterAnimation ), "Ideas rm door opening anim" ) cnt=kcell1; While( cnt <= kcell16 ); Cell( cnt++, 0,0, 6 ); End; ENDCHUNK #include "StDoor.seq" OBJECT( "Ideas room opening door", kgobIdeaDoor, 150, kcrsArrow1 ) REP_ANIM( CHID( kst1, krepEnterAnimation ), "Ideas rm door opening anim" ) cnt=kcell1; While( cnt <= kcell18 ); Cell( cnt++, 0,0, 6 ); End; ENDCHUNK #include "IdDoor.seq" OBJECT( "Mz's carpet bag", kgobBackstage1Bag, 150, kcrsArrow1 ) REP_PPMBMP( CHID( kst1, krepDefault ), "building\pbm\backstag\bag12.pbm" ) REP_ANIM( CHID( kst2, krepDefault ), "Backstage carpet bag anim" ) cnt=kcell1; While( cnt <= kcell20 ); Cell( cnt++, 0,0, 8 ); End; ChangeStateThis( kst1 ); ENDCHUNK #include "BkstgBag.seq" OBJECT( "Mz's shadow", kgobBackstage1Shadow, 150, kcrsArrow1 ) REP_ANIM( CHID( kst1, krepDefault ), "Backstage shadow anim" ) cnt=kcell1; While( cnt <= kcell34 ); Cell( cnt++, 0,0, 8 ); End; DestroyThis(); ENDCHUNK #include "BkShdw.seq" //------------------------------------------------------------------ // The long backstage welcome. An AVI sequence. //------------------------------------------------------------------ OBJECTREG( "Backstage McZee AVI", kgobBackstageMcZeeAVI, 0, 0, 200, kcrsHand1 ) REP_VIDEO( CHID1( krepDefault ), "backstag.avi", fTrue ) CLICK_SCRIPT( "click McZee AVI" ) DestroyThis(); ENDCHUNK OBJECTREG( "AVI1", kgobBackstageMcZeeAVI1, 0, 0, 100, kcrsArrow1 ) REP_VIDEO( CHID1( krepDefault ), "05LOGN4.AVI", fTrue ) OBJECTREG( "AVI2", kgobBackstageMcZeeAVI2, 0, 0, 100, kcrsArrow1 ) REP_VIDEO( CHID1( krepDefault ), "LOGN5.AVI", fTrue ) OBJECTREG( "AVI3", kgobBackstageMcZeeAVI3, 0, 0, 100, kcrsArrow1 ) REP_VIDEO( CHID1( krepDefault ), "LOGN06.AVI", fTrue ) OBJECTREG( "AVI4", kgobBackstageMcZeeAVI4, 0, 0, 100, kcrsArrow1 ) REP_VIDEO( CHID1( krepDefault ), "GOIDA.AVI", fTrue ) OBJECTREG( "AVI5", kgobBackstageMcZeeAVI5, 0, 0, 100, kcrsArrow1 ) REP_VIDEO( CHID1( krepDefault ), "GOPRJ.AVI", fTrue ) OBJECTREG( "AVI6", kgobBackstageMcZeeAVI6, 0, 0, 100, kcrsArrow1 ) REP_VIDEO( CHID1( krepDefault ), "GOSTU.AVI", fTrue ) OBJECT( "bs1 - inspiration door", kgobBackstage1Insp, 150, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\backstag\Bkstgdr1.bmp", 0, 0 ) CLICK_SCRIPT( "bkstg2 : click insp. door" ) ChangeStateGob( kgobBackstageMcZee, kst8 ); ENDCHUNK // ----------------------------------------------------- OBJECT( "bs1 - studio door", kgobBackstage1Studio, 150, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\backstag\Bkstgdr2.bmp",0 ,0 ) CLICK_SCRIPT( "bkstg2 : click studio door" ) kgobBackstageMcZee->nxtPlcState = kst1; ChangeStateGob( kgobBackstageMcZee, kst6 ); ENDCHUNK // ----------------------------------------------------- OBJECT( "bs1 - projects door", kgobBackstage1Proj, 150, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\backstag\Bkstgdr3.bmp", 0, 0 ) CLICK_SCRIPT( "bs2 : click projects door" ) ChangeStateGob( kgobBackstageMcZee, kst9 ); ENDCHUNK ================================================ FILE: src/building/bkshdw.seq ================================================ REP_PPMBMP( kcell1, "building\pbm\backstag\shdw1.pbm" ) REP_PPMBMP( kcell2, "building\pbm\backstag\shdw2.pbm" ) REP_PPMBMP( kcell3, "building\pbm\backstag\shdw3.pbm" ) REP_PPMBMP( kcell4, "building\pbm\backstag\shdw4.pbm" ) REP_PPMBMP( kcell5, "building\pbm\backstag\shdw5.pbm" ) REP_PPMBMP( kcell6, "building\pbm\backstag\shdw6.pbm" ) REP_PPMBMP( kcell7, "building\pbm\backstag\shdw7.pbm" ) REP_PPMBMP( kcell8, "building\pbm\backstag\shdw8.pbm" ) REP_PPMBMP( kcell9, "building\pbm\backstag\shdw9.pbm" ) REP_PPMBMP( kcell10, "building\pbm\backstag\shdw10.pbm" ) REP_PPMBMP( kcell11, "building\pbm\backstag\shdw11.pbm" ) REP_PPMBMP( kcell12, "building\pbm\backstag\shdw12.pbm" ) REP_PPMBMP( kcell13, "building\pbm\backstag\shdw13.pbm" ) REP_PPMBMP( kcell14, "building\pbm\backstag\shdw14.pbm" ) REP_PPMBMP( kcell15, "building\pbm\backstag\shdw15.pbm" ) REP_PPMBMP( kcell16, "building\pbm\backstag\shdw16.pbm" ) REP_PPMBMP( kcell17, "building\pbm\backstag\shdw17.pbm" ) REP_PPMBMP( kcell18, "building\pbm\backstag\shdw18.pbm" ) REP_PPMBMP( kcell19, "building\pbm\backstag\shdw19.pbm" ) REP_PPMBMP( kcell20, "building\pbm\backstag\shdw20.pbm" ) REP_PPMBMP( kcell21, "building\pbm\backstag\shdw21.pbm" ) REP_PPMBMP( kcell22, "building\pbm\backstag\shdw22.pbm" ) REP_PPMBMP( kcell23, "building\pbm\backstag\shdw23.pbm" ) REP_PPMBMP( kcell24, "building\pbm\backstag\shdw24.pbm" ) REP_PPMBMP( kcell25, "building\pbm\backstag\shdw25.pbm" ) REP_PPMBMP( kcell26, "building\pbm\backstag\shdw26.pbm" ) REP_PPMBMP( kcell27, "building\pbm\backstag\shdw27.pbm" ) REP_PPMBMP( kcell28, "building\pbm\backstag\shdw28.pbm" ) REP_PPMBMP( kcell29, "building\pbm\backstag\shdw29.pbm" ) REP_PPMBMP( kcell30, "building\pbm\backstag\shdw30.pbm" ) REP_PPMBMP( kcell31, "building\pbm\backstag\shdw31.pbm" ) REP_PPMBMP( kcell32, "building\pbm\backstag\shdw32.pbm" ) REP_PPMBMP( kcell33, "building\pbm\backstag\shdw33.pbm" ) REP_PPMBMP( kcell34, "building\pbm\backstag\shdw34.pbm" ) ================================================ FILE: src/building/bkstgbag.seq ================================================ REP_PPMBMP( kcell1, "building\pbm\backstag\bag1.pbm" ) REP_PPMBMP( kcell2, "building\pbm\backstag\bag2.pbm" ) REP_PPMBMP( kcell3, "building\pbm\backstag\bag3.pbm" ) REP_PPMBMP( kcell4, "building\pbm\backstag\bag4.pbm" ) REP_PPMBMP( kcell5, "building\pbm\backstag\bag5.pbm" ) REP_PPMBMP( kcell6, "building\pbm\backstag\bag6.pbm" ) REP_PPMBMP( kcell7, "building\pbm\backstag\bag7.pbm" ) REP_PPMBMP( kcell8, "building\pbm\backstag\bag8.pbm" ) REP_PPMBMP( kcell9, "building\pbm\backstag\bag9.pbm" ) REP_PPMBMP( kcell10, "building\pbm\backstag\bag10.pbm" ) REP_PPMBMP( kcell11, "building\pbm\backstag\bag11.pbm" ) REP_PPMBMP( kcell12, "building\pbm\backstag\bag12.pbm" ) REP_PPMBMP( kcell13, "building\pbm\backstag\bag13.pbm" ) REP_PPMBMP( kcell14, "building\pbm\backstag\bag14.pbm" ) REP_PPMBMP( kcell15, "building\pbm\backstag\bag15.pbm" ) REP_PPMBMP( kcell16, "building\pbm\backstag\bag16.pbm" ) REP_PPMBMP( kcell17, "building\pbm\backstag\bag17.pbm" ) REP_PPMBMP( kcell18, "building\pbm\backstag\bag18.pbm" ) REP_PPMBMP( kcell19, "building\pbm\backstag\bag19.pbm" ) REP_PPMBMP( kcell20, "building\pbm\backstag\bag20.pbm" ) ================================================ FILE: src/building/bldghd.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // --------------------------------------------------------- // HD component of the building file // --------------------------------------------------------- // --------------------------------------------------------- // Project macros and definitions // --------------------------------------------------------- #define PACKALL #include "kidgs.chh" // --------------------------------------------------------- // Object definitions shared between studio and building // --------------------------------------------------------- #include // --------------------------------------------------------- // Building object definitions // --------------------------------------------------------- #include "socdefn.h" // needed to get definition for ksclBuilding.. #include "projmain.h" // --------------------------------------------------------- // Start up stuff. // --------------------------------------------------------- #include "sharutil.chh" #include "biopage.chh" // Init macro values STARTCHUNKS( 0x00040000 ) // This script gets called each time the building is loaded. This includes // application startup as well as subsequent Studio=>Building transitions. SCRIPTCHUNK( "Start application" , kcnoStartApp ) ::fInStudio = fFalse; FilterCmdsGob(kgobUtil, cidLoadStudioFailed, kidNil, chidNil); kgobGoto = GetProp(kpridBuildingGob); DEBUGCMD(PrintStr("Starting Building with kpridBuildingGob = ", NumToStr(kgobGoto, ""), "; kpridBuildingState = ", NumToStr(GetProp(kpridBuildingState), ""))); ASSERT(kgobGoto != 0); ASSERT(GetProp(kpridBuildingState) >= kst1); // Any portfolio stuff the studio was doing should be cleared here. EnqueueCid(cidPortfolioClear, 0, 0,0,0,0); // Go to the specified gob. // Note: kstEntry is set by LOADTOOLS on the way out of the building // so it should be valid here. SETGLOBAL(kstEntry, GetProp(kpridBuildingState)); NEXTPLACE1(kgobGoto, GLOBAL(kstEntry)); // Normally, the Studio filters for these, but if we're in the building, // the studio doesn't exist, so we need to trap them. Make sure this // trap is turned off when the studio is created again. FilterCmdsGob(kgobUtil, cidOpen, kidNil, kchidScript6); FilterCmdsGob(kgobUtil, cidNew, kidNil, kchidScript6); FilterCmdsGob(kgobUtil, cidLoadStudioDoc, kidNil, kchidScript6); EndLongOp(fTrue); // If the studio set the wait cursor, turn it off. ENABLEACCEL(fTrue); ENDCHUNK // --------------------------------------------------------- // Get definitions for shared stuff - eg. bio pages // --------------------------------------------------------- #include "biopage.chh" // --------------------------------------------------------- // Now include all of the chunks/components. // --------------------------------------------------------- #include "palette.cht" // --------------------------------------------------------- // shared building components // --------------------------------------------------------- #include "navbars.cht" #include "music.cht" #include "portfol.cht" // --------------------------------------------------------- // all of the 'places' - each file includes all views // --------------------------------------------------------- #include "login.cht" // --------------------------------------------------------- // Street scene (the whole thing) #include "street.cht" // --------------------------------------------------------- // ticket booth // ---------------------------------------------------------- // Definitions for the ticket booth place '1' - far off view // ---------------------------------------------------------- OBJECT( "ticket1-far view", kgobTicket1, 0, kcrsHand1 ) REP_PPMBMP( CHID1( krepDefault ), "building\pbm\ticket\ticket1.pbm" ) CREATE_SCRIPT( "ticket1: create" ) SETPALETTE( kpalSocTicket ); SETKEYS(kflgBuildingMin); PLAYMIDI_LOOP( cnoNil ); // no music CreateChildThis( kgobTicket1Doors, kgobTicket1Doors ); CreateChildThis( kgobTicket1Waiter, kgobTicket1Waiter ); ENDCHUNK CLICK_SCRIPT( "ticket1: anything clicked" ) NEXTPLACE1( kgobTicket2, kst2 ); ENDCHUNK // ------------------------------------------------------- // Definitions for the ticket booth place 2- close up view // ------------------------------------------------------- OBJECT( "ticket2-zoom view", kgobTicket2, 0, kcrsArrow1 ) REP_PPMBMP( CHID1( krepDefault ), "building\pbm\ticket\ticket2.pbm" ) CREATE_SCRIPT( "ticket2 created" ) SETPALETTE( kpalSocTicket ); SETKEYS(kflgBuildingAll); PLAYMIDI( cnoNil ); CreateChildThis( kgobTicket2McZee, kgobTicket2McZee ); CreateChildThis( kgobTicket2Exit, kgobTicket2Exit ); CreateChildThis( kgobTicket2Map, kgobTicket2Map ); CreateChildThis( kgobNavbarDown, kgobNavbarDown ); CreateChildThis( kgobTic1m1, kgobTic1m1 ); ENDCHUNK #ifdef DEBUG // If we needed to implement multiple-state entries from the map to the // ticket booth, we would use this routine. For now, ASSERT that it doesn't // get used. CHILD_SCRIPT("Backstage1:Dispatch", kchidScript0) ASSERT(fFalse); ENDCHUNK #endif // DEBUG // ------------------------------------------------------- // lobby OBJECT( "lobby1-front view", kgobLobby1, 0, kcrsArrow1 ) REP_PPMBMP( CHID1( krepDefault ), "building\pbm\lobby\lobby1.pbm" ) CREATE_SCRIPT( "lobby1 startup" ) SETPALETTE( kpalSocLobby ); SETKEYS(kflgBuildingAll); PLAYMIDI( kmidLobby ); .fExitLobby=fFalse; // if set: triggers McZee to cycle out CreateChildThis( kgobNavbarLeft, kgobNavbarLeft); CreateChildThis( kgobNavbarDown, kgobNavbarDown ); CreateChildThis( kgobNavbarRight, kgobNavbarRight ); CreateChildThis( kgobLobby1Door, kgobLobby1Door ); CreateChildThis( kgobLobby1Poster3, kgobLobby1Poster3 ); CreateChildThis( kgobLobby1Poster4, kgobLobby1Poster4 ); CreateChildThis( kgobLobby1McZee, kgobLobby1McZee ); CreateChildThis( kgobLobby1m1, kgobLobby1m1 ); ENDCHUNK #ifdef DEBUG // If we needed to implement multiple-state entries from the map to the // lobby, we would use this routine. For now, ASSERT that it doesn't // get used. CHILD_SCRIPT("Backstage1:Dispatch", kchidScript0) ASSERT(fFalse); ENDCHUNK #endif // DEBUG // ------------------------------------------------------------------------ // Stuff for view #2 of lobby. // ------------------------------------------------------------------------ OBJECT( "lobby-back view", kgobLobby2, 0, kcrsArrow1 ) REP_PPMBMP( CHID1( krepDefault ), "building\pbm\lobby\lobby2.pbm" ) CREATE_SCRIPT( "lobby2 startup" ) SETPALETTE( kpalSocLobby ); SETKEYS(kflgBuildingAll); PLAYMIDI( kmidLobby ); CreateChildThis( kgobNavbarLeft, kgobNavbarLeft); CreateChildThis( kgobNavbarDown, kgobNavbarDown ); CreateChildThis( kgobNavbarRight, kgobNavbarRight ); CreateChildThis( kgobLobby2Doors, kgobLobby2Doors ); CreateChildThis( kgobLobby2Map, kgobLobby2Map ); CreateChildThis( kgobLobby2Exit, kgobLobby2Exit ); ENDCHUNK // ------------------------------------------------------------------------ // Waiting area #include "waiting.cht" // ------------------------------------------------------------------------ // Snackbar backgrounds OBJECT( "snackbar", kgobSnackBar, 0, kcrsArrow1 ) REP_PPMBMP( CHID1( krepDefault), "building\pbm\snackbar\snackbr2.pbm" ) CREATE_SCRIPT( "snackbar create" ) SETPALETTE( kpalSocLobby ); SETKEYS(kflgBuildingAll); PLAYMIDI( kmidLobby ); CreateChildThis( kgobSnackbarMczee, kgobSnackbarMczee ); CreateChildThis( kgobNavbarLeft, kgobNavbarLeft); CreateChildThis( kgobNavbarDown, kgobNavbarDown ); CreateChildThis( kgobNavbarRight, kgobNavbarRight ); CreateChildThis( kgobLobby3m1, kgobLobby3m1 ); CreateChildThis( kgobLobby3m2, kgobLobby3m2 ); ENDCHUNK // ------------------------------------------------------------------------ // Theatre OBJECT( "theatre1", kgobTheatre1, 0, kcrsArrow1 ) REP_RECT(CHID(kst1, krepDefault), "Theatre1 State1 Rep", 0, 0, 640, 480) REP_PPMBMP(CHID(kst2, krepDefault), "building\pbm\theatre\theatre1.pbm") REP_PPMBMP(CHID(kst3, krepDefault), "building\pbm\theatre\the1dark.pbm") CREATE_SCRIPT( "theatre1: create" ) DEBUGCMD(PrintStr("Creating Theatre1")); SETPALETTE( kpalSocTheatre); SETKEYS(kflgBuildingAll); PLAYMIDI( kmidTheatre ); CreateChildThis( kgobNavbarDown, kgobNavbarDown ); CreateChildThis( kgobTheatre1LeftDoor, kgobTheatre1LeftDoor ); CreateChildThis( kgobTheatre1RightDoor, kgobTheatre1RightDoor ); CreateChildThis( kgobTheatre1McZee, kgobTheatre1McZee ); ChangeStateThis(kst2); ENDCHUNK #ifdef DEBUG // If we needed to implement multiple-state entries from the map to the // theatre, we would use this routine. For now, ASSERT that it doesn't // get used. CHILD_SCRIPT("Backstage1:Dispatch", kchidScript0) ASSERT(fFalse); ENDCHUNK #endif // DEBUG // --------------------------------------------------------- // back view of the theatre & its objects // --------------------------------------------------------- OBJECT( "theatre2", kgobTheatre2, 0, kcrsArrow1 ) REP_PPMBMP( CHID1( krepDefault ), "building\pbm\theatre\theatre2.pbm" ) CREATE_SCRIPT( "theatre2: create" ) SETPALETTE( kpalSocTheatre ); SETKEYS(kflgBuildingAll); PLAYMIDI( kmidTheatre ); CreateChildThis( kgobNavbarDown, kgobNavbarDown ); CreateChildThis( kgobTheatre2Door, kgobTheatre2Door ); CreateChildThis( kgobTheatre2Map, kgobTheatre2Map ); CreateChildThis( kgobTheatre2Exit, kgobTheatre2Exit ); CreateChildThis( kgobTheater2m1, kgobTheater2m1 ); CreateChildThis( kgobTheater2m2, kgobTheater2m2 ); CreateChildThis( kgobTheater2m3, kgobTheater2m3 ); ENDCHUNK // --------------------------------------------------------- // front left view of the theatre & its objects // --------------------------------------------------------- OBJECT( "theatre3", kgobTheatre3, 0, kcrsArrow1 ) REP_PPMBMP( CHID1( krepDefault ), "building\pbm\theatre\theatre3.pbm" ) CREATE_SCRIPT( "theatre3: create") SETPALETTE( kpalSocTheatre ); SETKEYS(kflgBuildingAll); PLAYMIDI( kmidTheatre ); CreateChildThis( kgobTheatre3Right, kgobTheatre3Right ); CreateChildThis( kgobTheatre3Door, kgobTheatre3Door ); CreateChildThis( kgobTheatre3Map, kgobTheatre3Exit ); CreateChildThis( kgobTheatre3Exit, kgobTheatre3Map ); ENDCHUNK // --------------------------------------------------------- // Front right view of the theatre & its objects // --------------------------------------------------------- OBJECT( "theatre4", kgobTheatre4, 0, kcrsArrow1 ) REP_PPMBMP( CHID1( krepDefault ), "building\pbm\theatre\theatre4.pbm" ) CREATE_SCRIPT( "theatre4: create" ) ASSERT(GLOBAL(kstEntry) >= kst2 && GLOBAL(kstEntry) <= kst4); DEBUGCMD( PrintStr("Create theatre4 object") ); SETPALETTE( kpalSocTheatre ); SETKEYS(kflgBuildingAll); PLAYMIDI( kmidTheatre ); // If GLOBAL(kstEntry) == 2 don't run the pass thru Mz If (GLOBAL(kstEntry) == kst3); .nxtPlcState = kst3; DISABLEHOTSPOTS(kflgBuildingMin); CreateChildThis( kgobTheatre4McZee, kgobTheatre4McZee ); Elif (GLOBAL(kstEntry) == kst4); .nxtPlcState = kst6; DISABLEHOTSPOTS(kflgBuildingMin); CreateChildThis( kgobTheatre4McZee, kgobTheatre4McZee ); End; // Create the rest of the objects in this sceen CreateChildThis( kgobTheatre4Left, kgobTheatre4Left ); CreateChildThis( kgobTheatre4Door, kgobTheatre4Door ); CreateChildThis( kgobTheatre4Map, kgobTheatre4Exit ); CreateChildThis( kgobTheatre4Exit, kgobTheatre4Map ); ENDCHUNK CHILD_SCRIPT("Theater4 McZee call back.", kchidScript1 ) NEXTPLACE1( kgobBackstage1, .nxtPlcState ); ENDCHUNK // backstage stuff // ----------------------------------------------------- // Backstage view 1 & objects // ----------------------------------------------------- OBJECT( "backstage", kgobBackstage1, 0, kcrsArrow1 ) CREATE_SCRIPT( "backstage1 : startup" ) SETPALETTE( kpalSocBackstage ); SETKEYS(kflgBuildingAll); // There are many pass through animations in backstag.cht // which require MIDI other than Backstage MIDI so it is // more efficent to play MIDI based on McZees state. // PLAYMIDI( cnoNil ); CreateChildThis( kgobNavbarDown, kgobNavbarDown ); CreateChildThis( kgobBackstage1Insp, kgobBackstage1Insp ); CreateChildThis( kgobBackstage1Studio, kgobBackstage1Studio ); CreateChildThis( kgobBackstage1Proj, kgobBackstage1Proj ); CreateChildThis( kgobBackstageMcZee, kgobBackstageMcZee ); ENDCHUNK REP_PPMBMP( CHID1( krepDefault ), "building\pbm\backstag\backstg1.pbm" ) #ifdef DEBUG // If we needed to implement multiple-state entries from the map to the // backstage, we would use this routine. For now, ASSERT that it doesn't // get used. CHILD_SCRIPT("Backstage1:Dispatch", kchidScript0) ASSERT(fFalse); ENDCHUNK #endif // DEBUG OBJECT( "backstage view 2 ", kgobBackstage2, 0, kcrsArrow1 ) REP_PPMBMP( CHID1( krepDefault ), "building\pbm\backstag\backstg2.pbm" ) CREATE_SCRIPTST( "startup", kst1 ) SETPALETTE( kpalSocBackstage ); SETKEYS(kflgBuildingAll); PLAYMIDI( kmidBackstage ); CreateChildThis( kgobNavbarDown, kgobNavbarDown ); CreateChildThis( kgobBackstage2Right, kgobBackstage2Right ); CreateChildThis( kgobBackstage2Left, kgobBackstage2Left ); CreateChildThis( kgobBackstage2Map, kgobBackstage2Map ); CreateChildThis( kgobBackstage2Exit, kgobBackstage2Exit ); // bio page hotspots CreateChildThis( kgobBackstage2m1, kgobBackstage2m1 ); ENDCHUNK // ----------------------------------------------------- // Backstage view 2, and objects // ----------------------------------------------------- // ----------------------------------------------------- OBJECT( "bs2 - left door", kgobBackstage2Left, 33, kcrsLeft ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\backstag\bk2ltdr2.bmp", 0, 0 ) CLICK_SCRIPT( "bs2 left door clicked!" ) NEXTPLACE1( kgobTheatre4, kst2 ); ENDCHUNK // ----------------------------------------------------- OBJECT( "bs2 - right door", kgobBackstage2Right, 33, kcrsRight) REP_MASK( CHID1( krepDefault ), "building\bitmaps\backstag\bk2rtdr2.bmp", 0, 0 ) CLICK_SCRIPT( "bs2 right door clicked!" ) NEXTPLACE1( kgobTheatre3, kst1 ); ENDCHUNK // ----------------------------------------------------- OBJECT( "backstage2 map", kgobBackstage2Map, 44, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\backstag\bk2map.bmp", 0, 0 ) CLICK_SCRIPT( "backstage2 map clicked" ) CreateChildGob( GET_CURRENTPLACE(), kgobMapMain, kgobMapMain ); ENDCHUNK // ----------------------------------------------------- OBJECT( "backstage2 exit", kgobBackstage2Exit, 44, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\backstag\bk2quit.bmp", 0, 0 ) CLICK_SCRIPT( "backstage2 exit clicked" ) QUITAPP(); ENDCHUNK OBJECT( "Biopage 40 mask", kgobBackstage2m1, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\backstag\bkstg2m1.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If( fBIO_AVAIL( 40 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 40 ); BIO_CREATEBOOK( 40, fFalse, kgobBackstage2 ); End; ENDCHUNK // Inspiration (Ideas) room OBJECT( "inspiration view 1", kgobInspiration1, 0, kcrsArrow1 ) REP_PPMBMP( CHID1(krepDefault), "building\pbm\inspirat\inspir1.pbm" ) CREATE_SCRIPTST( "startup", kst1 ) SETKEYS(kflgBuildingAll); SETPALETTE( kpalSocInspiration ); PLAYMIDI( kmidIdeas ); CreateChildThis( kgobNavbarLeft, kgobNavbarLeft); CreateChildThis( kgobNavbarDown, kgobNavbarDown ); CreateChildThis( kgobNavbarRight, kgobNavbarRight ); CreateChildThis( kgobSplotMachine, kgobSplotMachine ); CreateChildThis( kgobTalentBook, kgobTalentBook ); CreateChildThis( kgobInsp1McZee, kgobInsp1McZee ); CreateChildThis( kgobIdea1m1, kgobIdea1m1 ); // bio hotspot // If we've come to this room without navigating through // the back stage area, then don't play the long back stage // introduction when we do go there. This is to maintain // continuity with reguard to where characters are in the building // at the time of the backstage long introduction. SETGLOBAL( fBackstagePS, fFalse ); ENDCHUNK CHILD_SCRIPT("Inspiration1:Dispatch", kchidScript0) // Inspiration McZee never hangs out in kst1, so switching to kst1 is // guaranteed to run his dispatch state. ChangeStateGob(kgobInsp1McZee, kst1); ENDCHUNK // ----------------------------------------------------- // Inspiration 2 - back view // ----------------------------------------------------- OBJECT( "inspiration view 2", kgobInspiration2, 0, kcrsArrow1 ) REP_PPMBMP( CHID1(krepDefault), "building\pbm\inspirat\inspir2.pbm" ) CREATE_SCRIPT( "startup" ) SETPALETTE( kpalSocInspiration ); SETKEYS(kflgBuildingAll); PLAYMIDI( kmidIdeas ); CreateChildThis( kgobNavbarLeft, kgobNavbarLeft); CreateChildThis( kgobNavbarDown, kgobNavbarDown ); CreateChildThis( kgobNavbarRight, kgobNavbarRight ); CreateChildThis( kgobInsp2Doors, kgobInsp2Doors ); CreateChildThis( kgobInsp2Map, kgobInsp2Map ); CreateChildThis( kgobInsp2Exit, kgobInsp2Exit ); CreateChildThis( kgobIdea2m1, kgobIdea2m1 ); ENDCHUNK // ----------------------------------------------------- // Inspiration 3 - left view // ----------------------------------------------------- OBJECT( "inspiration view 3", kgobInspiration3, 0, kcrsArrow1 ) REP_PPMBMP( CHID1(krepDefault), "building\pbm\inspirat\inspir3.pbm" ) CREATE_SCRIPT( "startup" ) SETPALETTE( kpalSocInspiration ); SETKEYS(kflgBuildingAll); PLAYMIDI( kmidIdeas ); CreateChildThis( kgobNavbarLeft, kgobNavbarLeft); CreateChildThis( kgobNavbarDown, kgobNavbarDown ); CreateChildThis( kgobNavbarRight, kgobNavbarRight ); CreateChildThis( kgobIdea3m1, kgobIdea3m1 ); CreateChildThis( kgobIdea3m2, kgobIdea3m2 ); CreateChildThis( kgobIdea3m3, kgobIdea3m3 ); ENDCHUNK // ----------------------------------------------------- // Inspiration 4 - right view // ----------------------------------------------------- OBJECT( "inspiration view 4", kgobInspiration4, 0, kcrsArrow1 ) REP_PPMBMP( CHID1(krepDefault), "building\pbm\inspirat\inspir4.pbm" ) CREATE_SCRIPT( "startup" ) SETPALETTE( kpalSocInspiration ); SETKEYS(kflgBuildingAll); PLAYMIDI( kmidIdeas ); CreateChildThis( kgobNavbarLeft, kgobNavbarLeft); CreateChildThis( kgobNavbarDown, kgobNavbarDown ); CreateChildThis( kgobNavbarRight, kgobNavbarRight ); CreateChildThis( kgobIdea4m1, kgobIdea4m1 ); CreateChildThis( kgobIdea4m2, kgobIdea4m2 ); CreateChildThis( kgobIdea4m3, kgobIdea4m3 ); ENDCHUNK // Studio // ----------------------------------------------------- // Studio 1 - front view // ----------------------------------------------------- OBJECT( "studio view 1", kgobStudio1, 0, kcrsArrow1 ) REP_PPMBMP( CHID1( krepDefault),"building\pbm\studio\studio1.pbm" ) REP_PPMBMP( CHID( kst2, krepDefault),"building\pbm\studio\studio1b.pbm" ) // state 2=tools background CREATE_SCRIPT( "studio1: startup" ) ASSERT(GLOBAL(kstEntry) == kst1 || GLOBAL(kstEntry) == kst2); SETPALETTE( kpalSocStudio ); SETKEYS(kflgBuildingAll); CreateChildThis( kgobNavbarLeft, kgobNavbarLeft); CreateChildThis( kgobNavbarDown, kgobNavbarDown ); CreateChildThis( kgobNavbarRight, kgobNavbarRight ); CreateChildThis( kgobStudio1Tools, kgobStudio1Tools ); CreateChildThis( kgobStudio1McZee, kgobStudio1McZee ); CreateChildThis( kgobStdo1m1, kgobStdo1m1 ); // If we've come to this room without navigating through // the back stage area, then don't play the long back stage // introduction when we do go there. This is to maintain // continuity with reguard to where characters are in the building // at the time of the backstage long introduction. SETGLOBAL( fBackstagePS, fFalse ); RunScriptThis(kchidScript0); ENDCHUNK CHILD_SCRIPT("Studio1:Dispatch", kchidScript0) If (GLOBAL(kstEntry) == kst1); // Normal Entry // Turn help off and dispatch McZee directly to the waiting state. PLAYMIDI( kmidStudio ); SETGLOBAL(fHelpOn, fFalse); ChangeStateGob(kgobStudio1McZee, kst2 ); Else; // Pass through to tools. PLAYMIDI( cnoNil ); // stop any random MIDI that's going ChangeStateGob( kgobStudio1Tools, kst2 ); // launch toolbox (sproing) and proceed into tools. End; ENDCHUNK // ----------------------------------------------------- // Studio 2 - back view (doors to backstage) // ----------------------------------------------------- OBJECT( "studio view 2 ", kgobStudio2, 0, kcrsArrow1 ) REP_PPMBMP( CHID1( krepDefault), "building\pbm\studio\studio2.pbm" ) CREATE_SCRIPT( "studio2: startup" ) SETPALETTE( kpalSocStudio ); SETKEYS(kflgBuildingAll); PLAYMIDI( kmidStudio ); CreateChildThis( kgobNavbarLeft, kgobNavbarLeft); CreateChildThis( kgobNavbarDown, kgobNavbarDown ); CreateChildThis( kgobNavbarRight, kgobNavbarRight ); CreateChildThis( kgobStudio2Doors, kgobStudio2Doors ); CreateChildThis( kgobStudio2Map, kgobStudio2Map ); CreateChildThis( kgobStudio2ExitWord, kgobStudio2ExitWord); CreateChildThis( kgobStudio2Exit, kgobStudio2Exit); CreateChildThis( kgobStdo2m1, kgobStdo2m1 ); CreateChildThis( kgobStdo2m2, kgobStdo2m2 ); CreateChildThis( kgobStdo2m3, kgobStdo2m3 ); ENDCHUNK // ----------------------------------------------------- // Studio 3 - (3 o'clock view) // ----------------------------------------------------- OBJECT( "studio view 3 ", kgobStudio3, 0, kcrsArrow1 ) REP_PPMBMP( CHID1( krepDefault), "building\pbm\studio\studio3.pbm" ) CREATE_SCRIPT( "studio3 : startup" ) SETPALETTE( kpalSocStudio ); SETKEYS(kflgBuildingAll); PLAYMIDI( kmidStudio ); CreateChildThis( kgobNavbarLeft, kgobNavbarLeft); CreateChildThis( kgobNavbarDown, kgobNavbarDown ); CreateChildThis( kgobNavbarRight, kgobNavbarRight ); CreateChildThis( kgobStdo3m1, kgobStdo3m1 ); CreateChildThis( kgobStdo3m2, kgobStdo3m2 ); CreateChildThis( kgobStdo3m3, kgobStdo3m3 ); ENDCHUNK // ----------------------------------------------------- // Studio 4 - (9 o'clock view) // ----------------------------------------------------- OBJECT( "studio view 4", kgobStudio4, 0, kcrsArrow1 ) REP_PPMBMP( CHID1( krepDefault), "building\pbm\studio\studio4.pbm" ) CREATE_SCRIPT( "studio4: startup" ) SETPALETTE( kpalSocStudio ); SETKEYS(kflgBuildingAll); PLAYMIDI( kmidStudio ); CreateChildThis( kgobNavbarLeft, kgobNavbarLeft); CreateChildThis( kgobNavbarDown, kgobNavbarDown ); CreateChildThis( kgobNavbarRight, kgobNavbarRight ); CreateChildThis( kgobStdo4m1, kgobStdo4m1 ); CreateChildThis( kgobStdo4m2, kgobStdo4m2 ); CreateChildThis( kgobStdo4m3, kgobStdo4m3 ); CreateChildThis( kgobStdo4m4, kgobStdo4m4 ); ENDCHUNK // Projects room OBJECT( "projects view 1", kgobProjects1, 0, kcrsArrow1 ) REP_PPMBMP( CHID1( krepDefault ), "building\pbm\projects\project1.pbm" ) CREATE_SCRIPT( "projects1: startup" ) // Projects1 states: kst1 == Entry from another room; // kst2 == Entry from elsewhere in Projects room. // kst3 == talking // kst4 == launching logo (TV) // kst5 == launching movie tips ASSERT(GLOBAL(kstEntry) == kst1 || GLOBAL(kstEntry) == kst2 || GLOBAL(kstEntry) == kst4 || GLOBAL(kstEntry) == kst5 ); SETPALETTE( kpalSocProjects ); SETKEYS(kflgBuildingAll); PLAYMIDI( kmidProject ); CreateChildThis( kgobNavbarLeft, kgobNavbarLeft); CreateChildThis( kgobNavbarDown, kgobNavbarDown ); CreateChildThis( kgobNavbarRight, kgobNavbarRight ); // Create objects in the view. (monitors + anims) CreateChildThis(kgobProj1Mon1, kgobProj1Mon1); CreateChildThis(kgobProj1Mon2, kgobProj1Mon2); CreateChildThis(kgobTvViewL, kgobTvViewL ); CreateChildThis(kgobTvViewR, kgobTvViewR ); CreateChildThis( kgobPrjt1m1, kgobPrjt1m1 ); // bio page 37 hs. // Create Melanie, and start her up in the correct state. // Her states are 1 == hidden; 2 == wait state; 3 == intro. CreateChildThis(kgobProj1Melanie, kgobProj1Melanie); // If we've come to this room without navigating through // the back stage area, then don't play the long back stage // introduction when we do go there. This is to maintain // continuity with reguard to where characters are in the building // at the time of the backstage long introduction. SETGLOBAL( fBackstagePS, fFalse ); // Run the dispatch script. RunScriptThis(kchidScript0); ENDCHUNK CHILD_SCRIPT("Projects1:Dispatch", kchidScript0) enter = GLOBAL( kstEntry ); If( enter == kst4 ); // fake user click on the logo wizard monitor EnqueueCid( cidClicked, kgobProj1Mon1, 0,0,0,0 ); Elif( enter == kst5 ); // fake user click on the movie techniques monitor EnqueueCid( cidClicked, kgobProj1Mon2, 0,0,0,0 ); End; // Until clicked on, Melanie always starts in her wait state. If we're // coming from elsewhere in the Projects room (kst2), leave the help in // its current state; otherwise make sure it's off at this point. If ( enter != kst1 ); SETGLOBAL(fHelpOn, fFalse); End; ChangeStateGob(kgobProj1Melanie, kst2); ENDCHUNK // ----------------------------------------------------- // Projects 2 - back view, and objects // Called Projects Backwall on the flowchart. // ----------------------------------------------------- OBJECT( "projects view 2 ", kgobProjects2, 0, kcrsArrow1 ) REP_PPMBMP( CHID1( krepDefault ), "building\pbm\projects\project2.pbm" ) CREATE_SCRIPT( "projects2: startup" ) SETPALETTE( kpalSocProjects ); SETKEYS(kflgBuildingAll); PLAYMIDI( kmidProject ); CreateChildThis( kgobNavbarLeft, kgobNavbarLeft); CreateChildThis( kgobNavbarDown, kgobNavbarDown ); CreateChildThis( kgobNavbarRight, kgobNavbarRight ); CreateChildThis( kgobProj2Doors, kgobProj2Doors ); CreateChildThis( kgobProj2Exit, kgobProj2Exit ); CreateChildThis( kgobProj2Map, kgobProj2Map ); CreateChildThis( kgobPrjt2m1, kgobPrjt2m1 ); CreateChildThis( kgobPrjt2m2, kgobPrjt2m2 ); CreateChildThis( kgobPrjt2m3, kgobPrjt2m3 ); CreateChildThis( kgobPrjt2m4, kgobPrjt2m4 ); ENDCHUNK // ----------------------------------------------------- // Projects 3 - right (3o'clock) view, and objects // Called Projects Right on the flowchart. // ----------------------------------------------------- OBJECT( "projects view 3", kgobProjects3, 0, kcrsArrow1 ) REP_PPMBMP( CHID1( krepDefault ), "building\pbm\projects\project3.pbm" ) CREATE_SCRIPT( "projects3: startup" ) SETPALETTE( kpalSocProjects ); SETKEYS(kflgBuildingAll); PLAYMIDI( kmidProject ); CreateChildThis( kgobNavbarLeft, kgobNavbarLeft); CreateChildThis( kgobNavbarDown, kgobNavbarDown ); CreateChildThis( kgobNavbarRight, kgobNavbarRight ); ENDCHUNK // ----------------------------------------------------- // Projects 4 - left (9 o'clock) view, and objects // Called Projects Left on the flowchart. // ----------------------------------------------------- OBJECT( "projects view 4", kgobProjects4, 0, kcrsArrow1 ) REP_PPMBMP( CHID1( krepDefault ), "building\pbm\projects\project4.pbm" ) CREATE_SCRIPT( "projects4: startup" ) SETPALETTE( kpalSocProjects ); SETKEYS(kflgBuildingAll); PLAYMIDI( kmidProject ); CreateChildThis( kgobNavbarLeft, kgobNavbarLeft); CreateChildThis( kgobNavbarDown, kgobNavbarDown ); CreateChildThis( kgobNavbarRight, kgobNavbarRight ); CreateChildThis( kgobPrjt4m1, kgobPrjt4m1 ); CreateChildThis( kgobPrjt4m2, kgobPrjt4m2 ); CreateChildThis( kgobPrjt4m3, kgobPrjt4m3 ); ENDCHUNK // put the imaginpolis backgrounds on here (for now) OBJECT( "imaginopolis", kgobImagin, 0, kcrsArrow1 ) CREATE_ANIMST( "imagin: full sequence", kst1 ) SETKEYS(kflgBuildingMin); SETPALETTE( kpalImaginopolis ); // palette PLAYMIDI( cnoNil ); // roller coaster music CreateChildThis( kgobMcZeeRoller, kgobMcZeeRoller ); ENDCHUNK REP_PPMBMP( CHID( kst1, krepDefault ), "building\pbm\imagin\back1.pbm" ) REP_PPMBMP( CHID( kst2, krepDefault ), "building\pbm\imagin\back2.pbm" ) REP_PPMBMP( CHID( kst3, krepDefault ), "building\pbm\imagin\back3.pbm" ) REP_PPMBMP( CHID( kst4, krepDefault ), "building\pbm\imagin\back4.pbm" ) REP_PPMBMP( CHID( kst5, krepDefault ), "building\pbm\imagin\back5.pbm" ) ================================================ FILE: src/building/building.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // --------------------------------------------------------- // main build script for Socrates // // Revisions: // // mm-dd-yy // 11-18-94 ***** - Created // 02-17-95 ***** - cleaned up // 02-27-95 ***** - Made to use KIDSGS.H; // removed secret passage // 04-26-95 ScottR - Removed path information from include files. // 04-28-95 ScottR - Changed _gob to kgob // 05-16-95 ScottR - Renamed socrates.cht to building.cht // 05-16-85 ***** - temp adding string initialization // --------------------------------------------------------- // --------------------------------------------------------- // Project macros and definitions // --------------------------------------------------------- #include "kidgs.chh" // --------------------------------------------------------- // Object definitions shared between studio and building // --------------------------------------------------------- #include // --------------------------------------------------------- // Building object definitions // --------------------------------------------------------- #include // --------------------------------------------------------- // Start up stuff. // --------------------------------------------------------- // Init macro values STARTCHUNKS( 0x00030000 ) // --------------------------------------------------------- // main utility object // --------------------------------------------------------- #include "sharutil.chh" #include "biopage.chh" // --------------------------------------------------------- // Get definitions for shared stuff - eg. bio pages // --------------------------------------------------------- #include "biopage.chh" // --------------------------------------------------------- // some needed help defines -- REALLLY! #include "projmain.h" // --------------------------------------------------------- // all of the 'places' - each file includes all views // --------------------------------------------------------- #include "ticket.cht" #include "imagin.cht" #include "lobby.cht" #include "snackbar.cht" #include "theatre.cht" #include "backstag.cht" #include "inspirat.cht" #include "studiobg.cht" #include "projects.cht" ================================================ FILE: src/building/cursors.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // ------------------------------------------------------------------------ // cursor definitions... to be included after STARTCHUNKY command // ------------------------------------------------------------------------ CURSORCHUNK( "building\cursors\crs1018.cur", kcrsHand1 ) CURSORCHUNK( "building\cursors\crs128.cur", kcrsArrow1 ) CURSORCHUNK( "building\cursors\crs142.cur", kcrsWand1 ) CURSORCHUNK( "building\cursors\crs143.cur", kcrsStar ) CURSORCHUNK( "building\cursors\left.cur", kcrsLeft ) CURSORCHUNK( "building\cursors\right.cur", kcrsRight ) CURSORCHUNK( "building\cursors\down.cur", kcrsDown ) CURSORCHUNK( "building\cursors\up.cur", kcrsUp ) CURSORCHUNK( "building\cursors\turn1.cur", kcrsTurn1 ) ================================================ FILE: src/building/entstate.txt ================================================ Description of entry states for building rooms. **Indicates this state is used in the MAPENTRY and NAVBARENTRY macros. TICKET2 ======= kst2 Entry from Ticket1. kst3 ** Map entry. McZee States: kst1 Dispatch state. kst2 Air guitar animation. kst3 Wait state, intro/help animation. LOBBY1 ====== kst2 ** Wait state. kst3 Do lobby intro -- coming from ticket booth. kst5 Passing through the lobby. McZee States: kst1 Dispatch state. kst2 Wait state. kst3 Unicycle ride. kst4 Lobby welcome. kst5 Passing through the Lobby. kst6 Lobby=>Theatre transition. THEATRE1 ======== kst4 ** Wait state. kst5 Movie loaded before coming to theatre. kst7 Lean onto stage ==> moves into wait state. McZee States: kst1 Dispatch state. kst2 McZee leans onto stage animation. kst3 McZee leaves the stage animation. kst4 Wait state. kst5 Movie loaded? Shadow puppet animation; else dispatch. kst6 Help1 animation. kst7 Open the portfolio. kst8 Movie paused animation. kst9 Movie done animation. kst10 Close the portfolio. kst11 Let's explore animation. kst12 McZee Null representation. Movie Object States: kst1 Dispatch state. kst2 Entry state -- There is a movie ready to be played. kst3 Entry state -- Count down to movie playing. kst4 Movie playing. kst5 Movie done. kst6 Movie paused. THEATRE4 ======== kst2 ** Wait state. kst3 Passing through on the way to Backstage with state kst3. kst4 Passing through on the way to Backstage with state kst7. BACKSTAGE1 ========== kst2 ** Wait state. kst3 Passing through to Studio state kst2. kst4 Passing through to Ideas Room. kst5 Passing through to Projects Room. kst6 Short pass through to Studio state kst2. kst10 Animate into wait state. McZee States: kst1 Dispatch state. kst2 Wait state. kst3 Passing through to Studio state kst2. kst4 Passing through to Ideas Room. kst5 Passing through to Projects Room. kst6 Backstage=>Studio transition. kst8 Backstage=>Ideas Room transition. kst9 Backstage=>Projects Room transition. kst10 McZee animates from offstage into wait state. STUDIO1 ======= kst1 ** Normal entry. kst2 Pass through to tools. Do tools intro if necessary. McZee States: kst1 NULL representation. kst2 Wait state. kst3 McZee Studio Intro. kst4 McZee anim to Tools, Tools Intro. kst5 Load tools. INSPIRATION1 ============ kst2 Wait state. kst6 ** Enter via map or navbars -- leave help in current state. Otherwise, same as kst2. kst7 Start the Splot Machine. kst8 Start the Talent Book. McZee States: kst1 Dispatch state. kst2 Wait state. kst3 Ideas Room intro. kst5 NULL representation. kst7 Ideas Room=>Splot Machine transition. kst8 Ideas Room=>Talent Book transition. PROJECTS1 ========= kst1 ** Entry from another room -- turn help off on entry. kst2 Entry from elsewhere in Projects room -- leave help in current state. Melanie States: kst1 NULL representation. kst2 Wait state. kst3 Projects Room intro. ================================================ FILE: src/building/iddoor.seq ================================================ REP_PPMBMP( kcell1, "building\pbm\backstag\door47.pbm" ) REP_PPMBMP( kcell2, "building\pbm\backstag\door48.pbm" ) REP_PPMBMP( kcell3, "building\pbm\backstag\door49.pbm" ) REP_PPMBMP( kcell4, "building\pbm\backstag\door50.pbm" ) REP_PPMBMP( kcell5, "building\pbm\backstag\door51.pbm" ) REP_PPMBMP( kcell1, "building\pbm\backstag\door52.pbm" ) REP_PPMBMP( kcell7, "building\pbm\backstag\door53.pbm" ) REP_PPMBMP( kcell8, "building\pbm\backstag\door54.pbm" ) REP_PPMBMP( kcell9, "building\pbm\backstag\door55.pbm" ) REP_PPMBMP( kcell10, "building\pbm\backstag\door56.pbm" ) REP_PPMBMP( kcell11, "building\pbm\backstag\door57.pbm" ) REP_PPMBMP( kcell12, "building\pbm\backstag\door58.pbm" ) REP_PPMBMP( kcell13, "building\pbm\backstag\door59.pbm" ) REP_PPMBMP( kcell14, "building\pbm\backstag\door60.pbm" ) REP_PPMBMP( kcell15, "building\pbm\backstag\door61.pbm" ) REP_PPMBMP( kcell16, "building\pbm\backstag\door62.pbm" ) REP_PPMBMP( kcell17, "building\pbm\backstag\door63.pbm" ) REP_PPMBMP( kcell18, "building\pbm\backstag\door64.pbm" ) ================================================ FILE: src/building/imagin.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // --------------------------------------------------------- // Definitions for the imaginopolis sequence // --------------------------------------------------------- OBJECT( "closet", kgobCloset, 0, kcrsArrow1 ) CREATE_ANIMST( "closet: full sequence", kst1 ) SETKEYS(kflgBuildingMin); SETPALETTE( kpalImaginopolis ); PLAYMIDI( cnoNil ); // midi is part of AVI now. CreateChildThis( kgobMcZeePacker, kgobMcZeePacker ); ENDCHUNK REP_ANIM( CHID1( krepDefault ), "closet, default" ) // look to see if the McZee gob is playing AVI Cell( kcell1, 0,0, 1 ); // show at start While( PlayingGob( kgobMcZeePacker )); Cell( kcell1, 0, 0, 10 ); // poll at 1/6ths of a second End; NEXTPLACE1( kgobImagin, kst1 ); ENDCHUNK REP_PPMBMP( kcell1, "building\pbm\imagin\closet2.pbm" ) // The following object is the mczee packing AVI // The closet watches for the AVI to finish, then continues on to // the next shot / avi / place OBJECTREG( "closet: mczee!", kgobMcZeePacker, 0, 0, 111, kcrsArrow1 ) REP_VIDEO( CHID1( krepDefault ), "logn1.avi", fTrue ) WAVE_CHUNK( "building\sound\imagin\rllrcstr.wav", kwavRollerCoaster ) OBJECT( "roller mczee!", kgobMcZeeRoller, 111, kcrsArrow1 ) // Include all mczee cells as children reps of roller mczee REP_ANIM( CHID1( krepDefault ), "imagin:mczee on roller") cnt = kcell1; Cell( cnt++, 0,0, 1 ); // draw the first cell VOICE( kwavRollerCoaster, 0 ); SetNoSlipThis( fTrue ); // we can now drop frames! While( cnt < kcell100 ); // make the background go in sync with us. If( cnt == kcell26 ); ChangeStateGob( kgobImagin, kst2 ); Elif( cnt == kcell40 ); ChangeStateGob( kgobImagin, kst3 ); Elif( cnt == kcell56 ); ChangeStateGob( kgobImagin, kst4 ); Elif( cnt == kcell63 ); ChangeStateGob( kgobImagin, kst5 ); End; Cell( cnt, 0,0, 6 ); ++cnt; End; NEXTPLACE1( kgobStreet, kst1 ); ENDCHUNK #include "mzroller.seq" ================================================ FILE: src/building/inspirat.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // ----------------------------------------------------- // INSPIRAT.CHT // // Copyright (C) Microsoft Corporation 1995. // All Rights reserved. // // ----------------------------------------------------- // Module Intent: // // Contains the kauai script code for the Ideas Room and // the Splot Machine. // // Revisions: // // mm-dd-yy // ??-??-94 ***** - Created // 05-16-95 ***** - remove GLOBAL( delay ) // ----------------------------------------------------- WAVE_CHUNK( "building\sound\inspirat\idea1a.wav", kwavIdea1a ) WAVE_CHUNK( "building\sound\inspirat\idea1b.wav", kwavIdea1b ) WAVE_CHUNK( "building\sound\inspirat\idea2.wav", kwavIdea2 ) WAVE_CHUNK( "building\sound\inspirat\idea3.wav", kwavIdea3 ) WAVE_CHUNK( "building\sound\inspirat\idea4.wav", kwavIdea4 ) OBJECTREG("ticketbooth - dance", kgobIdeaMcZeeAVI1, 0, 0, 999, kcrsHand1) REP_VIDEO( CHID1( krepDefault ), "idea2.avi", fTrue ) // the into animation CREATE_SCRIPT( "created" ) FilterCmdsThis( cidMouseDown, kidNil, kchidScript1); ENDCHUNK CHILD_SCRIPT( "mouse down", kchidScript1 ) // stop playing... the polling will catch and remove us. StopThis(); ENDCHUNK CLICK_SCRIPT( "clicked ideas room intro" ) // stop playing... the polling will catch and remove us StopThis(); ENDCHUNK // the "let's make a movie!" avi OBJECTREG("ticketbooth - dance", kgobIdeaMcZeeAVI2, 0, 0, 999, kcrsHand1) REP_VIDEO( CHID1( krepDefault ), "idea3.avi", fTrue ) // the into animation // the "check out actors in the talent book" avi OBJECTREG("ticketbooth - dance", kgobIdeaMcZeeAVI3, 0, 0, 999, kcrsHand1) REP_VIDEO( CHID1( krepDefault ), "idea4.avi", fTrue ) // the into animation OBJECT( "inspir1: mczee", kgobInsp1McZee, 100, kcrsHand1 ) #include "mzinsp.seq" REP_RECT( kcell90, "No representation.", 0, 0, 1, 1 ) REP_ANIM( CHID( kst1, krepDefault ), "inspir1: mczee talking animation" ) ASSERT(GLOBAL(kstEntry) == kst2 || GLOBAL(kstEntry) == kst6 || GLOBAL( kstEntry) == kst7 || GLOBAL( kstEntry) == kst8 ); If (GLOBAL(kstEntry) == kst6); // If entering via kst6 leave the SETGLOBAL(kstEntry, kst2); // GLOBAL help in whatever state it // was in. This state is used to allow // the help balloon to come back up // when navigating around the Ideas // room. Else; SETGLOBAL( fHelpOn, fFalse ); // Help does not come on automatically // in this room (If comming from another room). End; // If the flag is set turn it off. .fEnableAccel = fFalse; ChangeStateThis(GLOBAL(kstEntry)); ENDCHUNK REP_ANIM( CHID( kst2, krepDefault ), "Ideas room: Wait state" ) cnt=kcell41; Cell( cnt, 0,0, 0 ); WAIT_FOR_TRANSITION(); // can trans here from the map If( GLOBAL(fHelpOn) ); // If help flag is on, put up the help balloon. CreateHelpGob( kgobInspiration1, ktpcIdeas ); End; While (fTrue); While( cnt <= kcell47 ); // Loop back and forth through Cell( cnt++, 0, 0, 9); // these 6 cells to get smooth End; // waiting animation. // Trying 9/60 sec between cells for cnt = kcell46; // this particular animation. While( cnt >= kcell42 ); Cell( cnt--, 0, 0, 9); End; SetNoSlipThis( fTrue ); // we can now drop frames! rnd = Rnd( 100 ); If( rnd < 20 ); If( rnd < 14 ); VOICE( kwavIdea1a, ktpcIdea1 ); cnt=kcell1; While( cnt < kcell15 ); Cell( cnt++, 0, 0, 6 ); End; ENDVOICE(); End; If( rnd > 5 ); cnt=kcell15; While( cnt <= kcell41 ); If( cnt == kcell19 ); VOICE( kwavIdea1b, ktpcIdea1b ); End; Cell( cnt++, 0, 0, 6 ); End; ENDVOICE(); End; End; SetNoSlipThis( fFalse ); // don't drop frames now End; ENDCHUNK REP_ANIM(CHID(kst3, krepDefault), "Ideas room intro.") DISABLEHOTSPOTS(kflgBuildingMin); Cell( kcell101, 0,0, 1 ); WAIT_FOR_TRANSITION(); // If a transition is occuring wait CreateChildGob( GidParThis(), kgobIdeaMcZeeAVI1, kgobIdeaMcZeeAVI1 ); Cell( kcell101,0,0, 100 ); // wait for init // watch it and proceed appropriately While( PlayingGob( kgobIdeaMcZeeAVI1 )); Cell( kcell101, 0, 0, 10 ); // poll at 1/6ths of a second End; DestroyGob( kgobIdeaMcZeeAVI1 ); ENABLEHOTSPOTS(kflgBuildingAll); ChangeStateThis( kst2 ); // go to idle ENDCHUNK REP_ANIM( CHID( kst5, krepDefault ), "Ideas room Null representation." ) // COMMENT: Wait for the splot machine or talent book to disappear // COMMENT: Polling! Yuck! // This is done for the sake of the biopages. Since they're used in // other places as well (including the studio), we can't have it // reset the ideas room to a reasonable state on exit. So we do it // here. The splot machine just uses this method because it's here // anyway. Cell( kcell41,0,0, 1 ); // Don't start looking until gobs exist! While ( !FGobExists(kgobBioPage) && !FGobExists(kgobSplotMachineObj) ); Cell( 0,0,0, 50 ); End; While( FGobExists(kgobBioPage) || FGobExists(kgobSplotMachineObj) ); // blank cell Cell( 0,0,0, 50 ); End; // Reenable accelerator keys If (.fEnableAccel); ENABLEACCEL(fFalse); .fEnableAccel = fFalse; End; // Reenable hotspots/keys and go back to idle animation ENABLEHOTSPOTS(kflgBuildingAll); ChangeStateThis( kst2 ); ENDCHUNK; // REP_ANIM( CHID( kst6, krepDefault ), "Map and navbar entry" ) // There is no need for an actual state 6, the Flag kstEntry being // set to kst6 is used to direct entry to kst2 with the global help // flag unmodified. This is needed because entry into the Ideas room // from another room sets the global help off if it is on. REP_ANIM( CHID( kst7, krepDefault ), "Start the splot machine" ) DISABLEHOTSPOTS(kflgBuildingMin); Cell( kcell351, 0,0, 1 ); WAIT_FOR_TRANSITION(); // If a transition is occuring wait CreateChildGob( GidParThis(), kgobIdeaMcZeeAVI2, kgobIdeaMcZeeAVI2 ); Cell( kcell351,0,0, 100 ); // wait for init // watch it and proceed appropriately While( PlayingGob( kgobIdeaMcZeeAVI2 )); Cell( kcell351, 0, 0, 10 ); // poll at 1/6ths of a second End; DestroyGob( kgobIdeaMcZeeAVI2 ); ENABLEHOTSPOTS(kflgBuildingAll); DISABLEACCEL(fFalse); .fEnableAccel = fTrue; // SETPALETTE( cnoNil ); // assert that we no long don't have the inspiration room palette EnqueueCid(cidInvokeSplot, khidApp, kgobInspiration1, kgobSplotMachineObj, 0, 0); ChangeStateThis( kst5 ); ENDCHUNK; REP_ANIM( CHID( kst8, krepDefault ), "Start the talent book" ) DISABLEHOTSPOTS(kflgBuildingMin); Cell( kcell401, 0,0, 1 ); WAIT_FOR_TRANSITION(); // If a transition is occuring wait CreateChildGob( GidParThis(), kgobIdeaMcZeeAVI3, kgobIdeaMcZeeAVI3 ); Cell( kcell401,0,0, 100 ); // wait for init // watch it and proceed appropriately While( PlayingGob( kgobIdeaMcZeeAVI3 )); Cell( kcell401, 0, 0, 10 ); // poll at 1/6ths of a second End; DestroyGob( kgobIdeaMcZeeAVI3 ); ENABLEHOTSPOTS(kflgBuildingAll); // Okay... Set the transition to dissolve and create the book! Transition(kgftDissolve, 0, 60, Transparent, cnoNil ); // Create the BIO book, page 0 (TOC), with controls (fTrue) BIO_CREATEBOOK( 0, fTrue, kgobInspiration1 ); ChangeStateThis( kst5 ); ENDCHUNK; CLICK_SCRIPT("Clicked Mz, toggle help") SetNoSlipThis( fFalse ); // don't drop frames now If( GLOBAL( fHelpOn ) == fFalse ); SETGLOBAL( fHelpOn, fTrue ); SETGLOBAL( fIdeasPS, fFalse ); ChangeStateGob( kgobInsp1McZee, kst3 ); Elif( GLOBAL( fHelpOn ) == fTrue && StateThis() == kst2); // McZee is in the wait state with help on. SETGLOBAL( fHelpOn, fFalse ); // Take down the help balloon. DestroyGob( kgobBalloon1e ); Elif( GLOBAL( fHelpOn ) == fTrue ); // McZee is animating help information and is clicked. ENDVOICE(); // Go to the wait state with the help balloon up. ChangeStateThis( kst2 ); End; ENDCHUNK HELP_SCRIPT( ktpcIdeas ) If( _parm[0] == 0 ); // Do nothing Elif( _parm[0] == 1 ); // Start the Splot Machine. DestroyGob( kgobBalloon1e ); ChangeStateGob( kgobInsp1McZee, kst7 ); Elif( _parm[0] == 2 ); // Look at the Talent book.. DestroyGob( kgobBalloon1e ); ChangeStateGob( kgobInsp1McZee, kst8 ); End; ENDCHUNK OBJECT( "Splot machine hot spot", kgobSplotMachine, 100, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\inspirat\SplotMsk.bmp", 0, 0 ) CLICK_SCRIPT( "Splot machine clicked" ) SETGLOBAL( fHelpOn, fFalse ); If( FGobExists( kgobBalloon1e ) ); DestroyGob( kgobBalloon1e ); End; ENDVOICE(); ChangeStateGob( kgobInsp1McZee, kst7 ); ENDCHUNK OBJECT( "Talent book hot spot", kgobTalentBook, 100, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\inspirat\TalntMsk.bmp", 0, 0 ) CLICK_SCRIPT( "Talent book clicked" ) SETGLOBAL( fHelpOn, fFalse ); If( FGobExists( kgobBalloon1e ) ); DestroyGob( kgobBalloon1e ); End; ENDVOICE(); ChangeStateGob( kgobInsp1McZee, kst8 ); ENDCHUNK OBJECT( "doors out", kgobInsp2Doors, 33, kcrsHand1 ) REP_MASK( CHID1(krepDefault), "building\bitmaps\inspirat\ins2door.bmp", 0, 0 ) CLICK_SCRIPT( "doors out clicked" ) NEXTPLACE1( kgobBackstage1, kst2 ); ENDCHUNK OBJECT( "inspirat2 map", kgobInsp2Map, 44, kcrsHand1 ) REP_MASK( CHID1(krepDefault), "building\bitmaps\inspirat\ins2map.bmp", 0, 0 ) CLICK_SCRIPT( "inspirat 2 map clicked" ) CreateChildGob( GET_CURRENTPLACE(), kgobMapMain, kgobMapMain ); ENDCHUNK OBJECT( "inspirat2 exit", kgobInsp2Exit, 44, kcrsHand1 ) REP_MASK( CHID1(krepDefault), "building\bitmaps\inspirat\ins2quit.bmp", 0, 0 ) CLICK_SCRIPT( "inspirat 2 exit clicked" ) QUITAPP(); ENDCHUNK // ----------------------------------------------------- // The splot machine // ----------------------------------------------------- OBJECT( "Splot machine object", kgobSplotMachineObj, 1000, kcrsArrow1 ) REP_PPMBMP( CHID1(krepDefault), "building\pbm\inspirat\splot0.pbm" ) CREATE_SCRIPT( "startup" ) PLAYMIDI( cnoNil ); CreateChildThis( kgobBSplot1, kgobBSplot1 ); CreateChildThis( kgobBSplot2, kgobBSplot2 ); CreateChildThis( kgobBSplot3, kgobBSplot3 ); CreateChildThis( kgobBSplot4, kgobBSplot4 ); CreateChildThis( kgobBSplot5, kgobBSplot5 ); CreateChildThis( kgobBSplot6, kgobBSplot6 ); CreateChildThis( kgobBSplot7, kgobBSplot7 ); CreateChildThis( kgobSplotView, kgobSplotView ); CreateHelpThis( ktpcSplotIdea ); EnqueueCid(cidSplotInit, kgobSplotMachineObj, kgobSplotView, 0, 0, 0); CreateChildThis( kgobSplotGlass, kgobSplotGlass ); ENDCHUNK OBJECTREG( "Splot Mach. Glass", kgobSplotGlass, 0, 0, 100, kcrsArrow1 ) REP_RECT( CHID1( krepDefault), "rectangle", 48, 95, 591, 401 ) // ----------------------------------------------------- // The splot movie view // ----------------------------------------------------- GOBCHUNK( "Splot movie view", kgobSplotView, kgokkRectHit) DEFAULT_POSITION( 0, 0, 0 ) ACTION(fcustNil, fcustNil, fgrfstNone, kcrsArrow1, chidNil, cidNil, cnoNil) ENDCHUNK REP_RECT(CHID1(krepDefault), "Splot View", 48, 95, 591, 401 ) // ----------------------------------------------------- // Button BSplot1 "Generate a movie Idea" // ----------------------------------------------------- GOBCHUNK("BSplot1 button", kgobBSplot1, kgokkRectHit ) DEFAULT_POSITION( 600, 194, 0 ) ACTION(fcustNil, fcustNil, fgrfst1, kcrsHand1, CHID(kst1, kchidClick), cidNil, cnoNil) ENDCHUNK REP_PPMBMP( kcell2, "building\pbm\inspirat\bigarm2.pbm" ) REP_PPMBMP( kcell3, "building\pbm\inspirat\bigarm3.pbm" ) REP_PPMBMP( kcell4, "building\pbm\inspirat\bigarm4.pbm" ) REP_PPMBMP( CHID(kst1, krepDefault), "building\pbm\inspirat\bigarm1.pbm") // Disabled button REP_PPMBMP( CHID(kst1, kchidDownOn), "building\pbm\inspirat\bigarm5.pbm") // Clicked button REP_ANIM( CHID(kst1, kchidUpDownOn), "On button, mouse Up to Down transition") Cell( kcell2, 0, 0, 9 ); Cell( kcell3, 0, 0, 9 ); Cell( kcell4, 0, 0, 9 ); ENDCHUNK REP_ANIM( CHID(kst1, kchidDownOffOn), "Mouse down, Off to On button transition") Cell( kcell2, 0, 0, 9 ); Cell( kcell3, 0, 0, 9 ); Cell( kcell4, 0, 0, 9 ); ENDCHUNK REP_ANIM( CHID(kst1, kchidDownUpOn), "On button, mouse Down to Up transition") Cell( kcell4, 0, 0, 9 ); Cell( kcell3, 0, 0, 9 ); Cell( kcell2, 0, 0, 9 ); Cell( CHID(kst1, krepDefault), 0, 0, 9 ); ENDCHUNK REP_ANIM( CHID(kst1, kchidDownOnOff), "Mouse down, On to Off button transition") Cell( kcell4, 0, 0, 9 ); Cell( kcell3, 0, 0, 9 ); Cell( kcell2, 0, 0, 9 ); Cell( CHID(kst1, krepDefault), 0, 0, 9 ); ENDCHUNK REP_WAVE( CHID( kst1, krepClicked ), "building\sound\inspirat\splthndl.wav" ); CHILD_SCRIPT("BSplot1 script", CHID(kst1, kchidClick)) ChangeStateGob( kgobBSplot2, kst2 ); // These activate the ChangeStateGob( kgobBSplot3, kst2 ); // the fine tuning buttons. ChangeStateGob( kgobBSplot4, kst2 ); ChangeStateGob( kgobBSplot5, kst2 ); ChangeStateGob( kgobBSplot6, kst2 ); // enable the tools button EnqueueCid(cidSplotDo, kgobSplotMachineObj, 1, 1, 1, 1); EnqueueCid(cidSplotUpdate, kgobSplotMachineObj, 0, 0, 0, 0); If( FGobExists( kgobCalloutBalloon4 ) ); DestroyGob( kgobCalloutBalloon4 ); // Destroy the help balloon and CreateHelpGob( GidParThis(), ktpcSplotIdea2 ); // next balloon End; // it's contents. ENDCHUNK // ----------------------------------------------------- // Button BSplot2 "Generate new Actors/Props" // ----------------------------------------------------- GOBCHUNK("BSplot2 button", kgobBSplot2, kgokkRectHit) DEFAULT_POSITION( 427, 2, 0 ) ACTION(fcustNil, fcustNil, fgrfst1, kcrsArrow1, chidNil, cidNil, cnoNil) ACTION(fcustNil, fcustNil, fgrfst2, kcrsHand1, CHID(kst2, kchidClick), cidNil, cnoNil) ENDCHUNK REP_PPMBMP( kcell2, "building\pbm\inspirat\actarm2.pbm" ); REP_PPMBMP( kcell3, "building\pbm\inspirat\actarm3.pbm" ); REP_PPMBMP( kcell4, "building\pbm\inspirat\actarm4.pbm" ); REP_PPMBMP( CHID(kst1, krepDefault), "building\pbm\inspirat\actarm1.pbm") // Disabled button ADOPT_MBMP(LAST_MBMP, CHID(kst2, krepDefault)) REP_PPMBMP( CHID(kst2, kchidDownOn), "building\pbm\inspirat\actarm5.pbm") // Clicked button REP_ANIM( CHID(kst2, kchidUpDownOn), "On button, mouse Up to Down transition") Cell( kcell2, 0, 0, 9 ); Cell( kcell3, 0, 0, 9 ); Cell( kcell4, 0, 0, 9 ); ENDCHUNK REP_ANIM( CHID(kst2, kchidDownOffOn), "Mouse down, Off to On button transition") Cell( kcell2, 0, 0, 9 ); Cell( kcell3, 0, 0, 9 ); Cell( kcell4, 0, 0, 9 ); ENDCHUNK REP_ANIM( CHID(kst2, kchidDownUpOn), "On button, mouse Down to Up transition") Cell( kcell4, 0, 0, 9 ); Cell( kcell3, 0, 0, 9 ); Cell( kcell2, 0, 0, 9 ); Cell( CHID(kst2, krepDefault), 0, 0, 9 ); ENDCHUNK REP_ANIM( CHID(kst2, kchidDownOnOff), "Mouse down, On to Off button transition") Cell( kcell4, 0, 0, 9 ); Cell( kcell3, 0, 0, 9 ); Cell( kcell2, 0, 0, 9 ); Cell( CHID(kst2, krepDefault), 0, 0, 9 ); ENDCHUNK REP_WAVE( CHID( kst2, krepClicked ), "building\sound\inspirat\splthndl.wav" ); CHILD_SCRIPT("BSplot2 script", CHID(kst2, kchidClick)) If( FGobExists( kgobCalloutBalloon4 ) ); // takedown callouts DestroyGob( kgobCalloutBalloon4 ); End; EnqueueCid(cidSplotDo, kgobSplotMachineObj, 0, 0, 1, 0); EnqueueCid(cidSplotUpdate, kgobSplotMachineObj, 0, 0, 0, 0); ENDCHUNK // ----------------------------------------------------- // Button BSplot3 "Generate a new camera angle" // ----------------------------------------------------- GOBCHUNK("BSplot3 button", kgobBSplot3, kgokkRectHit) DEFAULT_POSITION( 289, 2, 0 ) ACTION(fcustNil, fcustNil, fgrfst1, kcrsArrow1, chidNil, cidNil, cnoNil) ACTION(fcustNil, fcustNil, fgrfst2, kcrsHand1, CHID(kst2, kchidClick), cidNil, cnoNil) ENDCHUNK REP_WAVE( CHID( kst2, krepClicked ), "building\sound\inspirat\splthndl.wav" ); REP_PPMBMP( kcell2, "building\pbm\inspirat\cmrarm2.pbm" ); REP_PPMBMP( kcell3, "building\pbm\inspirat\cmrarm3.pbm" ); REP_PPMBMP( kcell4, "building\pbm\inspirat\cmrarm4.pbm" ); REP_PPMBMP( CHID(kst1, krepDefault), "building\pbm\inspirat\cmrarm1.pbm") // Disabled button ADOPT_MBMP(LAST_MBMP, CHID(kst2, krepDefault)) REP_PPMBMP( CHID(kst2, kchidDownOn), "building\pbm\inspirat\cmrarm5.pbm") // Clicked button REP_ANIM( CHID(kst2, kchidUpDownOn), "On button, mouse Up to Down transition") Cell( kcell2, 0, 0, 9 ); Cell( kcell3, 0, 0, 9 ); Cell( kcell4, 0, 0, 9 ); ENDCHUNK REP_ANIM( CHID(kst2, kchidDownOffOn), "Mouse down, Off to On button transition") Cell( kcell2, 0, 0, 9 ); Cell( kcell3, 0, 0, 9 ); Cell( kcell4, 0, 0, 9 ); ENDCHUNK REP_ANIM( CHID(kst2, kchidDownUpOn), "On button, mouse Down to Up transition") Cell( kcell4, 0, 0, 9 ); Cell( kcell3, 0, 0, 9 ); Cell( kcell2, 0, 0, 9 ); Cell( CHID(kst2, krepDefault), 0, 0, 9 ); ENDCHUNK REP_ANIM( CHID(kst2, kchidDownOnOff), "Mouse down, On to Off button transition") Cell( kcell4, 0, 0, 9 ); Cell( kcell2, 0, 0, 9 ); Cell( CHID(kst2, krepDefault), 0, 0, 9 ); ENDCHUNK CHILD_SCRIPT("BSplot3 script", CHID(kst2, kchidClick)) If( FGobExists( kgobCalloutBalloon4 ) ); // takedown callouts DestroyGob( kgobCalloutBalloon4 ); End; EnqueueCid(cidSplotDo, kgobSplotMachineObj, 0, 1, 0, 0); EnqueueCid(cidSplotUpdate, kgobSplotMachineObj, 0, 0, 0, 0); ENDCHUNK // ----------------------------------------------------- // Button BSplot4 "Generate a new sound background" // ----------------------------------------------------- GOBCHUNK("BSplot4 button", kgobBSplot4, kgokkRectHit) DEFAULT_POSITION( 566, 2, 0 ) ACTION(fcustNil, fcustNil, fgrfst1, kcrsArrow1, chidNil, cidNil, cnoNil) ACTION(fcustNil, fcustNil, fgrfst2, kcrsHand1, CHID(kst2, kchidClick), cidNil, cnoNil) ENDCHUNK REP_WAVE( CHID( kst2, krepClicked ), "building\sound\inspirat\splthndl.wav" ); REP_PPMBMP( kcell2, "building\pbm\inspirat\muscarm2.pbm" ); REP_PPMBMP( kcell3, "building\pbm\inspirat\muscarm3.pbm" ); REP_PPMBMP( kcell4, "building\pbm\inspirat\muscarm4.pbm" ); REP_PPMBMP( CHID(kst1, krepDefault), "building\pbm\inspirat\muscarm1.pbm") // Disabled button ADOPT_MBMP(LAST_MBMP, CHID(kst2, krepDefault)) REP_PPMBMP( CHID(kst2, kchidDownOn), "building\pbm\inspirat\muscarm5.pbm") // Clicked button REP_ANIM( CHID(kst2, kchidUpDownOn), "On button, mouse Up to Down transition") Cell( kcell2, 0, 0, 9 ); Cell( kcell3, 0, 0, 9 ); Cell( kcell4, 0, 0, 9 ); ENDCHUNK REP_ANIM( CHID(kst2, kchidDownOffOn), "Mouse down, Off to On button transition") Cell( kcell2, 0, 0, 9 ); Cell( kcell3, 0, 0, 9 ); Cell( kcell4, 0, 0, 9 ); ENDCHUNK REP_ANIM( CHID(kst2, kchidDownUpOn), "On button, mouse Down to Up transition") Cell( kcell4, 0, 0, 9 ); Cell( kcell3, 0, 0, 9 ); Cell( kcell2, 0, 0, 9 ); Cell( CHID(kst2, krepDefault), 0, 0, 9 ); ENDCHUNK REP_ANIM( CHID(kst2, kchidDownOnOff), "Mouse down, On to Off button transition") Cell( kcell4, 0, 0, 9 ); Cell( kcell3, 0, 0, 9 ); Cell( kcell2, 0, 0, 9 ); Cell( CHID(kst2, krepDefault), 0, 0, 9 ); ENDCHUNK CHILD_SCRIPT("BSplot4 script", CHID(kst2, kchidClick)) If( FGobExists( kgobCalloutBalloon4 ) ); // takedown callouts DestroyGob( kgobCalloutBalloon4 ); End; EnqueueCid(cidSplotDo, kgobSplotMachineObj, 0, 0, 0, 1); EnqueueCid(cidSplotUpdate, kgobSplotMachineObj, 0, 0, 0, 0); ENDCHUNK // ----------------------------------------------------- // Button BSplot5 "Generate a new background" // ----------------------------------------------------- GOBCHUNK("BSplot5 button", kgobBSplot5, kgokkRectHit) DEFAULT_POSITION( 146, 1, 0 ) ACTION(fcustNil, fcustNil, fgrfst1, kcrsArrow1, chidNil, cidNil, cnoNil) ACTION(fcustNil, fcustNil, fgrfst2, kcrsHand1, CHID(kst2, kchidClick), cidNil, cnoNil) ENDCHUNK REP_WAVE( CHID( kst2, krepClicked ), "building\sound\inspirat\splthndl.wav" ); REP_PPMBMP( kcell2, "building\pbm\inspirat\scnarm2.pbm" ); REP_PPMBMP( kcell3, "building\pbm\inspirat\scnarm3.pbm" ); REP_PPMBMP( kcell4, "building\pbm\inspirat\scnarm4.pbm" ); REP_PPMBMP( CHID(kst1, krepDefault), "building\pbm\inspirat\scnarm1.pbm") // Disabled button ADOPT_MBMP(LAST_MBMP, CHID(kst2, krepDefault)) REP_PPMBMP( CHID(kst2, kchidDownOn), "building\pbm\inspirat\scnarm5.pbm") // Clicked button REP_ANIM( CHID(kst2, kchidUpDownOn), "On button, mouse Up to Down transition") Cell( kcell2, 0, 0, 9 ); Cell( kcell3, 0, 0, 9 ); Cell( kcell4, 0, 0, 9 ); ENDCHUNK REP_ANIM( CHID(kst2, kchidDownOffOn), "Mouse down, Off to On button transition") Cell( kcell2, 0, 0, 9 ); Cell( kcell3, 0, 0, 9 ); Cell( kcell4, 0, 0, 9 ); ENDCHUNK REP_ANIM( CHID(kst2, kchidDownUpOn), "On button, mouse Down to Up transition") Cell( kcell4, 0, 0, 9 ); Cell( kcell3, 0, 0, 9 ); Cell( kcell2, 0, 0, 9 ); Cell( CHID(kst2, krepDefault), 0, 0, 9 ); ENDCHUNK REP_ANIM( CHID(kst2, kchidDownOnOff), "Mouse down, On to Off button transition") Cell( kcell4, 0, 0, 9 ); Cell( kcell3, 0, 0, 9 ); Cell( kcell2, 0, 0, 9 ); Cell( CHID(kst2, krepDefault), 0, 0, 9 ); ENDCHUNK CHILD_SCRIPT("BSplot5 script", CHID(kst2, kchidClick)) If( FGobExists( kgobCalloutBalloon4 ) ); // takedown callouts DestroyGob( kgobCalloutBalloon4 ); End; EnqueueCid(cidSplotDo, kgobSplotMachineObj, 1, 0, 0, 0); EnqueueCid(cidSplotUpdate, kgobSplotMachineObj, 0, 0, 0, 0); ENDCHUNK // ----------------------------------------------------- // Button BSplot6 "Invoke the studio tools" // ----------------------------------------------------- GOBCHUNK("BSplot6 button", kgobBSplot6, kgokkRectHit) DEFAULT_POSITION( 471, 426, 0 ) ACTION(fcustNil, fcustNil, fgrfst1, kcrsArrow1, chidNil, cidNil, cnoNil) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand1, CHID(kst2, kchidClick), cidNil, cnoNil) ENDCHUNK REP_PPMBMP( CHID(kst1, krepDefault), "building\pbm\inspirat\toolboxd.pbm") // Enabled button up REP_PPMBMP( CHID(kst2, krepDefault), "building\pbm\inspirat\toolbox1.pbm") // Enabled button up ADOPT_MBMP(LAST_MBMP, CHID(kst2, krepMouseDnOff)) ADOPT_MBMP(LAST_MBMP, CHID(kst2, krepMouseUpOn)) REP_PPMBMP( CHID(kst2, krepMouseDnOn), "building\pbm\inspirat\toolbox2.pbm") // Clicked button CHILD_SCRIPT("BSplot6 script", CHID(kst2, kchidClick)) // set up a transition If( FGobExists( kgobCalloutBalloon4 ) ); // takedown callouts DestroyGob( kgobCalloutBalloon4 ); End; // Transition(kgftDissolve, 0, kTransitionTime, Transparent, kpalSocInspiration ); EnqueueCid(cidSplotOk, kgobSplotMachineObj, 0, 0, 0, 0); // Reenable accelerator keys. Any other way out of the splot machine // is handled by the polling in McZee's null representation script. ENABLEACCEL(fFalse); LOADTOOLS(kgobInspiration1, kst2, chidNil); ENDCHUNK // ----------------------------------------------------- // Button BSplot7 "Cancel out of the splot machine" // ----------------------------------------------------- GOBCHUNK("BSplot7 button", kgobBSplot7, kgokkRectHit) DEFAULT_POSITION( 521, 426, 0 ) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand1, CHID(kst1, kchidClick), cidNil, cnoNil) ENDCHUNK REP_PPMBMP( CHID(kst1, krepDefault), "building\pbm\inspirat\cancel1.pbm") // Enabled button up ADOPT_MBMP(LAST_MBMP, CHID(kst1, krepMouseDnOff)) ADOPT_MBMP(LAST_MBMP, CHID(kst1, krepMouseUpOn)) REP_PPMBMP( CHID(kst1, krepMouseDnOn), "building\pbm\inspirat\cancel2.pbm") // Clicked button CHILD_SCRIPT("BSplot7 script", CHID(kst1, kchidClick)) If( FGobExists( kgobCalloutBalloon4 ) ); // takedown callouts DestroyGob( kgobCalloutBalloon4 ); End; EnqueueCid(cidSplotCancel, kgobSplotMachineObj, 0, 0, 0, 0); ENDCHUNK //-------------------------------------------------------- // Bio page hotspots //-------------------------------------------------------- OBJECT( "Biopage 39 mask", kgobIdea1m1, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\inspirat\idea1m1.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If( fBIO_AVAIL( 39 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 39 ); BIO_CREATEBOOK( 39, fFalse, kgobInspiration1 ); End; ENDCHUNK OBJECT( "Biopage 7 mask", kgobIdea4m1, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\inspirat\idea4m1.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If( fBIO_AVAIL( 7 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 7 ); BIO_CREATEBOOK( 7, fFalse, kgobInspiration4); End; ENDCHUNK OBJECT( "Biopage 8 mask", kgobIdea4m2, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\inspirat\idea4m2.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If( fBIO_AVAIL( 8 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 8 ); BIO_CREATEBOOK( 8, fFalse, kgobInspiration4); End; ENDCHUNK OBJECT( "Biopage 9 mask", kgobIdea4m3, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\inspirat\idea4m3.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 9 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 9 ); BIO_CREATEBOOK( 9, fFalse, kgobInspiration4); End; ENDCHUNK OBJECT( "Biopage 10 mask", kgobIdea3m1, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\inspirat\idea3m1.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 10 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 10 ); BIO_CREATEBOOK( 10, fFalse, kgobInspiration3); End; ENDCHUNK OBJECT( "Biopage 11 mask", kgobIdea3m2, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\inspirat\idea3m2.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 11 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 11 ); BIO_CREATEBOOK( 11, fFalse, kgobInspiration3); End; ENDCHUNK OBJECT( "Biopage 12 mask", kgobIdea3m3, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\inspirat\idea3m3.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 12 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 12 ); BIO_CREATEBOOK( 12, fFalse, kgobInspiration3); End; ENDCHUNK OBJECT( "Biopage 13 mask", kgobIdea2m1, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\inspirat\idea2m1.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 13 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 13 ); BIO_CREATEBOOK( 13, fFalse, kgobInspiration2 ); End; ENDCHUNK ================================================ FILE: src/building/lobby.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // ----------------------------------------------------- // LOBBY.CHT // // Copyright (C) Microsoft Corporation 1995. // All Rights reserved. // // ----------------------------------------------------- // Module Intent: // // Contains the kauai script code for the Lobby. // // // Revisions: // // mm-dd-yy // ??-??-94 ***** - Created // // ----------------------------------------------------- // ------------------------------------------------------------------------ // Stuff for View #1 of lobby // ------------------------------------------------------------------------ WAVE_CHUNK( "building\sound\lobby\bingo.wav", kwavBingo ) WAVE_CHUNK( "building\sound\lobby\04_logn3.wav", kwav04_logn3 ) WAVE_CHUNK( "building\sound\lobby\VO57A.wav", kwavVO57A ) WAVE_CHUNK( "building\sound\lobby\VO57aa.wav", kwavVO57AA ) WAVE_CHUNK( "building\sound\lobby\VO58.wav", kwavVO58 ) WAVE_CHUNK( "building\sound\lobby\VO59.wav", kwavVO59 ) OBJECT( "lobby1: mczee!", kgobLobby1McZee, 111, kcrsHand1 ) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // State 1: Default creation state. And the dispatch state. // Use the global kstEntry to decide which state to enter next. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - REP_ANIM( CHID( kst1, krepEnterAnimation ), "lobby1: McZee!") ASSERT(GLOBAL(kstEntry) == 2 || GLOBAL(kstEntry) == 3 || GLOBAL(kstEntry) == 5); fFirstLoop = fTrue; // Initialistaion ( used in state 2 ) // The following flag will control whether or not mczee audio accompanies // balloon creation. ie. in toggling help on and off McZee doesn't keep starting! // If set to false, it does and this is then set to TRUE. If true, no audio // This is reset each time you create the lobby object. .f1sthelp=fTrue; .fLipsink = fFalse; If( GLOBAL( fLobby1PS ) && GLOBAL( kstEntry ) == kst2 );// If this is the first time coming to this room ChangeStateThis( kst3 ); // then see McZee's WILD and ZANEY entrance first. Else; ChangeStateThis(GLOBAL(kstEntry)); End; ENDCHUNK // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // State 2: The looping McZee state, where the help balloon pops. // Click McZee: turns help on and off // Exits: If theatre door clicked : kgobLobby1->fExitLobby set if so // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - REP_ANIM( CHID( kst2, krepDefault ), "lobby1:Wait state. Entry 2 (from map).") DEBUGCMD( PrintStr("Lobby Mz: State 2") ); Cell( kcell184, 0,0, 6); // This is needed for proper placement of the help balloon. If( GLOBAL(fHelpOn) ); CreateHelpGob( kgobLobby1, ktpcLobbyTip ); Elif( GLOBAL( fLob1stHelp ) ); SETGLOBAL( fLob1stHelp, fFalse ); SETGLOBAL( fHelpOn, fTrue ); CreateHelpGob( kgobLobby1, ktpcLobbyTip ); End; fFirstLoop = fTrue; While( !kgobLobby1->fExitLobby ); // The waitng loop. // The idle loop cycle here makes use of animation // not specficly designed for looping. The use of // cells for looping is as follows: // Traverse the cells kcell184 to kcell199, then // kcell198 to kcell185. // The lipsink animation starts after kcell199, it is // kcell401 to kcell423, these are the origional cells 157 to 179 // with lip sinking added and the reason its those particular cells // is a somewhat long story. // At the end of the lip sinking I pick up with cell 180 // to get smoothly back to cell 184 and the start of the looping // cycle. If( !fFirstLoop ); If( .fLipsink ); .fLipsink = fFalse; cnt = kcell401; VOICE( kwavVO59, ktpcVO59 ); While( cnt < kcell423 ); Cell( cnt++, 0, 0, 6); End; Cell( kcell180, 0, 0, 7); Cell( kcell181, 0, 0, 8); Cell( kcell182, 0, 0, 8); Cell( kcell183, 0, 0, 7); Else; cnt = kcell198; While( cnt > kcell184 ); Cell( cnt--, 0, 0, 6); End; End; End; fFirstLoop = fFalse; cnt = kcell184; While( cnt < kcell200 ); Cell( cnt++, 0, 0, 6); End; If( !kgobLobby1->fExitLobby ); // McZee randomly tosses the carpet bag in the air. If( Rnd(100) < 20 ); While( cnt < kcell218 ); Cell( cnt++, 0, 0, 6); End; // If McZee is to remain in the looping state he must catch // the carpet bag on his foot. This one frame makes a good catch // animation. If( !kgobLobby1->fExitLobby ); // This "If" is here because McZee could be clicked Cell( kcell203, 0, 0, 6); // in this part of the animation. End; End; Else; Cell( kcell203, 0, 0, 6); Cell( kcell5, 0, 0, 6); // fork217 cell Cell( kcell217, 0, 0, 6); End; ENDVOICE(); End; ChangeStateThis( kst6 ); ENDCHUNK // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // State 3: Uniride to loop position decision point // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - REP_ANIM( CHID( kst3, krepDefault ), "lobby1. UniRide to loop position, entry point." ) DEBUGCMD( PrintStr("Lobby Mz: State 3") ); // fLobby1PS --- PS = Per Session. See flowchart for gory details. If( !GLOBAL( fLobby1PS ) ); // Not the 1st time here this session. DEBUGCMD( PrintStr("flag fLobby1PS = fFalse") ); If( GLOBAL( fMovie ) ); DEBUGCMD( PrintStr("flag fMovie = fTrue") ); PLAYMIDI( kmidTheatre ); DISABLEHOTSPOTS(kflgBuildingMin); Cell( kcell178, 0,0, 6); WAIT_FOR_TRANSITION(); cnt = kcell178; While( cnt < kcell218 ); // Do a loop then go to the pass thru sequence. Cell( cnt++, 0,0, 6); End; ChangeStateThis( kst6 ); Else; ChangeStateThis( kst2 ); End; Else; // The 1st time in this room. SETGLOBAL( fLobby1PS, fFalse ); // Reset the flag and show animation. If( GLOBAL( fMovie ) ); DISABLEHOTSPOTS(kflgBuildingMin); PLAYMIDI( kmidTheatre ); // This is by design, for a nointerruptible animation End; // play the MIDI of the place thats next. cnt = kcell10; Cell( kcell10, 0,0, 6); WAIT_FOR_TRANSITION(); While( cnt < kcell117 ); If( cnt == kcell31 ); VOICE( kwavVO57A, ktpcVO57A ); Elif( cnt == kcell57 ); VOICE( kwavVO57AA, ktpcVO57AA ); End; Cell( cnt++, 0,0, 6); End; ENDVOICE(); If( GLOBAL( fMovie ) ); cnt = kcell202; While( cnt < kcell218 ); // Segway to the exit seqence. Cell( cnt++, 0,0, 6); End; ChangeStateThis( kst6 ); Else; ChangeStateThis( kst4 ); End; End; ENDCHUNK REP_ANIM( CHID( kst4, krepDefault ), "lobby1: Lobby welcome.") DEBUGCMD( PrintStr("Lobby Mz: State 4") ); cnt = kcell117; Cell( kcell117, 0,0, 1); WAIT_FOR_TRANSITION(); VOICE( kwavVO58, ktpcVO58 ); While( cnt < kcell184 ); Cell( cnt++, 0,0, 6); End; ENDVOICE(); ChangeStateThis( kst2 ); ENDCHUNK REP_ANIM( CHID( kst5, krepDefault ), "lobby1: Pass thru") DEBUGCMD( PrintStr("Lobby Mz: State 5") ); // ***** 9.4.95 - this is now an AVI sequence DISABLEHOTSPOTS(kflgBuildingMin); PLAYMIDI( kmidTheatre ); Cell( kcell302, 0, 0, 1); WAIT_FOR_TRANSITION(); CreateChildGob( kgobLobby1, kgobLobbyAVI, kgobLobbyAVI ); // delay while AVI queues up then watch it and proceed appropriately Cell( kcell302, 0,0, 100 ); While( PlayingGob( kgobLobbyAVI )); Cell( kcell302, 0, 0, 10 ); // poll at 1/6ths of a second End; ENABLEHOTSPOTS(kflgBuildingAll); NEXTPLACE1( kgobTheatre1, kst7 ); ENDCHUNK REP_ANIM( CHID( kst6, krepDefault ), "lobby1: Exit state.") DEBUGCMD( PrintStr("Lobby Mz: State 6") ); cnt = kcell219; DISABLEHOTSPOTS(kflgBuildingMin); While( cnt < kcell260 ); Cell( cnt++, 0,0, 6); End; NEXTPLACE1( kgobTheatre1, kst5 ); ENDCHUNK CLICK_SCRIPT("Clicked Mz, toggle help") DEBUGCMD( PrintStr("Lobby Mz: Clicked") ); If( StateThis() != kst2 ); // If not in the wait state.. ChangeStateThis( kst2 );// go to the wait state. SETGLOBAL( fHelpOn, fTrue ); Elif( GLOBAL( fHelpOn ) ); SETGLOBAL( fHelpOn, fFalse ); DestroyGob( kgobBalloon1d ); // This destroys the balloon that holds the tip Else; SETGLOBAL( fHelpOn, fTrue ); CreateHelpGob( kgobLobby1, ktpcLobbyTip ); End; ENDCHUNK REP_PPMBMP( kcell5, "building\pbm\lobby\fork217.pbm" ) #include "mzlobby.seq" // include all mczee cells OBJECTREG("McZee 04logn3 - AVI ", kgobLobbyAVI, 0, 0, 999, kcrsArrow1) REP_VIDEO( CHID1( krepDefault ), "04logn3.avi", fTrue ) HELP_SCRIPT( ktpcLobbyTip ) If( _parm[0] == 0 ); If( kgobLobby1McZee->f1sthelp ); kgobLobby1McZee->fLipsink = fTrue; kgobLobby1McZee->f1sthelp = fFalse; End; Exit(); Elif( _parm[0] == 1 ); // clicked "go to theatre" DestroyGob( kgobBalloon1d ); DISABLEHOTSPOTS(kflgBuildingMin); kgobLobby1->fExitLobby=fTrue; Elif( _parm[0] == 2 ); // go to the snackbar. // Don't need to DestroyGob here because the whole // lobby object is being destroyed. NEXTPLACE1( kgobSnackBar, kst1 ); End; ENDCHUNK OBJECT( "theatre door", kgobLobby1Door, 33, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\lobby\lob1door.bmp", 0, 0 ) CLICK_SCRIPT( "theatre door clicked" ) If( !kgobLobby1->fExitLobby ); // Prevents repeat strikes PLAYMIDI( kmidTheatre ); If( GLOBAL( fHelpOn ) ); // If help is up, remove for exit, but don't change the flag. DestroyGob( kgobBalloon1d ); // If it was up it should be up in the next room. End; If( StateGob(kgobLobby1McZee) != kst2 ); // The user has asked to go to the theater during NEXTPLACE1( kgobTheatre1, kst5 ); // a string of animation sequences. Stop the seqences Else; // and go to the theater. DISABLEHOTSPOTS(kflgBuildingMin); kgobLobby1->fExitLobby=fTrue; // This allows a smooth exit from the wait state. End; End; ENDCHUNK // poster 3 = bio page # 35 OBJECT( "poster #3", kgobLobby1Poster3, 45, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\lobby\poster3.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 35 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 35 ); BIO_CREATEBOOK( 35, fFalse, kgobLobby1 ); End; ENDCHUNK // poster 4 = bio page #36 OBJECT( "poster #4", kgobLobby1Poster4, 45, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\lobby\poster4.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 36 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 36 ); BIO_CREATEBOOK( 36, fFalse, kgobLobby1 ); End; ENDCHUNK // back view OBJECT( "lobby 2 doors", kgobLobby2Doors, 22, kcrsHand1 ) REP_MASK( CHID1( krepDefault ),"building\bitmaps\lobby\lob2door.bmp", 0, 0 ) CLICK_SCRIPT( "lobby2 doors clicked" ) NEXTPLACE1( kgobTicket1, kst1 ); ENDCHUNK OBJECT( "lobby2 map", kgobLobby2Map, 44, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\lobby\lob2map.bmp", 0, 0 ) CLICK_SCRIPT( "lobby 2 map clicked" ) CreateChildGob( GET_CURRENTPLACE(), kgobMapMain, kgobMapMain ); ENDCHUNK OBJECT( "lobby2 exit", kgobLobby2Exit, 44, kcrsHand1 ) REP_RECT( CHID1( krepDefault ), "exit sign", 403, 187, 429, 204 ) CLICK_SCRIPT( "lobby 2 exit clicked" ) QUITAPP(); ENDCHUNK OBJECT( "Biopage 30 mask", kgobLobby1m1, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\lobby\lobby1m1.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 30 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 30 ); BIO_CREATEBOOK( 30, fFalse, kgobLobby1 ); End; ENDCHUNK ================================================ FILE: src/building/login.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // ----------------------------------------------------- // Script code for login place // ----------------------------------------------------- OBJECT( "login: main view", kgobLogin, 0, kcrsArrow1 ) REP_PPMBMP( CHID1( krepDefault), "building\pbm\login\login.pbm" ) CREATE_ANIM( "login : create" ) SETPALETTE( kpalImaginopolis ); SETKEYS(kflgBuildingMin); SETGLOBAL( fTrans, fFalse ); // No palette transition. CreateHelpThis( ktpcLoginChoice ); ENDCHUNK //---------------------------------------------------------- // This function is called when the user calls up the Portfolio via // CTRL+O and then closes it by pressing either Cancel or OK. The // Portfolio is opened in the Keyboard handler in Script6. // // _parm[2] is fTrue if the user pressed OK; fFalse if they // pressed Cancel. //---------------------------------------------------------- CHILD_SCRIPT("Login place: Portfolio Callback", kchidScript2) // End this filter as it is no longer required. FilterCmdsThis(cidPortfolioClosed, cidNil, chidNil); If (_parm[2]); // User clicked OK LOADTOOLS(kgobStudio1, kst1, chidNil); End; ENDCHUNK HELP_SCRIPT( ktpcLoginChoice ) If( _parm[0] == 0 ); // startup script invocation. Do nothing Exit(); Elif( _parm[0] == 1 ); // choice 1 - Create a New Movie NEXTPLACE1(kgobStudio1, kst2); Elif( _parm[0] == 2 ); // choice 2 : Work on an old Movie // Bring up the Movie Open portfolio. EnqueueCid(cidPortfolioOpen, 0, kpfPortOpenMovie, 0, 0, 0); // tell login to watch for the cid indicating that the portfolio has been closed. FilterCmdsGob( kgobLogin, cidPortfolioClosed, cidNil, kchidScript2); Elif( _parm[0] == 3 ); // choice 3 : Watch a movie NEXTPLACE1( kgobLobby1, kst5 ); Elif( _parm[0] == 4 ); // choice 4 : Make a movie with Melanie NEXTPLACE1(kgobBackstage1, kst5); Elif( _parm[0] == 5 ); // choice 5 : Get an idea for a movie NEXTPLACE1(kgobBackstage1, kst4); Elif( _parm[0] == 6 ); // choice 6 : Goto Imaginopolis NEXTPLACE1( kgobCloset, kst1 ); Elif( _parm[0] == 7 ); // choice 6 : QUIT! QUITAPP(); End; ENDCHUNK ================================================ FILE: src/building/makefile ================================================ #---building.mak !IFNDEF MAKEFILE_BUILDING MAKEFILE_BUILDING = 1 !INCLUDE $(KAUAI_ROOT)\makefile.def #BUILDING SOURCE DIRECTORY BLDG_SRC_DIR = $(SOC_ROOT)\src\building #SOC OBJ DIRECTORY SOC_OBJ_ROOT_DIR = $(SOC_ROOT)\obj SOC_OBJ_DIR = $(SOC_OBJ_ROOT_DIR)\$(BLD_TYPE_DIR) !IF "$(LOCAL_BUILD)" == "1" TARGET_DIR = !ELSE # LOCAL_BUILD TARGET_DIR = $(SOC_OBJ_DIR)^\ !ENDIF # !LOCAL_BUILD SOC_HEADER_FILES = \ $(SOC_ROOT)\inc\kidgs.chh \ $(SOC_ROOT)\inc\assert.chh \ $(SOC_ROOT)\inc\kidgsdef.h \ $(KAUAI_ROOT)\src\kiddef.h \ $(KAUAI_ROOT)\src\framedef.h \ $(SOC_ROOT)\inc\stdiodef.h \ $(SOC_ROOT)\inc\socdef.h \ $(SOC_ROOT)\inc\buildgob.h \ $(SOC_ROOT)\inc\sharedef.h \ $(SOC_ROOT)\inc\sharutil.chh BLDG_CHH_FILES = $(BLDG_SRC_DIR)\socdefn.h BLDG_CHT_FILES = \ $(BLDG_SRC_DIR)\backstag.cht\ $(BLDG_SRC_DIR)\building.cht\ $(BLDG_SRC_DIR)\imagin.cht\ $(BLDG_SRC_DIR)\inspirat.cht\ $(BLDG_SRC_DIR)\lobby.cht\ $(BLDG_SRC_DIR)\login.cht\ $(BLDG_SRC_DIR)\navbars.cht\ $(BLDG_SRC_DIR)\palette.cht\ $(BLDG_SRC_DIR)\projects.cht\ $(BLDG_SRC_DIR)\snackbar.cht\ $(BLDG_SRC_DIR)\street.cht\ $(BLDG_SRC_DIR)\studiobg.cht\ $(BLDG_SRC_DIR)\theatre.cht\ $(BLDG_SRC_DIR)\ticket.cht\ $(BLDG_SRC_DIR)\waiting.cht BLDG_CHUNK_TARGETS =\ $(TARGET_DIR)building.chk BLDGHD_CHT_FILES = \ $(BLDG_SRC_DIR)\bldghd.cht BLDGHD_CHUNK_TARGETS =\ $(TARGET_DIR)bldghd.chk #-Compile rules------------------------------------------------------------- #OLD .cht.chk RULES #{$(BLDG_SRC_DIR)}.cht{$(SOC_OBJ_DIR)}.chk: # SET INCLUDE=$(BLDG_SRC_DIR)\pbm;$(BLDG_SRC_DIR)\bitmaps;$(BLDG_SRC_DIR)\sound;$(INCLUDE) # cl /P -I$(BLDG_SRC_DIR) $(DEFS) /Tp$< # $(CHOMP) $(BLDG_SRC_DIR)\$(@B).i $*.chk #{$(BLDG_SRC_DIR)}.cht{$(SOC_OBJ_DIR)}.chk: # SET INCLUDE=$(BLDG_SRC_DIR)\pbm;$(BLDG_SRC_DIR)\bitmaps;$(BLDG_SRC_DIR)\sound;$(INCLUDE) # cl /E -I$(SOC_OBJ_DIR) $(DEFS) /Tp$< > $(SOC_OBJ_DIR)\%|fF.i # $(CHOMP) $(SOC_OBJ_DIR)\$(@B).i $*.chk SRC_DIR = $(BLDG_SRC_DIR) OBJ_DIR = $(SOC_OBJ_DIR) !INCLUDE $(SOC_ROOT)\makefile.rul #-Targets------------------------------------------------------------------- ALL_BLDG = $(TARGET_DIR)building.chk $(TARGET_DIR)bldghd.chk ALL_TARGETS_ROOT = $(ALL_TARGETS_ROOT) $(ALL_BLDG) CLEAN_BLDG = CLEAN_BLDG_CHUNKS CLEAN_TARGETS_ROOT = $(CLEAN_TARGETS_ROOT) $(CLEAN_BLDG) !IF "$(LOCAL_BUILD)" != "1" !IF "$(LOCAL_BUILD)" != "0" building.chk : ALL ALL: $(SOC_OBJ_DIR) BLDG_CONTENT CLEAN: CLEAN_BLDG_CHUNKS ALL !ENDIF # LOCAL_BUILD != 0 $(SOC_OBJ_DIR) : @echo Making Directories $(SOC_OBJ_DIR)... if not exist $(SOC_OBJ_ROOT_DIR)/nul mkdir $(SOC_OBJ_ROOT_DIR) if not exist $(SOC_OBJ_DIR)/nul mkdir $(SOC_OBJ_DIR) !ENDIF # LOCAL_BUILD != 1 CLEAN_BLDG_CHUNKS: @echo <nul^ DEL /q dummy.nul ) 2>nul <_var OBJECT( "The portfolio", kgobPortfolio, 975, kcrsArrow1 ) REP_RECT( CHID1( krepDefault ), "portfolio back", 0, 0, 640, 480) CREATE_SCRIPT( "Portfolio script" ) .kidCallObj = kidNil; .chidCallScript = chidNil; EnqueueCid(cidPortfolioOpen, 0, kpfPortOpenMovie, 0, kpfPortDirUsers, 0); FilterCmdsThis(cidPortfolioClosed, cidNil, kchidScript1); ENDCHUNK CHILD_SCRIPT("Call back from the portfolio function", kchidScript1); If(_parm[2] == fTrue); // Send a message to the frame work that a movie has been selected. // EnqueueCid(cidEaselImport, kidSpltGlass, 0, 0, 0, 0); RunScriptGob( PORTFOLIO( kidCallObj ), PORTFOLIO( chidCallScript ), fTrue ); Else; RunScriptGob( PORTFOLIO( kidCallObj ), PORTFOLIO( chidCallScript ), kidNil ); End; DestroyGob( kgobPortfolio ); ENDCHUNK ================================================ FILE: src/building/prdoor.seq ================================================ REP_PPMBMP( kcell1, "building\pbm\backstag\Pdoor54.pbm" ) REP_PPMBMP( kcell2, "building\pbm\backstag\Pdoor55.pbm" ) REP_PPMBMP( kcell3, "building\pbm\backstag\Pdoor56.pbm" ) REP_PPMBMP( kcell4, "building\pbm\backstag\Pdoor57.pbm" ) REP_PPMBMP( kcell5, "building\pbm\backstag\Pdoor58.pbm" ) REP_PPMBMP( kcell6, "building\pbm\backstag\Pdoor59.pbm" ) REP_PPMBMP( kcell7, "building\pbm\backstag\Pdoor60.pbm" ) REP_PPMBMP( kcell8, "building\pbm\backstag\Pdoor61.pbm" ) REP_PPMBMP( kcell9, "building\pbm\backstag\Pdoor62.pbm" ) REP_PPMBMP( kcell10, "building\pbm\backstag\Pdoor63.pbm" ) REP_PPMBMP( kcell11, "building\pbm\backstag\Pdoor64.pbm" ) REP_PPMBMP( kcell12, "building\pbm\backstag\Pdoor65.pbm" ) REP_PPMBMP( kcell13, "building\pbm\backstag\Pdoor66.pbm" ) REP_PPMBMP( kcell14, "building\pbm\backstag\Pdoor67.pbm" ) REP_PPMBMP( kcell15, "building\pbm\backstag\Pdoor68.pbm" ) REP_PPMBMP( kcell16, "building\pbm\backstag\Pdoor69.pbm" ) ================================================ FILE: src/building/prjmon1.seq ================================================ REP_PPMBMP( kcell2, "building\pbm\projects\tvlan1.pbm" ) REP_PPMBMP( kcell3, "building\pbm\projects\tvlan2.pbm" ) REP_PPMBMP( kcell4, "building\pbm\projects\tvlan3.pbm" ) REP_PPMBMP( kcell5, "building\pbm\projects\tvlan4.pbm" ) REP_PPMBMP( kcell6, "building\pbm\projects\tvlan5.pbm" ) REP_PPMBMP( kcell7, "building\pbm\projects\tvlan6.pbm" ) REP_PPMBMP( kcell8, "building\pbm\projects\tvlan7.pbm" ) REP_PPMBMP( kcell9, "building\pbm\projects\tvlan8.pbm" ) REP_PPMBMP( kcell10, "building\pbm\projects\tvlan9.pbm" ) REP_PPMBMP( kcell11, "building\pbm\projects\tvlan10.pbm" ) REP_PPMBMP( kcell12, "building\pbm\projects\tvlan11.pbm" ) REP_PPMBMP( kcell13, "building\pbm\projects\tvlan12.pbm" ) REP_PPMBMP( kcell14, "building\pbm\projects\tvlan13.pbm" ) REP_PPMBMP( kcell15, "building\pbm\projects\tvlan14.pbm" ) REP_PPMBMP( kcell16, "building\pbm\projects\tvlan15.pbm" ) ================================================ FILE: src/building/prjmon2.seq ================================================ REP_PPMBMP( kcell2, "building\pbm\projects\tvran1.pbm" ) REP_PPMBMP( kcell3, "building\pbm\projects\tvran2.pbm" ) REP_PPMBMP( kcell4, "building\pbm\projects\tvran3.pbm" ) REP_PPMBMP( kcell5, "building\pbm\projects\tvran4.pbm" ) REP_PPMBMP( kcell2, "building\pbm\projects\tvran5.pbm" ) REP_PPMBMP( kcell7, "building\pbm\projects\tvran6.pbm" ) REP_PPMBMP( kcell8, "building\pbm\projects\tvran7.pbm" ) REP_PPMBMP( kcell9, "building\pbm\projects\tvran8.pbm" ) REP_PPMBMP( kcell10, "building\pbm\projects\tvran9.pbm" ) REP_PPMBMP( kcell11, "building\pbm\projects\tvran10.pbm" ) REP_PPMBMP( kcell12, "building\pbm\projects\tvran11.pbm" ) REP_PPMBMP( kcell13, "building\pbm\projects\tvran12.pbm" ) REP_PPMBMP( kcell14, "building\pbm\projects\tvran13.pbm" ) REP_PPMBMP( kcell15, "building\pbm\projects\tvran14.pbm" ) REP_PPMBMP( kcell16, "building\pbm\projects\tvran15.pbm" ) ================================================ FILE: src/building/projects.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /***************************************************************************** * * PROJECTS.CHT * * Copyright (C) Microsoft Corporation 1995. * All Rights reserved. * ****************************************************************************** * * Module Intent * * Contains all of the scripting for the Projects Room. * ****************************************************************************** * * Revision History: Created 05/08/95 by *****. * * 06/07/95 ***** Added Flowchart logic. * *****************************************************************************/ // ----------------------------------------------------- // Projects 1 - front view, and objects // Called Projects Main on the flowchart. // ----------------------------------------------------- WAVE_CHUNK( "building\sound\projects\Prjt1.wav", kwavPrjt1 ) // WAVE_CHUNK( "building\sound\projects\Prjt2A.wav", kwavPrjt2A ) WAVE_CHUNK( "building\sound\projects\monitor.wav", kwavPrjtMonitor ) GOBCHUNK("melanie - AVI ", kgobMelAVI, gokkNoHitThis ) DEFAULT_POSITION( 64, 140, 999 ) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_VIDEO( CHID1( krepDefault ), "projt2.avi", fTrue ) CREATE_SCRIPT( "created" ) FilterCmdsThis( cidMouseDown, kidNil, kchidScript1); FilterCmdsThis( cidMap, kidNil, kchidScript1 ); // ctrl+M hotkey and FilterCmdsThis( cidNew, kidNil, kchidScript1 ); FilterCmdsThis( cidOpen, kidNil, kchidScript1 ); ENDCHUNK CHILD_SCRIPT( "mouse down", kchidScript1 ) // stop playing... the polling will catch and remove us. StopThis(); DestroyThis(); // destroy the AVI too Return( fFalse ); // don't eat the cidMouseDown message ENDCHUNK OBJECT("projects1: mon1", kgobProj1Mon1, 75, kcrsHand1) REP_PPMBMP( CHID(kst1, krepDefault ), "building\pbm\projects\prj1mon1.pbm" ) REP_ANIM(CHID(kst2, krepDefault ), "projects1: monitor1") DISABLEHOTSPOTS(kflgBuildingMin); DEBUGCMD(PrintStr("Monitor1: animation")); DestroyGob( kgobTvViewL ); // Place this monitor at a higher Z depth than the right monitor and balloon SetZThis( 2160 ); If ( FGobExists(kgobBalloon1d)); // destroy help balloon iff exists DestroyGob(kgobBalloon1d); End; VOICE( kwavPrjtMonitor, 0 ); cnt = kcell2; Cell( cnt++, 0, 0, 6 ); SetNoSlipThis( fTrue ); // we can now drop frames! While( cnt <= kcell16 ); Cell( cnt++, 0, 0, 6 ); End; CreateChildGob( kgobProjects1, kgobFlyingLogos, kgobFlyingLogos); ENDCHUNK CLICK_SCRIPT( "projects1 monitor1 clicked" ) ChangeStateThis( kst2 ); ENDCHUNK #include "PrjMon1.seq" OBJECTTY( "Projects1: TV animation", kgobTvViewL, 150, kcrsHand1, gokkNoHitThis ) REP_MBMP( CHID(kst1, krepDefault ), "building\bitmaps\projects\holder1.bmp" ) OBJECT("projects1: mon2", kgobProj1Mon2, 155, kcrsHand1) REP_PPMBMP( CHID(kst1, krepDefault ), "building\pbm\projects\prj1mon2.pbm" ) REP_ANIM(CHID(kst2, krepDefault ), "projects1: monitor2") DISABLEHOTSPOTS(kflgBuildingMin); DEBUGCMD(PrintStr("Monitor2: animation")); DestroyGob( kgobTvViewR ); // Place this monitor at a higher Z depth than the right monitor and balloon SetZThis( 2160 ); If ( FGobExists(kgobBalloon1d)); // destroy help balloon iff exists DestroyGob(kgobBalloon1d); End; VOICE( kwavPrjtMonitor, 0 ); cnt = kcell2; Cell( cnt++, 0, 0, 6 ); SetNoSlipThis( fTrue ); // we can now drop frames! While( cnt <= kcell16 ); Cell( cnt++, 0, 0, 6 ); End; CreateChildGob(kgobProjects1, kgobMovieTech, kgobMovieTech); ENDCHUNK CLICK_SCRIPT( "projects1 monitor2 clicked" ) ChangeStateThis( kst2 ); ENDCHUNK #include "PrjMon2.seq" OBJECTTY( "Projects1: TV animation", kgobTvViewR, 155, kcrsHand1, gokkNoHitThis ) REP_MBMP( CHID(kst1, krepDefault ), "building\bitmaps\projects\holder2.bmp" ) // ----------------------------------------------------- // Projects Main Melanie // ----------------------------------------------------- OBJECT( "projects1: melanie", kgobProj1Melanie, 100, kcrsHand1 ) #include "melproj1.seq" // include all melanie cells // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // State 1: Default and hidden state. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - REP_RECT(CHID(kst1, krepDefault), "projects1:melanie", 0, 0, 640, 480) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // State 2: Wait state or been here before -- no intro. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - REP_ANIM( CHID(kst2, krepDefault), "projects1: melanie") DEBUGCMD(PrintStr("Melanie state 2 rep.")); Cell(kcell201, 0, 0, 0); // Help stuff If (GLOBAL(fHelpOn)); DEBUGCMD(PrintStr("Help is on.")); CreateHelpGob(kgobProjects1, ktpcProject1); End; // Idle loop animation While( fTrue ); VOICE( kwavPrjt1, 0 ); i = kcell201; While (i <= kcell221 ); Cell(i, 0, 0, 6); i++; End; ENDVOICE(); End; ENDCHUNK // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // State 3: First time to projects room this session -- run intro // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - REP_ANIM(CHID(kst3, krepEnterAnimation), "projects1: melanie") DEBUGCMD(PrintStr("Melanie state 3 rep.")); // create the avi object CreateChildGob( kgobProjects1, kgobMelAVI, kgobMelAVI ); // delay while AVI queues up then watch it and proceed appropriately Cell( kcell1, 0,0, 100 ); While( PlayingGob( kgobMelAVI )); Cell( kcell1, 0, 0, 10 ); // poll at 1/6ths of a second End; If( FGobExists( kgobMelAVI )); DestroyGob( kgobMelAVI ); End; // Switch to wait state (State 2) SETGLOBAL(fHelpOn, fTrue); ChangeStateThis(kst2); ENDCHUNK CLICK_SCRIPT("Clicked Melanie: Toggle help") // If Melanie is giving her intro, stop her and set help on. The // Melanie kst2 animation will pop up the help balloon. If (StateThis() == kst3); SETGLOBAL(fHelpOn, fTrue); ENDVOICE(); ChangeStateThis(kst2); // Run the intro before showing the help. Elif (!GLOBAL(fHelpOn)); // Turning help on ChangeStateThis(kst3); Else; // Turning help off SETGLOBAL(fHelpOn, fFalse); DestroyGob(kgobBalloon1d); // This destroys the balloon that holds the tip End; ENDCHUNK HELP_SCRIPT(ktpcProject1) If (_parm[0] == 0); DEBUGCMD(PrintStr("On Help tip create...")); // Maybe read the tip? Elif (_parm[0] == 1); // FLYING LOGOS ChangeStateGob( kgobProj1Mon1, kst2 ); // CreateChildGob(kgobProjects1, kgobFlyingLogos, kgobFlyingLogos); Elif (_parm[0] == 2); // MOVIE TECHNIQUES ChangeStateGob( kgobProj1Mon2, kst2 ); End; ENDCHUNK OBJECT("FLYING LOGOS", kgobFlyingLogos, 200, kcrsHand1) REP_RECT(CHID1(krepDefault), "flying logos rect", 0, 0, 640, 480) CREATE_SCRIPT("FLYING LOGOS startup") DEBUGCMD(PrintStr("Creating FLYING LOGOS object.")); ENABLEHOTSPOTS(kflgBuildingAll); // turn guide help off SetProp(kpridStudioFlags, GetProp(kpridStudioFlags) & 0xfffffffe); DestroyGob(kgobBalloon1d); LOADTOOLS(kgobProjects1, kst2, kchidFlyingLogo); ENDCHUNK OBJECT("MOVIE TECHNIQUES", kgobMovieTech, 200, kcrsHand1) REP_RECT(CHID1(krepDefault), "movie techniques rect", 0, 0, 640, 480) CREATE_SCRIPT("MOVIE TECHNIQUES startup") DEBUGCMD(PrintStr("Creating MOVIE TECHNIQUES object.")); ENABLEHOTSPOTS(kflgBuildingAll); // be sure guide help is off. SetProp(kpridStudioFlags, GetProp(kpridStudioFlags) & 0xfffffffe); DestroyGob(kgobBalloon1d); LOADTOOLS(kgobProjects1, kst2, kchidMovieTechniques); ENDCHUNK // project back view object OBJECT( "project2 map", kgobProj2Map, 44, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\projects\prj2map.bmp", 0, 0 ) CLICK_SCRIPT( "project 2 map clicked" ) CreateChildGob( GET_CURRENTPLACE(), kgobMapMain, kgobMapMain ); ENDCHUNK OBJECT( "project2 exit", kgobProj2Exit, 44, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\projects\prj2exit.bmp", 0, 0 ) CLICK_SCRIPT( "project 2 exit clicked") QUITAPP(); ENDCHUNK OBJECT( "doors out", kgobProj2Doors, 33, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\projects\prj2door.bmp", 0, 0 ) CLICK_SCRIPT( "project doors out clicked" ) NEXTPLACE1(kgobBackstage1, kst2); ENDCHUNK //-------------------------------------------------------- // Bio page hotspots //-------------------------------------------------------- OBJECT( "Biopage 37 mask", kgobPrjt1m1, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\projects\p1mask.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 37 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 37 ); BIO_CREATEBOOK( 37, fFalse, kgobProjects1 ); End; ENDCHUNK OBJECT( "Biopage 34 mask", kgobPrjt2m1, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\projects\prjt2m1.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 34 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 34 ); BIO_CREATEBOOK( 34, fFalse, kgobProjects2 ); End; ENDCHUNK OBJECT( "Biopage 1 mask", kgobPrjt2m2, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\projects\prjt2m2.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 1 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 1 ); BIO_CREATEBOOK( 1, fFalse, kgobProjects2 ); End; ENDCHUNK OBJECT( "Biopage 2 mask", kgobPrjt2m3, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\projects\prjt2m3.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 2 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 2 ); BIO_CREATEBOOK( 2, fFalse, kgobProjects2 ); End; ENDCHUNK OBJECT( "Biopage 3 mask", kgobPrjt2m4, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\projects\prjt2m4.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 3 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 3 ); BIO_CREATEBOOK( 3, fFalse, kgobProjects2 ); End; ENDCHUNK OBJECT( "Biopage 4 mask", kgobPrjt4m1, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\projects\prjt4m1.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 4 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 4 ); BIO_CREATEBOOK( 4, fFalse, kgobProjects4 ); End; ENDCHUNK OBJECT( "Biopage 5 mask", kgobPrjt4m2, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\projects\prjt4m2.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 5 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 5 ); BIO_CREATEBOOK( 5, fFalse, kgobProjects4 ); End; ENDCHUNK OBJECT( "Biopage 6 mask", kgobPrjt4m3, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\projects\prjt4m3.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 6 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 6 ); BIO_CREATEBOOK( 6, fFalse, kgobProjects4 ); End; ENDCHUNK ================================================ FILE: src/building/snackbar.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // ----------------------------------------------------- // Snackbar and contents // ----------------------------------------------------- WAVE_CHUNK( "building\sound\snackbar\VO60.wav", kwavVO60 ) //OBJECT( "Snackbar McZee", kgobSnackbarMczee, 0, kcrsHand1 ) GOBCHUNK("Snackbar McZee", kgobSnackbarMczee, kgokkNormal) DEFAULT_POSITION( 0, 0, 0 ) ACTION(fcustNil, fcustNil, fgrfst1, kcrsHand1, kchidScript0, cidNil, cnoNil) ACTION(fcustNil, fcustNil, fgrfst2, kcrsArrow1,chidNil, cidNil, cnoNil) ENDCHUNK REP_ANIM( CHID( kst1, krepDefault ), "Snackbar Idle" ) While( fTrue ); cnt=kcell150; While( cnt <= kcell164 ); Cell( cnt++, 0, 0, 6 ); End; End; ENDCHUNK REP_ANIM( CHID( kst2, krepDefault ), "Snackbar Mz anim" ) PLAYMIDI( cnoNil ); // stop and reset lobby MIDI if it's going VOICE( kwavVO60, 0 ); cnt=kcell1; While( cnt <= kcell147 ); Cell( cnt++, 0, 0, 6 ); End; //ENDVOICE(); ChangeStateThis( kst1 ); ENDCHUNK CHILD_SCRIPT( "SnackBar McZee: clicked", kchidScript0 ) ChangeStateThis( kst2 ); ENDCHUNK #include "snackbar.seq" OBJECT( "Biopage 28 mask", kgobLobby3m1, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\lobby\lobby2m1.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 28 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 28 ); BIO_CREATEBOOK( 28, fFalse, kgobSnackBar ); End; ENDCHUNK OBJECT( "Biopage 29 mask", kgobLobby3m2, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\lobby\lobby2m2.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 29 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 29 ); BIO_CREATEBOOK( 29, fFalse, kgobSnackBar ); End; ENDCHUNK ================================================ FILE: src/building/snackbar.seq ================================================ REP_PPMBMP( kcell1, "building\pbm\snackbar\mczee1.pbm" ) REP_PPMBMP( kcell2, "building\pbm\snackbar\mczee2.pbm" ) REP_PPMBMP( kcell3, "building\pbm\snackbar\mczee3.pbm" ) REP_PPMBMP( kcell4, "building\pbm\snackbar\mczee4.pbm" ) REP_PPMBMP( kcell5, "building\pbm\snackbar\mczee5.pbm" ) REP_PPMBMP( kcell6, "building\pbm\snackbar\mczee6.pbm" ) REP_PPMBMP( kcell7, "building\pbm\snackbar\mczee7.pbm" ) REP_PPMBMP( kcell8, "building\pbm\snackbar\mczee8.pbm" ) REP_PPMBMP( kcell9, "building\pbm\snackbar\mczee9.pbm" ) REP_PPMBMP( kcell10, "building\pbm\snackbar\mczee10.pbm" ) REP_PPMBMP( kcell11, "building\pbm\snackbar\mczee11.pbm" ) REP_PPMBMP( kcell12, "building\pbm\snackbar\mczee12.pbm" ) REP_PPMBMP( kcell13, "building\pbm\snackbar\mczee13.pbm" ) REP_PPMBMP( kcell14, "building\pbm\snackbar\mczee14.pbm" ) REP_PPMBMP( kcell15, "building\pbm\snackbar\mczee15.pbm" ) REP_PPMBMP( kcell16, "building\pbm\snackbar\mczee16.pbm" ) REP_PPMBMP( kcell17, "building\pbm\snackbar\mczee17.pbm" ) REP_PPMBMP( kcell18, "building\pbm\snackbar\mczee18.pbm" ) REP_PPMBMP( kcell19, "building\pbm\snackbar\mczee19.pbm" ) REP_PPMBMP( kcell20, "building\pbm\snackbar\mczee20.pbm" ) REP_PPMBMP( kcell21, "building\pbm\snackbar\mczee21.pbm" ) REP_PPMBMP( kcell22, "building\pbm\snackbar\mczee22.pbm" ) REP_PPMBMP( kcell23, "building\pbm\snackbar\mczee23.pbm" ) REP_PPMBMP( kcell24, "building\pbm\snackbar\mczee24.pbm" ) REP_PPMBMP( kcell25, "building\pbm\snackbar\mczee25.pbm" ) REP_PPMBMP( kcell26, "building\pbm\snackbar\mczee26.pbm" ) REP_PPMBMP( kcell27, "building\pbm\snackbar\mczee27.pbm" ) REP_PPMBMP( kcell28, "building\pbm\snackbar\mczee28.pbm" ) REP_PPMBMP( kcell29, "building\pbm\snackbar\mczee29.pbm" ) REP_PPMBMP( kcell30, "building\pbm\snackbar\mczee30.pbm" ) REP_PPMBMP( kcell31, "building\pbm\snackbar\mczee31.pbm" ) REP_PPMBMP( kcell32, "building\pbm\snackbar\mczee32.pbm" ) REP_PPMBMP( kcell33, "building\pbm\snackbar\mczee33.pbm" ) REP_PPMBMP( kcell34, "building\pbm\snackbar\mczee34.pbm" ) REP_PPMBMP( kcell35, "building\pbm\snackbar\mczee35.pbm" ) REP_PPMBMP( kcell36, "building\pbm\snackbar\mczee36.pbm" ) REP_PPMBMP( kcell37, "building\pbm\snackbar\mczee37.pbm" ) REP_PPMBMP( kcell38, "building\pbm\snackbar\mczee38.pbm" ) REP_PPMBMP( kcell39, "building\pbm\snackbar\mczee39.pbm" ) REP_PPMBMP( kcell40, "building\pbm\snackbar\mczee40.pbm" ) REP_PPMBMP( kcell41, "building\pbm\snackbar\mczee41.pbm" ) REP_PPMBMP( kcell42, "building\pbm\snackbar\mczee42.pbm" ) REP_PPMBMP( kcell43, "building\pbm\snackbar\mczee43.pbm" ) REP_PPMBMP( kcell44, "building\pbm\snackbar\mczee44.pbm" ) REP_PPMBMP( kcell45, "building\pbm\snackbar\mczee45.pbm" ) REP_PPMBMP( kcell46, "building\pbm\snackbar\mczee46.pbm" ) REP_PPMBMP( kcell47, "building\pbm\snackbar\mczee47.pbm" ) REP_PPMBMP( kcell48, "building\pbm\snackbar\mczee48.pbm" ) REP_PPMBMP( kcell49, "building\pbm\snackbar\mczee49.pbm" ) REP_PPMBMP( kcell50, "building\pbm\snackbar\mczee50.pbm" ) REP_PPMBMP( kcell51, "building\pbm\snackbar\mczee51.pbm" ) REP_PPMBMP( kcell52, "building\pbm\snackbar\mczee52.pbm" ) REP_PPMBMP( kcell53, "building\pbm\snackbar\mczee53.pbm" ) REP_PPMBMP( kcell54, "building\pbm\snackbar\mczee54.pbm" ) REP_PPMBMP( kcell55, "building\pbm\snackbar\mczee55.pbm" ) REP_PPMBMP( kcell56, "building\pbm\snackbar\mczee56.pbm" ) REP_PPMBMP( kcell57, "building\pbm\snackbar\mczee57.pbm" ) REP_PPMBMP( kcell58, "building\pbm\snackbar\mczee58.pbm" ) REP_PPMBMP( kcell59, "building\pbm\snackbar\mczee59.pbm" ) REP_PPMBMP( kcell60, "building\pbm\snackbar\mczee60.pbm" ) REP_PPMBMP( kcell61, "building\pbm\snackbar\mczee61.pbm" ) REP_PPMBMP( kcell62, "building\pbm\snackbar\mczee62.pbm" ) REP_PPMBMP( kcell63, "building\pbm\snackbar\mczee63.pbm" ) REP_PPMBMP( kcell64, "building\pbm\snackbar\mczee64.pbm" ) REP_PPMBMP( kcell65, "building\pbm\snackbar\mczee65.pbm" ) REP_PPMBMP( kcell66, "building\pbm\snackbar\mczee66.pbm" ) REP_PPMBMP( kcell67, "building\pbm\snackbar\mczee67.pbm" ) REP_PPMBMP( kcell68, "building\pbm\snackbar\mczee68.pbm" ) REP_PPMBMP( kcell69, "building\pbm\snackbar\mczee69.pbm" ) REP_PPMBMP( kcell70, "building\pbm\snackbar\mczee70.pbm" ) REP_PPMBMP( kcell71, "building\pbm\snackbar\mczee71.pbm" ) REP_PPMBMP( kcell72, "building\pbm\snackbar\mczee72.pbm" ) REP_PPMBMP( kcell73, "building\pbm\snackbar\mczee73.pbm" ) REP_PPMBMP( kcell74, "building\pbm\snackbar\mczee74.pbm" ) REP_PPMBMP( kcell75, "building\pbm\snackbar\mczee75.pbm" ) REP_PPMBMP( kcell76, "building\pbm\snackbar\mczee76.pbm" ) REP_PPMBMP( kcell77, "building\pbm\snackbar\mczee77.pbm" ) REP_PPMBMP( kcell78, "building\pbm\snackbar\mczee78.pbm" ) REP_PPMBMP( kcell79, "building\pbm\snackbar\mczee79.pbm" ) REP_PPMBMP( kcell80, "building\pbm\snackbar\mczee80.pbm" ) REP_PPMBMP( kcell81, "building\pbm\snackbar\mczee81.pbm" ) REP_PPMBMP( kcell82, "building\pbm\snackbar\mczee82.pbm" ) REP_PPMBMP( kcell83, "building\pbm\snackbar\mczee83.pbm" ) REP_PPMBMP( kcell84, "building\pbm\snackbar\mczee84.pbm" ) REP_PPMBMP( kcell85, "building\pbm\snackbar\mczee85.pbm" ) REP_PPMBMP( kcell86, "building\pbm\snackbar\mczee86.pbm" ) REP_PPMBMP( kcell87, "building\pbm\snackbar\mczee87.pbm" ) REP_PPMBMP( kcell88, "building\pbm\snackbar\mczee88.pbm" ) REP_PPMBMP( kcell89, "building\pbm\snackbar\mczee89.pbm" ) REP_PPMBMP( kcell90, "building\pbm\snackbar\mczee90.pbm" ) REP_PPMBMP( kcell91, "building\pbm\snackbar\mczee91.pbm" ) REP_PPMBMP( kcell92, "building\pbm\snackbar\mczee92.pbm" ) REP_PPMBMP( kcell93, "building\pbm\snackbar\mczee93.pbm" ) REP_PPMBMP( kcell94, "building\pbm\snackbar\mczee94.pbm" ) REP_PPMBMP( kcell95, "building\pbm\snackbar\mczee95.pbm" ) REP_PPMBMP( kcell96, "building\pbm\snackbar\mczee96.pbm" ) REP_PPMBMP( kcell97, "building\pbm\snackbar\mczee97.pbm" ) REP_PPMBMP( kcell98, "building\pbm\snackbar\mczee98.pbm" ) REP_PPMBMP( kcell99, "building\pbm\snackbar\mczee99.pbm" ) REP_PPMBMP( kcell100, "building\pbm\snackbar\mczee100.pbm" ) REP_PPMBMP( kcell101, "building\pbm\snackbar\mczee101.pbm" ) REP_PPMBMP( kcell102, "building\pbm\snackbar\mczee102.pbm" ) REP_PPMBMP( kcell103, "building\pbm\snackbar\mczee103.pbm" ) REP_PPMBMP( kcell104, "building\pbm\snackbar\mczee104.pbm" ) REP_PPMBMP( kcell105, "building\pbm\snackbar\mczee105.pbm" ) REP_PPMBMP( kcell106, "building\pbm\snackbar\mczee106.pbm" ) REP_PPMBMP( kcell107, "building\pbm\snackbar\mczee107.pbm" ) REP_PPMBMP( kcell108, "building\pbm\snackbar\mczee108.pbm" ) REP_PPMBMP( kcell109, "building\pbm\snackbar\mczee109.pbm" ) REP_PPMBMP( kcell110, "building\pbm\snackbar\mczee110.pbm" ) REP_PPMBMP( kcell111, "building\pbm\snackbar\mczee111.pbm" ) REP_PPMBMP( kcell112, "building\pbm\snackbar\mczee112.pbm" ) REP_PPMBMP( kcell113, "building\pbm\snackbar\mczee113.pbm" ) REP_PPMBMP( kcell114, "building\pbm\snackbar\mczee114.pbm" ) REP_PPMBMP( kcell115, "building\pbm\snackbar\mczee115.pbm" ) REP_PPMBMP( kcell116, "building\pbm\snackbar\mczee116.pbm" ) REP_PPMBMP( kcell117, "building\pbm\snackbar\mczee117.pbm" ) REP_PPMBMP( kcell118, "building\pbm\snackbar\mczee118.pbm" ) REP_PPMBMP( kcell119, "building\pbm\snackbar\mczee119.pbm" ) REP_PPMBMP( kcell120, "building\pbm\snackbar\mczee120.pbm" ) REP_PPMBMP( kcell121, "building\pbm\snackbar\mczee121.pbm" ) REP_PPMBMP( kcell122, "building\pbm\snackbar\mczee122.pbm" ) REP_PPMBMP( kcell123, "building\pbm\snackbar\mczee123.pbm" ) REP_PPMBMP( kcell124, "building\pbm\snackbar\mczee124.pbm" ) REP_PPMBMP( kcell125, "building\pbm\snackbar\mczee125.pbm" ) REP_PPMBMP( kcell126, "building\pbm\snackbar\mczee126.pbm" ) REP_PPMBMP( kcell127, "building\pbm\snackbar\mczee127.pbm" ) REP_PPMBMP( kcell128, "building\pbm\snackbar\mczee128.pbm" ) REP_PPMBMP( kcell129, "building\pbm\snackbar\mczee129.pbm" ) REP_PPMBMP( kcell130, "building\pbm\snackbar\mczee130.pbm" ) REP_PPMBMP( kcell131, "building\pbm\snackbar\mczee131.pbm" ) REP_PPMBMP( kcell132, "building\pbm\snackbar\mczee132.pbm" ) REP_PPMBMP( kcell133, "building\pbm\snackbar\mczee133.pbm" ) REP_PPMBMP( kcell134, "building\pbm\snackbar\mczee134.pbm" ) REP_PPMBMP( kcell135, "building\pbm\snackbar\mczee135.pbm" ) REP_PPMBMP( kcell136, "building\pbm\snackbar\mczee136.pbm" ) REP_PPMBMP( kcell137, "building\pbm\snackbar\mczee137.pbm" ) REP_PPMBMP( kcell138, "building\pbm\snackbar\mczee138.pbm" ) REP_PPMBMP( kcell139, "building\pbm\snackbar\mczee139.pbm" ) REP_PPMBMP( kcell140, "building\pbm\snackbar\mczee140.pbm" ) REP_PPMBMP( kcell141, "building\pbm\snackbar\mczee141.pbm" ) REP_PPMBMP( kcell142, "building\pbm\snackbar\mczee142.pbm" ) REP_PPMBMP( kcell143, "building\pbm\snackbar\mczee143.pbm" ) REP_PPMBMP( kcell144, "building\pbm\snackbar\mczee144.pbm" ) REP_PPMBMP( kcell145, "building\pbm\snackbar\mczee145.pbm" ) REP_PPMBMP( kcell146, "building\pbm\snackbar\mczee146.pbm" ) REP_PPMBMP( kcell147, "building\pbm\snackbar\mczee147.pbm" ) REP_PPMBMP( kcell150, "building\pbm\snackbar\cyc46.pbm" ) REP_PPMBMP( kcell151, "building\pbm\snackbar\cyc47.pbm" ) REP_PPMBMP( kcell152, "building\pbm\snackbar\cyc48.pbm" ) REP_PPMBMP( kcell153, "building\pbm\snackbar\cyc49.pbm" ) REP_PPMBMP( kcell154, "building\pbm\snackbar\cyc50.pbm" ) REP_PPMBMP( kcell155, "building\pbm\snackbar\cyc51.pbm" ) REP_PPMBMP( kcell156, "building\pbm\snackbar\cyc52.pbm" ) REP_PPMBMP( kcell157, "building\pbm\snackbar\cyc53.pbm" ) REP_PPMBMP( kcell158, "building\pbm\snackbar\cyc54.pbm" ) REP_PPMBMP( kcell159, "building\pbm\snackbar\cyc55.pbm" ) REP_PPMBMP( kcell160, "building\pbm\snackbar\cyc56.pbm" ) REP_PPMBMP( kcell161, "building\pbm\snackbar\cyc57.pbm" ) REP_PPMBMP( kcell162, "building\pbm\snackbar\cyc58.pbm" ) REP_PPMBMP( kcell163, "building\pbm\snackbar\cyc59.pbm" ) REP_PPMBMP( kcell164, "building\pbm\snackbar\cyc60.pbm" ) ================================================ FILE: src/building/stdoor.seq ================================================ REP_PPMBMP( kcell1, "building\pbm\backstag\Sdoor49.pbm" ) REP_PPMBMP( kcell2, "building\pbm\backstag\Sdoor50.pbm" ) REP_PPMBMP( kcell3, "building\pbm\backstag\Sdoor51.pbm" ) REP_PPMBMP( kcell4, "building\pbm\backstag\Sdoor52.pbm" ) REP_PPMBMP( kcell5, "building\pbm\backstag\Sdoor53.pbm" ) REP_PPMBMP( kcell6, "building\pbm\backstag\Sdoor54.pbm" ) REP_PPMBMP( kcell7, "building\pbm\backstag\Sdoor55.pbm" ) REP_PPMBMP( kcell8, "building\pbm\backstag\Sdoor56.pbm" ) REP_PPMBMP( kcell9, "building\pbm\backstag\Sdoor57.pbm" ) REP_PPMBMP( kcell10, "building\pbm\backstag\Sdoor58.pbm" ) REP_PPMBMP( kcell11, "building\pbm\backstag\Sdoor59.pbm" ) REP_PPMBMP( kcell12, "building\pbm\backstag\Sdoor60.pbm" ) REP_PPMBMP( kcell13, "building\pbm\backstag\Sdoor61.pbm" ) REP_PPMBMP( kcell14, "building\pbm\backstag\Sdoor62.pbm" ) REP_PPMBMP( kcell15, "building\pbm\backstag\Sdoor63.pbm" ) REP_PPMBMP( kcell16, "building\pbm\backstag\Sdoor64.pbm" ) ================================================ FILE: src/building/street.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /***************************************************************************** * * STREET.CHT * * Copyright (C) Microsoft Corporation 1995. * All Rights reserved. * ****************************************************************************** * * Module Intent * * Animations for the "street" (aka manhole) sequence * ****************************************************************************** * * Revision History: Updated + added header 7/10/95 -***** * *****************************************************************************/ // ----------------------------------------------------- // Street scene place and objects // ---the street creates the McZee AVI object, then // polls until it's done. // ----------------------------------------------------- OBJECTTY( "street", kgobStreet, 0, kcrsArrow1, gokkNoHitThis ) REP_PPMBMP( kcell1, "building\pbm\street\street1.pbm" ) REP_ANIM( CHID1( krepDefault ), "closet, default" ) SETGLOBAL( fTrans, fTrue ); SETPALETTE( kpalSocStreet ); // dissolve to new palette Cell( kcell1, 0, 0, 60); // draw + pause while dissolve o SetColorTable( kpalSocStreet ); // make SURE the palette's set. CreateChildThis( kgobStreetMcZee, kgobStreetMcZee ); Cell( kcell1, 0, 0, 30 ); // look to see if the McZee gob is playing AVI While( PlayingGob( kgobStreetMcZee )); Cell( kcell1, 0, 0, 30 ); // poll at 1/2ths of a second End; NEXTPLACE1( kgobTicket1, kst1 ); ENDCHUNK OBJECT( "street: McZee AVI", kgobStreetMcZee, 10, kcrsArrow1 ) REP_VIDEO( CHID1( krepDefault ), "mhole2.avi", fTrue ) ================================================ FILE: src/building/studiobg.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // ----------------------------------------------------- // // Revisions: // // mm-dd-yy // ??-??-94 ***** - Created // 05-16-95 ***** - cleanup // ----------------------------------------------------- WAVE_CHUNK( "building\sound\studio\tvpop.wav", kwavStudioTVPop) OBJECT( "studio1: toolbox", kgobStudio1Tools, 120, kcrsHand1 ) REP_PPMBMP( CHID1( krepDefault), "building\pbm\studio\st1tbx.pbm" ) REP_ANIM(CHID(kst2, krepDefault), "Studio: Toolbox TV") // disable hotspots and play the toolbox pop out. DISABLEHOTSPOTS(kflgBuildingMin); ENDVOICE(); cnt = kcell1; Cell( cnt++, 0,0, 6 ); VOICE( kwavStudioTVPop, 0 ); CreateChildGob( kgobStudio1, kgobStudio1TV, kgobStudio1TV ); While (cnt <= kcell6); Cell(cnt++, 0,0, 6); End; ENDCHUNK CLICK_SCRIPT( "studio1: tbox click" ) // Go to the studio. - intro sequence it ChangeStateThis( kst2 ); ENDCHUNK #include "studioBx.seq" // Z depth above help balloons which have depth of 800. OBJECT( "studio1: toolbox anim", kgobStudio1TV, 810, kcrsHand1 ) REP_ANIM(CHID(kst1, krepDefault), "Studio: Toolbox TV") cnt = kcell1; SetNoSlipThis( fTrue ); // we can now drop frames! While (cnt <= kcell22); Cell(cnt++, 0,0, 6); End; SetNoSlipThis( fFalse ); // don't drop frames! Cell( cnt, 0,0, 6 ); // be sure and draw the last frame ChangeStateGob( kgobStudio1McZee, kst4 );// played the intro ENDCHUNK #include "studioTv.seq" // ----------------------------------------------------- // Studio Main McZee // ----------------------------------------------------- // Talking on the phone sounds. WAVE_CHUNK( "building\sound\studio\Std1A.wav", kwavStd1A ) WAVE_CHUNK( "building\sound\studio\VO97A.wav", kwavVO97A ) WAVE_CHUNK( "building\sound\studio\VO97B.wav", kwavVO97B ) // Intro sounds. WAVE_CHUNK( "building\sound\studio\Std1B.wav", kwavStd1B ) // intro in front of studio sound WAVE_CHUNK( "building\sound\studio\STD4.wav", kwavStudioIntro ) OBJECT("studio1: TOOLS INTRO ", kgobToolsIntroAVI, 999, kcrsHand1) REP_VIDEO( CHID1( krepDefault ), "tools1.avi", fTrue ) CLICK_SCRIPT( "clicked tools intro" ) // stop playing... the polling will catch and throw // us to the tools StopThis(); ENDCHUNK OBJECT("studio1: mczee", kgobStudio1McZee, 111, kcrsHand1) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // State 1: Default and hidden state. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - REP_RECT(CHID(kst1, krepDefault), "studio1:mczee", 0, 0, 0, 0) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // State 2: Wait state. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - REP_ANIM(CHID(kst2, krepDefault), "mczee talking on phone") Cell(kcell69, 0, 0, 120); WAIT_FOR_TRANSITION(); While (fTrue); // Select one of the three phone animations at random. iAnimRnd = Rnd(3); If (iAnimRnd == 0); // book talent kcellStart = kcell1; kcellEnd = kcell67; Elif (iAnimRnd == 1); // on hold kcellStart = kcell36; kcellEnd = kcell67; Else; // deal kcellStart = kcell1; kcellEnd = kcell42; End; VOICE(kwavStd1A + iAnimRnd, ktpcStd1A + iAnimRnd); i = kcellStart; Cell(i++, 0, 0, 6); SetNoSlipThis( fTrue ); // we can now drop frames! While (i < kcellEnd); Cell(i, 0, 0, 6); i++; End; SetNoSlipThis( fFalse ); // we can now drop frames! Cell( kcellEnd, 0,0, 6 ); // McZee listening to the phone. i=kcell451; While (i <= kcell518); Cell(i, 0, 0, 6); i++; End; ENDVOICE(); End; ENDCHUNK // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // State 3: McZee Studio Intro/Help. "Hey --welcome to the studio!" // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - REP_ANIM(CHID(kst3, krepDefault), "mczee intro") VOICE(kwavStd1B, ktpcStd1B); i = kcell69; While (i <= kcell138); Cell(i, 0,0, 6); i++; End; ENDVOICE(); SETGLOBAL(fHelpOn, fFalse); DestroyGob(kgobBalloon1d); // This destroys the balloon that holds the tip ChangeStateThis(kst2); // Back to wait state. ENDCHUNK // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // State 4: McZee - take us into the tools (play intro anim of // talking in front of the tools if necessary) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - REP_ANIM(CHID(kst4, krepDefault), "mczee intro") PLAYMIDI( cnoNil ); // stop midi //WAIT_FOR_TRANSITION(); Cell( CHID(kst1, krepDefault), 0,0, 1 ); // hide mczee DestroyGob( kgobStudio1TV ); DestroyGob( kgobStudio1Tools ); ChangeStateGob( kgobStudio1, kst2 ); // switch to tools background in case AVI goes If( ::fStdIntro ); // if the users have already seen the studio intro, skip to tools // and make a new movie ChangeStateGob( kgobStudio1McZee, kst5 ); Exit(); End; DISABLEHOTSPOTS(kflgBuildingMin); ::fStdIntro = fTrue; ENDVOICE(); CreateChildGob( GidParThis(), kgobToolsIntroAVI, kgobToolsIntroAVI ); Cell( CHID(kst1, krepDefault),0,0, 100 ); // pause for sufficient cue-up While( PlayingGob( kgobToolsIntroAVI )); Cell( CHID(kst1, krepDefault), 0, 0, 10 ); // poll at 1/6ths of a second End; SETGLOBAL( fStudioPS, fFalse ); ChangeStateThis( kst5 ); ENDCHUNK REP_ANIM( CHID(kst5, krepDefault), "start tools") DestroyThis(); // Erase McZee to prevent palette flash ENDVOICE(); // Make sure McZee isn't talking // set a flag to tell the tools to play the annoying guided help sequence SetProp(kpridStudioFlags, GetProp(kpridStudioFlags) | 1); LOADTOOLS(kgobStudio1, kst1, chidNil); ENDCHUNK CLICK_SCRIPT("Clicked McZee: Do help") If (!GLOBAL(fHelpOn)); // Turning help on SETGLOBAL(fHelpOn, fTrue); CreateHelpGob(kgobStudio1, ktpcStudio1); ChangeStateThis(kst3); Else; // Turning help off DestroyGob(kgobBalloon1d); // This destroys the balloon that holds the tip ENDVOICE(); SETGLOBAL(fHelpOn, fFalse); ChangeStateThis(kst2); // Back to wait state. End; ENDCHUNK #include "mzstudio.seq" // include all mczee cells OBJECT( "doors out", kgobStudio2Doors, 33, kcrsHand1 ) REP_MASK(CHID1(krepDefault), "building\bitmaps\studio\st2doors.bmp", 0, 0) CLICK_SCRIPT( "doors out clicked" ) NEXTPLACE1( kgobBackstage1, kst2 ); ENDCHUNK OBJECT( "studio2 map", kgobStudio2Map, 44, kcrsHand1 ) REP_MASK(CHID1(krepDefault), "building\bitmaps\studio\st2map.bmp", 0, 0) CLICK_SCRIPT( "studio 2 map clicked" ) CreateChildGob( GET_CURRENTPLACE(), kgobMapMain, kgobMapMain ); ENDCHUNK OBJECT( "studio2 exit", kgobStudio2Exit, 45, kcrsHand1 ) REP_MASK( CHID1( krepDefault), "building\bitmaps\studio\st2exit.bmp", 0, 0 ) CLICK_SCRIPT( "studio 2 exit clicked" ) QUITAPP(); ENDCHUNK OBJECT( "studio2 exit word", kgobStudio2ExitWord, 44, kcrsHand1 ) REP_PPMBMP( CHID1( krepDefault), "building\pbm\studio\st2exit.pbm" ) //------------------------------------------------------------ // Bio page hotspots //---------------------------------------------------------- OBJECT( "Biopage 38 mask", kgobStdo1m1, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\studio\stdo1m1.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 38 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 38 ); BIO_CREATEBOOK( 38, fFalse, kgobStudio1 ); End; ENDCHUNK OBJECT( "Biopage 14 mask", kgobStdo4m1, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\studio\stdo4m1.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 14 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 14 ); BIO_CREATEBOOK( 14, fFalse, kgobStudio4 ); End; ENDCHUNK OBJECT( "Biopage 15 mask", kgobStdo4m2, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\studio\stdo4m2.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 15 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 15 ); BIO_CREATEBOOK( 15, fFalse, kgobStudio4 ); End; ENDCHUNK OBJECT( "Biopage 16 mask", kgobStdo4m3, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\studio\stdo4m3.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 16 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 16 ); BIO_CREATEBOOK( 16, fFalse, kgobStudio4 ); End; ENDCHUNK OBJECT( "Biopage 17 mask", kgobStdo4m4, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\studio\stdo4m4.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 17 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 17 ); BIO_CREATEBOOK( 17, fFalse, kgobStudio4); End; ENDCHUNK OBJECT( "Biopage 18 mask", kgobStdo3m1, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\studio\stdo3m1.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 18 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 18 ); BIO_CREATEBOOK( 18, fFalse, kgobStudio3 ); End; ENDCHUNK OBJECT( "Biopage 19 mask", kgobStdo3m2, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\studio\stdo3m2.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 19 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 19 ); BIO_CREATEBOOK( 19, fFalse, kgobStudio3 ); End; ENDCHUNK OBJECT( "Biopage 20 mask", kgobStdo3m3, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\studio\stdo3m3.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 20 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 20 ); BIO_CREATEBOOK( 20, fFalse, kgobStudio3 ); End; ENDCHUNK OBJECT( "Biopage 21 mask", kgobStdo2m1, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\studio\stdo2m1.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 21 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 21 ); BIO_CREATEBOOK( 21, fFalse, kgobStudio2 ); End; ENDCHUNK OBJECT( "Biopage 22 mask", kgobStdo2m2, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\studio\stdo2m2.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 22 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 22 ); BIO_CREATEBOOK( 22, fFalse, kgobStudio2 ); End; ENDCHUNK OBJECT( "Biopage 23 mask", kgobStdo2m3, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\studio\stdo2m3.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 23 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 23 ); BIO_CREATEBOOK( 23, fFalse, kgobStudio2 ); End; ENDCHUNK ================================================ FILE: src/building/studiobx.seq ================================================ REP_PPMBMP( kcell1, "building\pbm\studio\box1.pbm" ) REP_PPMBMP( kcell2, "building\pbm\studio\box2.pbm" ) REP_PPMBMP( kcell3, "building\pbm\studio\box3.pbm" ) REP_PPMBMP( kcell4, "building\pbm\studio\box4.pbm" ) REP_PPMBMP( kcell5, "building\pbm\studio\box5.pbm" ) REP_PPMBMP( kcell6, "building\pbm\studio\box6.pbm" ) ================================================ FILE: src/building/studiotv.seq ================================================ REP_PPMBMP( kcell1, "building\pbm\studio\tv1.pbm" ) REP_PPMBMP( kcell2, "building\pbm\studio\tv2.pbm" ) REP_PPMBMP( kcell3, "building\pbm\studio\tv3.pbm" ) REP_PPMBMP( kcell4, "building\pbm\studio\tv4.pbm" ) REP_PPMBMP( kcell5, "building\pbm\studio\tv5.pbm" ) REP_PPMBMP( kcell6, "building\pbm\studio\tv6.pbm" ) REP_PPMBMP( kcell7, "building\pbm\studio\tv7.pbm" ) REP_PPMBMP( kcell8, "building\pbm\studio\tv8.pbm" ) REP_PPMBMP( kcell9, "building\pbm\studio\tv9.pbm" ) REP_PPMBMP( kcell10, "building\pbm\studio\tv10.pbm" ) REP_PPMBMP( kcell11, "building\pbm\studio\tv11.pbm" ) REP_PPMBMP( kcell12, "building\pbm\studio\tv12.pbm" ) REP_PPMBMP( kcell13, "building\pbm\studio\tv13.pbm" ) REP_PPMBMP( kcell14, "building\pbm\studio\tv14.pbm" ) REP_PPMBMP( kcell15, "building\pbm\studio\tv15.pbm" ) REP_PPMBMP( kcell16, "building\pbm\studio\tv16.pbm" ) REP_PPMBMP( kcell17, "building\pbm\studio\tv17.pbm" ) REP_PPMBMP( kcell18, "building\pbm\studio\tv18.pbm" ) REP_PPMBMP( kcell19, "building\pbm\studio\tv19.pbm" ) REP_PPMBMP( kcell20, "building\pbm\studio\tv20.pbm" ) REP_PPMBMP( kcell21, "building\pbm\studio\tv21.pbm" ) REP_PPMBMP( kcell22, "building\pbm\studio\tv22.pbm" ) REP_PPMBMP( kcell23, "building\pbm\studio\tv23.pbm" ) REP_PPMBMP( kcell24, "building\pbm\studio\tv24.pbm" ) REP_PPMBMP( kcell25, "building\pbm\studio\tv25.pbm" ) ================================================ FILE: src/building/theatre.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // ----------------------------------------------------- // THEATRE.CHT // // Copyright (C) Microsoft Corporation 1995. // All Rights reserved. // // ----------------------------------------------------- // Module Intent: // // Contains the kauai script code for the Theatre and Movie object. // // // Revisions: // // mm-dd-yy // ??-??-94 ***** - Created // // ----------------------------------------------------- // Notes: .MzNextAction is used in Theatre1McZee kst3 to determine what // should happen after McZee leaves the stage. Here are the values: // kst20 Create a movie object. // kst21 Short trip to Tools -- edit this movie. // kst22 Longer trip to Tools -- create new movie. // kst23 Press Play on movie object. // kst24 McZee goes into NULL rep. // Movie object dimensions. #define xLeftMovie 48 #define yTopMovie 85 #define xRightMovie 592 #define yBottomMovie 391 // --------------------------------------------------------- // kgobMovieClickFilter is similar to kgobGlass0 in the util object. This // one is used to trap clicks while the movie object is up, but it allows // clicks to the movie controls and to McZee and his help balloons to go // through. // --------------------------------------------------------- #define SHOWMOVIECLICKFILTER(_fShow)\ If (_fShow && !FGobExists(kgobMovieClickFilter));\ CreateChildGob(kgobTheatre1, kgobMovieClickFilter, kgobMovieClickFilter);\ SETKEYS(kflgBuildingMin);\ DISABLEACCEL(fFalse);\ Elif (!_fShow && FGobExists(kgobMovieClickFilter));\ DestroyGob(kgobMovieClickFilter);\ SETKEYS(kflgBuildingAll);\ ENABLEACCEL(fFalse);\ End // --------------------------------------------------------- // Macros used only in this file to create and destroy the movie object and // movie control objects. // --------------------------------------------------------- #define CREATEMOVIE() \ SHOWMOVIECLICKFILTER(fTrue);\ ChangeStateGob(kgobTheatre1, kst3);\ CreateChildGob(kgobTheatre1, kgobMovie, kgobMovie);\ CreateChildGob(kgobTheatre1, kgobTheaterVolume, kgobTheaterVolume);\ CreateChildGob(kgobTheatre1, kgobPlayButton, kgobPlayButton);\ CreateChildGob(kgobTheatre1, kgobRewindButton, kgobRewindButton) #define DESTROYMOVIE() \ DEBUGCMD(PrintStr("Enqueuing TheaterClose");)\ EnqueueCid(cidTheaterClose, 0, 0, 0, 0, 0);\ ChangeStateGob(kgobTheatre1, kst2);\ DestroyGob(kgobMovie);\ DestroyGob(kgobTheaterVolume);\ DestroyGob(kgobPlayButton);\ DestroyGob(kgobRewindButton);\ SHOWMOVIECLICKFILTER(fFalse) // --------------------------------------------------------- // Main view of the theatre & its objects // --------------------------------------------------------- WAVE_CHUNK( "building\sound\theatre\30_thr4.wav", kwav30_thr4 ) WAVE_CHUNK( "building\sound\theatre\21_thr1a.wav", kwav21_thr1a ) WAVE_CHUNK( "building\sound\theatre\VO74B.wav", kwavVO74B ) WAVE_CHUNK( "building\sound\theatre\VO75.wav", kwavVO75 ) WAVE_CHUNK( "building\sound\theatre\VO76.wav", kwavVO76 ) WAVE_CHUNK( "building\sound\theatre\21_thr1b.wav", kwav21_thr1b ) OBJECT( "Theater1 McZee", kgobTheatre1McZee , 550, kcrsHand1 ) REP_RECT( kcellNull, "No representation.", 0,0,1,1 ) #include "mzthea.seq" REP_ANIM( CHID( kst1, krepEnterAnimation ), "Theater1: McZee!") DEBUGCMD( PrintStr("Theater McZee: State 1") ); // The only entry states are kst4, kst5, and kst7 ASSERT(GLOBAL(kstEntry) == kst4 || GLOBAL(kstEntry) == kst5 || GLOBAL(kstEntry) == kst7); // Help is always on on entry -- bug #900. SETGLOBAL(fHelpOn, fTrue); .fHelpState = 1; // Useage: fHelpState=1: Sets help balloon to Theater help. // fHelpState=2: Sets help balloon to Movie help. .fWay = fFalse; // Flag is set in CHILD_SCRIPT kchidScript1 (the call back function // from the portfolio object) to direct what action to take after // the "close portfolio animation", state kst10. .MzNextAction = 0; WAIT_FOR_TRANSITION(); // pause if there's a dissolve going on If (GLOBAL(kstEntry) == kst7); .MzNextAction = kst7; SETGLOBAL(kstEntry, kst2); End; ChangeStateThis(GLOBAL(kstEntry)); ENDCHUNK // The following 2 states, kst2 and kst3, are the animation for McZee leaning // on to the stage and leaving the stage respectively. These are transition states // to other animations or actions. The variable MzNextAction is used in the following manner. // From a state in the McZee object or in other objects, the variable MzNextAction is set to an // approite value and then this McZee object state is changed to kst2 or kst3 after // the animation is completed the next state or action is determined by the value // of the MzNextAction variable. REP_ANIM( CHID( kst2, krepDefault ), "McZee leans onto the stage" ) DEBUGCMD( PrintStr("Theater McZee: State 2") ); DISABLEHOTSPOTS(kflgBuildingMin); // Animation "thr2a" (Mz leaning onto the stage). cnt=kcell1; While( cnt <= kcell13 ); Cell( cnt++, 0, 0, 6 ); End; ChangeStateThis( .MzNextAction ); ENDCHUNK REP_ANIM( CHID( kst3, krepDefault ), "McZee leaves the stage" ) DEBUGCMD(PrintStr("Theater McZee: State 3")); DISABLEHOTSPOTS(kflgBuildingMin); // Animation "thr2a" backwards. cnt=kcell14; While( cnt >= kcell1 ); Cell( cnt--, 0, 0, 6 ); End; If (FGobExists(kgobMovie)); ENABLEHOTSPOTS(kflgBuildingMin); Else; ENABLEHOTSPOTS(kflgBuildingAll); End; If( .MzNextAction == kst20 ); SETGLOBAL(kstEntry, kst3); // If another movie was playing, destroy it before creating a // new one. If (FGobExists(kgobMovie)); DESTROYMOVIE(); End; CREATEMOVIE(); Elif( .MzNextAction == kst21 ); NEXTPLACE1( kgobTheatre4, kst4 ); // Pass through theater to backstage to studio to tools. Elif( .MzNextAction == kst22 ); NEXTPLACE1( kgobTheatre4, kst3 ); Elif( .MzNextAction == kst23 ); ChangeStateGob( kgobMovie, kst3 ); Elif( .MzNextAction == kst24 ); ChangeStateThis( kst12 ); End; ENDCHUNK REP_ANIM( CHID( kst4, krepDefault ), "Wait state.") DEBUGCMD( PrintStr("Theater McZee: State 4") ); If (FGobExists(kgobMovie)); ENABLEHOTSPOTS(kflgBuildingMin); Else; ENABLEHOTSPOTS(kflgBuildingAll); End; ENDVOICE(); // This is a precautionary ENDVOICE to // capture any sound channels left open. Cell( kcell181, 0, 0, 6 ); If( GLOBAL( fHelpOn ) == fTrue ); If( .fHelpState == 1 ); CreateHelpGob( kgobTheatre1, ktpcTheatre1 ); Elif( .fHelpState == 2); CreateHelpGob( kgobTheatre1, ktpcTheatre2 ); End; End; // Waiting sequence While( fTrue ); cnt = kcell181; While( cnt <= kcell208); Cell( cnt++, 0, 0, 6 ); End; End; ENDCHUNK REP_ANIM( CHID( kst5, krepDefault ), "Decsion and shadow puppet.") DEBUGCMD( PrintStr("Theater McZee: State 5") ); If( GLOBAL( fMovie ) == fTrue ); SETGLOBAL( fMovie, fFalse ); DISABLEHOTSPOTS(kflgBuildingMin); WAIT_FOR_TRANSITION(); // Pause to allow transition to complete. VOICE( kwav21_thr1a, ktpc21_thr1a ); cnt=kcell251; // Animation "thr1_" (Shadow puppet animation). While( cnt <= kcell308 ); Cell( cnt++, 0, 0, 6 ); End; ENDVOICE(); ENABLEHOTSPOTS(kflgBuildingMin); SETGLOBAL(kstEntry, kst3); // Set the entry point to the movie object to kst3. CREATEMOVIE(); Else; .fHelpState=1; If( GLOBAL(fHelpOn) == fTrue ); .MzNextAction = kst6; // Help1 animation after... ChangeStateThis( kst2 ); // Leaning onto stage. Else; .MzNextAction = kst4; // Goto wait animation after... ChangeStateThis( kst2 ); // Leaning onto stage. End; End; ENDCHUNK REP_ANIM( CHID( kst6, krepDefault ), "Theater help1 animation" ) DEBUGCMD( PrintStr("Theater McZee: State 6") ); Cell( kcell101, 0, 0, 6 ); VOICE( kwavVO75, ktpcVO75 ); // Animation "thr2e". cnt=kcell102; While( cnt <= kcell121 ); Cell( cnt++, 0, 0, 6 ); End; ENDVOICE(); ChangeStateThis( kst4 ); ENDCHUNK REP_ANIM( CHID( kst7, krepDefault ), "Open the portfolio." ) DEBUGCMD(PrintStr("Theater McZee: State 7")); DISABLEHOTSPOTS(kflgBuildingMin); // Animation "thr2d". cnt=kcell61; While( cnt <= kcell81 ); Cell( cnt++, 0, 0, 6 ); End; // Bring up the Movie Open portfolio. EnqueueCid(cidPortfolioOpen, 0, kpfPortOpenMovie, 0, kpfPortDirUsers, 0); // Look out for the cid indicating that the portfolio has been closed. FilterCmdsThis(cidPortfolioClosed, cidNil, kchidScript1); ENDCHUNK REP_ANIM( CHID( kst8, krepDefault ), "Movie paused animation" ) .fHelpState=2; ENABLEHOTSPOTS(kflgBuildingMin); // Enabeling hotspots here allows the help balloon to be // preempted by clicking the play button again. DEBUGCMD( PrintStr("Theater McZee: State 8") ); // Using sequence "thr2b" in this state also. VOICE( kwavVO74B, ktpcVO74B ); cnt=kcell21; While( cnt <= kcell49 ); Cell( cnt++, 0, 0, 6 ); End; ENDVOICE(); SETGLOBAL( fHelpOn, fTrue ); ChangeStateThis( kst4 ); ENDCHUNK REP_ANIM( CHID( kst9, krepDefault ), "Movie done animation" ) .fHelpState=2; DEBUGCMD( PrintStr("Theater McZee: State 9") ); // Animation "thr2b". VOICE( kwavVO74B, ktpcVO74B ); cnt=kcell21; Cell( cnt++, 0, 0, 6 ); SetNoSlipThis( fTrue ); // we can now drop frames! While( cnt <= kcell48 ); Cell( cnt++, 0, 0, 6 ); End; SetNoSlipThis( fFalse); // don't drop frames Cell( cnt++, 0, 0, 6 ); ENDVOICE(); SETGLOBAL( fHelpOn, fTrue ); ChangeStateThis( kst4 ); ENDCHUNK REP_ANIM( CHID( kst10, krepDefault ), "Close the portfolio.") DEBUGCMD( PrintStr("Theater McZee: State 10") ); DISABLEHOTSPOTS(kflgBuildingMin); // Destroy portfolio help. DestroyGob( kgobBalloon1a ); // Animation back down thr2d. cnt=kcell81; While( cnt >= kcell61 ); Cell( cnt--, 0, 0, 6 ); End; // This endvoice accompanies the voice ENDVOICE(); // macro started at the END of the open // portfolio animation (kst7). If( .fWay == fTrue ); .MzNextAction = kst20; // Being used as a flag only.. ChangeStateThis( kst3 ); // McZee leaves the stage. Else; SETGLOBAL(fHelpOn, fTrue); ChangeStateThis( kst4 ); End; ENDCHUNK; REP_ANIM( CHID( kst11, krepDefault ), "Let explore animation" ) DEBUGCMD( PrintStr("Theater McZee: State 11") ); // Animation thr2f. VOICE( kwavVO76, ktpcVO76 ); cnt=kcell131; Cell( cnt++, 0, 0, 6 ); SetNoSlipThis( fTrue ); // we can now drop frames! While( cnt <= kcell164 ); Cell( cnt++, 0, 0, 6 ); End; SetNoSlipThis( fFalse ); // don't drop frames! Cell( cnt++, 0, 0, 6 ); ENDVOICE(); ChangeStateThis( kst4 ); ENDCHUNK REP_ANIM( CHID( kst12, krepDefault ), "Theater McZee null representation.") DEBUGCMD( PrintStr("Theater McZee: State 12") ); Cell( kcellNull, 0, 0, 0 ); ENDCHUNK CHILD_SCRIPT("kgobTheater1McZee Portfolio Callback", kchidScript1) // End this filter as it is no longer required. FilterCmdsThis(cidPortfolioClosed, cidNil, chidNil); .fWay = _parm[2]; If (.fWay); // Hide the movie object until the movie has loaded. ResizeGob(kgobMovie, 0, 0); End; ENABLEHOTSPOTS(kflgBuildingAll); ChangeStateThis(kst10); ENDCHUNK CLICK_SCRIPT("Theatre Mz click.") DEBUGCMD( PrintStr("Theater McZee: Click script") ); If( StateThis() != kst4 ); // If not in the wait state.. SETGLOBAL( fHelpOn, fTrue ); ChangeStateThis( kst4 );// go to the wait state. Elif( GLOBAL( fHelpOn ) == fFalse ); SETGLOBAL( fHelpOn, fTrue ); If( .fHelpState == 1 ); CreateHelpGob( kgobTheatre1, ktpcTheatre1 ); Elif( .fHelpState == 2); CreateHelpGob( kgobTheatre1, ktpcTheatre2 ); End; End; ENDCHUNK HELP_SCRIPT( ktpcTheatre1 ) If( _parm[0] == 0 ); // Do nothing Elif( _parm[0] == 1 ); // Yes, see a movie. SETGLOBAL( fHelpOn, fFalse ); DestroyGob( kgobBalloon1e ); ChangeStateGob( kgobTheatre1McZee, kst7 ); Elif( _parm[0] == 2 ); // No. SETGLOBAL( fHelpOn, fFalse ); DestroyGob( kgobBalloon1e ); ChangeStateGob( kgobTheatre1McZee, kst11 ); End; ENDCHUNK HELP_SCRIPT( ktpcTheatre2 ) If( _parm[0] == 0 ); // Do nothing Elif( _parm[0] == 1 ); // Work on this movie. SETGLOBAL( fHelpOn, fFalse ); DestroyGob( kgobBalloon1e ); DESTROYMOVIE(); kgobTheatre1McZee->MzNextAction = kst21; ChangeStateGob( kgobTheatre1McZee, kst3 ); Elif( _parm[0] == 2 ); // Create a new movie. SETGLOBAL( fHelpOn, fFalse ); DestroyGob( kgobBalloon1e ); DEBUGCMD(PrintStr("Enqueuing PortfolioClear")); EnqueueCid(cidPortfolioClear, 0, 0,0,0,0); DESTROYMOVIE(); kgobTheatre1McZee->MzNextAction = kst22; ChangeStateGob( kgobTheatre1McZee, kst3); Elif( _parm[0] == 3 ); // See this movie again. SETGLOBAL( fHelpOn, fFalse ); DestroyGob( kgobBalloon1e ); // Rewind and play the movie. DEBUGCMD(PrintStr("Enqueuing TheaterRewind")); EnqueueCid(cidTheaterRewind, 0, 0, 0, 0, 0); kgobTheatre1McZee->MzNextAction = kst23; ChangeStateGob( kgobTheatre1McZee, kst3 ); Elif (_parm[0] == 4); // Watch another movie. SETGLOBAL( fHelpOn, fFalse ); DestroyGob( kgobBalloon1e ); ChangeStateGob( kgobTheatre1McZee, kst7 ); // Open the portfolio book. Elif( _parm[0] == 5 ); // Stop watching movies. SETGLOBAL( fHelpOn, fFalse ); DestroyGob( kgobBalloon1e ); DEBUGCMD(PrintStr("Enqueuing PortfolioClear")); EnqueueCid(cidPortfolioClear, 0, 0,0,0,0); DESTROYMOVIE(); kgobTheatre1McZee->fHelpState=1; ChangeStateGob( kgobTheatre1McZee, kst11 ); End; ENDCHUNK OBJECT( "theatre1, left door", kgobTheatre1LeftDoor, 450, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\theatre\leftdr.bmp", 0, 0 ) CLICK_SCRIPT( "left door clicked" ) NEXTPLACE1( kgobTheatre3, kst2 ); ENDCHUNK OBJECT( "theatre 1, right door", kgobTheatre1RightDoor, 450, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\theatre\rightdr.bmp", 0, 0 ) CLICK_SCRIPT( "theatre right fwd door" ) NEXTPLACE1( kgobTheatre4, kst2 ); ENDCHUNK //******************************************************************************* //******************************************************************************* // Movie Work Space object //******************************************************************************* OBJECT( "Movie Work Space", kgobMovie, 400, kcrsArrow1 ) REP_RECT(kcell4, "Movie workspace dimensions", xLeftMovie, yTopMovie, xRightMovie, yBottomMovie) REP_ANIM( CHID( kst1, krepEnterAnimation ), "lobby1: McZee!") DEBUGCMD( PrintStr("Movie Work space: Entry state ", NumToStr(GLOBAL(kstEntry), ""))); ASSERT(GLOBAL(kstEntry) == kst2 || GLOBAL(kstEntry) == kst3); Cell( kcell4, 0, 0, 0 ); // Prepare to capture theatre success/failure cids. FilterCmdsThis(cidTheaterOpenCompleted, kidNil, kchidScript2); FilterCmdsThis(cidTheaterLoadCompleted, kidNil, kchidScript2); // Load the theatre object -- the movie will have to be loaded in // kchidScript2 when the OpenCompleted cid has been received. DEBUGCMD(PrintStr("Enqueuing TheaterOpen")); EnqueueCid(cidTheaterOpen, 0, kgobMovie, 0, 0, 0); ENDCHUNK REP_ANIM( CHID( kst2, krepDefault ), "Movie ready.") DEBUGCMD( PrintStr("Movie Work space: State 2") ); Cell( kcell4, 0, 0, 0 ); If( StateGob( kgobTheatre1McZee ) != kst12 ); // If McZee is not in the NULL state, kgobTheatre1McZee->MzNextAction = kst24; // McZee go's to a null state after ChangeStateGob( kgobTheatre1McZee, kst3 ); // McZee leaves the stage. End; ENDCHUNK REP_ANIM( CHID( kst3, krepDefault ), "Count down.") DEBUGCMD( PrintStr("Movie Work space: State 3") ); PLAYMIDI(cnoNil); Cell( kcell4, 0, 0, 0 ); ChangeStateGob( kgobTheatre1McZee, kst12 ); // Put McZee in a null representation state. ChangeStateGob( kgobPlayButton, kst2 ); // Put the play button in the on state. ChangeStateGob(kgobRewindButton, kst2); If( .f1stMovie == fTrue ); .f1stMovie = fFalse; WAIT_FOR_TRANSITION(); // Wait for a complete palette transition. // Unhide the movie object. If (HeightGob(kgobMovie) == 0); ResizeGob(kgobMovie, xRightMovie-xLeftMovie, yBottomMovie-yTopMovie); End; CreateChildThis( kgobCountDn, kgobCountDn ); DISABLEHOTSPOTS(kflgBuildingMin); While( PlayingGob( kgobCountDn )); Cell( kcellNull, 0,0, 6 ); // Cell command being used as a timer. End; DestroyGob( kgobCountDn ); ENABLEHOTSPOTS(kflgBuildingMin); End; ChangeStateThis( kst4 ); ENDCHUNK REP_ANIM( CHID( kst4, krepDefault ), "Movie playing.") DEBUGCMD( PrintStr("Movie Work space: State 4") ); DISABLEHOTSPOTS(kflgBuildingMin); PLAYMIDI(cnoNil); ChangeStateGob( kgobPlayButton, kst2 ); // Put the play button in the on state. ChangeStateGob(kgobRewindButton, kst2); If( StateGob( kgobTheatre1McZee ) != kst12 ); // If McZee is not in the NULL state, kgobTheatre1McZee->MzNextAction = kst24; // McZee go's to a null state after ChangeStateGob( kgobTheatre1McZee, kst3 ); // McZee leaves the stage. While( StateGob( kgobTheatre1McZee ) != kst12 ); Cell( 0, 0, 0, 6 ); // Pole the state of McZee to insure End; Else; ENABLEHOTSPOTS(kflgBuildingMin); End; Cell( kcell4, 0, 0, 0 ); //-------------------------------------------------- // Play the movie (functionality) //-------------------------------------------------- DEBUGCMD(PrintStr("Enqueuing TheaterPlay")); EnqueueCid(cidTheaterPlay, 0, 0, 0, 0, 0); // Look out for the cid indicating that the movie has stopped. FilterCmdsThis(cidMviePlaying, cidNil, kchidScript1); ENDCHUNK REP_ANIM( CHID( kst5, krepDefault ), "Movie done.") DEBUGCMD( PrintStr("Movie Work space: State 5") ); Cell( kcell4, 0, 0, 0 ); ChangeStateGob(kgobPlayButton, kst1); // put play button in stopped ChangeStateGob(kgobRewindButton, kst1); // position. kgobTheatre1McZee->MzNextAction = kst9; kgobTheatre1McZee->fHelpState = 2; ChangeStateGob( kgobTheatre1McZee, kst2 ); ENDCHUNK REP_ANIM( CHID( kst6, krepDefault ), "Movie paused.") DEBUGCMD( PrintStr("Movie Work space: State 6") ); DISABLEHOTSPOTS(kflgBuildingMin); Cell( kcell4, 0, 0, 0 ); //-------------------------------------------------- // Pause the movie (functionality) //-------------------------------------------------- // There is no pause. Just stop the movie and don't rewind. DEBUGCMD(PrintStr("kgobMovie kst6: Enqueuing TheaterStop")); EnqueueCid(cidTheaterStop, 0, 0, 0, 0, 0); kgobTheatre1McZee->MzNextAction = kst8; kgobTheatre1McZee->fHelpState = 2; ChangeStateGob( kgobTheatre1McZee, kst2 ); ENDCHUNK CHILD_SCRIPT("kgobMovie cidMviePlaying Callback", kchidScript1) // Only take action if the movie has stopped. If (!_parm[2] && StateGob(kgobPlayButton) == kst2); FilterCmdsThis(cidMviePlaying, cidNil, chidNil); ChangeStateThis(kst5); End; ENDCHUNK CHILD_SCRIPT("kgobMovie cidTheaterXCompleted Callback", kchidScript2) If (_parm[2] == fFalse); // Theater command failed. // TATR will have already alerted the user. We just need to lose // the movie object and put the theatre in a reasonable state. DEBUGCMD(PrintStr("Warning: cidTheaterLoad or cidTheaterOpen failed!")); DEBUGCMD(PrintStr("Enqueuing PortfolioClear")); EnqueueCid(cidPortfolioClear, 0, 0,0,0,0); DESTROYMOVIE(); kgobTheatre1McZee->fHelpState=1; SETGLOBAL(fHelpOn, fTrue); ChangeStateGob(kgobTheatre1McZee, kst4); Elif (_parm[1] == cidTheaterOpenCompleted); DEBUGCMD(PrintStr("Enqueuing TheaterLoad")); EnqueueCid(cidTheaterLoad, 0, 0, 0, 0, 0); Else; .f1stMovie=fTrue; ChangeStateThis(GLOBAL(kstEntry)); End; ENDCHUNK OBJECTREG( "Movie count down", kgobCountDn, 0, 1, 150, kcrsArrow1 ) REP_VIDEO( CHID1( krepDefault ), "CNTDWN5.AVI", fTrue ) // Note, the movie controls need to be above the movie click filter, which // I've put at 450. // --------------------------------------------------------- // This object is used to lock out clicks while a movie is loaded. // --------------------------------------------------------- OBJECT("movie click filter", kgobMovieClickFilter, 450, kcrsArrow1) REP_RECT(CHID1(krepDefault), "movie click filter", 0, 0, 640, 480) // -------------------------------------------------------------------------------- // The thumbnail is the graphic indicator of volume level... // positioned within the slide path - not hittable // -------------------------------------------------------------------------------- OBJECTTY( "Theater - volume slider", kgobVolumeButton, 451, kcrsArrow1, kgokkRectNoHit ) REP_PPMBMP( CHID1( krepDefault ), "building\pbm\theatre\thumb.pbm" ) #define _kdySlider 62 // Range the volume can slide in OBJECTREG( "theater - volume slidepath", kgobTheaterVolume, 9, 110, 451, kcrsHand1 ) REP_RECT( CHID1( krepDefault), "rectangle", 0, 0, 12, 74 ) CREATE_SCRIPT( "create slidepath") CreateChildThis( kgobVolumeButton, kgobVolumeButton ); // get initial volume value, move thumbnail y = _kdySlider -(( GetMasterVolume() * _kdySlider )/ (2*kvlmFull)); MoveAbsGob( kgobVolumeButton, 0, y ); ENDCHUNK REP_ANIM( CHID1( krepMouseDnOn), "slider") // repeat up to 30000 times. .siiLoop = PlaySoundThis(kctgWave, kwavDing, 2, 0x00010000, 30000, 1, ksclBldgSound); While( 1 ); y = YMouseThis(); If( y < 0 ); y=0; Elif ( y > _kdySlider ); y =_kdySlider; End; // move thumb slider MoveAbsGob( kgobVolumeButton, 0, y ); // track new volume newvol = ( (2*kvlmFull)* (_kdySlider-y) ) / _kdySlider; // set the volume SetMasterVolume( newvol ); // Sample at 10/60ths of a second. Cell( 0 , 0,0, 10 ); End; ENDCHUNK REP_ANIM( CHID1( kchidDownUpOn ), "release on" ) StopSound( .siiLoop ); ENDCHUNK ADOPT_ANIM( LAST_ANIM, CHID1( kchidDownUpOff )) #undef _kdySlider OBJECTREG( "Movie play/stop button", kgobPlayButton, 318, 7, 451, kcrsHand1 ) REP_PPMBMP( CHID( kst1, krepDefault ), "building\pbm\theatre\play1.pbm" ) REP_PPMBMP( CHID( kst2, krepDefault ), "building\pbm\theatre\play2.pbm" ) CLICK_SCRIPT( "Movie play/stop button clicked." ) // Pressing play to start the movie... If( StateThis() == kst1 ); // Take down help balloon if one is up. If( FGobExists( kgobBalloon1e ) ); DestroyGob( kgobBalloon1e ); // This destroys the balloon that holds the tip Elif( FGobExists( kgobBalloon1a ) ); DestroyGob( kgobBalloon1a ); End; // Changing the movie state to 3 or 4 will cause the "Play" // command to be sent. If( kgobMovie->f1stMovie == fTrue ); ChangeStateGob( kgobMovie, kst3 ); Else; ChangeStateGob( kgobMovie, kst4 ); End; ChangeStateThis( kst2 ); ChangeStateGob(kgobRewindButton, kst2); // Pressing stop to stop the movie... Else; // Changing the movie state to 6 will cause the "Stop" command // to be sent. ChangeStateGob( kgobMovie, kst6 ); ChangeStateThis( kst1 ); ChangeStateGob(kgobRewindButton, kst1); End; ENDCHUNK GOBCHUNK("Movie rewind button", kgobRewindButton, kgokkNormal) DEFAULT_POSITION(293, 7, 451) ACTION(fcustNil, fcustNil, fgrfstDefault, kcrsHand1, kchidScript1, cidNil, cnoNil) ACTION(fcustNil, fcustNil, fgrfst2, kcrsArrow1, chidNil, cidNil, cnoNil) ENDCHUNK REP_PPMBMP( kcell1, "building\pbm\theatre\rewind1.pbm" ) REP_PPMBMP( kcell2, "building\pbm\theatre\rewind2.pbm" ) REP_ANIM( CHID( kst1, krepDefault ), "Default" ) Cell (kcell1, 0, 0, 0); ENDCHUNK REP_ANIM( CHID( kst2, krepDefault ), "Default" ) Cell (kcell1, 0, 0, 0); ENDCHUNK REP_ANIM( CHID( kst1, krepMouseDnOn ), "Rewind down on" ) Cell (kcell2, 0, 0, 0); ENDCHUNK REP_ANIM( CHID( kst1, krepMouseDnOff ), "Rewind down off" ) Cell (kcell1, 0, 0, 0); ENDCHUNK REP_ANIM( CHID( kst1, krepMouseUpOn ), "Rewind up on" ) Cell (kcell1, 0, 0, 0); ENDCHUNK CHILD_SCRIPT("Rewind button clicked", kchidScript1) // The movie should not be playing. ASSERT(StateGob(kgobPlayButton) == kst1); If( FGobExists( kgobBalloon1a ) ); DestroyGob( kgobBalloon1a ); End; If (FGobExists(kgobBalloon1e)); DestroyGob(kgobBalloon1e); End; // This'll start McZee leaving the stage if he's on it; otherwise, it // really just makes sure that we're not already in kst4 so changing // to kst4 later will actually do something. ChangeStateGob(kgobMovie, kst2); DEBUGCMD(PrintStr("Enqueuing TheaterRewind")); EnqueueCid(cidTheaterRewind, 0, 0, 0, 0, 0); // And start the movie playing again. ChangeStateGob( kgobMovie, kst4 ); ENDCHUNK OBJECT( "theatre 2, back door", kgobTheatre2Door, 50, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\theatre\the2door.bmp", 0, 0 ) CLICK_SCRIPT( "Theatre 2 back door clicked" ) NEXTPLACE1( kgobLobby2, kst2 ); ENDCHUNK OBJECT( "theatre2 map", kgobTheatre2Map, 50, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\theatre\the2map.bmp", 0, 0 ) CLICK_SCRIPT( "theatre 2 map clicked" ) CreateChildGob( GET_CURRENTPLACE(), kgobMapMain, kgobMapMain ); ENDCHUNK OBJECT( "theatre2 exit", kgobTheatre2Exit, 50, kcrsHand1 ) REP_RECT( CHID1( krepDefault ), "exit sign" , 420, 194, 445, 206 ) CLICK_SCRIPT( "theatre 2 exit clicked" ) QUITAPP(); ENDCHUNK OBJECT( "right screen", kgobTheatre3Right, 10, kcrsRight ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\theatre\right.bmp", 0, 0 ) CLICK_SCRIPT( "right screen clicked" ) NEXTPLACE1( kgobTheatre1, kst4 ); // Goto theatre1, wait state. ENDCHUNK OBJECT( "left front door", kgobTheatre3Door, 10, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\theatre\bkleft.bmp", 0, 0 ) CLICK_SCRIPT( "left front door clicked" ) NEXTPLACE1( kgobBackstage1, kst2 ); ENDCHUNK OBJECT( "theatre3 map", kgobTheatre3Map, 44, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\theatre\the3map.bmp", 0, 0 ) CLICK_SCRIPT( "theatre 3 map clicked") CreateChildGob( GET_CURRENTPLACE(), kgobMapMain, kgobMapMain ); ENDCHUNK OBJECT( "theatre3 exit", kgobTheatre3Exit, 44, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\theatre\the3quit.bmp", 0, 0 ) CLICK_SCRIPT( "theatre 3 exit clicked" ) QUITAPP(); ENDCHUNK OBJECT( "Theater4 McZee", kgobTheatre4McZee , 550, kcrsArrow1 ) REP_ANIM( CHID( kst1, krepDefault ), "Theatre4 McZee pass thru!") DEBUGCMD(PrintStr("Create theatre4 McZee")); DISABLEHOTSPOTS(kflgBuildingMin); VOICE( kwav30_thr4, ktpc30_thr4 ); cnt = kcell1; While( cnt <= kcell44 ); If( cnt == kcell39 ); CreateChildGob( kgobTheatre4, kgobThe4OpenDoor, kgobThe4OpenDoor ); End; Cell( cnt, 0, 0, 6 ); cnt++; End; ENDVOICE(); DestroyThis(); RunScriptGob( kgobTheatre4, kchidScript1 ); ENDCHUNK #include "mzthea4.seq" OBJECT( "Theatre left door opening", kgobThe4OpenDoor, 150, kcrsArrow1 ) REP_ANIM( CHID( kst1, krepEnterAnimation ), "Theatre4 door opening" ) PLAYMIDI( kmidTheatre ); cnt=kcell1; While( cnt <= kcell5 ); Cell( cnt++, 0,0, 6 ); End; ENDCHUNK REP_PPMBMP( kcell1, "building\pbm\theatre\Ldoor49.pbm" ) REP_PPMBMP( kcell2, "building\pbm\theatre\Ldoor50.pbm" ) REP_PPMBMP( kcell3, "building\pbm\theatre\Ldoor51.pbm" ) REP_PPMBMP( kcell4, "building\pbm\theatre\Ldoor52.pbm" ) REP_PPMBMP( kcell5, "building\pbm\theatre\Ldoor53.pbm" ) OBJECT( "left screen", kgobTheatre4Left, 10, kcrsLeft ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\theatre\left.bmp", 0, 0 ) CLICK_SCRIPT( "Left screen clicked" ) NEXTPLACE1( kgobTheatre1, kst4 ); // Goto theatre1, wait state. ENDCHUNK OBJECT( "right front door", kgobTheatre4Door, 10, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\theatre\bkright.bmp", 0, 0 ) CLICK_SCRIPT( "left front door clicked" ) NEXTPLACE1( kgobBackstage1, kst2 ); ENDCHUNK OBJECT( "theatre4 map", kgobTheatre4Map, 44, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\theatre\the4map.bmp", 0, 0 ) CLICK_SCRIPT( "theatre 4 map clicked" ) CreateChildGob( GET_CURRENTPLACE(), kgobMapMain, kgobMapMain ); ENDCHUNK OBJECT( "theatre4 exit", kgobTheatre4Exit, 44, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\theatre\the4quit.bmp", 0, 0 ) CLICK_SCRIPT( "theatre 2 exit clicked" ) QUITAPP(); ENDCHUNK //------------------------------------------------------------ // Bio page hotspots //---------------------------------------------------------- OBJECT( "Biopage 31 mask", kgobTheater2m1, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\theatre\the2m1.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 31 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 31 ); BIO_CREATEBOOK( 31, fFalse, kgobTheatre2 ); End; ENDCHUNK OBJECT( "Biopage 32 mask", kgobTheater2m2, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\theatre\the2m2.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 32 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 32 ); BIO_CREATEBOOK( 32, fFalse, kgobTheatre2 ); End; ENDCHUNK OBJECT( "Biopage 33 mask", kgobTheater2m3, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\theatre\the2m3.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 33 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 33 ); BIO_CREATEBOOK( 33, fFalse, kgobTheatre2 ); End; ENDCHUNK //Cleaning up defines that are only to be used in this file. #undef SHOWMOVIECLICKFILTER #undef CREATEMOVIE #undef DESTROYMOVIE ================================================ FILE: src/building/ticket.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // ----------------------------------------------------- // TICKET.CHT // // Copyright (C) Microsoft Corporation 1995. // All Rights reserved. // // ----------------------------------------------------- // Module Intent: // // Contains the kauai script code for the Ticket Booth far off // and near sceens. // // Revisions: // // mm-dd-yy // ??-??-94 ***** - Created // // ----------------------------------------------------- WAVE_CHUNK( "building\sound\ticket\TKTBTH.wav", kwavTKTBTH ) WAVE_CHUNK( "building\sound\ticket\TBCY2.wav", kwavTBCY2 ) WAVE_CHUNK( "building\sound\ticket\TBTH3.wav", kwavTBTH3 ) WAVE_CHUNK( "building\sound\ticket\VO54.wav", kwavVO54 ) WAVE_CHUNK( "building\sound\ticket\VO56B.wav", kwavVO56B ) WAVE_CHUNK( "building\sound\ticket\tbfar.wav", kwavTicketFar ) // ---------------------------------------------------------- // Doors leading into the lobby // ---------------------------------------------------------- OBJECT( "ticket1:doors in", kgobTicket1Doors, 44, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\ticket\tik1drs.bmp", 0, 0 ) CLICK_SCRIPT( "ticket booth doors clicked" ) If( GetProp(kpridFirstTimeUser) && GLOBAL(fTicketPS) ); SETGLOBAL( fTicketPS, fFalse ); NEXTPLACE1( kgobTicket2, kst2 ); // first time users must go to ticket booth. Else; NEXTPLACE1( kgobLobby1, kst3 ); End; ENDCHUNK // ---------------------------------------------------------- // faded out McZee in booth, waiting for something to happen // CHANGE: 5.16 (*****) -- fixed. Made nohit // ---------------------------------------------------------- OBJECTTY( "ticket1: mczee waiting", kgobTicket1Waiter, 15, kcrsHand1, gokkNoHitThis ) REP_ANIM( CHID1( krepDefault ), "ticket1: mczee waiting") VOICE( kwavTicketFar, 0 ); i = 5; While( --i ); cnt = kcell1; While( cnt <= kcell22 ); Cell( cnt++, 0, 0, 6 ); End; End; NEXTPLACE1( kgobTicket2, kst2 ); // move into close view. ENDCHUNK #include "ticket1.seq" // ------------------------------------------------------- // Map behind McZee in the ticketbooth // ------------------------------------------------------- OBJECT( "ticket2: map", kgobTicket2Map, 10, kcrsHand1 ) REP_RECT( CHID1( krepDefault ), "Ticket2 map mask", 155, 97, 236, 158 ) CLICK_SCRIPT( "ticket2: map clicked" ) CreateChildGob( GET_CURRENTPLACE(), kgobMapMain, kgobMapMain ); ENDCHUNK // ------------------------------------------------------- // Exit button behind McZee in the ticketbooth // ------------------------------------------------------- OBJECT( "ticket2: exit", kgobTicket2Exit, 10, kcrsHand1 ) REP_RECT( CHID1( krepDefault ), "Ticket2 exit button mask", 173,31, 223, 61 ) CLICK_SCRIPT( "ticket2: exit clicked" ) QUITAPP(); ENDCHUNK // ---------------------------------------------------------------- // McZee the ticket boy in the ticket booth... //---------------------------------------------------------------- OBJECT( "ticket2:mczee", kgobTicket2McZee, 20, kcrsHand1 ) REP_ANIM( CHID( kst1, krepEnterAnimation ), "Ticket2: Dispatch state.") ASSERT(GLOBAL(kstEntry) == kst2 || GLOBAL(kstEntry) == kst3); .fWay = fFalse; // A flag set by portfolio callback script and used in kst5. ChangeStateThis(GLOBAL(kstEntry)); ENDCHUNK //---------------------------------------------------------------- // Mczee playing air guitar //---------------------------------------------------------------- REP_ANIM( CHID( kst2, krepDefault), "ticket mczee animate" ) // create the animation PLAYMIDI( cnoNil ); // stop music ENDVOICE(); // stop any talking DISABLEHOTSPOTS(kflgBuildingMin); Cell( kcell1, 0,0, 1 ); WAIT_FOR_TRANSITION(); // If a transition is occuring wait CreateChildGob( GidParThis(), kgobTicketMcZeeAVI, kgobTicketMcZeeAVI ); Cell( kcell1,0,0, 100 ); // wait for init // watch it and proceed appropriately While( PlayingGob( kgobTicketMcZeeAVI )); Cell( kcell1, 0, 0, 10 ); // poll at 1/6ths of a second End; DestroyGob( kgobTicketMcZeeAVI ); ENABLEHOTSPOTS(kflgBuildingAll); ChangeStateThis( kst3 ); // proceed - give camera/etc ENDCHUNK //---------------------------------------------------------------- // Mczee presenting film and cans, choices //---------------------------------------------------------------- REP_ANIM( CHID( kst3, krepDefault ), "ticket:mczee (map entry)" ) ENDVOICE(); DISABLEHOTSPOTS(kflgBuildingMin); Cell( kcell301, 0,0, 1 ); WAIT_FOR_TRANSITION(); // If a transition is occuring wait CreateChildGob( GidParThis(), kgobTicketMcZeeAVI2, kgobTicketMcZeeAVI2 ); Cell( kcell301,0,0, 100 ); // wait for init // watch it and proceed appropriately While( PlayingGob( kgobTicketMcZeeAVI2 )); Cell( kcell301, 0, 0, 10 ); // poll at 1/6ths of a second End; DestroyGob( kgobTicketMcZeeAVI2 ); ENABLEHOTSPOTS(kflgBuildingAll); CreateChildGob( kgobTicket2, kgobTicket2Cans, kgobTicket2Cans ); CreateChildGob( kgobTicket2, kgobTicket2Camera, kgobTicket2Camera ); ENABLEHOTSPOTS(kflgBuildingAll); ChangeStateThis( kst4 ); ENDCHUNK REP_ANIM( CHID( kst4, krepDefault ), "McZee waiting animation" ) Cell( kcell301, 0,0,1 ); // draw ourselves. WAIT_FOR_TRANSITION(); // If a transition is occuring wait If( !FGobExists( kgobTicket2Cans ) ); CreateChildGob( kgobTicket2, kgobTicket2Cans, kgobTicket2Cans ); End; If( !FGobExists( kgobTicket2Camera ) ); CreateChildGob( kgobTicket2, kgobTicket2Camera, kgobTicket2Camera ); End; If( GLOBAL(fHelpOn) ); CreateHelpGob( kgobTicket2, ktpcTicketChoices ); Elif( GLOBAL( fTic1stHelp ) ); // If help has never been up before, put it up. // fTic1stHelp --- flag for turning help on first time per session. SETGLOBAL( fTic1stHelp, fFalse ); SETGLOBAL( fHelpOn, fTrue ); CreateHelpGob( kgobTicket2, ktpcTicketChoices ); End; While( fTrue ); cnt=kcell400; VOICE( kwavTBCY2, 0 ); While( cnt <= kcell440 ); Cell( cnt++, 0, 0, 6); End; ENDVOICE(); End; ENDCHUNK REP_ANIM( CHID( kst5, krepDefault ), "McZee opening the portfolio" ) DISABLEHOTSPOTS(kflgBuildingMin); DEBUGCMD( PrintStr("Ticket McZee: State 5") ); SetZThis( 900 ); // Put the portfolio above help balloons. cnt=kcell551; // but not above the glass! VOICE( kwavVO54, 0 ); While( cnt < kcell577 ); Cell( cnt++, 0, 0, 6 ); End; CreateChildGob( kgobTicket2McZee, kgobPortfolio, kgobPortfolio ); kgobPortfolio->kidCallObj = kgobTicket2McZee; kgobPortfolio->chidCallScript = kchidScript1; ENDCHUNK REP_ANIM( CHID( kst6, krepDefault ), "McZee close the portfolio.") DEBUGCMD( PrintStr("Ticket McZee: State 6") ); cnt=kcell576; While( cnt >= kcell551 ); Cell( cnt--, 0, 0, 6 ); End; If( .fWay ); DEBUGCMD(PrintStr("flag fMovie is set to fTrue")); SETGLOBAL( fMovie, fTrue ); // Movie is loaded. NEXTPLACE1( kgobLobby1, kst3 ); Else; ENABLEHOTSPOTS(kflgBuildingAll); SetZThis( 20 ); ChangeStateThis( kst4 ); End; ENDCHUNK; REP_ANIM( CHID( kst7, krepDefault), "McZee starting camera pull to backstage" ) DISABLEHOTSPOTS(kflgBuildingMin); DEBUGCMD( PrintStr("Ticket McZee: State 7") ); If( FGobExists( kgobBalloon1d ) ); DestroyGob( kgobBalloon1d ); End; SetZThis( 50 ); // Put McZee in front of the other objects // in the ticket booth. cnt = kcell501; VOICE( kwavVO56B, 0 ); While( cnt <= kcell527 ); Cell( cnt++, 0,0, 6 ); If( cnt == kcell511 ); DestroyGob( kgobTicket2Camera ); End; End; ENDVOICE(); SETGLOBAL( fTrans, fFalse ); // No palette transition. NEXTPLACE1( kgobBackstage1, kst10 ); ENDCHUNK CLICK_SCRIPT("Ticket Booth McZee: Click script") If( StateThis() != kst4 ); ChangeStateThis( kst4 ); SETGLOBAL( fHelpOn, fTrue ); Elif( GLOBAL( fHelpOn ) ); // McZee's clicked & help's on..turn it off. SETGLOBAL( fHelpOn, fFalse ); DestroyGob( kgobBalloon1d ); Else; // McZee's clicked & help's off..turn it on. SETGLOBAL( fHelpOn, fTrue ); CreateHelpGob( kgobTicket2, ktpcTicketChoices ); End; ENDCHUNK // The following script is called back to from the portfolio // when it closes. CHILD_SCRIPT("Ticket2McZee child script", kchidScript1 ) If( _parm[0] == kidNil ); // USER CANCELLED PORTFOLIO .fWay = fFalse; Else; // USER CHOSE A MOVIE .fWay = fTrue; End; ENDVOICE(); // End the voiceover that started at state 5 (open portfolio). ChangeStateThis( kst6 ); ENDCHUNK // McZee animation cells. Keep them at the bottom of the object // for Kauai performance reasons. #include "ticket.seq" OBJECTREG("ticketbooth - dance", kgobTicketMcZeeAVI, 132, 18, 999, kcrsHand1) REP_VIDEO( CHID1( krepDefault ), "ticket1.avi", fTrue ) CREATE_SCRIPT( "created" ) FilterCmdsThis( cidMouseDown, kidNil, kchidScript1); ENDCHUNK CHILD_SCRIPT( "mouse down", kchidScript1 ) // stop playing... the polling will catch and remove us. StopThis(); ENDCHUNK CLICK_SCRIPT( "clicked ticketbooth intro" ) // stop playing... the polling will catch and remove us StopThis(); ENDCHUNK OBJECTREG("ticketbooth - present", kgobTicketMcZeeAVI2, 0, 0, 999, kcrsHand1) REP_VIDEO( CHID1( krepDefault ), "ticket2.avi", fTrue ) CREATE_SCRIPT( "created" ) FilterCmdsThis( cidMouseDown, kidNil, kchidScript1); ENDCHUNK CHILD_SCRIPT( "mouse down", kchidScript1 ) // stop playing... the polling will catch and remove us. StopThis(); ENDCHUNK CLICK_SCRIPT( "clicked ticketbooth intro" ) // stop playing... the polling will catch and remove us StopThis(); ENDCHUNK // ---------------------------------------------------- // Help script to handle ticket booth choices // ---------------------------------------------------- HELP_SCRIPT( ktpcTicketChoices ) If( _parm[0] == 2 ); // See a movie choice. ChangeStateGob( kgobTicket2McZee, kst5 ); Elif( _parm[0] == 1 ); // Make a movie. ChangeStateGob( kgobTicket2McZee, kst7 ); End; ENDCHUNK // ---------------------------------------------------- // Film Cans McZee puts up on the counter // ---------------------------------------------------- OBJECT( "ticket2:film cans", kgobTicket2Cans, 30, kcrsHand1 ) REP_PPMBMP( CHID1( krepDefault ), "building\pbm\ticket\tik2cans.pbm" ) CLICK_SCRIPT( "ticket2: films clicked" ) // Get portfolio selection ChangeStateGob( kgobTicket2McZee, kst5 ); ENDCHUNK // ---------------------------------------------------- // Camera McZee puts up on the counter // ---------------------------------------------------- OBJECT( "ticket2:camera clicked", kgobTicket2Camera, 30, kcrsHand1 ) REP_PPMBMP( CHID1( krepDefault ), "building\pbm\ticket\tik2cam.pbm" ) CLICK_SCRIPT( "ticket2: camera clicked" ) ChangeStateGob( kgobTicket2McZee, kst7 ); ENDCHUNK //------------------------------------------------------------ // Bio page hotspots //---------------------------------------------------------- OBJECT( "Biopage 24 mask", kgobTic1m1, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\ticket\tic1m1.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 24 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 24 ); BIO_CREATEBOOK( 24, fFalse, kgobTicket2 ); End; ENDCHUNK ================================================ FILE: src/building/ticket.seq ================================================ REP_PPMBMP( kcell1, "building\pbm\ticket\mczee1.pbm") REP_PPMBMP( kcell301, "building\pbm\ticket\tkmz1.pbm") REP_PPMBMP( kcell302, "building\pbm\ticket\tkmz2.pbm") REP_PPMBMP( kcell303, "building\pbm\ticket\tkmz3.pbm") REP_PPMBMP( kcell304, "building\pbm\ticket\tkmz4.pbm") REP_PPMBMP( kcell305, "building\pbm\ticket\tkmz5.pbm") REP_PPMBMP( kcell306, "building\pbm\ticket\tkmz6.pbm") REP_PPMBMP( kcell307, "building\pbm\ticket\tkmz7.pbm") REP_PPMBMP( kcell308, "building\pbm\ticket\tkmz8.pbm") REP_PPMBMP( kcell309, "building\pbm\ticket\tkmz9.pbm") REP_PPMBMP( kcell310, "building\pbm\ticket\tkmz10.pbm") REP_PPMBMP( kcell311, "building\pbm\ticket\tkmz11.pbm") REP_PPMBMP( kcell312, "building\pbm\ticket\tkmz12.pbm") REP_PPMBMP( kcell313, "building\pbm\ticket\tkmz13.pbm") REP_PPMBMP( kcell314, "building\pbm\ticket\tkmz14.pbm") REP_PPMBMP( kcell315, "building\pbm\ticket\tkmz15.pbm") REP_PPMBMP( kcell316, "building\pbm\ticket\tkmz16.pbm") REP_PPMBMP( kcell317, "building\pbm\ticket\tkmz17.pbm") REP_PPMBMP( kcell318, "building\pbm\ticket\tkmz18.pbm") REP_PPMBMP( kcell319, "building\pbm\ticket\tkmz19.pbm") REP_PPMBMP( kcell320, "building\pbm\ticket\tkmz20.pbm") REP_PPMBMP( kcell321, "building\pbm\ticket\tkmz21.pbm") REP_PPMBMP( kcell322, "building\pbm\ticket\tkmz22.pbm") REP_PPMBMP( kcell323, "building\pbm\ticket\tkmz23.pbm") REP_PPMBMP( kcell324, "building\pbm\ticket\tkmz24.pbm") REP_PPMBMP( kcell325, "building\pbm\ticket\tkmz25.pbm") REP_PPMBMP( kcell326, "building\pbm\ticket\tkmz26.pbm") REP_PPMBMP( kcell327, "building\pbm\ticket\tkmz27.pbm") REP_PPMBMP( kcell328, "building\pbm\ticket\tkmz28.pbm") REP_PPMBMP( kcell329, "building\pbm\ticket\tkmz29.pbm") REP_PPMBMP( kcell330, "building\pbm\ticket\tkmz30.pbm") REP_PPMBMP( kcell331, "building\pbm\ticket\tkmz31.pbm") REP_PPMBMP( kcell332, "building\pbm\ticket\tkmz32.pbm") REP_PPMBMP( kcell333, "building\pbm\ticket\tkmz33.pbm") REP_PPMBMP( kcell334, "building\pbm\ticket\tkmz34.pbm") REP_PPMBMP( kcell335, "building\pbm\ticket\tkmz35.pbm") REP_PPMBMP( kcell336, "building\pbm\ticket\tkmz36.pbm") REP_PPMBMP( kcell337, "building\pbm\ticket\tkmz37.pbm") REP_PPMBMP( kcell338, "building\pbm\ticket\tkmz38.pbm") REP_PPMBMP( kcell339, "building\pbm\ticket\tkmz39.pbm") REP_PPMBMP( kcell340, "building\pbm\ticket\tkmz40.pbm") REP_PPMBMP( kcell341, "building\pbm\ticket\tkmz41.pbm") REP_PPMBMP( kcell342, "building\pbm\ticket\tkmz42.pbm") REP_PPMBMP( kcell343, "building\pbm\ticket\tkmz43.pbm") REP_PPMBMP( kcell344, "building\pbm\ticket\tkmz44.pbm") REP_PPMBMP( kcell345, "building\pbm\ticket\tkmz45.pbm") REP_PPMBMP( kcell346, "building\pbm\ticket\tkmz46.pbm") REP_PPMBMP( kcell347, "building\pbm\ticket\tkmz47.pbm") REP_PPMBMP( kcell348, "building\pbm\ticket\tkmz48.pbm") REP_PPMBMP( kcell349, "building\pbm\ticket\tkmz49.pbm") REP_PPMBMP( kcell350, "building\pbm\ticket\tkmz50.pbm") REP_PPMBMP( kcell351, "building\pbm\ticket\tkmz51.pbm") REP_PPMBMP( kcell352, "building\pbm\ticket\tkmz52.pbm") REP_PPMBMP( kcell353, "building\pbm\ticket\tkmz53.pbm") REP_PPMBMP( kcell354, "building\pbm\ticket\tkmz54.pbm") REP_PPMBMP( kcell355, "building\pbm\ticket\tkmz55.pbm") REP_PPMBMP( kcell356, "building\pbm\ticket\tkmz56.pbm") REP_PPMBMP( kcell357, "building\pbm\ticket\tkmz57.pbm") REP_PPMBMP( kcell358, "building\pbm\ticket\tkmz58.pbm") REP_PPMBMP( kcell359, "building\pbm\ticket\tkmz59.pbm") REP_PPMBMP( kcell360, "building\pbm\ticket\tkmz60.pbm") REP_PPMBMP( kcell361, "building\pbm\ticket\tkmz61.pbm") REP_PPMBMP( kcell362, "building\pbm\ticket\tkmz62.pbm") REP_PPMBMP( kcell363, "building\pbm\ticket\tkmz63.pbm") REP_PPMBMP( kcell364, "building\pbm\ticket\tkmz64.pbm") REP_PPMBMP( kcell365, "building\pbm\ticket\tkmz65.pbm") REP_PPMBMP( kcell366, "building\pbm\ticket\tkmz66.pbm") REP_PPMBMP( kcell367, "building\pbm\ticket\tkmz67.pbm") REP_PPMBMP( kcell368, "building\pbm\ticket\tkmz68.pbm") REP_PPMBMP( kcell369, "building\pbm\ticket\tkmz69.pbm") REP_PPMBMP( kcell370, "building\pbm\ticket\tkmz70.pbm") REP_PPMBMP( kcell371, "building\pbm\ticket\tkmz71.pbm") REP_PPMBMP( kcell372, "building\pbm\ticket\tkmz72.pbm") REP_PPMBMP( kcell373, "building\pbm\ticket\tkmz73.pbm") REP_PPMBMP( kcell374, "building\pbm\ticket\tkmz74.pbm") REP_PPMBMP( kcell375, "building\pbm\ticket\tkmz75.pbm") REP_PPMBMP( kcell401, "building\pbm\ticket\tkwait1.pbm" ) REP_PPMBMP( kcell402, "building\pbm\ticket\tkwait2.pbm" ) REP_PPMBMP( kcell403, "building\pbm\ticket\tkwait3.pbm" ) REP_PPMBMP( kcell404, "building\pbm\ticket\tkwait4.pbm" ) REP_PPMBMP( kcell405, "building\pbm\ticket\tkwait5.pbm" ) REP_PPMBMP( kcell406, "building\pbm\ticket\tkwait6.pbm" ) REP_PPMBMP( kcell407, "building\pbm\ticket\tkwait7.pbm" ) REP_PPMBMP( kcell408, "building\pbm\ticket\tkwait8.pbm" ) REP_PPMBMP( kcell409, "building\pbm\ticket\tkwait9.pbm" ) REP_PPMBMP( kcell410, "building\pbm\ticket\tkwait10.pbm" ) REP_PPMBMP( kcell411, "building\pbm\ticket\tkwait11.pbm" ) REP_PPMBMP( kcell412, "building\pbm\ticket\tkwait12.pbm" ) REP_PPMBMP( kcell413, "building\pbm\ticket\tkwait13.pbm" ) REP_PPMBMP( kcell414, "building\pbm\ticket\tkwait14.pbm" ) REP_PPMBMP( kcell415, "building\pbm\ticket\tkwait15.pbm" ) REP_PPMBMP( kcell416, "building\pbm\ticket\tkwait16.pbm" ) REP_PPMBMP( kcell417, "building\pbm\ticket\tkwait17.pbm" ) REP_PPMBMP( kcell418, "building\pbm\ticket\tkwait18.pbm" ) REP_PPMBMP( kcell419, "building\pbm\ticket\tkwait19.pbm" ) REP_PPMBMP( kcell420, "building\pbm\ticket\tkwait20.pbm" ) REP_PPMBMP( kcell421, "building\pbm\ticket\tkwait21.pbm" ) REP_PPMBMP( kcell422, "building\pbm\ticket\tkwait22.pbm" ) REP_PPMBMP( kcell423, "building\pbm\ticket\tkwait23.pbm" ) REP_PPMBMP( kcell424, "building\pbm\ticket\tkwait24.pbm" ) REP_PPMBMP( kcell425, "building\pbm\ticket\tkwait25.pbm" ) REP_PPMBMP( kcell426, "building\pbm\ticket\tkwait26.pbm" ) REP_PPMBMP( kcell427, "building\pbm\ticket\tkwait27.pbm" ) REP_PPMBMP( kcell428, "building\pbm\ticket\tkwait28.pbm" ) REP_PPMBMP( kcell429, "building\pbm\ticket\tkwait29.pbm" ) REP_PPMBMP( kcell430, "building\pbm\ticket\tkwait30.pbm" ) REP_PPMBMP( kcell431, "building\pbm\ticket\tkwait31.pbm" ) REP_PPMBMP( kcell432, "building\pbm\ticket\tkwait32.pbm" ) REP_PPMBMP( kcell433, "building\pbm\ticket\tkwait33.pbm" ) REP_PPMBMP( kcell434, "building\pbm\ticket\tkwait34.pbm" ) REP_PPMBMP( kcell435, "building\pbm\ticket\tkwait35.pbm" ) REP_PPMBMP( kcell436, "building\pbm\ticket\tkwait36.pbm" ) REP_PPMBMP( kcell437, "building\pbm\ticket\tkwait37.pbm" ) REP_PPMBMP( kcell438, "building\pbm\ticket\tkwait38.pbm" ) REP_PPMBMP( kcell439, "building\pbm\ticket\tkwait39.pbm" ) REP_PPMBMP( kcell440, "building\pbm\ticket\tkwait40.pbm" ) REP_PPMBMP( kcell501, "building\pbm\ticket\tbth5_1.pbm" ) REP_PPMBMP( kcell502, "building\pbm\ticket\tbth5_2.pbm" ) REP_PPMBMP( kcell503, "building\pbm\ticket\tbth5_3.pbm" ) REP_PPMBMP( kcell504, "building\pbm\ticket\tbth5_4.pbm" ) REP_PPMBMP( kcell505, "building\pbm\ticket\tbth5_5.pbm" ) REP_PPMBMP( kcell506, "building\pbm\ticket\tbth5_6.pbm" ) REP_PPMBMP( kcell507, "building\pbm\ticket\tbth5_7.pbm" ) REP_PPMBMP( kcell508, "building\pbm\ticket\tbth5_8.pbm" ) REP_PPMBMP( kcell509, "building\pbm\ticket\tbth5_9.pbm" ) REP_PPMBMP( kcell510, "building\pbm\ticket\tbth5_10.pbm" ) REP_PPMBMP( kcell511, "building\pbm\ticket\tbth5_11.pbm" ) REP_PPMBMP( kcell512, "building\pbm\ticket\tbth5_12.pbm" ) REP_PPMBMP( kcell513, "building\pbm\ticket\tbth5_13.pbm" ) REP_PPMBMP( kcell514, "building\pbm\ticket\tbth5_14.pbm" ) REP_PPMBMP( kcell515, "building\pbm\ticket\tbth5_15.pbm" ) REP_PPMBMP( kcell516, "building\pbm\ticket\tbth5_16.pbm" ) REP_PPMBMP( kcell517, "building\pbm\ticket\tbth5_17.pbm" ) REP_PPMBMP( kcell518, "building\pbm\ticket\tbth5_18.pbm" ) REP_PPMBMP( kcell519, "building\pbm\ticket\tbth5_19.pbm" ) REP_PPMBMP( kcell520, "building\pbm\ticket\tbth5_20.pbm" ) REP_PPMBMP( kcell521, "building\pbm\ticket\tbth5_21.pbm" ) REP_PPMBMP( kcell522, "building\pbm\ticket\tbth5_22.pbm" ) REP_PPMBMP( kcell523, "building\pbm\ticket\tbth5_23.pbm" ) REP_PPMBMP( kcell524, "building\pbm\ticket\tbth5_24.pbm" ) REP_PPMBMP( kcell525, "building\pbm\ticket\tbth5_25.pbm" ) REP_PPMBMP( kcell526, "building\pbm\ticket\tbth5_26.pbm" ) REP_PPMBMP( kcell527, "building\pbm\ticket\tbth5_27.pbm" ) REP_PPMBMP( kcell551, "building\pbm\ticket\tbth4_1.pbm" ) REP_PPMBMP( kcell552, "building\pbm\ticket\tbth4_2.pbm" ) REP_PPMBMP( kcell553, "building\pbm\ticket\tbth4_3.pbm" ) REP_PPMBMP( kcell554, "building\pbm\ticket\tbth4_4.pbm" ) REP_PPMBMP( kcell555, "building\pbm\ticket\tbth4_5.pbm" ) REP_PPMBMP( kcell556, "building\pbm\ticket\tbth4_6.pbm" ) REP_PPMBMP( kcell557, "building\pbm\ticket\tbth4_7.pbm" ) REP_PPMBMP( kcell558, "building\pbm\ticket\tbth4_8.pbm" ) REP_PPMBMP( kcell559, "building\pbm\ticket\tbth4_9.pbm" ) REP_PPMBMP( kcell560, "building\pbm\ticket\tbth4_10.pbm" ) REP_PPMBMP( kcell561, "building\pbm\ticket\tbth4_11.pbm" ) REP_PPMBMP( kcell562, "building\pbm\ticket\tbth4_12.pbm" ) REP_PPMBMP( kcell563, "building\pbm\ticket\tbth4_13.pbm" ) REP_PPMBMP( kcell564, "building\pbm\ticket\tbth4_14.pbm" ) REP_PPMBMP( kcell565, "building\pbm\ticket\tbth4_15.pbm" ) REP_PPMBMP( kcell566, "building\pbm\ticket\tbth4_16.pbm" ) REP_PPMBMP( kcell567, "building\pbm\ticket\tbth4_17.pbm" ) REP_PPMBMP( kcell568, "building\pbm\ticket\tbth4_18.pbm" ) REP_PPMBMP( kcell569, "building\pbm\ticket\tbth4_19.pbm" ) REP_PPMBMP( kcell570, "building\pbm\ticket\tbth4_20.pbm" ) REP_PPMBMP( kcell571, "building\pbm\ticket\tbth4_21.pbm" ) REP_PPMBMP( kcell572, "building\pbm\ticket\tbth4_22.pbm" ) REP_PPMBMP( kcell573, "building\pbm\ticket\tbth4_23.pbm" ) REP_PPMBMP( kcell574, "building\pbm\ticket\tbth4_24.pbm" ) REP_PPMBMP( kcell575, "building\pbm\ticket\tbth4_25.pbm" ) REP_PPMBMP( kcell576, "building\pbm\ticket\tbth4_26.pbm" ) REP_PPMBMP( kcell577, "building\pbm\ticket\tbth4_27.pbm" ) ================================================ FILE: src/building/ticket1.seq ================================================ REP_PPMBMP( kcell1, "building\pbm\ticket\tbth1_1.pbm" ) REP_PPMBMP( kcell2, "building\pbm\ticket\tbth1_2.pbm" ) REP_PPMBMP( kcell3, "building\pbm\ticket\tbth1_3.pbm" ) REP_PPMBMP( kcell4, "building\pbm\ticket\tbth1_4.pbm" ) REP_PPMBMP( kcell5, "building\pbm\ticket\tbth1_5.pbm" ) REP_PPMBMP( kcell6, "building\pbm\ticket\tbth1_6.pbm" ) REP_PPMBMP( kcell7, "building\pbm\ticket\tbth1_7.pbm" ) REP_PPMBMP( kcell8, "building\pbm\ticket\tbth1_8.pbm" ) REP_PPMBMP( kcell9, "building\pbm\ticket\tbth1_9.pbm" ) REP_PPMBMP( kcell10, "building\pbm\ticket\tbth1_10.pbm" ) REP_PPMBMP( kcell11, "building\pbm\ticket\tbth1_11.pbm" ) REP_PPMBMP( kcell12, "building\pbm\ticket\tbth1_12.pbm" ) REP_PPMBMP( kcell13, "building\pbm\ticket\tbth1_13.pbm" ) REP_PPMBMP( kcell14, "building\pbm\ticket\tbth1_14.pbm" ) REP_PPMBMP( kcell15, "building\pbm\ticket\tbth1_15.pbm" ) REP_PPMBMP( kcell16, "building\pbm\ticket\tbth1_16.pbm" ) REP_PPMBMP( kcell17, "building\pbm\ticket\tbth1_17.pbm" ) REP_PPMBMP( kcell18, "building\pbm\ticket\tbth1_18.pbm" ) REP_PPMBMP( kcell19, "building\pbm\ticket\tbth1_19.pbm" ) REP_PPMBMP( kcell20, "building\pbm\ticket\tbth1_20.pbm" ) REP_PPMBMP( kcell21, "building\pbm\ticket\tbth1_21.pbm" ) REP_PPMBMP( kcell22, "building\pbm\ticket\tbth1_22.pbm" ) ================================================ FILE: src/building/waiting.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // ----------------------------------------------------- // Definitions for the waiting area in the lobby // ----------------------------------------------------- OBJECT( "waiting area", kgobWaiting, 0, kcrsArrow1 ) REP_PPMBMP( CHID1( krepDefault ), "building\pbm\waiting\waiting.pbm" ) CREATE_SCRIPT( "waiting: create" ) SETPALETTE( kpalSocLobby ); SETKEYS(kflgBuildingAll); PLAYMIDI( kmidLobby ); CreateChildThis( kgobNavbarLeft, kgobNavbarLeft); CreateChildThis( kgobNavbarDown, kgobNavbarDown ); CreateChildThis( kgobNavbarRight, kgobNavbarRight ); CreateChildThis( kgobLobby2m1, kgobLobby2m1 ); CreateChildThis( kgobLobby2m2, kgobLobby2m2 ); CreateChildThis( kgobLobby2m3, kgobLobby2m3 ); ENDCHUNK //------------------------------------------------------------ // Bio page hotspots //---------------------------------------------------------- OBJECT( "Biopage 25 mask", kgobLobby2m1, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\lobby\lobby3m1.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 25 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 25 ); BIO_CREATEBOOK( 25, fFalse, kgobWaiting ); End; ENDCHUNK OBJECT( "Biopage 26 mask", kgobLobby2m2, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\lobby\lobby3m2.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 26 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 26 ); BIO_CREATEBOOK( 26, fFalse, kgobWaiting ); End; ENDCHUNK OBJECT( "Biopage 27 mask", kgobLobby2m3, 0, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "building\bitmaps\lobby\lobby3m3.bmp", 0, 0 ) CLICK_SCRIPT( "mask clicked" ) If(fBIO_AVAIL( 27 ) ); // Bio Page already found PlaySoundThis(kctgWave, kwavBioAlreadyFound, 0, 0x00010000, 1, 0, ksclBldgSound); Else; BIO_MARKFOUND( 27 ); BIO_CREATEBOOK( 27, fFalse, kgobWaiting ); End; ENDCHUNK ================================================ FILE: src/engine/actor.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Actor Engine Primary Author : ***** Review Status: Reviewed Actors contain: 1. A path, pglrpt, which is a gl of route points, the nodes of the path. 2. An event list, pggaev, which is a list of variable size events occurring on or between nodes on the path. 3. A motion match list of sounds applicable during the current action. 4. State variables See Movie.doc for a detailed description of the functionality. Routes consists of one or more subroutes which can be separately translated, deleted, etc. This is a *where* based model of editing. Events occur at specified locations along the path. The path is linear between nodes. Each node represents the point at which the actor was located in the original path recording session. It is not redefined on resizing or motion fill. Instead, the event list is edited. The mouse input is however, smoothed in movie before actor is called. The one exception to events being executed based on location is the aetAdd event, which is executed at its specified time. Due to motion fill inheriting the static or non-static path property, note that it is (no longer) possible for motion fill to cause an actor to not reach the end of a subroute. Misc comments: Actors begin each subroute with the default costume, reimposed automatically by the code at every new subroute. Any initialization events are then CHANGE events, post applied via events in the event stream. When a new subroute is created, the new initialization events are copied from the previous subroute, if one exists, and from the following subroute if no previous subroute exists. Subroutes can be pushed in time by record, rerecord, & sooner/later. An actor is represented at at most one location at any given time. All events located <= _rtelCur on the path are executed at the end of any given frame. (See FGotoFrame()). Each subroute has an aetAdd event as its first event in the event list. Rotation transformations are absolute, not cumulative. The transformation effective at the current frame is stored in _xfrm. There are now two fundamentally different types of rotation. The aetRotF represent forward rotation and have path orientation applied concurrently. The aetRotH apply to static segments only and do not have path orientation post applied. _xfrm represents both, and _fUseBmat34 flags (for each frame) which transformation is to be applied when the body is positioned. The aetRotH events take precedence over aetRotF events if both exist in the same frame. This is necessary to allow the aetRotF events to control future path rotation while still allowing single frame orientation. The aetRotF events nuke the aetRotH events, however, in order to allow the user to visibly see the forward rotation currently being applied. Costume changes are per body part set. Freeze inhibits cel advancement. Step size events control floating as well as cel advancement in place. Each subpath is terminated with a step=0 and a freeze event. Each actor is visible (not hidden, though possibly out of view) between aetAdd and aetRem events. The stretch events, aetPull, do not alter step size. Uniform stretching, aetSize events, do. Move events are used to translate the path forward of the event by the delta-xyz value in the event. These are therefore cumulative, so that (unlike rotations), a move at frame 50 followed by a move at frame 20 will result in frame 50 -to- end-of-subroute being translated by the sum of the translations at frames 20 and 50. Tweak events do not translate the path, but instead change the current display location only. This code carefully maintains wysiwyg. There are two parts to this. One part is the maintenance of exact location, so that if a recorded actor follows a specific path (eg, through rather than into doorways) that path is retained exactly. A second part is that by exact locations (unaltered by numerical roundoff), a carefully edited and synchronized actor will not end up one frame off in time on replay. Both were considered high priority be design. Actors currently proceed to the end of their path, taking a potentially partial step at the end. As a result, to maintain wysiwyg, actors display at the location of aetActn and aetStep events. NOTE: This UI decision probably added more complexity to the code than it gained in UI functionality. Had actors always displayed only at full step increments, these scenarios would not include wysiwyg issues. Frame numbers are stored with the events, but are not guaranteed to be correct for frame numbers larger than current frame _nfrmCur. FComputeLifetime() guarantees these for all frames, but FComputeLifetime() can fail -> the code should not rely on future nfrm values. The route is translated by _dxyzFullRte in class ACTR. Each subroute is additionally translated by _dxyzSubRte. _dxyzRte combines the overall actor translation for efficiency only. ***************************************************************************/ #include "frame.h" #include "soc.h" ASSERTNAME RTCLASS(ACTR) /*************************************************************************** Constructor for ACTR - private. ***************************************************************************/ ACTR::ACTR(void) { _arid = aridNil; _tagTmpl.sid = ksidInvalid; _tagSnd.sid = ksidInvalid; _nfrmCur = _nfrmFirst = knfrmInvalid; _nfrmLast = klwMin; _fLifeDirty = fFalse; } /*************************************************************************** Destructor for an ACTR ***************************************************************************/ ACTR::~ACTR(void) { AssertBaseThis(0); _CloseTags(); ReleasePpo(&_pbody); ReleasePpo(&_pggaev); ReleasePpo(&_pglrpt); ReleasePpo(&_pglsmm); ReleasePpo(&_ptmpl); } /*************************************************************************** Initialize the actor The actor will not yet be grounded to any initial scene frame. ***************************************************************************/ bool ACTR::_FInit(TAG *ptagTmpl) { AssertBaseThis(0); AssertVarMem(ptagTmpl); _ptmpl = (PTMPL)vptagm->PbacoFetch(ptagTmpl, TMPL::FReadTmpl); if (pvNil == _ptmpl) return fFalse; AssertPo(_ptmpl, 0); _tagTmpl = *ptagTmpl; TAGM::DupTag(&_tagTmpl); if (!_FCreateGroups()) return fFalse; _SetStateRewound(); if (!_ptmpl->FGetGrfactn(0, &_grfactn)) return fFalse; return fTrue; } /*************************************************************************** Initialize the transformation matrix & factors (Sets the absolute scale = 1, and use the rest orientation) ***************************************************************************/ void ACTR::_InitXfrm(void) { AssertThis(0); _InitXfrmRot(&_xfrm.bmat34Fwd); _InitXfrmRot(&_xfrm.bmat34Cur); _xfrm.aevpull.rScaleX = rOne; _xfrm.aevpull.rScaleY = rOne; _xfrm.aevpull.rScaleZ = rOne; _xfrm.rScaleStep = rOne; _xfrm.xaPath = aZero; _xfrm.yaPath = aZero; _xfrm.zaPath = aZero; } /*************************************************************************** Initialize the rotation part of the transformation The rest orientation is now applied post user-rotations so that user rotations can be with respect to the actor's coordinate system ***************************************************************************/ void ACTR::_InitXfrmRot(BMAT34 *pbmat34) { AssertThis(0); AssertVarMem(pbmat34); BrMatrix34Identity(pbmat34); } /*************************************************************************** Allocate a new actor The actor is not attached to a scene until SetPscen is called. The actor will not have an identifiable ID until SetArid is called. Note that an actor which is not yet added to a scene is neither grounded in time (_nfrmFirst) nor space (_dxyzFullRte). ***************************************************************************/ PACTR ACTR::PactrNew(TAG *ptagTmpl) { AssertVarMem(ptagTmpl); PACTR pactr; if ((pactr = NewObj ACTR()) == pvNil) return pvNil; if (!pactr->_FInit(ptagTmpl)) { ReleasePpo(&pactr); return pvNil; } return pactr; } /*************************************************************************** Create the groups _pggaev, _pglrpt and _pglsmm ***************************************************************************/ bool ACTR::_FCreateGroups(void) { AssertBaseThis(0); if (pvNil == (_pggaev = GG::PggNew(size(AEV), kcaevInit, kcbVarAdd))) return fFalse; if (pvNil == (_pglrpt = GL::PglNew(size(RPT), kcrptGrow))) return fFalse; _pglrpt->SetMinGrow(kcrptGrow); if (pvNil == (_pglsmm = GL::PglNew(size(SMM), kcsmmGrow))) return fFalse; _pglsmm->SetMinGrow(kcsmmGrow); return fTrue; } /*************************************************************************** Set the owning scene and the brender world for the body. ***************************************************************************/ void ACTR::SetPscen(SCEN *pscen) { AssertBaseThis(0); AssertVarMem(pscen); Assert(_pscen == pvNil || _pscen == pscen, "SetPscen logic error"); if (_pscen != pvNil) { Assert(_pbody != pvNil, "Bad body pointer"); return; } Assert(_pbody == pvNil, "Bad body pointer"); _pscen = pscen; // Create the body parts if (pvNil == (_pbody = _ptmpl->PbodyCreate())) return; _pbody->SetBwld(pscen->Pmvie()->Pbwld()); } /*************************************************************************** Hide the Actor and initialize the Actor State Variables ***************************************************************************/ void ACTR::_InitState(void) { AssertBaseThis(0); _Hide(); _fLifeDirty = fTrue; if (_ptmpl != pvNil && _pbody != pvNil) _ptmpl->FSetDefaultCost(_pbody); _SetStateRewound(); } /*************************************************************************** Set the actor state variables to the rewound position ***************************************************************************/ void ACTR::_SetStateRewound(void) { AssertBaseThis(0); _fFrozen = fFalse; _fModeRecord = fFalse; _anidCur = _celnCur = 0; _rtelCur.irpt = 0; _rtelCur.dwrOffset = rZero; _rtelCur.dnfrm = -1; if (_pglrpt->IvMac() > 0) { RPT rpt; _pglrpt->Get(0, &rpt); _xyzCur = rpt.xyz; } _iaevCur = 0; _iaevActnCur = _iaevAddCur = ivNil; _dwrStep = rZero; _iaevFrmMin = 0; _InitXfrm(); } /*************************************************************************** Prepare the actor for display in frame nfrm. nfrm can be any frame number in the movie - it is actor independent. NOTE: The state of this actor is expected to be current for frame _nfrmCur at the time this routine is called. FGotoFrame exits with _nfrmCur == nfrm. (A scene level interrogation of all actors should find that each actor's _nfrmCur is the same). Note: The scope of fPosition dirty spans multiple calls to _FDoFrm ***************************************************************************/ bool ACTR::FGotoFrame(long nfrm, bool *pfSoundInFrame) { AssertThis(0); AssertIn(nfrm, klwMin, klwMax); bool fPositionBody; bool fSuccess = fTrue; bool fPositionDirty = fFalse; bool fQuickMethodValid; long iaevT = -1; long iaev; AEV *paev; if (nfrm == _nfrmCur) return fTrue; // Initialization if (nfrm < _nfrmCur || _nfrmCur == knfrmInvalid) { bool fMidPath = FPure(_pggaev->IvMac() > 0 && _iaevCur > 0 && nfrm > _nfrmFirst); // Note: If nfrm < _nfrmFirst, we may be adding // a new earliest add event. if (nfrm < _nfrmFirst && _fOnStage) _Hide(); if (nfrm > _nfrmFirst && _nfrmCur != knfrmInvalid) { Assert(0 < _iaevCur, "Invalid state variables in FGotoFrame()"); // Optimize if there are no events in the current frame paev = (AEV *)_pggaev->QvFixedGet(_iaevCur - 1); if (paev->nfrm < nfrm) { if (!_FQuickBackupToFrm(nfrm, &fQuickMethodValid)) return fFalse; // Vertical segments can prevent _FQuickBackupToFrm() // from being valid. If so, use default method. if (fQuickMethodValid) return fTrue; } } // Will be walking forward from the nearest earlier add event // Search backward to find it. if (fMidPath) { for (iaev = _iaevCur - 1; iaev >= 0; iaev--) { paev = (AEV *)_pggaev->QvFixedGet(iaev); if (paev->aet == aetAdd && paev->nfrm <= nfrm) { iaevT = iaev; break; } } } _SetStateRewound(); if (fMidPath) { AssertIn(iaevT, 0, _pggaev->IvMac()); _iaevFrmMin = _iaevCur = _iaevAddCur = iaevT; paev = (AEV *)_pggaev->QvFixedGet(_iaevCur); _rtelCur = paev->rtel; _nfrmCur = paev->nfrm; Assert(paev->aet == aetAdd, "Illegal _iaevAddCur state var"); _rtelCur.dnfrm--; _GetXyzFromRtel(&_rtelCur, &_xyzCur); } else { _nfrmCur = LwMin(nfrm, _nfrmFirst); } _ptmpl->FSetDefaultCost(_pbody); } else { _nfrmCur++; _iaevFrmMin = _iaevCur; // Save 1st event of this frame } if (nfrm < _nfrmFirst) return fTrue; // Trivial case: no events for this actor // _nfrmCur always reflects the movie's current frame if (_pggaev->IvMac() == 0) { _nfrmCur = nfrm; return fTrue; } while (_nfrmCur <= nfrm) { fPositionBody = (_nfrmCur == nfrm); if (!_FDoFrm(fPositionBody, &fPositionDirty, pfSoundInFrame)) fSuccess = fFalse; if (nfrm == _nfrmCur) break; _nfrmCur++; _iaevFrmMin = _iaevCur; AssertIn(_iaevActnCur, -1, _pggaev->IvMac()); } return fSuccess; } /*************************************************************************** Backup To a smaller frame. (Optimization) Return *pfQuickMethodValid fTrue on success. Return *pfQuickMethodValid fFalse to if this method invalid here. ***************************************************************************/ bool ACTR::_FQuickBackupToFrm(long nfrm, bool *pfQuickMethodValid) { AssertThis(0); AssertVarMem(pfQuickMethodValid); Assert(nfrm < _nfrmCur, "Illegal call to _FBackupToFrm"); long ifrm; RTEL rtelT; XYZ xyzOld = _xyzCur; XYZ xyzT; long dnfrm = _nfrmCur - nfrm; #ifdef DEBUG AEV *paev; paev = (AEV *)_pggaev->QvFixedGet(_iaevCur - 1); Assert(paev->nfrm < nfrm, "Invalid Call to _FQuickBackupToFrm()"); #endif // DEBUG // Don't try to back up during frames beyond the actor's lifetime if (nfrm >= _nfrmLast) { // GotoFrame() must always exit with _nfrmCur being valid // Otherwise, edits will be located at incorrect frames _nfrmCur = nfrm; #ifdef BUG1906 _rtelCur.dnfrm -= dnfrm; #else //! BUG1906 _rtelCur.dnfrm--; #endif //! BUG1906 return fTrue; } // There are no events between here and the destination frame // _iaevFrmMin need not change // Walk to the destination location // Set the cel of the action for (ifrm = _nfrmCur - 1; ifrm >= nfrm; ifrm--) { if (!_FGetRtelBack(&_rtelCur, fTrue)) goto LFail; } _GetXyzFromRtel(&_rtelCur, &_xyzCur); _nfrmCur = nfrm; if (dnfrm > 1 || xyzOld.dxr != _xyzCur.dxr || xyzOld.dzr != _xyzCur.dzr) { // Check for transitions to vertical motion if (!_FGetRtelBack(&rtelT, fFalse)) goto LFail; _GetXyzFromRtel(&rtelT, &xyzT); if (_xyzCur.dxr == xyzT.dxr && _xyzCur.dzr == xyzT.dzr) { // Vertical motion next (backing up) // -> Require _fUseBmat34Cur == fTrue, but bmat34Cur is not // yet computed. // -> Quick backup insufficient. *pfQuickMethodValid = fFalse; return fTrue; } } // Send motion match sounds to Msq to play if (!(_pscen->GrfScen() & fscenSounds) && (nfrm <= _nfrmLast) && _fOnStage) _FEnqueueSmmInMsq(); // Ignore failure // Position the actor _PositionBody(&_xyzCur); if (_fOnStage) { if (!_ptmpl->FSetActnCel(_pbody, _anidCur, _celnCur, pvNil)) goto LFail; } *pfQuickMethodValid = fTrue; return fTrue; LFail: *pfQuickMethodValid = fFalse; return fFalse; } /*************************************************************************** Compute xyz for one step backwards from the current location, as per state variables ***************************************************************************/ bool ACTR::_FGetRtelBack(RTEL *prtel, bool fUpdateStateVar) { AssertThis(0); AssertVarMem(prtel); long celnSav = _celnCur; long nfrmSav = _nfrmCur; RTEL rtelSav = _rtelCur; AEV *paev; BRS dwrStep; RTEL rtelAdd; BRS dwrT; paev = (AEV *)_pggaev->QvFixedGet(_iaevAddCur); rtelAdd = paev->rtel; if (!_fFrozen) _celnCur--; if (rZero == _dwrStep || (rtelAdd.irpt == _rtelCur.irpt && rtelAdd.dwrOffset == _rtelCur.dwrOffset)) { _nfrmCur--; _rtelCur.dnfrm--; goto LEnd; } // Set the location to display this actor if (!_FGetDwrPlay(&dwrStep)) goto LFail; dwrT = BrsSub(_rtelCur.dwrOffset, dwrStep); if (dwrT >= rZero) _rtelCur.dwrOffset = dwrT; else { RPT rpt; while (dwrT < rZero) { if (_rtelCur.irpt <= 0) { Bug("Corrupted event list"); _rtelCur.irpt = 0; dwrT = rZero; break; } _rtelCur.irpt--; _pglrpt->Get(_rtelCur.irpt, &rpt); dwrT = BrsAdd(rpt.dwr, dwrT); } _rtelCur.dwrOffset = dwrT; } _nfrmCur--; LEnd: *prtel = _rtelCur; if (!fUpdateStateVar) { _celnCur = celnSav; _nfrmCur = nfrmSav; _rtelCur = rtelSav; } return fTrue; LFail: _celnCur = celnSav; _nfrmCur = nfrmSav; _rtelCur = rtelSav; return fFalse; } /*************************************************************************** Update the internal actor state variables to frame _nfrmCur. Ready the actor to display in frame _nfrmCur if fPositionBody is fTrue. Sets *pfPositionDirty if a change is encountered. Clears *pfPositionDirty after updating Brender. Assumes previous frame correctly rendered. Note: PositionBody is delayed until after Events are processed - Tweak, Actn, Step and Transform events all can alter the location or orientation. Also, new Action Events precede Cel Positioning Note: The scope of *pfPositionDirty spans multiple _FDoFrm calls ***************************************************************************/ bool ACTR::_FDoFrm(bool fPositionBody, bool *pfPositionDirty, bool *pfSoundInFrame) { AssertThis(0); AssertVarMem(pfPositionDirty); AEV aev; BRS dwr; long iaev; long iaevAdd; bool fEndRoute; XYZ xyzOld = _xyzCur; bool fFreezeThisCel = _fFrozen; bool fEndSubEvents = fFalse; bool fSuccess = fTrue; bool fAdvanceCel; // Obtain distance to move. This may be shortened on encountering // a aetActn event later in this same frame. fSuccess = _FGetDwrPlay(&dwr); _AdvanceRtel(dwr, &_rtelCur, _iaevCur, _nfrmCur, &fEndRoute); _GetXyzFromRtel(&_rtelCur, &_xyzCur); // Use the pre-path rotation matrix if the actor moves // so that the path orientation can later be post applied. _fUseBmat34Cur = (dwr == rZero || (xyzOld.dxr == _xyzCur.dxr && xyzOld.dzr == _xyzCur.dzr)); // Locate the next Add event before entering the next loop // Add events are executed when their absolute frame number == _nfrmCur if (!_fModeRecord) { iaevAdd = _iaevCur - 1; while (_FFindNextAevAet(aetAdd, iaevAdd + 1, &iaevAdd)) { if (!_FIsAddNow(iaevAdd)) break; // Add is now _iaevCur = iaevAdd; if (!_FDoAevCur()) return fFalse; *pfPositionDirty = fTrue; } // Process any events through a dwr step size, unless an aetActn event // shortens that distance. // An aetActn Event will change _rtelCur at the time it is executed for (iaev = _iaevCur; iaev < _pggaev->IvMac(); iaev++) { _pggaev->GetFixed(iaev, &aev); if (aev.aet == aetAdd) { if (!_FIsAddNow(iaev)) break; // Add is now if (!_FDoAevCur()) return fFalse; *pfPositionDirty = fTrue; continue; } if (aev.rtel > _rtelCur) break; if (aetRotF == aev.aet || aetSize == aev.aet || aetPull == aev.aet || aetRotH == aev.aet || aetMove == aev.aet) { // The xyz position is not necessarily changing. // Specifically enforce Brender updating *pfPositionDirty = fTrue; } else if ((aetActn == aev.aet) || (aetAdd == aev.aet)) { // Do not increment _celnCur before displaying actor on new entrance/action fFreezeThisCel = fTrue; *pfPositionDirty = fTrue; } if (pfSoundInFrame != pvNil && aev.aet == aetSnd && fPositionBody) *pfSoundInFrame = fTrue; // Non-motion match sounds cannot depend on playing here as // there might not be a sound event at the ending frame. // Therefore _FDoAevCur() does not enqueue motion match sounds. // It enters mm-snds in the smm. _FDoAevCur() enqueues non-mm snds. if (aev.aet != aetSnd || (fPositionBody && !(_pscen->GrfScen() & fscenSounds))) { // Play non sounds // Play sounds if this is the final frame (mm or non mm) if (!_FDoAevCur()) fSuccess = fFalse; } else { // Motion match sounds must be entered in the smm // whether this is the final frame or not AEVSND aevsnd; _pggaev->Get(iaev, &aevsnd); if (aevsnd.celn != smmNil) { if (!_FDoAevCur()) fSuccess = fFalse; } else { // Skip the current sound event _iaevCur++; } } } } fEndSubEvents = _FIsDoneAevSub(_iaevCur, _rtelCur); fAdvanceCel = (!fFreezeThisCel && !(fEndRoute && fEndSubEvents)); if (fAdvanceCel) { _celnCur++; if (_ccelCur > 1) *pfPositionDirty = fTrue; } // Force Brender to update if the xyz position has changed if (xyzOld != _xyzCur) *pfPositionDirty = fTrue; // Position even if hidden for clipping region detection // fPositionBody avoids extraneous positioning on intermed frames if (fPositionBody) { // Enqueue the motion match sounds from the smm. Ie, enter in the msq if (!(_pscen->GrfScen() & fscenSounds) && (_nfrmCur <= _nfrmLast) && _fOnStage) _FEnqueueSmmInMsq(); if (*pfPositionDirty) { _PositionBody(&_xyzCur); *pfPositionDirty = fFalse; } // Position the actor in the next cel // Do not do so if at the "end of route" & "end of events" if (_fOnStage) { if (!_ptmpl->FSetActnCel(_pbody, _anidCur, _celnCur, pvNil)) fSuccess = fFalse; } } else if (*pfPositionDirty) { BMAT34 bmat34; _MatrixRotUpdate(&_xyzCur, &bmat34); } return fSuccess; } /*************************************************************************** FReplayFrame : Replays the sound for the current frame -> Re-enqueues sounds for the current frame grfscen - Things that are supposed to be played right now. ***************************************************************************/ bool ACTR::FReplayFrame(long grfscen) { AssertThis(0); AEV aev; long iaev; // Check if there is anything to do if (!(grfscen & fscenSounds) || !_fOnStage) return fTrue; for (iaev = _iaevFrmMin; iaev < _iaevCur; iaev++) { _pggaev->GetFixed(iaev, &aev); if (aev.aet != aetSnd) continue; if (!_FDoAevCore(iaev)) return fFalse; } // Also send any motion match sounds to msq to play return _FEnqueueSmmInMsq(); } /*************************************************************************** _FGetStatic : Returns true/false on success/failure Returns the bool value in *pfStatic ***************************************************************************/ bool ACTR::_FGetStatic(long anid, bool *pfStatic) { AssertThis(0); AssertIn(anid, 0, klwMax); AssertVarMem(pfStatic); ulong grfactn; if (!_ptmpl->FGetGrfactn(anid, &grfactn)) return fFalse; if (ivNil == _iaevActnCur) { *pfStatic = fTrue; return fTrue; } *pfStatic = FPure(grfactn & factnStatic); return fTrue; } /*************************************************************************** Is the actor in the last active frame of the subroute? ***************************************************************************/ bool ACTR::_FIsDoneAevSub(long iaev, RTEL rtel) { AssertBaseThis(0); AssertIn(iaev, 0, _pggaev->IvMac() + 1); AEV aev; if (iaev == _pggaev->IvMac()) return fTrue; for (; iaev < _pggaev->IvMac(); iaev++) { _pggaev->GetFixed(iaev, &aev); if (aev.aet == aetAdd) return fTrue; if (aev.rtel > rtel) return fFalse; // Event at current frame. Keep looking. } // No further events exist at future frames for this subpath return fTrue; } /*************************************************************************** Is the actor at an AddOnStage event which can be applied now? ***************************************************************************/ bool ACTR::_FIsAddNow(long iaev) { AssertBaseThis(0); AssertIn(iaev, 0, _pggaev->IvMac()); AEV *paev; if (_fLifeDirty) { // Update the nfrm values if (!_FComputeLifetime()) return fFalse; } Assert(_pggaev->Cb(iaev) == size(AEVADD), "Corrupt event list"); paev = (AEV *)_pggaev->QvFixedGet(iaev); if (paev->nfrm <= _nfrmCur) return fTrue; return fFalse; } /*************************************************************************** Return functional (sized) step size when playing Zero is a valid return value ***************************************************************************/ bool ACTR::_FGetDwrPlay(BRS *pdwr) { AssertBaseThis(0); AssertVarMem(pdwr); *pdwr = rZero; if (kdwrNil == _dwrStep) { if (!_ptmpl->FGetDwrActnCel(_anidCur, _celnCur, pdwr)) return fFalse; } else { *pdwr = _dwrStep; } *pdwr = BrsMul(*pdwr, _xfrm.rScaleStep); return fTrue; } /*************************************************************************** Return functional (sized) step size when recording. The returned size is expected to be authored > 0 ***************************************************************************/ bool ACTR::_FGetDwrRecord(BRS *pdwr) { AssertBaseThis(0); AssertVarMem(pdwr); *pdwr = rZero; if (!_ptmpl->FGetDwrActnCel(_anidCur, _celnCur, pdwr)) return fFalse; *pdwr = BrsMul(*pdwr, _xfrm.rScaleStep); return fTrue; } /*************************************************************************** Execute the current event. State Variables are updated. ***************************************************************************/ bool ACTR::_FDoAevCur(void) { AssertBaseThis(0); if (!_FDoAevCore(_iaevCur)) return fFalse; _iaevCur++; Assert(_iaevCur <= _pggaev->IvMac(), "_iaevCur bug"); return fTrue; } /*************************************************************************** Execute the event iaev. ***************************************************************************/ bool ACTR::_FDoAevCore(long iaev) { AssertBaseThis(0); AssertIn(iaev, 0, _pggaev->IvMac()); AEV aev; COST cost; _pggaev->GetFixed(iaev, &aev); if (aev.nfrm != _nfrmCur) { aev.nfrm = _nfrmCur; _pggaev->PutFixed(iaev, &aev); } AssertIn(aev.aet, 0, aetLim); switch (aev.aet) { case aetActn: AEVACTN aevactn; ulong grfactn; _pggaev->Get(iaev, &aevactn); // Empty the motion match sound list if the action if (aevactn.anid != _anidCur) _pglsmm->FSetIvMac(0); if (!_ptmpl->FSetActnCel(_pbody, aevactn.anid, aevactn.celn)) { return fFalse; } _celnCur = aevactn.celn; _anidCur = aevactn.anid; if (!_ptmpl->FGetCcelActn(_anidCur, &_ccelCur)) // Cache the cel count return fFalse; _iaevActnCur = iaev; // Force the location to the step event // Avoids incorrect event ordering on static segments _rtelCur = aev.rtel; _GetXyzFromRtel(&_rtelCur, &_xyzCur); if (!_ptmpl->FGetGrfactn(_anidCur, &grfactn)) { return fFalse; } _grfactn = grfactn; break; case aetAdd: AEVADD aevadd; RPT rpt; // Save old costume in case of error if (!cost.FGet(_pbody)) return fFalse; // Invoke the default costume/orientation if (!_ptmpl->FSetDefaultCost(_pbody)) return fFalse; // Put the actor on stage. Set up models. if (!_ptmpl->FSetActnCel(_pbody, _anidCur, _celnCur)) { cost.Set(_pbody); // restore old costume return fFalse; } // Empty the motion match sound list _pglsmm->FSetIvMac(0); // Set the translation for the subroute _pggaev->Get(iaev, &aevadd); _dxyzSubRte.dxr = aevadd.dxr; _dxyzSubRte.dyr = aevadd.dyr; _dxyzSubRte.dzr = aevadd.dzr; _UpdateXyzRte(); // Load the initial orientation _InitXfrm(); _LoadAddOrien(&aevadd); // Set state variables _iaevFrmMin = _iaevAddCur = iaev; _rtelCur = aev.rtel; _GetXyzFromRtel(&_rtelCur, &_xyzCur); _pglrpt->Get(aev.rtel.irpt, &rpt); // Show the actor if (!_fOnStage) _pbody->Show(); _fOnStage = fTrue; break; case aetRem: // Exit the actor from the stage _Hide(); break; case aetCost: AEVCOST aevcost; _pggaev->Get(iaev, &aevcost); if (aevcost.fCmtl) { PCMTL pcmtl = _ptmpl->PcmtlFetch(aevcost.cmid); if (pvNil == pcmtl) return fFalse; _pbody->SetPartSetCmtl(pcmtl); ReleasePpo(&pcmtl); } else { PMTRL pmtrl; pmtrl = (PMTRL)vptagm->PbacoFetch(&aevcost.tag, MTRL::FReadMtrl); if (pvNil == pmtrl) return fFalse; _pbody->SetPartSetMtrl(aevcost.ibset, pmtrl); ReleasePpo(&pmtrl); } break; case aetRotF: // Actors are xformed in _FDoFrm, Rotate or Scale _pggaev->Get(iaev, &_xfrm.bmat34Fwd); _fUseBmat34Cur = fFalse; break; case aetRotH: // Actors are xformed in _FDoFrm, Rotate or Scale _pggaev->Get(iaev, &_xfrm.bmat34Cur); _fUseBmat34Cur = fTrue; break; case aetPull: // Actors are xformed in _FDoFrm, Rotate or Scale _pggaev->Get(iaev, &_xfrm.aevpull); break; case aetSize: // Actors are xformed in _FDoFrm, Rotate or Scale _pggaev->Get(iaev, &_xfrm.rScaleStep); break; case aetStep: // Exists for timing control (eg walk in place) _pggaev->Get(iaev, &_dwrStep); // Force the location to the step event // Avoids incorrect event ordering on static segments if (rZero == _dwrStep) { _rtelCur = aev.rtel; _GetXyzFromRtel(&_rtelCur, &_xyzCur); } break; case aetFreeze: long fFrozen; //_fFrozen is a bit _pggaev->Get(iaev, &fFrozen); _fFrozen = FPure(fFrozen); break; case aetTweak: if (aev.rtel.dnfrm == _rtelCur.dnfrm) _pggaev->Get(iaev, &_xyzCur); // The actual locating of the actor is done in _FDoFrm or FTweakRoute break; case aetSnd: // Enqueue non-mm sounds if (!_FEnqueueSnd(iaev)) // Ignore failure return fFalse; break; case aetMove: XYZ dxyz; _pggaev->Get(iaev, &dxyz); _dxyzSubRte.dxr = BrsAdd(dxyz.dxr, _dxyzSubRte.dxr); _dxyzSubRte.dyr = BrsAdd(dxyz.dyr, _dxyzSubRte.dyr); _dxyzSubRte.dzr = BrsAdd(dxyz.dzr, _dxyzSubRte.dzr); _UpdateXyzRte(); break; default: Bug("Unimplemented actor event"); } return fTrue; } /*************************************************************************** Add the specified event to the event list at the current frame, and execute the event NOTE: Overwrites events of the same type if appropriate NOTE: If the new action event is the same as the most recent previous action, the new action is still inserted. This avoids repositioning the actor based on a past Set Action. ***************************************************************************/ bool ACTR::_FAddDoAev(long aetNew, long cbNew, void *pvVar) { AssertBaseThis(0); AssertIn(aetNew, 0, aetLim); AssertIn(cbNew, 0, 100); // approximate upper bound AssertPvCb(pvVar, cbNew); Assert(_fOnStage || aetNew == aetAdd, "Error! Beginning subroute with no Add Onstage event"); AEV aev; long iaevNew; // Setup fixed part of the gg aev.aet = aetNew; aev.rtel = _rtelCur; aev.nfrm = _nfrmCur; if (!_FInsertAev(_iaevCur, cbNew, pvVar, &aev)) return fFalse; _MergeAev(_iaevFrmMin, _iaevCur, &iaevNew); #ifdef BUG1870 // REVIEW *****: V2.0 // Though the only situation in which this arises is aetMove, // it might be that the FDoAevCore() should be called before // merging events (so that any cumulative changes get executed // only once, without requiring this special casing of aetMove. if (aetMove == aetNew) { // Skip the "do" of the FAddDoAev(). // The 'Do' part currently merges events before // executing them, which in this case would cause // any existing same frame translaton to be added // to the state variables twice. // Instead, adjust state var translation here. _dxyzSubRte.dxr = BrsAdd(((XYZ *)pvVar)->dxr, _dxyzSubRte.dxr); _dxyzSubRte.dyr = BrsAdd(((XYZ *)pvVar)->dyr, _dxyzSubRte.dyr); _dxyzSubRte.dzr = BrsAdd(((XYZ *)pvVar)->dzr, _dxyzSubRte.dzr); } else if (!_FDoAevCore(iaevNew)) return fFalse; #else //! BUG1870 if (!_FDoAevCore(iaevNew)) return fFalse; #endif //! BUG1870 if (_iaevCur == iaevNew) _iaevCur++; _pscen->MarkDirty(); Assert(aetNew != aetActn || _iaevActnCur == iaevNew, "_iaevActnCur not up to date"); AssertIn(_iaevCur, 0, _pggaev->IvMac() + 1); Assert(!(_pggaev->IvMac() == 1 && _nfrmFirst != _nfrmCur), "check case"); if (_nfrmCur < _nfrmFirst) { _pscen->InvalFrmRange(); _nfrmFirst = _nfrmCur; } if (_nfrmCur > _nfrmLast) { _pscen->InvalFrmRange(); _nfrmLast = _nfrmCur; } AssertThis(fobjAssertFull); return fTrue; } /*************************************************************************** Merge event iaevNew among preceding events, beginning with event iaevFirst (which is usually the first event in the frame). Unless equal to pvNil, Return *piaevRtn to be the final index of the merged event NOTE: Add events (only) are not merged. ***************************************************************************/ void ACTR::_MergeAev(long iaevFirst, long iaevNew, long *piaevRtn) { AssertBaseThis(0); AssertIn(iaevFirst, 0, _pggaev->IvMac()); AssertIn(iaevNew, iaevFirst, _pggaev->IvMac()); AssertNilOrVarMem(piaevRtn); AEV aev; AEV aevNew; void *pvVar; long cbVar; long iaev; BMAT34 bmat34; if ((_pggaev->IvMac() < iaevFirst) || (iaevFirst == iaevNew)) { if (pvNil != piaevRtn) *piaevRtn = iaevNew; return; } _pggaev->GetFixed(iaevNew, &aevNew); // // Check if Aev is in the list already // for (iaev = iaevFirst; iaev < iaevNew; iaev++) { _pggaev->GetFixed(iaev, &aev); if ((aev.aet != aevNew.aet) && (aev.aet != aetRem) && (aev.aet != aetRotH)) continue; switch (aev.aet) { case aetRem: if (aevNew.aet == aetAdd && aevNew.nfrm != aev.nfrm) { _RemoveAev(iaev); iaevNew--; iaev--; } break; case aetAdd: // We cannot remove events associated with a same-frame Add event // or we will not retain costume etc information to propogate // forward (eg drag single pt actor offstage & roll call back) continue; break; case aetMove: // Move is accumulation of previous moves XYZ dxyz; XYZ dxyzNew; _pggaev->Get(iaev, &dxyz); _pggaev->Get(iaevNew, &dxyzNew); // Note: Merging moves should not alter state variables! #ifndef BUG1870 // Remove these lines of code _dxyzSubRte.dxr = BrsSub(_dxyzSubRte.dxr, dxyz.dxr); _dxyzSubRte.dyr = BrsSub(_dxyzSubRte.dyr, dxyz.dyr); _dxyzSubRte.dzr = BrsSub(_dxyzSubRte.dzr, dxyz.dzr); #endif //! BUG1870 dxyz.dxr = BrsAdd(dxyz.dxr, dxyzNew.dxr); dxyz.dyr = BrsAdd(dxyz.dyr, dxyzNew.dyr); dxyz.dzr = BrsAdd(dxyz.dzr, dxyzNew.dzr); _pggaev->Put(iaev, &dxyz); goto LDeleteNew; break; case aetCost: AEVCOST aevcost; AEVCOST aevcostNew; // Check that the body parts match _pggaev->Get(iaev, &aevcost); _pggaev->Get(iaevNew, &aevcostNew); if (aevcost.ibset != aevcostNew.ibset) continue; if (aev.rtel != aevNew.rtel) goto LDeleteOld; _pggaev->Put(iaev, &aevcostNew); goto LDeleteNew; break; case aetSnd: AEVSND aevsnd; AEVSND aevsndNew; long ismm; SMM *psmm; // Check that the sound types match _pggaev->Get(iaev, &aevsnd); _pggaev->Get(iaevNew, &aevsndNew); if (MSND::SqnActr(aevsnd.sty, _arid) != MSND::SqnActr(aevsndNew.sty, _arid)) continue; // Queued sounds need to have multiple events reside in a single frame if (aevsndNew.fQueue) continue; // Non queued sounds need to replace queued sounds of the same type // First, the _pggsmm needs to be updated for (ismm = 0; ismm < _pglsmm->IvMac(); ismm++) { psmm = (SMM *)_pglsmm->QvGet(ismm); if (psmm->aevsnd.sty == aevsnd.sty && aevsnd.celn == psmm->aevsnd.celn) { _pglsmm->Delete(ismm); break; } } _RemoveAev(iaev); iaevNew--; iaev--; continue; break; case aetRotH: if (aevNew.aet == aetRotF && aevNew.nfrm == aev.nfrm) { // Forward rotations must get rid of tweak rotations in the current frame _RemoveAev(iaev); iaevNew--; iaev--; } if (aevNew.aet != aetRotH) continue; if (aev.rtel != aevNew.rtel) goto LDeleteOld; _pggaev->Get(iaevNew, &bmat34); _pggaev->Put(iaev, &bmat34); goto LDeleteNew; break; case aetRotF: // New == old == forward-rotate // Need to replace the old rotation, but continue on to remove tweak-rotations _RemoveAev(iaev); iaevNew--; iaev--; continue; break; default: if (aev.rtel != aevNew.rtel) { goto LDeleteOld; } pvVar = _pggaev->QvGet(iaevNew, &cbVar); Assert(cbVar == _pggaev->Cb(iaev), "Wrong Var size"); _pggaev->Put(iaev, pvVar); goto LDeleteNew; } } // // Leave it where it is. No match found. // if (pvNil != piaevRtn) *piaevRtn = iaevNew; return; LDeleteNew: if (pvNil != piaevRtn) { *piaevRtn = iaev; AssertIn(iaev, iaevFirst, iaevNew); } _RemoveAev(iaevNew); return; LDeleteOld: _RemoveAev(iaev); iaevNew--; if (pvNil != piaevRtn) *piaevRtn = iaevNew; } /*************************************************************************** Add (or replace) an action Add the event to the event list ***************************************************************************/ bool ACTR::FSetActionCore(long anid, long celn, bool fFreeze) { AssertThis(0); AssertIn(anid, 0, klwMax); AssertIn(celn, klwMin, klwMax); bool fStatic; bool fNewAction = fFalse; AEVACTN aevactn; long anidPrev = _anidCur; long iaevMin; long cbVar = kcbVarActn + kcbVarFreeze + (kcbVarStep * 2); if (!_pggaev->FEnsureSpace(4, cbVar, fgrpNil)) return fFalse; if (!_FGetStatic(anid, &fStatic)) return fFalse; // If the action is changing: // Remove all motion match sounds of the previous action // Query the template and insert new sound events if (_anidCur != anid) { fNewAction = fTrue; if (!_FRemoveAevMm(anid)) return fFalse; } // var part of gg aevactn.anid = anid; aevactn.celn = celn; // Add this action to the event list iaevMin = (_iaevFrmMin == _iaevAddCur) ? _iaevFrmMin + 1 : _iaevFrmMin; _PrepActnFill(iaevMin, _anidCur, anid, faetTweak | faetFreeze | faetActn); if (!_FAddDoAev(aetActn, kcbVarActn, &aevactn)) return fFalse; // If the action is changing: // Query the template and insert new default motion match sound events if (fNewAction) { if (!_FAddAevDefMm(anid)) return fFalse; } if (_nfrmCur != _nfrmLast) { _fLifeDirty = fTrue; _pscen->InvalFrmRange(); } if (!fFreeze && !_FIsDoneAevSub(_iaevCur, _rtelCur)) { if (!_FUnfreeze()) return fFalse; } else { if (!_FFreeze()) return fFalse; } // If the actor is in the middle of a static segment, the application of a // non-static action is supposed to make the actor start moving forward along // the remaining path. // The last frame in the subpath must retain its final step=0 event, however. if (!fStatic && !_ptmpl->FIsTdt() && !_FIsDoneAevSub(_iaevCur, _rtelCur)) { if (!FSetStep(kdwrNil)) return fFalse; } return fTrue; } /*************************************************************************** Remove an actor from the stage NOTE: This is a low level API and has no effect on the event list ***************************************************************************/ void ACTR::_Hide(void) { AssertBaseThis(0); if (_fOnStage && _pbody != pvNil) _pbody->Hide(); _fOnStage = fFalse; return; } /*************************************************************************** Insert a node point *prpt in the route. Update *prpt.dwr, and the previous node's dwr. On input: *prpt.dwr == 0 iff the new node is a subpath terminating node *prpt.xyz has the new node coordinates dwrPrior is the distance from the previous node to the new one. ***************************************************************************/ bool ACTR::_FInsertGgRpt(long irpt, RPT *prpt, BRS dwrPrior) { AssertBaseThis(0); AssertIn(irpt, 0, _pglrpt->IvMac() + 1); AssertNilOrVarMem(prpt); RPT rpt; BRS dwrTotal = rZero; // Dist from prev node to node after the inserted node if (!_pglrpt->FInsert(irpt, prpt)) return fFalse; if (0 < irpt) { _pglrpt->Get(irpt - 1, &rpt); dwrTotal = rpt.dwr; // Do not alter end of route dwr's if (rZero != rpt.dwr) { // Adjust the distance from the previous point here rpt.dwr = dwrPrior; if (rZero == rpt.dwr) rpt.dwr = rEps; // Epsilon. Prevent pathological incorrect end-of-path _pglrpt->Put(irpt - 1, &rpt); } else Assert(dwrPrior == rZero, "Illegal distance"); } if (irpt < _pglrpt->IvMac() - 1) { _pglrpt->Get(irpt + 1, &rpt); if (rZero != prpt->dwr) // If not at end of subroute { // Set the distance to the next point in this subroute Assert(rZero != dwrTotal, "Overwriting end of route"); prpt->dwr = BrsSub(dwrTotal, dwrPrior); if (rZero >= prpt->dwr) prpt->dwr = rEps; // Epsilon. Prevent pathological incorrect end-of-path _pglrpt->Put(irpt, prpt); } } else Assert(rZero == prpt->dwr, "Invalid end sub-node dwr"); return fTrue; } /*************************************************************************** Set a Stepsize Event Add it to the event list dwrStep == 0 -> Stop the actor from forward motion. dwrStep == kdwrNil -> Use the scaled template step size Note that this is orthogonal and independent of freezing an actor ***************************************************************************/ bool ACTR::FSetStep(BRS dwrStep) { AssertThis(0); Assert(kdwrNil == dwrStep || rZero <= dwrStep, "Invalid dwrStep argument"); if (!_pggaev->FEnsureSpace(1, kcbVarStep, fgrpNil)) return fFalse; return _FAddDoAev(aetStep, kcbVarStep, &dwrStep); } /*************************************************************************** Get the new origin for the to-be positioned actor. Always place actors on the "floor" (Y = 0)...except 3-D Text actors, which are at Y = 1.0 meters. ***************************************************************************/ void ACTR::_GetNewOrigin(BRS *pxr, BRS *pyr, BRS *pzr) { AssertThis(0); AssertVarMem(pxr); AssertVarMem(pyr); AssertVarMem(pzr); BRS xrCam = rZero; BRS yrCam = rZero; BRS zrCam = kzrDefault; BRS zrYon, zrHither; BMAT34 bmat34Cam; _pscen->Pbkgd()->GetActorPlacePoint(pxr, pyr, pzr); // A (0, 0, 0) place point means that one hasn't been authored yet, // so use the old system. if (*pxr == rZero && *pyr == rZero && *pzr == rZero) { _pscen->Pmvie()->Pbwld()->GetCamera(&bmat34Cam, &zrHither, &zrYon); Assert(zrCam < 0, "Non-negative placement value"); Assert(zrHither >= 0 && zrYon >= 0, "Negative camera values"); if (BR_ABS(zrCam) > zrYon) zrCam = BR_CONST_DIV(BR_ADD(zrYon, zrHither), -2); *pxr = BR_MAC3(xrCam, bmat34Cam.m[0][0], yrCam, bmat34Cam.m[1][0], zrCam, bmat34Cam.m[2][0]) + bmat34Cam.m[3][0]; *pyr = rZero; *pzr = BR_MAC3(xrCam, bmat34Cam.m[0][2], yrCam, bmat34Cam.m[1][2], zrCam, bmat34Cam.m[2][2]) + bmat34Cam.m[3][2]; } if (_ptmpl->FIsTdt()) *pyr += BR_SCALAR(10.0); // 1.0 meters } /*************************************************************************** Add actor on the stage - ie, create a new subroute. Add the Add event to the event list Nukes existing subroute if obsoleted by current Add. Add the initialization events for costumes, xforms, etc from the preceding or subsequent subroute. ***************************************************************************/ bool ACTR::FAddOnStageCore(void) { AssertThis(0); BRS xr; BRS yr; BRS zr; long cbVar; AEVADD aevadd; bool fUpdateFrmRange = fFalse; cbVar = kcbVarAdd + kcbVarActn + kcbVarStep + kcbVarFreeze; if (_pggaev->IvMac() == 0) { if (!_pggaev->FEnsureSpace(4, cbVar, fgrpNil) || !_pglrpt->FEnsureSpace(1, fgrpNil)) return fFalse; } else { cbVar += kcbVarCost + kcbVarRot + kcbVarSize + kcbVarPull; if (!_pggaev->FEnsureSpace(8, cbVar, fgrpNil) || !_pglrpt->FEnsureSpace(1, fgrpNil)) { return fFalse; } } _GetNewOrigin(&xr, &yr, &zr); aevadd.dxr = BrsSub(xr, _dxyzFullRte.dxr); aevadd.dyr = BrsSub(yr, _dxyzFullRte.dyr); aevadd.dzr = BrsSub(zr, _dxyzFullRte.dzr); aevadd.xa = aevadd.za = aZero; // Rotate the actor to be facing the camera // NOTE: 3D spletter code uses this also. aevadd.ya = _pscen->Pbkgd()->BraRotYCamera(); if (_nfrmCur < _nfrmFirst) { fUpdateFrmRange = fTrue; _nfrmFirst = _nfrmCur; } if (_nfrmCur > _nfrmLast) { fUpdateFrmRange = fTrue; _nfrmLast = _nfrmCur; } RPT rptNil = {rZero, rZero, rZero, rZero}; if (_fOnStage) // May have walked offstage { // Delete the remnant subroute (non-inclusive of current frame) _DeleteFwdCore(fFalse); } _rtelCur.dnfrm = 0; _rtelCur.dwrOffset = rZero; if (_iaevAddCur < 0) _rtelCur.irpt = 0; else _rtelCur.irpt++; AssertDo(_FInsertGgRpt(_rtelCur.irpt, &rptNil), "Logic error"); _AdjustAevForRteIns(_rtelCur.irpt, 0); _GetXyzFromRtel(&_rtelCur, &_xyzCur); if (!_FAddDoAev(aetAdd, kcbVarAdd, &aevadd)) return fFalse; // Copy costume and transform events forward if this is // the earliest Add event : each subroute needs all // initialization events. // Note: _iaevCur is already incremented at this point if (1 == _iaevCur) { // The earliest Add. Gather later events and insert them if (!_FAddAevFromLater()) return fFalse; } else { // Not the earliest Add. Gather earlier events and insert them ulong grfaet = faetActn | faetCost | faetPull | faetSize | faetRotF; if (!_FAddAevFromPrev(_iaevCur - 1, grfaet)) return fFalse; } _PositionBody(&_xyzCur); if (!FSetStep(rZero)) return fFalse; if (!_FFreeze()) return fFalse; if (fUpdateFrmRange) { _pscen->InvalFrmRange(); } return fTrue; } /*************************************************************************** Collect events < iaevLim & insert them beginning at event number _iaevCur. NOTE: The primary complication is to OMIT copying events which can never be reached due to static actions (stalling) in the previous subroute. Due to initialization now spec'd to occur in every subroute, note that only the immediately preceding subroute is of concern. NOTE: This is optimized to add only the latest event of each given type. ***************************************************************************/ bool ACTR::_FAddAevFromPrev(long iaevLim, ulong grfaet) { AssertBaseThis(0); AssertIn(iaevLim, 0, _pggaev->IvMac() + 1); AEV aev; AEV *paev; AEV aevCur; long cb; long iaev; long iaevAdd; long iaevNew; long iaevLast; bool fPrunedPrevSubrte = fFalse; // Locate the next active (not stalled) region of the subroute // Note: Not finding a previous aev is not a failure _FFindPrevAevAet(aetAdd, iaevLim, &iaevAdd); _FindAevLastSub(iaevAdd, iaevLim, &iaevLast); _pggaev->GetFixed(_iaevCur - 1, &aevCur); // It is more efficient to insert non-costume events backwards for (iaev = iaevLast; iaev > iaevAdd; iaev--) { if (0 == grfaet) break; Assert(iaev >= 0, "Logic error"); _pggaev->GetFixed(iaev, &aev); if (!(grfaet & (1 << aev.aet)) || aev.aet == aetCost) continue; // Non-costume events are added only once grfaet ^= (1 << aev.aet); // Allocate space cb = _pggaev->Cb(iaev); aev.rtel = aevCur.rtel; // aev.nfrm is set by _FDoAevCore() if (!_FInsertAev(_iaevCur, cb, pvNil, &aev)) return fFalse; // Insert event _pggaev->Put(_iaevCur, _pggaev->QvGet(iaev)); // Merge events to avoid duplicates _MergeAev(_iaevFrmMin, _iaevCur, &iaevNew); if (!_FDoAevCore(iaevNew)) return fFalse; if (iaevNew == _iaevCur) _iaevCur++; } if (!(grfaet & (1 << aetCost))) return fTrue; // Costumes needed to be gathered forward for (iaev = iaevAdd + 1; iaev <= iaevLast; iaev++) { _pggaev->GetFixed(iaev, &aev); if (aev.aet != aetCost) continue; aev.rtel = aevCur.rtel; // aev.nfrm is set by _FDoAevCore() // Allocate space cb = _pggaev->Cb(iaev); if (!_FInsertAev(_iaevCur, cb, pvNil, &aev)) return fFalse; // Insert event _pggaev->Put(_iaevCur, _pggaev->QvGet(iaev)); // Merge events to avoid duplicates _MergeAev(_iaevFrmMin, _iaevCur, &iaevNew); if (!_FDoAevCore(iaevNew)) return fFalse; if (iaevNew == _iaevCur) _iaevCur++; } // Remove redundant (same frame) events from previous Add if (iaevAdd < 0) return fTrue; // May need to delete entire previous subroute // if the prev Add occurred at the same frame paev = (AEV *)_pggaev->QvFixedGet(iaevAdd); if (_nfrmCur == paev->nfrm) { // Deleting the entire subroute _DelAddFrame(iaevAdd, _iaevAddCur); return fTrue; } // May need to prune out same-frame events from prev subrte for (iaev = _iaevAddCur - 1; iaev >= iaevAdd; iaev--) { paev = (AEV *)_pggaev->QvFixedGet(iaev); if (_nfrmCur == paev->nfrm) { fPrunedPrevSubrte = fTrue; _RemoveAev(iaev); } } if (fPrunedPrevSubrte) { // The previous path requires pruning // Terminating stop & freeze events need to be inserted long nfrm = _nfrmCur; if (!FGotoFrame(_nfrmCur - 1)) return fFalse; DeleteFwdCore(fFalse, pvNil, _iaevCur); return FGotoFrame(nfrm); } return fTrue; } /*************************************************************************** Gather the initialization events of the subsequent subroute and insert them at the current event index, _iaevCur. ***************************************************************************/ bool ACTR::_FAddAevFromLater(void) { AssertBaseThis(0); AEV aev; long iaev; long iaevStart = -1; RTEL rtelAdd; bool fPositionBody = fFalse; Assert(1 == _iaevCur, "_FAddAevFromLater logic error"); // Find the next Add event for (iaev = _iaevCur; iaev < _pggaev->IvMac(); iaev++) { _pggaev->GetFixed(iaev, &aev); if (aev.aet == aetAdd) { iaevStart = iaev; rtelAdd = aev.rtel; break; } } if (iaevStart < 0) goto LEnd; // Stuff in the events from this next Add event for (iaev = iaevStart; iaev < _pggaev->IvMac(); iaev++) { _pggaev->GetFixed(iaev, &aev); if (aev.rtel != rtelAdd) { break; } if (aetCost == aev.aet || aetPull == aev.aet || aetSize == aev.aet || aetRotF == aev.aet) { aev.rtel = _rtelCur; // aev.nfrm is set by _FDoAevCore() // Allocate space long cbNew = _pggaev->Cb(iaev); if (!_FInsertAev(_iaevCur, cbNew, pvNil, &aev)) return fFalse; iaev++; // Insert event _pggaev->Put(_iaevCur, _pggaev->QvGet(iaev)); if (!_FDoAevCur()) return fFalse; if (aev.aet != aetCost) fPositionBody = fTrue; } } if (fPositionBody) { _PositionBody(&_xyzCur); } Assert(_pggaev->IvMac() > 0, "Logic Error"); LEnd: return FSetActionCore(0, 0, 0); } /*************************************************************************** Locate the event of type aet with index closest to but smaller than iaevCur Return true if found, with its index in *piaevAdd ***************************************************************************/ bool ACTR::_FFindPrevAevAet(long aet, long iaevCur, long *piaevAdd) { AssertBaseThis(0); AssertIn(aet, 0, aetLim); AssertIn(iaevCur, 0, _pggaev->IvMac()); AssertVarMem(piaevAdd); AEV aev; iaevCur--; for (; iaevCur >= 0; iaevCur--) { _pggaev->GetFixed(iaevCur, &aev); if (aev.aet == aet) { *piaevAdd = iaevCur; return fTrue; } } *piaevAdd = ivNil; return fFalse; } /*************************************************************************** Locate the event of type aet with index closest to but >= iaevCur. Return true if one is found, with its index in *piaevAdd ***************************************************************************/ bool ACTR::_FFindNextAevAet(long aet, long iaevCur, long *piaevAdd) { AssertBaseThis(0); AssertIn(aet, 0, aetLim); AssertIn(iaevCur, 0, _pggaev->IvMac() + 1); AssertVarMem(piaevAdd); AEV *paev; for (; iaevCur < _pggaev->IvMac(); iaevCur++) { paev = (AEV *)_pggaev->QvFixedGet(iaevCur); if (paev->aet == aet) { *piaevAdd = iaevCur; return fTrue; } } *piaevAdd = ivNil; return fFalse; } /*************************************************************************** Locate the last reachable event in the specified subroute Note: This is complicated by static actions. Input: Begin the search at iaevAdd. The limit of the search is iaevLim, which, if == ivNil, is the extent of the ggaev. Return its index in *piaevAdd ***************************************************************************/ void ACTR::_FindAevLastSub(long iaevAdd, long iaevLim, long *piaevLast) { AssertBaseThis(0); AssertIn(iaevAdd, 0, _pggaev->IvMac()); if (iaevLim != ivNil) AssertIn(iaevLim, 0, _pggaev->IvMac() + 1); AssertVarMem(piaevLast); AEV aev; if (iaevLim == ivNil) iaevLim = _pggaev->IvMac(); _pggaev->GetFixed(iaevLim - 1, &aev); if (_FIsStalled(iaevAdd, &aev.rtel, piaevLast)) { // Last active event stored by _FIsStalled return; } *piaevLast = iaevLim - 1; } /*************************************************************************** Remove the actor from the stage Add the event to the event list ***************************************************************************/ bool ACTR::FRemFromStageCore(void) { AssertThis(0); AEV *paev; if (!_fOnStage) return fTrue; if (!_pggaev->FEnsureSpace(1, kcbVarStep, fgrpNil)) // step return fFalse; AssertIn(_iaevAddCur, 0, _pggaev->IvMac()); paev = (AEV *)_pggaev->QvFixedGet(_iaevAddCur); if (_nfrmCur == paev->nfrm) { if (!_FDeleteEntireSubrte()) return fFalse; } if (_fOnStage) return _FAddDoAev(aetRem, kcbVarZero, pvNil); return fTrue; } /*************************************************************************** Delete the current entire subroute & reposition actor accordingly. Based on current state variables ***************************************************************************/ bool ACTR::_FDeleteEntireSubrte(void) { AssertThis(0); AEV *paev; long nfrmSav; paev = (AEV *)_pggaev->QvFixedGet(_iaevAddCur); Assert(paev->nfrm == _nfrmCur, "Logic error: trying to delete whole route from the middle"); // Delete forward from here (exclusive of current point) _DeleteFwdCore(fFalse, pvNil, _iaevCur); // Delete events & path for the sole remaining Add frame _DelAddFrame(_iaevAddCur, _iaevCur); // A hide should be done separately from event execution // because no subroute exists in this case _Hide(); if (_ptmpl != pvNil && _pbody != pvNil) _ptmpl->FSetDefaultCost(_pbody); _SetStateRewound(); nfrmSav = _nfrmCur; _nfrmCur = knfrmInvalid; if (_pggaev->IvMac() > 0) { paev = (AEV *)_pggaev->QvFixedGet(0); Assert(paev->aet == aetAdd, "Corrupt event list"); _nfrmFirst = paev->nfrm; return FGotoFrame(nfrmSav); } _nfrmFirst = knfrmInvalid; return fTrue; } /*************************************************************************** Delete the events and point corresponding to a single point subroute ***************************************************************************/ void ACTR::_DelAddFrame(long iaevAdd, long iaevLim) { AssertThis(0); long iaev; long irptAdd; AEV *paev; AssertIn(iaevAdd, 0, iaevLim); paev = (AEV *)_pggaev->QvFixedGet(iaevAdd); irptAdd = paev->rtel.irpt; // Delete events in current frame of subroute for (iaev = iaevLim - 1; iaev >= iaevAdd; iaev--) { _RemoveAev(iaev); } // Delete current point if unused if (iaevAdd > 0) { paev = (AEV *)_pggaev->QvFixedGet(iaevAdd - 1); if (paev->rtel.irpt == irptAdd || (paev->rtel.irpt == (irptAdd - 1) && paev->rtel.dwrOffset > rZero)) { return; } } _AdjustAevForRteDel(irptAdd, iaevAdd); _pglrpt->Delete(irptAdd); if (_rtelCur.irpt > irptAdd) _rtelCur.irpt--; return; } /*************************************************************************** Set the Costume for a body part Add the event to the event list ***************************************************************************/ bool ACTR::FSetCostumeCore(long ibsetClicked, TAG *ptag, long cmid, tribool fCmtl) { AssertThis(0); Assert(fCmtl || ibsetClicked >= 0, "Invalid ibsetClicked argument"); AssertVarMem(ptag); AEVCOST aevcost; PCMTL pcmtl; long ibsetApply; // For custom materials, the ibset is a property of the CMTL itself, // so read it from the CMTL rather than using the clicked ibset. if (fCmtl) { pcmtl = _ptmpl->PcmtlFetch(cmid); if (pvNil == pcmtl) return fFalse; ibsetApply = pcmtl->Ibset(); ReleasePpo(&pcmtl); } else { ibsetApply = ibsetClicked; } aevcost.ibset = ibsetApply; aevcost.tag = *ptag; aevcost.cmid = cmid; aevcost.fCmtl = fCmtl; if (!_pggaev->FEnsureSpace(1, kcbVarCost, fgrpNil)) return fFalse; _PrepCostFill(_iaevCur, &aevcost); if (!_FAddDoAev(aetCost, kcbVarCost, &aevcost)) return fFalse; return fTrue; } /*************************************************************************** Freeze the actor (don't advance cels) Add the event to the event list ***************************************************************************/ bool ACTR::_FFreeze(void) { AssertThis(0); long faevfrz = (long)fTrue; return _FAddDoAev(aetFreeze, kcbVarFreeze, &faevfrz); } /*************************************************************************** Unfreeze the actor Add the event to the event list ***************************************************************************/ bool ACTR::_FUnfreeze(void) { AssertThis(0); long faevfrz = (long)fFalse; return _FAddDoAev(aetFreeze, kcbVarFreeze, &faevfrz); } /*************************************************************************** Modify the add event to re-orient the actor The add event retains the single point orientation. On Input: If pxyz == pvNil, no averaging is done in orientation grfbra are the flags indicating angles of rotation. In directions in which no rotation has taken place, the wa are invalid. WARNING: Rotations are non-abelian. Ordering is x then y then z. If ordering other than this is desired, separate calls must be made. ***************************************************************************/ void ACTR::SetAddOrient(BRA xa, BRA ya, BRA za, ulong grfbra, XYZ *pdxyz) { AssertThis(0); AssertIn(_iaevAddCur, 0, _pggaev->IvMac()); AEVADD aevadd; _pggaev->Get(_iaevAddCur, &aevadd); if (pvNil == pdxyz) { aevadd.xa = xa; aevadd.ya = ya; aevadd.za = za; } else { BRS rWeight; BRS dwrNew = BR_LENGTH3(pdxyz->dxr, pdxyz->dyr, pdxyz->dzr); rWeight = BrsDiv(dwrNew, kdwrFast); rWeight = LwBound(rWeight, krOriWeightMin, rOne); if (grfbra & fbraRotateX) aevadd.xa = _BraAvgAngle(xa, aevadd.xa, rWeight); if (grfbra & fbraRotateY) aevadd.ya = _BraAvgAngle(ya, aevadd.ya, rWeight); if (grfbra & fbraRotateZ) aevadd.za = _BraAvgAngle(za, aevadd.za, rWeight); } // Modify the event _pggaev->Put(_iaevAddCur, &aevadd); _xfrm.xaPath = aevadd.xa; _xfrm.yaPath = aevadd.ya; _xfrm.zaPath = aevadd.za; } /*************************************************************************** Average two angles by (rw1 * a1 + (1-rw1)*a2) rw1 is the weighting for a1 ***************************************************************************/ BRA ACTR::_BraAvgAngle(BRA a1, BRA a2, BRS rw1) { AssertBaseThis(0); AssertIn(rw1, rZero, rOne + rEps); BRS rT = rZero; BRS r1 = BrAngleToScalar(a1); BRS r2 = BrAngleToScalar(a2); BRS rw2; rw2 = BrsSub(rOne, rw1); // Compensate for averaging across 0 degrees if (BrsAbs(BrsSub(r1, r2)) > rOneHalf) { if (r2 > r1) { // Add equiv of 360 degrees for each weight of r1 rT = BrsAdd(rT, rw1); } else { // Add equiv of 360 degrees for each weight of r1 rT = BrsAdd(rT, rw2); } } rT = BrsAdd(rT, BrsMul(r1, rw1)); rT = BrsAdd(rT, BrsMul(r2, rw2)); if (rT > rOne) rT = rT & rFractMax; return (BrScalarToAngle(rT)); } /*************************************************************************** Rotate the actor Add the event to the event list If !fFromHereFwd, the rotation is to apply to the current frame only WARNING: Rotations are non-abelian. Ordering is x then y then z. If ordering other than this is desired, separate calls must be made. ***************************************************************************/ bool ACTR::FRotate(BRA xa, BRA ya, BRA za, bool fFromHereFwd) { AssertThis(0); BMAT34 *pbmat34; long aet; if (!_pggaev->FEnsureSpace(1, kcbVarRot, fgrpNil)) return fFalse; if (fFromHereFwd) { aet = aetRotF; pbmat34 = &_xfrm.bmat34Fwd; if (_fUseBmat34Cur) // _xfrm.bmat34Cur has last been used { // _xfrm.bmat34Cur stores the complete (no path added) orientation BrMatrix34Copy(pbmat34, &_xfrm.bmat34Cur); // Back the path orientation out from this matrix. // Otherwise the actor will jump in angle // This MUST be done in z then y then x order // Note: matrix inversion unnecessary if (_xfrm.zaPath != aZero) BrMatrix34PostRotateZ(pbmat34, -_xfrm.zaPath); if (_xfrm.yaPath != aZero) BrMatrix34PostRotateY(pbmat34, -_xfrm.yaPath); if (_xfrm.xaPath != aZero) BrMatrix34PostRotateX(pbmat34, -_xfrm.xaPath); } } else { // _xfrm.bmat34Cur is kept current at frames so that // rotations can be post applied to it aet = aetRotH; pbmat34 = &_xfrm.bmat34Cur; } if (aZero != xa) { BrMatrix34PreRotateX(pbmat34, xa); } if (aZero != ya) { BrMatrix34PreRotateY(pbmat34, ya); } if (aZero != za) { BrMatrix34PreRotateZ(pbmat34, za); } Assert(_iaevCur <= _pggaev->IvMac(), "_iaevCur bug"); // Add the event if (fFromHereFwd) _PrepXfrmFill(aetRotF, pbmat34, kcbVarRot, _iaevCur, ivNil, faetNil); AssertDo(_FAddDoAev(aet, kcbVarRot, pbmat34), "Ensure space insufficient"); _PositionBody(&_xyzCur); return fTrue; } /*************************************************************************** "Normalize" the actor The revert tool Insert normalize transformation events into the event list ***************************************************************************/ bool ACTR::FNormalizeCore(ulong grfnorm) { AssertThis(0); long rScaleStepOld = _xfrm.rScaleStep; ulong faet; long cbVar = 0; if (grfnorm & fnormRotate) cbVar += kcbVarRot; if (grfnorm & fnormSize) cbVar += kcbVarSize + kcbVarPull; if (!_pggaev->FEnsureSpace(3, cbVar, fgrpNil)) return fFalse; if (grfnorm & fnormRotate) { _InitXfrmRot(&_xfrm.bmat34Fwd); _InitXfrmRot(&_xfrm.bmat34Cur); _PrepXfrmFill(aetRotF, &_xfrm.bmat34Fwd, kcbVarRot, _iaevCur); AssertDo(_FAddDoAev(aetRotF, kcbVarRot, &_xfrm.bmat34Fwd), "EnsureSpace insufficient"); } if (grfnorm & fnormSize) { _xfrm.aevpull.rScaleX = rOne; _xfrm.aevpull.rScaleY = rOne; _xfrm.aevpull.rScaleZ = rOne; faet = (_xfrm.rScaleStep != rOne) ? faetTweak : faetNil; _xfrm.rScaleStep = rOne; _PrepXfrmFill(aetPull, &_xfrm.aevpull, kcbVarPull, _iaevCur); _PrepXfrmFill(aetSize, &_xfrm.rScaleStep, kcbVarSize, _iaevCur, ivNil, faet); AssertDo(_FAddDoAev(aetPull, kcbVarPull, &_xfrm.aevpull), "EnsureSpace insufficient"); AssertDo(_FAddDoAev(aetSize, kcbVarSize, &_xfrm.rScaleStep), "EnsureSpace insufficient"); // Possibly extend life of actor if shrunk if (rScaleStepOld > rOne && pvNil != _pscen && _rtelCur.irpt < _pglrpt->IvMac() - 1) // optimization { _fLifeDirty = fTrue; _pscen->InvalFrmRange(); } } Assert(_iaevCur <= _pggaev->IvMac(), "_iaevCur bug"); _PositionBody(&_xyzCur); return fTrue; } /*************************************************************************** Scale the actor. Add the event to the event list Bound the allowable scaling. Note that the stepsize and the actor lifetime is then subject to change, with the attendent specified tweak etc modifications. ***************************************************************************/ bool ACTR::FScale(BRS rScale) { AssertThis(0); ulong faet = faetNil; long rScaleStep; long rScaleStepOld = _xfrm.rScaleStep; if (!_pggaev->FEnsureSpace(1, kcbVarSize, fgrpNil)) return fFalse; rScale = LwBound(rScale, krScaleMinFactor, krScaleMaxFactor); rScaleStep = BrsMul(_xfrm.rScaleStep, rScale); _xfrm.rScaleStep = LwBound(rScaleStep, krScaleMin, krScaleMax); // Remove tweaks when a transformation that changes stepsize occurs faet = (_xfrm.rScaleStep != rScale) ? faetTweak : faetNil; _PrepXfrmFill(aetSize, &_xfrm.rScaleStep, kcbVarSize, _iaevCur, ivNil, faet); if (!_FAddDoAev(aetSize, kcbVarSize, &_xfrm.rScaleStep)) return fFalse; Assert(_iaevCur <= _pggaev->IvMac(), "_iaevCur bug"); if (_xfrm.rScaleStep != rScale) _GetXyzFromRtel(&_rtelCur, &_xyzCur); _PositionBody(&_xyzCur); // Possibly extend life of actor if shrunk if (rScaleStepOld != _xfrm.rScaleStep && pvNil != _pscen && _rtelCur.irpt < _pglrpt->IvMac() - 1) // optimization { _fLifeDirty = fTrue; _pscen->InvalFrmRange(); } return fTrue; } /*************************************************************************** Drag the actor forwards or backwards in time NOTE** Drag this subroute only -> sliding other subroutes in time ***************************************************************************/ bool ACTR::FSoonerLater(long dnfrm) { AssertThis(0); AEV aev; AEV *paevPrev; long nfrmSav; long iaev; long fSuccess; long dnfrmSub; long dnfrmT; if (0 == dnfrm) return fTrue; if (_fLifeDirty) { if (!_FComputeLifetime(pvNil)) PushErc(ercSocBadFrameSlider); } Assert(_iaevAddCur >= 0, "Invalid value for _iaevAddCur"); // On a Sooner operation, slide the earlier subroutes // backward in time if (dnfrm < 0) { dnfrmT = (-dnfrm); // The times of past events need to be correct. for (iaev = _iaevCur - 1; dnfrmT > 0 && iaev >= 0; iaev--) { _pggaev->GetFixed(iaev, &aev); if (aev.aet != aetAdd || iaev == 0) { aev.nfrm -= dnfrmT; _pggaev->PutFixed(iaev, &aev); continue; } // Account for subroute gaps paevPrev = (AEV *)_pggaev->QvFixedGet(iaev - 1); dnfrmSub = aev.nfrm - (paevPrev->nfrm); aev.nfrm -= dnfrmT; _pggaev->PutFixed(iaev, &aev); dnfrmT -= (dnfrmSub - 1); } } else { // Later dnfrmT = dnfrm; for (iaev = _iaevAddCur; dnfrmT > 0 && iaev < _pggaev->IvMac(); iaev++) { _pggaev->GetFixed(iaev, &aev); if (aev.aet != aetAdd || iaev == _iaevAddCur) { nfrmSav = aev.nfrm; aev.nfrm += dnfrmT; _pggaev->PutFixed(iaev, &aev); continue; } // Adjust for the gap between subroutes dnfrmSub = aev.nfrm - nfrmSav; dnfrmT -= (dnfrmSub - 1); if (dnfrmT <= 0) break; aev.nfrm += dnfrmT; _pggaev->PutFixed(iaev, &aev); } } _pggaev->GetFixed(0, &aev); _nfrmFirst = aev.nfrm; _pggaev->GetFixed(_pggaev->IvMac() - 1, &aev); _nfrmLast = aev.nfrm; _nfrmCur += dnfrm; // Invalidate, but do not recompute the range _pscen->InvalFrmRange(); if (fSuccess = _pscen->FGotoFrm(_pscen->Nfrm() + dnfrm)) { _pscen->Pmvie()->Pmcc()->UpdateScrollbars(); } return fSuccess; } /*************************************************************************** Pull, stretch, squash the actor. Add the event to the event list Bound the allowable scaling. ***************************************************************************/ bool ACTR::FPull(BRS rScaleX, BRS rScaleY, BRS rScaleZ) { AssertThis(0); BRS rScaleXT; BRS rScaleYT; BRS rScaleZT; if (!_pggaev->FEnsureSpace(1, kcbVarPull, fgrpNil)) return fFalse; rScaleX = LwBound(rScaleX, krScaleMinFactor, krScaleMaxFactor); rScaleY = LwBound(rScaleY, krScaleMinFactor, krScaleMaxFactor); rScaleZ = LwBound(rScaleZ, krScaleMinFactor, krScaleMaxFactor); rScaleXT = BrsMul(_xfrm.aevpull.rScaleX, rScaleX); rScaleYT = BrsMul(_xfrm.aevpull.rScaleY, rScaleY); rScaleZT = BrsMul(_xfrm.aevpull.rScaleZ, rScaleZ); _xfrm.aevpull.rScaleX = LwBound(rScaleXT, krPullMin, krPullMax); _xfrm.aevpull.rScaleY = LwBound(rScaleYT, krPullMin, krPullMax); _xfrm.aevpull.rScaleZ = LwBound(rScaleZT, krPullMin, krPullMax); _PrepXfrmFill(aetPull, &_xfrm.aevpull, kcbVarPull, _iaevCur); if (!_FAddDoAev(aetPull, kcbVarPull, &_xfrm.aevpull)) return fFalse; Assert(_iaevCur <= _pggaev->IvMac(), "_iaevCur bug"); _PositionBody(&_xyzCur); return fTrue; } /*************************************************************************** Translate one point of the actor's path Add an event to the event list The (dxr,dyr,dzr) passed in is a delta distance from the previous location (set by GoToFrame, ie, determined by _rtelCur). ***************************************************************************/ bool ACTR::FTweakRoute(BRS dxr, BRS dyr, BRS dzr, ulong grfmaf) { AssertThis(0); XYZ xyz; if (!_pggaev->FEnsureSpace(1, kcbVarTweak, fgrpNil)) return fFalse; xyz.dxr = BrsAdd(_xyzCur.dxr, dxr); xyz.dyr = BrsAdd(_xyzCur.dyr, dyr); xyz.dzr = BrsAdd(_xyzCur.dzr, dzr); if ((grfmaf & fmafGround) && (BrsAdd(_xyzCur.dyr, _dxyzRte.dyr) >= rZero) && (BrsAdd(xyz.dyr, _dxyzRte.dyr) < rZero)) { xyz.dyr = -_dxyzRte.dyr; } if (!_FAddDoAev(aetTweak, kcbVarTweak, &xyz)) return fFalse; _PositionBody(&xyz); return fTrue; } /*************************************************************************** Update xyzRte from the overall origin & the subroute translation ***************************************************************************/ void ACTR::_UpdateXyzRte(void) { AssertBaseThis(0); _dxyzRte.dxr = BrsAdd(_dxyzFullRte.dxr, _dxyzSubRte.dxr); _dxyzRte.dyr = BrsAdd(_dxyzFullRte.dyr, _dxyzSubRte.dyr); _dxyzRte.dzr = BrsAdd(_dxyzFullRte.dzr, _dxyzSubRte.dzr); } /*************************************************************************** Move the current subroute. (Compose tool) If fmafOrient is set, the actor is oriented and moved. If fmafEntireSubrte is set, this does not add an event to the aev list. It alters the data in the Add event & _dxyzSubRte. Return fTrue. If fmafEntireScene is set, _dxyzFullRte is modified. Return fTrue. If !fmafEntireSubrte && !fmafEntireScene, a move event is added to the event list. This can therefore fail. Return success or failure Return *pfmoved indicating whether or not the path moved. ***************************************************************************/ bool ACTR::FMoveRoute(BRS dxr, BRS dyr, BRS dzr, bool *pfMoved, ulong grfmaf) { AssertThis(0); AssertNilOrVarMem(pfMoved); AEVADD aevadd; AEV *paev; long iaev; bool fMoved; ulong grfbra; XYZ dxyz; BRS yrCurOld; BRA xa; BRA ya; BRA za; fMoved = (rZero != dxr || rZero != dyr || rZero != dzr); if (pvNil != pfMoved) *pfMoved = fMoved; if (!fMoved) return fTrue; if (!_pggaev->FEnsureSpace(2, kcbVarMove + kcbVarRot, fgrpNil)) return fFalse; // Edit dyr to respect ground yrCurOld = BrsAdd(_xyzCur.dyr, _dxyzRte.dyr); if (FPure(grfmaf & fmafGround) && (yrCurOld >= rZero) && (BrsAdd(dyr, yrCurOld) < rZero)) { dyr = BrsSub(rZero, yrCurOld); } // Update Actor's orientation if (FPure(grfmaf & fmafOrient) && !_ptmpl->FIsTdt()) { dxyz.dxr = dxr; dxyz.dyr = dyr; dxyz.dzr = dzr; // Back the path orientation out from this matrix & replace // with new orientation if (_xfrm.zaPath != aZero) BrMatrix34PostRotateZ(&_xfrm.bmat34Cur, -_xfrm.zaPath); if (_xfrm.yaPath != aZero) BrMatrix34PostRotateY(&_xfrm.bmat34Cur, -_xfrm.yaPath); if (_xfrm.xaPath != aZero) BrMatrix34PostRotateX(&_xfrm.bmat34Cur, -_xfrm.xaPath); _ApplyRotFromVec(&dxyz, pvNil, &xa, &ya, &za, &grfbra); SetAddOrient(xa, ya, za, grfbra, &dxyz); // Force speed to be inversely proportional to angular rotation if (_iaevAddCur != ivNil) { BRS dwra, drxa, drya, drza; BRS ra1, ra2; #ifdef DEBUG { AEV *paev; paev = (AEV *)_pggaev->QvFixedGet(_iaevAddCur); Assert(_nfrmCur == paev->nfrm, "Unsupported use of fmafOrient"); } #endif // DEBUG // Set dwra = angular change (in scalar form) _pggaev->Get(_iaevAddCur, &aevadd); ra1 = BrAngleToScalar(xa); ra2 = BrAngleToScalar(aevadd.xa); drxa = BrsAbs(BrsSub(ra1, ra2)); if (drxa > rOneHalf) { if (ra2 > ra1) ra1 = BrsAdd(rOne, ra1); else ra2 = BrsAdd(rOne, ra2); drxa = BrsAbs(BrsSub(ra1, ra2)); } ra1 = BrAngleToScalar(ya); ra2 = BrAngleToScalar(aevadd.ya); drya = BrsAbs(BrsSub(ra1, ra2)); if (drya > rOneHalf) { if (ra2 > ra1) ra1 = BrsAdd(rOne, ra1); else ra2 = BrsAdd(rOne, ra2); drya = BrsAbs(BrsSub(ra1, ra2)); } ra1 = BrAngleToScalar(za); ra2 = BrAngleToScalar(aevadd.za); drza = BrsAbs(BrsSub(ra1, ra2)); if (drza > rOneHalf) { if (ra2 > ra1) ra1 = BrsAdd(rOne, ra1); else ra2 = BrsAdd(rOne, ra2); drza = BrsAbs(BrsSub(ra1, ra2)); } dwra = BR_LENGTH3(drxa, drya, drza); // Compute a bounded inverse of the angular change dwra = LwBound(dwra, krAngleMin, krAngleMax); dwra = BrsDiv(BrsRcp(dwra), krAngleMinRcp); AssertIn(dwra, rZero, BrsAdd(rOne, rEps)); // Adjust the distances dxr = BrsMul(dxr, dwra); dyr = BrsMul(dyr, dwra); dzr = BrsMul(dzr, dwra); } // _xfrm.bmat34Cur is to hold the current full rotation _LoadAddOrien(&aevadd, fTrue); // Update any type of rotate event in this frame for (iaev = _iaevAddCur + 1; iaev < _iaevCur; iaev++) { paev = (AEV *)_pggaev->QvFixedGet(iaev); if (aetRotH == paev->aet) _pggaev->Put(iaev, &_xfrm.bmat34Cur); if (aetRotF == paev->aet) { // Insert orientation-rotation event if (!_FAddDoAev(aetRotH, kcbVarRot, &_xfrm.bmat34Cur)) { Bug("Should have ensured space"); return fFalse; } } } } // Update actor's position if (FPure(grfmaf & fmafEntireScene)) { _dxyzFullRte.dxr = BrsAdd(dxr, _dxyzFullRte.dxr); _dxyzFullRte.dyr = BrsAdd(dyr, _dxyzFullRte.dyr); _dxyzFullRte.dzr = BrsAdd(dzr, _dxyzFullRte.dzr); } else { if (_iaevAddCur == ivNil) return fFalse; if (!FPure(grfmaf & fmafEntireSubrte)) { // Move actor just from this frame on (this subpath only) // Note: FAddDoAev will update _dxyzSubRte dxyz.dxr = dxr; dxyz.dyr = dyr; dxyz.dzr = dzr; if (!_FAddDoAev(aetMove, kcbVarMove, &dxyz)) return fFalse; } else { // Translating whole subroute #ifdef DEBUG long cbVar = _pggaev->Cb(_iaevAddCur); Assert(cbVar == kcbVarAdd, "Corrupt aev"); #endif // DEBUG // Adjust the translation state variables _dxyzSubRte.dxr = BrsAdd(dxr, _dxyzSubRte.dxr); _dxyzSubRte.dyr = BrsAdd(dyr, _dxyzSubRte.dyr); _dxyzSubRte.dzr = BrsAdd(dzr, _dxyzSubRte.dzr); // Adjust the position in the add event _pggaev->Get(_iaevAddCur, &aevadd); aevadd.dxr = BrsAdd(aevadd.dxr, dxr); aevadd.dyr = BrsAdd(aevadd.dyr, dyr); aevadd.dzr = BrsAdd(aevadd.dzr, dzr); _pggaev->Put(_iaevAddCur, &aevadd); } } _UpdateXyzRte(); _pscen->MarkDirty(); // Update Brender model fMoved = FPure(rZero != dxr || rZero != dyr || rZero != dzr); if (fMoved) _PositionBody(&_xyzCur); return fTrue; } /*************************************************************************** Load starting point orientation into state variable _xfrm ***************************************************************************/ void ACTR::_LoadAddOrien(AEVADD *paevadd, bool fNoReset) { AssertThis(0); // Set _xfrm.bmat34Cur always holds the current full rotation if (!fNoReset) _InitXfrmRot(&_xfrm.bmat34Cur); BrMatrix34PostRotateX(&_xfrm.bmat34Cur, paevadd->xa); BrMatrix34PostRotateY(&_xfrm.bmat34Cur, paevadd->ya); BrMatrix34PostRotateZ(&_xfrm.bmat34Cur, paevadd->za); _xfrm.xaPath = paevadd->xa; _xfrm.yaPath = paevadd->ya; _xfrm.zaPath = paevadd->za; } /*************************************************************************** Remove redundant events of a targeted type. (Actor uses this for Xfrm editing) NOTE***: This is not valid for Actn or Cost fill. Special case routines exist for those event types. This is called _before_ inserting the new event. Note: For transforms, this code will rarely have effect unless the client uses discretized increments of observable size, ie, it is statistically unlikely that a match of the same size will be found. This code was requested in anticipation of discretized increments. Input: aet == the event type *pvVar == the variable part of the new event being inserted cbVar == the size of the variable part iaevMin == the first possible event to delete iaevCmp == ivNil or the event being replaced grfaet == faetNil or types of events to nuke along the way ***************************************************************************/ void ACTR::_PrepXfrmFill(long aet, void *pvVar, long cbVar, long iaevMin, long iaevCmp, ulong grfaet) { AssertBaseThis(0); Assert(aet == aetSize || aet == aetRotF || aet == aetPull, "Illegal argument aet"); AssertPvCb(pvVar, cbVar); AssertIn(cbVar, 0, 100); // Approximate bound AssertIn(iaevMin, 0, _pggaev->IvMac() + 1); AssertIn(iaevCmp, -1, _pggaev->IvMac() + 1); Assert(aet != aetActn && aet != aetCost, "Illegal aet argument"); long iaev; AEV aev; bool fReplacePrev = fTrue; void *pvVarCmp = pvNil; long cb; _pggaev->Lock(); if (ivNil != iaevCmp) { pvVarCmp = _pggaev->QvGet(iaevCmp, &cb); Assert(cb == cbVar, "Logic error"); } else { // Locate the most current event of this type // and store the ptr in pvVarCmp for (iaev = 0; iaev < iaevMin - 1; iaev++) { _pggaev->GetFixed(iaev, &aev); if (aet != aev.aet) continue; pvVarCmp = _pggaev->QvGet(iaev, &cb); Assert(cb == cbVar, "Logic error"); } } if (pvNil == pvVarCmp) pvVarCmp = pvVar; for (iaev = iaevMin; iaev < _pggaev->IvMac(); iaev++) { bool fDelete = fFalse; _pggaev->GetFixed(iaev, &aev); // Stage entrance events are boundaries to edits if (aetAdd == aev.aet) goto LEnd; switch (aev.aet) { case aetSize: case aetPull: case aetRotF: void *pv1; void *pv2; if (aev.aet != aet) continue; if (fReplacePrev) { pv1 = pvVarCmp; pv2 = _pggaev->QvGet(iaev); if (fcmpEq != FcmpCompareRgb(pv1, pv2, cbVar)) { // Prepare to test for a match with new event fReplacePrev = fFalse; pvVarCmp = pvVar; fDelete = fFalse; } else { fDelete = fTrue; goto LDelete; } } Assert(!fReplacePrev, "Logic Error"); pv1 = pvVarCmp; pv2 = _pggaev->QvGet(iaev); if (fcmpEq != FcmpCompareRgb(pv1, pv2, cbVar)) goto LEnd; // Events equal : delete event at iaev fDelete = fTrue; break; case aetTweak: if ((grfaet & faetTweak) && (aev.rtel >= _rtelCur)) fDelete = fTrue; break; case aetRotH: if ((grfaet & faetRotF) && (aev.rtel == _rtelCur)) fDelete = fTrue; break; case aetFreeze: if ((grfaet & faetFreeze) && (aev.rtel >= _rtelCur)) fDelete = fTrue; break; case aetStep: if ((grfaet & faetStep) && (aev.rtel >= _rtelCur)) fDelete = fTrue; ; break; default: break; } LDelete: if (fDelete) { _RemoveAev(iaev); iaev--; } } LEnd: _pggaev->Unlock(); } /*************************************************************************** Insert Aev. Update state variables Since _pggaev is getting a copy of a tag, a call to DupTag is required ***************************************************************************/ bool ACTR::_FInsertAev(long iaev, long cbNew, void *pvVar, void *paev, bool fUpdateState) { AssertBaseThis(0); AssertIn(iaev, 0, _pggaev->IvMac() + 1); AssertIn(cbNew, 0, 100); // approximate bound if (pvNil != pvVar) AssertPvCb(pvVar, cbNew); AssertPvCb(paev, size(AEV)); PTAG ptag; if (!_pggaev->FInsert(iaev, cbNew, pvVar, paev)) return fFalse; // If not simply allocating space if (pvVar != pvNil) { // Increment tag count _pggaev->Lock(); if (_FIsIaevTag(_pggaev, iaev, &ptag)) TAGM::DupTag(ptag); _pggaev->Unlock(); if (fUpdateState) { if (iaev < _iaevCur) _iaevCur++; if (iaev <= _iaevActnCur) _iaevActnCur++; if (iaev <= _iaevAddCur) _iaevAddCur++; if (iaev < _iaevFrmMin) _iaevFrmMin++; } } return fTrue; } /*************************************************************************** Remove Aev. Update state variables ***************************************************************************/ void ACTR::_RemoveAev(long iaev, bool fUpdateState) { AssertBaseThis(0); AssertIn(iaev, 0, _pggaev->IvMac()); bool fUpdateSndFrame; PTAG ptag; PAEV qaev; // First, close tags _pggaev->Lock(); if (_FIsIaevTag(_pggaev, iaev, &ptag, &qaev)) TAGM::CloseTag(ptag); /* Don't bother updating the frame sound indicator if we didn't change an event in the scene's current frame */ fUpdateSndFrame = (qaev->aet == aetSnd) && (_pscen != pvNil) && (qaev->nfrm == _pscen->Nfrm()); _pggaev->Unlock(); // qaev is invalid past here! TrashVar(&qaev); _pggaev->Delete(iaev); if (fUpdateState) { if (iaev < _iaevCur) _iaevCur--; if (iaev < _iaevActnCur) _iaevActnCur--; if (iaev < _iaevAddCur) _iaevAddCur--; if (iaev < _iaevFrmMin) _iaevFrmMin--; } if (fUpdateSndFrame) _pscen->UpdateSndFrame(); } /*************************************************************************** Remove specified (eg, tweak, step, freeze) events for the current action If faetActn is set in the grfaet, also remove action events matching the replaced action followed by action events matching the new (current) action _anidCur. Note: This routine exists in addition to the more general PrepXfrmFill because actn events are considered to match if the anid's match regardless of the value of the celn. ***************************************************************************/ void ACTR::_PrepActnFill(long iaevMin, long anidPrev, long anidNew, ulong grfaet) { AssertBaseThis(0); AssertIn(iaevMin, 0, _pggaev->IvMac() + 1); AEV aev; long iaev; long anid = anidPrev; for (iaev = iaevMin; iaev < _pggaev->IvMac(); iaev++) { _pggaev->GetFixed(iaev, &aev); // Stage entrance events are boundaries to edits if (aetAdd == aev.aet) return; if (aetActn == aev.aet) { AEVACTN aevactn; _pggaev->Get(iaev, &aevactn); if (!(grfaet & faetActn)) { if (aevactn.anid == anidNew) continue; else return; } if (aevactn.anid == anid) { _RemoveAev(iaev); iaev--; } else if (aevactn.anid == anidNew) { anid = anidNew; _RemoveAev(iaev); iaev--; } else return; } if (aev.rtel < _rtelCur) continue; if (aev.aet == aetTweak && (grfaet & faetTweak)) { _RemoveAev(iaev); iaev--; } if (aev.aet == aetFreeze && (grfaet & faetFreeze)) { // Do not remove end-of-subroute freeze events if (!_FIsDoneAevSub(iaev, aev.rtel)) { _RemoveAev(iaev); iaev--; } } } } /*************************************************************************** Remove redundant costume changes Note: Delete all costume events that match the costume being replaced Then delete all subsequent costume events that match the costume being inserted ***************************************************************************/ void ACTR::_PrepCostFill(long iaevMin, AEVCOST *paevcost) { AssertBaseThis(0); AssertIn(iaevMin, 0, _pggaev->IvMac() + 1); AssertVarMem(paevcost); long iaev; AEV aev; AEVCOST aevcost; bool fMtrl; bool fCmtl; MTRL *pmtrlCmp; CMTL *pcmtlCmp; MTRL *pmtrl = pvNil; CMTL *pcmtl = pvNil; bool fReplacePrev = fTrue; // Locate the most current costume for this body part _pbody->GetPartSetMaterial(paevcost->ibset, &fMtrl, &pmtrlCmp, &pcmtlCmp); fCmtl = !fMtrl; for (iaev = iaevMin; iaev < _pggaev->IvMac(); iaev++) { _pggaev->GetFixed(iaev, &aev); // Stage entrance events are boundaries to edits if (aetAdd == aev.aet) goto LEnd; if (aetCost != aev.aet) continue; _pggaev->Get(iaev, &aevcost); if (aevcost.ibset != paevcost->ibset) continue; if (fReplacePrev) { // Delete the event if the costumes are the same if ((fCmtl == aevcost.fCmtl) && ((!fCmtl && (pmtrlCmp == (pmtrl = (PMTRL)vptagm->PbacoFetch(&aevcost.tag, MTRL::FReadMtrl)))) || (fCmtl && (pcmtlCmp == (pcmtl = _ptmpl->PcmtlFetch(aevcost.cmid)))))) { goto LDelete; } // This event does not match the one being replaced // Prepare to test for a match with the event being inserted fReplacePrev = fFalse; if (!paevcost->fCmtl) { pmtrlCmp = (PMTRL)vptagm->PbacoFetch(&paevcost->tag, MTRL::FReadMtrl); pcmtlCmp = pvNil; } else { pcmtlCmp = _ptmpl->PcmtlFetch(paevcost->cmid); pmtrlCmp = pvNil; } } ReleasePpo(&pcmtl); ReleasePpo(&pmtrl); Assert(!fReplacePrev, "Logic error"); if (paevcost->fCmtl != aevcost.fCmtl || (!aevcost.fCmtl && (pmtrlCmp != (pmtrl = (PMTRL)vptagm->PbacoFetch(&aevcost.tag, MTRL::FReadMtrl)))) || (aevcost.fCmtl && (pcmtlCmp != (pcmtl = _ptmpl->PcmtlFetch(aevcost.cmid))))) { // If the costumes differ goto LEnd; } LDelete: ReleasePpo(&pcmtl); ReleasePpo(&pmtrl); _RemoveAev(iaev); iaev--; } LEnd: if (!fReplacePrev) { ReleasePpo(&pmtrlCmp); ReleasePpo(&pcmtlCmp); } ReleasePpo(&pmtrl); ReleasePpo(&pcmtl); } /*************************************************************************** AdjustAevForRte for an already inserted point at irptAdjust adjust the rtel's of the subsequent affected events ***************************************************************************/ void ACTR::_AdjustAevForRteIns(long irptAdjust, long iaevMin) { AssertBaseThis(0); long irptMac = _pglrpt->IvMac(); AssertIn(irptAdjust, 0, irptMac); AssertIn(iaevMin, 0, _pggaev->IvMac() + 1); long iaev; AEV aev; RPT rptBack, rptAdjust; BRS dwrBack; if (irptAdjust > 0) { _pglrpt->Get(irptAdjust - 1, &rptBack); dwrBack = rptBack.dwr; } else dwrBack = rZero; _pglrpt->Get(irptAdjust, &rptAdjust); for (iaev = iaevMin; iaev < _pggaev->IvMac(); iaev++) { _pggaev->GetFixed(iaev, &aev); if (aev.rtel.irpt >= irptAdjust) // offset from later point { aev.rtel.irpt++; } else if (aev.rtel.irpt < irptAdjust - 1) { continue; } else { if ((irptAdjust == irptMac - 1) || (rZero == dwrBack)) continue; if (aev.rtel.dwrOffset >= dwrBack) { aev.rtel.dwrOffset = BrsSub(aev.rtel.dwrOffset, dwrBack); aev.rtel.irpt++; } } _pggaev->PutFixed(iaev, &aev); } } /*************************************************************************** AdjustAevForRte for a to-be deleted point at irptAdjust adjust the rtel's of the affected events ***************************************************************************/ void ACTR::_AdjustAevForRteDel(long irptAdjust, long iaevMin) { AssertBaseThis(0); long irptMac = _pglrpt->IvMac(); AssertIn(irptAdjust, 0, irptMac); AssertIn(iaevMin, 0, _pggaev->IvMac() + 1); long iaev; AEV aev; RPT rptBack, rptAdjust; BRS dwrBack, dwrFwd; if (0 == irptAdjust) dwrBack = rZero; else { _pglrpt->Get(irptAdjust - 1, &rptBack); dwrBack = rptBack.dwr; } _pglrpt->Get(irptAdjust, &rptAdjust); dwrFwd = rptAdjust.dwr; for (iaev = iaevMin; iaev < _pggaev->IvMac(); iaev++) { _pggaev->GetFixed(iaev, &aev); if (aev.rtel.irpt > irptAdjust) // offset from later point { aev.rtel.irpt--; } else if (aev.rtel.irpt == irptAdjust) { if (rptAdjust.dwr == rZero) { // Point will be deleted. Event must be also _RemoveAev(iaev); iaev--; continue; } aev.rtel.dwrOffset = BrsAdd(dwrBack, aev.rtel.dwrOffset); aev.rtel.irpt--; } else continue; _pggaev->PutFixed(iaev, &aev); } } /*************************************************************************** Locate a point on the path dwrStep further along the route from *prtel Events which potentially modify this step (Action, Add) begin at iaevCur. *pfEndRoute is set only when an attempt is made to move past the last node of the subroute. NOTE: This routine is designed to be independent of all frame dependent state variables. Spec: The end of a subroute is reached in a moving action. ***************************************************************************/ void ACTR::_AdvanceRtel(BRS dwrStep, RTEL *prtel, long iaevCur, long nfrmCur, bool *pfEndRoute) { AssertBaseThis(0); AssertVarMem(prtel); AssertNilOrVarMem(pfEndRoute); BRS dwrT; bool fEndRoute = fFalse; long iaev; AEV aev; // If at start of path // Note: _nfrmFirst is independent with respect to the current frame if (nfrmCur <= _nfrmFirst) { prtel->irpt = 0; prtel->dwrOffset = rZero; prtel->dnfrm = 0; goto LDone; } // End of route means trying to move beyond the last point. if (rZero == dwrStep) // Not an "end-of-route" { prtel->dnfrm++; goto LDone; } // Move to the correct path segment dwrT = ((RPT *)_pglrpt->QvGet(prtel->irpt))->dwr; dwrT = BrsSub(dwrT, prtel->dwrOffset); if (rZero == dwrT) { Assert(prtel->dwrOffset == rZero, "Expected zero offset"); prtel->dnfrm++; fEndRoute = fTrue; goto LDone; } while (dwrT <= dwrStep && rZero < dwrStep) { // Spec: Move the partial step // Not an "end-of-route" - didn't try to move beyond if (rZero == dwrT) { goto LDoneMove; } prtel->irpt++; AssertIn(prtel->irpt, 1, _pglrpt->IvMac()); prtel->dwrOffset = rZero; dwrStep = BrsSub(dwrStep, dwrT); dwrT = ((RPT *)_pglrpt->QvGet(prtel->irpt))->dwr; } dwrT = ((RPT *)_pglrpt->QvGet(prtel->irpt))->dwr; prtel->dwrOffset = BrsAdd(prtel->dwrOffset, dwrStep); LDoneMove: prtel->dnfrm = 0; if (!_fModeRecord && !_fRejoin) { // Spec: Ordinarily, the actor will display at the end of this step. // If Actn or Step events exist, the the actor is to display // at the location of the event. for (iaev = iaevCur; iaev < _pggaev->IvMac(); iaev++) { _pggaev->GetFixed(iaev, &aev); if ((aev.rtel <= *prtel) && (aev.aet == aetStep || aev.aet == aetActn)) { *prtel = aev.rtel; break; } if (aev.rtel > *prtel) break; } } LDone: if (pvNil != pfEndRoute) *pfEndRoute = fEndRoute; return; } /*************************************************************************** Convert a route location (rtel) to an xyz point (in *pxyz) ***************************************************************************/ void ACTR::_GetXyzFromRtel(RTEL *prtel, PXYZ pxyz) { AssertBaseThis(0); AssertVarMem(prtel); AssertVarMem(pxyz); RPT rpt; RPT rptFirst; RPT rptSecond; BRS rFract; if (rZero == prtel->dwrOffset || (prtel->irpt) + 1 == _pglrpt->IvMac()) { _pglrpt->Get(prtel->irpt, &rpt); *pxyz = rpt.xyz; return; } _pglrpt->Get(prtel->irpt, &rptFirst); _pglrpt->Get(1 + prtel->irpt, &rptSecond); Assert(rptFirst.dwr >= prtel->dwrOffset, "Possible offset bug in _GetXyzFromRtel"); rFract = BrsDiv(prtel->dwrOffset, rptFirst.dwr); _GetXyzOnLine(&rptFirst.xyz, &rptSecond.xyz, rFract, pxyz); } /*************************************************************************** Find a point rFract fractional distance between two points. Store in *pxyz ***************************************************************************/ void ACTR::_GetXyzOnLine(PXYZ pxyzFirst, PXYZ pxyzSecond, BRS rFract, PXYZ pxyz) { AssertBaseThis(0); AssertVarMem(pxyzFirst); AssertVarMem(pxyzSecond); AssertVarMem(pxyz); // New pt = first + (second - first) * fractoffset; pxyz->dxr = BrsSub(pxyzSecond->dxr, pxyzFirst->dxr); pxyz->dyr = BrsSub(pxyzSecond->dyr, pxyzFirst->dyr); pxyz->dzr = BrsSub(pxyzSecond->dzr, pxyzFirst->dzr); pxyz->dxr = BrsMul(rFract, pxyz->dxr); pxyz->dyr = BrsMul(rFract, pxyz->dyr); pxyz->dzr = BrsMul(rFract, pxyz->dzr); pxyz->dxr = BrsAdd(pxyz->dxr, pxyzFirst->dxr); pxyz->dyr = BrsAdd(pxyz->dyr, pxyzFirst->dyr); pxyz->dzr = BrsAdd(pxyz->dzr, pxyzFirst->dzr); } /*************************************************************************** Locate the actor (in Brender terms), first adjusting the location. Post-impose a rotation looking forward along the route ***************************************************************************/ void ACTR::_PositionBody(XYZ *pxyz) { AssertBaseThis(0); AssertVarMem(pxyz); XYZ xyz; BMAT34 bmat34; // Final orientation matrix _MatrixRotUpdate(pxyz, &bmat34); xyz.dxr = BrsAdd(_dxyzRte.dxr, pxyz->dxr); xyz.dyr = BrsAdd(_dxyzRte.dyr, pxyz->dyr); xyz.dzr = BrsAdd(_dxyzRte.dzr, pxyz->dzr); _pbody->LocateOrient(xyz.dxr, xyz.dyr, xyz.dzr, &bmat34); } /*************************************************************************** Update the orientation matrices _xfrm.bmat34Cur must be kept current ***************************************************************************/ void ACTR::_MatrixRotUpdate(XYZ *pxyz, BMAT34 *pbmat34) { AssertBaseThis(0); AssertVarMem(pxyz); AssertVarMem(pbmat34); RPT rpt; BRA xa, ya, za; BMAT34 bmat34TS; // Scaling matrix BMAT34 bmat34TR; // Rotation matrix bool fStretchSize; AEV *paev; _xyzCur = *pxyz; fStretchSize = (rOne != _xfrm.aevpull.rScaleX || rOne != _xfrm.aevpull.rScaleY || rOne != _xfrm.aevpull.rScaleZ || rOne != _xfrm.rScaleStep); // Set the orientation & rotation to zero-change BrMatrix34Identity(&bmat34TS); // Post apply the rest (face the camera) orientation _ptmpl->GetRestOrien(&xa, &ya, &za); BrMatrix34PostRotateX(&bmat34TS, xa); BrMatrix34PostRotateY(&bmat34TS, ya); BrMatrix34PostRotateZ(&bmat34TS, za); if (fStretchSize) { // Apply any current stretching/squashing // This must be applied BEFORE rotation to avoid stretching // the actor along skewed axes BrMatrix34PostScale(&bmat34TS, _xfrm.aevpull.rScaleX, _xfrm.aevpull.rScaleY, _xfrm.aevpull.rScaleZ); // Apply any current uniform sizing if (_xfrm.rScaleStep != rOne) { BrMatrix34PostScale(&bmat34TS, _xfrm.rScaleStep, _xfrm.rScaleStep, _xfrm.rScaleStep); } } // bmat34Cur is the all inclusive orientation matrix if (_fUseBmat34Cur) { // Single frame rotate events or static segments BrMatrix34Mul(pbmat34, &bmat34TS, &_xfrm.bmat34Cur); // A = B * C } else { // Forward-rotate events or non-static segments BrMatrix34Copy(&bmat34TR, &_xfrm.bmat34Fwd); // copy to bmat34TR // Post apply the path orientation AssertIn(_iaevAddCur, 0, _pggaev->IvMac()); paev = (AEV *)_pggaev->QvFixedGet(_iaevAddCur); _pglrpt->Get(paev->rtel.irpt, &rpt); #ifdef BUG1899 if (_ptmpl->FIsTdt() || (_rtelCur.irpt == paev->rtel.irpt && _rtelCur.dwrOffset == rZero)) #else //! BUG1899 if (_ptmpl->FIsTdt() || paev->nfrm == _nfrmCur || rpt.dwr == rZero) #endif //! BUG1899 { // Single point subroute -> // Post apply single point orientation to event rotations AEVADD aevadd; _pggaev->Get(_iaevAddCur, &aevadd); BrMatrix34PostRotateX(&bmat34TR, aevadd.xa); BrMatrix34PostRotateY(&bmat34TR, aevadd.ya); BrMatrix34PostRotateZ(&bmat34TR, aevadd.za); // Save the path part of the orientation _xfrm.xaPath = aevadd.xa; _xfrm.yaPath = aevadd.ya; _xfrm.zaPath = aevadd.za; } else { // Orient along the route _CalcRteOrient(&bmat34TR, &_xfrm.xaPath, &_xfrm.yaPath, &_xfrm.zaPath); } // Now combine rotation with stretching BrMatrix34Mul(pbmat34, &bmat34TS, &bmat34TR); // Note: The result of the entire rotation (including path) needs to // be saved - otherwise, the actor will jump when the user first tries // to do a tweak-rotate edit. BrMatrix34Copy(&_xfrm.bmat34Cur, &bmat34TR); // Save final all-included rotation matrix } } /*************************************************************************** Calculate the Post-imposed rotation tangent to the route Calculation based on _iaevCur, _anidCur NOTE: *pbmat34 is not pre-initialized ***************************************************************************/ void ACTR::_CalcRteOrient(BMAT34 *pbmat34, BRA *pxa, BRA *pya, BRA *pza, ulong *pgrfbra) { AssertBaseThis(0); AssertNilOrVarMem(pbmat34); AssertNilOrVarMem(pxa); AssertNilOrVarMem(pya); AssertNilOrVarMem(pza); long irptPrev; long irptAdd; XYZ xyz; AEV aev; RPT rpt; if (pvNil != pxa) *pxa = aZero; if (pvNil != pya) *pya = aZero; if (pvNil != pza) *pza = aZero; AssertIn(_iaevAddCur, 0, _pggaev->IvMac()); _pggaev->GetFixed(_iaevAddCur, &aev); irptAdd = aev.rtel.irpt; irptPrev = (rZero < _rtelCur.dwrOffset || _rtelCur.irpt == aev.rtel.irpt) ? _rtelCur.irpt : _rtelCur.irpt - 1; Assert(rZero == _rtelCur.dwrOffset || irptPrev < _pglrpt->IvMac(), "Incorrect offset in path"); // If at end of subpath, or if on a static segment, // retain the orientation the actor last had _pglrpt->Get(irptPrev, &rpt); if (rZero == rpt.dwr) irptPrev--; if (irptPrev < irptAdd) return; // Single point path // // Compute vector xyz as a weighted average of 3 vectors // xyz.dxr = rZero; xyz.dyr = rZero; xyz.dzr = rZero; _UpdateXyzTan(&xyz, irptPrev, rFour); if (irptPrev > irptAdd) { _UpdateXyzTan(&xyz, irptPrev - 1, rTwo); if (irptPrev - 1 > irptAdd) { _UpdateXyzTan(&xyz, irptPrev - 2, rOne); } } // // Apply the rotation determined by vector xyz // _ApplyRotFromVec(&xyz, pbmat34, pxa, pya, pza, pgrfbra); return; } /*************************************************************************** Update vector *pxyz by adding to it the normalized vector from nodes (irpt to irpt + 1) * weighting factor rw. The result accumulates a weighted average approximation to the tangent to the route. Optimized for movie PLAYing ***************************************************************************/ void ACTR::_UpdateXyzTan(XYZ *pxyz, long irpt, long rw) { AssertBaseThis(0); RPT rpt1; RPT rpt2; BRS dwr, dxr, dyr, dzr; Assert(irpt + 1 < _pglrpt->IvMac(), "irpt out of range"); _pglrpt->Get(irpt, &rpt1); _pglrpt->Get(irpt + 1, &rpt2); dxr = BrsSub(rpt2.xyz.dxr, rpt1.xyz.dxr); dyr = BrsSub(rpt2.xyz.dyr, rpt1.xyz.dyr); dzr = BrsSub(rpt2.xyz.dzr, rpt1.xyz.dzr); // // Normalize the vector (norm ~ max + 1/2 min) // dwr = BrsAbsMax3(dxr, dyr, dzr); if (dxr == dwr) dwr = BrsAdd(dwr, (BRS)(LwMax(LwAbs((long)dyr), LwAbs((long)dzr)) >> 1)); else { if (dyr == dwr) dwr = BrsAdd(dwr, (BRS)(LwMax(LwAbs((long)dxr), LwAbs((long)dzr)) >> 1)); else dwr = BrsAdd(dwr, (BRS)(LwMax(LwAbs((long)dxr), LwAbs((long)dyr)) >> 1)); } dxr = BrsDiv(dxr, dwr); dyr = BrsDiv(dyr, dwr); dzr = BrsDiv(dzr, dwr); dxr = LwBound(dxr, -rOne, rOne); dyr = LwBound(dyr, -rOne, rOne); dzr = LwBound(dzr, -rOne, rOne); // // Apply the weight // if (rw != rOne) { dxr = BrsMul(rw, dxr); dyr = BrsMul(rw, dyr); dzr = BrsMul(rw, dzr); } pxyz->dxr = BrsAdd(pxyz->dxr, dxr); pxyz->dyr = BrsAdd(pxyz->dyr, dyr); pxyz->dzr = BrsAdd(pxyz->dzr, dzr); } /*************************************************************************** Compute the angles of rotation defined by the vector *pxyz Apply the rotation to matrix *pbmat34 Return the angles of rotation in *pxa, *pya, *pza Return a mask of the axes rotated Note: Banking can be done by approximating the second derivative which can be done using additional arguments. ***************************************************************************/ void ACTR::_ApplyRotFromVec(XYZ *pxyz, BMAT34 *pbmat34, BRA *pxa, BRA *pya, BRA *pza, ulong *pgrfbra) { AssertBaseThis(0); AssertNilOrVarMem(pbmat34); AssertVarMem(pxyz); AssertNilOrVarMem(pxa); AssertNilOrVarMem(pya); AssertNilOrVarMem(pza); BRS dwr; BRS rX, rY, rZ; BRFR eX, eY, eZ, eW; BRA aRot = aZero; if (pvNil != pgrfbra) *pgrfbra = 0; /// Use cached tmpl _grfactn to determine the axes to rotate around dwr = BrsAdd(BrsAbsMax3(pxyz->dxr, pxyz->dyr, pxyz->dzr), rOne); // BrScalarToFraction required by Brender's BR_ATAN2 limitation if (_grfactn & (factnRotateY | factnRotateZ)) { rX = BrsDiv(pxyz->dxr, dwr); eX = BrScalarToFraction(rX); } if (_grfactn & (factnRotateX | factnRotateZ)) { rY = BrsDiv(pxyz->dyr, dwr); eY = BrScalarToFraction(rY); } if (_grfactn & (factnRotateX | factnRotateY)) { rZ = BrsDiv(pxyz->dzr, dwr); eZ = BrScalarToFraction(rZ); } if (_grfactn & factnRotateY) { if (pxyz->dxr != rZero || pxyz->dzr != rZero) { aRot = BR_ATAN2(eX, eZ); if (pvNil != pbmat34) BrMatrix34PostRotateY(pbmat34, aRot); if (pvNil != pgrfbra) *pgrfbra |= fbraRotateY; } } if (pvNil != pya) *pya = aRot; // Tilt the actor up / down if (_grfactn & factnRotateX) { if (pxyz->dyr != rZero) { eW = BrScalarToFraction(BrsAdd(BrsAbs(rX), BrsAbs(rZ))); aRot = BR_ATAN2(-eY, eW); if (pvNil != pbmat34) BrMatrix34PreRotateX(pbmat34, aRot); if (pvNil != pgrfbra) *pgrfbra |= fbraRotateX; } } if (pvNil != pxa) *pxa = aRot; if (pvNil != pza) *pxa = aZero; } /*************************************************************************** Get the actor's event lifetime Update nfrm values for all events Return false if the actor has not yet been placed in time pnfrmLast may be pvNil ***************************************************************************/ bool ACTR::FGetLifetime(long *pnfrmFirst, long *pnfrmLast) { AssertThis(0); AssertNilOrVarMem(pnfrmFirst); AssertNilOrVarMem(pnfrmLast); if (klwMax == _nfrmFirst) return fFalse; if (pvNil != pnfrmFirst) *pnfrmFirst = _nfrmFirst; if (pvNil == pnfrmLast) return fTrue; if (!_fLifeDirty) { *pnfrmLast = _nfrmLast; Assert(_nfrmLast >= _nfrmFirst, "fLifeDirty incorrect"); return fTrue; } if (!_FComputeLifetime(pnfrmLast)) PushErc(ercSocBadFrameSlider); return fTrue; } /*************************************************************************** Compute the actor's event lifetime Update nfrm values for all events. Recording or rerecording pushes out later subroutes, whereas recording off screen followed by an earlier add does not - note therefore that when roll calling invisible actors, the end of the existing subroute must first be truncated. On a false return, it is possible that the template could not be accessed, so the update is incomplete. pnfrmLast may be pvNil NOTE: Now that by spec, edits do not cross subroute boundaries, performance optimization can be achieved by storing the index if the first aev edited when _fLifeDirty is set. Note: There is some amount of redundant checking here now that subroutes are now step=0 terminated. Zero termination implies that fEndSubRoute should be false, as actors should not be attempting to move past the end of their paths. Note that FIsStalled() now flags the end of step=0 terminated subroutes; stalls mid path should now be impossible as by spec, motion fill now inherits the original movement along the path. ***************************************************************************/ bool ACTR::_FComputeLifetime(long *pnfrmLast) { AssertBaseThis(0); AssertNilOrVarMem(pnfrmLast); long iaev; long iaevAdd; BRS dwr; AEV aev; AEV *paev; RTEL rtel; bool fFreezeThisCel; long anid = 0; long celn = 0; long nfrmPrevSub = 0; BRS rScale = rOne; BRS dwrStep = rZero; bool fEndSubRoute = fFalse; // moving past end of subroute (see Note above) bool fDoneSubRoute = fFalse; // finished processing events on the current subroute // While recording, delay the upcoming lifetime calculation if (_fModeRecord) { if (pnfrmLast != pvNil) *pnfrmLast = _nfrmLast; _fLifeDirty = fTrue; return fTrue; } // Locate final subroute rtel.irpt = 0; rtel.dwrOffset = rZero; rtel.dnfrm = -1; iaevAdd = -1; // REVIEW *****(SeanSe): Why not start at the end and go backwards? for (iaev = 0; iaev < _pggaev->IvMac(); iaev++) { paev = (AEV *)_pggaev->QvFixedGet(iaev); if (aetAdd == paev->aet) iaevAdd = iaev; } if (iaevAdd < 0) { _nfrmLast = _nfrmFirst; if (pvNil != pnfrmLast) *pnfrmLast = _nfrmFirst; _fLifeDirty = fFalse; return fTrue; } // Loop through each frame long fFrozen = fFalse; long iaevNew = 0; RTEL rtelOld = rtel; rtelOld.dnfrm = rtel.dnfrm - 1; for (_nfrmLast = _nfrmFirst; ((rtel.irpt != _pglrpt->IvMac()) || (iaevNew != _pggaev->IvMac())); _nfrmLast++) { fFreezeThisCel = fFrozen; rtelOld = rtel; // Find distance to move // An aetActn event later in this same frame can modify this. if (kdwrNil == dwrStep) { if (!_ptmpl->FGetDwrActnCel(anid, celn, &dwr)) { _fLifeDirty = fTrue; return fFalse; } } else { dwr = dwrStep; } dwr = BrsMul(dwr, rScale); _AdvanceRtel(dwr, &rtel, iaevNew, _nfrmLast, &fEndSubRoute); // Scan all events for this frame for (iaev = iaevNew; iaev < _pggaev->IvMac(); iaev++) { _pggaev->GetFixed(iaev, &aev); if ((aev.rtel > rtel) && ((aetAdd != aev.aet) || (_fModeRecord && !fEndSubRoute) || (!fEndSubRoute && !fDoneSubRoute))) { // To push out subroutes, do not process add events until finished // with the previous subroute goto LEndFrame; } switch (aev.aet) { case aetAdd: fFreezeThisCel = fTrue; anid = celn = 0; if (aev.nfrm > _nfrmLast) { goto LEndFrame; } else { rtel = aev.rtel; fDoneSubRoute = fEndSubRoute = fFalse; nfrmPrevSub = _nfrmLast; } break; case aetTweak: case aetSnd: case aetRem: case aetCost: case aetRotF: case aetRotH: case aetPull: case aetMove: break; case aetFreeze: long ffriz; _pggaev->Get(iaev, &ffriz); fFrozen = FPure(ffriz); break; case aetSize: // Uniform size transformation // Adjust step size : affects actor lifetime _pggaev->Get(iaev, &rScale); break; case aetActn: AEVACTN aevactn; _pggaev->Get(iaev, &aevactn); anid = aevactn.anid; celn = aevactn.celn; fFrozen = fFalse; fFreezeThisCel = fTrue; break; case aetStep: _pggaev->Get(iaev, &dwrStep); break; default: Assert(0, "Unknown event type"); break; } if (aev.rtel > rtel) goto LEndFrame; if (aev.nfrm != _nfrmLast) { aev.nfrm = _nfrmLast; _pggaev->PutFixed(iaev, &aev); } } LEndFrame: // Stepsize and lifetime is a function of celn's if (!fFreezeThisCel && !(fEndSubRoute && _FIsDoneAevSub(iaev, rtel))) { celn++; } // Check for end of subroute or stalled actor (eg breathe in place forever) #ifdef BUG1960 // We are not finished updating events in the current subpath until we are either // - beyond the subroute (fEndSubRoute) // - out of events // - stopped with no way to reach more events in the subpath (ie, stalled) // and finished updating later events at this same path location if (fEndSubRoute || (dwrStep == rZero && (iaev == _pggaev->IvMac() || (!(aev.rtel.irpt == rtel.irpt && aev.rtel.dwrOffset == rtel.dwrOffset) && _FIsStalled(iaevNew, &rtel))))) #else //! BUG1960 if (fEndSubRoute || ((dwrStep == rZero) && (iaev == _pggaev->IvMac() || _FIsStalled(iaevNew, &rtel)))) #endif //! BUG1960 { if (!fDoneSubRoute) nfrmPrevSub = _nfrmLast; fDoneSubRoute = fTrue; // Are there more subroutes? if (!_FFindNextAevAet(aetAdd, iaev, &iaev)) { // For non-static motions, fEndSubRoute is set once the actor is // beyond the end of the subroute. Adjust back one frame. if (fEndSubRoute && (dwrStep != rZero) && (_nfrmLast > _nfrmFirst)) _nfrmLast--; if (pvNil != pnfrmLast) *pnfrmLast = _nfrmLast; _fLifeDirty = fFalse; return fTrue; } // Add events jump in space. Update rtel _pggaev->GetFixed(iaev, &aev); rtel = aev.rtel; // Initialization for _AdvanceRtel() anid = celn = 0; rtel.dnfrm--; } iaevNew = iaev; } Assert(0, "Logic error"); if (pvNil != pnfrmLast) *pnfrmLast = _nfrmLast; return fFalse; } /*************************************************************************** An actor is said to be stalled if more route exists, the step size is ever zero with no subsequent nonzero step size to follow. Determine whether an actor is stalled on a subroute Input: IaevFirst is the first event to check on the subroute. *prtel is the route point to test for stalling Return fFalse if not stalled. If stalled, return the last active event. ***************************************************************************/ bool ACTR::_FIsStalled(long iaevFirst, RTEL *prtel, long *piaevLast) { AssertBaseThis(0); AssertIn(iaevFirst, 0, _pggaev->IvMac()); AssertNilOrVarMem(piaevLast); AEV aev; long iaev; for (iaev = iaevFirst; iaev < _pggaev->IvMac(); iaev++) { _pggaev->GetFixed(iaev, &aev); if ((aev.rtel.irpt > prtel->irpt) || (aev.rtel.dwrOffset > prtel->dwrOffset)) { if (piaevLast != pvNil) { *piaevLast = iaev; } return fTrue; } if ((aev.rtel.irpt == prtel->irpt) && (aev.rtel.dwrOffset == prtel->dwrOffset)) { if (aetStep == aev.aet) { BRS dwrAev; _pggaev->Get(iaev, &dwrAev); if (rZero != dwrAev) return fFalse; } } } return fFalse; } /*************************************************************************** Has the mouse been down long enough or moved far enough to qualify this as a valid recording session (vs merely motion filling)? NOTE: ** If sufficient time has not elapsed, intended motion fill will inadvertently delete the remaining subroute is record is selected instead of rerecord. NOTE: ** This requires that SetTsInsert() have been called on mouse down to initialize the timing of the recording session ***************************************************************************/ bool ACTR::FIsRecordValid(BRS dxr, BRS dyr, BRS dzr, ulong tsCurrent) { AssertThis(0); if (_fModeRecord) return fTrue; BRS dwrMouse; // Is this truly a motion fill or is there sufficient time or // distance travelled to make this an authentic route record? dwrMouse = BR_LENGTH3(dxr, dyr, dzr); if ((dwrMouse < kdwrThreshRte) && ((tsCurrent - _tsInsert) < kdtsThreshRte)) return fFalse; return fTrue; } /*************************************************************************** Begin a new route fReplace = ftrue if recording, fFalse if rerecording On failure, actor is restored from pactrRestore ***************************************************************************/ bool ACTR::FBeginRecord(ulong tsCurrent, bool fReplace, PACTR pactrRestore) { AssertThis(0); Assert(tsCurrent >= 0, "Invalid type"); RPT rpt; AEV aev; long iaev; long nfrmAdd; long nfrmPrev; bool fClosestSubrte = fTrue; _pglrpt->Get(_rtelCur.irpt, &rpt); _fPathInserted = fFalse; // Do not rejoin to a one point offstage stub. _fRejoin = !fReplace && !(rZero == rpt.dwr); if (_fRejoin) { long iaev; AEV aev; long irptNext = _rtelCur.irpt + 1; for (iaev = _iaevCur; iaev < _pggaev->IvMac(); iaev++) { _pggaev->GetFixed(iaev, &aev); if (irptNext < aev.rtel.irpt) break; if (aetRem == aev.aet) { _fRejoin = fFalse; _RemoveAev(iaev); iaev--; _AdjustAevForRteDel(irptNext, _iaevCur); _pglrpt->Delete(irptNext); } } } // Recording must advance from the current point -> potentially // inserting the current point if (rZero != _rtelCur.dwrOffset) { BRS dwrCur = _rtelCur.dwrOffset; _GetXyzFromRtel(&_rtelCur, &rpt.xyz); _rtelCur.irpt++; _rtelCur.dwrOffset = rZero; _rtelCur.dnfrm = 0; if (!_FInsertGgRpt(_rtelCur.irpt, &rpt, dwrCur)) goto LFail; _GetXyzFromRtel(&_rtelCur, &_xyzCur); _AdjustAevForRteIns(_rtelCur.irpt, 0); } // Determine the gaps between subroutes _dnfrmGap = 0; iaev = _iaevCur; if (_fLifeDirty) { // Validate future nfrm values if (!_FComputeLifetime()) { PushErc(ercSocBadFrameSlider); goto LFail; } } for (iaev = _iaevCur; iaev < _pggaev->IvMac(); iaev++) { _pggaev->GetFixed(iaev, &aev); if (aev.aet != aetAdd) continue; nfrmAdd = aev.nfrm; if (fClosestSubrte) { nfrmPrev = _nfrmCur; fClosestSubrte = fFalse; } else { _pggaev->GetFixed(iaev - 1, &aev); nfrmPrev = aev.nfrm; } _dnfrmGap -= (nfrmAdd - nfrmPrev); } _rtelInsert = _rtelCur; _fModeRecord = fTrue; _dxyzRaw.dxr = rZero; _dxyzRaw.dyr = rZero; _dxyzRaw.dzr = rZero; return fTrue; LFail: _RestoreFromUndo(pactrRestore); return fFalse; } /*************************************************************************** Add to a new route On Input: grfmaf flags the Frozen/unfrozen state. *pfStepFrm returns whether the frame was advanced *pfStepRte returns whether the route was extended. Note: During recording, dwr = rZero marks the end of the new subroute NOTE: On failure, actor is restored from pactrRestore ***************************************************************************/ bool ACTR::FRecordMove(BRS dxr, BRS dyr, BRS dzr, ulong grfmaf, ulong tsCurrent, bool *pfStepFrm, bool *pfStepRte, PACTR pactrRestore) { AssertThis(0); AssertVarMem(pfStepFrm); AssertVarMem(pfStepRte); RPT rptCur; XYZ xyzMouse; XYZ dxyzT; BRS dwrCur; RPT rptNew; BRS rFractMoved; BRS dwrMouse; Assert(_fOnStage, "Recording an actor that wasn't selectable??"); if (!_fModeRecord) return fTrue; // Potential client call on motion fill if (!_pggaev->FEnsureSpace(2, kcbVarStep + kcbVarFreeze, fgrpNil) || !_pglrpt->FEnsureSpace(1, fgrpNil)) { goto LFail; } // Smooth the unpruned raw mouse movement *before* we create the path dxyzT.dxr = dxr; dxyzT.dyr = dyr; dxyzT.dzr = dzr; dxr = BR_CONST_DIV(BrsAdd(_dxyzRaw.dxr, BR_CONST_MUL(2, dxr)), 3); dyr = BR_CONST_DIV(BrsAdd(_dxyzRaw.dyr, BR_CONST_MUL(2, dyr)), 3); dzr = BR_CONST_DIV(BrsAdd(_dxyzRaw.dzr, BR_CONST_MUL(2, dzr)), 3); if (_fFrozen && !(grfmaf & fmafFreeze)) AssertDo(_FUnfreeze(), "Ensurespace should have ensured space"); if (!_fFrozen && (grfmaf & fmafFreeze)) AssertDo(_FFreeze(), "Ensurespace should have ensured space"); if (pvNil != pfStepFrm) *pfStepFrm = fFalse; if (pvNil != pfStepRte) *pfStepRte = fFalse; // Update distance from previously current point Assert(_pglrpt->IvMac() > 0, "Illegal empty path"); // In record mode, know prev point on a route Node // Determine if threshhold distance has been advanced _pglrpt->Get(_rtelCur.irpt, &rptCur); xyzMouse.dxr = BrsAdd(dxr, rptCur.xyz.dxr); xyzMouse.dyr = BrsAdd(dyr, rptCur.xyz.dyr); xyzMouse.dzr = BrsAdd(dzr, rptCur.xyz.dzr); dwrMouse = BR_LENGTH3(dxr, dyr, dzr); if (!_FGetDwrRecord(&dwrCur)) goto LFail; if (dwrMouse < dwrCur) { if ((tsCurrent - _tsInsert) < kdtsThreshRte) { // Insufficient length and insufficient time to record a point return fTrue; } if (rZero != _dwrStep) { AssertDo(FSetStep(rZero), "EnsureSpace insufficient"); } _fPathInserted = fTrue; if (pvNil != pfStepFrm) { *pfStepFrm = fTrue; } if (!_pscen->FGotoFrm(_pscen->Nfrm() + 1)) goto LFail; return fTrue; } _tsInsert = tsCurrent; _dxyzRaw = dxyzT; // // Insert new point. (Overlays last point if offstage) // Length is sufficient. Truncate to correct step size // rFractMoved = BrsDiv(dwrCur, dwrMouse); Assert(rZero != dwrCur, "Zero length step illegal in FRecordMove"); _GetXyzOnLine(&rptCur.xyz, &xyzMouse, rFractMoved, &rptNew.xyz); rptNew.dwr = rZero; // Adjust the point for ground zero. The rule is if the mouse // is decreasing from above to below ground, stop at ground level // The original dwr is used *by design* if ((grfmaf & fmafGround) && (BrsAdd(rptCur.xyz.dyr, _dxyzRte.dyr) >= rZero) && (BrsAdd(rptNew.xyz.dyr, _dxyzRte.dyr) < rZero)) { rptNew.xyz.dyr = -_dxyzRte.dyr; } if (!_pglrpt->FInsert(1 + _rtelCur.irpt, &rptNew)) goto LFail; if (kdwrNil != _dwrStep) { AssertDo(FSetStep(kdwrNil), "EnsureSpace insufficient"); } // Reset distance in previous xyz entry rptCur.dwr = dwrCur; Assert(dwrCur != rZero, "Bug in InsertRoute"); _pglrpt->Put(_rtelCur.irpt, &rptCur); _AdjustAevForRteIns(1 + _rtelCur.irpt, _iaevCur); _fPathInserted = fTrue; if (pvNil != pfStepFrm) *pfStepFrm = fTrue; if (pvNil != pfStepRte) *pfStepRte = fTrue; _dnfrmGap++; if (_dnfrmGap > 0) _nfrmLast++; if (_pscen->FGotoFrm(_pscen->Nfrm() + 1)) return fTrue; LFail: _RestoreFromUndo(pactrRestore); return fFalse; } /*************************************************************************** End recording a new route or route section (mouse up) Insert a freeze event if at the end of the subroute. Input: fReplace is meaningful only if recording or rerecording (versus motion fill. _fModeRecord is false on motion fill). fReplace = fTrue if recording, ie, if replacing the remaining subroute Path splicing rule: Never rejoin across Add events Always reconnect to the existing subroute at the closest point which occurs later in the route than where the initial re-recording began. NOTE** Actn, Tweak, Freeze, Step & Rem events are deleted from the section of the route being replaced. Other events are pushed up to the join point (if rejoining) or to the next dnfrm of the current point, if not rejoining. On Failure: The actor is restored from pactrRestore ***************************************************************************/ // REVIEW *****(*****): Ver 2.0 As motion fill is self sufficient, // FEndRecord() should be able to exit immediately on !_fModeRecord. // Also, pactrRestore should be state var _pactrRecordRestore. bool ACTR::FEndRecord(bool fReplace, PACTR pactrRestore) { AssertThis(0); AEV aev; BRS dwr; long iaev; long irpt; RPT rpt; RPT rptJoin; RPT rptCur; BRS dwrMin = kdwrMax; RTEL rtelJoin = _rtelCur; bool fJoin = fFalse; long irptLim = _pglrpt->IvMac(); long iaevJoinFirst = _iaevCur; long iaevNew; // Determine whether to rejoin to the path // REVIEW (*****): Can we assert _fOnStage? if (_fModeRecord && (!_fOnStage || fReplace)) { // Delete remnant path _DeleteFwdCore(fFalse, pvNil, _iaevCur); if (!_FFreeze()) goto LFail; if (!FSetStep(rZero)) goto LFail; goto LEndRecord; } // // Motion Fill or Path-rejoining // // _fModeRecord == fFalse on motion fill if (!_fModeRecord || !_fPathInserted || !_fOnStage) { // Set Action necessarily destroys end of path freeze events // Reinsert an end of path freeze event if at end of subroute if (_FIsDoneAevSub(_iaevCur, _rtelCur)) { if (!_FFreeze()) goto LFail; } goto LEndRecord; // Nothing inserted } // On !fReplace, force continuation to remainder of route. if (rZero == _dwrStep) { if (!FSetStep(kdwrNil)) goto LFail; } if (!_fRejoin) { // Gather the events at later time for the current path point // Equivalent to setting the join time ahead rtelJoin.dnfrm = 1; } else { Assert((_rtelCur.irpt < _pglrpt->IvMac() - 1), "Not enough points to rejoin"); for (iaev = _iaevCur; iaev < _pggaev->IvMac(); iaev++) { _pggaev->GetFixed(iaev, &aev); if (aev.aet == aetAdd) { irptLim = aev.rtel.irpt; break; } } // Locate the Join node rtelJoin.irpt = _rtelCur.irpt + 1; rtelJoin.dwrOffset = rZero; rtelJoin.dnfrm = 0; for (irpt = 1 + _rtelCur.irpt; irpt < irptLim; irpt++) { _pglrpt->Get(irpt, &rpt); dwr = BR_LENGTH3(BrsSub(_xyzCur.dxr, rpt.xyz.dxr), BrsSub(_xyzCur.dyr, rpt.xyz.dyr), BrsSub(_xyzCur.dzr, rpt.xyz.dzr)); if (dwr < dwrMin) { dwrMin = dwr; rtelJoin.irpt = irpt; } // Do not join across subroutes if (rZero == rpt.dwr) break; } Assert(rtelJoin > _rtelCur, "Invalid Join point"); Assert(rZero == _rtelCur.dwrOffset, "_rtelCur invalid"); // Update the dwr of the most recently recorded point to be // the length to the join point on the path // NOTE: This cannot be zero (it would signal end of path) _pglrpt->Get(_rtelCur.irpt, &rptCur); _pglrpt->Get(rtelJoin.irpt, &rptJoin); rptCur.dwr = BR_LENGTH3(BrsSub(_xyzCur.dxr, rptJoin.xyz.dxr), BrsSub(_xyzCur.dyr, rptJoin.xyz.dyr), BrsSub(_xyzCur.dzr, rptJoin.xyz.dzr)); if (rZero == rptCur.dwr) { // Prevent pathological end-of-route case rptCur.dwr = rEps; } _pglrpt->Put(_rtelCur.irpt, &rptCur); } // // Note: Motion fill exited earlier. This is rejoin-recording only (which // may or may not actually have a path point to rejoin to). // Move displaced events forward to the join point // Spec: Replace is viewed in UI as Action replace, not just path replace. -> // Delete intervening action, tweak, freeze, step and rem events. // for (iaev = _iaevCur; iaev < _pggaev->IvMac(); iaev++) { _pggaev->GetFixed(iaev, &aev); #ifdef BUG1961 // If we were rejoin-recording from a static segment, there is // no point to rejoin to (-> _fRejoin is fFalse). So gather // events up to but not beyond the next add event. if (aev.aet == aetAdd || (_fRejoin && aev.rtel >= rtelJoin)) #else if (_fRejoin && aev.rtel >= rtelJoin) #endif //! BUG1961 { break; } if (aev.rtel > _rtelInsert) { if (aev.aet == aetTweak || aev.aet == aetStep || aev.aet == aetRem || aev.aet == aetActn || aev.aet == aetFreeze) { _RemoveAev(iaev); iaev--; continue; } else { aev.rtel = rtelJoin; _pggaev->PutFixed(iaev, &aev); _MergeAev(iaevJoinFirst, iaev, &iaevNew); if (iaevNew < iaev) iaev--; } } } if (_fRejoin) { // Delete the path segment before the join point for (irpt = rtelJoin.irpt - 1; irpt > _rtelCur.irpt; irpt--) { _AdjustAevForRteDel(irpt, _iaevCur); _pglrpt->Delete(irpt); } // Spec: Do an action fill forward. _PrepActnFill(iaevJoinFirst, _anidCur, _anidCur, faetTweak | faetFreeze | faetActn); } #ifdef BUG1961 if (!fReplace && !_fRejoin) { if (!_FFreeze()) goto LFail; if (!FSetStep(rZero)) goto LFail; } #endif // BUG1961 LEndRecord: _fLifeDirty = fTrue; #ifdef BUG1973 _fRejoin = fFalse; #endif // BUG1973 _fModeRecord = fFalse; _pscen->MarkDirty(); _pscen->InvalFrmRange(); AssertThis(fobjAssertFull); return fTrue; LFail: _RestoreFromUndo(pactrRestore); #ifdef BUG1973 _fRejoin = fFalse; #endif _fModeRecord = fFalse; // Redundant safety net return fFalse; } /*************************************************************************** Delete the path and events beyond this frame - and - Insert a Freeze event to terminate the truncated event list ***************************************************************************/ void ACTR::DeleteFwdCore(bool fDeleteAll, bool *pfAlive, long iaevCur) { AssertThis(0); bool fAlive; long iaev; AEV aev; _DeleteFwdCore(fDeleteAll, &fAlive, iaevCur); if (fAlive && _nfrmCur >= _nfrmFirst) { // If no space exists, truncation isn't changing a thing if (_pggaev->FEnsureSpace(2, kcbVarFreeze + kcbVarStep, fgrpNil)) { #ifdef BUG1932 if (_iaevAddCur < 0 || _pggaev->IvMac() == 0) { // Safety net code : don't add events if bug exists Bug("Invalid fAlive value"); goto LEnd; } #ifdef DEBUG _pggaev->GetFixed(_iaevAddCur, &aev); Assert(aetAdd == aev.aet, "Should be an add event at _iaevAddCur"); #endif // DEBUG if (_fOnStage) { // Insert terminating events ONLY if the actor is shown, not hidden AssertDo(_FFreeze(), "Expected freeze event to succeed"); AssertDo(FSetStep(rZero), "Expected set step event to succeed"); } else goto LEnd; #else // BUG1932 AssertDo(_FFreeze(), "Expected freeze event to succeed"); AssertDo(FSetStep(rZero), "Expected set step event to succeed"); #endif //! BUG1932 // By construct, step events SET the location of display // Tweak events override the last step event. for (iaev = _iaevCur - 1; iaev > 0; iaev--) { _pggaev->GetFixed(iaev, &aev); if (aev.rtel != _rtelCur) break; if (aev.aet == aetTweak) { _pggaev->Swap(iaev, _iaevCur - 1); break; } } } } LEnd: if (pvNil != pfAlive) *pfAlive = fAlive; } /*************************************************************************** Delete the path and events beyond this frame **NOTE: This does not send the actor offstage. See FRemFromStageCore. NOTE: While _fLifeDirty flags needed lifetime recomputation, scene's InvalFrmRange() is _not_ called due to the special artifact of the frame slider being spec'd to show extensions but not reductions. On Input: fDeleteAll specifies full route vs subroute deletion If one frame was backed up before the delete, iaevCur is the current event before the backup (else ivNil). Returns *pfAlive = false if all events and route for this actor have been deleted ***************************************************************************/ void ACTR::_DeleteFwdCore(bool fDeleteAll, bool *pfAlive, long iaevCur) { AssertThis(0); long iaev, iaevDelLim; long irpt, irptDelLim; long irptDelFirst; RPT rpt; AEV *paev; if (ivNil == iaevCur) iaevCur = _iaevCur; #ifndef BUG1870 // Delete this section of code: Placement orientation should no // longer be overwritten. // Preserve the current orientation if (_iaevAddCur >= 0) { // If we are reducing the current subroute to a single point, // it is necessary to store the current orientation for wysiwyg paev = (AEV *)_pggaev->QvFixedGet(_iaevAddCur); if (paev->nfrm == _nfrmCur) _SaveCurPathOrien(); } #endif //! BUG1870 // If !fDeleteAll & only one subroute left, redefine fDeleteAll iaevDelLim = _pggaev->IvMac(); irptDelLim = _pglrpt->IvMac(); if (!fDeleteAll) { fDeleteAll = fTrue; for (iaev = iaevCur; iaev < _pggaev->IvMac(); iaev++) { paev = (AEV *)_pggaev->QvFixedGet(iaev); if (aetAdd == paev->aet) { fDeleteAll = fFalse; irptDelLim = paev->rtel.irpt; iaevDelLim = iaev; break; } } } // Remove events beyond the current one // excluding the last freeze event if (0 < iaevDelLim) { for (iaev = iaevDelLim - 1; iaev >= _iaevCur; iaev--) { _RemoveAev(iaev); _fLifeDirty = fTrue; } } // Prune the corresponding route irptDelFirst = _rtelCur.irpt + 1; if (0 < irptDelLim) { // Note: Last remaining point on path is dependent on the event stream if (_iaevCur <= 0 && fDeleteAll) { _pglrpt->FSetIvMac(0); _fLifeDirty = fTrue; _rtelCur.irpt = -1; goto LDone; } else { // Delete the current path node only if no other events // use the same node if (_rtelCur.dwrOffset > rZero) { // Shorten the distance between the last two nodes _TruncateSubRte(irptDelLim); irptDelFirst++; } else { // Delete remaining subroute for (irpt = irptDelLim - 1; irpt >= irptDelFirst; irpt--) { _AdjustAevForRteDel(irpt, 0); _pglrpt->Delete(irpt); _fLifeDirty = fTrue; } } } // Adjust the distance on the tail point if (_rtelCur.irpt >= 0) { Assert(_pglrpt->IvMac() > 0, "Logic Error"); _pglrpt->Get(_rtelCur.irpt, &rpt); rpt.dwr = rZero; _pglrpt->Put(_rtelCur.irpt, &rpt); } } LDone: _pscen->MarkDirty(); if (_nfrmCur < _nfrmFirst) { if (fDeleteAll) { if (pvNil != pfAlive) *pfAlive = fFalse; _InitState(); return; } else if (_pggaev->IvMac() > 0) { paev = (AEV *)_pggaev->QvFixedGet(0); _nfrmFirst = paev->nfrm; Assert(aetAdd == paev->aet, "Bug in ACTR::DeleteFwdCore"); } } if (pvNil != pfAlive) *pfAlive = fTrue; return; } /*************************************************************************** Save the path specific part of the current orientation ***************************************************************************/ void ACTR::_SaveCurPathOrien(void) { AssertBaseThis(0); RPT rpt; AEV aev; ulong grfbra = 0; if (_iaevAddCur >= 0 && !_ptmpl->FIsTdt()) { _pggaev->GetFixed(_iaevAddCur, &aev); _pglrpt->Get(aev.rtel.irpt, &rpt); if (rZero != rpt.dwr) // ie, non-static path segment { // _xfrm.waPath is current and CalcRteOrient() cannot be called // in all cases SetAddOrient(_xfrm.xaPath, _xfrm.yaPath, _xfrm.zaPath, grfbra); } } } /*************************************************************************** Delete the path and events prior to this frame ***************************************************************************/ void ACTR::DeleteBackCore(bool *pfAlive) { AssertThis(0); AssertNilOrVarMem(pfAlive); long iaev; long iaevNew; AEV aev; BRS dwrOffsetT; BRS dwrNew; BRS dwrOld; RPT rptOld; long dnrpt; // Nop if not yet at first frame if (_nfrmCur <= _nfrmFirst) { if (pvNil != pfAlive) *pfAlive = FPure(_pggaev->IvMac() > 0); return; } // We need to update the nfrm field in aetAdd events in order to update // _nfrmFirst below. if (_fLifeDirty && !_FComputeLifetime()) { // Below the new _nfrmFirst will be wrong, but that means the actor // will appear in the wrong frame (iff _fLifeDirty and the next subroute // got moved). Not much we can do about it. PushErc(ercSocBadFrameSlider); } // If the current point is between nodes, a node will // be inserted as the new first node of the subroute. // Compute the dwr of the new node. _pglrpt->Get(_rtelCur.irpt, &rptOld); dwrOld = rptOld.dwr; dwrNew = BrsSub(dwrOld, _rtelCur.dwrOffset); // Preserve the current orientation _SaveCurPathOrien(); // Adjust offsets for events occurring at points between the // previous and next nodes for (iaev = _iaevCur; iaev < _pggaev->IvMac(); iaev++) { _pggaev->GetFixed(iaev, &aev); if (aev.rtel.irpt > _rtelCur.irpt) break; if (aev.rtel.dwrOffset == _rtelCur.dwrOffset) { aev.rtel.dwrOffset = rZero; if (aev.rtel.dnfrm < _rtelCur.dnfrm) { Bug("Event list out of order (dnfrm error)"); aev.rtel.dnfrm = 0; } else { aev.rtel.dnfrm -= _rtelCur.dnfrm; } } if (dwrNew == rZero) aev.rtel.dwrOffset = rZero; else { // Set the event's dwrOffset to the correct // part of the new dwr dwrOffsetT = BrsSub(aev.rtel.dwrOffset, _rtelCur.dwrOffset); aev.rtel.dwrOffset = dwrOffsetT; } _pggaev->PutFixed(iaev, &aev); } // // Alter the route's new first point to be _rtelCur. // with the correct new dwr. Then update _rtelCur. // _GetXyzFromRtel(&_rtelCur, &rptOld.xyz); rptOld.dwr = dwrNew; _pglrpt->Put(_rtelCur.irpt, &rptOld); dnrpt = _rtelCur.irpt; _rtelCur.dnfrm = 0; _rtelCur.dwrOffset = rZero; _rtelCur.irpt = 0; // // Merge the earlier events // Update the necessary state variables // for (iaev = 0; iaev < _iaevCur; iaev++) { _pggaev->GetFixed(iaev, &aev); if (!_fOnStage || iaev < _iaevAddCur) { _RemoveAev(iaev); iaev--; continue; } switch (aev.aet) { case aetRotH: #ifdef BUG1870 // Supercede orient-rotate with current rotation // so that static segment orientation will be preserved // Note: events prior to _iaevFrmMin need to be included // due to orient-rotations lasting the lifetime of static // segments. _pggaev->Put(iaev, &_xfrm.bmat34Cur); goto LDefault; #endif // BUG1870 case aetTweak: case aetSnd: if (iaev < _iaevFrmMin) { _RemoveAev(iaev); iaev--; break; } if (iaev > 0) goto LDefault; break; case aetActn: AEVACTN aevactn; _pggaev->Get(iaev, &aevactn); aevactn.celn = _celnCur; _pggaev->Put(iaev, &aevactn); goto LDefault; case aetRem: _RemoveAev(iaev); iaev--; Bug("Offstage case should be already handled"); break; default: LDefault: aev.rtel = _rtelCur; aev.nfrm = _nfrmCur; _pggaev->PutFixed(iaev, &aev); if (iaev > 0) _MergeAev(0, iaev, &iaevNew); else iaevNew = iaev; if (iaevNew < iaev) iaev--; if (aev.aet == aetAdd) _iaevAddCur = iaevNew; if (aev.aet == aetActn) _iaevActnCur = iaevNew; break; } } // // Adjust the irpt's of the later events // Adjust the absolute beginning frame number // Delete the first section of the route // NOTE: There is no translation in time // if (dnrpt > 0) { // Delete the first section of the route // If offstage, also delete the current point #ifdef BUG1866 if (!_fOnStage) dnrpt++; #endif // BUG1866 for (iaev = _iaevCur; iaev < _pggaev->IvMac(); iaev++) { _pggaev->GetFixed(iaev, &aev); aev.rtel.irpt -= dnrpt; _pggaev->PutFixed(iaev, &aev); } #ifndef BUG1866 if (!_fOnStage) dnrpt++; #endif //! BUG1866 _pglrpt->Delete(0, dnrpt); } if (pvNil != pfAlive) *pfAlive = FPure(_pggaev->IvMac() > 0); if (_pggaev->IvMac() == 0) { _InitState(); } else { // Adjust remaining state variables _pggaev->GetFixed(0, &aev); Assert(aev.aet == aetAdd, "An aetAdd event should be the first event"); _nfrmFirst = aev.nfrm; _fLifeDirty = fTrue; _iaevFrmMin = 0; } if (!_FComputeLifetime()) PushErc(ercSocBadFrameSlider); _pscen->InvalFrmRange(); return; } /*************************************************************************** Truncate the last linear section of the subroute. Make the current point a node. Adjust event entries from the current rtel through events located at irptDelLim. Note: This truncates the route only, not the event list. ***************************************************************************/ void ACTR::_TruncateSubRte(long irptDelLim) { AssertBaseThis(0); AEV aev; long iaev; RPT rptNode1; RPT rptNode2; long iaevLim = _iaevCur; long irpt = _rtelCur.irpt; if (_rtelCur.dwrOffset == rZero) return; // Store the new length between nodes _pglrpt->Get(irpt, &rptNode1); rptNode1.dwr = _rtelCur.dwrOffset; _pglrpt->Put(irpt, &rptNode1); // Move node 2 rather than inserting a node _GetXyzFromRtel(&_rtelCur, &rptNode2.xyz); rptNode2.dwr = rZero; Assert(irpt + 1 < _pglrpt->IvMac(), "Error in truncation"); _pglrpt->Put(irpt + 1, &rptNode2); // Update _rtelCur _rtelCur.dnfrm = 0; _rtelCur.dwrOffset = rZero; _rtelCur.irpt++; // Update aev's rtel's for (iaev = _iaevCur - 1; iaev >= 0; iaev--) { _pggaev->GetFixed(iaev, &aev); if (aev.rtel.irpt < irpt) break; if (aev.rtel.dwrOffset >= rptNode1.dwr) { aev.rtel.dwrOffset = rZero; aev.rtel.irpt++; _pggaev->PutFixed(iaev, &aev); } } // Delete remaining subroute for (irpt = irptDelLim - 1; irpt > _rtelCur.irpt; irpt--) { _AdjustAevForRteDel(irpt, 0); _pglrpt->Delete(irpt); _fLifeDirty = fTrue; } } /*************************************************************************** Is the mouse point within this actor. ***************************************************************************/ bool ACTR::FPtIn(long xp, long yp, long *pibset) { AssertThis(0); AssertVarMem(pibset); return _pbody->FPtInBody(xp, yp, pibset); } /*************************************************************************** FMustRender. Optimizaton: Is Rerendering necessary between _nfrmCur and nfrmLast, exclusive of the current frame? Returns fFalse only when rerendering *known* to be unnecessary. Otherwise returns fTrue. ***************************************************************************/ bool ACTR::FMustRender(long nfrmRenderLast) { AssertThis(0); Assert(nfrmRenderLast >= _nfrmCur, "Invalid argument to FMustRender"); Assert(!_fLifeDirty, "FMustRender was called when nfrm values were invalid"); AEV *paev; long iaev; if (nfrmRenderLast == _nfrmCur) goto LStill; if (nfrmRenderLast < _nfrmFirst) goto LStill; if (_nfrmCur > _nfrmLast) goto LStill; if (_pglrpt->IvMac() == 0) goto LStill; // Intervening events? Sounds don't affect rendering. if (_iaevCur < _pggaev->IvMac()) { paev = (AEV *)_pggaev->QvFixedGet(_iaevCur); if (paev->nfrm <= nfrmRenderLast) { for (iaev = _iaevCur; iaev < _pggaev->IvMac(); iaev++) { paev = (AEV *)_pggaev->QvFixedGet(iaev); if (paev->nfrm > nfrmRenderLast) break; if (aetSnd == paev->aet) continue; if (paev->nfrm < _nfrmLast) goto LMoving; // Freeze and step events affect future frames if (aetFreeze != paev->aet && aetStep != paev->aet) goto LMoving; } } } if (_dwrStep != rZero) goto LMoving; // moving along path // Not advancing, but moving in place? if (_fFrozen || _ccelCur == 1) goto LStill; LMoving: return fTrue; LStill: return fFalse; } /*************************************************************************** Get actor name ***************************************************************************/ void ACTR::GetName(PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); if (!_pscen->Pmvie()->FGetName(_arid, pstn)) { Ptmpl()->GetName(pstn); } } /*************************************************************************** Get actor world coordinates ***************************************************************************/ void ACTR::GetXyzWorld(BRS *pxr, BRS *pyr, BRS *pzr) { AssertThis(0); AssertNilOrVarMem(pxr); AssertNilOrVarMem(pyr); AssertNilOrVarMem(pzr); XYZ xyz; _GetXyzFromRtel(&_rtelCur, &xyz); if (pvNil != pxr) *pxr = BrsAdd(xyz.dxr, _dxyzRte.dxr); if (pvNil != pyr) *pyr = BrsAdd(xyz.dyr, _dxyzRte.dyr); if (pvNil != pzr) *pzr = BrsAdd(xyz.dzr, _dxyzRte.dyr); } /*************************************************************************** Hilite the actor ***************************************************************************/ void ACTR::Hilite(void) { AssertThis(0); BODY::SetHiliteColor(_fTimeFrozen ? kiclrTimeFreezeHilite : kiclrNormalHilite); _pbody->Hilite(); } /*************************************************************************** Change this actor's template. This gets called if the actor is based on a 3-D Text template and the text gets edited. In addition to changing the template itself, this function updates _pbody to conform to the new template, and removes all costume events on body part sets that no longer exist. For instance, if a three-letter text actor was changed to two letters, all costume events on the third letter are deleted. ***************************************************************************/ bool ACTR::FChangeTagTmpl(TAG *ptagTmplNew) { AssertThis(0); AssertVarMem(ptagTmplNew); PTMPL ptmpl; long cbsetNew; long iaev; AEV aev; AEVCOST aevcost; ptmpl = (PTMPL)vptagm->PbacoFetch(ptagTmplNew, TMPL::FReadTmpl); if (pvNil == ptmpl) return fFalse; if (ptmpl->FIsTdt()) { if (!((PTDT)ptmpl)->FAdjustBody(_pbody)) { ReleasePpo(&ptmpl); return fFalse; } } if (!ptmpl->FSetActnCel(_pbody, _anidCur, _celnCur)) return fFalse; _PositionBody(&_xyzCur); ReleasePpo(&_ptmpl); _ptmpl = ptmpl; TAGM::CloseTag(&_tagTmpl); _tagTmpl = *ptagTmplNew; TAGM::DupTag(ptagTmplNew); // If the new TMPL is not a TDT, we're done...although currently this // function should only be called with ptagTmplNew being a TDT if (!ptmpl->FIsTdt()) return fTrue; cbsetNew = _pbody->Cbset(); // Need to remove any costume events acting on ibset >= cbsetNew // Loop backwards to prevent indexing problems since we are deleting // events in this GG as we go for (iaev = _pggaev->IvMac() - 1; iaev >= 0; iaev--) { _pggaev->GetFixed(iaev, &aev); if (aev.aet == aetCost) { _pggaev->Get(iaev, &aevcost); if (aevcost.ibset >= cbsetNew) { _RemoveAev(iaev, fTrue); } } } return fTrue; } #ifdef DEBUG /*************************************************************************** Assert the validity of the ACTR. ***************************************************************************/ void ACTR::AssertValid(ulong grfobj) { ACTR_PAR::AssertValid(fobjAllocated); AssertNilOrPo(_pbody, 0); AssertNilOrPo(_ptmpl, 0); AssertPo(_pggaev, 0); AssertPo(_pglrpt, 0); AssertPo(_pglsmm, 0); long iaevMac = _pggaev->IvMac(); long irptMac = _pglrpt->IvMac(); bool fTracing = FPure(grfobj & fobjAssertFull); AssertIn(_iaevCur, -1, iaevMac + 1); if (irptMac > 0) AssertIn(_rtelCur.irpt, 0, irptMac); if (ivNil != _iaevActnCur) AssertIn(_iaevActnCur, 0, iaevMac); if (_iaevAddCur != ivNil) AssertIn(_iaevAddCur, 0, iaevMac); if (fTracing) { RPT rpt; long irpt; long iaev; AEV aev; bool mpaetfSeen[aetLim]; RTEL rtel; ClearPb(mpaetfSeen, size(mpaetfSeen)); rtel.irpt = -1; rtel.dwrOffset = rZero; rtel.dnfrm = 0; // Supply a debug readable view of br_scalar path for (irpt = 0; irpt < irptMac; irpt++) { _pglrpt->Get(irpt, &rpt); } AssertIn(_rtelCur.irpt, 0, irptMac + 1); // Supply a debug readable view of the event stream _pggaev->GetFixed(0, &aev); Assert(aetAdd == aev.aet, "BUG: No add event at front of list"); for (iaev = 0; iaev < _pggaev->IvMac(); iaev++) { _pggaev->GetFixed(iaev, &aev); Assert(rtel <= aev.rtel, "Illegal ordering in event list"); AssertIn(aev.aet, 0, aetLim); // Verify uniqueness of event types in a single frame bool fNewFrame = (aev.aet == aetAdd || rtel != aev.rtel); if (mpaetfSeen[aev.aet] == fTrue) { switch (aev.aet) { case aetCost: case aetAdd: case aetSnd: break; default: Assert(fNewFrame, "Duplicate events in a single frame"); } } if (fNewFrame) { ClearPb(mpaetfSeen, size(mpaetfSeen)); } mpaetfSeen[aev.aet] = fTrue; rtel = aev.rtel; _pglrpt->Get(aev.rtel.irpt, &rpt); Assert(aev.rtel.dwrOffset < rpt.dwr || rpt.dwr == rZero, "Invalid rtel.dwrOffset"); // Variable portion of aev retrieved for debug viewing switch (aev.aet) { case aetAdd: { AEVADD aevadd; Assert(_pggaev->Cb(iaev) == kcbVarAdd, "Corrupt size in event list"); _pggaev->Get(iaev, &aevadd); break; } case aetActn: { AEVACTN aevactn; _pggaev->Get(iaev, &aevactn); Assert(_pggaev->Cb(iaev) == kcbVarActn, "Corrupt size in event list"); break; } case aetCost: Assert(_pggaev->Cb(iaev) == kcbVarCost, "Corrupt size in event list"); break; case aetRotF: case aetRotH: Assert(_pggaev->Cb(iaev) == kcbVarRot, "Corrupt size in event list"); break; case aetSize: Assert(_pggaev->Cb(iaev) == kcbVarSize, "Corrupt size in event list"); break; case aetPull: Assert(_pggaev->Cb(iaev) == kcbVarPull, "Corrupt size in event list"); break; case aetSnd: break; case aetFreeze: { long faevfrz; _pggaev->Get(iaev, &faevfrz); Assert(_pggaev->Cb(iaev) == kcbVarFreeze, "Corrupt size in event list"); break; } case aetTweak: Assert(_pggaev->Cb(iaev) == kcbVarTweak, "Corrupt size in event list"); break; case aetStep: { BRS dwrAev; _pggaev->Get(iaev, &dwrAev); Assert(_pggaev->Cb(iaev) == kcbVarStep, "Corrupt size in event list"); break; } case aetRem: break; case aetMove: Assert(_pggaev->Cb(iaev) == kcbVarMove, "Corrupt size in event list"); break; default: Assert(0, "Unknown event type"); } } } } /*************************************************************************** Mark memory used by the ACTR ***************************************************************************/ void ACTR::MarkMem(void) { AssertThis(0); long iaev; AEV *paev; AEVSND *paevsnd; ACTR_PAR::MarkMem(); for (iaev = 0; iaev < _pggaev->IvMac(); iaev++) { paev = (AEV *)_pggaev->QvFixedGet(iaev); if (aetSnd == paev->aet) { paevsnd = (AEVSND *)_pggaev->QvGet(iaev); if (paevsnd->tag.sid == ksidUseCrf) paevsnd->tag.MarkMem(); } } MarkMemObj(_pggaev); MarkMemObj(_pglrpt); MarkMemObj(_pbody); MarkMemObj(_ptmpl); MarkMemObj(_pglsmm); _tagTmpl.MarkMem(); } #endif // DEBUG ================================================ FILE: src/engine/actredit.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Actor Edit. Cut/Copy/Paste/Undo Primary authors: ACLP::(clipbd) Seanse AUND::(undo) Seanse ACTR::(undo) Seanse ACTR::(vacuum) ***** ACTR::(dup/restore) ***** Review Status: Reviewed ***************************************************************************/ #include "soc.h" ASSERTNAME RTCLASS(AUND) /*************************************************************************** Duplicate the actor from this frame through the end of subroute or (if fEntireScene) the end of the scene ***************************************************************************/ bool ACTR::FCopy(PACTR *ppactr, bool fEntireScene) { AssertThis(0); AssertVarMem(ppactr); long iaev; long iaevLast; AEV aev; AEVACTN aevactn; AEVSND aevsnd; RPT rpt; RPT rptOld; RPT *prptSrc; RPT *prptDest; (*ppactr) = PactrNew(&_tagTmpl); if (*ppactr == pvNil) { return fFalse; } // If the current point is between nodes, a node will // be inserted. Compute its dwr. _pglrpt->Get(_rtelCur.irpt, &rpt); rptOld.dwr = rpt.dwr; rpt.dwr = BrsSub(rptOld.dwr, _rtelCur.dwrOffset); // // Gather all earlier events & move to the current one // It is sufficient to begin with the current subroute // Note: Add events will require later translation of nfrm // for (iaev = _iaevAddCur; iaev < _iaevCur; iaev++) { _pggaev->GetFixed(iaev, &aev); // Is this an event we want to copy? switch (aev.aet) { case aetActn: // Copy, editing current cel only _pggaev->Get(iaev, &aevactn); aevactn.celn = _celnCur; break; // copy case aetAdd: case aetCost: case aetPull: case aetSize: case aetRotF: case aetFreeze: case aetStep: case aetMove: break; // The following events are not automatically copied case aetSnd: _pggaev->Get(iaev, &aevsnd); // Update the cno for the chid from the original movie // The scene this came from may be lost later if (!_pscen->Pmvie()->FResolveSndTag(&aevsnd.tag, aevsnd.chid)) { goto LFail; } _pggaev->Put(iaev, &aevsnd); if (aevsnd.celn == smmNil && iaev >= _iaevFrmMin) break; if (iaev > _iaevActnCur && aevsnd.celn != smmNil) { // Retain current motion match sounds break; } continue; case aetTweak: case aetRotH: #ifdef BUG1950 // REVIEW (*****): Postponed till v2.0 if (iaev >= _iaevCur) // Code change not yet verified #else //! BUG1950 if (iaev >= _iaevFrmMin) #endif //! BUG1950 { // Retain these events from this frame break; } continue; case aetRem: continue; // Do not copy default: Bug("Unknown event type... Copy or Not?"); break; } // set the event to happen right here. aev.rtel.dnfrm = 0; aev.rtel.irpt = 0; aev.rtel.dwrOffset = 0; iaevLast = (*ppactr)->_pggaev->IvMac(); // Insert aev. Tag ref count will be updated. _pggaev->Lock(); if (!(*ppactr)->_FInsertAev(iaevLast, _pggaev->Cb(iaev), (aev.aet == aetActn) ? &aevactn : _pggaev->QvGet(iaev), &aev, fFalse)) { _pggaev->Unlock(); goto LFail; } _pggaev->Unlock(); (*ppactr)->_MergeAev(0, iaevLast); } // // Copy remaining events, adjusting their locations // for (iaev = _iaevCur; iaev < _pggaev->IvMac(); iaev++) { _pggaev->GetFixed(iaev, &aev); if ((!fEntireScene) && (aetAdd == aev.aet) && (*ppactr)->_pggaev->IvMac() > 0) { break; } // Adjust the event indicies. aev.rtel.irpt -= _rtelCur.irpt; if (aev.rtel.irpt == 0) { if (aev.rtel.dwrOffset == _rtelCur.dwrOffset) { aev.rtel.dwrOffset = rZero; if (aev.rtel.dnfrm < _rtelCur.dnfrm) { aev.rtel.dnfrm = 0; } else { aev.rtel.dnfrm -= _rtelCur.dnfrm; } } else { if (rpt.dwr == rZero) aev.rtel.dwrOffset = rZero; else { aev.rtel.dwrOffset = BrsSub(aev.rtel.dwrOffset, _rtelCur.dwrOffset); } } } // Insert will update the tag ref count iaevLast = (*ppactr)->_pggaev->IvMac(); _pggaev->Lock(); if (!(*ppactr)->_FInsertAev(iaevLast, _pggaev->Cb(iaev), _pggaev->QvGet(iaev), &aev, fFalse)) { _pggaev->Unlock(); goto LFail; } _pggaev->Unlock(); } // // Add the point we are at. // if (!(*ppactr)->_pglrpt->FInsert(0, &rpt)) { goto LFail; } // // Copy the rest of the subroute or route // if ((_rtelCur.irpt + 1) < _pglrpt->IvMac()) { // Locate the amount of route to copy // long irptLim = _pglrpt->IvMac(); long irpt; if (!fEntireScene) { for (irpt = _rtelCur.irpt; irpt < irptLim; irpt++) { _pglrpt->Get(irpt, &rpt); if (rZero == rpt.dwr) { irptLim = irpt + 1; break; } } } if (!(*ppactr)->_pglrpt->FSetIvMac((*ppactr)->_pglrpt->IvMac() + irptLim - (_rtelCur.irpt + 1))) { goto LFail; } prptSrc = (RPT *)_pglrpt->QvGet(_rtelCur.irpt + 1); prptDest = (RPT *)(*ppactr)->_pglrpt->QvGet(1); CopyPb(prptSrc, prptDest, LwMul(irptLim - (_rtelCur.irpt + 1), size(RPT))); } else { // Mark the end of the path rpt.dwr = rZero; (*ppactr)->_pglrpt->Put(0, &rpt); } (*ppactr)->_SetStateRewound(); AssertPo(*ppactr, 0); return fTrue; LFail: ReleasePpo(ppactr); return fFalse; } /*************************************************************************** Duplicate the entire actor from *this onto *ppactr This is not from this frame on. The entire actor is duplicated. This does not duplicate the Brender body. Default is fReset = fFalse; NOTE: Upon exit, the new actor will still be in the scene. If (!fReset), all state information will have been retained. ***************************************************************************/ bool ACTR::FDup(PACTR *ppactr, bool fReset) { AssertThis(0); AssertVarMem(ppactr); long cactRef; PACTR pactrSrc = this; PACTR pactrDest; // Due to state var duplication, using NewObj, not PactrNew pactrDest = (*ppactr) = NewObj ACTR(); if (*ppactr == pvNil) { return fFalse; } // AddRef only if attached to a scene if (pvNil != _pbody) _pbody->AddRef(); _ptmpl->AddRef(); TAGM::DupTag(&_tagTmpl); // Copy over all members // Note that both copies will point to the same *_pbody & *_ptmpl cactRef = pactrDest->_cactRef; *(pactrDest) = *pactrSrc; pactrDest->_cactRef = cactRef; pactrDest->_fTimeFrozen = fFalse; if (!pactrDest->_FCreateGroups()) { goto LFail; } if (!_FDupCopy(pactrSrc, pactrDest)) { goto LFail; } if (fReset) { (*ppactr)->Reset(); } return fTrue; LFail: ReleasePpo(ppactr); return fFalse; } /*************************************************************************** Restore the actor from *ppactr onto *this ***************************************************************************/ void ACTR::Restore(PACTR pactr) { AssertThis(0); AssertVarMem(pactr); long cactRef; PACTR pactrSrc = pactr; PACTR pactrDest = this; Assert(pactr->_ptmpl == _ptmpl, "Restore ptmpl logic error"); Assert(pactr->_pbody == _pbody, "Restore pbody logic error"); // Copy over all members // Note that both copies will point to the same *_pbody & *_ptmpl cactRef = pactrDest->_cactRef; PGG pggaev = pactrDest->_pggaev; PGL pglrpt = pactrDest->_pglrpt; PGL pglsmm = pactrDest->_pglsmm; *(pactrDest) = *pactrSrc; pactrDest->_cactRef = cactRef; pactrDest->_pggaev = pggaev; pactrDest->_pglrpt = pglrpt; pactrDest->_pglsmm = pglsmm; // Swap the gl and gg structures SwapVars(&pactrSrc->_pggaev, &pactrDest->_pggaev); SwapVars(&pactrSrc->_pglrpt, &pactrDest->_pglrpt); SwapVars(&pactrSrc->_pglsmm, &pactrDest->_pglsmm); pactr->_pscen->Pmvie()->InvalViews(); return; } /*************************************************************************** Restore this actor from an undo object pactrRestore. ***************************************************************************/ void ACTR::_RestoreFromUndo(PACTR pactrRestore) { AssertBaseThis(0); AssertVarMem(pactrRestore); Assert(pactrRestore->_pbody == pvNil, "Not restoring from undo object"); long nfrmCur = _nfrmCur; PSCEN pscen = pactrRestore->_pscen; // Modify pactrRestore for Restore() pactrRestore->_pbody = _pbody; pactrRestore->_pscen = _pscen; _Hide(); // Added actor will show Restore(pactrRestore); // Restore pactrRestore to be unmodified pactrRestore->_pbody = pvNil; pactrRestore->_pscen = pscen; FGotoFrame(nfrmCur); // No further recovery meaningful _pscen->Pmvie()->InvalViews(); } /*************************************************************************** Copy the GG and GL structures for actor duplication/restoration NOTE: This is not from this frame on. The entire actor is duplicated. ***************************************************************************/ bool ACTR::_FDupCopy(PACTR pactrSrc, PACTR pactrDest) { AssertBaseThis(0); AssertPo(pactrDest->_pggaev, 0); AssertPo(pactrDest->_pglrpt, 0); RPT *prptSrc; RPT *prptDest; SMM *psmmSrc; SMM *psmmDest; // // Copy all events. // if (!pactrDest->_pggaev->FCopyEntries(pactrSrc->_pggaev, 0, 0, pactrSrc->_pggaev->IvMac())) { goto LFail; } { _pggaev->Lock(); for (long iaev = 0; iaev < _pggaev->IvMac(); iaev++) { PTAG ptag; if (_FIsIaevTag(_pggaev, iaev, &ptag)) TAGM::DupTag(ptag); } _pggaev->Unlock(); } // // Copy Route // if (pactrSrc->_pglrpt->IvMac() > 0) { if (!pactrDest->_pglrpt->FSetIvMac(pactrSrc->_pglrpt->IvMac())) { goto LFail; } prptSrc = (RPT *)pactrSrc->_pglrpt->QvGet(0); prptDest = (RPT *)pactrDest->_pglrpt->QvGet(0); CopyPb(prptSrc, prptDest, LwMul(pactrSrc->_pglrpt->IvMac(), size(RPT))); } // // Copy Smm // if (pactrSrc->_pglsmm->IvMac() > 0) { if (!pactrDest->_pglsmm->FSetIvMac(pactrSrc->_pglsmm->IvMac())) { goto LFail; } psmmSrc = (SMM *)pactrSrc->_pglsmm->QvGet(0); psmmDest = (SMM *)pactrDest->_pglsmm->QvGet(0); CopyPb(psmmSrc, psmmDest, LwMul(pactrSrc->_pglsmm->IvMac(), size(SMM))); } return fTrue; LFail: if (this != pactrDest) ReleasePpo(&pactrDest); return fFalse; } /*************************************************************************** Duplicate the indicated portion of the route from this frame on from actor "this" to actor *ppactr. Note **: The point on the route may not land on a node. If between nodes, insert a point to make the two route sections identical. ***************************************************************************/ bool ACTR::FCopyRte(PACTR *ppactr, bool fEntireScene) { AssertThis(0); AssertVarMem(ppactr); long irpt; long dnrpt; long irptLim; RPT rpt; RPT rpt1; RPT rptNode; (*ppactr) = PactrNew(&_tagTmpl); if (*ppactr == pvNil) { return fFalse; } // // Insert the current point // _GetXyzFromRtel(&_rtelCur, &rpt.xyz); _pglrpt->Get(_rtelCur.irpt, &rptNode); rpt.dwr = rZero; if (_rtelCur.dwrOffset == rZero) { rpt.dwr = rptNode.dwr; } else if (rptNode.dwr > rZero && _rtelCur.irpt < _pglrpt->IvMac() - 1) { _pglrpt->Get(_rtelCur.irpt + 1, &rpt1); rpt.dwr = BR_LENGTH3(BrsSub(rpt1.xyz.dxr, rpt.xyz.dxr), BrsSub(rpt1.xyz.dyr, rpt.xyz.dyr), BrsSub(rpt1.xyz.dzr, rpt.xyz.dzr)); if (rZero == rpt.dwr) { rpt.dwr = rEps; // Epsilon. Prevent pathological incorrect end-of-path } } if (!(*ppactr)->_pglrpt->FInsert(0, &rpt)) { goto LFail; } if ((!fEntireScene) && rpt.dwr == rZero) { goto LEnd; } // // If copying subroute only, determine amount to copy // irptLim = _pglrpt->IvMac(); if (!fEntireScene) { for (irpt = _rtelCur.irpt + 1; irpt < irptLim; irpt++) { _pglrpt->Get(irpt, &rpt); if (rZero == rpt.dwr) { irptLim = irpt + 1; break; } } } // // Copy indicated portion of the route // dnrpt = irptLim - (_rtelCur.irpt + 1); if (dnrpt > 0 && !(*ppactr)->_pglrpt->FEnsureSpace(dnrpt, fgrpNil)) goto LFail; for (irpt = _rtelCur.irpt + 1; irpt < irptLim; irpt++) { _pglrpt->Get(irpt, &rpt); if (!(*ppactr)->_pglrpt->FInsert(irpt - _rtelCur.irpt, &rpt)) { goto LFail; } if ((!fEntireScene) && (rZero == rpt.dwr)) { break; } } LEnd: (*ppactr)->_SetStateRewound(); return fTrue; LFail: ReleasePpo(ppactr); return fFalse; } /*************************************************************************** Paste the rte from the clipboard pactr to the current actor's current frame onward. On failure, unwinding is expected to be via the dup'd actor from undo. This overwrites the end of the current subroute. NOTE: To be meaningful, the pasted route section is translated to extend from the current point. ***************************************************************************/ bool ACTR::FPasteRte(PACTR pactr) { AssertThis(0); AssertVarMem(pactr); AEV aev; RPT rpt; RPT rptCur; XYZ dxyz; long iaev; long irpt; #ifdef STATIC bool fStatic; #endif // STATIC long crptDel = 0; long crptNew = pactr->_pglrpt->IvMac() - 1; if (crptNew <= 0) { PushErc(ercSocNothingToPaste); return fFalse; } if (!_pglrpt->FEnsureSpace(crptNew, fgrpNil) || !_pggaev->FEnsureSpace(1, kcbVarStep, fgrpNil)) { return fFalse; } // // May be positioned between nodes -> potentially // insert the current point // _GetXyzFromRtel(&_rtelCur, &rptCur.xyz); if (rZero != _rtelCur.dwrOffset) { BRS dwrCur = _rtelCur.dwrOffset; _rtelCur.irpt++; _rtelCur.dwrOffset = rZero; _rtelCur.dnfrm = 0; if (!_FInsertGgRpt(_rtelCur.irpt, &rptCur, dwrCur)) return fFalse; _GetXyzFromRtel(&_rtelCur, &_xyzCur); _AdjustAevForRteIns(_rtelCur.irpt, 0); } // // Delete to the end of this *sub*route // for (irpt = _rtelCur.irpt + 1; irpt < _pglrpt->IvMac(); irpt++) { _pglrpt->Get(irpt, &rpt); crptDel++; if (rpt.dwr == rZero) { break; } } if (crptDel > 0) { _pglrpt->Delete(_rtelCur.irpt, crptDel); } // // Remove events until the end of the *sub*route // Space optimization: should precede paste // Update location pointer of events of later subroutes // for (iaev = _iaevCur; iaev < _pggaev->IvMac(); iaev++) { _pggaev->GetFixed(iaev, &aev); if (aev.rtel.irpt > _rtelCur.irpt + crptDel) { aev.rtel.irpt += crptNew - crptDel; _pggaev->PutFixed(iaev, &aev); continue; } else { _RemoveAev(iaev, fFalse); iaev--; } } // // Paste in the new route. // Translate the points of this section of route // Adjust the aev presently // pactr->_pglrpt->Get(0, &rpt); dxyz.dxr = BrsSub(rptCur.xyz.dxr, rpt.xyz.dxr); dxyz.dyr = BrsSub(rptCur.xyz.dyr, rpt.xyz.dyr); dxyz.dzr = BrsSub(rptCur.xyz.dzr, rpt.xyz.dzr); for (irpt = 1; irpt <= crptNew; irpt++) { pactr->_pglrpt->Get(irpt, &rpt); rpt.xyz.dxr = BrsAdd(rpt.xyz.dxr, dxyz.dxr); rpt.xyz.dyr = BrsAdd(rpt.xyz.dyr, dxyz.dyr); rpt.xyz.dzr = BrsAdd(rpt.xyz.dzr, dxyz.dzr); AssertDo(_pglrpt->FInsert(_rtelCur.irpt + irpt, &rpt), "Logic error"); } // // Set the right dwr distance from the current point to // the first point on the new section of route // _pglrpt->Get(_rtelCur.irpt + 1, &rpt); rptCur.dwr = BR_LENGTH3(BrsSub(rpt.xyz.dxr, rptCur.xyz.dxr), BrsSub(rpt.xyz.dyr, rptCur.xyz.dyr), BrsSub(rpt.xyz.dzr, rptCur.xyz.dzr)); if (rZero == rptCur.dwr) rptCur.dwr = rEps; // Epsilon. Prevent pathological incorrect end-of-path _pglrpt->Put(_rtelCur.irpt, &rptCur); #ifdef STATIC // // Force floating behavior on a static action // Assert(_iaevActnCur >= 0, "Actor has no action"); if (!_FGetStatic(_anidCur, &fStatic)) return fFalse; if (fStatic) { if (!FSetStep(kdwrNil)) return fFalse; } #else //! STATIC // Force continuation onto newly pasted path if (!FSetStep(kdwrNil)) return fFalse; #endif //! STATIC // // Set new end of path freeze & step events // long faevfrz = (long)fTrue; BRS dwrStep = rZero; aev.aet = aetFreeze; aev.rtel.irpt = _rtelCur.irpt + crptNew; aev.rtel.dnfrm = 0; aev.rtel.dwrOffset = rZero; aev.nfrm = _nfrmCur; // will be updated in ComputeLifetime() if (!_FInsertAev(_iaevCur, kcbVarFreeze, &faevfrz, &aev)) return fFalse; aev.aet = aetStep; if (!_FInsertAev(_iaevCur, kcbVarStep, &dwrStep, &aev)) return fFalse; _fLifeDirty = fTrue; _pscen->InvalFrmRange(); _pscen->MarkDirty(); _PositionBody(&_xyzCur); return fTrue; } /*************************************************************************** Put an already existing actor in this scene. ***************************************************************************/ bool ACTR::FPaste(long nfrm, SCEN *pscen) { AssertThis(0); AEV aev; RPT rpt; AEVADD aevadd; AEVSND aevsnd; BRS xrCam = rZero; BRS yrCam = rZero; BRS zrCam = kzrDefault; BRS xr, yr, zr; long iaev; long dnfrm; #ifdef BUG1888 PTMPL ptmpl; PCRF pcrf; TAG tag; // // Ensure that the tag to the TDT being pasted is in the current movie. // if (FIsTdt()) { Assert(_tagTmpl.sid == ksidUseCrf, "TDTs should be stored in a document!"); if (!pscen->Pmvie()->FEnsureAutosave(&pcrf)) { return fFalse; } if (pcrf != _tagTmpl.pcrf) { // Need to save this actor's tagTmpl in this movie because it came from another movie tag = _tagTmpl; TAGM::DupTag(&tag); // Save the tag to the movie's _pcrfAutosave. The tag now // points to the copy in this movie. if (!TAGM::FSaveTag(&tag, pcrf, fTrue)) { TAGM::CloseTag(&tag); return fFalse; } // Get a template based on the new tag ptmpl = (PTMPL)vptagm->PbacoFetch(&tag, TMPL::FReadTmpl); if (pvNil == ptmpl) { TAGM::CloseTag(&tag); return fFalse; } // Change the actor to use the new tag and template TAGM::CloseTag(&_tagTmpl); _tagTmpl = tag; ReleasePpo(&_ptmpl); _ptmpl = ptmpl; } } #endif // BUG1888 // // Update lifetime // _nfrmFirst = nfrm; _fLifeDirty = fTrue; _nfrmCur = nfrm - 1; SetPscen(pscen); // Always place actors on the "floor" _GetNewOrigin(&xr, &yr, &zr); Assert(_pggaev->IvMac() > 0, "Nothing to paste!"); _pggaev->GetFixed(0, &aev); if (aev.aet != aetAdd) return fFalse; dnfrm = aev.nfrm - nfrm; // // Begin by locating the actor at (xr,yr,zr) // There are no Full path or Sub path translations at this point. // Note: In order to place a pasted actor at the insertion point, // the translation needs to compensate for the distance // recorded in each path point -> subtract the first path point. _pglrpt->Get(0, &rpt); _dxyzSubRte.dxr = rZero; _dxyzSubRte.dyr = rZero; _dxyzSubRte.dzr = rZero; _dxyzFullRte.dxr = BrsSub(xr, rpt.xyz.dxr); _dxyzFullRte.dyr = BrsSub(yr, rpt.xyz.dyr); _dxyzFullRte.dzr = BrsSub(zr, rpt.xyz.dzr); _pggaev->Get(0, &aevadd); _dxyzFullRte.dxr = BrsSub(_dxyzFullRte.dxr, aevadd.dxr); _dxyzFullRte.dyr = BrsSub(_dxyzFullRte.dyr, aevadd.dyr); _dxyzFullRte.dzr = BrsSub(_dxyzFullRte.dzr, aevadd.dzr); // // Translate the new actor in time // Update sound events for (iaev = 0; iaev < _pggaev->IvMac(); iaev++) { _pggaev->GetFixed(iaev, &aev); if (dnfrm != 0) { aev.nfrm -= dnfrm; _pggaev->PutFixed(iaev, &aev); } if (aetSnd != aev.aet) continue; _pggaev->Get(iaev, &aevsnd); if (aevsnd.tag.sid != ksidUseCrf) continue; // Save tag (this may be a new movie) if (!aevsnd.tag.pcrf->Pcfl()->FFind(aevsnd.tag.ctg, aevsnd.tag.cno)) { PushErc(ercSocNoSndOnPaste); _RemoveAev(iaev); iaev--; continue; } if (!_pscen->Pmvie()->FSaveTagSnd(&aevsnd.tag)) { Bug("Expected to locate user sound chunk"); _RemoveAev(iaev); iaev--; } else { // Adopt this sound into the new scene if (!_pscen->Pmvie()->FChidFromUserSndCno(aevsnd.tag.cno, &aevsnd.chid)) return fFalse; // Update event _pggaev->Put(iaev, &aevsnd); } } // Rotate 3D spletters to face the camera if (_ptmpl->FIsTdt()) { _pggaev->Get(0, &aevadd); aevadd.ya = _pscen->Pbkgd()->BraRotYCamera(); _pggaev->Put(0, &aevadd); } _UpdateXyzRte(); _pscen->MarkDirty(); return fTrue; } /*************************************************************************** Make an actor look like they were just read in, and never in a scene. ***************************************************************************/ void ACTR::Reset(void) { _pscen = pvNil; ReleasePpo(&_pbody); // Sets _pbody = pvNil _nfrmCur = knfrmInvalid; _InitState(); } // // // // // BEGIN CLIPBOARD STUFF // // // // RTCLASS(ACLP) /*************************************************************************** Create an actor clipboard object This is from the current frame forward ***************************************************************************/ PACLP ACLP::PaclpNew(PACTR pactr, bool fRteOnly, bool fEntireScene) { AssertPo(pactr, 0); Assert(!fRteOnly || !fEntireScene, "Expecting subroute only"); PACLP paclp; PACTR pactrTmp; STN stn, stnCopyOf; paclp = NewObj ACLP(); if (paclp == pvNil) { return (pvNil); } if (fRteOnly) { if (!pactr->FCopyRte(&pactrTmp, fEntireScene)) { ReleasePpo(&paclp); return (pvNil); } } else { if (!pactr->FCopy(&pactrTmp, fEntireScene)) { ReleasePpo(&paclp); return (pvNil); } AssertPo(pactrTmp, 0); pactr->GetName(&stn); pactr->Pscen()->Pmvie()->Pmcc()->GetStn(idsEngineCopyOf, &stnCopyOf); if (!FEqualRgb(stn.Psz(), stnCopyOf.Psz(), CchSz(stnCopyOf.Psz()) * size(achar))) { paclp->_stnName = stnCopyOf; if (!paclp->_stnName.FAppendCh(kchSpace) || !paclp->_stnName.FAppendStn(&stn)) { PushErc(ercSocNameTooLong); ReleasePpo(&paclp); return (pvNil); } } else { paclp->_stnName = stn; } } paclp->_pactr = pactrTmp; paclp->_fRteOnly = fRteOnly; AssertPo(paclp, 0); return (paclp); } /*************************************************************************** Destroys an actor clipboard object ***************************************************************************/ ACLP::~ACLP(void) { ReleasePpo(&_pactr); } /*************************************************************************** Pastes an actor clipboard object ***************************************************************************/ bool ACLP::FPaste(PMVIE pmvie) { AssertThis(0); AssertPo(pmvie, 0); PACTR pactrNew; if (_fRteOnly) { return (pmvie->FPasteActrPath(_pactr)); } // // Duplicate the actor // if (!_pactr->FDup(&pactrNew, fTrue)) { return (fFalse); } AssertPo(pactrNew, 0); if (!pmvie->FPasteActr(pactrNew)) { ReleasePpo(&pactrNew); return (fFalse); } if (!pmvie->FNameActr(pactrNew->Arid(), &_stnName)) { pmvie->Pscen()->RemActrCore(pactrNew->Arid()); ReleasePpo(&pactrNew); return (fFalse); } ReleasePpo(&pactrNew); return (fTrue); } #ifdef DEBUG /**************************************************** * Mark memory used by the ACLP * * Parameters: * None. * * Returns: * None. * ****************************************************/ void ACLP::MarkMem(void) { ACLP_PAR::MarkMem(); MarkMemObj(_pactr); } /*************************************************************************** * Assert the validity of the ACLP * * Parameters: * grf - bit array of options * * Returns: * None. * **************************************************************************/ void ACLP::AssertValid(ulong grf) { ACLP_PAR::AssertValid(fobjAllocated); _pactr->AssertValid(grf); } #endif /*************************************************************************** Create an undo object ***************************************************************************/ bool ACTR::FCreateUndo(PACTR pactrDup, bool fSndUndo, PSTN pstn) { AssertPo(pactrDup, 0); AssertNilOrPo(pstn, 0); PAUND paund; paund = AUND::PaundNew(); if (paund == pvNil) { return fFalse; } paund->SetPactr(pactrDup); paund->SetArid(_arid); paund->SetSndUndo(fSndUndo); if (pvNil != pstn) paund->SetStn(pstn); if (!_pscen->Pmvie()->FAddUndo(paund)) { _pscen->Pmvie()->ClearUndo(); ReleasePpo(&paund); return (fFalse); } ReleasePpo(&paund); // // Detach from the scene // pactrDup->Reset(); return (fTrue); } /*************************************************************************** Add (or replace) an action, and create an undo object ***************************************************************************/ bool ACTR::FSetAction(long anid, long celn, bool fFreeze, PACTR *ppactrDup) { AssertThis(0); AssertNilOrVarMem(ppactrDup); PACTR pactrDup; if (!FDup(&pactrDup)) { return (fFalse); } if (!FSetActionCore(anid, celn, fFreeze)) { Restore(pactrDup); ReleasePpo(&pactrDup); return fFalse; } if (!FCreateUndo(pactrDup)) { Restore(pactrDup); ReleasePpo(&pactrDup); return (fFalse); } if (pvNil == ppactrDup) ReleasePpo(&pactrDup); else *ppactrDup = pactrDup; return fTrue; } /*************************************************************************** Add the event to the event list: Add actor on the stage, and create undo object. ***************************************************************************/ bool ACTR::FAddOnStage(void) { AssertThis(0); PACTR pactrDup; if (!FDup(&pactrDup)) { return (fFalse); } if (!FAddOnStageCore()) { Restore(pactrDup); ReleasePpo(&pactrDup); return fFalse; } if (!FCreateUndo(pactrDup)) { Restore(pactrDup); ReleasePpo(&pactrDup); return (fFalse); } ReleasePpo(&pactrDup); return fTrue; } /*************************************************************************** Normalize an actor. ***************************************************************************/ bool ACTR::FNormalize(ulong grfnorm) { AssertThis(0); PACTR pactrDup; if (!FDup(&pactrDup)) { return (fFalse); } if (!FNormalizeCore(grfnorm)) { Restore(pactrDup); ReleasePpo(&pactrDup); return fFalse; } if (!FCreateUndo(pactrDup)) { Restore(pactrDup); ReleasePpo(&pactrDup); return (fFalse); } ReleasePpo(&pactrDup); return fTrue; } /*************************************************************************** Set the Costume for a body part Add the event to the event list ***************************************************************************/ bool ACTR::FSetCostume(long ibset, TAG *ptag, long cmid, tribool fCmtl) { AssertThis(0); Assert(fCmtl || ibset >= 0, "Invalid ibset argument"); AssertVarMem(ptag); PACTR pactrDup; FDup(&pactrDup); if (!FSetCostumeCore(ibset, ptag, cmid, fCmtl)) { Restore(pactrDup); ReleasePpo(&pactrDup); return fFalse; } if (!FCreateUndo(pactrDup)) { Restore(pactrDup); ReleasePpo(&pactrDup); return (fFalse); } ReleasePpo(&pactrDup); return fTrue; } /*************************************************************************** Delete the path and events from this frame and beyond **NOTE: This does not send the actor offstage. See FRemFromStageCore. On Input: fDeleteAll specifies full route vs subroute deletion Returns *pfAlive = false if all events and route for this actor have been deleted ***************************************************************************/ bool ACTR::FDelete(bool *pfAlive, bool fDeleteAll) { AssertThis(0); PACTR pactrDup; long iaevCurSav; AEV *paev; if (!FDup(&pactrDup)) { if (pvNil != pfAlive) TrashVar(pfAlive); return fFalse; } // Unless we are deleting to the end of the scene, // we need to special case deletion that begins at // the same frame as the Add event - otherwise, the // code backs up one frame, putting the current frame // on the previous subroute. // Note: FDelete() does not require that the current // frame be later than _nfrmFirst. if (_iaevAddCur >= 0 && !fDeleteAll) { paev = (AEV *)_pggaev->QvFixedGet(_iaevAddCur); if (_nfrmCur == paev->nfrm) { if (!_FDeleteEntireSubrte()) goto LFail; if (pvNil != pfAlive) *pfAlive = FPure(_pggaev->IvMac() > 0); goto LDeleted; } } // Go to the previous frame to update state variables iaevCurSav = _iaevCur; if (!FGotoFrame(_nfrmCur - 1)) { goto LFail; } #ifndef BUG1870 // The next two lines are obsolete & cause placement orientation bugs // Save the current orientation _SaveCurPathOrien(); #endif //! BUG1870 DeleteFwdCore(fDeleteAll, pfAlive, iaevCurSav); // Return to original frame // _nfrmCur was decremented above if (!FGotoFrame(_nfrmCur + 1)) { goto LFail; } /* Might have deleted some sound events */ if (Pscen() != pvNil) Pscen()->UpdateSndFrame(); LDeleted: // The frame slider never required lifetime recomputation at this point. // Motion match sounds and prerendering both do, however. if (!_FComputeLifetime()) PushErc(ercSocBadFrameSlider); if (!FCreateUndo(pactrDup)) { Restore(pactrDup); ReleasePpo(&pactrDup); return fFalse; } ReleasePpo(&pactrDup); return fTrue; LFail: PushErc(ercSocGotoFrameFailure); ReleasePpo(&pactrDup); return fFalse; } /*************************************************************************** Add the event to the event list: Remove actor from the stage, and an Undo. NOTE: This should be called the call to place the actor offstage ***************************************************************************/ bool ACTR::FRemFromStage(void) { AssertThis(0); PACTR pactr; if (!FDup(&pactr)) { return (fFalse); } if (!FRemFromStageCore()) { Restore(pactr); return fFalse; } if (!FCreateUndo(pactr)) { Restore(pactr); ReleasePpo(&pactr); return (fFalse); } ReleasePpo(&pactr); return fTrue; } /**************************************************** * * Public constructor for actor undo objects. * * Parameters: * None. * * Returns: * pvNil if failure, else a pointer to the movie undo. * ****************************************************/ PAUND AUND::PaundNew() { PAUND paund; paund = NewObj AUND(); AssertNilOrPo(paund, 0); return (paund); } /**************************************************** * * Destructor for actor undo objects * ****************************************************/ AUND::~AUND(void) { AssertBaseThis(0); ReleasePpo(&_pactr); } /**************************************************** * * Does a command stored in an undo object. * * Parameters: * None. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool AUND::FDo(PDOCB pdocb) { AssertThis(0); AssertPo(pdocb, 0); long nfrmTmp; bool fRet; if (!_fSoonerLater) { return (FUndo(pdocb)); } nfrmTmp = _nfrm; _nfrm = _nfrmLast; fRet = FUndo(pdocb); _nfrm = nfrmTmp; return (fRet); } /**************************************************** * * Undoes a command stored in an undo object. * * Parameters: * None. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool AUND::FUndo(PDOCB pdocb) { AssertThis(0); AssertPo(pdocb, 0); PACTR pactr; PMVU pmvu; if (!_pmvie->FSwitchScen(_iscen)) { return (fFalse); } if (!_pmvie->Pscen()->FGotoFrm(_nfrm)) { _pmvie->ClearUndo(); return (fFalse); } _pmvie->Pmsq()->FlushMsq(); pactr = _pmvie->Pscen()->PactrFromArid(_arid); AssertNilOrPo(pactr, 0); if (pactr != pvNil) { pactr->AddRef(); } // // Have scene replace the old actor with this one // if (_pactr == pvNil) { _pmvie->Pscen()->RemActrCore(pactr->Arid()); } else { if (_stn.Cch() != 0) { // Undo actor name change STN stn; if (_pmvie->FGetName(_arid, &stn)) { // If FNameActr fails, the actor will not have // the correct name...not great, but the user's document // won't be corrupted or anything. Someone will push a // ercOom, so I ignore the return value here. _pmvie->FNameActr(_pactr->Arid(), &_stn); _stn = stn; } } if (_arid != _pactr->Arid()) { _pmvie->Pscen()->RemActrCore(_arid); _arid = _pactr->Arid(); } if (!_pmvie->Pscen()->FAddActrCore(_pactr)) { ReleasePpo(&pactr); return (fFalse); } pmvu = (PMVU)_pmvie->PddgGet(0); AssertNilOrPo(pmvu, 0); if ((pmvu != pvNil) && !pmvu->FTextMode()) { _pmvie->Pscen()->SelectActr(_pactr); } ReleasePpo(&_pactr); } _pmvie->Pscen()->InvalFrmRange(); _pactr = pactr; if (pactr != pvNil) { pactr->Reset(); } if (_fSndUndo) { _pmvie->Pmsq()->PlayMsq(); } else { _pmvie->Pmsq()->FlushMsq(); } return (fTrue); } /**************************************************** * Set the actor for this undo object. * * Parameters: * pactr - Actor to use * * Returns: * None. * ****************************************************/ void AUND::SetPactr(PACTR pactr) { AssertThis(0); _pactr = pactr; pactr->AddRef(); } #ifdef DEBUG /**************************************************** * Mark memory used by the AUND * * Parameters: * None. * * Returns: * None. * ****************************************************/ void AUND::MarkMem(void) { AssertThis(0); AUND_PAR::MarkMem(); MarkMemObj(_pactr); } /*************************************************************************** Assert the validity of the AUND. ***************************************************************************/ void AUND::AssertValid(ulong grf) { AssertNilOrPo(_pactr, 0); } #endif ================================================ FILE: src/engine/actrsave.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** actrsave.cpp: Actor load/save code Primary Author: ****** Review Status: REVIEWED - any changes to this file must be reviewed! Here's the chunk hierarchy: ACTR // contains an ACTF (origin, arid, nfrmFirst, tagTmpl...) | +---PATH (chid 0) // _pglxyz (actor path) | +---GGAE (chid 0) // _pggaev (actor events) ***************************************************************************/ #include "soc.h" ASSERTNAME const CHID kchidPath = 0; const CHID kchidGgae = 0; struct ACTF // Actor chunk on file { short bo; // Byte order short osk; // OS kind XYZ dxyzFullRte; // Translation of the route long arid; // Unique id assigned to this actor. long nfrmFirst; // First frame in this actor's stage life long nfrmLast; // Last frame in this actor's stage life TAG tagTmpl; // Tag to actor's template }; const BOM kbomActf = 0x5ffc0000 | kbomTag; /*************************************************************************** Write the actor out to disk. Store the root chunk in the given CNO. If this function returns false, it is the client's responsibility to delete the actor chunks. ***************************************************************************/ bool ACTR::FWrite(PCFL pcfl, CNO cnoActr, CNO cnoScene) { AssertThis(0); AssertPo(pcfl, 0); ACTF actf; CNO cnoPath; CNO cnoGgae; CNO cnoTmpl; BLCK blck; KID kid; long iaev; AEV *paev; AEVSND aevsnd; long nfrmFirst; long nfrmLast; // Validate the actor's lifetime if not done already if (knfrmInvalid != _nfrmFirst) { if (!FGetLifetime(&nfrmFirst, &nfrmLast)) return fFalse; } #ifdef DEBUG if (knfrmInvalid == _nfrmFirst) Warn("Dev: Why are we saving an actor who has no first frame number?"); #endif // DEBUG // Save and adopt TMPL chunk if it's a ksidUseCrf chunk if (_tagTmpl.sid == ksidUseCrf) { Assert(_ptmpl->FIsTdt(), "only TDTs should be embedded in user doc"); if (!pcfl->FFind(_tagTmpl.ctg, _tagTmpl.cno)) { if (!((PTDT)_ptmpl)->FWrite(pcfl, _tagTmpl.ctg, &cnoTmpl)) return fFalse; // Keep CNO the same pcfl->Move(_tagTmpl.ctg, cnoTmpl, _tagTmpl.ctg, _tagTmpl.cno); } if (tNo == pcfl->TIsDescendent(kctgActr, cnoActr, _tagTmpl.ctg, _tagTmpl.cno)) { if (!pcfl->FAdoptChild(kctgActr, cnoActr, _tagTmpl.ctg, _tagTmpl.cno)) // clears loner bit { return fFalse; } } } // Write the ACTR chunk: actf.bo = kboCur; actf.osk = koskCur; actf.dxyzFullRte = _dxyzFullRte; actf.arid = _arid; actf.nfrmFirst = _nfrmFirst; actf.nfrmLast = _nfrmLast; actf.tagTmpl = _tagTmpl; if (!pcfl->FPutPv(&actf, size(ACTF), kctgActr, cnoActr)) return fFalse; // Now write the PATH chunk: if (!pcfl->FAddChild(kctgActr, cnoActr, kchidPath, _pglrpt->CbOnFile(), kctgPath, &cnoPath, &blck)) { return fFalse; } if (!_pglrpt->FWrite(&blck)) return fFalse; // Now write the GGAE chunk: if (!pcfl->FAddChild(kctgActr, cnoActr, kchidGgae, _pggaev->CbOnFile(), kctgGgae, &cnoGgae, &blck)) { return fFalse; } if (!_pggaev->FWrite(&blck)) return fFalse; // Adopt actor sounds into the scene for (iaev = 0; iaev < _pggaev->IvMac(); iaev++) { paev = (AEV *)(_pggaev->QvFixedGet(iaev)); if (aetSnd != paev->aet) continue; _pggaev->Get(iaev, &aevsnd); if (aevsnd.tag.sid != ksidUseCrf) continue; // For user sounds, the tag's cno must already be correct. // Moreover, FResolveSndTag can't succeed if the msnd chunk is // not yet a child of the current scene. // If the msnd chunk already exists as this chid of this scene, continue if (pcfl->FGetKidChidCtg(kctgScen, cnoScene, aevsnd.chid, kctgMsnd, &kid)) continue; // If the msnd does not exist in this file, it exists in the main movie if (!pcfl->FFind(kctgMsnd, aevsnd.tag.cno)) continue; // The msnd chunk has not been adopted into the scene as the specified chid if (!pcfl->FAdoptChild(kctgScen, cnoScene, kctgMsnd, aevsnd.tag.cno, aevsnd.chid)) { return fFalse; } } return fTrue; } /*************************************************************************** Read the actor data from disk, (re-)construct the actor, and return a pointer to it. ***************************************************************************/ PACTR ACTR::PactrRead(PCRF pcrf, CNO cnoActr) { AssertPo(pcrf, 0); ACTR *pactr; KID kid; PCFL pcfl = pcrf->Pcfl(); pactr = NewObj ACTR; if (pvNil == pactr) goto LFail; if (!pactr->_FReadActor(pcfl, cnoActr)) goto LFail; if (!pcfl->FGetKidChidCtg(kctgActr, cnoActr, kchidPath, kctgPath, &kid)) goto LFail; if (!pactr->_FReadRoute(pcfl, kid.cki.cno)) goto LFail; if (!pcfl->FGetKidChidCtg(kctgActr, cnoActr, kchidGgae, kctgGgae, &kid)) goto LFail; if (!pactr->_FReadEvents(pcfl, kid.cki.cno)) goto LFail; if (!pactr->_FOpenTags(pcrf)) goto LFail; if (pvNil == (pactr->_pglsmm = GL::PglNew(size(SMM), kcsmmGrow))) goto LFail; pactr->_pglsmm->SetMinGrow(kcsmmGrow); // Now that the tags are open, fetch the TMPL pactr->_ptmpl = (PTMPL)vptagm->PbacoFetch(&pactr->_tagTmpl, TMPL::FReadTmpl); if (pvNil == pactr->_ptmpl) goto LFail; if (knfrmInvalid == pactr->_nfrmLast && knfrmInvalid != pactr->_nfrmFirst) { long nfrmFirst, nfrmLast; if (!pactr->FGetLifetime(&nfrmFirst, &nfrmLast)) goto LFail; } AssertPo(pactr, 0); return pactr; LFail: Warn("PactrRead failed"); ReleasePpo(&pactr); return pvNil; } /*************************************************************************** Read the ACTF. This handles converting an ACTF that doesn't have an nfrmLast. ***************************************************************************/ bool _FReadActf(PBLCK pblck, ACTF *pactf) { AssertPo(pblck, 0); AssertVarMem(pactf); bool fOldActf = fFalse; if (!pblck->FUnpackData()) return fFalse; if (pblck->Cb() != size(ACTF)) { if (pblck->Cb() != size(ACTF) - size(long)) return fFalse; fOldActf = fTrue; } if (!pblck->FReadRgb(pactf, pblck->Cb(), 0)) return fFalse; if (fOldActf) { BltPb(&pactf->nfrmLast, &pactf->nfrmLast + 1, size(ACTF) - offset(ACTF, nfrmLast) - size(long)); } if (kboOther == pactf->bo) SwapBytesBom(pactf, kbomActf); if (kboCur != pactf->bo) { Bug("Corrupt ACTF"); return fFalse; } if (fOldActf) pactf->nfrmLast = knfrmInvalid; return fTrue; } /*************************************************************************** Read the ACTR chunk ***************************************************************************/ bool ACTR::_FReadActor(PCFL pcfl, CNO cno) { AssertBaseThis(0); AssertPo(pcfl, 0); ACTF actf; BLCK blck; if (!pcfl->FFind(kctgActr, cno, &blck) || !_FReadActf(&blck, &actf)) return fFalse; Assert(kboCur == actf.bo, "bad ACTF"); _dxyzFullRte = actf.dxyzFullRte; _arid = actf.arid; _nfrmFirst = actf.nfrmFirst; _nfrmLast = actf.nfrmLast; _tagTmpl = actf.tagTmpl; _fLifeDirty = (knfrmInvalid == _nfrmFirst) || (knfrmInvalid == _nfrmLast); if (_tagTmpl.sid == ksidUseCrf) { // Actor is a TDT. Tag might be wrong if this actor was imported, // so look for child TMPL. KID kid; if (!pcfl->FGetKidChidCtg(kctgActr, cno, 0, kctgTmpl, &kid)) { Bug("where's the child TMPL?"); return fTrue; // hope the tag is correct } _tagTmpl.cno = kid.cki.cno; } return fTrue; } /****************************************************************************** FAdjustAridOnFile Given a chunky file, a CNO and a delta for the arid, updates the arid for the actor on file. Arguments: PCFL pcfl -- the file the actor's on CNO cno -- the CNO of the actor long darid -- the change of the arid Returns: fTrue if everything went well, fFalse otherwise ************************************************************ PETED ***********/ bool ACTR::FAdjustAridOnFile(PCFL pcfl, CNO cno, long darid) { AssertPo(pcfl, 0); Assert(darid != 0, "Why call this with darid == 0?"); ACTF actf; BLCK blck; if (!pcfl->FFind(kctgActr, cno, &blck) || !_FReadActf(&blck, &actf)) return fFalse; Assert(kboCur == actf.bo, "bad ACTF"); actf.arid += darid; return pcfl->FPutPv(&actf, size(ACTF), kctgActr, cno); } /*************************************************************************** Read the PATH (_pglrpt) chunk ***************************************************************************/ bool ACTR::_FReadRoute(PCFL pcfl, CNO cno) { AssertBaseThis(0); AssertPo(pcfl, 0); BLCK blck; short bo; if (!pcfl->FFind(kctgPath, cno, &blck)) return fFalse; _pglrpt = GL::PglRead(&blck, &bo); if (pvNil == _pglrpt) return fFalse; AssertBomRglw(kbomRpt, size(RPT)); if (kboOther == bo) { SwapBytesRglw(_pglrpt->QvGet(0), LwMul(_pglrpt->IvMac(), size(RPT) / size(long))); } return fTrue; } /*************************************************************************** Read the GGAE (_pggaev) chunk ***************************************************************************/ bool ACTR::_FReadEvents(PCFL pcfl, CNO cno) { AssertBaseThis(0); AssertPo(pcfl, 0); BLCK blck; short bo; if (!pcfl->FFind(kctgGgae, cno, &blck)) return fFalse; _pggaev = GG::PggRead(&blck, &bo); if (pvNil == _pggaev) return fFalse; if (kboOther == bo) _SwapBytesPggaev(_pggaev); return fTrue; } /*************************************************************************** SwapBytes all events in pggaev ***************************************************************************/ void ACTR::_SwapBytesPggaev(PGG pggaev) { AssertPo(pggaev, 0); long iaev; for (iaev = 0; iaev < pggaev->IvMac(); iaev++) { SwapBytesBom(pggaev->QvFixedGet(iaev), kbomAev); switch (((AEV *)pggaev->QvFixedGet(iaev))->aet) { case aetCost: SwapBytesBom(pggaev->QvGet(iaev), kbomAevcost); break; case aetSnd: SwapBytesBom(pggaev->QvGet(iaev), kbomAevsnd); break; case aetSize: SwapBytesBom(pggaev->QvGet(iaev), kbomAevsize); break; case aetPull: SwapBytesBom(pggaev->QvGet(iaev), kbomAevpull); break; case aetRotF: case aetRotH: SwapBytesBom(pggaev->QvGet(iaev), kbomAevrot); break; case aetActn: SwapBytesBom(pggaev->QvGet(iaev), kbomAevactn); break; case aetAdd: SwapBytesBom(pggaev->QvGet(iaev), kbomAevadd); break; case aetFreeze: SwapBytesBom(pggaev->QvGet(iaev), kbomAevfreeze); break; case aetMove: SwapBytesBom(pggaev->QvGet(iaev), kbomAevmove); break; case aetTweak: SwapBytesBom(pggaev->QvGet(iaev), kbomAevtweak); break; case aetStep: SwapBytesBom(pggaev->QvGet(iaev), kbomAevstep); break; case aetRem: // no var data break; default: Bug("Unknown AET"); break; } } } /*************************************************************************** Open all tags for this actor ***************************************************************************/ bool ACTR::_FOpenTags(PCRF pcrf) { AssertBaseThis(0); AssertPo(pcrf, 0); long iaev = 0; PTAG ptag; if (!TAGM::FOpenTag(&_tagTmpl, pcrf)) goto LFail; _pggaev->Lock(); for (iaev = 0; iaev < _pggaev->IvMac(); iaev++) { if (_FIsIaevTag(_pggaev, iaev, &ptag)) { if (!TAGM::FOpenTag(ptag, pcrf)) goto LFail; } } _pggaev->Unlock(); return fTrue; LFail: // Close the tags that were opened before failure while (--iaev >= 0) { if (_FIsIaevTag(_pggaev, iaev, &ptag)) TAGM::CloseTag(ptag); } _pggaev->Unlock(); return fFalse; } /*************************************************************************** Close all tags in this actor's event stream ***************************************************************************/ void ACTR::_CloseTags(void) { AssertBaseThis(0); // because destructor calls this function long iaev; PTAG ptag; TAGM::CloseTag(&_tagTmpl); if (pvNil == _pggaev) return; _pggaev->Lock(); for (iaev = 0; iaev < _pggaev->IvMac(); iaev++) { if (_FIsIaevTag(_pggaev, iaev, &ptag)) TAGM::CloseTag(ptag); } _pggaev->Unlock(); return; } /*************************************************************************** Get all the tags that the actor uses ***************************************************************************/ PGL ACTR::PgltagFetch(PCFL pcfl, CNO cno, bool *pfError) { AssertPo(pcfl, 0); AssertVarMem(pfError); ACTF actf; BLCK blck; short bo; PTAG ptag; PGL pgltag; PGG pggaev = pvNil; long iaev; KID kid; pgltag = GL::PglNew(size(TAG), 0); if (pvNil == pgltag) goto LFail; // Read the ACTF so we can insert tagTmpl: if (!pcfl->FFind(kctgActr, cno, &blck) || !_FReadActf(&blck, &actf)) goto LFail; if (actf.tagTmpl.sid == ksidUseCrf) { PGL pgltagTmpl; // Actor is a TDT. Tag might be wrong if this actor was imported, // so look for child TMPL. if (pcfl->FGetKidChidCtg(kctgActr, cno, 0, kctgTmpl, &kid)) { actf.tagTmpl.cno = kid.cki.cno; } else { Bug("where's the child TMPL?"); } pgltagTmpl = TMPL::PgltagFetch(pcfl, actf.tagTmpl.ctg, actf.tagTmpl.cno, pfError); if (*pfError) { ReleasePpo(&pgltagTmpl); goto LFail; } if (pvNil != pgltagTmpl) { long itag; TAG tag; for (itag = 0; itag < pgltagTmpl->IvMac(); itag++) { pgltagTmpl->Get(itag, &tag); if (!pgltag->FAdd(&tag)) { ReleasePpo(&pgltagTmpl); goto LFail; } } ReleasePpo(&pgltagTmpl); } } if (!pgltag->FInsert(0, &actf.tagTmpl)) goto LFail; // Pull all tags out of the event list: if (!pcfl->FGetKidChidCtg(kctgActr, cno, kchidGgae, kctgGgae, &kid)) goto LFail; if (!pcfl->FFind(kctgGgae, kid.cki.cno, &blck)) goto LFail; pggaev = GG::PggRead(&blck, &bo); if (pvNil == pggaev) goto LFail; if (kboOther == bo) _SwapBytesPggaev(pggaev); pggaev->Lock(); for (iaev = 0; iaev < pggaev->IvMac(); iaev++) { if (_FIsIaevTag(pggaev, iaev, &ptag)) { if (!pgltag->FAdd(ptag)) { pggaev->Unlock(); goto LFail; } } } pggaev->Unlock(); *pfError = fFalse; ReleasePpo(&pggaev); return pgltag; LFail: *pfError = fTrue; ReleasePpo(&pgltag); ReleasePpo(&pggaev); return pvNil; } /*************************************************************************** If the iaev'th event of pggaev has a tag, sets *pptag to point to it. WARNING: unless you locked pggaev, *pptag is a qtag! ***************************************************************************/ bool ACTR::_FIsIaevTag(PGG pggaev, long iaev, PTAG *pptag, PAEV *pqaev) { AssertPo(pggaev, 0); AssertIn(iaev, 0, pggaev->IvMac()); AssertVarMem(pptag); AssertNilOrVarMem(pqaev); AEV *qaev; qaev = (AEV *)pggaev->QvFixedGet(iaev); if (pqaev != pvNil) *pqaev = qaev; switch (qaev->aet) { case aetCost: if (!((AEVCOST *)pggaev->QvGet(iaev))->fCmtl) { *pptag = &((AEVCOST *)pggaev->QvGet(iaev))->tag; return fTrue; } break; case aetSnd: *pptag = &((AEVSND *)pggaev->QvGet(iaev))->tag; return fTrue; case aetSize: case aetPull: case aetRotF: case aetRotH: case aetActn: case aetAdd: case aetFreeze: case aetTweak: case aetStep: case aetRem: case aetMove: break; default: Bug("Unknown AET"); break; } *pptag = pvNil; return fFalse; } ================================================ FILE: src/engine/actrsnd.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** Actor Sound. Primary Author: ****** Status: Reviewed ***************************************************************************/ #include "soc.h" ASSERTNAME /*************************************************************************** Add a sound event to the actor event list, and create an undo object ***************************************************************************/ bool ACTR::FSetSnd(PTAG ptag, tribool fLoop, tribool fQueue, tribool fMotionMatch, long vlm, long sty) { AssertThis(0); AssertVarMem(ptag); AssertIn(sty, 0, styLim); PACTR pactrDup; if (!FDup(&pactrDup)) { return fFalse; } if (!FSetSndCore(ptag, fLoop, fQueue, fMotionMatch, vlm, sty)) { Restore(pactrDup); ReleasePpo(&pactrDup); return fFalse; } if (!FCreateUndo(pactrDup, fTrue)) { Restore(pactrDup); ReleasePpo(&pactrDup); return fFalse; } ReleasePpo(&pactrDup); return fTrue; } /*************************************************************************** Add a sound event to the actor event list For user sounds, the chid must also be fetched for the argument *ptag and stored with the event, since for user sounds, the cno can change (eg on scene import) Note: ptag is current because the sound browser has just completed building a current tag. ***************************************************************************/ bool ACTR::FSetSndCore(PTAG ptag, tribool fLoop, tribool fQueue, tribool fMotionMatch, long vlm, long sty) { AssertThis(0); AssertVarMem(ptag); AssertIn(sty, 0, styLim); PMSND pmsnd = pvNil; AEVSND aevsnd; long ccel; long iaev; AEV *paev; long sqn; long cbVar; // Verify sound before including in the event list pmsnd = (PMSND)vptagm->PbacoFetch(ptag, MSND::FReadMsnd); if (pvNil == pmsnd) goto LFail; if (pmsnd->Sty() == styMidi) { // There are no midi actor sounds in the product PushErc(ercSocNoActrMidi); goto LFail; } // Verify space up front cbVar = kcbVarStep + kcbVarSnd; if (!_pggaev->FEnsureSpace(2, cbVar, fgrpNil)) return fFalse; aevsnd.fLoop = fLoop; aevsnd.fQueue = fQueue; aevsnd.vlm = (vlm == vlmNil) ? pmsnd->Vlm() : vlm; aevsnd.tag = *ptag; aevsnd.fNoSound = pmsnd->FNoSound(); aevsnd.sty = (sty == styNil) ? pmsnd->Sty() : sty; sty = aevsnd.sty; vlm = aevsnd.vlm; if (ptag->sid != ksidUseCrf) TrashVar(&aevsnd.chid); else { if (!_pscen->Pmvie()->FChidFromUserSndCno(aevsnd.tag.cno, &aevsnd.chid)) goto LFail; } if (!fMotionMatch) aevsnd.celn = smmNil; // Not a motion match sound else { if (!_ptmpl->FGetCcelActn(_anidCur, &ccel)) goto LFail; aevsnd.celn = _celnCur % ccel; } if (!_FAddDoAev(aetSnd, kcbVarSnd, &aevsnd)) goto LFail; ReleasePpo(&pmsnd); // Remove "no sounds" of this sqn between here and the next // sound of this sqn sqn = MSND::SqnActr(sty, _arid); for (iaev = _iaevCur; iaev < _pggaev->IvMac(); iaev++) { AEVSND aevsndT; paev = (AEV *)_pggaev->QvFixedGet(iaev); if (aetAdd == paev->aet) break; if (aetSnd != paev->aet) continue; _pggaev->Get(iaev, &aevsndT); if (MSND::SqnActr(aevsndT.sty, _arid) != sqn) continue; // Quit when reach real sound of same sqn if (!aevsndT.fNoSound) break; _RemoveAev(iaev); iaev--; } // Enqueue the motion match sounds in the Msq // Allow the edit even if all sounds do not play if (!(_pscen->GrfScen() & fscenSounds)) _FEnqueueSmmInMsq(); // Ignore errors : other sounds involved Pscen()->Pmvie()->Pmcc()->SetSndFrame(fTrue); return fTrue; LFail: ReleasePpo(&pmsnd); return fFalse; } /*************************************************************************** Enqueue the sound at event iaev. Enter motion match sounds in the smm gl. Enter non-motion match sounds in the Msq ***************************************************************************/ bool ACTR::_FEnqueueSnd(long iaev) { AssertThis(0); AssertIn(iaev, 0, _pggaev->IvMac()); AEVSND aevsnd; PMSND pmsnd = pvNil; long tool; _pggaev->Get(iaev, &aevsnd); // // Motion match sounds are not enqueued when event iaev is seen // Otherwise the sound would be played twice // if (aevsnd.celn != smmNil) { // Insert Smm for this cel in the gl return _FInsertSmm(iaev); } if (aevsnd.fLoop) tool = toolLooper; else tool = toolSounder; // If the scene was imported, the sound will need to be resolved if (aevsnd.tag.sid == ksidUseCrf) { if (!_pscen->Pmvie()->FResolveSndTag(&aevsnd.tag, aevsnd.chid)) { Bug("Actrsnd: Expected to resolve snd tag"); goto LFail; } _pggaev->Put(iaev, &aevsnd); // Update event } pmsnd = (PMSND)vptagm->PbacoFetch(&aevsnd.tag, MSND::FReadMsnd); if (pvNil == pmsnd) goto LFail; if (!_pscen->Pmvie()->Pmsq()->FEnqueue(pmsnd, _arid, aevsnd.fLoop, aevsnd.fQueue, aevsnd.vlm, pmsnd->Spr(tool), fTrue)) { goto LFail; } ReleasePpo(&pmsnd); return fTrue; LFail: ReleasePpo(&pmsnd); return fFalse; } /*************************************************************************** Play the motion match sounds appropriate to the current cel ***************************************************************************/ bool ACTR::_FEnqueueSmmInMsq(void) { AssertThis(0); long celn; long ccel; long ismm; SMM *psmm; bool fSuccess = fTrue; PMSND pmsnd = pvNil; if (!_ptmpl->FGetCcelActn(_anidCur, &ccel)) return fFalse; celn = _celnCur % ccel; for (ismm = 0; ismm < _pglsmm->IvMac(); ismm++) { psmm = (SMM *)(_pglsmm->QvGet(ismm)); Assert(psmm->aevsnd.celn != smmNil, "Logic error in smm"); if (psmm->aevsnd.celn != celn) { continue; } if (psmm->aevsnd.tag.sid == ksidUseCrf) { if (!_pscen->Pmvie()->FResolveSndTag(&psmm->aevsnd.tag, psmm->aevsnd.chid)) { Bug("Actrsnd: Expected to resolve snd tag"); goto LFail; } _pglsmm->Put(ismm, psmm); // Update event } pmsnd = (PMSND)vptagm->PbacoFetch(&psmm->aevsnd.tag, MSND::FReadMsnd); if (pvNil == pmsnd) { fSuccess = fFalse; continue; } // Motion match sounds need to be entered at low priority as sounds of the // same type take precedence over them if (!_pscen->Pmvie()->Pmsq()->FEnqueue(pmsnd, _arid, psmm->aevsnd.fLoop, psmm->aevsnd.fQueue, psmm->aevsnd.vlm, pmsnd->Spr(toolMatcher), fTrue, 0, fTrue)) { // Continuing would result in additional error goto LFail; } ReleasePpo(&pmsnd); } return fSuccess; LFail: ReleasePpo(&pmsnd); return fFalse; } /*************************************************************************** Insert a motion match sound in the smm queue ***************************************************************************/ bool ACTR::_FInsertSmm(long iaev) { AssertThis(0); AssertIn(iaev, 0, _pggaev->IvMac()); long ismm; SMM smm; SMM *psmm; AEV *paev; AEVSND *paevsnd; paev = (AEV *)_pggaev->QvFixedGet(iaev); paevsnd = (AEVSND *)_pggaev->QvGet(iaev); smm.aev = *paev; smm.aevsnd = *paevsnd; for (ismm = 0; ismm < _pglsmm->IvMac(); ismm++) { psmm = (SMM *)_pglsmm->QvGet(ismm); if (psmm->aevsnd.celn != paevsnd->celn) continue; if (psmm->aevsnd.sty != paevsnd->sty) continue; // Replace the current smm with the new _pglsmm->Put(ismm, &smm); return fTrue; } // No sound for this cel was found // Add a new mm sound return _pglsmm->FAdd(&smm); } /*************************************************************************** Delete old motion sounds in event list ***************************************************************************/ bool ACTR::_FRemoveAevMm(long anid) { AssertThis(0); long iaev; AEV *paev; AEVSND aevsnd; AEVACTN aevactn; // Remove motion match sounds from the previous action for (iaev = _iaevCur; iaev < _pggaev->IvMac(); iaev++) { paev = (AEV *)_pggaev->QvFixedGet(iaev); if (aetAdd == paev->aet) break; if (aetActn == paev->aet) { _pggaev->Get(iaev, &aevactn); if (aevactn.anid != anid) break; continue; } if (aetSnd != paev->aet) continue; // Test if sound is motion match _pggaev->Get(iaev, &aevsnd); if (smmNil == aevsnd.celn) continue; _RemoveAev(iaev); iaev--; } return fTrue; } /*************************************************************************** Insert default motion match sounds in event list ***************************************************************************/ bool ACTR::_FAddAevDefMm(long anid) { AssertThis(0); TAG tag; PMSND pmsnd; long iceln; long ccel; long vlm; long sty; bool fSoundExists; // Insert new motion match sounds if (!_ptmpl->FGetCcelActn(anid, &ccel)) return fFalse; for (iceln = 0; iceln < ccel; iceln++) { if (!_ptmpl->FGetSndActnCel(anid, iceln, &fSoundExists, &tag)) continue; // Ignore failure if (!fSoundExists) continue; pmsnd = (PMSND)vptagm->PbacoFetch(&tag, MSND::FReadMsnd); if (pvNil == pmsnd) continue; // Ignore failure vlm = pmsnd->Vlm(); sty = pmsnd->Sty(); if (!FSetSndCore(&tag, tribool::tNo, (tribool)vlm, tribool::tNo, sty, tribool::tYes)) { goto LFail; // Continuing pointless } ReleasePpo(&pmsnd); } return fTrue; LFail: ReleasePpo(&pmsnd); return fFalse; } /*************************************************************************** Set the Volume for sounds in the current frame of the specified sty ***************************************************************************/ bool ACTR::FSetVlmSnd(long sty, bool fMotionMatch, long vlm) { AssertThis(0); AssertIn(sty, 0, styLim); AssertIn(vlm, 0, kvlmFull + 1); AEVSND aevsnd; bool fActnThisFrame = fFalse; long celn; long ccel; long iaev; long ismm; AEV aev; SMM smm; long nfrmMM = ivNil; if (!_ptmpl->FGetCcelActn(_anidCur, &ccel)) return fFalse; celn = _celnCur % ccel; // Set the volume for any events in the actor list for this frame for (iaev = _iaevFrmMin; iaev < _iaevCur; iaev++) { _pggaev->GetFixed(iaev, &aev); if (aev.aet == aetActn) fActnThisFrame = fTrue; if (aev.aet != aetSnd) continue; _pggaev->Get(iaev, &aevsnd); if (FPure(aevsnd.celn != smmNil) != fMotionMatch) continue; if (aevsnd.sty != sty) continue; aevsnd.vlm = vlm; _pggaev->Put(iaev, &aevsnd); } // Set the volume for any earlier motion match sounds // which land in this cel if (fMotionMatch && !fActnThisFrame) { for (iaev = _iaevFrmMin - 1; iaev > 0; iaev--) { _pggaev->GetFixed(iaev, &aev); // Quit when the action changes if (aev.aet == aetActn || (nfrmMM != ivNil && nfrmMM > aev.nfrm)) break; if (aev.aet != aetSnd) continue; _pggaev->Get(iaev, &aevsnd); if (aevsnd.sty != sty) continue; // Only adjust sounds that match this cel if (aevsnd.celn != celn) continue; aevsnd.vlm = vlm; _pggaev->Put(iaev, &aevsnd); nfrmMM = aev.nfrm; // There are no queued motion match sounds by spec break; } } if (fMotionMatch) { // Adjust the volume in the smm also for (ismm = 0; ismm < _pglsmm->IvMac(); ismm++) { _pglsmm->Get(ismm, &smm); Assert(smm.aevsnd.celn != smmNil, "Logic error in smm"); if (smm.aevsnd.celn != celn) continue; if (smm.aevsnd.sty != sty) continue; // Set the volume in the smm smm.aevsnd.vlm = vlm; _pglsmm->Put(ismm, &smm); } } _pscen->MarkDirty(); return fTrue; } /*************************************************************************** Query actor for current frame sounds ***************************************************************************/ bool ACTR::FQuerySnd(long sty, bool fMotionMatch, PGL *pglTagSnd, long *pvlm, bool *pfLoop) { AssertThis(0); AssertIn(sty, 0, styLim); AssertVarMem(pvlm); AssertVarMem(pfLoop); PGL pgltag = pvNil; AEVSND aevsnd; long ccel; long celn; AEV aev; long iaev; long ismm; SMM smm; if (pvNil == (pgltag = GL::PglNew(size(TAG), kctagSndGrow))) return fFalse; pgltag->SetMinGrow(kctagSndGrow); if (!fMotionMatch) { // Non-motion match sounds for (iaev = _iaevFrmMin; iaev < _iaevCur; iaev++) { _pggaev->GetFixed(iaev, &aev); if (aev.aet != aetSnd) continue; _pggaev->Get(iaev, &aevsnd); if (aevsnd.sty != sty) continue; // Handle motion match sounds later if (aevsnd.celn != smmNil) continue; if (aevsnd.tag.sid == ksidUseCrf) { if (!_pscen->Pmvie()->FResolveSndTag(&aevsnd.tag, aevsnd.chid)) goto LFail; } if (!pgltag->FAdd(&aevsnd.tag)) goto LFail; *pvlm = aevsnd.vlm; *pfLoop = aevsnd.fLoop; } } if (fMotionMatch) { if (!_ptmpl->FGetCcelActn(_anidCur, &ccel)) goto LFail; celn = _celnCur % ccel; // Motion match sounds for (ismm = 0; ismm < _pglsmm->IvMac(); ismm++) { _pglsmm->Get(ismm, &smm); if (smm.aevsnd.sty != sty) continue; if (smm.aevsnd.celn != celn) continue; if (smm.aevsnd.tag.sid == ksidUseCrf) { if (!_pscen->Pmvie()->FResolveSndTag(&smm.aevsnd.tag, smm.aevsnd.chid)) goto LFail; } if (!pgltag->FAdd(&smm.aevsnd.tag)) goto LFail; *pvlm = smm.aevsnd.vlm; *pfLoop = smm.aevsnd.fLoop; break; } } if (pgltag->IvMac() == 0) { ReleasePpo(&pgltag); *pglTagSnd = pvNil; return fTrue; } *pglTagSnd = pgltag; return fTrue; LFail: ReleasePpo(&pgltag); return fFalse; } /*************************************************************************** Delete a sound in this frame ***************************************************************************/ bool ACTR::FDeleteSndCore(long sty, bool fMotionMatch) { AssertThis(0); AssertIn(sty, 0, styLim); AEVSND aevsnd; long iaevFirst; long iaev; long ismm; long ccel; long celn; AEV aev; SMM smm; long nfrmMM = ivNil; // For motion match, this may be an earlier frame // First the actor event list if (!_ptmpl->FGetCcelActn(_anidCur, &ccel)) return fFalse; celn = _celnCur % ccel; iaevFirst = (fMotionMatch) ? _iaevActnCur : _iaevFrmMin; for (iaev = _iaevCur - 1; iaev >= iaevFirst; iaev--) { _pggaev->GetFixed(iaev, &aev); if (fMotionMatch && nfrmMM != ivNil && nfrmMM > aev.nfrm) break; if (aev.aet != aetSnd) continue; _pggaev->Get(iaev, &aevsnd); if (aevsnd.sty != sty) continue; if ((aevsnd.celn != smmNil) != fMotionMatch) continue; // Only delete the sound that match this cel if (fMotionMatch && aevsnd.celn != celn) continue; // Delete this sound & continue to remove any // other sounds which are possibly chained _RemoveAev(iaev); nfrmMM = aev.nfrm; } if (fMotionMatch) { // Also the motion match sound list : smm if (!_ptmpl->FGetCcelActn(_anidCur, &ccel)) return fFalse; celn = _celnCur % ccel; // Motion match sounds for (ismm = 0; ismm < _pglsmm->IvMac(); ismm++) { _pglsmm->Get(ismm, &smm); if (smm.aevsnd.sty != sty) continue; if (smm.aevsnd.celn != celn) continue; _pglsmm->Delete(ismm); ismm--; } } _pscen->MarkDirty(); return fTrue; } /****************************************************************************** FSoundInFrm Enumerates all actor events for current frame looking for a sound event. Returns: fTrue if a sound event was found, fFalse otherwise ************************************************************ PETED ***********/ bool ACTR::FSoundInFrm(void) { AssertThis(0); AssertPo(Pscen(), 0); /* Can't provide useful info if we're not at the current scene frame */ if (Pscen()->Nfrm() != _nfrmCur) return fFalse; for (long iaev = _iaevFrmMin; iaev < _iaevCur; iaev++) { AEV aev; _pggaev->GetFixed(iaev, &aev); if (aev.aet == aetSnd) return fTrue; } return fFalse; } /****************************************************************************** Resolve all sound tags ******************************************************************************/ bool ACTR::FResolveAllSndTags(CNO cnoScen) { AssertThis(0); long iaev; AEV *paev; AEVSND aevsnd; bool fSuccess = fTrue; for (iaev = 0; iaev < _pggaev->IvMac(); iaev++) { paev = (AEV *)_pggaev->QvFixedGet(iaev); if (paev->aet != aetSnd) continue; _pggaev->Get(iaev, &aevsnd); if (aevsnd.tag.sid == ksidUseCrf) { if (!_pscen->Pmvie()->FResolveSndTag(&aevsnd.tag, aevsnd.chid, cnoScen)) { fSuccess = fFalse; continue; } _pggaev->Put(iaev, &aevsnd); } } return fSuccess; } ================================================ FILE: src/engine/bkgd.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** bkgd.cpp: Background class Primary Author: ****** Review Status: REVIEWED - any changes to this file must be reviewed! A BKGD (background) consists of a set of light sources (GLLT), a background sound (SND), and one or more camera views. Each camera view consists of a camera specification, a pre-rendered RGB bitmap, and a pre-rendered Z-buffer. Here's how the chunks look: BKGD // Contains stage bounding cuboid | +---GLLT (chid 0) // GL of light position specs (LITEs) | +---SND (chid 0) // Background sound/music | +---CAM (chid 0) // Contains camera pos/orient matrix, hither, yon | | | +---MBMP (chid 0) // Background RGB bitmap | | | +---ZBMP (chid 0) // Background Z-buffer | +---CAM (chid 1) | | | +---MBMP (chid 0) | | | +---ZBMP (chid 0) | +---CAM (chid 2) . | . +---MBMP (chid 0) . | +---ZBMP (chid 0) ***************************************************************************/ #include "soc.h" ASSERTNAME RTCLASS(BKGD) const CHID kchidBds = 0; // Background default sound const CHID kchidGllt = 0; // GL of LITEs const CHID kchidGlcr = 0; // Palette const br_colour kbrcLight = BR_COLOUR_RGB(0xff, 0xff, 0xff); /*************************************************************************** Add the background's chunks (excluding camera views) to the tag list ***************************************************************************/ bool BKGD::FAddTagsToTagl(PTAG ptagBkgd, PTAGL ptagl) { AssertVarMem(ptagBkgd); AssertPo(ptagl, 0); if (!ptagl->FInsertTag(ptagBkgd, fFalse)) return fFalse; if (!ptagl->FInsertChild(ptagBkgd, kchidBds, kctgBds)) return fFalse; if (!ptagl->FInsertChild(ptagBkgd, kchidGllt, kctgGllt)) return fFalse; if (!ptagl->FInsertChild(ptagBkgd, kchidGlcr, kctgColorTable)) return fFalse; // Have to cache first camera view since scene switches to it // automatically if (!ptagl->FInsertChild(ptagBkgd, 0, kctgCam)) return fFalse; return fTrue; } /*************************************************************************** Cache the background's chunks (excluding camera views) to HD ***************************************************************************/ bool BKGD::FCacheToHD(PTAG ptagBkgd) { AssertVarMem(ptagBkgd); TAG tagBds; TAG tagGllt; TAG tagGlcr; TAG tagCam; // Build the child tags if (!vptagm->FBuildChildTag(ptagBkgd, kchidBds, kctgBds, &tagBds)) return fFalse; if (!vptagm->FBuildChildTag(ptagBkgd, kchidGllt, kctgGllt, &tagGllt)) return fFalse; if (!vptagm->FBuildChildTag(ptagBkgd, kchidGlcr, kctgColorTable, &tagGlcr)) return fFalse; if (!vptagm->FBuildChildTag(ptagBkgd, 0, kctgCam, &tagCam)) return fFalse; // Cache the BKGD chunk if (!vptagm->FCacheTagToHD(ptagBkgd, fFalse)) return fFalse; // Cache the child chunks if (!vptagm->FCacheTagToHD(&tagBds)) return fFalse; if (!vptagm->FCacheTagToHD(&tagGllt)) return fFalse; if (!vptagm->FCacheTagToHD(&tagGlcr)) return fFalse; // Have to cache first camera view since scene switches to it // automatically if (!vptagm->FCacheTagToHD(&tagCam)) return fFalse; return fTrue; } /*************************************************************************** A PFNRPO to read a BKGD from a file ***************************************************************************/ bool BKGD::FReadBkgd(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb) { AssertPo(pcrf, 0); AssertPo(pblck, 0); AssertNilOrVarMem(ppbaco); AssertVarMem(pcb); BKGD *pbkgd; *pcb = size(BKGD) + size(BACT) + size(BLIT); // estimate BKGD size if (pvNil == ppbaco) return fTrue; pbkgd = NewObj BKGD; if (pvNil == pbkgd || !pbkgd->_FInit(pcrf->Pcfl(), ctg, cno)) { TrashVar(ppbaco); TrashVar(pcb); ReleasePpo(&pbkgd); return fFalse; } AssertPo(pbkgd, 0); *ppbaco = pbkgd; *pcb = size(BKGD) + LwMul(pbkgd->_cbactLight, size(BACT)) + LwMul(pbkgd->_cbactLight, size(BLIT)); // actual BKGD size return fTrue; } /*************************************************************************** Read a BKGD from the given chunk of the given CFL. Note: Although we read the data for the lights here, we don't turn them on yet because we don't have a BWLD to add them to. The lights are turned on with the first FSetCamera() call. ***************************************************************************/ bool BKGD::_FInit(PCFL pcfl, CTG ctg, CNO cno) { AssertBaseThis(0); AssertPo(pcfl, 0); BLCK blck; BKGDF bkgdf; KID kid; PGL pgllite = pvNil; short bo; _ccam = _Ccam(pcfl, ctg, cno); // compute # of views in this background _icam = ivNil; if (!pcfl->FFind(ctg, cno, &blck) || !blck.FUnpackData()) goto LFail; if (blck.Cb() != size(BKGDF)) goto LFail; if (!blck.FReadRgb(&bkgdf, size(BKGDF), 0)) goto LFail; if (kboCur != bkgdf.bo) SwapBytesBom(&bkgdf, kbomBkgdf); Assert(kboCur == bkgdf.bo, "bad BKGDF"); if (!pcfl->FGetName(ctg, cno, &_stn)) goto LFail; // Get the default sound if (pcfl->FGetKidChidCtg(ctg, cno, kchidBds, kctgBds, &kid)) { if (!pcfl->FFind(kid.cki.ctg, kid.cki.cno, &blck) || !blck.FUnpackData()) goto LFail; if (blck.Cb() != size(BDS)) goto LFail; if (!blck.FReadRgb(&_bds, size(BDS), 0)) goto LFail; if (kboCur != _bds.bo) SwapBytesBom(&_bds, kbomBds); Assert(kboCur == _bds.bo, "bad BDS"); } else { _bds.tagSnd.sid = ksidInvalid; } // If there is a GLCR child, get it if (pcfl->FGetKidChidCtg(ctg, cno, kchidGlcr, kctgColorTable, &kid)) { if (!pcfl->FFind(kid.cki.ctg, kid.cki.cno, &blck)) goto LFail; _pglclr = GL::PglRead(&blck, &bo); if (_pglclr != pvNil) { if (kboOther == bo) SwapBytesRglw(_pglclr->QvGet(0), _pglclr->IvMac()); } _bIndexBase = bkgdf.bIndexBase; } else _pglclr = pvNil; // Read the GL of LITEs (GLLT) if (!pcfl->FGetKidChidCtg(ctg, cno, kchidGllt, kctgGllt, &kid)) goto LFail; if (!pcfl->FFind(kid.cki.ctg, kid.cki.cno, &blck)) goto LFail; pgllite = GL::PglRead(&blck, &bo); if (pvNil == pgllite) goto LFail; Assert(pgllite->CbEntry() == size(LITE), "bad pgllite...you may need to update bkgds.chk"); AssertBomRglw(kbomLite, size(LITE)); if (kboOther == bo) { SwapBytesRglw(pgllite->QvGet(0), LwMul(pgllite->IvMac(), size(LITE) / size(long))); } _cbactLight = pgllite->IvMac(); if (!FAllocPv((void **)&_prgbactLight, LwMul(_cbactLight, size(BACT)), fmemClear, mprNormal)) { goto LFail; } if (!FAllocPv((void **)&_prgblitLight, LwMul(_cbactLight, size(BLIT)), fmemClear, mprNormal)) { goto LFail; } _SetupLights(pgllite); ReleasePpo(&pgllite); return fTrue; LFail: Warn("Error reading background"); ReleasePpo(&pgllite); return fFalse; } /*************************************************************************** Return the number of camera views in this scene. CAM chunks need to be contiguous CHIDs starting at CHID 0. ***************************************************************************/ long BKGD::_Ccam(PCFL pcfl, CTG ctg, CNO cno) { AssertBaseThis(0); AssertPo(pcfl, 0); KID kid; long ccam; for (ccam = 0; pcfl->FGetKidChidCtg(ctg, cno, ccam, kctgCam, &kid); ccam++) { } #ifdef DEBUG // Make sure chids are consecutive long ckid; long ccamT = 0; for (ckid = 0; pcfl->FGetKid(ctg, cno, ckid, &kid); ckid++) { if (kid.cki.ctg == kctgCam) ccamT++; } Assert(ccamT == ccam, "cam chids are not consecutive!"); #endif return ccam; } /*************************************************************************** Fill _prgbactLight and _prgblitLight using a GL of LITEs ***************************************************************************/ void BKGD::_SetupLights(PGL pgllite) { AssertBaseThis(0); AssertPo(pgllite, 0); long ilite; LITE *qlite; BACT *pbact; BLIT *pblit; for (ilite = 0; ilite < _cbactLight; ilite++) { qlite = (LITE *)pgllite->QvGet(ilite); pbact = &_prgbactLight[ilite]; pblit = &_prgblitLight[ilite]; pblit->type = (byte)qlite->lt; pblit->colour = kbrcLight; pblit->attenuation_c = qlite->rIntensity; pbact->type = BR_ACTOR_LIGHT; pbact->type_data = pblit; pbact->t.type = BR_TRANSFORM_MATRIX34; pbact->t.t.mat = qlite->bmat34; } } /*************************************************************************** Clean up and delete this background ***************************************************************************/ BKGD::~BKGD(void) { AssertBaseThis(0); Assert(!_fLeaveLitesOn, "Shouldn't be freeing background now"); if (pvNil != _prgbactLight && pvNil != _prgblitLight) TurnOffLights(); FreePpv((void **)&_prgbactLight); FreePpv((void **)&_prgblitLight); ReleasePpo(&_pglclr); ReleasePpo(&_pglapos); } /*************************************************************************** Get the background's name ***************************************************************************/ void BKGD::GetName(PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); *pstn = _stn; } /*************************************************************************** Get the custom palette for this background, if any. Returns fFalse if an error occurs. Sets *ppglclr to an empty GL and *piclrMin to 0 if this background has no custom palette. ***************************************************************************/ bool BKGD::FGetPalette(PGL *ppglclr, long *piclrMin) { AssertThis(0); AssertVarMem(ppglclr); AssertVarMem(piclrMin); *piclrMin = _bIndexBase; if (pvNil == _pglclr) // no custom palette { *ppglclr = GL::PglNew(size(CLR)); // "palette" with 0 entries } else { *ppglclr = _pglclr->PglDup(); } return (pvNil != *ppglclr); } /*************************************************************************** Get the camera position in worldspace ***************************************************************************/ void BKGD::GetCameraPos(BRS *pxr, BRS *pyr, BRS *pzr) { AssertThis(0); AssertNilOrVarMem(pxr); AssertNilOrVarMem(pyr); AssertNilOrVarMem(pzr); if (pvNil != pxr) *pxr = _xrCam; if (pvNil != pyr) *pyr = _yrCam; if (pvNil != pzr) *pzr = _zrCam; } /*************************************************************************** Turn on lights in pbwld ***************************************************************************/ void BKGD::TurnOnLights(PBWLD pbwld) { AssertThis(0); AssertPo(pbwld, 0); long ilite; BACT *pbact; if (!_fLites) { for (ilite = 0; ilite < _cbactLight; ilite++) { pbact = &_prgbactLight[ilite]; pbwld->AddActor(pbact); BrLightEnable(pbact); } _fLites = fTrue; } } /*************************************************************************** Turn off lights in pbwld ***************************************************************************/ void BKGD::TurnOffLights(void) { AssertThis(0); long ilite; BACT *pbact; if (!_fLites || _fLeaveLitesOn) return; for (ilite = 0; ilite < _cbactLight; ilite++) { pbact = &_prgbactLight[ilite]; BrLightDisable(pbact); BrActorRemove(pbact); } _fLites = fFalse; } /*************************************************************************** Set the camera and associated bitmaps to icam ***************************************************************************/ bool BKGD::FSetCamera(PBWLD pbwld, long icam) { AssertThis(0); AssertPo(pbwld, 0); AssertIn(icam, 0, Ccam()); long capos; KID kidCam; KID kidRGB; KID kidZ; BLCK blck; CAM cam; PCFL pcfl = Pcrf()->Pcfl(); BREUL breul; TurnOnLights(pbwld); // read new camera data if (!pcfl->FGetKidChidCtg(Ctg(), Cno(), icam, kctgCam, &kidCam)) return fFalse; if (!pcfl->FFind(kidCam.cki.ctg, kidCam.cki.cno, &blck) || !blck.FUnpackData()) return fFalse; // Need at least one actor position if (blck.Cb() < size(CAM)) { Bug("CAM chunk not large enough"); return fFalse; } capos = (blck.Cb() - size(CAM)) / size(APOS); if ((capos * size(APOS) + size(CAM)) != blck.Cb()) { Bug("CAM chunk's extra data not an even multiple of size(APOS)"); return fFalse; } if (!blck.FReadRgb(&cam, size(CAM), 0)) return fFalse; #ifdef DEBUG { BOM bomCam = kbomCam, bomCamOld = kbomCamOld; Assert(bomCam == bomCamOld, "BOM macros aren't right"); } #endif // DEBUG Assert((size(APOS) / size(long)) * size(long) == size(APOS), "APOS not an even number of longs"); if (kboOther == cam.bo) { SwapBytesBom(&cam, kbomCam); SwapBytesRglw(PvAddBv(&cam, offset(CAM, bmat34Cam)), size(cam.bmat34Cam) / size(long)); SwapBytesRglw(PvAddBv(&cam, size(CAM)), capos * (size(APOS) / size(long))); } Assert(kboCur == cam.bo, "bad cam"); // find RGB pict if (!pcfl->FGetKidChidCtg(kidCam.cki.ctg, kidCam.cki.cno, 0, kctgMbmp, &kidRGB)) { return fFalse; } // find Z pict if (!pcfl->FGetKidChidCtg(kidCam.cki.ctg, kidCam.cki.cno, 0, kctgZbmp, &kidZ)) { return fFalse; } if (!pbwld->FSetBackground(Pcrf(), kidRGB.cki.ctg, kidRGB.cki.cno, kidZ.cki.ctg, kidZ.cki.cno)) { return fFalse; } // Get actor placements ReleasePpo(&_pglapos); _iaposNext = _iaposLast = 0; if (capos > 0 && (_pglapos = GL::PglNew(size(APOS), capos)) != pvNil) { AssertDo(_pglapos->FSetIvMac(capos), "Should never fail"); _pglapos->Lock(); if (!blck.FReadRgb(_pglapos->QvGet(0), size(APOS) * capos, size(CAM))) { ReleasePpo(&_pglapos); return fFalse; } _pglapos->Unlock(); } _icam = icam; _xrPlace = cam.apos.xrPlace; _yrPlace = cam.apos.yrPlace; _zrPlace = cam.apos.zrPlace; _xrCam = cam.bmat34Cam.m[3][0]; _yrCam = cam.bmat34Cam.m[3][1]; _zrCam = cam.bmat34Cam.m[3][2]; // Find bmat34 without X & Z rotation breul.order = BR_EULER_YXY_R; BrMatrix34ToEuler(&breul, &cam.bmat34Cam); _braRotY = breul.a + breul.c; BrMatrix34RotateY(&_bmat34Mouse, _braRotY); BrMatrix34PostTranslate(&_bmat34Mouse, cam.bmat34Cam.m[3][0], cam.bmat34Cam.m[3][1], cam.bmat34Cam.m[3][2]); pbwld->SetCamera(&cam.bmat34Cam, cam.zrHither, cam.zrYon, cam.aFov); pbwld->MarkDirty(); return fTrue; } /*************************************************************************** Gets the matrix for mouse-dragging relative to the camera ***************************************************************************/ void BKGD::GetMouseMatrix(BMAT34 *pbmat34) { AssertThis(0); AssertVarMem(pbmat34); *pbmat34 = _bmat34Mouse; } /*************************************************************************** Gets the point at which to place new actors for this bkgd/view. ***************************************************************************/ void BKGD::GetActorPlacePoint(BRS *pxr, BRS *pyr, BRS *pzr) { AssertThis(0); AssertVarMem(pxr); AssertVarMem(pyr); AssertVarMem(pzr); APOS apos; if (_iaposNext == 0) { *pxr = _xrPlace; *pyr = _yrPlace; *pzr = _zrPlace; } else { _pglapos->Get(_iaposNext - 1, &apos); *pxr = apos.xrPlace; *pyr = apos.yrPlace; *pzr = apos.zrPlace; } _iaposLast = _iaposNext; if (_pglapos != pvNil) { _iaposNext++; if (_iaposNext > _pglapos->IvMac()) _iaposNext = 0; } } /****************************************************************************** ReuseActorPlacePoint Resets the current actor place point to the last one used. Call this from the actor placement code if the actor was placed at a point other than the one you just asked for. ************************************************************ PETED ***********/ void BKGD::ReuseActorPlacePoint(void) { _iaposNext = _iaposLast; } #ifdef DEBUG /*************************************************************************** Authoring only. Writes a special file with the given place info. ***************************************************************************/ bool BKGD::FWritePlaceFile(BRS xrPlace, BRS yrPlace, BRS zrPlace) { AssertThis(0); Assert(yrPlace == rZero, "are you sure you want non-zero Y?"); STN stnFile; FNI fni; PFIL pfil = pvNil; STN stnData; FP fp; long xr1 = BrScalarToInt(xrPlace); long xr2 = LwAbs((long)(1000000.0 * BrScalarToFloat(xrPlace - BrIntToScalar(xr1)))); long yr1 = BrScalarToInt(yrPlace); long yr2 = LwAbs((long)(1000000.0 * BrScalarToFloat(yrPlace - BrIntToScalar(yr1)))); long zr1 = BrScalarToInt(zrPlace); long zr2 = LwAbs((long)(1000000.0 * BrScalarToFloat(zrPlace - BrIntToScalar(zr1)))); if (!stnFile.FFormatSz("%s-cam.1-%d.pos", &_stn, _icam + 1)) goto LFail; if (!fni.FBuildFromPath(&stnFile)) goto LFail; if (fni.TExists() == tYes) pfil = FIL::PfilOpen(&fni, ffilWriteEnable); else pfil = FIL::PfilCreate(&fni); if (pvNil == pfil) goto LFail; if (!stnData.FFormatSz("NEW_ACTOR_POS %d.%06d %d.%06d %d.%06d\n\r", xr1, xr2, yr1, yr2, zr1, zr2)) { goto LFail; } if ((fp = pfil->FpMac()) > 0) { // Go to the end of the file (and write over null byte at end // of previous string) fp--; } if (!pfil->FWriteRgb(stnData.Psz(), stnData.Cch() + 1, fp)) goto LFail; ReleasePpo(&pfil); return fTrue; LFail: ReleasePpo(&pfil); return fFalse; } #endif // DEBUG #ifdef DEBUG /*************************************************************************** Assert the validity of the BKGD. ***************************************************************************/ void BKGD::AssertValid(ulong grf) { BKGD_PAR::AssertValid(fobjAllocated); AssertIn(_cbactLight, 1, 100); // 100 is sanity check AssertIn(_ccam, 1, 100); // 100 is sanity check Assert(_icam == ivNil || (_icam >= 0 && _icam < _ccam), "bad _icam"); AssertPvCb(_prgbactLight, LwMul(_cbactLight, size(BACT))); AssertPvCb(_prgblitLight, LwMul(_cbactLight, size(BLIT))); AssertPo(&_stn, 0); AssertNilOrPo(_pglapos, 0); } /*************************************************************************** Mark memory used by the BKGD ***************************************************************************/ void BKGD::MarkMem(void) { AssertThis(0); BKGD_PAR::MarkMem(); MarkPv(_prgbactLight); MarkPv(_prgblitLight); MarkMemObj(_pglclr); MarkMemObj(_pglapos); } #endif // DEBUG ================================================ FILE: src/engine/body.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** body.cpp: Body class Primary Author: ****** Review Status: REVIEWED - any changes to this file must be reviewed! A BODY holds the BRender-related data structures that make up what Socrates calls an actor. The BODY keeps track of all the body parts' models, matrices, and materials that make up the actor's shape, position, orientation, and costume. ACTR and TMPL are the main clients of BODY. From the client's point of view, a BODY consists not of a tree of body parts, but an array of parts and part sets. The "ibact"s and "ibset"s in the BODY APIs are indices into these arrays. PbodyNew() takes a parameter called pglibactPar, which is a GL of shorts. Each short is the body part number of a body part's parent body part. For example, suppose you passed in a pglibactPar of: (ivNil, 0, 0, 1, 2, 2) Body part 0 would have no parent (the first number in the GL is always ivNil). Body part 1's parent would be body part 0. Body part 2's parent would also be body part 0. Body part 3's parent would be body part 1, etc. The resulting tree would be: 0 | +--+--+ | | 1 +-2-+ | | | 3 4 5 BODY needs to keep track of three sets of BACTs: first, a root BACT whose transformation is changed to position and orient the BODY. Second, a BACT for the actor hilighting. Finally, there are the body parts for the BODY. So the BRender tree *really* looks like: root | +------+-----+ | | part0 hilite | +-------+--------+ | | part1 part2 | | | +---+---+ | | | part3 part4 part5 All these BACTs are allocated and released in one _prgbact. The root is _prgbact[0]. The hilite BACT is _prgbact[1]. The real body parts are _prgbact[2] through _prgbact[1 + 1 + _cbactPart]. There are APIs to access various members of this array more easily. The second parameter to PbodyNew is pglibset, which divides the body parts into "body part sets." A body part set is one or more body parts which are texture-mapped as a group. For example, putting a shirt on a human would affect the torso and both arms, so those three body parts would be grouped into a body part set. If body parts 0, 1, and 2 were in set 0; part 3 was in set 1; and parts 4 and 5 were in set 2, _pglibset would be {0, 0, 0, 1, 2, 2}. When applying a MTRL to a body part set, the same MTRL is attached to each body part in the set. When a CMTL is applied, the CMTL has a different MTRL per body part in the set. The way that MODLs, MTRLs, and CMTLs attach to the BODY is a little strange. In the case of models, the br_actor's model needs to be set to the MODL's BMDL (which is a BRender data structure), not the MODL itself (which is a Socrates data structure). When it is time to remove the model, the BODY has a pointer to the BMDL, but not the MODL! Fortunately, MODL sets the BMDL's identifier field to point to its owning MODL. So ReleasePpo can then be called on the MODL. But I don't want to set the BMDL's identifier to pvNil in the process, because other BODYs might be counting on the BMDL's identifier to point to the MODL. So this code has to be careful using ReleasePpo, since that sets the given pointer to pvNil. Same problem for MTRLs: BODY | MODL<--+ v | | BACT | | | | | | | v v | |model------------>BMDL | | | | | v | | identifier | +--+ | MTRL<--+ | | | v v | material--------->BMTL | | | v | identifier CMTLs are potentially even messier, since they're an abstraction on top of MTRLs. Here, an array of PCMTLs on the BODY is explicitly kept so it is easy to find out what CMTL is attached to what body part set instead of working backwards from the BACT's material field. ***************************************************************************/ #include "soc.h" ASSERTNAME RTCLASS(BODY) RTCLASS(COST) // Specification of hilite color. REVIEW *****: should these // values (or the PBMTL itself?) be passed in by the client? const br_colour kbrcHilite = BR_COLOUR_RGB(255, 255, 255); const byte kbOpaque = 0xff; const br_ufraction kbrufKaHilite = BR_UFRACTION(0.10); const br_ufraction kbrufKdHilite = BR_UFRACTION(0.60); const br_ufraction kbrufKsHilite = BR_UFRACTION(0.60); const BRS krPowerHilite = BR_SCALAR(50); const long kiclrHilite = 0; // default to no highlighting // Hilighting material PBMTL BODY::_pbmtlHilite = pvNil; PBODY BODY::_pbodyClosestClicked; long BODY::_dzpClosestClicked; PBACT BODY::_pbactClosestClicked; /*************************************************************************** Builds a tree of BACTs for the BODY. ***************************************************************************/ BODY *BODY::PbodyNew(PGL pglibactPar, PGL pglibset) { AssertPo(pglibactPar, 0); Assert(pglibactPar->CbEntry() == size(short), "bad pglibactPar"); AssertPo(pglibset, 0); Assert(pglibset->CbEntry() == size(short), "bad pglibset"); BODY *pbody; if (pvNil == _pbmtlHilite) { _pbmtlHilite = BrMaterialAllocate("Hilite"); if (pvNil == _pbmtlHilite) return pvNil; _pbmtlHilite->colour = kbrcHilite; _pbmtlHilite->ka = kbrufKaHilite; _pbmtlHilite->kd = kbrufKdHilite, _pbmtlHilite->ks = kbrufKsHilite; _pbmtlHilite->power = krPowerHilite; _pbmtlHilite->flags = BR_MATF_LIGHT | BR_MATF_GOURAUD | BR_MATF_FORCE_Z_0; _pbmtlHilite->index_base = kiclrHilite; _pbmtlHilite->index_range = 1; BrMaterialAdd(_pbmtlHilite); } pbody = NewObj BODY; if (pvNil == pbody || !pbody->_FInit(pglibactPar, pglibset)) { ReleasePpo(&pbody); return pvNil; } AssertPo(pbody, fobjAssertFull); return pbody; } /*************************************************************************** Build the BODY ***************************************************************************/ bool BODY::_FInit(PGL pglibactPar, PGL pglibset) { AssertBaseThis(0); AssertPo(pglibactPar, 0); AssertPo(pglibset, 0); _cactHidden = 1; // body starts out hidden if (!_FInitShape(pglibactPar, pglibset)) return fFalse; return fTrue; } /*************************************************************************** Build the BODY ***************************************************************************/ bool BODY::_FInitShape(PGL pglibactPar, PGL pglibset) { AssertBaseThis(0); AssertPo(pglibactPar, 0); Assert(pglibactPar->CbEntry() == size(short), "bad pglibactPar"); AssertPo(pglibset, 0); Assert(pglibset->CbEntry() == size(short), "bad pglibset"); Assert(pglibactPar->IvMac() == 0 || ivNil == *(short *)pglibactPar->QvGet(0), "bad first item in pglibactPar"); Assert(pglibactPar->IvMac() == pglibset->IvMac(), "pglibactPar must be same size as pglibset"); BACT *pbact; BACT *pbactPar; short ibactPar; short ibact; short ibset; // Copy pglibset into _pglibset _pglibset = pglibset->PglDup(); if (pvNil == _pglibset) return fFalse; // _cbset is (highest entry in _pglibset) + 1. _cbset = -1; for (ibact = 0; ibact < _pglibset->IvMac(); ibact++) { _pglibset->Get(ibact, &ibset); if (ibset > _cbset) _cbset = ibset; } _cbset++; if (!FAllocPv((void **)&_prgpcmtl, LwMul(_cbset, size(PCMTL)), fmemClear, mprNormal)) { return fFalse; } _cbactPart = pglibactPar->IvMac(); Assert(_cbset <= _cbactPart, "More sets than body parts?"); if (!FAllocPv((void **)&_prgbact, LwMul(_Cbact(), size(BACT)), fmemClear, mprNormal)) { return fFalse; } // first, set up the root pbact = _PbactRoot(); pbact->type = BR_ACTOR_NONE; pbact->t.type = BR_TRANSFORM_MATRIX34; BrMatrix34Identity(&pbact->t.t.mat); pbact->identifier = (schar *)this; // to find BODY from a BACT // next, set up hilite actor pbact = _PbactHilite(); pbact->type = BR_ACTOR_NONE; pbact->t.type = BR_TRANSFORM_MATRIX34; BrMatrix34Identity(&pbact->t.t.mat); pbact->identifier = (schar *)this; // to find BODY from a BACT pbact->material = _pbmtlHilite; pbact->render_style = BR_RSTYLE_BOUNDING_EDGES; BrActorAdd(_PbactRoot(), pbact); // now set up the body part BACTs for (ibact = 0; ibact < _cbactPart; ibact++) { pbact = _PbactPart(ibact); pbact->type = BR_ACTOR_MODEL; pbact->render_style = BR_RSTYLE_FACES; pbact->t.type = BR_TRANSFORM_MATRIX34; BrMatrix34Identity(&pbact->t.t.mat); pbact->identifier = (schar *)this; // to find BODY from a BACT // Find parent of this body part pglibactPar->Get(ibact, &ibactPar); if (ivNil == ibactPar) { pbactPar = _PbactRoot(); } else { AssertIn(ibactPar, 0, ibact); pbactPar = _PbactPart(ibactPar); } BrActorAdd(pbactPar, pbact); } return fTrue; } /*************************************************************************** Change the body part hierarchy and/or the body part sets of this BODY. Models, materials, and matrices are not changed for body parts that exist in both the old and reshaped BODYs. ***************************************************************************/ bool BODY::FChangeShape(PGL pglibactPar, PGL pglibset) { AssertThis(fobjAssertFull); AssertPo(pglibactPar, 0); AssertPo(pglibset, 0); PBODY pbodyDup; long ibset; bool fMtrl; PMTRL pmtrl; PCMTL pcmtl; long ibact; PBACT pbactDup; PBACT pbact; long cactHidden = _cactHidden; pbodyDup = PbodyDup(); if (pvNil == pbodyDup) goto LFail; _DestroyShape(); // note: hides the body if (!_FInitShape(pglibactPar, pglibset)) goto LFail; if (cactHidden == 0) // if body was visible Show(); // Restore materials for (ibset = 0; ibset < LwMin(_cbset, pbodyDup->_cbset); ibset++) { pbodyDup->GetPartSetMaterial(ibset, &fMtrl, &pmtrl, &pcmtl); if (fMtrl) SetPartSetMtrl(ibset, pmtrl); else SetPartSetCmtl(pcmtl); } // Restore models and matrices for (ibact = 0; ibact < LwMin(_cbactPart, pbodyDup->_cbactPart); ibact++) { pbactDup = pbodyDup->_PbactPart(ibact); pbact = _PbactPart(ibact); if (pvNil != pbactDup->model) SetPartModel(ibact, MODL::PmodlFromBmdl(pbactDup->model)); pbact->t.t.mat = pbactDup->t.t.mat; } _PbactRoot()->t.t.mat = pbodyDup->_PbactRoot()->t.t.mat; // Restore hilite state if (pbodyDup->_PbactHilite()->type == BR_ACTOR_MODEL) Hilite(); // body was hilited, so hilite it now ReleasePpo(&pbodyDup); AssertThis(fobjAssertFull); return fTrue; LFail: if (pvNil != pbodyDup) { Restore(pbodyDup); if (cactHidden == 0) Show(); ReleasePpo(&pbodyDup); } AssertThis(fobjAssertFull); return fFalse; } /*************************************************************************** Returns the BODY that owns the given BACT. Also, if pibset is not nil, returns what body part set this BACT is in. If the pbact is the hilite BACT, pibset is set to ivNil. ***************************************************************************/ BODY *BODY::PbodyFromBact(BACT *pbact, long *pibset) { AssertVarMem(pbact); AssertNilOrVarMem(pibset); PBODY pbody; long ibact; pbody = (BODY *)pbact->identifier; if (pvNil == pbody) { Bug("What actor is this? It has no BODY"); return pvNil; } AssertPo(pbody, 0); if (pvNil != pibset) { *pibset = ivNil; for (ibact = 0; ibact < pbody->_cbactPart; ibact++) { if (pbact == pbody->_PbactPart(ibact)) { *pibset = pbody->_Ibset(ibact); break; } } } return pbody; } /*************************************************************************** Returns the BODY that is under the given point. Also, if pibset is not nil, returns what body part set this point is in. ***************************************************************************/ BODY *BODY::PbodyClicked(long xp, long yp, PBWLD pbwld, long *pibset) { AssertNilOrVarMem(pibset); AssertPo(pbwld, 0); PBODY pbody; long ibact; _pbodyClosestClicked = pvNil; _dzpClosestClicked = BR_SCALAR_MAX; pbwld->IterateActorsInPt(BODY::_FFilter, pvNil, xp, yp); pbody = _pbodyClosestClicked; if (pvNil == _pbodyClosestClicked) { return pvNil; } AssertPo(_pbodyClosestClicked, 0); if (pvNil != pibset) { *pibset = ivNil; for (ibact = 0; ibact < _pbodyClosestClicked->_cbactPart; ibact++) { if (_pbactClosestClicked == _pbodyClosestClicked->_PbactPart(ibact)) { *pibset = _pbodyClosestClicked->_Ibset(ibact); break; } } } return _pbodyClosestClicked; } /*************************************************************************** Filter callback proc for PbodyClicked(). Saves pbody if it's the closest one hit so far and visible ***************************************************************************/ int BODY::_FFilter(BACT *pbact, PBMDL pbmdl, PBMTL pbmtl, BVEC3 *pbvec3RayPos, BVEC3 *pbvec3RayDir, BRS dzpNear, BRS dzpFar, void *pv) { AssertVarMem(pbact); AssertVarMem(pbvec3RayPos); AssertVarMem(pbvec3RayDir); PBODY pbody; pbody = BODY::PbodyFromBact(pbact); if ((dzpNear < _dzpClosestClicked) && (pbody != pvNil) && (pbody->FIsInView())) { _pbodyClosestClicked = pbody; _dzpClosestClicked = dzpNear; _pbactClosestClicked = pbact; } return fFalse; // fFalse means keep searching } /*************************************************************************** Destroy the BODY's body parts, including their attached materials and models. ***************************************************************************/ void BODY::_DestroyShape(void) { AssertBaseThis(0); long ibset; long ibact; BACT *pbact; MODL *pmodl; // Must hide body before destroying it if (_cactHidden == 0) Hide(); if (pvNil != _prgbact) { for (ibact = 0; ibact < _cbactPart; ibact++) { pbact = _PbactPart(ibact); if (pvNil != pbact->model) { pmodl = MODL::PmodlFromBmdl(pbact->model); AssertPo(pmodl, 0); ReleasePpo(&pmodl); pbact->model = pvNil; } } if (pvNil != _prgpcmtl) { for (ibset = 0; ibset < _cbset; ibset++) _RemoveMaterial(ibset); } FreePpv((void **)&_prgbact); } FreePpv((void **)&_prgpcmtl); ReleasePpo(&_pglibset); } /*************************************************************************** Free the BODY and all attached MODLs, MTRLs, and CMTLs. ***************************************************************************/ BODY::~BODY(void) { AssertBaseThis(0); _DestroyShape(); } /*************************************************************************** Create a duplicate of this BODY. The duplicate will be hidden (_cactHidden == 1) regardless of the state of this BODY. ***************************************************************************/ PBODY BODY::PbodyDup(void) { AssertThis(0); PBODY pbodyDup; long ibact; long ibset; PBACT pbact; long bv; // delta in bytes from _prgbact to _pbody->_prgbact bool fMtrl; PMTRL pmtrl; PCMTL pcmtl; bool fVis; fVis = (_cactHidden == 0); if (fVis) Hide(); // temporarily hide this BODY pbodyDup = NewObj BODY; if (pvNil == pbodyDup) goto LFail; pbodyDup->_cactHidden = 1; pbodyDup->_cbset = _cbset; pbodyDup->_cbactPart = _cbactPart; pbodyDup->_pbwld = _pbwld; pbodyDup->_fFound = _fFound; pbodyDup->_ibset = _ibset; if (!FAllocPv((void **)&pbodyDup->_prgbact, LwMul(_Cbact(), size(BACT)), fmemClear, mprNormal)) { goto LFail; } CopyPb(_prgbact, pbodyDup->_prgbact, LwMul(_Cbact(), size(BACT))); // need to update BACT parent, child, next, prev pointers bv = BvSubPvs(pbodyDup->_prgbact, _prgbact); for (ibact = 0; ibact < _Cbact(); ibact++) { pbact = &pbodyDup->_prgbact[ibact]; pbact->identifier = (schar *)pbodyDup; if (ibact == 0) { pbact->parent = pvNil; if (pvNil != pbact->children) pbact->children = (PBACT)PvAddBv(pbact->children, bv); pbact->next = pvNil; pbact->prev = pvNil; } else { if (pvNil != pbact->parent) pbact->parent = (PBACT)PvAddBv(pbact->parent, bv); if (pvNil != pbact->children) pbact->children = (PBACT)PvAddBv(pbact->children, bv); if (pvNil != pbact->next) pbact->next = (PBACT)PvAddBv(pbact->next, bv); if (pvNil != pbact->prev) pbact->prev = (PBACT *)PvAddBv(pbact->prev, bv); } } for (ibact = 0; ibact < pbodyDup->_cbactPart; ibact++) { pbact = _PbactPart(ibact); if (pvNil != pbact->model) MODL::PmodlFromBmdl(pbact->model)->AddRef(); } pbodyDup->_pglibset = _pglibset->PglDup(); if (pvNil == pbodyDup->_pglibset) goto LFail; if (!FAllocPv((void **)&pbodyDup->_prgpcmtl, LwMul(_cbset, size(PCMTL)), fmemClear, mprNormal)) { goto LFail; } CopyPb(_prgpcmtl, pbodyDup->_prgpcmtl, LwMul(_cbset, size(PCMTL))); pbodyDup->_rcBounds = _rcBounds; pbodyDup->_rcBoundsLastVis = _rcBoundsLastVis; for (ibset = 0; ibset < _cbset; ibset++) { pbodyDup->GetPartSetMaterial(ibset, &fMtrl, &pmtrl, &pcmtl); if (fMtrl) { // need to AddRef once per body part in this set for (ibact = 0; ibact < pbodyDup->_cbactPart; ibact++) { if (ibset == _Ibset(ibact)) pmtrl->AddRef(); } } else { pcmtl->AddRef(); } } if (fVis) Show(); // re-show this BODY (but not the duplicate) AssertPo(pbodyDup, 0); return pbodyDup; LFail: if (fVis) Show(); ReleasePpo(&pbodyDup); return pvNil; } /*************************************************************************** Replace this BODY with pbodyDup. Preserve this BODY's hidden-ness. ***************************************************************************/ void BODY::Restore(PBODY pbodyDup) { AssertBaseThis(0); AssertPo(pbodyDup, 0); Assert(pbodyDup->_cactHidden == 1, "dup hidden count must be 1"); long cactHidden = _cactHidden; long ibact; SwapVars(this, pbodyDup); for (ibact = 0; ibact < _Cbact(); ibact++) _prgbact[ibact].identifier = (schar *)this; if (cactHidden == 0) Show(); _cactHidden = cactHidden; AssertThis(fobjAssertFull); } /*************************************************************************** Make this BODY visible, if it was invisible. Keeps a refcount. ***************************************************************************/ void BODY::Show(void) { AssertThis(0); Assert(_cactHidden > 0, "object is already visible!"); if (--_cactHidden == 0) { AssertPo(_pbwld, 0); _pbwld->AddActor(_PbactRoot()); _pbwld->SetBeginRenderCallback(_PrepareToRender); _pbwld->SetActorRenderedCallback(_BactRendered); _pbwld->SetGetRcCallback(_GetRc); _pbwld->MarkDirty(); // need to render } } /*************************************************************************** Make this BODY invisible, if it was visible. Keeps a refcount. ***************************************************************************/ void BODY::Hide(void) { AssertThis(0); RC rc; if (_cactHidden++ == 0) { _rcBounds.Zero(); BrActorRemove(_PbactRoot()); AssertPo(_pbwld, 0); _pbwld->MarkDirty(); // need to render } } /*************************************************************************** Sets the hilite color to use. ***************************************************************************/ void BODY::SetHiliteColor(long iclr) { if (_pbmtlHilite != pvNil) { _pbmtlHilite->index_base = (UCHAR)iclr; } } /*************************************************************************** Hilites the BODY ***************************************************************************/ void BODY::Hilite(void) { AssertThis(0); _PbactHilite()->type = BR_ACTOR_MODEL; if (_cactHidden == 0) { AssertPo(_pbwld, 0); _pbwld->MarkDirty(); // need to render } } /*************************************************************************** Unhilites the BODY ***************************************************************************/ void BODY::Unhilite(void) { AssertThis(0); _PbactHilite()->type = BR_ACTOR_NONE; if (_cactHidden == 0) { AssertPo(_pbwld, 0); _pbwld->MarkDirty(); // need to render } } /*************************************************************************** Position the body at (xr, yr, zr) in worldspace oriented by pbmat34 ***************************************************************************/ void BODY::LocateOrient(BRS xr, BRS yr, BRS zr, BMAT34 *pbmat34) { AssertThis(0); AssertVarMem(pbmat34); _PbactRoot()->t.t.mat = *pbmat34; BrMatrix34PostTranslate(&_PbactRoot()->t.t.mat, xr, yr, zr); if (_cactHidden == 0) { AssertPo(_pbwld, 0); _pbwld->MarkDirty(); // need to render } } /*************************************************************************** Set the ibact'th body part to use model pmodl ***************************************************************************/ void BODY::SetPartModel(long ibact, MODL *pmodl) { AssertThis(0); AssertIn(ibact, 0, _cbactPart); AssertPo(pmodl, 0); BACT *pbact = _PbactPart(ibact); PMODL pmodlOld; if (pvNil != pbact->model) // Release old MODL, unless it's pmodl { pmodlOld = MODL::PmodlFromBmdl(pbact->model); AssertPo(pmodlOld, 0); if (pmodl == pmodlOld) return; // We're already using that MODL, so do nothing ReleasePpo(&pmodlOld); } pbact->model = pmodl->Pbmdl(); Assert(MODL::PmodlFromBmdl(pbact->model) == pmodl, "MODL problem"); pmodl->AddRef(); if (_cactHidden == 0) { AssertPo(_pbwld, 0); _pbwld->MarkDirty(); // need to render } } /*************************************************************************** Set the ibact'th body part to use matrix pbmat34 ***************************************************************************/ void BODY::SetPartMatrix(long ibact, BMAT34 *pbmat34) { AssertThis(0); AssertIn(ibact, 0, _cbactPart); AssertVarMem(pbmat34); _PbactPart(ibact)->t.t.mat = *pbmat34; if (_cactHidden == 0) { AssertPo(_pbwld, 0); _pbwld->MarkDirty(); // need to render } } /*************************************************************************** Remove old MTRL or CMTL from ibset. This is nontrivial because there could either be a CMTL attached to the bset (in which case we just free the CMTL) or a bunch of MTRLs (in which case we free each MTRL). Actually, in the latter case, it would be a bunch of copies of the same MTRL, but we keep one reference per body part in the set. ***************************************************************************/ void BODY::_RemoveMaterial(long ibset) { AssertThis(0); AssertIn(ibset, 0, _cbset); PCMTL pcmtlOld; BACT *pbact; long ibact; bool fCmtl = fFalse; pcmtlOld = _prgpcmtl[ibset]; if (pvNil != pcmtlOld) // there was a CMTL on this bset { fCmtl = fTrue; AssertPo(pcmtlOld, 0); ReleasePpo(&pcmtlOld); // free all old MTRLs _prgpcmtl[ibset] = pvNil; } // for each body part, if this part is in the set ibset, free the MTRL for (ibact = 0; ibact < _cbactPart; ibact++) { if (ibset == _Ibset(ibact)) { pbact = _PbactPart(ibact); if (pbact->material != pvNil) // free old MTRL { if (!fCmtl) MTRL::PmtrlFromBmtl(pbact->material)->Release(); pbact->material = pvNil; } } } } /*************************************************************************** Set the ibset'th body part set to use material pmtrl ***************************************************************************/ void BODY::SetPartSetMtrl(long ibset, MTRL *pmtrl) { AssertThis(0); AssertIn(ibset, 0, _cbset); AssertPo(pmtrl, 0); BACT *pbact; long ibact; _RemoveMaterial(ibset); // remove existing MTRL/CMTL, if any // for each body part, if this part is in the set ibset, set the MTRL for (ibact = 0; ibact < _cbactPart; ibact++) { if (ibset == _Ibset(ibact)) { pbact = _PbactPart(ibact); pbact->material = pmtrl->Pbmtl(); pmtrl->AddRef(); } } if (_cactHidden == 0) { AssertPo(_pbwld, 0); _pbwld->MarkDirty(); // need to render } } /*************************************************************************** Apply the given CMTL to the appropriate body part set (the CMTL knows which body part set to apply to). ***************************************************************************/ void BODY::SetPartSetCmtl(CMTL *pcmtl) { AssertThis(0); AssertPo(pcmtl, 0); BACT *pbact; long ibact; long ibmtl = 0; long ibset = pcmtl->Ibset(); PMODL pmodl; pcmtl->AddRef(); _RemoveMaterial(ibset); // remove existing MTRL/CMTL _prgpcmtl[ibset] = pcmtl; // for each body part, if this part is in the set ibset, set the MTRL for (ibact = 0; ibact < _cbactPart; ibact++) { if (ibset == _Ibset(ibact)) { pbact = _PbactPart(ibact); // Handle model changes for accessories pmodl = pcmtl->Pmodl(ibmtl); if (pvNil != pmodl) SetPartModel(ibact, pmodl); pbact->material = pcmtl->Pbmtl(ibmtl); ibmtl++; } } Assert(ibmtl == pcmtl->Cbprt(), "didn't use all custom materials!"); if (_cactHidden == 0) { AssertPo(_pbwld, 0); _pbwld->MarkDirty(); // need to render } } /*************************************************************************** Determines the current CMTL or MTRL applied to the given ibset. If a CMTL is attached, *pfMtrl is fFalse and *ppcmtl holds the PCMTL. If a MTRL is attached, *pfMtrl is fTrue and *ppmtrl holds the PMTRL. ***************************************************************************/ void BODY::GetPartSetMaterial(long ibset, bool *pfMtrl, MTRL **ppmtrl, CMTL **ppcmtl) { AssertThis(0); AssertIn(ibset, 0, _cbset); AssertVarMem(pfMtrl); AssertVarMem(ppmtrl); AssertVarMem(ppcmtl); BACT *pbact; long ibact; *ppcmtl = _prgpcmtl[ibset]; if (pvNil != *ppcmtl) // there is a CMTL on this bset { *pfMtrl = fFalse; AssertPo(*ppcmtl, 0); TrashVar(ppmtrl); } else { *pfMtrl = fTrue; TrashVar(ppcmtl); // Find any body part of ibset...they'll all have the same MTRL for (ibact = 0; ibact < _cbactPart; ibact++) { if (ibset == _Ibset(ibact)) { pbact = _PbactPart(ibact); Assert(pvNil != pbact->material, "Why does this body part " "set have neither MTRL nor CMTL attached?"); *ppmtrl = MTRL::PmtrlFromBmtl(pbact->material); AssertPo(*ppmtrl, 0); return; } } Assert(0, "why are we here?"); } } /*************************************************************************** Filter callback proc for FPtInActor(). Stops when the BODY is hit. ***************************************************************************/ int BODY::_FFilterSearch(BACT *pbact, PBMDL pbmdl, PBMTL pbmtl, BVEC3 *ray_pos, BVEC3 *ray_dir, BRS dzpNear, BRS dzpFar, void *pvArg) { AssertVarMem(pbact); AssertVarMem(ray_pos); AssertVarMem(ray_dir); PBODY pbody = (PBODY)pvArg; PBODY pbodyFound; long ibset; AssertPo(pbody, 0); pbodyFound = BODY::PbodyFromBact(pbact, &ibset); if (pbodyFound == pvNil) { Bug("What actor is this? It has no BODY"); return fFalse; } AssertPo(pbodyFound, 0); if (pbody != pbodyFound) return fFalse; // keep searching pbody->_fFound = fTrue; if (pbact == pbody->_PbactHilite()) return fFalse; // keep searching pbody->_ibset = ibset; return fTrue; // stop searching } /*************************************************************************** Returns fTrue if this body is under (xp, yp) ***************************************************************************/ bool BODY::FPtInBody(long xp, long yp, long *pibset) { AssertThis(0); _fFound = fFalse; _ibset = ivNil; _pbwld->IterateActorsInPt(&BODY::_FFilterSearch, (void *)this, xp, yp); *pibset = _ibset; return _fFound; } /*************************************************************************** BWLD is about to render the world, so clear out this BODY's _rcBounds (but save the last good bounds in _rcBoundsLastVis). Also size the bounding box correctly. ***************************************************************************/ void BODY::_PrepareToRender(PBACT pbact) { AssertVarMem(pbact); PBODY pbody; RC rc; BCB bcb; pbody = PbodyFromBact(pbact); AssertPo(pbody, 0); if (pbody->FIsInView()) { pbody->_rcBoundsLastVis = pbody->_rcBounds; pbody->_rcBounds.Zero(); } // Prepare bounding box, if BODY is highlighted if (pbody->_PbactHilite()->type == BR_ACTOR_MODEL) { // Need to temporarily change type to 'none' so that the bounding // box isn't counted when calculating size of actor pbody->GetBcbBounds(&bcb); Assert(size(BRB) == size(BCB), "should be same structure"); BrBoundsToMatrix34(&pbody->_PbactHilite()->t.t.mat, (BRB *)&bcb); } } /*************************************************************************** Return the bounds of the BODY contaning PBACT ***************************************************************************/ void BODY::_GetRc(PBACT pbact, RC *prc) { AssertVarMem(pbact); AssertVarMem(prc); PBODY pbody; pbody = PbodyFromBact(pbact); AssertPo(pbody, 0); if (pvNil != pbody) *prc = pbody->_rcBounds; } /*************************************************************************** Compute the world-space bounding box of the BODY. The code temporarily changes the hilite BACT's type to BR_ACTOR_NONE so that BrActorToBounds doesn't include the size of the bounding box when computing the size of the actor. ***************************************************************************/ void BODY::GetBcbBounds(BCB *pbcb, bool fWorld) { AssertThis(0); AssertVarMem(pbcb); BRB brb; byte type = _PbactHilite()->type; long ibv3; br_vector3 bv3; _PbactHilite()->type = BR_ACTOR_NONE; Assert(size(BRB) == size(BCB), "should be same structure"); BrActorToBounds(&brb, _PbactRoot()); _PbactHilite()->type = type; *(BRB *)pbcb = brb; if (fWorld) { br_vector3 rgbv3[8]; BMAT34 bmat34; rgbv3[0] = brb.min; rgbv3[1] = brb.min; rgbv3[1].v[0] = brb.max.v[0]; rgbv3[2] = brb.min; rgbv3[2].v[1] = brb.max.v[1]; rgbv3[3] = brb.min; rgbv3[3].v[2] = brb.max.v[2]; rgbv3[4] = brb.max; rgbv3[5] = brb.max; rgbv3[5].v[0] = brb.min.v[0]; rgbv3[6] = brb.max; rgbv3[6].v[1] = brb.min.v[1]; rgbv3[7] = brb.max; rgbv3[7].v[2] = brb.min.v[2]; bmat34 = _PbactRoot()->t.t.mat; for (ibv3 = 0; ibv3 < 8; ibv3++) { bv3.v[0] = BR_MAC4(rgbv3[ibv3].v[0], bmat34.m[0][0], rgbv3[ibv3].v[1], bmat34.m[1][0], rgbv3[ibv3].v[2], bmat34.m[2][0], BR_SCALAR(1.0), bmat34.m[3][0]); bv3.v[1] = BR_MAC4(rgbv3[ibv3].v[0], bmat34.m[0][1], rgbv3[ibv3].v[1], bmat34.m[1][1], rgbv3[ibv3].v[2], bmat34.m[2][1], BR_SCALAR(1.0), bmat34.m[3][1]); bv3.v[2] = BR_MAC4(rgbv3[ibv3].v[0], bmat34.m[0][2], rgbv3[ibv3].v[1], bmat34.m[1][2], rgbv3[ibv3].v[2], bmat34.m[2][2], BR_SCALAR(1.0), bmat34.m[3][2]); rgbv3[ibv3].v[0] = bv3.v[0]; rgbv3[ibv3].v[1] = bv3.v[1]; rgbv3[ibv3].v[2] = bv3.v[2]; } pbcb->xrMin = pbcb->yrMin = pbcb->zrMin = BR_SCALAR(10000.0); pbcb->xrMax = pbcb->yrMax = pbcb->zrMax = BR_SCALAR(-10000.0); // Union with body's bounds for (ibv3 = 0; ibv3 < 8; ibv3++) { if (rgbv3[ibv3].v[0] < pbcb->xrMin) pbcb->xrMin = rgbv3[ibv3].v[0]; if (rgbv3[ibv3].v[1] < pbcb->yrMin) pbcb->yrMin = rgbv3[ibv3].v[1]; if (rgbv3[ibv3].v[2] < pbcb->zrMin) pbcb->zrMin = rgbv3[ibv3].v[2]; if (rgbv3[ibv3].v[0] > pbcb->xrMax) pbcb->xrMax = rgbv3[ibv3].v[0]; if (rgbv3[ibv3].v[1] > pbcb->yrMax) pbcb->yrMax = rgbv3[ibv3].v[1]; if (rgbv3[ibv3].v[2] > pbcb->zrMax) pbcb->zrMax = rgbv3[ibv3].v[2]; } } } /*************************************************************************** BWLD calls this function when each BACT is rendered. It unions the BACT bounds with the BODY's _rcBounds ***************************************************************************/ void BODY::_BactRendered(PBACT pbact, RC *prc) { AssertVarMem(pbact); AssertVarMem(prc); PBODY pbody; pbody = PbodyFromBact(pbact); if (pvNil != pbody) pbody->_rcBounds.Union(prc); } /*************************************************************************** Returns whether the BODY was in view the last time it was rendered. ***************************************************************************/ bool BODY::FIsInView(void) { AssertThis(0); return !_rcBounds.FEmpty(); } /*************************************************************************** Fills in the 2D bounds of the BODY, the last time it was rendered. If the BODY was not in view at the last render, this function fills in the bounds of the BODY the last time it was onstage. ***************************************************************************/ void BODY::GetRcBounds(RC *prc) { AssertThis(0); AssertVarMem(prc); if (FIsInView()) *prc = _rcBounds; else *prc = _rcBoundsLastVis; } /*************************************************************************** Fills in the 2D coordinates of the center of the BODY, the last time it was rendered. If the BODY was not in view at the last render, this function fills in the center of the BODY the last time it was onstage. ***************************************************************************/ void BODY::GetCenter(long *pxp, long *pyp) { AssertThis(0); AssertVarMem(pxp); AssertVarMem(pyp); if (FIsInView()) { *pxp = _rcBounds.XpCenter(); *pyp = _rcBounds.YpCenter(); } else { *pxp = _rcBoundsLastVis.XpCenter(); *pyp = _rcBoundsLastVis.YpCenter(); } } /*************************************************************************** Fills in the current position of the origin of this BODY. ***************************************************************************/ void BODY::GetPosition(BRS *pxr, BRS *pyr, BRS *pzr) { AssertThis(0); AssertVarMem(pxr); AssertVarMem(pyr); AssertVarMem(pzr); *pxr = _PbactRoot()->t.t.mat.m[3][0]; *pyr = _PbactRoot()->t.t.mat.m[3][1]; *pzr = _PbactRoot()->t.t.mat.m[3][2]; } #ifdef DEBUG /*************************************************************************** Assert the validity of the BODY. ***************************************************************************/ void BODY::AssertValid(ulong grf) { long ibact; long ibset; BACT *pbact; BODY_PAR::AssertValid(fobjAllocated); AssertIn(_cactHidden, 0, 100); // 100 is sanity check AssertIn(_cbset, 0, _cbactPart + 1); AssertPvCb(_prgbact, LwMul(_Cbact(), size(BACT))); AssertPvCb(_prgpcmtl, LwMul(_cbset, size(PCMTL))); Assert(pvNil == _PbactRoot()->model, "BODY root shouldn't have a model!!"); Assert(pvNil == _PbactRoot()->material, "BODY root shouldn't have a material!!"); AssertPo(_pglibset, 0); Assert(_pglibset->CbEntry() == size(short), "bad _pglibset"); if (grf & fobjAssertFull) { for (ibact = 0; ibact < _cbactPart; ibact++) { pbact = _PbactPart(ibact); if (pvNil != pbact->model) AssertPo(MODL::PmodlFromBmdl(pbact->model), 0); if (pvNil != pbact->material) AssertPo(MTRL::PmtrlFromBmtl(pbact->material), 0); } for (ibset = 0; ibset < _cbset; ibset++) { AssertNilOrPo(_prgpcmtl[ibset], 0); } } } /*************************************************************************** Mark memory used by the BODY ***************************************************************************/ void BODY::MarkMem(void) { AssertThis(0); long ibact; PBACT pbact; PMODL pmodl; long ibset; bool fMtrl; PMTRL pmtrl; PCMTL pcmtl; BODY_PAR::MarkMem(); MarkPv(_prgbact); MarkPv(_prgpcmtl); MarkMemObj(_pglibset); for (ibact = 0; ibact < _cbactPart; ibact++) { pbact = _PbactPart(ibact); if (pvNil != pbact->model) { pmodl = MODL::PmodlFromBmdl(pbact->model); AssertPo(pmodl, 0); MarkMemObj(pmodl); } } for (ibset = 0; ibset < _cbset; ibset++) { GetPartSetMaterial(ibset, &fMtrl, &pmtrl, &pcmtl); if (fMtrl) MarkMemObj(pmtrl); else MarkMemObj(pcmtl); } } #endif // DEBUG /*************************************************************************** Create a blank costume -- no materials are attached yet ***************************************************************************/ COST::COST(void) { TrashVar(&_cbset); _prgpo = pvNil; } /*************************************************************************** Destroy a costume ***************************************************************************/ COST::~COST(void) { AssertBaseThis(0); _Clear(); } /*************************************************************************** Release all arrays and references ***************************************************************************/ void COST::_Clear(void) { AssertBaseThis(0); long ibset; if (pvNil != _prgpo) { for (ibset = 0; ibset < _cbset; ibset++) ReleasePpo(&_prgpo[ibset]); // Release the PCMTL or PMTRL FreePpv((void **)&_prgpo); } TrashVar(&_cbset); } /*************************************************************************** Get a costume from a BODY ***************************************************************************/ bool COST::FGet(BODY *pbody) { AssertThis(0); AssertPo(pbody, 0); long ibset; PCMTL pcmtl; PMTRL pmtrl; bool fMtrl; _Clear(); // drop previous costume, if any if (!FAllocPv((void **)&_prgpo, LwMul(size(BASE *), pbody->Cbset()), fmemClear, mprNormal)) { return fFalse; } _cbset = pbody->Cbset(); for (ibset = 0; ibset < _cbset; ibset++) { pbody->GetPartSetMaterial(ibset, &fMtrl, &pmtrl, &pcmtl); if (fMtrl) _prgpo[ibset] = pmtrl; else _prgpo[ibset] = pcmtl; _prgpo[ibset]->AddRef(); } AssertThis(0); return fTrue; } /*************************************************************************** Set a costume onto a BODY. The flag fAllowDifferentShape should usually be fFalse; it should be fTrue in the rare cases where it is appropriate to apply a costume with one number of body part sets to a BODY with a (possibly) different number of body part sets. In that case, the smaller number of materials are copied. For example, when changing the number of characters in a 3-D Text object, the code grabs the current costume, resizes the TDT and BODY, sets the TDT's BODY to the default costume, then restores the old costume to the BODY as much as is appropriate. ***************************************************************************/ void COST::Set(PBODY pbody, bool fAllowDifferentShape) { AssertThis(0); AssertPo(pbody, 0); long ibset; BASE *po; long cbset; if (fAllowDifferentShape) // see comment in function header { cbset = LwMin(_cbset, pbody->Cbset()); } else { Assert(_cbset == pbody->Cbset(), "different BODY shapes!"); cbset = _cbset; } for (ibset = 0; ibset < cbset; ibset++) { po = _prgpo[ibset]; AssertPo(po, 0); if (po->FIs(kclsMTRL)) pbody->SetPartSetMtrl(ibset, (PMTRL)_prgpo[ibset]); else pbody->SetPartSetCmtl((PCMTL)_prgpo[ibset]); } } #ifdef DEBUG /*************************************************************************** Assert the validity of the COST. ***************************************************************************/ void COST::AssertValid(ulong grf) { long ibset; BASE *po; if (pvNil != _prgpo) { AssertPvCb(_prgpo, LwMul(size(BASE *), _cbset)); for (ibset = 0; ibset < _cbset; ibset++) { po = _prgpo[ibset]; if (po->FIs(kclsMTRL)) AssertPo((PMTRL)po, 0); else AssertPo((PCMTL)po, 0); } } } /*************************************************************************** Mark memory used by the COST ***************************************************************************/ void COST::MarkMem(void) { AssertThis(0); long ibset; if (pvNil != _prgpo) { MarkPv(_prgpo); for (ibset = 0; ibset < _cbset; ibset++) MarkMemObj(_prgpo[ibset]); } } #endif DEBUG ================================================ FILE: src/engine/makefile ================================================ #---engine.mak !IFNDEF MAKEFILE_ENGINE MAKEFILE_ENGINE = 1 !INCLUDE $(KAUAI_ROOT)\makefile.def #ENGINE SOURCE DIRECTORY ENGINE_SRC_DIR = $(SOC_ROOT)\src\engine #SOC OBJ DIRECTORY # REVIEW a-aarob (peted): why isn't this defined in the soc\makefile? SOC_OBJ_ROOT_DIR = $(SOC_ROOT)\obj SOC_OBJ_DIR = $(SOC_OBJ_ROOT_DIR)\$(BLD_TYPE_DIR) !IF "$(LOCAL_BUILD)"=="1" TARGET_DIR = !ELSE # LOCAL_BUILD TARGET_DIR = $(SOC_OBJ_DIR)^\ !ENDIF # !LOCAL_BUILD BREN_LIB = $(SOC_ROOT)\elib\$(BLD_TYPE_DIR)\bren.lib\ $(SOC_ROOT)\elib\$(BLD_TYPE_DIR)\brfmmxr.lib\ $(SOC_ROOT)\elib\$(BLD_TYPE_DIR)\brfwmxr.lib\ $(SOC_ROOT)\elib\$(BLD_TYPE_DIR)\brzbmxr.lib ENGINE_TARGETS =\ $(TARGET_DIR)actor.obj\ $(TARGET_DIR)actredit.obj\ $(TARGET_DIR)actrsave.obj\ $(TARGET_DIR)actrsnd.obj\ $(TARGET_DIR)bkgd.obj\ $(TARGET_DIR)body.obj\ $(TARGET_DIR)modl.obj\ $(TARGET_DIR)movie.obj\ $(TARGET_DIR)msnd.obj\ $(TARGET_DIR)mtrl.obj\ $(TARGET_DIR)scene.obj\ $(TARGET_DIR)srec.obj\ $(TARGET_DIR)tagl.obj\ $(TARGET_DIR)tagman.obj\ $(TARGET_DIR)tbox.obj\ $(TARGET_DIR)tdf.obj\ $(TARGET_DIR)tdt.obj\ $(TARGET_DIR)tmpl.obj #-Compile rules------------------------------------------------------------- PROGRAM_DATABASE = $(TARGET_DIR)soc.pdb PRECOMPILED_HEADER = $(TARGET_DIR)soc.pch CPPEXTRA = /Zi /Fd$(PROGRAM_DATABASE) /Fp$(PRECOMPILED_HEADER) SRC_DIR=$(ENGINE_SRC_DIR) OBJ_DIR=$(SOC_OBJ_DIR) TGT_NAME=Engine !INCLUDE $(SOC_ROOT)\makefile.rul #-Targets------------------------------------------------------------------- ALL_ENGINE = $(TARGET_DIR)engine.lib ALL_TARGETS_ROOT = $(ALL_TARGETS_ROOT) $(ALL_ENGINE) CLEAN_ENGINE = CLEAN_ENGINE_OBJ CLEAN_TARGETS_ROOT=$(CLEAN_TARGETS_ROOT) $(CLEAN_ENGINE) # Only define generic targets if we're not building in the current directory !IF "$(LOCAL_BUILD)" != "1" !IF "$(LOCAL_BUILD)" != "0" ALL: $(SOC_OBJ_DIR) $(ALL_ENGINE) CLEAN: $(CLEAN_ENGINE) ALL !ENDIF # LOCAL_BUILD != 0 $(SOC_OBJ_DIR) : @echo Making Directories $(SOC_OBJ_DIR)... if not exist $(SOC_OBJ_ROOT_DIR)/nul mkdir $(SOC_OBJ_ROOT_DIR) if not exist $(SOC_OBJ_DIR)/nul mkdir $(SOC_OBJ_DIR) !ENDIF # !LOCAL_BUILD CLEAN_ENGINE_OBJ: @echo <nul^ DEL /q dummy.nul ) 2>nul <_pbmdl = BrModelAllocate(szIdentifier, cbrv, cbrf); if (pvNil == pmodl->_pbmdl) goto LFail; CopyPb(&pmodl, pmodl->_pbmdl->identifier, size(PMODL)); CopyPb(prgbrv, pmodl->_pbmdl->vertices, LwMul(cbrv, size(BRV))); CopyPb(prgbrf, pmodl->_pbmdl->faces, LwMul(cbrf, size(BRF))); BrModelAdd(pmodl->_pbmdl); AssertPo(pmodl, 0); return pmodl; LFail: ReleasePpo(&pmodl); return pvNil; } /*************************************************************************** A PFNRPO to read a MODL from a file ***************************************************************************/ bool MODL::FReadModl(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb) { AssertPo(pcrf, 0); AssertPo(pblck, 0); AssertNilOrVarMem(ppbaco); AssertVarMem(pcb); MODL *pmodl; *pcb = pblck->Cb(fTrue); if (pvNil == ppbaco) return fTrue; if (!pblck->FUnpackData()) goto LFail; *pcb = pblck->Cb(); pmodl = NewObj MODL; if (pvNil == pmodl || !pmodl->_FInit(pblck)) { ReleasePpo(&pmodl); LFail: TrashVar(ppbaco); TrashVar(pcb); return pvNil; } AssertPo(pmodl, 0); *ppbaco = pmodl; return fTrue; } /*************************************************************************** Reads a MODL from a BLCK ***************************************************************************/ bool MODL::_FInit(PBLCK pblck) { AssertBaseThis(0); AssertPo(pblck, 0); MODLF modlf; long cbrgbrv; long cbrgbrf; long ibrv; BRV *pbrv; long ibrf; BRF *pbrf; MODL *pmodlThis = this; char szIdentifier[size(PMODL) + 1]; ClearPb(szIdentifier, size(PMODL) + 1); if (!pblck->FUnpackData()) return fFalse; if (pblck->Cb() < size(MODLF)) return fFalse; if (!pblck->FReadRgb(&modlf, size(MODLF), 0)) return fFalse; if (kboOther == modlf.bo) SwapBytesBom(&modlf, kbomModlf); Assert(kboCur == modlf.bo, "bad MODL!"); // Allocate space for the BMDL, array of vertices, and array of faces cbrgbrv = LwMul(modlf.cver, size(BRV)); cbrgbrf = LwMul(modlf.cfac, size(BRF)); if (modlf.rRadius == rZero) { // unprepared model. Gotta prepare it. _pbmdl = BrModelAllocate(szIdentifier, modlf.cver, modlf.cfac); if (pvNil == _pbmdl) return fFalse; CopyPb(&pmodlThis, _pbmdl->identifier, size(PMODL)); if (!pblck->FReadRgb(_pbmdl->vertices, cbrgbrv, size(MODLF))) return fFalse; if (!pblck->FReadRgb(_pbmdl->faces, cbrgbrf, size(MODLF) + cbrgbrv)) return fFalse; BrModelAdd(_pbmdl); // REVIEW *****: uncomment and expand the following code to prelight models // BVEC3 bvec3; // if (!_FPrelight(1, &bvec3)) // return fFalse; } else { // pre-prepared model. _pbmdl = BrModelAllocate(szIdentifier, 0, 0); if (pvNil == _pbmdl) return fFalse; CopyPb(&pmodlThis, _pbmdl->identifier, size(PMODL)); _pbmdl->prepared_vertices = (BRV *)BrResAllocate(_pbmdl, LwMul(modlf.cver, size(BRV)), BR_MEMORY_PREPARED_VERTICES); if (pvNil == _pbmdl->prepared_vertices) return fFalse; _pbmdl->prepared_faces = (BRF *)BrResAllocate(_pbmdl, LwMul(modlf.cfac, size(BRF)), BR_MEMORY_PREPARED_FACES); if (pvNil == _pbmdl->prepared_faces) return fFalse; if (!pblck->FReadRgb(_pbmdl->prepared_vertices, cbrgbrv, size(MODLF))) { return fFalse; } if (kboOther == modlf.bo) { for (ibrv = 0, pbrv = _pbmdl->prepared_vertices; ibrv < modlf.cver; ibrv++, pbrv++) { SwapBytesBom(pbrv, kbomBrv); } } if (!pblck->FReadRgb(_pbmdl->prepared_faces, cbrgbrf, size(MODLF) + cbrgbrv)) { return fFalse; } if (kboOther == modlf.bo) { for (ibrf = 0, pbrf = _pbmdl->prepared_faces; ibrf < modlf.cfac; ibrf++, pbrf++) { SwapBytesBom(pbrf, kbomBrf); } } _pbmdl->flags = BR_MODF_PREPREPARED; _pbmdl->nprepared_vertices = (ushort)modlf.cver; _pbmdl->nprepared_faces = (ushort)modlf.cfac; // The following code assumes that there is no material data // in the models. If there is material data, the code will have // to change to read vertex groups and face groups from file. _pbmdl->nvertex_groups = 1; _pbmdl->nface_groups = 1; _pbmdl->vertex_groups = (br_vertex_group *)BrResAllocate(_pbmdl, size(br_vertex_group), BR_MEMORY_GROUPS); if (pvNil == _pbmdl->vertex_groups) return fFalse; _pbmdl->vertex_groups->material = pvNil; _pbmdl->vertex_groups->vertices = _pbmdl->prepared_vertices; _pbmdl->vertex_groups->nvertices = _pbmdl->nprepared_vertices; _pbmdl->face_groups = (br_face_group *)BrResAllocate(_pbmdl, size(br_face_group), BR_MEMORY_GROUPS); if (pvNil == _pbmdl->face_groups) return fFalse; _pbmdl->face_groups->material = pvNil; _pbmdl->face_groups->faces = _pbmdl->prepared_faces; _pbmdl->face_groups->nfaces = _pbmdl->nprepared_faces; _pbmdl->radius = modlf.rRadius; _pbmdl->bounds = modlf.brb; _pbmdl->pivot = modlf.bvec3Pivot; BrModelAdd(_pbmdl); } return fTrue; } /*************************************************************************** Reads a BRender model from a .DAT file ***************************************************************************/ PMODL MODL::PmodlReadFromDat(FNI *pfni) { AssertPo(pfni, ffniFile); STN stn; PMODL pmodl; pmodl = NewObj MODL; if (pvNil == pmodl) goto LFail; pfni->GetStnPath(&stn); pmodl->_pbmdl = BrModelLoad(stn.Psz()); if (pvNil == pmodl->_pbmdl) goto LFail; pmodl->_pbmdl->flags |= BR_MODF_KEEP_ORIGINAL; BrModelPrepare(pmodl->_pbmdl, BR_MPREP_ALL); Assert(CchSz(pmodl->_pbmdl->identifier) >= size(void *), "no room for pmodl ptr"); CopyPb(&pmodl, pmodl->_pbmdl->identifier, size(void *)); AssertPo(pmodl, 0); return pmodl; LFail: ReleasePpo(&pmodl); return pvNil; } /*************************************************************************** Returns a pointer to the MODL that owns this BMDL ***************************************************************************/ PMODL MODL::PmodlFromBmdl(PBMDL pbmdl) { AssertVarMem(pbmdl); PMODL pmodl = (PMODL) * (long *)pbmdl->identifier; AssertPo(pmodl, 0); return pmodl; } /*************************************************************************** Destructor ***************************************************************************/ MODL::~MODL(void) { AssertBaseThis(0); if (pvNil != _pbmdl) { BrModelRemove(_pbmdl); BrModelFree(_pbmdl); } } /*************************************************************************** Writes a MODL to a chunk ***************************************************************************/ bool MODL::FWrite(PCFL pcfl, CTG ctg, CNO cno) { AssertThis(0); AssertPo(pcfl, 0); long cb; long cbrgbrv; long cbrgbrf; MODLF *pmodlf; cbrgbrv = LwMul(_pbmdl->nprepared_vertices, size(br_vertex)); cbrgbrf = LwMul(_pbmdl->nprepared_faces, size(br_face)); cb = size(MODLF) + cbrgbrv + cbrgbrf; if (!FAllocPv((void **)&pmodlf, cb, fmemClear, mprNormal)) goto LFail; pmodlf->bo = kboCur; pmodlf->osk = koskCur; pmodlf->cver = _pbmdl->nprepared_vertices; pmodlf->cfac = _pbmdl->nprepared_faces; pmodlf->rRadius = _pbmdl->radius; pmodlf->brb = _pbmdl->bounds; pmodlf->bvec3Pivot = _pbmdl->pivot; CopyPb(_pbmdl->prepared_vertices, PvAddBv(pmodlf, size(MODLF)), cbrgbrv); CopyPb(_pbmdl->prepared_faces, PvAddBv(pmodlf, size(MODLF) + cbrgbrv), cbrgbrf); if (!pcfl->FPutPv(pmodlf, cb, ctg, cno)) goto LFail; FreePpv((void **)&pmodlf); return fTrue; LFail: Warn("model save failed."); FreePpv((void **)&pmodlf); return fFalse; } /*************************************************************************** Adjust glyph for a TDF. It is centered in X and Z, with Y at the baseline, and we do some voodoo to get "kerning" (really "variable interletter spacing") to work. ***************************************************************************/ void MODL::AdjustTdfCharacter(void) { AssertThis(0); BRS dxrModl = Dxr(); BRS dxrSpacing = _pbmdl->bounds.min.v[0]; BRS dxr = BrsHalf(dxrModl) + dxrSpacing; BRS dzrModl = Dzr(); BRS dzr = BrsHalf(dzrModl); long cbrv = _pbmdl->nprepared_vertices; long ibrv; for (ibrv = 0; ibrv < cbrv; ibrv++) { _pbmdl->prepared_vertices[ibrv].p.v[0] -= dxr; _pbmdl->prepared_vertices[ibrv].p.v[2] -= dzr; } _pbmdl->bounds.min.v[0] -= dxr; _pbmdl->bounds.max.v[0] -= dxr; _pbmdl->pivot.v[0] -= dxr; _pbmdl->bounds.min.v[0] -= dxrSpacing; if (dxrSpacing < BR_SCALAR(-0.01)) dxrSpacing = BR_SCALAR(0.5); _pbmdl->bounds.max.v[0] += dxrSpacing; _pbmdl->bounds.min.v[2] -= dzr; _pbmdl->bounds.max.v[2] -= dzr; _pbmdl->pivot.v[2] -= dzr; } /*************************************************************************** Prelight a model REVIEW *****: make this code more general ***************************************************************************/ bool MODL::_FPrelight(long cblit, BVEC3 *prgbvec3Light) { AssertIn(cblit, 1, 10); AssertPvCb(prgbvec3Light, LwMul(cblit, size(BVEC3))); AssertBaseThis(0); PBACT pbactWorld; PBACT pbactCamera; PBPMP pbpmpRGB; PBPMP pbpmpZ; PBACT pbactLight; BLIT blit; PBMTL pbmtl; long iblit; BCAM bcam = {"bah", BR_CAMERA_PERSPECTIVE, BR_ANGLE_DEG(60.0), // REVIEW ***** BR_SCALAR(1.0), BR_SCALAR(100.0), BR_SCALAR(16.0 / 9.0), 544, 306}; const br_colour kbrcHilite = BR_COLOUR_RGB(255, 255, 255); const byte kbOpaque = 0xff; const br_ufraction kbrufKaHilite = BR_UFRACTION(0.10); const br_ufraction kbrufKdHilite = BR_UFRACTION(0.60); const br_ufraction kbrufKsHilite = BR_UFRACTION(0.00); const BRS krPowerHilite = BR_SCALAR(50); const long kiclrHilite = 108; // palette index for hilite color ClearPb(&blit, size(BLIT)); blit.colour = BR_COLOUR_RGB(0xff, 0xff, 0xff); blit.type = BR_LIGHT_DIRECT; blit.attenuation_c = BR_SCALAR(1.0); pbactWorld = BrActorAllocate(BR_ACTOR_NONE, pvNil); if (pvNil == pbactWorld) goto LFail; pbactCamera = BrActorAllocate(BR_ACTOR_CAMERA, &bcam); if (pvNil == pbactCamera) goto LFail; BrActorAdd(pbactWorld, pbactCamera); for (iblit = 0; iblit < cblit; iblit++) { pbactLight = BrActorAllocate(BR_ACTOR_LIGHT, pvNil); if (pvNil == pbactLight) goto LFail; pbactLight->type_data = &blit; BrActorAdd(pbactWorld, pbactLight); BrLightEnable(pbactLight); } pbpmpRGB = BrPixelmapAllocate(BR_PMT_INDEX_8, 544, 306, 0, 0); pbpmpZ = BrPixelmapAllocate(BR_PMT_DEPTH_16, 544, 306, 0, 0); pbmtl = BrMaterialAllocate("Prelighting material"); if (pvNil == pbmtl) goto LFail; pbmtl->colour = kbrcHilite; pbmtl->ka = kbrufKaHilite; pbmtl->kd = kbrufKdHilite, pbmtl->ks = kbrufKsHilite; pbmtl->power = krPowerHilite; pbmtl->flags = BR_MATF_LIGHT | BR_MATF_GOURAUD; pbmtl->index_base = kiclrHilite; pbmtl->index_range = 8; BrMaterialAdd(pbmtl); BrZbSceneRenderBegin(pbactWorld, pbactCamera, pbpmpRGB, pbpmpZ); BrSceneModelLight(_pbmdl, pbmtl, pbactWorld, pvNil); BrZbSceneRenderEnd(); BrMaterialRemove(pbmtl); Assert(cblit == 1, "code needs to get smarter..."); BrLightDisable(pbactLight); BrActorFree(pbactWorld); return fTrue; LFail: BrActorFree(pbactWorld); return fFalse; } #ifdef DEBUG /*************************************************************************** Assert the validity of the MODL. ***************************************************************************/ void MODL::AssertValid(ulong grf) { MODL_PAR::AssertValid(fobjAllocated); AssertVarMem(_pbmdl); Assert((PMODL) * (long *)_pbmdl->identifier == this, "Bad MODL identifier"); } /*************************************************************************** Mark memory used by the MODL ***************************************************************************/ void MODL::MarkMem(void) { AssertThis(0); MODL_PAR::MarkMem(); } #endif // DEBUG ================================================ FILE: src/engine/movie.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** movie.cpp Author: Sean Selitrennikoff Date: August, 1994 This file contains all functionality for movie manipulation. THIS IS A CODE REVIEWED FILE Basic movie private classes: Movie Scene actions Undo Object (MUNS) BASE ---> UNDB ---> MUNB ---> MUNS Note: The client of the movie engine should always do all actions through MVIE level APIs, it should never use accessor functions to maniplate Scenes, Actors, Text boxes, etc. ***************************************************************************/ #include "soc.h" ASSERTNAME #define krScaleMouseRecord BR_SCALAR(0.20) #define krScaleMouseNonRecord BR_SCALAR(0.02) #define kdwrMousePerSecond BR_SCALAR(100.0) // "mouse drag" speed for arrow keys #define kdtsFrame (kdtsSecond / kfps) // milliseconds per frame #define kdtimFrame (kdtimSecond / kfps) // clock ticks per frame #define kdtsCycleCels (kdtsFrame * 3) // delay when cycling cels #define kdtsVlmFade 3 // number of seconds to fade #define kdtimVlmFade (kdtimSecond / 4) // number of clock ticks necessary to split 1 sec into 4 events #define kzrMouseScalingFactor BR_SCALAR(100.0) const CHID kchidGstSource = 1; // // How many pixels from edge to warp cursor back to center // const long kdpInset = 50; // // Mouse scaling factor when rotating // const long krRotateScaleFactor = BR_SCALAR(0.001); // // Mouse scaling factor when sooner/latering. // const long krSoonerScaleFactor = BR_SCALAR(0.05); // // Number of ticks to pass before scrolling a single pixel // #define kdtsScrolling 5 // // // UNDO object for scene related actions: Ins, New, and Rem // // typedef class MUNS *PMUNS; #define MUNS_PAR MUNB enum MUNST { munstInsScen, munstRemScen, munstSetBkgd }; #define kclsMUNS 'MUNS' class MUNS : public MUNS_PAR { RTCLASS_DEC MARKMEM ASSERT protected: long _iscen; TAG _tag; PSCEN _pscen; MUNST _munst; MUNS(void) { } public: static PMUNS PmunsNew(void); ~MUNS(void); void SetIscen(long iscen) { _iscen = iscen; } void SetPscen(PSCEN pscen) { _pscen = pscen; _pscen->AddRef(); } void SetMunst(MUNST munst) { _munst = munst; } void SetTag(PTAG ptag) { _tag = *ptag; } virtual bool FDo(PDOCB pdocb); virtual bool FUndo(PDOCB pdocb); }; // // // // BEGIN MOVIE // // // RTCLASS(MVIE) RTCLASS(MUNB) RTCLASS(MUNS) BEGIN_CMD_MAP(MVIE, CMH) ON_CID_ME(cidAlarm, &MVIE::FCmdAlarm, pvNil) ON_CID_ME(cidRender, &MVIE::FCmdRender, pvNil) ON_CID_GEN(cidSaveAndClose, pvNil, pvNil) END_CMD_MAP_NIL() // // A file written by this version of movie.cpp receives this cvn. Any // file with this cvn value has exactly the same file format // const short kcvnCur = 2; // // A file written by this version of movie.cpp can be read by any version // of movie.cpp whose kcvnCur is >= to this (this should be <= kcvnCur) // const short kcvnBack = 2; // // A file whose cvn is less than kcvnMin cannot be directly read by // this version of movie.cpp (maybe a converter will read it). // (this should be <= kcvnCur) // const short kcvnMin = 1; // // Movie file prefix // struct MFP { short bo; // byte order short osk; // which system wrote this DVER dver; // chunky file version }; const BOM kbomMfp = 0x55000000; // // Used to keep track of the roll call list of the movie // struct MACTR { long arid; long cactRef; ulong grfbrws; // browser properties TAG tagTmpl; }; typedef MACTR *PMACTR; const BOM kbomMactr = (0xFC000000 | (kbomTag >> 4)); /**************************************************** * * Constructor for movies. This function is private, use PmvieNew() * for public construction. * ****************************************************/ MVIE::MVIE(void) : _clok(khidMvieClock) { _aridLim = 0; _cno = cnoNil; _iscen = ivNil; _wit = witNil; _trans = transNil; _vlmOrg = 0; SetCundbMax(1); } /****************************************************************************** _FSetPfilSave Given an FNI, looks for and remembers if found the FIL associated with it. If the FIL was found, will also check to see if it's read-only. Returns: fFalse if the FIL wasn't found. ************************************************************ PETED ***********/ bool MVIE::_FSetPfilSave(PFNI pfni) { AssertBaseThis(0); AssertPo(pfni, 0); long lAttrib; STN stnFile; /* Look for the file and remember FIL if found */ ReleasePpo(&_pfilSave); _pfilSave = FIL::PfilFromFni(pfni); if (_pfilSave == pvNil) return fFalse; _pfilSave->AddRef(); _fFniSaveValid = fTrue; /* Remember whether FIL is read-only; only relevant if we actually found the FIL, since if we didn't, we'll prompt for a new filename later anyway */ pfni->GetStnPath(&stnFile); #ifdef WIN _fReadOnly = (((lAttrib = GetFileAttributes(stnFile.Psz())) != 0xFFFFFFFF) && (lAttrib & FILE_ATTRIBUTE_READONLY)); #else // MAC RawRtn(); #endif return fTrue; } /**************************************************** * * Reads a movie from a file. * * Parameters: * pmcc - Pointer to the movie client class block to use. * pfni - File to read from. * cno - CNO of the movie chunk, cnoNil if using the * the first one in the file. * * Returns: * pvNil if failure, else a pointer to the movie object. * ****************************************************/ PMVIE MVIE::PmvieNew(bool fHalfMode, PMCC pmcc, FNI *pfni, CNO cno) { AssertNilOrPo(pfni, 0); AssertPo(pmcc, 0); bool fSuccess = fFalse, fBeganLongOp = fFalse; PMVIE pmvie; KID kid; CHID chid; TAGL *ptagl; PCFL pcfl = pvNil; BLCK blck; short bo; short osk; PGST pgstSource; // // Create the movie object // pmvie = NewObj MVIE; if (pmvie == pvNil) { goto LFail; } // // Create the GL for holding undo events // pmvie->_pglpundb = GL::PglNew(size(PUNDB), 1); if (pmvie->_pglpundb == pvNil) { goto LFail; } // // Create GL of actors in the movie // if (pvNil == pfni) { pmvie->_pgstmactr = GST::PgstNew(size(MACTR)); if (pmvie->_pgstmactr == pvNil) { goto LFail; } } // // Create the brender world // pmvie->_pbwld = BWLD::PbwldNew(pmcc->Dxp(), pmcc->Dyp(), fFalse, fHalfMode); if (pvNil == pmvie->_pbwld) { goto LFail; } // // Create the movie sound queue // pmvie->_pmsq = MSQ::PmsqNew(); if (pvNil == pmvie->_pmsq) { goto LFail; } // // Save other variables // pmvie->_pmcc = pmcc; pmcc->AddRef(); // // Do we initialize from a file? // if (pfni == pvNil) { return (pmvie); } /* Don't bother putting up the wait cursor unless we're reading a movie */ vpappb->BeginLongOp(); fBeganLongOp = fTrue; // // Get file to read from // pcfl = CFL::PcflOpen(pfni, fcflNil); if (pcfl == pvNil) { goto LFail; } if (!pmvie->FVerifyVersion(pcfl, &cno)) goto LFail; pmvie->_cno = cno; // // Keep a reference to the user's file // if (!pmvie->_FSetPfilSave(pfni)) { Bug("Hey, we just opened this file!"); goto LFail; } // // Note (by *****): CRF *must* have 0 cache size, because of // serious cache-coherency problems otherwise. TMPL data is not // read-only, and chunk numbers change over time. // pmvie->_pcrfAutoSave = CRF::PcrfNew(pcfl, 0); // cache size must be 0 if (pvNil == pmvie->_pcrfAutoSave) { goto LFail; } // // Merge this document's source title list // if (pcfl->FGetKidChidCtg(kctgMvie, cno, kchidGstSource, kctgGst, &kid) && pcfl->FFind(kid.cki.ctg, kid.cki.cno, &blck)) { pgstSource = GST::PgstRead(&blck, &bo, &osk); if (pvNil != pgstSource) { // Ignore result...we can survive failure vptagm->FMergeGstSource(pgstSource, bo, osk); ReleasePpo(&pgstSource); } } // // Get the movie roll-call // Assert(pcfl == pmvie->_pcrfAutoSave->Pcfl(), "pcfl isn't right"); if (!FReadRollCall(pmvie->_pcrfAutoSave, cno, &pmvie->_pgstmactr, &pmvie->_aridLim)) { pmvie->_pgstmactr = pvNil; goto LFail; } // // Get all the content tags // ptagl = pmvie->_PtaglFetch(); if (ptagl == pvNil) { goto LFail; } // // Now bring all the tags into cache // if (!ptagl->FCacheTags()) { ReleasePpo(&ptagl); goto LFail; } ReleasePpo(&ptagl); // // Set the movie title // pmvie->_SetTitle(pfni); // // Count the number of scenes in the movie // for (chid = 0; pcfl->FGetKidChidCtg(kctgMvie, cno, chid, kctgScen, &kid); chid++, pmvie->_cscen++) { } fSuccess = fTrue; LFail: ReleasePpo(&pcfl); if (!fSuccess) ReleasePpo(&pmvie); if (fBeganLongOp) vpappb->EndLongOp(); return (pmvie); } /****************************************************************************** FReadRollCall Reads the roll call off file for a given movie. Will swapbytes the extra data in the GST if necessary, and will report back on the highest arid found. Arguments: PCFL pcfl -- the file the movie is on PCRF pcrf -- the autosave CRF for the movie's ACTR tags CNO cno -- the cno of the movie PGST *ppgst -- the PGST to fill in long *paridLim -- the max arid to update Returns: fTrue if there were no failures, fFalse otherwise ************************************************************ PETED ***********/ bool MVIE::FReadRollCall(PCRF pcrf, CNO cno, PGST *ppgst, long *paridLim) { AssertPo(pcrf, 0); AssertVarMem(ppgst); Assert(*ppgst == pvNil, "Overwriting existing GST"); AssertNilOrVarMem(paridLim); short bo; long imactr, imactrMac; PCFL pcfl = pcrf->Pcfl(); KID kid; BLCK blck; MACTR mactr; if (!pcfl->FGetKidChidCtg(kctgMvie, cno, 0, kctgGst, &kid) || !pcfl->FFind(kid.cki.ctg, kid.cki.cno, &blck)) { PushErc(ercSocBadFile); goto LFail; } *ppgst = GST::PgstRead(&blck, &bo); if (*ppgst == pvNil) goto LFail; imactrMac = (*ppgst)->IvMac(); for (imactr = 0; imactr < imactrMac; imactr++) { (*ppgst)->GetExtra(imactr, &mactr); if (bo == kboOther) SwapBytesBom(&mactr, kbomMactr); if (paridLim != pvNil && mactr.arid >= *paridLim) *paridLim = mactr.arid + 1; // Open the tags, since they might be TDTs AssertDo(vptagm->FOpenTag(&mactr.tagTmpl, pcrf), "Should never fail when not copying the tag"); (*ppgst)->PutExtra(imactr, &mactr); } return fTrue; LFail: TrashVar(ppgst); return fFalse; } /****************************************************************************** Flush Ensures that the data has been written to disk. ************************************************************ PETED ***********/ void MVIE::Flush(void) { if (_fFniSaveValid) { AssertPo(_pfilSave, 0); _pfilSave->Flush(); } } /**************************************************** * * Nuke unused sounds from the file * Msnd chunks exist as children of the movie chunk. * They are also children of any scene which uses * them. * Note: The ref count does not reflect how many * scene or actor events reference the sound. * * Parms: * bool fPurgeAll -- if fFalse, only purge invalid sounds * ****************************************************/ void MVIE::_DoSndGarbageCollection(bool fPurgeAll) { AssertThis(0); // Before releasing, get rid of all msnd chunks with // cactref == 1 (the refcnt from being a child of the // movie chunk) long ikid; if (pvNil == _pcrfAutoSave) return; PCFL pcfl = _pcrfAutoSave->Pcfl(); if (pvNil == pcfl) return; /* Go backwards, since we might delete some */ ikid = pcfl->Ckid(kctgMvie, _cno); while (ikid--) { KID kid; KID kidT; if (!pcfl->FGetKid(kctgMvie, _cno, ikid, &kid)) { Bug("CFL returned bogus Ckid()"); break; } if (kid.cki.ctg != kctgMsnd) continue; if (pcfl->CckiRef(kctgMsnd, kid.cki.cno) > 1) continue; /* Always purge MSNDs with no actual sound attached */ if (fPurgeAll || !pcfl->FGetKidChid(kctgMsnd, kid.cki.cno, kchidSnd, &kidT)) { pcfl->DeleteChild(kctgMvie, _cno, kctgMsnd, kid.cki.cno, kid.chid); } } return; } /**************************************************** * * Destructor for movies. * ****************************************************/ MVIE::~MVIE(void) { AssertBaseThis(0); long imactr; MACTR mactr; ReleasePpo(&_pcrfAutoSave); ReleasePpo(&_pfilSave); if (FPlaying()) { AssertPo(Pmcc(), 0); Pmcc()->EnableAccel(); Pmcc()->PlayStopped(); vpsndm->StopAll(); // if we were fading, then restore sound volume if (_vlmOrg) { vpsndm->SetVlm(_vlmOrg); _vlmOrg = 0; } } if (Pmcc() != pvNil) { Pmcc()->UpdateRollCall(); } if (Pscen() != pvNil) { // // Release open scene. // SCEN::Close(&_pscenOpen); } // // Release the roll call // if (_pgstmactr != pvNil) { for (imactr = 0; imactr < _pgstmactr->IvMac(); imactr++) { _pgstmactr->GetExtra(imactr, &mactr); vptagm->CloseTag(&mactr.tagTmpl); } ReleasePpo(&_pgstmactr); } // // Release the call back class // ReleasePpo(&_pmcc); // // Release the brender world // ReleasePpo(&_pbwld); // // Release the sound queue // ReleasePpo(&_pmsq); ReleasePpo(&_pglclrThumbPalette); return; } #ifdef DEBUG /**************************************************** * Mark memory used by the MVIE * * Parameters: * None. * * Returns: * None. * ****************************************************/ void MVIE::MarkMem(void) { AssertThis(0); MVIE_PAR::MarkMem(); MarkMemObj(_pcrfAutoSave); MarkMemObj(_pfilSave); MarkMemObj(_pgstmactr); MarkMemObj(Pscen()); MarkMemObj(Pbwld()); MarkMemObj(_pmcc); MarkMemObj(_pmsq); MarkMemObj(_pglclrThumbPalette); } /*************************************************************************** * * Assert the validity of the MVIE. * * Parameters: * grf - Bit field of options * * Returns: * None. * **************************************************************************/ void MVIE::AssertValid(ulong grf) { MVIE_PAR::AssertValid(fobjAllocated); AssertNilOrPo(_pcrfAutoSave, 0); AssertPo(_pgstmactr, 0); AssertNilOrPo(Pbwld(), 0); AssertPo(&_clok, 0); AssertPo(_pmcc, 0); } #endif // DEBUG /*************************************************************************** * * Returns a list of all tags being used by this MVIE * * Parameters: * None. * * Returns: * A TAGL (list of tags that the movie uses) * **************************************************************************/ PTAGL MVIE::_PtaglFetch(void) { AssertThis(0); Assert(_pcrfAutoSave != pvNil, "need pcrfAutosave"); PTAGL ptagl; KID kid; CHID chid; ptagl = TAGL::PtaglNew(); if (pvNil == ptagl) return pvNil; // // Add each scene's tags // for (chid = 0; _pcrfAutoSave->Pcfl()->FGetKidChidCtg(kctgMvie, _cno, chid, kctgScen, &kid); chid++) { if (!SCEN::FAddTagsToTagl(_pcrfAutoSave->Pcfl(), kid.cki.cno, ptagl)) { ReleasePpo(&ptagl); return pvNil; } } return ptagl; } /**************************************************** * * Fetches the iarid'th actor in the movie. * * Parameters: * iarid - The arid index to fetch. * parid - Pointer to storage for the found arid. * pstn - Pointer to the actors name. * pcactRef - Number of scenes the actor is in. * *ptagTmpl - Template tag * Returns: * fTrue if successful, else fFalse if out of range. * ****************************************************/ bool MVIE::FGetArid(long iarid, long *parid, PSTN pstn, long *pcactRef, PTAG ptagTmpl) { AssertThis(0); AssertPvCb(parid, size(long)); AssertVarMem(pcactRef); MACTR mactr; if (iarid < 0 || iarid >= _pgstmactr->IvMac()) { return fFalse; } _pgstmactr->GetStn(iarid, pstn); _pgstmactr->GetExtra(iarid, &mactr); *parid = mactr.arid; *pcactRef = mactr.cactRef; if (pvNil != ptagTmpl) *ptagTmpl = mactr.tagTmpl; return fTrue; } /**************************************************** * * User chose arid in the roll call. If actor * exists in this scene and is onstage, select it. * Else if actor is offstage, bring it onstage. * If actor is not in this scene, create and add it. * * Parameters: * arid - The arid to search for, or create. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool MVIE::FChooseArid(long arid) { AssertThis(0); AssertPo(Pscen(), 0); PACTR pactr, pactrDup; MACTR mactr; long imactr; PMVU pmvu; pmvu = (PMVU)PddgGet(0); if (pmvu == pvNil) { return (fFalse); } AssertPo(pmvu, 0); pactr = Pscen()->PactrFromArid(arid); if (pvNil != pactr) { if (!pactr->FIsInView()) { if (!pactr->FDup(&pactrDup, fTrue)) { return (fFalse); } AssertPo(pactrDup, 0); if (!pactr->FAddOnStageCore()) { ReleasePpo(&pactrDup); return fFalse; } Pscen()->SelectActr(pactr); AssertDo(FAddToRollCall(pactr, pvNil), "Should never fail"); pmvu->StartPlaceActor(); pmvu->SetActrUndo(pactrDup); } Pscen()->SelectActr(pactr); InvalViews(); return (fTrue); } else { // // Search roll call for actor, and create // a new actor for it. // for (imactr = 0; imactr < _pgstmactr->IvMac(); imactr++) { _pgstmactr->GetExtra(imactr, &mactr); if (mactr.arid == arid) { pactr = ACTR::PactrNew(&(mactr.tagTmpl)); if (pactr == pvNil) { return (fFalse); } AssertPo(pactr, 0); pactr->SetArid(arid); if (!Pscen()->FAddActr(pactr)) { ReleasePpo(&pactr); return (fFalse); } pmvu->StartPlaceActor(); ReleasePpo(&pactr); return (fTrue); } } } return (fFalse); } /**************************************************** * * Return the arid of the selected actor. * * Parameters: * None. * * Returns: * Arid of the selected actor, else aridNil. * ****************************************************/ long MVIE::AridSelected(void) { AssertThis(0); if ((pvNil != Pscen()) && (pvNil != Pscen()->PactrSelected())) { return Pscen()->PactrSelected()->Arid(); } else { return aridNil; } } /**************************************************** * * Fetches the name of the actor with arid. * * Parameters: * arid - The arid to fetch. * pstn - Pointer to storage for the found name. * * Returns: * fTrue if successful, else fFalse if failure. * ****************************************************/ bool MVIE::FGetName(long arid, PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); MACTR mactr; long imactr; for (imactr = 0; imactr < _pgstmactr->IvMac(); imactr++) { _pgstmactr->GetExtra(imactr, &mactr); if (mactr.arid == arid) { _pgstmactr->GetStn(imactr, pstn); return (fTrue); } } return (fFalse); } /**************************************************** * * Sets the name of the actor with arid. * * Parameters: * arid - The arid to set. * pstn - Pointer to the name. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool MVIE::FNameActr(long arid, PSTN pstn) { AssertThis(0); AssertIn(arid, 0, 500); AssertPo(pstn, 0); MACTR mactr; long imactr; for (imactr = 0; imactr < _pgstmactr->IvMac(); imactr++) { _pgstmactr->GetExtra(imactr, &mactr); if (mactr.arid == arid) { if (_pgstmactr->FPutStn(imactr, pstn)) { _pmcc->UpdateRollCall(); return (fTrue); } return (fFalse); } } return (fFalse); } /**************************************************** * * Identifies whether the mactr is in prop browser * * Parameters: * imactr - index in _pgstmactr * * Returns: * bool * ****************************************************/ bool MVIE::FIsPropBrwsIarid(long iarid) { AssertThis(0); AssertIn(iarid, 0, _pgstmactr->IvMac()); MACTR mactr; _pgstmactr->GetExtra(iarid, &mactr); return FPure(mactr.grfbrws & fbrwsProp); } /**************************************************** * * Identifies whether the mactr is in 3dtext object * * Parameters: * imactr - index in _pgstmactr * * Returns: * bool * ****************************************************/ bool MVIE::FIsIaridTdt(long iarid) { AssertThis(0); AssertIn(iarid, 0, _pgstmactr->IvMac()); MACTR mactr; _pgstmactr->GetExtra(iarid, &mactr); return FPure(mactr.grfbrws & fbrwsTdt); } /**************************************************** * * Sets the tag of the actor with arid. * * Parameters: * arid - The arid to set. * ptag - Pointer to the TMPL tag. * * Returns: * none * ****************************************************/ void MVIE::ChangeActrTag(long arid, PTAG ptag) { AssertThis(0); AssertIn(arid, 0, 500); AssertVarMem(ptag); MACTR mactr; long imactr; for (imactr = 0; imactr < _pgstmactr->IvMac(); imactr++) { _pgstmactr->GetExtra(imactr, &mactr); if (mactr.arid == arid) { mactr.tagTmpl = *ptag; _pgstmactr->PutExtra(imactr, &mactr); return; } } Bug("no such actor"); } /**************************************************** * * This adds an actor to the roll call, if not already there, or * adds a reference count if it already exists. * * Parameters: * Pointer to the actor to add. * * Returns: * fTrue if successful, else fFalse indicating out of resources. * ****************************************************/ bool MVIE::FAddToRollCall(ACTR *pactr, PSTN pstn) { AssertThis(0); AssertPo(pactr, 0); AssertNilOrPo(pstn, 0); // can be pvNil if the actor is already in the movie. MACTR mactr; long imactr; if (pactr->Arid() != aridNil) { // // Search for an actor with the same arid // for (imactr = 0; imactr < _pgstmactr->IvMac(); imactr++) { _pgstmactr->GetExtra(imactr, &mactr); if (mactr.arid == pactr->Arid()) { TAG tagTmpl; mactr.cactRef++; // TDTs sometimes need to update tagTmpl pactr->GetTagTmpl(&tagTmpl); if (fcmpEq != TAGM::FcmpCompareTags(&mactr.tagTmpl, &tagTmpl)) { TAGM::CloseTag(&mactr.tagTmpl); mactr.tagTmpl = tagTmpl; // ACTR::GetTagTmpl doesn't AddRef the pcrf, so do it here: TAGM::DupTag(&tagTmpl); } _pgstmactr->PutExtra(imactr, &mactr); Pmcc()->UpdateRollCall(); return (fTrue); } } } else { pactr->SetArid(_aridLim++); } AssertPo(pstn, 0); // // This is a new actor, add it to the roll call // mactr.arid = pactr->Arid(); mactr.grfbrws = fbrwsNil; if (pactr->FIsPropBrws()) { mactr.grfbrws |= fbrwsProp; if (pactr->FIsTdt()) { mactr.grfbrws |= fbrwsTdt; } } mactr.cactRef = 1; pactr->GetTagTmpl(&mactr.tagTmpl); // Open the tag, since it might be a TDT AssertDo(vptagm->FOpenTag(&mactr.tagTmpl, _pcrfAutoSave), "Should never fail when not copying the tag"); if (_pgstmactr->FAddStn(pstn, &mactr)) { Pmcc()->UpdateRollCall(); return (fTrue); } return (fFalse); } /**************************************************** * * This removes an actor from the roll call, if the reference count * drops to zero, else it decrements the reference count. * * Parameters: * Pointer to the actor to remove. * * Returns: * None. * ****************************************************/ void MVIE::RemFromRollCall(ACTR *pactr, bool fDelIfOnlyRef) { AssertThis(0); AssertPo(pactr, 0); MACTR mactr; long imactr; // // Search for the actor in the roll call // for (imactr = 0; imactr < _pgstmactr->IvMac(); imactr++) { _pgstmactr->GetExtra(imactr, &mactr); if (mactr.arid == pactr->Arid()) { mactr.cactRef--; Assert(mactr.cactRef >= 0, "Too many removes"); if (fDelIfOnlyRef && mactr.cactRef == 0) { vptagm->CloseTag(&mactr.tagTmpl); _pgstmactr->Delete(imactr); } else { _pgstmactr->PutExtra(imactr, &mactr); } if (mactr.cactRef == 0) { Pmcc()->UpdateRollCall(); } return; } } Bug("Tried to remove an invalid actor"); } /**************************************************** * * Changes the scene in the movie currently being referenced. * * Parameters: * iscen - Scene number to go to. * * Returns: * * fTrue, if successful, else fFalse, indicating the * same scene is still open (if possible). * ****************************************************/ bool MVIE::FSwitchScen(long iscen) { AssertThis(0); Assert(iscen == ivNil || FIn(iscen, 0, Cscen()), "iscen out of range"); Assert((iscen == ivNil) || (_pcrfAutoSave != pvNil), "Invalid save file"); PSCEN pscen; KID kid; long iscenOld; bool fRet = fTrue; if (iscen == _iscen) { return (fTrue); } // // Close the current scene. // iscenOld = _iscen; if (!_FCloseCurrentScene()) { return (fFalse); } // // Stop all looping non-midi sounds // vpsndm->StopAll(sqnNil, sclLoopWav); // // If memory is low, release unreferenced content BACOs to reduce thrashing. // Note that APP::MemStat() is unavailable from the movie engine // #ifdef WIN MEMORYSTATUS ms; ms.dwLength = size(MEMORYSTATUS); GlobalMemoryStatus(&ms); if (ms.dwMemoryLoad == 100) { // No physical RAM to spare, so free some stuff vptagm->ClearCache(sidNil, ftagmMemory); } #endif // WIN if (iscen == ivNil) { Assert(_pscenOpen == pvNil, "_FCloseCurrentScene didn't clear this"); Assert(_iscen == ivNil, "_FCloseCurrentScene didn't clear this"); return (fTrue); } LRetry: // // Get info for next scene and read it in. // AssertDo(_pcrfAutoSave->Pcfl()->FGetKidChidCtg(kctgMvie, _cno, iscen, kctgScen, &kid), "Should never fail"); pscen = SCEN::PscenRead(this, _pcrfAutoSave, kid.cki.cno); if ((pscen == pvNil) || !pscen->FPlayStartEvents()) { _pscenOpen = pvNil; _iscen = ivNil; if (pscen != pvNil) { SCEN::Close(&pscen); } if (iscenOld != ivNil) { iscen = iscenOld; iscenOld = ivNil; fRet = fFalse; goto LRetry; } _pmcc->SceneChange(); return (fFalse); } _pscenOpen = pscen; _pmcc->SceneChange(); _iscen = iscen; if (!pscen->FGotoFrm(pscen->NfrmFirst())) { _pscenOpen = pvNil; _iscen = ivNil; SCEN::Close(&pscen); if (iscenOld != ivNil) { iscen = iscenOld; iscenOld = ivNil; fRet = fFalse; goto LRetry; } return (fFalse); } pscen->UpdateSndFrame(); InvalViewsAndScb(); return (fRet); } /**************************************************** * * Creates a new scene and inserts it as scene number iscen. * * Parameters: * iscen - Scene number to insert the new scene as. * * Returns: * fTrue, if successful, else fFalse. * ****************************************************/ bool MVIE::FNewScenInsCore(long iscen) { AssertThis(0); AssertIn(iscen, 0, Cscen() + 1); PSCEN pscen; // // Create the new scene. // pscen = SCEN::PscenNew(this); if (pscen == pvNil) { return (fFalse); } if (!FInsScenCore(iscen, pscen)) { SCEN::Close(&pscen); return (fFalse); } SCEN::Close(&pscen); return (fTrue); } /**************************************************** * * Moves up/down all the chids by one. * * Parameters: * chid - chid number to start at. * fDown- fTrue if move down, else move up. * * Returns: * None. * ****************************************************/ void MVIE::_MoveChids(CHID chid, bool fDown) { AssertThis(0); PCFL pcfl = _pcrfAutoSave->Pcfl(); KID kid; CHID chidTmp; if (fDown) { // // Move down chids of all old scenes (increase by one) // for (chidTmp = _cscen; chidTmp > chid;) { chidTmp--; AssertDo(pcfl->FGetKidChidCtg(kctgMvie, _cno, chidTmp, kctgScen, &kid), "Should never fail"); pcfl->ChangeChid(kctgMvie, _cno, kctgScen, kid.cki.cno, chidTmp, chidTmp + 1); } } else { // // Move up chids of all old scenes (decrease by one) // for (chidTmp = chid; chidTmp < (CHID)_cscen; chidTmp++) { AssertDo(pcfl->FGetKidChidCtg(kctgMvie, _cno, chidTmp + 1, kctgScen, &kid), "Should never fail"); pcfl->ChangeChid(kctgMvie, _cno, kctgScen, kid.cki.cno, chidTmp + 1, chidTmp); } } } /****************************************************************************** _FIsChild Enumerates the children of the MVIE chunk and reports whether the given (ctg, cno) chunk is an actual child of the MVIE chunk. Arguments: PCFL pcfl -- the file on which to check CTG ctg -- these are self-explanatory CNO cno Returns: fTrue if the (ctg, cno) chunk is an immediate child of the MVIE ************************************************************ PETED ***********/ bool MVIE::_FIsChild(PCFL pcfl, CTG ctg, CNO cno) { bool fIsChild = fFalse; long ckid, ikid; KID kid; ckid = pcfl->Ckid(kctgMvie, _cno); for (ikid = 0; ikid < ckid; ikid++) { if (!pcfl->FGetKid(kctgMvie, _cno, ikid, &kid)) { Bug("CFL returned bogus ckid"); break; } if (kid.cki.ctg == ctg && kid.cki.cno == cno) { fIsChild = fTrue; break; } } return fIsChild; } /**************************************************** * * Adopt the scene user sounds as children of the movie. * Msnds are children of the movie unless they are * unused and deleted when the movie closes. * * Parameters * pcfl * cnoScen * * Returns: * success or failure * ****************************************************/ bool MVIE::_FAdoptMsndInMvie(PCFL pcfl, CNO cnoScen) { AssertThis(0); AssertPo(pcfl, 0); CHID chidMvie; long ckid, ikid; KID kid; ckid = pcfl->Ckid(kctgScen, cnoScen); for (ikid = 0; ikid < ckid; ikid++) { if (!pcfl->FGetKid(kctgScen, cnoScen, ikid, &kid)) { Bug("CFL returned bogus ckid"); break; } if (kid.cki.ctg == kctgMsnd) { if (!_FIsChild(pcfl, kctgMsnd, kid.cki.cno)) { // Adopt as a child of the movie chidMvie = _ChidMvieNewSnd(); if (!pcfl->FAdoptChild(kctgMvie, _cno, kctgMsnd, kid.cki.cno, chidMvie)) { goto LFail; } } } } return fTrue; LFail: return fFalse; } /**************************************************** * * Resolves a sound tag & chid to be a current tag * * Note: Msnds are children of the current scene. * Due to sound import, the cno can change. * * Parameters * ptag (with *ptag.cno possibly out of date) * chid (valid only for user snd) * cnoScen (if cnoNil, use current scene's cno * * Returns: * Updated *ptag * ****************************************************/ bool MVIE::FResolveSndTag(PTAG ptag, CHID chid, CNO cnoScen, PCRF pcrf) { AssertThis(0); AssertVarMem(ptag); AssertNilOrVarMem(pcrf); KID kidScen; KID kid; TAG tagNew = *ptag; PCFL pcfl; if (pvNil == pcrf) pcrf = _pcrfAutoSave; pcfl = pcrf->Pcfl(); if (ptag->sid != ksidUseCrf) return fTrue; if (cnoNil == cnoScen) { if (!pcfl->FGetKidChidCtg(kctgMvie, _cno, _iscen, kctgScen, &kidScen)) return fFalse; cnoScen = kidScen.cki.cno; } if (!pcfl->FGetKidChidCtg(kctgScen, cnoScen, chid, kctgMsnd, &kid)) return fFalse; if (ptag->cno != kid.cki.cno) { // As the pcrf has not changed, it is not essential // to close & open the respective tags. tagNew.cno = kid.cki.cno; if (!TAGM::FOpenTag(&tagNew, pcrf)) return fFalse; TAGM::CloseTag(ptag); *ptag = tagNew; } return fTrue; } /**************************************************** * * Finds the chid (child of the current scene) for a * given sound tag. Adopt it if not found. * Meaningful for user sounds only * * Parameters * cno * * Returns: * Updated *pchid * ****************************************************/ bool MVIE::FChidFromUserSndCno(CNO cno, CHID *pchid) { AssertThis(0); AssertVarMem(pchid); KID kidScen; KID kid; long ckid; long ikid; PCFL pcfl = _pcrfAutoSave->Pcfl(); if (!pcfl->FGetKidChidCtg(kctgMvie, _cno, _iscen, kctgScen, &kidScen)) return fFalse; ckid = pcfl->Ckid(kctgScen, kidScen.cki.cno); for (ikid = 0; ikid < ckid; ikid++) { if (!pcfl->FGetKid(kctgScen, kidScen.cki.cno, ikid, &kid)) return fFalse; if (kid.cki.ctg != kctgMsnd) continue; if (kid.cki.cno != cno) continue; *pchid = kid.chid; return fTrue; } *pchid = _ChidScenNewSnd(); if (!pcfl->FAdoptChild(kctgScen, kidScen.cki.cno, kctgMsnd, cno, *pchid)) return fFalse; return fTrue; } /**************************************************** * * Copies a sound file to the movie. (Importing snd) * Sounds are written as MSND children of the current * scene chunk * * Parameters: * pfilSrc, sty * * Returns: * *pcno = cno of chunk written * fFalse if there was a failure, else fTrue. * ****************************************************/ bool MVIE::FCopySndFileToMvie(PFIL pfilSrc, long sty, CNO *pcno, PSTN pstn) { AssertThis(0); AssertVarMem(pfilSrc); AssertVarMem(pcno); AssertNilOrPo(pstn, 0); Assert(_pcrfAutoSave != pvNil, "Bad working file."); PCFL pcfl; FNI fniSrc; CHID chid; KID kidScen; pcfl = _pcrfAutoSave->Pcfl(); // // Ensure we will be writing to the temp file // if (!_FUseTempFile()) { return fFalse; } pfilSrc->GetFni(&fniSrc); if (fniSrc.Ftg() == kftgMidi) { if (!MSND::FCopyMidi(pfilSrc, pcfl, pcno, pstn)) goto LFail; } else { if (!MSND::FCopyWave(pfilSrc, pcfl, sty, pcno, pstn)) goto LFail; } AssertDo(pcfl->FGetKidChidCtg(kctgMvie, _cno, _iscen, kctgScen, &kidScen), "Scene chunk doesn't exist!"); chid = _ChidMvieNewSnd(); if (!pcfl->FAdoptChild(kctgMvie, _cno, kctgMsnd, *pcno, chid)) { pcfl->Delete(kctgMsnd, *pcno); return fFalse; } if (!pcfl->FSave(kctgSoc)) return fFalse; _fGCSndsOnClose = fTrue; return fTrue; LFail: if (!vpers->FIn(ercSocBadSoundFile)) PushErc(ercSocCantCopyMsnd); return fFalse; } /**************************************************** * * Copy Msnd chunk from specified movie *pcfl to * current movie * Parameters: * pcfl : Source file * * Returns: * fFalse if there was a failure, else fTrue. * *pcnoDest * ****************************************************/ bool MVIE::FCopyMsndFromPcfl(PCFL pcflSrc, CNO cnoSrc, CNO *pcnoDest) { AssertBaseThis(0); AssertPo(pcflSrc, 0); AssertVarMem(pcnoDest); PCFL pcflDest; KID kidScen; CHID chid; FNI fni; if (!FEnsureAutosave()) return fFalse; pcflDest = _pcrfAutoSave->Pcfl(); pcflSrc->GetFni(&fni); // Copy the msnd chunk from one movie to another // Wave or Midi if (!pcflSrc->FCopy(kctgMsnd, cnoSrc, pcflDest, pcnoDest)) return fFalse; AssertDo(pcflDest->FGetKidChidCtg(kctgMvie, _cno, _iscen, kctgScen, &kidScen), "Scene chunk doesn't exist!"); chid = _ChidMvieNewSnd(); // Find a unique chid for the new sound if (!pcflDest->FAdoptChild(kctgMvie, _cno, kctgMsnd, *pcnoDest, chid)) { pcflDest->Delete(kctgMsnd, *pcnoDest); return fFalse; } if (!pcflDest->FSave(kctgSoc)) return fFalse; return fTrue; } /**************************************************** * * Choose Scene Chid for New Sound * Note: _pcrfAutoSave is expected to be current * Parameters: * none * * Returns: * unique chid for new msnd chunk child of scene * ****************************************************/ CHID MVIE::_ChidScenNewSnd(void) { AssertBaseThis(0); PCFL pcfl = _pcrfAutoSave->Pcfl(); long ckid; long chid; KID kidScen; KID kid; if (!pcfl->FGetKidChidCtg(kctgMvie, _cno, _iscen, kctgScen, &kidScen)) return fFalse; ckid = pcfl->Ckid(kctgScen, kidScen.cki.cno); for (chid = 0; chid < ckid; chid++) { if (!pcfl->FGetKidChidCtg(kctgScen, kidScen.cki.cno, chid, kctgMsnd, &kid)) return (CHID)chid; } return (CHID)chid; } /**************************************************** * * Choose Mvie Chid for New Sound * Note: _pcrfAutoSave is expected to be current * Parameters: * none * * Returns: * unique chid for new msnd chunk child of scene * ****************************************************/ CHID MVIE::_ChidMvieNewSnd(void) { AssertBaseThis(0); PCFL pcfl = _pcrfAutoSave->Pcfl(); long ckid; long chid; KID kid; ckid = pcfl->Ckid(kctgMvie, _cno); for (chid = 0; chid < ckid; chid++) { if (!pcfl->FGetKidChidCtg(kctgMvie, _cno, chid, kctgMsnd, &kid)) return (CHID)chid; } return (CHID)chid; } /**************************************************** * * Verify the version number of a file * * Parameters: * pfni * *pcno == cnoNil if using the first chunk in the file * * Returns: * fFalse if there was a failure, else fTrue. * *pcno updated * ****************************************************/ bool MVIE::FVerifyVersion(PCFL pcfl, CNO *pcno) { AssertBaseThis(0); // MVIE hasn't been loaded yet AssertPo(pcfl, 0); KID kid; CNO cnoMvie; MFP mfp; BLCK blck; // Get the cno of the first kid of the movie if (pvNil == pcno || cnoNil == *pcno) { if (!pcfl->FGetCkiCtg(kctgMvie, 0, &(kid.cki))) { PushErc(ercSocBadFile); return fFalse; } cnoMvie = kid.cki.cno; if (pvNil != pcno) *pcno = cnoMvie; } // Get version number of the file if (!pcfl->FFind(kctgMvie, cnoMvie, &blck) || !blck.FUnpackData() || (blck.Cb() != size(MFP)) || !blck.FReadRgb(&mfp, size(MFP), 0)) { PushErc(ercSocBadFile); return fFalse; } if (mfp.bo == kboOther) { SwapBytesBom(&mfp, kbomMfp); } // Check the version numbers if (!mfp.dver.FReadable(kcvnCur, kcvnMin)) { PushErc(ercSocBadVersion); return fFalse; } return fTrue; } /**************************************************** * * Removes a scene from the movie. * * Parameters: * iscen - Scene number to insert the new scene as. * * Returns: * fFalse if there was a failure, else fTrue. * ****************************************************/ bool MVIE::FRemScenCore(long iscen) { AssertThis(0); AssertIn(iscen, 0, Cscen()); Assert(_pcrfAutoSave != pvNil, "Bad working file."); KID kid; PCFL pcfl; PSCEN pscen; long iscenOld; pcfl = _pcrfAutoSave->Pcfl(); // // Ensure we are using the temp file // if (!_FUseTempFile()) { return (fFalse); } // // Close this scene if it is open and different. // iscenOld = _iscen; if (_iscen != iscen) { // // Get the scen to remove. // if (!FSwitchScen(iscen)) { FSwitchScen(iscenOld); return (fFalse); } } // // Keep the scene in memory for a second. // pscen = Pscen(); pscen->AddRef(); // // Close the current scene // SCEN::Close(&_pscenOpen); _iscen = ivNil; // // Remove its actors from the roll call // pscen->RemActrsFromRollCall(); ReleasePpo(&pscen); // // Remove the scene chunk. // AssertDo(pcfl->FGetKidChidCtg(kctgMvie, _cno, iscen, kctgScen, &kid), "Should never fail"); pcfl->DeleteChild(kctgMvie, _cno, kctgScen, kid.cki.cno, iscen); // // Move up chids of all old scenes. // _cscen--; _MoveChids((CHID)iscen, fFalse); // // Save changes, if this fails, we don't care. It only // matters when the user tries to truly save. // pcfl->FSave(kctgSoc); // // Switch to a different scene // if (Cscen() == 0) { return (fTrue); } if (iscen < Cscen()) { FSwitchScen(iscen); } else { FSwitchScen(iscen - 1); } SetDirty(); if (Pscen() == pvNil) { PushErc(ercSocSceneSwitch); return (fTrue); } return (fTrue); } /**************************************************** * * Removes a scene from the movie and creates an * undo object for the action. If it was the * currently open scene, then the scene is not open. * The next scene is opened. * * Parameters: * iscen - Scene number to remove. * * Returns: * fFalse if there was a failure, else fTrue. * ****************************************************/ bool MVIE::FRemScen(long iscen) { AssertThis(0); AssertIn(iscen, 0, Cscen()); KID kid; PMUNS pmuns; PSCEN pscen; if (_iscen == iscen) { pscen = Pscen(); pscen->AddRef(); } else { AssertDo(_pcrfAutoSave->Pcfl()->FGetKidChidCtg(kctgMvie, _cno, iscen, kctgScen, &kid), "Should never fail"); pscen = SCEN::PscenRead(this, _pcrfAutoSave, kid.cki.cno); if ((pscen == pvNil) || !pscen->FPlayStartEvents()) { SCEN::Close(&pscen); return (fFalse); } pscen->HideActors(); pscen->HideTboxes(); } pmuns = MUNS::PmunsNew(); if (pmuns == pvNil) { ReleasePpo(&pscen); return (fTrue); } pmuns->SetIscen(iscen); pmuns->SetPscen(pscen); pmuns->SetMunst(munstRemScen); if (!FAddUndo(pmuns)) { ReleasePpo(&pmuns); ReleasePpo(&pscen); return (fFalse); } ReleasePpo(&pmuns); ReleasePpo(&pscen); if (!FRemScenCore(iscen)) { ClearUndo(); return (fFalse); } return (fTrue); } /**************************************************** * * Adds a new material to the user's document. * * Parameters: * pmtrl - Pointer to the material to add. * ptag - Pointer to the tag for the file. * * Returns: * fTrue if success, fFalse if couldn't add the material * ****************************************************/ bool MVIE::FInsertMtrl(PMTRL pmtrl, PTAG ptag) { AssertThis(0); AssertPo(pmtrl, 0); AssertVarMem(ptag); PCRF pcrf; PCFL pcfl; CNO cno; if (!FEnsureAutosave(&pcrf)) { TrashVar(ptag); return (fFalse); } pcfl = pcrf->Pcfl(); if (!pmtrl->FWrite(pcfl, kctgMtrl, &cno)) { TrashVar(ptag); return fFalse; } ptag->sid = ksidUseCrf; ptag->ctg = kctgMtrl; ptag->cno = cno; if (!TAGM::FOpenTag(ptag, _pcrfAutoSave)) { return fFalse; } return fTrue; } /**************************************************** * * Ensure an autosave file exists to use * * Parameters: * Return the pcrf * * Returns: * fTrue if success, fFalse if couldn't add the material * ****************************************************/ bool MVIE::FEnsureAutosave(PCRF *ppcrf) { AssertThis(0); if (!_FMakeCrfValid()) { return (fFalse); } if (pvNil != ppcrf) *ppcrf = _pcrfAutoSave; // // Switch to the autosave file // if (!_FUseTempFile()) { return (fFalse); } return fTrue; } /**************************************************** * * Adds a new 3-D Text object to the user's document. * * Parameters: * pstn - TDT text * tdts - the TDT shape * ptagTdf - a tag to the TDT's font * * Returns: * fTrue if success, fFalse if couldn't add the TDT * ****************************************************/ bool MVIE::FInsTdt(PSTN pstn, long tdts, PTAG ptagTdf) { AssertThis(0); AssertPo(pstn, 0); Assert(pstn->Cch() > 0, "can't insert 0-length TDT"); AssertIn(tdts, 0, tdtsLim); AssertVarMem(ptagTdf); PCFL pcfl; CNO cno; PTDT ptdt; TAG tagTdt; ptdt = TDT::PtdtNew(pstn, tdts, ptagTdf); if (pvNil == ptdt) return fFalse; // // Make sure we have a file to switch to // if (!_FMakeCrfValid()) { return (fFalse); } pcfl = _pcrfAutoSave->Pcfl(); // // Switch to the autosave file // if (!_FUseTempFile()) { return (fFalse); } if (!ptdt->FWrite(pcfl, kctgTmpl, &cno)) { return fFalse; } ReleasePpo(&ptdt); tagTdt.sid = ksidUseCrf; tagTdt.ctg = kctgTmpl; tagTdt.cno = cno; if (!TAGM::FOpenTag(&tagTdt, _pcrfAutoSave)) { return fFalse; } if (!FInsActr(&tagTdt)) return fFalse; TAGM::CloseTag(&tagTdt); return fTrue; } /**************************************************** * * Edits the TDT attached to pactr. * * Parameters: * pactr - Pointer to actor to change * pstn - New TDT text * tdts - New TDT shape * ptagTdf - New TDT font * * Returns: * fTrue if success, fFalse if couldn't change the TDT * ****************************************************/ bool MVIE::FChangeActrTdt(PACTR pactr, PSTN pstn, long tdts, PTAG ptagTdf) { AssertThis(0); AssertPo(pactr, 0); Assert(pactr->Ptmpl()->FIsTdt(), "actor must be a TDT"); AssertPo(pstn, 0); AssertIn(tdts, 0, tdtsLim); AssertVarMem(ptagTdf); long ich; bool fNonSpaceFound; PTDT ptdtNew; TAG tagTdtNew; PCFL pcfl; CNO cno; PACTR pactrDup; Assert(pactr == Pscen()->PactrSelected(), 0); fNonSpaceFound = fFalse; for (ich = 0; ich < pstn->Cch(); ich++) { if (pstn->Psz()[ich] != ChLit(' ')) { fNonSpaceFound = fTrue; break; } } if (!fNonSpaceFound) // delete the actor { return FRemActr(); } ptdtNew = TDT::PtdtNew(pstn, tdts, ptagTdf); if (pvNil == ptdtNew) return fFalse; // // Make sure we have a file to switch to // if (!_FMakeCrfValid()) { return (fFalse); } pcfl = _pcrfAutoSave->Pcfl(); // // Switch to the autosave file // if (!_FUseTempFile()) { return (fFalse); } if (!ptdtNew->FWrite(pcfl, kctgTmpl, &cno)) { return fFalse; } ReleasePpo(&ptdtNew); tagTdtNew.sid = ksidUseCrf; tagTdtNew.ctg = kctgTmpl; tagTdtNew.cno = cno; if (!TAGM::FOpenTag(&tagTdtNew, _pcrfAutoSave)) { return fFalse; } if (!pactr->FDup(&pactrDup)) { TAGM::CloseTag(&tagTdtNew); return fFalse; } if (!pactr->FChangeTagTmpl(&tagTdtNew)) { TAGM::CloseTag(&tagTdtNew); ReleasePpo(&pactrDup); return fFalse; } // this sequence is a little strange to make unwinding easier: // we add the actor to the roll call with aridNil to get a new // entry, then remove the old entry (using pactrDup). pactr->SetArid(aridNil); if (!FAddToRollCall(pactr, pstn)) { pactr->Restore(pactrDup); ReleasePpo(&pactrDup); TAGM::CloseTag(&tagTdtNew); return fFalse; } RemFromRollCall(pactrDup); ReleasePpo(&pactrDup); TAGM::CloseTag(&tagTdtNew); SetDirty(); return fTrue; } /**************************************************** * * Closes and releases the current scene, if any * * Parameters: * None. * * Returns: * fTrue if success, fFalse if couldn't autosave * ****************************************************/ bool MVIE::_FCloseCurrentScene(void) { AssertThis(0); if (Pscen() != pvNil) { if (!FAutoSave(pvNil, fFalse)) // could not save...keep scene open { return fFalse; } SCEN::Close(&_pscenOpen); _iscen = ivNil; } return fTrue; } /**************************************************** * * Makes sure that the current file in use is a temp file. * * Parameters: * None. * * Returns: * fTrue if success, fFalse if couldn't switch * ****************************************************/ bool MVIE::_FUseTempFile(void) { AssertThis(0); PCFL pcfl; KID kid; FNI fni; pcfl = _pcrfAutoSave->Pcfl(); // // Make sure we are using the temporary file // if (!pcfl->FTemp()) { if (!fni.FGetTemp()) { return (fFalse); } if (!pcfl->FSave(kctgSoc, &fni)) { return (fFalse); } // Set the Temp flag AssertDo(pcfl->FSetGrfcfl(fcflTemp, fcflTemp), 0); // // Update _cno // AssertDo(pcfl->FGetCkiCtg(kctgMvie, 0, &(kid.cki)), "Should never fail"); _cno = kid.cki.cno; } return fTrue; } /**************************************************** * * Makes sure that there is a file to work with. * * Parameters: * None. * * Returns: * fTrue if success, fFalse if couldn't switch * ****************************************************/ bool MVIE::_FMakeCrfValid(void) { AssertThis(0); PCFL pcfl; FNI fni; if (_pcrfAutoSave != pvNil) { return (fTrue); } // // Get a temp file // if (!fni.FGetTemp()) { return (fFalse); } pcfl = CFL::PcflCreate(&fni, fcflTemp); if (pcfl == pvNil) { return (fFalse); } Assert(pcfl->FTemp(), "Bad CFL"); // // Note (by *****): CRF *must* have 0 cache size, because of // serious cache-coherency problems otherwise. TMPL data is not // read-only, and chunk numbers change over time. // _pcrfAutoSave = CRF::PcrfNew(pcfl, 0); // cache size must be 0 if (pvNil == _pcrfAutoSave) { ReleasePpo(&pcfl); return (fFalse); } // // Create movie chunk // SetDirty(); if (!FAutoSave()) { ReleasePpo(&pcfl); return (fFalse); } ReleasePpo(&pcfl); return fTrue; } /**************************************************** * * Saves a movie to the temp file assigned to the movie. * * Parameters: * pfni - File to save to, pvNil if to use a temp file. * pCleanRollCall - Should actors that are not used be removed? * * Returns: * fFalse if there was a failure, else fTrue. * ****************************************************/ bool MVIE::FAutoSave(PFNI pfni, bool fCleanRollCall) { AssertThis(0); AssertNilOrPo(_pcrfAutoSave, 0); AssertNilOrPo(pfni, ffniFile); #ifdef BUG1848 bool fRetry = fTrue; #endif // BUG1848 BLCK blck; CNO cno; CNO cnoScen; CNO cnoSource; MFP mfp; KID kidScen, kidGstRollCall, kidGstSource; PCFL pcfl; PGST pgstSource = pvNil; if (_pcrfAutoSave == pvNil) { return (fFalse); } pcfl = _pcrfAutoSave->Pcfl(); // // If no changes, then quit quick. // if (!_fAutosaveDirty && (pfni == pvNil) && !_fDocClosing) { return (fTrue); } vpappb->BeginLongOp(); if ((pfni == pvNil) && !pcfl->FTemp() && !_FUseTempFile()) { vpappb->EndLongOp(); return (fFalse); } #ifdef BUG1848 LRetry: #endif // BUG1848 // // Ensure movie chunk exists. // if (_cno == cnoNil) { if (!pcfl->FAdd(size(MFP), kctgMvie, &_cno, &blck)) { goto LFail0; } mfp.bo = kboCur; mfp.osk = koskCur; mfp.dver.Set(kcvnCur, kcvnBack); if (!blck.FWrite(&mfp)) { goto LFail0; } } // // Save open scene. // if (Pscen() != pvNil) { // // Save scene in new chunk // if (!Pscen()->FWrite(_pcrfAutoSave, &cnoScen)) { goto LFail0; } // // Delete old chunk with this scene // AssertDo(pcfl->FGetKidChidCtg(kctgMvie, _cno, _iscen, kctgScen, &kidScen), "Should never fail"); // // Update chid for movie // if (!pcfl->FAdoptChild(kctgMvie, _cno, kctgScen, cnoScen, _iscen)) { pcfl->Delete(kctgScen, cnoScen); goto LFail0; } } // // Save the movie roll-call // if (fCleanRollCall) { MACTR mactr; long imactr; for (imactr = 0; imactr < _pgstmactr->IvMac();) { _pgstmactr->GetExtra(imactr, &mactr); if (mactr.cactRef == 0) { _pgstmactr->Delete(imactr); vptagm->CloseTag(&mactr.tagTmpl); } else { imactr++; } } _pmcc->UpdateRollCall(); } // // Get old roll call if it exists. // if (!pcfl->FGetKidChidCtg(kctgMvie, _cno, 0, kctgGst, &kidGstRollCall)) { kidGstRollCall.cki.cno = cnoNil; } if (!pcfl->FAdd(_pgstmactr->CbOnFile(), kctgGst, &cno, &blck)) { goto LFail1; } if (!_pgstmactr->FWrite(&blck) || !pcfl->FAdoptChild(kctgMvie, _cno, kctgGst, cno, 0)) { pcfl->Delete(kctgGst, cno); goto LFail1; } // // Save the known sources list // // // Get old sources list if it exists. // if (!pcfl->FGetKidChidCtg(kctgMvie, _cno, kchidGstSource, kctgGst, &kidGstSource)) { kidGstSource.cki.cno = cnoNil; } pgstSource = vptagm->PgstSource(); if (pgstSource == pvNil) goto LFail2; if (!pcfl->FAdd(pgstSource->CbOnFile(), kctgGst, &cnoSource, &blck)) { goto LFail2; } if (!pgstSource->FWrite(&blck) || !pcfl->FAdoptChild(kctgMvie, _cno, kctgGst, cnoSource, kchidGstSource)) { pcfl->Delete(kctgGst, cnoSource); goto LFail2; } if (!pcfl->FSetName(kctgMvie, _cno, &_stnTitle)) { goto LFail3; } // // Delete old scene if there is a scene. // if (Pscen() != pvNil) { pcfl->DeleteChild(kctgMvie, _cno, kctgScen, kidScen.cki.cno, _iscen); } // // Delete old roll call list if it exists. // if (kidGstRollCall.cki.cno != cnoNil) { pcfl->DeleteChild(kctgMvie, _cno, kctgGst, kidGstRollCall.cki.cno, 0); } // // Delete old sources list if it exists. // if (kidGstSource.cki.cno != cnoNil) { pcfl->DeleteChild(kctgMvie, _cno, kctgGst, kidGstSource.cki.cno, kchidGstSource); } // // If we fail, don't unwind, as everything is consistent. // Just let the client know we failed. // if (pfni != pvNil) { bool fSuccess; PFIL pfil; // // If we have this file open, then we need to release it // so we can do the save. We will restore our open below. // pfil = FIL::PfilFromFni(pfni); if (pfil == _pfilSave) { ReleasePpo(&_pfilSave); _fFniSaveValid = fFalse; } else { pfil = pvNil; } // // All garbage collection -- ignore any errors, the file will just be // a widdle bigger than it has to be. // _FDoGarbageCollection(pcfl); fSuccess = pcfl->FSave(kctgSoc, pfni); if (pfil != pvNil) { _pfilSave = FIL::PfilFromFni(pfni); if (_pfilSave != pvNil) { _pfilSave->AddRef(); _fFniSaveValid = fTrue; } } if (!fSuccess) { goto LFail0; } } else if (!pcfl->FSave(kctgSoc)) { goto LFail0; } _fAutosaveDirty = fFalse; _fDirty = fTrue; // // Set the movie title // _SetTitle(pfni); vpappb->EndLongOp(); return (fTrue); LFail3: pcfl->DeleteChild(kctgMvie, _cno, kctgGst, cnoSource, kchidGstSource); LFail2: pcfl->DeleteChild(kctgMvie, _cno, kctgGst, cno, 0); LFail1: if (Pscen() != pvNil) { pcfl->DeleteChild(kctgMvie, _cno, kctgScen, cnoScen, _iscen); } LFail0: if (pcfl->ElError() != elNil) { pcfl->ResetEl(); #ifdef BUG1848 if (fRetry && pfni != pvNil) { FNI fniTemp; /* Effectively, move the temp file to the destination path */ /* REVIEW seanse(peted): note that the autosave file could whined up on the floppy if we fail again (which SeanSe says is "Bad") */ fniTemp = *pfni; if (fniTemp.FGetUnique(pfni->Ftg()) && pcfl->FSave(kctgSoc, &fniTemp)) { pcfl->SetTemp(fTrue); vpers->Clear(); fRetry = fFalse; goto LRetry; } } #endif // BUG1848 PushErc(ercSocSaveFailure); } vpappb->EndLongOp(); return (fFalse); } /**************************************************** * * Do all garbage collection * * Parameters: * pfni - File to remove chunks from * * Returns: * fTrue on success, fFalse on failure * ****************************************************/ bool MVIE::_FDoGarbageCollection(PCFL pcfl) { AssertThis(0); AssertPo(pcfl, 0); bool fSuccess, fHaveValid; // Material and Template garbage collection fSuccess = _FDoMtrlTmplGC(pcfl); // If closing, remove unused sounds if (_fDocClosing && FUnusedSndsUser(&fHaveValid)) _DoSndGarbageCollection(!fHaveValid || Pmcc()->FQueryPurgeSounds()); return fSuccess; } /**************************************************** * * Removes all MTRL and TMPL chunks that are not * referenced by any actors in this movie. * * Parameters: * pfni - File to remove chunks from * * Returns: * fTrue on success, fFalse on failure * ****************************************************/ bool MVIE::_FDoMtrlTmplGC(PCFL pcfl) { AssertThis(0); AssertPo(pcfl, 0); PTAGL ptagl = pvNil; long itag; TAG tag; long icki1 = 0; long icki2 = 0; CKI cki; PGL pglckiDoomed = pvNil; ptagl = _PtaglFetch(); // get all tags in user's document if (ptagl == pvNil) goto LEnd; // no work to do pglckiDoomed = GL::PglNew(size(CKI), 0); if (pvNil == pglckiDoomed) goto LFail; while (pcfl->FGetCkiCtg(kctgMtrl, icki1++, &cki) || pcfl->FGetCkiCtg(kctgTmpl, icki2++, &cki)) { // We're only interested in ksidUseCrf tags for (itag = 0; itag < ptagl->Ctag(); itag++) { ptagl->GetTag(itag, &tag); if (tag.sid != ksidUseCrf) { break; // stop..we're out of the ksidUseCrf tags } if (tag.ctg == cki.ctg && tag.cno == cki.cno) { break; // stop..this tag is used in the movie } } // Remember, tags are sorted by sid. So if we got past the // ksidUseCrf tags in the movie, this chunk must not be used // in the movie. So put it on the blacklist. if (tag.sid != ksidUseCrf || itag == ptagl->Ctag()) { // this chunk is not referenced by a ksidUseCrf tag, so kill it if (!pglckiDoomed->FAdd(&cki)) goto LFail; } } // Get rid of the blacklisted chunks for (icki1 = 0; icki1 < pglckiDoomed->IvMac(); icki1++) { pglckiDoomed->Get(icki1, &cki); pcfl->Delete(cki.ctg, cki.cno); if (pcfl == _pcrfAutoSave->Pcfl()) // remove chunk from CRF cache { PFNRPO pfnrpo; if (kctgMtrl == cki.ctg) { pfnrpo = MTRL::FReadMtrl; } else if (kctgTmpl == cki.ctg) { pfnrpo = TMPL::FReadTmpl; } else { Bug("unexpected ctg"); } // ignore failure of FSetCrep, because return value of fFalse // just means that the chunk is not stored in the CRF's cache _pcrfAutoSave->FSetCrep(crepToss, cki.ctg, cki.cno, pfnrpo); } } LEnd: ReleasePpo(&ptagl); ReleasePpo(&pglckiDoomed); return fTrue; LFail: ReleasePpo(&ptagl); ReleasePpo(&pglckiDoomed); return fFalse; } /**************************************************** * * Gets the file name to save the document to. * * Parameters: * pfni - A pointer to a place to store the name * * Returns: * fFalse if the fni is valid, else fTrue *and* * pfni filled in. * ****************************************************/ bool MVIE::FGetFni(FNI *pfni) { AssertThis(0); AssertPo(pfni, 0); if (_pfilSave != pvNil) { _pfilSave->GetFni(pfni); } return (_fFniSaveValid); } /*************************************************************************** * * Saves a movie. * * Parameters: * cid - type of save command issued for save * * Returns: * fFalse if there was a failure, else fTrue. * ****************************************************/ bool MVIE::FSave(long cid) { AssertThis(0); // If we are processing a Save command and the current movie is read-only, // then treat this as a Save-As command and invoke the Save portfolio. if (cid == cidSave && FReadOnly()) cid = cidSaveAs; // Now take the default action. return MVIE_PAR::FSave(cid); } /**************************************************** * * Saves a movie to the given fni. * * Parameters: * pfni - File to write to. * fSetFni - Should the file name be remembered. * * Returns: * fFalse if there was a failure, else fTrue. * ****************************************************/ bool MVIE::FSaveToFni(FNI *pfni, bool fSetFni) { AssertThis(0); AssertNilOrPo(pfni, ffniFile); CKI cki; PCFL pcfl; if (_pcrfAutoSave == pvNil) { return (pvNil); } pcfl = _pcrfAutoSave->Pcfl(); // // Update the file // if (!FAutoSave(pfni, fTrue)) { return (fFalse); } ClearUndo(); // Set the AddToExtra flag and clear the Temp flag AssertDo(pcfl->FSetGrfcfl(fcflAddToExtra, fcflAddToExtra | fcflTemp), 0); if (fSetFni) { _FSetPfilSave(pfni); // Ignore failure } // // Update _cno // AssertDo(pcfl->FGetCkiCtg(kctgMvie, 0, &cki), "Should never fail"); _cno = cki.cno; _fDirty = fFalse; return (fTrue); } /*************************************************************************** * * Called by docb.cpp to get an fni for a selected movie file using * the save portfolio. * * Parameters: * pfni - fni for selected file * * Returns: * TRUE - User selected a file * FALSE - User canceled, (or other error). * ***************************************************************************/ bool MVIE::FGetFniSave(FNI *pfni) { AssertThis(0); AssertVarMem(pfni); return (_pmcc->GetFniSave(pfni, idsPortfMovieFilterLabel, idsPortfMovieFilterExt, idsPortfSaveMovieTitle, ksz3mm, &_stnTitle)); } /**************************************************** * * Creates a new view on a movie. * * Parameters: * pgcb - The creation block describing the gob placement * * Returns: * A pointer to the view, otw pvNil on failure * ****************************************************/ PDDG MVIE::PddgNew(PGCB pgcb) { AssertThis(0); AssertVarMem(pgcb); return (MVU::PmvuNew(this, pgcb, _pmcc->Dxp(), _pmcc->Dyp())); } /**************************************************** * * Is not used. Not supported. Stubbed out here for * debugging. * * Parameters: * None * * Returns: * pvNil * ****************************************************/ PDMD MVIE::PdmdNew(void) { Bug("Movie does not support DMDs, use multiple DDGs."); return (pvNil); } /**************************************************** * * Adds a single item to the undo list * * Parameters: * pmund - A pointer to a movie undo item. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool MVIE::FAddUndo(PMUNB pmunb) { AssertThis(0); pmunb->SetPmvie(this); pmunb->SetIscen(Iscen()); AssertPo(pmunb, 0); if (Iscen() != ivNil) { pmunb->SetNfrm(Pscen()->Nfrm()); } if (!DOCB::FAddUndo(pmunb)) { Pmcc()->SetUndo(undoDisabled); return (fFalse); } Pmcc()->SetUndo(undoUndo); return (fTrue); } /**************************************************** * * Clears out the undo buffer * * Parameters: * None. * * Returns: * None. * ****************************************************/ void MVIE::ClearUndo(void) { AssertThis(0); MVIE_PAR::ClearUndo(); Pmcc()->SetUndo(undoDisabled); } /*************************************************************************** * * This routine changes the current camera view * * Parameters: * icam - The new camera to use. * * Returns: * fTrue if successful, else fFalse. * **************************************************************************/ bool MVIE::FChangeCam(long icam) { AssertThis(0); AssertIn(icam, 0, kccamMax); AssertPo(Pscen(), 0); if (!Pscen()->FChangeCam(icam)) { return (fFalse); } SetDirty(); InvalViews(); return (fTrue); } /*************************************************************************** * * This command inserts a new text box into the open scene. * * Parameters: * prc - The placement within the movie's view of the text box. * fStory - Is this supposed to be a story text box? * * Returns: * fTrue if successful, else fFalse. * **************************************************************************/ bool MVIE::FInsTbox(RC *prc, bool fStory) { AssertThis(0); AssertPvCb(prc, size(RC)); AssertPo(Pscen(), 0); PTBOX ptbox; ptbox = TBOX::PtboxNew(Pscen(), prc, fStory); if (ptbox == pvNil) { return (fFalse); } ptbox->SetDypFontDef(Pmcc()->DypTboxDef()); AssertPo(ptbox, 0); if (!Pscen()->FAddTbox(ptbox)) { ReleasePpo(&ptbox); } Pscen()->SelectTbox(ptbox); ptbox->AttachToMouse(); ReleasePpo(&ptbox); return (fTrue); } /*************************************************************************** * * This command removes the currently selected text box. * * Parameters: * None. * * Returns: * fTrue if successful, else fFalse. * **************************************************************************/ bool MVIE::FNukeTbox(void) { AssertThis(0); AssertPo(Pscen(), 0); PTBOX ptbox; ptbox = Pscen()->PtboxSelected(); if (ptbox == pvNil) { PushErc(ercSocNoTboxSelected); return (fFalse); } return (Pscen()->FRemTbox(ptbox)); } /*************************************************************************** * * This command hides the currently selected text box at the current frame. * * Parameters: * None. * * Returns: * fTrue if successful, else fFalse. * **************************************************************************/ bool MVIE::FHideTbox(void) { AssertThis(0); AssertPo(Pscen(), 0); PTBOX ptbox; ptbox = Pscen()->PtboxSelected(); if (ptbox == pvNil) { PushErc(ercSocNoTboxSelected); return (fFalse); } return (ptbox->FHide()); } /*************************************************************************** * * This command selects the itbox'th text box in the current frame. * * Parameters: * itbox - Index value of the text box to select. * * Returns: * None. * **************************************************************************/ void MVIE::SelectTbox(long itbox) { AssertThis(0); AssertPo(Pscen(), 0); PTBOX ptbox; long cVis = 0; while (fTrue) { ptbox = Pscen()->PtboxFromItbox(itbox); if (ptbox == pvNil) { return; } if (ptbox->FIsVisible() && (cVis == itbox)) { return; } if (ptbox->FIsVisible()) { cVis++; } } Pscen()->SelectTbox(ptbox); } /*************************************************************************** * * This sets the color to apply to a text box. * * Parameters: * acr - The destination color. * * Returns: * fTrue if successful, else fFalse. * **************************************************************************/ void MVIE::SetPaintAcr(ACR acr) { AssertThis(0); PMVU pmvu; pmvu = (PMVU)PddgGet(0); AssertPo(pmvu, 0); pmvu->SetPaintAcr(acr); } /****************************************************************************** SetDypFontTextCur Sets the current textbox font size Arguments: long dypFont -- the new textbox font size ************************************************************ PETED ***********/ void MVIE::SetDypFontTextCur(long dypFont) { AssertThis(0); PmvuFirst()->SetDypFontTextCur(dypFont); } /****************************************************************************** SetStyleTextCur Sets the current textbox font style Arguments: long grfont -- the new textbox font style ************************************************************ PETED ***********/ void MVIE::SetStyleTextCur(ulong grfont) { AssertThis(0); PmvuFirst()->SetStyleTextCur(grfont); } /****************************************************************************** SetOnnTextCur Sets the current textbox font face Arguments: long onn -- the new textbox font face ************************************************************ PETED ***********/ void MVIE::SetOnnTextCur(long onn) { AssertThis(0); PmvuFirst()->SetOnnTextCur(onn); } /****************************************************************************** PmvuCur Returns the active MVU for this movie ************************************************************ PETED ***********/ PMVU MVIE::PmvuCur(void) { AssertThis(0); PMVU pmvu = (PMVU)PddgActive(); AssertPo(pmvu, 0); Assert(pmvu->FIs(kclsMVU), "Current DDG isn't an MVU"); return pmvu; } /****************************************************************************** PmvuFirst Returns the first MVU for this movie ************************************************************ PETED ***********/ PMVU MVIE::PmvuFirst(void) { AssertThis(0); PMVU pmvu = (PMVU)PddgGet(0); AssertPo(pmvu, 0); Assert(pmvu->FIs(kclsMVU), "First DDG isn't an MVU"); return pmvu; } /*************************************************************************** * * This command inserts a new actor. * * Parameters: * ptag - The tag of the actor to create. * * Returns: * fTrue if successful, else fFalse. * **************************************************************************/ bool MVIE::FInsActr(PTAG ptag) { AssertThis(0); AssertPvCb(ptag, size(TAG)); AssertPo(Pscen(), 0); PACTR pactr; vpappb->BeginLongOp(); // // Create the actor. // if (!vptagm->FCacheTagToHD(ptag)) { vpappb->EndLongOp(); return (fFalse); } vpappb->EndLongOp(); pactr = ACTR::PactrNew(ptag); if (pactr == pvNil) { return (fFalse); } AssertPo(pactr, 0); if (!Pscen()->FAddActr(pactr)) { ReleasePpo(&pactr); return (fFalse); } ReleasePpo(&pactr); SetDirty(); InvalViewsAndScb(); return (fTrue); } /*************************************************************************** * * Brings an actor on to the stage. * * Parameters: * arid - Arid of the actor to bring on. aridNil implies the * currently selected actor. * * Returns: * fTrue if successful, else fFalse. * **************************************************************************/ bool MVIE::FAddOnstage(long arid) { AssertThis(0); AssertPo(Pscen(), 0); ACTR *pactr; // // Get the actor // if (arid == aridNil) { pactr = Pscen()->PactrSelected(); } else { pactr = Pscen()->PactrFromArid(arid); Pscen()->SelectActr(pactr); } if (pactr == pvNil) { PushErc(ercSocNoActrSelected); return (fFalse); } AssertPo(pactr, 0); if (!pactr->FAddOnStage()) { return (fFalse); } SetDirty(); InvalViews(); return (fTrue); } /*************************************************************************** * * Removes the selected actor from the current scene * * Parameters: * None. * * Returns: * fTrue if successful, else fFalse. * **************************************************************************/ bool MVIE::FRemActr() { AssertThis(0); AssertPo(Pscen(), 0); ACTR *pactr; // // Get the current actor // pactr = Pscen()->PactrSelected(); AssertPo(pactr, 0); if (!Pscen()->FRemActr(pactr->Arid())) { return (fFalse); } SetDirty(); InvalViewsAndScb(); Pmcc()->ActorNuked(); return (fTrue); } /*************************************************************************** * * Rotates selected actor by degrees around an axis. * * Parameters: * axis - Brender axis to rotate around. * xa - Degrees to rotate by in X. * ya - Degrees to rotate by in Y. * za - Degrees to rotate by in Z. * * Returns: * fTrue if successful, else fFalse. * **************************************************************************/ bool MVIE::FRotateActr(BRA xa, BRA ya, BRA za, bool fFromHereFwd) { AssertThis(0); AssertPo(Pscen(), 0); ACTR *pactr; // // Get the current actor // pactr = Pscen()->PactrSelected(); AssertPo(pactr, 0); if (!pactr->FRotate(xa, ya, za, fFromHereFwd)) { return (fFalse); } SetDirty(); InvalViews(); return (fTrue); } /*************************************************************************** * * Squashes/Stretches the selected actor by a scalar. * * Parameters: * brs - The scalar for squashing. * * Returns: * fTrue if successful, else fFalse. * **************************************************************************/ bool MVIE::FSquashStretchActr(BRS brs) { AssertThis(0); AssertPo(Pscen(), 0); ACTR *pactr; // // Get the current actor // pactr = Pscen()->PactrSelected(); AssertPo(pactr, 0); if (brs == rZero) { return (fTrue); } BRS brsy = BrsDiv(rOne, brs); if (!pactr->FPull(brs, brsy, brs)) { return (fFalse); } SetDirty(); InvalViews(); return (fTrue); } /*************************************************************************** * * Drags the actor in time * * Parameters: * nfrm - The destination frame number. * * Returns: * fTrue if successful, else fFalse. * **************************************************************************/ bool MVIE::FSoonerLaterActr(long nfrm) { AssertThis(0); AssertPo(Pscen(), 0); ACTR *pactr; PAUND paund; long dnfrm = nfrm - Pscen()->Nfrm(); // // Get the current actor // pactr = Pscen()->PactrSelected(); AssertPo(pactr, 0); if (!pactr->FSoonerLater(dnfrm)) { return (fFalse); } if (CundbUndo() > 0) { _pglpundb->Get(_ipundbLimDone - 1, &paund); if (paund->FIs(kclsAUND) && paund->FSoonerLater()) { AssertPo(paund, 0); paund->SetNfrmLast(nfrm); } } SetDirty(); InvalViews(); return (fTrue); } /*************************************************************************** * * Scales the selected actor by a scalar. * * Parameters: * brs - The scalar for scaling. * * Returns: * fTrue if successful, else fFalse. * **************************************************************************/ bool MVIE::FScaleActr(BRS brs) { AssertThis(0); AssertPo(Pscen(), 0); ACTR *pactr; // // Get the current actor // pactr = Pscen()->PactrSelected(); AssertPo(pactr, 0); if (!pactr->FScale(brs)) { return (fFalse); } SetDirty(); InvalViewsAndScb(); return (fTrue); } /**************************************************** * * Adds a sound to the background * * Parameters: * ptag - tag to the MSND to insert * fLoop - play snd over and over? * fQueue - replace existing sounds, or queue afterwards? * vlm - volume to play sound * sty - sound type * * Returns: * fFalse if there was a failure, else fTrue. * ****************************************************/ bool MVIE::FAddBkgdSnd(PTAG ptag, tribool fLoop, tribool fQueue, long vlm, long sty) { AssertThis(0); Assert(Pscen(), 0); if (vlm == vlmNil || sty == styNil) { PMSND pmsnd; pmsnd = (PMSND)vptagm->PbacoFetch(ptag, MSND::FReadMsnd); if (pmsnd == pvNil) return fFalse; if (vlm == vlmNil) vlm = pmsnd->Vlm(); if (sty == styNil) sty = pmsnd->Sty(); ReleasePpo(&pmsnd); } return Pscen()->FAddSnd(ptag, fLoop, fQueue, vlm, sty); } /**************************************************** * * Adds a sound to an actor * * Parameters: * pactr - actor to attach sound to * ptag - tag to the MSND to insert * fLoop - play snd over and over? * fQueue - replace existing sounds, or queue afterwards? * vlm - volume to use (vlmNil -> use pmsnd volume) * sty - type to use (styNil -> use pmsnd sty) * * Returns: * fFalse if there was a failure, else fTrue. * ****************************************************/ bool MVIE::FAddActrSnd(PTAG ptag, tribool fLoop, tribool fQueue, tribool fActnCel, long vlm, long sty) { AssertThis(0); ACTR *pactr; // // Get the current actor // pactr = Pscen()->PactrSelected(); AssertPo(pactr, 0); return pactr->FSetSnd(ptag, fLoop, fQueue, fActnCel, vlm, sty); } /**************************************************** * * Takes a scene and inserts it as scene number iscen, * and switches to the scene. * * Parameters: * iscen - Scene number to insert the new scene as. * pscen - Pointer to the scene to insert. * * Returns: * fFalse if there was a failure, else fTrue. * ****************************************************/ bool MVIE::FInsScenCore(long iscen, SCEN *pscen) { AssertThis(0); AssertIn(iscen, 0, Cscen() + 1); AssertPo(pscen, 0); Assert(pscen->Pmvie() == this, "Cannot insert a scene from another movie"); CNO cnoScen; PCFL pcfl; // // Make sure we have a file to switch to // if (!_FMakeCrfValid()) { goto LFail0; } pcfl = _pcrfAutoSave->Pcfl(); // // Ensure we are using the temp file // if (!_FUseTempFile()) { goto LFail0; } // // Save old scene. // if (!_FCloseCurrentScene()) { goto LFail0; } // // Write it. // if (!pscen->FWrite(_pcrfAutoSave, &cnoScen)) { goto LFail0; } // // Hide all bodies, textboxes, etc, created when the write updated the thumbnail. // pscen->AddRef(); SCEN::Close(&pscen); _MoveChids((CHID)iscen, fTrue); _cscen++; // // Insert new scene as chid. // if (!pcfl->FAdoptChild(kctgMvie, _cno, kctgScen, cnoScen, iscen)) { goto LFail2; } // // Save changes, if this fails, we don't care. It only // matters when the user tries to truly save. // pcfl->FSave(kctgSoc); if (!FSwitchScen(iscen)) { goto LFail3; } // // Fix up roll call, don't care about failure -- roll-call will just be messed up. // Pscen()->FAddActrsToRollCall(); SetDirty(); _pmcc->UpdateRollCall(); if (FSoundsEnabled()) { _pmsq->PlayMsq(); } else { _pmsq->FlushMsq(); } return (fTrue); LFail3: _cscen--; pcfl->DeleteChild(kctgMvie, _cno, kctgScen, cnoScen, iscen); _MoveChids((CHID)iscen, fFalse); pcfl->FSave(kctgSoc); if (_cscen > 0) { if (iscen < _cscen) { FSwitchScen(iscen); } else { FSwitchScen(_cscen - 1); } } return (fFalse); LFail2: _MoveChids((CHID)iscen, fFalse); pcfl->Delete(kctgScen, cnoScen); LFail0: return (fFalse); } /*************************************************************************** * * Adds a new scene after the current scene. * * Parameters: * ptag - The tag of the scene to add. * * Returns: * fTrue if successful, else fFalse. * **************************************************************************/ bool MVIE::FAddScen(PTAG ptag) { AssertThis(0); AssertPvCb(ptag, size(TAG)); long iscen; TAG tagOld; PMUNS pmuns; vpappb->BeginLongOp(); // // Set the background // if (!BKGD::FCacheToHD(ptag)) { vpappb->EndLongOp(); return (fFalse); } vpappb->EndLongOp(); // // Set default name // if ((Pscen() == pvNil) && (_stnTitle.Cch() == 0)) { _SetTitle(); } // // Check if this is supposed to overwrite the current scene // if ((Pscen() == pvNil) || (!Pscen()->FIsEmpty())) { iscen = Iscen(); if (iscen == ivNil) { iscen = -1; } if (!FNewScenInsCore(iscen + 1)) { return (fFalse); } if (!Pscen()->FSetBkgdCore(ptag, &tagOld)) { FRemScenCore(iscen + 1); return (fFalse); } if (FSoundsEnabled()) { _pmsq->PlayMsq(); } else { _pmsq->FlushMsq(); } pmuns = MUNS::PmunsNew(); if (pmuns != pvNil) { pmuns->SetMunst(munstInsScen); pmuns->SetIscen(iscen + 1); pmuns->SetTag(ptag); if (!FAddUndo(pmuns)) { ReleasePpo(&pmuns); FRemScenCore(iscen + 1); return (fFalse); } ReleasePpo(&pmuns); } else { FRemScenCore(iscen + 1); return (fFalse); } } else { if (!Pscen()->FSetBkgd(ptag)) { Bug("warning: set background failed."); return (fFalse); } } SetDirty(); InvalViewsAndScb(); return (fTrue); } /*************************************************************************** * * Plays a movie. * * Parameters: * None * * Returns: * None. * **************************************************************************/ void MVIE::Play() { AssertThis(0); if (FPlaying()) { if (FStopPlaying()) { // // We will stop it soon anyway. // return; } // // Kill playing timer // SetFStopPlaying(fTrue); if (_fPausing) { // // There is no clock timer, so call directly // FCmdRender(pvNil); } } else { if (Pscen() == pvNil) { Pmcc()->PlayStopped(); return; } // reset any outstanding sounds (from listener preview) _pmsq->StopAll(); // flush any outstanding sound messages (from listener preview) _pmsq->FlushMsq(); // // Check for if we need to rewind // if ((Iscen() + 1 == Cscen()) && (Pscen()->Nfrm() == Pscen()->NfrmLast())) { if (!FSwitchScen(0)) { Pmcc()->PlayStopped(); return; } if (!Pscen()->FGotoFrm(Pscen()->NfrmFirst())) { Pmcc()->PlayStopped(); return; } } // // Start playing timer // _fOldSoundsEnabled = FSoundsEnabled(); SetFSoundsEnabled(fTrue); _cnfrm = 0; _tsStart = TsCurrent(); SetFStopPlaying(fFalse); _clok.Start(0); SetFPlaying(fTrue); vpcex->EnqueueCid(cidMviePlaying, pvNil, pvNil, fTrue); if (!_clok.FSetAlarm(0, this)) { Pmcc()->PlayStopped(); SetFPlaying(fFalse); _pmsq->PlayMsq(); SetFSoundsEnabled(_fOldSoundsEnabled); return; } // // Check if we need to play the opening transition // _pmsq->SndOnLong(); Pscen()->Enable(fscenPauses); Pscen()->SelectActr(pvNil); Pscen()->SelectTbox(pvNil); // Have to FReplayFrm *before* FStartPlaying because a camera view // change in FReplayFrm would wipe out prerendering (which FStartPlaying // initiates) if (!Pscen()->FReplayFrm(fscenPauses | fscenSounds | fscenActrs) || !Pscen()->FStartPlaying()) { Pmcc()->PlayStopped(); SetFStopPlaying(fTrue); _pmsq->PlayMsq(); SetFSoundsEnabled(_fOldSoundsEnabled); return; } Pmcc()->DisableAccel(); if ((Iscen() == 0) && (Pscen()->Nfrm() == Pscen()->NfrmFirst())) { _pmcc->UpdateScrollbars(); InvalViews(); vpappb->UpdateMarked(); } Pscen()->PlayBkgdSnd(); } // Play sound queue if (FSoundsEnabled()) { _pmsq->PlayMsq(); } else { _pmsq->FlushMsq(); } return; } /*************************************************************************** * * Handle an alarm going off. * * This routine simply enqueues a command to render a frame. We do it this * way because the clock pre-empts commands in the command queue. If the * user mouse clicks, we need to process those clicks. The best way to do * that is by doing rendering via the command queue. * * Parameters: * pcmd - Pointer to the command to process. * * Returns: * fTrue if it handled the command, else fFalse. * ***************************************************************************/ bool MVIE::FCmdAlarm(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); CMD cmd; if (FIdleSeen() || vpcex->PgobTracking() != pvNil) { SetFIdleSeen(fFalse); ClearPb(&cmd, size(CMD)); cmd.pcmh = this; cmd.cid = cidRender; vpcex->EnqueueCmd(&cmd); } else { // // Check again, asap. // if (!_clok.FSetAlarm(0, this)) { PMVU pmvu; // // Things are in a bad way. // Pmcc()->EnableAccel(); SetFPlaying(fFalse); SetFStopPlaying(fFalse); SetFSoundsEnabled(_fOldSoundsEnabled); _clok.RemoveCmh(this); _fPausing = fFalse; _fScrolling = fFalse; _wit = witNil; pmvu = (PMVU)PddgGet(0); pmvu->PauseUntilClick(fFalse); Pscen()->Enable(fscenTboxes); Pscen()->Disable(fscenPauses); // // Update views and scroll bars // InvalViewsAndScb(); // // Clean up anything else // Pscen()->StopPlaying(); vpcex->EnqueueCid(cidMviePlaying, pvNil, pvNil, fFalse); // // Set sound queue state // _pmsq->SndOnShort(); Pmcc()->PlayStopped(); vpsndm->StopAll(); } } return (fTrue); } /*************************************************************************** * * Handle rendering a frame. * * This routine gets a little busy. The basic premise is to render a * frame one frame ahead of the one currently displayed. This means * that only actor stuff gets done first, then when the frame is to be * displayed, textboxes and sounds get started. If there is a scrolling * text box, then we play nothing else until the scrolling is done, and * (finally) pauses in the frame. * * Parameters: * pcmd - Pointer to the command to process. * * Returns: * fTrue if it handled the command, else fFalse. * ***************************************************************************/ bool MVIE::FCmdRender(PCMD pcmd) { AssertThis(0); AssertNilOrVarMem(pcmd); PMVU pmvu; PTBOX ptbox; long itbox; ulong tsCur = TsCurrent(); pmvu = (PMVU)PddgGet(0); AssertPo(pmvu, 0); if (FStopPlaying()) { LStopPlaying: Pmcc()->EnableAccel(); _clok.Stop(); _clok.RemoveCmh(this); _fPausing = fFalse; _fScrolling = fFalse; _wit = witNil; SetFStopPlaying(fFalse); SetFPlaying(fFalse); SetFSoundsEnabled(_fOldSoundsEnabled); pmvu->PauseUntilClick(fFalse); if (Pscen() != pvNil) { Pscen()->Enable(fscenTboxes); Pscen()->Disable(fscenPauses); } else Assert(_iscen == ivNil, "Bogus scene state"); // // Update views and scroll bars // InvalViewsAndScb(); // // Clean up anything else // if (Pscen() != pvNil) Pscen()->StopPlaying(); vpcex->EnqueueCid(cidMviePlaying, pvNil, pvNil, fFalse); // // Set sound queue state // _pmsq->SndOnShort(); Pmcc()->PlayStopped(); vpsndm->StopAll(); // if we were fading, then restore sound volume if (_vlmOrg) { vpsndm->SetVlm(_vlmOrg); _vlmOrg = 0; } return (fTrue); } // // if _vlmOrg is nonzero, then we are in the process of fading // if (_vlmOrg) { long vlm; // get the current volume vlm = vpsndm->VlmCur(); // massage it vlm -= _vlmOrg / (kdtsVlmFade * 4); // kdtsVolFade seconds * 4 volume changes a second = total number deltas // if new volume is below 0, then we are done if (vlm <= 0) { SetFStopPlaying(fTrue); vpsndm->SetVlm(0); goto LStopPlaying; } // set the volume to new level vpsndm->SetVlm(vlm); if (!_clok.FSetAlarm(kdtimVlmFade, this)) { goto LStopPlaying; } return fTrue; } if (_fScrolling) { // // Do next text box scroll. // _fScrolling = fFalse; for (itbox = 0;; itbox++) { ptbox = Pscen()->PtboxFromItbox(itbox); AssertNilOrPo(ptbox, 0); if (ptbox == pvNil) { break; } if (ptbox->FNeedToScroll()) { ptbox->Scroll(); _fScrolling = fTrue; } } if (_fScrolling && !_clok.FSetAlarm(kdtsScrolling, this)) { _fScrolling = fFalse; goto LStopPlaying; } else if (_fScrolling) { return fTrue; } else { goto LCheckForPause; } } // // If we are not pausing, then start the stuff for this frame // if (!_fPausing) { // // Now do all text boxes. // Pscen()->Enable(fscenTboxes); Pscen()->Disable(fscenActrs); if (!Pscen()->FGotoFrm(Pscen()->Nfrm())) { Pscen()->Enable(fscenActrs); goto LStopPlaying; } Pscen()->Enable(fscenActrs); // // Draw the previous frame // MarkViews(); // // Update scroll bars // _pmcc->UpdateScrollbars(); // // Play outstanding sounds // if (FSoundsEnabled()) { _pmsq->PlayMsq(); } else { _pmsq->FlushMsq(); } // // Flush to the screen // vpappb->UpdateMarked(); // // Check for any text box scrolling // // for (itbox = 0;; itbox++) { ptbox = Pscen()->PtboxFromItbox(itbox); AssertNilOrPo(ptbox, 0); if (ptbox == pvNil) { break; } if (ptbox->FNeedToScroll()) { if (!_clok.FSetAlarm(kdtsScrolling, this)) { goto LStopPlaying; } _fScrolling = fTrue; return (fTrue); } } LCheckForPause: // // Check for a pause // switch (_wit) { case witUntilClick: _wit = witNil; _fPausing = fTrue; pmvu->PauseUntilClick(fTrue); return (fTrue); case witUntilSnd: if (_pmsq->FPlaying(fFalse)) { _fPausing = fTrue; if (!_clok.FSetAlarm(0, this)) { goto LStopPlaying; } return (fTrue); } _fPausing = fFalse; _wit = witNil; break; case witForTime: _wit = witNil; _fPausing = fTrue; _clok.FSetAlarm(_dts, this); return (fTrue); case witNil: _fPausing = fFalse; break; default: Bug("Bad Pause type"); } } else { if (_wit == witUntilSnd) { goto LCheckForPause; } else { pmvu->PauseUntilClick(fFalse); _fPausing = fFalse; } } // // Advance everything to the next frame. // Account for time spent between beginning of this routine and // here. // if (!_clok.FSetAlarm(LwMax(0, kdtimFrame - LwMulDivAway((TsCurrent() - tsCur), kdtimSecond, kdtsSecond)), this, 0, fTrue)) { goto LStopPlaying; } Pscen()->Disable(fscenTboxes); if (Pscen()->Nfrm() == Pscen()->NfrmLast()) { if (Iscen() == (Cscen() - 1)) { // since this is the last scene/last frame, we want to // fade out music, by setting _vlmOrg we turn off rendering and fade out // music until VlmCur is 0, at which point we go into stop state. if (!vpsndm->FPlayingAll()) // there are no sounds playing SetFStopPlaying(fTrue); // there is nothing to fade else { _vlmOrg = vpsndm->VlmCur(); // get the current volume if ((0 == _vlmOrg)) // if there is volume to fade with SetFStopPlaying(fTrue); // there is nothing to fade } return (fTrue); } _trans = Pscen()->Trans(); if (FSwitchScen(Iscen() + 1)) { AssertPo(Pscen(), 0); Pscen()->Disable(fscenTboxes); Pscen()->Enable(fscenPauses); if (!Pscen()->FReplayFrm(fscenPauses | fscenSounds | fscenActrs)) { SetFStopPlaying(fTrue); return (fTrue); } Pscen()->PlayBkgdSnd(); } else { SetFStopPlaying(fTrue); return (fTrue); } } else { if (!Pscen()->FGotoFrm(Pscen()->Nfrm() + 1)) { SetFStopPlaying(fTrue); return (fTrue); } } Pbwld()->Render(); _cnfrm++; return (fTrue); } /*************************************************************************** * * This sets the costume of an actor. * * Parameters: * ibprt - Id of the body part to set. * ptag - Pointer to the tag of the costume, if fCustom != fTrue. * cmid - The cmid of the costume, if fCustom == fTrue. * fCustom - Is this a custom costume. * * Returns: * fTrue if successful, else fFalse. * **************************************************************************/ bool MVIE::FCostumeActr(long ibprt, PTAG ptag, long cmid, tribool fCustom) { AssertThis(0); AssertPo(Pscen(), 0); ACTR *pactr; // // Get the current actor // pactr = Pscen()->PactrSelected(); AssertPo(pactr, 0); if (!pactr->FSetCostume(ibprt, ptag, cmid, fCustom)) { return (fFalse); } SetDirty(); InvalViews(); return (fTrue); } /*************************************************************************** * * This inserts a pause into the scene right now. * * Parameters: * wit - The type of pause to insert, or witNil to clear pauses. * dts - Number of clock ticks to pause. * * Returns: * fTrue if successful, else fFalse. * **************************************************************************/ bool MVIE::FPause(WIT wit, long dts) { AssertThis(0); AssertPo(Pscen(), 0); if (!Pscen()->FPause(wit, dts)) { return (fFalse); } SetDirty(); return (fTrue); } #ifdef DEBUG /****************************************************************************** MarkMem Marks memory used by the CMVI ************************************************************ PETED ***********/ void CMVI::MarkMem(void) { long iv, ivMac; MVIED mvied; SCEND scend; ivMac = pglmvied->IvMac(); for (iv = 0; iv < ivMac; iv++) { pglmvied->Get(iv, &mvied); MarkMemObj(mvied.pcrf); } MarkMemObj(pglmvied); ivMac = pglscend->IvMac(); for (iv = 0; iv < ivMac; iv++) { pglscend->Get(iv, &scend); MarkMemObj(scend.pmbmp); } MarkMemObj(pglscend); } #endif // DEBUG /****************************************************************************** FAddToCmvi Generates a GL of SCENDs that describes this movie. A movie client that wishes to makes wholesale changes to a movie may get this GL, rearrange it, including inserting references to new movie files, and pass it back to the movie via FSetCmvi to modify the movie. Adds the movie to the GL of movie descriptors. Arguments: PCMVI pcmvi -- the CMVI to add the movie to long iscendIns -- the point at which to start inserting scenes Returns: fTrue if it was successful, fFalse otherwise ************************************************************ PETED ***********/ bool MVIE::FAddToCmvi(PCMVI pcmvi, long *piscendIns) { AssertThis(0); AssertVarMem(pcmvi); AssertNilOrPo(pcmvi->pglscend, 0); long iscen = 0, iscenMac = Cscen(), imvied; SCEND scend; MVIED mvied; PCFL pcfl; scend.imvied = ivNil; #ifdef BUG1929 /* Ensure that _pcrfAutoSave points to the temp file, not the original movie file */ if (!_FUseTempFile()) goto LFail; #endif // BUG1929 if (!FAutoSave(pvNil, fFalse)) goto LFail; if ((pcmvi->pglscend == pvNil) && (pcmvi->pglscend = GL::PglNew(size(SCEND))) == pvNil) { goto LFail; } if ((pcmvi->pglmvied == pvNil) && (pcmvi->pglmvied = GL::PglNew(size(MVIED))) == pvNil) { goto LFail; } mvied.pcrf = _pcrfAutoSave; mvied.cno = _cno; mvied.aridLim = _aridLim; if (!pcmvi->pglmvied->FAdd(&mvied, &imvied)) goto LFail; scend.imvied = imvied; mvied.pcrf->AddRef(); pcfl = mvied.pcrf->Pcfl(); scend.fNuked = fFalse; for (iscen = 0; iscen < iscenMac; iscen++, (*piscendIns)++) { bool fSuccess; KID kid; /* Get CNO */ AssertDo(pcfl->FGetKidChidCtg(kctgMvie, _cno, iscen, kctgScen, &kid), "Not enough scene chunks for movie"); scend.cno = kid.cki.cno; scend.chid = iscen; scend.pmbmp = pvNil; /* Get PMBMP and TRANS from the scene */ if (iscen != Iscen()) { BLCK blck; if (!SCEN::FTransOnFile(mvied.pcrf, scend.cno, &scend.trans)) goto LFail; AssertDo(pcfl->FGetKidChidCtg(kctgScen, scend.cno, 0, kctgThumbMbmp, &kid), "Scene doesn't have a thumbnail"); if (!pcfl->FFind(kid.cki.ctg, kid.cki.cno, &blck)) goto LFail; if ((scend.pmbmp = MBMP::PmbmpRead(&blck)) == pvNil) goto LFail; } else { scend.trans = Pscen()->Trans(); if ((scend.pmbmp = Pscen()->PmbmpThumbnail()) == pvNil) goto LFail; scend.pmbmp->AddRef(); } /* Add to the list */ fSuccess = _FInsertScend(pcmvi->pglscend, *piscendIns, &scend); ReleasePpo(&scend.pmbmp); if (!fSuccess) goto LFail; } return fTrue; LFail: while (iscen--) _DeleteScend(pcmvi->pglscend, --(*piscendIns)); if (pcmvi->pglscend != pvNil && pcmvi->pglscend->IvMac() == 0) ReleasePpo(&pcmvi->pglscend); if (scend.imvied != ivNil) { ReleasePpo(&mvied.pcrf); pcmvi->pglmvied->Delete(scend.imvied); } if (pcmvi->pglmvied != pvNil && pcmvi->pglmvied->IvMac() == 0) ReleasePpo(&pcmvi->pglmvied); return fFalse; } /****************************************************************************** FSetCmvi Rebuilds the movie based on the given CMVI. Any scenes marked for deletion are disowned by their MVIE chunk. Any scenes that refer to a movie file other than this MVIE's auto save file are copied into this MVIE's auto save file. SCEN chunks are given new CHIDs reflecting their new position within the movie. The non-nuked scenes must appear in the GL in the order that they appear in the movie; other than that, there is no restriction on the order of the scenes (ie, nuked scenes can appear anywhere in the GL, even though currently the only client of this API keeps the nuked scenes at the end). Arguments: PCMVI pcmvi -- the CMVI that describes the new movie structure Returns: fTrue if it could accomplish all of the above, fFalse otherwise ************************************************************ PETED ***********/ bool MVIE::FSetCmvi(PCMVI pcmvi) { AssertThis(0); AssertVarMem(pcmvi); AssertPo(pcmvi->pglmvied, 0); AssertPo(pcmvi->pglscend, 0); bool fRet = fFalse; long iscend, iscendMac = pcmvi->pglscend->IvMac(); long iscenOld = Iscen(); long imvied, imviedMac = pcmvi->pglmvied->IvMac(); long aridMin = 0; CHID chidScen = 0; PCFL pcfl = _pcrfAutoSave->Pcfl(); PCRF pcrf = _pcrfAutoSave; PGL pglmviedNew; pglmviedNew = pcmvi->pglmvied->PglDup(); if (pglmviedNew == pvNil) goto LFail; /* Copy all the external movie chunks into this movie */ for (imvied = 0; imvied < imviedMac; imvied++) { MVIED mvied; pglmviedNew->Get(imvied, &mvied); if (imvied > 0) { if (!mvied.pcrf->Pcfl()->FClone(kctgMvie, mvied.cno, pcfl, &mvied.cno)) goto LFail; if (!_FAddMvieToRollCall(mvied.cno, aridMin)) goto LFail; mvied.pcrf = pcrf; mvied.pcrf->AddRef(); pglmviedNew->Put(imvied, &mvied); } else { Assert(mvied.pcrf == pcrf, "Invalid GL of MVIEDs"); Assert(mvied.cno == _cno, "Invalid GL of MVIEDs"); } aridMin += mvied.aridLim; } for (iscend = 0; iscend < iscendMac; iscend++) { CNO cnoScen = cnoNil; SCEND scend; MVIED mvied; pcmvi->pglscend->Get(iscend, &scend); pglmviedNew->Get(scend.imvied, &mvied); /* Was this scene imported? */ if (scend.imvied > 0) { KID kid; if (!pcfl->FGetKidChidCtg(kctgMvie, mvied.cno, scend.chid, kctgScen, &kid)) { goto LFail; } cnoScen = kid.cki.cno; /* If so, only bother keeping it if the user didn't delete it */ if (!scend.fNuked) { PSCEN pscen; if (!pcfl->FAdoptChild(kctgMvie, _cno, kctgScen, cnoScen, chidScen++)) goto LFail; if (!_FAdoptMsndInMvie(pcfl, cnoScen)) goto LFail; if ((pscen = SCEN::PscenRead(this, pcrf, cnoScen)) == pvNil || !pscen->FPlayStartEvents(fTrue) || !pscen->FAddActrsToRollCall()) { PushErc(ercSocNoImportRollCall); } Pmcc()->EnableActorTools(); Pmcc()->EnableTboxTools(); ReleasePpo(&pscen); } } else { if (scend.fNuked) { PSCEN pscen; if (scend.chid != (CHID)iscenOld) { pscen = SCEN::PscenRead(this, pcrf, scend.cno); if (pscen == pvNil || !pscen->FPlayStartEvents(fTrue)) PushErc(ercSocNoNukeRollCall); } else { pscen = _pscenOpen; pscen->AddRef(); } if (pscen != pvNil) { pscen->RemActrsFromRollCall(fTrue); ReleasePpo(&pscen); } pcfl->DeleteChild(kctgMvie, _cno, kctgScen, scend.cno, scend.chid); } else { /* Set the CHID to be the current scene number */ cnoScen = scend.cno; pcfl->ChangeChid(kctgMvie, _cno, kctgScen, scend.cno, scend.chid, chidScen++); } } /* If we didn't delete the scene, go ahead and update its transition */ if (scend.chid != (CHID)iscenOld || scend.imvied != 0) { if (!scend.fNuked) { Assert(mvied.pcrf == pcrf, "Scene's MVIE didn't get copied"); Assert(cnoScen != cnoNil, "Didn't set the cnoScen"); if (!SCEN::FSetTransOnFile(pcrf, cnoScen, scend.trans)) goto LFail; } } else { if (scend.fNuked) { /* Basically, do an _FCloseCurrentScene w/out the autosave */ SCEN::Close(&_pscenOpen); _iscen = ivNil; } else { /* If this is the scene that *used* to be Iscen(), change the transition in memory rather than on file */ Pscen()->SetTransitionCore(scend.trans); _iscen = iscend; } } } _cscen = chidScen; _aridLim = aridMin; SetDirty(); if (_cscen == 0) { Assert(_iscen == ivNil, 0); _pmcc->SceneNuked(); } InvalViewsAndScb(); Pmcc()->UpdateRollCall(); #ifdef DEBUG { long ckid = pcfl->Ckid(kctgMvie, _cno); KID kid; CHID chidLast = chidNil; for (long ikid = 0; ikid < ckid; ikid++) { if (pcfl->FGetKid(kctgMvie, _cno, ikid, &kid)) { if (kid.cki.ctg == kctgScen) { Assert(chidLast == chidNil || kid.chid > chidLast, "Found duplicate CHID in scene children"); chidLast = kid.chid; } } else { Bug("Can't guarantee validity of MVIE's SCEN children"); break; } } } #endif /* DEBUG */ fRet = fTrue; LFail: if (pglmviedNew != pvNil) { /* Remove any copied movies; leave the first MVIED alone */ while (imvied-- > 1) { MVIED mvied; pglmviedNew->Get(imvied, &mvied); Assert(mvied.pcrf == pcrf, "Invalid MVIED during cleanup"); pcfl->Delete(kctgMvie, mvied.cno); ReleasePpo(&mvied.pcrf); } ReleasePpo(&pglmviedNew); } return fRet; } /****************************************************************************** _FAddMvieToRollCall Updates roll call (including remapping arids for the actors found in the new movie) for a given MVIE that's just been copied into this movie's file. Arguments: CNO cno -- the CNO of the copied movie long aridMin -- the new base arid for this movie's actors Returns: fTrue if it succeeds, fFalse otherwise ************************************************************ PETED ***********/ bool MVIE::_FAddMvieToRollCall(CNO cno, long aridMin) { AssertThis(0); long imactr, imactrMac, icnoMac = 0; PCFL pcfl = _pcrfAutoSave->Pcfl(); PGST pgstmactr = pvNil; /* Update the roll call GST */ if (!FReadRollCall(_pcrfAutoSave, cno, &pgstmactr)) { pgstmactr = pvNil; goto LFail; } imactrMac = pgstmactr->IvMac(); for (imactr = 0; imactr < imactrMac; imactr++) { STN stn; MACTR mactr; pgstmactr->GetStn(imactr, &stn); pgstmactr->GetExtra(imactr, &mactr); mactr.arid += aridMin; mactr.cactRef = 0; if (!_pgstmactr->FAddStn(&stn, &mactr)) goto LFail; } /* Remap all the arids on the file */ if (aridMin > 0) { ulong grfcge, grfcgeIn = fcgeNil; PGL pglcno; CKI ckiParLast = {ctgNil, cnoNil}, ckiPar; KID kid; CGE cge; if ((pglcno = GL::PglNew(size(CNO))) == pvNil) goto LFail; cge.Init(pcfl, kctgMvie, cno); while (cge.FNextKid(&kid, &ckiPar, &grfcge, fcgeNil)) { if (grfcge & fcgePre) { /* If we've found an ACTR chunk, remap its arid */ if (kid.cki.ctg == kctgActr) { long icno; CNO cnoActr; /* Only do a given chunk once */ Assert(icnoMac == pglcno->IvMac(), "icnoMac isn't up-to-date"); for (icno = 0; icno < icnoMac; icno++) { pglcno->Get(icno, &cnoActr); if (kid.cki.cno == cnoActr) break; } if (icno < icnoMac) continue; if (!pglcno->FAdd(&kid.cki.cno)) goto LFail1; /* Change the arid */ if (!ACTR::FAdjustAridOnFile(pcfl, kid.cki.cno, aridMin)) { /* Don't bother trying to fix the arids on file; the caller should be deleting the copied MVIE chunk anyway */ LFail1: ReleasePpo(&pglcno); goto LFail; } icnoMac++; /* Once we're at an ACTR chunk, set up so that we don't enumerate down again until returning to our parent's next sibling */ ckiParLast = ckiPar; grfcgeIn = fcgeSkipToSib; } } else if (grfcge & fcgePost && grfcgeIn & fcgeSkipToSib) { if (ckiParLast.ctg != ckiPar.ctg || ckiParLast.cno != ckiPar.cno) grfcgeIn = fcgeNil; } } ReleasePpo(&pglcno); } ReleasePpo(&pgstmactr); return fTrue; LFail: /* NOTE: I could use more variables and make the loops below faster, but this is a failure case so I'm not very concerned about performance here */ if (pgstmactr != pvNil) { MACTR mactr; /* Remove added entries to the movie's roll call */ imactrMac = _pgstmactr->IvMac(); while (imactr--) { _pgstmactr->GetExtra(--imactrMac, &mactr); vptagm->CloseTag(&mactr.tagTmpl); _pgstmactr->Delete(imactrMac); pgstmactr->Delete(imactr); } /* Close any other uncopied tags */ imactrMac = pgstmactr->IvMac(); while (imactrMac--) { pgstmactr->GetExtra(imactrMac, &mactr); vptagm->CloseTag(&mactr.tagTmpl); } ReleasePpo(&pgstmactr); } return fFalse; } /****************************************************************************** EmptyCmvi Frees up the memory used by the CMVI. For each scene in the GL of SCENDs, releases memory that the SCEND referred to. Likewise for each MVIED in the GL of MVIEDs. Arguments: PCMVI pcmvi -- the CMVI to empty Returns: Sets the client's pointer to pvNil when finished ************************************************************ PETED ***********/ void CMVI::Empty(void) { AssertPo(pglscend, 0); AssertPo(pglmvied, 0); PGL pgl; if ((pgl = pglscend) != pvNil) { long iscend = pgl->IvMac(); while (iscend-- > 0) { SCEND scend; pgl->Get(iscend, &scend); ReleasePpo(&scend.pmbmp); } ReleasePpo(&pgl); pglscend = pvNil; } if ((pgl = pglmvied) != pvNil) { long imvied = pgl->IvMac(); while (imvied-- > 0) { MVIED mvied; pgl->Get(imvied, &mvied); ReleasePpo(&mvied.pcrf); } ReleasePpo(&pgl); pglmvied = pvNil; } } /****************************************************************************** _FInsertScend Inserts the given SCEND into a GL of SCENDs that was created by this movie. Arguments: PGL pglscend -- the GL of SCENDs to insert into long iscend -- the position at which to insert this SCEND PSCEND pscend -- the SCEND to insert Returns: fTrue if successful, fFalse otherwise ************************************************************ PETED ***********/ bool MVIE::_FInsertScend(PGL pglscend, long iscend, PSCEND pscend) { AssertPo(pglscend, 0); AssertPo(pscend->pmbmp, 0); if (!pglscend->FInsert(iscend, pscend)) return fFalse; pscend->pmbmp->AddRef(); return fTrue; } /****************************************************************************** _DeleteScend Deletes the given SCEND from a GL of SCENDs that was created by this movie. Arguments: PGL pglscend -- the GL of SCENDs to delete from long iscend -- which SCEND to delete ************************************************************ PETED ***********/ void MVIE::_DeleteScend(PGL pglscend, long iscend) { AssertPo(pglscend, 0); AssertIn(iscend, 0, pglscend->IvMac()); SCEND scend; pglscend->Get(iscend, &scend); AssertPo(scend.pmbmp, 0); pglscend->Delete(iscend); ReleasePpo(&scend.pmbmp); } /*************************************************************************** * * This sets the transition type for the current scene. * * Parameters: * trans - The transition type. * * Returns: * fTrue if successful, else fFalse. * **************************************************************************/ bool MVIE::FSetTransition(TRANS trans) { AssertThis(0); AssertIn(trans, 0, transLim); AssertPo(Pscen(), 0); if (!Pscen()->FSetTransition(trans)) { return (fFalse); } SetDirty(); return (fTrue); } /*************************************************************************** * * This pastes an actor into the movie. * * Parameters: * pactr - A pointer to the actor to paste. * * Returns: * fTrue if successful, else fFalse. * **************************************************************************/ bool MVIE::FPasteActr(PACTR pactr) { AssertThis(0); AssertPo(pactr, 0); AssertPo(Pscen(), 0); PMVU pmvu; pmvu = (PMVU)PddgGet(0); if (pmvu == pvNil) { return (fFalse); } AssertPo(pmvu, 0); // // Paste this actor in and select it. // if (!Pscen()->FPasteActr(pactr)) { return (fFalse); } Pscen()->SelectActr(pactr); // // Positioning a pasted actor must translate all subroutes // pmvu->StartPlaceActor(fTrue); SetDirty(); InvalViewsAndScb(); return (fTrue); } /*************************************************************************** * * This pastes an actor path onto the selected actor. * * Parameters: * pactr - A pointer to the actor to paste from. * * Returns: * fTrue if successful, else fFalse. * **************************************************************************/ bool MVIE::FPasteActrPath(PACTR pactr) { AssertThis(0); AssertPo(pactr, 0); AssertPo(Pscen(), 0); AssertNilOrPo(Pscen()->PactrSelected(), 0); PACTR pactrDup; // REVIEW SeanSe(seanse): This is wrong. Move the undo stuff into // ACTR::FPasteRte() and make ACTR::FPasteRte into FPasteRteCore. if (Pscen()->PactrSelected() == pvNil) { PushErc(ercSocNoActrSelected); return (fFalse); } if (!Pscen()->PactrSelected()->FDup(&pactrDup)) { return (fFalse); } // // Paste this actor in and select it. // if (!Pscen()->PactrSelected()->FPasteRte(pactr)) { ReleasePpo(&pactrDup); return (fFalse); } if (!Pscen()->PactrSelected()->FCreateUndo(pactrDup)) { Pscen()->PactrSelected()->Restore(pactrDup); ReleasePpo(&pactrDup); return (fFalse); } SetDirty(); InvalViewsAndScb(); ReleasePpo(&pactrDup); return (fTrue); } /*************************************************************************** * * This invalidates all the views on the movie. * * Parameters: * None. * * Returns: * None. * **************************************************************************/ void MVIE::InvalViews(void) { AssertThis(0); long ipddg; PDDG pddg; for (ipddg = 0; pvNil != (pddg = PddgGet(ipddg)); ipddg++) { pddg->InvalRc(pvNil, pddg == PddgActive() ? kginMark : kginSysInval); } } /*************************************************************************** * * This invalidates scrollbars and all the views on the movie. * * Parameters: * None. * * Returns: * None. * **************************************************************************/ void MVIE::InvalViewsAndScb(void) { AssertThis(0); _pmcc->UpdateScrollbars(); InvalViews(); } /*************************************************************************** * * This updates all the views on the movie, updates will happen * asap. * * Parameters: * None. * * Returns: * None. * **************************************************************************/ void MVIE::MarkViews(void) { AssertThis(0); long ipddg; PDDG pddg; // // Need this call in order to mark correctly the changed regions. // Pbwld()->Render(); #ifdef DEBUG if (FWriteBmps()) { FNI fni; STN stn; if (stn.FFormatSz(PszLit("cel%04d.dib"), _lwBmp++)) { if (fni.FBuildFromPath(&stn)) { if (!Pbwld()->FWriteBmp(&fni)) SetFWriteBmps(fFalse); } } } #endif // DEBUG for (ipddg = 0; pvNil != (pddg = PddgGet(ipddg)); ipddg++) { Pbwld()->MarkRenderedRegn(pddg, 0, 0); } } /*************************************************************************** * * This returns the current name of the movie. * * Parameters: * pstnTitle - An stn to copy the name into. * * Returns: * None. * **************************************************************************/ void MVIE::GetName(PSTN pstnTitle) { AssertThis(0); AssertPo(pstnTitle, 0); *pstnTitle = _stnTitle; } /****************************************************************************** ResetTitle Resets the movie title to whatever it's normal default would be (either from the filename or from the MCC string table). ************************************************************ PETED ***********/ void MVIE::ResetTitle(void) { AssertThis(0); FNI fni; _stnTitle.SetNil(); _SetTitle(FGetFni(&fni) ? &fni : pvNil); } /*************************************************************************** * * Updates the external action menu. * * Parameters: * None. * * Returns: * None. * **************************************************************************/ void MVIE::BuildActionMenu() { AssertThis(0); long arid = aridNil; if (pvNil != _pscenOpen && pvNil != _pscenOpen->PactrSelected()) { arid = _pscenOpen->PactrSelected()->Arid(); } _pmcc->ActorSelected(arid); _pmcc->UpdateAction(); } const long kdtsTrans = 4 * kdtsSecond; /*************************************************************************** * * Does a transition. Note that the rectangles should be the exact size * of the rendered area in order to get pushing, dissolve, etc to look perfect. * * Note: A cool fun number fact. If you take a number from 1 - (klwPrime - 1), * multiply by klwPrimeRoot and modulo the result by klwPrime, you will get * a sequence of numbers which hits every number 1->(klwPrime-1) w/o repeating * until every number is hit. This fact is used to create the dissolve effect. * * Parameters: * pgnvDst - The destination GNV. * pgnvSrc - The source GNV. * prcDst - The clipping rectangle in the destination. * prcSrc - The clipping rectangle in the source. * * Returns: * None. * **************************************************************************/ void MVIE::DoTrans(PGNV pgnvDst, PGNV pgnvSrc, RC *prcDst, RC *prcSrc) { AssertThis(0); AssertPo(pgnvDst, 0); AssertPo(pgnvSrc, 0); AssertVarMem(prcDst); AssertVarMem(prcSrc); PGL pglclrSystem = pvNil; PGL pglclrBkgd = pvNil; long iclrMin; pglclrSystem = GPT::PglclrGetPalette(); if (Pscen() == pvNil || !Pscen()->Pbkgd()->FGetPalette(&pglclrBkgd, &iclrMin)) { pglclrBkgd = pvNil; } if (pvNil != pglclrSystem && pvNil != pglclrBkgd) { Assert(pglclrBkgd->IvMac() + iclrMin <= pglclrSystem->IvMac(), "Background palette too large"); CopyPb(pglclrBkgd->QvGet(0), pglclrSystem->QvGet(iclrMin), LwMul(size(CLR), pglclrBkgd->IvMac())); } switch (_trans) { case transBlack: pgnvDst->FillRc(prcDst, kacrBlack); break; case transFadeToBlack: pgnvDst->Dissolve(0, 0, kacrBlack, pgnvSrc, prcSrc, prcDst, kdtsTrans / 2, pglclrSystem); break; case transFadeToWhite: pgnvDst->Dissolve(0, 0, kacrWhite, pgnvSrc, prcSrc, prcDst, kdtsTrans / 2, pglclrSystem); break; case transDissolve: pgnvDst->Dissolve(0, 0, kacrClear, pgnvSrc, prcSrc, prcDst, kdtsTrans, pglclrSystem); break; case transCut: pgnvDst->FillRc(prcDst, kacrBlack); GPT::SetActiveColors(pglclrSystem, fpalIdentity); pgnvDst->CopyPixels(pgnvSrc, prcSrc, prcDst); break; default: Bug("bad trans"); break; } ReleasePpo(&pglclrSystem); ReleasePpo(&pglclrBkgd); _trans = transNil; } /*************************************************************************** * * Used to query if an actor or tbox exists. * * Parameters: * lwType - 1 if searching for an actor, else 0. * lwId - Arid or Itbox to search for. * * Returns: * 1 if exists, else 0. * **************************************************************************/ long MVIE::LwQueryExists(long lwType, long lwId) { AssertThis(0); AssertIn(lwType, 0, 2); if (Pscen() == pvNil) { return (0); } AssertPo(Pscen(), 0); if (lwType == 1) { return (Pscen()->PactrFromArid(lwId) != pvNil ? 1 : 0); } return (Pscen()->PtboxFromItbox(lwId) != pvNil ? 1 : 0); } /*************************************************************************** * * Used to query where an actor or tbox exists. * * Parameters: * lwType - 1 if searching for an actor, else 0. * lwId - Arid or Itbox to search for. * * Returns: * -1 if nonexistent or non-visible, else x in high word, y in low word. * **************************************************************************/ long MVIE::LwQueryLocation(long lwType, long lwId) { AssertThis(0); AssertIn(lwType, 0, 2); PACTR pactr; PTBOX ptbox; long xp, yp; RC rc; if (Pscen() == pvNil) { return (-1); } AssertPo(Pscen(), 0); if (lwType == 1) { RC rcBounds; long cactGuessPt = 0; RND rnd; long ibset; pactr = Pscen()->PactrFromArid(lwId); if (pactr == pvNil) { return (-1); } AssertPo(pactr, 0); if (!pactr->FIsInView()) { return (-1); } pactr->GetCenter(&xp, &yp); pactr->GetRcBounds(&rcBounds); // The center of the actor may not be a selectable point (as in // an arched spletter), so try some random points if the center // point doesn't select the actor. while (pactr != Pscen()->PactrFromPt(xp, yp, &ibset) && cactGuessPt < 1000) { cactGuessPt++; xp = rnd.LwNext(rcBounds.Dxp() + rcBounds.xpLeft); yp = rnd.LwNext(rcBounds.Dyp() + rcBounds.ypTop); } if (cactGuessPt == 1000) { xp = -1; yp = -1; } return ((xp << 16) | yp); } ptbox = Pscen()->PtboxFromItbox(lwId); if (ptbox == pvNil) { return (-1); } AssertPo(ptbox, 0); if (!ptbox->FIsVisible()) { return (-1); } ptbox->GetRc(&rc); return ((rc.xpLeft << 16) | rc.ypTop); } /*************************************************************************** * * Used to set the position within the movie. * * Parameters: * lwScene - Scene to go to. * lwFrame - Frame to go to. * * Returns: * 0 if successful, else -1. * **************************************************************************/ long MVIE::LwSetMoviePos(long lwScene, long lwFrame) { AssertThis(0); if (!FSwitchScen(lwScene)) { return (-1); } if (!Pscen()->FGotoFrm(lwFrame)) { return (-1); } InvalViewsAndScb(); return (0); } /*************************************************************************** * * Unused user sounds in this movie? * * Parms: * bool pfHaveValid -- bool to take whether any of the unused sounds were * actually usable **************************************************************************/ bool MVIE::FUnusedSndsUser(bool *pfHaveValid) { AssertThis(0); AssertNilOrVarMem(pfHaveValid); bool fUnused = fFalse; long icki, ccki; PCFL pcfl; if (pfHaveValid != pvNil) *pfHaveValid = fFalse; if (pvNil == _pcrfAutoSave) return fFalse; pcfl = _pcrfAutoSave->Pcfl(); ccki = pcfl->CckiCtg(kctgMsnd); for (icki = 0; icki < ccki; icki++) { CKI cki; KID kid; AssertDo(pcfl->FGetCkiCtg(kctgMsnd, icki, &cki), "Should never fail"); Assert(_FIsChild(pcfl, cki.ctg, cki.cno), "Not a child of MVIE chunk"); if (pcfl->CckiRef(cki.ctg, cki.cno) < 2) { fUnused = fTrue; if (pfHaveValid != pvNil) { if (pcfl->FGetKidChid(cki.ctg, cki.cno, kchidSnd, &kid)) { *pfHaveValid = fTrue; break; } } else break; } } return fUnused; } /*************************************************************************** * * Used to set the title of the movie, based on a file name. * * Parameters: * pfni - File name. * * Returns: * None. * **************************************************************************/ void MVIE::_SetTitle(PFNI pfni) { AssertThis(0); achar *pch; if (pfni == pvNil) { if (_stnTitle.Cch() == 0) { Pmcc()->GetStn(idsEngineDefaultTitle, &_stnTitle); Pmcc()->UpdateTitle(&_stnTitle); } return; } pfni->GetLeaf(&_stnTitle); for (pch = _stnTitle.Psz() + _stnTitle.Cch(); (pch > _stnTitle.Psz()) && (*pch != ChLit('.')); pch--) { } if (*pch == ChLit('.')) { _stnTitle.Delete(pch - _stnTitle.Psz()); } if (_stnTitle.Cch() == 0) { Pmcc()->GetStn(idsEngineDefaultTitle, &_stnTitle); } Pmcc()->UpdateTitle(&_stnTitle); } // // // // BEGIN MVU GOODIES // // // BEGIN_CMD_MAP(MVU, DDG) ON_CID_GEN(cidCopyRoute, &MVU::FCmdClip, pvNil) ON_CID_GEN(cidCutTool, &MVU::FCmdClip, pvNil) ON_CID_GEN(cidShiftCut, &MVU::FCmdClip, pvNil) ON_CID_GEN(cidCopyTool, &MVU::FCmdClip, pvNil) ON_CID_GEN(cidShiftCopy, &MVU::FCmdClip, pvNil) ON_CID_GEN(cidPasteTool, &MVU::FCmdClip, pvNil) ON_CID_GEN(cidClose, pvNil, pvNil) ON_CID_GEN(cidSave, &MVU::FCmdSave, pvNil) ON_CID_GEN(cidSaveAs, &MVU::FCmdSave, pvNil) ON_CID_GEN(cidSaveCopy, &MVU::FCmdSave, pvNil) ON_CID_GEN(cidIdle, &MVU::FCmdIdle, pvNil) ON_CID_GEN(cidRollOff, &MVU::FCmdRollOff, pvNil) END_CMD_MAP_NIL() RTCLASS(MVU) /**************************************************** * * Destructor for movie view objects * ****************************************************/ MVU::~MVU(void) { if (_tagTool.sid != ksidInvalid) TAGM::CloseTag(&_tagTool); } /*************************************************************************** * * Create a new mvu. * * Parameters: * pmvie - Pointer to the creating movie. * pgcb - Pointer to the creation block describing placement, etc. * dxp - Width of the rendered area. * dyp - Height of the rendered area. * * Returns: * A pointer to the view, otw pvNil on failure * ***************************************************************************/ MVU *MVU::PmvuNew(PMVIE pmvie, PGCB pgcb, long dxp, long dyp) { AssertPo(pmvie, 0); AssertVarMem(pgcb); MVU *pmvu; BRS rgr[3][3] = {{rOne, rZero, rZero}, {rZero, rZero, rOne}, {rZero, -rOne, rZero}}; // // Create the new view // if ((pmvu = NewObj MVU(pmvie, pgcb)) == pvNil) return pvNil; // // Init it // if (!pmvu->_FInit()) { ReleasePpo(&pmvu); return (pvNil); } CopyPb(rgr, pmvu->_rgrAxis, size(rgr)); pmvu->_fRecordDefault = fTrue; pmvu->_fRespectGround = fFalse; pmvu->_dxp = dxp; pmvu->_dyp = dyp; pmvu->_tool = toolCompose; pmvu->_tagTool.sid = ksidInvalid; // // Make this the active view // pmvu->Activate(fTrue); return pmvu; } /*************************************************************************** * * Set the tool type * * Parameters: * tool - The new tool to use. * * Returns: * None. * ***************************************************************************/ void MVU::SetTool(long tool) { AssertThis(0); AssertPo(Pmvie(), 0); AssertNilOrPo(Pmvie()->Pscen(), 0); long lwMode; // -1 = Textbox mode, 0 = either mode, 1 = Actor mode PTBOX ptbox = pvNil; PACTR pactr = pvNil; if (Pmvie()->Pscen() != pvNil) { AssertNilOrPo(Pmvie()->Pscen()->PactrSelected(), 0); AssertNilOrPo(Pmvie()->Pscen()->PtboxSelected(), 0); pactr = Pmvie()->Pscen()->PactrSelected(); ptbox = Pmvie()->Pscen()->PtboxSelected(); if (pactr != pvNil) { _ptmplTool = pactr->Ptmpl(); AssertPo(_ptmplTool, 0); } } else { _ptmplTool = pvNil; } // // Get old tool type // switch (_tool) { case toolSoonerLater: lwMode = 1; if (tool != toolSoonerLater) { Pmvie()->Pmcc()->EndSoonerLater(); if ((pactr != pvNil) && pactr->FTimeFrozen()) { pactr->SetTimeFreeze(fFalse); pactr->Hilite(); Pmvie()->InvalViewsAndScb(); } } break; case toolActorNuke: case toolCopyObject: case toolCopyRte: case toolCutObject: case toolPasteObject: lwMode = 0; break; case toolSceneNuke: case toolDefault: case toolSounder: case toolLooper: case toolMatcher: case toolListener: case toolSceneChop: case toolSceneChopBack: case toolAction: case toolActorSelect: case toolPlace: case toolCompose: case toolRecordSameAction: case toolRotateX: case toolRotateY: case toolRotateZ: case toolCostumeCmid: case toolSquashStretch: case toolResize: case toolNormalizeRot: case toolNormalizeSize: case toolActorEasel: lwMode = 1; break; case toolTboxMove: case toolTboxUpDown: case toolTboxLeftRight: case toolTboxFalling: case toolTboxRising: case toolTboxPaintText: case toolTboxFillBkgd: case toolTboxStory: case toolTboxCredit: case toolTboxFont: case toolTboxStyle: case toolTboxSize: lwMode = -1; break; default: Bug("Unknown tool type"); } // // Check if we've changed primary tool type // switch (tool) { case toolActorNuke: case toolCopyObject: case toolCopyRte: case toolCutObject: case toolPasteObject: break; case toolSoonerLater: _fMouseDownSeen = fFalse; case toolSceneNuke: case toolDefault: case toolSounder: case toolLooper: case toolMatcher: case toolListener: case toolSceneChop: case toolSceneChopBack: case toolAction: case toolActorSelect: case toolPlace: case toolCompose: case toolRecordSameAction: case toolRotateX: case toolRotateY: case toolRotateZ: case toolCostumeCmid: case toolSquashStretch: case toolResize: case toolNormalizeRot: case toolNormalizeSize: case toolActorEasel: _fTextMode = fFalse; if (lwMode > 0) { break; } if (Pmvie()->Pscen() != pvNil) { Pmvie()->Pscen()->SelectActr(pactr); } break; case toolTboxMove: case toolTboxUpDown: case toolTboxLeftRight: case toolTboxFalling: case toolTboxRising: case toolTboxStory: case toolTboxCredit: case toolTboxFillBkgd: _fTextMode = fTrue; if (lwMode < 0) { break; } LSelectTbox: if (Pmvie()->Pscen() != pvNil) { Pmvie()->Pscen()->SelectTbox(ptbox); } break; case toolTboxPaintText: _fTextMode = fTrue; if ((lwMode < 0) && (ptbox != pvNil)) { ptbox->FSetAcrText(AcrPaint()); ptbox->Pscen()->Pmvie()->Pmcc()->PlayUISound(tool); break; } goto LSelectTbox; case toolTboxFont: _fTextMode = fTrue; if ((lwMode < 0) && (ptbox != pvNil)) { ptbox->FSetOnnText(OnnTextCur()); ptbox->Pscen()->Pmvie()->Pmcc()->PlayUISound(tool); break; } goto LSelectTbox; case toolTboxSize: _fTextMode = fTrue; if ((lwMode < 0) && (ptbox != pvNil)) { ptbox->FSetDypFontText(DypFontTextCur()); ptbox->Pscen()->Pmvie()->Pmcc()->PlayUISound(tool); break; } goto LSelectTbox; case toolTboxStyle: _fTextMode = fTrue; if ((lwMode < 0) && (ptbox != pvNil)) { ptbox->FSetStyleText(GrfontStyleTextCur()); ptbox->Pscen()->Pmvie()->Pmcc()->PlayUISound(tool); break; } goto LSelectTbox; default: Bug("Unknown tool type"); } _tool = tool; } /*************************************************************************** * * Change the current loaded tag attached to the cursor. If the previous * tag was a "ksidUseCrf" tag, it must be closed to release its refcount on * the tag's pcrf. * * Parameters: * ptag - The new tag to attach to the cursor * * Returns: * None. * ***************************************************************************/ void MVU::SetTagTool(PTAG ptag) { AssertThis(0); AssertVarMem(ptag); if (_tagTool.sid != ksidInvalid) { TAGM::CloseTag(&_tagTool); } #ifdef DEBUG // Make sure the new tag has been opened, if it's a "ksidUseCrf" tag if (ptag->sid == ksidUseCrf) { AssertPo(ptag->pcrf, 0); } #endif _tagTool = *ptag; if (_tagTool.sid != ksidInvalid) TAGM::DupTag(ptag); } /*************************************************************************** * * Draw this view. * * Parameters: * pgnv - The environment to write to. * prcClip - The clipping rectangle. * * Returns: * None. * ***************************************************************************/ void MVU::Draw(PGNV pgnv, RC *prcClip) { AssertThis(0); AssertPo(pgnv, 0); AssertVarMem(prcClip); RC rcDest; // // Clear non-rendering areas // if (prcClip->xpRight > _dxp) { rcDest = *prcClip; rcDest.xpLeft = _dxp; pgnv->FillRc(&rcDest, kacrWhite); } if (prcClip->ypBottom > _dyp) { rcDest = *prcClip; rcDest.ypTop = _dyp; pgnv->FillRc(&rcDest, kacrWhite); } // // Render // if (Pmvie()->Pscen() != pvNil) { Pmvie()->Pbwld()->Render(); Pmvie()->Pbwld()->Draw(pgnv, prcClip, 0, 0); // // This draws a currently being dragged out text box frame. // if (!_rcFrame.FEmpty()) { pgnv->FrameRcApt(&_rcFrame, &vaptLtGray, kacrBlack, kacrWhite); } } else { rcDest.Set(0, 0, _dxp, _dyp); pgnv->FillRc(&rcDest, kacrBlack); } } /*************************************************************************** * * Warps the cursor to the center of this gob. Also sets _xpPrev and * _ypPrev so that future mouse deltas are from the center. * * Parameters: * None. * * Returns: * None. * **************************************************************************/ void MVU::WarpCursToCenter(void) { AssertThis(0); PT pt; _xpPrev = _dxp / 2; _ypPrev = _dyp / 2; _dzrPrev = rZero; pt.xp = _xpPrev; pt.yp = _ypPrev; MapPt(&pt, cooLocal, cooGlobal); vpappb->PositionCurs(pt.xp, pt.yp); } /*************************************************************************** * * Warps the cursor to the center of the given actor. * * Parameters: * None. * * Returns: * None. * **************************************************************************/ void MVU::WarpCursToActor(PACTR pactr) { AssertThis(0); AssertPo(pactr, 0); PT pt; pactr->GetCenter(&pt.xp, &pt.yp); MapPt(&pt, cooLocal, cooGlobal); vpappb->PositionCurs(pt.xp, pt.yp); } /*************************************************************************** * * Call this function when you have the cursor hidden and you want to * "reset" its position after using the mouse position to adjust an actor. * It updates _xpPrev and _ypPrev. Then, if the cursor has gone outside * the gob, it warps the cursor to the center of the gob. This way, the * actor doesn't seem to hit an invisible "wall" just because the (hidden) * cursor has hit the edge of the screen. * * Parameters: * (xp, yp): current cursor position * * Returns: * None. * **************************************************************************/ void MVU::AdjustCursor(long xp, long yp) { AssertThis(0); RC rc; GetRc(&rc, cooLocal); rc.Inset(kdpInset, kdpInset); // warp before the cursor gets close to the gob's edge if (rc.FPtIn(xp, yp)) { _xpPrev = xp; _ypPrev = yp; _dzrPrev = rZero; } else { WarpCursToCenter(); } } /*************************************************************************** * * Converts from mouse coordinates to world coordinates * * Parameters: * dxrMouse - BRender scalar representation of mouse X coordinate * dyrMouse - BRender scalar representation of mouse Y coordinate * dzrMouse - BRender scalar representation of mouse Z coordinate * pdxrWld - Place to store world X coordinate. * pdyrWld - Place to store world Y coordinate. * pdzrWld - Place to store world Z coordinate. * fRecord - Is the conversion to be scaled according to the recording * scaling factor, or the non-recording scaling factor. * * Returns: * None. * **************************************************************************/ void MVU::MouseToWorld(BRS dxrMouse, BRS dyrMouse, BRS dzrMouse, BRS *pdxrWld, BRS *pdyrWld, BRS *pdzrWld, bool fRecord) { AssertThis(0); AssertVarMem(pdxrWld); AssertVarMem(pdyrWld); AssertVarMem(pdzrWld); BRS dxrScr, dyrScr, dzrScr; BMAT34 bmat34Cam; BRS rScaleMouse; dxrScr = BR_MAC3(dxrMouse, _rgrAxis[0][0], dyrMouse, _rgrAxis[0][1], dzrMouse, _rgrAxis[0][2]); dyrScr = BR_MAC3(dxrMouse, _rgrAxis[1][0], dyrMouse, _rgrAxis[1][1], dzrMouse, _rgrAxis[1][2]); dzrScr = BR_MAC3(dxrMouse, _rgrAxis[2][0], dyrMouse, _rgrAxis[2][1], dzrMouse, _rgrAxis[2][2]); rScaleMouse = fRecord ? krScaleMouseRecord : krScaleMouseNonRecord; // // apply some scaling so that 1 pixel of mouse movement is rScaleMouse world units // dxrScr = BrsMul(dxrScr, rScaleMouse); dyrScr = BrsMul(dyrScr, rScaleMouse); dzrScr = BrsMul(dzrScr, rScaleMouse); Pmvie()->Pscen()->Pbkgd()->GetMouseMatrix(&bmat34Cam); *pdxrWld = BR_MAC3(dxrScr, bmat34Cam.m[0][0], dyrScr, bmat34Cam.m[1][0], dzrScr, bmat34Cam.m[2][0]); *pdyrWld = BR_MAC3(dxrScr, bmat34Cam.m[0][1], dyrScr, bmat34Cam.m[1][1], dzrScr, bmat34Cam.m[2][1]); *pdzrWld = BR_MAC3(dxrScr, bmat34Cam.m[0][2], dyrScr, bmat34Cam.m[1][2], dzrScr, bmat34Cam.m[2][2]); } bool MVU::_fKbdDelayed = fFalse; long MVU::_dtsKbdDelay; long MVU::_dtsKbdRepeat; /*************************************************************************** * * Slows down keyboard auto-repeat as much as possible. Saves user's * previous setting so it can be restored in RestoreKeyboardRepeat. * * Parameters: * none * * Returns * none * **************************************************************************/ void MVU::SlowKeyboardRepeat(void) { if (_fKbdDelayed) return; #ifdef WIN if (!SystemParametersInfo(SPI_GETKEYBOARDDELAY, 0, &_dtsKbdDelay, fFalse)) { Bug("why could this fail?"); return; } if (!SystemParametersInfo(SPI_SETKEYBOARDDELAY, klwMax, pvNil, fFalse)) { Bug("why could this fail?"); return; } if (!SystemParametersInfo(SPI_GETKEYBOARDSPEED, 0, &_dtsKbdRepeat, fFalse)) { Bug("why could this fail?"); return; } if (!SystemParametersInfo(SPI_SETKEYBOARDSPEED, 0, pvNil, fFalse)) { Bug("why could this fail?"); return; } #endif #ifdef MAC RawRtn(); #endif _fKbdDelayed = fTrue; } /*************************************************************************** * * Restores the keyboard auto-repeat to the user's previous setting. * * Parameters: * none * * Returns * none * **************************************************************************/ void MVU::RestoreKeyboardRepeat(void) { if (!_fKbdDelayed) return; #ifdef WIN if (!SystemParametersInfo(SPI_SETKEYBOARDDELAY, _dtsKbdDelay, pvNil, fFalse)) { Bug("why could this fail?"); return; } if (!SystemParametersInfo(SPI_SETKEYBOARDSPEED, _dtsKbdRepeat, pvNil, fFalse)) { Bug("why could this fail?"); return; } #endif #ifdef MAC RawRtn(); #endif _fKbdDelayed = fFalse; } /*************************************************************************** * * An actor has just been added, so enter "place actor" mode, where the * actor floats with the cursor. * * Parameters: * fEntireScene flags whether the whole scene's route is to be translated on * positioning, or whether only the current subroute is to be translated. * * Returns * None. * **************************************************************************/ void MVU::StartPlaceActor(bool fEntireScene) { AssertThis(0); AssertPo(Pmvie()->Pscen(), 0); PACTR pactr = Pmvie()->Pscen()->PactrSelected(); AssertPo(pactr, 0); vpappb->HideCurs(); WarpCursToCenter(); _fEntireScene = fEntireScene; SetTool(toolPlace); Pmvie()->RemFromRollCall(pactr, fFalse); Pmvie()->Pmcc()->NewActor(); vpcex->TrackMouse(this); // While tracking the mouse, don't allow the cursor out of capture window. // If we don't do this, then the user can click on another window in the // middle of the cursor tracking, (if tracking with mouse btn up). Note, // this call clips the cursor movement to an area on the screen, so we are // assuming there is no way for the capture window to move during tracking. #ifdef WIN RECT rectCapture; GetWindowRect(HwndContainer(), &rectCapture); ClipCursor(&rectCapture); #endif // WIN _fMouseDownSeen = fFalse; _tsLastSample = TsCurrent(); SlowKeyboardRepeat(); return; } /*************************************************************************** * * Undoes the place tool. * * Parameters: * None. * * Returns * fTrue if successful, else fFalse. * **************************************************************************/ void MVU::EndPlaceActor() { AssertThis(0); AssertPo(Pmvie()->Pscen(), 0); if (Tool() != toolPlace) { return; } vpappb->ShowCurs(); WarpCursToCenter(); SetTool(toolCompose); AssertDo(Pmvie()->FAddToRollCall(Pmvie()->Pscen()->PactrSelected(), pvNil), "Should never fail"); Pmvie()->Pmcc()->ChangeTool(toolCompose); vpcex->EndMouseTracking(); _fMouseDownSeen = fFalse; return; } /*************************************************************************** * * Track the mouse moves and set the cursor appropriately. * * Parameters: * pcmd - The command information. * * Returns: * fTrue - indicating that the command was processed. * ***************************************************************************/ bool MVU::FCmdMouseMove(PCMD_MOUSE pcmd) { AssertThis(0); AssertVarMem(pcmd); PACTR pactr; long ibset; PDOCB pdocb; AssertPo(Pmvie(), 0); if (Pmvie()->Pscen() == pvNil) { Pmvie()->Pmcc()->SetCurs(toolDefault); return (fTrue); } if (Pmvie()->FPlaying()) { Pmvie()->Pmcc()->SetCurs(toolDefault); return (fTrue); } switch (Tool()) { case toolTboxStory: case toolTboxCredit: case toolTboxPaintText: case toolTboxFillBkgd: case toolTboxMove: case toolTboxFont: case toolTboxSize: case toolTboxStyle: Pmvie()->Pmcc()->SetCurs(toolDefault); break; case toolPlace: return (fFalse); case toolSceneNuke: case toolSceneChop: case toolSceneChopBack: Pmvie()->Pmcc()->SetCurs(Tool()); break; case toolSounder: case toolLooper: case toolMatcher: if (_tagTool.sid == ksidInvalid) Pmvie()->Pmcc()->SetCurs(toolDefault); else Pmvie()->Pmcc()->SetCurs(Tool()); break; case toolListener: Pmvie()->Pmcc()->SetCurs(Tool()); // Audition sound if over an actor pactr = Pmvie()->Pscen()->PactrFromPt(pcmd->xp, pcmd->yp, &ibset); if (pvNil != pactr) { if (pactr != _pactrListener) { Pmvie()->Pmsq()->StopAll(); pactr->FReplayFrame(fscenSounds); // Ignore audition error; non-fatal // Play outstanding sounds Pmvie()->Pmsq()->PlayMsq(); } _fMouseOn = fFalse; } else if (!_fMouseOn) { _fMouseOn = fTrue; Pmvie()->Pmsq()->StopAll(); Pmvie()->Pscen()->FReplayFrm(fscenSounds); // Play outstanding sounds Pmvie()->Pmsq()->PlayMsq(); } _pactrListener = pactr; break; case toolSoonerLater: if (!_fTextMode) { AssertPo(Pmvie()->Pscen(), 0); pactr = Pmvie()->Pscen()->PactrFromPt(pcmd->xp, pcmd->yp, &ibset); AssertNilOrPo(pactr, 0); if (pactr == pvNil) { Pmvie()->Pmcc()->SetCurs(toolDefault); break; } else if (_fMouseDownSeen) { Pmvie()->Pmcc()->SetCurs(toolCompose); } else { Pmvie()->Pmcc()->SetCurs(Tool()); } } else { Pmvie()->Pmcc()->SetCurs(toolDefault); } break; case toolAction: case toolActorNuke: case toolActorSelect: case toolCompose: case toolRecordSameAction: case toolRotateX: case toolRotateY: case toolRotateZ: case toolCostumeCmid: case toolSquashStretch: case toolResize: case toolNormalizeRot: case toolNormalizeSize: case toolCopyObject: case toolPasteObject: case toolCopyRte: case toolCutObject: case toolActorEasel: if (!_fTextMode) { AssertPo(Pmvie()->Pscen(), 0); pactr = Pmvie()->Pscen()->PactrFromPt(pcmd->xp, pcmd->yp, &ibset); AssertNilOrPo(pactr, 0); if (pactr == pvNil) { Pmvie()->Pmcc()->SetCurs(toolDefault); break; } else if ((Tool() == toolCompose) && (pcmd->grfcust & fcustCmd)) { Pmvie()->Pmcc()->SetCurs(toolTweak); } else if ((Tool() == toolCompose) && (pcmd->grfcust & fcustShift)) { Pmvie()->Pmcc()->SetCurs(toolComposeAll); } else if ((Tool() == toolPasteObject) && vpclip->FGetFormat(kclsACLP, &pdocb)) { if (((PACLP)pdocb)->FRouteOnly()) Pmvie()->Pmcc()->SetCurs(toolPasteRte); else Pmvie()->Pmcc()->SetCurs(Tool()); ReleasePpo(&pdocb); } else { Pmvie()->Pmcc()->SetCurs(Tool()); } } else { Pmvie()->Pmcc()->SetCurs(toolDefault); } break; case toolDefault: Pmvie()->Pmcc()->SetCurs(toolDefault); break; default: Bug("Unknown tool type"); } return (fTrue); } /*************************************************************************** * * Track the mouse and do the appropriate command. * * Parameters: * pcmdTrack - The command information. * * Returns: * fTrue - indicating that the command was processed. * ***************************************************************************/ bool MVU::FCmdTrackMouse(PCMD_MOUSE pcmd) { AssertThis(0); AssertVarMem(pcmd); RC rc; if (pcmd->cid == cidMouseDown) { Assert(vpcex->PgobTracking() == pvNil, "mouse already being tracked!"); vpcex->TrackMouse(this); } else { Assert(vpcex->PgobTracking() == this, "not tracking mouse!"); Assert(pcmd->cid == cidTrackMouse, 0); } if ((pcmd->cid == cidMouseDown) || ((pcmd->grfcust & fcustMouse) && !_fMouseDownSeen)) { _MouseDown(pcmd); } else { _MouseDrag(pcmd); } if (!(pcmd->grfcust & fcustMouse)) { _MouseUp(pcmd); } return fTrue; } /*************************************************************************** * * Handle positioning an actor when the place tool is in effect. * * Parameters: * dxrWld, dyrWld, dzrWld - the change in position in worldspace * * Returns: * None. * **************************************************************************/ void MVU::_PositionActr(BRS dxrWld, BRS dyrWld, BRS dzrWld) { AssertThis(0); Assert(Tool() == toolPlace, "Wrong tool in effect"); PMVIE pmvie; PSCEN pscen; bool fMoved; PACTR pactr = pvNil; ulong grfmaf = fmafOrient; pmvie = Pmvie(); AssertPo(pmvie, 0); pscen = pmvie->Pscen(); AssertPo(pscen, 0); pactr = pscen->PactrSelected(); AssertPo(pactr, 0); if (_fEntireScene) { grfmaf |= fmafEntireScene; } else { grfmaf |= fmafEntireSubrte; } if (FRespectGround()) { grfmaf |= fmafGround; } // FMoveRouteCore cannot fail on fmafEntireSubrte as no events are added if (pactr->FMoveRoute(dxrWld, dyrWld, dzrWld, &fMoved, grfmaf) && fMoved) { Pmvie()->Pbwld()->MarkDirty(); Pmvie()->MarkViews(); pscen->Pbkgd()->ReuseActorPlacePoint(); } } /*************************************************************************** * * Notify script that an actor was clicked. Note that we sometimes call * this function with fDown fFalse even though the user hasn't mouseup'ed * yet, because of bringing up easels on mousedown. * * Parameters: * pactr - the actor that was clicked * fDown - fTrue if we're mousedown'ing the actor, fFalse if mouseup * * Returns: * None. * **************************************************************************/ void MVU::_ActorClicked(PACTR pactr, bool fDown) { AssertThis(0); AssertPo(pactr, 0); ulong grftmpl = 0; if (pactr->Ptmpl()->FIsTdt()) { grftmpl |= ftmplTdt; } if (pactr->Ptmpl()->FIsProp()) { grftmpl |= ftmplProp; } if (fDown) { vpcex->EnqueueCid(cidActorClickedDown, pvNil, pvNil, pactr->Arid(), pactr->Ptmpl()->Cno(), grftmpl); } else { vpcex->EnqueueCid(cidActorClicked, pvNil, pvNil, pactr->Arid(), pactr->Ptmpl()->Cno(), grftmpl); } } /*************************************************************************** * * Handle Mousedown * * Parameters: * pcmd - The mouse command * * Returns: * None. * **************************************************************************/ void MVU::_MouseDown(CMD_MOUSE *pcmd) { AssertThis(0); AssertVarMem(pcmd); PACTR pactr = pvNil; PACTR pactrDup; PTBOX ptbox; PAUND paund; PT pt; long ibset; PDOCB pdocb; SlowKeyboardRepeat(); if (Pmvie()->FPlaying()) { // // If we are in the middle of playing, ignore mouse down. // return; } AssertPo(Pmvie(), 0); if (pvNil == Pmvie()->Pscen()) { return; } AssertPo(Pmvie()->Pscen(), 0); if (_fTextMode) { ptbox = Pmvie()->Pscen()->PtboxSelected(); } else if ((Tool() != toolPlace) && (Tool() != toolSceneChop) && (Tool() != toolSceneChopBack)) { // // Select the actor under the cursor // pactr = Pmvie()->Pscen()->PactrSelected(); AssertNilOrPo(pactr, 0); if ((pactr != pvNil) && pactr->FTimeFrozen()) { pactr->SetTimeFreeze(fFalse); } pactrDup = Pmvie()->Pscen()->PactrFromPt(pcmd->xp, pcmd->yp, &ibset); // // Use previously selected actor if mouse in the actor. // Don't change the selected actor if we're using the default tool // if (((pactr == pvNil) || !pactr->FIsInView() || !pactr->FPtIn(pcmd->xp, pcmd->yp, &ibset)) && Tool() != toolDefault) { pactr = pactrDup; AssertNilOrPo(pactr, 0); } if (pvNil != pactr) { _ActorClicked(pactr, fTrue); } Pmvie()->Pscen()->SelectActr(pactr); // okay even if pactr is pvNil Pmvie()->Pbwld()->MarkDirty(); } #ifdef DEBUG // Authoring hack to write out background starting pos data if (pvNil != pactr && ((vpappb->GrfcustCur(fFalse) & (fcustShift | fcustCmd | fcustOption)) == (fcustShift | fcustCmd | fcustOption))) { BRS xr; BRS yr; BRS zr; pactr->Pbody()->GetPosition(&xr, &yr, &zr); if (!Pmvie()->Pscen()->Pbkgd()->FWritePlaceFile(xr, yr, zr)) { Bug("ouch. bkgd write failed."); } else { Warn("Wrote bkgd actor start point."); } } #endif // DEBUG _xpPrev = pcmd->xp; _ypPrev = pcmd->yp; _dzrPrev = rZero; _grfcust = pcmd->grfcust; _tsLastSample = TsCurrent(); switch (Tool()) { // Sound tools get handled together: case toolSounder: case toolLooper: case toolMatcher: if (pactr == pvNil) // scene sound { tribool fLoop = (tribool)(Tool() == toolLooper); tribool fQueue = (tribool)FPure(_grfcust & fcustCmd); if ((Tool() == toolMatcher) && (ksidInvalid != _tagTool.sid)) { PushErc(ercSocBadSceneSound); break; } if (ksidInvalid != _tagTool.sid) { Pmvie()->FAddBkgdSnd(&_tagTool, fLoop, fQueue, vlmNil, styNil); } } else // actor sound { tribool fLoop = (tribool)(Tool() == toolLooper); tribool fQueue = (tribool)FPure(_grfcust & fcustCmd); tribool fActnCel = (tribool)FPure(Tool() == toolMatcher); if (ksidInvalid != _tagTool.sid) { Pmvie()->FAddActrSnd(&_tagTool, fLoop, fQueue, fActnCel, vlmNil, styNil); } } break; case toolListener: // Start the listener easel vpcex->EndMouseTracking(); RestoreKeyboardRepeat(); if (pvNil != pactr) { _ActorClicked(pactr, fFalse); } Pmvie()->Pmcc()->StartListenerEasel(); break; case toolActorSelect: Pmvie()->Pmcc()->PlayUISound(Tool()); break; case toolSceneNuke: if (Pmvie()->FRemScen(Pmvie()->Iscen())) { Pmvie()->Pmcc()->UpdateRollCall(); Pmvie()->Pmcc()->SceneNuked(); Pmvie()->InvalViewsAndScb(); Pmvie()->Pmcc()->PlayUISound(Tool()); } break; case toolActorNuke: if (pactr == pvNil) { break; } Pmvie()->FRemActr(); Pmvie()->Pmcc()->PlayUISound(Tool()); break; case toolSceneChop: if (Pmvie()->Pscen()->FChop()) { Pmvie()->InvalViewsAndScb(); Pmvie()->Pmcc()->PlayUISound(Tool()); } break; case toolSceneChopBack: if (Pmvie()->Pscen()->FChopBack()) { Pmvie()->InvalViewsAndScb(); Pmvie()->Pmcc()->PlayUISound(Tool()); } break; case toolCutObject: case toolCopyObject: case toolCopyRte: if (!_fTextMode) { FDoClip(Tool()); } break; case toolPasteObject: if (!_fTextMode) { if (vpclip->FGetFormat(kclsACLP, &pdocb) && ((PACLP)pdocb)->FRouteOnly() && (pactr != pvNil)) { FDoClip(Tool()); ReleasePpo(&pdocb); } } break; case toolTboxStory: case toolTboxCredit: case toolTboxPaintText: case toolTboxFillBkgd: case toolTboxMove: case toolTboxFont: case toolTboxSize: case toolTboxStyle: Pmvie()->Pscen()->SelectTbox(pvNil); break; case toolPlace: _fMouseDownSeen = fTrue; break; case toolSoonerLater: if ((pactr != pvNil) && !_fMouseDownSeen) { pactr->SetTimeFreeze(fTrue); pactr->Hilite(); _fMouseDownSeen = fTrue; Pmvie()->Pmcc()->PlayUISound(Tool()); } else { goto LEnd; } break; case toolCompose: case toolRotateX: case toolRotateY: case toolRotateZ: case toolResize: case toolSquashStretch: if (pactr != pvNil) { vpappb->HideCurs(); // // Create an actor undo object // paund = AUND::PaundNew(); if ((paund == pvNil) || !pactr->FDup(&pactrDup, fTrue)) { Pmvie()->ClearUndo(); PushErc(ercSocNotUndoable); } else { paund->SetPactr(pactrDup); ReleasePpo(&pactrDup); paund->SetArid(pactr->Arid()); // // Store it. We will only add it if there is a change done // to the actor. // _paund = paund; } if ((Tool() != toolResize) && (Tool() != toolSquashStretch)) { Pmvie()->Pmcc()->PlayUISound(Tool(), _grfcust); } else { _lwLastTime = 0; } } break; case toolNormalizeRot: if (pactr != pvNil) { Pmvie()->Pmcc()->PlayUISound(Tool()); pactr->FNormalize(fnormRotate); } break; case toolNormalizeSize: if (pactr != pvNil) { Pmvie()->Pmcc()->PlayUISound(Tool()); pactr->FNormalize(fnormSize); } break; case toolRecordSameAction: if (pactr != pvNil) { long anidTool = pactr->AnidCur(); long anid = anidTool; long celn = 0; bool fFrozen; SetAnidTool(pactr->AnidCur()); _ptmplTool = pactr->Ptmpl(); if ((pcmd->grfcust & fcustShift) && (pcmd->grfcust & fcustCmd) && FRecordDefault()) { fFrozen = fFalse; _fCyclingCels = fFalse; _fSetFRecordDefault = fTrue; SetFRecordDefault(fFalse); } else { fFrozen = FPure(pcmd->grfcust & fcustShift); _fCyclingCels = FPure(pcmd->grfcust & fcustCmd); } if ((pactr->Ptmpl() != _ptmplTool) && !(_ptmplTool->FIsTdt() && pactr->Ptmpl()->FIsTdt())) { PushErc(ercSocActionNotApplicable); return; } vpappb->HideCurs(); // first, call FSetAction if (anidTool == ivNil) { anid = pactr->AnidCur(); } if (pactr->AnidCur() == anid) { celn = pactr->CelnCur(); } // note that FSetAction creates an undo object // NOTE: FSetAction() must be called on each use // of toolRecordSameAction. (It is not redundant). // Otherwise, resizing can break wysiwyg, as the final // path point probably won't be a complete cel's distance // from the previous step. Assert(pvNil == _pactrRestore, "_pactrRestore should not require releasing"); ReleasePpo(&_pactrRestore); // To be safe if (!pactr->FSetAction(anid, celn, fFrozen, &_pactrRestore)) { break; // an Oom erc has already been pushed } SetAnidTool(ivNil); _tsLast = TsCurrent(); pactr->SetTsInsert(_tsLast); Pmvie()->Pmcc()->PlayUISound(Tool()); } break; case toolAction: // // Start the action browser // vpcex->EndMouseTracking(); RestoreKeyboardRepeat(); if (pactr != pvNil) { _ActorClicked(pactr, fFalse); Pmvie()->Pscen()->SelectActr(pactr); _ptmplTool = pactr->Ptmpl(); Pmvie()->Pmcc()->StartActionBrowser(); } break; case toolCostumeCmid: if (pactr != pvNil) { TAG tag; // unused TrashVar(&tag); TrashVar(&ibset); Pmvie()->FCostumeActr(ibset, &tag, CmidTool(), tribool::tYes); } break; case toolActorEasel: if (pactr != pvNil) { bool fActrChanged; _ActorClicked(pactr, fFalse); Pmvie()->Pmcc()->ActorEasel(&fActrChanged); if (fActrChanged) { Pmvie()->SetDirty(); Pmvie()->ClearUndo(); } } break; case toolDefault: /* Do nothing */ break; default: Bug("Tool unknown on mouse down"); } if (Pmvie()->FSoundsEnabled()) { Pmvie()->Pmsq()->PlayMsq(); } else { Pmvie()->Pmsq()->FlushMsq(); } _fMouseDownSeen = fTrue; LEnd: Pmvie()->MarkViews(); } /*************************************************************************** * * Handle Mouse drag (mouse move while button down) * * Parameters: * pcmd - The mouse command * * Returns: * None. * **************************************************************************/ void MVU::_MouseDrag(CMD_MOUSE *pcmd) { AssertThis(0); AssertVarMem(pcmd); PMVIE pmvie; PSCEN pscen; PACTR pactr = pvNil; BRS dxrMouse, dyrMouse, dzrMouse; BRS dxrWld, dyrWld, dzrWld; // amount moved from previous point in world space BRS zrActr, zrCam, dzrActr; bool fArrowKey = fFalse; RC rc; PT pt; if (Pmvie()->FPlaying() || Pmvie()->Pmcc()->FMinimized()) { // // If we are in the middle of playing, or been minimized, ignore mouse dragging. // return; } pmvie = Pmvie(); AssertPo(pmvie, 0); pscen = pmvie->Pscen(); AssertNilOrPo(pscen, 0); if (pvNil == pscen) { return; } pactr = pscen->PactrSelected(); AssertNilOrPo(pactr, 0); if (pactr == pvNil) { return; } dxrMouse = BrsSub(BrIntToScalar(pcmd->xp), BrIntToScalar(_xpPrev)); dyrMouse = BrsSub(BrIntToScalar(_ypPrev), BrIntToScalar(pcmd->yp)); dzrMouse = _dzrPrev; #ifdef WIN // // Get the "mouse Z" by sampling the arrow keys. If an arrow key // is down, the number of pixels moved is the number of seconds // since the keyboard was last sampled times kdwrMousePerSecond. // ulong dts = LwMax(1, TsCurrent() - _tsLastSample); BRS drSec = BrsDiv(BrIntToScalar(dts), BR_SCALAR(kdtsSecond)); if (GetKeyState(VK_UP) < 0) { fArrowKey = fTrue; dzrMouse += BrsMul(drSec, kdwrMousePerSecond); } if (GetKeyState(VK_DOWN) < 0) { fArrowKey = fTrue; dzrMouse -= BrsMul(drSec, kdwrMousePerSecond); } if (fArrowKey && Tool() == toolRecordSameAction && !_fCyclingCels && pactr->FIsModeRecord()) { if ((BrsAbs(dxrMouse) * 4 < BrsAbs(dzrMouse)) && (BrsAbs(dyrMouse) * 4 < BrsAbs(dzrMouse))) { // When the up/down arrow keys are used, infinitesimal // mouse movement should not be observed or determine path direction. dxrMouse = rZero; dyrMouse = rZero; } } _dzrPrev = dzrMouse; _tsLastSample = TsCurrent(); #endif #ifdef MAC RawRtn(); #endif MouseToWorld(dxrMouse, dyrMouse, dzrMouse, &dxrWld, &dyrWld, &dzrWld, Tool() == toolRecordSameAction); // // Scale movement based on selected actor // pactr->GetXyzWorld(pvNil, pvNil, &zrActr); pscen->Pbkgd()->GetCameraPos(pvNil, pvNil, &zrCam); dzrActr = BrsAbs(BrsSub(zrActr, zrCam)); dzrActr = BrsDiv(dzrActr, kzrMouseScalingFactor); if (dzrActr < rOne) { dzrActr = rOne; } dxrWld = BrsMul(dxrWld, BrsMul(dzrActr, BR_SCALAR(1.1))); dyrWld = BrsMul(dyrWld, BrsMul(dzrActr, BR_SCALAR(1.1))); dzrWld = BrsMul(dzrWld, BrsMul(dzrActr, BR_SCALAR(1.1))); switch (Tool()) { default: Bug("Tool unknown on mouse move"); break; case toolDefault: case toolActorSelect: break; case toolSceneNuke: case toolActorNuke: case toolSceneChop: case toolSceneChopBack: case toolCutObject: case toolCopyObject: case toolPasteObject: case toolCopyRte: case toolTboxPaintText: case toolTboxFillBkgd: case toolTboxMove: case toolTboxFont: case toolTboxSize: case toolTboxStory: case toolTboxCredit: case toolTboxStyle: case toolActorEasel: case toolSounder: case toolLooper: case toolMatcher: break; case toolPlace: _PositionActr(dxrWld, dyrWld, dzrWld); AdjustCursor(pcmd->xp, pcmd->yp); break; case toolCompose: { ulong grfmaf = fmafNil; bool fMoved{}; if (_fRespectGround) { grfmaf |= fmafGround; } if (_grfcust & fcustCmd) { AdjustCursor(pcmd->xp, pcmd->yp); if (pactr->FTweakRoute(dxrWld, dyrWld, dzrWld, grfmaf)) { if (fMoved) { if ((_paund != pvNil) && !Pmvie()->FAddUndo(_paund)) { PushErc(ercSocNotUndoable); Pmvie()->ClearUndo(); } ReleasePpo(&_paund); } } Pmvie()->MarkViews(); } else { if (_grfcust & fcustShift) { grfmaf |= fmafEntireSubrte; } // FMoveRoute returns fTrue if the distance moved was non-zero if (pactr->FMoveRoute(dxrWld, dyrWld, dzrWld, &fMoved, grfmaf)) { if (fMoved) { if ((_paund != pvNil) && !Pmvie()->FAddUndo(_paund)) { PushErc(ercSocNotUndoable); Pmvie()->ClearUndo(); } ReleasePpo(&_paund); AdjustCursor(pcmd->xp, pcmd->yp); Pmvie()->Pbwld()->MarkDirty(); Pmvie()->MarkViews(); } } } } break; case toolRotateX: case toolRotateY: case toolRotateZ: { BRS brs; BRA xa, ya, za; brs = BrsMul(dxrMouse + dyrMouse, -krRotateScaleFactor); xa = aZero; ya = aZero; za = aZero; switch (Tool()) { case toolRotateX: xa = BrScalarToAngle(brs); break; case toolRotateY: ya = -BrScalarToAngle(brs); break; case toolRotateZ: za = BrScalarToAngle(brs); break; } if (pmvie->FRotateActr(xa, ya, za, FPure(_grfcust & fcustCmd))) { if ((_paund != pvNil) && !Pmvie()->FAddUndo(_paund)) { PushErc(ercSocNotUndoable); Pmvie()->ClearUndo(); } ReleasePpo(&_paund); } Pmvie()->Pbwld()->MarkDirty(); Pmvie()->MarkViews(); AdjustCursor(pcmd->xp, pcmd->yp); } break; case toolResize: { BRS brs; BRS brs2; brs = BrsMul(dxrMouse + dyrMouse, krRotateScaleFactor); brs2 = BrsAdd(brs, rOne); // // Play UI sound // if ((((dxrMouse + dyrMouse) < 0) && !(_lwLastTime < 0)) || (((dxrMouse + dyrMouse) > 0) && !(_lwLastTime > 0))) { _lwLastTime = dxrMouse + dyrMouse; Pmvie()->Pmcc()->StopUISound(); Pmvie()->Pmcc()->PlayUISound(Tool(), (dxrMouse + dyrMouse > 0) ? 0 : fcustShift); } if (pmvie->FScaleActr(brs2)) { if ((_paund != pvNil) && !Pmvie()->FAddUndo(_paund)) { PushErc(ercSocNotUndoable); Pmvie()->ClearUndo(); } ReleasePpo(&_paund); } Pmvie()->Pbwld()->MarkDirty(); Pmvie()->MarkViews(); AdjustCursor(pcmd->xp, pcmd->yp); } break; case toolSquashStretch: { BRS brs; BRS brs2; brs = BrsMul(-dxrMouse - dyrMouse, krRotateScaleFactor); brs2 = BrsAdd(brs, rOne); // // Play UI sound // if ((((-dxrMouse - dyrMouse) < 0) && !(_lwLastTime < 0)) || (((-dxrMouse - dyrMouse) > 0) && !(_lwLastTime > 0))) { _lwLastTime = -dxrMouse - dyrMouse; Pmvie()->Pmcc()->StopUISound(); Pmvie()->Pmcc()->PlayUISound(Tool(), (-dxrMouse - dyrMouse < 0) ? 0 : fcustShift); } if (pmvie->FSquashStretchActr(brs2)) { if ((_paund != pvNil) && !Pmvie()->FAddUndo(_paund)) { PushErc(ercSocNotUndoable); Pmvie()->ClearUndo(); } ReleasePpo(&_paund); } Pmvie()->Pbwld()->MarkDirty(); Pmvie()->MarkViews(); AdjustCursor(pcmd->xp, pcmd->yp); } break; case toolSoonerLater: case toolNormalizeRot: case toolNormalizeSize: case toolCostumeCmid: break; case toolRecordSameAction: { bool fLonger; bool fStep; ulong tsCurrent = TsCurrent(); ulong grfmaf = 0; bool fFrozen = FPure((pcmd->grfcust & fcustShift) && !(pcmd->grfcust & fcustCmd)); if ((pactr->Ptmpl() != _ptmplTool) && !(_ptmplTool->FIsTdt() && pactr->Ptmpl()->FIsTdt())) { return; } // If have stopped cycling cels if (_fCyclingCels && !(pcmd->grfcust & fcustCmd)) { _fCyclingCels = fFalse; _tsLast = tsCurrent; } // Start recording unless we're cycling cels if (!_fCyclingCels && !pactr->FIsModeRecord() && pactr->FIsRecordValid(dxrWld, dyrWld, dzrWld, tsCurrent)) { if (!pactr->FBeginRecord(tsCurrent, FRecordDefault(), _pactrRestore)) break; // an Oom erc has already been pushed // If rerecording, nuke the remainder of the subroute if (FRecordDefault()) pactr->DeleteFwdCore(fFalse); Pmvie()->Pmcc()->Recording(fTrue, FRecordDefault()); } if (_fCyclingCels) { if (pcmd->grfcust & fcustCmd) // still cycling { if ((tsCurrent - _tsLast) < kdtsCycleCels) { break; } _tsLast = tsCurrent; if (!pactr->FSetActionCore(pactr->AnidCur(), pactr->CelnCur() + 1, fFrozen)) { break; // an Oom erc has already been pushed } Pmvie()->MarkViews(); } } else if (pactr->FIsModeRecord()) // just recording { if ((tsCurrent - _tsLast) < kdtsFrame) { break; } _tsLast = tsCurrent; if (fFrozen) { grfmaf |= fmafFreeze; } if (_fRespectGround) { grfmaf |= fmafGround; } if (!pactr->FRecordMove(dxrWld, dyrWld, dzrWld, grfmaf, tsCurrent, &fLonger, &fStep, _pactrRestore)) { // Oom erc already pushed break; } if (fLonger) // If a point was added to the path { // update scroll bars Pmvie()->Pmcc()->UpdateScrollbars(); if (fStep) AdjustCursor(pcmd->xp, pcmd->yp); Pmvie()->MarkViews(); } } } break; } } /*************************************************************************** * * Handle Mouseup * * Parameters: * pcmd - The mouse command. * * Returns: * None. * **************************************************************************/ void MVU::_MouseUp(CMD_MOUSE *pcmd) { AssertThis(0); AssertVarMem(pcmd); PMVIE pmvie; PSCEN pscen; PACTR pactr = pvNil; PACTR pactrDup; PSUNA psuna; pmvie = Pmvie(); AssertPo(pmvie, 0); _grfcust = fcustNil; if (Tool() != toolPlace || _fMouseDownSeen) RestoreKeyboardRepeat(); if (_fPause) { Assert(Pmvie()->FPlaying(), "Bad Pause type"); // // If we are pausing in the middle of playing, restart playing // if (!pmvie->Pclok()->FSetAlarm(0, pmvie)) { CMD cmd; pmvie->SetFStopPlaying(fTrue); cmd.pcmh = pmvie; cmd.cid = cidAlarm; pmvie->FCmdAlarm(&cmd); } goto LEndTracking; } if (Pmvie()->FPlaying()) { goto LEndTracking; } Pmvie()->Pmcc()->StopUISound(); pscen = pmvie->Pscen(); AssertNilOrPo(pscen, 0); if (pvNil == pscen) { goto LEndTracking; } pactr = pscen->PactrSelected(); AssertNilOrPo(pactr, 0); if (pvNil != pactr && Tool() != toolPlace) { _ActorClicked(pactr, fFalse); } switch (Tool()) { case toolDefault: case toolActorSelect: break; case toolPlace: if (!_fMouseDownSeen) { return; } pactr = Pmvie()->Pscen()->PactrSelected(); AssertPo(pactr, 0); pactrDup = _pactrUndo; AssertNilOrPo(pactrDup, 0); SetTool(toolCompose); Pmvie()->Pmcc()->ChangeTool(toolCompose); // // Now check if the actor is out of view // if (!pactr->FIsInView()) { // // _pactrUndo is pvNil if this is a new actor, else it is // an actor from the roll call. // if (_pactrUndo != pvNil) { Pmvie()->Pscen()->FAddActrCore(_pactrUndo); // Replace old actor with saved version. vpcex->EnqueueCid(cidActorPlacedOutOfView, pvNil, pvNil, _pactrUndo->Arid()); ReleasePpo(&_pactrUndo); } else { pactr->AddRef(); AssertDo(Pmvie()->FAddToRollCall(pactr, pvNil), "Should never fail"); Pmvie()->Pscen()->RemActrCore(pactr->Arid()); vpcex->EnqueueCid(cidActorPlacedOutOfView, pvNil, pvNil, pactr->Arid()); ReleasePpo(&pactr); } WarpCursToCenter(); vpappb->ShowCurs(); break; } else if (_pactrUndo == pvNil) { // // _pactrUndo is pvNil if this is a new actor, else it is // an actor from the roll call. // AssertDo(Pmvie()->FAddToRollCall(pactr, pvNil), "Should never fail"); } // // Now build an undo object for the placing of the actor // psuna = SUNA::PsunaNew(); if ((psuna == pvNil) || ((_pactrUndo == pvNil) && !pactr->FDup(&pactrDup, fTrue))) { PushErc(ercSocNotUndoable); ReleasePpo(&pactrDup); Pmvie()->ClearUndo(); } else { pactrDup->SetArid(pactr->Arid()); psuna->SetType(_pactrUndo == pvNil ? utAdd : utRep); psuna->SetActr(pactrDup); if (_pactrUndo != pvNil) { pactrDup->AddRef(); } if (!Pmvie()->FAddUndo(psuna)) { PushErc(ercSocNotUndoable); Pmvie()->ClearUndo(); } Pmvie()->Pmcc()->EnableActorTools(); } ReleasePpo(&_pactrUndo); ReleasePpo(&psuna); WarpCursToActor(pactr); vpappb->ShowCurs(); vpcex->EnqueueCid(cidActorPlaced, pvNil, pvNil, pactr->Arid()); break; case toolCompose: case toolRotateX: case toolRotateY: case toolRotateZ: case toolResize: case toolSquashStretch: if (pactr != pvNil) { WarpCursToActor(pactr); vpappb->ShowCurs(); } break; case toolRecordSameAction: if (pvNil != pactr) { if ((pactr->Ptmpl() != _ptmplTool) && !(_ptmplTool->FIsTdt() && pactr->Ptmpl()->FIsTdt())) { break; } pactr->FEndRecord(FRecordDefault(), _pactrRestore); // On error, Oom already pushed ReleasePpo(&_pactrRestore); Pmvie()->InvalViewsAndScb(); WarpCursToActor(pactr); vpappb->ShowCurs(); } if (_fSetFRecordDefault) { _fSetFRecordDefault = fFalse; SetFRecordDefault(fTrue); } Pmvie()->Pmcc()->Recording(fFalse, FRecordDefault()); break; case toolSoonerLater: if (pactr != pvNil) { Assert(pactr->FTimeFrozen(), "Something odd is going on"); PACTR pactrDup; PAUND paund; paund = AUND::PaundNew(); if ((paund == pvNil) || !pactr->FDup(&pactrDup, fTrue)) { Pmvie()->ClearUndo(); PushErc(ercSocNotUndoable); } else { paund->SetPactr(pactrDup); ReleasePpo(&pactrDup); paund->SetArid(pactr->Arid()); paund->SetSoonerLater(fTrue); paund->SetNfrmLast(Pmvie()->Pscen()->Nfrm()); if (!Pmvie()->FAddUndo(paund)) { Pmvie()->ClearUndo(); PushErc(ercSocNotUndoable); } } ReleasePpo(&paund); Pmvie()->Pbwld()->MarkDirty(); Pmvie()->MarkViews(); Pmvie()->Pmcc()->StartSoonerLater(); } break; case toolNormalizeRot: case toolNormalizeSize: case toolCostumeCmid: case toolSceneNuke: case toolActorNuke: case toolSceneChop: case toolSceneChopBack: case toolCutObject: case toolCopyObject: case toolPasteObject: case toolCopyRte: case toolTboxPaintText: case toolTboxFillBkgd: case toolTboxMove: case toolTboxFont: case toolTboxSize: case toolTboxStyle: case toolActorEasel: case toolTboxStory: case toolTboxCredit: case toolSounder: case toolLooper: case toolMatcher: break; default: Bug("Tool unknown on mouse up"); } AssertNilOrPo(_paund, 0); ReleasePpo(&_paund); // If you just did a mousedown then mouseup, we have a leftover // undo object that we don't want. So nuke it. LEndTracking: vpcex->EndMouseTracking(); // Remove any cursor clipping we may have begun when mouse tracking started. #ifdef WIN ClipCursor(NULL); #endif // WIN } /*************************************************************************** * * Handles the Cut, Copy, Paste and Clear commands, by setting the appropriate * tool. * * Parameters: * pcmd - Pointer to the command to process. * * Returns: * fTrue if it processed the command, else fFalse. * **************************************************************************/ bool MVU::FCmdClip(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); PTBOX ptbox; PDOCB pdocb; bool fOV = fFalse; CMD cmd; // // Check for O-V model for text in text box. // if (Pmvie()->Pscen() != pvNil) { AssertPo(Pmvie()->Pscen(), 0); if (FTextMode()) { ptbox = Pmvie()->Pscen()->PtboxSelected(); if ((ptbox != pvNil) && !ptbox->FIsVisible()) { ptbox = pvNil; } } else { ptbox = pvNil; } AssertNilOrPo(ptbox, 0); if (pcmd->cid == cidPasteTool && vpclip->FGetFormat(kclsACLP, &pdocb)) { fOV = !((PACLP)pdocb)->FRouteOnly(); ReleasePpo(&pdocb); } else if (((ptbox != pvNil) && ptbox->FTextSelected()) || ((pcmd->cid == cidPasteTool) && vpclip->FGetFormat(kclsTCLP))) { if (ptbox != pvNil) { CMD cmd = *pcmd; cmd.pcmh = ptbox->PddgGet(0); vpcex->EnqueueCmd(&cmd); } fOV = fTrue; } } cmd = *pcmd; switch (pcmd->cid) { case cidCutTool: if (fOV) { cmd.cid = cidCut; vpcex->EnqueueCmd(&cmd); } else { SetTool(toolCutObject); } break; case cidCopyTool: if (fOV) { cmd.cid = cidCopy; vpcex->EnqueueCmd(&cmd); } else { SetTool(toolCopyObject); } break; case cidPasteTool: if (fOV) { if (vpclip->FGetFormat(kclsTCLP) || vpclip->FGetFormat(kclsACLP)) { FDoClip(toolPasteObject); } else { cmd.cid = cidPaste; vpcex->EnqueueCmd(&cmd); } } else { SetTool(toolPasteObject); } break; case cidCopyRoute: SetTool(toolCopyRte); break; case cidPaste: FDoClip(toolPasteObject); break; case cidShiftCut: _grfcust = fcustShift; case cidCut: FDoClip(toolCutObject); _grfcust = fcustNil; break; case cidShiftCopy: _grfcust = fcustShift; case cidCopy: FDoClip(toolCopyObject); _grfcust = fcustNil; break; default: Bug("Unknown command"); } return (fTrue); } /*************************************************************************** * * Handles the Cut, Copy, Paste and Clear commands. * * Parameters: * tool - The tool to apply. * * Returns: * fTrue if it processed the command, else fFalse. * **************************************************************************/ bool MVU::FDoClip(long tool) { AssertThis(0); PDOCB pdocb = pvNil; switch (tool) { case toolCutObject: case toolCopyObject: case toolCopyRte: // // copy the selection // if (!_FCopySel(&pdocb, tool == toolCopyRte)) { return fTrue; } vpclip->Set(pdocb); ReleasePpo(&pdocb); if (tool == toolCutObject) { _ClearSel(); } Pmvie()->Pmcc()->PlayUISound(tool); break; case toolPasteObject: if (!vpclip->FDocIsClip(pvNil)) { PTCLP ptclp; if (vpclip->FGetFormat(kclsTCLP, (PDOCB *)&ptclp)) { AssertPo(ptclp, 0); if (Pmvie()->Pscen() == pvNil) { ReleasePpo(&ptclp); return (fFalse); } if (ptclp->FPaste(Pmvie()->Pscen())) { ReleasePpo(&ptclp); Pmvie()->Pmcc()->EnableTboxTools(); Pmvie()->Pmcc()->PlayUISound(tool); return (fTrue); } ReleasePpo(&ptclp); Pmvie()->Pmcc()->PlayUISound(tool); return (fFalse); } else { _FPaste(vpclip); Pmvie()->Pmcc()->PlayUISound(tool); } } break; default: Bug("Bad Tool"); } return fTrue; } /*************************************************************************** * * Handles the Undo and Redo commands. * * Parameters: * pcmd - Pointer to the command to process. * * Returns: * fTrue if it processed the command, else fFalse. * **************************************************************************/ bool MVU::FCmdUndo(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); bool fRet; if (pcmd->cid == cidUndo) { Pmvie()->Pmcc()->PlayUISound(toolUndo); } else { Pmvie()->Pmcc()->PlayUISound(toolRedo); } fRet = MVU_PAR::FCmdUndo(pcmd); Pmvie()->Pmcc()->SetUndo(Pmvie()->CundbUndo() != 0 ? undoUndo : Pmvie()->CundbRedo() != 0 ? undoRedo : undoDisabled); Pmvie()->InvalViewsAndScb(); return (fRet); } /*************************************************************************** * * Handles the Copying whatever is currently selected. * * Don't worry about tboxes, because if a tbox is selected it will * get the cut/copy/paste command. * * Parameters: * ppdocb - Pointer to a place to store a pointer to the resulting docb. * fRteOnly - fTrue if to copy an actors route only, else fFalse. * * Returns: * fTrue if it was successful, else fFalse. * **************************************************************************/ bool MVU::_FCopySel(PDOCB *ppdocb, bool fRteOnly) { AssertThis(0); PACTR pactr; PACLP paclp; if (FTextMode()) { return (fFalse); } if (Pmvie()->Pscen() == pvNil) { return (fFalse); } pactr = Pmvie()->Pscen()->PactrSelected(); AssertNilOrPo(pactr, 0); if ((pactr == pvNil) || !pactr->FIsInView()) { PushErc(ercSocNoActrSelected); return (fFalse); } paclp = ACLP::PaclpNew(pactr, fRteOnly, FPure(_grfcust & fcustShift)); AssertNilOrPo(paclp, 0); *ppdocb = (PDOCB)paclp; return (paclp != pvNil); } /*************************************************************************** * * Handles the deleting whatever is currently selected. * * Don't worry about tboxes, because if a tbox is selected it will * get the cut/copy/paste command. * * Parameters: * None. * * Returns: * None. * **************************************************************************/ void MVU::_ClearSel() { AssertThis(0); PACTR pactr; bool fAlive; bool fEnableSounds; if (Pmvie()->Pscen() == pvNil) { return; } pactr = Pmvie()->Pscen()->PactrSelected(); if (pactr == pvNil) { PushErc(ercSocNoActrSelected); return; } AssertPo(pactr, 0); fEnableSounds = !(FPure(Pmvie()->Pscen()->GrfScen() & fscenSounds)); Pmvie()->Pscen()->Disable(fscenSounds); if (!pactr->FDelete(&fAlive, FPure(_grfcust & fcustShift))) { if (fEnableSounds) Pmvie()->Pscen()->Enable(fscenSounds); return; } if (fEnableSounds) Pmvie()->Pscen()->Enable(fscenSounds); if (!fAlive) { Pmvie()->Pscen()->RemActrCore(pactr->Arid()); } else { // // According to design, if this fails, it is // ok to leave the actor on the stage. // pactr->FRemFromStageCore(); } Pmvie()->Pscen()->MarkDirty(); Pmvie()->InvalViews(); } /*************************************************************************** * * Handles the Pasting whatever is currently in the clipboard. * * Don't worry about tboxes, because if a tbox is selected it will * get the cut/copy/paste command. * * Parameters: * pdocb - The pointer to the resulting docb. * * Returns: * fTrue if it was successful, else fFalse. * **************************************************************************/ bool MVU::_FPaste(PCLIP pclip) { AssertThis(0); AssertPo(pclip, 0); PACLP paclp; PTCLP ptclp; PACTR pactr; bool fRet; if (pclip->FGetFormat(kclsACLP, (PDOCB *)&paclp)) { AssertPo(paclp, 0); if (Pmvie()->Pscen() == pvNil) { PushErc(ercSocNoScene); return (fFalse); } if (paclp->FRouteOnly() && FTextMode()) { PushErc(ercSocCannotPasteThatHere); ReleasePpo(&paclp); return (fTrue); } pactr = Pmvie()->Pscen()->PactrSelected(); AssertNilOrPo(pactr, 0); if (paclp->FRouteOnly() && ((pactr == pvNil) || !pactr->FIsInView())) { PushErc(ercSocNoActrSelected); ReleasePpo(&paclp); return (fTrue); } fRet = paclp->FPaste(Pmvie()); ReleasePpo(&paclp); return fRet; } if (pclip->FGetFormat(kclsTCLP, (PDOCB *)&ptclp)) { AssertPo(ptclp, 0); if (Pmvie()->Pscen() == pvNil) { PushErc(ercSocNoScene); return (fFalse); } fRet = ptclp->FPaste(Pmvie()->Pscen()); ReleasePpo(&ptclp); return fRet; } PushErc(ercSocCannotPasteThatHere); return (fFalse); } /*************************************************************************** * * Handle a close command. * * Parameters: * fAssumeYes - Should the dialog assume yes. * * Returns: * fTrue if the client should close this document. * **************************************************************************/ bool MVU::FCloseDoc(bool fAssumeYes, bool fSaveDDG) { AssertThis(0); bool fRet; FNI fni; // // FQueryClose calls FAutosave depending on the result of the query. // FAutosave needs to know whether the doc is closing as unused user // sounds are to be deleted from the movie only upon close. // Pmvie()->SetDocClosing(fTrue); // If not dirty, flush snds on close without user query // Irrelevant if there are no user sounds in the movie or if // the file is read-only (can't save to the original file) if (!Pmvie()->FDirty() && Pmvie()->FUnusedSndsUser() && !Pmvie()->FReadOnly() && Pmvie()->FGetFni(&fni)) { vpappb->BeginLongOp(); fRet = _pdocb->FSave(); // Flush sounds goto LSaved; } if (Pmvie()->Cscen() > 0) { fRet = _pdocb->FQueryClose(fAssumeYes ? fdocAssumeYes : fdocNil); } else { fRet = fTrue; } vpappb->BeginLongOp(); LSaved: Pmvie()->SetDocClosing(fFalse); if (fRet && !fSaveDDG) { // Beware: the following line destroys the this pointer! _pdocb->CloseAllDdg(); } vpappb->EndLongOp(); return fRet; } /*************************************************************************** * * Handle a save, save as or save a copy command. * * Parameters: * pcmd - The command to process * * Returns: * fTrue. * **************************************************************************/ bool MVU::FCmdSave(PCMD pcmd) { if (Pmvie()->Cscen() < 1) { PushErc(ercSocSaveFailure); } else { _pdocb->FSave(pcmd->cid); } return fTrue; } /*************************************************************************** * * Note that we have had an idle loop. * * Parameters: * pcmd - Pointer to the command to process. * * Returns: * fFalse. * ***************************************************************************/ bool MVU::FCmdIdle(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); Pmvie()->SetFIdleSeen(fTrue); return (fFalse); } /*************************************************************************** * * Note that the mouse is no longer on the view. * * Parameters: * pcmd - Pointer to the command to process. * * Returns: * fFalse. * ***************************************************************************/ bool MVU::FCmdRollOff(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); if (_fMouseOn && (Tool() == toolListener)) { Pmvie()->Pmsq()->StopAll(); } _fMouseOn = fFalse; return (fFalse); } #ifdef DEBUG /*************************************************************************** * * Assert the validity of the MVU. * * Parameters: * grf - Bit field of options * * Returns: * None. * **************************************************************************/ void MVU::AssertValid(ulong grf) { MVU_PAR::AssertValid(fobjAllocated); } /*************************************************************************** * * Mark memory used by the MVU * * Parameters: * None. * * Returns: * None. * **************************************************************************/ void MVU::MarkMem(void) { AssertThis(0); MVU_PAR::MarkMem(); MarkMemObj(Pmvie()); } #endif // DEBUG // // // // UNDO STUFF // // // /**************************************************** * * Public constructor for movie undo objects for scene * related commands. * * Parameters: * None. * * Returns: * pvNil if failure, else a pointer to the movie undo. * ****************************************************/ PMUNS MUNS::PmunsNew() { PMUNS pmuns; pmuns = NewObj MUNS(); return (pmuns); } /**************************************************** * * Destructor for movies undo objects * ****************************************************/ MUNS::~MUNS(void) { AssertBaseThis(0); ReleasePpo(&_pscen); } /**************************************************** * * Does a command stored in an undo object. * * Parameters: * pdocb - The owning document. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool MUNS::FDo(PDOCB pdocb) { AssertThis(0); TAG tagOld; switch (_munst) { case munstInsScen: if (!_pmvie->FNewScenInsCore(_iscen)) { goto LFail; } if (!_pmvie->Pscen()->FSetBkgdCore(&_tag, &tagOld)) { _pmvie->FRemScenCore(_iscen); goto LFail; } _pmvie->Pmcc()->SceneUnnuked(); break; case munstRemScen: if (!_pmvie->FRemScenCore(_iscen)) { goto LFail; } _pmvie->Pmcc()->SceneNuked(); break; default: Bug("Unknown munst"); goto LFail; } _pmvie->Pmsq()->FlushMsq(); return (fTrue); LFail: _pmvie->Pmsq()->FlushMsq(); _pmvie->ClearUndo(); // After this, _pmvie is invalid return (fFalse); } /**************************************************** * * Undoes a command stored in an undo object. * * Parameters: * pdocb - The owning document. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool MUNS::FUndo(PDOCB pdocb) { AssertThis(0); switch (_munst) { case munstInsScen: if (!_pmvie->FRemScenCore(_iscen)) { goto LFail; } _pmvie->Pmcc()->SceneNuked(); break; case munstRemScen: if (!_pmvie->FInsScenCore(_iscen, _pscen)) { goto LFail; } _pmvie->Pmcc()->SceneUnnuked(); break; default: Bug("Unknown munst"); goto LFail; } _pmvie->Pmsq()->FlushMsq(); return (fTrue); LFail: _pmvie->Pmsq()->FlushMsq(); _pmvie->ClearUndo(); // After this, _pmvie is invalid return (fFalse); } #ifdef DEBUG /**************************************************** * Mark memory used by the MUNS * * Parameters: * None. * * Returns: * None. * ****************************************************/ void MUNS::MarkMem(void) { AssertThis(0); MUNS_PAR::MarkMem(); MarkMemObj(_pscen); } /*************************************************************************** * * Assert the validity of the MUNS. * * Parameters: * grf - Bit field of options * * Returns: * None. * **************************************************************************/ void MUNS::AssertValid(ulong grf) { AssertNilOrPo(_pscen, 0); } #endif // DEBUG #ifdef DEBUG /*************************************************************************** * * Assert the validity of the MUNB. * * Parameters: * grf - Bit field of options * * Returns: * None. * **************************************************************************/ void MUNB::AssertValid(ulong grf) { MUNB_PAR::AssertValid(fobjAllocated); AssertPo(_pmvie, 0); } #endif // DEBUG ================================================ FILE: src/engine/msnd.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** msnd.cpp: Movie Sound class Primary Authors: *****, ***** Status: Reviewed A MSND (movie sound) owns a MIDI or WAVE child chunk, and also specifies what sound type (sty) this sound is, and the default volume for the sound. Here's how the chunks look: MSND | +---MIDI or WAVE (chid 0) // actual sound data An MSND chunk with no child is a "no sound" or silent sound. An MSND chunk with _fInvalid set requires no child. ***************************************************************************/ #include "soc.h" #include "audioman.h" ASSERTNAME RTCLASS(MSND) RTCLASS(MSQ) BEGIN_CMD_MAP(MSQ, CMH) ON_CID_ME(cidAlarm, &MSQ::FCmdAlarm, pvNil) END_CMD_MAP_NIL() // default sound import format const WORD knSamplesPerSec = 11025; const WORD knAvgBytesPerSec = 11025; const WORD kwBitsPerSample = 8; const WORD knChannels = 1; const WORD knBlockAlign = 1; /*************************************************************************** A PFNRPO to read a MSND from a file ***************************************************************************/ bool MSND::FReadMsnd(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb) { AssertPo(pcrf, 0); AssertPo(pblck, 0); AssertNilOrVarMem(ppbaco); AssertVarMem(pcb); MSND *pmsnd; *pcb = size(MSND); // estimate MSND size if (pvNil == ppbaco) return fTrue; pmsnd = NewObj MSND(); if (pvNil == pmsnd || !pmsnd->_FInit(pcrf->Pcfl(), ctg, cno)) { TrashVar(ppbaco); TrashVar(pcb); ReleasePpo(&pmsnd); return fFalse; } pmsnd->_prca = pcrf; AssertPo(pmsnd, 0); *ppbaco = pmsnd; return fTrue; } /*************************************************************************** Retrieve information contained in the msnd chunk ***************************************************************************/ bool MSND::FGetMsndInfo(PCFL pcfl, CTG ctg, CNO cno, bool *pfInvalid, long *psty, long *pvlm) { AssertPo(pcfl, 0); PMSND pmsnd; pmsnd = NewObj MSND(); if (pvNil == pmsnd) return pvNil; if (!pmsnd->_FInit(pcfl, ctg, cno)) { ReleasePpo(&pmsnd); return fFalse; } if (pvNil != pfInvalid) *pfInvalid = pmsnd->_fInvalid; if (pvNil != psty) *psty = pmsnd->_sty; if (pvNil != pvlm) *pvlm = pmsnd->_vlm; ReleasePpo(&pmsnd); return fTrue; } /*************************************************************************** Init a MSND from the given chunk of the given CFL ***************************************************************************/ bool MSND::_FInit(PCFL pcfl, CTG ctg, CNO cno) { AssertBaseThis(0); AssertPo(pcfl, 0); BLCK blck; MSNDF msndf; KID kid; if (!pcfl->FFind(ctg, cno, &blck) || !blck.FUnpackData()) goto LFail; if (blck.Cb() > size(MSNDF)) goto LFail; if (!blck.FReadRgb(&msndf, size(MSNDF), 0)) goto LFail; if (kboCur != msndf.bo) SwapBytesBom(&msndf, kbomBkgdf); Assert(kboCur == msndf.bo, "bad MSNDF"); if (!pcfl->FGetName(ctg, cno, &_stn)) return fFalse; _sty = msndf.sty; _vlm = msndf.vlmDefault; _fInvalid = msndf.fInvalid; if (_fInvalid) return fTrue; // If there is a SND child, it is not a "no sound" if (pcfl->FGetKidChid(ctg, cno, kchidSnd, &kid)) { _cnoSnd = kid.cki.cno; _ctgSnd = kid.cki.ctg; _fNoSound = tribool::tNo; } else _fNoSound = tribool::tYes; return fTrue; LFail: return fFalse; } /*************************************************************************** Write an MSND MIDI chunk to file *pcfl ie, write the MSND chunk, its name, and the midi child ***************************************************************************/ bool MSND::FWriteMidi(PCFL pcflDest, PMIDS pmids, STN *pstnName, CNO *pcno) { AssertPo(pcflDest, 0); AssertPo(pmids, 0); AssertVarMem(pstnName); AssertVarMem(pcno); MSNDF msndf; BLCK blck; CNO cno; msndf.bo = kboCur; msndf.osk = koskCur; msndf.sty = styMidi; msndf.vlmDefault = kvlmFull; msndf.fInvalid = fFalse; // Create the msnd chunk if (!pcflDest->FAddPv(&msndf, size(MSNDF), kctgMsnd, pcno)) return fFalse; // Create the midi chunk as a child of the msnd chunk if (!pcflDest->FAddChild(kctgMsnd, *pcno, kchidSnd, pmids->CbOnFile(), kctgMidi, &cno, &blck)) goto LFail; if (!pmids->FWrite(&blck)) goto LFail; if (!pcflDest->FSetName(kctgMsnd, *pcno, pstnName)) goto LFail; return fTrue; LFail: pcflDest->Delete(kctgMsnd, *pcno); // Deletes the midi chunk also return fFalse; } /*************************************************************************** Write an MSND Wave file to a file ie, write the MSND chunk, its name, and the midi child ***************************************************************************/ bool MSND::FWriteWave(PFIL pfilSrc, PCFL pcflDest, long sty, STN *pstnName, CNO *pcno) { AssertPo(pfilSrc, 0); AssertIn(sty, 0, styLim); AssertVarMem(pstnName); AssertVarMem(pcno); MSNDF msndf; CNO cno; FLO floSrc; FLO floDest; msndf.bo = kboCur; msndf.osk = koskCur; msndf.sty = sty; msndf.vlmDefault = kvlmFull; msndf.fInvalid = fFalse; floSrc.pfil = pfilSrc; floSrc.cb = pfilSrc->FpMac(); floSrc.fp = 0; // Create the msnd chunk if (!pcflDest->FAddPv(&msndf, size(MSNDF), kctgMsnd, pcno)) return fFalse; // Create the wave chunk as a child of the msnd chunk if (!pcflDest->FAddChild(kctgMsnd, *pcno, kchidSnd, floSrc.cb, kctgWave, &cno)) goto LFail; if (!pcflDest->FFindFlo(kctgWave, cno, &floDest)) goto LFail; if (!floSrc.FCopy(&floDest)) goto LFail; if (!pcflDest->FSetName(kctgMsnd, *pcno, pstnName)) goto LFail; return fTrue; LFail: pcflDest->Delete(kctgMsnd, *pcno); // Deletes the wave chunk also return fFalse; } /*************************************************************************** Copy the midi file to a chunk in the current movie The *pcno is returned ***************************************************************************/ bool MSND::FCopyMidi(PFIL pfilSrc, PCFL pcflDest, CNO *pcno, PSTN pstn) { AssertPo(pfilSrc, 0); AssertNilOrPo(pstn, 0); PMIDS pmids = pvNil; FNI fniSrc; STN stnName; pfilSrc->GetFni(&fniSrc); if (pvNil == pstn) fniSrc.GetLeaf(&stnName); else stnName = *pstn; pmids = MIDS::PmidsReadNative(&fniSrc); if (pmids == pvNil) { PushErc(ercSocBadSoundFile); goto LFail; } // Create the chunk & write it to this movie // Adopt it later as a child of kctgMvie if (!MSND::FWriteMidi(pcflDest, pmids, &stnName, pcno)) goto LFail; ReleasePpo(&pmids); return fTrue; LFail: ReleasePpo(&pmids); return fFalse; } /*************************************************************************** Copy the wave file to a chunk in the current movie ***************************************************************************/ bool MSND::FCopyWave(PFIL pfilSrc, PCFL pcflDest, long sty, CNO *pcno, PSTN pstn) { AssertPo(pfilSrc, 0); AssertPo(pcflDest, 0); AssertIn(sty, 0, styLim); AssertVarMem(pcno); Assert(sty != styMidi, "Illegal sty argument"); AssertNilOrPo(pstn, 0); FNI fniSrc; STN stnName; // sound name STN stn; // src file path name WAVEFORMATEX wfxSrc; LPSOUND psnd = pvNil; LPSOUND psndTemp = pvNil; FIL *pfilNew = pvNil; STN stnNew; FNI fniNew; WAVEFORMATEX *pwfxDst = pvNil; DWORD cbwfx; // size of waveformatex needed DWORD csampSrc; // number of source samples DWORD cbSrc; // size of source in bytes LPBYTE pbSrc = pvNil; // src data buffer DWORD cbDst; // size of dest in bytes LPBYTE pbDst = pvNil; // dst data buffer HACMSTREAM hacmstream = pvNil; ACMSTREAMHEADER acmhdr; DWORD dwTag; DWORD dwLength; long cbOriginalFile = 0; long cbCompressedFile = 0; FP fpNew; pfilSrc->GetFni(&fniSrc); if (pvNil == pstn) fniSrc.GetLeaf(&stnName); else stnName = *pstn; fniSrc.GetStnPath(&stn); if (!fniNew.FGetTemp()) goto LFail; // get the original file size if (pvNil == (pfilNew = FIL::PfilOpen(&fniSrc))) goto LFailPushError; cbOriginalFile = pfilNew->FpMac(); ReleasePpo(&pfilNew); // open the file as a pSound if (FAILED(AllocSoundFromFile(&psnd, stn.Psz(), 0, fTrue, pvNil))) goto LFailPushError; if (FAILED(psnd->GetFormat((LPWAVEFORMATEX)&wfxSrc, size(WAVEFORMATEX)))) goto LFailPushError; // if the file format is not 11M8, then create a converter to 11M8 if ((wfxSrc.nSamplesPerSec != knSamplesPerSec) || (wfxSrc.wBitsPerSample != kwBitsPerSample) || (wfxSrc.nChannels != knChannels)) { // Convert the wave import to 3mm's 11M8 wfxSrc.nSamplesPerSec = knSamplesPerSec; wfxSrc.nAvgBytesPerSec = knAvgBytesPerSec; wfxSrc.wBitsPerSample = kwBitsPerSample; wfxSrc.nChannels = knChannels; wfxSrc.nBlockAlign = knBlockAlign; if (FAILED(AllocConvertFilter(&psndTemp, psnd, (LPWAVEFORMATEX)&wfxSrc))) goto LFailPushError; ReleasePpo(&psnd); psnd = psndTemp; psndTemp = pvNil; } // now figure out how many total samples there are csampSrc = psnd->GetSamples(); if (csampSrc == -1) // Don't allow infinite sources to be written goto LFailPushError; cbSrc = csampSrc * (wfxSrc.wBitsPerSample >> 3) * wfxSrc.nChannels; if (FAILED(psnd->SetMode(TRUE, TRUE))) // Activate the Sound Audio Stream goto LFailPushError; // allocate a buffer big enough to hold them all if (!FAllocPv((LPVOID *)&pbSrc, cbSrc, fmemNil, mprNormal)) goto LFail; // get all of the samples if (FAILED(psnd->GetSampleData(pbSrc, 0, &csampSrc, NULL))) goto LFailPushError; // ------------------------------------- // inplace compress the samples to ADPCM // figure out the correct size for dest waveformatex (so we get the codec info) if (acmMetrics(NULL, ACM_METRIC_MAX_SIZE_FORMAT, &cbwfx)) goto LFailPushError; // allocate a buffer of this size if (!FAllocPv((LPVOID *)&pwfxDst, cbwfx, fmemNil, mprNormal)) goto LFail; // allocate a destination buffer big enough to hold them all cbDst = cbSrc; if (!FAllocPv((LPVOID *)&pbDst, cbDst, fmemNil, mprNormal)) goto LFail; // set up the dest wfx pwfxDst->wFormatTag = WAVE_FORMAT_ADPCM; pwfxDst->nChannels = knChannels; pwfxDst->nSamplesPerSec = knSamplesPerSec; // pwfxDst->wBitsPerSample, pwfxDst->nAvgBytesPerSec, and // pwfxDst->nBlockAlign are calced by the acmFormatSuggest() pwfxDst->cbSize = (WORD)cbwfx - sizeof(WAVEFORMATEX); // fill in the coeffiecients in the destination WFX by calling acmFormatSuggest if (acmFormatSuggest(NULL, &wfxSrc, pwfxDst, cbwfx, ACM_FORMATSUGGESTF_WFORMATTAG | ACM_FORMATSUGGESTF_NCHANNELS | ACM_FORMATSUGGESTF_NSAMPLESPERSEC)) goto LFailPushError; // open convert stream if (acmStreamOpen(&hacmstream, NULL, &wfxSrc, pwfxDst, NULL, 0, 0, ACM_STREAMOPENF_NONREALTIME)) goto LFailPushError; acmhdr.cbStruct = sizeof(ACMSTREAMHEADER); acmhdr.fdwStatus = 0; acmhdr.dwUser = 0; acmhdr.pbSrc = pbSrc; acmhdr.cbSrcLength = cbSrc; acmhdr.cbSrcLengthUsed = 0; acmhdr.dwSrcUser = 0; acmhdr.pbDst = pbDst; acmhdr.cbDstLength = cbDst; acmhdr.cbDstLengthUsed = 0; acmhdr.dwDstUser = 0; // prep acm convert header if (acmStreamPrepareHeader(hacmstream, &acmhdr, NULL)) goto LFailPushError; // now convert if (acmStreamConvert(hacmstream, &acmhdr, ACM_STREAMCONVERTF_END)) goto LFailPushError; // unprep header if (acmStreamUnprepareHeader(hacmstream, &acmhdr, NULL)) goto LFailPushError; // close stream acmStreamClose(hacmstream, NULL); hacmstream = pvNil; // OK, now we have the sound file converted in memory, write out the data file... // open file pfilNew = FIL::PfilCreate(&fniNew); if (pvNil == pfilNew) goto LFail; fpNew = 0; // write out 'riff' header dwTag = RIFF_TAG; if (!pfilNew->FWriteRgbSeq(&dwTag, sizeof(dwTag), &fpNew)) goto LFail; cbCompressedFile = sizeof(RIFF) + pwfxDst->cbSize + 12 - 8 + acmhdr.cbDstLengthUsed; // +12 is for fact chunk chunk, -8 for is riff chunk dwLength = cbCompressedFile; if (!pfilNew->FWriteRgbSeq(&dwLength, sizeof(dwLength), &fpNew)) goto LFail; // write WAVE tag dwTag = WAVE_TAG; if (!pfilNew->FWriteRgbSeq(&dwTag, sizeof(dwTag), &fpNew)) goto LFail; // write out 'fmt ' dwTag = FMT__TAG; if (!pfilNew->FWriteRgbSeq(&dwTag, sizeof(dwTag), &fpNew)) goto LFail; dwLength = sizeof(WAVEFORMATEX) + pwfxDst->cbSize; if (!pfilNew->FWriteRgbSeq(&dwLength, sizeof(dwLength), &fpNew)) goto LFail; if (!pfilNew->FWriteRgbSeq(pwfxDst, dwLength, &fpNew)) goto LFail; // write out 'fact' dwTag = FACT_TAG; if (!pfilNew->FWriteRgbSeq(&dwTag, sizeof(dwTag), &fpNew)) goto LFail; dwLength = sizeof(DWORD); if (!pfilNew->FWriteRgbSeq(&dwLength, sizeof(dwLength), &fpNew)) goto LFail; dwLength = csampSrc; if (!pfilNew->FWriteRgbSeq(&dwLength, sizeof(dwLength), &fpNew)) goto LFail; // write out 'data' dwTag = DATA_TAG; if (!pfilNew->FWriteRgbSeq(&dwTag, sizeof(dwTag), &fpNew)) goto LFail; dwLength = acmhdr.cbDstLengthUsed; if (!pfilNew->FWriteRgbSeq(&dwLength, sizeof(dwLength), &fpNew)) goto LFail; if (!pfilNew->FWriteRgbSeq(pbDst, dwLength, &fpNew)) goto LFail; // clean up conversion FreePpv((LPVOID *)&pwfxDst); // free up destination waveformat FreePpv((LPVOID *)&pbSrc); // free convert src buffer FreePpv((LPVOID *)&pbDst); // free convert dest buffer ReleasePpo(&pfilNew); // release open file if (psnd) psnd->SetMode(FALSE, TRUE); ReleasePpo(&psnd); // release sound // ------------------------------------------------------------------- // Copy the original or converted file to a chunk in the current movie // if the compressed file is larger then the original if (cbCompressedFile > cbOriginalFile) { // then just use original file if (pvNil == (pfilNew = FIL::PfilOpen(&fniSrc))) goto LFail; } else { // then we use the newly compressed file if (pvNil == (pfilNew = FIL::PfilOpen(&fniNew))) goto LFail; } if (!MSND::FWriteWave(pfilNew, pcflDest, sty, &stnName, pcno)) goto LFail; ReleasePpo(&pfilNew); if (tYes == fniNew.TExists()) fniNew.FDelete(); return fTrue; LFailPushError: PushErc(ercSocBadSoundFile); LFail: if (hacmstream) { acmStreamClose(hacmstream, NULL); hacmstream = pvNil; } if (psnd) psnd->SetMode(FALSE, TRUE); FreePpv((LPVOID *)&pwfxDst); // free dest waveformatex struct FreePpv((LPVOID *)&pbSrc); // free convert src buffer FreePpv((LPVOID *)&pbDst); // free convert dest buffer ReleasePpo(&pfilNew); ReleasePpo(&psnd); if (tYes == fniNew.TExists()) fniNew.FDelete(); return fFalse; } /*************************************************************************** Invalidate a sound ***************************************************************************/ bool MSND::FInvalidate(void) { AssertThis(0); KID kid; MSNDF msndf; // Invalidate the msnd on file if (!Pcrf()->Pcfl()->FGetKidChid(kctgMsnd, Cno(), kchidSnd, &kid)) return fFalse; msndf.bo = kboCur; msndf.osk = koskCur; msndf.sty = _sty; msndf.vlmDefault = _vlm; msndf.fInvalid = fTrue; if (!Pcrf()->Pcfl()->FPutPv(&msndf, size(MSNDF), Ctg(), Cno())) return fFalse; Pcrf()->Pcfl()->DeleteChild(Ctg(), Cno(), kid.cki.ctg, kid.cki.cno); // Invalidate the cache representation _fInvalid = fTrue; return fTrue; } /*************************************************************************** Clean up and delete this movie sound ***************************************************************************/ MSND::~MSND(void) { AssertBaseThis(0); } /*************************************************************************** Return the sqn for an msnd attached to an actor object of id == objid Static function ***************************************************************************/ long MSND::SqnActr(long sty, long objid) { AssertIn(sty, 0, styLim); long sqnsty = sty << ksqnStyShift; return (sqnActr | sqnsty | SwLow(objid)); } /*************************************************************************** Return the sqn for an msnd attached to an actor object of id == objid Static function ***************************************************************************/ long MSND::SqnBkgd(long sty, long objid) { long sqnsty = sty << ksqnStyShift; return (sqnBkgd | sqnsty | SwLow(objid)); } /*************************************************************************** Return the priority for a tool,sty combination ***************************************************************************/ long MSND::Spr(long tool) { AssertThis(0); Assert(tool == toolMatcher || tool == toolSounder || tool == toolLooper, "Invalid tool"); switch (_sty) { case styMidi: Assert(tool != toolMatcher, "No midi motion matching"); return 1; break; case stySpeech: if (tool == toolSounder) return 1; if (tool == toolMatcher) return 5; return 3; break; case stySfx: if (tool == toolSounder) return 2; if (tool == toolMatcher) return 6; return 4; default: Assert(0, "Invalid sty in MSND: Spr"); } return 0; } /*************************************************************************** Play this sound ***************************************************************************/ void MSND::Play(long objID, bool fLoop, bool fQueue, long vlm, long spr, bool fActr, ulong dtsStart) { AssertThis(0); long cactRepeat; long sqn; // sound queue long scl; // sound class long sii{}; static long _siiLastMidi; static CTG _ctgLastMidi; static CNO _cnoLastMidi; if (_fInvalid) return; sqn = fActr ? SqnActr(objID) : SqnBkgd(objID); cactRepeat = fLoop ? klwMax : 1; scl = Scl(fLoop); if (_sty == styMidi && _ctgSnd == _ctgLastMidi && _cnoSnd == _cnoLastMidi && vpsndm->FPlaying(_siiLastMidi)) { // Don't restart midi if the same sound is still playing return; } if (!fQueue || _fNoSound) vpsndm->StopAll(sqn, sclNil); if (!_fNoSound) { sii = vpsndm->SiiPlay(_prca, _ctgSnd, _cnoSnd, sqn, vlm, cactRepeat, dtsStart, spr, scl); } if (_sty == styMidi) { _siiLastMidi = sii; _ctgLastMidi = _ctgSnd; _cnoLastMidi = _cnoSnd; } } /*************************************************************************** New MSQ ***************************************************************************/ PMSQ MSQ::PmsqNew(void) { PMSQ pmsq; if (pvNil == (pmsq = NewObj MSQ(khidMsq))) return pvNil; if (pvNil == (pmsq->_pglsqe = GL::PglNew(size(SQE), kcsqeGrow))) { ReleasePpo(&pmsq); return pvNil; } if (pvNil == (pmsq->_pclok = NewObj CLOK(khidMsqClock))) { ReleasePpo(&pmsq); return pvNil; } pmsq->_dtim = kdtim2Msq; return pmsq; } /*************************************************************************** Enqueue a sound in the MSQ. Overwrites sounds of the same type. ***************************************************************************/ bool MSQ::FEnqueue(PMSND pmsnd, long objID, bool fLoop, bool fQueue, long vlm, long spr, bool fActr, ulong dtsStart, bool fLowPri) { AssertThis(0); AssertPo(pmsnd, 0); SQE sqe; SQE *psqe; long sqn; long sqnT; long isqe; if (_dtim == kdtimOffMsq) return fTrue; sqn = fActr ? MSND::SqnActr(pmsnd->Sty(), objID) : MSND::SqnBkgd(pmsnd->Sty(), objID); if (!fQueue) for (isqe = 0; isqe < _pglsqe->IvMac(); isqe++) { psqe = (SQE *)_pglsqe->QvGet(isqe); sqnT = psqe->fActr ? MSND::SqnActr(psqe->pmsnd->Sty(), psqe->objID) : MSND::SqnBkgd(psqe->pmsnd->Sty(), psqe->objID); if (sqnT == sqn) { if (fLowPri) return fTrue; // Nothing to enqueue; same type already taken // Hi priority. Get rid of lower priority sound. ReleasePpo(&psqe->pmsnd); _pglsqe->Delete(isqe); break; } } sqe.pmsnd = pmsnd; pmsnd->AddRef(); sqe.objID = objID; sqe.fLoop = fLoop; sqe.fQueue = fQueue; sqe.vlmMod = vlm; sqe.spr = spr; sqe.fActr = fActr; sqe.dtsStart = dtsStart; if (fLowPri) { if (!_pglsqe->FPush(&sqe)) { ReleasePpo(&sqe.pmsnd); return fFalse; } } else if (!_pglsqe->FEnqueue(&sqe)) { ReleasePpo(&sqe.pmsnd); return fFalse; } return fTrue; } /*************************************************************************** Dequeue and Play the MSQ sounds If _dtim == kdtimOff, empty the queue ***************************************************************************/ void MSQ::PlayMsq(void) { AssertThis(0); SQE sqe; if (_pglsqe->IvMac() == 0) return; if (_dtim == kdtimOffMsq) { FlushMsq(); return; } if (0 < _pglsqe->IvMac()) { vpsndm->BeginSynch(); while (_pglsqe->FDequeue(&sqe)) { sqe.pmsnd->Play(sqe.objID, sqe.fLoop, sqe.fQueue, sqe.vlmMod, sqe.spr, sqe.fActr, sqe.dtsStart); ReleasePpo(&sqe.pmsnd); } vpsndm->EndSynch(); } if (_dtim < kdtimLongMsq) { _pclok->Start(0); if (!_pclok->FSetAlarm(_dtim, this)) { StopAll(); return; } } return; } /*************************************************************************** Flush Queue - without playing the sounds ***************************************************************************/ void MSQ::FlushMsq(void) { AssertThis(0); SQE sqe; while (_pglsqe->FDequeue(&sqe)) { ReleasePpo(&sqe.pmsnd); } } /*************************************************************************** FCmdAlarm - Timeout has elapsed. Stop all sounds ***************************************************************************/ bool MSQ::FCmdAlarm(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); _pclok->Stop(); StopAll(); return fTrue; } /*************************************************************************** Clean up and delete this movie sound queue ***************************************************************************/ MSQ::~MSQ(void) { AssertBaseThis(0); StopAll(); FlushMsq(); ReleasePpo(&_pglsqe); ReleasePpo(&_pclok); } #ifdef DEBUG /*************************************************************************** Assert the validity of the MSND. ***************************************************************************/ void MSND::AssertValid(ulong grf) { MSND_PAR::AssertValid(fobjAllocated); AssertNilOrPo(_prca, 0); AssertIn(_sty, 0, styLim); } /*************************************************************************** Mark memory used by the MSND ***************************************************************************/ void MSND::MarkMem(void) { AssertThis(0); MSND_PAR::MarkMem(); // Note: don't mark _prca, because _prca marks us, and would cause // an infinite recursive loop. } /*************************************************************************** Assert the validity of the MSQ. ***************************************************************************/ void MSQ::AssertValid(ulong grf) { MSQ_PAR::AssertValid(fobjAllocated); AssertPo(_pglsqe, 0); AssertPo(_pclok, 0); } /*************************************************************************** Mark memory used by the MSND ***************************************************************************/ void MSQ::MarkMem(void) { AssertThis(0); MSQ_PAR::MarkMem(); MarkMemObj(_pglsqe); MarkMemObj(_pclok); } #endif // DEBUG ================================================ FILE: src/engine/mtrl.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** mtrl.cpp: Material (MTRL) and custom material (CMTL) classes Primary Author: ****** Review Status: REVIEWED - any changes to this file must be reviewed! ***************************************************************************/ #include "soc.h" ASSERTNAME RTCLASS(MTRL) RTCLASS(CMTL) // REVIEW *****: kiclrBaseDefault and kcclrDefault are palette-specific const byte kiclrBaseDefault = 15; // base index of default color const byte kcclrDefault = 15; // count of shades in default color const br_ufraction kbrufKaDefault = BR_UFRACTION(0.10); const br_ufraction kbrufKdDefault = BR_UFRACTION(0.60); const br_ufraction kbrufKsDefault = BR_UFRACTION(0.60); const BRS krPowerDefault = BR_SCALAR(50); const byte kbOpaque = 0xff; PTMAP MTRL::_ptmapShadeTable = pvNil; // shade table for all MTRLs /*************************************************************************** Call this function to assign the global shade table. It is read from the given chunk. ***************************************************************************/ bool MTRL::FSetShadeTable(PCFL pcfl, CTG ctg, CNO cno) { AssertPo(pcfl, 0); ReleasePpo(&_ptmapShadeTable); _ptmapShadeTable = TMAP::PtmapRead(pcfl, ctg, cno); return (pvNil != _ptmapShadeTable); } /*************************************************************************** Create a new solid-color material ***************************************************************************/ PMTRL MTRL::PmtrlNew(long iclrBase, long cclr) { if (ivNil != iclrBase) AssertIn(iclrBase, 0, kbMax); if (ivNil != cclr) AssertIn(cclr, 0, kbMax - iclrBase); PMTRL pmtrl; pmtrl = NewObj MTRL; if (pvNil == pmtrl) return pvNil; // An arbitrary 4-character string is passed to BrMaterialAllocate (to // be stored in a string pointed to by _pbmtl->identifier). The // contents of the string are then replaced by the "this" pointer. pmtrl->_pbmtl = BrMaterialAllocate("1234"); if (pvNil == pmtrl->_pbmtl) { ReleasePpo(&pmtrl); return pvNil; } CopyPb(&pmtrl, pmtrl->_pbmtl->identifier, size(long)); pmtrl->_pbmtl->ka = kbrufKaDefault; pmtrl->_pbmtl->kd = kbrufKdDefault; pmtrl->_pbmtl->ks = kbrufKsDefault; pmtrl->_pbmtl->power = krPowerDefault; if (ivNil == iclrBase) pmtrl->_pbmtl->index_base = kiclrBaseDefault; else pmtrl->_pbmtl->index_base = (byte)iclrBase; if (ivNil == cclr) pmtrl->_pbmtl->index_range = kcclrDefault; else pmtrl->_pbmtl->index_range = (byte)cclr; pmtrl->_pbmtl->opacity = kbOpaque; // all socrates objects are opaque pmtrl->_pbmtl->flags = BR_MATF_LIGHT | BR_MATF_GOURAUD; BrMaterialAdd(pmtrl->_pbmtl); AssertPo(pmtrl, 0); return pmtrl; } /*************************************************************************** A PFNRPO to read MTRL objects. ***************************************************************************/ bool MTRL::FReadMtrl(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb) { AssertPo(pcrf, 0); AssertPo(pblck, 0); AssertNilOrVarMem(ppbaco); AssertVarMem(pcb); PMTRL pmtrl; *pcb = size(MTRL); if (pvNil == ppbaco) return fTrue; pmtrl = NewObj MTRL; if (pvNil == pmtrl || !pmtrl->_FInit(pcrf, ctg, cno)) { TrashVar(ppbaco); TrashVar(pcb); ReleasePpo(&pmtrl); return fFalse; } AssertPo(pmtrl, 0); *ppbaco = pmtrl; return fTrue; } /*************************************************************************** Read the given MTRL chunk from file ***************************************************************************/ bool MTRL::_FInit(PCRF pcrf, CTG ctg, CNO cno) { AssertBaseThis(0); AssertPo(pcrf, 0); PCFL pcfl = pcrf->Pcfl(); BLCK blck; MTRLF mtrlf; KID kid; MTRL *pmtrlThis = this; // to get MTRL from BMTL PTMAP ptmap = pvNil; if (!pcfl->FFind(ctg, cno, &blck) || !blck.FUnpackData()) return fFalse; if (blck.Cb() < size(MTRLF)) return fFalse; if (!blck.FReadRgb(&mtrlf, size(MTRLF), 0)) return fFalse; if (kboOther == mtrlf.bo) SwapBytesBom(&mtrlf, kbomMtrlf); Assert(kboCur == mtrlf.bo, "bad MTRLF"); // An arbitrary 4-character string is passed to BrMaterialAllocate (to // be stored in a string pointed to by _pbmtl->identifier). The // contents of the string are then replaced by the "this" pointer. _pbmtl = BrMaterialAllocate("1234"); if (pvNil == _pbmtl) return fFalse; CopyPb(&pmtrlThis, _pbmtl->identifier, size(long)); _pbmtl->colour = mtrlf.brc; _pbmtl->ka = mtrlf.brufKa; _pbmtl->kd = mtrlf.brufKd; // Note: for socrates, mtrlf.brufKs should be zero _pbmtl->ks = mtrlf.brufKs; _pbmtl->power = mtrlf.rPower; _pbmtl->index_base = mtrlf.bIndexBase; _pbmtl->index_range = mtrlf.cIndexRange; _pbmtl->opacity = kbOpaque; // all socrates objects are opaque // REVIEW *****: also set the BR_MATF_PRELIT flag to use prelit models _pbmtl->flags = BR_MATF_LIGHT | BR_MATF_SMOOTH; // now read texture map, if any if (pcfl->FGetKidChidCtg(ctg, cno, 0, kctgTmap, &kid)) { ptmap = (PTMAP)pcrf->PbacoFetch(kid.cki.ctg, kid.cki.cno, TMAP::FReadTmap); if (pvNil == ptmap) return fFalse; _pbmtl->colour_map = ptmap->Pbpmp(); Assert((PTMAP)_pbmtl->colour_map->identifier == ptmap, "lost tmap!"); AssertPo(_ptmapShadeTable, 0); _pbmtl->index_shade = _ptmapShadeTable->Pbpmp(); _pbmtl->flags |= BR_MATF_MAP_COLOUR; _pbmtl->index_base = 0; _pbmtl->index_range = _ptmapShadeTable->Pbpmp()->height - 1; /* Look for a texture transform for the MTRL */ if (pcfl->FGetKidChidCtg(ctg, cno, 0, kctgTxxf, &kid)) { TXXFF txxff; if (!pcfl->FFind(kid.cki.ctg, kid.cki.cno, &blck) || !blck.FUnpackData()) goto LFail; if (blck.Cb() < size(TXXFF)) goto LFail; if (!blck.FReadRgb(&txxff, size(TXXFF), 0)) goto LFail; if (kboCur != txxff.bo) SwapBytesBom(&txxff, kbomTxxff); Assert(kboCur == txxff.bo, "bad TXXFF"); _pbmtl->map_transform = txxff.bmat23; } } BrMaterialAdd(_pbmtl); AssertThis(0); return fTrue; LFail: /* REVIEW ***** (peted): Only the code that I added uses this LFail case. It's my opinion that any API which can fail should clean up after itself. It happens that in the case of this MTRL class, when the caller releases this instance, the TMAP and BMTL are freed anyway, but I don't think that it's good to count on that */ ReleasePpo(&ptmap); _pbmtl->colour_map = pvNil; BrMaterialFree(_pbmtl); _pbmtl = pvNil; return fFalse; } /*************************************************************************** Read a PIX and build a PMTRL from it ***************************************************************************/ PMTRL MTRL::PmtrlNewFromPix(PFNI pfni) { AssertPo(pfni, ffniFile); STN stn; PMTRL pmtrl; PBMTL pbmtl; PTMAP ptmap; pmtrl = NewObj MTRL; if (pvNil == pmtrl) goto LFail; // An arbitrary 4-character string is passed to BrMaterialAllocate (to // be stored in a string pointed to by _pbmtl->identifier). The // contents of the string are then replaced by the "this" pointer. pmtrl->_pbmtl = BrMaterialAllocate("1234"); if (pvNil == pmtrl->_pbmtl) goto LFail; pbmtl = pmtrl->_pbmtl; CopyPb(&pmtrl, pbmtl->identifier, size(long)); pbmtl->colour = 0; // this field is ignored pbmtl->ka = kbrufKaDefault; pbmtl->kd = kbrufKdDefault; pbmtl->ks = kbrufKsDefault; pbmtl->power = krPowerDefault; pbmtl->opacity = kbOpaque; // all socrates objects are opaque pbmtl->flags = BR_MATF_LIGHT | BR_MATF_GOURAUD; pfni->GetStnPath(&stn); pbmtl->colour_map = BrPixelmapLoad(stn.Psz()); if (pvNil == pbmtl->colour_map) goto LFail; // Create a TMAP for this BPMP. We don't directly save // the ptmap...it's automagically attached to the // BPMP's identifier. ptmap = TMAP::PtmapNewFromBpmp(pbmtl->colour_map); if (pvNil == ptmap) { BrPixelmapFree(pbmtl->colour_map); goto LFail; } Assert((PTMAP)pbmtl->colour_map->identifier == ptmap, "lost our TMAP!"); AssertPo(_ptmapShadeTable, 0); pbmtl->index_shade = _ptmapShadeTable->Pbpmp(); pbmtl->flags |= BR_MATF_MAP_COLOUR; pbmtl->index_base = 0; pbmtl->index_range = _ptmapShadeTable->Pbpmp()->height - 1; AssertPo(pmtrl, 0); return pmtrl; LFail: ReleasePpo(&pmtrl); return pvNil; } /*************************************************************************** Read a BMP and build a PMTRL from it ***************************************************************************/ PMTRL MTRL::PmtrlNewFromBmp(PFNI pfni, PGL pglclr) { AssertPo(pfni, ffniFile); AssertPo(_ptmapShadeTable, 0); PMTRL pmtrl; PTMAP ptmap; pmtrl = PmtrlNew(); if (pvNil == pmtrl) return pvNil; ptmap = TMAP::PtmapReadNative(pfni, pglclr); if (pvNil == ptmap) { ReleasePpo(&pmtrl); return pvNil; } pmtrl->_pbmtl->index_base = 0; pmtrl->_pbmtl->index_range = _ptmapShadeTable->Pbpmp()->height - 1; pmtrl->_pbmtl->index_shade = _ptmapShadeTable->Pbpmp(); pmtrl->_pbmtl->flags |= BR_MATF_MAP_COLOUR; pmtrl->_pbmtl->colour_map = ptmap->Pbpmp(); // The reference for ptmap has been transfered to pmtrl by the previous // line, so I don't need to ReleasePpo(&ptmap) in this function. return pmtrl; } /*************************************************************************** Return a pointer to the MTRL that owns this BMTL ***************************************************************************/ PMTRL MTRL::PmtrlFromBmtl(PBMTL pbmtl) { AssertVarMem(pbmtl); PMTRL pmtrl = (PMTRL) * (long *)pbmtl->identifier; AssertPo(pmtrl, 0); return pmtrl; } /*************************************************************************** Return this MTRL's TMAP, or pvNil if it's a solid-color MTRL. Note: This function doesn't AssertThis because it gets called on objects which are not necessarily valid (e.g., from the destructor and from AssertThis()) ***************************************************************************/ PTMAP MTRL::Ptmap(void) { AssertBaseThis(0); if (pvNil == _pbmtl) return pvNil; else if (pvNil == _pbmtl->colour_map) return pvNil; else return (PTMAP)_pbmtl->colour_map->identifier; } /*************************************************************************** Write a MTRL to a chunky file ***************************************************************************/ bool MTRL::FWrite(PCFL pcfl, CTG ctg, CNO *pcno) { AssertThis(0); AssertPo(pcfl, 0); AssertVarMem(pcno); MTRLF mtrlf; CNO cnoChild; PTMAP ptmap; mtrlf.bo = kboCur; mtrlf.osk = koskCur; mtrlf.brc = _pbmtl->colour; mtrlf.brufKa = _pbmtl->ka; mtrlf.brufKd = _pbmtl->kd; mtrlf.brufKs = _pbmtl->ks; mtrlf.bIndexBase = _pbmtl->index_base; mtrlf.cIndexRange = _pbmtl->index_range; mtrlf.rPower = _pbmtl->power; if (!pcfl->FAddPv(&mtrlf, size(MTRLF), ctg, pcno)) return fFalse; ptmap = Ptmap(); if (pvNil != ptmap) { if (!ptmap->FWrite(pcfl, kctgTmap, &cnoChild)) { pcfl->Delete(ctg, *pcno); return fFalse; } if (!pcfl->FAdoptChild(ctg, *pcno, kctgTmap, cnoChild, 0)) { pcfl->Delete(kctgTmap, cnoChild); pcfl->Delete(ctg, *pcno); return fFalse; } } return fTrue; } /*************************************************************************** Free the MTRL ***************************************************************************/ MTRL::~MTRL(void) { AssertBaseThis(0); PTMAP ptmap; ptmap = Ptmap(); if (pvNil != ptmap) { ReleasePpo(&ptmap); _pbmtl->colour_map = pvNil; } BrMaterialRemove(_pbmtl); BrMaterialFree(_pbmtl); } #ifdef DEBUG /*************************************************************************** Assert the validity of the MTRL. ***************************************************************************/ void MTRL::AssertValid(ulong grf) { MTRL_PAR::AssertValid(fobjAllocated); AssertNilOrPo(Ptmap(), 0); Assert(pvNil != _ptmapShadeTable, "Why do we have MTRLs but no shade table?"); } /*************************************************************************** Mark memory used by the MTRL ***************************************************************************/ void MTRL::MarkMem(void) { AssertThis(0); PTMAP ptmap; MTRL_PAR::MarkMem(); ptmap = Ptmap(); if (pvNil != ptmap) MarkMemObj(ptmap); } /*************************************************************************** Mark memory used by the shade table ***************************************************************************/ void MTRL::MarkShadeTable(void) { MarkMemObj(_ptmapShadeTable); } #endif // DEBUG // // // // CMTL (custom material) stuff begins here // // // /*************************************************************************** Static function to see if the given chunk has MODL children ***************************************************************************/ bool CMTL::FHasModels(PCFL pcfl, CTG ctg, CNO cno) { AssertPo(pcfl, 0); KID kid; return pcfl->FGetKidChidCtg(ctg, cno, 0, kctgBmdl, &kid); } /*************************************************************************** Static function to see if the two given CMTLs have the same child MODLs ***************************************************************************/ bool CMTL::FEqualModels(PCFL pcfl, CNO cno1, CNO cno2) { AssertPo(pcfl, 0); CHID chid = 0; KID kid1; KID kid2; while (pcfl->FGetKidChidCtg(kctgCmtl, cno1, chid, kctgBmdl, &kid1)) { if (!pcfl->FGetKidChidCtg(kctgCmtl, cno2, chid, kctgBmdl, &kid2)) return fFalse; if (kid1.cki.cno != kid2.cki.cno) return fFalse; chid++; } // End of cno1's BMDLs...make sure cno2 doesn't have any more if (pcfl->FGetKidChidCtg(kctgCmtl, cno2, chid, kctgBmdl, &kid2)) return fFalse; return fTrue; } /*************************************************************************** Create a new custom material ***************************************************************************/ PCMTL CMTL::PcmtlNew(long ibset, long cbprt, PMTRL *prgpmtrl) { AssertPvCb(prgpmtrl, LwMul(cbprt, size(PMTRL))); PCMTL pcmtl; long imtrl; pcmtl = NewObj CMTL; if (pvNil == pcmtl) return pvNil; pcmtl->_ibset = ibset; pcmtl->_cbprt = cbprt; if (!FAllocPv((void **)&pcmtl->_prgpmtrl, LwMul(pcmtl->_cbprt, size(PMTRL)), fmemClear, mprNormal)) { ReleasePpo(&pcmtl); return pvNil; } if (!FAllocPv((void **)&pcmtl->_prgpmodl, LwMul(pcmtl->_cbprt, size(PMODL)), fmemClear, mprNormal)) { ReleasePpo(&pcmtl); return pvNil; } for (imtrl = 0; imtrl < cbprt; imtrl++) { AssertPo(prgpmtrl[imtrl], 0); pcmtl->_prgpmtrl[imtrl] = prgpmtrl[imtrl]; pcmtl->_prgpmtrl[imtrl]->AddRef(); } AssertPo(pcmtl, 0); return pcmtl; } /*************************************************************************** A PFNRPO to read CMTL objects. ***************************************************************************/ bool CMTL::FReadCmtl(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb) { AssertPo(pcrf, 0); AssertPo(pblck, 0); AssertNilOrVarMem(ppbaco); AssertVarMem(pcb); PCMTL pcmtl; *pcb = size(CMTL); if (pvNil == ppbaco) return fTrue; pcmtl = NewObj CMTL; if (pvNil == pcmtl || !pcmtl->_FInit(pcrf, ctg, cno)) { ReleasePpo(&pcmtl); TrashVar(ppbaco); TrashVar(pcb); return fFalse; } AssertPo(pcmtl, 0); *ppbaco = pcmtl; *pcb += LwMul(size(PMTRL) + size(PMODL), pcmtl->_cbprt); return fTrue; } /*************************************************************************** Read a CMTL from file ***************************************************************************/ bool CMTL::_FInit(PCRF pcrf, CTG ctg, CNO cno) { AssertBaseThis(0); AssertPo(pcrf, 0); long ikid; long imtrl; KID kid; BLCK blck; PCFL pcfl = pcrf->Pcfl(); CMTLF cmtlf; if (!pcfl->FFind(ctg, cno, &blck) || !blck.FUnpackData()) return fFalse; if (blck.Cb() != size(CMTLF)) { Bug("bad CMTLF...you may need to update tmpls.chk"); return fFalse; } if (!blck.FReadRgb(&cmtlf, size(CMTLF), 0)) return fFalse; if (kboOther == cmtlf.bo) SwapBytesBom(&cmtlf, kbomCmtlf); Assert(kboCur == cmtlf.bo, "bad CMTLF"); _ibset = cmtlf.ibset; // Highest chid is number of body part sets - 1 _cbprt = 0; // note: there might be a faster way to compute _cbprt for (ikid = 0; pcfl->FGetKid(ctg, cno, ikid, &kid); ikid++) { if ((long)kid.chid > (_cbprt - 1)) _cbprt = kid.chid + 1; } if (!FAllocPv((void **)&_prgpmtrl, LwMul(_cbprt, size(PMTRL)), fmemClear, mprNormal)) { return fFalse; } if (!FAllocPv((void **)&_prgpmodl, LwMul(_cbprt, size(PMODL)), fmemClear, mprNormal)) { return fFalse; } for (imtrl = 0; imtrl < _cbprt; imtrl++) { if (pcfl->FGetKidChidCtg(ctg, cno, imtrl, kctgMtrl, &kid)) { _prgpmtrl[imtrl] = (MTRL *)pcrf->PbacoFetch(kid.cki.ctg, kid.cki.cno, MTRL::FReadMtrl); if (pvNil == _prgpmtrl[imtrl]) return fFalse; } if (pcfl->FGetKidChidCtg(ctg, cno, imtrl, kctgBmdl, &kid)) { _prgpmodl[imtrl] = (MODL *)pcrf->PbacoFetch(kid.cki.ctg, kid.cki.cno, MODL::FReadModl); if (pvNil == _prgpmodl[imtrl]) return fFalse; } } return fTrue; } /*************************************************************************** Free the CMTL ***************************************************************************/ CMTL::~CMTL(void) { AssertBaseThis(0); long imtrl; if (pvNil != _prgpmtrl) { for (imtrl = 0; imtrl < _cbprt; imtrl++) ReleasePpo(&_prgpmtrl[imtrl]); FreePpv((void **)&_prgpmtrl); } if (pvNil != _prgpmodl) { for (imtrl = 0; imtrl < _cbprt; imtrl++) ReleasePpo(&_prgpmodl[imtrl]); FreePpv((void **)&_prgpmodl); } } /*************************************************************************** Return ibmtl'th BMTL ***************************************************************************/ BMTL *CMTL::Pbmtl(long ibmtl) { AssertThis(0); AssertIn(ibmtl, 0, _cbprt); return _prgpmtrl[ibmtl]->Pbmtl(); } /*************************************************************************** Return imodl'th MODL ***************************************************************************/ PMODL CMTL::Pmodl(long imodl) { AssertThis(0); AssertIn(imodl, 0, _cbprt); AssertNilOrPo(_prgpmodl[imodl], 0); return _prgpmodl[imodl]; } /*************************************************************************** Returns whether this CMTL has any models attached ***************************************************************************/ bool CMTL::FHasModels(void) { AssertThis(0); long imodl; for (imodl = 0; imodl < _cbprt; imodl++) { if (pvNil != _prgpmodl[imodl]) return fTrue; } return fFalse; } #ifdef DEBUG /*************************************************************************** Assert the validity of the CMTL ***************************************************************************/ void CMTL::AssertValid(ulong grf) { long imtrl; MTRL_PAR::AssertValid(fobjAllocated); AssertPvCb(_prgpmtrl, LwMul(_cbprt, size(MTRL *))); AssertPvCb(_prgpmodl, LwMul(_cbprt, size(MODL *))); for (imtrl = 0; imtrl < _cbprt; imtrl++) { AssertPo(_prgpmtrl[imtrl], 0); AssertNilOrPo(_prgpmodl[imtrl], 0); } } /*************************************************************************** Mark memory used by the MTRL ***************************************************************************/ void CMTL::MarkMem(void) { AssertThis(0); long imtrl; MTRL_PAR::MarkMem(); MarkPv(_prgpmtrl); MarkPv(_prgpmodl); for (imtrl = 0; imtrl < _cbprt; imtrl++) { MarkMemObj(_prgpmtrl[imtrl]); MarkMemObj(_prgpmodl[imtrl]); } } #endif // DEBUG ================================================ FILE: src/engine/scene.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** scene.cpp Author: Sean Selitrennikoff Date: August, 1994 This file contains all functionality for scene manipulation. THIS IS A CODE REVIEWED FILE Basic scene private classes: Scene Chop Undo Object (SUNC) BASE ---> UNDB ---> MUNB ---> SUNC Scene Background Undo Object (SUNK) BASE ---> UNDB ---> MUNB ---> SUNK Scene Pause Undo Object (SUNP) BASE ---> UNDB ---> MUNB ---> SUNP Scene Text box Undo Object (SUNX) BASE ---> UNDB ---> MUNB ---> SUNX Scene Sound Undo Object (SUNS) BASE ---> UNDB ---> MUNB ---> SUNS Scene Title Undo Object (SUNT) BASE ---> UNDB ---> MUNB ---> SUNT ***************************************************************************/ #include "soc.h" ASSERTNAME // // Scene event types // enum SEVT { // StartEv FrmEv Param sevtAddActr, // X pactr/chid sevtPlaySnd, // X SSE (Scene Sound Event) sevtAddTbox, // X ptbox/chid sevtChngCamera, // X icam sevtSetBkgd, // X Background Tag sevtPause // X type, duration }; // // Struct for saving event pause information // struct SEVP { WIT wit; long dts; }; // // Scene thumbnails // const auto kdxpThumbnail = 144; const auto kdypThumbnail = 81; const auto kbTransparent = 250; // // Scene event // struct SEV { long nfrm; // frame number of the event. SEVT sevt; // event type }; const auto kbomSev = 0xF0000000; const auto kbomLong = 0xC0000000; // // Header for the scene chunk when on file // struct SCENH { short bo; short osk; long nfrmLast; long nfrmFirst; TRANS trans; }; const auto kbomScenh = 0x5FC00000; /**************************************** TAGC - Tag,Chid combo ****************************************/ const BOM kbomChid = 0xC0000000; const BOM kbomTagc = kbomChid | (kbomTag >> 2); typedef struct TAGC *PTAGC; struct TAGC { CHID chid; TAG tag; }; /**************************************** SSE - scene sound event ****************************************/ const BOM kbomSse = 0xFF000000; typedef struct SSE *PSSE; struct SSE { long vlm; long sty; // sound type bool fLoop; long ctagc; // TAGC _rgtagcSnd[_ctagc]; // variable array of tagcs follows SSE protected: static long _Cb(long ctagc) { return size(SSE) + LwMul(ctagc, size(TAGC)); } SSE(void){}; public: static PSSE PsseNew(long ctagc); static PSSE PsseNew(long vlm, long sty, bool fLoop, long ctagc, TAGC *prgtagc); static PSSE PsseDupFromGg(PGG pgg, long iv, bool fDupTags = fTrue); PTAG Ptag(long itagc) { PTAGC prgtagc = (PTAGC)PvAddBv(this, size(SSE)); return &(prgtagc[itagc].tag); } PTAGC Ptagc(long itagc) { PTAGC prgtagc = (PTAGC)PvAddBv(this, size(SSE)); return &(prgtagc[itagc]); } CHID *Pchid(long itagc) { PTAGC prgtagc = (PTAGC)PvAddBv(this, size(SSE)); return &(prgtagc[itagc].chid); } PSSE PsseAddTagChid(PTAG ptag, long chid); PSSE PsseDup(void); void PlayAllSounds(PMVIE pmvie, ulong dtsStart = 0); void SwapBytes(void) { long itagc; SwapBytesBom(this, kbomSse); for (itagc = 0; itagc < ctagc; itagc++) { SwapBytesBom(Ptag(itagc), kbomTag); SwapBytesBom(Pchid(itagc), kbomChid); } } long Cb(void) { return size(SSE) + LwMul(ctagc, size(TAGC)); } }; void ReleasePpsse(PSSE *ppsse); // // Undo object for chopping operation. // typedef class SUNC *PSUNC; #define SUNC_PAR MUNB #define kclsSUNC 'SUNC' class SUNC : public SUNC_PAR { RTCLASS_DEC MARKMEM ASSERT protected: CNO _cno; PCRF _pcrf; SUNC(void) { } public: static PSUNC PsuncNew(void); ~SUNC(void); bool FSave(PSCEN pscen); virtual bool FDo(PDOCB pdocb); virtual bool FUndo(PDOCB pdocb); }; // // Undo object for background operations // typedef class SUNK *PSUNK; #define SUNK_PAR MUNB #define kclsSUNK 'SUNK' class SUNK : public SUNK_PAR { RTCLASS_DEC MARKMEM ASSERT protected: TAG _tag; long _icam; bool _fSetBkgd; SUNK(void) { } public: static PSUNK PsunkNew(void); ~SUNK(void); void SetTag(PTAG ptag) { _tag = *ptag; } void SetIcam(long icam) { _icam = icam; } void SetFBkgd(bool fSetBkgd) { _fSetBkgd = fSetBkgd; } virtual bool FDo(PDOCB pdocb); virtual bool FUndo(PDOCB pdocb); }; // // Undo object for transition operations // typedef class SUNR *PSUNR; #define SUNR_PAR MUNB #define kclsSUNR 'SUNR' class SUNR : public SUNR_PAR { RTCLASS_DEC MARKMEM ASSERT protected: TRANS _trans; SUNR(void) { } public: static PSUNR PsunrNew(void); ~SUNR(void); void SetTrans(TRANS trans) { _trans = trans; } virtual bool FDo(PDOCB pdocb); virtual bool FUndo(PDOCB pdocb); }; // // Undo object for pause operations // typedef class SUNP *PSUNP; #define SUNP_PAR MUNB #define kclsSUNP 'SUNP' class SUNP : public SUNP_PAR { RTCLASS_DEC MARKMEM ASSERT protected: WIT _wit; long _dts; bool _fAdd; SUNP(void) { } public: static PSUNP PsunpNew(void); ~SUNP(void); void SetWit(WIT wit) { _wit = wit; } void SetDts(long dts) { _dts = dts; } void SetAdd(bool fAdd) { _fAdd = fAdd; } virtual bool FDo(PDOCB pdocb); virtual bool FUndo(PDOCB pdocb); }; // // Undo object for text box operations // typedef class SUNX *PSUNX; #define SUNX_PAR MUNB #define kclsSUNX 'SUNX' class SUNX : public SUNX_PAR { RTCLASS_DEC MARKMEM ASSERT protected: PTBOX _ptbox; bool _fAdd; long _itbox; long _nfrmFirst; long _nfrmLast; SUNX(void) { } public: static PSUNX PsunxNew(void); ~SUNX(void); void SetNfrmFirst(long nfrm) { _nfrmFirst = nfrm; } void SetNfrmLast(long nfrm) { _nfrmLast = nfrm; } void SetItbox(long itbox) { _itbox = itbox; } void SetTbox(PTBOX ptbox) { _ptbox = ptbox; } void SetAdd(bool fAdd) { _fAdd = fAdd; } virtual bool FDo(PDOCB pdocb); virtual bool FUndo(PDOCB pdocb); }; // // Undo object for sound operations // typedef class SUNS *PSUNS; #define SUNS_PAR MUNB #define kclsSUNS 'SUNS' class SUNS : public SUNS_PAR { RTCLASS_DEC MARKMEM ASSERT protected: PSSE _psse; // may be pvNil long _sty; // sty to use if _psse is pvNil SUNS(void) { } public: static PSUNS PsunsNew(void); ~SUNS(void); bool FSetSnd(PSSE psse) { PSSE psseDup = psse->PsseDup(); if (psseDup == pvNil) return fFalse; ReleasePpsse(&_psse); _psse = psseDup; _sty = _psse->sty; return fTrue; } void SetSty(long sty) { _sty = sty; } virtual bool FDo(PDOCB pdocb); virtual bool FUndo(PDOCB pdocb); }; // // Undo object for title operations // typedef class SUNT *PSUNT; #define SUNT_PAR MUNB #define kclsSUNT 'SUNT' class SUNT : public SUNT_PAR { RTCLASS_DEC MARKMEM ASSERT protected: STN _stn; SUNT(void) { } public: static PSUNT PsuntNew(void); ~SUNT(void); void SetName(PSTN pstn) { AssertPo(pstn, 0); _stn = *pstn; } virtual bool FDo(PDOCB pdocb); virtual bool FUndo(PDOCB pdocb); }; RTCLASS(SCEN) RTCLASS(SUNT) RTCLASS(SUNS) RTCLASS(SUNA) RTCLASS(SUNK) RTCLASS(SUNP) RTCLASS(SUNX) RTCLASS(SUNC) RTCLASS(SUNR) /**************************************************** * * Constructor for scenes. This function is private, use PscenNew() * for public construction. * * Parameters: * pmvie - The movie this scene belongs to. * * Returns: * None. * ****************************************************/ SCEN::SCEN(PMVIE pmvie) { AssertNilOrPo(pmvie, 0); _pmvie = pmvie; _nfrmCur = 1; _nfrmLast = 1; _nfrmFirst = 1; _trans = transDissolve; // default transition // // By default we disable pauses in the studio // _grfscen = fscenPauses; } /**************************************************** * * Exported constructor for scenes. * * Parameters: * pmvie - The movie this scene belongs to. * * * Returns: * pvNil, on failure, else a pointer to an allocated SCEN object. * ****************************************************/ PSCEN SCEN::PscenNew(PMVIE pmvie) { AssertNilOrPo(pmvie, 0); PSCEN pscen; // // Create the object // pscen = NewObj SCEN(pmvie); if (pscen == pvNil) { goto LFail; } // // Initialize event list // pscen->_pggsevFrm = GG::PggNew(size(SEV)); if (pscen->_pggsevFrm == pvNil) { goto LFail; } pscen->_isevFrmLim = 0; pscen->_pggsevStart = GG::PggNew(size(SEV)); if (pscen->_pggsevStart == pvNil) { goto LFail; } pscen->_pglpactr = GL::PglNew(size(PACTR), 0); if (pscen->_pglpactr == pvNil) { goto LFail; } pscen->_pglptbox = GL::PglNew(size(PTBOX), 0); if (pscen->_pglptbox == pvNil) { goto LFail; } if (vpcex != pvNil) { vpcex->EnqueueCid(cidSceneLoaded); } AssertPo(pscen, 0); return (pscen); LFail: ReleasePpo(&pscen); return (pvNil); } /**************************************************** * * Destructor for scenes. * * Parameters: * None. * * Returns: * None. * ****************************************************/ SCEN::~SCEN(void) { AssertBaseThis(0); long isev; PSEV qsev; PTBOX ptbox; PACTR pactr; // // Remove starting events // if (_pggsevStart != pvNil) { for (isev = 0; isev < _pggsevStart->IvMac(); isev++) { qsev = (PSEV)_pggsevStart->QvFixedGet(isev); switch (qsev->sevt) { case sevtAddActr: _pggsevStart->Get(isev, &pactr); AssertPo(pactr, 0); ReleasePpo(&pactr); break; case sevtAddTbox: _pggsevStart->Get(isev, &ptbox); AssertPo(ptbox, 0); ReleasePpo(&ptbox); break; case sevtChngCamera: case sevtSetBkgd: break; case sevtPause: case sevtPlaySnd: Bug("Invalid event in event stream."); break; default: Bug("Unknown event type"); break; } } } ReleasePpo(&_pggsevStart); // // Walk and delete all frame events. // if (_pggsevFrm != pvNil) { for (isev = 0; isev < _pggsevFrm->IvMac(); isev++) { // // For each event, release any child objects. // qsev = (PSEV)_pggsevFrm->QvFixedGet(isev); switch (qsev->sevt) { case sevtAddTbox: case sevtAddActr: case sevtSetBkgd: Assert(0, "Invalid event in event stream."); break; case sevtPlaySnd: { PSSE psse; long itagc; psse = (PSSE)_pggsevFrm->QvGet(isev); for (itagc = 0; itagc < psse->ctagc; itagc++) { TAGM::CloseTag(psse->Ptag(itagc)); } break; } case sevtPause: case sevtChngCamera: break; default: Bug("Unknown event type"); break; } } } // // Delete frame event list. // ReleasePpo(&_pggsevFrm); // // Remove the GL of actors. We do not Release the actors // themselves as our reference was released above in the // the _pggsevStart. // ReleasePpo(&_pglpactr); // // Remove the GL of tboxes. We do not Release the tboxes // themselves as our reference was released above in the // the _pggsevStart. // ReleasePpo(&_pglptbox); // // Release the background // ReleasePpo(&_pbkgd); // // Release the thumbnail // ReleasePpo(&_pmbmp); // // Free the background sound // ReleasePpsse(&_psseBkgd); } /**************************************************** * * Destructor for scenes. This method is used to not only * destruct a scene, but to remove all lights, actors and * text boxes from the rendering area. This is necessary * because Undo will hold references to actors, etc, causing * their destructors to not be called. * * Parameters: * ppscen - A pointer to the scene to destroy. * * Returns: * None. * ****************************************************/ void SCEN::Close(PSCEN *ppscen) { AssertPo(*ppscen, 0); if (pvNil != (*ppscen)->_pbkgd) { (*ppscen)->_pbkgd->TurnOffLights(); } (*ppscen)->HideActors(); (*ppscen)->HideTboxes(); ReleasePpo(ppscen); } #ifdef DEBUG /**************************************************** * Mark memory used by the SCEN * * Parameters: * None. * * Returns: * None. * ****************************************************/ void SCEN::MarkMem(void) { AssertThis(0); long iactr; long itbox; PACTR pactr; PTBOX ptbox; SCEN_PAR::MarkMem(); MarkMemObj(_pggsevStart); MarkMemObj(_pggsevFrm); MarkMemObj(_pglpactr); MarkMemObj(_pglptbox); MarkMemObj(_pmbmp); for (iactr = 0; iactr < _pglpactr->IvMac(); iactr++) { _pglpactr->Get(iactr, &pactr); MarkMemObj(pactr); } for (itbox = 0; itbox < _pglptbox->IvMac(); itbox++) { _pglptbox->Get(itbox, &ptbox); MarkMemObj(ptbox); } if (_psseBkgd != pvNil) MarkPv(_psseBkgd); } /*************************************************************************** Assert the validity of the SCEN. ***************************************************************************/ void SCEN::AssertValid(ulong grf) { long isev; SEV sev; SCEN_PAR::AssertValid(fobjAllocated); AssertPo(&_stnName, 0); AssertNilOrPo(_pactrSelected, 0); AssertNilOrPo(_pbkgd, 0); AssertNilOrPo(_pmbmp, 0); AssertPo(_pglpactr, 0); AssertPo(_pglptbox, 0); AssertPo(_pggsevFrm, 0); AssertPo(_pggsevStart, 0); AssertPo(_pmvie, 0); for (isev = 0; isev < _pggsevFrm->IvMac(); isev++) { sev = *(PSEV)_pggsevFrm->QvFixedGet(isev); switch (sev.sevt) { case sevtPlaySnd: case sevtPause: case sevtChngCamera: break; default: Bug("Unknown event type"); } } for (isev = 0; isev < _pggsevStart->IvMac(); isev++) { sev = *(PSEV)_pggsevStart->QvFixedGet(isev); switch (sev.sevt) { case sevtAddActr: case sevtSetBkgd: case sevtAddTbox: break; default: Bug("Unknown event type"); } } } #endif /**************************************************** * * Sets the transition of the scene and creates an undo object. * * Parameters: * trans - Transition type. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SCEN::FSetTransition(TRANS trans) { AssertThis(0); PSUNR psunr; psunr = SUNR::PsunrNew(); if (psunr == pvNil) { return (fFalse); } if (!_pmvie->FAddUndo(psunr)) { return (fFalse); } ReleasePpo(&psunr); SetTransitionCore(trans); return (fTrue); } /**************************************************** * * Sets the name of the scene and creates an undo object. * * Parameters: * psz - Null terminated string. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SCEN::FSetName(PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); PSUNT psunt; psunt = SUNT::PsuntNew(); if (psunt != pvNil) { psunt->SetName(&_stnName); } if (psunt == pvNil) { return (fFalse); } if (!_pmvie->FAddUndo(psunt)) { return (fFalse); } ReleasePpo(&psunt); SetNameCore(pstn); return (fTrue); } /**************************************************** * * This routine jumps to an arbitrary frame, updating actors, and adding * new frames to the scene if needed. * * Parameters: * nFrm - The frame number to jump to. This may be positive or negative * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SCEN::FGotoFrm(long nfrm) { AssertThis(0); bool fSoundInFrame = fFalse, fUpdateSndFrame = nfrm != _nfrmCur; SEV sev; PMVU pmvu; void *qvVar; long isev; long nfrmOld = _nfrmCur; if (nfrm < _nfrmCur) { // // Assume no pause type // Pmvie()->Pmcc()->PauseType(witNil); // // Go backwards // if (nfrm < _nfrmFirst) { // // Move first frame back in time // _MoveBackFirstFrame(nfrm); _MarkMovieDirty(); } _nfrmCur = nfrm; // // Unplay all events to dest frame. // for (; _isevFrmLim > 0; _isevFrmLim--) { _pggsevFrm->GetFixed(_isevFrmLim - 1, &sev); if (sev.nfrm <= _nfrmCur) { break; } qvVar = _pggsevFrm->QvGet(_isevFrmLim - 1); if (!_FUnPlaySev(&sev, qvVar)) { PushErc(ercSocGotoFrameFailure); return (fFalse); } } // // Play events in this frame // for (isev = _isevFrmLim - 1; isev >= 0; isev--) { _pggsevFrm->GetFixed(isev, &sev); if (sev.nfrm < _nfrmCur) { break; } qvVar = _pggsevFrm->QvGet(isev); if (!_FPlaySev(&sev, qvVar, _grfscen)) { PushErc(ercSocGotoFrameFailure); return (fFalse); } if (sev.sevt == sevtPlaySnd && sev.nfrm == _nfrmCur) fSoundInFrame = fTrue; } } else if (nfrm > _nfrmCur) { pmvu = (PMVU)Pmvie()->PddgGet(0); AssertNilOrPo(pmvu, 0); if ((pmvu != pvNil) && (pmvu->Tool() == toolRecordSameAction)) { Pmvie()->Pmcc()->PlayUISound(toolRecordSameAction); } _nfrmCur = nfrm; // // Assume no pause type // Pmvie()->Pmcc()->PauseType(witNil); // // Go forwards // if (_nfrmCur > _nfrmLast) { _nfrmLast = _nfrmCur; _MarkMovieDirty(); } // // Play all events to dest frame. // for (; _isevFrmLim < _pggsevFrm->IvMac(); _isevFrmLim++) { _pggsevFrm->GetFixed(_isevFrmLim, &sev); if (sev.nfrm > _nfrmCur) { break; } qvVar = _pggsevFrm->QvGet(_isevFrmLim); if (!_FPlaySev(&sev, qvVar, (sev.nfrm == _nfrmCur ? _grfscen : (_grfscen | fscenSounds | fscenPauses)))) { PushErc(ercSocGotoFrameFailure); return (fFalse); } if (sev.sevt == sevtPlaySnd && sev.nfrm == _nfrmCur) fSoundInFrame = fTrue; } } if (!(_grfscen & fscenActrs) && !_FForceActorsToFrm(nfrm, &fSoundInFrame)) { return (fFalse); } if (!(_grfscen & fscenTboxes) && !_FForceTboxesToFrm(nfrm)) { return (fFalse); } if (!(_grfscen & fscenActrs)) { _DoPrerenderingWork(fFalse); } Pmvie()->InvalViews(); if (fUpdateSndFrame) Pmvie()->Pmcc()->SetSndFrame(fSoundInFrame); return (fTrue); } /**************************************************** * * This function is an optimization which could be completely * skipped if desired. The idea is to not render actors frame * after frame if they're not moving or changing at all. So * when we hit a camera change, we look ahead to see if any * actors are unchanging before the next camera change. If * there are, we hide the changing actors (so only the unchanging * ones are visible), then "take a snapshot" of the world with * the unchanging actors (via BWLD::Prerender()), and use the * snapshot as the background RGB and Z buffer until the next * camera view change. We only prerender if the movie is * playing. * * Parameters: * fStartNow - if fTrue, start prerendering even if there's no * camera change in this frame. If fFalse, only * start prerendering if there is a camera view * change in this frame, or if this is the first * frame of the scene. * * Returns: * none * ****************************************************/ void SCEN::_DoPrerenderingWork(bool fStartNow) { AssertThis(0); long isev; SEV sev; long nfrmNextChange; long ipactr; PACTR pactr; long cactrPrerendered; // // If the movie was playing and there was a camera view change // in this frame, prerender any actors that don't change from // here to the next camera view change or the end of the scene. // if (!Pmvie()->FPlaying()) { return; // only prerender if the movie is playing } // Do prerender if this is the first frame of the scene // (even though there's no sevtChngCamera), or if fStartNow // is fTrue, or if there is a sevtChngCamera in this // frame. Otherwise, just return. if (_nfrmCur != _nfrmFirst && !fStartNow) { for (isev = _isevFrmLim - 1; isev >= 0; isev--) { _pggsevFrm->GetFixed(isev, &sev); if (sev.nfrm != _nfrmCur) { return; // no camera view change in this frame } if (sev.sevt == sevtChngCamera) { break; // found one! } } if (isev < 0) { return; // no camera view in this frame } } // Find when the next view change is nfrmNextChange = _nfrmLast; // if no more view changes, go til end of scene for (isev = _isevFrmLim; isev < _pggsevFrm->IvMac(); isev++) { _pggsevFrm->GetFixed(isev, &sev); if (sev.sevt == sevtChngCamera) { nfrmNextChange = sev.nfrm; break; } } // Hide all actors that can't be prerendered this time, and count how many // can be prerendered this time cactrPrerendered = 0; for (ipactr = 0; ipactr < _pglpactr->IvMac(); ipactr++) { _pglpactr->Get(ipactr, &pactr); if (pactr->FMustRender(nfrmNextChange)) { pactr->Hide(); } else { cactrPrerendered++; if (pactr->FPrerendered()) { // Actor was prerendered in last view and in this // view. Temporarily show the actor so it shows // up in the prerendered background pactr->Show(); pactr->SetPrerendered(fFalse); } } } if (cactrPrerendered > 0) { Pmvie()->Pbwld()->Prerender(); } // Show all the actors that were hidden (and show them again if they were // prerendered last time and can't be now), and hide the newly prerendered // actors. for (ipactr = 0; ipactr < _pglpactr->IvMac(); ipactr++) { _pglpactr->Get(ipactr, &pactr); if (pactr->FMustRender(nfrmNextChange)) { pactr->Show(); if (pactr->FPrerendered()) { pactr->Show(); pactr->SetPrerendered(fFalse); } } else { Assert(!pactr->FPrerendered(), "no actor should be marked prerendered here"); pactr->Hide(); pactr->SetPrerendered(fTrue); } } } /**************************************************** * * Ends any current prerendering by restoring the background * RGB and Z buffers of the BWLD, showing all previously * hidden actors, and marking all actors as not prerendered. * * Parameters: * none * * Returns: * none * ****************************************************/ void SCEN::_EndPrerendering(void) { AssertThis(0); long ipactr; PACTR pactr; // Show all the actors that were being prerendered Pmvie()->Pbwld()->Unprerender(); for (ipactr = 0; ipactr < _pglpactr->IvMac(); ipactr++) { _pglpactr->Get(ipactr, &pactr); if (pactr->FPrerendered()) { pactr->Show(); pactr->SetPrerendered(fFalse); } } } /**************************************************** * * This routine replays all the events, filtered by * grfscen, in the current frame. * * Parameters: * grfscen - Events to play. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SCEN::FReplayFrm(ulong grfscen) { AssertThis(0); SEV sev; void *qvVar; long isev, iactr; long nfrmOld = _nfrmCur; PACTR pactr; // // Play events in this frame // for (isev = _isevFrmLim - 1; isev >= 0; isev--) { _pggsevFrm->GetFixed(isev, &sev); if (sev.nfrm < _nfrmCur) { break; } qvVar = _pggsevFrm->QvGet(isev); // Note: FReplayFrm always suppresses camera changes if (!_FPlaySev(&sev, qvVar, (~grfscen) | fscenCams)) { PushErc(ercSocGotoFrameFailure); return (fFalse); } } if (grfscen & fscenActrs) { for (iactr = 0; iactr < _pglpactr->IvMac(); iactr++) { _pglpactr->Get(iactr, &pactr); AssertPo(pactr, 0); if (!pactr->FReplayFrame(grfscen)) { return (fFalse); } } } return (fTrue); } /**************************************************** * * This routine recalculates the length of the movie. * * Parameters: * None. * * Returns: * None. * ****************************************************/ void SCEN::InvalFrmRange(void) { AssertThis(0); PACTR pactr; PTBOX ptbox; long ipo; long nfrmStart, nfrmLast; for (ipo = 0; ipo < _pglpactr->IvMac(); ipo++) { _pglpactr->Get(ipo, &pactr); if (pactr->FGetLifetime(&nfrmStart, &nfrmLast)) { if (nfrmStart < _nfrmFirst) { _MoveBackFirstFrame(nfrmStart); } if (nfrmLast > _nfrmLast) { _nfrmLast = nfrmLast; } } } for (ipo = 0; ipo < _pglptbox->IvMac(); ipo++) { _pglptbox->Get(ipo, &ptbox); if (ptbox->FGetLifetime(&nfrmStart, &nfrmLast)) { if (nfrmStart < _nfrmFirst) { _MoveBackFirstFrame(nfrmStart); } if (nfrmLast > _nfrmLast) { _nfrmLast = nfrmLast; } } } } /**************************************************** * * This routine plays a single event. * * Be careful not to modify _pggsevFrm or _pggsevStart from * within this routine. * * Parameters: * psev - Pointer to the scene event to play. * qvVar- Pointer to the variable part of the event. * grfscen - Flags of currently disabled event types. * * Returns: * fTrue if the event was played, fFalse in the case of failure. * ****************************************************/ bool SCEN::_FPlaySev(PSEV psev, void *qvVar, ulong grfscen) { AssertThis(0); AssertVarMem(psev); PACTR pactr; PTBOX ptbox; PBKGD pbkgd; TAG tag; WIT wit; long dts; switch (psev->sevt) { case sevtPlaySnd: PSSE psse; psse = (PSSE)qvVar; // If it's midi, copy it to _psseBkgd if (psse->sty == styMidi) { PSSE psseDup; psseDup = psse->PsseDup(); if (psseDup == pvNil) return fFalse; ReleasePpsse(&_psseBkgd); _psseBkgd = psseDup; _nfrmSseBkgd = psev->nfrm; } if (grfscen & fscenSounds) { return (fTrue); } psse->PlayAllSounds(Pmvie()); break; case sevtSetBkgd: tag = *(PTAG)qvVar; pbkgd = (PBKGD)vptagm->PbacoFetch(&tag, BKGD::FReadBkgd); if (pvNil == pbkgd) { return fFalse; } if (!pbkgd->FSetCamera(_pmvie->Pbwld(), 0)) { ReleasePpo(&pbkgd); return (fFalse); } if (Pmvie()->Trans() == transNil) { Pmvie()->SetTrans(transCut); // so we do palette change at next draw } _pbkgd = pbkgd; _tagBkgd = tag; break; case sevtAddActr: // // Add the actor to the roll call. // pactr = *(PACTR *)qvVar; AssertPo(pactr, 0); if (_pglpactr->FPush(&pactr) == fFalse) { return (fFalse); } pactr->SetPscen(this); // // Plop them into this frame // if (!pactr->FGotoFrame(_nfrmCur)) { _pglpactr->FPop(&pactr); return (fFalse); } break; case sevtPause: wit = (WIT)(*(long *)qvVar); Pmvie()->Pmcc()->PauseType(wit); if (grfscen & fscenPauses) { return (fTrue); } dts = *((long *)qvVar + 1); Pmvie()->DoPause(wit, dts); break; case sevtAddTbox: // // Add the text box to the scene // ptbox = *(PTBOX *)qvVar; AssertPo(ptbox, 0); // // Insert at the end, because tbox ordering is important // since the client uses itbox to find text boxes. // if (!_pglptbox->FInsert(_pglptbox->IvMac(), &ptbox)) { return (fFalse); } // // Plop them into this frame // if (!ptbox->FGotoFrame(_nfrmCur)) { _pglptbox->Delete(_pglptbox->IvMac() - 1); return (fFalse); } break; case sevtChngCamera: Assert(_pbkgd != pvNil, "No background in the scene"); if (grfscen & fscenCams) { return (fTrue); } if (!_pbkgd->FSetCamera(_pmvie->Pbwld(), *(long *)qvVar)) { return (fFalse); } break; default: Bug("Unhandled sevt"); break; } return (fTrue); } /**************************************************** * * This routine undoes a single event. * * Parameters: * psev - Pointer to the scene event to unplay. * qvVar- Pointer to the variable part of the event. * * * Returns: * fTrue if the unplay worked, else fFalse. * ****************************************************/ bool SCEN::_FUnPlaySev(PSEV psev, void *qvVar) { AssertThis(0); AssertVarMem(psev); SEV sev; long isev; PSEV qsevTmp; switch (psev->sevt) { case sevtPlaySnd: // // Go backwards and find previous background sound. // for (isev = _isevFrmLim - 1; isev >= 0; isev--) { qsevTmp = (PSEV)_pggsevFrm->QvFixedGet(isev); if ((qsevTmp->sevt == sevtPlaySnd) && (qsevTmp->nfrm < _nfrmCur)) { sev = *qsevTmp; _FPlaySev(&sev, _pggsevFrm->QvGet(isev), _grfscen | fscenSounds); // Ignore failure. return (fTrue); } } // // Not found -- clear variables. // ReleasePpsse(&_psseBkgd); break; case sevtAddActr: case sevtAddTbox: case sevtPause: break; case sevtChngCamera: Assert(_pbkgd != pvNil, "No background in scene"); // // Go backwards and find previous camera position. // for (isev = _isevFrmLim - 1; isev >= 0; isev--) { qsevTmp = (PSEV)_pggsevFrm->QvFixedGet(isev); if ((qsevTmp->sevt == sevtChngCamera) && (qsevTmp->nfrm < _nfrmCur)) { sev = *qsevTmp; AssertDo(_FPlaySev(&sev, _pggsevFrm->QvGet(isev), _grfscen), "Should not fail."); return (fTrue); } } // // Not found -- use starting camera, which is always camera 0. // sev.sevt = sevtChngCamera; isev = 0; if (!_FPlaySev(&sev, &isev, _grfscen)) { Assert(0, "Should never happen"); return (fFalse); } break; } return (fTrue); } /**************************************************** * * This routine moves back stuff that is currently * in the first frame of the movie to the given frame. * * Parameters: * nfrm - New first frame. * * Returns: * None. * ****************************************************/ void SCEN::_MoveBackFirstFrame(long nfrm) { AssertThis(0); Assert(nfrm < _nfrmFirst, "Can only be called to extend scene back."); long isev; SEV sev; // // Move back all events that must persist in the // first frame. // for (isev = 0; isev < _pggsevFrm->IvMac(); isev++) { _pggsevFrm->GetFixed(isev, &sev); if (sev.nfrm != _nfrmFirst) { break; } if (sev.sevt == sevtChngCamera) { // // Move this back // sev.nfrm = nfrm; _pggsevFrm->PutFixed(isev, &sev); _pggsevFrm->Move(isev, 0); } } // // Set new first frame // _nfrmFirst = nfrm; } /**************************************************** * * This routine adds a sound to the event list for this frame. * * Parameters: * fLoop - should the sound loop? * fQueue - queue after existing sounds, or replace them? * vlm - volume to play this sound at * sty - sound type (midi, speech, or SFX) * ctag - number of sounds * prgtag - array of MSND tags * * * Returns: * fTrue, if successful, else fFalse. * ****************************************************/ bool SCEN::FAddSndCore(bool fLoop, bool fQueue, long vlm, long sty, long ctag, PTAG prgtag) { AssertThis(0); AssertPvCb(prgtag, LwMul(ctag, size(TAG))); Assert(!fQueue || (ctag == 1), "if fQueue'ing, you should only be adding one sound"); Assert(!fQueue || !fLoop, "can't both queue and loop"); AssertIn(sty, 0, styLim); SEV sev; PSSE psseOld; PSSE psseNew; long isev; CHID chid; long isevSnd = ivNil; PTAG ptag; PMSND pmsnd; long itag, itagBase; // // Find any other sevtPlaySnd events in this frame with the same sty // for (isev = _isevFrmLim - 1; isev >= 0; isev--) { _pggsevFrm->GetFixed(isev, &sev); if (sev.nfrm != _nfrmCur) break; if (sev.sevt == sevtPlaySnd) { psseOld = (PSSE)_pggsevFrm->QvGet(isev); if (psseOld->sty == sty) { // Found a match, which we will either add to or replace isevSnd = isev; break; } } } if (isevSnd == ivNil) { fQueue = fFalse; // nothing to queue to } sev.nfrm = _nfrmCur; sev.sevt = sevtPlaySnd; if (!fQueue) { PTAGC prgtagc; long itagc; if (!FAllocPv((void **)&prgtagc, LwMul(size(TAGC), ctag), fmemClear, mprNormal)) return fFalse; for (itagc = 0; itagc < ctag; itagc++) { prgtagc[itagc].tag = prgtag[itagc]; if (prgtagc[itagc].tag.sid == ksidUseCrf) { if (!_pmvie->FChidFromUserSndCno(prgtag[itagc].cno, &chid)) { FreePpv((void **)&prgtagc); return fFalse; } prgtagc[itagc].chid = chid; } else { TrashVar(&prgtagc[itagc].chid); } } // Create new event, replace any old event of same sty itagBase = 0; psseNew = SSE::PsseNew(vlm, sty, fLoop, ctag, prgtagc); FreePpv((void **)&prgtagc); if (pvNil == psseNew) { return fFalse; } if (!_FAddSev(&sev, psseNew->Cb(), psseNew)) { ReleasePpsse(&psseNew); return fFalse; } if (isevSnd != ivNil) { // Delete old event, if any PSSE psse; long itagc; psse = (PSSE)_pggsevFrm->QvGet(isevSnd); for (itagc = 0; itagc < psse->ctagc; itagc++) { TAGM::CloseTag(psse->Ptag(itagc)); } _pggsevFrm->Delete(isevSnd); _isevFrmLim--; } } else // we're queueing { // Add this sound to isevSnd psseOld = SSE::PsseDupFromGg(_pggsevFrm, isevSnd); if (pvNil == psseOld) { return fFalse; } // ctag == 1 if (prgtag[0].sid == ksidUseCrf) { if (!_pmvie->FChidFromUserSndCno(prgtag[0].cno, &chid)) { ReleasePpsse(&psseOld); return fFalse; } } else TrashVar(&chid); itagBase = psseOld->ctagc; psseNew = psseOld->PsseAddTagChid(prgtag, chid); if (pvNil == psseNew) { ReleasePpsse(&psseOld); return fFalse; } if (!_pggsevFrm->FPut(isevSnd, psseNew->Cb(), psseNew)) { ReleasePpsse(&psseOld); ReleasePpsse(&psseNew); return fFalse; } ReleasePpsse(&psseOld); } // // Play only these sounds // for (itag = 0; itag < ctag; itag++) { ptag = &(prgtag[itag]); if (ptag->sid == ksidUseCrf) { if (!Pmvie()->FResolveSndTag(ptag, *(psseNew->Pchid(itag + itagBase)))) continue; } pmsnd = (PMSND)vptagm->PbacoFetch(ptag, MSND::FReadMsnd); if (pvNil == pmsnd) continue; // Only queue if it's not the first sound. Pmvie()->Pmsq()->FEnqueue(pmsnd, 0, fLoop, (itag != 0), vlm, pmsnd->Spr(fLoop ? toolLooper : toolSounder), fFalse, 0); ReleasePpo(&pmsnd); } if (!_FPlaySev(&sev, psseNew, _grfscen | fscenSounds)) { // non-fatal error...ignore it } FreePpv((void **)&psseNew); // don't ReleasePpsse because GG got the tags _MarkMovieDirty(); Pmvie()->Pmcc()->SetSndFrame(fTrue); return fTrue; } /**************************************************** * * This routine adds a sound to the event list for this frame. * Note: The chid's in the tagc are current * * Parameters: * fLoop - should the sound loop? * fQueue - queue after existing sounds, or replace them? * vlm - volume to play this sound at * sty - sound type (midi, speech, or SFX) * ctag - number of sounds * prgtagc - array of MSND tags * * * Returns: * fTrue, if successful, else fFalse. * ****************************************************/ bool SCEN::FAddSndCoreTagc(bool fLoop, bool fQueue, long vlm, long sty, long ctagc, PTAGC prgtagc) { AssertThis(0); AssertPvCb(prgtagc, LwMul(ctagc, size(TAGC))); Assert(!fQueue || (ctagc == 1), "if fQueue'ing, you should only be adding one sound"); Assert(!fQueue || !fLoop, "can't both queue and loop"); AssertIn(sty, 0, styLim); SEV sev; PSSE psseOld; PSSE psseNew; long isev; long isevSnd = ivNil; // // Find any other sevtPlaySnd events in this frame with the same sty // for (isev = _isevFrmLim - 1; isev >= 0; isev--) { _pggsevFrm->GetFixed(isev, &sev); if (sev.nfrm != _nfrmCur) break; if (sev.sevt == sevtPlaySnd) { psseOld = (PSSE)_pggsevFrm->QvGet(isev); if (psseOld->sty == sty) { // Found a match, which we will either add to or replace isevSnd = isev; break; } } } if (isevSnd == ivNil) { fQueue = fFalse; // nothing to queue to } sev.nfrm = _nfrmCur; sev.sevt = sevtPlaySnd; if (!fQueue) { // Create new event, replace any old event of same sty psseNew = SSE::PsseNew(vlm, sty, fLoop, ctagc, prgtagc); if (pvNil == psseNew) return fFalse; if (!_FAddSev(&sev, psseNew->Cb(), psseNew)) { ReleasePpsse(&psseNew); return fFalse; } if (isevSnd != ivNil) { // Delete old event, if any PSSE psse; long itagc; psse = (PSSE)_pggsevFrm->QvGet(isevSnd); for (itagc = 0; itagc < psse->ctagc; itagc++) { TAGM::CloseTag(psse->Ptag(itagc)); } _pggsevFrm->Delete(isevSnd); _isevFrmLim--; } } else // we're queueing { Bug("Should never queue when undoing"); } if (!_FPlaySev(&sev, psseNew, _grfscen)) { // non-fatal error...ignore it } FreePpv((void **)&psseNew); // don't ReleasePpsse because GG got the tags _MarkMovieDirty(); Pmvie()->Pmcc()->SetSndFrame(fTrue); return fTrue; } /**************************************************** * * This routine adds a sound to the event list for this frame * and creates an undo object for the action. * * Parameters: * ptag - pointer to the tag for the sound. * fLoop - whether to loop the sound * fQueue - queue after existing sounds, or replace them? * vlm - volume to play this sound at * sty - sound type (midi, speech, or SFX) * * Returns: * fTrue, if successful, else fFalse. * ****************************************************/ bool SCEN::FAddSnd(PTAG ptag, bool fLoop, bool fQueue, long vlm, long sty) { AssertThis(0); AssertVarMem(ptag); Assert(!fQueue || !fLoop, "can't both queue and loop"); AssertIn(sty, 0, styLim); PSUNS psuns; PSSE psse; bool fFound; // Create a SUNS with nil _psse psuns = SUNS::PsunsNew(); if (psuns == pvNil) { return (fFalse); } psuns->SetSty(sty); // grab sound before edit, if any if (!FGetSnd(sty, &fFound, &psse)) { ReleasePpo(&psuns); return fFalse; } if (fFound) { if (!psuns->FSetSnd(psse)) { ReleasePpsse(&psse); ReleasePpo(&psuns); return fFalse; } ReleasePpsse(&psse); } if (!_pmvie->FAddUndo(psuns)) { ReleasePpo(&psuns); return (fFalse); } ReleasePpo(&psuns); if (!FAddSndCore(fLoop, fQueue, vlm, sty, 1, ptag)) { _pmvie->ClearUndo(); return (fFalse); } return (fTrue); } /**************************************************** * * This routine removes a sound from the event list for this frame. * * Parameters: * sty - the type of sound to remove * * * Returns: * None * ****************************************************/ void SCEN::RemSndCore(long sty) { AssertThis(0); AssertIn(sty, 0, styLim); PSEV qsev; long isev; // // Find the sound // for (isev = _isevFrmLim - 1; isev >= 0; isev--) { qsev = (PSEV)_pggsevFrm->QvFixedGet(isev); if (qsev->nfrm != _nfrmCur) { Bug("sty not found"); return; } if ((qsev->sevt == sevtPlaySnd) && ((PSSE)_pggsevFrm->QvGet(isev))->sty == sty) { // // Remove it // PSSE psse; long itagc; psse = (PSSE)_pggsevFrm->QvGet(isev); for (itagc = 0; itagc < psse->ctagc; itagc++) { TAGM::CloseTag(psse->Ptag(itagc)); } _pggsevFrm->Delete(isev); _isevFrmLim--; if (sty == styMidi) { ReleasePpsse(&_psseBkgd); } UpdateSndFrame(); _MarkMovieDirty(); return; } } Bug("No such sound"); } /**************************************************** * * This routine removes a sound from the event list for this frame * and creates an undo object for the action. * * Parameters: * sty - the type of sound to remove * * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SCEN::FRemSnd(long sty) { AssertThis(0); AssertIn(sty, 0, styLim); PSUNS psuns; PSSE psse = pvNil; long isev; PSEV qsev; psuns = SUNS::PsunsNew(); if (psuns == pvNil) { return (fFalse); } // // Find the sound // for (isev = _isevFrmLim - 1; isev >= 0; isev--) { qsev = (PSEV)_pggsevFrm->QvFixedGet(isev); if (qsev->nfrm != _nfrmCur) { Bug("sty not found"); return fTrue; } if ((qsev->sevt == sevtPlaySnd) && ((PSSE)_pggsevFrm->QvGet(isev))->sty == sty) { psse = SSE::PsseDupFromGg(_pggsevFrm, isev); if (psse == pvNil) { return fFalse; } } } if (!psuns->FSetSnd(psse)) { ReleasePpsse(&psse); return fFalse; } ReleasePpsse(&psse); if (!_pmvie->FAddUndo(psuns)) { ReleasePpo(&psuns); return (fFalse); } ReleasePpo(&psuns); RemSndCore(sty); return (fTrue); } /**************************************************** * * This routine finds a specific sound in the current frame. * * Parameters: * sty - sound type to search for * pfFound - set to fTrue if a sound is found, else fFalse * ppsse - gets a pointer to the SSE if it is found * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SCEN::FGetSnd(long sty, bool *pfFound, PSSE *ppsse) { AssertThis(0); AssertIn(sty, 0, styLim); AssertVarMem(ppsse); PSEV qsev; long isev; *pfFound = fFalse; // // Check event list. // for (isev = _isevFrmLim - 1; isev >= 0; isev--) { qsev = (PSEV)_pggsevFrm->QvFixedGet(isev); if (qsev->nfrm != _nfrmCur) { break; // sound not found } if (qsev->sevt == sevtPlaySnd) { if (sty == ((PSSE)_pggsevFrm->QvGet(isev))->sty) { *ppsse = SSE::PsseDupFromGg(_pggsevFrm, isev); if (*ppsse == pvNil) { return fFalse; // memory error } *pfFound = fTrue; return fTrue; } } } // // End of list...sound not found // return (fTrue); } /**************************************************** * * This routine plays the background sound, if any. * If the sound really started at an earlier frame, * this function tries to resume the sound at the * appropriate offset into the sound (dtsStart). * * Parameters: * none * * Returns: * none * ****************************************************/ void SCEN::PlayBkgdSnd(void) { AssertThis(0); ulong dtsStart; ulong dfrm; if (pvNil != _psseBkgd) { dfrm = Nfrm() - _nfrmSseBkgd; Assert(dfrm >= 0, "this sound is in the future!"); dtsStart = LwMulDiv(dfrm, kdtsSecond, kfps); _psseBkgd->PlayAllSounds(Pmvie(), dtsStart); } } /**************************************************** * * This routine queries what sounds are attched to the * scene at the current frame * * Parameters: * sty - the sound type to query * * Returns: * fFalse if an error occurs * ****************************************************/ bool SCEN::FQuerySnd(long sty, PGL *ppgltagSnd, long *pvlm, bool *pfLoop) { AssertThis(0); AssertVarMem(ppgltagSnd); AssertVarMem(pvlm); AssertVarMem(pfLoop); PSSE psse; bool fFound; long itag; *ppgltagSnd = pvNil; if (!FGetSnd(sty, &fFound, &psse)) { return fFalse; // error } if (!fFound) { return fTrue; // no sounds (*ppglTagSnd is nil) } *ppgltagSnd = GL::PglNew(size(TAG), psse->ctagc); if (pvNil == *ppgltagSnd) { ReleasePpsse(&psse); return fFalse; } AssertDo((*ppgltagSnd)->FSetIvMac(psse->ctagc), "PglNew should have ensured space"); for (itag = 0; itag < psse->ctagc; itag++) { (*ppgltagSnd)->Put(itag, psse->Ptag(itag)); } *pvlm = psse->vlm; *pfLoop = psse->fLoop; ReleasePpsse(&psse); return fTrue; } /**************************************************** * * This routine changes the volume of the sound of * type sty at the current frame to vlmNew * * Parameters: * sty - the sound type to query * vlmNew - the new volume * * Returns: * none * ****************************************************/ void SCEN::SetSndVlmCore(long sty, long vlmNew) { AssertThis(0); AssertIn(sty, 0, styLim); AssertIn(vlmNew, 0, kvlmFull + 1); PSEV qsev; long isev; PSSE psse; // // Check event list. // for (isev = _isevFrmLim - 1; isev >= 0; isev--) { qsev = (PSEV)_pggsevFrm->QvFixedGet(isev); if (qsev->nfrm != _nfrmCur) { Bug("No such sound"); break; // sound not found } if (qsev->sevt == sevtPlaySnd) { psse = ((PSSE)_pggsevFrm->QvGet(isev)); if (sty == psse->sty) { psse->vlm = vlmNew; _MarkMovieDirty(); return; } } } // // End of list...sound not found // Bug("No such sound"); } /****************************************************************************** UpdateSndFrame Enumerates all scene events for the current frame, and asks all actors to enumerate all of their actor events for the current frame, looking for a sound event. Has the movie's MCC update the frame-sound state based on the results of the search. ************************************************************ PETED ***********/ void SCEN::UpdateSndFrame(void) { bool fSoundInFrame = fFalse; long iv = _isevFrmLim; while (iv-- > 0) { PSEV qsev = (PSEV)_pggsevFrm->QvFixedGet(iv); if (qsev->nfrm != _nfrmCur) { iv = -1; break; } if (qsev->sevt == sevtPlaySnd) { fSoundInFrame = fTrue; goto LDone; } } while (++iv < _pglpactr->IvMac()) { PACTR pactr; _pglpactr->Get(iv, &pactr); AssertPo(pactr, 0); if (pactr->FSoundInFrm()) { fSoundInFrame = fTrue; goto LDone; } } LDone: Pmvie()->Pmcc()->SetSndFrame(fSoundInFrame); } /**************************************************** * * This routine adds an event to the current frame of the current scene. * * Parameters: * psev - Pointer to the event to add. * cbVar- Size of pvVar buffer, in bytes. * pvVar- Pointer to the variable part of the event. * * Returns: * fTrue, if successful, else fFalse. * ****************************************************/ bool SCEN::_FAddSev(PSEV psev, long cbVar, void *pvVar) { AssertThis(0); AssertVarMem(psev); AssertIn(cbVar, 0, klwMax); bool fRetValue; // // Add the event to the scene // _MarkMovieDirty(); fRetValue = _pggsevFrm->FInsert(_isevFrmLim++, cbVar, pvVar, psev); if (!fRetValue) { _isevFrmLim--; } return (fRetValue); } /**************************************************** * * This routine sets the selected actor to the given one. * * Parameters: * pactr - Pointer to the actr to select. pvNil is a * valid value and deselects the current actor and tbox. * * Returns: * None * ****************************************************/ void SCEN::SelectActr(ACTR *pactr) { AssertThis(0); AssertNilOrPo(pactr, 0); PMVU pmvu; pmvu = (PMVU)Pmvie()->PddgGet(0); AssertNilOrPo(pmvu, 0); if ((pmvu != pvNil) && !pmvu->FTextMode()) { if (pvNil != _pactrSelected) { _pactrSelected->Unhilite(); } if (pvNil != pactr) { pactr->Hilite(); } if (_ptboxSelected != pvNil) { _ptboxSelected->Select(fFalse); } } _pmvie->InvalViews(); _pactrSelected = pactr; _pmvie->BuildActionMenu(); } /**************************************************** * * This routine sets the selected text box to the given one. * * Parameters: * ptbox - Pointer to the tbox to select. pvNil is a * valid value and deselects the current actor and tbox. * * Returns: * None * ****************************************************/ void SCEN::SelectTbox(PTBOX ptbox) { AssertThis(0); AssertNilOrPo(ptbox, 0); PMVU pmvu; pmvu = (PMVU)Pmvie()->PddgGet(0); AssertNilOrPo(pmvu, 0); _pmvie->InvalViews(); if ((pmvu != pvNil) && pmvu->FTextMode()) { if (pvNil != _pactrSelected) { _pactrSelected->Unhilite(); _pmvie->BuildActionMenu(); } if ((ptbox == _ptboxSelected) && ((ptbox == pvNil) || ptbox->FSelected())) { return; } if (pvNil != _ptboxSelected) { _ptboxSelected->Select(fFalse); } if (pvNil != ptbox) { ptbox->Select(fTrue); } } _ptboxSelected = ptbox; _pmvie->Pmcc()->TboxSelected(); } /**************************************************** * * This routine adds an actor to the scene at the current frame, * if the arid is aridNil, else it replaces the actor in the * scene with the same arid. * * Parameters: * pactr - Pointer to the actr to add. * * * Returns: * fTrue, if successful, else fFalse. * ****************************************************/ bool SCEN::FAddActrCore(ACTR *pactr) { AssertThis(0); AssertPo(pactr, 0); PSEV qsev; SEV sev; long isev; long ipactr; STN stn; PACTR pactrOld; bool fRetValue; // // Check if actor is in Scene already. // for (isev = 0; isev < _pggsevStart->IvMac(); isev++) { qsev = (PSEV)_pggsevStart->QvFixedGet(isev); if (qsev->sevt != sevtAddActr) { continue; } _pggsevStart->Get(isev, (void *)&pactrOld); if (pactrOld->Arid() != pactr->Arid()) { continue; } // // Replace actor in scene roll call // for (ipactr = 0; ipactr < _pglpactr->IvMac(); ipactr++) { _pglpactr->Get(ipactr, &pactrOld); if (pactrOld->Arid() == pactr->Arid()) { pactr->AddRef(); pactr->SetPscen(this); // // Plop them into this frame // if (!pactr->FGotoFrame(_nfrmCur)) { ReleasePpo(&pactr); return (fFalse); } // // Replace starting actor // _pggsevStart->Put(isev, &pactr); _pglpactr->Put(ipactr, &pactr); SelectActr(pactr); pactrOld->Hide(); ReleasePpo(&pactrOld); InvalFrmRange(); _MarkMovieDirty(); UpdateSndFrame(); return (fTrue); } } Bug("Cannot find actor in Roll call"); } // // Add actor to inital list of events to do. // sev.sevt = sevtAddActr; fRetValue = _pggsevStart->FInsert(0, size(PACTR), &pactr, &sev); if (fRetValue) { pactr->AddRef(); pactr->Ptmpl()->GetName(&stn); if (!_pmvie->FAddToRollCall(pactr, &stn)) { _pggsevStart->Delete(0); ReleasePpo(&pactr); return (fFalse); } fRetValue = _FPlaySev(&sev, &pactr, _grfscen); if (!fRetValue) { _pmvie->RemFromRollCall(pactr); _pggsevStart->Delete(0); ReleasePpo(&pactr); } else { InvalFrmRange(); _MarkMovieDirty(); UpdateSndFrame(); } } return (fRetValue); } /**************************************************** * * This routine adds an actor to the scene at the current frame. * This auto magically selects the actor and places them on stage. * * Parameters: * pactr - Pointer to the actr to add. * * * Returns: * fTrue, if successful, else fFalse. * ****************************************************/ bool SCEN::FAddActr(ACTR *pactr) { AssertThis(0); AssertPo(pactr, 0); if (!FAddActrCore(pactr)) { return (fFalse); } if (!pactr->FAddOnStageCore()) { RemActrCore(pactr->Arid()); return (fFalse); } SelectActr(pactr); // // The MVU creates the undo object for this because of the mouse // placement. // return (fTrue); } /**************************************************** * * This routine removes an actor from the scene. * * Parameters: * arid - The actor id to remove. * * * Returns: * None * ****************************************************/ void SCEN::RemActrCore(long arid) { AssertThis(0); PSEV qsev; PACTR pactrTmp; long isev; // // Check if actor is in Scene already. // for (isev = 0; isev < _pggsevStart->IvMac(); isev++) { qsev = (PSEV)_pggsevStart->QvFixedGet(isev); if (qsev->sevt != sevtAddActr) { continue; } _pggsevStart->Get(isev, &pactrTmp); if (pactrTmp->Arid() != arid) { continue; } // // Remove actor from inital list of events to do. // _pggsevStart->Delete(isev); // // Remove actor from the scene roll call // for (isev = 0; isev < _pglpactr->IvMac(); isev++) { _pglpactr->Get(isev, &pactrTmp); if (pactrTmp->Arid() != arid) { continue; } _pglpactr->Delete(isev); // // Remove actor as the currently selected actor // if (_pactrSelected == pactrTmp) { PMVU pmvu; _pactrSelected = pvNil; pmvu = (PMVU)_pmvie->PddgGet(0); if (pmvu != pvNil) { pmvu->EndPlaceActor(); } } // // Remove actor from the movie roll call // _pmvie->RemFromRollCall(pactrTmp); pactrTmp->Hide(); ReleasePpo(&pactrTmp); _MarkMovieDirty(); UpdateSndFrame(); return; } Bug("Actor does not exist in roll call"); _MarkMovieDirty(); return; } Bug("Actor does not exist in scene"); } /**************************************************** * * This routine removes an actor from the scene, and * creates an undo object for the action. * * Parameters: * arid - The actor id to remove. * * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SCEN::FRemActr(long arid) { AssertThis(0); AssertIn(arid, 0, 500); PSUNA psuna; long ipactr; PACTR pactr; // // Find the actor for undo purposes // for (ipactr = 0; ipactr < _pglpactr->IvMac(); ipactr++) { _pglpactr->Get(ipactr, &pactr); if (pactr->Arid() == arid) { break; } } AssertPo(pactr, 0); pactr->AddRef(); psuna = SUNA::PsunaNew(); if (psuna == pvNil) { ReleasePpo(&pactr); return (fFalse); } psuna->SetActr(pactr); psuna->SetType(utDel); if (!_pmvie->FAddUndo(psuna)) { return (fFalse); } ReleasePpo(&psuna); RemActrCore(arid); return (fTrue); } /**************************************************** * * This routine returns the actor pointed at by the mouse. * * Parameters: * xp - X position of the mouse within the display space. * yp - Y position of the mouse within the display space. * pibset - Place to store the index of the group of body parts hit. * * Returns: * Pointer to the actor, pvNil if none. * ****************************************************/ ACTR *SCEN::PactrFromPt(long xp, long yp, long *pibset) { AssertThis(0); AssertVarMem(pibset); ACTR *pactr; BODY *pbody; long ipactr; pbody = BODY::PbodyClicked(xp, yp, Pmvie()->Pbwld(), pibset); if (pvNil == pbody) { return pvNil; } // // loop through actors, call FIsMyBody() // for (ipactr = 0; ipactr < _pglpactr->IvMac(); ipactr++) { _pglpactr->Get(ipactr, &pactr); if (pactr->FIsMyBody(pbody)) { return pactr; } } Bug("weird...we clicked a pbody, but we don't know whose it is!"); return pvNil; } /**************************************************** * * This routine adds a text box to the scene at the current frame * * Parameters: * ptbox - Pointer to the text box to add. * * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SCEN::FAddTboxCore(PTBOX ptbox) { AssertThis(0); AssertPo(ptbox, 0); SEV sev; bool fRetValue; #ifdef DEBUG PSEV qsev; long isev; // // Search for duplicate tbox // for (isev = 0; isev < _pggsevStart->IvMac(); isev++) { qsev = (PSEV)_pggsevStart->QvFixedGet(isev); if ((qsev->sevt == sevtAddTbox) && (ptbox == (PTBOX)_pggsevStart->QvGet(isev))) { Bug("Error, adding same text box twice"); return (fTrue); } } #endif // // Add text box to event list. // sev.sevt = sevtAddTbox; ptbox->SetScen(this); fRetValue = _pggsevStart->FInsert(_pggsevStart->IvMac(), size(PTBOX), &ptbox, &sev); if (fRetValue) { ptbox->AddRef(); fRetValue = _FPlaySev(&sev, &ptbox, _grfscen); if (!fRetValue) { _pggsevStart->Delete(_pggsevStart->IvMac() - 1); } else { _MarkMovieDirty(); } } return (fRetValue); } /**************************************************** * * This routine adds a text box to the scene at the current frame * creates an undo object for the action. * * Parameters: * ptbox - Pointer to the text box to add. * * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SCEN::FAddTbox(PTBOX ptbox) { PSUNX psunx; long itbox; long nfrmFirst, nfrmLast; psunx = SUNX::PsunxNew(); if (psunx == pvNil) { return (fFalse); } if (!FAddTboxCore(ptbox)) { ReleasePpo(&psunx); return (fFalse); } ptbox->AddRef(); ptbox->FGetLifetime(&nfrmFirst, &nfrmLast); psunx->SetTbox(ptbox); // transfers the reference count to the undo object psunx->SetNfrmFirst(nfrmFirst); psunx->SetNfrmLast((nfrmLast == _nfrmLast) ? klwMax : nfrmLast); for (itbox = 0; itbox < _pglptbox->IvMac(); itbox++) { if (ptbox == PtboxFromItbox(itbox)) { psunx->SetItbox(itbox); break; } } AssertIn(itbox, 0, _pglptbox->IvMac()); psunx->SetAdd(fTrue); if (!_pmvie->FAddUndo(psunx)) { PushErc(ercSocNotUndoable); ReleasePpo(&psunx); return (fFalse); } ReleasePpo(&psunx); return (fTrue); } /**************************************************** * * This routine removes a text box from the scene. * * Parameters: * ptbox - Pointer to the text box to remove. * * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SCEN::FRemTboxCore(PTBOX ptbox) { AssertThis(0); AssertPo(ptbox, 0); PSEV qsev; long isev; long itbox; long nfrmStart, nfrmLast; // // Check if currently selected tbox. // if (ptbox == _ptboxSelected) { _ptboxSelected = pvNil; if (ptbox != pvNil) { ptbox->Select(fFalse); } } // // Find the text box // for (isev = 0; isev < _pggsevStart->IvMac(); isev++) { qsev = (PSEV)_pggsevStart->QvFixedGet(isev); if ((qsev->sevt == sevtAddTbox) && ((*(PTBOX *)_pggsevStart->QvGet(isev)) == ptbox)) { // // Remove it. Do not ReleasePpo() here as reference count // gets transfered to callee. // _pggsevStart->Delete(isev); // // Find it in the _pglptbox // for (itbox = 0; itbox < _pglptbox->IvMac(); itbox++) { if (*(PTBOX *)_pglptbox->QvGet(itbox) == ptbox) { if (_ptboxSelected == ptbox) { _ptboxSelected = pvNil; } _pglptbox->Delete(itbox); if (ptbox->FGetLifetime(&nfrmStart, &nfrmLast)) { // // This will guarantee that the tbox doesn't leave // any display on the rendering area. // AssertDo(ptbox->FGotoFrame(nfrmStart - 1), "Could not remove a text box"); } ReleasePpo(&ptbox); _MarkMovieDirty(); return (fTrue); } } Bug("Text box not found in GL"); return (fFalse); } } Bug("Error! Could not find text box for removal"); return (fFalse); } /**************************************************** * * This routine removes a text box from the scene, * creates an undo object for the action. * * Parameters: * ptbox - Pointer to the text box to remove. * * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SCEN::FRemTbox(PTBOX ptbox) { AssertThis(0); AssertPo(ptbox, 0); PSUNX psunx; long nfrmFirst, nfrmLast; psunx = SUNX::PsunxNew(); if (psunx == pvNil) { return (fFalse); } ptbox->AddRef(); ptbox->FGetLifetime(&nfrmFirst, &nfrmLast); psunx->SetTbox(ptbox); // transfers the reference count to the undo object psunx->SetAdd(fFalse); psunx->SetNfrmFirst(nfrmFirst); psunx->SetNfrmLast((nfrmLast == _nfrmLast) ? klwMax : nfrmLast); if (!_pmvie->FAddUndo(psunx)) { ReleasePpo(&psunx); return (fFalse); } ReleasePpo(&psunx); if (!FRemTboxCore(ptbox)) { _pmvie->ClearUndo(); return (fFalse); } return (fTrue); } /**************************************************** * * This routine gets the ith text box. * * Parameters: * itbox - Index of the text box to get. * * Returns: * Pointer to the text box if itbox is valid, else pvNil. * ****************************************************/ TBOX *SCEN::PtboxFromItbox(long itbox) { AssertThis(0); Assert(itbox >= 0, "Bad index value"); long ipo; PTBOX ptbox; for (ipo = 0; ipo < _pglptbox->IvMac(); ipo++) { _pglptbox->Get(ipo, &ptbox); itbox--; if (itbox == -1) { break; } } if (itbox != -1) { ptbox = pvNil; } return (ptbox); } /**************************************************** * * This routine adds/removes a pause to the scene at the current frame. * * Parameters: * pwit - The pause type, witNil removes a pause, returns old pause type. * pdts - Valid only if wit==witForTime, dts is in clock ticks, returns * old wait time if old wit was witForTime. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SCEN::FPauseCore(WIT *pwit, long *pdts) { AssertThis(0); AssertIn(*pwit, witNil, witLim); AssertIn(*pdts, 0, klwMax); SEV sev; long isev; PSEV qsev; SEVP sevp; WIT witOld; long dtsOld; // // Start at the first event of this frame. // for (isev = _isevFrmLim - 1; isev >= 0; isev--) { qsev = (PSEV)_pggsevFrm->QvFixedGet(isev); if (qsev->nfrm != _nfrmCur) { break; } // // Find a pause // if (qsev->sevt == sevtPause) { // // Replace the event // _pggsevFrm->Get(isev, &sevp); witOld = sevp.wit; dtsOld = sevp.dts; if (*pwit == witNil) { _pggsevFrm->Delete(isev); _isevFrmLim--; } else { sevp.wit = *pwit; sevp.dts = *pdts; _pggsevFrm->Put(isev, &sevp); } *pwit = witOld; *pdts = dtsOld; return (fTrue); } } // // Add pause to event list. // sev.nfrm = _nfrmCur; sev.sevt = sevtPause; sevp.wit = *pwit; sevp.dts = *pdts; if (!_FAddSev(&sev, size(long) * 2, &sevp)) { return (fFalse); } *pwit = witNil; *pdts = 0; return (fTrue); } /**************************************************** * * This routine adds/removes a pause to the scene at the current frame * and creates an undo object for the action. * * Parameters: * wit - The pause type, removes pause if wit==witNil. * dts - Valid only if wit==witForTime, dts is in clock ticks. * * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SCEN::FPause(WIT wit, long dts) { PSUNP psunp; psunp = SUNP::PsunpNew(); if (psunp == pvNil) { return (fFalse); } if (!FPauseCore(&wit, &dts)) { ReleasePpo(&psunp); return (fFalse); } psunp->SetWit(wit); psunp->SetDts(dts); psunp->SetAdd(fTrue); if (!_pmvie->FAddUndo(psunp)) { FPauseCore(&wit, &dts); ReleasePpo(&psunp); return (fFalse); } ReleasePpo(&psunp); return (fTrue); } /**************************************************** * * This routine sets the background for the scene. * * Parameters: * ptag - Pointer to the background tag to put on the scene. * ptagOld - Place to store the old background tag. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SCEN::FSetBkgdCore(PTAG ptag, PTAG ptagOld) { AssertThis(0); AssertVarMem(ptag); AssertVarMem(ptagOld); SEV sev; long isev; TAG tag; long vlm; bool fLoop; PMSND pmsnd; long sty; if (_pbkgd != pvNil) { // // Replace background // for (isev = 0; isev < _pggsevStart->IvMac(); isev++) { _pggsevStart->GetFixed(isev, &sev); if (sev.sevt == sevtSetBkgd) { _pggsevStart->Get(isev, ptagOld); if (!_pggsevStart->FPut(isev, size(TAG), ptag)) { return (fFalse); } _pbkgd->TurnOffLights(); ReleasePpo(&_pbkgd); _MarkMovieDirty(); if (!_FPlaySev(&sev, ptag, _grfscen)) { _pggsevStart->FPut(isev, size(TAG), ptagOld); _FPlaySev(&sev, ptagOld, _grfscen); return (fFalse); } AssertPo(_pbkgd, 0); _pbkgd->GetName(&_stnName); goto LSuccess; } } Bug("No background event found"); return (fFalse); } TrashVar(ptagOld); // // Add set background event and play it. // sev.sevt = sevtSetBkgd; if (!_pggsevStart->FInsert(0, size(TAG), ptag, &sev)) { return (fFalse); } if (!_FPlaySev(&sev, ptag, _grfscen)) { _pggsevStart->Delete(0); return (fFalse); } AssertPo(_pbkgd, 0); _pbkgd->GetName(&_stnName); _MarkMovieDirty(); LSuccess: while (_pggsevFrm->IvMac() != 0) { // // Remove stale scene events // _pggsevFrm->Delete(_pggsevFrm->IvMac() - 1); } _isevFrmLim = 0; // Add the default sound for the new background, if any _pbkgd->GetDefaultSound(&tag, &vlm, &fLoop); if (tag.sid != ksidInvalid) // new background sound { // Note: since FSetBkgdCore is only called at edit time, // it's okay to call FCacheTag. The background default // sound is not an intrinsic part of the BKGD...it's more // of a "serving suggestion" that the user can remove // once the background is added. Assert(!_pmvie->FPlaying(), "Shouldn't cache tags if movie is playing!"); if (vptagm->FCacheTagToHD(&tag)) { pmsnd = (PMSND)vptagm->PbacoFetch(&tag, MSND::FReadMsnd); if (pvNil != pmsnd) { sty = pmsnd->Sty(); ReleasePpo(&pmsnd); // non-destructive if we fail FAddSndCore(fLoop, fFalse, vlm, sty, 1, &tag); } } } _pmvie->Pmcc()->SceneChange(); if (vpcex != pvNil) { vpcex->EnqueueCid(cidSceneLoaded); } return (fTrue); } /**************************************************** * * This routine sets the background for the scene. * * Parameters: * pbkgd - Pointer to the background to put on the scene. * * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SCEN::FSetBkgd(PTAG ptag) { AssertThis(0); AssertVarMem(ptag); TAG tagOld; PSUNK psunk; long icam; if (_pbkgd != pvNil) { icam = _pbkgd->Icam(); } if (!FSetBkgdCore(ptag, &tagOld)) { return (fFalse); } #ifdef DEBUG long lw; TrashVar(&lw); Assert(tagOld.sid != lw, "Use CORE function to set first background"); #endif psunk = SUNK::PsunkNew(); if (psunk == pvNil) { if (!FSetBkgdCore(&tagOld, ptag)) { _pmvie->ClearUndo(); PushErc(ercSocNotUndoable); } return (fFalse); } psunk->SetTag(&tagOld); psunk->SetIcam(icam); psunk->SetFBkgd(fTrue); if (!_pmvie->FAddUndo(psunk)) { ReleasePpo(&psunk); if (!FSetBkgdCore(&tagOld, ptag)) { _pmvie->ClearUndo(); PushErc(ercSocNotUndoable); } return (fFalse); } ReleasePpo(&psunk); return (fTrue); } /**************************************************** * * This routine returns if a scene is currently empty * * Parameters: * None. * * Returns: * fTrue if the scene contains only camera changes and sounds * and is only 1 frame long, else fFalse. * ****************************************************/ bool SCEN::FIsEmpty(void) { AssertThis(0); long isev; SEV sev; if ((_pggsevStart->IvMac() != 1) || ((_nfrmLast - _nfrmFirst) > 0)) { return (fFalse); } for (isev = 0; isev < _pggsevFrm->IvMac(); isev++) { _pggsevFrm->GetFixed(isev, &sev); if (sev.sevt != sevtChngCamera && sev.sevt != sevtPlaySnd) { return (fFalse); } } return (fTrue); } /**************************************************** * * This routine changes the camera view point at this frame. * * Parameters: * icam - The camera number in the BKGD to switch to. * * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SCEN::FChangeCamCore(long icam, long *picamOld) { AssertThis(0); AssertIn(icam, 0, 500); AssertVarMem(picamOld); PSEV qsev, qsevOld; SEV sev; long isev, isevCam; // // Check for a current camera change. // *picamOld = 0; for (isev = _isevFrmLim - 1; isev >= 0; isev--) { qsev = (PSEV)_pggsevFrm->QvFixedGet(isev); if (qsev->sevt == sevtChngCamera) { if (qsev->nfrm == _nfrmCur) { // // Check if this new camera matches the previous // camera // for (isevCam = isev - 1; isevCam >= 0; isevCam--) { qsevOld = (PSEV)_pggsevFrm->QvFixedGet(isevCam); if (qsevOld->sevt == sevtChngCamera) { _pggsevFrm->Get(isevCam, picamOld); break; } } // // If they are equal, then change camera to // previous camera and remove this change event. // if (*picamOld == icam) { qsevOld = (PSEV)_pggsevFrm->QvFixedGet(isev); _pggsevFrm->Get(isev, picamOld); if (_FPlaySev(qsevOld, &icam, _grfscen)) { _pggsevFrm->Delete(isev); _isevFrmLim--; _MarkMovieDirty(); goto LSuccess; } return (fFalse); } // // Change it // _pggsevFrm->Get(isev, picamOld); _pggsevFrm->Put(isev, &icam); _MarkMovieDirty(); if (_FPlaySev(qsev, &icam, _grfscen)) { goto LSuccess; } return (fFalse); } else { _pggsevFrm->Get(isev, picamOld); break; } } } if (*picamOld == icam) { goto LSuccess; } // // Add camera change to event list. // sev.nfrm = _nfrmCur; sev.sevt = sevtChngCamera; if (_FAddSev(&sev, size(long), &icam)) { if (_FPlaySev(&sev, &icam, _grfscen)) { goto LSuccess; } else { _pggsevFrm->Delete(--_isevFrmLim); } } return (fFalse); LSuccess: // // Check for later camera change // for (isev = _isevFrmLim; isev < _pggsevFrm->IvMac(); isev++) { long icamNext; qsev = (PSEV)_pggsevFrm->QvFixedGet(isev); if (qsev->sevt == sevtChngCamera) { _pggsevFrm->Get(isev, &icamNext); if (icamNext == icam) { _pggsevFrm->Delete(isev); _isevFrmLim; } break; } } return (fTrue); } /**************************************************** * * This routine changes the camera view point at this frame * and creates an undo object for the action. * * Parameters: * icam - The camera number in the BKGD to switch to. * * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SCEN::FChangeCam(long icam) { long icamOld; PSUNK psunk; TAG tagCam; if (!vptagm->FBuildChildTag(&_tagBkgd, icam, kctgCam, &tagCam)) { return fFalse; } if (!vptagm->FCacheTagToHD(&tagCam)) { return fFalse; } if (!FChangeCamCore(icam, &icamOld)) { return (fFalse); } psunk = SUNK::PsunkNew(); if (psunk == pvNil) { if (!FChangeCamCore(icam, &icamOld)) { _pmvie->ClearUndo(); PushErc(ercSocNotUndoable); } return (fFalse); } psunk->SetIcam(icamOld); psunk->SetFBkgd(fFalse); if (!_pmvie->FAddUndo(psunk)) { ReleasePpo(&psunk); if (!FChangeCamCore(icam, &icamOld)) { _pmvie->ClearUndo(); PushErc(ercSocNotUndoable); } return (fFalse); } ReleasePpo(&psunk); return (fTrue); } /**************************************************** * * This routine reads in a scene from a chunky file. * * Parameters: * pcrf - Pointer to the chunky file to read from. * cno - Cno within the chunky file to read. * * Returns: * pvNil, if failure, else a pointer to the scene. * ****************************************************/ SCEN *SCEN::PscenRead(PMVIE pmvie, PCRF pcrf, CNO cno) { AssertPo(pmvie, 0); AssertPo(pcrf, 0); PSCEN pscen = pvNil; BLCK blck; KID kid; long isevFrm = 0; long isevStart = 0; SEV sev; PSEV qsev; short bo; PACTR pactr; PTBOX ptbox; CHID chid; SCENH scenh; PCFL pcfl; pcfl = pcrf->Pcfl(); // // Find the chunk and read in the header. // if (!pcfl->FFind(kctgScen, cno, &blck) || !blck.FUnpackData() || (blck.Cb() != size(SCENH)) || !blck.FReadRgb(&scenh, size(SCENH), 0)) { goto LFail0; } // // Check header for byte swapping // if (scenh.bo == kboOther) { SwapBytesBom(&scenh, kbomScenh); } else { Assert(scenh.bo == kboCur, "Bad Chunky file"); } // // Create our scene object. // pscen = NewObj SCEN(pmvie); if (pscen == pvNil) { goto LFail0; } pscen->_isevFrmLim = 0; // // Initialize roll call for actors // pscen->_pglpactr = GL::PglNew(size(PACTR), 0); if (pscen->_pglpactr == pvNil) { goto LFail0; } // // Initialize roll call for text boxes // pscen->_pglptbox = GL::PglNew(size(PTBOX), 0); if (pscen->_pglptbox == pvNil) { goto LFail0; } // // Read Frame information // pscen->_nfrmLast = scenh.nfrmLast; pscen->_nfrmFirst = scenh.nfrmFirst; pscen->_trans = scenh.trans; pscen->_nfrmCur = pscen->_nfrmFirst - 1; // // Read in thumbnail // if (pcfl->FGetKidChidCtg(kctgScen, cno, 0, kctgThumbMbmp, &kid) && pcfl->FFind(kid.cki.ctg, kid.cki.cno, &blck)) { pscen->_pmbmp = MBMP::PmbmpRead(&blck); } // // Read in GG of Frame events // if (!pcfl->FGetKidChidCtg(kctgScen, cno, 0, kctgFrmGg, &kid) || !pcfl->FFind(kid.cki.ctg, kid.cki.cno, &blck)) { goto LFail0; } pscen->_pggsevFrm = GG::PggRead(&blck, &bo); if (pscen->_pggsevFrm == pvNil) { goto LFail0; } Assert(pscen->_pggsevFrm->CbFixed() == size(SEV), "Bad GG read for event"); // // Convert all open tags to pointers. // for (; isevFrm < pscen->_pggsevFrm->IvMac(); isevFrm++) { qsev = (PSEV)pscen->_pggsevFrm->QvFixedGet(isevFrm); // // Swap byte ordering of entry // if (bo == kboOther) { SwapBytesBom((void *)qsev, kbomSev); } // // Open all tags // switch (qsev->sevt) { case sevtPlaySnd: PSSE psse; long itag; psse = SSE::PsseDupFromGg(pscen->_pggsevFrm, isevFrm, fFalse); if (pvNil == psse) goto LFail1; if (bo == kboOther) { psse->SwapBytes(); } for (itag = 0; itag < psse->ctagc; itag++) { if (!TAGM::FOpenTag(psse->Ptag(itag), pcrf, pcfl)) { while (itag-- > 0) TAGM::CloseTag(psse->Ptag(itag)); FreePpv((void **)&psse); // don't ReleasePpsse...tags are already closed goto LFail1; } } // Put SSE with opened tags back in GG pscen->_pggsevFrm->Put(isevFrm, psse); FreePpv((void **)&psse); // don't ReleasePpsse because GG keeps the tags break; case sevtChngCamera: case sevtPause: break; case sevtAddActr: case sevtSetBkgd: case sevtAddTbox: default: Assert(0, "Bad event in frame event list"); break; } } // // Read starting events // ReleasePpo(&pscen->_pggsevStart); if (!pcfl->FGetKidChidCtg(kctgScen, cno, 1, kctgStartGg, &kid) || !pcfl->FFind(kid.cki.ctg, kid.cki.cno, &blck)) { goto LFail1; } pscen->_pggsevStart = GG::PggRead(&blck, &bo); if (pscen->_pggsevStart == pvNil) { goto LFail1; } Assert(pscen->_pggsevStart->CbFixed() == size(SEV), "Bad GG read for event"); // // Convert all open tags to pointers. // for (; isevStart < pscen->_pggsevStart->IvMac(); isevStart++) { qsev = (PSEV)pscen->_pggsevStart->QvFixedGet(isevStart); // // Swap byte ordering of entry // if (bo == kboOther) { SwapBytesBom((void *)qsev, kbomSev); } // // Convert CHIDs to pointers // switch (qsev->sevt) { case sevtAddActr: pscen->_pggsevStart->Get(isevStart, &chid); if (bo == kboOther) { SwapBytesBom((void *)&chid, kbomLong); } if (!pcfl->FGetKidChidCtg(kctgScen, cno, chid, kctgActr, &kid)) { goto LFail1; } pactr = ACTR::PactrRead(pcrf, kid.cki.cno); AssertNilOrPo(pactr, 0); if (pactr == pvNil) { goto LFail1; } pscen->_pggsevStart->Put(isevStart, &pactr); break; case sevtAddTbox: pscen->_pggsevStart->Get(isevStart, &chid); if (bo == kboOther) { SwapBytesBom((void *)&chid, kbomLong); } if (!pcfl->FGetKidChidCtg(kctgScen, cno, chid, kctgTbox, &kid)) { goto LFail1; } ptbox = TBOX::PtboxRead(pcrf, kid.cki.cno, pscen); AssertNilOrPo(ptbox, 0); if (ptbox == pvNil) { goto LFail1; } pscen->_pggsevStart->Put(isevStart, &ptbox); break; case sevtSetBkgd: case sevtChngCamera: break; case sevtPause: case sevtPlaySnd: default: Bug("Bad event in start event list"); break; } } // // Read Name // pcfl->FGetName(kctgScen, cno, &pscen->_stnName); AssertPo(pscen, 0); return (pscen); LFail1: // // Destroy all created objects // while (isevStart--) { pscen->_pggsevStart->GetFixed(isevStart, &sev); switch (sev.sevt) { case sevtAddActr: pscen->_pggsevStart->Get(isevStart, &pactr); ReleasePpo(&pactr); break; case sevtAddTbox: pscen->_pggsevStart->Get(isevStart, &ptbox); ReleasePpo(&ptbox); break; case sevtChngCamera: case sevtSetBkgd: case sevtPause: break; } } ReleasePpo(&pscen->_pggsevStart); // // Destroy all created objects // while (isevFrm--) { pscen->_pggsevFrm->GetFixed(isevFrm, &sev); switch (sev.sevt) { case sevtAddActr: case sevtAddTbox: Bug("Bad event in frame list"); break; case sevtPlaySnd: PSSE qsse; long itag; qsse = (PSSE)pscen->_pggsevFrm->QvGet(isevFrm); if (qsse->Cb() != (pscen->_pggsevFrm->CbFixed() + pscen->_pggsevFrm->Cb(isevFrm))) { Bug("Wrong size for SSE in GG"); continue; } /* Close all tags; retrieve qsse each time...in theory, nothing that happens during CloseTag should cause mem to move, but this is a failure case, so it's okay to be slow, especially when we can be safe-not-sorry. */ for (itag = 0; itag < qsse->ctagc; itag++) { qsse = (PSSE)pscen->_pggsevFrm->QvGet(isevFrm); TAGM::CloseTag(qsse->Ptag(itag)); } break; case sevtSetBkgd: case sevtChngCamera: case sevtPause: break; } } ReleasePpo(&pscen->_pggsevFrm); LFail0: ReleasePpo(&pscen); return (pvNil); } /**************************************************** * * This routine plays all the starting events for a scene. * * Parameters: * None. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SCEN::FPlayStartEvents(bool fActorsOnly) { AssertThis(0); long isev; // // This needs to play all the events in _pggsevStart // for (isev = 0; isev < _pggsevStart->IvMac(); isev++) { SEV sev; _pggsevStart->GetFixed(isev, &sev); if (fActorsOnly && sev.sevt != sevtAddActr) continue; if (!_FPlaySev(&sev, _pggsevStart->QvGet(isev), _grfscen)) { return (fFalse); } } return (fTrue); } /**************************************************** * * This routine returns the bkgd tag in *ptag * ****************************************************/ bool SCEN::FGetTagBkgd(PTAG ptag) { AssertThis(0); AssertVarMem(ptag); SEV sev; long isevStart; for (isevStart = 0; isevStart < _pggsevStart->IvMac(); isevStart++) { sev = *(PSEV)_pggsevStart->QvFixedGet(isevStart); if (sevtSetBkgd == sev.sevt) { *ptag = *(PTAG)_pggsevStart->QvGet(isevStart); return fTrue; } } return fFalse; } /**************************************************** * * This routine writes a scene into a chunky file. * * Parameters: * pcrf - Pointer to the chunky file to write to. * pcno - Cno within the chunky file written to. * * Returns: * fFalse if it fails, else fTrue. * ****************************************************/ bool SCEN::FWrite(PCRF pcrf, CNO *pcno) { AssertThis(0); AssertPo(pcrf, 0); PGG pggFrmTemp = pvNil; PGG pggStartTemp = pvNil; SEV sev; CHID chidActr, chidTbox; CNO cnoChild, cnoFrmEvent, cnoStartEvent; SCENH scenh; long isevFrm = -1; long isevStart = -1; long cb; BLCK blck; PCFL pcfl; chidActr = chidTbox = 0; pcfl = pcrf->Pcfl(); *pcno = cnoNil; // // Get a new CNO for this chunk // if (!pcfl->FAdd(0, kctgScen, pcno)) { goto LFail; } // // Copy frame event GG to temporary GG // pggFrmTemp = GG::PggNew(size(SEV)); if (pggFrmTemp == pvNil) { goto LFail; } for (isevFrm = 0; isevFrm < _pggsevFrm->IvMac(); isevFrm++) { sev = *(PSEV)_pggsevFrm->QvFixedGet(isevFrm); // // Convert pointers in the GG to CHIDs // switch (sev.sevt) { case sevtPlaySnd: { bool fSuccess = fFalse; PSSE psse; long itag; KID kid; psse = SSE::PsseDupFromGg(_pggsevFrm, isevFrm); if (pvNil == psse) { goto LFail; } for (itag = 0; itag < psse->ctagc; itag++) { // For user sounds, the tag's cno must already be correct. // Note: FResolveSndTag can't succeed if the msnd chunk is // not yet a child of the scene. if (psse->Ptagc(itag)->tag.sid != ksidUseCrf) continue; // tag will be closed by ReleasePpsse // If the msnd chunk already exists as this chid of this scene, continue if (pcfl->FGetKidChidCtg(kctgScen, *pcno, *psse->Pchid(itag), kctgMsnd, &kid)) continue; // tag will be closed by ReleasePpsse // If the msnd does not exist in this file, it exists in the main movie if (!pcfl->FFind(kctgMsnd, psse->Ptag(itag)->cno)) continue; // tag will be closed by ReleasePpsse // The msnd chunk has not been adopted into the scene as the specified chid if (!pcfl->FAdoptChild(kctgScen, *pcno, kctgMsnd, psse->Ptag(itag)->cno, *psse->Pchid(itag))) { goto LEndPlaySnd; } } if (pggFrmTemp->FInsert(isevFrm, psse->Cb(), psse, &sev)) { fSuccess = fTrue; } LEndPlaySnd: ReleasePpsse(&psse); if (!fSuccess) { goto LFail; } break; } case sevtChngCamera: if (!pggFrmTemp->FInsert(isevFrm, size(long), _pggsevFrm->QvGet(isevFrm), &sev)) { goto LFail; } break; case sevtPause: if (!pggFrmTemp->FInsert(isevFrm, size(SEVP), _pggsevFrm->QvGet(isevFrm), &sev)) { goto LFail; } break; case sevtAddActr: case sevtSetBkgd: case sevtAddTbox: Assert(0, "Bad event in frame event list"); break; } } // // Copy start event GG to temporary GG // pggStartTemp = GG::PggNew(size(SEV)); if (pggStartTemp == pvNil) { goto LFail; } for (isevStart = 0; isevStart < _pggsevStart->IvMac(); isevStart++) { sev = *(PSEV)_pggsevStart->QvFixedGet(isevStart); // // Convert pointers in the GG to CHIDs // switch (sev.sevt) { case sevtAddActr: if (!pcfl->FAddChild(kctgScen, *pcno, chidActr, 0, kctgActr, &cnoChild)) { goto LFail; } if (!(*(PACTR *)_pggsevStart->QvGet(isevStart))->FWrite(pcfl, cnoChild, *pcno)) { goto LFail; } if (!pggStartTemp->FInsert(isevStart, size(CHID), &chidActr, &sev)) { goto LFail; } chidActr++; break; case sevtSetBkgd: if (!TAGM::FSaveTag((PTAG)_pggsevStart->QvGet(isevStart), pcrf, fFalse)) { goto LFail; } if (!pggStartTemp->FInsert(isevStart, size(TAG), _pggsevStart->QvGet(isevStart), &sev)) { goto LFail; } break; case sevtChngCamera: if (!pggStartTemp->FInsert(isevStart, size(long), _pggsevStart->QvGet(isevStart), &sev)) { goto LFail; } break; case sevtAddTbox: if (!pcfl->FAddChild(kctgScen, *pcno, chidTbox, 0, kctgTbox, &cnoChild)) { goto LFail; } if (!(*(PTBOX *)_pggsevStart->QvGet(isevStart))->FWrite(pcfl, cnoChild)) { goto LFail; } if (!pggStartTemp->FInsert(isevStart, size(CHID), &chidTbox, &sev)) { goto LFail; } chidTbox++; break; case sevtPause: case sevtPlaySnd: default: Assert(0, "Bad event in frame event list"); break; } } // // Save info into scene chunk // cb = pggFrmTemp->CbOnFile(); if (!pcfl->FAdd(cb, kctgFrmGg, &cnoFrmEvent, &blck)) { goto LFail; } if (!pggFrmTemp->FWrite(&blck)) { pcfl->Delete(kctgFrmGg, cnoFrmEvent); goto LFail; } if (!pcfl->FAdoptChild(kctgScen, *pcno, kctgFrmGg, cnoFrmEvent, 0)) { pcfl->Delete(kctgFrmGg, cnoFrmEvent); goto LFail; } pcfl->SetLoner(kctgFrmGg, cnoFrmEvent, fFalse); cb = pggStartTemp->CbOnFile(); if (!pcfl->FAdd(cb, kctgStartGg, &cnoStartEvent, &blck)) { goto LFail; } if (!pggStartTemp->FWrite(&blck)) { pcfl->Delete(kctgStartGg, cnoStartEvent); goto LFail; } if (!pcfl->FAdoptChild(kctgScen, *pcno, kctgStartGg, cnoStartEvent, 1)) { pcfl->Delete(kctgStartGg, cnoStartEvent); goto LFail; } pcfl->SetLoner(kctgStartGg, cnoStartEvent, fFalse); // // Save thumbnail, if there is one. // _UpdateThumbnail(); if (_pmbmp != pvNil) { cb = _pmbmp->CbOnFile(); if (!pcfl->FAdd(cb, kctgThumbMbmp, &cnoChild, &blck)) { goto LFail; } if (!_pmbmp->FWrite(&blck)) { pcfl->Delete(kctgThumbMbmp, cnoChild); goto LFail; } if (!pcfl->FAdoptChild(kctgScen, *pcno, kctgThumbMbmp, cnoChild, 0)) { pcfl->Delete(kctgThumbMbmp, cnoChild); goto LFail; } pcfl->SetLoner(kctgThumbMbmp, cnoChild, fFalse); } // // Create header buffer for scene chunk // scenh.bo = kboCur; scenh.osk = koskCur; scenh.nfrmLast = _nfrmLast; scenh.nfrmFirst = _nfrmFirst; scenh.trans = _trans; // // Write scene chunk // if (!pcfl->FSetName(kctgScen, *pcno, &_stnName)) { goto LFail; } if (!pcfl->FPutPv((void *)&scenh, size(SCENH), kctgScen, *pcno)) { goto LFail; } ReleasePpo(&pggFrmTemp); ReleasePpo(&pggStartTemp); return (fTrue); LFail: // // Delete chunks createdk. // if (*pcno != cnoNil) { pcfl->Delete(kctgScen, *pcno); } ReleasePpo(&pggStartTemp); ReleasePpo(&pggFrmTemp); return (fFalse); } /**************************************************** * * This routine resolves all sound tags * * Parameters: * None * Returns: * None * ****************************************************/ bool SCEN::FResolveAllSndTags(CNO cnoScen) { AssertThis(0); long ipactr, ipactrMac; long isev, isevMac; bool fSuccess = fFalse; ipactrMac = _pglpactr->IvMac(); for (ipactr = 0; ipactr < ipactrMac; ipactr++) { PACTR pactr; _pglpactr->Get(ipactr, &pactr); if (!pactr->FResolveAllSndTags(cnoScen)) goto LFail; } _pggsevFrm->Lock(); isevMac = _pggsevFrm->IvMac(); for (isev = 0; isev < isevMac; isev++) { long itag; PSSE psse; SEV sev; sev = *(PSEV)_pggsevFrm->QvFixedGet(isev); if (sev.sevt != sevtPlaySnd) continue; psse = (PSSE)_pggsevFrm->QvGet(isev); for (itag = 0; itag < psse->ctagc; itag++) { if (psse->Ptag(itag)->sid == ksidUseCrf) { if (!_pmvie->FResolveSndTag(psse->Ptag(itag), *psse->Pchid(itag), cnoScen)) { goto LFail; } } } } _pggsevFrm->Unlock(); fSuccess = fTrue; LFail: return fSuccess; } /**************************************************** * * This routine removes all actors from movie's roll call. * * Parameters: * fDelIfOnlyRef -- fTrue indicates to remove the roll-call entry * if a given actr is only referenced by this scene. * * Returns: * None * ****************************************************/ void SCEN::RemActrsFromRollCall(bool fDelIfOnlyRef) { AssertThis(0); PACTR pactr; long ipactr; for (ipactr = 0; ipactr < _pglpactr->IvMac(); ipactr++) { _pglpactr->Get(ipactr, &pactr); Pmvie()->RemFromRollCall(pactr, fDelIfOnlyRef); } } /**************************************************** * * This routine adds all actors to movie's roll call. * * Parameters: * None * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SCEN::FAddActrsToRollCall(void) { AssertThis(0); PACTR pactr; long ipactr; STN stn; for (ipactr = 0; ipactr < _pglpactr->IvMac(); ipactr++) { _pglpactr->Get(ipactr, &pactr); AssertPo(pactr, 0); pactr->GetName(&stn); if (!Pmvie()->FAddToRollCall(pactr, &stn)) { for (; ipactr > 0;) { ipactr--; _pglpactr->Get(ipactr, &pactr); Pmvie()->RemFromRollCall(pactr); } return (fFalse); } } return (fTrue); } /**************************************************** * * This routine returns the scene's thumbnail. * * Parameters: * None * * Returns: * None * ****************************************************/ PMBMP SCEN::PmbmpThumbnail(void) { AssertThis(0); _UpdateThumbnail(); return (_pmbmp); } /**************************************************** * * This routine updates the mbmp associated with the * thumbnail for the scene. * * Parameters: * None * * Returns: * None * ****************************************************/ void SCEN::_UpdateThumbnail(void) { AssertThis(0); long nfrmCur; PGPT pgpt, pgptThumb; PMVU pmvu; PTBOX ptbox = PtboxSelected(); PACTR pactr = PactrSelected(); RC rc, rcThumb; long grfscenSave; long dtimSnd; dtimSnd = Pmvie()->Pmsq()->DtimSnd(); Pmvie()->Pmsq()->SndOff(); pmvu = (PMVU)Pmvie()->PddgGet(0); if ((_pbkgd == pvNil) || (pmvu == pvNil)) { goto LEnd; } AssertPo(pmvu, 0); if (!Pmvie()->FDirty()) { goto LEnd; } rc.Set(0, 0, Pmvie()->Pmcc()->Dxp(), Pmvie()->Pmcc()->Dyp()); pgpt = GPT::PgptNewOffscreen(&rc, 8); if (pgpt == pvNil) { goto LEnd; } AssertPo(pgpt, 0); rcThumb.Set(0, 0, kdxpThumbnail, kdypThumbnail); pgptThumb = GPT::PgptNewOffscreen(&rcThumb, 8); if (pgptThumb == pvNil) { ReleasePpo(&pgpt); goto LEnd; } AssertPo(pgptThumb, 0); pgptThumb->SetOffscreenColors(Pmvie()->PglclrThumbPalette()); grfscenSave = _grfscen; Disable(fscenPauses | fscenSounds); nfrmCur = _nfrmCur; if ((_nfrmCur != _nfrmFirst) && !FGotoFrm(_nfrmFirst)) { ReleasePpo(&pgpt); ReleasePpo(&pgptThumb); _grfscen = grfscenSave; goto LEnd; } if (pmvu->FTextMode()) { SelectTbox(pvNil); } else { SelectActr(pvNil); } pmvu->DrawTree(pgpt, pvNil, &rc, fgobNoVis); if (pmvu->FTextMode()) { SelectTbox(ptbox); } else { SelectActr(pactr); } BLOCK { GNV gnv(pgpt); GNV gnvThumb(pgptThumb); gnvThumb.CopyPixels(&gnv, &rc, &rcThumb); ReleasePpo(&_pmbmp); _pmbmp = MBMP::PmbmpNew(pgptThumb->PrgbLockPixels(), pgptThumb->CbRow(), kdypThumbnail, &rcThumb, 0, 0, kbTransparent); pgptThumb->Unlock(); ReleasePpo(&pgpt); ReleasePpo(&pgptThumb); if ((nfrmCur > _nfrmFirst) && (nfrmCur <= _nfrmLast)) { FGotoFrm(nfrmCur); } _grfscen = grfscenSave; } LEnd: Pmvie()->Pmsq()->SndOnDtim(dtimSnd); return; } /**************************************************** * * This routine marks the movie as dirty. * * Parameters: * fDirty - Set dirty or not. * * Returns: * None * ****************************************************/ void SCEN::MarkDirty(bool fDirty) { AssertThis(0); if (fDirty) { _MarkMovieDirty(); } } /**************************************************** * * This routine pastes an actor into the current scene * * Parameters: * pactr - Pointer to the actor to paste * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SCEN::FPasteActrCore(PACTR pactr) { AssertThis(0); AssertPo(pactr, 0); // // Paste the actor. // if (!pactr->FPaste(_nfrmCur, this)) { return (fFalse); } // // Add the actor // if (!FAddActrCore(pactr)) { return (fFalse); } InvalFrmRange(); if (!pactr->FGotoFrame(_nfrmCur)) { RemActrCore(pactr->Arid()); return (fFalse); } _MarkMovieDirty(); _pmvie->Pmcc()->UpdateRollCall(); UpdateSndFrame(); return (fTrue); } /**************************************************** * * This routine pastes an actor into the current scene * and creates an undo object for the action. * * NOTE: This does not need an undo object, since the * tool is getting set to a "place" tool, which will * create the appropriate undo type. * * Parameters: * pactr - Pointer to the actor to paste * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SCEN::FPasteActr(PACTR pactr) { AssertThis(0); AssertPo(pactr, 0); if (!FPasteActrCore(pactr)) { return (fFalse); } return (fTrue); } /**************************************************** * * This routine makes all actors go to a specific frame. * * Parameters: * nfrm - Frame number to go to. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SCEN::_FForceActorsToFrm(long nfrm, bool *pfSoundInFrame) { AssertThis(0); AssertIn(nfrm, klwMin, klwMax); PACTR pactr; long iactr; for (iactr = 0; iactr < _pglpactr->IvMac(); iactr++) { _pglpactr->Get(iactr, &pactr); AssertPo(pactr, 0); if (!pactr->FGotoFrame(nfrm, pfSoundInFrame)) { return (fFalse); } } return (fTrue); } /**************************************************** * * This routine makes all text boxes go to a specific frame. * * Parameters: * nfrm - Frame number to go to. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SCEN::_FForceTboxesToFrm(long nfrm) { AssertThis(0); AssertIn(nfrm, klwMin, klwMax); PTBOX ptbox; long itbox; for (itbox = 0; itbox < _pglptbox->IvMac(); itbox++) { _pglptbox->Get(itbox, &ptbox); AssertPo(ptbox, 0); if (!ptbox->FGotoFrame(nfrm)) { return (fFalse); } } return (fTrue); } /**************************************************** * * Hides all text boxes in this scene * * Parameters: * None. * * Returns: * None. * ****************************************************/ void SCEN::HideTboxes(void) { AssertThis(0); PTBOX ptbox; long iptbox; long nfrmStart, nfrmLast; for (iptbox = 0; iptbox < _pglptbox->IvMac(); iptbox++) { _pglptbox->Get(iptbox, &ptbox); AssertPo(ptbox, 0); if (ptbox->FGetLifetime(&nfrmStart, &nfrmLast)) { AssertDo(ptbox->FGotoFrame(nfrmStart - 1), "Could not remove a text box"); } } } /**************************************************** * * Hides all actors in this scene * * Parameters: * * Returns: * None. * ****************************************************/ void SCEN::HideActors(void) { AssertThis(0); PACTR pactr; long ipactr; for (ipactr = 0; ipactr < _pglpactr->IvMac(); ipactr++) { _pglpactr->Get(ipactr, &pactr); AssertPo(pactr, 0); pactr->Hide(); } } /**************************************************** * * Shows all actors in this scene * * Parameters: * * Returns: * None. * ****************************************************/ void SCEN::ShowActors(void) { AssertThis(0); PACTR pactr; long ipactr; for (ipactr = 0; ipactr < _pglpactr->IvMac(); ipactr++) { _pglpactr->Get(ipactr, &pactr); AssertPo(pactr, 0); pactr->Show(); } } /**************************************************** * * This routine marks the movie dirty. * * Parameters: * None * * Returns: * None. * ****************************************************/ void SCEN::_MarkMovieDirty() { AssertThis(0); if (_pmvie != pvNil) { _pmvie->SetDirty(); } } /**************************************************** * * This routine sets the scene to the given movie * * Parameters: * pmvie - The new parent movie * * Returns: * None. * ****************************************************/ void SCEN::SetMvie(PMVIE pmvie) { AssertThis(0); AssertPo(pmvie, 0); _pmvie = pmvie; } /**************************************************** * * This routine reads from a chunky file and creates * a list of all the tags in the scene. * * Parameters: * pcfl - Pointer to the chunky file to read from. * cno - Cno within the chunky file to read. * ptagl - tag list to put tags in * * Returns: * fFalse if an error occurred, else fTrue * ****************************************************/ bool SCEN::FAddTagsToTagl(PCFL pcfl, CNO cno, PTAGL ptagl) { AssertPo(pcfl, 0); AssertPo(ptagl, 0); BLCK blck; KID kid; long isev; PSEV qsev; short bo; PGG pggsev; TAG tag; TAG tagBkgd; PGL pgltagSrc; TAG tagSrc; long itagSrc; CHID chid; tagBkgd.sid = ksidInvalid; // // Read starting events // if (!pcfl->FGetKidChidCtg(kctgScen, cno, 1, kctgStartGg, &kid)) { return fFalse; } if (!pcfl->FFind(kid.cki.ctg, kid.cki.cno, &blck)) { return fFalse; } pggsev = GG::PggRead(&blck, &bo); if (pggsev == pvNil) { return fFalse; } Assert(pggsev->CbFixed() == size(SEV), "Bad GG read for event"); // // Find all tags in starting events // for (isev = 0; isev < pggsev->IvMac(); isev++) { qsev = (PSEV)pggsev->QvFixedGet(isev); // // Swap byte ordering of entry // if (bo == kboOther) { SwapBytesBom((void *)qsev, kbomSev); } // // Find appropriate event types // switch (qsev->sevt) { case sevtAddActr: pggsev->Get(isev, &chid); if (bo == kboOther) { SwapBytesBom((void *)&chid, kbomLong); } if (!pcfl->FGetKidChidCtg(kctgScen, cno, chid, kctgActr, &kid)) { ReleasePpo(&pggsev); return fFalse; } else { bool fError; pgltagSrc = ACTR::PgltagFetch(pcfl, kid.cki.cno, &fError); if (fError) { ReleasePpo(&pgltagSrc); ReleasePpo(&pggsev); return fFalse; } if (pgltagSrc != pvNil) { for (itagSrc = 0; itagSrc < pgltagSrc->IvMac(); itagSrc++) { pgltagSrc->Get(itagSrc, &tagSrc); if (!ptagl->FInsertTag(&tagSrc)) { ReleasePpo(&pgltagSrc); ReleasePpo(&pggsev); return fFalse; } } ReleasePpo(&pgltagSrc); } } break; case sevtSetBkgd: pggsev->Get(isev, &tag); if (bo == kboOther) { SwapBytesBom((void *)&tag, kbomTag); } if (!BKGD::FAddTagsToTagl(&tag, ptagl)) { ReleasePpo(&pggsev); return fFalse; } tagBkgd = tag; break; case sevtAddTbox: break; case sevtPlaySnd: case sevtChngCamera: case sevtPause: default: Bug("Bad event in start event list"); break; } } ReleasePpo(&pggsev); // // Read in GG of Frame events // if (!pcfl->FGetKidChidCtg(kctgScen, cno, 0, kctgFrmGg, &kid)) { return fFalse; } if (!pcfl->FFind(kid.cki.ctg, kid.cki.cno, &blck)) { return fFalse; } pggsev = GG::PggRead(&blck, &bo); if (pggsev == pvNil) { return fFalse; } Assert(pggsev->CbFixed() == size(SEV), "Bad GG read for event"); // // Look in all events for tags // for (isev = 0; isev < pggsev->IvMac(); isev++) { qsev = (PSEV)pggsev->QvFixedGet(isev); // // Swap byte ordering of entry // if (bo == kboOther) { SwapBytesBom((void *)qsev, kbomSev); } // // Find appropriate event types // switch (qsev->sevt) { case sevtChngCamera: pggsev->Get(isev, &chid); if (bo == kboOther) { SwapBytesBom((void *)&chid, kbomLong); } if (tagBkgd.sid == ksidInvalid) { Bug("no background event!?"); ReleasePpo(&pggsev); return fFalse; } if (!ptagl->FInsertChild(&tagBkgd, chid, kctgCam)) { ReleasePpo(&pggsev); return fFalse; } break; case sevtPause: break; case sevtPlaySnd: PSSE psse; long itag; psse = SSE::PsseDupFromGg(pggsev, isev, fFalse); if (pvNil == psse) { ReleasePpo(&pggsev); return fFalse; } if (bo == kboOther) { psse->SwapBytes(); } // // Insert the tags in order // for (itag = 0; itag < psse->ctagc; itag++) { if (!ptagl->FInsertTag(psse->Ptag(itag))) { ReleasePpsse(&psse); ReleasePpo(&pggsev); return fFalse; } } ReleasePpsse(&psse); break; case sevtAddActr: case sevtSetBkgd: case sevtAddTbox: default: Bug("Bad event in frame event list"); break; } } ReleasePpo(&pggsev); return fTrue; } /**************************************************** * * This returns the actor in the current scene with * the given arid. * * Parameters: * Arid to look for. * * Returns: * pvNil if failure, else the actor. * ****************************************************/ PACTR SCEN::PactrFromArid(long arid) { AssertThis(0); Assert(arid != aridNil, "Bad long"); long iactr; PACTR pactr; // // Search current scene for the actor. // for (iactr = 0; iactr < _pglpactr->IvMac(); iactr++) { _pglpactr->Get(iactr, &pactr); if (pactr->Arid() == arid) { return (pactr); } } return (pvNil); } /**************************************************** * * This routine chops off the rest of the scene. * * Parameters: * None. * * Returns: * fTrue is successful, else fFalse if failure. * ****************************************************/ bool SCEN::FChopCore() { AssertThis(0); PTBOX ptbox; PACTR pactr; bool fAlive; long ipo; long nfrmStart, nfrmLast; if (_nfrmCur == _nfrmLast) { return (fTrue); } // // Chop all actors off // for (ipo = 0; ipo < _pglpactr->IvMac();) { _pglpactr->Get(ipo, &pactr); AssertPo(pactr, 0); pactr->DeleteFwdCore(fTrue, &fAlive); if (!fAlive) { RemActrCore(pactr->Arid()); } else { ipo++; } } // // Chop all text boxes off // for (ipo = 0; ipo < _pglptbox->IvMac();) { _pglptbox->Get(ipo, &ptbox); AssertPo(ptbox, 0); if (ptbox->FGetLifetime(&nfrmStart, &nfrmLast) && (nfrmStart > _nfrmCur)) { // // Ok if this fails. // FRemTboxCore(ptbox); } else { if (nfrmLast >= _nfrmCur) { // // Here we extend the lifetime of the text box to // infinite, cuz we removed the frame with the // Hide(). // if (ptbox->FGotoFrame(klwMax - 1)) { ptbox->FShowCore(); ptbox->FGotoFrame(_nfrmCur); } } ipo++; } } // // Remove all scene events from here forward // for (; _isevFrmLim < _pggsevFrm->IvMac();) { _pggsevFrm->Delete(_isevFrmLim); } // // Set new limit // if (_nfrmLast != _nfrmCur) { _nfrmLast = _nfrmCur; Pmvie()->SetDirty(); } return (fTrue); } /**************************************************** * * This routine chops off the rest of the scene and * creates an undo object as well. * * Parameters: * None. * * Returns: * fTrue is successful, else fFalse if failure. * ****************************************************/ bool SCEN::FChop() { PSUNC psunc; bool fValid; if (_nfrmCur == _nfrmLast) { return (fTrue); } psunc = SUNC::PsuncNew(); if (psunc != pvNil) { fValid = psunc->FSave(this); } else { fValid = fFalse; } if (!fValid || !Pmvie()->FAddUndo(psunc)) { ReleasePpo(&psunc); return (fFalse); } ReleasePpo(&psunc); if (!FChopCore()) { Pmvie()->ClearUndo(); return (fFalse); } return (fTrue); } /**************************************************** * * This routine chops off the rest of the scene, backwards * * Parameters: * None. * * Returns: * fTrue is successful, else fFalse if failure. * ****************************************************/ bool SCEN::FChopBackCore() { AssertThis(0); PTBOX ptbox; PACTR pactr; SEV sev; bool fAlive; bool fCopyCam; long ipo; long nfrmStart, nfrmLast; if (_nfrmCur == _nfrmFirst) { return (fTrue); } // // Chop all actors off // for (ipo = 0; ipo < _pglpactr->IvMac();) { _pglpactr->Get(ipo, &pactr); AssertPo(pactr, 0); pactr->DeleteBackCore(&fAlive); if (!fAlive) { RemActrCore(pactr->Arid()); } else { ipo++; } } // // Chop all text boxes off // for (ipo = 0; ipo < _pglptbox->IvMac();) { _pglptbox->Get(ipo, &ptbox); AssertPo(ptbox, 0); if (ptbox->FGetLifetime(&nfrmStart, &nfrmLast) && (nfrmLast < _nfrmCur)) { // // Ok if this fails. // FRemTboxCore(ptbox); } else { if (nfrmStart < _nfrmCur) { Assert(ptbox->FIsVisible(), "Bad tbox"); ptbox->SetStartFrame(_nfrmCur); } ipo++; } } // // Remove all scene events from here backward, except camera // changes, keep the most recent camera change. // fCopyCam = fTrue; for (; _isevFrmLim > 0;) { _isevFrmLim--; _pggsevFrm->GetFixed(_isevFrmLim, &sev); if ((sev.sevt == sevtChngCamera) && (fCopyCam)) { fCopyCam = fFalse; sev.nfrm = _nfrmCur; _pggsevFrm->PutFixed(_isevFrmLim, &sev); } else { if (sev.nfrm == _nfrmCur) { continue; } _pggsevFrm->Delete(_isevFrmLim); } } _isevFrmLim = 0; for (; _isevFrmLim < _pggsevFrm->IvMac(); _isevFrmLim++) { _pggsevFrm->GetFixed(_isevFrmLim, &sev); if (sev.nfrm != _nfrmCur) { break; } } // // Set new limit // if (_nfrmFirst != _nfrmCur) { _nfrmFirst = _nfrmCur; Pmvie()->SetDirty(); } // // If _psseBkgd got chopped, get rid of it // if (_psseBkgd != pvNil && _nfrmSseBkgd < _nfrmFirst) { ReleasePpsse(&_psseBkgd); TrashVar(&_nfrmSseBkgd); } return (fTrue); } /**************************************************** * * This routine chops off the rest of the scene, backwards, * and creates an undo object as well. * * Parameters: * None. * * Returns: * fTrue is successful, else fFalse if failure. * ****************************************************/ bool SCEN::FChopBack() { PSUNC psunc; bool fValid; if (_nfrmCur == _nfrmFirst) { return (fTrue); } psunc = SUNC::PsuncNew(); if (psunc != pvNil) { fValid = psunc->FSave(this); } else { fValid = fFalse; } if (!fValid || !Pmvie()->FAddUndo(psunc)) { ReleasePpo(&psunc); return (fFalse); } ReleasePpo(&psunc); if (!FChopBackCore()) { Pmvie()->ClearUndo(); return (fFalse); } return (fTrue); } /**************************************************** * * This routine does any startup for playback * * Parameters: * None. * * Returns: * None. * ****************************************************/ bool SCEN::FStartPlaying() { AssertThis(0); long ipactr, iptbox; PACTR pactr; PTBOX ptbox; PTBXG ptbxg; long nfrmFirst, nfrmLast; // // Make sure all actors have state variables updated // (they might not be in the theater right after // loading the movie) // for (ipactr = 0; ipactr < _pglpactr->IvMac(); ipactr++) { _pglpactr->Get(ipactr, &pactr); if (!pactr->FGetLifetime(&nfrmFirst, &nfrmLast)) return fFalse; } for (iptbox = 0; iptbox < _pglptbox->IvMac(); iptbox++) { _pglptbox->Get(iptbox, &ptbox); if ((ptbox->FStory() && ptbox->FIsVisible()) || (!ptbox->FStory() && ptbox->FGetLifetime(&nfrmFirst, &nfrmLast) && (nfrmFirst == _nfrmCur))) { ptbxg = (PTBXG)ptbox->PddgGet(0); ptbxg->Scroll(scaNil); } } // // Start prerendering at this frame, even if there's // no camera view change. // _DoPrerenderingWork(fTrue); return fTrue; } /**************************************************** * * This routine cleans up after a playback has stopped. * * Parameters: * None. * * Returns: * None. * ****************************************************/ void SCEN::StopPlaying() { AssertThis(0); long itbox; PTBOX ptbox; _EndPrerendering(); // Stop prerendering for (itbox = 0; itbox < _pglptbox->IvMac(); itbox++) { _pglptbox->Get(itbox, &ptbox); AssertPo(ptbox, 0); ptbox->CleanDdg(); } } /****************************************************************************** FTransOnFile For a given SCEN chunk on a given CRF, get the scene transition state for the scene. Arguments: PCRF pcrf -- the chunky resource file the SCEN lives on CNO cno -- the CNO of the SCEN chunk TRANS *ptrans -- pointer to memory to take the transition setting Returns: fTrue if it was able to set *ptrans, fFalse if something failed ************************************************************ PETED ***********/ bool SCEN::FTransOnFile(PCRF pcrf, CNO cno, TRANS *ptrans) { BLCK blck; SCENH scenh; PCFL pcfl = pcrf->Pcfl(); TrashVar(ptrans); if (!pcfl->FFind(kctgScen, cno, &blck)) goto LFail; if (!blck.FUnpackData() || blck.Cb() != size(SCENH)) goto LFail; if (!blck.FReadRgb(&scenh, size(SCENH), 0)) goto LFail; *ptrans = scenh.trans; return fTrue; LFail: return fFalse; } /****************************************************************************** FSetTransOnFile For a given SCEN chunk on a given CRF, set the scene transition state for the scene. Arguments: PCRF pcrf -- the chunky resource file the SCEN lives on CNO cno -- the CNO of the SCEN chunk TRANS trans -- the transition state to use Returns: fTrue if the routine could guarantee that the scene has the given transition state. ************************************************************ PETED ***********/ bool SCEN::FSetTransOnFile(PCRF pcrf, CNO cno, TRANS trans) { BLCK blck; SCENH scenh; PCFL pcfl = pcrf->Pcfl(); if (!pcfl->FFind(kctgScen, cno, &blck)) goto LFail; if (!blck.FUnpackData() || blck.Cb() != size(SCENH)) goto LFail; if (!blck.FReadRgb(&scenh, size(SCENH), 0)) goto LFail; if (scenh.trans != trans) { scenh.trans = trans; if (!pcfl->FPutPv(&scenh, size(SCENH), kctgScen, cno)) goto LFail; } return fTrue; LFail: return fFalse; } // // // // UNDO STUFF // // // /**************************************************** * * Public constructor for scene undo objects for name * related commands. * * Parameters: * None. * * Returns: * pvNil if failure, else a pointer to the movie undo. * ****************************************************/ PSUNT SUNT::PsuntNew() { PSUNT psunt; psunt = NewObj SUNT(); return (psunt); } /**************************************************** * * Destructor for scene naming undo objects * ****************************************************/ SUNT::~SUNT(void) { AssertBaseThis(0); } /**************************************************** * * Does a command stored in an undo object. * * Parameters: * None. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SUNT::FDo(PDOCB pdocb) { AssertThis(0); STN stn; if (!_pmvie->FSwitchScen(_iscen)) { _pmvie->Pmsq()->FlushMsq(); _pmvie->ClearUndo(); return (fFalse); } _pmvie->Pscen()->GetName(&stn); _pmvie->Pscen()->SetNameCore(&_stn); _stn = stn; _pmvie->Pmsq()->FlushMsq(); return (fTrue); } /**************************************************** * * Undoes a command stored in an undo object. * * Parameters: * None. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SUNT::FUndo(PDOCB pdocb) { AssertThis(0); return (FDo(pdocb)); } #ifdef DEBUG /**************************************************** * Mark memory used by the SUNT * * Parameters: * None. * * Returns: * None. * ****************************************************/ void SUNT::MarkMem(void) { AssertThis(0); SUNT_PAR::MarkMem(); } /*************************************************************************** Assert the validity of the SUNT. ***************************************************************************/ void SUNT::AssertValid(ulong grf) { } #endif /**************************************************** * * Public constructor for scene undo objects for sound * related commands. * * Parameters: * None. * * Returns: * pvNil if failure, else a pointer to the movie undo. * ****************************************************/ PSUNS SUNS::PsunsNew() { PSUNS psuns; psuns = NewObj SUNS(); return (psuns); } /**************************************************** * * Destructor for scene sound undo objects * ****************************************************/ SUNS::~SUNS(void) { AssertBaseThis(0); ReleasePpsse(&_psse); } /**************************************************** * * Does a command stored in an undo object. * * Parameters: * None. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SUNS::FDo(PDOCB pdocb) { AssertThis(0); AssertPo(pdocb, 0); long isevSnd = ivNil; bool fFound; PSSE psseOld = pvNil; if (!_pmvie->FSwitchScen(_iscen)) { _pmvie->ClearUndo(); return (fFalse); } if (!_pmvie->Pscen()->FGotoFrm(_nfrm)) { _pmvie->ClearUndo(); return (fFalse); } _pmvie->Pmsq()->FlushMsq(); // swap the event in the event list (if any) with _psse (if any) if (!_pmvie->Pscen()->FGetSnd(_sty, &fFound, &psseOld)) { _pmvie->ClearUndo(); return (fFalse); } if (_psse != pvNil) { if (fFound) { _pmvie->Pscen()->RemSndCore(psseOld->sty); if (!_pmvie->Pscen()->FAddSndCoreTagc(_psse->fLoop, fFalse, _psse->vlm, _psse->sty, _psse->ctagc, _psse->Ptagc(0))) { ReleasePpsse(&psseOld); _pmvie->ClearUndo(); return (fFalse); } ReleasePpsse(&_psse); _psse = psseOld; _sty = psseOld->sty; } else // no sse to replace, just add this one { if (!_pmvie->Pscen()->FAddSndCoreTagc(_psse->fLoop, fFalse, _psse->vlm, _psse->sty, _psse->ctagc, _psse->Ptagc(0))) { _pmvie->ClearUndo(); return (fFalse); } ReleasePpsse(&_psse); } } else // _psse is pvNil...remember what's there then nuke the event { if (!fFound) { Bug("where's the sound event?"); return (fFalse); } else { if (!FSetSnd(psseOld)) { _pmvie->ClearUndo(); return (fFalse); } ReleasePpsse(&psseOld); _pmvie->Pscen()->RemSndCore(_sty); } } _pmvie->Pmsq()->PlayMsq(); return (fTrue); } /**************************************************** * * Undoes a command stored in an undo object. * * Parameters: * None. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SUNS::FUndo(PDOCB pdocb) { AssertThis(0); AssertPo(pdocb, 0); return FDo(pdocb); } #ifdef DEBUG /**************************************************** * Mark memory used by the SUNS * * Parameters: * None. * * Returns: * None. * ****************************************************/ void SUNS::MarkMem(void) { AssertThis(0); SUNS_PAR::MarkMem(); if (_psse != pvNil) MarkPv(_psse); } /*************************************************************************** Assert the validity of the SUNS. ***************************************************************************/ void SUNS::AssertValid(ulong grf) { SUNS_PAR::AssertValid(grf); if (_psse != pvNil) { AssertPvCb(_psse, size(SSE)); AssertPvCb(_psse, _psse->Cb()); Assert(_sty == _psse->sty, "sty's don't match"); } } #endif /**************************************************** * * Public constructor for scene undo objects for actor * related commands. * * Parameters: * None. * * Returns: * pvNil if failure, else a pointer to the movie undo. * ****************************************************/ PSUNA SUNA::PsunaNew() { PSUNA psuna; psuna = NewObj SUNA(); return (psuna); } /**************************************************** * * Destructor for scene actor undo objects * ****************************************************/ SUNA::~SUNA(void) { AssertBaseThis(0); ReleasePpo(&_pactr); } /**************************************************** * * Does a command stored in an undo object. * * Parameters: * None. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SUNA::FDo(PDOCB pdocb) { AssertThis(0); PACTR pactr, pactrDup; if (!_pmvie->FSwitchScen(_iscen)) { goto LFail; } if (!_pmvie->Pscen()->FGotoFrm(_nfrm)) { goto LFail; } if (_ut == utAdd) { if (!_pmvie->Pscen()->FAddActrCore(_pactr)) { goto LFail; } _pmvie->Pscen()->SelectActr(_pactr); if (!_pactr->FDup(&pactrDup, fTrue)) { goto LFail; } pactrDup->SetArid(_pactr->Arid()); ReleasePpo(&_pactr); SetActr(pactrDup); } else if (_ut == utDel) { _pmvie->Pscen()->RemActrCore(_pactr->Arid()); } else { Assert(_ut == utRep, "Bad Grf"); pactr = _pmvie->Pscen()->PactrFromArid(_pactr->Arid()); if (!pactr->FDup(&pactrDup, fTrue)) { goto LFail; } if (!_pmvie->Pscen()->FAddActrCore(_pactr)) { goto LFail; } _pmvie->Pscen()->SelectActr(_pactr); pactrDup->SetArid(_pactr->Arid()); ReleasePpo(&_pactr); SetActr(pactrDup); } _pmvie->Pmsq()->FlushMsq(); _pmvie->Pmcc()->UpdateRollCall(); return (fTrue); LFail: _pmvie->Pmsq()->FlushMsq(); _pmvie->ClearUndo(); return (fFalse); } /**************************************************** * * Undoes a command stored in an undo object. * * Parameters: * None. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SUNA::FUndo(PDOCB pdocb) { AssertThis(0); PACTR pactr, pactrDup; if (!_pmvie->FSwitchScen(_iscen)) { goto LFail; } if (!_pmvie->Pscen()->FGotoFrm(_nfrm)) { goto LFail; } if (_ut == utAdd) { _pmvie->Pscen()->RemActrCore(_pactr->Arid()); } else if (_ut == utDel) { if (!_pactr->FDup(&pactrDup, fTrue)) { goto LFail; } pactrDup->SetArid(_pactr->Arid()); if (!_pmvie->Pscen()->FAddActrCore(pactrDup)) { ReleasePpo(&pactrDup); goto LFail; } _pmvie->Pscen()->SelectActr(pactrDup); ReleasePpo(&pactrDup); } else { Assert(_ut == utRep, "Bad Grf"); pactr = _pmvie->Pscen()->PactrFromArid(_pactr->Arid()); if (!pactr->FDup(&pactrDup, fTrue)) { goto LFail; } if (!_pmvie->Pscen()->FAddActrCore(_pactr)) { goto LFail; } _pmvie->Pscen()->SelectActr(_pactr); pactrDup->SetArid(_pactr->Arid()); ReleasePpo(&_pactr); SetActr(pactrDup); } _pmvie->Pmsq()->FlushMsq(); _pmvie->Pmcc()->UpdateRollCall(); return (fTrue); LFail: _pmvie->Pmsq()->FlushMsq(); _pmvie->ClearUndo(); return (fFalse); } #ifdef DEBUG /**************************************************** * Mark memory used by the SUNA * * Parameters: * None. * * Returns: * None. * ****************************************************/ void SUNA::MarkMem(void) { AssertThis(0); SUNA_PAR::MarkMem(); MarkMemObj(_pactr); } /*************************************************************************** Assert the validity of the SUNA. ***************************************************************************/ void SUNA::AssertValid(ulong grf) { AssertPo(_pactr, 0); } #endif /**************************************************** * * Public constructor for scene undo objects for text box * related commands. * * Parameters: * None. * * Returns: * pvNil if failure, else a pointer to the movie undo. * ****************************************************/ PSUNX SUNX::PsunxNew() { PSUNX psunx; psunx = NewObj SUNX(); return (psunx); } /**************************************************** * * Destructor for scene text box undo objects * ****************************************************/ SUNX::~SUNX(void) { AssertBaseThis(0); ReleasePpo(&_ptbox); } /**************************************************** * * Does a command stored in an undo object. * * Parameters: * None. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SUNX::FDo(PDOCB pdocb) { AssertThis(0); PTBOX ptbox; if (!_pmvie->FSwitchScen(_iscen)) { goto LFail; } if (_fAdd) { if (!_pmvie->Pscen()->FGotoFrm(_nfrmFirst)) { goto LFail; } if (!_pmvie->Pscen()->FAddTboxCore(_ptbox)) { _pmvie->Pscen()->FGotoFrm(_nfrm); goto LFail; } if (_nfrmLast < _pmvie->Pscen()->NfrmLast()) { AssertDo(_ptbox->FGotoFrame(_nfrmLast + 1), "Should never fail"); _ptbox->HideCore(); } _pmvie->Pscen()->SelectTbox(_ptbox); if (_pmvie->Pscen()->FGotoFrm(_nfrm)) { // // Find the new itbox for this tbox. // for (_itbox = 0;; _itbox++) { ptbox = _pmvie->Pscen()->PtboxFromItbox(_itbox); AssertPo(ptbox, 0); if (ptbox == _ptbox) { break; } } } } else { if (!_pmvie->Pscen()->FGotoFrm(_nfrm)) { goto LFail; } // // NOTE: ptbox may be different than _ptbox since // we may have switched away from the scene. // ptbox = _pmvie->Pscen()->PtboxFromItbox(_itbox); if (!_pmvie->Pscen()->FRemTboxCore(ptbox)) { goto LFail; } } _pmvie->Pmsq()->FlushMsq(); return (fTrue); LFail: _pmvie->Pmsq()->FlushMsq(); _pmvie->ClearUndo(); return (fFalse); } /**************************************************** * * Undoes a command stored in an undo object. * * Parameters: * None. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SUNX::FUndo(PDOCB pdocb) { AssertThis(0); PTBOX ptbox; if (!_pmvie->FSwitchScen(_iscen)) { goto LFail; } if (_fAdd) { if (!_pmvie->Pscen()->FGotoFrm(_nfrm)) { goto LFail; } // // NOTE: ptbox may be different than _ptbox since // we may have switched away from the scene. // ptbox = _pmvie->Pscen()->PtboxFromItbox(_itbox); if (!_pmvie->Pscen()->FRemTboxCore(ptbox)) { ReleasePpo(&ptbox); goto LFail; } } else { if (!_pmvie->Pscen()->FGotoFrm(_nfrmFirst)) { goto LFail; } if (!_pmvie->Pscen()->FAddTboxCore(_ptbox)) { goto LFail; } if (_nfrmLast < _pmvie->Pscen()->NfrmLast()) { AssertDo(_ptbox->FGotoFrame(_nfrmLast + 1), "Should never fail"); _ptbox->HideCore(); } _pmvie->Pscen()->SelectTbox(_ptbox); if (_pmvie->Pscen()->FGotoFrm(_nfrm)) { // // Find the new itbox for this tbox. // for (_itbox = 0;; _itbox++) { ptbox = _pmvie->Pscen()->PtboxFromItbox(_itbox); AssertPo(ptbox, 0); if (ptbox == _ptbox) { break; } } } } _pmvie->Pmsq()->FlushMsq(); return (fTrue); LFail: _pmvie->Pmsq()->FlushMsq(); _pmvie->ClearUndo(); return (fFalse); } #ifdef DEBUG /**************************************************** * Mark memory used by the SUNX * * Parameters: * None. * * Returns: * None. * ****************************************************/ void SUNX::MarkMem(void) { AssertThis(0); SUNX_PAR::MarkMem(); MarkMemObj(_ptbox); } /*************************************************************************** Assert the validity of the SUNX. ***************************************************************************/ void SUNX::AssertValid(ulong grf) { AssertPo(_ptbox, 0); } #endif /**************************************************** * * Public constructor for scene undo objects for transition * related commands. * * Parameters: * None. * * Returns: * pvNil if failure, else a pointer to the movie undo. * ****************************************************/ PSUNR SUNR::PsunrNew() { PSUNR psunr; psunr = NewObj SUNR(); return (psunr); } /**************************************************** * * Destructor for scene transition undo objects * ****************************************************/ SUNR::~SUNR(void) { AssertBaseThis(0); } /**************************************************** * * Does a command stored in an undo object. * * Parameters: * None. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SUNR::FDo(PDOCB pdocb) { AssertThis(0); TRANS trans; if (!_pmvie->FSwitchScen(_iscen)) { goto LFail; } if (!_pmvie->Pscen()->FGotoFrm(_nfrm)) { goto LFail; } trans = _pmvie->Pscen()->Trans(); _pmvie->Pscen()->SetTransitionCore(_trans); _trans = trans; _pmvie->Pmsq()->FlushMsq(); return (fTrue); LFail: _pmvie->Pmsq()->FlushMsq(); _pmvie->ClearUndo(); return (fFalse); } /**************************************************** * * Undoes a command stored in an undo object. * * Parameters: * None. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SUNR::FUndo(PDOCB pdocb) { AssertThis(0); return (FDo(pdocb)); } #ifdef DEBUG /**************************************************** * Mark memory used by the SUNR * * Parameters: * None. * * Returns: * None. * ****************************************************/ void SUNR::MarkMem(void) { AssertThis(0); SUNR_PAR::MarkMem(); } /*************************************************************************** Assert the validity of the SUNR. ***************************************************************************/ void SUNR::AssertValid(ulong grf) { } #endif /**************************************************** * * Public constructor for scene undo objects for pause * related commands. * * Parameters: * None. * * Returns: * pvNil if failure, else a pointer to the movie undo. * ****************************************************/ PSUNP SUNP::PsunpNew() { PSUNP psunp; psunp = NewObj SUNP(); return (psunp); } /**************************************************** * * Destructor for scene pause undo objects * ****************************************************/ SUNP::~SUNP(void) { AssertBaseThis(0); } /**************************************************** * * Does a command stored in an undo object. * * Parameters: * None. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SUNP::FDo(PDOCB pdocb) { AssertThis(0); WIT wit = _wit; if (!_pmvie->FSwitchScen(_iscen)) { goto LFail; } if (!_pmvie->Pscen()->FGotoFrm(_nfrm)) { goto LFail; } if (!_pmvie->Pscen()->FPauseCore(&_wit, &_dts)) { goto LFail; } _pmvie->Pmcc()->PauseType(wit); _pmvie->Pmsq()->FlushMsq(); return (fTrue); LFail: _pmvie->Pmsq()->FlushMsq(); _pmvie->ClearUndo(); return (fFalse); } /**************************************************** * * Undoes a command stored in an undo object. * * Parameters: * None. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SUNP::FUndo(PDOCB pdocb) { return (FDo(pdocb)); } #ifdef DEBUG /**************************************************** * Mark memory used by the SUNP * * Parameters: * None. * * Returns: * None. * ****************************************************/ void SUNP::MarkMem(void) { AssertThis(0); SUNP_PAR::MarkMem(); } /*************************************************************************** Assert the validity of the SUNP. ***************************************************************************/ void SUNP::AssertValid(ulong grf) { } #endif /**************************************************** * * Public constructor for scene undo objects for background * related commands. * * Parameters: * None. * * Returns: * pvNil if failure, else a pointer to the movie undo. * ****************************************************/ PSUNK SUNK::PsunkNew() { PSUNK psunk; psunk = NewObj SUNK(); return (psunk); } /**************************************************** * * Destructor for scene background undo objects * ****************************************************/ SUNK::~SUNK(void) { AssertBaseThis(0); } /**************************************************** * * Does a command stored in an undo object. * * Parameters: * None. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SUNK::FDo(PDOCB pdocb) { AssertThis(0); TAG tagOld; long icamOld, icam; if (!_pmvie->FSwitchScen(_iscen)) { goto LFail; } if (_fSetBkgd) { if (_pmvie->Pscen()->Pbkgd() != pvNil) { icam = _pmvie->Pscen()->Pbkgd()->Icam(); } if (!_pmvie->Pscen()->FSetBkgdCore(&_tag, &tagOld)) { goto LFail; } if (!_pmvie->Pscen()->FChangeCamCore(_icam, &icamOld)) { goto LFail; } _tag = tagOld; _icam = icam; } else { if (!_pmvie->Pscen()->FGotoFrm(_nfrm)) { goto LFail; } if (!_pmvie->Pscen()->FChangeCamCore(_icam, &icamOld)) { goto LFail; } _icam = icamOld; } _pmvie->Pmsq()->FlushMsq(); return (fTrue); LFail: _pmvie->Pmsq()->FlushMsq(); _pmvie->ClearUndo(); return (fFalse); } /**************************************************** * * Undoes a command stored in an undo object. * * Parameters: * None. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SUNK::FUndo(PDOCB pdocb) { AssertThis(0); return (FDo(pdocb)); } #ifdef DEBUG /**************************************************** * Mark memory used by the SUNK * * Parameters: * None. * * Returns: * None. * ****************************************************/ void SUNK::MarkMem(void) { AssertThis(0); SUNK_PAR::MarkMem(); } /*************************************************************************** Assert the validity of the SUNK. ***************************************************************************/ void SUNK::AssertValid(ulong grf) { } #endif /**************************************************** * * Public constructor for scene undo objects for background * chop commands. * * Parameters: * None. * * Returns: * pvNil if failure, else a pointer to the movie undo. * ****************************************************/ PSUNC SUNC::PsuncNew() { PSUNC psunc; psunc = NewObj SUNC(); return (psunc); } /**************************************************** * * Destructor for scene pause undo objects * ****************************************************/ SUNC::~SUNC(void) { AssertBaseThis(0); ReleasePpo(&_pcrf); } /**************************************************** * * This function saves away a copy of the scene. * * Parameters: * pscen - The scene to save away. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SUNC::FSave(PSCEN pscen) { PCFL pcfl; bool fRet; pcfl = CFL::PcflCreateTemp(); if (pcfl == pvNil) { return (fFalse); } _pcrf = CRF::PcrfNew(pcfl, 0); if (_pcrf == pvNil) { ReleasePpo(&pcfl); return (fFalse); } ReleasePpo(&pcfl); vpappb->BeginLongOp(); fRet = pscen->FWrite(_pcrf, &_cno); vpappb->EndLongOp(); return (fRet); } /**************************************************** * * Does a command stored in an undo object. * * Parameters: * None. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SUNC::FDo(PDOCB pdocb) { AssertThis(0); PSCEN pscen; PSCEN pscenSave; vpappb->BeginLongOp(); pscen = SCEN::PscenRead(_pmvie, _pcrf, _cno); if (pscen == pvNil) { goto LFail; } if (!pscen->FPlayStartEvents()) { SCEN::Close(&pscen); goto LFail; } if (!_pmvie->FSwitchScen(_iscen)) { SCEN::Close(&pscen); goto LFail; } pscenSave = _pmvie->Pscen(); pscenSave->AddRef(); if (!_pmvie->FInsScenCore(_iscen, pscen)) { ReleasePpo(&pscenSave); SCEN::Close(&pscen); goto LFail; } SCEN::Close(&pscen); _pcrf->Pcfl()->Delete(kctgScen, _cno); pscenSave->SetNfrmCur(pscenSave->NfrmFirst() - 1); if (!pscenSave->FWrite(_pcrf, &_cno)) { _pmvie->FRemScenCore(_iscen + 1); SCEN::Close(&pscenSave); goto LFail; } SCEN::Close(&pscenSave); if (!_pmvie->FRemScenCore(_iscen + 1)) { goto LFail; } // // We don't care if we can't switch, everything was restored. // if (_pmvie->FSwitchScen(_iscen)) { _pmvie->Pscen()->FGotoFrm(_nfrm); _pmvie->InvalViewsAndScb(); } vpappb->EndLongOp(); return (fTrue); LFail: _pmvie->Pmsq()->FlushMsq(); _pmvie->ClearUndo(); vpappb->EndLongOp(); return (fFalse); } /**************************************************** * * Undoes a command stored in an undo object. * * Parameters: * None. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool SUNC::FUndo(PDOCB pdocb) { AssertThis(0); return (FDo(pdocb)); } #ifdef DEBUG /**************************************************** * Mark memory used by the SUNC * * Parameters: * None. * * Returns: * None. * ****************************************************/ void SUNC::MarkMem(void) { AssertThis(0); SUNC_PAR::MarkMem(); MarkMemObj(_pcrf); } /*************************************************************************** Assert the validity of the SUNC. ***************************************************************************/ void SUNC::AssertValid(ulong grf) { AssertNilOrPo(_pcrf, grf); } #endif /*************************************************************************** Static function to allocate a SSE with room for ctag TAGs. ***************************************************************************/ PSSE SSE::PsseNew(long ctag) { Assert(ctag > 0, 0); PSSE psse; if (!FAllocPv((void **)&psse, _Cb(ctag), fmemNil, mprNormal)) return pvNil; return psse; } /*************************************************************************** Creates a new SSE ***************************************************************************/ PSSE SSE::PsseNew(long vlm, long sty, bool fLoop, long ctagc, TAGC *prgtagc) { Assert(ctagc > 0, 0); AssertPvCb(prgtagc, LwMul(ctagc, size(TAGC))); PSSE psse; long itagc; psse = PsseNew(ctagc); if (pvNil == psse) return pvNil; psse->vlm = vlm; psse->sty = sty; psse->fLoop = fLoop; psse->ctagc = ctagc; for (itagc = 0; itagc < ctagc; itagc++) { *psse->Ptagc(itagc) = prgtagc[itagc]; TAGM::DupTag(psse->Ptag(itagc)); } return psse; } /*************************************************************************** Properly cleans up and frees a SSE ***************************************************************************/ void ReleasePpsse(PSSE *ppsse) { AssertVarMem(ppsse); if (*ppsse == pvNil) return; PSSE psse = *ppsse; long itagc; AssertIn(psse->ctagc, 0, 1000); // sanity check on ctagc AssertIn(psse->sty, styNil, styLim); for (itagc = 0; itagc < psse->ctagc; itagc++) { if (psse->Ptag(itagc)->pcrf != pvNil) TAGM::CloseTag(psse->Ptag(itagc)); } FreePpv((void **)ppsse); } /*************************************************************************** Static function to allocate and read a SSE from a GG. This is tricky because I can't do a pgg->Get() since the SSE is variable-sized, and I need to do QvGet twice since I'm allocating memory in this function. ***************************************************************************/ PSSE SSE::PsseDupFromGg(PGG pgg, long iv, bool fDupTags) { AssertPo(pgg, 0); AssertIn(iv, 0, pgg->IvMac()); Assert(pgg->Cb(iv) >= size(SSE), "variable part too small"); long ctagc; PSSE psse; long itagc; ctagc = ((PSSE)pgg->QvGet(iv))->ctagc; psse = PsseNew(ctagc); CopyPb(pgg->QvGet(iv), psse, _Cb(ctagc)); for (itagc = 0; itagc < psse->ctagc; itagc++) { if (fDupTags) { if (psse->Ptag(itagc)->sid == ksidUseCrf) { AssertPo(psse->Ptag(itagc)->pcrf, 0); TAGM::DupTag(psse->Ptag(itagc)); } } else { // Clear the crf on read, since the caller isn't having us dupe the tag psse->Ptag(itagc)->pcrf = pvNil; } } return psse; } /*************************************************************************** Returns a PSSE just like this SSE except with ptag & chid added ***************************************************************************/ PSSE SSE::PsseAddTagChid(PTAG ptag, long chid) { AssertVarMem(ptag); PSSE psseNew; TAGC tagc; tagc.tag = *ptag; tagc.chid = chid; psseNew = SSE::PsseNew(ctagc + 1); if (pvNil == psseNew) return pvNil; CopyPb(this, psseNew, Cb()); *psseNew->Ptagc(psseNew->ctagc) = tagc; psseNew->ctagc++; TAGM::DupTag(ptag); return psseNew; } /*************************************************************************** Return a duplicate of this SSE ***************************************************************************/ PSSE SSE::PsseDup(void) { PSSE psse; long itagc; if (!FAllocPv((void **)&psse, size(SSE) + LwMul(ctagc, size(TAGC)), fmemNil, mprNormal)) { return pvNil; } CopyPb(this, psse, size(SSE) + LwMul(ctagc, size(TAGC))); for (itagc = 0; itagc < psse->ctagc; itagc++) TAGM::DupTag(psse->Ptag(itagc)); return psse; } /*************************************************************************** Play all sounds in this SSE -> Enqueue the sounds in the SSE ***************************************************************************/ void SSE::PlayAllSounds(PMVIE pmvie, ulong dtsStart) { PMSND pmsnd; long itag; long tool = fLoop ? toolLooper : toolSounder; for (itag = 0; itag < ctagc; itag++) { if (Ptag(itag)->sid == ksidUseCrf) { if (!pmvie->FResolveSndTag(Ptag(itag), *Pchid(itag))) continue; } pmsnd = (PMSND)vptagm->PbacoFetch(Ptag(itag), MSND::FReadMsnd); if (pvNil == pmsnd) return; // Only queue if it's not the first sound; only start at dtsStart for first sound pmvie->Pmsq()->FEnqueue(pmsnd, 0, fLoop, (itag != 0), vlm, pmsnd->Spr(tool), fFalse, (itag == 0 ? dtsStart : 0)); ReleasePpo(&pmsnd); } } ================================================ FILE: src/engine/srec.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** srec.cpp: Sound recording class Primary Author: ****** (based on ***** original srec) Review Status: reviewed ***************************************************************************/ #include "soc.h" ASSERTNAME RTCLASS(SREC) /*************************************************************************** Create a new SREC ***************************************************************************/ PSREC SREC::PsrecNew(long csampSec, long cchan, long cbSample, ulong dtsMax) { PSREC psrec; psrec = NewObj(SREC); if (pvNil == psrec) return pvNil; if (!psrec->_FInit(csampSec, cchan, cbSample, dtsMax)) { ReleasePpo(&psrec); return pvNil; } AssertPo(psrec, 0); return psrec; } /*************************************************************************** Init this SREC ***************************************************************************/ bool SREC::_FInit(long csampSec, long cchan, long cbSample, ulong dtsMax) { AssertBaseThis(0); AssertIn(cchan, 0, ksuMax); long cwid; _csampSec = csampSec; _cchan = cchan; _cbSample = cbSample; _dtsMax = dtsMax; _hwavein = pvNil; _priff = pvNil; _fBufferAdded = fFalse; _fRecording = fFalse; _fHaveSound = fFalse; vpsndm->Suspend(fTrue); // turn off sndm so we can get wavein device // See if sound recording is possible at all cwid = waveInGetNumDevs(); if (0 == cwid) { PushErc(ercSocNoWaveIn); return fFalse; } // allocate a 10 second buffer _wavehdr.dwBufferLength = (cchan * csampSec * cbSample * dtsMax) / 1000; if (!FAllocPv((void **)&_priff, sizeof(RIFF) + _wavehdr.dwBufferLength, fmemClear, mprNormal)) return fFalse; _wavehdr.lpData = reinterpret_cast(PvAddBv(_priff, sizeof(RIFF))); // init RIFF structure _priff->Set(_cchan, _csampSec, _cbSample, 0); if (fFalse == _FOpenRecord()) { return fFalse; } // get audioman _pmixer = GetAudioManMixer(); if (pvNil == _pmixer) return fFalse; // get a channel _pmixer->AllocChannel(&_pchannel); if (pvNil == _pchannel) return fFalse; return fTrue; } /*************************************************************************** Clean up and delete this SREC ***************************************************************************/ SREC::~SREC(void) { AssertBaseThis(0); // make sure nothing is playing or recording if (_fRecording || _fPlaying) FStop(); if (_hwavein) _FCloseRecord(); ReleasePpo(&_pchannel); ReleasePpo(&_pmixer); FreePpv((void **)&_priff); vpsndm->Suspend(fFalse); // restore sound mgr } /*************************************************************************** Open Device for recording ***************************************************************************/ bool SREC::_FOpenRecord(void) { AssertBaseThis(0); _fRecording = fFalse; if (pvNil == _hwavein) { // open a wavein device if (waveInOpen(&_hwavein, WAVE_MAPPER, _priff->PwfxGet(), (DWORD)_WaveInProc, (DWORD)this, CALLBACK_FUNCTION)) { // it doesn't support this format return fFalse; } // prepare header on block of data _wavehdr.dwUser = (DWORD)this; if (waveInPrepareHeader(_hwavein, &_wavehdr, sizeof(WAVEHDR))) { waveInClose(_hwavein); _hwavein = pvNil; return false; } } // add buffer to device if (!_fBufferAdded) if (waveInAddBuffer(_hwavein, &_wavehdr, sizeof(WAVEHDR))) { _FCloseRecord(); _fRecording = fFalse; _hwavein = pvNil; return fFalse; } else _fBufferAdded = fTrue; return true; } /*************************************************************************** Close Device for recording ***************************************************************************/ bool SREC::_FCloseRecord(void) { AssertThis(0); if (_hwavein) { // stop if necessary waveInReset(_hwavein); // unprepare header waveInUnprepareHeader(_hwavein, &_wavehdr, sizeof(WAVEHDR)); _fRecording = fFalse; // close waveInClose(_hwavein); _hwavein = pvNil; } return fTrue; } /*************************************************************************** Figure out if we're recording or not ***************************************************************************/ void SREC::_UpdateStatus(void) { AssertThis(0); // ------------------------------------ // Check playing mode // ------------------------------------ if ((_fPlaying) && !_pchannel->IsPlaying()) { // then we just stopped Sleep(250L); // sleep a little bit to cover AudioMan bug vpsndm->Suspend(fTrue); // suspend sound mgr } _fPlaying = _pchannel->IsPlaying(); // ------------------------------------ // Check Recording mode // If we are recording, AND our HaveSound flag // is set, then we must have just finished, so // process the data, and turn off the recording flag // ------------------------------------ if ((_fRecording) && (_fHaveSound)) { LPSOUND psnd = pvNil; // original psnd LPSOUND psndBias = pvNil; // psnd Bias correction filter LPSOUND psndTrim = pvNil; // psnd Trim filter _fRecording = fFalse; if (_wavehdr.dwBytesRecorded == 0) { _fHaveSound = fFalse; return; } // using the Audioman APIs, apply the gain and Trim filter, and save it back out // to a different temp file. _wavehdr.dwBytesRecorded -= 8 * (_cchan * _cbSample); // chop off last 8 samples worth, since some audio cards put garbage on end of data _priff->Set(_cchan, _csampSec, _cbSample, _wavehdr.dwBytesRecorded); // now use AudioMan API to load the temp file, apply a trim filter and place // trimmed sound out to our temp file if (FAILED(AllocSoundFromMemory(&psnd, (LPBYTE)_priff, _priff->Cb()))) { PushErc(ercOomNew); _fHaveSound = fFalse; return; } _fHaveSound = fTrue; if (FAILED(AllocBiasFilter(&psndBias, psnd))) { // then just return the sound raw _psnd = psnd; return; } // release the original sound, since it's now owned by the psndGain ReleasePpo(&psnd); if (FAILED(AllocTrimFilter(&_psnd, psndBias))) { // then just return the sound with the bias filter on it... _psnd = psndBias; return; } // release the psndBias, since it's now owned by the psndTrim ReleasePpo(&psndBias); } } /*************************************************************************** Figure out if we're recording or not ***************************************************************************/ void SREC::_WaveInProc(HWAVEIN hwi, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2) { // the psrec pointer is a pointer to the class which generated the event and owns the device SREC *psrec = (SREC *)dwInstance; switch (uMsg) { case WIM_DATA: { // any time we get a block of data, we are done, we set our flag // to true, allowing _UpdateStatus to notice that we are _fRecording and _fHaveSound // at which point it will process the data... psrec->_fHaveSound = fTrue; psrec->_fBufferAdded = fFalse; } } } /*************************************************************************** Start recording ***************************************************************************/ bool SREC::FStart(void) { AssertThis(0); Assert(!_fRecording, "stop previous recording first"); // make sure we are open if (_fPlaying) FStop(); if (!_FOpenRecord()) return fFalse; _fHaveSound = fFalse; _fRecording = fFalse; _wavehdr.dwBytesRecorded = 0; // now record data if (waveInStart(_hwavein)) return fFalse; _fRecording = fTrue; return fTrue; } /*************************************************************************** Stop recording or playing ***************************************************************************/ bool SREC::FStop(void) { AssertThis(0); Assert(_fRecording || _fPlaying, "Nothing to stop"); // if we are recording if (_fRecording) { // then stop the recording device waveInStop(_hwavein); } else if (_fPlaying) // if we are playing { // then stop the playing device _pchannel->Stop(); } // update status accordingly _UpdateStatus(); return fTrue; } /*************************************************************************** Start playing the current sound ***************************************************************************/ bool SREC::FPlay(void) { AssertThis(0); Assert(_fHaveSound, "No sound to play"); // open the _fniTrim file with MCI _FCloseRecord(); if (_psnd && _pchannel) { vpsndm->StopAll(); // stop any outstanding bogus sounds from button pushs vpsndm->Suspend(fFalse); // restore sound mgr _pchannel->Stop(); // stop our channel (should be nop) _pchannel->SetSoundSrc(_psnd); // give it our sound _pchannel->SetPosition(0); // seek to the beginning if (FAILED(_pchannel->Play())) // play the sound { _UpdateStatus(); // this will check play status, and clean up accordingly } else _fPlaying = fTrue; } return _fPlaying; } /*************************************************************************** Are we recording? ***************************************************************************/ bool SREC::FRecording(void) { AssertThis(0); _UpdateStatus(); return _fRecording; } /*************************************************************************** Are we playing the current sound? ***************************************************************************/ bool SREC::FPlaying(void) { AssertThis(0); _UpdateStatus(); return _fPlaying; } /*************************************************************************** Save the current sound to the given FNI ***************************************************************************/ bool SREC::FSave(PFNI pfni) { AssertThis(0); Assert(_fHaveSound, "Nothing to save!"); STN stn; if (_psnd) { pfni->GetStnPath(&stn); // now save _psnd to the FNI passed in if (FAILED(SoundToFileAsWave(_psnd, stn.Psz()))) { PushErc(ercSocWaveSaveFailure); return fFalse; } return fTrue; } return fFalse; } #ifdef DEBUG /*************************************************************************** Assert the validity of the SREC. ***************************************************************************/ void SREC::AssertValid(ulong grf) { SREC_PAR::AssertValid(fobjAllocated); Assert(pvNil != _pmixer, "No mixer?"); Assert(pvNil != _pchannel, "No Channel?"); } /*************************************************************************** Mark memory used by the SREC ***************************************************************************/ void SREC::MarkMem(void) { AssertThis(0); MarkPv(_priff); SREC_PAR::MarkMem(); } #endif // DEBUG ================================================ FILE: src/engine/tagl.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** tagl.cpp: Tag list class Primary Author: ****** Review Status: REVIEWED - any changes to this file must be reviewed! The GG of TAGFs is maintained in sorted order. It is sorted by sid, then by CTG, then by CNO. ***************************************************************************/ #include "soc.h" ASSERTNAME RTCLASS(TAGL) /**************************************** TAGF, or "tag-flag" struct, stores the tag that you want to cache and whether to cache its children automatically or not. ****************************************/ struct TAGF { TAG tag; bool fCacheChildren; }; /**************************************** CC, or "chid-ctg" struct, for children of a tag. An array of these is the variable part of the GG. ****************************************/ struct CC { CHID chid; CTG ctg; }; /*************************************************************************** Create a new TAGL ***************************************************************************/ PTAGL TAGL::PtaglNew(void) { PTAGL ptagl; ptagl = NewObj TAGL; if (pvNil == ptagl) return pvNil; if (!ptagl->_FInit()) { ReleasePpo(&ptagl); return pvNil; } AssertPo(ptagl, 0); return ptagl; } /*************************************************************************** Initialize the TAGL ***************************************************************************/ bool TAGL::_FInit(void) { AssertBaseThis(0); _pggtagf = GG::PggNew(size(TAGF)); if (pvNil == _pggtagf) return fFalse; return fTrue; } /*************************************************************************** Clean up and delete this tag list ***************************************************************************/ TAGL::~TAGL(void) { AssertBaseThis(0); ReleasePpo(&_pggtagf); } /*************************************************************************** Return the count of tags in the TAGL ***************************************************************************/ long TAGL::Ctag(void) { AssertThis(0); return _pggtagf->IvMac(); } /*************************************************************************** Get the itag'th tag from the TAGL ***************************************************************************/ void TAGL::GetTag(long itag, PTAG ptag) { AssertThis(0); AssertIn(itag, 0, Ctag()); AssertVarMem(ptag); TAGF tagf; _pggtagf->GetFixed(itag, &tagf); *ptag = tagf.tag; } /*************************************************************************** Find ptag in the TAGL. If the tag is found, the function returns fTrue and *pitag is the location of the tag in the GG. If the tag is not found, the function returns fFalse and *pitag is the location at which the tag should be inserted into the GG to maintain correct sorting order in the GG. ***************************************************************************/ bool TAGL::_FFindTag(PTAG ptag, long *pitag) { AssertThis(0); AssertVarMem(ptag); AssertVarMem(pitag); TAGF *qtagf; long itagfMin, itagfLim, itagf; long sid = ptag->sid; CTG ctg = ptag->ctg; CNO cno = ptag->cno; if (_pggtagf->IvMac() == 0) { *pitag = 0; return fFalse; } // Do a binary search. The TAGFs are sorted by (sid, ctg, cno). for (itagfMin = 0, itagfLim = _pggtagf->IvMac(); itagfMin < itagfLim;) { itagf = (itagfMin + itagfLim) / 2; qtagf = (TAGF *)_pggtagf->QvFixedGet(itagf); if (sid < qtagf->tag.sid) itagfLim = itagf; else if (sid > qtagf->tag.sid) itagfMin = itagf + 1; else if (ctg < qtagf->tag.ctg) itagfLim = itagf; else if (ctg > qtagf->tag.ctg) itagfMin = itagf + 1; else if (cno < qtagf->tag.cno) itagfLim = itagf; else if (cno > qtagf->tag.cno) itagfMin = itagf + 1; else { *pitag = itagf; return fTrue; } } // Tag not found *pitag = itagfMin; return fFalse; } /*************************************************************************** Insert the given tag into the TAGL, if it isn't already in there. ***************************************************************************/ bool TAGL::FInsertTag(PTAG ptag, bool fCacheChildren) { AssertThis(0); AssertVarMem(ptag); long itag; TAGF tagf; if (!_FFindTag(ptag, &itag)) { // Build and insert TAGF into fixed part of GG tagf.tag = *ptag; tagf.fCacheChildren = fCacheChildren; if (!_pggtagf->FInsert(itag, 0, pvNil, &tagf)) return fFalse; return fTrue; } // Tag is already in GG, see if fCacheChildren needs to be updated _pggtagf->GetFixed(itag, &tagf); if (!tagf.fCacheChildren && fCacheChildren) { // FIXME(bruxisma): The compiler has correctly identified that this // should be an assignment. tagf.fCacheChildren == fTrue; _pggtagf->PutFixed(itag, &tagf); } return fTrue; } /*************************************************************************** Insert a TAG child into the TAGL ***************************************************************************/ bool TAGL::FInsertChild(PTAG ptag, CHID chid, CTG ctg) { AssertThis(0); AssertVarMem(ptag); long itagf; CC ccNew; CC *prgcc; long ccc; // count of CCs long icc; if (!_FFindTag(ptag, &itagf)) { Bug("You should have inserted ptag first"); return fFalse; } #ifdef DEBUG TAGF tagf; _pggtagf->GetFixed(itagf, &tagf); if (tagf.tag.ctg != ptag->ctg || tagf.tag.cno != ptag->cno) Bug("_FFindTag has a bug"); #endif // DEBUG ccNew.chid = chid; ccNew.ctg = ctg; ccc = _pggtagf->Cb(itagf) / size(CC); if (ccc == 0) { if (!_pggtagf->FPut(itagf, size(CC), &ccNew)) return fFalse; return fTrue; } prgcc = (CC *)_pggtagf->QvGet(itagf); // linear search through prgcc to find where to insert ccNew for (icc = 0; icc < ccc; icc++) { if (prgcc[icc].ctg > ccNew.ctg) break; if (prgcc[icc].ctg == ccNew.ctg && prgcc[icc].chid > ccNew.chid) break; } if (!_pggtagf->FInsertRgb(itagf, icc * size(CC), size(CC), &ccNew)) return fFalse; return fTrue; } /*************************************************************************** Cache all the tags and child tags in TAGL ***************************************************************************/ bool TAGL::FCacheTags(void) { AssertThis(0); long itagf; TAGF tagf; long ccc; // count of CCs long icc; CC cc; TAG tag; for (itagf = 0; itagf < _pggtagf->IvMac(); itagf++) { // Cache the main tag _pggtagf->GetFixed(itagf, &tagf); if (!vptagm->FCacheTagToHD(&tagf.tag, tagf.fCacheChildren)) return fFalse; // Cache the child tags ccc = _pggtagf->Cb(itagf) / size(CC); for (icc = 0; icc < ccc; icc++) { _pggtagf->GetRgb(itagf, icc * size(CC), size(CC), &cc); if (!vptagm->FBuildChildTag(&tagf.tag, cc.chid, cc.ctg, &tag)) return fFalse; // Note that if we ever have the case where we don't always // want the CC tag to be cached with all its children, we could // change the CC structure to hold a boolean and pass it to // FCacheTagToHD here. if (!vptagm->FCacheTagToHD(&tag, fTrue)) return fFalse; } } return fTrue; } #ifdef DEBUG /*************************************************************************** Assert the validity of the TAGL. ***************************************************************************/ void TAGL::AssertValid(ulong grf) { TAGL_PAR::AssertValid(fobjAllocated); AssertPo(_pggtagf, 0); } /*************************************************************************** Mark memory used by the TAGL ***************************************************************************/ void TAGL::MarkMem(void) { AssertThis(0); TAGL_PAR::MarkMem(); MarkMemObj(_pggtagf); } #endif // DEBUG ================================================ FILE: src/engine/tagman.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** tagman.cpp: Tag Manager class (TAGM) Primary Author: ****** Review Status: REVIEWED - any changes to this file must be reviewed! It is important to keep in mind that there are two layers of caching going on in TAGM: Caching content from the CD (or other slow source) to the local hard disk, and caching resources in RAM using chunky resources (the CRF and CRM classes). For each source, TAGM maintains (in an SFS) a CRM (Chunky Resource Manager) of all the content files on the source and a CRF (Chunky Resource File), which is a single file on the HD which can be used for faster access to the source. Both CRFs and CRMs can cache resources in RAM. Since Socrates copies *all* content from the CD to the cache file, the CRM is told not to cache its resources in RAM. However, if the source is actually on the HD, TAGM notices and doesn't copy any content to a cache file, since that would be a waste of time. Instead, the content is read directly from the CRM. In this case, TAGM does tell the CRM to cache its resources in RAM. Source names: every source has a long and short name. This is so we can use long names for the source directory on the HD (e.g., "3D Movie Maker"), and short names for the source directory on the CD ("3DMOVIE"). We have to support short names because CD-ROMs currently do not allow long filenames. So everywhere that we look for the source directory, we accept either the long or short name. _pgstSource keeps track of these names. Rather than have one GST for short names and one for long names, each string in _pgstSource is the "merged name", which is the long name followed by a slash character (/) followed by the short name, e.g., "3D Movie Maker/3DMOVIE". The SplitString() function splits the merged name into the long and short names. ***************************************************************************/ #include "soc.h" ASSERTNAME RTCLASS(TAGM) const BOM kbomSid = 0xc0000000; // Source File Structure...keeps track of known sources and caches struct SFS { public: long sid; // ID for this source FNI fniHD; // FNI of the HD directory FNI fniCD; // FNI of the CD directory PCRM pcrmSource; // CRM of files on the CD (or possibly HD) tribool tContentOnHD; // Is the content on the HD or CD? public: void Clear(void) // Zeros out an SFS { sid = ksidInvalid; fniHD.SetNil(); fniCD.SetNil(); pcrmSource = pvNil; tContentOnHD = tMaybe; } }; /*************************************************************************** Initialize the tag manager ***************************************************************************/ PTAGM TAGM::PtagmNew(PFNI pfniHDRoot, PFNINSCD pfninscd, long cbCache) { AssertPo(pfniHDRoot, ffniDir); Assert(pvNil != pfninscd, "bad pfninscd"); AssertIn(cbCache, 0, kcbMax); PTAGM ptagm; ptagm = NewObj TAGM; if (pvNil == ptagm) goto LFail; ptagm->_fniHDRoot = *pfniHDRoot; ptagm->_cbCache = cbCache; ptagm->_pfninscd = pfninscd; ptagm->_pglsfs = GL::PglNew(size(SFS)); if (pvNil == ptagm->_pglsfs) goto LFail; ptagm->_pgstSource = GST::PgstNew(size(long)); // extra data is sid if (pvNil == ptagm->_pgstSource) goto LFail; AssertPo(ptagm, 0); return ptagm; LFail: ReleasePpo(&ptagm); return pvNil; } /*************************************************************************** Tag Manager destructor ***************************************************************************/ TAGM::~TAGM(void) { AssertBaseThis(0); long isfs; SFS sfs; if (pvNil != _pglsfs) { for (isfs = 0; isfs < _pglsfs->IvMac(); isfs++) { _pglsfs->Get(isfs, &sfs); ReleasePpo(&sfs.pcrmSource); } ReleasePpo(&_pglsfs); } ReleasePpo(&_pgstSource); } /*************************************************************************** Split a merged string into its long and short components ***************************************************************************/ void TAGM::SplitString(PSTN pstnMerged, PSTN pstnLong, PSTN pstnShort) { AssertPo(pstnMerged, 0); AssertVarMem(pstnLong); AssertVarMem(pstnShort); achar *pchStart = pstnMerged->Psz(); achar *pch; for (pch = pchStart; *pch != chNil; pch++) { if (*pch == ChLit('/')) { pstnLong->SetRgch(pchStart, (pch - pchStart)); pstnShort->SetSz(pch + 1); return; } } // no slash, so set both pstnLong and pstnShort to pstnMerged *pstnLong = *pstnMerged; *pstnShort = *pstnMerged; } /*************************************************************************** Return source title string table so it can be embedded in documents ***************************************************************************/ PGST TAGM::PgstSource(void) { AssertThis(0); return _pgstSource; } /*************************************************************************** If there is an stn for the given sid in _pgstSource, return the location of the stn. ***************************************************************************/ bool TAGM::_FFindSid(long sid, long *pistn) { AssertThis(0); Assert(sid >= 0, "Invalid sid"); AssertNilOrVarMem(pistn); long istn; long sidT; for (istn = 0; istn < _pgstSource->IvMac(); istn++) { _pgstSource->GetExtra(istn, &sidT); if (sid == sidT) // it's already in there { if (pvNil != pistn) *pistn = istn; return fTrue; } } TrashVar(pistn); return fFalse; } /*************************************************************************** Add source title string table entries to tag manager, if it doesn't already know them. ***************************************************************************/ bool TAGM::FMergeGstSource(PGST pgst, short bo, short osk) { AssertThis(0); AssertPo(pgst, 0); Assert(size(long) == pgst->CbExtra(), "bad pgstSource"); long istn; STN stn; long sid; for (istn = 0; istn < pgst->IvMac(); istn++) { pgst->GetStn(istn, &stn); pgst->GetExtra(istn, &sid); if (kboOther == bo) SwapBytesBom(&sid, kbomSid); if (!FAddStnSource(&stn, sid)) return fFalse; } return fTrue; } /*************************************************************************** Add source title string to tag manager, if it's not already there ***************************************************************************/ bool TAGM::FAddStnSource(PSTN pstn, long sid) { AssertThis(0); AssertPo(pstn, 0); Assert(sid >= 0, "Invalid sid"); if (_FFindSid(sid)) return fTrue; // String is already there return _pgstSource->FAddStn(pstn, &sid); // Try to add it } /*************************************************************************** Find the sid with the given string as its source name. pstn can be the merged name, the short name, or the long name. ***************************************************************************/ bool TAGM::FGetSid(PSTN pstn, long *psid) { AssertThis(0); AssertPo(pstn, 0); AssertVarMem(psid); long istn; STN stnMerged; STN stnLong; STN stnShort; for (istn = 0; istn < _pgstSource->IvMac(); istn++) { _pgstSource->GetStn(istn, &stnMerged); if (stnMerged.FEqualUser(pstn, fstnIgnoreCase)) { _pgstSource->GetExtra(istn, psid); return fTrue; } SplitString(&stnMerged, &stnLong, &stnShort); if (stnLong.FEqualUser(pstn, fstnIgnoreCase) || stnShort.FEqualUser(pstn, fstnIgnoreCase)) { _pgstSource->GetExtra(istn, psid); return fTrue; } } return fFalse; } /*************************************************************************** Find the string of the source with the given sid ***************************************************************************/ bool TAGM::_FGetStnMergedOfSid(long sid, PSTN pstn) { AssertThis(0); AssertVarMem(pstn); long istn; long sidT; for (istn = 0; istn < _pgstSource->IvMac(); istn++) { _pgstSource->GetStn(istn, pstn); _pgstSource->GetExtra(istn, &sidT); if (sid == sidT) return fTrue; } return fFalse; } /*************************************************************************** Find the string of the source with the given sid ***************************************************************************/ bool TAGM::_FGetStnSplitOfSid(long sid, PSTN pstnLong, PSTN pstnShort) { AssertThis(0); AssertVarMem(pstnLong); AssertVarMem(pstnShort); STN stnMerged; if (!_FGetStnMergedOfSid(sid, &stnMerged)) return fFalse; SplitString(&stnMerged, pstnLong, pstnShort); return fTrue; } /*************************************************************************** Builds the FNI to the HD files for a given sid - If we don't even know the string for the sid, return fFalse - If there is no fniHD, set *pfExists to fFalse and return fTrue - If we find the fniHD, put it in *pfniHD, set *pfExists to fTrue, and return fTrue ***************************************************************************/ bool TAGM::_FBuildFniHD(long sid, PFNI pfniHD, bool *pfExists) { AssertThis(0); Assert(sid >= 0, "Invalid sid"); AssertVarMem(pfniHD); AssertVarMem(pfExists); STN stnLong; STN stnShort; FNI fni; *pfExists = fFalse; if (!_FGetStnSplitOfSid(sid, &stnLong, &stnShort)) { return fFalse; // can't even determine if fniHD exists or not } fni = _fniHDRoot; if (!fni.FDownDir(&stnLong, ffniMoveToDir) && !fni.FDownDir(&stnShort, ffniMoveToDir)) { return fTrue; // fniHD doesn't exist } *pfniHD = fni; *pfExists = fTrue; return fTrue; } /*************************************************************************** See if there are any content files in the directory specified by pfni ***************************************************************************/ bool TAGM::_FDetermineIfContentOnFni(PFNI pfni, bool *pfContentOnFni) { AssertThis(0); AssertPo(pfni, ffniDir); AssertVarMem(pfContentOnFni); FNE fne; FTG ftgContent = kftgContent; FNI fni; if (!fne.FInit(pfni, &ftgContent, 1)) return fFalse; if (fne.FNextFni(&fni)) *pfContentOnFni = fTrue; else *pfContentOnFni = fFalse; return fTrue; } /*************************************************************************** Returns whether the directory pointed to by pfniCD exists where we think it does. Or, if pstn is non-nil, try to go down from pfniCD to pstn. ***************************************************************************/ bool TAGM::_FEnsureFniCD(long sid, FNI *pfniCD, PSTN pstn) { AssertThis(0); Assert(sid >= 0, "Invalid sid"); AssertPo(pfniCD, ffniDir); AssertNilOrPo(pstn, 0); ERS ersT; ERS *pers; bool fRet; pers = vpers; vpers = &ersT; #ifdef WIN // Block the Windows "There is no disk in the drive" message UINT em; em = SetErrorMode(SEM_FAILCRITICALERRORS); #endif // WIN if (pvNil != pstn) fRet = pfniCD->FDownDir(pstn, ffniMoveToDir); else fRet = (pfniCD->TExists() == tYes); #ifdef WIN SetErrorMode(em); // restore the error mode #endif // WIN vpers = pers; return fRet; } /*************************************************************************** This function verifies that the source (e.g., CD) is where we think it is, and searches for it otherwise. Pass the previously determined FNI of the CD directory file in pfniCD. Or if this is the first time looking for this source, pass in any FNI with a FTG of ftgNil. If it can't find the CD directory, it returns fFalse with pfniInfo untouched. ***************************************************************************/ bool TAGM::_FFindFniCD(long sid, PFNI pfniCD, bool *pfFniChanged) { AssertThis(0); Assert(sid >= 0, "Invalid sid"); AssertPo(pfniCD, ffniEmpty | ffniDir); // could be a blank FNI AssertVarMem(pfFniChanged); FNE fne; FNI fni; STN stnLong; STN stnShort; FNI fniCD; *pfFniChanged = fFalse; // If pfniCD's ftg is not ftgNil, we've opened this source before, // so look for it where it was last time. if (ftgNil != pfniCD->Ftg()) { if (_FEnsureFniCD(sid, pfniCD)) { // The source is where we thought it was return fTrue; } else { // With the way the CRM stuff works now, the CRM can't // move to another path. So fail if the CD isn't exactly // where it was before. return fFalse; } } if (!_FGetStnSplitOfSid(sid, &stnLong, &stnShort)) return fFalse; // The source has moved/disappeared, or we're opening it for the first // time, so search all drives for it. if (!fne.FInit(pvNil, pvNil, 0)) return fFalse; while (fne.FNextFni(&fni)) { if (fni.Grfvk() & fvkFloppy) // don't buzz floppies continue; fniCD = fni; if (!_FEnsureFniCD(sid, &fniCD, &stnShort) && !_FEnsureFniCD(sid, &fniCD, &stnLong)) { continue; } *pfFniChanged = fTrue; *pfniCD = fniCD; return fTrue; } // Couldn't find the source return fFalse; } /*************************************************************************** Calls the client-supplied callback, which should tell the user that the source named stn cannot be found. Returns fTrue if the user wants to retry, else fFalse. ***************************************************************************/ bool TAGM::_FRetry(long sid) { AssertThis(0); Assert(sid >= 0, "Invalid sid"); STN stnLong; STN stnShort; if (!_FGetStnSplitOfSid(sid, &stnLong, &stnShort)) { Bug("_pgstSource has no string for this sid!"); return fFalse; } return _pfninscd(&stnLong); } /*************************************************************************** Builds the CRM for the given sid's source. pfniDir tells where the content files are. ***************************************************************************/ PCRM TAGM::_PcrmSourceNew(long sid, PFNI pfniDir) { AssertThis(0); Assert(sid >= 0, "Invalid sid"); AssertPo(pfniDir, ffniDir); STN stn; FNI fni; PCRM pcrmSource = pvNil; FNE fne; FTG ftgChk = kftgContent; PCFL pcfl = pvNil; pcrmSource = CRM::PcrmNew(0); if (pvNil == pcrmSource) goto LFail; // Add all chunky files in content directory to pcrmSource if (!fne.FInit(pfniDir, &ftgChk, 1)) goto LFail; while (fne.FNextFni(&fni)) { pcfl = CFL::PcflOpen(&fni, fcflNil); if (pvNil == pcfl) goto LFail; if (!pcrmSource->FAddCfl(pcfl, _cbCache)) goto LFail; ReleasePpo(&pcfl); } return pcrmSource; LFail: ReleasePpo(&pcfl); ReleasePpo(&pcrmSource); return pvNil; } /*************************************************************************** Returns the source CRM for the given sid, creating (and remembering) a new one if there isn't one already. It verifies that the CD is still in the drive, unless fDontHitCD is fTrue. ***************************************************************************/ PCRM TAGM::_PcrmSourceGet(long sid, bool fDontHitCD) { AssertThis(0); Assert(sid >= 0, "Invalid sid"); long isfs; SFS sfs; bool fContentOnFni; bool fFniChanged; bool fExists; for (isfs = 0; isfs < _pglsfs->IvMac(); isfs++) { _pglsfs->Get(isfs, &sfs); if (sid == sfs.sid) goto LSetupSfs; } // SFS for this sid doesn't exist in _pglsfs, so make one sfs.Clear(); sfs.sid = sid; if (!_pglsfs->FAdd(&sfs, &isfs)) return pvNil; LSetupSfs: if (sfs.tContentOnHD == tMaybe) { if (sfs.fniHD.Ftg() == ftgNil) { if (!_FBuildFniHD(sid, &sfs.fniHD, &fExists)) return pvNil; if (!fExists) sfs.tContentOnHD = tNo; _pglsfs->Put(isfs, &sfs); } if (sfs.tContentOnHD == tMaybe) { if (!_FDetermineIfContentOnFni(&sfs.fniHD, &fContentOnFni)) return pvNil; sfs.tContentOnHD = (fContentOnFni ? tYes : tNo); _pglsfs->Put(isfs, &sfs); } } if (tYes == sfs.tContentOnHD) { if (pvNil == sfs.pcrmSource) { sfs.pcrmSource = _PcrmSourceNew(sid, &sfs.fniHD); if (pvNil == sfs.pcrmSource) return pvNil; _pglsfs->Put(isfs, &sfs); } return sfs.pcrmSource; } // Else content is not on HD, so look at CD if (!fDontHitCD) { // Verify that CD is where we thought it was, or find // it if we haven't found it before while (!_FFindFniCD(sid, &sfs.fniCD, &fFniChanged)) { // Ask user to insert the CD if (!_FRetry(sid)) return pvNil; } if (fFniChanged) { Assert(sfs.pcrmSource == pvNil, "fniCD can't change once pcrm is opened!"); _pglsfs->Put(isfs, &sfs); // update sfs.fniCD } } if (pvNil == sfs.pcrmSource) { if (fDontHitCD) { Bug("should have valid pcrmSource!"); } else { sfs.pcrmSource = _PcrmSourceNew(sid, &sfs.fniCD); if (pvNil == sfs.pcrmSource) return pvNil; _pglsfs->Put(isfs, &sfs); } } return sfs.pcrmSource; } /*************************************************************************** Determines whether source is on HD (if it is, don't cache its stuff to HD!) Note that the function return value is whether the function completed without error, not whether the source is on HD. ***************************************************************************/ bool TAGM::_FDetermineIfSourceHD(long sid, bool *pfIsOnHD) { AssertThis(0); Assert(sid >= 0, "Invalid sid"); AssertVarMem(pfIsOnHD); long isfs; SFS sfs; bool fContentOnFni; bool fExists; for (isfs = 0; isfs < _pglsfs->IvMac(); isfs++) { _pglsfs->Get(isfs, &sfs); if (sid == sfs.sid) goto LSetupSfs; } // SFS for this sid doesn't exist in _pglsfs, so make one sfs.Clear(); sfs.sid = sid; if (!_pglsfs->FAdd(&sfs, &isfs)) return fFalse; LSetupSfs: if (sfs.tContentOnHD == tMaybe) { if (sfs.fniHD.Ftg() == ftgNil) { if (!_FBuildFniHD(sid, &sfs.fniHD, &fExists)) return fFalse; if (!fExists) sfs.tContentOnHD = tNo; _pglsfs->Put(isfs, &sfs); } if (sfs.tContentOnHD == tMaybe) { if (!_FDetermineIfContentOnFni(&sfs.fniHD, &fContentOnFni)) return fFalse; sfs.tContentOnHD = (fContentOnFni ? tYes : tNo); _pglsfs->Put(isfs, &sfs); } } *pfIsOnHD = (sfs.tContentOnHD == tYes); return fTrue; } /*************************************************************************** Get the FNI for the HD directory ***************************************************************************/ bool TAGM::_FGetFniHD(long sid, PFNI pfniHD) { AssertThis(0); AssertVarMem(pfniHD); long isfs; SFS sfs; bool fExists; for (isfs = 0; isfs < _pglsfs->IvMac(); isfs++) { _pglsfs->Get(isfs, &sfs); if (sid == sfs.sid) goto LSetupSFS; } // SFS for this sid doesn't exist in _pglsfs, so make one sfs.Clear(); sfs.sid = sid; if (!_pglsfs->FAdd(&sfs, &isfs)) return fFalse; LSetupSFS: if (sfs.fniHD.Ftg() == ftgNil) { if (!_FBuildFniHD(sid, &sfs.fniHD, &fExists) || !fExists) return fFalse; } _pglsfs->Put(isfs, &sfs); *pfniHD = sfs.fniHD; return fTrue; } /*************************************************************************** Get the FNI for the CD directory ***************************************************************************/ bool TAGM::_FGetFniCD(long sid, PFNI pfniCD, bool fAskForCD) { AssertThis(0); AssertVarMem(pfniCD); long isfs; SFS sfs; bool fFniChanged; for (isfs = 0; isfs < _pglsfs->IvMac(); isfs++) { _pglsfs->Get(isfs, &sfs); if (sid == sfs.sid) goto LSetupSFS; } // SFS for this sid doesn't exist in _pglsfs, so make one sfs.Clear(); sfs.sid = sid; if (!_pglsfs->FAdd(&sfs, &isfs)) return fFalse; LSetupSFS: while (!_FFindFniCD(sid, &sfs.fniCD, &fFniChanged)) { if (!fAskForCD) return fFalse; if (!_FRetry(sid)) return fFalse; } if (fFniChanged) _pglsfs->Put(isfs, &sfs); *pfniCD = sfs.fniCD; return fTrue; } /*************************************************************************** Finds the file with name pstn on the HD or CD. ***************************************************************************/ bool TAGM::FFindFile(long sid, PSTN pstn, PFNI pfni, bool fAskForCD) { AssertThis(0); Assert(sid >= 0, "Invalid sid"); AssertPo(pstn, 0); AssertVarMem(pfni); FTG ftg; if (!pfni->FBuildFromPath(pstn)) return fFalse; ftg = pfni->Ftg(); // First, look on the HD if (!_FGetFniHD(sid, pfni)) return fFalse; if (pfni->FSetLeaf(pstn, ftg) && tYes == pfni->TExists()) return fTrue; // Now look on the CD, asking for it if fAskForCD if (!_FGetFniCD(sid, pfni, fAskForCD)) return fFalse; if (pfni->FSetLeaf(pstn, ftg) && tYes == pfni->TExists()) return fTrue; pfni->SetNil(); return fFalse; // file not found } /*************************************************************************** Build a tag for a child of another tag. Note that this may hit the CD if _PcrmSourceGet has not yet been called for ptagPar->sid. ***************************************************************************/ bool TAGM::FBuildChildTag(PTAG ptagPar, CHID chid, CTG ctgChild, PTAG ptagChild) { AssertThis(0); AssertVarMem(ptagPar); Assert(ptagPar->sid >= 0, "Invalid sid"); AssertVarMem(ptagChild); PCRM pcrmSource; PCRF pcrfSource; KID kid; TrashVar(ptagChild); if (ksidUseCrf == ptagPar->sid) { AssertPo(ptagPar->pcrf, 0); if (!ptagPar->pcrf->Pcfl()->FGetKidChidCtg(ptagPar->ctg, ptagPar->cno, chid, ctgChild, &kid)) { return fFalse; // child chunk not found } ptagChild->sid = ksidUseCrf; ptagChild->pcrf = ptagPar->pcrf; ptagPar->pcrf->AddRef(); ptagChild->ctg = kid.cki.ctg; ptagChild->cno = kid.cki.cno; return fTrue; } pcrmSource = _PcrmSourceGet(ptagPar->sid); if (pvNil == pcrmSource) return fFalse; pcrfSource = pcrmSource->PcrfFindChunk(ptagPar->ctg, ptagPar->cno); if (pvNil == pcrfSource) return fFalse; // parent chunk not found if (!pcrfSource->Pcfl()->FGetKidChidCtg(ptagPar->ctg, ptagPar->cno, chid, ctgChild, &kid)) { return fFalse; // child chunk not found } ptagChild->sid = ptagPar->sid; ptagChild->ctg = kid.cki.ctg; ptagChild->cno = kid.cki.cno; return fTrue; } /*************************************************************************** Put specified chunk in cache file, if it's not there yet ***************************************************************************/ bool TAGM::FCacheTagToHD(PTAG ptag, bool fCacheChildChunks) { AssertThis(0); AssertVarMem(ptag); Assert(ptag->sid >= 0, "Invalid sid"); PCRM pcrmSource; PCRF pcrfSource; bool fSourceIsOnHD; PCFL pcfl; if (ksidUseCrf == ptag->sid) return fTrue; // FOONE: Disable caching for now. It doesn't seem to be working properly. return fTrue; // Do nothing if the source itself is already on HD if (!_FDetermineIfSourceHD(ptag->sid, &fSourceIsOnHD)) goto LFail; if (fSourceIsOnHD) return fTrue; pcrmSource = _PcrmSourceGet(ptag->sid); if (pvNil == pcrmSource) goto LFail; pcrfSource = pcrmSource->PcrfFindChunk(ptag->ctg, ptag->cno); if (pvNil == pcrfSource) goto LFail; // chunk not found pcfl = pcrfSource->Pcfl(); if (fCacheChildChunks) { // Cache the chunk specified by the tag, and all its child // chunks. CGE cge; KID kid; ulong grfcgeIn = 0; ulong grfcgeOut; cge.Init(pcfl, ptag->ctg, ptag->cno); while (cge.FNextKid(&kid, pvNil, &grfcgeOut, grfcgeIn)) { if (grfcgeOut & fcgePre) { if (!pcfl->FEnsureOnExtra(kid.cki.ctg, kid.cki.cno)) goto LFail; } } } else { // Just cache the chunk specified by the tag if (!pcfl->FEnsureOnExtra(ptag->ctg, ptag->cno)) goto LFail; } return fTrue; LFail: PushErc(ercSocCantCacheTag); return fFalse; } /*************************************************************************** Resolve the TAG to a BACO. Only use HD cache files, unless fUseCD is fTrue. ***************************************************************************/ PBACO TAGM::PbacoFetch(PTAG ptag, PFNRPO pfnrpo, bool fUseCD) { AssertThis(0); AssertVarMem(ptag); Assert(ptag->sid >= 0, "Invalid sid"); Assert(pvNil != pfnrpo, "bad rpo"); PBACO pbaco = pvNil; PCRM pcrmSource; if (ptag->sid == ksidUseCrf) { // Tag knows pcrf, so just read from there. Nothing we can do if // it's not there. AssertPo(ptag->pcrf, 0); return ptag->pcrf->PbacoFetch(ptag->ctg, ptag->cno, pfnrpo); } // fTrue parameter ensures that _PcrmSourceGet won't hit the CD pcrmSource = _PcrmSourceGet(ptag->sid, fTrue); if (pvNil == pcrmSource) return pvNil; pbaco = pcrmSource->PbacoFetch(ptag->ctg, ptag->cno, pfnrpo); return pbaco; } /*************************************************************************** Clear the cache for source sid. If sid is sidNil, clear all caches. ***************************************************************************/ void TAGM::ClearCache(long sid, ulong grftagm) { AssertThis(0); Assert(sid >= 0, "Invalid sid"); long isfs, isfsMac; long cbMax; vpappb->BeginLongOp(); isfsMac = _pglsfs->IvMac(); for (isfs = 0; isfs < isfsMac; isfs++) { long icrf, icrfMac; SFS sfs; PCRM pcrmSource; _pglsfs->Get(isfs, &sfs); if ((sid != sidNil && sfs.sid != sid) || sfs.pcrmSource == pvNil) continue; if (grftagm & ftagmFile) { // The following line may seem silly, since we already have // sfs.pcrmSource. But it ensures that the crm's CD is inserted, // since the FReopen() will need the CD to be in. pcrmSource = _PcrmSourceGet(sfs.sid); if (pvNil == pcrmSource) continue; } else { // Just doing a memory purge, so sfs.pcrmSource is valid. pcrmSource = sfs.pcrmSource; } icrfMac = pcrmSource->Ccrf(); for (icrf = 0; icrf < icrfMac; icrf++) { PCRF pcrf; pcrf = pcrmSource->PcrfGet(icrf); AssertPo(pcrf->Pcfl(), 0); if (pcrf->Pcfl() != pvNil) { if (grftagm & ftagmFile) { // Clear the HD cache by reopening the file pcrf->Pcfl()->FReopen(); // Ignore error } if (grftagm & ftagmMemory) { // Clear RAM cache (for BACOs with 0 cactRef) by // temporarily setting the CRF's cbMax to 0 cbMax = pcrf->CbMax(); pcrf->SetCbMax(0); pcrf->SetCbMax(cbMax); } } } } vpappb->EndLongOp(); } /*************************************************************************** Prepares this tag to be used (resolved). The tag is invalid until you call this, *except* you can pass the tag to FCacheTagToHD() before calling FOpenTag(). If you FOpenTag() a tag, you must CloseTag() it when you're done with it. ***************************************************************************/ bool TAGM::FOpenTag(PTAG ptag, PCRF pcrfDest, PCFL pcflSrc) { AssertVarMem(ptag); Assert(ptag->sid >= 0, "Invalid sid"); AssertPo(pcrfDest, 0); AssertNilOrPo(pcflSrc, 0); CNO cnoDest; if (ptag->sid != ksidUseCrf) return fTrue; if (pvNil != pcflSrc && pcrfDest->Pcfl() != pcflSrc) { if (!pcflSrc->FCopy(ptag->ctg, ptag->cno, pcrfDest->Pcfl(), &cnoDest)) { ptag->pcrf = pvNil; return fFalse; // copy failed } ptag->cno = cnoDest; } ptag->pcrf = pcrfDest; pcrfDest->AddRef(); return fTrue; } /*************************************************************************** Save tag's data in the given CRF. If fRedirect, the tag now points to the copy in the CRF. ***************************************************************************/ bool TAGM::FSaveTag(PTAG ptag, PCRF pcrf, bool fRedirect) { AssertVarMem(ptag); Assert(ptag->sid >= 0, "Invalid sid"); AssertPo(pcrf, 0); CNO cnoDest; if (ptag->sid != ksidUseCrf) return fTrue; AssertPo(ptag->pcrf, 0); if (!ptag->pcrf->Pcfl()->FCopy(ptag->ctg, ptag->cno, pcrf->Pcfl(), &cnoDest)) { return fFalse; // copy failed } if (fRedirect) { pcrf->AddRef(); ReleasePpo(&ptag->pcrf); ptag->pcrf = pcrf; ptag->cno = cnoDest; } return fTrue; } /*************************************************************************** Call this for each tag when you're duplicating it. Increments refcount on the tag's CRF. ***************************************************************************/ void TAGM::DupTag(PTAG ptag) { AssertVarMem(ptag); Assert(ptag->sid >= 0, "Invalid sid"); if (ptag->sid == ksidUseCrf) { AssertPo(ptag->pcrf, 0); ptag->pcrf->AddRef(); } } /*************************************************************************** Close the tag ***************************************************************************/ void TAGM::CloseTag(PTAG ptag) { AssertVarMem(ptag); // Client destructors often call CloseTag on an uninitialized tag, so // don't Assert on ksidInvalid tags...just ignore them Assert(ptag->sid == ksidInvalid || ptag->sid >= 0, "Invalid sid"); if (ptag->sid == ksidUseCrf) { AssertPo(ptag->pcrf, 0); ReleasePpo(&ptag->pcrf); } } /*************************************************************************** Compare two tags. Tags are sorted first by sid, then CTG, then CNO. ***************************************************************************/ ulong TAGM::FcmpCompareTags(PTAG ptag1, PTAG ptag2) { AssertVarMem(ptag1); Assert(ptag1->sid >= 0, "Invalid sid"); AssertVarMem(ptag2); Assert(ptag2->sid >= 0, "Invalid sid"); if (ptag1->sid < ptag2->sid) return fcmpLt; if (ptag1->sid > ptag2->sid) return fcmpGt; if (ptag1->ctg < ptag2->ctg) return fcmpLt; if (ptag1->ctg > ptag2->ctg) return fcmpGt; if (ptag1->cno < ptag2->cno) return fcmpLt; if (ptag1->cno > ptag2->cno) return fcmpGt; // If both sids are ksidUseCrf, compare CRFs if (ptag1->sid == ksidUseCrf) // implies ptag2->sid == ksidUseCrf { if (ptag1->pcrf < ptag2->pcrf) return fcmpLt; if (ptag1->pcrf > ptag2->pcrf) return fcmpGt; } return fcmpEq; } #ifdef DEBUG /*************************************************************************** Assert the validity of the TAGM. ***************************************************************************/ void TAGM::AssertValid(ulong grf) { long isfs; SFS sfs; TAGM_PAR::AssertValid(fobjAllocated); AssertPo(_pglsfs, 0); AssertPo(_pgstSource, 0); Assert(pvNil != _pfninscd, "bad _pfninscd"); for (isfs = 0; isfs < _pglsfs->IvMac(); isfs++) { _pglsfs->Get(isfs, &sfs); AssertPo(&sfs.fniHD, ffniDir | ffniEmpty); AssertPo(&sfs.fniCD, ffniDir | ffniEmpty); AssertNilOrPo(sfs.pcrmSource, 0); } } /*************************************************************************** Mark memory used by the TAGM. ***************************************************************************/ void TAGM::MarkMem(void) { AssertThis(0); long isfs; SFS sfs; TAGM_PAR::MarkMem(); MarkMemObj(_pglsfs); MarkMemObj(_pgstSource); for (isfs = 0; isfs < _pglsfs->IvMac(); isfs++) { _pglsfs->Get(isfs, &sfs); MarkMemObj(sfs.pcrmSource); } } #endif // DEBUG #ifdef DEBUG /*************************************************************************** Mark memory used by the TAG. ***************************************************************************/ void TAG::MarkMem(void) { if (sid == ksidUseCrf) { AssertPo(pcrf, 0); MarkMemObj(pcrf); } } #endif // DEBUG ================================================ FILE: src/engine/tbox.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // // tbox.cpp // // Author: Sean Selitrennikoff // // Status: All changes must be code reviewed. // // Date: November, 1994 // // This file contains all functionality for text box manipulation. // #include "soc.h" ASSERTNAME RTCLASS(TBOX) RTCLASS(TBXG) RTCLASS(TBXB) RTCLASS(TCLP) // // How many pixels a scrolling text box scrolls by // #define kdypScroll 1 // // // UNDO objects for text boxes // // // // Undoes changing textbox type operations // typedef class TUNT *PTUNT; #define TUNT_PAR MUNB #define kclsTUNT 'TUNT' class TUNT : public TUNT_PAR { RTCLASS_DEC MARKMEM ASSERT protected: long _itbox; bool _fStory; TUNT(void) { } public: static PTUNT PtuntNew(void); ~TUNT(void); void SetType(bool fStory) { _fStory = fStory; } void SetItbox(long itbox) { _itbox = itbox; } virtual bool FDo(PDOCB pdocb); virtual bool FUndo(PDOCB pdocb); }; RTCLASS(TUNT) // // Undoes sizing operations // typedef class TUNS *PTUNS; #define TUNS_PAR MUNB #define kclsTUNS 'TUNS' class TUNS : public TUNS_PAR { RTCLASS_DEC MARKMEM ASSERT protected: long _itbox; RC _rc; TUNS(void) { } public: static PTUNS PtunsNew(void); ~TUNS(void); void SetRc(RC *prc) { _rc = *prc; } void SetItbox(long itbox) { _itbox = itbox; } virtual bool FDo(PDOCB pdocb); virtual bool FUndo(PDOCB pdocb); }; RTCLASS(TUNS) // // Undoes hiding/showing operations // typedef class TUNH *PTUNH; #define TUNH_PAR MUNB #define kclsTUNH 'TUNH' class TUNH : public TUNH_PAR { RTCLASS_DEC MARKMEM ASSERT protected: long _itbox; long _nfrmFirst; long _nfrmMax; TUNH(void) { } public: static PTUNH PtunhNew(void); ~TUNH(void); void SetFrmFirst(long nfrmFirst) { _nfrmFirst = nfrmFirst; } void SetFrmLast(long nfrmMax) { _nfrmMax = nfrmMax; } void SetItbox(long itbox) { _itbox = itbox; } virtual bool FDo(PDOCB pdocb); virtual bool FUndo(PDOCB pdocb); }; RTCLASS(TUNH) // // Undoes all editing operations // typedef class TUND *PTUND; #define TUND_PAR MUNB #define kclsTUND 'TUND' class TUND : public TUND_PAR { RTCLASS_DEC MARKMEM ASSERT protected: PUNDB _pundb; long _itbox; TUND(void) { } public: static PTUND PtundNew(PUNDB pundb); ~TUND(void); void SetItbox(long itbox) { _itbox = itbox; } virtual bool FDo(PDOCB pdocb); virtual bool FUndo(PDOCB pdocb); }; RTCLASS(TUND) // // Undoes coloring background operations // typedef class TUNC *PTUNC; #define TUNC_PAR MUNB #define kclsTUNC 'TUNC' class TUNC : public TUNC_PAR { RTCLASS_DEC MARKMEM ASSERT protected: long _itbox; ACR _acr; TUNC(void) { } public: static PTUNC PtuncNew(void); ~TUNC(void); void SetItbox(long itbox) { _itbox = itbox; } void SetAcrBack(ACR acr) { _acr = acr; } virtual bool FDo(PDOCB pdocb); virtual bool FUndo(PDOCB pdocb); }; RTCLASS(TUNC) // // // BEGIN TBXB and TBXG // // /**************************************************** * * Creates a textbox display area. * * Parameters: * ptbox - The owning text box for this view. * pgcb - Creation block. * * Returns: * A pointer to the view, else pvNil. * ****************************************************/ PTBXB TBXB::PtbxbNew(PTBOX ptbox, PGCB pgcb) { AssertPo(ptbox, 0); AssertPvCb(pgcb, size(GCB)); PTBXB ptbxb; PTBXG ptbxg; RC rcRel, rcAbs; ACR acr; // // Create the border // ptbxb = NewObj TBXB(ptbox, pgcb); if (ptbxb == pvNil) { return (pvNil); } // // Now create the DDG area for the text // rcAbs.Set(kdzpBorderTbox, kdzpBorderTbox, -kdzpBorderTbox, -kdzpBorderTbox); rcRel.Set(krelZero, krelZero, krelOne, krelOne); pgcb->Set(pgcb->_hid, ptbxb, pgcb->_grfgob, pgcb->_gin, &rcAbs, &rcRel); if (pvNil == (ptbxg = (PTBXG)ptbox->PddgNew(pgcb))) { ReleasePpo(&ptbxb); return (pvNil); } ptbxg->SetTbxb(ptbxb); return ptbxb; } /**************************************************** * * Draws a textbox border * * Parameters: * pgnv - The graphic environment describing the draw. * prcClip - the clipping rectangle to draw into. * * Returns: * None. * ****************************************************/ void TBXB::Draw(PGNV pgnv, RC *prcClip) { AssertThis(0); AssertPo(pgnv, 0); AssertPvCb(prcClip, size(RC)); RC rc; RC rcClip; long lwSave; Assert(_ptbox->FIsVisible(), "DDG existing for invisible tbox"); if (!_ptbox->FSelected()) { return; } // // Draw border // pgnv->GetRcSrc(&rc); rc.Inset(kdzpBorderTbox / 2, kdzpBorderTbox / 2); if (_ptbox->FStory()) { pgnv->FrameRcApt(&rc, &vaptLtGray, kacrBlack, kacrClear); } else { pgnv->FrameRcApt(&rc, &vaptLtGray, kacrYellow, kacrClear); } // // Upper left anchor // pgnv->GetRcSrc(&rc); rc.ypBottom = rc.ypTop + kdzpBorderTbox; lwSave = rc.xpRight; rc.xpRight = rc.xpLeft + kdzpBorderTbox; if (rcClip.FIntersect(&rc, prcClip)) { pgnv->FillRc(&rcClip, kacrWhite); pgnv->FrameRc(&rcClip, kacrBlack); } // // Upper Middle anchor // rc.xpLeft = (lwSave - rc.xpLeft - kdzpBorderTbox) / 2; rc.xpRight = rc.xpLeft + kdzpBorderTbox; if (rcClip.FIntersect(&rc, prcClip)) { pgnv->FillRc(&rcClip, kacrWhite); pgnv->FrameRc(&rcClip, kacrBlack); } // // Upper right anchor // rc.xpLeft = (lwSave - kdzpBorderTbox); rc.xpRight = lwSave; if (rcClip.FIntersect(&rc, prcClip)) { pgnv->FillRc(&rcClip, kacrWhite); pgnv->FrameRc(&rcClip, kacrBlack); } // // Middle left anchor // pgnv->GetRcSrc(&rc); rc.ypTop = (rc.ypBottom - rc.ypTop - kdzpBorderTbox) / 2; rc.ypBottom = rc.ypTop + kdzpBorderTbox; lwSave = rc.xpRight; rc.xpRight = rc.xpLeft + kdzpBorderTbox; if (rcClip.FIntersect(&rc, prcClip)) { pgnv->FillRc(&rcClip, kacrWhite); pgnv->FrameRc(&rcClip, kacrBlack); } // // Middle right anchor // rc.xpLeft = (lwSave - kdzpBorderTbox); rc.xpRight = lwSave; if (rcClip.FIntersect(&rc, prcClip)) { pgnv->FillRc(&rcClip, kacrWhite); pgnv->FrameRc(&rcClip, kacrBlack); } // // Lower left anchor // pgnv->GetRcSrc(&rc); rc.ypTop = rc.ypBottom - kdzpBorderTbox; lwSave = rc.xpRight; rc.xpRight = rc.xpLeft + kdzpBorderTbox; if (rcClip.FIntersect(&rc, prcClip)) { pgnv->FillRc(&rcClip, kacrWhite); pgnv->FrameRc(&rcClip, kacrBlack); } // // Lower middle anchor // rc.xpLeft = (lwSave - rc.xpLeft - kdzpBorderTbox) / 2; rc.xpRight = rc.xpLeft + kdzpBorderTbox; if (rcClip.FIntersect(&rc, prcClip)) { pgnv->FillRc(&rcClip, kacrWhite); pgnv->FrameRc(&rcClip, kacrBlack); } // // Lower right anchor // rc.xpLeft = (lwSave - kdzpBorderTbox); rc.xpRight = lwSave; if (rcClip.FIntersect(&rc, prcClip)) { pgnv->FillRc(&rcClip, kacrWhite); pgnv->FrameRc(&rcClip, kacrBlack); } } /*************************************************************************** * * Handles mouse commands for clicking and dragging. * * Parameters: * pcmd - Pointer to the mouse command. * * Returns: * fTrue if it handles the command, else fFalse. * **************************************************************************/ bool TBXB::FCmdTrackMouse(PCMD_MOUSE pcmd) { AssertThis(0); AssertVarMem(pcmd); PMVU pmvu; PT pt; RC rc, rcOld; RC rcBound(0, 0, _ptbox->Pscen()->Pmvie()->Pmcc()->Dxp(), _ptbox->Pscen()->Pmvie()->Pmcc()->Dyp()); static long itbox = ivNil; pmvu = (PMVU)_ptbox->Pscen()->Pmvie()->PddgGet(0); AssertPo(pmvu, 0); pt.xp = pcmd->xp; pt.yp = pcmd->yp; MapPt(&pt, cooLocal, cooGlobal); if (_fTrackingMouse) { if (pcmd->grfcust & fcustMouse) { _fTrackingMouse = fFalse; vpcex->EndMouseTracking(); vpappb->ShowCurs(); vpcex->EnqueueCid(cidTboxClicked, pvNil, pvNil, _ptbox->Itbox(), fTrue); return (fTrue); } } if (pcmd->cid == cidMouseDown) { Assert(vpcex->PgobTracking() == pvNil, "mouse already being tracked!"); // // Select this text box if not already // if (_ptbox->Pscen()->PtboxSelected() != _ptbox) { _ptbox->Pscen()->SelectTbox(_ptbox); } itbox = _ptbox->Itbox(); vpcex->EnqueueCid(cidTboxClicked, pvNil, pvNil, itbox, fTrue); // // Check for nuker // if (pmvu->Tool() == toolActorNuke) { _ptbox->Pscen()->Pmvie()->Pmcc()->PlayUISound(toolActorNuke, fcustShift); _ptbox->Pscen()->FRemTbox(_ptbox); return (fTrue); } if ((pmvu->Tool() != toolCutObject) && (pmvu->Tool() != toolCopyObject) && (pmvu->Tool() != toolPasteObject)) { _tbxt = _TbxtAnchor(pcmd->xp, pcmd->yp); GetRc(&_rcOrig, cooParent); _xpPrev = pt.xp; _ypPrev = pt.yp; vpappb->HideCurs(); } // // Store all initial information // vpcex->TrackMouse(this); } else { if (pmvu->Tool() == toolActorNuke) { return (fTrue); } // // mouse drag/up // Assert(vpcex->PgobTracking() == this, "not tracking mouse!"); Assert(pcmd->cid == cidTrackMouse, 0); if (pmvu->Tool() == toolPasteObject) { if (!(pcmd->grfcust & fcustMouse)) { vpcex->EnqueueCid(cidTboxClicked, pvNil, pvNil, itbox, fFalse); vpcex->EndMouseTracking(); } return (fTrue); } if ((pmvu->Tool() == toolCutObject) || (pmvu->Tool() == toolCopyObject)) { if (!(pcmd->grfcust & fcustMouse)) { PTBXG ptbxg = (PTBXG)_ptbox->PddgGet(0); AssertPo(ptbxg, 0); ptbxg->_FDoClip(pmvu->Tool()); vpcex->EndMouseTracking(); vpcex->EnqueueCid(cidTboxClicked, pvNil, pvNil, itbox, fFalse); } return (fTrue); } // // Now do work based on what we are doing -- dragging, stretching, shrinking. // GetRc(&rc, cooParent); rcOld = rc; // // Do vertical adjustment // switch (_tbxt) { case tbxtDown: case tbxtDownRight: case tbxtDownLeft: rc.ypBottom = LwBound(rcOld.ypBottom + pt.yp - _ypPrev, rc.ypTop + kdypMinTbox + LwMul(2, kdzpBorderTbox), rcBound.ypBottom + 1); _ypPrev += rc.ypBottom - rcOld.ypBottom; break; case tbxtUp: case tbxtUpRight: case tbxtUpLeft: rc.ypTop = LwBound(rcOld.ypTop + pt.yp - _ypPrev, rcBound.ypTop, rc.ypBottom - kdypMinTbox - LwMul(2, kdzpBorderTbox) + 1); _ypPrev += rc.ypTop - rcOld.ypTop; break; case tbxtMove: break; } // // Do horizontal adjustment // switch (_tbxt) { case tbxtRight: case tbxtDownRight: case tbxtUpRight: rc.xpRight = LwBound(rcOld.xpRight + pt.xp - _xpPrev, rc.xpLeft + kdxpMinTbox + LwMul(2, kdzpBorderTbox), rcBound.xpRight + 1); _xpPrev += rc.xpRight - rcOld.xpRight; break; case tbxtLeft: case tbxtDownLeft: case tbxtUpLeft: rc.xpLeft = LwBound(rcOld.xpLeft + pt.xp - _xpPrev, rcBound.xpLeft, (rc.xpRight - (kdxpMinTbox + LwMul(2, kdzpBorderTbox))) + 1); _xpPrev += rc.xpLeft - rcOld.xpLeft; break; case tbxtMove: rc.Offset(pt.xp - _xpPrev, pt.yp - _ypPrev); rc.PinToRc(&rcBound); _xpPrev += rc.xpLeft - rcOld.xpLeft; _ypPrev += rc.ypTop - rcOld.ypTop; break; } vpappb->PositionCurs(_xpPrev, _ypPrev); if ((rc != rcOld) && !_ptbox->Pscen()->Pmvie()->Pmcc()->FMinimized()) { // // Reposition the textbox. // SetPos(&rc); _ptbox->SetRc(&rc); } // // If mouse up // if (!(pcmd->grfcust & fcustMouse) && !_fTrackingMouse) { // // Add an undo object for the resize/move // GetRc(&rc, cooLocal); if (_rcOrig != rc) { PTUNS ptuns; ptuns = TUNS::PtunsNew(); if (ptuns == pvNil) { PushErc(ercSocNotUndoable); _ptbox->Pscen()->Pmvie()->ClearUndo(); } else { ptuns->SetItbox(_ptbox->Itbox()); ptuns->SetRc(&_rcOrig); if (!_ptbox->Pscen()->Pmvie()->FAddUndo(ptuns)) { PushErc(ercSocNotUndoable); _ptbox->Pscen()->Pmvie()->ClearUndo(); } ReleasePpo(&ptuns); } } vpcex->EnqueueCid(cidTboxClicked, pvNil, pvNil, _ptbox->Itbox(), fFalse); vpcex->EndMouseTracking(); vpappb->ShowCurs(); } } return (fTrue); } /*************************************************************************** * * Handles mouse move commands * * Parameters: * pcmd - Pointer to the mouse move command. * * Returns: * fTrue if it handles the command, else fFalse. * **************************************************************************/ bool TBXB::FCmdMouseMove(PCMD_MOUSE pcmd) { AssertThis(0); AssertVarMem(pcmd); PMVU pmvu; pmvu = (PMVU)_ptbox->Pscen()->Pmvie()->PddgGet(0); AssertPo(pmvu, 0); // // Check for cut, copy, paste, nuke tools // if ((pmvu->Tool() == toolCutObject) || (pmvu->Tool() == toolCopyObject) || (pmvu->Tool() == toolPasteObject) || (pmvu->Tool() == toolActorNuke)) { _ptbox->Pscen()->Pmvie()->Pmcc()->SetCurs(pmvu->Tool()); return (fTrue); } switch (_TbxtAnchor(pcmd->xp, pcmd->yp)) { case tbxtUp: case tbxtDown: _ptbox->Pscen()->Pmvie()->Pmcc()->SetCurs(toolTboxUpDown); break; case tbxtUpRight: case tbxtDownLeft: _ptbox->Pscen()->Pmvie()->Pmcc()->SetCurs(toolTboxRising); break; case tbxtLeft: case tbxtRight: _ptbox->Pscen()->Pmvie()->Pmcc()->SetCurs(toolTboxLeftRight); break; case tbxtUpLeft: case tbxtDownRight: _ptbox->Pscen()->Pmvie()->Pmcc()->SetCurs(toolTboxFalling); break; default: _ptbox->Pscen()->Pmvie()->Pmcc()->SetCurs(toolTboxMove); break; } return (fTrue); } /*************************************************************************** * * Finds which anchor point the given point is in. * * Parameters: * xp - X position in local coordinates * yp - Y position in local coordinates * * Returns: * Anchor point number. * **************************************************************************/ TBXT TBXB::_TbxtAnchor(long xp, long yp) { AssertThis(0); RC rc; GetRc(&rc, cooLocal); // // Is the cursor in upper-left anchor? // if ((xp < kdzpBorderTbox) && (yp < kdzpBorderTbox)) { return (tbxtUpLeft); } // // Is the cursor in lower-right anchor? // if ((xp > rc.xpRight - kdzpBorderTbox) && (yp > rc.ypBottom - kdzpBorderTbox)) { return (tbxtDownRight); } // // Is the cursor in upper-right anchor? // if ((xp > rc.xpRight - kdzpBorderTbox) && (yp < kdzpBorderTbox)) { return (tbxtUpRight); } // // Is the cursor in lower-left anchor? // if ((xp < kdzpBorderTbox) && (yp > rc.ypBottom - kdzpBorderTbox)) { return (tbxtDownLeft); } // // Is the cursor in middle top? // if ((xp <= (rc.xpRight - rc.xpLeft + kdzpBorderTbox) / 2) && (xp >= (rc.xpRight - rc.xpLeft - kdzpBorderTbox) / 2) && (yp < kdzpBorderTbox)) { return (tbxtUp); } // // Is the cursor in middle bottom? // if ((xp <= (rc.xpRight - rc.xpLeft + kdzpBorderTbox) / 2) && (xp >= (rc.xpRight - rc.xpLeft - kdzpBorderTbox) / 2) && (yp > rc.ypBottom - kdzpBorderTbox)) { return (tbxtDown); } // // Is the cursor in middle left? // if ((yp <= (rc.ypBottom - rc.ypTop + kdzpBorderTbox) / 2) && (yp >= (rc.ypBottom - rc.ypTop - kdzpBorderTbox) / 2) && (xp < kdzpBorderTbox)) { return (tbxtLeft); } // // Is the cursor in middle right? // if ((yp <= (rc.ypBottom - rc.ypTop + kdzpBorderTbox) / 2) && (yp >= (rc.ypBottom - rc.ypTop - kdzpBorderTbox) / 2) && (xp > rc.xpRight - kdzpBorderTbox)) { return (tbxtRight); } // // Not in an anchor. // return (tbxtMove); } /*************************************************************************** * * Callback for when this text box window gets activated * * Parameters: * fActive - Is this the active window? * * Returns: * None. * **************************************************************************/ void TBXB::Activate(bool fActive) { PDDG pddg; pddg = _ptbox->PddgGet(0); AssertPo(pddg, 0); pddg->Activate(fActive); if (fActive) { BringToFront(); _ptbox->Pscen()->SelectTbox(_ptbox); } } /*************************************************************************** * * Will return fFalse if tbox is to be ignored. * * Parameters: * xp, yp - The current mouse point. * * Returns: * fTrue if it handles the command, else fFalse. * **************************************************************************/ bool TBXB::FPtIn(long xp, long yp) { AssertThis(0); PMVU pmvu; pmvu = (PMVU)_ptbox->Pscen()->Pmvie()->PddgGet(0); AssertPo(pmvu, 0); // // Pass through if not in text mode, or in a tool that // does not select this text box. // if (!pmvu->FTextMode() || ((pmvu->Tool() == toolSceneNuke) || (pmvu->Tool() == toolSceneChop) || (pmvu->Tool() == toolSceneChopBack)) || ((_ptbox->Pscen()->PtboxSelected() != _ptbox) && ((pmvu->Tool() == toolTboxStory) || (pmvu->Tool() == toolTboxCredit)))) { return (fFalse); } return (TBXB_PAR::FPtIn(xp, yp)); } /**************************************************** * Attach the mouse to this border. * * Parameters: * None. * * Returns: * None. * ****************************************************/ void TBXB::AttachToMouse(void) { AssertThis(0); PMVU pmvu; PT pt; pmvu = (PMVU)_ptbox->Pscen()->Pmvie()->PddgGet(0); AssertPo(pmvu, 0); _fTrackingMouse = fTrue; _tbxt = tbxtMove; GetRc(&_rcOrig, cooParent); pt.xp = _rcOrig.xpLeft; pt.yp = _rcOrig.ypTop; MapPt(&pt, cooParent, cooGlobal); _xpPrev = pt.xp; _ypPrev = pt.yp; pmvu->SetTool(toolTboxMove); _ptbox->Pscen()->Pmvie()->Pmcc()->ChangeTool(toolTboxMove); vpappb->PositionCurs(_xpPrev, _ypPrev); vpappb->HideCurs(); vpcex->TrackMouse(this); } #ifdef DEBUG /**************************************************** * Mark memory used by the TBXB * * Parameters: * None. * * Returns: * None. * ****************************************************/ void TBXB::MarkMem(void) { AssertThis(0); TBXB_PAR::MarkMem(); } /*************************************************************************** * * Assert the validity of the TBXB. * * Parameters: * grf - Bit field of options * * Returns: * None. * **************************************************************************/ void TBXB::AssertValid(ulong grf) { TBXB_PAR::AssertValid(fobjAllocated); } #endif // // Disable the some default rich text functionality, // and then intercept other commands. // BEGIN_CMD_MAP(TBXG, DDG) ON_CID_GEN(cidSave, pvNil, pvNil) ON_CID_GEN(cidClose, pvNil, pvNil) ON_CID_GEN(cidSaveAndClose, pvNil, pvNil) ON_CID_GEN(cidSaveAs, pvNil, pvNil) ON_CID_GEN(cidSaveCopy, pvNil, pvNil) ON_CID_GEN(cidCutTool, &TBXG::FCmdClip, &TBXG::FEnableDdgCmd) ON_CID_GEN(cidCopyTool, &TBXG::FCmdClip, &TBXG::FEnableDdgCmd) ON_CID_GEN(cidPasteTool, &TBXG::FCmdClip, &TBXG::FEnableDdgCmd) ON_CID_GEN(cidPaste, &TBXG::FCmdClip, &TBXG::FEnableDdgCmd) ON_CID_GEN(cidCut, &TBXG::FCmdClip, pvNil) ON_CID_GEN(cidCopy, &TBXG::FCmdClip, pvNil) ON_CID_GEN(cidUndo, pvNil, pvNil) ON_CID_GEN(cidRedo, pvNil, pvNil) END_CMD_MAP_NIL() /**************************************************** * * Destructor for text box DDGs. * ****************************************************/ TBXG::~TBXG() { } /**************************************************** * * Creates a textbox display area. * * Parameters: * ptbox - The owning text box for this view. * pgcb - Creation block. * * Returns: * A pointer to the view, else pvNil. * ****************************************************/ PTBXG TBXG::PtbxgNew(PTBOX ptbox, PGCB pgcb) { AssertPo(ptbox, 0); AssertPvCb(pgcb, size(GCB)); PTBXG ptbxg; if (pvNil == (ptbxg = NewObj TBXG(ptbox, pgcb))) { return (pvNil); } if (!ptbxg->_FInit()) { ReleasePpo(&ptbxg); return pvNil; } ptbxg->GetRc(&ptbxg->_rcOld, cooLocal); return ptbxg; } /**************************************************** * * Draws a textbox innards * * Parameters: * pgnv - The graphic environment describing the draw. * prcClip - the clipping rectangle to draw into. * * Returns: * None. * ****************************************************/ void TBXG::Draw(PGNV pgnv, RC *prcClip) { AssertThis(0); AssertPo(pgnv, 0); AssertPvCb(prcClip, size(RC)); RC rc; // // In order to do scrolling text boxex, the easiest // way to get the text to scroll is to grow the DDG // upward (to the top of the screen), but then clip // the drawing to within the border. // // The DDG will automatically be clipped to within // the border GOB, but the drawn border (dashes and // anchors) must then be subtracted. // GetRc(&rc, cooParent); rc.ypTop = kdzpBorderTbox; MapRc(&rc, cooParent, cooLocal); rc.FIntersect(prcClip); pgnv->ClipRc(&rc); TBXG_PAR::Draw(pgnv, &rc); } /*************************************************************************** * * Callback for when this text box window gets activated * * Parameters: * fActive - Is this the active window? * * Returns: * None. * **************************************************************************/ void TBXG::Activate(bool fActive) { AssertThis(0); PTBOX ptbox = (PTBOX)_pdocb; AssertPo(ptbox, 0); TBXG_PAR::Activate(fActive); ptbox->Select(fActive); } /*************************************************************************** * * Handles when the user starts typing * * Parameters: * cp - Character position. * ccpIns - Number of characters to insert. * ccpDel - Number of characters to delete. * * Returns: * None. * **************************************************************************/ void TBXG::InvalCp(long cp, long ccpIns, long ccpDel) { PMVU pmvu; PTBOX ptbox = (PTBOX)_pdocb; AssertPo(ptbox, 0); pmvu = (PMVU)ptbox->Pscen()->Pmvie()->PddgGet(0); AssertPo(pmvu, 0); if (((pmvu->Tool() == toolTboxPaintText) || (pmvu->Tool() == toolTboxFont) || (pmvu->Tool() == toolTboxSize) || (pmvu->Tool() == toolTboxStyle)) && (ccpIns != ccpDel)) { pmvu->SetTool(toolTboxMove); ptbox->Pscen()->Pmvie()->Pmcc()->ChangeTool(toolTboxMove); } TBXG_PAR::InvalCp(cp, ccpIns, ccpDel); } /*************************************************************************** * * Handles mouse move commands * * Parameters: * pcmd - Pointer to the mouse move command. * * Returns: * fTrue if it handles the command, else fFalse. * **************************************************************************/ bool TBXG::FCmdMouseMove(PCMD_MOUSE pcmd) { AssertThis(0); AssertVarMem(pcmd); PTBOX ptbox = (PTBOX)_pdocb; PMVU pmvu; pmvu = (PMVU)ptbox->Pscen()->Pmvie()->PddgGet(0); AssertPo(pmvu, 0); // // Check for cut, copy, paste tools // switch (pmvu->Tool()) { case toolCutObject: ptbox->Pscen()->Pmvie()->Pmcc()->SetCurs(toolCutText); return (fTrue); case toolCopyObject: ptbox->Pscen()->Pmvie()->Pmcc()->SetCurs(toolCopyText); return (fTrue); case toolPasteObject: ptbox->Pscen()->Pmvie()->Pmcc()->SetCurs(toolPasteText); return (fTrue); case toolTboxFillBkgd: case toolTboxPaintText: case toolActorNuke: case toolTboxStory: case toolTboxCredit: case toolTboxFont: case toolTboxSize: case toolTboxStyle: ptbox->Pscen()->Pmvie()->Pmcc()->SetCurs(pmvu->Tool()); return (fTrue); } ptbox->Pscen()->Pmvie()->Pmcc()->SetCurs(toolIBeam); return (fTrue); } /*************************************************************************** * * Handles other mouse commands * * Parameters: * pcmd - Pointer to the mouse command. * * Returns: * fTrue if it handles the command, else fFalse. * **************************************************************************/ bool TBXG::FCmdTrackMouse(PCMD_MOUSE pcmd) { AssertThis(0); AssertVarMem(pcmd); PTBOX ptbox = (PTBOX)_pdocb; PMVU pmvu; CHP chpNew, chpDiff; chpNew.Clear(); chpDiff.Clear(); pmvu = (PMVU)ptbox->Pscen()->Pmvie()->PddgGet(0); AssertPo(pmvu, 0); // // Check for the nuker // if (pmvu->Tool() == toolActorNuke) { if (pcmd->cid == cidMouseDown) { vpcex->EnqueueCid(cidTboxClicked, pvNil, pvNil, ptbox->Itbox(), fTrue); ptbox->Pscen()->Pmvie()->Pmcc()->PlayUISound(toolActorNuke, fcustShift); ptbox->Pscen()->FRemTbox(ptbox); } return (fTrue); } // // No selecting text with the fill bucket or type changers // if ((pmvu->Tool() != toolTboxFillBkgd) && (pmvu->Tool() != toolTboxStory) && (pmvu->Tool() != toolTboxCredit)) { TBXG_PAR::FCmdTrackMouse(pcmd); } if ((pcmd->cid == cidMouseDown) && (pcmd->grfcust & fcustMouse)) { vpcex->EnqueueCid(cidTboxClicked, pvNil, pvNil, ptbox->Itbox(), fTrue); switch (pmvu->Tool()) { case toolTboxFillBkgd: ptbox->FSetAcrBack(pmvu->AcrPaint()); ptbox->Pscen()->Pmvie()->Pmcc()->PlayUISound(pmvu->Tool()); break; case toolTboxStory: ptbox->FSetType(fTrue); ptbox->Pscen()->Pmvie()->Pmcc()->PlayUISound(pmvu->Tool()); break; case toolTboxCredit: ptbox->FSetType(fFalse); ptbox->Pscen()->Pmvie()->Pmcc()->PlayUISound(pmvu->Tool()); break; } return (fTrue); } if ((pcmd->cid != cidMouseDown) && !(pcmd->grfcust & fcustMouse)) { vpcex->EnqueueCid(cidTboxClicked, pvNil, pvNil, ptbox->Itbox(), fFalse); switch (pmvu->Tool()) { case toolCutObject: _FDoClip(toolCutText); break; case toolCopyObject: _FDoClip(toolCopyText); SetSel(_cpOther, _cpOther); break; case toolPasteObject: _FDoClip(toolPasteText); break; case toolTboxPaintText: if (!FTextSelected()) break; chpNew.acrFore = pmvu->AcrPaint(); chpDiff.acrFore.SetFromLw(~chpNew.acrFore.LwGet()); goto LApplyFormat; case toolTboxFont: if (!FTextSelected()) break; chpNew.onn = pmvu->OnnTextCur(); chpDiff.onn = ~chpNew.onn; goto LApplyFormat; case toolTboxStyle: if (!FTextSelected()) break; chpNew.grfont = pmvu->GrfontStyleTextCur(); chpDiff.grfont = ~chpNew.grfont; goto LApplyFormat; case toolTboxSize: if (!FTextSelected()) break; chpNew.dypFont = pmvu->DypFontTextCur(); chpDiff.dypFont = ~chpNew.dypFont; LApplyFormat: ptbox->Pscen()->Pmvie()->Pmcc()->PlayUISound(pmvu->Tool()); FApplyChp(&chpNew, &chpDiff); break; } } return (fTrue); } /*************************************************************************** * * Will return fFalse if tbox is to be ignored. * * Parameters: * xp, yp - The current mouse point. * * Returns: * fTrue if it handles the command, else fFalse. * **************************************************************************/ bool TBXG::FPtIn(long xp, long yp) { AssertThis(0); PTBOX ptbox = (PTBOX)_pdocb; PMVU pmvu; AssertPo(ptbox, 0); pmvu = (PMVU)ptbox->Pscen()->Pmvie()->PddgGet(0); AssertPo(pmvu, 0); // // Pass through if not in text mode, or in a tool that // does not select this text box. // if (!pmvu->FTextMode() || ((pmvu->Tool() == toolSceneNuke) || (pmvu->Tool() == toolSceneChop) || (pmvu->Tool() == toolSceneChopBack))) { return (fFalse); } return (TBXG_PAR::FPtIn(xp, yp)); } /*************************************************************************** * * Used for resizing. We don't actually change the width of the * document, only the size of the view. * * NOTE: Do not AssertThis(0) in this routine, as this routine * is called during a time the doc is invalid. * * Parameters: * None. * * Returns: * Width in pixels. * **************************************************************************/ long TBXG::_DxpDoc() { AssertBaseThis(0); RC rc; GetRc(&rc, cooLocal); return (rc.Dxp() - 2 * kdxpIndentTxtg); } /*************************************************************************** * * Notification that there is a new rectangle. Here we reformat the text * to fit into the new rectangle. * * Parameters: * None. * * Returns: * None. * **************************************************************************/ void TBXG::_NewRc(void) { AssertBaseThis(0); RC rc; GetRc(&rc, cooLocal); // // Only reformat if the width changes // if (_rcOld.Dxp() == rc.Dxp()) { return; } _rcOld = rc; TBXG_PAR::_NewRc(); long cpLim = _ptxtb->CpMac() - 1; _Reformat(0, cpLim, cpLim); } /*************************************************************************** * * Handles preparing for cut, copy or paste. * * Parameters: * pcmd - The command to process. * * Returns: * fTrue if it handled the command, else fFalse. * **************************************************************************/ bool TBXG::FCmdClip(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); PTBOX ptbox = (PTBOX)_pdocb; PDOCB pdocb; PMVU pmvu; pmvu = (PMVU)ptbox->Pscen()->Pmvie()->PddgGet(0); AssertPo(pmvu, 0); Assert(pmvu->FTextMode(), "Bad mode"); if (((pcmd->cid == cidPaste) || (pcmd->cid == cidPasteTool)) && vpclip->FGetFormat(kclsACLP, &pdocb)) { CMD cmd; if (((PACLP)pdocb)->FRouteOnly()) { PushErc(ercSocCannotPasteThatHere); ReleasePpo(&pdocb); return (fTrue); } // // Pass this onto the MVU for pasting // cmd = *pcmd; cmd.pcmh = pmvu; vpcex->EnqueueCmd(&cmd); ReleasePpo(&pdocb); return (fTrue); } switch (pcmd->cid) { case cidPaste: _FDoClip(vpclip->FGetFormat(kclsTCLP) ? toolPasteObject : toolPasteText); break; case cidCut: _FDoClip(FTextSelected() ? toolCutText : toolCutObject); break; case cidCopy: _FDoClip(FTextSelected() ? toolCopyText : toolCopyObject); break; default: return (fFalse); } return (fTrue); } /*************************************************************************** * * Handles enabling of all cut, copy, paste commands. * * Parameters: * pcmd - The command to process. * * Returns: * fTrue if it handled the command, else fFalse. * **************************************************************************/ bool TBXG::FEnableDdgCmd(PCMD pcmd, ulong *pgrfeds) { AssertThis(0); AssertVarMem(pcmd); AssertVarMem(pgrfeds); PTBOX ptbox = (PTBOX)_pdocb; AssertPo(ptbox, 0); *pgrfeds = fedsEnable; switch (pcmd->cid) { case cidCutTool: case cidCopyTool: break; case cidPaste: case cidPasteTool: // // First check if the clipboard contains any text // which we might need to paste *into* the text box. // if (ptbox->FSelected() && !vpclip->FDocIsClip(pvNil) && _FPaste(vpclip, fFalse, cidPaste)) { *pgrfeds &= fedsEnable; return (fTrue); } // // Now check if clipboard is a text box. // if (!vpclip->FGetFormat(kclsTCLP)) { *pgrfeds = fedsDisable; } break; default: return (TBXG_PAR::FEnableDdgCmd(pcmd, pgrfeds)); } return (fTrue); } /*************************************************************************** * * Actually does cut, copy or paste command. * * Parameters: * tool - The tool to use. * * Returns: * fTrue if it handled the command, else fFalse. * **************************************************************************/ bool TBXG::_FDoClip(long tool) { AssertThis(0); PTBOX ptbox = (PTBOX)_pdocb; PTBOX ptboxDup; PTCLP ptclp; CMD cmd; AssertPo(ptbox, 0); switch (tool) { case toolCutText: case toolCopyText: if (FTextSelected()) { ClearPb(&cmd, size(CMD)); cmd.cid = (tool == toolCutText) ? cidCut : cidCopy; ptbox->Pscen()->Pmvie()->Pmcc()->PlayUISound(tool); if (!TBXG_PAR::FCmdClip(&cmd)) { return (fFalse); } return (fTrue); } return (fTrue); case toolPasteText: if (!vpclip->FGetFormat(kclsACLP) && !vpclip->FGetFormat(kclsTCLP)) { ClearPb(&cmd, size(CMD)); cmd.cid = cidPaste; ptbox->Pscen()->Pmvie()->Pmcc()->PlayUISound(tool); return (TBXG_PAR::FCmdClip(&cmd)); } else { PushErc(ercSocCannotPasteThatHere); } return (fTrue); case toolCutObject: case toolCopyObject: // // Copy the text box // if (!ptbox->FDup(&ptboxDup)) { return (fFalse); } AssertPo(ptboxDup, 0); // // Create the clip board object // ptclp = TCLP::PtclpNew(ptboxDup); AssertNilOrPo(ptclp, 0); if (ptclp == pvNil) { ReleasePpo(&ptboxDup); return (fFalse); } // // Hide the current tbox // if (tool == toolCutObject) { if (!ptbox->Pscen()->Pmvie()->FHideTbox()) { ReleasePpo(&ptclp); ReleasePpo(&ptboxDup); return (fFalse); } } vpclip->Set(ptclp); ReleasePpo(&ptclp); ptbox->Pscen()->Pmvie()->Pmcc()->PlayUISound(tool); break; case toolPasteObject: if (vpclip->FGetFormat(kclsTCLP, (PDOCB *)&ptclp)) { AssertPo(ptclp, 0); bool fRet; fRet = ptbox->Pscen() != pvNil && ptclp->FPaste(ptbox->Pscen()); ReleasePpo(&ptclp); ptbox->Pscen()->Pmvie()->Pmcc()->PlayUISound(tool); return fRet; } else { PushErc(ercSocNothingToPaste); } break; default: Bug("Unknown tool type"); } return (fTrue); } /**************************************************** * * Decides if a text box needs to scroll right now. * * Parameters: * None. * * Returns: * fTrue if yes, else fFalse. * ****************************************************/ bool TBXG::FNeedToScroll() { AssertThis(0); RC rc; long dyp; // // Get the height of the remaining text // GetNaturalSize(pvNil, &dyp); dyp -= _dypDisp; GetRc(&rc, cooLocal); // // Check vs the height of the box. // return dyp > rc.Dyp(); } /**************************************************** * * Scrolls up by one pixel, or to the beginning of the text. * * Parameters: * scaVert - How to scroll vertically, scaNil == go to top, * anything else scrolls down by 1 pixel. * * Returns: * None. * ****************************************************/ void TBXG::Scroll(long scaVert) { AssertThis(0); RC rcAbs, rcRel; if (scaVert == scaNil) { _Scroll(scaToVal, scaToVal, 0, 0); } else { GetPos(&rcAbs, &rcRel); rcAbs.ypTop -= kdypScroll; SetPos(&rcAbs, &rcRel); } } /**************************************************** * * Tells if any text is selected or not. * * Parameters: * None. * * Returns: * None. * ****************************************************/ bool TBXG::FTextSelected(void) { AssertThis(0); return (_cpAnchor != _cpOther); } /**************************************************** * * Get the character properties for displaying the given cp. * * Parameters: * cp - Character position. * pchp - Destination chp. * pcpMin - Starting character position. * pcpLim - Ending character position. * * Returns: * None. * ****************************************************/ void TBXG::_FetchChp(long cp, PCHP pchp, long *pcpMin, long *pcpLim) { TBXG_PAR::_FetchChp(cp, pchp, pcpMin, pcpLim); if (pchp->acrFore == kacrBlack) { pchp->acrFore = kacrYellow; } } #ifdef DEBUG /**************************************************** * Mark memory used by the TBXG * * Parameters: * None. * * Returns: * None. * ****************************************************/ void TBXG::MarkMem(void) { AssertThis(0); TBXG_PAR::MarkMem(); MarkMemObj(_ptbxb); } /*************************************************************************** * * Assert the validity of the TBXG. * * Parameters: * grf - Bit field of options * * Returns: * None. * **************************************************************************/ void TBXG::AssertValid(ulong grf) { TBXG_PAR::AssertValid(fobjAllocated); AssertPo(_ptbxb, 0); } #endif // DEBUG // // // BEGIN TBOX // // #define kbomTboxh 0x5FFFC000 // // header information for saving text boxes to a file // struct TBOXH { short bo; short osk; long nfrmFirst; long nfrmMax; long xpLeft; long xpRight; long ypTop; long ypBottom; CHID chid; bool fStory; }; /**************************************************** * * Creates a textbox * * Parameters: * pscen - Scene which owns this textbox. * prcRel - The bounding rectangle of the DDG for the text box within the * the owning MVU. * fStory - Is this a story text box? * * Returns: * None. * ****************************************************/ PTBOX TBOX::PtboxNew(PSCEN pscen, RC *prcRel, bool fStory) { AssertNilOrPo(pscen, 0); AssertPvCb(prcRel, size(RC)); PTBOX ptbox; ptbox = NewObj TBOX; if (ptbox == pvNil) { return (pvNil); } if (!ptbox->_FInit(pvNil)) { ReleasePpo(&ptbox); return (pvNil); } if (prcRel != pvNil) { ptbox->_rc = *prcRel; ptbox->_dxpDef = prcRel->xpRight - prcRel->xpLeft - 2 * kdzpBorderTbox; } ptbox->_pscen = pscen; ptbox->_fStory = fStory; ptbox->SetAcrBack(kacrClear, fdocNil); Assert(pscen == pvNil || pscen->Pmvie()->CundbMax() == 1, "TUND assumes there is one level of undo!"); ptbox->SetCundbMax(1); return ptbox; } /**************************************************** * * Sets the dirty flag on the movie. * * Parameters: * fDirty - To dirty, or not to dirty, that is the question. * * Returns: * None. * ****************************************************/ void TBOX::SetDirty(bool fDirty) { AssertThis(0); if (_pscen != pvNil) { _pscen->MarkDirty(fDirty); } } /**************************************************** * * Reads a textbox * * Parameters: * pcfl - Chunky file to read from. * cno - The chunk number to read. * pscen - Scene which owns this textbox. * * Returns: * Pointer to a new tbox, else pvNil. * ****************************************************/ PTBOX TBOX::PtboxRead(PCRF pcrf, CNO cno, PSCEN pscen) { AssertPo(pcrf, 0); AssertNilOrPo(pscen, 0); PTBOX ptbox; BLCK blck; TBOXH tboxh; KID kid; PCFL pcfl = pcrf->Pcfl(); // // Find the chunk and read in the header. // if (!pcfl->FFind(kctgTbox, cno, &blck) || !blck.FUnpackData() || (blck.Cb() != size(TBOXH)) || !blck.FReadRgb(&tboxh, size(TBOXH), 0)) { PushErc(ercSocBadFile); return (pvNil); } // // Check header for byte swapping // if (tboxh.bo == kboOther) { SwapBytesBom(&tboxh, kbomTboxh); } else { Assert(tboxh.bo == kboCur, "Bad Chunky file"); } if (!pcfl->FGetKidChidCtg(kctgTbox, cno, tboxh.chid, kctgRichText, &kid)) { return (pvNil); } ptbox = NewObj TBOX; if (ptbox == pvNil) { return (pvNil); } if (!ptbox->_FReadChunk(pcfl, kid.cki.ctg, kid.cki.cno, fTrue)) { ReleasePpo(&ptbox); return (pvNil); } ptbox->_pscen = pscen; ptbox->_fStory = tboxh.fStory; ptbox->_nfrmFirst = tboxh.nfrmFirst; ptbox->_nfrmCur = tboxh.nfrmFirst - 1; ptbox->_nfrmMax = tboxh.nfrmMax; ptbox->_rc.Set(tboxh.xpLeft, tboxh.ypTop, tboxh.xpRight, tboxh.ypBottom); AssertPo(ptbox, 0); return ptbox; } /**************************************************** * * Writes the text box to a specifc chunk number * * Parameters: * pcfl - The chunky file to write to. * cno - The chunk number to write to. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool TBOX::FWrite(PCFL pcfl, CNO cno) { AssertThis(0); AssertPo(pcfl, 0); TBOXH tboxh; CKI cki; tboxh.bo = kboCur; tboxh.osk = koskCur; tboxh.nfrmFirst = _nfrmFirst; tboxh.nfrmMax = _nfrmMax; tboxh.xpLeft = _rc.xpLeft; tboxh.xpRight = _rc.xpRight; tboxh.ypTop = _rc.ypTop; tboxh.ypBottom = _rc.ypBottom; tboxh.fStory = _fStory; tboxh.chid = 0; if (!FSaveToChunk(pcfl, &cki)) { return (fFalse); } Assert(cki.ctg == kctgRichText, "bad ctg"); if (!pcfl->FAdoptChild(kctgTbox, cno, cki.ctg, cki.cno, 0)) { pcfl->Delete(cki.ctg, cki.cno); return (fFalse); } if (!pcfl->FPutPv((void *)&tboxh, size(TBOXH), kctgTbox, cno)) { pcfl->DeleteChild(kctgTbox, cno, cki.ctg, cki.cno, 0); return (fFalse); } return (fTrue); } /**************************************************** * * Sets the owning scene of the textbox. * * Parameters: * pscen - The owning scene of the textbox. * * Returns: * None. * ****************************************************/ void TBOX::SetScen(PSCEN pscen) { AssertThis(0); AssertPo(pscen, 0); _nfrmCur = pscen->Nfrm(); _nfrmFirst = pscen->Nfrm(); _nfrmMax = klwMax; _pscen = pscen; } /**************************************************** * * Sets the type of the textbox. * * Parameters: * fStory - fTrue if it is to become a story textbox, * else fFalse. * * Returns: * None. * ****************************************************/ void TBOX::SetTypeCore(bool fStory) { AssertThis(0); PTBXG ptbxg; _fStory = fStory; ptbxg = (PTBXG)PddgGet(0); AssertNilOrPo(ptbxg, 0); if (ptbxg == pvNil) { return; } ptbxg->Ptbxb()->InvalRc(pvNil); } /**************************************************** * * Attaches the textbox to the mouse. * * Parameters: * None. * * Returns: * None. * ****************************************************/ void TBOX::AttachToMouse(void) { AssertThis(0); PTBXG ptbxg; ptbxg = (PTBXG)PddgGet(0); AssertNilOrPo(ptbxg, 0); if (ptbxg == pvNil) { return; } ptbxg->Ptbxb()->AttachToMouse(); } /**************************************************** * * Sets the type of the textbox and creates an undo object * * Parameters: * fStory - fTrue if it is to become a story textbox, * else fFalse. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool TBOX::FSetType(bool fStory) { AssertThis(0); PTUNT ptunt; if (_fStory == fStory) { return (fTrue); } ptunt = TUNT::PtuntNew(); if (ptunt == pvNil) { return (fFalse); } ptunt->SetType(!fStory); ptunt->SetItbox(Itbox()); if (!Pscen()->Pmvie()->FAddUndo(ptunt)) { ReleasePpo(&ptunt); return (fFalse); } ReleasePpo(&ptunt); SetTypeCore(fStory); return (fTrue); } /**************************************************** * * Sets the bounding rectangle of the textbox. * * Parameters: * prc - The new rectangle * * Returns: * None. * ****************************************************/ void TBOX::SetRc(RC *prc) { AssertThis(0); AssertPvCb(prc, size(RC)); if (_rc != *prc) { if (Pscen() != pvNil) { Pscen()->MarkDirty(); } _rc = *prc; } } /**************************************************** * * Returns if the text box is currently visible or not. * * Parameters: * None. * * Returns: * fTrue if visible, else fFalse. * ****************************************************/ bool TBOX::FIsVisible(void) { AssertThis(0); return ((_nfrmCur >= _nfrmFirst) && (_nfrmCur < _nfrmMax)); } /*************************************************************************** * * Returns the starting and ending frames the text box appears in. * * Parameters: * pnfrmStart - Pointer to storage for first frame. * pnfrmLast - Pointer to storage for final frame. * * Returns: * fTrue if the lifetime is valid, else fFalse. * **************************************************************************/ bool TBOX::FGetLifetime(long *pnfrmStart, long *pnfrmLast) { AssertThis(0); AssertVarMem(pnfrmStart); AssertVarMem(pnfrmLast); if (_nfrmMax < _nfrmFirst) { return (fFalse); } *pnfrmStart = _nfrmFirst; if (_nfrmMax == klwMax) { *pnfrmLast = Pscen()->NfrmLast(); } else { *pnfrmLast = _nfrmMax - 1; } return (fTrue); } /**************************************************** * * Selects/Deselects a text box. * * Parameters: * fSel - fTrue if the text box is to be selected, else * fFalse. * * Returns: * None. * ****************************************************/ void TBOX::Select(bool fSel) { AssertThis(0); PTBXG ptbxg; if (fSel == _fSel) { return; } _fSel = fSel; if (Cddg() > 0) { Assert(Cddg() == 1, "Multiple views on text boxes not allowed"); ptbxg = (PTBXG)PddgGet(0); AssertPo(ptbxg, 0); ptbxg->Ptbxb()->Activate(fSel); ptbxg->Ptbxb()->InvalRc(pvNil); } } /**************************************************** * * Makes a text box goto a certain frame. * * Parameters: * nfrm - The destination frame number. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool TBOX::FGotoFrame(long nfrm) { AssertThis(0); GCB gcb; PTBXG ptbxg; PTBXB ptbxb; if (Cddg() == 0) { ptbxg = pvNil; } else { ptbxg = (PTBXG)PddgGet(0); } AssertNilOrPo(ptbxg, 0); _nfrmCur = nfrm; if (FIsVisible()) { if (ptbxg == pvNil) { // // Create a GOB for this text box // gcb.Set(khidDdg, Pscen()->Pmvie()->PddgActive(), fgobNil, kginMark, &_rc, pvNil); ptbxb = TBXB::PtbxbNew(this, &gcb); if (ptbxb == pvNil) { return (fFalse); } if (Pscen()->Pmvie()->FPlaying()) { ptbxb->Activate(fFalse); } } } if (!FIsVisible() && (ptbxg != pvNil)) { // // Release the GOB for the text box. // ptbxb = ptbxg->Ptbxb(); ReleasePpo(&ptbxb); } return (fTrue); } /**************************************************** * * Makes a text box visible at a certain frame. * * Parameters: * None. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool TBOX::FShowCore(void) { AssertThis(0); Pscen()->MarkDirty(); if (_nfrmMax < _nfrmCur) { Assert(_nfrmCur < klwMax, "Current frame too big"); _nfrmMax = _nfrmCur + 1; } else if (_nfrmCur < _nfrmFirst) { _nfrmFirst = _nfrmCur; } return (FGotoFrame(_nfrmCur)); } /**************************************************** * * Makes a text box visible at a certain frame and an undo. * * Parameters: * None. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool TBOX::FShow(void) { AssertThis(0); PTUNH ptunh; ptunh = TUNH::PtunhNew(); if (ptunh == pvNil) { return (fFalse); } ptunh->SetFrmLast(_nfrmMax); ptunh->SetFrmFirst(_nfrmFirst); ptunh->SetItbox(Itbox()); if (!Pscen()->Pmvie()->FAddUndo(ptunh)) { ReleasePpo(&ptunh); return (fFalse); } ReleasePpo(&ptunh); if (FShowCore()) { Pscen()->Pmvie()->ClearUndo(); return (fTrue); } return (fFalse); } /**************************************************** * * Removes a text box at a certain frame. * * Parameters: * None. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ void TBOX::HideCore(void) { AssertThis(0); _nfrmMax = _nfrmCur; Pscen()->MarkDirty(); AssertDo(FGotoFrame(_nfrmCur), "Could not goto frame"); if (Pscen()->PtboxSelected() == this) { Pscen()->SelectTbox(pvNil); } } /**************************************************** * * Removes a text box at a certain frame and has an undo. * * Parameters: * None. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool TBOX::FHide(void) { AssertThis(0); PTUNH ptunh; if (_nfrmCur <= _nfrmFirst) { return (Pscen()->FRemTbox(this)); } ptunh = TUNH::PtunhNew(); if (ptunh == pvNil) { return (fFalse); } ptunh->SetFrmLast(_nfrmMax); ptunh->SetFrmFirst(_nfrmFirst); ptunh->SetItbox(Itbox()); if (!Pscen()->Pmvie()->FAddUndo(ptunh)) { ReleasePpo(&ptunh); return (fFalse); } ReleasePpo(&ptunh); HideCore(); return (fTrue); } /**************************************************** * * Copies an entire text box. * * Parameters: * pptbox - Place to store the new text box. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool TBOX::FDup(PTBOX *pptbox) { AssertThis(0); *pptbox = TBOX::PtboxNew(pvNil, &_rc); AssertNilOrPo(*pptbox, 0); if (*pptbox == pvNil) { return (fFalse); } (*pptbox)->SuspendUndo(); if (!(*pptbox)->FReplaceTxrd(this, 0, CpMac(), 0, (*pptbox)->CpMac())) { ReleasePpo(pptbox); return (fFalse); } (*pptbox)->_onnDef = _onnDef; (*pptbox)->_dypFontDef = _dypFontDef; (*pptbox)->ResumeUndo(); (*pptbox)->SetAcrBack(AcrBack(), fdocNil); (*pptbox)->SetTypeCore(FStory()); return (fTrue); } /**************************************************** * * Sets the background color of the text box. * * Parameters: * acr - The color for the background. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool TBOX::FSetAcrBack(ACR acr) { AssertThis(0); PTUNC ptunc; ptunc = TUNC::PtuncNew(); if (ptunc == pvNil) { return (fFalse); } AssertPo(ptunc, 0); ptunc->SetItbox(Itbox()); ptunc->SetAcrBack(AcrBack()); if (!Pscen()->Pmvie()->FAddUndo(ptunc)) { ReleasePpo(&ptunc); return (fFalse); } ReleasePpo(&ptunc); SetAcrBack(acr); return (fTrue); } /**************************************************** * * Sets the color for text in the text box. * * Parameters: * acr - The color for the text. * * Returns: * fTrue if possible, else fFalse. * ****************************************************/ bool TBOX::FSetAcrText(ACR acr) { AssertThis(0); PTBXG ptbxg; CHP chpNew, chpDiff; ptbxg = (PTBXG)PddgGet(0); AssertNilOrPo(ptbxg, 0); if (ptbxg == pvNil) { return (fFalse); } chpNew.Clear(); chpDiff.Clear(); chpNew.acrFore = acr; return (ptbxg->FApplyChp(&chpNew, &chpDiff)); } /****************************************************************************** FSetDypFontText Sets the font size for the current selection of the textbox Arguments: long dypFont -- The new font size Returns: fTrue if it succeeds ************************************************************ PETED ***********/ bool TBOX::FSetDypFontText(long dypFont) { AssertThis(0); PTBXG ptbxg; CHP chpNew, chpDiff; ptbxg = (PTBXG)PddgGet(0); if (ptbxg == pvNil) return fFalse; AssertPo(ptbxg, 0); Assert(ptbxg->FIs(kclsTBXG), "DDG isn't a TBXG"); chpNew.Clear(); chpDiff.Clear(); chpNew.dypFont = dypFont; chpDiff.dypFont = ~dypFont; return ptbxg->FApplyChp(&chpNew, &chpDiff); } /****************************************************************************** FSetStyleText Sets the font style for the current selection of the textbox Arguments: long grfont -- The new font style Returns: fTrue if it succeeds ************************************************************ PETED ***********/ bool TBOX::FSetStyleText(ulong grfont) { AssertThis(0); PTBXG ptbxg; CHP chpNew, chpDiff; ptbxg = (PTBXG)PddgGet(0); if (ptbxg == pvNil) return fFalse; AssertPo(ptbxg, 0); Assert(ptbxg->FIs(kclsTBXG), "DDG isn't a TBXG"); chpNew.Clear(); chpDiff.Clear(); chpNew.grfont = grfont; chpDiff.grfont = ~grfont; return ptbxg->FApplyChp(&chpNew, &chpDiff); } /****************************************************************************** FSetOnnText Sets the font face for the current selection of the textbox Arguments: long onn -- the new font face Returns: fTrue if it succeeds ************************************************************ PETED ***********/ bool TBOX::FSetOnnText(long onn) { AssertThis(0); PTBXG ptbxg; CHP chpNew, chpDiff; ptbxg = (PTBXG)PddgGet(0); if (ptbxg == pvNil) return fFalse; AssertPo(ptbxg, 0); Assert(ptbxg->FIs(kclsTBXG), "DDG isn't a TBXG"); chpNew.Clear(); chpDiff.Clear(); chpNew.onn = onn; chpDiff.onn = ~onn; return ptbxg->FApplyChp(&chpNew, &chpDiff); } /****************************************************************************** FetchChpSel Gets the character formatting for the current selection of the active DDG for this TBOX. Returns the formatting of the first character of the selection in the CHP, and sets the corresponding bit in *pgrfchp if that particular formatting holds for the entire selection. Arguments: PCHP pchp -- the CHP to take the formatting info ulong *pgrfchp -- bitfield that indicates which formatting attributes hold for the entire selection. ************************************************************ PETED ***********/ void TBOX::FetchChpSel(PCHP pchp, ulong *pgrfchp) { AssertVarMem(pchp); AssertVarMem(pgrfchp); long cpMin, cpMac; long cpMinChp, cpMacChp; CHP chp; PTXTG ptxtg; ptxtg = (PTXTG)PddgActive(); if (ptxtg == pvNil) goto LFail; if (!ptxtg->FIs(kclsTXTG)) { Bug("DDG isn't a TXTG"); LFail: *pgrfchp = 0; return; } ptxtg->GetSel(&cpMin, &cpMac); if (cpMin > cpMac) SwapVars(&cpMin, &cpMac); *pgrfchp = kgrfchpAll; FetchChp(cpMin, pchp, &cpMinChp, &cpMacChp); while (cpMacChp < cpMac && *pgrfchp != grfchpNil) { FetchChp(cpMacChp, &chp, &cpMinChp, &cpMacChp); if ((*pgrfchp & kfchpOnn) && pchp->onn != chp.onn) *pgrfchp ^= kfchpOnn; if ((*pgrfchp & kfchpDypFont) && pchp->dypFont != chp.dypFont) *pgrfchp ^= kfchpDypFont; if ((*pgrfchp & kfchpBold) && ((pchp->grfont ^ chp.grfont) & fontBold)) { *pgrfchp ^= kfchpBold; } if ((*pgrfchp & kfchpItalic) && ((pchp->grfont ^ chp.grfont) & fontItalic)) { *pgrfchp ^= kfchpItalic; } } } /**************************************************** * * Decides if a text box needs to scroll right now. * * Parameters: * None. * * Returns: * fTrue if yes, else fFalse. * ****************************************************/ bool TBOX::FNeedToScroll(void) { AssertThis(0); PTBXG ptbxg; if ((_nfrmCur == _nfrmFirst) && !_fStory) { ptbxg = (PTBXG)PddgGet(0); AssertPo(ptbxg, 0); return (ptbxg->FNeedToScroll()); } return (fFalse); } /**************************************************** * * Scrolls up by one line. * * Parameters: * None. * * Returns: * None. * ****************************************************/ void TBOX::Scroll(void) { AssertThis(0); PTBXG ptbxg; ptbxg = (PTBXG)PddgGet(0); AssertPo(ptbxg, 0); ptbxg->Scroll(scaLineDown); } /**************************************************** * * Tells if any text is selected or not. * * Parameters: * None. * * Returns: * None. * ****************************************************/ bool TBOX::FTextSelected(void) { AssertThis(0); PTBXG ptbxg; if (!FIsVisible()) { return (fFalse); } ptbxg = (PTBXG)PddgGet(0); AssertPo(ptbxg, 0); return (ptbxg->FTextSelected()); } /**************************************************** * * Sets the starting frame number for a text box. * * Parameters: * nfrm - The new starting frame number. * * Returns: * None. * ****************************************************/ void TBOX::SetStartFrame(long nfrm) { AssertThis(0); _nfrmFirst = nfrm; } /**************************************************** * * Adds an undo object to the movie. * * Parameters: * pundb - The undo object to do. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool TBOX::FAddUndo(PUNDB pundb) { AssertThis(0); AssertPo(Pscen(), 0); PTUND ptund; ptund = TUND::PtundNew(pundb); if (ptund == pvNil) { return (fFalse); } AssertPo(ptund, 0); ptund->SetItbox(Itbox()); if (!Pscen()->Pmvie()->FAddUndo(ptund)) { Pscen()->Pmvie()->ClearUndo(); ReleasePpo(&ptund); return (fFalse); } if (!TBOX_PAR::FAddUndo(pundb)) { ReleasePpo(&ptund); return (fFalse); } ReleasePpo(&ptund); return (fTrue); } /**************************************************** * * Clears the undo buffer. * * Parameters: * None. * * Returns: * None. * ****************************************************/ void TBOX::ClearUndo() { AssertThis(0); AssertPo(Pscen(), 0); TBOX_PAR::ClearUndo(); Pscen()->Pmvie()->ClearUndo(); } /**************************************************** * * Ensure that the DDG for this tbox is the proper size, * used for cleaning after a playback. * * Parameters: * None. * * Returns: * None. * ****************************************************/ void TBOX::CleanDdg(void) { AssertThis(0); PDDG pddg; RC rcAbs, rcRel; pddg = PddgGet(0); if (pddg == pvNil) { return; } AssertPo(pddg, 0); pddg->GetPos(&rcAbs, &rcRel); rcAbs.Set(kdzpBorderTbox, kdzpBorderTbox, -kdzpBorderTbox, -kdzpBorderTbox); pddg->SetPos(&rcAbs, &rcRel); } /**************************************************** * * Get the Itbox number for this tbox. * * Parameters: * None. * * Returns: * Itbox. * ****************************************************/ long TBOX::Itbox(void) { AssertThis(0); long itbox; for (itbox = 0;; itbox++) { if (this == Pscen()->PtboxFromItbox(itbox)) { break; } } return (itbox); } #ifdef DEBUG /**************************************************** * Mark memory used by the TBOX * * Parameters: * None. * * Returns: * None. * ****************************************************/ void TBOX::MarkMem(void) { AssertThis(0); TBOX_PAR::MarkMem(); } /*************************************************************************** * * Assert the validity of the TBOX. * * Parameters: * grf - Bit field of options * * Returns: * None. * **************************************************************************/ void TBOX::AssertValid(ulong grf) { TBOX_PAR::AssertValid(fobjAllocated); if (PddgGet(0) != pvNil) { AssertPo(PddgGet(0), 0); } } #endif // DEBUG // // // // BEGIN UNDO STUFF // // // /**************************************************** * * Public constructor for textbox undo objects. * * Parameters: * None. * * Returns: * pvNil if failure, else a pointer to the movie undo. * ****************************************************/ PTUNT TUNT::PtuntNew() { PTUNT ptunt; ptunt = NewObj TUNT(); return (ptunt); } /**************************************************** * * Destructor for text box undo objects * ****************************************************/ TUNT::~TUNT(void) { } /**************************************************** * * Does a command stored in an undo object. * * Parameters: * None. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool TUNT::FDo(PDOCB pdocb) { AssertThis(0); AssertPo(pdocb, 0); PTBOX ptbox; bool fStory; if (!_pmvie->FSwitchScen(_iscen)) { goto LFail; } if (!_pmvie->Pscen()->FGotoFrm(_nfrm)) { goto LFail; } ptbox = _pmvie->Pscen()->PtboxFromItbox(_itbox); AssertNilOrPo(ptbox, 0); if (ptbox == pvNil) { goto LFail; } fStory = ptbox->FStory(); ptbox->SetTypeCore(_fStory); _fStory = fStory; _pmvie->Pscen()->SelectTbox(ptbox); _pmvie->Pmsq()->FlushMsq(); return (fTrue); LFail: _pmvie->Pmsq()->FlushMsq(); _pmvie->ClearUndo(); return (fFalse); } /**************************************************** * * Undoes a command stored in an undo object. * * Parameters: * None. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool TUNT::FUndo(PDOCB pdocb) { AssertThis(0); AssertPo(pdocb, 0); return (FDo(pdocb)); } #ifdef DEBUG /**************************************************** * Mark memory used by the TUNT * * Parameters: * None. * * Returns: * None. * ****************************************************/ void TUNT::MarkMem(void) { AssertThis(0); TUNT_PAR::MarkMem(); } /*************************************************************************** Assert the validity of the TUNT. ***************************************************************************/ void TUNT::AssertValid(ulong grf) { TUNT_PAR::AssertValid(fobjAllocated); } #endif /**************************************************** * * Public constructor for textbox undo objects. * * Parameters: * None. * * Returns: * pvNil if failure, else a pointer to the movie undo. * ****************************************************/ PTUNS TUNS::PtunsNew() { PTUNS ptuns; ptuns = NewObj TUNS(); return (ptuns); } /**************************************************** * * Destructor for text box undo objects * ****************************************************/ TUNS::~TUNS(void) { } /**************************************************** * * Does a command stored in an undo object. * * Parameters: * None. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool TUNS::FDo(PDOCB pdocb) { AssertThis(0); AssertPo(pdocb, 0); PTBOX ptbox; PTBXG ptbxg; RC rc; if (!_pmvie->FSwitchScen(_iscen)) { goto LFail; } if (!_pmvie->Pscen()->FGotoFrm(_nfrm)) { goto LFail; } ptbox = _pmvie->Pscen()->PtboxFromItbox(_itbox); AssertNilOrPo(ptbox, 0); if (ptbox == pvNil) { goto LFail; } ptbox->GetRc(&rc); ptbox->SetRc(&_rc); ptbxg = (PTBXG)ptbox->PddgGet(0); AssertPo(ptbxg, 0); ptbxg->Ptbxb()->SetPos(&_rc); _pmvie->Pscen()->SelectTbox(ptbox); _rc = rc; _pmvie->Pmsq()->FlushMsq(); return (fTrue); LFail: _pmvie->Pmsq()->FlushMsq(); _pmvie->ClearUndo(); return (fFalse); } /**************************************************** * * Undoes a command stored in an undo object. * * Parameters: * None. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool TUNS::FUndo(PDOCB pdocb) { AssertThis(0); AssertPo(pdocb, 0); return (FDo(pdocb)); } #ifdef DEBUG /**************************************************** * Mark memory used by the TUNS * * Parameters: * None. * * Returns: * None. * ****************************************************/ void TUNS::MarkMem(void) { AssertThis(0); TUNS_PAR::MarkMem(); } /*************************************************************************** Assert the validity of the TUNS. ***************************************************************************/ void TUNS::AssertValid(ulong grf) { TUNS_PAR::AssertValid(fobjAllocated); } #endif /**************************************************** * * Public constructor for textbox undo objects. * * Parameters: * None. * * Returns: * pvNil if failure, else a pointer to the movie undo. * ****************************************************/ PTUNH TUNH::PtunhNew() { PTUNH ptunh; ptunh = NewObj TUNH(); return (ptunh); } /**************************************************** * * Destructor for text box undo objects * ****************************************************/ TUNH::~TUNH(void) { AssertBaseThis(0); } /**************************************************** * * Does a command stored in an undo object. * * Parameters: * None. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool TUNH::FDo(PDOCB pdocb) { AssertThis(0); AssertPo(pdocb, 0); PTBOX ptbox; long nfrmFirst, nfrmMax; if (!_pmvie->FSwitchScen(_iscen)) { goto LFail; } if (!_pmvie->Pscen()->FGotoFrm(_nfrm)) { goto LFail; } ptbox = _pmvie->Pscen()->PtboxFromItbox(_itbox); AssertNilOrPo(ptbox, 0); if (ptbox == pvNil) { goto LFail; } nfrmFirst = ptbox->NfrmFirst(); nfrmMax = ptbox->nfrmMax(); if (!ptbox->FGotoFrame(_nfrmFirst)) { goto LFail; } if (!ptbox->FShowCore()) { goto LFail; } if (!ptbox->FGotoFrame(_nfrmMax)) { goto LFail; } ptbox->HideCore(); ptbox->FGotoFrame(_nfrm); _pmvie->Pscen()->SelectTbox(ptbox); _nfrmFirst = nfrmFirst; _nfrmMax = nfrmMax; _pmvie->Pmsq()->FlushMsq(); return (fTrue); LFail: _pmvie->Pmsq()->FlushMsq(); _pmvie->ClearUndo(); return (fFalse); } /**************************************************** * * Undoes a command stored in an undo object. * * Parameters: * None. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool TUNH::FUndo(PDOCB pdocb) { AssertThis(0); AssertPo(pdocb, 0); return (FDo(pdocb)); } #ifdef DEBUG /**************************************************** * Mark memory used by the TUNH * * Parameters: * None. * * Returns: * None. * ****************************************************/ void TUNH::MarkMem(void) { AssertThis(0); TUNH_PAR::MarkMem(); } /*************************************************************************** Assert the validity of the TUNH. ***************************************************************************/ void TUNH::AssertValid(ulong grf) { TUNH_PAR::AssertValid(fobjAllocated); } #endif /**************************************************** * * Public constructor for textbox undo objects which * are the result of the document changing. * * Parameters: * pundb - the undo object to encapsulate. * * Returns: * pvNil if failure, else a pointer to the movie undo. * ****************************************************/ PTUND TUND::PtundNew(PUNDB pundb) { AssertPo(pundb, 0); PTUND ptund; ptund = NewObj TUND(); if (ptund != pvNil) { ptund->_pundb = pundb; pundb->AddRef(); AssertPo(pundb, 0); } return (ptund); } /**************************************************** * * Destructor for text box undo objects * ****************************************************/ TUND::~TUND(void) { AssertBaseThis(0); PTBOX ptbox; // // Clear the owning tbox undo list // if (_iscen == _pmvie->Iscen()) { ptbox = _pmvie->Pscen()->PtboxFromItbox(_itbox); AssertNilOrPo(ptbox, 0); if (ptbox != pvNil) { ptbox->ParClearUndo(); } } ReleasePpo(&_pundb); } /**************************************************** * * Does a command stored in an undo object. * * Parameters: * None. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool TUND::FDo(PDOCB pdocb) { AssertThis(0); AssertPo(pdocb, 0); PTBOX ptbox; if (!_pmvie->FSwitchScen(_iscen)) { goto LFail; } if (!_pmvie->Pscen()->FGotoFrm(_nfrm)) { goto LFail; } ptbox = _pmvie->Pscen()->PtboxFromItbox(_itbox); AssertNilOrPo(ptbox, 0); if (ptbox == pvNil) { goto LFail; } _pmvie->Pscen()->SelectTbox(ptbox); _pmvie->Pmsq()->FlushMsq(); return (_pundb->FDo(ptbox)); LFail: _pmvie->Pmsq()->FlushMsq(); _pmvie->ClearUndo(); return (fFalse); } /**************************************************** * * Undoes a command stored in an undo object. * * Parameters: * None. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool TUND::FUndo(PDOCB pdocb) { AssertThis(0); AssertPo(pdocb, 0); PTBOX ptbox; if (!_pmvie->FSwitchScen(_iscen)) { goto LFail; } if (!_pmvie->Pscen()->FGotoFrm(_nfrm)) { goto LFail; } ptbox = _pmvie->Pscen()->PtboxFromItbox(_itbox); AssertNilOrPo(ptbox, 0); if (ptbox == pvNil) { goto LFail; } _pmvie->Pscen()->SelectTbox(ptbox); _pmvie->Pmsq()->FlushMsq(); return (_pundb->FUndo(ptbox)); LFail: _pmvie->Pmsq()->FlushMsq(); _pmvie->ClearUndo(); return (fFalse); } #ifdef DEBUG /**************************************************** * Mark memory used by the TUND * * Parameters: * None. * * Returns: * None. * ****************************************************/ void TUND::MarkMem(void) { AssertThis(0); TUND_PAR::MarkMem(); MarkMemObj(_pundb); } /*************************************************************************** Assert the validity of the TUND. ***************************************************************************/ void TUND::AssertValid(ulong grf) { AssertBaseThis(0); } #endif /**************************************************** * * Public constructor for textbox undo objects which * are the result of background color changing. * * Parameters: * None. * * Returns: * pvNil if failure, else a pointer to the movie undo. * ****************************************************/ PTUNC TUNC::PtuncNew(void) { PTUNC ptunc; ptunc = NewObj TUNC(); return (ptunc); } /**************************************************** * * Destructor for text box undo objects * ****************************************************/ TUNC::~TUNC(void) { AssertBaseThis(0); } /**************************************************** * * Does a command stored in an undo object. * * Parameters: * pdocb - The owning docb. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool TUNC::FDo(PDOCB pdocb) { AssertThis(0); AssertPo(pdocb, 0); PTBOX ptbox; ACR acr; if (!_pmvie->FSwitchScen(_iscen)) { goto LFail; } if (!_pmvie->Pscen()->FGotoFrm(_nfrm)) { goto LFail; } ptbox = _pmvie->Pscen()->PtboxFromItbox(_itbox); AssertNilOrPo(ptbox, 0); if (ptbox == pvNil) { goto LFail; } acr = ptbox->AcrBack(); ptbox->SetAcrBack(_acr); _acr = acr; _pmvie->Pscen()->SelectTbox(ptbox); _pmvie->Pmsq()->FlushMsq(); return (fTrue); LFail: _pmvie->Pmsq()->FlushMsq(); _pmvie->ClearUndo(); return (fFalse); } /**************************************************** * * Undoes a command stored in an undo object. * * Parameters: * None. * * Returns: * fTrue if successful, else fFalse. * ****************************************************/ bool TUNC::FUndo(PDOCB pdocb) { return (FDo(pdocb)); } #ifdef DEBUG /**************************************************** * Mark memory used by the TUNC * * Parameters: * None. * * Returns: * None. * ****************************************************/ void TUNC::MarkMem(void) { AssertThis(0); TUNC_PAR::MarkMem(); } /*************************************************************************** Assert the validity of the TUNC. ***************************************************************************/ void TUNC::AssertValid(ulong grf) { AssertBaseThis(0); } #endif // // // // // BEGIN TCLP // // // // /*************************************************************************** * * Destructor for text box clipboard documents * **************************************************************************/ TCLP::~TCLP(void) { ReleasePpo(&_ptbox); } /*************************************************************************** * * Destructor for text box clipboard documents * * Parameters: * ptbox - The tbox to associate with the clipboard. * * Returns: * Pointer to a clipboard document, or pvNil if failure. * **************************************************************************/ PTCLP TCLP::PtclpNew(PTBOX ptbox) { AssertPo(ptbox, 0); PTCLP ptclp; ptclp = NewObj TCLP(); if (ptclp == pvNil) { return (pvNil); } ptclp->_ptbox = ptbox; return (ptclp); } /*************************************************************************** * * Pastes the text box associated with this clipboard object to the * current frame. * * Parameters: * pscen - The scene to paste into. * * Returns: * fTrue if successful, else fFalse. * **************************************************************************/ bool TCLP::FPaste(PSCEN pscen) { AssertThis(0); AssertPo(pscen, 0); PTBOX ptboxDup; RC rc; RC rcWorkspace(kxpDefaultTbox, kypDefaultTbox, pscen->Pmvie()->Pmcc()->Dxp(), pscen->Pmvie()->Pmcc()->Dyp()); // // Copy the text box // if (!_ptbox->FDup(&ptboxDup)) { pscen->Pmvie()->ClearUndo(); return (fFalse); } AssertPo(ptboxDup, 0); ptboxDup->GetRc(&rc); rc.Offset(kxpDefaultTbox - rc.xpLeft, kypDefaultTbox - rc.ypTop); rc.FIntersect(&rcWorkspace); ptboxDup->SetRc(&rc); if (!pscen->FAddTbox(ptboxDup)) { pscen->Pmvie()->ClearUndo(); ReleasePpo(&ptboxDup); return (fFalse); } pscen->SelectTbox(ptboxDup); ptboxDup->AttachToMouse(); ReleasePpo(&ptboxDup); return (fTrue); } #ifdef DEBUG /**************************************************** * Mark memory used by the TCLP * * Parameters: * None. * * Returns: * None. * ****************************************************/ void TCLP::MarkMem(void) { AssertThis(0); TCLP_PAR::MarkMem(); MarkMemObj(_ptbox); } /*************************************************************************** * * Assert the validity of the TCLP. * * Parameters: * grf - Bit field of options * * Returns: * None. * **************************************************************************/ void TCLP::AssertValid(ulong grf) { TCLP_PAR::AssertValid(fobjAllocated); AssertPo(_ptbox, 0); } #endif // DEBUG ================================================ FILE: src/engine/tdf.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** tdf.cpp: Three-D Font class Primary Author: ****** Review Status: REVIEWED - any changes to this file must be reviewed! TDFs (3-D Fonts) are simply collections of models, one model per ASCII character. The TDF class holds general font information such as the count of characters in the font and the maximum height of the characters. It also holds an array of widths and heights of every character, to allow proportional spacing. Fetching a letter's model from a TDF involves looking for a child chunk of the TDF chunk with a CHID equal to the ASCII value of the desired character: TDF // Contains font info (width and height of characters) | +---BMDL (chid 0) // MODL for ASCII character 0 | +---BMDL (chid 1) // MODL for ASCII character 1 . . . ***************************************************************************/ #include "soc.h" ASSERTNAME RTCLASS(TDF) const long kcchTdfDefault = 256; // for size estimates and authoring const BRS kdxrSpacing = BR_SCALAR(0.0); // horizontal space between chars const BRS kdyrLeading = BR_SCALAR(0.5); // vertical space between chars /**************************************** 3-D Font On File ****************************************/ struct TDFF { short bo; short osk; long cch; BRS dyrMax; // These variable-length arrays follow the TDFF in the TDF chunk // BRS rgdxr[cch]; // BRS rgdyr[cch]; }; const BOM kbomTdff = 0x5F000000; // don't forget to swap rgdxr & rgdyr! /*************************************************************************** A PFNRPO to read a TDF from a file. ***************************************************************************/ bool TDF::FReadTdf(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb) { AssertPo(pcrf, 0); AssertPo(pblck, 0); AssertNilOrVarMem(ppbaco); AssertVarMem(pcb); TDF *ptdf; // Estimate TDF size in memory. if (pblck->FPacked()) *pcb = size(TDF) + LwMul(kcchTdfDefault, size(BRS) + size(BRS)); else *pcb = pblck->Cb(); if (pvNil == ppbaco) return fTrue; ptdf = NewObj TDF; if (pvNil == ptdf || !ptdf->_FInit(pblck)) { TrashVar(ppbaco); TrashVar(pcb); ReleasePpo(&ptdf); return fFalse; } AssertPo(ptdf, 0); *pcb = size(TDF) + LwMul(ptdf->_cch, size(BRS) + size(BRS)); *ppbaco = ptdf; return fTrue; } /*************************************************************************** Initialize the font. Does not clean up on failure because the destructor will. ***************************************************************************/ bool TDF::_FInit(PBLCK pblck) { AssertBaseThis(0); AssertPo(pblck, 0); TDFF tdff; long cbrgdwr; // space taken by rgdxr or rgdyr if (!pblck->FUnpackData()) return fFalse; if (pblck->Cb() < size(TDFF)) { PushErc(ercSocBadTdf); return fFalse; } if (!pblck->FReadRgb(&tdff, size(TDFF), 0)) return fFalse; if (kboCur != tdff.bo) SwapBytesBom(&tdff, kbomTdff); Assert(kboCur == tdff.bo, "bad TDFF"); _cch = tdff.cch; cbrgdwr = LwMul(_cch, size(BRS)); if (pblck->Cb() != size(TDFF) + cbrgdwr + cbrgdwr) { PushErc(ercSocBadTdf); return fFalse; } _dyrMax = tdff.dyrMax; // Read _prgdxr if (!FAllocPv((void **)&_prgdxr, cbrgdwr, fmemNil, mprNormal)) return fFalse; if (!pblck->FReadRgb(_prgdxr, cbrgdwr, size(TDFF))) return fFalse; AssertBomRglw(kbomBrs, size(BRS)); if (kboCur != tdff.bo) SwapBytesRglw(_prgdxr, _cch); // Read _prgdyr if (!FAllocPv((void **)&_prgdyr, cbrgdwr, fmemNil, mprNormal)) return fFalse; if (!pblck->FReadRgb(_prgdyr, cbrgdwr, size(TDFF) + cbrgdwr)) return fFalse; AssertBomRglw(kbomBrs, size(BRS)); if (kboCur != tdff.bo) SwapBytesRglw(_prgdyr, _cch); return fTrue; } /*************************************************************************** TDF destructor ***************************************************************************/ TDF::~TDF(void) { AssertBaseThis(0); FreePpv((void **)&_prgdxr); FreePpv((void **)&_prgdyr); } /*************************************************************************** This authoring-only API creates a new TDF chunk in pcrf, with child models as specified in pglkid. This function does not create a new TDF instance in memory...to do that, call FReadTdf with the values returned in pckiTdf. ***************************************************************************/ bool TDF::FCreate(PCRF pcrf, PGL pglkid, STN *pstn, CKI *pckiTdf) { AssertPo(pcrf, 0); AssertPo(pglkid, 0); AssertPo(pstn, 0); AssertNilOrVarMem(pckiTdf); CKI ckiTdf; KID kid; KID kid2; TDFF tdff; BRS *prgdxr = pvNil; BRS *prgdyr = pvNil; PMODL pmodl; BLCK blck; long cbrgdwr; // space taken by rgdxr or rgdyr long ikid; long ckid; CHID chidMax = 0; long ikidLetteri = -1; // Find chidMax ckid = pglkid->IvMac(); for (ikid = 0; ikid < ckid; ikid++) { pglkid->Get(ikid, &kid); if (kid.chid > chidMax) chidMax = kid.chid; if (kid.chid == (CHID)ChLit('i')) ikidLetteri = ikid; } tdff.bo = kboCur; tdff.osk = koskCur; tdff.cch = chidMax + 1; tdff.dyrMax = rZero; cbrgdwr = LwMul(tdff.cch, size(BRS)); if (!FAllocPv((void **)&prgdxr, cbrgdwr, fmemClear, mprNormal)) goto LFail; if (!FAllocPv((void **)&prgdyr, cbrgdwr, fmemClear, mprNormal)) goto LFail; // Create the TDF chunk ckiTdf.ctg = kctgTdf; if (!pcrf->Pcfl()->FAdd(size(TDFF) + cbrgdwr + cbrgdwr, ckiTdf.ctg, &ckiTdf.cno, &blck)) { goto LFail; } // Add the BMDL kids and remember widths, heights, and maximum height for (ikid = 0; ikid < ckid; ikid++) { pglkid->Get(ikid, &kid); pmodl = (PMODL)pcrf->PbacoFetch(kid.cki.ctg, kid.cki.cno, MODL::FReadModl); if (pmodl == pvNil) goto LFail; if (!pcrf->Pcfl()->FAdoptChild(ckiTdf.ctg, ckiTdf.cno, kid.cki.ctg, kid.cki.cno, kid.chid)) { goto LFail; } if (pmodl->Dxr() == 0 && kid.chid == (CHID)ChLit(' ') && ikidLetteri != -1) { // Hack to turn null models into space characters: // space is the width and height of an "i" ReleasePpo(&pmodl); pglkid->Get(ikidLetteri, &kid2); pmodl = (PMODL)pcrf->PbacoFetch(kid2.cki.ctg, kid2.cki.cno, MODL::FReadModl); if (pvNil == pmodl) goto LFail; } prgdxr[kid.chid] = pmodl->Dxr() + kdxrSpacing; prgdyr[kid.chid] = pmodl->Dyr() + kdyrLeading; if (prgdyr[kid.chid] > tdff.dyrMax) tdff.dyrMax = prgdyr[kid.chid]; ReleasePpo(&pmodl); } if (!blck.FWriteRgb(&tdff, size(TDFF), 0)) goto LFail; if (!blck.FWriteRgb(prgdxr, cbrgdwr, size(TDFF))) goto LFail; if (!blck.FWriteRgb(prgdyr, cbrgdwr, size(TDFF) + cbrgdwr)) goto LFail; FreePpv((void **)&prgdxr); FreePpv((void **)&prgdyr); if (pvNil != pckiTdf) *pckiTdf = ckiTdf; return fTrue; LFail: FreePpv((void **)&prgdxr); FreePpv((void **)&prgdyr); TrashVar(pckiTdf); return fFalse; } /*************************************************************************** Get a model for a character from the font. The chid is equal to the ASCII (or Unicode) value of the desired character. ***************************************************************************/ PMODL TDF::PmodlFetch(CHID chid) { AssertThis(0); KID kid; if (!Pcrf()->Pcfl()->FGetKidChid(Ctg(), Cno(), chid, &kid)) { STN stn; stn.FFormatSz(PszLit("Couldn't find BMDL for 3-D Font with chid %d."), chid); Warn(stn.Psz()); PushErc(ercSocNoModlForChar); return pvNil; } return (PMODL)Pcrf()->PbacoFetch(kid.cki.ctg, kid.cki.cno, MODL::FReadModl); } /*************************************************************************** Return the width of the given character ***************************************************************************/ BRS TDF::DxrChar(long ich) { AssertThis(0); AssertIn(ich, 0, _cch); return _prgdxr[ich]; } /*************************************************************************** Return the height of the given character ***************************************************************************/ BRS TDF::DyrChar(long ich) { AssertThis(0); AssertIn(ich, 0, _cch); return _prgdyr[ich]; } #ifdef DEBUG /*************************************************************************** Assert the validity of the TDF. ***************************************************************************/ void TDF::AssertValid(ulong grf) { TDF_PAR::AssertValid(fobjAllocated); AssertIn(_cch, 0, klwMax); AssertIn(_dyrMax, 0, BR_SCALAR_MAX); AssertPvCb(_prgdxr, LwMul(_cch, size(BRS))); AssertPvCb(_prgdyr, LwMul(_cch, size(BRS))); } /*************************************************************************** Mark memory used by the TDF ***************************************************************************/ void TDF::MarkMem(void) { AssertThis(0); TDF_PAR::MarkMem(); MarkPv(_prgdxr); MarkPv(_prgdyr); } #endif // DEBUG ================================================ FILE: src/engine/tdt.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** tdt.cpp: Three-D Text class Primary Author: ****** Review Status: REVIEWED - any changes to this file must be reviewed! TDT, the 3-D Text class, is a derived class of TMPL. Most clients (ACTR, MVIE, etc) can treat TDTs like regular TMPLs. But they have some extra functionality and work internally very differently from TMPLs. Chunkwise, all the information for a TDT is in the TMPL chunk or the single TDT child chunk: TMPL // template info | | +---TDT (chid 0) // TDT-specific info (shape and tag to TDF) In addition to the usual TMPL fields, TDTs have a _tagTdf and a _tdts. _tagTdf tells what font to use for the TDT, and _tdts tells what shape to draw the TDT in. TDTs on file are very small, so it is practical to store them in the user's document. Rather than fetching ACTNs and the default costume from child chunks of the TMPL, TDTs generate them in memory and store them in _pactnCache and _pmtrlDefault. _pactnCache keeps a copy of the last requested action so that it doesn't have to be continuously recomputed. The user can change a TDT's text, shape, and/or font with FChange(). When this happens, all the internal lists affecting the TDT's shape, costume, etc., are changed via _FInitLists(). After changing a TDT, you should call FAdjustBody on any BODYs based on that TDT. In Socrates, there should only be one BODY per TDT, so this shouldn't be a problem. ***************************************************************************/ #include "soc.h" ASSERTNAME RTCLASS(TDT) const CHID kchidTdt = 0; // CHID of TDT under TMPL chunk // All actions have a step size of kdwrStep, except tdaWalk const BRS kdwrStepWalk = BR_SCALAR(1.0); // step size for walk action const BRS kdwrStep = BR_SCALAR(5.0); // step size for all other actions PGST TDT::_pgstAction = pvNil; /*************************************************************************** Set the GST of action names for TDTs ***************************************************************************/ bool TDT::FSetActionNames(PGST pgstAction) { AssertPo(pgstAction, 0); Assert(pvNil == _pgstAction, "you already set the action names"); _pgstAction = pgstAction; _pgstAction->AddRef(); return fTrue; } /**************************************** 3-D Text On File...this gets put in a child chunk of a TMPL ****************************************/ struct TDTF { short bo; short osk; long tdts; TAG tagTdf; }; const BOM kbomTdtf = (0x5C000000 | kbomTag >> 6); /*************************************************************************** Return a list of all tags embedded in this TDT. Note that a return value of pvNil does not mean an error occurred, but simply that this TDT has no embedded tags. Actually, as currently implemented, this function only returns pvNil if an error occurs. The point is, look at *pfError, not the return value. ***************************************************************************/ PGL TDT::PgltagFetch(PCFL pcfl, CTG ctg, CNO cno, bool *pfError) { AssertPo(pcfl, 0); AssertVarMem(pfError); PGL pgltag; KID kid; BLCK blck; TDTF tdtf; *pfError = fFalse; pgltag = GL::PglNew(size(TAG)); if (pvNil == pgltag) goto LFail; if (!pcfl->FGetKidChidCtg(ctg, cno, kchidTdt, kctgTdt, &kid)) goto LFail; if (!pcfl->FFind(kid.cki.ctg, kid.cki.cno, &blck)) goto LFail; if (!blck.FUnpackData()) goto LFail; if (blck.Cb() < size(TDTF)) goto LFail; if (!blck.FReadRgb(&tdtf, size(TDTF), 0)) goto LFail; if (kboCur != tdtf.bo) SwapBytesBom(&tdtf, kbomTdtf); Assert(kboCur == tdtf.bo, "bad TDTF"); if (!pgltag->FAdd(&tdtf.tagTdf)) goto LFail; return pgltag; LFail: *pfError = fTrue; ReleasePpo(&pgltag); return pvNil; } /*************************************************************************** Create a new TDT ***************************************************************************/ PTDT TDT::PtdtNew(PSTN pstn, long tdts, PTAG ptagTdf) { AssertPo(pstn, 0); AssertIn(tdts, 0, tdtsLim); AssertVarMem(ptagTdf); PTDT ptdt; ptdt = NewObj TDT; if (pvNil == ptdt) return pvNil; ptdt->_stn = *pstn; // This is a bit of a hack, but it makes life easier. Without it, // the code would have to deal with body part sets with no body // parts in them, and TMPL and BODY would have problems with that // (for one thing, they would compute _cbset incorrectly). if (ptdt->_stn.Cch() == 0) { achar chSpace = ChLit(' '); ptdt->_stn.SetRgch(&chSpace, 1); } ptdt->_tdts = tdts; ptdt->_tagTdf = *ptagTdf; if (!ptdt->_FInitLists()) { ReleasePpo(&ptdt); return pvNil; } AssertPo(ptdt, 0); return ptdt; } /*************************************************************************** Read the generic TMPL info and the TDT-specific info (tdts and tagTdf), then call _FInitLists to build the rest of the TDT. ***************************************************************************/ bool TDT::_FInit(PCFL pcfl, CTG ctgTmpl, CNO cnoTmpl) { AssertBaseThis(0); AssertPo(pcfl, 0); KID kid; BLCK blck; TDTF tdtf; if (!_FReadTmplf(pcfl, ctgTmpl, cnoTmpl)) return fFalse; if (!pcfl->FGetKidChidCtg(ctgTmpl, cnoTmpl, kchidTdt, kctgTdt, &kid)) return fFalse; if (!pcfl->FFind(kid.cki.ctg, kid.cki.cno, &blck)) return fFalse; if (!blck.FUnpackData()) return fFalse; if (blck.Cb() < size(TDTF)) return fFalse; if (!blck.FReadRgb(&tdtf, size(TDTF), 0)) return fFalse; if (kboCur != tdtf.bo) SwapBytesBom(&tdtf, kbomTdtf); Assert(kboCur == tdtf.bo, "bad TDTF"); _tagTdf = tdtf.tagTdf; _tdts = tdtf.tdts; if (!_FInitLists()) return fFalse; return fTrue; } /*************************************************************************** Initialize or reinitialize the TDT data structures, using the current _stn and _tdts. This function unwinds completely on failure (the TDT's members are untouched). ***************************************************************************/ bool TDT::_FInitLists(void) { AssertBaseThis(0); AssertPo(&_stn, 0); AssertIn(_tdts, 0, tdtsLim); long cch; PGL pglibactParNew = pvNil; PGL pglibsetNew = pvNil; PGG pggcmidNew = pvNil; PMTRL pmtrlDefaultNew = pvNil; pglibactParNew = _PglibactParBuild(); if (pvNil == pglibactParNew) goto LFail; pglibsetNew = _PglibsetBuild(); if (pvNil == pglibsetNew) goto LFail; pggcmidNew = _PggcmidBuild(); if (pvNil == pggcmidNew) goto LFail; cch = _stn.Cch(); if (pvNil == _pmtrlDefault) { pmtrlDefaultNew = MTRL::PmtrlNew(); // get default solid-color material } else { pmtrlDefaultNew = _pmtrlDefault; // keep _pmtrlDefault the same pmtrlDefaultNew->AddRef(); } if (pvNil == pmtrlDefaultNew) goto LFail; // We're home free: the function will succeed. Update member variables. ReleasePpo(&_pglibactPar); _pglibactPar = pglibactParNew; ReleasePpo(&_pglibset); _pglibset = pglibsetNew; ReleasePpo(&_pggcmid); _pggcmid = pggcmidNew; ReleasePpo(&_pmtrlDefault); _pmtrlDefault = pmtrlDefaultNew; ReleasePpo(&_pactnCache); _tdaCache = tdaNil; _cactn = tdaLim; _ccmid = 1; _cbset = 1; _grftmpl |= ftmplTdt; return fTrue; LFail: ReleasePpo(&pglibactParNew); ReleasePpo(&pglibsetNew); ReleasePpo(&pggcmidNew); ReleasePpo(&pmtrlDefaultNew); return fFalse; } /*************************************************************************** Get the given action. If we've built it before, use the cached copy. Else build the action, cache it, and return it. ***************************************************************************/ PACTN TDT::_PactnFetch(long tda) { AssertThis(0); AssertIn(tda, 0, tdaLim); if (tda != _tdaCache) { ReleasePpo(&_pactnCache); _tdaCache = tdaNil; _pactnCache = _PactnBuild(tda); } if (pvNil != _pactnCache) { _pactnCache->AddRef(); _tdaCache = tda; } return _pactnCache; } /*************************************************************************** Build the given action ***************************************************************************/ PACTN TDT::_PactnBuild(long tda) { AssertThis(0); AssertIn(tda, 0, tdaLim); PACTN pactn; PGG pggcel; PGL pglbmat34 = pvNil; ulong grfactn; pggcel = _PggcelBuild(tda); if (pvNil == pggcel) goto LFail; pglbmat34 = _Pglbmat34Build(tda); if (pvNil == pglbmat34) goto LFail; grfactn = factnStatic | factnRotateY; pactn = ACTN::PactnNew(pggcel, pglbmat34, grfactn); if (pvNil == pactn) goto LFail; ReleasePpo(&pggcel); ReleasePpo(&pglbmat34); return pactn; LFail: ReleasePpo(&pggcel); ReleasePpo(&pglbmat34); return pvNil; } /*************************************************************************** Get the name of the given action ***************************************************************************/ bool TDT::FGetActnName(long anid, PSTN pstn) { AssertThis(0); AssertIn(anid, 0, tdaLim); AssertPo(pstn, 0); long istn; long anidT; for (istn = 0; istn < _pgstAction->IvMac(); istn++) { _pgstAction->GetExtra(istn, &anidT); if (anid == anidT) { _pgstAction->GetStn(istn, pstn); return fTrue; } } Warn("action name not found"); pstn->SetNil(); return fFalse; } /*************************************************************************** Fetch the given model for this TDT (use the TDT's current font) ***************************************************************************/ PMODL TDT::_PmodlFetch(CHID chidModl) { AssertThis(0); AssertIn(chidModl, 0, _stn.Cch()); PTDF ptdf; PMODL pmodl; ptdf = (PTDF)vptagm->PbacoFetch(&_tagTdf, TDF::FReadTdf); if (pvNil == ptdf) return pvNil; pmodl = ptdf->PmodlFetch((uchar)_stn.Psz()[chidModl]); ReleasePpo(&ptdf); return pmodl; } /*************************************************************************** Build the BACT tree GL for BODY creation. TDTs all have the same body part tree: every part is a child of the root. ***************************************************************************/ PGL TDT::_PglibactParBuild(void) { AssertBaseThis(0); long cch = _stn.Cch(); long ich; short ibactPar = ivNil; PGL pglibactPar; pglibactPar = GL::PglNew(size(short), cch); // ibacts are shorts if (pvNil == pglibactPar) return pvNil; AssertDo(pglibactPar->FSetIvMac(cch), "PglNew should have ensured space!"); for (ich = 0; ich < cch; ich++) pglibactPar->Put(ich, &ibactPar); return pglibactPar; } /*************************************************************************** Build the body part set GL for BODY creation. For TDTs, all body parts belong to a single body part set ***************************************************************************/ PGL TDT::_PglibsetBuild(void) { AssertBaseThis(0); long cch = _stn.Cch(); long ich; short ibset = 0; PGL pglibset; pglibset = GL::PglNew(size(short), cch); if (pvNil == pglibset) return pvNil; AssertDo(pglibset->FSetIvMac(cch), "PglNew should have ensured space!"); for (ich = 0; ich < cch; ich++) pglibset->Put(ich, &ibset); return pglibset; } /*************************************************************************** Build the costume GG for TMPL creation. For TDTs, the costume is simple: all body part sets get cmid 0. ***************************************************************************/ PGG TDT::_PggcmidBuild(void) { AssertBaseThis(0); long cch = _stn.Cch(); long lwOne = 1; PGG pggcmid; long cmid = 0; pggcmid = GG::PggNew(size(long), 1, size(long)); if (pvNil == pggcmid) return pvNil; if (!pggcmid->FAdd(size(long), pvNil, &cmid, &lwOne)) { ReleasePpo(&pggcmid); return pvNil; } return pggcmid; } /*************************************************************************** Build a GL of matrices for the action ***************************************************************************/ PGL TDT::_Pglbmat34Build(long tda) { AssertBaseThis(0); AssertIn(tda, 0, tdaLim); PTDF ptdf; long cch = _stn.Cch(); long ich; BMAT34 bmat34; PGL pglbmat34 = pvNil; BRS dxrTotal; // width of string (before scaling) BRS dxrTotal2; // width of string (after scaling) BRS dxrHalf; // half width of string (before scaling) BRS xrChar; // "insertion point" of character in string BRS xrCharCenter; // origin of character in string (after scaling) BRS dxrChar; // width of each character long ccel; long icel; BRS dyrChar; // height of each character BRS dyrTotal; // total height of string, if vertical shape BRS dyrHalf; // half of height of string, if vertical shape BRS yrChar; // position of char in string ptdf = (PTDF)vptagm->PbacoFetch(&_tagTdf, TDF::FReadTdf); if (pvNil == ptdf) goto LFail; ccel = _CcelOfTda(tda); pglbmat34 = GL::PglNew(size(BMAT34), LwMul(ccel, cch)); if (pvNil == pglbmat34) goto LFail; AssertDo(pglbmat34->FSetIvMac(LwMul(ccel, cch)), "PglNew should have ensured space!"); dxrTotal = rZero; for (ich = 0; ich < cch; ich++) dxrTotal += ptdf->DxrChar((uchar)_stn.Psz()[ich]); dxrHalf = BrsHalf(dxrTotal); dyrTotal = rZero; for (ich = 0; ich < cch; ich++) dyrTotal += ptdf->DyrChar((uchar)_stn.Psz()[ich]); dyrHalf = BrsHalf(dyrTotal); for (icel = 0; icel < ccel; icel++) { xrChar = -dxrHalf; yrChar = rZero; for (ich = 0; ich < cch; ich++) { dxrChar = ptdf->DxrChar((uchar)_stn.Psz()[ich]); dyrChar = ptdf->DyrChar((uchar)_stn.Psz()[ich]); xrCharCenter = xrChar + BrsHalf(dxrChar); BrMatrix34Identity(&bmat34); // The only exception to my "apply shape, then action" approach // is tdaStretch, which has to change dxrTotal2 before calling // _ApplyShape. if (tda == tdaStretch) { BRS rPhase; BRS rTheta; BRA aTheta; BRS dxr; BRS rFractStretch; BRS rT; rPhase = BrsDiv(BrIntToScalar(icel), BrIntToScalar(ccel)); rTheta = BrsMul(rPhase, krTwoPi) + krPi + krHalfPi; aTheta = BrRadianToAngle(rTheta); dxr = BR_SIN(aTheta); rFractStretch = BR_SCALAR(1.5) + BrsHalf(dxr); rT = BrsMul(xrCharCenter, rFractStretch); xrCharCenter = rT; rT = BrsMul(dxrTotal, rFractStretch); dxrTotal2 = rT; } else { dxrTotal2 = dxrTotal; } // apply shape _ApplyShape(&bmat34, _tdts, cch, ich, xrCharCenter, dxrTotal2, yrChar + dyrChar, ptdf->DyrMax(), dyrTotal); // apply transforms based on the action _ApplyAction(&bmat34, tda, ich, ccel, icel, xrCharCenter, dxrTotal2); if (_tdts == tdtsCircleZ) { BrMatrix34PostTranslate(&bmat34, rZero, BrsDiv(dxrTotal, krTwoPi) + ptdf->DyrMax(), rZero); } xrChar += dxrChar; yrChar += dyrChar; pglbmat34->Put(LwMul(icel, cch) + ich, &bmat34); } } ReleasePpo(&ptdf); return pglbmat34; LFail: ReleasePpo(&ptdf); ReleasePpo(&pglbmat34); return pvNil; } /*************************************************************************** Build a GG of cels for the action ***************************************************************************/ PGG TDT::_PggcelBuild(long tda) { AssertBaseThis(0); AssertIn(tda, 0, tdaLim); long cch = _stn.Cch(); long ich; PGG pggcel; CEL cel; CPS *prgcps = pvNil; long iv; long ccel; long icel; ccel = _CcelOfTda(tda); pggcel = GG::PggNew(size(CEL)); if (pvNil == pggcel) goto LFail; if (!FAllocPv((void **)&prgcps, LwMul(cch, size(CPS)), fmemClear, mprNormal)) { goto LFail; } for (icel = 0; icel < ccel; icel++) { cel.chidSnd = 0; cel.dwr = (tda == tdaWalk ? kdwrStepWalk : kdwrStep); for (ich = 0; ich < cch; ich++) { prgcps[ich].chidModl = (short)ich; prgcps[ich].imat34 = (short)(LwMul(icel, cch) + ich); } if (!pggcel->FAdd(LwMul(cch, size(CPS)), &iv, prgcps, &cel)) goto LFail; } FreePpv((void **)&prgcps); return pggcel; LFail: FreePpv((void **)&prgcps); ReleasePpo(&pggcel); return pvNil; } /*************************************************************************** Destruct the TDT ***************************************************************************/ TDT::~TDT(void) { AssertBaseThis(0); ReleasePpo(&_pmtrlDefault); ReleasePpo(&_pactnCache); } /*************************************************************************** Return a duplicate of this TDT ***************************************************************************/ PTDT TDT::PtdtDup(void) { AssertThis(0); PTDT ptdtDup; ptdtDup = TDT::PtdtNew(&_stn, _tdts, &_tagTdf); AssertNilOrPo(ptdtDup, 0); return ptdtDup; } /*************************************************************************** Change the text, shape, and/or font of the TDT ***************************************************************************/ bool TDT::FChange(PSTN pstn, long tdts, PTAG ptagTdf) { AssertThis(0); AssertNilOrPo(pstn, 0); if (tdtsNil != tdts) AssertIn(tdts, 0, tdtsLim); AssertNilOrVarMem(ptagTdf); STN stnSave; long tdtsSave; TAG tagTdfSave; stnSave = _stn; tdtsSave = _tdts; tagTdfSave = _tagTdf; if (pvNil != pstn) _stn = *pstn; if (tdtsNil != tdts) _tdts = tdts; if (pvNil != ptagTdf) _tagTdf = *ptagTdf; // This is a bit of a hack, but it makes life easier. Without it, // the code would have to deal with body part sets with no body // parts in them, and TMPL and BODY would have problems with that // (for one thing, they would compute _cbset incorrectly). if (_stn.Cch() == 0) { achar chSpace = ChLit(' '); _stn.SetRgch(&chSpace, 1); } if (!_FInitLists()) // note: unwinds on failure { _stn = stnSave; _tdts = tdtsSave; _tagTdf = tagTdfSave; return fFalse; } return fTrue; } /*************************************************************************** Get stats of this TDT ***************************************************************************/ void TDT::GetInfo(PSTN pstn, long *ptdts, PTAG ptagTdf) { AssertThis(0); AssertNilOrPo(pstn, 0); AssertNilOrVarMem(ptdts); AssertNilOrVarMem(ptagTdf); if (pvNil != pstn) *pstn = _stn; if (pvNil != ptdts) *ptdts = _tdts; if (pvNil != ptagTdf) *ptagTdf = _tagTdf; } /*************************************************************************** Adjust the given body's shape, since its owning TDT has changed ***************************************************************************/ bool TDT::FAdjustBody(PBODY pbody) { AssertThis(0); AssertPo(pbody, 0); if (!pbody->FChangeShape(_pglibactPar, _pglibset)) return fFalse; return fTrue; } /*************************************************************************** Set the default costume. This always succeeds for TDTs because they keep the PMTRL in memory. ***************************************************************************/ bool TDT::FSetDefaultCost(PBODY pbody) { AssertThis(0); AssertPo(pbody, 0); pbody->SetPartSetMtrl(0, _pmtrlDefault); return fTrue; } /*************************************************************************** Get a custom material ***************************************************************************/ PCMTL TDT::PcmtlFetch(long cmid) { AssertThis(0); AssertIn(cmid, 0, _ccmid); Bug("Shouldn't fetch CMTLs from a TDT"); return pvNil; } /*************************************************************************** Write the TDT out as a TMPL hierarchy. ***************************************************************************/ bool TDT::FWrite(PCFL pcfl, CTG ctg, CNO *pcno) { AssertThis(0); AssertPo(pcfl, 0); AssertVarMem(pcno); TDTF tdtf; CNO cnoTdt; BLCK blck; if (!_FWriteTmplf(pcfl, ctg, pcno)) return fFalse; // Add TDT chunk tdtf.bo = kboCur; tdtf.osk = koskCur; tdtf.tdts = _tdts; tdtf.tagTdf = _tagTdf; if (!pcfl->FAddChild(ctg, *pcno, kchidTdt, size(TDTF), kctgTdt, &cnoTdt, &blck)) { return fFalse; } if (!blck.FWrite(&tdtf)) { pcfl->DeleteChild(ctg, *pcno, kctgTdt, cnoTdt, kchidTdt); return fFalse; } return fTrue; } /*************************************************************************** Return the number of cels in the given action ***************************************************************************/ long TDT::_CcelOfTda(long tda) { AssertThis(0); AssertIn(tda, 0, tdaLim); long ccel; switch (tda) { case tdaRest: ccel = 1; break; case tdaLetterRotX: case tdaLetterRotY: case tdaLetterRotZ: case tdaSwingX: case tdaSwingY: case tdaSwingZ: case tdaPulse: case tdaHop: case tdaStretch: ccel = 12; break; case tdaWordRotX: case tdaWordRotY: case tdaWordRotZ: case tdaWave: case tdaReveal: case tdaWalk: ccel = 24; break; default: Bug("Unknown tda"); break; } return ccel; } /*************************************************************************** Apply some transformations to each character based on tda. The transformation matrix is returned in pbmat34. Some transformations are pre-applied and some are post-applied, depending on the desired effect. ***************************************************************************/ void TDT::_ApplyAction(BMAT34 *pbmat34, long tda, long ich, long ccel, long icel, BRS xrChar, BRS dxrText) { AssertThis(0); AssertVarMem(pbmat34); AssertIn(tda, 0, tdaLim); AssertIn(ccel, 0, klwMax); AssertIn(icel, 0, ccel); BRS dxrTextHalf = BrsHalf(dxrText); // fraction of width of text that this char is at BRS xrFract = BrsDiv(xrChar + dxrTextHalf, dxrText); BRS rFractCel = BrsDiv(BrIntToScalar(icel), BrIntToScalar(ccel)); BRS rSwing = BR_SIN(BrRadianToAngle(BrsMul(krTwoPi, rFractCel))); switch (tda) { case tdaRest: break; case tdaLetterRotX: BrMatrix34PreRotateX(pbmat34, BrRadianToAngle(BrsMul(rFractCel, krTwoPi))); break; case tdaLetterRotY: BrMatrix34PreRotateY(pbmat34, BrRadianToAngle(BrsMul(rFractCel, krTwoPi))); break; case tdaLetterRotZ: BrMatrix34PreRotateZ(pbmat34, BrRadianToAngle(BrsMul(rFractCel, krTwoPi))); break; case tdaSwingX: BrMatrix34PreShearY(pbmat34, BrsMul(krQuarter, rSwing), rZero); break; case tdaSwingY: BrMatrix34PreShearZ(pbmat34, rZero, BrsHalf(rSwing)); break; case tdaSwingZ: BrMatrix34PreShearY(pbmat34, rZero, BrsHalf(rSwing)); break; case tdaPulse: BrMatrix34PreScale(pbmat34, rOne + BrsMul(krQuarter, rSwing), rOne + BrsMul(krQuarter, rSwing), rOne + BrsMul(krQuarter, rSwing)); break; case tdaWordRotX: BrMatrix34PostRotateX(pbmat34, BrRadianToAngle(BrsMul(rFractCel, krTwoPi))); break; case tdaWordRotY: BrMatrix34PostRotateY(pbmat34, -BrRadianToAngle(BrsMul(rFractCel, krTwoPi))); break; case tdaWordRotZ: BrMatrix34PostRotateZ(pbmat34, BrRadianToAngle(BrsMul(rFractCel, krTwoPi))); break; case tdaWave: { BRS rTheta; BRA aTheta; BRS rScaleY; rTheta = BrsMul(xrFract - rFractCel, krThreePi); if (rTheta < -krTwoPi) rTheta += krThreePi; rTheta = LwBound(rTheta, rZero, krPi); aTheta = BrRadianToAngle(rTheta); rScaleY = rOne + BR_SIN(aTheta); BrMatrix34PreScale(pbmat34, rOne, rScaleY, rOne); } break; case tdaReveal: { BRS dxr; BRS rTheta; BRA aTheta; BRS rScaleY; if (icel < ccel / 2) { dxr = BrsDiv(BrIntToScalar(icel), BrIntToScalar(ccel / 2)); dxr = BrsDiv(BrsMul(dxr, BR_SCALAR(4.0)), BR_SCALAR(3.0)); rTheta = BrsMul(xrFract - dxr, krThreePi); rTheta += krPi + krHalfPi; rTheta = LwBound(rTheta, krHalfPi, krPi + krHalfPi); } else { dxr = BrsDiv(BrIntToScalar(icel - ccel / 2), BrIntToScalar(ccel / 2)); dxr = BrsDiv(BrsMul(dxr, BR_SCALAR(4.0)), BR_SCALAR(3.0)); rTheta = BrsMul(xrFract - dxr, krThreePi); rTheta += krPi; rTheta = LwBound(rTheta, -krHalfPi, krHalfPi); } aTheta = BrRadianToAngle(rTheta); rScaleY = BR_SCALAR(0.1) + BR_SCALAR(0.5) + BrsMul(BR_SCALAR(0.5), BR_SIN(aTheta)); BrMatrix34PreScale(pbmat34, rOne, rScaleY, rOne); } break; case tdaWalk: { bool fOdd = (ich % 2 != 0); BRS rPhase; BRS rTheta; BRA aTheta; BRS dyr; BRS dzr; rPhase = BrsDiv(BrIntToScalar(icel), BrIntToScalar(ccel)); rTheta = BrsMul(rPhase, krTwoPi); if (fOdd) { if (icel < ccel / 2) dzr = BrsMul(BrIntToScalar(ccel / 2 - icel), kdwrStepWalk); else dzr = BrsMul(BrIntToScalar(icel - ccel / 2), kdwrStepWalk); } else { if (icel < ccel / 2) dzr = BrsMul(BrIntToScalar(icel), kdwrStepWalk); else dzr = BrsMul(BrIntToScalar(ccel - icel), kdwrStepWalk); } if (fOdd) rTheta -= krPi; rTheta = LwBound(rTheta, rZero, krPi); aTheta = BrRadianToAngle(rTheta); dyr = BR_SIN(aTheta); BrMatrix34PreTranslate(pbmat34, rZero, dyr, dzr); } break; case tdaHop: { BRS rPhase; BRS rTheta; BRA aTheta; BRS dyr = rZero; BRS yrScale = rOne; if (icel < ccel * 2 / 3) { rPhase = BrsDiv(BrIntToScalar(icel), BrIntToScalar(ccel * 2 / 3)); rTheta = BrsMul(rPhase, krPi); aTheta = BrRadianToAngle(rTheta); dyr = BR_SIN(aTheta); } else { rPhase = BrsDiv(BrIntToScalar(icel - (ccel * 2 / 3)), BrIntToScalar(ccel / 3)); // rTheta goes from krPi to krTwoPi rTheta = BrsMul(rPhase, krPi) + krPi; aTheta = BrRadianToAngle(rTheta); yrScale = rOne + BrsDiv(BR_SIN(aTheta), rTwo); } BrMatrix34PreTranslate(pbmat34, rZero, dyr, rZero); BrMatrix34PreScale(pbmat34, rOne, yrScale, rOne); } break; case tdaStretch: { BRS rPhase; BRS rTheta; BRA aTheta; BRS dyr = rZero; BRS yrScale = rOne; rPhase = BrsDiv(BrIntToScalar(icel), BrIntToScalar(ccel)); rTheta = BrsMul(rPhase, krTwoPi) + krPi + krHalfPi; aTheta = BrRadianToAngle(rTheta); dyr = BR_SIN(aTheta); BrMatrix34PreScale(pbmat34, BR_SCALAR(1.5) + BrsHalf(dyr), rOne, rOne); } break; default: Bug("Unknown tda"); break; } } /*************************************************************************** Shape the text based on the given tdts. This function is called once per character in the TDT. pbmat34 receives the transformation matrix for the character. xrChar is the position of the current character (you could also think of this as the distance of the center of this character from the origin of the TDT). dxrText is the width of the entire string. dyr is the height of the font. ***************************************************************************/ void TDT::_ApplyShape(BMAT34 *pbmat34, long tdts, long cch, long ich, BRS xrChar, BRS dxrText, BRS yrChar, BRS dyrMax, BRS dyrTotal) { AssertThis(0); AssertVarMem(pbmat34); AssertIn(tdts, 0, tdtsLim); AssertIn(cch, 0, kcchMaxStn); AssertIn(ich, 0, cch); BRS dxr = rZero; BRS dyr = rZero; BRS dzr = rZero; BRS dxrTextHalf = BrsHalf(dxrText); BRS dxrTextQuarter = BrsHalf(dxrTextHalf); // fraction of width of text that this char is at BRS xrFract = BrsDiv(xrChar + dxrTextHalf, dxrText); BRS rRadius = BrsDiv(dxrText, krTwoPi); switch (tdts) { case tdtsNormal: BrMatrix34PostTranslate(pbmat34, xrChar, rZero, rZero); break; case tdtsArchPositive: dyr = BrsMul(dxrTextQuarter, BR_SIN(BrRadianToAngle(BrsMul(krPi, xrFract)))); BrMatrix34PostTranslate(pbmat34, xrChar, dyr, rZero); break; case tdtsArchNegative: dyr = BrsMul(dxrTextQuarter, rOne - BR_SIN(BrRadianToAngle(BrsMul(krPi, xrFract)))); BrMatrix34PostTranslate(pbmat34, xrChar, dyr, rZero); break; case tdtsCircleY: BrMatrix34PostTranslate(pbmat34, rZero, rZero, rRadius); BrMatrix34PostRotateY(pbmat34, BrRadianToAngle(BrsMul(krTwoPi, xrFract))); break; case tdtsLargeMiddle: BrMatrix34PostTranslate(pbmat34, xrChar, rZero, rZero); BrMatrix34PostScale(pbmat34, rOne, rOne + BR_SIN(BrRadianToAngle(BrsMul(krPi, xrFract))), rOne); break; case tdtsArchZ: dzr = BrsMul(dxrTextQuarter, BR_SIN(BrRadianToAngle(BrsMul(krPi, xrFract)))); BrMatrix34PostTranslate(pbmat34, xrChar, rZero, dzr); break; case tdtsCircleZ: BrMatrix34PostTranslate(pbmat34, rZero, rRadius, rZero); BrMatrix34PostRotateZ(pbmat34, -BrRadianToAngle(BrsMul(krTwoPi, xrFract))); break; case tdtsVertical: BrMatrix34PostTranslate(pbmat34, rZero, dyrTotal - yrChar, rZero); break; case tdtsGrowRight: BrMatrix34PostTranslate(pbmat34, xrChar, rZero, rZero); BrMatrix34PostScale(pbmat34, rOne, rOne + xrFract, rOne); break; case tdtsGrowLeft: BrMatrix34PostTranslate(pbmat34, xrChar, rZero, rZero); BrMatrix34PostScale(pbmat34, rOne, rOne + (rOne - xrFract), rOne); break; default: Bug("unknown tdts"); break; } } #ifdef DEBUG /*************************************************************************** Assert the validity of the TDT. ***************************************************************************/ void TDT::AssertValid(ulong grf) { TDT_PAR::AssertValid(fobjAllocated); AssertPo(_pgstAction, 0); // must set _pgstAction before creating TDTs Assert(_tagTdf.ctg != ctgNil, "TDT has bad _tagTdf"); AssertPo(_pmtrlDefault, 0); if (tdaNil != _tdaCache) { AssertIn(_tdaCache, 0, tdaLim); AssertPo(_pactnCache, 0); } else { Assert(pvNil == _pactnCache, "_tdaCache is wrong"); } AssertIn(_tdts, 0, tdtsLim); } /*************************************************************************** Mark memory used by the TDT ***************************************************************************/ void TDT::MarkMem(void) { AssertThis(0); TDT_PAR::MarkMem(); MarkMemObj(_pmtrlDefault); if (tdaNil != _tdaCache) MarkMemObj(_pactnCache); } /*************************************************************************** Mark memory used by the TDT action GST ***************************************************************************/ void TDT::MarkActionNames(void) { MarkMemObj(_pgstAction); } #endif // DEBUG ================================================ FILE: src/engine/tmpl.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** tmpl.cpp: Actor template class Primary Author: ****** Review Status: REVIEWED - any changes to this file must be reviewed! Here's the TMPL chunk tree (* means more than one chunk can go here): TMPL - template flags | +--GLPI (chid 0) - parent IDs (BODY part hierarchy) | +--GLBS (chid 0) - body part sets for BODY | +--GGCM (chid 0) - custom costumes per body part set (GG of cmids) | +--CMTL* (chid ) - custom material...see mtrl.h | | | +--MTRL* | | | +--TMAP | +--MODL* - models used in this template | +--ACTN* (chid ) - action for this template | +--GGCL (chid 0) - GG of cels for this action | +--GLXF (chid 0) - GL of transformation matrices for this action | +--GLMS (chid 0) - GL of motionmatch sounds for cels of this action About Actions: An action is an activity that a body can perform, such as walking, jumping, breathing, or resting. Actions are broken down into cels, where each cel describes the position of each body part of the actor at one step or phase of the action. After reaching the last cel, the action loops around to the beginning cel and repeats. Cels consist of a list of cel part specs (CPS). Each CPS refers to a single body part of an actor, such as a leg or head. The CPS tells what BRender model to use for the body part for this cel and what matrix to use to orient it to its parent body part. Each time the cel number is changed, TMPL reads each CPS of the new cel and updates each body part to use the new model and transformation matrix. About the GGCM: it is indexed by body part set, and tells how many custom materials are available for each body part set, and what the CMIDs are for those materials. The first CMID in each body part set is the default one (for the default costume). Example: If a body had 3 body part sets (shirt, pants, and head), and there are 2 shirts, 3 pants, and 1 head, the GGCM would be: 0: fixed = 2, variable = (0, 1) 1: fixed = 3, variable = (2, 3, 4) 2: fixed = 1, variable = (5) where the fixed part is the count of available CMIDs for each body part set, and the numbers in the variable part are the CMIDs for the respective body part sets. The default costume for this actor would be CMID 0 for the shirt, 2 for the pants, and 5 for the head. ***************************************************************************/ #include "soc.h" ASSERTNAME RTCLASS(ACTN) RTCLASS(TMPL) /*************************************************************************** Create a new action ***************************************************************************/ PACTN ACTN::PactnNew(PGG pggcel, PGL pglbmat34, ulong grfactn) { AssertPo(pggcel, 0); AssertPo(pglbmat34, 0); PACTN pactn; pactn = NewObj ACTN; if (pvNil == pactn) goto LFail; pactn->_grfactn = grfactn; // Duplicate pggcel into pactn->_pggcel pactn->_pggcel = pggcel->PggDup(); if (pvNil == pactn->_pggcel) goto LFail; // Duplicate pglbmat34 into pactn->_pglbmat34 pactn->_pglbmat34 = pglbmat34->PglDup(); if (pvNil == pactn->_pglbmat34) goto LFail; AssertPo(pactn, 0); return pactn; LFail: ReleasePpo(&pactn); return pvNil; } /*************************************************************************** A PFNRPO (chunky resource reader function) to read an ACTN from a file ***************************************************************************/ bool ACTN::FReadActn(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb) { AssertPo(pcrf, 0); AssertPo(pblck, 0); AssertNilOrVarMem(ppbaco); AssertVarMem(pcb); ACTN *pactn; *pcb = pblck->Cb(fTrue); // estimate ACTN size (not a good estimate) if (pvNil == ppbaco) return fTrue; if (!pblck->FUnpackData()) goto LFail; *pcb = pblck->Cb(); pactn = NewObj ACTN; if (pvNil == pactn || !pactn->_FInit(pcrf->Pcfl(), ctg, cno)) { ReleasePpo(&pactn); LFail: TrashVar(ppbaco); TrashVar(pcb); return fFalse; } AssertPo(pactn, 0); *ppbaco = pactn; *pcb = size(ACTN) + pactn->_pggcel->CbOnFile() + pactn->_pglbmat34->CbOnFile(); return fTrue; } /*************************************************************************** Read an ACTN from a chunk ***************************************************************************/ bool ACTN::_FInit(PCFL pcfl, CTG ctg, CNO cno) { AssertPo(pcfl, 0); KID kid; BLCK blck; ACTNF actnf; short bo; long icel; if (!pcfl->FFind(ctg, cno, &blck) || !blck.FUnpackData()) return fFalse; if (blck.Cb() < size(ACTNF)) return fFalse; if (!blck.FReadRgb(&actnf, size(ACTNF), 0)) return fFalse; if (kboOther == actnf.bo) SwapBytesBom(&actnf, kbomActnf); Assert(kboCur == actnf.bo, "bad ACTNF"); _grfactn = actnf.grfactn; // read GG of cels (chid 0, ctg kctgGgcl): if (!pcfl->FGetKidChidCtg(ctg, cno, 0, kctgGgcl, &kid)) return fFalse; if (!pcfl->FFind(kid.cki.ctg, kid.cki.cno, &blck)) return fFalse; _pggcel = GG::PggRead(&blck, &bo); if (pvNil == _pggcel) return fFalse; AssertBomRglw(kbomCel, size(CEL)); AssertBomRgsw(kbomCps, size(CPS)); if (kboOther == bo) { for (icel = 0; icel < _pggcel->IvMac(); icel++) { SwapBytesRglw(_pggcel->QvFixedGet(icel), size(CEL) / size(long)); SwapBytesRgsw(_pggcel->QvGet(icel), _pggcel->Cb(icel) / size(short)); } } // read GL of transforms (chid 0, ctg kctgGlxf): if (!pcfl->FGetKidChidCtg(ctg, cno, 0, kctgGlxf, &kid)) return fFalse; if (!pcfl->FFind(kid.cki.ctg, kid.cki.cno, &blck)) return fFalse; _pglbmat34 = GL::PglRead(&blck, &bo); if (pvNil == _pglbmat34) return fFalse; AssertBomRglw(kbomBmat34, size(BMAT34)); if (kboOther == bo) { SwapBytesRglw(_pglbmat34->QvGet(0), LwMul(_pglbmat34->IvMac(), size(BMAT34) / size(long))); } // read (optional) GL of motion-match sounds (chid 0, ctg kctgGlms): if (pcfl->FGetKidChidCtg(ctg, cno, 0, kctgGlms, &kid)) { if (!pcfl->FFind(kid.cki.ctg, kid.cki.cno, &blck)) return fFalse; _pgltagSnd = GL::PglRead(&blck, &bo); if (pvNil == _pgltagSnd) return fFalse; AssertBomRglw(kbomTag, size(TAG)); if (kboOther == bo) { SwapBytesRglw(_pgltagSnd->QvGet(0), LwMul(_pgltagSnd->IvMac(), size(TAG) / size(long))); } } return fTrue; } /*************************************************************************** Destructor ***************************************************************************/ ACTN::~ACTN(void) { AssertBaseThis(0); ReleasePpo(&_pggcel); ReleasePpo(&_pglbmat34); } /*************************************************************************** Get a CEL ***************************************************************************/ void ACTN::GetCel(long icel, CEL *pcel) { AssertThis(0); AssertIn(icel, 0, Ccel()); AssertVarMem(pcel); _pggcel->GetFixed(icel, pcel); } /*************************************************************************** Get a CPS ***************************************************************************/ void ACTN::GetCps(long icel, long icps, CPS *pcps) { AssertThis(0); AssertIn(icel, 0, Ccel()); AssertIn(icps, 0, _pggcel->Cb(icel) / size(CPS)); AssertVarMem(pcps); CPS *prgcps = (CPS *)_pggcel->QvGet(icel); *pcps = prgcps[icps]; } /*************************************************************************** Get a sound for icel. If there is no sound, ptag's CTG is set to ctgNil. ***************************************************************************/ void ACTN::GetSnd(long icel, PTAG ptag) { AssertThis(0); AssertIn(icel, 0, Ccel()); AssertVarMem(ptag); CEL cel; ptag->ctg = ctgNil; if (pvNil != _pgltagSnd) { GetCel(icel, &cel); if (cel.chidSnd >= 0) // negative means no sound _pgltagSnd->Get(cel.chidSnd, ptag); } } /*************************************************************************** Get a transformation matrix ***************************************************************************/ void ACTN::GetMatrix(long imat34, BMAT34 *pbmat34) { AssertThis(0); AssertIn(imat34, 0, _pglbmat34->IvMac()); AssertVarMem(pbmat34); _pglbmat34->Get(imat34, pbmat34); } #ifdef DEBUG /*************************************************************************** Assert the validity of the ACTN. ***************************************************************************/ void ACTN::AssertValid(ulong grf) { ACTN_PAR::AssertValid(fobjAllocated); AssertPo(_pggcel, 0); AssertPo(_pglbmat34, 0); AssertNilOrPo(_pgltagSnd, 0); } /*************************************************************************** Mark memory used by the ACTN ***************************************************************************/ void ACTN::MarkMem(void) { AssertThis(0); ACTN_PAR::MarkMem(); MarkMemObj(_pggcel); MarkMemObj(_pglbmat34); MarkMemObj(_pgltagSnd); } #endif // DEBUG /*************************************************************************** A PFNRPO (chunky resource reader function) to read TMPL objects. ***************************************************************************/ bool TMPL::FReadTmpl(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck, PBACO *ppbaco, long *pcb) { AssertPo(pcrf, 0); AssertPo(pblck, 0); AssertNilOrVarMem(ppbaco); AssertVarMem(pcb); TMPL *ptmpl; KID kid; *pcb = pblck->Cb(fTrue); // estimate TMPL size (not a good estimate) if (pvNil == ppbaco) return fTrue; if (pcrf->Pcfl()->FGetKidChidCtg(ctg, cno, 0, kctgTdt, &kid)) ptmpl = NewObj TDT; else ptmpl = NewObj TMPL; if (pvNil == ptmpl || !ptmpl->_FInit(pcrf->Pcfl(), ctg, cno)) { ReleasePpo(&ptmpl); TrashVar(ppbaco); TrashVar(pcb); return fFalse; } AssertPo(ptmpl, 0); *ppbaco = ptmpl; if (ptmpl->_grftmpl & ftmplTdt) { *pcb = size(TDT); } else { *pcb = size(TMPL) + ptmpl->_pglibactPar->CbOnFile() + ptmpl->_pglibset->CbOnFile() + ptmpl->_pggcmid->CbOnFile(); } return fTrue; } /*************************************************************************** Read a TMPL from a chunk ***************************************************************************/ bool TMPL::_FReadTmplf(PCFL pcfl, CTG ctg, CNO cno) { AssertBaseThis(0); BLCK blck; TMPLF tmplf; if (!pcfl->FFind(ctg, cno, &blck) || !blck.FUnpackData()) return fFalse; if (blck.Cb() < size(TMPLF)) return fFalse; if (!blck.FReadRgb(&tmplf, size(TMPLF), 0)) return fFalse; if (kboOther == tmplf.bo) SwapBytesBom(&tmplf, kbomTmplf); Assert(kboCur == tmplf.bo, "freaky tmplf!"); _xaRest = tmplf.xaRest; _yaRest = tmplf.yaRest; _zaRest = tmplf.zaRest; _grftmpl = tmplf.grftmpl; if (!pcfl->FGetName(ctg, cno, &_stn)) return fFalse; return fTrue; } /*************************************************************************** Write the TMPLF chunk. Creates a new chunk and returns the CNO in pcno. Note: In Socrates, normal actor templates are read-only, but this function will get called for TDTs. ***************************************************************************/ bool TMPL::_FWriteTmplf(PCFL pcfl, CTG ctg, CNO *pcno) { AssertThis(0); AssertPo(pcfl, 0); AssertVarMem(pcno); TMPLF tmplf; // Add TMPL chunk tmplf.bo = kboCur; tmplf.osk = koskCur; tmplf.xaRest = _xaRest; tmplf.yaRest = _yaRest; tmplf.zaRest = _zaRest; tmplf.grftmpl = _grftmpl; if (!pcfl->FAddPv(&tmplf, size(TMPLF), ctg, pcno)) return fFalse; if (!pcfl->FSetName(kctgTmpl, *pcno, &_stn)) { pcfl->Delete(ctg, *pcno); return fFalse; } return fTrue; } /*************************************************************************** Read a TMPL from a chunk ***************************************************************************/ bool TMPL::_FInit(PCFL pcfl, CTG ctg, CNO cno) { AssertPo(pcfl, 0); KID kid; short bo; BLCK blck; long ibact; short ibset; if (!_FReadTmplf(pcfl, ctg, cno)) return fFalse; // read GLPI (parent tree) if (!pcfl->FGetKidChidCtg(ctg, cno, 0, kctgGlpi, &kid)) return fFalse; if (!pcfl->FFind(kid.cki.ctg, kid.cki.cno, &blck)) return fFalse; _pglibactPar = GL::PglRead(&blck, &bo); if (pvNil == _pglibactPar) return fFalse; Assert(_pglibactPar->CbEntry() == size(short), "Bad _pglibactPar!"); if (kboOther == bo) SwapBytesRgsw(_pglibactPar->QvGet(0), _pglibactPar->IvMac()); // read GLBS (body-part-set ID list) if (!pcfl->FGetKidChidCtg(ctg, cno, 0, kctgGlbs, &kid)) return fFalse; if (!pcfl->FFind(kid.cki.ctg, kid.cki.cno, &blck)) return fFalse; _pglibset = GL::PglRead(&blck, &bo); if (pvNil == _pglibset) return fFalse; Assert(_pglibset->CbEntry() == size(short), "Bad TMPL _pglibset!"); if (kboOther == bo) SwapBytesRgsw(_pglibset->QvGet(0), _pglibset->IvMac()); #ifdef DEBUG // GLDC is obsolete if (pcfl->FGetKidChidCtg(ctg, cno, 0, kctgGldc, &kid)) Warn("Obsolete GLDC structure...get rid of it"); #endif // DEBUG // _cbset is (highest entry in _pglibset) + 1. _cbset = -1; for (ibact = 0; ibact < _pglibset->IvMac(); ibact++) { _pglibset->Get(ibact, &ibset); if (ibset > _cbset) _cbset = ibset; } _cbset++; // Count custom costumes _ccmid = 0; while (pcfl->FGetKidChidCtg(ctg, cno, _ccmid, kctgCmtl, &kid)) _ccmid++; // Count actions _cactn = 0; while (pcfl->FGetKidChidCtg(ctg, cno, _cactn, kctgActn, &kid)) _cactn++; // read GGCM (costume info) if (!pcfl->FGetKidChidCtg(ctg, cno, 0, kctgGgcm, &kid)) { // REVIEW *****: temp until Pete updates sitobren goto LBuildGgcm; // return fFalse; } if (!pcfl->FFind(kid.cki.ctg, kid.cki.cno, &blck)) return fFalse; _pggcmid = GG::PggRead(&blck, &bo); if (pvNil == _pggcmid) return fFalse; Assert(_pggcmid->CbFixed() == size(long), "Bad TMPL _pggcmid"); Assert(_pggcmid->IvMac() == _cbset, "Bad TMPL _pggcmid"); if (kboOther == bo) { for (ibset = 0; ibset < _cbset; ibset++) { SwapBytesRglw(_pggcmid->QvFixedGet(ibset), 1); SwapBytesRglw(_pggcmid->QvGet(ibset), *(long *)_pggcmid->QvFixedGet(ibset)); } } return fTrue; // REVIEW *****: temp code until Pete converts our TMPL content LBuildGgcm: long ikid; PCMTL pcmtl; PCRF pcrf; long rgcmid[50]; long ccmid; Warn("missing GGCM...building one on the fly"); pcrf = CRF::PcrfNew(pcfl, 0); if (pvNil == pcrf) return fFalse; _pggcmid = GG::PggNew(size(long)); if (pvNil == _pggcmid) { ReleasePpo(&pcrf); return fFalse; } for (ibset = 0; ibset < _cbset; ibset++) { ikid = 0; ccmid = 0; while (pcfl->FGetKid(ctg, cno, ikid++, &kid)) { if (kid.cki.ctg != kctgCmtl) continue; pcmtl = (PCMTL)pcrf->PbacoFetch(kid.cki.ctg, kid.cki.cno, CMTL::FReadCmtl); if (pvNil == pcmtl) { ReleasePpo(&pcrf); return fFalse; } if (pcmtl->Ibset() == ibset) { rgcmid[ccmid++] = kid.chid; } ReleasePpo(&pcmtl); } if (!_pggcmid->FAdd(ccmid * size(long), pvNil, rgcmid, &ccmid)) { ReleasePpo(&pcrf); return fFalse; } } ReleasePpo(&pcrf); return fTrue; } /*************************************************************************** Clean up and delete template ***************************************************************************/ TMPL::~TMPL(void) { AssertBaseThis(0); ReleasePpo(&_pglibactPar); ReleasePpo(&_pglibset); ReleasePpo(&_pggcmid); } /*************************************************************************** Return a list of all tags embedded in this TMPL. Note that a return value of pvNil does not mean an error occurred, but simply that this TMPL has no embedded tags. ***************************************************************************/ PGL TMPL::PgltagFetch(PCFL pcfl, CTG ctg, CNO cno, bool *pfError) { AssertPo(pcfl, 0); AssertVarMem(pfError); KID kid; *pfError = fFalse; if (pcfl->FGetKidChidCtg(ctg, cno, 0, kctgTdt, &kid)) return TDT::PgltagFetch(pcfl, ctg, cno, pfError); else return pvNil; // standard TMPLs have no embedded tags } /*************************************************************************** Creates a new tree of body parts (br_actors) based on this template. Note: ACTR also calls FSetDefaultCost after creating the body, but by calling it here, it is guaranteed that the body will have a material on each body part (no null pointers for bact->material). So the user will never see a body part that isn't texture mapped. ***************************************************************************/ PBODY TMPL::PbodyCreate(void) { AssertThis(0); PBODY pbody = BODY::PbodyNew(_pglibactPar, _pglibset); if (pvNil == pbody || !FSetDefaultCost(pbody)) { ReleasePpo(&pbody); return pvNil; } return pbody; } /*************************************************************************** Fills in the name of the given action ***************************************************************************/ bool TMPL::FGetActnName(long anid, PSTN pstn) { AssertThis(0); AssertIn(anid, 0, _cactn); AssertPo(pstn, 0); KID kid; if (!Pcrf()->Pcfl()->FGetKidChidCtg(Ctg(), Cno(), anid, kctgActn, &kid)) return fFalse; return Pcrf()->Pcfl()->FGetName(kid.cki.ctg, kid.cki.cno, pstn); } /*************************************************************************** Reads an ACTN chunk from disk ***************************************************************************/ PACTN TMPL::_PactnFetch(long anid) { AssertThis(0); AssertIn(anid, 0, _cactn); KID kid; ACTN *pactn; CHID chidActn = anid; if (!Pcrf()->Pcfl()->FGetKidChidCtg(Ctg(), Cno(), chidActn, kctgActn, &kid)) { return pvNil; } pactn = (ACTN *)Pcrf()->PbacoFetch(kid.cki.ctg, kid.cki.cno, ACTN::FReadActn); AssertNilOrPo(pactn, 0); return pactn; } /*************************************************************************** Reads a MODL chunk from disk ***************************************************************************/ PMODL TMPL::_PmodlFetch(CHID chidModl) { AssertThis(0); KID kid; MODL *pmodl; if (!Pcrf()->Pcfl()->FGetKidChidCtg(Ctg(), Cno(), chidModl, kctgBmdl, &kid)) { return pvNil; } pmodl = (MODL *)Pcrf()->PbacoFetch(kid.cki.ctg, kid.cki.cno, MODL::FReadModl); AssertNilOrPo(pmodl, 0); return pmodl; } /*************************************************************************** Sets up the body part tree to use the correct models and transformation matrices for the given cel of the given action. Also returns the distance to the next cel in *pdwr. ***************************************************************************/ bool TMPL::FSetActnCel(BODY *pbody, long anid, long celn, BRS *pdwr) { AssertThis(0); AssertPo(pbody, 0); AssertIn(anid, 0, _cactn); AssertNilOrVarMem(pdwr); long icel; ACTN *pactn = pvNil; CEL cel; short ibprt; long cbprt = _pglibactPar->IvMac(); CPS cps; PMODL *prgpmodl = pvNil; BMAT34 bmat34; bool fRet = fFalse; pactn = _PactnFetch(anid); if (pvNil == pactn) goto LEnd; icel = celn % pactn->Ccel(); if (icel < 0) icel += pactn->Ccel(); pactn->GetCel(icel, &cel); if (!FAllocPv((void **)&prgpmodl, LwMul(cbprt, size(PMODL)), fmemClear, mprNormal)) { goto LEnd; } for (ibprt = 0; ibprt < cbprt; ibprt++) { pactn->GetCps(icel, ibprt, &cps); if (chidNil == cps.chidModl) { // Appendages for accessories...don't smash // accessory models with action models Assert(pvNil == prgpmodl[ibprt], "fmemClear didn't work?"); } else { prgpmodl[ibprt] = _PmodlFetch(cps.chidModl); if (pvNil == prgpmodl[ibprt]) goto LEnd; } } if (pvNil != pdwr) *pdwr = cel.dwr; for (ibprt = 0; ibprt < cbprt; ibprt++) { if (pvNil != prgpmodl[ibprt]) pbody->SetPartModel(ibprt, prgpmodl[ibprt]); pactn->GetCps(icel, ibprt, &cps); pactn->GetMatrix(cps.imat34, &bmat34); pbody->SetPartMatrix(ibprt, &bmat34); } fRet = fTrue; LEnd: if (pvNil != prgpmodl) { for (ibprt = 0; ibprt < cbprt; ibprt++) ReleasePpo(&prgpmodl[ibprt]); FreePpv((void **)&prgpmodl); } ReleasePpo(&pactn); return fRet; } /*************************************************************************** Retrieves the distance travelled by cel celn of action anid. ***************************************************************************/ bool TMPL::FGetDwrActnCel(long anid, long celn, BRS *pdwr) { AssertThis(0); AssertIn(anid, 0, _cactn); AssertVarMem(pdwr); ACTN *pactn; long icel; CEL cel; pactn = _PactnFetch(anid); if (pvNil == pactn) return fFalse; icel = celn % pactn->Ccel(); if (icel < 0) icel += pactn->Ccel(); pactn->GetCel(icel, &cel); ReleasePpo(&pactn); *pdwr = cel.dwr; return fTrue; } /*************************************************************************** Retrieves the number of cels in this action ***************************************************************************/ bool TMPL::FGetCcelActn(long anid, long *pccel) { AssertThis(0); AssertIn(anid, 0, _cactn); AssertVarMem(pccel); ACTN *pactn; pactn = _PactnFetch(anid); if (pvNil == pactn) return fFalse; *pccel = pactn->Ccel(); ReleasePpo(&pactn); return fTrue; } /*************************************************************************** Retrieves the number of cels in this action ***************************************************************************/ bool TMPL::FGetSndActnCel(long anid, long celn, bool *pfSoundExists, PTAG ptag) { AssertThis(0); AssertIn(anid, 0, _cactn); AssertVarMem(pfSoundExists); AssertVarMem(ptag); ACTN *pactn; long icel; *pfSoundExists = fFalse; pactn = _PactnFetch(anid); if (pvNil == pactn) return fFalse; icel = celn % pactn->Ccel(); if (icel < 0) icel += pactn->Ccel(); pactn->GetSnd(icel, ptag); if (ptag->ctg != ctgNil) *pfSoundExists = fTrue; ReleasePpo(&pactn); return fTrue; } /*************************************************************************** Retrieves the distance travelled by cel celn of action anid. ***************************************************************************/ bool TMPL::FGetGrfactn(long anid, ulong *pgrfactn) { AssertThis(0); AssertIn(anid, 0, _cactn); AssertVarMem(pgrfactn); ACTN *pactn; pactn = _PactnFetch(anid); if (pvNil == pactn) return fFalse; *pgrfactn = pactn->Grfactn(); ReleasePpo(&pactn); return fTrue; } /*************************************************************************** Get orientation for template when actor has no path ***************************************************************************/ void TMPL::GetRestOrien(BRA *pxa, BRA *pya, BRA *pza) { AssertThis(0); AssertVarMem(pxa); AssertVarMem(pya); AssertVarMem(pza); *pxa = _xaRest; *pya = _yaRest; *pza = _zaRest; } /*************************************************************************** Puts default costume on pbody ***************************************************************************/ bool TMPL::FSetDefaultCost(BODY *pbody) { AssertThis(0); AssertPo(pbody, 0); long ibset; long cmid; PCMTL *prgpcmtl; bool fRet = fFalse; if (!FAllocPv((void **)&prgpcmtl, LwMul(_cbset, size(PCMTL)), fmemClear, mprNormal)) { goto LEnd; } for (ibset = 0; ibset < _cbset; ibset++) { cmid = CmidOfBset(ibset, 0); prgpcmtl[ibset] = PcmtlFetch(cmid); if (pvNil == prgpcmtl[ibset]) goto LEnd; Assert(prgpcmtl[ibset]->Ibset() == ibset, "ibset's don't match"); } for (ibset = 0; ibset < _cbset; ibset++) pbody->SetPartSetCmtl(prgpcmtl[ibset]); fRet = fTrue; LEnd: if (pvNil != prgpcmtl) { for (ibset = 0; ibset < _cbset; ibset++) ReleasePpo(&prgpcmtl[ibset]); FreePpv((void **)&prgpcmtl); } return fRet; } /*************************************************************************** Returns the number of custom materials available for ibset ***************************************************************************/ long TMPL::CcmidOfBset(long ibset) { AssertThis(0); AssertIn(ibset, 0, _cbset); return *(long *)_pggcmid->QvFixedGet(ibset); } /*************************************************************************** Returns the icmid'th CMID available for ibset ***************************************************************************/ long TMPL::CmidOfBset(long ibset, long icmid) { AssertThis(0); AssertIn(ibset, 0, _cbset); AssertIn(icmid, 0, CcmidOfBset(ibset)); long *prgcmid; prgcmid = (long *)_pggcmid->QvGet(ibset); return prgcmid[icmid]; } /*************************************************************************** Tells whether ibset holds accessories by checking to see if one of its costumes has model children. ***************************************************************************/ bool TMPL::FBsetIsAccessory(long ibset) { AssertThis(0); AssertIn(ibset, 0, _cbset); long cmid; KID kid; if (pvNil == Pcrf()) return fFalse; // probably a TDT cmid = CmidOfBset(ibset, 0); if (!Pcrf()->Pcfl()->FGetKidChidCtg(Ctg(), Cno(), cmid, kctgCmtl, &kid)) { return fFalse; } return CMTL::FHasModels(Pcrf()->Pcfl(), kid.cki.ctg, kid.cki.cno); } /*************************************************************************** Returns the ibset of the accessory associated with ibset, if any. If ibset is itself an accessory, it is returned in *pibsetAcc. Otherwise, if ibset is the parent of an accessory, that accessory is returned in *pibsetAcc. ***************************************************************************/ bool TMPL::FIbsetAccOfIbset(long ibset, long *pibsetAcc) { AssertThis(0); AssertIn(ibset, 0, _cbset); AssertVarMem(pibsetAcc); long ibsetT; long ibact; long ibactPar; short ibsetOfIbact; short ibsetOfIbactPar; if (FBsetIsAccessory(ibset)) { *pibsetAcc = ibset; return fTrue; } for (ibsetT = 0; ibsetT < _cbset; ibsetT++) { if (FBsetIsAccessory(ibsetT)) { // for each ibact in ibsetT, see if its parent is in ibset for (ibact = 0; ibact < _pglibactPar->IvMac(); ibact++) { ibsetOfIbact = *(short *)_pglibset->QvGet(ibact); if (ibsetT == ibsetOfIbact) { // see if ibact's parent in ibset ibactPar = *(short *)_pglibactPar->QvGet(ibact); ibsetOfIbactPar = *(short *)_pglibset->QvGet(ibactPar); if (ibsetOfIbactPar == ibset) { // so ibset is a parent bset of ibsetT *pibsetAcc = ibsetT; return fTrue; } } } } } return fFalse; // ibset is not a parent bset of any accessory bset. } /*************************************************************************** See if cmid1 and cmid2 are for the same accessory by comparing child model chunks ***************************************************************************/ bool TMPL::FSameAccCmids(long cmid1, long cmid2) { AssertThis(0); KID kid1; KID kid2; if (!Pcrf()->Pcfl()->FGetKidChidCtg(Ctg(), Cno(), cmid1, kctgCmtl, &kid1) || !Pcrf()->Pcfl()->FGetKidChidCtg(Ctg(), Cno(), cmid2, kctgCmtl, &kid2)) { return fFalse; // safer to assume they're different } return CMTL::FEqualModels(Pcrf()->Pcfl(), kid1.cki.cno, kid2.cki.cno); } /*************************************************************************** Get a custom material. The cmid is really the chid under the TMPL. ***************************************************************************/ PCMTL TMPL::PcmtlFetch(long cmid) { AssertThis(0); AssertIn(cmid, 0, _ccmid); PCMTL pcmtl; KID kid; if (!Pcrf()->Pcfl()->FGetKidChidCtg(Ctg(), Cno(), cmid, kctgCmtl, &kid)) { return pvNil; } pcmtl = (PCMTL)Pcrf()->PbacoFetch(kid.cki.ctg, kid.cki.cno, CMTL::FReadCmtl); AssertNilOrPo(pcmtl, 0); return pcmtl; } /*************************************************************************** Puts the template's name into pstn ***************************************************************************/ void TMPL::GetName(PSTN pstn) { AssertThis(0); AssertPo(pstn, 0); *pstn = _stn; } #ifdef DEBUG /*************************************************************************** Assert the validity of the TMPL. ***************************************************************************/ void TMPL::AssertValid(ulong grftmpl) { long ibset; long ccmid; TMPL_PAR::AssertValid(fobjAllocated); AssertPo(_pglibactPar, 0); AssertPo(_pglibset, 0); AssertPo(_pggcmid, 0); AssertPo(&_stn, 0); // Verify correctness of _pggcmid Assert(_pggcmid->IvMac() == _cbset, 0); for (ibset = 0; ibset < _cbset; ibset++) { ccmid = *(long *)_pggcmid->QvFixedGet(ibset); Assert(_pggcmid->Cb(ibset) / size(long) == ccmid, 0); } } /*************************************************************************** Mark memory used by the TMPL ***************************************************************************/ void TMPL::MarkMem(void) { AssertThis(0); TMPL_PAR::MarkMem(); MarkMemObj(_pglibactPar); MarkMemObj(_pglibset); MarkMemObj(_pggcmid); } #endif // DEBUG ================================================ FILE: src/help/actorbio.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ SET _help_48544F50_0= 0x0 CHUNK('HTOP', _help_48544F50_0, "") BO OSK LONG 0xFFFFFFFF 0x0 0x0 0xFFFFFFFF 0x0 0x0 0x0 0xFFFFFFFF ENDCHUNK SET _help_cno++ SET _help_52545854_1=_help_cno CHUNK('RTXT', _help_cno, "") PARENT('HTOP', _help_48544F50_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD2 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1=_help_cno CHUNK('GLMP', _help_cno, "") PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x11 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0A 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x38 0x00 0x00 0x01 // '????8???' 0x01 0x00 0x00 0x00 0x42 0x00 0x00 0x01 // '????B???' 0x00 0x00 0x00 0x00 0xB1 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xB6 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0xED 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xF3 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0A 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x38 0x00 0x00 0x03 // '????8???' 0x0A 0x00 0x00 0xFD 0x42 0x00 0x00 0x03 // '???B???' 0x00 0x00 0x00 0x00 0xB1 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xB6 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0xED 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xF3 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1=_help_cno CHUNK('TEXT', _help_cno, "") PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x03 0x03 0x42 0x61 0x63 0x6B 0x67 0x72 // '??Backgr' 0x6F 0x75 0x6E 0x64 0x0D 0x0A 0x56 0x61 // 'ound??Va' 0x6C 0x65 0x6E 0x74 0x69 0x6E 0x65 0x20 // 'lentine ' 0x77 0x61 0x73 0x20 0x62 0x6F 0x72 0x6E // 'was born' 0x20 0x33 0x32 0x20 0x79 0x65 0x61 0x72 // ' 32 year' 0x73 0x20 0x61 0x67 0x6F 0x20 0x69 0x6E // 's ago in' 0x20 0x46 0x72 0x61 0x6E 0x63 0x65 0x2E // ' France.' 0x0D 0x0A 0x41 0x64 0x76 0x65 0x6E 0x74 // '??Advent' 0x75 0x72 0x65 0x73 0x0D 0x0A 0x52 0x61 // 'ures??Ra' 0x69 0x73 0x65 0x64 0x20 0x61 0x73 0x64 // 'ised asd' 0x20 0x3B 0x20 0x61 0x73 0x64 0x66 0x61 // ' ; asdfa' 0x3B 0x73 0x66 0x20 0x61 0x73 0x66 0x20 // ';sf asf ' 0x61 0x64 0x73 0x66 0x3B 0x61 0x73 0x64 // 'adsf;asd' 0x66 0x6A 0x20 0x20 0x61 0x73 0x64 0x20 // 'fj asd ' 0x66 0x6A 0x61 0x3B 0x73 0x64 0x66 0x6A // 'fja;sdfj' 0x61 0x73 0x3B 0x64 0x66 0x6A 0x20 0x61 // 'as;dfj a' 0x73 0x3B 0x20 0x66 0x6A 0x61 0x73 0x66 // 's; fjasf' 0x20 0x61 0x73 0x6A 0x20 0x66 0x20 0x20 // ' asj f ' 0x3B 0x61 0x73 0x0D 0x0A 0x64 0x66 0x61 // ';as??dfa' 0x73 0x66 0x61 0x73 0x64 0x66 0x73 0x61 // 'sfasdfsa' 0x64 0x6A 0x66 0x3B 0x6A 0x61 0x73 0x66 // 'djf;jasf' 0x3B 0x61 0x73 0x64 0x66 0x61 0x73 0x6A // ';asdfasj' 0x66 0x0D 0x0A 0x52 0x6F 0x6C 0x65 0x73 // 'f??Roles' 0x0D 0x0A 0x54 0x68 0x65 0x20 0x41 0x6E // '??The An' 0x6E 0x6F 0x79 0x69 0x6E 0x67 0x20 0x54 // 'noying T' 0x65 0x6E 0x61 0x6E 0x74 0x2C 0x20 0x54 // 'enant, T' 0x68 0x65 0x20 0x44 0x65 0x74 0x65 0x63 // 'he Detec' 0x74 0x69 0x76 0x65 0x2C 0x20 0x74 0x68 // 'tive, th' 0x65 0x20 0x56 0x6F 0x6F 0x64 0x6F 0x6F // 'e Voodoo' 0x20 0x4D 0x61 0x6E 0x2E 0x0D 0x0A 0x54 // ' Man.??T' 0x72 0x69 0x76 0x69 0x61 0x0D 0x0A 0x57 // 'rivia??W' 0x68 0x79 0x20 0x69 0x73 0x20 0x56 0x61 // 'hy is Va' 0x6C 0x65 0x6E 0x74 0x69 0x6E 0x65 0x20 // 'lentine ' 0x68 0x69 0x64 0x69 0x6E 0x67 0x20 0x62 // 'hiding b' 0x65 0x68 0x69 0x6E 0x64 0x20 0x68 0x69 // 'ehind hi' 0x73 0x20 0x63 0x6F 0x6C 0x6C 0x61 0x72 // 's collar' 0x3F 0x0D 0x0A 0x42 0x65 0x66 0x6F 0x72 // '???Befor' 0x65 0x20 0x68 0x69 0x73 0x20 0x62 0x69 // 'e his bi' 0x67 0x20 0x62 0x72 0x65 0x61 0x6B 0x20 // 'g break ' 0x69 0x6E 0x20 0x74 0x68 0x65 0x20 0x6D // 'in the m' 0x6F 0x76 0x69 0x65 0x20 0x62 0x75 0x73 // 'ovie bus' 0x69 0x6E 0x65 0x73 0x73 0x2C 0x20 0x56 // 'iness, V' 0x61 0x6C 0x65 0x6E 0x74 0x69 0x6E 0x65 // 'alentine' 0x20 0x6D 0x61 0x64 0x65 0x20 0x61 0x20 // ' made a ' 0x6C 0x69 0x76 0x69 0x6E 0x67 0x20 0x61 // 'living a' 0x63 0x74 0x69 0x6E 0x67 0x20 0x69 0x6E // 'cting in' 0x20 0x63 0x6F 0x6D 0x6D 0x65 0x72 0x63 // ' commerc' 0x69 0x61 0x6C 0x73 0x2E 0x20 0x20 0x54 // 'ials. T' 0x68 0x65 0x20 0x6D 0x6F 0x6E 0x65 0x79 // 'he money' 0x20 0x77 0x61 0x73 0x20 0x67 0x6F 0x6F // ' was goo' 0x64 0x2C 0x20 0x62 0x75 0x74 0x20 0x74 // 'd, but t' 0x68 0x65 0x20 0x66 0x6F 0x6F 0x64 0x20 // 'he food ' 0x68 0x65 0x20 0x68 0x61 0x64 0x20 0x74 // 'he had t' 0x6F 0x20 0x61 0x64 0x76 0x65 0x72 0x74 // 'o advert' 0x69 0x73 0x65 0x20 0x77 0x61 0x73 0x20 // 'ise was ' 0x74 0x6F 0x74 0x61 0x6C 0x6C 0x79 0x20 // 'totally ' 0x64 0x69 0x73 0x67 0x75 0x73 0x74 0x69 // 'disgusti' 0x6E 0x67 0x2D 0x2D 0x70 0x61 0x72 0x74 // 'ng--part' 0x69 0x63 0x75 0x6C 0x61 0x72 0x6C 0x79 // 'icularly' 0x20 0x74 0x68 0x65 0x20 0x6D 0x61 0x63 // ' the mac' 0x61 0x72 0x6F 0x6E 0x69 0x20 0x77 0x69 // 'aroni wi' 0x74 0x68 0x20 0x70 0x65 0x61 0x6E 0x75 // 'th peanu' 0x74 0x20 0x62 0x75 0x74 0x74 0x65 0x72 // 't butter' 0x20 0x73 0x61 0x75 0x63 0x65 0x2E 0x20 // ' sauce. ' 0x20 0x41 0x66 0x74 0x65 0x72 0x20 0x6F // ' After o' 0x6E 0x65 0x20 0x67 0x69 0x67 0x61 0x6E // 'ne gigan' 0x74 0x69 0x63 0x20 0x62 0x69 0x74 0x65 // 'tic bite' 0x2C 0x20 0x56 0x61 0x6C 0x65 0x6E 0x74 // ', Valent' 0x69 0x6E 0x65 0x20 0x64 0x65 0x76 0x65 // 'ine deve' 0x6C 0x6F 0x70 0x65 0x64 0x20 0x61 0x20 // 'loped a ' 0x66 0x61 0x63 0x69 0x61 0x6C 0x20 0x72 // 'facial r' 0x61 0x73 0x68 0x2E 0x20 0x20 0x48 0x65 // 'ash. He' 0x20 0x70 0x75 0x6C 0x6C 0x65 0x64 0x20 // ' pulled ' 0x75 0x70 0x20 0x68 0x69 0x73 0x20 0x63 // 'up his c' 0x6F 0x6C 0x6C 0x61 0x72 0x20 0x74 0x6F // 'ollar to' 0x20 0x68 0x69 0x64 0x65 0x20 0x68 0x69 // ' hide hi' 0x73 0x20 0x65 0x62 0x6D 0x61 0x72 0x72 // 's ebmarr' 0x61 0x73 0x73 0x6D 0x65 0x6E 0x74 0x2E // 'assment.' 0x20 0x20 0x53 0x75 0x64 0x64 0x65 0x6E // ' Sudden' 0x6C 0x79 0x20 0x74 0x68 0x65 0x20 0x64 // 'ly the d' 0x69 0x72 0x65 0x63 0x74 0x6F 0x72 0x20 // 'irector ' 0x73 0x63 0x72 0x65 0x61 0x6D 0x65 0x64 // 'screamed' 0x2C 0x20 0x22 0x46 0x41 0x42 0x55 0x4C // ', "FABUL' 0x4F 0x55 0x53 0x21 0x22 0x20 0x20 0x09 // 'OUS!" ?' 0x56 0x61 0x6C 0x65 0x6E 0x74 0x69 0x6E // 'Valentin' 0x65 0x20 0x6B 0x65 0x70 0x74 0x20 0x68 // 'e kept h' 0x69 0x73 0x20 0x63 0x6F 0x6C 0x6C 0x61 // 'is colla' 0x72 0x20 0x75 0x70 0x20 0x65 0x76 0x65 // 'r up eve' 0x72 0x20 0x73 0x69 0x6E 0x63 0x65 0x21 // 'r since!' ENDCHUNK SET _help_48544F50_1= 0x1 CHUNK('HTOP', _help_48544F50_1, "") BO OSK LONG 0xFFFFFFFF 0x0 0x0 0xFFFFFFFF 0x0 0x0 0x0 0xFFFFFFFF ENDCHUNK SET _help_cno++ SET _help_52545854_0=_help_cno CHUNK('RTXT', _help_cno, "") PARENT('HTOP', _help_48544F50_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD2 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_0=_help_cno CHUNK('GLMP', _help_cno, "") PARENT('RTXT', _help_52545854_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x19 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0A 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x25 0x00 0x00 0x01 // '????%???' 0x01 0x00 0x00 0x00 0x2F 0x00 0x00 0x01 // '????/???' 0x00 0x00 0x00 0x00 0x9E 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xA3 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0xDA 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xE0 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0A 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x25 0x00 0x00 0x03 // '????%???' 0x0A 0x00 0x00 0xFD 0x2F 0x00 0x00 0x03 // '???/???' 0x00 0x00 0x00 0x00 0x9E 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xA3 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0xA9 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0xB8 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0xBE 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0xC7 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0xCD 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0xD7 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0xDA 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xE0 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0xE2 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0x0C 0x01 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_0=_help_cno CHUNK('TEXT', _help_cno, "") PARENT('RTXT', _help_52545854_0, 0x0) BYTE 0x03 0x03 0x42 0x61 0x63 0x6B 0x67 0x72 // '??Backgr' 0x6F 0x75 0x6E 0x64 0x0D 0x0A 0x42 0x6F // 'ound??Bo' 0x72 0x6E 0x3A 0x20 0x20 0x46 0x72 0x61 // 'rn: Fra' 0x6E 0x63 0x65 0x20 0x20 0x41 0x67 0x65 // 'nce Age' 0x3A 0x20 0x20 0x33 0x32 0x0D 0x0A 0x41 // ': 32??A' 0x64 0x76 0x65 0x6E 0x74 0x75 0x72 0x65 // 'dventure' 0x73 0x0D 0x0A 0x52 0x61 0x69 0x73 0x65 // 's??Raise' 0x64 0x20 0x61 0x73 0x64 0x20 0x3B 0x20 // 'd asd ; ' 0x61 0x73 0x64 0x66 0x61 0x3B 0x73 0x66 // 'asdfa;sf' 0x20 0x61 0x73 0x66 0x20 0x61 0x64 0x73 // ' asf ads' 0x66 0x3B 0x61 0x73 0x64 0x66 0x6A 0x20 // 'f;asdfj ' 0x20 0x61 0x73 0x64 0x20 0x66 0x6A 0x61 // ' asd fja' 0x3B 0x73 0x64 0x66 0x6A 0x61 0x73 0x3B // ';sdfjas;' 0x64 0x66 0x6A 0x20 0x61 0x73 0x3B 0x20 // 'dfj as; ' 0x66 0x6A 0x61 0x73 0x66 0x20 0x61 0x73 // 'fjasf as' 0x6A 0x20 0x66 0x20 0x20 0x3B 0x61 0x73 // 'j f ;as' 0x0D 0x0A 0x64 0x66 0x61 0x73 0x66 0x61 // '??dfasfa' 0x73 0x64 0x66 0x73 0x61 0x64 0x6A 0x66 // 'sdfsadjf' 0x3B 0x6A 0x61 0x73 0x66 0x3B 0x61 0x73 // ';jasf;as' 0x64 0x66 0x61 0x73 0x6A 0x66 0x0D 0x0A // 'dfasjf??' 0x52 0x6F 0x6C 0x65 0x73 0x0D 0x0A 0x54 // 'Roles??T' 0x68 0x65 0x20 0x41 0x6E 0x6E 0x6F 0x79 // 'he Annoy' 0x69 0x6E 0x67 0x20 0x54 0x65 0x6E 0x61 // 'ing Tena' 0x6E 0x74 0x2C 0x20 0x74 0x68 0x65 0x20 // 'nt, the ' 0x44 0x65 0x74 0x65 0x63 0x74 0x69 0x76 // 'Detectiv' 0x65 0x2C 0x20 0x74 0x68 0x65 0x20 0x56 // 'e, the V' 0x6F 0x6F 0x64 0x6F 0x6F 0x20 0x4D 0x61 // 'oodoo Ma' 0x6E 0x2E 0x0D 0x0A 0x54 0x72 0x69 0x76 // 'n.??Triv' 0x69 0x61 0x0D 0x0A 0x57 0x68 0x79 0x20 // 'ia??Why ' 0x69 0x73 0x20 0x56 0x61 0x6C 0x65 0x6E // 'is Valen' 0x74 0x69 0x6E 0x65 0x20 0x68 0x69 0x64 // 'tine hid' 0x69 0x6E 0x67 0x20 0x62 0x65 0x68 0x69 // 'ing behi' 0x6E 0x64 0x20 0x68 0x69 0x73 0x20 0x63 // 'nd his c' 0x6F 0x6C 0x6C 0x61 0x72 0x3F 0x0D 0x0A // 'ollar???' ENDCHUNK ================================================ FILE: src/help/app.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ #undef __HELP_NAME #undef __HELP_SYMBOL #undef __HELP_PACK #undef __HELP_PACK2 #ifdef NO_HELP_NAMES #define __HELP_NAME(name) "" #else #define __HELP_NAME(name) name #endif #ifdef NO_HELP_SYMBOLS #define __HELP_SYMBOL(stuff) #else #define __HELP_SYMBOL(stuff) stuff #endif #ifdef PACK_HELP #define __HELP_PACK PACK #else #define __HELP_PACK #endif #ifdef HELP_SINGLE_CHUNK #define __HELP_PACK2 #else #define __HELP_PACK2 __HELP_PACK #endif SET _help_48544F50_0= ktpcQuerySave #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("Query to save on exit (Y/N)")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("Query to save on exit (Y/N)")) __HELP_PACK2 BO OSK LONG kgobQueryTopics kgobQuerySave 0x0 ktpcQuerySave 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) GST(0) ITEM "kgobQueryTopics" ITEM "ktpcQuerySave" ITEM "kgobQuerySave" ITEM "" ITEM "ktpcQuerySave" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) AG(4) ITEM LONG 0xC0000002 VAR LONG 'GOKD' _gobHelpSquishy 0xFFFFFFFF __HELP_SYMBOL( STN "_gobHelpSquishy" ) ITEM LONG 0x40000001 VAR BYTE 0x01 0xFF 0xFF 0xFF 0xFF // '?' ITEM LONG 0x40000001 VAR BYTE 0x02 0xFF 0xFF 0xFF 0xFF // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x10 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x11 0x00 0x00 0x01 // '????????' 0x01 0x05 0x00 0x00 0x29 0x00 0x00 0x01 // '????)???' 0x01 0x00 0x00 0x00 0x2B 0x00 0x00 0x01 // '????+???' 0x01 0x05 0x00 0x00 0x44 0x00 0x00 0x01 // '????D???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0F 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x40 // '???????@' 0x02 0x00 0x00 0x00 0x29 0x00 0x00 0x40 // '????)??@' 0x00 0x00 0x00 0x00 0x2B 0x00 0x00 0x40 // '????+??@' 0x03 0x00 0x00 0x00 0x44 0x00 0x00 0x40 // '????D??@' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x2B 0x00 0x00 0x80 // '????+??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x11 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0x2B 0x00 0x00 0xC0 // '????+??' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) BYTE 0x03 0x03 0x44 0x6F 0x20 0x79 0x6F 0x75 // '??Do you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F // ' want to' 0x3A 0x0D 0x0A 0x01 0x20 0x53 0x61 0x76 // ':??? Sav' 0x65 0x20 0x63 0x68 0x61 0x6E 0x67 0x65 // 'e change' 0x73 0x20 0x74 0x6F 0x20 0x7E 0x31 0x33 // 's to ~13' 0x31 0x37 0x3F 0x0D 0x0A 0x01 0x20 0x47 // '17???? G' 0x65 0x74 0x20 0x72 0x69 0x64 0x20 0x6F // 'et rid o' 0x66 0x20 0x74 0x68 0x65 0x20 0x63 0x68 // 'f the ch' 0x61 0x6E 0x67 0x65 0x73 0x3F // 'anges?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1= ktpcQuerySaveWithCancel #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("Query to save on exit (Y/N/C)")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("Query to save on exit (Y/N/C)")) __HELP_PACK2 BO OSK LONG kgobQueryTopics kgobQuerySaveWithCancel 0x0 ktpcQuerySave 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_5=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) GST(0) ITEM "kgobQueryTopics" ITEM "ktpcQuerySaveWithCancel" ITEM "kgobQuerySaveWithCancel" ITEM "" ITEM "ktpcQuerySave" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_5=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD6 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_5=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) AG(4) ITEM LONG 0xC0000003 VAR LONG 'GOKD' _gobHelpSquishy 0xFFFFFFFF __HELP_SYMBOL( STN "_gobHelpSquishy" ) ITEM LONG 0x40000001 VAR BYTE 0x01 0xFF 0xFF 0xFF 0xFF // '?' ITEM LONG 0x40000001 VAR BYTE 0x02 0xFF 0xFF 0xFF 0xFF // '?' ITEM LONG 0x40000001 VAR BYTE 0x03 0xFF 0xFF 0xFF 0xFF // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_5=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x14 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x11 0x00 0x00 0x01 // '????????' 0x01 0x05 0x00 0x00 0x29 0x00 0x00 0x01 // '????)???' 0x01 0x00 0x00 0x00 0x2B 0x00 0x00 0x01 // '????+???' 0x01 0x05 0x00 0x00 0x44 0x00 0x00 0x01 // '????D???' 0x01 0x00 0x00 0x00 0x46 0x00 0x00 0x01 // '????F???' 0x01 0x05 0x00 0x00 0x60 0x00 0x00 0x01 // '????`???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0F 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x40 // '???????@' 0x02 0x00 0x00 0x00 0x29 0x00 0x00 0x40 // '????)??@' 0x00 0x00 0x00 0x00 0x2B 0x00 0x00 0x40 // '????+??@' 0x03 0x00 0x00 0x00 0x44 0x00 0x00 0x40 // '????D??@' 0x00 0x00 0x00 0x00 0x46 0x00 0x00 0x40 // '????F??@' 0x04 0x00 0x00 0x00 0x60 0x00 0x00 0x40 // '????`??@' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x11 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0x2B 0x00 0x00 0xC0 // '????+??' 0x01 0x00 0x00 0x00 0x46 0x00 0x00 0xC0 // '????F??' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_5=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x03 0x03 0x44 0x6F 0x20 0x79 0x6F 0x75 // '??Do you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F // ' want to' 0x3A 0x0D 0x0A 0x01 0x20 0x53 0x61 0x76 // ':??? Sav' 0x65 0x20 0x63 0x68 0x61 0x6E 0x67 0x65 // 'e change' 0x73 0x20 0x74 0x6F 0x20 0x7E 0x31 0x33 // 's to ~13' 0x31 0x37 0x3F 0x0D 0x0A 0x01 0x20 0x47 // '17???? G' 0x65 0x74 0x20 0x72 0x69 0x64 0x20 0x6F // 'et rid o' 0x66 0x20 0x74 0x68 0x65 0x20 0x63 0x68 // 'f the ch' 0x61 0x6E 0x67 0x65 0x73 0x3F 0x0D 0x0A // 'anges???' 0x01 0x20 0x4B 0x65 0x65 0x70 0x20 0x77 // '? Keep w' 0x6F 0x72 0x6B 0x69 0x6E 0x67 0x97 0x73 // 'orkings' 0x61 0x76 0x65 0x20 0x6C 0x61 0x74 0x65 // 'ave late' 0x72 0x3F // 'r?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2= ktpcQuerySoundDelete #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2, __HELP_NAME("Query to delete a sound (Y/N)")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2, __HELP_NAME("Query to delete a sound (Y/N)")) __HELP_PACK2 BO OSK LONG kgobQueryTopics kgobQuerySoundDelete 0x0 ktpcQuerySoundDelete 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2, 0x0) GST(0) ITEM "kgobQueryTopics" ITEM "ktpcQuerySoundDelete" ITEM "kgobQuerySoundDelete" ITEM "" ITEM "ktpcQuerySoundDelete" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_3=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) AG(4) ITEM LONG 0xC0000002 VAR LONG 'GOKD' _gobHelpSquishy 0xFFFFFFFF __HELP_SYMBOL( STN "_gobHelpSquishy" ) ITEM LONG 0x40000001 VAR BYTE 0x01 0xFF 0xFF 0xFF 0xFF // '?' ITEM LONG 0x40000001 VAR BYTE 0x02 0xFF 0xFF 0xFF 0xFF // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_3=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0F 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x35 0x00 0x00 0x01 // '????5???' 0x01 0x05 0x00 0x00 0x3A 0x00 0x00 0x01 // '????:???' 0x01 0x00 0x00 0x00 0x3C 0x00 0x00 0x01 // '???????' 0x0A 0x00 0x00 0xFD 0x47 0x00 0x00 0x03 // '???G???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x63 0x6F 0x70 // '??To cop' 0x79 0x20 0x61 0x20 0x6D 0x6F 0x76 0x69 // 'y a movi' 0x65 0x20 0x61 0x6E 0x64 0x20 0x73 0x61 // 'e and sa' 0x76 0x65 0x20 0x69 0x74 0x20 0x75 0x6E // 've it un' 0x64 0x65 0x72 0x20 0x61 0x20 0x64 0x69 // 'der a di' 0x66 0x66 0x65 0x72 0x65 0x6E 0x74 0x20 // 'fferent ' 0x6E 0x61 0x6D 0x65 0x2C 0x20 0x63 0x6C // 'name, cl' 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 // 'ick the ' 0x50 0x6F 0x72 0x74 0x66 0x6F 0x6C 0x69 // 'Portfoli' 0x6F 0x2E // 'o.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_7= ktpcBasics07 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7, __HELP_NAME("CO) 2 Click save as")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7, __HELP_NAME("CO) 2 Click save as")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon3 kgobHowtoSequence kidPortsSaveAs kidPlayHelpSounds 0x0 0x0 0x57415645 kwavBasics07 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7, 0x0) GST(0) ITEM "kgobCalloutBalloon3" ITEM "ktpcBasics07" ITEM "kgobHowtoSequence" ITEM "kidPortsSaveAs" ITEM "kidPlayHelpSounds" ITEM "kwavBasics07" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7, 0x0) BYTE 0x01 0x00 0x03 0x03 0x56 0x00 0x00 0x00 // '????V???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_3=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x05 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0E 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0D 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x53 0x61 0x76 0x65 0x20 0x41 0x73 0x2E // 'Save As.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_8= ktpcBasics08 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8, __HELP_NAME("CO) 1 To see tool tip")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8, __HELP_NAME("CO) 1 To see tool tip")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xC8 0x57415645 kwavBasics08 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_11=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcBasics08" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavBasics08" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_11=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8, 0x0) BYTE 0x01 0x00 0x03 0x03 0xDD 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_11, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcBasics09 __HELP_SYMBOL( STN "ktpcBasics09" ) FREE ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_11=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_11, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x86 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x7B 0x00 0x00 0x40 // '????{??@' 0x01 0x00 0x00 0x00 0x86 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x7B 0x00 0x00 0x82 // '????{??' 0x00 0x00 0x00 0x00 0x7B 0x00 0x00 0xC0 // '????{??' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_11=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_11, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x73 0x65 0x65 // '??To see' 0x20 0x61 0x20 0x74 0x6F 0x6F 0x6C 0x20 // ' a tool ' 0x74 0x69 0x70 0x2C 0x20 0x6D 0x6F 0x76 // 'tip, mov' 0x65 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F // 'e the mo' 0x75 0x73 0x65 0x20 0x63 0x75 0x72 0x73 // 'use curs' 0x6F 0x72 0x20 0x6F 0x76 0x65 0x72 0x20 // 'or over ' 0x74 0x68 0x65 0x20 0x74 0x6F 0x6F 0x6C // 'the tool' 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E // ' you wan' 0x74 0x20 0x68 0x65 0x6C 0x70 0x20 0x6F // 't help o' 0x6E 0x2E 0x20 0x20 0x57 0x61 0x69 0x74 // 'n. Wait' 0x2E 0x2E 0x2E 0x61 0x20 0x62 0x72 0x69 // '...a bri' 0x65 0x66 0x20 0x64 0x65 0x73 0x63 0x72 // 'ef descr' 0x69 0x70 0x74 0x69 0x6F 0x6E 0x20 0x6F // 'iption o' 0x66 0x20 0x74 0x68 0x65 0x20 0x74 0x6F // 'f the to' 0x6F 0x6C 0x20 0x61 0x70 0x70 0x65 0x61 // 'ol appea' 0x72 0x73 0x2E 0x0D 0x0A 0x01 0x20 0x4D // 'rs.??? M' 0x6F 0x72 0x65 0x20 0x68 0x65 0x6C 0x70 // 'ore help' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_9= ktpcBasics09 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_9, __HELP_NAME("Tip: More help")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_9, __HELP_NAME("Tip: More help")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavBasics09 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_5=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_9, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcBasics09" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavBasics09" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_5=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_9, 0x0) BYTE 0x01 0x00 0x03 0x03 0x20 0x01 0x00 0x00 // '???? ???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) AG(4) FREE ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_5=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x02 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x8E 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x0E 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x1E 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x3B 0x00 0x00 0x80 // '????;??' 0x00 0x00 0x03 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x3B 0x00 0x00 0x82 // '????;??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_5=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x4D 0x6F 0x72 // '??? Mor' 0x65 0x20 0x68 0x65 0x6C 0x70 0x0D 0x0A // 'e help??' 0x54 0x6F 0x20 0x67 0x65 0x74 0x20 0x6D // 'To get m' 0x6F 0x72 0x65 0x20 0x68 0x65 0x6C 0x70 // 'ore help' 0x0D 0x0A 0x95 0x09 0x43 0x6C 0x69 0x63 // '???Clic' 0x6B 0x20 0x74 0x68 0x65 0x20 0x48 0x65 // 'k the He' 0x6C 0x70 0x20 0x4D 0x61 0x63 0x68 0x69 // 'lp Machi' 0x6E 0x65 0x2E 0x0D 0x0A 0x54 0x6F 0x20 // 'ne.??To ' 0x66 0x69 0x6E 0x64 0x20 0x6F 0x75 0x74 // 'find out' 0x20 0x6D 0x6F 0x72 0x65 0x20 0x61 0x62 // ' more ab' 0x6F 0x75 0x74 0x20 0x74 0x68 0x65 0x20 // 'out the ' 0x74 0x6F 0x6F 0x6C 0x73 0x2C 0x20 0x63 // 'tools, c' 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 // 'lick the' 0x20 0x54 0x6F 0x6F 0x6C 0x73 0x20 0x62 // ' Tools b' 0x75 0x74 0x74 0x6F 0x6E 0x20 0x61 0x74 // 'utton at' 0x20 0x74 0x68 0x65 0x20 0x74 0x6F 0x70 // ' the top' 0x20 0x6F 0x66 0x20 0x74 0x68 0x65 0x20 // ' of the ' 0x6D 0x61 0x63 0x68 0x69 0x6E 0x65 0x2E // 'machine.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_A= ktpcBasics0A #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_A, __HELP_NAME("CO) 1 To get help")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_A, __HELP_NAME("CO) 1 To get help")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon5 kgobHowtoSequence kidBook kidPlayHelpSounds 0x0 0x0 0x57415645 kwavBasics0A ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_A, 0x0) GST(0) ITEM "kgobCalloutBalloon5" ITEM "ktpcBasics0A" ITEM "kgobHowtoSequence" ITEM "kidBook" ITEM "kidPlayHelpSounds" ITEM "kwavBasics0A" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_A, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_3=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'GOKD' 0x16102 0xFFFFFFFF __HELP_SYMBOL( STN ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcBasics0B __HELP_SYMBOL( STN "ktpcBasics0B" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x09 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x30 0x00 0x00 0x01 // '????0???' 0x00 0x00 0x00 0x00 0x17 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x23 0x00 0x00 0x03 // '???#???' 0x00 0x00 0x00 0x00 0x26 0x00 0x00 0x40 // '????&??@' 0x02 0x00 0x00 0x00 0x30 0x00 0x00 0x40 // '????0??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x26 0x00 0x00 0x82 // '????&??' 0x00 0x00 0x00 0x00 0x26 0x00 0x00 0xC0 // '????&??' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x67 0x65 0x74 // '??To get' 0x20 0x68 0x65 0x6C 0x70 0x2C 0x20 0x63 // ' help, c' 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 // 'lick the' 0x20 0x48 0x65 0x6C 0x70 0x20 0x4D 0x61 // ' Help Ma' 0x63 0x68 0x69 0x6E 0x65 0x2E 0x0D 0x0A // 'chine.??' 0x01 0x20 0x54 0x6F 0x6F 0x6C 0x74 0x69 // '? Toolti' 0x70 0x73 // 'ps' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_B= ktpcBasics0B #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_B, __HELP_NAME("Tip: Tooltips")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_B, __HELP_NAME("Tip: Tooltips")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavBasics0B ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_10=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_B, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcBasics0B" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavBasics0B" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_10=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_B, 0x0) BYTE 0x01 0x00 0x03 0x03 0xDA 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_0=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_10, 0x0) AG(4) FREE ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_10=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_10, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x09 0x00 0x00 0x00 0x02 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x9B 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x0D 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x31 0x00 0x00 0x03 // '???1???' 0x00 0x00 0x00 0x00 0x33 0x00 0x00 0x80 // '????3??' 0x00 0x00 0x02 0x00 0x6C 0x00 0x00 0x80 // '????l??' 0x00 0x00 0x03 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x6C 0x00 0x00 0x82 // '????l??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_10=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_10, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x54 0x6F 0x6F // '??? Too' 0x6C 0x74 0x69 0x70 0x73 0x0D 0x0A 0x54 // 'ltips??T' 0x6F 0x20 0x67 0x65 0x74 0x20 0x61 0x20 // 'o get a ' 0x62 0x72 0x69 0x65 0x66 0x20 0x64 0x65 // 'brief de' 0x73 0x63 0x72 0x69 0x70 0x74 0x69 0x6F // 'scriptio' 0x6E 0x20 0x6F 0x66 0x20 0x61 0x20 0x74 // 'n of a t' 0x6F 0x6F 0x6C 0x0D 0x0A 0x95 0x09 0x4D // 'ool???M' 0x6F 0x76 0x65 0x20 0x74 0x68 0x65 0x20 // 'ove the ' 0x6D 0x6F 0x75 0x73 0x65 0x20 0x63 0x75 // 'mouse cu' 0x72 0x73 0x6F 0x72 0x20 0x6F 0x76 0x65 // 'rsor ove' 0x72 0x20 0x74 0x68 0x65 0x20 0x74 0x6F // 'r the to' 0x6F 0x6C 0x20 0x79 0x6F 0x75 0x20 0x77 // 'ol you w' 0x61 0x6E 0x74 0x20 0x68 0x65 0x6C 0x70 // 'ant help' 0x20 0x6F 0x6E 0x2E 0x0D 0x0A 0x57 0x61 // ' on.??Wa' 0x69 0x74 0x2E 0x2E 0x2E 0x61 0x20 0x62 // 'it...a b' 0x72 0x69 0x65 0x66 0x20 0x64 0x65 0x73 // 'rief des' 0x63 0x72 0x69 0x70 0x74 0x69 0x6F 0x6E // 'cription' 0x20 0x6F 0x66 0x20 0x74 0x68 0x65 0x20 // ' of the ' 0x74 0x6F 0x6F 0x6C 0x20 0x61 0x70 0x70 // 'tool app' 0x65 0x61 0x72 0x73 0x2E // 'ears.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_C= ktpcBasics0C #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_C, __HELP_NAME("CO) 1 To turn McZee's voice")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_C, __HELP_NAME("CO) 1 To turn McZee's voice")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon5 kgobHowtoSequence kidBook kidPlayHelpSounds 0x0 0x0 0x57415645 kwavBasics0C ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_C, 0x0) GST(0) ITEM "kgobCalloutBalloon5" ITEM "ktpcBasics0C" ITEM "kgobHowtoSequence" ITEM "kidBook" ITEM "kidPlayHelpSounds" ITEM "kwavBasics0C" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_C, 0x0) BYTE 0x01 0x00 0x03 0x03 0xBB 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x37 0x00 0x00 0x01 // '????7???' 0x00 0x00 0x00 0x00 0x2B 0x00 0x00 0x03 // '????+???' 0x0A 0x00 0x00 0xFD 0x37 0x00 0x00 0x03 // '???7???' 0x00 0x00 0x00 0x00 0x38 0x00 0x00 0x40 // '????8??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x74 0x75 0x72 // '??To tur' 0x6E 0x20 0x4D 0x63 0x5A 0x65 0x65 0x27 // 'n McZee'' 0x73 0x20 0x76 0x6F 0x69 0x63 0x65 0x20 // 's voice ' 0x6F 0x6E 0x20 0x6F 0x72 0x20 0x6F 0x66 // 'on or of' 0x66 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B // 'f, click' 0x20 0x74 0x68 0x65 0x20 0x48 0x65 0x6C // ' the Hel' 0x70 0x20 0x4D 0x61 0x63 0x68 0x69 0x6E // 'p Machin' 0x65 0x2E // 'e.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_D= ktpcBasics0D #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_D, __HELP_NAME("CO) 2 McZee's voice")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_D, __HELP_NAME("CO) 2 McZee's voice")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kgobHelpBookVoice kidPlayHelpSounds 0x0 0x0 0x57415645 kwavBasics0D ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_D, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcBasics0D" ITEM "kgobHowtoSequence" ITEM "kgobHelpBookVoice" ITEM "kidPlayHelpSounds" ITEM "kwavBasics0D" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_D, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x03 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x62 0x00 0x00 0x01 // '????b???' 0x00 0x00 0x00 0x00 0x62 0x00 0x00 0x40 // '????b??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x74 0x75 0x72 // '??To tur' 0x6E 0x20 0x4D 0x63 0x5A 0x65 0x65 0x27 // 'n McZee'' 0x73 0x20 0x76 0x6F 0x69 0x63 0x65 0x20 // 's voice ' 0x6F 0x66 0x66 0x2C 0x20 0x63 0x6C 0x69 // 'off, cli' 0x63 0x6B 0x20 0x74 0x68 0x69 0x73 0x20 // 'ck this ' 0x62 0x75 0x74 0x74 0x6F 0x6E 0x2E 0x20 // 'button. ' 0x20 0x54 0x6F 0x20 0x74 0x75 0x72 0x6E // ' To turn' 0x20 0x68 0x69 0x73 0x20 0x76 0x6F 0x69 // ' his voi' 0x63 0x65 0x20 0x6F 0x6E 0x20 0x61 0x67 // 'ce on ag' 0x61 0x69 0x6E 0x2C 0x20 0x63 0x6C 0x69 // 'ain, cli' 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 0x62 // 'ck the b' 0x75 0x74 0x74 0x6F 0x6E 0x20 0x61 0x67 // 'utton ag' 0x61 0x69 0x6E 0x2E // 'ain.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_E= ktpcBasics0E #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_E, __HELP_NAME("CO) 1 To go")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_E, __HELP_NAME("CO) 1 To go")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon5 kgobHowtoSequence kidMap kidPlayHelpSounds 0x0 0x0 0x57415645 kwavBasics0E ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_E, 0x0) GST(0) ITEM "kgobCalloutBalloon5" ITEM "ktpcBasics0E" ITEM "kgobHowtoSequence" ITEM "kidMap" ITEM "kidPlayHelpSounds" ITEM "kwavBasics0E" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_E, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD6 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x64 0x00 0x00 0x01 // '????d???' 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0x03 // '????@???' 0x0A 0x00 0x00 0xFD 0x43 0x00 0x00 0x03 // '???C???' 0x00 0x00 0x00 0x00 0x64 0x00 0x00 0x40 // '????d??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x71 0x75 0x69 // '??To qui' 0x63 0x6B 0x6C 0x79 0x20 0x7A 0x69 0x70 // 'ckly zip' 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 // ' to the ' 0x72 0x6F 0x6F 0x6D 0x20 0x6F 0x72 0x20 // 'room or ' 0x70 0x72 0x6F 0x6A 0x65 0x63 0x74 0x20 // 'project ' 0x6F 0x66 0x20 0x79 0x6F 0x75 0x72 0x20 // 'of your ' 0x63 0x68 0x6F 0x69 0x63 0x65 0x2C 0x20 // 'choice, ' 0x63 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 // 'click th' 0x65 0x20 0x4D 0x61 0x70 0x20 0x74 0x68 // 'e Map th' 0x65 0x6E 0x20 0x63 0x6C 0x69 0x63 0x6B // 'en click' 0x20 0x77 0x68 0x65 0x72 0x65 0x20 0x79 // ' where y' 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 // 'ou want ' 0x74 0x6F 0x20 0x67 0x6F 0x2E // 'to go.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_F= ktpcBasics0F #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_F, __HELP_NAME("CO) 1 To quit")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_F, __HELP_NAME("CO) 1 To quit")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon5 kgobHowtoSequence kidExit kidPlayHelpSounds 0x0 0x0 0x57415645 kwavBasics0F ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_7=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_F, 0x0) GST(0) ITEM "kgobCalloutBalloon5" ITEM "ktpcBasics0F" ITEM "kgobHowtoSequence" ITEM "kidExit" ITEM "kidPlayHelpSounds" ITEM "kwavBasics0F" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_7=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x6F 0x00 0x00 0x00 // '????o???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_7=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0E 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x10 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x15 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x10 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x14 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x15 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_7=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x71 0x75 0x69 // '??To qui' 0x74 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B // 't, click' 0x20 0x20 0x45 0x78 0x69 0x74 0x2E // ' Exit.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_10= ktpcBasics10 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_10, __HELP_NAME("CO) 3 Click Close")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_10, __HELP_NAME("CO) 3 Click Close")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kgobHelpBookCancel kidPlayHelpSounds 0x0 0x0 0x57415645 kwavBasics10 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_10, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcBasics10" ITEM "kgobHowtoSequence" ITEM "kgobHelpBookCancel" ITEM "kidPlayHelpSounds" ITEM "kwavBasics10" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_10, 0x0) BYTE 0x01 0x00 0x03 0x03 0x7E 0x00 0x00 0x00 // '????~???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x27 0x00 0x00 0x01 // '????'???' 0x00 0x00 0x00 0x00 0x21 0x00 0x00 0x03 // '????!???' 0x0A 0x00 0x00 0xFD 0x26 0x00 0x00 0x03 // '???&???' 0x00 0x00 0x00 0x00 0x27 0x00 0x00 0x40 // '????'??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x63 0x6C 0x6F // '??To clo' 0x73 0x65 0x20 0x74 0x68 0x65 0x20 0x48 // 'se the H' 0x65 0x6C 0x70 0x20 0x4D 0x61 0x63 0x68 // 'elp Mach' 0x69 0x6E 0x65 0x2C 0x20 0x63 0x6C 0x69 // 'ine, cli' 0x63 0x6B 0x20 0x43 0x6C 0x6F 0x73 0x65 // 'ck Close' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK ================================================ FILE: src/help/bio.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ #undef __HELP_NAME #undef __HELP_SYMBOL #undef __HELP_PACK #undef __HELP_PACK2 #ifdef NO_HELP_NAMES #define __HELP_NAME(name) "" #else #define __HELP_NAME(name) name #endif #ifdef NO_HELP_SYMBOLS #define __HELP_SYMBOL(stuff) #else #define __HELP_SYMBOL(stuff) stuff #endif #ifdef PACK_HELP #define __HELP_PACK PACK #else #define __HELP_PACK #endif #ifdef HELP_SINGLE_CHUNK #define __HELP_PACK2 #else #define __HELP_PACK2 __HELP_PACK #endif SET _help_48544F50_0= ktpcBioPage1 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("Bio Page : Table of Contents")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("Bio Page : Table of Contents")) __HELP_PACK2 BO OSK LONG kgobBlankBalloon kgobBlankBalloon 0x0 kidBioTipScript 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_86=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) GST(0) ITEM "kgobBlankBalloon" ITEM "ktpcBioPage1" ITEM "kgobBlankBalloon" ITEM "" ITEM "kidBioTipScript" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_86=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_86=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_86, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0E 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x10 0x00 0x16 0x00 0x00 0x01 // '????????' 0x03 0x00 0x0A 0x00 0x18 0x00 0x00 0x01 // '????????' 0x01 0x00 0x0A 0x00 0x38 0x00 0x00 0x01 // '????8???' 0x01 0x00 0x01 0x00 0x36 0x01 0x00 0x01 // '????6???' 0x00 0x00 0x00 0x00 0x16 0x00 0x00 0x03 // '????????' 0x24 0x00 0x00 0xFD 0x18 0x00 0x00 0x03 // '$??????' 0x0A 0x00 0x00 0xFD 0x38 0x00 0x00 0x03 // '???8???' 0x00 0x00 0x00 0x00 0x36 0x01 0x00 0x40 // '????6??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0xCF 0x00 0x00 0x02 0x16 0x00 0x00 0x80 // '??????' 0xBD 0x00 0x00 0x02 0x38 0x00 0x00 0x80 // '???8??' 0xBD 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '??????' 0x05 0x00 0x00 0x00 0x38 0x00 0x00 0x82 // '????8??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_86=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_86, 0x0) BYTE 0x03 0x03 0x4D 0x63 0x5A 0x65 0x65 0x27 // '??McZee'' 0x73 0x20 0x54 0x61 0x6C 0x65 0x6E 0x74 // 's Talent' 0x20 0x42 0x6F 0x6F 0x6B 0x20 0x0D 0x0A // ' Book ??' 0x20 0x20 0x59 0x6F 0x75 0x72 0x20 0x4D // ' Your M' 0x69 0x73 0x73 0x69 0x6F 0x6E 0x3A 0x20 // 'ission: ' 0x20 0x46 0x69 0x6E 0x64 0x20 0x74 0x68 // ' Find th' 0x65 0x20 0x70 0x61 0x67 0x65 0x73 0x21 // 'e pages!' 0x0D 0x0A 0x41 0x63 0x74 0x6F 0x72 0x73 // '??Actors' 0x27 0x20 0x72 0xE9 0x73 0x75 0x6D 0xE9 // '' rsum' 0x73 0x20 0x61 0x72 0x65 0x20 0x73 0x63 // 's are sc' 0x61 0x74 0x74 0x65 0x72 0x65 0x64 0x20 // 'attered ' 0x74 0x68 0x72 0x6F 0x75 0x67 0x68 0x6F // 'througho' 0x75 0x74 0x20 0x74 0x68 0x65 0x20 0x62 // 'ut the b' 0x75 0x69 0x6C 0x64 0x69 0x6E 0x67 0x21 // 'uilding!' 0x20 0x20 0x48 0x65 0x6C 0x70 0x20 0x6D // ' Help m' 0x65 0x20 0x66 0x69 0x6E 0x64 0x20 0x74 // 'e find t' 0x68 0x65 0x6D 0x21 0x0D 0x0A 0x0D 0x0A // 'hem!????' 0x54 0x6F 0x20 0x66 0x69 0x6E 0x64 0x20 // 'To find ' 0x74 0x68 0x65 0x20 0x70 0x61 0x67 0x65 // 'the page' 0x73 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B // 's, click' 0x20 0x74 0x68 0x69 0x6E 0x67 0x73 0x20 // ' things ' 0x69 0x6E 0x20 0x74 0x68 0x65 0x20 0x62 // 'in the b' 0x75 0x69 0x6C 0x64 0x69 0x6E 0x67 0x2E // 'uilding.' 0x20 0x20 0x4F 0x6E 0x63 0x65 0x20 0x79 // ' Once y' 0x6F 0x75 0x27 0x76 0x65 0x20 0x72 0x65 // 'ou've re' 0x61 0x64 0x20 0x74 0x68 0x65 0x20 0x70 // 'ad the p' 0x61 0x67 0x65 0x20 0x61 0x6E 0x64 0x20 // 'age and ' 0x63 0x6C 0x6F 0x73 0x65 0x64 0x20 0x69 // 'closed i' 0x74 0x2C 0x20 0x49 0x27 0x6C 0x6C 0x20 // 't, I'll ' 0x70 0x75 0x74 0x20 0x74 0x68 0x65 0x20 // 'put the ' 0x70 0x61 0x67 0x65 0x20 0x69 0x6E 0x20 // 'page in ' 0x74 0x68 0x65 0x20 0x54 0x61 0x6C 0x65 // 'the Tale' 0x6E 0x74 0x20 0x62 0x6F 0x6F 0x6B 0x2E // 'nt book.' 0x20 0x20 0x59 0x6F 0x75 0x27 0x6C 0x6C // ' You'll' 0x20 0x66 0x69 0x6E 0x64 0x20 0x74 0x68 // ' find th' 0x65 0x20 0x54 0x61 0x6C 0x65 0x6E 0x74 // 'e Talent' 0x20 0x62 0x6F 0x6F 0x6B 0x20 0x69 0x6E // ' book in' 0x20 0x74 0x68 0x65 0x20 0x49 0x64 0x65 // ' the Ide' 0x61 0x73 0x20 0x52 0x6F 0x6F 0x6D 0x2E // 'as Room.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1= ktpcBioPage2 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("Bio Page 2 Alexander")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("Bio Page 2 Alexander")) __HELP_PACK2 BO OSK LONG kgobBlankBalloon kgobBlankBalloon 0x0 kidBioTipScript 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) GST(0) ITEM "kgobBlankBalloon" ITEM "ktpcBioPage2" ITEM "kgobBlankBalloon" ITEM "" ITEM "kidBioTipScript" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_12=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktipbio1 __HELP_SYMBOL( STN "ktipbio1" ) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktipbio2 __HELP_SYMBOL( STN "ktipbio2" ) FREE ITEM LONG 0x40000001 VAR BYTE 4 LONG ktipbio4 __HELP_SYMBOL( STN "ktipbio4" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktipbio3 __HELP_SYMBOL( STN "ktipbio3" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_2=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x23 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '#???????' 0x01 0x00 0x00 0x00 0x16 0x00 0x00 0x01 // '????????' 0x01 0x00 0x03 0x00 0x18 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xF7 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0xF9 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0x04 0x01 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x01 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x26 0x01 0x00 0x01 // '????&???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x0B 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x16 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0xF9 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x04 0x01 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x26 0x01 0x00 0x03 // '????&???' 0x00 0x00 0x00 0x00 0x74 0x00 0x00 0x04 // '????t???' 0x0D 0x00 0x00 0xFE 0x85 0x00 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0x06 0x01 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x0F 0x01 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x11 0x01 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x1C 0x01 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x1E 0x01 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x26 0x01 0x00 0x04 // '???&???' 0x00 0x00 0x00 0x00 0x74 0x00 0x00 0x40 // '????t??@' 0x01 0x00 0x00 0x00 0x85 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x06 0x01 0x00 0x40 // '???????@' 0x02 0x00 0x00 0x00 0x0F 0x01 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x11 0x01 0x00 0x40 // '???????@' 0x05 0x00 0x00 0x00 0x1C 0x01 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x1E 0x01 0x00 0x40 // '???????@' 0x04 0x00 0x00 0x00 0x26 0x01 0x00 0x40 // '????&??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0xF7 0xFF 0x00 0x02 0x0B 0x00 0x00 0x80 // '?????' 0xBD 0x00 0x00 0x00 0x18 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x06 0x01 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) BYTE 0x03 0x03 0x41 0x4C 0x45 0x58 0x41 0x4E // '??ALEXAN' 0x44 0x45 0x52 0x0D 0x0A 0x42 0x61 0x63 // 'DER??Bac' 0x6B 0x67 0x72 0x6F 0x75 0x6E 0x64 0x20 // 'kground ' 0x0D 0x0A 0x41 0x6C 0x65 0x78 0x61 0x6E // '??Alexan' 0x64 0x65 0x72 0x20 0x77 0x61 0x73 0x20 // 'der was ' 0x61 0x20 0x66 0x61 0x6D 0x6F 0x75 0x73 // 'a famous' 0x20 0x73 0x69 0x6E 0x67 0x65 0x72 0x20 // ' singer ' 0x69 0x6E 0x20 0x48 0x6F 0x6C 0x6C 0x61 // 'in Holla' 0x6E 0x64 0x2C 0x20 0x6B 0x6E 0x6F 0x77 // 'nd, know' 0x6E 0x20 0x66 0x6F 0x72 0x20 0x68 0x69 // 'n for hi' 0x73 0x20 0x72 0x65 0x6D 0x61 0x6B 0x65 // 's remake' 0x73 0x20 0x6F 0x66 0x20 0x56 0x69 0x6C // 's of Vil' 0x6C 0x61 0x67 0x65 0x20 0x50 0x65 0x6F // 'lage Peo' 0x70 0x6C 0x65 0x20 0x74 0x75 0x6E 0x65 // 'ple tune' 0x73 0x20 0x61 0x6E 0x64 0x20 0x66 0x61 // 's and fa' 0x6E 0x63 0x79 0x20 0x64 0x61 0x6E 0x63 // 'ncy danc' 0x65 0x20 0x73 0x74 0x65 0x70 0x73 0x2E // 'e steps.' 0x20 0x20 0x48 0x65 0x20 0x77 0x61 0x73 // ' He was' 0x20 0x6F 0x66 0x74 0x65 0x6E 0x20 0x6F // ' often o' 0x6E 0x20 0x74 0x65 0x6C 0x65 0x76 0x69 // 'n televi' 0x73 0x69 0x6F 0x6E 0x20 0x61 0x6E 0x64 // 'sion and' 0x20 0x77 0x6F 0x6E 0x20 0x73 0x65 0x76 // ' won sev' 0x65 0x72 0x61 0x6C 0x20 0x45 0x75 0x72 // 'eral Eur' 0x6F 0x70 0x65 0x61 0x6E 0x20 0x6D 0x75 // 'opean mu' 0x73 0x69 0x63 0x20 0x63 0x6F 0x6D 0x70 // 'sic comp' 0x65 0x74 0x69 0x74 0x69 0x6F 0x6E 0x73 // 'etitions' 0x2C 0x20 0x6D 0x61 0x6B 0x69 0x6E 0x67 // ', making' 0x20 0x68 0x69 0x6D 0x20 0x61 0x20 0x6D // ' him a m' 0x75 0x73 0x69 0x63 0x20 0x68 0x65 0x72 // 'usic her' 0x6F 0x20 0x69 0x6E 0x20 0x68 0x69 0x73 // 'o in his' 0x20 0x63 0x6F 0x75 0x6E 0x74 0x72 0x79 // ' country' 0x2E 0x0D 0x0A 0x44 0x72 0x65 0x61 0x6D // '.??Dream' 0x20 0x52 0x6F 0x6C 0x65 0x73 0x0D 0x0A // ' Roles??' 0x4C 0x69 0x62 0x72 0x61 0x72 0x69 0x61 // 'Libraria' 0x6E 0x3B 0x20 0x46 0x6F 0x6F 0x64 0x20 // 'n; Food ' 0x43 0x72 0x69 0x74 0x69 0x63 0x3B 0x20 // 'Critic; ' 0x45 0x78 0x70 0x6C 0x6F 0x72 0x65 0x72 // 'Explorer' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2= ktpcBioPage3 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2, __HELP_NAME("Bio Page 3 Augustin")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2, __HELP_NAME("Bio Page 3 Augustin")) __HELP_PACK2 BO OSK LONG kgobBlankBalloon kgobBlankBalloon 0x0 kidBioTipScript 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_D2=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2, 0x0) GST(0) ITEM "kgobBlankBalloon" ITEM "ktpcBioPage3" ITEM "kgobBlankBalloon" ITEM "" ITEM "kidBioTipScript" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_D2=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_26=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D2, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktipbio6 __HELP_SYMBOL( STN "ktipbio6" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktipbio7 __HELP_SYMBOL( STN "ktipbio7" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktipbio8 __HELP_SYMBOL( STN "ktipbio8" ) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktipbio5 __HELP_SYMBOL( STN "ktipbio5" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_D2=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D2, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x24 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '$???????' 0x01 0x00 0x00 0x00 0x15 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x17 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xC7 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0xC8 0x01 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xD2 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0xD4 0x01 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xDF 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0xE1 0x01 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0x09 0x02 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x0A 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x15 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0xD4 0x01 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xDF 0x01 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0xC8 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xD1 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xE1 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xED 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xEF 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xF2 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xF4 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0x09 0x02 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0xC8 0x01 0x00 0x40 // '??????@' 0x05 0x00 0x00 0x00 0xD1 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xE1 0x01 0x00 0x40 // '??????@' 0x01 0x00 0x00 0x00 0xED 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xEF 0x01 0x00 0x40 // '??????@' 0x02 0x00 0x00 0x00 0xF2 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xF4 0x01 0x00 0x40 // '??????@' 0x03 0x00 0x00 0x00 0x09 0x02 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0xF7 0xFF 0x00 0x02 0x0A 0x00 0x00 0x80 // '?????' 0xBD 0x00 0x00 0x00 0x17 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xE1 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_D2=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D2, 0x0) BYTE 0x03 0x03 0x41 0x55 0x47 0x55 0x53 0x54 // '??AUGUST' 0x49 0x4E 0x0D 0x0A 0x42 0x61 0x63 0x6B // 'IN??Back' 0x67 0x72 0x6F 0x75 0x6E 0x64 0x20 0x0D // 'ground ?' 0x0A 0x41 0x75 0x67 0x75 0x73 0x74 0x69 // '?Augusti' 0x6E 0x20 0x65 0x6D 0x65 0x72 0x67 0x65 // 'n emerge' 0x64 0x20 0x66 0x72 0x6F 0x6D 0x20 0x61 // 'd from a' 0x20 0x64 0x75 0x73 0x74 0x79 0x20 0x74 // ' dusty t' 0x69 0x6D 0x65 0x20 0x63 0x61 0x70 0x73 // 'ime caps' 0x75 0x6C 0x65 0x20 0x34 0x32 0x20 0x79 // 'ule 42 y' 0x65 0x61 0x72 0x73 0x20 0x61 0x67 0x6F // 'ears ago' 0x2E 0x20 0x48 0x65 0x27 0x73 0x20 0x6F // '. He's o' 0x72 0x69 0x67 0x69 0x6E 0x61 0x6C 0x6C // 'riginall' 0x79 0x20 0x66 0x72 0x6F 0x6D 0x20 0x61 // 'y from a' 0x6E 0x63 0x69 0x65 0x6E 0x74 0x20 0x52 // 'ncient R' 0x6F 0x6D 0x65 0x2C 0x20 0x77 0x68 0x65 // 'ome, whe' 0x72 0x65 0x20 0x68 0x65 0x20 0x73 0x61 // 're he sa' 0x6E 0x67 0x20 0x69 0x6E 0x20 0x74 0x68 // 'ng in th' 0x65 0x20 0x63 0x6F 0x75 0x72 0x74 0x20 // 'e court ' 0x6F 0x66 0x20 0x65 0x6D 0x70 0x65 0x72 // 'of emper' 0x6F 0x72 0x73 0x2E 0x20 0x42 0x75 0x74 // 'ors. But' 0x20 0x74 0x68 0x65 0x6E 0x20 0x61 0x6E // ' then an' 0x6F 0x74 0x68 0x65 0x72 0x20 0x77 0x61 // 'other wa' 0x72 0x20 0x73 0x74 0x61 0x72 0x74 0x65 // 'r starte' 0x64 0x2C 0x20 0x73 0x6F 0x20 0x68 0x65 // 'd, so he' 0x20 0x74 0x6F 0x6F 0x6B 0x20 0x64 0x65 // ' took de' 0x65 0x70 0x20 0x62 0x72 0x65 0x61 0x74 // 'ep breat' 0x68 0x73 0x20 0x75 0x6E 0x74 0x69 0x6C // 'hs until' 0x20 0x68 0x65 0x20 0x73 0x68 0x72 0x75 // ' he shru' 0x6E 0x6B 0x20 0x73 0x6F 0x20 0x73 0x6D // 'nk so sm' 0x61 0x6C 0x6C 0x20 0x74 0x68 0x61 0x74 // 'all that' 0x20 0x68 0x65 0x20 0x63 0x6F 0x75 0x6C // ' he coul' 0x64 0x20 0x63 0x72 0x61 0x77 0x6C 0x20 // 'd crawl ' 0x69 0x6E 0x74 0x6F 0x20 0x61 0x20 0x6A // 'into a j' 0x61 0x72 0x2E 0x20 0x0D 0x0A 0x43 0x65 // 'ar. ??Ce' 0x6E 0x74 0x75 0x72 0x69 0x65 0x73 0x20 // 'nturies ' 0x6C 0x61 0x74 0x65 0x72 0x2C 0x20 0x61 // 'later, a' 0x20 0x6C 0x69 0x74 0x74 0x6C 0x65 0x20 // ' little ' 0x49 0x74 0x61 0x6C 0x69 0x61 0x6E 0x20 // 'Italian ' 0x6B 0x69 0x64 0x20 0x61 0x63 0x63 0x69 // 'kid acci' 0x64 0x65 0x6E 0x74 0x61 0x6C 0x6C 0x79 // 'dentally' 0x20 0x64 0x75 0x67 0x20 0x75 0x70 0x20 // ' dug up ' 0x74 0x68 0x65 0x20 0x6A 0x61 0x72 0x2E // 'the jar.' 0x20 0x20 0x49 0x74 0x20 0x74 0x6F 0x6F // ' It too' 0x6B 0x20 0x41 0x75 0x67 0x75 0x73 0x74 // 'k August' 0x69 0x6E 0x20 0x61 0x77 0x68 0x69 0x6C // 'in awhil' 0x65 0x20 0x74 0x6F 0x20 0x61 0x64 0x6A // 'e to adj' 0x75 0x73 0x74 0x20 0x74 0x6F 0x20 0x74 // 'ust to t' 0x68 0x65 0x20 0x6D 0x6F 0x64 0x65 0x72 // 'he moder' 0x6E 0x20 0x77 0x6F 0x72 0x6C 0x64 0x2D // 'n world-' 0x2D 0x65 0x73 0x70 0x65 0x63 0x69 0x61 // '-especia' 0x6C 0x6C 0x79 0x20 0x54 0x56 0x2E 0x20 // 'lly TV. ' 0x20 0x45 0x76 0x65 0x6E 0x74 0x75 0x61 // ' Eventua' 0x6C 0x6C 0x79 0x20 0x41 0x75 0x67 0x75 // 'lly Augu' 0x73 0x74 0x69 0x6E 0x20 0x67 0x6F 0x74 // 'stin got' 0x20 0x61 0x20 0x6A 0x6F 0x62 0x20 0x64 // ' a job d' 0x65 0x6C 0x69 0x76 0x65 0x72 0x69 0x6E // 'eliverin' 0x67 0x20 0x73 0x69 0x6E 0x67 0x69 0x6E // 'g singin' 0x67 0x20 0x74 0x65 0x6C 0x65 0x67 0x72 // 'g telegr' 0x61 0x6D 0x73 0x2E 0x0D 0x0A 0x44 0x72 // 'ams.??Dr' 0x65 0x61 0x6D 0x20 0x52 0x6F 0x6C 0x65 // 'eam Role' 0x73 0x0D 0x0A 0x4F 0x70 0x65 0x72 0x61 // 's??Opera' 0x20 0x53 0x69 0x6E 0x67 0x65 0x72 0x3B // ' Singer;' 0x20 0x43 0x6F 0x70 0x3B 0x20 0x48 0x6F // ' Cop; Ho' 0x6D 0x65 0x20 0x53 0x61 0x66 0x65 0x74 // 'me Safet' 0x79 0x20 0x49 0x6E 0x73 0x70 0x65 0x63 // 'y Inspec' 0x74 0x6F 0x72 // 'tor' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3= ktpcBioPage4 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3, __HELP_NAME("Bio Page 4 Bella")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3, __HELP_NAME("Bio Page 4 Bella")) __HELP_PACK2 BO OSK LONG kgobBlankBalloon kgobBlankBalloon 0x0 kidBioTipScript 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_AE=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3, 0x0) GST(0) ITEM "kgobBlankBalloon" ITEM "ktpcBioPage4" ITEM "kgobBlankBalloon" ITEM "" ITEM "kidBioTipScript" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_AE=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_17=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_AE, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktipbio9 __HELP_SYMBOL( STN "ktipbio9" ) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktipbio10 __HELP_SYMBOL( STN "ktipbio10" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktipbio11 __HELP_SYMBOL( STN "ktipbio11" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktipbio12 __HELP_SYMBOL( STN "ktipbio12" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_AE=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_AE, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x1D 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xE7 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x07 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x11 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0x13 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0xAB 0x01 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xB6 0x01 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x44 0x01 0x00 0x04 // '????D???' 0x0D 0x00 0x00 0xFE 0x4A 0x01 0x00 0x04 // '???J???' 0x00 0x00 0x00 0x00 0xB8 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xC5 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xC7 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xDE 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xE0 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xE7 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0x44 0x01 0x00 0x40 // '????D??@' 0x01 0x00 0x00 0x00 0x4A 0x01 0x00 0x40 // '????J??@' 0x00 0x00 0x00 0x00 0xB8 0x01 0x00 0x40 // '??????@' 0x02 0x00 0x00 0x00 0xC5 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xC7 0x01 0x00 0x40 // '??????@' 0x03 0x00 0x00 0x00 0xDE 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xE0 0x01 0x00 0x40 // '??????@' 0x04 0x00 0x00 0x00 0xE7 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0xF7 0xFF 0x00 0x02 0x07 0x00 0x00 0x80 // '?????' 0xBD 0x00 0x00 0x00 0xAB 0x01 0x00 0x80 // '?????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xB8 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_AE=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_AE, 0x0) BYTE 0x03 0x03 0x42 0x45 0x4C 0x4C 0x41 0x0D // '??BELLA?' 0x0A 0x42 0x61 0x63 0x6B 0x67 0x72 0x6F // '?Backgro' 0x75 0x6E 0x64 0x0D 0x0A 0x42 0x65 0x6C // 'und??Bel' 0x6C 0x61 0x20 0x69 0x73 0x20 0x61 0x20 // 'la is a ' 0x6D 0x61 0x74 0x68 0x20 0x74 0x65 0x61 // 'math tea' 0x63 0x68 0x65 0x72 0x2E 0x20 0x41 0x74 // 'cher. At' 0x20 0x73 0x63 0x68 0x6F 0x6F 0x6C 0x2C // ' school,' 0x20 0x73 0x68 0x65 0x20 0x69 0x73 0x20 // ' she is ' 0x61 0x6C 0x77 0x61 0x79 0x73 0x20 0x6A // 'always j' 0x75 0x73 0x74 0x20 0x73 0x6F 0x97 0x73 // 'ust sos' 0x68 0x65 0x20 0x73 0x6D 0x69 0x6C 0x65 // 'he smile' 0x73 0x20 0x70 0x6F 0x6C 0x69 0x74 0x65 // 's polite' 0x6C 0x79 0x2C 0x20 0x73 0x70 0x65 0x61 // 'ly, spea' 0x6B 0x73 0x20 0x70 0x6F 0x6C 0x69 0x74 // 'ks polit' 0x65 0x6C 0x79 0x2C 0x20 0x61 0x6E 0x64 // 'ely, and' 0x20 0x74 0x65 0x61 0x63 0x68 0x65 0x73 // ' teaches' 0x20 0x6A 0x75 0x73 0x74 0x20 0x74 0x68 // ' just th' 0x65 0x20 0x72 0x69 0x67 0x68 0x74 0x20 // 'e right ' 0x74 0x68 0x69 0x6E 0x67 0x73 0x20 0x69 // 'things i' 0x6E 0x20 0x6A 0x75 0x73 0x74 0x20 0x74 // 'n just t' 0x68 0x65 0x20 0x72 0x69 0x67 0x68 0x74 // 'he right' 0x20 0x77 0x61 0x79 0x2E 0x20 0x42 0x75 // ' way. Bu' 0x74 0x20 0x61 0x77 0x61 0x79 0x20 0x66 // 't away f' 0x72 0x6F 0x6D 0x20 0x73 0x63 0x68 0x6F // 'rom scho' 0x6F 0x6C 0x2C 0x20 0x42 0x65 0x6C 0x6C // 'ol, Bell' 0x61 0x20 0x69 0x73 0x20 0x64 0x69 0x66 // 'a is dif' 0x66 0x65 0x72 0x65 0x6E 0x74 0x2E 0x20 // 'ferent. ' 0x53 0x68 0x65 0x20 0x64 0x6F 0x65 0x73 // 'She does' 0x20 0x77 0x68 0x61 0x74 0x20 0x73 0x68 // ' what sh' 0x65 0x20 0x6C 0x6F 0x76 0x65 0x73 0x2C // 'e loves,' 0x20 0x77 0x68 0x69 0x63 0x68 0x20 0x69 // ' which i' 0x73 0x20 0x74 0x6F 0x20 0x6D 0x61 0x6B // 's to mak' 0x65 0x20 0x70 0x65 0x6F 0x70 0x6C 0x65 // 'e people' 0x20 0x6C 0x61 0x75 0x67 0x68 0x2E 0x20 // ' laugh. ' 0x4E 0x6F 0x20 0x6F 0x6E 0x65 0x2C 0x20 // 'No one, ' 0x6E 0x6F 0x74 0x20 0x65 0x76 0x65 0x6E // 'not even' 0x20 0x68 0x65 0x72 0x20 0x70 0x61 0x72 // ' her par' 0x65 0x6E 0x74 0x73 0x2C 0x20 0x6B 0x6E // 'ents, kn' 0x6F 0x77 0x73 0x20 0x74 0x68 0x61 0x74 // 'ows that' 0x20 0x42 0x65 0x6C 0x6C 0x61 0x20 0x64 // ' Bella d' 0x6F 0x65 0x73 0x20 0x61 0x20 0x63 0x6F // 'oes a co' 0x6D 0x65 0x64 0x79 0x20 0x61 0x63 0x74 // 'medy act' 0x20 0x74 0x68 0x72 0x65 0x65 0x20 0x6E // ' three n' 0x69 0x67 0x68 0x74 0x73 0x20 0x61 0x20 // 'ights a ' 0x77 0x65 0x65 0x6B 0x20 0x61 0x74 0x20 // 'week at ' 0x61 0x20 0x6C 0x6F 0x63 0x61 0x6C 0x20 // 'a local ' 0x4D 0x65 0x78 0x69 0x63 0x61 0x6E 0x20 // 'Mexican ' 0x72 0x65 0x73 0x74 0x61 0x75 0x72 0x61 // 'restaura' 0x6E 0x74 0x2E 0x20 0x4E 0x6F 0x20 0x77 // 'nt. No w' 0x6F 0x6E 0x64 0x65 0x72 0x20 0x73 0x68 // 'onder sh' 0x65 0x20 0x6C 0x6F 0x6F 0x6B 0x73 0x20 // 'e looks ' 0x73 0x6F 0x20 0x74 0x69 0x72 0x65 0x64 // 'so tired' 0x20 0x69 0x6E 0x20 0x63 0x6C 0x61 0x73 // ' in clas' 0x73 0x21 0x20 0x0D 0x0A 0x44 0x72 0x65 // 's! ??Dre' 0x61 0x6D 0x20 0x52 0x6F 0x6C 0x65 0x73 // 'am Roles' 0x0D 0x0A 0x4D 0x61 0x64 0x61 0x6D 0x65 // '??Madame' 0x20 0x53 0x70 0x6F 0x6F 0x6B 0x79 0x3B // ' Spooky;' 0x20 0x53 0x74 0x72 0x65 0x65 0x74 0x20 // ' Street ' 0x46 0x61 0x69 0x72 0x20 0x45 0x6E 0x74 // 'Fair Ent' 0x65 0x72 0x74 0x61 0x69 0x6E 0x65 0x72 // 'ertainer' 0x3B 0x20 0x54 0x6F 0x75 0x72 0x69 0x73 // '; Touris' 0x74 // 't' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_4= ktpcBioPage5 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4, __HELP_NAME("Bio Page 5 Benedict")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4, __HELP_NAME("Bio Page 5 Benedict")) __HELP_PACK2 BO OSK LONG kgobBlankBalloon kgobBlankBalloon 0x0 kidBioTipScript 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_32=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4, 0x0) GST(0) ITEM "kgobBlankBalloon" ITEM "ktpcBioPage5" ITEM "kgobBlankBalloon" ITEM "" ITEM "kidBioTipScript" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_32=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_32, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktipbio13 __HELP_SYMBOL( STN "ktipbio13" ) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktipbio14 __HELP_SYMBOL( STN "ktipbio14" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktipbio15 __HELP_SYMBOL( STN "ktipbio15" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktipbio16 __HELP_SYMBOL( STN "ktipbio16" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_32=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_32, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x1D 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x92 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x0A 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x14 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0x16 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x54 0x01 0x00 0x03 // '????T???' 0x0A 0x00 0x00 0xFD 0x5F 0x01 0x00 0x03 // '???_???' 0x00 0x00 0x00 0x00 0x5F 0x00 0x00 0x04 // '????_???' 0x0D 0x00 0x00 0xFE 0x68 0x00 0x00 0x04 // '???h???' 0x00 0x00 0x00 0x00 0x61 0x01 0x00 0x04 // '????a???' 0x0D 0x00 0x00 0xFE 0x73 0x01 0x00 0x04 // '???s???' 0x00 0x00 0x00 0x00 0x75 0x01 0x00 0x04 // '????u???' 0x0D 0x00 0x00 0xFE 0x83 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0x85 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0x92 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0x5F 0x00 0x00 0x40 // '????_??@' 0x01 0x00 0x00 0x00 0x68 0x00 0x00 0x40 // '????h??@' 0x00 0x00 0x00 0x00 0x61 0x01 0x00 0x40 // '????a??@' 0x02 0x00 0x00 0x00 0x73 0x01 0x00 0x40 // '????s??@' 0x00 0x00 0x00 0x00 0x75 0x01 0x00 0x40 // '????u??@' 0x03 0x00 0x00 0x00 0x83 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x85 0x01 0x00 0x40 // '??????@' 0x04 0x00 0x00 0x00 0x92 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0xF7 0xFF 0x00 0x02 0x0A 0x00 0x00 0x80 // '?????' 0xBD 0x00 0x00 0x00 0x16 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x61 0x01 0x00 0x82 // '????a??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_32=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_32, 0x0) BYTE 0x03 0x03 0x42 0x45 0x4E 0x45 0x44 0x49 // '??BENEDI' 0x43 0x54 0x0D 0x0A 0x42 0x61 0x63 0x6B // 'CT??Back' 0x67 0x72 0x6F 0x75 0x6E 0x64 0x0D 0x0A // 'ground??' 0x42 0x65 0x6E 0x65 0x64 0x69 0x63 0x74 // 'Benedict' 0x20 0x69 0x73 0x20 0x33 0x31 0x20 0x61 // ' is 31 a' 0x6E 0x64 0x20 0x69 0x74 0x20 0x69 0x73 // 'nd it is' 0x20 0x61 0x20 0x6D 0x69 0x72 0x61 0x63 // ' a mirac' 0x6C 0x65 0x2E 0x20 0x46 0x72 0x6F 0x6D // 'le. From' 0x20 0x74 0x68 0x65 0x20 0x74 0x69 0x6D // ' the tim' 0x65 0x20 0x68 0x65 0x20 0x77 0x61 0x73 // 'e he was' 0x20 0x61 0x20 0x6B 0x69 0x64 0x2C 0x20 // ' a kid, ' 0x68 0x65 0x20 0x6C 0x6F 0x76 0x65 0x64 // 'he loved' 0x20 0x63 0x68 0x65 0x6D 0x69 0x73 0x74 // ' chemist' 0x72 0x79 0x2E 0x20 0x48 0x69 0x73 0x20 // 'ry. His ' 0x63 0x6F 0x6E 0x63 0x6F 0x63 0x74 0x69 // 'concocti' 0x6F 0x6E 0x73 0x20 0x62 0x75 0x62 0x62 // 'ons bubb' 0x6C 0x65 0x64 0x20 0x61 0x6E 0x64 0x20 // 'led and ' 0x73 0x70 0x65 0x77 0x65 0x64 0x20 0x69 // 'spewed i' 0x6E 0x20 0x62 0x6C 0x75 0x65 0x73 0x20 // 'n blues ' 0x61 0x6E 0x64 0x20 0x67 0x72 0x65 0x65 // 'and gree' 0x6E 0x73 0x2E 0x20 0x54 0x68 0x65 0x6E // 'ns. Then' 0x2C 0x20 0x69 0x6E 0x20 0x61 0x20 0x68 // ', in a h' 0x69 0x67 0x68 0x20 0x73 0x63 0x68 0x6F // 'igh scho' 0x6F 0x6C 0x20 0x63 0x68 0x65 0x6D 0x69 // 'ol chemi' 0x73 0x74 0x72 0x79 0x20 0x6C 0x61 0x62 // 'stry lab' 0x2C 0x20 0x74 0x68 0x65 0x20 0x62 0x6C // ', the bl' 0x75 0x65 0x2D 0x67 0x72 0x65 0x65 0x6E // 'ue-green' 0x20 0x68 0x61 0x7A 0x65 0x20 0x74 0x75 // ' haze tu' 0x72 0x6E 0x65 0x64 0x20 0x62 0x6C 0x61 // 'rned bla' 0x63 0x6B 0x2C 0x20 0x61 0x6E 0x64 0x20 // 'ck, and ' 0x74 0x68 0x65 0x6E 0x20 0x74 0x68 0x65 // 'then the' 0x72 0x65 0x20 0x77 0x61 0x73 0x20 0x61 // 're was a' 0x6E 0x20 0x61 0x77 0x65 0x73 0x6F 0x6D // 'n awesom' 0x65 0x20 0x65 0x78 0x70 0x6C 0x6F 0x73 // 'e explos' 0x69 0x6F 0x6E 0x2E 0x20 0x42 0x65 0x6E // 'ion. Ben' 0x65 0x64 0x69 0x63 0x74 0x27 0x73 0x20 // 'edict's ' 0x62 0x75 0x72 0x6E 0x73 0x20 0x61 0x72 // 'burns ar' 0x65 0x20 0x73 0x74 0x69 0x6C 0x6C 0x20 // 'e still ' 0x68 0x65 0x61 0x6C 0x69 0x6E 0x67 0x2C // 'healing,' 0x20 0x62 0x75 0x74 0x20 0x68 0x65 0x92 // ' but he' 0x73 0x20 0x67 0x6C 0x61 0x64 0x20 0x68 // 's glad h' 0x65 0x20 0x73 0x75 0x72 0x76 0x69 0x76 // 'e surviv' 0x65 0x64 0x2E 0x20 0x0D 0x0A 0x44 0x72 // 'ed. ??Dr' 0x65 0x61 0x6D 0x20 0x52 0x6F 0x6C 0x65 // 'eam Role' 0x73 0x0D 0x0A 0x42 0x61 0x63 0x6B 0x2D // 's??Back-' 0x74 0x6F 0x2D 0x4C 0x69 0x66 0x65 0x20 // 'to-Life ' 0x4D 0x75 0x6D 0x6D 0x79 0x3B 0x20 0x49 // 'Mummy; I' 0x6E 0x6A 0x75 0x72 0x65 0x64 0x20 0x56 // 'njured V' 0x69 0x63 0x74 0x69 0x6D 0x3B 0x20 0x41 // 'ictim; A' 0x6E 0x63 0x69 0x65 0x6E 0x74 0x20 0x4D // 'ncient M' 0x75 0x6D 0x6D 0x79 // 'ummy' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_5= ktpcBioPage6 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5, __HELP_NAME("Bio Page 6 Billy")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5, __HELP_NAME("Bio Page 6 Billy")) __HELP_PACK2 BO OSK LONG kgobBlankBalloon kgobBlankBalloon 0x0 kidBioTipScript 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_29=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5, 0x0) GST(0) ITEM "kgobBlankBalloon" ITEM "ktpcBioPage6" ITEM "kgobBlankBalloon" ITEM "" ITEM "kidBioTipScript" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_5=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2A, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktipbio17 __HELP_SYMBOL( STN "ktipbio17" ) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktipbio18 __HELP_SYMBOL( STN "ktipbio18" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktipbio19 __HELP_SYMBOL( STN "ktipbio19" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktipbio20 __HELP_SYMBOL( STN "ktipbio20" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_2A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x1E 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x13 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xCE 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x07 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x11 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0x13 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x9C 0x01 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xA7 0x01 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x94 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0x99 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xA9 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xB0 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xB2 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xB9 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xBB 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xCE 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0x94 0x01 0x00 0x40 // '??????@' 0x01 0x00 0x00 0x00 0x99 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xA9 0x01 0x00 0x40 // '??????@' 0x02 0x00 0x00 0x00 0xB0 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xB2 0x01 0x00 0x40 // '??????@' 0x03 0x00 0x00 0x00 0xB9 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xBB 0x01 0x00 0x40 // '??????@' 0x04 0x00 0x00 0x00 0xCE 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0xF7 0xFF 0x00 0x02 0x07 0x00 0x00 0x80 // '?????' 0xBD 0x00 0x00 0x00 0x13 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xA9 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2A, 0x0) BYTE 0x03 0x03 0x42 0x49 0x4C 0x4C 0x59 0x0D // '??BILLY?' 0x0A 0x42 0x61 0x63 0x6B 0x67 0x72 0x6F // '?Backgro' 0x75 0x6E 0x64 0x0D 0x0A 0x42 0x69 0x6C // 'und??Bil' 0x6C 0x79 0x20 0x69 0x73 0x20 0x61 0x20 // 'ly is a ' 0x63 0x6F 0x6F 0x6B 0x20 0x61 0x74 0x20 // 'cook at ' 0x61 0x20 0x73 0x65 0x61 0x66 0x6F 0x6F // 'a seafoo' 0x64 0x20 0x72 0x65 0x73 0x74 0x61 0x75 // 'd restau' 0x72 0x61 0x6E 0x74 0x20 0x69 0x6E 0x20 // 'rant in ' 0x54 0x6F 0x72 0x6F 0x6E 0x74 0x6F 0x2E // 'Toronto.' 0x20 0x48 0x65 0x20 0x6C 0x69 0x76 0x65 // ' He live' 0x73 0x20 0x69 0x6E 0x20 0x74 0x68 0x65 // 's in the' 0x20 0x62 0x69 0x67 0x20 0x63 0x69 0x74 // ' big cit' 0x79 0x20 0x6E 0x6F 0x77 0x2C 0x20 0x62 // 'y now, b' 0x75 0x74 0x20 0x68 0x65 0x20 0x63 0x6F // 'ut he co' 0x6D 0x65 0x73 0x20 0x66 0x72 0x6F 0x6D // 'mes from' 0x20 0x61 0x20 0x66 0x69 0x73 0x68 0x65 // ' a fishe' 0x72 0x6D 0x61 0x6E 0x27 0x73 0x20 0x66 // 'rman's f' 0x61 0x6D 0x69 0x6C 0x79 0x20 0x69 0x6E // 'amily in' 0x20 0x61 0x20 0x74 0x69 0x6E 0x79 0x20 // ' a tiny ' 0x74 0x6F 0x77 0x6E 0x20 0x69 0x6E 0x20 // 'town in ' 0x4E 0x6F 0x76 0x61 0x20 0x53 0x63 0x6F // 'Nova Sco' 0x74 0x69 0x61 0x2E 0x20 0x41 0x74 0x20 // 'tia. At ' 0x74 0x68 0x65 0x20 0x72 0x65 0x73 0x74 // 'the rest' 0x61 0x75 0x72 0x61 0x6E 0x74 0x20 0x68 // 'aurant h' 0x65 0x20 0x6C 0x6F 0x76 0x65 0x73 0x20 // 'e loves ' 0x74 0x6F 0x20 0x70 0x72 0x65 0x70 0x61 // 'to prepa' 0x72 0x65 0x20 0x66 0x69 0x73 0x68 0x2C // 're fish,' 0x20 0x62 0x65 0x63 0x61 0x75 0x73 0x65 // ' because' 0x20 0x69 0x74 0x20 0x72 0x65 0x6D 0x69 // ' it remi' 0x6E 0x64 0x73 0x20 0x68 0x69 0x6D 0x20 // 'nds him ' 0x6F 0x66 0x20 0x68 0x69 0x73 0x20 0x64 // 'of his d' 0x61 0x79 0x73 0x20 0x66 0x69 0x73 0x68 // 'ays fish' 0x69 0x6E 0x67 0x20 0x77 0x69 0x74 0x68 // 'ing with' 0x20 0x68 0x69 0x73 0x20 0x66 0x61 0x6D // ' his fam' 0x69 0x6C 0x79 0x2E 0x20 0x48 0x69 0x73 // 'ily. His' 0x20 0x6C 0x6F 0x76 0x65 0x20 0x6F 0x66 // ' love of' 0x20 0x66 0x69 0x73 0x68 0x20 0x69 0x73 // ' fish is' 0x20 0x73 0x65 0x63 0x6F 0x6E 0x64 0x20 // ' second ' 0x6F 0x6E 0x6C 0x79 0x20 0x74 0x6F 0x20 // 'only to ' 0x68 0x69 0x73 0x20 0x74 0x72 0x75 0x65 // 'his true' 0x20 0x70 0x61 0x73 0x73 0x69 0x6F 0x6E // ' passion' 0x2C 0x20 0x64 0x61 0x6E 0x63 0x69 0x6E // ', dancin' 0x67 0x2E 0x20 0x42 0x69 0x6C 0x6C 0x79 // 'g. Billy' 0x27 0x73 0x20 0x73 0x75 0x63 0x68 0x20 // ''s such ' 0x61 0x20 0x67 0x6F 0x6F 0x64 0x20 0x64 // 'a good d' 0x61 0x6E 0x63 0x65 0x72 0x20 0x74 0x68 // 'ancer th' 0x61 0x74 0x20 0x74 0x68 0x65 0x79 0x20 // 'at they ' 0x73 0x61 0x79 0x20 0x68 0x65 0x20 0x63 // 'say he c' 0x61 0x6E 0x20 0x65 0x76 0x65 0x6E 0x20 // 'an even ' 0x6D 0x61 0x6B 0x65 0x20 0x68 0x69 0x73 // 'make his' 0x20 0x66 0x69 0x73 0x68 0x20 0x64 0x61 // ' fish da' 0x6E 0x63 0x65 0x2E 0x0D 0x0A 0x44 0x72 // 'nce.??Dr' 0x65 0x61 0x6D 0x20 0x52 0x6F 0x6C 0x65 // 'eam Role' 0x73 0x0D 0x0A 0x47 0x65 0x6E 0x65 0x72 // 's??Gener' 0x61 0x6C 0x3B 0x20 0x46 0x6F 0x72 0x65 // 'al; Fore' 0x6D 0x61 0x6E 0x3B 0x20 0x46 0x6C 0x65 // 'man; Fle' 0x61 0x20 0x4D 0x61 0x72 0x6B 0x65 0x74 // 'a Market' 0x20 0x4D 0x61 0x6E 0x61 0x67 0x65 0x72 // ' Manager' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_6= ktpcBioPage7 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6, __HELP_NAME("Bio Page 7 Bino BeGood")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6, __HELP_NAME("Bio Page 7 Bino BeGood")) __HELP_PACK2 BO OSK LONG kgobBlankBalloon kgobBlankBalloon 0x0 kidBioTipScript 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6, 0x0) GST(0) ITEM "kgobBlankBalloon" ITEM "ktpcBioPage7" ITEM "kgobBlankBalloon" ITEM "" ITEM "kidBioTipScript" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_0=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2C, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktipbio22 __HELP_SYMBOL( STN "ktipbio22" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktipbio23 __HELP_SYMBOL( STN "ktipbio23" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktipbio24 __HELP_SYMBOL( STN "ktipbio24" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktipbio21 __HELP_SYMBOL( STN "ktipbio21" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_2C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x1F 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xB3 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x0D 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x17 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0x19 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x7F 0x01 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x8A 0x01 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0x04 // '????@???' 0x0D 0x00 0x00 0xFE 0x43 0x00 0x00 0x04 // '???C???' 0x00 0x00 0x00 0x00 0x7D 0x01 0x00 0x04 // '????}???' 0x00 0x00 0x00 0x00 0x8C 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0x91 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0x93 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xA5 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xA7 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xB3 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0x40 // '????@??@' 0x04 0x00 0x00 0x00 0x43 0x00 0x00 0x40 // '????C??@' 0x00 0x00 0x00 0x00 0x7D 0x01 0x00 0x40 // '????}??@' 0x00 0x00 0x00 0x00 0x8C 0x01 0x00 0x40 // '??????@' 0x01 0x00 0x00 0x00 0x91 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x93 0x01 0x00 0x40 // '??????@' 0x02 0x00 0x00 0x00 0xA5 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xA7 0x01 0x00 0x40 // '??????@' 0x03 0x00 0x00 0x00 0xB3 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0xF7 0xFF 0x00 0x02 0x0D 0x00 0x00 0x80 // '?????' 0xBD 0x00 0x00 0x00 0x19 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x8C 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2C, 0x0) BYTE 0x03 0x03 0x42 0x49 0x4E 0x4F 0x20 0x42 // '??BINO B' 0x65 0x47 0x4F 0x4F 0x44 0x0D 0x0A 0x42 // 'eGOOD??B' 0x61 0x63 0x6B 0x67 0x72 0x6F 0x75 0x6E // 'ackgroun' 0x64 0x0D 0x0A 0x42 0x69 0x6E 0x6F 0x20 // 'd??Bino ' 0x69 0x73 0x20 0x32 0x34 0x20 0x79 0x65 // 'is 24 ye' 0x61 0x72 0x73 0x20 0x6F 0x6C 0x64 0x20 // 'ars old ' 0x61 0x6E 0x64 0x20 0x63 0x6F 0x6D 0x65 // 'and come' 0x73 0x20 0x66 0x72 0x6F 0x6D 0x20 0x61 // 's from a' 0x6E 0x20 0x49 0x62 0x6F 0x20 0x66 0x61 // 'n Ibo fa' 0x6D 0x69 0x6C 0x79 0x20 0x69 0x6E 0x20 // 'mily in ' 0x4E 0x69 0x67 0x65 0x72 0x69 0x61 0x2E // 'Nigeria.' 0x20 0x57 0x68 0x69 0x6C 0x65 0x20 0x64 // ' While d' 0x61 0x62 0x62 0x6C 0x69 0x6E 0x67 0x20 // 'abbling ' 0x69 0x6E 0x20 0x61 0x6D 0x61 0x74 0x65 // 'in amate' 0x75 0x72 0x20 0x74 0x68 0x65 0x61 0x74 // 'ur theat' 0x65 0x72 0x20 0x70 0x72 0x6F 0x64 0x75 // 'er produ' 0x63 0x74 0x69 0x6F 0x6E 0x73 0x2C 0x20 // 'ctions, ' 0x68 0x65 0x20 0x6D 0x61 0x64 0x65 0x20 // 'he made ' 0x68 0x69 0x73 0x20 0x72 0x65 0x61 0x6C // 'his real' 0x20 0x6C 0x69 0x76 0x69 0x6E 0x67 0x20 // ' living ' 0x73 0x65 0x6C 0x6C 0x69 0x6E 0x67 0x20 // 'selling ' 0x74 0x6F 0x6F 0x74 0x68 0x70 0x61 0x73 // 'toothpas' 0x74 0x65 0x20 0x77 0x69 0x74 0x68 0x20 // 'te with ' 0x68 0x69 0x73 0x20 0x66 0x61 0x6D 0x69 // 'his fami' 0x6C 0x79 0x20 0x69 0x6E 0x20 0x74 0x68 // 'ly in th' 0x65 0x20 0x6D 0x61 0x72 0x6B 0x65 0x74 // 'e market' 0x70 0x6C 0x61 0x63 0x65 0x73 0x20 0x6F // 'places o' 0x66 0x20 0x68 0x69 0x73 0x20 0x68 0x6F // 'f his ho' 0x6D 0x65 0x74 0x6F 0x77 0x6E 0x2E 0x20 // 'metown. ' 0x4F 0x6E 0x63 0x65 0x20 0x68 0x65 0x20 // 'Once he ' 0x73 0x61 0x76 0x65 0x64 0x20 0x65 0x6E // 'saved en' 0x6F 0x75 0x67 0x68 0x20 0x6D 0x6F 0x6E // 'ough mon' 0x65 0x79 0x2C 0x20 0x68 0x65 0x20 0x6D // 'ey, he m' 0x6F 0x76 0x65 0x64 0x20 0x74 0x6F 0x20 // 'oved to ' 0x74 0x68 0x65 0x20 0x55 0x6E 0x69 0x74 // 'the Unit' 0x65 0x64 0x20 0x53 0x74 0x61 0x74 0x65 // 'ed State' 0x73 0x97 0x4E 0x65 0x77 0x20 0x59 0x6F // 'sNew Yo' 0x72 0x6B 0x20 0x43 0x69 0x74 0x79 0x21 // 'rk City!' 0x97 0x68 0x6F 0x70 0x69 0x6E 0x67 0x20 // 'hoping ' 0x74 0x6F 0x20 0x63 0x6F 0x6E 0x74 0x69 // 'to conti' 0x6E 0x75 0x65 0x20 0x69 0x6E 0x20 0x74 // 'nue in t' 0x68 0x65 0x20 0x74 0x68 0x65 0x61 0x74 // 'he theat' 0x65 0x72 0x2C 0x20 0x62 0x75 0x74 0x20 // 'er, but ' 0x6C 0x61 0x6E 0x64 0x65 0x64 0x20 0x61 // 'landed a' 0x20 0x72 0x6F 0x6C 0x65 0x20 0x69 0x6E // ' role in' 0x20 0x61 0x20 0x4D 0x63 0x5A 0x65 0x65 // ' a McZee' 0x20 0x66 0x69 0x6C 0x6D 0x20 0x69 0x6E // ' film in' 0x73 0x74 0x65 0x61 0x64 0x21 0x20 0x0D // 'stead! ?' 0x0A 0x44 0x72 0x65 0x61 0x6D 0x20 0x52 // '?Dream R' 0x6F 0x6C 0x65 0x73 0x0D 0x0A 0x54 0x75 // 'oles??Tu' 0x74 0x6F 0x72 0x3B 0x20 0x53 0x74 0x72 // 'tor; Str' 0x65 0x65 0x74 0x20 0x45 0x6E 0x74 0x65 // 'eet Ente' 0x72 0x74 0x61 0x69 0x6E 0x65 0x72 0x3B // 'rtainer;' 0x20 0x4D 0x75 0x73 0x69 0x63 0x20 0x4D // ' Music M' 0x61 0x73 0x74 0x65 0x72 // 'aster' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_7= ktpcBioPage8 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7, __HELP_NAME("Bio Page 8 Bo")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7, __HELP_NAME("Bio Page 8 Bo")) __HELP_PACK2 BO OSK LONG kgobBlankBalloon kgobBlankBalloon 0x0 kidBioTipScript 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_81=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7, 0x0) GST(0) ITEM "kgobBlankBalloon" ITEM "ktpcBioPage8" ITEM "kgobBlankBalloon" ITEM "" ITEM "kidBioTipScript" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_81=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1B=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_81, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktipbio26 __HELP_SYMBOL( STN "ktipbio26" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktipbio25 __HELP_SYMBOL( STN "ktipbio25" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktipbio27 __HELP_SYMBOL( STN "ktipbio27" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktipbio28 __HELP_SYMBOL( STN "ktipbio28" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_81=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_81, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x1F 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x52 0x01 0x00 0x01 // '????R???' 0x00 0x00 0x00 0x00 0x53 0x01 0x00 0x01 // '????S???' 0x01 0x00 0x00 0x00 0x91 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x04 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x0E 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0x10 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x60 0x01 0x00 0x03 // '????`???' 0x0A 0x00 0x00 0xFD 0x6B 0x01 0x00 0x03 // '???k???' 0x00 0x00 0x00 0x00 0x53 0x01 0x00 0x04 // '????S???' 0x0D 0x00 0x00 0xFE 0x5E 0x01 0x00 0x04 // '???^???' 0x00 0x00 0x00 0x00 0x6D 0x01 0x00 0x04 // '????m???' 0x0D 0x00 0x00 0xFE 0x74 0x01 0x00 0x04 // '???t???' 0x00 0x00 0x00 0x00 0x76 0x01 0x00 0x04 // '????v???' 0x0D 0x00 0x00 0xFE 0x7F 0x01 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x81 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0x91 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0x53 0x01 0x00 0x40 // '????S??@' 0x02 0x00 0x00 0x00 0x5E 0x01 0x00 0x40 // '????^??@' 0x00 0x00 0x00 0x00 0x6D 0x01 0x00 0x40 // '????m??@' 0x01 0x00 0x00 0x00 0x74 0x01 0x00 0x40 // '????t??@' 0x00 0x00 0x00 0x00 0x76 0x01 0x00 0x40 // '????v??@' 0x03 0x00 0x00 0x00 0x7F 0x01 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x81 0x01 0x00 0x40 // '??????@' 0x04 0x00 0x00 0x00 0x91 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0xF7 0xFF 0x00 0x02 0x04 0x00 0x00 0x80 // '?????' 0xBD 0x00 0x00 0x00 0x10 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x6D 0x01 0x00 0x82 // '????m??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_81=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_81, 0x0) BYTE 0x03 0x03 0x42 0x4F 0x0D 0x0A 0x42 0x61 // '??BO??Ba' 0x63 0x6B 0x67 0x72 0x6F 0x75 0x6E 0x64 // 'ckground' 0x0D 0x0A 0x42 0x6F 0x20 0x69 0x73 0x20 // '??Bo is ' 0x66 0x72 0x6F 0x6D 0x20 0x41 0x66 0x72 // 'from Afr' 0x69 0x63 0x61 0x2E 0x20 0x45 0x76 0x65 // 'ica. Eve' 0x6E 0x20 0x61 0x73 0x20 0x61 0x20 0x62 // 'n as a b' 0x61 0x62 0x79 0x20 0x68 0x65 0x20 0x77 // 'aby he w' 0x61 0x73 0x20 0x6E 0x65 0x76 0x65 0x72 // 'as never' 0x20 0x6C 0x69 0x74 0x74 0x6C 0x65 0x2E // ' little.' 0x20 0x48 0x65 0x20 0x61 0x74 0x65 0x20 // ' He ate ' 0x6F 0x6E 0x6C 0x79 0x20 0x6E 0x61 0x74 // 'only nat' 0x75 0x72 0x61 0x6C 0x20 0x66 0x6F 0x6F // 'ural foo' 0x64 0x2C 0x20 0x61 0x6E 0x64 0x20 0x6C // 'd, and l' 0x6F 0x76 0x65 0x64 0x20 0x74 0x6F 0x20 // 'oved to ' 0x77 0x72 0x65 0x73 0x74 0x6C 0x65 0x20 // 'wrestle ' 0x77 0x69 0x74 0x68 0x20 0x74 0x68 0x65 // 'with the' 0x20 0x6F 0x74 0x68 0x65 0x72 0x20 0x62 // ' other b' 0x6F 0x79 0x73 0x20 0x69 0x6E 0x20 0x68 // 'oys in h' 0x69 0x73 0x20 0x74 0x6F 0x77 0x6E 0x2E // 'is town.' 0x20 0x42 0x6F 0x20 0x77 0x61 0x73 0x20 // ' Bo was ' 0x73 0x6F 0x20 0x67 0x6F 0x6F 0x64 0x20 // 'so good ' 0x61 0x6E 0x64 0x20 0x67 0x72 0x65 0x77 // 'and grew' 0x20 0x73 0x6F 0x20 0x73 0x74 0x72 0x6F // ' so stro' 0x6E 0x67 0x20 0x74 0x68 0x61 0x74 0x20 // 'ng that ' 0x68 0x65 0x20 0x62 0x65 0x63 0x61 0x6D // 'he becam' 0x65 0x20 0x74 0x68 0x65 0x20 0x63 0x68 // 'e the ch' 0x61 0x6D 0x70 0x69 0x6F 0x6E 0x20 0x6B // 'ampion k' 0x69 0x63 0x6B 0x20 0x62 0x6F 0x78 0x65 // 'ick boxe' 0x72 0x20 0x69 0x6E 0x20 0x68 0x69 0x73 // 'r in his' 0x20 0x74 0x6F 0x77 0x6E 0x2E 0x20 0x42 // ' town. B' 0x75 0x74 0x20 0x42 0x6F 0x20 0x77 0x61 // 'ut Bo wa' 0x6E 0x74 0x65 0x64 0x20 0x74 0x6F 0x20 // 'nted to ' 0x62 0x65 0x20 0x72 0x65 0x61 0x6C 0x6C // 'be reall' 0x79 0x20 0x66 0x61 0x6D 0x6F 0x75 0x73 // 'y famous' 0x2C 0x20 0x6E 0x6F 0x74 0x20 0x6A 0x75 // ', not ju' 0x73 0x74 0x20 0x61 0x73 0x20 0x61 0x20 // 'st as a ' 0x6B 0x69 0x63 0x6B 0x20 0x62 0x6F 0x78 // 'kick box' 0x65 0x72 0x2C 0x20 0x62 0x75 0x74 0x20 // 'er, but ' 0x61 0x73 0x20 0x61 0x20 0x6D 0x6F 0x76 // 'as a mov' 0x69 0x65 0x20 0x73 0x74 0x61 0x72 0x2E // 'ie star.' 0x20 0x42 0x75 0x74 0x20 0x68 0x6F 0x77 // ' But how' 0x20 0x77 0x6F 0x75 0x6C 0x64 0x20 0x68 // ' would h' 0x65 0x20 0x62 0x65 0x20 0x64 0x69 0x73 // 'e be dis' 0x63 0x6F 0x76 0x65 0x72 0x65 0x64 0x3F // 'covered?' 0x0D 0x0A 0x44 0x72 0x65 0x61 0x6D 0x20 // '??Dream ' 0x52 0x6F 0x6C 0x65 0x73 0x0D 0x0A 0x44 // 'Roles??D' 0x65 0x6E 0x74 0x69 0x73 0x74 0x3B 0x20 // 'entist; ' 0x41 0x73 0x74 0x72 0x6F 0x6E 0x61 0x75 // 'Astronau' 0x74 0x3B 0x20 0x54 0x6F 0x75 0x72 0x20 // 't; Tour ' 0x43 0x6F 0x6F 0x72 0x64 0x69 0x6E 0x61 // 'Coordina' 0x74 0x6F 0x72 // 'tor' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_8= ktpcBioPage9 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8, __HELP_NAME("Bio Page 9 Bongo")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8, __HELP_NAME("Bio Page 9 Bongo")) __HELP_PACK2 BO OSK LONG kgobBlankBalloon kgobBlankBalloon 0x0 kidBioTipScript 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_11=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8, 0x0) GST(0) ITEM "kgobBlankBalloon" ITEM "ktpcBioPage9" ITEM "kgobBlankBalloon" ITEM "" ITEM "kidBioTipScript" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_11=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_16=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_11, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 3 LONG ktipbio31 __HELP_SYMBOL( STN "ktipbio31" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktipbio32 __HELP_SYMBOL( STN "ktipbio32" ) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktipbio29 __HELP_SYMBOL( STN "ktipbio29" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_11=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_11, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x1D 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xE2 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x07 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x11 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0x13 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0xA8 0x01 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xB3 0x01 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x20 0x01 0x00 0x04 // '???? ???' 0x0D 0x00 0x00 0xFE 0x26 0x01 0x00 0x04 // '???&???' 0x00 0x00 0x00 0x00 0xB5 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xC1 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xC3 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xD1 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xD3 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xE2 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0x20 0x01 0x00 0x40 // '???? ??@' 0x05 0x00 0x00 0x00 0x26 0x01 0x00 0x40 // '????&??@' 0x00 0x00 0x00 0x00 0xA6 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xC1 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xC3 0x01 0x00 0x40 // '??????@' 0x02 0x00 0x00 0x00 0xD1 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xD3 0x01 0x00 0x40 // '??????@' 0x03 0x00 0x00 0x00 0xE2 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0xF7 0xFF 0x00 0x02 0x07 0x00 0x00 0x80 // '?????' 0xBD 0x00 0x00 0x00 0x13 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xB5 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_11=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_11, 0x0) BYTE 0x03 0x03 0x42 0x4F 0x4E 0x47 0x4F 0x0D // '??BONGO?' 0x0A 0x42 0x61 0x63 0x6B 0x67 0x72 0x6F // '?Backgro' 0x75 0x6E 0x64 0x0D 0x0A 0x42 0x6F 0x6E // 'und??Bon' 0x67 0x6F 0x20 0x63 0x61 0x6D 0x65 0x20 // 'go came ' 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 0x55 // 'to the U' 0x6E 0x69 0x74 0x65 0x64 0x20 0x53 0x74 // 'nited St' 0x61 0x74 0x65 0x73 0x20 0x66 0x72 0x6F // 'ates fro' 0x6D 0x20 0x47 0x65 0x72 0x6D 0x61 0x6E // 'm German' 0x79 0x20 0x74 0x6F 0x20 0x67 0x6F 0x20 // 'y to go ' 0x74 0x6F 0x20 0x63 0x6F 0x6C 0x6C 0x65 // 'to colle' 0x67 0x65 0x2E 0x20 0x20 0x42 0x65 0x63 // 'ge. Bec' 0x61 0x75 0x73 0x65 0x20 0x68 0x69 0x73 // 'ause his' 0x20 0x72 0x65 0x61 0x6C 0x20 0x6E 0x61 // ' real na' 0x6D 0x65 0x20 0x77 0x61 0x73 0x20 0x73 // 'me was s' 0x6F 0x20 0x6C 0x6F 0x6E 0x67 0x20 0x61 // 'o long a' 0x6E 0x64 0x20 0x68 0x61 0x72 0x64 0x20 // 'nd hard ' 0x74 0x6F 0x20 0x70 0x72 0x6F 0x6E 0x6F // 'to prono' 0x75 0x6E 0x63 0x65 0x2C 0x20 0x66 0x72 // 'unce, fr' 0x69 0x65 0x6E 0x64 0x73 0x20 0x6E 0x69 // 'iends ni' 0x63 0x6B 0x6E 0x61 0x6D 0x65 0x64 0x20 // 'cknamed ' 0x68 0x69 0x6D 0x20 0x42 0x2E 0x4F 0x2E // 'him B.O.' 0x4E 0x2E 0x47 0x2E 0x4F 0x2E 0x20 0x20 // 'N.G.O. ' 0x20 0x0D 0x0A 0x4F 0x6E 0x65 0x20 0x64 // ' ??One d' 0x61 0x79 0x2C 0x20 0x74 0x68 0x65 0x20 // 'ay, the ' 0x66 0x61 0x6D 0x6F 0x75 0x73 0x20 0x64 // 'famous d' 0x69 0x72 0x65 0x63 0x74 0x6F 0x72 0x20 // 'irector ' 0x4D 0x63 0x5A 0x65 0x65 0x20 0x63 0x61 // 'McZee ca' 0x6D 0x65 0x20 0x74 0x6F 0x20 0x76 0x69 // 'me to vi' 0x73 0x69 0x74 0x20 0x6F 0x6E 0x65 0x20 // 'sit one ' 0x6F 0x66 0x20 0x42 0x6F 0x6E 0x67 0x6F // 'of Bongo' 0x27 0x73 0x20 0x64 0x72 0x61 0x6D 0x61 // ''s drama' 0x20 0x63 0x6C 0x61 0x73 0x73 0x65 0x73 // ' classes' 0x2E 0x20 0x20 0x48 0x65 0x20 0x74 0x68 // '. He th' 0x6F 0x75 0x67 0x68 0x74 0x20 0x74 0x68 // 'ought th' 0x61 0x74 0x20 0x42 0x6F 0x6E 0x67 0x6F // 'at Bongo' 0x20 0x68 0x61 0x64 0x20 0x72 0x65 0x61 // ' had rea' 0x6C 0x20 0x74 0x61 0x6C 0x65 0x6E 0x74 // 'l talent' 0x20 0x61 0x6E 0x64 0x20 0x64 0x65 0x63 // ' and dec' 0x69 0x64 0x65 0x64 0x20 0x74 0x6F 0x20 // 'ided to ' 0x66 0x65 0x61 0x74 0x75 0x72 0x65 0x20 // 'feature ' 0x68 0x69 0x6D 0x20 0x69 0x6E 0x20 0x68 // 'him in h' 0x69 0x73 0x20 0x6E 0x65 0x78 0x74 0x20 // 'is next ' 0x6D 0x6F 0x76 0x69 0x65 0x2E 0x20 0x20 // 'movie. ' 0x42 0x6F 0x6E 0x67 0x6F 0x20 0x77 0x61 // 'Bongo wa' 0x73 0x20 0x74 0x68 0x72 0x69 0x6C 0x6C // 's thrill' 0x65 0x64 0x20 0x62 0x65 0x63 0x61 0x75 // 'ed becau' 0x73 0x65 0x20 0x68 0x65 0x20 0x77 0x61 // 'se he wa' 0x73 0x20 0x61 0x62 0x6C 0x65 0x20 0x74 // 's able t' 0x6F 0x20 0x67 0x65 0x74 0x20 0x4D 0x63 // 'o get Mc' 0x5A 0x65 0x65 0x27 0x73 0x20 0x61 0x75 // 'Zee's au' 0x74 0x6F 0x67 0x72 0x61 0x70 0x68 0x20 // 'tograph ' 0x66 0x6F 0x72 0x20 0x68 0x69 0x73 0x20 // 'for his ' 0x66 0x61 0x6D 0x69 0x6C 0x79 0x2E 0x20 // 'family. ' 0x0D 0x0A 0x44 0x72 0x65 0x61 0x6D 0x20 // '??Dream ' 0x52 0x6F 0x6C 0x65 0x73 0x0D 0x0A 0x54 // 'Roles??T' 0x77 0x69 0x6E 0x20 0x42 0x72 0x6F 0x74 // 'win Brot' 0x68 0x65 0x72 0x3B 0x20 0x50 0x6F 0x6C // 'her; Pol' 0x69 0x63 0x65 0x20 0x4F 0x66 0x66 0x69 // 'ice Offi' 0x63 0x65 0x72 0x3B 0x20 0x50 0x72 0x69 // 'cer; Pri' 0x76 0x61 0x74 0x65 0x20 0x43 0x61 0x72 // 'vate Car' 0x72 0x69 0x65 0x72 // 'rier' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_9= ktpcBioPage10 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_9, __HELP_NAME("Bio Page 10 Charlie")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_9, __HELP_NAME("Bio Page 10 Charlie")) __HELP_PACK2 BO OSK LONG kgobBlankBalloon kgobBlankBalloon 0x0 kidBioTipScript 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_8E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_9, 0x0) GST(0) ITEM "kgobBlankBalloon" ITEM "ktpcBioPage10" ITEM "kgobBlankBalloon" ITEM "" ITEM "kidBioTipScript" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_8E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_9, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_21=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8E, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktipbio34 __HELP_SYMBOL( STN "ktipbio34" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktipbio35 __HELP_SYMBOL( STN "ktipbio35" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktipbio36 __HELP_SYMBOL( STN "ktipbio36" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktipbio33 __HELP_SYMBOL( STN "ktipbio33" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_8E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x1F 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x6F 0x01 0x00 0x01 // '????o???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x0B 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x15 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0x17 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x3A 0x01 0x00 0x03 // '????:???' 0x0A 0x00 0x00 0xFD 0x45 0x01 0x00 0x03 // '???E???' 0x00 0x00 0x00 0x00 0x86 0x00 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0x90 0x00 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0x38 0x01 0x00 0x04 // '????8???' 0x00 0x00 0x00 0x00 0x47 0x01 0x00 0x04 // '????G???' 0x0D 0x00 0x00 0xFE 0x4F 0x01 0x00 0x04 // '???O???' 0x00 0x00 0x00 0x00 0x51 0x01 0x00 0x04 // '????Q???' 0x0D 0x00 0x00 0xFE 0x66 0x01 0x00 0x04 // '???f???' 0x00 0x00 0x00 0x00 0x68 0x01 0x00 0x04 // '????h???' 0x0D 0x00 0x00 0xFE 0x6F 0x01 0x00 0x04 // '???o???' 0x00 0x00 0x00 0x00 0x86 0x00 0x00 0x40 // '??????@' 0x04 0x00 0x00 0x00 0x90 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x38 0x01 0x00 0x40 // '????8??@' 0x00 0x00 0x00 0x00 0x47 0x01 0x00 0x40 // '????G??@' 0x01 0x00 0x00 0x00 0x4F 0x01 0x00 0x40 // '????O??@' 0x00 0x00 0x00 0x00 0x51 0x01 0x00 0x40 // '????Q??@' 0x02 0x00 0x00 0x00 0x66 0x01 0x00 0x40 // '????f??@' 0x00 0x00 0x00 0x00 0x68 0x01 0x00 0x40 // '????h??@' 0x03 0x00 0x00 0x00 0x6F 0x01 0x00 0x40 // '????o??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0xF7 0xFF 0x00 0x02 0x0B 0x00 0x00 0x80 // '?????' 0xBD 0x00 0x00 0x00 0x17 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x47 0x01 0x00 0x82 // '????G??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_8E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8E, 0x0) BYTE 0x03 0x03 0x20 0x20 0x43 0x48 0x41 0x52 // '?? CHAR' 0x4C 0x49 0x45 0x0D 0x0A 0x42 0x61 0x63 // 'LIE??Bac' 0x6B 0x67 0x72 0x6F 0x75 0x6E 0x64 0x0D // 'kground?' 0x0A 0x43 0x68 0x61 0x72 0x6C 0x69 0x65 // '?Charlie' 0x20 0x77 0x61 0x73 0x20 0x62 0x6F 0x72 // ' was bor' 0x6E 0x20 0x69 0x6E 0x20 0x48 0x61 0x72 // 'n in Har' 0x6C 0x65 0x6D 0x2C 0x20 0x4E 0x65 0x77 // 'lem, New' 0x20 0x59 0x6F 0x72 0x6B 0x20 0x43 0x69 // ' York Ci' 0x74 0x79 0x2E 0x20 0x20 0x48 0x65 0x20 // 'ty. He ' 0x6D 0x61 0x6B 0x65 0x73 0x20 0x73 0x74 // 'makes st' 0x72 0x61 0x69 0x67 0x68 0x74 0x20 0x41 // 'raight A' 0x92 0x73 0x20 0x61 0x6E 0x64 0x20 0x69 // 's and i' 0x73 0x20 0x73 0x75 0x63 0x68 0x20 0x61 // 's such a' 0x6E 0x20 0x65 0x78 0x63 0x65 0x70 0x74 // 'n except' 0x69 0x6F 0x6E 0x61 0x6C 0x20 0x61 0x74 // 'ional at' 0x68 0x6C 0x65 0x74 0x65 0x2C 0x20 0x68 // 'hlete, h' 0x65 0x20 0x68 0x61 0x73 0x20 0x61 0x20 // 'e has a ' 0x62 0x61 0x73 0x6B 0x65 0x74 0x62 0x61 // 'basketba' 0x6C 0x6C 0x20 0x20 0x73 0x63 0x68 0x6F // 'll scho' 0x6C 0x61 0x72 0x73 0x68 0x69 0x70 0x20 // 'larship ' 0x74 0x6F 0x20 0x53 0x79 0x72 0x61 0x63 // 'to Syrac' 0x75 0x73 0x65 0x20 0x55 0x6E 0x69 0x76 // 'use Univ' 0x65 0x72 0x73 0x69 0x74 0x79 0x2E 0x20 // 'ersity. ' 0x20 0x43 0x68 0x61 0x72 0x6C 0x69 0x65 // ' Charlie' 0x20 0x69 0x73 0x20 0x67 0x6F 0x6F 0x64 // ' is good' 0x20 0x61 0x74 0x20 0x74 0x68 0x72 0x6F // ' at thro' 0x77 0x69 0x6E 0x67 0x2C 0x20 0x62 0x75 // 'wing, bu' 0x74 0x20 0x68 0x65 0x92 0x73 0x20 0x72 // 't hes r' 0x65 0x61 0x6C 0x6C 0x79 0x20 0x67 0x6F // 'eally go' 0x6F 0x64 0x20 0x61 0x74 0x20 0x6A 0x75 // 'od at ju' 0x6D 0x70 0x69 0x6E 0x67 0x2E 0x20 0x20 // 'mping. ' 0x48 0x65 0x20 0x63 0x61 0x6E 0x20 0x6A // 'He can j' 0x75 0x6D 0x70 0x20 0x73 0x6F 0x20 0x68 // 'ump so h' 0x69 0x67 0x68 0x20 0x74 0x68 0x61 0x74 // 'igh that' 0x20 0x68 0x65 0x20 0x63 0x61 0x6E 0x20 // ' he can ' 0x74 0x6F 0x75 0x63 0x68 0x20 0x74 0x68 // 'touch th' 0x65 0x20 0x63 0x65 0x69 0x6C 0x69 0x6E // 'e ceilin' 0x67 0x20 0x69 0x6E 0x20 0x61 0x6E 0x79 // 'g in any' 0x20 0x62 0x75 0x69 0x6C 0x64 0x69 0x6E // ' buildin' 0x67 0x2E 0x0D 0x0A 0x44 0x72 0x65 0x61 // 'g.??Drea' 0x6D 0x20 0x52 0x6F 0x6C 0x65 0x73 0x0D // 'm Roles?' 0x0A 0x53 0x6B 0x65 0x6C 0x65 0x74 0x6F // '?Skeleto' 0x6E 0x3B 0x20 0x4C 0x61 0x76 0x61 0x20 // 'n; Lava ' 0x4C 0x61 0x6D 0x70 0x20 0x53 0x61 0x6C // 'Lamp Sal' 0x65 0x73 0x70 0x65 0x72 0x73 0x6F 0x6E // 'esperson' 0x3B 0x20 0x54 0x6F 0x75 0x72 0x69 0x73 // '; Touris' 0x74 // 't' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_A= ktpcBioPage11 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_A, __HELP_NAME("Bio Page 11 Christina")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_A, __HELP_NAME("Bio Page 11 Christina")) __HELP_PACK2 BO OSK LONG kgobBlankBalloon kgobBlankBalloon 0x0 kidBioTipScript 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_42=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_A, 0x0) GST(0) ITEM "kgobBlankBalloon" ITEM "ktpcBioPage11" ITEM "kgobBlankBalloon" ITEM "" ITEM "kidBioTipScript" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_42=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_A, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_6=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_42, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktipbio38 __HELP_SYMBOL( STN "ktipbio38" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktipbio39 __HELP_SYMBOL( STN "ktipbio39" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktipbio40 __HELP_SYMBOL( STN "ktipbio40" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktipbio37 __HELP_SYMBOL( STN "ktipbio37" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_42=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_42, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x20 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // ' ???????' 0x01 0x00 0x00 0x00 0xEB 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0xED 0x01 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0x17 0x02 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x0C 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x16 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0xED 0x01 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xF8 0x01 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x43 0x00 0x00 0x04 // '????C???' 0x0D 0x00 0x00 0xFE 0x51 0x00 0x00 0x04 // '???Q???' 0x00 0x00 0x00 0x00 0xED 0x01 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0xFA 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0x00 0x02 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x02 0x02 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x0C 0x02 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x0E 0x02 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x17 0x02 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x43 0x00 0x00 0x40 // '????C??@' 0x04 0x00 0x00 0x00 0x51 0x00 0x00 0x40 // '????Q??@' 0x00 0x00 0x00 0x00 0xED 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xFA 0x01 0x00 0x40 // '??????@' 0x01 0x00 0x00 0x00 0x00 0x02 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x02 0x02 0x00 0x40 // '???????@' 0x02 0x00 0x00 0x00 0x0C 0x02 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x0E 0x02 0x00 0x40 // '???????@' 0x03 0x00 0x00 0x00 0x17 0x02 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0xF7 0xFF 0x00 0x02 0x0C 0x00 0x00 0x80 // '?????' 0xBD 0x00 0x00 0x00 0x18 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xFA 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_42=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_42, 0x0) BYTE 0x03 0x03 0x20 0x43 0x48 0x52 0x49 0x53 // '?? CHRIS' 0x54 0x49 0x4E 0x41 0x0D 0x0A 0x42 0x61 // 'TINA??Ba' 0x63 0x6B 0x67 0x72 0x6F 0x75 0x6E 0x64 // 'ckground' 0x0D 0x0A 0x43 0x68 0x72 0x69 0x73 0x74 // '??Christ' 0x69 0x6E 0x61 0x20 0x68 0x61 0x73 0x20 // 'ina has ' 0x73 0x70 0x65 0x6E 0x74 0x20 0x33 0x20 // 'spent 3 ' 0x6F 0x66 0x20 0x68 0x65 0x72 0x20 0x32 // 'of her 2' 0x33 0x20 0x79 0x65 0x61 0x72 0x73 0x20 // '3 years ' 0x61 0x73 0x20 0x61 0x20 0x6D 0x75 0x73 // 'as a mus' 0x65 0x75 0x6D 0x20 0x63 0x75 0x72 0x61 // 'eum cura' 0x74 0x6F 0x72 0x20 0x20 0x69 0x6E 0x20 // 'tor in ' 0x4E 0x65 0x77 0x20 0x59 0x6F 0x72 0x6B // 'New York' 0x20 0x43 0x69 0x74 0x79 0x2E 0x20 0x20 // ' City. ' 0x4F 0x6E 0x65 0x20 0x64 0x61 0x79 0x20 // 'One day ' 0x77 0x68 0x69 0x6C 0x65 0x20 0x43 0x68 // 'while Ch' 0x72 0x69 0x73 0x74 0x69 0x6E 0x61 0x20 // 'ristina ' 0x77 0x61 0x73 0x20 0x61 0x64 0x6D 0x69 // 'was admi' 0x72 0x69 0x6E 0x67 0x20 0x73 0x6F 0x6D // 'ring som' 0x65 0x20 0x50 0x69 0x63 0x61 0x73 0x73 // 'e Picass' 0x6F 0x73 0x2C 0x20 0x73 0x68 0x65 0x20 // 'os, she ' 0x62 0x75 0x6D 0x70 0x65 0x64 0x20 0x69 // 'bumped i' 0x6E 0x74 0x6F 0x20 0x73 0x6F 0x6D 0x65 // 'nto some' 0x6F 0x6E 0x65 0x20 0x77 0x68 0x6F 0x20 // 'one who ' 0x77 0x61 0x73 0x20 0x69 0x6E 0x20 0x74 // 'was in t' 0x68 0x65 0x20 0x6D 0x75 0x73 0x65 0x75 // 'he museu' 0x6D 0x20 0x66 0x69 0x6C 0x6D 0x69 0x6E // 'm filmin' 0x67 0x20 0x61 0x20 0x6D 0x6F 0x76 0x69 // 'g a movi' 0x65 0x2E 0x20 0x20 0x49 0x74 0x20 0x77 // 'e. It w' 0x61 0x73 0x20 0x74 0x68 0x65 0x20 0x66 // 'as the f' 0x61 0x6D 0x6F 0x75 0x73 0x20 0x79 0x6F // 'amous yo' 0x75 0x6E 0x67 0x20 0x6D 0x6F 0x76 0x69 // 'ung movi' 0x65 0x20 0x64 0x69 0x72 0x65 0x63 0x74 // 'e direct' 0x6F 0x72 0x20 0x4D 0x65 0x6C 0x61 0x6E // 'or Melan' 0x69 0x65 0x2E 0x20 0x20 0x54 0x68 0x65 // 'ie. The' 0x79 0x20 0x73 0x74 0x61 0x72 0x74 0x65 // 'y starte' 0x64 0x20 0x74 0x61 0x6C 0x6B 0x69 0x6E // 'd talkin' 0x67 0x20 0x61 0x62 0x6F 0x75 0x74 0x20 // 'g about ' 0x61 0x72 0x74 0x2C 0x20 0x61 0x6E 0x64 // 'art, and' 0x20 0x65 0x6E 0x64 0x65 0x64 0x20 0x75 // ' ended u' 0x70 0x20 0x74 0x61 0x6C 0x6B 0x69 0x6E // 'p talkin' 0x67 0x20 0x61 0x62 0x6F 0x75 0x74 0x20 // 'g about ' 0x6D 0x6F 0x76 0x69 0x65 0x73 0x2E 0x20 // 'movies. ' 0x20 0x4D 0x65 0x6C 0x61 0x6E 0x69 0x65 // ' Melanie' 0x20 0x74 0x68 0x6F 0x75 0x67 0x68 0x74 // ' thought' 0x20 0x43 0x68 0x72 0x69 0x73 0x74 0x69 // ' Christi' 0x6E 0x61 0x20 0x68 0x61 0x64 0x20 0x61 // 'na had a' 0x20 0x6C 0x6F 0x74 0x20 0x6F 0x66 0x20 // ' lot of ' 0x67 0x72 0x65 0x61 0x74 0x20 0x69 0x64 // 'great id' 0x65 0x61 0x73 0x20 0x61 0x62 0x6F 0x75 // 'eas abou' 0x74 0x20 0x6D 0x6F 0x76 0x69 0x65 0x20 // 't movie ' 0x6D 0x61 0x6B 0x69 0x6E 0x67 0x2E 0x20 // 'making. ' 0x4E 0x6F 0x77 0x20 0x43 0x68 0x72 0x69 // 'Now Chri' 0x73 0x74 0x69 0x6E 0x61 0x20 0x6C 0x69 // 'stina li' 0x76 0x65 0x73 0x20 0x69 0x6E 0x20 0x49 // 'ves in I' 0x6D 0x61 0x67 0x69 0x6E 0x6F 0x70 0x6F // 'maginopo' 0x6C 0x69 0x73 0x2C 0x20 0x64 0x6F 0x69 // 'lis, doi' 0x6E 0x67 0x20 0x74 0x68 0x65 0x20 0x74 // 'ng the t' 0x68 0x69 0x6E 0x67 0x73 0x20 0x73 0x68 // 'hings sh' 0x65 0x20 0x64 0x69 0x64 0x20 0x69 0x6E // 'e did in' 0x20 0x72 0x65 0x61 0x6C 0x20 0x6C 0x69 // ' real li' 0x66 0x65 0x97 0x6F 0x6E 0x20 0x63 0x61 // 'feon ca' 0x6D 0x65 0x72 0x61 0x21 0x0D 0x0A 0x44 // 'mera!??D' 0x72 0x65 0x61 0x6D 0x20 0x52 0x6F 0x6C // 'ream Rol' 0x65 0x73 0x0D 0x0A 0x53 0x69 0x6E 0x67 // 'es??Sing' 0x65 0x72 0x3B 0x20 0x48 0x6F 0x6D 0x65 // 'er; Home' 0x20 0x4F 0x77 0x6E 0x65 0x72 0x3B 0x20 // ' Owner; ' 0x44 0x65 0x74 0x65 0x63 0x74 0x69 0x76 // 'Detectiv' 0x65 // 'e' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_B= ktpcBioPage12 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_B, __HELP_NAME("Bio Page 12 Claudia")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_B, __HELP_NAME("Bio Page 12 Claudia")) __HELP_PACK2 BO OSK LONG kgobBlankBalloon kgobBlankBalloon 0x0 kidBioTipScript 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_6=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_B, 0x0) GST(0) ITEM "kgobBlankBalloon" ITEM "ktpcBioPage12" ITEM "kgobBlankBalloon" ITEM "" ITEM "kidBioTipScript" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_6=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_B, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_B=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktipbio42 __HELP_SYMBOL( STN "ktipbio42" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktipbio43 __HELP_SYMBOL( STN "ktipbio43" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktipbio44 __HELP_SYMBOL( STN "ktipbio44" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktipbio41 __HELP_SYMBOL( STN "ktipbio41" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_6=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x22 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '"???????' 0x01 0x00 0x00 0x00 0x13 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x15 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x5F 0x01 0x00 0x01 // '????_???' 0x00 0x00 0x00 0x00 0x61 0x01 0x00 0x01 // '????a???' 0x01 0x00 0x00 0x00 0x80 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x09 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x13 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x61 0x01 0x00 0x03 // '????a???' 0x0A 0x00 0x00 0xFD 0x6C 0x01 0x00 0x03 // '???l???' 0x00 0x00 0x00 0x00 0x1D 0x01 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x2D 0x01 0x00 0x04 // '???-???' 0x00 0x00 0x00 0x00 0x61 0x01 0x00 0x04 // '????a???' 0x00 0x00 0x00 0x00 0x6E 0x01 0x00 0x04 // '????n???' 0x0D 0x00 0x00 0xFE 0x74 0x01 0x00 0x04 // '???t???' 0x00 0x00 0x00 0x00 0x76 0x01 0x00 0x04 // '????v???' 0x0D 0x00 0x00 0xFE 0x79 0x01 0x00 0x04 // '???y???' 0x00 0x00 0x00 0x00 0x7B 0x01 0x00 0x04 // '????{???' 0x0D 0x00 0x00 0xFE 0x80 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0x1D 0x01 0x00 0x40 // '???????@' 0x04 0x00 0x00 0x00 0x2D 0x01 0x00 0x40 // '????-??@' 0x00 0x00 0x00 0x00 0x61 0x01 0x00 0x40 // '????a??@' 0x00 0x00 0x00 0x00 0x6E 0x01 0x00 0x40 // '????n??@' 0x01 0x00 0x00 0x00 0x74 0x01 0x00 0x40 // '????t??@' 0x00 0x00 0x00 0x00 0x76 0x01 0x00 0x40 // '????v??@' 0x02 0x00 0x00 0x00 0x79 0x01 0x00 0x40 // '????y??@' 0x00 0x00 0x00 0x00 0x7B 0x01 0x00 0x40 // '????{??@' 0x03 0x00 0x00 0x00 0x80 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0xF7 0xFF 0x00 0x02 0x09 0x00 0x00 0x80 // '?????' 0xBD 0x00 0x00 0x00 0x15 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x6E 0x01 0x00 0x82 // '????n??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_6=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) BYTE 0x03 0x03 0x43 0x4C 0x41 0x55 0x44 0x49 // '??CLAUDI' 0x41 0x0D 0x0A 0x42 0x61 0x63 0x6B 0x67 // 'A??Backg' 0x72 0x6F 0x75 0x6E 0x64 0x0D 0x0A 0x43 // 'round??C' 0x6C 0x61 0x75 0x64 0x69 0x61 0x20 0x77 // 'laudia w' 0x61 0x73 0x20 0x62 0x6F 0x72 0x6E 0x20 // 'as born ' 0x69 0x6E 0x20 0x61 0x20 0x73 0x6D 0x61 // 'in a sma' 0x6C 0x6C 0x2C 0x20 0x6F 0x75 0x74 0x2D // 'll, out-' 0x6F 0x66 0x2D 0x74 0x68 0x65 0x2D 0x77 // 'of-the-w' 0x61 0x79 0x20 0x76 0x69 0x6C 0x6C 0x61 // 'ay villa' 0x67 0x65 0x20 0x69 0x6E 0x20 0x49 0x6E // 'ge in In' 0x64 0x69 0x61 0x20 0x33 0x33 0x20 0x79 // 'dia 33 y' 0x65 0x61 0x72 0x73 0x20 0x61 0x67 0x6F // 'ears ago' 0x2E 0x20 0x20 0x53 0x68 0x65 0x20 0x63 // '. She c' 0x6F 0x6D 0x65 0x73 0x20 0x66 0x72 0x6F // 'omes fro' 0x6D 0x20 0x61 0x20 0x6C 0x6F 0x6E 0x67 // 'm a long' 0x20 0x6C 0x69 0x6E 0x65 0x20 0x6F 0x66 // ' line of' 0x20 0x73 0x74 0x6F 0x72 0x79 0x2D 0x74 // ' story-t' 0x65 0x6C 0x6C 0x65 0x72 0x73 0x2E 0x20 // 'ellers. ' 0x20 0x49 0x6E 0x20 0x66 0x61 0x63 0x74 // ' In fact' 0x2C 0x20 0x68 0x65 0x72 0x20 0x66 0x61 // ', her fa' 0x6D 0x69 0x6C 0x79 0x20 0x74 0x72 0x61 // 'mily tra' 0x76 0x65 0x6C 0x73 0x20 0x61 0x72 0x6F // 'vels aro' 0x75 0x6E 0x64 0x20 0x49 0x6E 0x64 0x69 // 'und Indi' 0x61 0x20 0x68 0x6F 0x6C 0x64 0x69 0x6E // 'a holdin' 0x67 0x20 0x73 0x74 0x6F 0x72 0x79 0x2D // 'g story-' 0x74 0x65 0x6C 0x6C 0x69 0x6E 0x67 0x20 // 'telling ' 0x62 0x61 0x7A 0x61 0x61 0x72 0x73 0x2E // 'bazaars.' 0x20 0x20 0x45 0x76 0x65 0x6E 0x20 0x74 // ' Even t' 0x68 0x6F 0x75 0x67 0x68 0x20 0x43 0x6C // 'hough Cl' 0x61 0x75 0x64 0x69 0x61 0x20 0x6C 0x6F // 'audia lo' 0x76 0x65 0x73 0x20 0x74 0x68 0x65 0x20 // 'ves the ' 0x73 0x74 0x6F 0x72 0x69 0x65 0x73 0x20 // 'stories ' 0x73 0x68 0x65 0x20 0x67 0x72 0x65 0x77 // 'she grew' 0x20 0x75 0x70 0x20 0x77 0x69 0x74 0x68 // ' up with' 0x2C 0x20 0x73 0x68 0x65 0x20 0x77 0x61 // ', she wa' 0x6E 0x74 0x73 0x20 0x74 0x6F 0x20 0x6C // 'nts to l' 0x69 0x76 0x65 0x20 0x64 0x61 0x6E 0x67 // 'ive dang' 0x65 0x72 0x6F 0x75 0x73 0x6C 0x79 0x20 // 'erously ' 0x73 0x6F 0x20 0x73 0x68 0x65 0x92 0x6C // 'so shel' 0x6C 0x20 0x68 0x61 0x76 0x65 0x20 0x77 // 'l have w' 0x69 0x6C 0x64 0x20 0x73 0x74 0x6F 0x72 // 'ild stor' 0x69 0x65 0x73 0x20 0x74 0x6F 0x20 0x74 // 'ies to t' 0x65 0x6C 0x6C 0x20 0x68 0x65 0x72 0x20 // 'ell her ' 0x63 0x68 0x69 0x6C 0x64 0x72 0x65 0x6E // 'children' 0x2E 0x0D 0x0A 0x44 0x72 0x65 0x61 0x6D // '.??Dream' 0x20 0x52 0x6F 0x6C 0x65 0x73 0x0D 0x0A // ' Roles??' 0x48 0x69 0x70 0x70 0x69 0x65 0x3B 0x20 // 'Hippie; ' 0x43 0x6F 0x70 0x3B 0x20 0x50 0x69 0x6C // 'Cop; Pil' 0x6F 0x74 // 'ot' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_C= ktpcBioPage13 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_C, __HELP_NAME("Bio Page 13 Crash")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_C, __HELP_NAME("Bio Page 13 Crash")) __HELP_PACK2 BO OSK LONG kgobBlankBalloon kgobBlankBalloon 0x0 kidBioTipScript 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_7=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_C, 0x0) GST(0) ITEM "kgobBlankBalloon" ITEM "ktpcBioPage13" ITEM "kgobBlankBalloon" ITEM "" ITEM "kidBioTipScript" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_7=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_C, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_C=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktipbio46 __HELP_SYMBOL( STN "ktipbio46" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktipbio47 __HELP_SYMBOL( STN "ktipbio47" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktipbio48 __HELP_SYMBOL( STN "ktipbio48" ) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktipbio45 __HELP_SYMBOL( STN "ktipbio45" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_7=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x21 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '!???????' 0x01 0x00 0x00 0x00 0xD9 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0xDB 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0x16 0x01 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x07 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x11 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0x13 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0xDB 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xE6 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x45 0x00 0x00 0x04 // '????E???' 0x0D 0x00 0x00 0xFE 0x4B 0x00 0x00 0x04 // '???K???' 0x00 0x00 0x00 0x00 0xDB 0x00 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0xE8 0x00 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xF9 0x00 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xFB 0x00 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0x04 0x01 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x06 0x01 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x16 0x01 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x45 0x00 0x00 0x40 // '????E??@' 0x05 0x00 0x00 0x00 0x4B 0x00 0x00 0x40 // '????K??@' 0x00 0x00 0x00 0x00 0xDB 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xE8 0x00 0x00 0x40 // '??????@' 0x01 0x00 0x00 0x00 0xF9 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xFB 0x00 0x00 0x40 // '??????@' 0x02 0x00 0x00 0x00 0x04 0x01 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x06 0x01 0x00 0x40 // '???????@' 0x03 0x00 0x00 0x00 0x16 0x01 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0xF7 0xFF 0x00 0x02 0x07 0x00 0x00 0x80 // '?????' 0xBD 0x00 0x00 0x00 0x13 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xE8 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_7=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) BYTE 0x03 0x03 0x43 0x52 0x41 0x53 0x48 0x0D // '??CRASH?' 0x0A 0x42 0x61 0x63 0x6B 0x67 0x72 0x6F // '?Backgro' 0x75 0x6E 0x64 0x0D 0x0A 0x43 0x72 0x61 // 'und??Cra' 0x73 0x68 0x20 0x77 0x6F 0x6B 0x65 0x20 // 'sh woke ' 0x75 0x70 0x20 0x33 0x33 0x20 0x79 0x65 // 'up 33 ye' 0x61 0x72 0x73 0x20 0x61 0x67 0x6F 0x20 // 'ars ago ' 0x6F 0x6E 0x20 0x61 0x20 0x64 0x65 0x73 // 'on a des' 0x65 0x72 0x74 0x65 0x64 0x20 0x74 0x72 // 'erted tr' 0x6F 0x70 0x69 0x63 0x61 0x6C 0x20 0x69 // 'opical i' 0x73 0x6C 0x61 0x6E 0x64 0x2E 0x20 0x48 // 'sland. H' 0x65 0x20 0x64 0x6F 0x65 0x73 0x6E 0x92 // 'e doesn' 0x74 0x20 0x6B 0x6E 0x6F 0x77 0x20 0x68 // 't know h' 0x6F 0x77 0x20 0x68 0x65 0x20 0x67 0x6F // 'ow he go' 0x74 0x20 0x74 0x68 0x65 0x72 0x65 0x20 // 't there ' 0x6F 0x72 0x20 0x77 0x68 0x65 0x72 0x65 // 'or where' 0x20 0x68 0x65 0x20 0x63 0x61 0x6D 0x65 // ' he came' 0x20 0x66 0x72 0x6F 0x6D 0x2E 0x20 0x48 // ' from. H' 0x65 0x20 0x77 0x61 0x6E 0x74 0x73 0x20 // 'e wants ' 0x74 0x6F 0x20 0x62 0x65 0x63 0x6F 0x6D // 'to becom' 0x65 0x20 0x61 0x20 0x66 0x61 0x6D 0x6F // 'e a famo' 0x75 0x73 0x20 0x61 0x63 0x74 0x6F 0x72 // 'us actor' 0x20 0x73 0x6F 0x20 0x74 0x68 0x61 0x74 // ' so that' 0x20 0x6D 0x61 0x79 0x62 0x65 0x20 0x68 // ' maybe h' 0x69 0x73 0x20 0x69 0x6E 0x76 0x65 0x6E // 'is inven' 0x74 0x6F 0x72 0x20 0x77 0x69 0x6C 0x6C // 'tor will' 0x20 0x73 0x65 0x65 0x20 0x68 0x69 0x6D // ' see him' 0x20 0x61 0x6E 0x64 0x20 0x63 0x61 0x6C // ' and cal' 0x6C 0x2E 0x20 0x0D 0x0A 0x44 0x72 0x65 // 'l. ??Dre' 0x61 0x6D 0x20 0x52 0x6F 0x6C 0x65 0x73 // 'am Roles' 0x0D 0x0A 0x57 0x69 0x6C 0x6C 0x79 0x27 // '??Willy'' 0x73 0x20 0x49 0x6E 0x76 0x65 0x6E 0x74 // 's Invent' 0x69 0x6F 0x6E 0x3B 0x20 0x52 0x6F 0x62 // 'ion; Rob' 0x6F 0x74 0x20 0x43 0x6F 0x70 0x3B 0x20 // 'ot Cop; ' 0x46 0x6C 0x69 0x67 0x68 0x74 0x20 0x41 // 'Flight A' 0x74 0x74 0x65 0x6E 0x64 0x61 0x6E 0x74 // 'ttendant' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_D= ktpcBioPage14 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_D, __HELP_NAME("Bio Page 14 Eliza")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_D, __HELP_NAME("Bio Page 14 Eliza")) __HELP_PACK2 BO OSK LONG kgobBlankBalloon kgobBlankBalloon 0x0 kidBioTipScript 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_CF=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_D, 0x0) GST(0) ITEM "kgobBlankBalloon" ITEM "ktpcBioPage14" ITEM "kgobBlankBalloon" ITEM "" ITEM "kidBioTipScript" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_CF=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_D, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_3=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_CF, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktipbio49 __HELP_SYMBOL( STN "ktipbio49" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktipbio51 __HELP_SYMBOL( STN "ktipbio51" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktipbio52 __HELP_SYMBOL( STN "ktipbio52" ) FREE ITEM LONG 0x40000001 VAR BYTE 2 LONG ktipbio50 __HELP_SYMBOL( STN "ktipbio50" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_CF=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_CF, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x1F 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xD4 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0xD6 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xFA 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x07 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x11 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0x13 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0xD6 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xE1 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0xCB 0x00 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xD2 0x00 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xE3 0x00 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xE9 0x00 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xEB 0x00 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xF0 0x00 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xF2 0x00 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xFA 0x00 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xCB 0x00 0x00 0x40 // '??????@' 0x01 0x00 0x00 0x00 0xD2 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xE3 0x00 0x00 0x40 // '??????@' 0x05 0x00 0x00 0x00 0xE9 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xEB 0x00 0x00 0x40 // '??????@' 0x02 0x00 0x00 0x00 0xF0 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xF2 0x00 0x00 0x40 // '??????@' 0x03 0x00 0x00 0x00 0xFA 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0xF7 0xFF 0x00 0x02 0x07 0x00 0x00 0x80 // '?????' 0xBD 0x00 0x00 0x00 0x13 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xE3 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_CF=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_CF, 0x0) BYTE 0x03 0x03 0x45 0x4C 0x49 0x5A 0x41 0x0D // '??ELIZA?' 0x0A 0x42 0x61 0x63 0x6B 0x67 0x72 0x6F // '?Backgro' 0x75 0x6E 0x64 0x0D 0x0A 0x45 0x6C 0x69 // 'und??Eli' 0x7A 0x61 0x20 0x6C 0x69 0x76 0x65 0x73 // 'za lives' 0x20 0x69 0x6E 0x20 0x43 0x61 0x6E 0x63 // ' in Canc' 0x75 0x6E 0x2C 0x20 0x4D 0x65 0x78 0x69 // 'un, Mexi' 0x63 0x6F 0x20 0x77 0x68 0x65 0x72 0x65 // 'co where' 0x20 0x74 0x68 0x65 0x20 0x77 0x61 0x74 // ' the wat' 0x65 0x72 0x20 0x69 0x73 0x20 0x74 0x75 // 'er is tu' 0x72 0x71 0x75 0x6F 0x69 0x73 0x65 0x20 // 'rquoise ' 0x61 0x6E 0x64 0x20 0x63 0x6C 0x65 0x61 // 'and clea' 0x72 0x2E 0x20 0x20 0x53 0x68 0x65 0x20 // 'r. She ' 0x69 0x73 0x20 0x74 0x68 0x65 0x20 0x6F // 'is the o' 0x6C 0x64 0x65 0x73 0x74 0x20 0x6F 0x66 // 'ldest of' 0x20 0x6E 0x69 0x6E 0x65 0x20 0x63 0x68 // ' nine ch' 0x69 0x6C 0x64 0x72 0x65 0x6E 0x2E 0x20 // 'ildren. ' 0x20 0x57 0x68 0x65 0x6E 0x20 0x73 0x68 // ' When sh' 0x65 0x20 0x69 0x73 0x6E 0x92 0x74 0x20 // 'e isnt ' 0x68 0x65 0x6C 0x70 0x69 0x6E 0x67 0x20 // 'helping ' 0x68 0x65 0x72 0x20 0x6D 0x6F 0x74 0x68 // 'her moth' 0x65 0x72 0x20 0x69 0x6E 0x20 0x74 0x68 // 'er in th' 0x65 0x69 0x72 0x20 0x73 0x74 0x6F 0x72 // 'eir stor' 0x65 0x2C 0x20 0x73 0x68 0x65 0x20 0x70 // 'e, she p' 0x72 0x61 0x63 0x74 0x69 0x63 0x65 0x73 // 'ractices' 0x20 0x73 0x69 0x6E 0x67 0x69 0x6E 0x67 // ' singing' 0x20 0x61 0x6E 0x64 0x20 0x64 0x61 0x6E // ' and dan' 0x63 0x69 0x6E 0x67 0x2E 0x20 0x0D 0x0A // 'cing. ??' 0x44 0x72 0x65 0x61 0x6D 0x20 0x52 0x6F // 'Dream Ro' 0x6C 0x65 0x73 0x0D 0x0A 0x48 0x69 0x70 // 'les??Hip' 0x70 0x69 0x65 0x3B 0x20 0x4E 0x75 0x72 // 'pie; Nur' 0x73 0x65 0x3B 0x20 0x45 0x78 0x70 0x6C // 'se; Expl' 0x6F 0x72 0x65 0x72 // 'orer' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_E= ktpcBioPage15 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_E, __HELP_NAME("Bio Page 15 Frank")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_E, __HELP_NAME("Bio Page 15 Frank")) __HELP_PACK2 BO OSK LONG kgobBlankBalloon kgobBlankBalloon 0x0 kidBioTipScript 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_E, 0x0) GST(0) ITEM "kgobBlankBalloon" ITEM "ktpcBioPage15" ITEM "kgobBlankBalloon" ITEM "" ITEM "kidBioTipScript" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_E, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_8=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktipbio53 __HELP_SYMBOL( STN "ktipbio53" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktipbio55 __HELP_SYMBOL( STN "ktipbio55" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktipbio56 __HELP_SYMBOL( STN "ktipbio56" ) FREE ITEM LONG 0x40000001 VAR BYTE 2 LONG ktipbio54 __HELP_SYMBOL( STN "ktipbio54" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_3=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x1F 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xDB 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0xDD 0x01 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0x09 0x02 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x07 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x11 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0x13 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0xDD 0x01 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xE8 0x01 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x9B 0x00 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xA8 0x00 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xEA 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xF4 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xF6 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xFD 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xFF 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0x09 0x02 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x9B 0x00 0x00 0x40 // '??????@' 0x01 0x00 0x00 0x00 0xA8 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xEA 0x01 0x00 0x40 // '??????@' 0x05 0x00 0x00 0x00 0xF4 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xF6 0x01 0x00 0x40 // '??????@' 0x02 0x00 0x00 0x00 0xFD 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xFF 0x01 0x00 0x40 // '??????@' 0x03 0x00 0x00 0x00 0x09 0x02 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0xF7 0xFF 0x00 0x02 0x07 0x00 0x00 0x80 // '?????' 0xBD 0x00 0x00 0x00 0x13 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xEA 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) BYTE 0x03 0x03 0x46 0x52 0x41 0x4E 0x4B 0x0D // '??FRANK?' 0x0A 0x42 0x61 0x63 0x6B 0x67 0x72 0x6F // '?Backgro' 0x75 0x6E 0x64 0x0D 0x0A 0x46 0x72 0x61 // 'und??Fra' 0x6E 0x6B 0x20 0x6C 0x6F 0x6F 0x6B 0x73 // 'nk looks' 0x20 0x6C 0x69 0x6B 0x65 0x20 0x61 0x20 // ' like a ' 0x6B 0x69 0x64 0x97 0x68 0x65 0x92 0x73 // 'kidhes' 0x20 0x73 0x68 0x6F 0x72 0x74 0x20 0x61 // ' short a' 0x6E 0x64 0x20 0x68 0x65 0x20 0x77 0x65 // 'nd he we' 0x61 0x72 0x73 0x20 0x68 0x69 0x73 0x20 // 'ars his ' 0x68 0x61 0x69 0x72 0x20 0x69 0x6E 0x20 // 'hair in ' 0x74 0x68 0x65 0x20 0x6C 0x61 0x74 0x65 // 'the late' 0x73 0x74 0x20 0x63 0x75 0x74 0x2E 0x20 // 'st cut. ' 0x20 0x42 0x75 0x74 0x20 0x68 0x65 0x27 // ' But he'' 0x73 0x20 0x72 0x65 0x61 0x6C 0x6C 0x79 // 's really' 0x20 0x34 0x32 0x2E 0x20 0x46 0x72 0x61 // ' 42. Fra' 0x6E 0x6B 0x20 0x61 0x6C 0x73 0x6F 0x20 // 'nk also ' 0x6C 0x6F 0x6F 0x6B 0x73 0x20 0x73 0x61 // 'looks sa' 0x64 0x2C 0x20 0x62 0x65 0x63 0x61 0x75 // 'd, becau' 0x73 0x65 0x20 0x68 0x65 0x92 0x73 0x20 // 'se hes ' 0x62 0x65 0x65 0x6E 0x20 0x6D 0x69 0x73 // 'been mis' 0x75 0x6E 0x64 0x65 0x72 0x73 0x74 0x6F // 'understo' 0x6F 0x64 0x20 0x61 0x6C 0x6C 0x20 0x68 // 'od all h' 0x69 0x73 0x20 0x6C 0x69 0x66 0x65 0x2E // 'is life.' 0x20 0x20 0x45 0x76 0x65 0x6E 0x20 0x74 // ' Even t' 0x68 0x6F 0x75 0x67 0x68 0x20 0x68 0x65 // 'hough he' 0x20 0x6C 0x6F 0x6F 0x6B 0x73 0x20 0x6C // ' looks l' 0x69 0x6B 0x65 0x20 0x61 0x20 0x74 0x6F // 'ike a to' 0x75 0x67 0x68 0x20 0x67 0x75 0x79 0x20 // 'ugh guy ' 0x61 0x6E 0x64 0x20 0x68 0x65 0x20 0x64 // 'and he d' 0x6F 0x65 0x73 0x6E 0x92 0x74 0x20 0x6C // 'oesnt l' 0x6F 0x6F 0x6B 0x20 0x76 0x65 0x72 0x79 // 'ook very' 0x20 0x73 0x6D 0x61 0x72 0x74 0x2C 0x20 // ' smart, ' 0x68 0x65 0x92 0x73 0x20 0x72 0x65 0x61 // 'hes rea' 0x6C 0x6C 0x79 0x20 0x61 0x20 0x73 0x65 // 'lly a se' 0x6E 0x73 0x69 0x74 0x69 0x76 0x65 0x2C // 'nsitive,' 0x20 0x67 0x65 0x6E 0x74 0x6C 0x65 0x20 // ' gentle ' 0x67 0x75 0x79 0x20 0x77 0x68 0x6F 0x20 // 'guy who ' 0x69 0x73 0x20 0x6E 0x6F 0x74 0x20 0x6F // 'is not o' 0x6E 0x6C 0x79 0x20 0x73 0x6D 0x61 0x72 // 'nly smar' 0x74 0x2C 0x20 0x62 0x75 0x74 0x20 0x61 // 't, but a' 0x6C 0x73 0x6F 0x20 0x73 0x65 0x63 0x72 // 'lso secr' 0x65 0x74 0x6C 0x79 0x20 0x77 0x72 0x69 // 'etly wri' 0x74 0x65 0x73 0x20 0x73 0x6F 0x6E 0x67 // 'tes song' 0x73 0x20 0x97 0x20 0x75 0x73 0x75 0x61 // 's usua' 0x6C 0x6C 0x79 0x20 0x73 0x61 0x64 0x20 // 'lly sad ' 0x73 0x6F 0x6E 0x67 0x73 0x2E 0x20 0x48 // 'songs. H' 0x65 0x92 0x64 0x20 0x6C 0x69 0x6B 0x65 // 'ed like' 0x20 0x74 0x6F 0x20 0x73 0x69 0x6E 0x67 // ' to sing' 0x20 0x68 0x69 0x73 0x20 0x73 0x6F 0x6E // ' his son' 0x67 0x73 0x2C 0x20 0x62 0x75 0x74 0x20 // 'gs, but ' 0x62 0x65 0x63 0x61 0x75 0x73 0x65 0x20 // 'because ' 0x68 0x69 0x73 0x20 0x6E 0x6F 0x73 0x65 // 'his nose' 0x20 0x61 0x6C 0x6D 0x6F 0x73 0x74 0x20 // ' almost ' 0x63 0x6F 0x76 0x65 0x72 0x73 0x20 0x68 // 'covers h' 0x69 0x73 0x20 0x75 0x70 0x70 0x65 0x72 // 'is upper' 0x20 0x6C 0x69 0x70 0x2C 0x20 0x74 0x68 // ' lip, th' 0x65 0x20 0x77 0x6F 0x72 0x64 0x73 0x20 // 'e words ' 0x63 0x6F 0x6D 0x65 0x20 0x6F 0x75 0x74 // 'come out' 0x20 0x61 0x6C 0x6C 0x20 0x77 0x72 0x6F // ' all wro' 0x6E 0x67 0x2E 0x20 0x20 0x0D 0x0A 0x44 // 'ng. ??D' 0x72 0x65 0x61 0x6D 0x20 0x52 0x6F 0x6C // 'ream Rol' 0x65 0x73 0x0D 0x0A 0x47 0x75 0x69 0x6E // 'es??Guin' 0x65 0x61 0x20 0x50 0x69 0x67 0x3B 0x20 // 'ea Pig; ' 0x56 0x69 0x6C 0x6C 0x69 0x61 0x6E 0x3B // 'Villian;' 0x20 0x4A 0x75 0x6E 0x67 0x6C 0x65 0x20 // ' Jungle ' 0x4D 0x61 0x6E // 'Man' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_F= ktpcBioPage16 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_F, __HELP_NAME("Bio Page 16 Gabriel")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_F, __HELP_NAME("Bio Page 16 Gabriel")) __HELP_PACK2 BO OSK LONG kgobBlankBalloon kgobBlankBalloon 0x0 kidBioTipScript 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_F, 0x0) GST(0) ITEM "kgobBlankBalloon" ITEM "ktpcBioPage16" ITEM "kgobBlankBalloon" ITEM "" ITEM "kidBioTipScript" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_F, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_F=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktipbio57 __HELP_SYMBOL( STN "ktipbio57" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktipbio59 __HELP_SYMBOL( STN "ktipbio59" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktipbio60 __HELP_SYMBOL( STN "ktipbio60" ) FREE ITEM LONG 0x40000001 VAR BYTE 2 LONG ktipbio58 __HELP_SYMBOL( STN "ktipbio58" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x21 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '!???????' 0x01 0x00 0x00 0x00 0x1F 0x01 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x21 0x01 0x00 0x01 // '????!???' 0x01 0x00 0x00 0x00 0x57 0x01 0x00 0x01 // '????W???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x09 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x13 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0x15 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x21 0x01 0x00 0x03 // '????!???' 0x0A 0x00 0x00 0xFD 0x2C 0x01 0x00 0x03 // '???,???' 0x00 0x00 0x00 0x00 0xD9 0x00 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xE1 0x00 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0x2E 0x01 0x00 0x04 // '????.???' 0x0D 0x00 0x00 0xFE 0x43 0x01 0x00 0x04 // '???C???' 0x00 0x00 0x00 0x00 0x45 0x01 0x00 0x04 // '????E???' 0x0D 0x00 0x00 0xFE 0x49 0x01 0x00 0x04 // '???I???' 0x00 0x00 0x00 0x00 0x4B 0x01 0x00 0x04 // '????K???' 0x0D 0x00 0x00 0xFE 0x57 0x01 0x00 0x04 // '???W???' 0x00 0x00 0x00 0x00 0xD9 0x00 0x00 0x40 // '??????@' 0x01 0x00 0x00 0x00 0xE1 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x2E 0x01 0x00 0x40 // '????.??@' 0x05 0x00 0x00 0x00 0x43 0x01 0x00 0x40 // '????C??@' 0x00 0x00 0x00 0x00 0x45 0x01 0x00 0x40 // '????E??@' 0x02 0x00 0x00 0x00 0x49 0x01 0x00 0x40 // '????I??@' 0x00 0x00 0x00 0x00 0x4B 0x01 0x00 0x40 // '????K??@' 0x03 0x00 0x00 0x00 0x57 0x01 0x00 0x40 // '????W??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0xF7 0xFF 0x00 0x02 0x09 0x00 0x00 0x80 // '?????' 0xBD 0x00 0x00 0x00 0x15 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x15 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x74 0x00 0x00 0x82 // '????t??' 0x05 0x00 0x00 0x00 0x2E 0x01 0x00 0x82 // '????.??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B, 0x0) BYTE 0x03 0x03 0x47 0x41 0x42 0x52 0x49 0x45 // '??GABRIE' 0x4C 0x0D 0x0A 0x42 0x61 0x63 0x6B 0x67 // 'L??Backg' 0x72 0x6F 0x75 0x6E 0x64 0x0D 0x0A 0x47 // 'round??G' 0x61 0x62 0x72 0x69 0x65 0x6C 0x20 0x69 // 'abriel i' 0x73 0x20 0x66 0x72 0x6F 0x6D 0x20 0x56 // 's from V' 0x65 0x6E 0x69 0x63 0x65 0x20 0x42 0x65 // 'enice Be' 0x61 0x63 0x68 0x2C 0x20 0x43 0x61 0x6C // 'ach, Cal' 0x69 0x66 0x6F 0x72 0x6E 0x69 0x61 0x2E // 'ifornia.' 0x20 0x20 0x41 0x74 0x20 0x61 0x67 0x65 // ' At age' 0x20 0x6F 0x6E 0x65 0x2C 0x20 0x68 0x65 // ' one, he' 0x20 0x63 0x61 0x6E 0x20 0x63 0x6C 0x65 // ' can cle' 0x61 0x72 0x6C 0x79 0x20 0x73 0x61 0x79 // 'arly say' 0x2C 0x20 0x93 0x57 0x61 0x79 0x20 0x63 // ', Way c' 0x6F 0x6F 0x6C 0x2C 0x20 0x64 0x75 0x64 // 'ool, dud' 0x65 0x21 0x94 0x20 0x0D 0x0A 0x48 0x69 // 'e! ??Hi' 0x73 0x20 0x70 0x61 0x72 0x65 0x6E 0x74 // 's parent' 0x73 0x20 0x67 0x61 0x76 0x65 0x20 0x75 // 's gave u' 0x70 0x20 0x74 0x72 0x79 0x69 0x6E 0x67 // 'p trying' 0x20 0x74 0x6F 0x20 0x6B 0x65 0x65 0x70 // ' to keep' 0x20 0x61 0x6E 0x20 0x65 0x79 0x65 0x20 // ' an eye ' 0x6F 0x6E 0x20 0x47 0x61 0x62 0x72 0x69 // 'on Gabri' 0x65 0x6C 0x20 0x77 0x68 0x65 0x6E 0x20 // 'el when ' 0x68 0x65 0x20 0x77 0x61 0x73 0x20 0x36 // 'he was 6' 0x20 0x6D 0x6F 0x6E 0x74 0x68 0x73 0x20 // ' months ' 0x6F 0x6C 0x64 0x20 0x62 0x65 0x63 0x61 // 'old beca' 0x75 0x73 0x65 0x20 0x68 0x65 0x20 0x77 // 'use he w' 0x61 0x73 0x20 0x61 0x6C 0x72 0x65 0x61 // 'as alrea' 0x64 0x79 0x20 0x63 0x72 0x61 0x77 0x6C // 'dy crawl' 0x69 0x6E 0x67 0x20 0x74 0x6F 0x20 0x74 // 'ing to t' 0x68 0x65 0x20 0x6D 0x61 0x6C 0x6C 0x20 // 'he mall ' 0x74 0x6F 0x20 0x74 0x72 0x79 0x20 0x6F // 'to try o' 0x6E 0x20 0x6E 0x65 0x77 0x20 0x6E 0x65 // 'n new ne' 0x6F 0x6E 0x20 0x74 0x2D 0x73 0x68 0x69 // 'on t-shi' 0x72 0x74 0x73 0x20 0x61 0x6E 0x64 0x20 // 'rts and ' 0x6D 0x61 0x74 0x63 0x68 0x69 0x6E 0x67 // 'matching' 0x20 0x64 0x69 0x61 0x70 0x65 0x72 0x73 // ' diapers' 0x2E 0x0D 0x0A 0x44 0x72 0x65 0x61 0x6D // '.??Dream' 0x20 0x52 0x6F 0x6C 0x65 0x73 0x0D 0x0A // ' Roles??' 0x53 0x70 0x6F 0x6F 0x6B 0x79 0x27 0x73 // 'Spooky's' 0x20 0x59 0x6F 0x75 0x6E 0x67 0x65 0x73 // ' Younges' 0x74 0x20 0x53 0x6F 0x6E 0x3B 0x20 0x53 // 't Son; S' 0x74 0x61 0x72 0x3B 0x20 0x59 0x6F 0x75 // 'tar; You' 0x6E 0x67 0x20 0x4E 0x61 0x74 0x69 0x76 // 'ng Nativ' 0x65 // 'e' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_10= ktpcBioPage17 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_10, __HELP_NAME("Bio Page 17 Gregory")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_10, __HELP_NAME("Bio Page 17 Gregory")) __HELP_PACK2 BO OSK LONG kgobBlankBalloon kgobBlankBalloon 0x0 kidBioTipScript 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_10, 0x0) GST(0) ITEM "kgobBlankBalloon" ITEM "ktpcBioPage17" ITEM "kgobBlankBalloon" ITEM "" ITEM "kidBioTipScript" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_10, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_10=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktipbio61 __HELP_SYMBOL( STN "ktipbio61" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktipbio63 __HELP_SYMBOL( STN "ktipbio63" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktipbio64 __HELP_SYMBOL( STN "ktipbio64" ) FREE ITEM LONG 0x40000001 VAR BYTE 2 LONG ktipbio62 __HELP_SYMBOL( STN "ktipbio62" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x1F 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x39 0x01 0x00 0x01 // '????9???' 0x00 0x00 0x00 0x00 0x3C 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0xF6 0x00 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xFD 0x00 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0x30 0x01 0x00 0x04 // '????0???' 0x00 0x00 0x00 0x00 0x40 0x01 0x00 0x04 // '????@???' 0x0D 0x00 0x00 0xFE 0x61 0x01 0x00 0x04 // '???a???' 0x00 0x00 0x00 0x00 0x63 0x01 0x00 0x04 // '????c???' 0x0D 0x00 0x00 0xFE 0x83 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0x85 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0x94 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xF6 0x00 0x00 0x40 // '??????@' 0x01 0x00 0x00 0x00 0xFD 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x30 0x01 0x00 0x40 // '????0??@' 0x00 0x00 0x00 0x00 0x40 0x01 0x00 0x40 // '????@??@' 0x02 0x00 0x00 0x00 0x61 0x01 0x00 0x40 // '????a??@' 0x00 0x00 0x00 0x00 0x63 0x01 0x00 0x40 // '????c??@' 0x03 0x00 0x00 0x00 0x83 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x85 0x01 0x00 0x40 // '??????@' 0x04 0x00 0x00 0x00 0x94 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0xF7 0xFF 0x00 0x02 0x0A 0x00 0x00 0x80 // '?????' 0xBD 0x00 0x00 0x00 0x16 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x40 0x01 0x00 0x82 // '????@??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_76=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_76, 0x0) BYTE 0x03 0x03 0x53 0x41 0x4C 0x56 0x41 0x44 // '??SALVAD' 0x4F 0x52 0x0D 0x0A 0x42 0x61 0x63 0x6B // 'OR??Back' 0x67 0x72 0x6F 0x75 0x6E 0x64 0x0D 0x0A // 'ground??' 0x53 0x61 0x6C 0x76 0x61 0x64 0x6F 0x72 // 'Salvador' 0x20 0x77 0x61 0x73 0x20 0x62 0x6F 0x72 // ' was bor' 0x6E 0x20 0x31 0x34 0x20 0x79 0x65 0x61 // 'n 14 yea' 0x72 0x73 0x20 0x61 0x67 0x6F 0x20 0x69 // 'rs ago i' 0x6E 0x20 0x4D 0x61 0x64 0x72 0x69 0x64 // 'n Madrid' 0x2E 0x20 0x48 0x65 0x20 0x68 0x61 0x73 // '. He has' 0x20 0x73 0x70 0x65 0x6E 0x74 0x20 0x74 // ' spent t' 0x68 0x65 0x20 0x6C 0x61 0x73 0x74 0x20 // 'he last ' 0x66 0x69 0x76 0x65 0x20 0x79 0x65 0x61 // 'five yea' 0x72 0x73 0x20 0x62 0x65 0x63 0x6F 0x6D // 'rs becom' 0x69 0x6E 0x67 0x20 0x61 0x20 0x76 0x65 // 'ing a ve' 0x72 0x79 0x20 0x63 0x6F 0x6F 0x6C 0x20 // 'ry cool ' 0x74 0x65 0x65 0x6E 0x61 0x67 0x65 0x72 // 'teenager' 0x2E 0x20 0x48 0x65 0x20 0x69 0x73 0x20 // '. He is ' 0x73 0x65 0x72 0x69 0x6F 0x75 0x73 0x6C // 'seriousl' 0x79 0x20 0x67 0x6F 0x6F 0x64 0x20 0x77 // 'y good w' 0x69 0x74 0x68 0x20 0x61 0x6C 0x6C 0x20 // 'ith all ' 0x74 0x68 0x65 0x20 0x6E 0x65 0x77 0x20 // 'the new ' 0x63 0x6F 0x6D 0x70 0x75 0x74 0x65 0x72 // 'computer' 0x20 0x67 0x61 0x6D 0x65 0x73 0x2C 0x20 // ' games, ' 0x68 0x65 0x20 0x68 0x61 0x73 0x20 0x74 // 'he has t' 0x68 0x65 0x20 0x6C 0x61 0x74 0x65 0x73 // 'he lates' 0x74 0x20 0x68 0x61 0x69 0x72 0x63 0x75 // 't haircu' 0x74 0x2C 0x20 0x61 0x6E 0x64 0x20 0x61 // 't, and a' 0x6C 0x6C 0x20 0x74 0x68 0x65 0x20 0x67 // 'll the g' 0x69 0x72 0x6C 0x73 0x20 0x74 0x68 0x69 // 'irls thi' 0x6E 0x6B 0x20 0x68 0x65 0x20 0x69 0x73 // 'nk he is' 0x20 0x72 0x65 0x61 0x6C 0x6C 0x79 0x20 // ' really ' 0x73 0x70 0x65 0x63 0x69 0x61 0x6C 0x2E // 'special.' 0x20 0x42 0x75 0x74 0x20 0x74 0x68 0x65 // ' But the' 0x79 0x20 0x64 0x6F 0x6E 0x92 0x74 0x20 // 'y dont ' 0x6B 0x6E 0x6F 0x77 0x20 0x6A 0x75 0x73 // 'know jus' 0x74 0x20 0x68 0x6F 0x77 0x20 0x73 0x70 // 't how sp' 0x65 0x63 0x69 0x61 0x6C 0x20 0x53 0x61 // 'ecial Sa' 0x6C 0x76 0x61 0x64 0x6F 0x72 0x20 0x69 // 'lvador i' 0x73 0x2E 0x20 0x0D 0x0A 0x44 0x72 0x65 // 's. ??Dre' 0x61 0x6D 0x20 0x52 0x6F 0x6C 0x65 0x73 // 'am Roles' 0x0D 0x0A 0x54 0x72 0x69 0x63 0x6B 0x2D // '??Trick-' 0x6F 0x72 0x2D 0x54 0x72 0x65 0x61 0x74 // 'or-Treat' 0x65 0x72 0x20 0x44 0x72 0x65 0x73 0x73 // 'er Dress' 0x65 0x64 0x20 0x61 0x73 0x20 0x5A 0x6F // 'ed as Zo' 0x72 0x72 0x6F 0x3B 0x20 0x4D 0x65 0x6D // 'rro; Mem' 0x62 0x65 0x72 0x20 0x6F 0x66 0x20 0x74 // 'ber of t' 0x68 0x65 0x20 0x4B 0x69 0x64 0x73 0x27 // 'he Kids'' 0x20 0x4D 0x79 0x73 0x74 0x65 0x72 0x79 // ' Mystery' 0x20 0x43 0x6C 0x75 0x62 0x3B 0x20 0x50 // ' Club; P' 0x72 0x65 0x68 0x69 0x73 0x74 0x6F 0x72 // 'rehistor' 0x69 0x63 0x20 0x42 0x6F 0x79 // 'ic Boy' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_21= ktpcBioPage34 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_21, __HELP_NAME("Bio Page 34 Sebastian")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_21, __HELP_NAME("Bio Page 34 Sebastian")) __HELP_PACK2 BO OSK LONG kgobBlankBalloon kgobBlankBalloon 0x0 kidBioTipScript 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_56=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_21, 0x0) GST(0) ITEM "kgobBlankBalloon" ITEM "ktpcBioPage34" ITEM "kgobBlankBalloon" ITEM "" ITEM "kidBioTipScript" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_56=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_21, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_13=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_56, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktipbio133 __HELP_SYMBOL( STN "ktipbio133" ) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktipbio134 __HELP_SYMBOL( STN "ktipbio134" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktipbio135 __HELP_SYMBOL( STN "ktipbio135" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktipbio136 __HELP_SYMBOL( STN "ktipbio136" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_56=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_56, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x22 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '"???????' 0x01 0x00 0x00 0x00 0xD8 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0xD9 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0x2B 0x01 0x00 0x01 // '????+???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x09 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0x0B 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x15 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0x17 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0xDB 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xE6 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0xAD 0x00 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xB9 0x00 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xD9 0x00 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0xE8 0x00 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0x0C 0x01 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x0E 0x01 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x20 0x01 0x00 0x04 // '??? ???' 0x00 0x00 0x00 0x00 0x22 0x01 0x00 0x04 // '????"???' 0x0D 0x00 0x00 0xFE 0x2B 0x01 0x00 0x04 // '???+???' 0x00 0x00 0x00 0x00 0xAD 0x00 0x00 0x40 // '??????@' 0x01 0x00 0x00 0x00 0xB9 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xD9 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xE8 0x00 0x00 0x40 // '??????@' 0x02 0x00 0x00 0x00 0x0C 0x01 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x0E 0x01 0x00 0x40 // '???????@' 0x03 0x00 0x00 0x00 0x20 0x01 0x00 0x40 // '???? ??@' 0x00 0x00 0x00 0x00 0x22 0x01 0x00 0x40 // '????"??@' 0x04 0x00 0x00 0x00 0x2B 0x01 0x00 0x40 // '????+??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0xF7 0xFF 0x00 0x02 0x0B 0x00 0x00 0x80 // '?????' 0xBD 0x00 0x00 0x00 0x17 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xE8 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_56=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_56, 0x0) BYTE 0x03 0x03 0x53 0x45 0x42 0x41 0x53 0x54 // '??SEBAST' 0x49 0x41 0x4E 0x0D 0x0A 0x42 0x61 0x63 // 'IAN??Bac' 0x6B 0x67 0x72 0x6F 0x75 0x6E 0x64 0x0D // 'kground?' 0x0A 0x53 0x65 0x62 0x61 0x73 0x74 0x69 // '?Sebasti' 0x61 0x6E 0x20 0x69 0x73 0x20 0x31 0x35 // 'an is 15' 0x20 0x61 0x6E 0x64 0x20 0x6C 0x6F 0x76 // ' and lov' 0x65 0x73 0x20 0x62 0x61 0x73 0x65 0x62 // 'es baseb' 0x61 0x6C 0x6C 0x20 0x6D 0x6F 0x72 0x65 // 'all more' 0x20 0x74 0x68 0x61 0x6E 0x20 0x61 0x6E // ' than an' 0x79 0x74 0x68 0x69 0x6E 0x67 0x2E 0x20 // 'ything. ' 0x4D 0x6F 0x73 0x74 0x20 0x6F 0x66 0x20 // 'Most of ' 0x74 0x68 0x65 0x20 0x74 0x69 0x6D 0x65 // 'the time' 0x20 0x68 0x65 0x20 0x70 0x6C 0x61 0x79 // ' he play' 0x73 0x20 0x73 0x61 0x6E 0x64 0x2D 0x6C // 's sand-l' 0x6F 0x74 0x20 0x67 0x61 0x6D 0x65 0x73 // 'ot games' 0x20 0x77 0x69 0x74 0x68 0x20 0x66 0x72 // ' with fr' 0x69 0x65 0x6E 0x64 0x73 0x20 0x66 0x72 // 'iends fr' 0x6F 0x6D 0x20 0x73 0x63 0x68 0x6F 0x6F // 'om schoo' 0x6C 0x2C 0x20 0x62 0x75 0x74 0x20 0x68 // 'l, but h' 0x65 0x20 0x64 0x72 0x65 0x61 0x6D 0x73 // 'e dreams' 0x20 0x6F 0x66 0x20 0x62 0x65 0x63 0x6F // ' of beco' 0x6D 0x69 0x6E 0x67 0x20 0x61 0x20 0x70 // 'ming a p' 0x72 0x6F 0x66 0x65 0x73 0x73 0x69 0x6F // 'rofessio' 0x6E 0x61 0x6C 0x20 0x62 0x61 0x73 0x65 // 'nal base' 0x62 0x61 0x6C 0x6C 0x20 0x70 0x6C 0x61 // 'ball pla' 0x79 0x65 0x72 0x20 0x69 0x6E 0x20 0x61 // 'yer in a' 0x20 0x66 0x65 0x77 0x20 0x79 0x65 0x61 // ' few yea' 0x72 0x73 0x2E 0x0D 0x0A 0x44 0x72 0x65 // 'rs.??Dre' 0x61 0x6D 0x20 0x52 0x6F 0x6C 0x65 0x73 // 'am Roles' 0x0D 0x0A 0x54 0x72 0x69 0x63 0x6B 0x2D // '??Trick-' 0x6F 0x72 0x2D 0x54 0x72 0x65 0x61 0x74 // 'or-Treat' 0x65 0x72 0x20 0x44 0x72 0x65 0x73 0x73 // 'er Dress' 0x65 0x64 0x20 0x61 0x73 0x20 0x61 0x6E // 'ed as an' 0x20 0x41 0x6C 0x69 0x65 0x6E 0x3B 0x20 // ' Alien; ' 0x50 0x69 0x7A 0x7A 0x61 0x20 0x44 0x65 // 'Pizza De' 0x6C 0x69 0x76 0x65 0x72 0x79 0x20 0x42 // 'livery B' 0x6F 0x79 0x3B 0x20 0x42 0x6F 0x79 0x20 // 'oy; Boy ' 0x53 0x63 0x6F 0x75 0x74 // 'Scout' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_22= ktpcBioPage35 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_22, __HELP_NAME("Bio Page 35 Slam")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_22, __HELP_NAME("Bio Page 35 Slam")) __HELP_PACK2 BO OSK LONG kgobBlankBalloon kgobBlankBalloon 0x0 kidBioTipScript 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_BE=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_22, 0x0) GST(0) ITEM "kgobBlankBalloon" ITEM "ktpcBioPage35" ITEM "kgobBlankBalloon" ITEM "" ITEM "kidBioTipScript" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_BE=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_22, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_4=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_BE, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktipbio141 __HELP_SYMBOL( STN "ktipbio141" ) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktipbio142 __HELP_SYMBOL( STN "ktipbio142" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktipbio143 __HELP_SYMBOL( STN "ktipbio143" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktipbio144 __HELP_SYMBOL( STN "ktipbio144" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_BE=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_BE, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x22 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '"???????' 0x01 0x00 0x00 0x00 0x98 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x9A 0x01 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xD6 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x04 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0x06 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x10 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0x12 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x9A 0x01 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xA5 0x01 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x0F 0x01 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x16 0x01 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x9A 0x01 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0xA7 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xB3 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xB5 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xC3 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xC5 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xD6 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0x0F 0x01 0x00 0x40 // '???????@' 0x01 0x00 0x00 0x00 0x16 0x01 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x9A 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xA7 0x01 0x00 0x40 // '??????@' 0x02 0x00 0x00 0x00 0xB3 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xB5 0x01 0x00 0x40 // '??????@' 0x03 0x00 0x00 0x00 0xC3 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xC5 0x01 0x00 0x40 // '??????@' 0x04 0x00 0x00 0x00 0xD6 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0xF7 0xFF 0x00 0x02 0x06 0x00 0x00 0x80 // '?????' 0xBD 0x00 0x00 0x00 0x12 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xA7 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_BE=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_BE, 0x0) BYTE 0x03 0x03 0x53 0x4C 0x41 0x4D 0x0D 0x0A // '??SLAM??' 0x42 0x61 0x63 0x6B 0x67 0x72 0x6F 0x75 // 'Backgrou' 0x6E 0x64 0x0D 0x0A 0x53 0x6C 0x61 0x6D // 'nd??Slam' 0x20 0x6A 0x75 0x73 0x74 0x20 0x74 0x75 // ' just tu' 0x72 0x6E 0x65 0x64 0x20 0x31 0x38 0x20 // 'rned 18 ' 0x61 0x6E 0x64 0x20 0x68 0x61 0x73 0x20 // 'and has ' 0x62 0x65 0x65 0x6E 0x20 0x69 0x6E 0x20 // 'been in ' 0x61 0x20 0x63 0x6F 0x75 0x70 0x6C 0x65 // 'a couple' 0x20 0x6F 0x66 0x20 0x47 0x65 0x72 0x6D // ' of Germ' 0x61 0x6E 0x2D 0x6D 0x61 0x64 0x65 0x20 // 'an-made ' 0x6D 0x6F 0x76 0x69 0x65 0x73 0x2E 0x20 // 'movies. ' 0x20 0x57 0x68 0x65 0x6E 0x20 0x68 0x65 // ' When he' 0x20 0x77 0x61 0x73 0x20 0x61 0x20 0x6B // ' was a k' 0x69 0x64 0x20 0x68 0x65 0x20 0x61 0x74 // 'id he at' 0x74 0x65 0x6E 0x64 0x65 0x64 0x20 0x61 // 'tended a' 0x6E 0x20 0x61 0x72 0x74 0x73 0x20 0x61 // 'n arts a' 0x63 0x61 0x64 0x65 0x6D 0x79 0x2C 0x20 // 'cademy, ' 0x62 0x75 0x74 0x20 0x72 0x65 0x63 0x65 // 'but rece' 0x6E 0x74 0x6C 0x79 0x20 0x68 0x65 0x20 // 'ntly he ' 0x77 0x61 0x73 0x20 0x73 0x70 0x6F 0x74 // 'was spot' 0x74 0x65 0x64 0x20 0x62 0x79 0x20 0x61 // 'ted by a' 0x20 0x74 0x61 0x6C 0x65 0x6E 0x74 0x20 // ' talent ' 0x73 0x63 0x6F 0x75 0x74 0x20 0x61 0x74 // 'scout at' 0x20 0x61 0x20 0x66 0x61 0x73 0x74 0x2D // ' a fast-' 0x66 0x6F 0x6F 0x64 0x20 0x72 0x65 0x73 // 'food res' 0x74 0x61 0x75 0x72 0x61 0x6E 0x74 0x20 // 'taurant ' 0x69 0x6E 0x20 0x42 0x65 0x72 0x6C 0x69 // 'in Berli' 0x6E 0x2C 0x20 0x77 0x68 0x65 0x72 0x65 // 'n, where' 0x20 0x68 0x65 0x20 0x64 0x72 0x65 0x77 // ' he drew' 0x20 0x68 0x75 0x67 0x65 0x20 0x63 0x72 // ' huge cr' 0x6F 0x77 0x64 0x73 0x20 0x6F 0x66 0x20 // 'owds of ' 0x70 0x65 0x6F 0x70 0x6C 0x65 0x20 0x61 // 'people a' 0x73 0x20 0x68 0x65 0x20 0x66 0x6C 0x69 // 's he fli' 0x70 0x70 0x65 0x64 0x20 0x74 0x68 0x65 // 'pped the' 0x20 0x62 0x75 0x72 0x67 0x65 0x72 0x73 // ' burgers' 0x20 0x69 0x6E 0x20 0x66 0x61 0x6E 0x63 // ' in fanc' 0x79 0x20 0x74 0x72 0x69 0x70 0x6C 0x65 // 'y triple' 0x20 0x61 0x6E 0x64 0x20 0x71 0x75 0x61 // ' and qua' 0x64 0x72 0x75 0x70 0x6C 0x65 0x20 0x66 // 'druple f' 0x6C 0x69 0x70 0x73 0x2E 0x20 0x0D 0x0A // 'lips. ??' 0x53 0x6F 0x6D 0x65 0x20 0x6F 0x66 0x20 // 'Some of ' 0x74 0x68 0x65 0x20 0x6D 0x6F 0x76 0x69 // 'the movi' 0x65 0x73 0x20 0x68 0x65 0x27 0x73 0x20 // 'es he's ' 0x62 0x65 0x65 0x6E 0x20 0x69 0x6E 0x20 // 'been in ' 0x61 0x72 0x65 0x20 0x93 0x52 0x75 0x6E // 'are Run' 0x2C 0x20 0x42 0x75 0x72 0x67 0x65 0x72 // ', Burger' 0x6D 0x61 0x6E 0x2C 0x20 0x52 0x75 0x6E // 'man, Run' 0x94 0x20 0x61 0x6E 0x64 0x20 0x93 0x48 // ' and H' 0x69 0x67 0x68 0x20 0x53 0x63 0x68 0x6F // 'igh Scho' 0x6F 0x6C 0x20 0x46 0x6C 0x69 0x70 0x70 // 'ol Flipp' 0x69 0x6E 0x92 0x20 0x46 0x6F 0x6F 0x6C // 'in Fool' 0x2E 0x94 0x0D 0x0A 0x44 0x72 0x65 0x61 // '.??Drea' 0x6D 0x20 0x52 0x6F 0x6C 0x65 0x73 0x0D // 'm Roles?' 0x0A 0x45 0x78 0x74 0x65 0x72 0x6D 0x69 // '?Extermi' 0x6E 0x61 0x74 0x6F 0x72 0x3B 0x20 0x42 // 'nator; B' 0x75 0x72 0x67 0x65 0x72 0x20 0x46 0x6C // 'urger Fl' 0x69 0x70 0x70 0x65 0x72 0x3B 0x20 0x43 // 'ipper; C' 0x72 0x6F 0x63 0x6F 0x64 0x69 0x6C 0x65 // 'rocodile' 0x20 0x54 0x72 0x61 0x69 0x6E 0x65 0x72 // ' Trainer' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_23= ktpcBioPage36 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_23, __HELP_NAME("Bio Page 36 Tim")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_23, __HELP_NAME("Bio Page 36 Tim")) __HELP_PACK2 BO OSK LONG kgobBlankBalloon kgobBlankBalloon 0x0 kidBioTipScript 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_BA=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_23, 0x0) GST(0) ITEM "kgobBlankBalloon" ITEM "ktpcBioPage36" ITEM "kgobBlankBalloon" ITEM "" ITEM "kidBioTipScript" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_BA=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_23, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_24=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_BA, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktipbio145 __HELP_SYMBOL( STN "ktipbio145" ) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktipbio146 __HELP_SYMBOL( STN "ktipbio146" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktipbio147 __HELP_SYMBOL( STN "ktipbio147" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktipbio148 __HELP_SYMBOL( STN "ktipbio148" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_BA=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_BA, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x1E 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xF9 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x07 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0x09 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x13 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0x15 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0xCA 0x01 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xD5 0x01 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0xB6 0x00 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xBE 0x00 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xD7 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xE3 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xE5 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xED 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xEF 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xF9 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xB6 0x00 0x00 0x40 // '??????@' 0x01 0x00 0x00 0x00 0xBE 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xD7 0x01 0x00 0x40 // '??????@' 0x02 0x00 0x00 0x00 0xE3 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xE5 0x01 0x00 0x40 // '??????@' 0x03 0x00 0x00 0x00 0xED 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xEF 0x01 0x00 0x40 // '??????@' 0x04 0x00 0x00 0x00 0xF9 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0xF7 0xFF 0x00 0x02 0x09 0x00 0x00 0x80 // '?????' 0xBD 0x00 0x00 0x00 0x15 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xD7 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_BA=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_BA, 0x0) BYTE 0x03 0x03 0x54 0x49 0x4D 0x4F 0x54 0x48 // '??TIMOTH' 0x59 0x0D 0x0A 0x42 0x61 0x63 0x6B 0x67 // 'Y??Backg' 0x72 0x6F 0x75 0x6E 0x64 0x0D 0x0A 0x54 // 'round??T' 0x69 0x6D 0x6F 0x74 0x68 0x79 0x20 0x69 // 'imothy i' 0x73 0x20 0x66 0x72 0x6F 0x6D 0x20 0x41 // 's from A' 0x74 0x68 0x65 0x6E 0x73 0x2C 0x20 0x47 // 'thens, G' 0x72 0x65 0x65 0x63 0x65 0x2E 0x20 0x48 // 'reece. H' 0x69 0x73 0x20 0x66 0x61 0x6D 0x69 0x6C // 'is famil' 0x79 0x20 0x6F 0x77 0x6E 0x73 0x20 0x6D // 'y owns m' 0x69 0x6C 0x6C 0x73 0x20 0x74 0x68 0x61 // 'ills tha' 0x74 0x20 0x6D 0x61 0x6B 0x65 0x20 0x6D // 't make m' 0x61 0x74 0x65 0x72 0x69 0x61 0x6C 0x20 // 'aterial ' 0x66 0x6F 0x72 0x20 0x63 0x6C 0x6F 0x74 // 'for clot' 0x68 0x65 0x73 0x2E 0x20 0x20 0x54 0x69 // 'hes. Ti' 0x6D 0x6F 0x74 0x68 0x79 0x20 0x6D 0x61 // 'mothy ma' 0x6E 0x61 0x67 0x65 0x73 0x20 0x6F 0x6E // 'nages on' 0x65 0x20 0x6F 0x66 0x20 0x74 0x68 0x65 // 'e of the' 0x20 0x6D 0x69 0x6C 0x6C 0x73 0x2E 0x20 // ' mills. ' 0x20 0x47 0x72 0x6F 0x77 0x69 0x6E 0x67 // ' Growing' 0x20 0x75 0x70 0x20 0x69 0x6E 0x20 0x41 // ' up in A' 0x74 0x68 0x65 0x6E 0x73 0x2C 0x20 0x54 // 'thens, T' 0x69 0x6D 0x6F 0x74 0x68 0x79 0x20 0x73 // 'imothy s' 0x61 0x77 0x20 0x6D 0x61 0x6E 0x79 0x20 // 'aw many ' 0x74 0x6F 0x75 0x72 0x69 0x73 0x74 0x73 // 'tourists' 0x20 0x66 0x72 0x6F 0x6D 0x20 0x66 0x61 // ' from fa' 0x72 0x2D 0x61 0x77 0x61 0x79 0x20 0x70 // 'r-away p' 0x6C 0x61 0x63 0x65 0x73 0x20 0x6C 0x69 // 'laces li' 0x6B 0x65 0x20 0x4B 0x61 0x6E 0x73 0x61 // 'ke Kansa' 0x73 0x2C 0x20 0x4C 0x6F 0x73 0x20 0x41 // 's, Los A' 0x6E 0x67 0x65 0x6C 0x65 0x73 0x2C 0x20 // 'ngeles, ' 0x61 0x6E 0x64 0x20 0x41 0x72 0x6B 0x61 // 'and Arka' 0x6E 0x73 0x61 0x73 0x2E 0x20 0x20 0x48 // 'nsas. H' 0x65 0x20 0x6C 0x69 0x6B 0x65 0x64 0x20 // 'e liked ' 0x74 0x68 0x65 0x69 0x72 0x20 0x62 0x72 // 'their br' 0x69 0x67 0x68 0x74 0x20 0x63 0x6C 0x6F // 'ight clo' 0x74 0x68 0x65 0x73 0x20 0x62 0x75 0x74 // 'thes but' 0x20 0x63 0x6F 0x75 0x6C 0x64 0x6E 0x27 // ' couldn'' 0x74 0x20 0x66 0x69 0x6E 0x64 0x20 0x61 // 't find a' 0x6E 0x79 0x20 0x6C 0x69 0x6B 0x65 0x20 // 'ny like ' 0x74 0x68 0x65 0x6D 0x20 0x69 0x6E 0x20 // 'them in ' 0x41 0x74 0x68 0x65 0x6E 0x73 0x2C 0x20 // 'Athens, ' 0x73 0x6F 0x20 0x68 0x65 0x20 0x64 0x65 // 'so he de' 0x63 0x69 0x64 0x65 0x64 0x20 0x74 0x6F // 'cided to' 0x20 0x63 0x72 0x65 0x61 0x74 0x65 0x20 // ' create ' 0x68 0x69 0x73 0x20 0x6F 0x77 0x6E 0x20 // 'his own ' 0x66 0x61 0x62 0x72 0x69 0x63 0x73 0x20 // 'fabrics ' 0x61 0x6E 0x64 0x20 0x68 0x61 0x76 0x65 // 'and have' 0x20 0x74 0x68 0x65 0x6D 0x20 0x74 0x61 // ' them ta' 0x69 0x6C 0x6F 0x72 0x65 0x64 0x20 0x69 // 'ilored i' 0x6E 0x74 0x6F 0x20 0x73 0x75 0x69 0x74 // 'nto suit' 0x73 0x20 0x74 0x6F 0x20 0x6D 0x61 0x74 // 's to mat' 0x63 0x68 0x20 0x74 0x68 0x65 0x20 0x6F // 'ch the o' 0x6E 0x65 0x73 0x20 0x74 0x68 0x65 0x20 // 'nes the ' 0x74 0x6F 0x75 0x72 0x69 0x73 0x74 0x73 // 'tourists' 0x20 0x77 0x6F 0x72 0x65 0x20 0x77 0x68 // ' wore wh' 0x65 0x6E 0x20 0x68 0x65 0x20 0x77 0x61 // 'en he wa' 0x73 0x20 0x61 0x20 0x63 0x68 0x69 0x6C // 's a chil' 0x64 0x2E 0x0D 0x0A 0x44 0x72 0x65 0x61 // 'd.??Drea' 0x6D 0x20 0x52 0x6F 0x6C 0x65 0x73 0x0D // 'm Roles?' 0x0A 0x53 0x70 0x6F 0x6F 0x6B 0x20 0x53 // '?Spook S' 0x6C 0x65 0x75 0x74 0x68 0x3B 0x20 0x52 // 'leuth; R' 0x65 0x70 0x6F 0x72 0x74 0x65 0x72 0x3B // 'eporter;' 0x20 0x4E 0x61 0x74 0x75 0x72 0x61 0x6C // ' Natural' 0x69 0x73 0x74 // 'ist' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_24= ktpcBioPage37 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_24, __HELP_NAME("Bio Page 37 Valentine")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_24, __HELP_NAME("Bio Page 37 Valentine")) __HELP_PACK2 BO OSK LONG kgobBlankBalloon kgobBlankBalloon 0x0 kidBioTipScript 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_15=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_24, 0x0) GST(0) ITEM "kgobBlankBalloon" ITEM "ktpcBioPage37" ITEM "kgobBlankBalloon" ITEM "" ITEM "kidBioTipScript" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_15=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_24, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_19=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_15, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktipbio149 __HELP_SYMBOL( STN "ktipbio149" ) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktipbio150 __HELP_SYMBOL( STN "ktipbio150" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktipbio151 __HELP_SYMBOL( STN "ktipbio151" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktipbio152 __HELP_SYMBOL( STN "ktipbio152" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_15=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_15, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x1E 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xED 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x09 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0x0B 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x15 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0x17 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0xB8 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xC3 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0xAA 0x00 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xAE 0x00 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xC5 0x00 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xD6 0x00 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xD8 0x00 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xE1 0x00 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xE3 0x00 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xED 0x00 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xAA 0x00 0x00 0x40 // '??????@' 0x01 0x00 0x00 0x00 0xAE 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xC5 0x00 0x00 0x40 // '??????@' 0x02 0x00 0x00 0x00 0xD6 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xD8 0x00 0x00 0x40 // '??????@' 0x03 0x00 0x00 0x00 0xE1 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xE3 0x00 0x00 0x40 // '??????@' 0x04 0x00 0x00 0x00 0xED 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0xF7 0xFF 0x00 0x02 0x0B 0x00 0x00 0x80 // '?????' 0xBD 0x00 0x00 0x00 0x17 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xC5 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_15=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_15, 0x0) BYTE 0x03 0x03 0x56 0x41 0x4C 0x45 0x4E 0x54 // '??VALENT' 0x49 0x4E 0x45 0x0D 0x0A 0x42 0x61 0x63 // 'INE??Bac' 0x6B 0x67 0x72 0x6F 0x75 0x6E 0x64 0x0D // 'kground?' 0x0A 0x56 0x61 0x6C 0x65 0x6E 0x74 0x69 // '?Valenti' 0x6E 0x65 0x20 0x77 0x61 0x73 0x20 0x62 // 'ne was b' 0x6F 0x72 0x6E 0x20 0x69 0x6E 0x20 0x4D // 'orn in M' 0x61 0x72 0x73 0x65 0x69 0x6C 0x6C 0x65 // 'arseille' 0x73 0x2C 0x20 0x46 0x72 0x61 0x6E 0x63 // 's, Franc' 0x65 0x20 0x73 0x6F 0x6D 0x65 0x20 0x33 // 'e some 3' 0x30 0x20 0x79 0x65 0x61 0x72 0x73 0x20 // '0 years ' 0x61 0x67 0x6F 0x2E 0x20 0x48 0x65 0x20 // 'ago. He ' 0x6C 0x65 0x66 0x74 0x20 0x4D 0x61 0x72 // 'left Mar' 0x73 0x65 0x69 0x6C 0x6C 0x65 0x73 0x20 // 'seilles ' 0x6F 0x6E 0x20 0x68 0x69 0x73 0x20 0x32 // 'on his 2' 0x30 0x74 0x68 0x20 0x62 0x69 0x72 0x74 // '0th birt' 0x68 0x64 0x61 0x79 0x20 0x61 0x6E 0x64 // 'hday and' 0x20 0x6D 0x6F 0x76 0x65 0x64 0x20 0x74 // ' moved t' 0x6F 0x20 0x43 0x61 0x6E 0x6E 0x65 0x73 // 'o Cannes' 0x2C 0x20 0x46 0x72 0x61 0x6E 0x63 0x65 // ', France' 0x20 0x68 0x6F 0x70 0x69 0x6E 0x67 0x20 // ' hoping ' 0x66 0x6F 0x72 0x20 0x68 0x69 0x73 0x20 // 'for his ' 0x62 0x69 0x67 0x20 0x66 0x69 0x6C 0x6D // 'big film' 0x20 0x64 0x65 0x62 0x75 0x74 0x2E 0x20 // ' debut. ' 0x0D 0x0A 0x44 0x72 0x65 0x61 0x6D 0x20 // '??Dream ' 0x52 0x6F 0x6C 0x65 0x73 0x0D 0x0A 0x41 // 'Roles??A' 0x6E 0x6E 0x6F 0x79 0x69 0x6E 0x67 0x20 // 'nnoying ' 0x4E 0x65 0x69 0x67 0x68 0x62 0x6F 0x72 // 'Neighbor' 0x3B 0x20 0x44 0x65 0x74 0x65 0x63 0x74 // '; Detect' 0x69 0x76 0x65 0x3B 0x20 0x56 0x6F 0x6F // 'ive; Voo' 0x64 0x6F 0x6F 0x20 0x4D 0x61 0x6E // 'doo Man' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_25= ktpcBioPage38 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_25, __HELP_NAME("Bio Page 38 Vinnie")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_25, __HELP_NAME("Bio Page 38 Vinnie")) __HELP_PACK2 BO OSK LONG kgobBlankBalloon kgobBlankBalloon 0x0 kidBioTipScript 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_B0=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_25, 0x0) GST(0) ITEM "kgobBlankBalloon" ITEM "ktpcBioPage38" ITEM "kgobBlankBalloon" ITEM "" ITEM "kidBioTipScript" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_B0=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_25, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1C=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B0, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktipbio153 __HELP_SYMBOL( STN "ktipbio153" ) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktipbio154 __HELP_SYMBOL( STN "ktipbio154" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktipbio155 __HELP_SYMBOL( STN "ktipbio155" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktipbio156 __HELP_SYMBOL( STN "ktipbio156" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_B0=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B0, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x20 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // ' ???????' 0x01 0x00 0x00 0x00 0x0F 0x02 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x05 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0x07 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x11 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0x13 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0xDB 0x01 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xE6 0x01 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0xE9 0x00 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xF5 0x00 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xD9 0x01 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0xE8 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xEF 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xF1 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0x06 0x02 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x08 0x02 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x0F 0x02 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0xE9 0x00 0x00 0x40 // '??????@' 0x01 0x00 0x00 0x00 0xF5 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xD9 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xE8 0x01 0x00 0x40 // '??????@' 0x02 0x00 0x00 0x00 0xEF 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xF1 0x01 0x00 0x40 // '??????@' 0x03 0x00 0x00 0x00 0x06 0x02 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x08 0x02 0x00 0x40 // '???????@' 0x04 0x00 0x00 0x00 0x0F 0x02 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0xF7 0xFF 0x00 0x02 0x07 0x00 0x00 0x80 // '?????' 0xBD 0x00 0x00 0x00 0x13 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xE8 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_B0=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B0, 0x0) BYTE 0x03 0x03 0x56 0x45 0x4E 0x49 0x45 0x0D // '??VENIE?' 0x0A 0x42 0x61 0x63 0x6B 0x67 0x72 0x6F // '?Backgro' 0x75 0x6E 0x64 0x0D 0x0A 0x56 0x65 0x6E // 'und??Ven' 0x69 0x65 0x20 0x77 0x61 0x73 0x20 0x62 // 'ie was b' 0x6F 0x72 0x6E 0x20 0x69 0x6E 0x20 0x4E // 'orn in N' 0x61 0x70 0x6C 0x65 0x73 0x2C 0x20 0x49 // 'aples, I' 0x74 0x61 0x6C 0x79 0x2E 0x20 0x20 0x41 // 'taly. A' 0x73 0x20 0x61 0x20 0x63 0x68 0x69 0x6C // 's a chil' 0x64 0x20 0x68 0x65 0x20 0x77 0x61 0x74 // 'd he wat' 0x63 0x68 0x65 0x64 0x20 0x63 0x6F 0x75 // 'ched cou' 0x6E 0x74 0x6C 0x65 0x73 0x73 0x20 0x44 // 'ntless D' 0x72 0x61 0x63 0x75 0x6C 0x61 0x20 0x6D // 'racula m' 0x6F 0x76 0x69 0x65 0x73 0x2E 0x20 0x20 // 'ovies. ' 0x57 0x68 0x65 0x6E 0x20 0x56 0x65 0x6E // 'When Ven' 0x69 0x65 0x20 0x77 0x61 0x73 0x20 0x69 // 'ie was i' 0x6E 0x20 0x68 0x69 0x73 0x20 0x65 0x61 // 'n his ea' 0x72 0x6C 0x79 0x20 0x32 0x30 0x73 0x2C // 'rly 20s,' 0x20 0x68 0x65 0x20 0x64 0x65 0x63 0x69 // ' he deci' 0x64 0x65 0x64 0x20 0x74 0x6F 0x20 0x68 // 'ded to h' 0x61 0x76 0x65 0x20 0x68 0x69 0x73 0x20 // 'ave his ' 0x66 0x72 0x6F 0x6E 0x74 0x20 0x74 0x65 // 'front te' 0x65 0x74 0x68 0x20 0x63 0x61 0x70 0x70 // 'eth capp' 0x65 0x64 0x20 0x77 0x69 0x74 0x68 0x20 // 'ed with ' 0x76 0x61 0x6D 0x70 0x69 0x72 0x65 0x20 // 'vampire ' 0x66 0x61 0x6E 0x67 0x73 0x2E 0x20 0x20 // 'fangs. ' 0x56 0x65 0x6E 0x69 0x65 0x20 0x61 0x6C // 'Venie al' 0x73 0x6F 0x20 0x66 0x61 0x6E 0x63 0x69 // 'so fanci' 0x65 0x73 0x20 0x68 0x69 0x6D 0x73 0x65 // 'es himse' 0x6C 0x66 0x20 0x61 0x20 0x67 0x72 0x65 // 'lf a gre' 0x61 0x74 0x20 0x6F 0x70 0x65 0x72 0x61 // 'at opera' 0x20 0x73 0x69 0x6E 0x67 0x65 0x72 0x2E // ' singer.' 0x20 0x20 0x55 0x6E 0x66 0x6F 0x72 0x74 // ' Unfort' 0x75 0x6E 0x61 0x74 0x65 0x6C 0x79 0x2C // 'unately,' 0x20 0x56 0x69 0x6E 0x6E 0x69 0x65 0x2C // ' Vinnie,' 0x20 0x61 0x6E 0x64 0x20 0x6F 0x6E 0x6C // ' and onl' 0x79 0x20 0x56 0x65 0x6E 0x69 0x65 0x2C // 'y Venie,' 0x20 0x74 0x68 0x69 0x6E 0x6B 0x73 0x20 // ' thinks ' 0x68 0x65 0x20 0x73 0x69 0x6E 0x67 0x73 // 'he sings' 0x20 0x77 0x65 0x6C 0x6C 0x2E 0x20 0x20 // ' well. ' 0x49 0x6E 0x20 0x66 0x61 0x63 0x74 0x2C // 'In fact,' 0x20 0x77 0x68 0x65 0x6E 0x20 0x56 0x65 // ' when Ve' 0x6E 0x69 0x65 0x20 0x73 0x69 0x6E 0x67 // 'nie sing' 0x73 0x2C 0x20 0x64 0x6F 0x67 0x73 0x20 // 's, dogs ' 0x68 0x6F 0x77 0x6C 0x20 0x69 0x6E 0x20 // 'howl in ' 0x70 0x72 0x6F 0x74 0x65 0x73 0x74 0x20 // 'protest ' 0x61 0x6E 0x64 0x20 0x70 0x65 0x6F 0x70 // 'and peop' 0x6C 0x65 0x20 0x73 0x68 0x72 0x69 0x65 // 'le shrie' 0x6B 0x20 0x61 0x6E 0x64 0x20 0x72 0x75 // 'k and ru' 0x6E 0x20 0x6C 0x6F 0x6F 0x6B 0x69 0x6E // 'n lookin' 0x67 0x20 0x66 0x6F 0x72 0x20 0x65 0x61 // 'g for ea' 0x72 0x20 0x70 0x6C 0x75 0x67 0x73 0x2E // 'r plugs.' 0x20 0x20 0x56 0x65 0x6E 0x69 0x65 0x20 // ' Venie ' 0x68 0x61 0x73 0x20 0x61 0x20 0x76 0x69 // 'has a vi' 0x73 0x69 0x6F 0x6E 0x20 0x6F 0x66 0x20 // 'sion of ' 0x73 0x6F 0x6D 0x65 0x64 0x61 0x79 0x20 // 'someday ' 0x64 0x6F 0x69 0x6E 0x67 0x20 0x61 0x20 // 'doing a ' 0x6D 0x75 0x73 0x69 0x63 0x61 0x6C 0x20 // 'musical ' 0x76 0x65 0x72 0x73 0x69 0x6F 0x6E 0x20 // 'version ' 0x6F 0x66 0x20 0x44 0x72 0x61 0x63 0x75 // 'of Dracu' 0x6C 0x61 0x2E 0x0D 0x0A 0x44 0x72 0x65 // 'la.??Dre' 0x61 0x6D 0x20 0x52 0x6F 0x6C 0x65 0x73 // 'am Roles' 0x0D 0x0A 0x44 0x72 0x61 0x63 0x75 0x6C // '??Dracul' 0x61 0x3B 0x20 0x53 0x74 0x72 0x65 0x65 // 'a; Stree' 0x74 0x20 0x46 0x61 0x69 0x72 0x20 0x50 // 't Fair P' 0x65 0x72 0x66 0x6F 0x72 0x6D 0x65 0x72 // 'erformer' 0x3B 0x20 0x53 0x74 0x75 0x64 0x65 0x6E // '; Studen' 0x74 // 't' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_26= ktpcBioPage39 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_26, __HELP_NAME("Bio Page 39 Wanda")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_26, __HELP_NAME("Bio Page 39 Wanda")) __HELP_PACK2 BO OSK LONG kgobBlankBalloon kgobBlankBalloon 0x0 kidBioTipScript 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_26, 0x0) GST(0) ITEM "kgobBlankBalloon" ITEM "ktpcBioPage39" ITEM "kgobBlankBalloon" ITEM "" ITEM "kidBioTipScript" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_26, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_11=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktipbio157 __HELP_SYMBOL( STN "ktipbio157" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktipbio159 __HELP_SYMBOL( STN "ktipbio159" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktipbio160 __HELP_SYMBOL( STN "ktipbio160" ) FREE ITEM LONG 0x40000001 VAR BYTE 2 LONG ktipbio158 __HELP_SYMBOL( STN "ktipbio158" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x20 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // ' ???????' 0x01 0x00 0x00 0x00 0xA2 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0xA4 0x01 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xD2 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x05 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0x07 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x11 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0x13 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0xA4 0x01 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xAF 0x01 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0xDD 0x00 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xE3 0x00 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xB1 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xBF 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xC1 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xCA 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xCC 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xD2 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xDD 0x00 0x00 0x40 // '??????@' 0x01 0x00 0x00 0x00 0xE3 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xB1 0x01 0x00 0x40 // '??????@' 0x05 0x00 0x00 0x00 0xBF 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xC1 0x01 0x00 0x40 // '??????@' 0x02 0x00 0x00 0x00 0xCA 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xCC 0x01 0x00 0x40 // '??????@' 0x03 0x00 0x00 0x00 0xD2 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0xF7 0xFF 0x00 0x02 0x07 0x00 0x00 0x80 // '?????' 0xBD 0x00 0x00 0x00 0x13 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xB1 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) BYTE 0x03 0x03 0x57 0x41 0x4E 0x44 0x41 0x0D // '??WANDA?' 0x0A 0x42 0x61 0x63 0x6B 0x67 0x72 0x6F // '?Backgro' 0x75 0x6E 0x64 0x0D 0x0A 0x57 0x61 0x6E // 'und??Wan' 0x64 0x61 0x20 0x69 0x73 0x20 0x61 0x20 // 'da is a ' 0x66 0x65 0x6D 0x61 0x6C 0x65 0x20 0x72 // 'female r' 0x6F 0x62 0x6F 0x74 0x20 0x69 0x6E 0x76 // 'obot inv' 0x65 0x6E 0x74 0x65 0x64 0x20 0x62 0x79 // 'ented by' 0x20 0x57 0x69 0x6C 0x6C 0x79 0x2C 0x20 // ' Willy, ' 0x74 0x68 0x65 0x20 0x67 0x72 0x65 0x65 // 'the gree' 0x6E 0x20 0x67 0x65 0x6E 0x69 0x75 0x73 // 'n genius' 0x2E 0x20 0x20 0x53 0x68 0x65 0x20 0x6B // '. She k' 0x6E 0x6F 0x77 0x73 0x20 0x73 0x68 0x65 // 'nows she' 0x20 0x64 0x6F 0x65 0x73 0x6E 0x92 0x74 // ' doesnt' 0x20 0x6C 0x6F 0x6F 0x6B 0x20 0x68 0x75 // ' look hu' 0x6D 0x61 0x6E 0x2C 0x20 0x62 0x75 0x74 // 'man, but' 0x20 0x74 0x68 0x65 0x6E 0x20 0x73 0x68 // ' then sh' 0x65 0x20 0x63 0x61 0x6E 0x20 0x64 0x6F // 'e can do' 0x20 0x74 0x68 0x69 0x6E 0x67 0x73 0x20 // ' things ' 0x68 0x75 0x6D 0x61 0x6E 0x73 0x20 0x63 // 'humans c' 0x61 0x6E 0x92 0x74 0x20 0x64 0x6F 0x2C // 'ant do,' 0x20 0x6C 0x69 0x6B 0x65 0x20 0x6A 0x75 // ' like ju' 0x6D 0x70 0x20 0x72 0x65 0x61 0x6C 0x6C // 'mp reall' 0x79 0x20 0x68 0x69 0x67 0x68 0x20 0x61 // 'y high a' 0x6E 0x64 0x20 0x6C 0x61 0x6E 0x64 0x20 // 'nd land ' 0x61 0x6C 0x6C 0x20 0x73 0x71 0x75 0x61 // 'all squa' 0x73 0x68 0x65 0x64 0x20 0x75 0x70 0x2E // 'shed up.' 0x20 0x20 0x53 0x68 0x65 0x20 0x65 0x76 // ' She ev' 0x65 0x6E 0x20 0x68 0x61 0x73 0x20 0x70 // 'en has p' 0x6F 0x77 0x65 0x72 0x73 0x20 0x74 0x68 // 'owers th' 0x61 0x74 0x20 0x57 0x69 0x6C 0x6C 0x79 // 'at Willy' 0x20 0x64 0x6F 0x65 0x73 0x6E 0x92 0x74 // ' doesnt' 0x20 0x6B 0x6E 0x6F 0x77 0x20 0x73 0x68 // ' know sh' 0x65 0x20 0x68 0x61 0x73 0x2E 0x20 0x0D // 'e has. ?' 0x0A 0x57 0x61 0x6E 0x64 0x61 0x20 0x69 // '?Wanda i' 0x73 0x20 0x67 0x72 0x61 0x74 0x65 0x66 // 's gratef' 0x75 0x6C 0x20 0x74 0x6F 0x20 0x57 0x69 // 'ul to Wi' 0x6C 0x6C 0x79 0x20 0x66 0x6F 0x72 0x20 // 'lly for ' 0x70 0x75 0x74 0x74 0x69 0x6E 0x67 0x20 // 'putting ' 0x68 0x65 0x72 0x20 0x74 0x6F 0x67 0x65 // 'her toge' 0x74 0x68 0x65 0x72 0x2C 0x20 0x62 0x75 // 'ther, bu' 0x74 0x20 0x73 0x68 0x65 0x27 0x73 0x20 // 't she's ' 0x72 0x65 0x61 0x64 0x79 0x20 0x74 0x6F // 'ready to' 0x20 0x73 0x74 0x72 0x69 0x6B 0x65 0x20 // ' strike ' 0x6F 0x75 0x74 0x20 0x6F 0x6E 0x20 0x68 // 'out on h' 0x65 0x72 0x20 0x6F 0x77 0x6E 0x2E 0x20 // 'er own. ' 0x20 0x53 0x68 0x65 0x20 0x77 0x61 0x6E // ' She wan' 0x74 0x73 0x20 0x74 0x6F 0x20 0x66 0x69 // 'ts to fi' 0x6E 0x64 0x20 0x61 0x6E 0x20 0x61 0x70 // 'nd an ap' 0x61 0x72 0x74 0x6D 0x65 0x6E 0x74 0x20 // 'artment ' 0x61 0x6E 0x64 0x20 0x73 0x74 0x61 0x72 // 'and star' 0x74 0x20 0x68 0x65 0x72 0x20 0x61 0x63 // 't her ac' 0x74 0x69 0x6E 0x67 0x20 0x63 0x61 0x72 // 'ting car' 0x65 0x65 0x72 0x2E 0x0D 0x0A 0x44 0x72 // 'eer.??Dr' 0x65 0x61 0x6D 0x20 0x52 0x6F 0x6C 0x65 // 'eam Role' 0x73 0x0D 0x0A 0x4D 0x65 0x63 0x68 0x61 // 's??Mecha' 0x6E 0x69 0x63 0x61 0x6C 0x20 0x54 0x6F // 'nical To' 0x79 0x3B 0x20 0x52 0x6F 0x62 0x6F 0x74 // 'y; Robot' 0x20 0x43 0x6F 0x70 0x3B 0x20 0x44 0x61 // ' Cop; Da' 0x6E 0x63 0x65 0x72 // 'ncer' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_27= ktpcBioPage40 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_27, __HELP_NAME("Bio Page 40 Willy")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_27, __HELP_NAME("Bio Page 40 Willy")) __HELP_PACK2 BO OSK LONG kgobBlankBalloon kgobBlankBalloon 0x0 kidBioTipScript 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_27, 0x0) GST(0) ITEM "kgobBlankBalloon" ITEM "ktpcBioPage40" ITEM "kgobBlankBalloon" ITEM "" ITEM "kidBioTipScript" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_27, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_25=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2B, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktipbio161 __HELP_SYMBOL( STN "ktipbio161" ) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktipbio162 __HELP_SYMBOL( STN "ktipbio162" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktipbio163 __HELP_SYMBOL( STN "ktipbio163" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktipbio164 __HELP_SYMBOL( STN "ktipbio164" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_2B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x21 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '!???????' 0x01 0x00 0x00 0x00 0x11 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x13 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x76 0x01 0x00 0x01 // '????v???' 0x00 0x00 0x00 0x00 0x78 0x01 0x00 0x01 // '????x???' 0x01 0x00 0x00 0x00 0xB1 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x05 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0x07 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x11 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x78 0x01 0x00 0x03 // '????x???' 0x0A 0x00 0x00 0xFD 0x83 0x01 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x5F 0x01 0x00 0x04 // '????_???' 0x0D 0x00 0x00 0xFE 0x63 0x01 0x00 0x04 // '???c???' 0x00 0x00 0x00 0x00 0x85 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0x92 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0x94 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xA1 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xA3 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xB1 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0x5F 0x01 0x00 0x40 // '????_??@' 0x01 0x00 0x00 0x00 0x63 0x01 0x00 0x40 // '????c??@' 0x00 0x00 0x00 0x00 0x85 0x01 0x00 0x40 // '??????@' 0x02 0x00 0x00 0x00 0x92 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x94 0x01 0x00 0x40 // '??????@' 0x03 0x00 0x00 0x00 0xA1 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xA3 0x01 0x00 0x40 // '??????@' 0x04 0x00 0x00 0x00 0xB1 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0xF7 0xFF 0x00 0x02 0x07 0x00 0x00 0x80 // '?????' 0xBD 0x00 0x00 0x00 0x13 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x85 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2B, 0x0) BYTE 0x03 0x03 0x57 0x49 0x4C 0x4C 0x59 0x0D // '??WILLY?' 0x0A 0x42 0x61 0x63 0x6B 0x67 0x72 0x6F // '?Backgro' 0x75 0x6E 0x64 0x0D 0x0A 0x57 0x69 0x6C // 'und??Wil' 0x6C 0x79 0x20 0x69 0x73 0x20 0x61 0x20 // 'ly is a ' 0x67 0x65 0x6E 0x69 0x75 0x73 0x2C 0x20 // 'genius, ' 0x6E 0x6F 0x20 0x71 0x75 0x65 0x73 0x74 // 'no quest' 0x69 0x6F 0x6E 0x20 0x61 0x62 0x6F 0x75 // 'ion abou' 0x74 0x20 0x69 0x74 0x2E 0x20 0x20 0x48 // 't it. H' 0x65 0x20 0x64 0x6F 0x65 0x73 0x6E 0x92 // 'e doesn' 0x74 0x20 0x65 0x76 0x65 0x72 0x20 0x74 // 't ever t' 0x68 0x69 0x6E 0x6B 0x20 0x61 0x62 0x6F // 'hink abo' 0x75 0x74 0x20 0x68 0x6F 0x77 0x20 0x73 // 'ut how s' 0x74 0x72 0x61 0x6E 0x67 0x65 0x20 0x68 // 'trange h' 0x65 0x20 0x6C 0x6F 0x6F 0x6B 0x73 0x2E // 'e looks.' 0x20 0x20 0x48 0x65 0x20 0x68 0x61 0x73 // ' He has' 0x20 0x74 0x69 0x6D 0x65 0x20 0x6F 0x6E // ' time on' 0x6C 0x79 0x20 0x74 0x6F 0x20 0x74 0x68 // 'ly to th' 0x69 0x6E 0x6B 0x20 0x61 0x62 0x6F 0x75 // 'ink abou' 0x74 0x20 0x69 0x6D 0x70 0x6F 0x72 0x74 // 't import' 0x61 0x6E 0x74 0x20 0x74 0x68 0x69 0x6E // 'ant thin' 0x67 0x73 0x2C 0x20 0x6C 0x69 0x6B 0x65 // 'gs, like' 0x20 0x69 0x66 0x20 0x77 0x68 0x69 0x74 // ' if whit' 0x65 0x20 0x69 0x73 0x20 0x6E 0x6F 0x74 // 'e is not' 0x20 0x61 0x20 0x63 0x6F 0x6C 0x6F 0x72 // ' a color' 0x2C 0x20 0x74 0x68 0x65 0x6E 0x20 0x69 // ', then i' 0x73 0x20 0x62 0x6C 0x61 0x63 0x6B 0x20 // 's black ' 0x61 0x6C 0x6C 0x20 0x74 0x68 0x65 0x20 // 'all the ' 0x63 0x6F 0x6C 0x6F 0x72 0x73 0x20 0x70 // 'colors p' 0x75 0x74 0x20 0x74 0x6F 0x67 0x65 0x74 // 'ut toget' 0x68 0x65 0x72 0x3F 0x20 0x20 0x48 0x65 // 'her? He' 0x20 0x65 0x76 0x65 0x6E 0x20 0x74 0x68 // ' even th' 0x69 0x6E 0x6B 0x73 0x20 0x69 0x6E 0x20 // 'inks in ' 0x68 0x69 0x73 0x20 0x73 0x6C 0x65 0x65 // 'his slee' 0x70 0x2E 0x20 0x20 0x48 0x65 0x20 0x64 // 'p. He d' 0x6F 0x65 0x73 0x6E 0x92 0x74 0x20 0x77 // 'oesnt w' 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 0x6C // 'ant to l' 0x6F 0x73 0x65 0x20 0x61 0x6E 0x79 0x20 // 'ose any ' 0x62 0x72 0x61 0x69 0x6E 0x2D 0x63 0x79 // 'brain-cy' 0x63 0x6C 0x65 0x73 0x2E 0x20 0x20 0x55 // 'cles. U' 0x6E 0x66 0x6F 0x72 0x74 0x75 0x6E 0x61 // 'nfortuna' 0x74 0x65 0x6C 0x79 0x2C 0x20 0x61 0x6C // 'tely, al' 0x6C 0x20 0x74 0x68 0x69 0x73 0x20 0x74 // 'l this t' 0x68 0x69 0x6E 0x6B 0x69 0x6E 0x67 0x20 // 'hinking ' 0x6D 0x61 0x64 0x65 0x20 0x68 0x69 0x73 // 'made his' 0x20 0x6E 0x6F 0x73 0x65 0x20 0x70 0x6F // ' nose po' 0x69 0x6E 0x74 0x79 0x20 0x61 0x6E 0x64 // 'inty and' 0x20 0x73 0x68 0x61 0x72 0x70 0x2E 0x20 // ' sharp. ' 0x0D 0x0A 0x44 0x72 0x65 0x61 0x6D 0x20 // '??Dream ' 0x52 0x6F 0x6C 0x65 0x73 0x0D 0x0A 0x4D // 'Roles??M' 0x61 0x64 0x20 0x53 0x63 0x69 0x65 0x6E // 'ad Scien' 0x74 0x69 0x73 0x74 0x3B 0x20 0x50 0x61 // 'tist; Pa' 0x72 0x6B 0x69 0x6E 0x67 0x20 0x56 0x61 // 'rking Va' 0x6C 0x65 0x74 0x3B 0x20 0x4E 0x61 0x74 // 'let; Nat' 0x69 0x76 0x65 0x20 0x53 0x74 0x75 0x64 // 'ive Stud' 0x65 0x6E 0x74 // 'ent' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_28= ktpcBioPageNum #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_28, __HELP_NAME("Bio Page Number field")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_28, __HELP_NAME("Bio Page Number field")) __HELP_PACK2 BO OSK LONG kgobBlankBalloon ktpcBioPageNum 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_24=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_28, 0x0) GST(0) ITEM "kgobBlankBalloon" ITEM "ktpcBioPageNum" ITEM "ktpcBioPageNum" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_24=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_28, 0x0) BYTE 0x01 0x00 0x03 0x03 0x42 0x00 0x00 0x00 // '????B???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_24=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_24, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0A 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_24=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_24, 0x0) BYTE 0x03 0x03 0x20 0x7E 0x31 0x30 0x30 0x20 // '?? ~100 ' 0x2F 0x20 0x34 0x30 // '/ 40' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_29= ktpcBioPage41 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_29, __HELP_NAME("Bio Page 41 Zack")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_29, __HELP_NAME("Bio Page 41 Zack")) __HELP_PACK2 BO OSK LONG kgobBlankBalloon kgobBlankBalloon 0x0 kidBioTipScript 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_29, 0x0) GST(0) ITEM "kgobBlankBalloon" ITEM "ktpcBioPage41" ITEM "kgobBlankBalloon" ITEM "" ITEM "kidBioTipScript" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_29, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_22=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1E, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktipbio166 __HELP_SYMBOL( STN "ktipbio166" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktipbio167 __HELP_SYMBOL( STN "ktipbio167" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktipbio168 __HELP_SYMBOL( STN "ktipbio168" ) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktipbio165 __HELP_SYMBOL( STN "ktipbio165" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_1E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x20 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // ' ???????' 0x01 0x00 0x00 0x00 0x9C 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x9D 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xDA 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x04 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0x06 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x10 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0x12 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0xA9 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xB4 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x9D 0x00 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xA6 0x00 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xB6 0x00 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xBD 0x00 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xBF 0x00 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xC6 0x00 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xC8 0x00 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xDA 0x00 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0x9D 0x00 0x00 0x40 // '??????@' 0x05 0x00 0x00 0x00 0xA6 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xB6 0x00 0x00 0x40 // '??????@' 0x01 0x00 0x00 0x00 0xBD 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xBF 0x00 0x00 0x40 // '??????@' 0x02 0x00 0x00 0x00 0xC6 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xC8 0x00 0x00 0x40 // '??????@' 0x03 0x00 0x00 0x00 0xDA 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0xF7 0xFF 0x00 0x02 0x06 0x00 0x00 0x80 // '?????' 0xF7 0xFF 0x00 0x00 0x12 0x00 0x00 0x80 // '?????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xB6 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1E, 0x0) BYTE 0x03 0x03 0x5A 0x41 0x43 0x4B 0x0D 0x0A // '??ZACK??' 0x42 0x61 0x63 0x6B 0x67 0x72 0x6F 0x75 // 'Backgrou' 0x6E 0x64 0x0D 0x0A 0x5A 0x61 0x63 0x6B // 'nd??Zack' 0x20 0x77 0x61 0x73 0x20 0x62 0x6F 0x72 // ' was bor' 0x6E 0x20 0x61 0x6E 0x64 0x20 0x72 0x61 // 'n and ra' 0x69 0x73 0x65 0x64 0x20 0x69 0x6E 0x20 // 'ised in ' 0x4D 0x61 0x64 0x72 0x69 0x64 0x2C 0x20 // 'Madrid, ' 0x53 0x70 0x61 0x69 0x6E 0x2E 0x20 0x4E // 'Spain. N' 0x6F 0x20 0x6F 0x6E 0x65 0x20 0x6B 0x6E // 'o one kn' 0x6F 0x77 0x73 0x20 0x68 0x69 0x73 0x20 // 'ows his ' 0x72 0x65 0x61 0x6C 0x20 0x61 0x67 0x65 // 'real age' 0x2C 0x20 0x62 0x75 0x74 0x20 0x68 0x65 // ', but he' 0x92 0x73 0x20 0x67 0x6F 0x74 0x74 0x61 // 's gotta' 0x20 0x62 0x65 0x20 0x61 0x74 0x20 0x6C // ' be at l' 0x65 0x61 0x73 0x74 0x20 0x34 0x30 0x2E // 'east 40.' 0x20 0x48 0x65 0x20 0x63 0x6F 0x6D 0x65 // ' He come' 0x73 0x20 0x66 0x72 0x6F 0x6D 0x20 0x61 // 's from a' 0x20 0x66 0x61 0x6D 0x69 0x6C 0x79 0x20 // ' family ' 0x6F 0x66 0x20 0x6F 0x75 0x74 0x73 0x74 // 'of outst' 0x61 0x6E 0x64 0x69 0x6E 0x67 0x20 0x6D // 'anding m' 0x61 0x74 0x61 0x64 0x6F 0x72 0x73 0x2E // 'atadors.' 0x20 0x0D 0x0A 0x44 0x72 0x65 0x61 0x6D // ' ??Dream' 0x20 0x52 0x6F 0x6C 0x65 0x73 0x0D 0x0A // ' Roles??' 0x50 0x68 0x61 0x6E 0x74 0x6F 0x6D 0x3B // 'Phantom;' 0x20 0x56 0x69 0x6C 0x6C 0x69 0x61 0x6E // ' Villian' 0x3B 0x20 0x43 0x61 0x6D 0x6F 0x75 0x66 // '; Camouf' 0x6C 0x61 0x67 0x65 0x64 0x20 0x48 0x75 // 'laged Hu' 0x6E 0x74 0x65 0x72 // 'nter' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2A= ktipbio1 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2A, __HELP_NAME("ktipbio1")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2A, __HELP_NAME("ktipbio1")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2A, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio1" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2A, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x11 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x13 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x08 0x02 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2E, 0x0) BYTE 0x03 0x03 0x66 0x61 0x6E 0x63 0x79 0x20 // '??fancy ' 0x64 0x61 0x6E 0x63 0x65 0x20 0x73 0x74 // 'dance st' 0x65 0x70 0x73 0x0D 0x0A 0x49 0x74 0x20 // 'eps??It ' 0x77 0x61 0x73 0x20 0x41 0x6C 0x65 0x78 // 'was Alex' 0x61 0x6E 0x64 0x65 0x72 0x92 0x73 0x20 // 'anders ' 0x66 0x61 0x6E 0x63 0x79 0x20 0x64 0x61 // 'fancy da' 0x6E 0x63 0x65 0x20 0x73 0x74 0x65 0x70 // 'nce step' 0x73 0x20 0x74 0x68 0x61 0x74 0x20 0x67 // 's that g' 0x6F 0x74 0x20 0x68 0x69 0x6D 0x20 0x69 // 'ot him i' 0x6E 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 // 'nto the ' 0x6D 0x6F 0x76 0x69 0x65 0x20 0x62 0x75 // 'movie bu' 0x73 0x69 0x6E 0x65 0x73 0x73 0x2E 0x20 // 'siness. ' 0x20 0x48 0x65 0x20 0x77 0x61 0x73 0x20 // ' He was ' 0x72 0x65 0x63 0x72 0x75 0x69 0x74 0x65 // 'recruite' 0x64 0x20 0x61 0x73 0x20 0x61 0x20 0x63 // 'd as a c' 0x68 0x6F 0x72 0x65 0x6F 0x67 0x72 0x61 // 'horeogra' 0x70 0x68 0x65 0x72 0x20 0x66 0x6F 0x72 // 'pher for' 0x20 0x6D 0x75 0x73 0x69 0x63 0x20 0x76 // ' music v' 0x69 0x64 0x65 0x6F 0x73 0x20 0x62 0x75 // 'ideos bu' 0x74 0x20 0x61 0x74 0x20 0x66 0x69 0x72 // 't at fir' 0x73 0x74 0x20 0x77 0x61 0x73 0x6E 0x92 // 'st wasn' 0x74 0x20 0x63 0x6F 0x6E 0x73 0x69 0x64 // 't consid' 0x65 0x72 0x65 0x64 0x20 0x67 0x6F 0x6F // 'ered goo' 0x64 0x2D 0x6C 0x6F 0x6F 0x6B 0x69 0x6E // 'd-lookin' 0x67 0x20 0x65 0x6E 0x6F 0x75 0x67 0x68 // 'g enough' 0x20 0x74 0x6F 0x20 0x61 0x63 0x74 0x75 // ' to actu' 0x61 0x6C 0x6C 0x79 0x20 0x70 0x65 0x72 // 'ally per' 0x66 0x6F 0x72 0x6D 0x20 0x6F 0x6E 0x20 // 'form on ' 0x66 0x69 0x6C 0x6D 0x2E 0x20 0x20 0x44 // 'film. D' 0x75 0x72 0x69 0x6E 0x67 0x20 0x74 0x68 // 'uring th' 0x65 0x20 0x66 0x69 0x6C 0x6D 0x69 0x6E // 'e filmin' 0x67 0x20 0x6F 0x66 0x20 0x6F 0x6E 0x65 // 'g of one' 0x20 0x76 0x69 0x64 0x65 0x6F 0x2C 0x20 // ' video, ' 0x68 0x6F 0x77 0x65 0x76 0x65 0x72 0x2C // 'however,' 0x20 0x74 0x68 0x65 0x20 0x73 0x74 0x61 // ' the sta' 0x72 0x20 0x64 0x61 0x6E 0x63 0x65 0x72 // 'r dancer' 0x20 0x63 0x61 0x75 0x67 0x68 0x74 0x20 // ' caught ' 0x6F 0x6E 0x20 0x66 0x69 0x72 0x65 0x20 // 'on fire ' 0x61 0x6E 0x64 0x20 0x74 0x68 0x65 0x20 // 'and the ' 0x6F 0x6E 0x6C 0x79 0x20 0x6F 0x74 0x68 // 'only oth' 0x65 0x72 0x20 0x70 0x65 0x72 0x73 0x6F // 'er perso' 0x6E 0x20 0x77 0x68 0x6F 0x20 0x6B 0x6E // 'n who kn' 0x65 0x77 0x20 0x74 0x68 0x65 0x20 0x64 // 'ew the d' 0x61 0x6E 0x63 0x65 0x20 0x73 0x74 0x65 // 'ance ste' 0x70 0x73 0x20 0x77 0x61 0x73 0x20 0x41 // 'ps was A' 0x6C 0x65 0x78 0x61 0x6E 0x64 0x65 0x72 // 'lexander' 0x2E 0x0D 0x0A 0x41 0x66 0x74 0x65 0x72 // '.??After' 0x20 0x74 0x68 0x65 0x20 0x76 0x69 0x64 // ' the vid' 0x65 0x6F 0x20 0x77 0x61 0x73 0x20 0x73 // 'eo was s' 0x68 0x6F 0x77 0x6E 0x20 0x6F 0x6E 0x20 // 'hown on ' 0x54 0x56 0x2C 0x20 0x74 0x68 0x65 0x20 // 'TV, the ' 0x74 0x65 0x6C 0x65 0x76 0x69 0x73 0x69 // 'televisi' 0x6F 0x6E 0x20 0x73 0x74 0x61 0x74 0x69 // 'on stati' 0x6F 0x6E 0x20 0x77 0x61 0x73 0x20 0x66 // 'on was f' 0x6C 0x6F 0x6F 0x64 0x65 0x64 0x20 0x77 // 'looded w' 0x69 0x74 0x68 0x20 0x66 0x61 0x6E 0x20 // 'ith fan ' 0x6D 0x61 0x69 0x6C 0x20 0x66 0x6F 0x72 // 'mail for' 0x20 0x41 0x6C 0x65 0x78 0x61 0x6E 0x64 // ' Alexand' 0x65 0x72 0x21 0x20 0x20 0x48 0x65 0x20 // 'er! He ' 0x62 0x65 0x63 0x61 0x6D 0x65 0x20 0x61 // 'became a' 0x6E 0x20 0x69 0x6E 0x73 0x74 0x61 0x6E // 'n instan' 0x74 0x20 0x73 0x74 0x61 0x72 0x20 0x61 // 't star a' 0x6E 0x64 0x20 0x77 0x61 0x73 0x20 0x73 // 'nd was s' 0x6F 0x6F 0x6E 0x20 0x6D 0x61 0x6B 0x69 // 'oon maki' 0x6E 0x67 0x20 0x6D 0x6F 0x76 0x69 0x65 // 'ng movie' 0x73 0x2E // 's.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2B= ktipbio2 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2B, __HELP_NAME("ktipbio2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2B, __HELP_NAME("ktipbio2")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2B, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio2" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2B, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_4C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xB1 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x09 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0xB1 0x01 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x2C 0x01 0x00 0x82 // '????,??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4C, 0x0) BYTE 0x03 0x03 0x4C 0x69 0x62 0x72 0x61 0x72 // '??Librar' 0x69 0x61 0x6E 0x0D 0x0A 0x41 0x6C 0x65 // 'ian??Ale' 0x78 0x61 0x6E 0x64 0x65 0x72 0x20 0x77 // 'xander w' 0x61 0x6E 0x74 0x73 0x20 0x74 0x6F 0x20 // 'ants to ' 0x70 0x6C 0x61 0x79 0x20 0x74 0x68 0x65 // 'play the' 0x20 0x6C 0x69 0x62 0x72 0x61 0x72 0x69 // ' librari' 0x61 0x6E 0x20 0x69 0x6E 0x20 0x61 0x20 // 'an in a ' 0x6C 0x61 0x72 0x67 0x65 0x2C 0x20 0x63 // 'large, c' 0x72 0x65 0x65 0x70 0x79 0x20 0x68 0x6F // 'reepy ho' 0x75 0x73 0x65 0x2E 0x20 0x41 0x73 0x20 // 'use. As ' 0x68 0x65 0x20 0x73 0x69 0x74 0x73 0x20 // 'he sits ' 0x61 0x74 0x20 0x68 0x69 0x73 0x20 0x64 // 'at his d' 0x65 0x73 0x6B 0x2C 0x20 0x61 0x20 0x67 // 'esk, a g' 0x75 0x79 0x20 0x77 0x68 0x6F 0x20 0x6C // 'uy who l' 0x6F 0x6F 0x6B 0x73 0x20 0x6C 0x69 0x6B // 'ooks lik' 0x65 0x20 0x61 0x20 0x6D 0x75 0x6D 0x6D // 'e a mumm' 0x79 0x20 0x77 0x61 0x6C 0x6B 0x73 0x20 // 'y walks ' 0x72 0x69 0x67 0x68 0x74 0x20 0x74 0x68 // 'right th' 0x72 0x6F 0x75 0x67 0x68 0x20 0x74 0x68 // 'rough th' 0x65 0x20 0x77 0x61 0x6C 0x6C 0x20 0x61 // 'e wall a' 0x6E 0x64 0x20 0x73 0x74 0x61 0x6E 0x64 // 'nd stand' 0x73 0x20 0x62 0x65 0x73 0x69 0x64 0x65 // 's beside' 0x20 0x68 0x69 0x6D 0x21 0x20 0x20 0x41 // ' him! A' 0x6C 0x65 0x78 0x61 0x6E 0x64 0x65 0x72 // 'lexander' 0x20 0x69 0x73 0x20 0x73 0x74 0x75 0x6E // ' is stun' 0x6E 0x65 0x64 0x20 0x61 0x73 0x20 0x68 // 'ned as h' 0x65 0x20 0x6C 0x69 0x73 0x74 0x65 0x6E // 'e listen' 0x73 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 // 's to the' 0x20 0x6D 0x75 0x6D 0x6D 0x79 0x92 0x73 // ' mummys' 0x20 0x77 0x61 0x72 0x6E 0x69 0x6E 0x67 // ' warning' 0x20 0x74 0x6F 0x20 0x6C 0x65 0x61 0x76 // ' to leav' 0x65 0x20 0x68 0x69 0x73 0x20 0x6A 0x6F // 'e his jo' 0x62 0x20 0x61 0x73 0x20 0x61 0x20 0x6C // 'b as a l' 0x69 0x62 0x72 0x61 0x72 0x69 0x61 0x6E // 'ibrarian' 0x20 0x6F 0x72 0x20 0x66 0x61 0x63 0x65 // ' or face' 0x20 0x68 0x6F 0x72 0x72 0x69 0x62 0x6C // ' horribl' 0x65 0x20 0x64 0x69 0x73 0x61 0x73 0x74 // 'e disast' 0x65 0x72 0x2E 0x20 0x0D 0x0A 0x57 0x68 // 'er. ??Wh' 0x79 0x20 0x6D 0x75 0x73 0x74 0x20 0x41 // 'y must A' 0x6C 0x65 0x78 0x61 0x6E 0x64 0x65 0x72 // 'lexander' 0x20 0x6C 0x65 0x61 0x76 0x65 0x20 0x68 // ' leave h' 0x69 0x73 0x20 0x6A 0x6F 0x62 0x3F 0x20 // 'is job? ' 0x20 0x49 0x73 0x20 0x74 0x68 0x69 0x73 // ' Is this' 0x20 0x6A 0x75 0x73 0x74 0x20 0x74 0x68 // ' just th' 0x65 0x20 0x65 0x78 0x63 0x75 0x73 0x65 // 'e excuse' 0x20 0x68 0x65 0x20 0x6E 0x65 0x65 0x64 // ' he need' 0x73 0x20 0x74 0x6F 0x20 0x71 0x75 0x69 // 's to qui' 0x74 0x20 0x68 0x69 0x73 0x20 0x6A 0x6F // 't his jo' 0x62 0x20 0x61 0x6E 0x64 0x20 0x64 0x61 // 'b and da' 0x6E 0x63 0x65 0x20 0x66 0x6F 0x72 0x20 // 'nce for ' 0x61 0x20 0x6C 0x69 0x76 0x69 0x6E 0x67 // 'a living' 0x3F 0x20 0x20 0x57 0x68 0x79 0x20 0x64 // '? Why d' 0x6F 0x65 0x73 0x20 0x74 0x68 0x65 0x20 // 'oes the ' 0x4D 0x75 0x6D 0x6D 0x79 0x20 0x63 0x61 // 'Mummy ca' 0x72 0x65 0x3F // 're?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2C= ktipbio3 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2C, __HELP_NAME("ktipbio3")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2C, __HELP_NAME("ktipbio3")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_26=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2C, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio3" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_26=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2C, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_26=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_26, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x09 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xD7 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0xD9 0x01 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xDB 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x0B 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0xDB 0x01 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x89 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_26=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_26, 0x0) BYTE 0x03 0x03 0x46 0x6F 0x6F 0x64 0x20 0x43 // '??Food C' 0x72 0x69 0x74 0x69 0x63 0x0D 0x0A 0x41 // 'ritic??A' 0x6C 0x65 0x78 0x61 0x6E 0x64 0x65 0x72 // 'lexander' 0x20 0x77 0x6F 0x75 0x6C 0x64 0x20 0x6C // ' would l' 0x6F 0x76 0x65 0x20 0x74 0x6F 0x20 0x70 // 'ove to p' 0x6C 0x61 0x79 0x20 0x61 0x20 0x66 0x6F // 'lay a fo' 0x6F 0x64 0x20 0x63 0x72 0x69 0x74 0x69 // 'od criti' 0x63 0x20 0x77 0x68 0x6F 0x20 0x77 0x61 // 'c who wa' 0x6C 0x6B 0x73 0x20 0x69 0x6E 0x74 0x6F // 'lks into' 0x20 0x61 0x20 0x6E 0x65 0x77 0x20 0x72 // ' a new r' 0x65 0x73 0x74 0x61 0x75 0x72 0x61 0x6E // 'estauran' 0x74 0x20 0x74 0x6F 0x20 0x72 0x65 0x76 // 't to rev' 0x69 0x65 0x77 0x20 0x74 0x68 0x65 0x20 // 'iew the ' 0x66 0x6F 0x6F 0x64 0x20 0x66 0x6F 0x72 // 'food for' 0x20 0x68 0x69 0x73 0x20 0x64 0x61 0x69 // ' his dai' 0x6C 0x79 0x20 0x6E 0x65 0x77 0x73 0x70 // 'ly newsp' 0x61 0x70 0x65 0x72 0x20 0x63 0x6F 0x6C // 'aper col' 0x75 0x6D 0x6E 0x2E 0x20 0x20 0x4E 0x6F // 'umn. No' 0x20 0x6F 0x6E 0x65 0x20 0x73 0x65 0x65 // ' one see' 0x6D 0x73 0x20 0x74 0x6F 0x20 0x62 0x65 // 'ms to be' 0x20 0x61 0x72 0x6F 0x75 0x6E 0x64 0x20 // ' around ' 0x73 0x6F 0x20 0x68 0x65 0x20 0x77 0x61 // 'so he wa' 0x6C 0x6B 0x73 0x20 0x74 0x6F 0x20 0x74 // 'lks to t' 0x68 0x65 0x20 0x63 0x6F 0x75 0x6E 0x74 // 'he count' 0x65 0x72 0x20 0x61 0x6E 0x64 0x20 0x74 // 'er and t' 0x61 0x6B 0x65 0x73 0x20 0x61 0x20 0x73 // 'akes a s' 0x65 0x61 0x74 0x2E 0x20 0x20 0x41 0x20 // 'eat. A ' 0x77 0x61 0x69 0x74 0x65 0x72 0x20 0x65 // 'waiter e' 0x76 0x65 0x6E 0x74 0x75 0x61 0x6C 0x6C // 'ventuall' 0x79 0x20 0x63 0x6F 0x6D 0x65 0x73 0x20 // 'y comes ' 0x6F 0x75 0x74 0x20 0x6F 0x66 0x20 0x74 // 'out of t' 0x68 0x65 0x20 0x6B 0x69 0x74 0x63 0x68 // 'he kitch' 0x65 0x6E 0x20 0x74 0x6F 0x20 0x74 0x61 // 'en to ta' 0x6B 0x65 0x20 0x68 0x69 0x73 0x20 0x6F // 'ke his o' 0x72 0x64 0x65 0x72 0x2C 0x20 0x62 0x75 // 'rder, bu' 0x74 0x20 0x73 0x74 0x6F 0x70 0x73 0x20 // 't stops ' 0x69 0x6E 0x20 0x73 0x68 0x6F 0x63 0x6B // 'in shock' 0x20 0x77 0x68 0x65 0x6E 0x20 0x68 0x65 // ' when he' 0x20 0x73 0x65 0x65 0x73 0x20 0x41 0x6C // ' sees Al' 0x65 0x78 0x61 0x6E 0x64 0x65 0x72 0x2E // 'exander.' 0x20 0x20 0x41 0x6C 0x65 0x78 0x61 0x6E // ' Alexan' 0x64 0x65 0x72 0x20 0x69 0x73 0x20 0x65 // 'der is e' 0x71 0x75 0x61 0x6C 0x6C 0x79 0x20 0x73 // 'qually s' 0x74 0x75 0x6E 0x6E 0x65 0x64 0x3B 0x20 // 'tunned; ' 0x74 0x68 0x65 0x20 0x77 0x61 0x69 0x74 // 'the wait' 0x65 0x72 0x20 0x6C 0x6F 0x6F 0x6B 0x73 // 'er looks' 0x20 0x65 0x78 0x61 0x63 0x74 0x6C 0x79 // ' exactly' 0x20 0x6C 0x69 0x6B 0x65 0x20 0x41 0x6C // ' like Al' 0x65 0x78 0x61 0x6E 0x64 0x65 0x72 0x21 // 'exander!' 0x20 0x0D 0x0A 0x48 0x6F 0x77 0x20 0x63 // ' ??How c' 0x61 0x6E 0x20 0x74 0x68 0x69 0x73 0x20 // 'an this ' 0x62 0x65 0x3F 0x20 0x20 0x57 0x68 0x6F // 'be? Who' 0x20 0x69 0x73 0x20 0x74 0x68 0x69 0x73 // ' is this' 0x20 0x6C 0x6F 0x6F 0x6B 0x2D 0x61 0x6C // ' look-al' 0x69 0x6B 0x65 0x20 0x61 0x6E 0x64 0x20 // 'ike and ' 0x77 0x68 0x6F 0x20 0x63 0x6F 0x6F 0x6B // 'who cook' 0x65 0x64 0x20 0x75 0x70 0x20 0x74 0x68 // 'ed up th' 0x69 0x73 0x20 0x73 0x69 0x6E 0x69 0x73 // 'is sinis' 0x74 0x65 0x72 0x20 0x70 0x6C 0x6F 0x74 // 'ter plot' 0x3F 0x0D 0x0A 0x0D 0x0A // '?????' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2D= ktipbio4 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2D, __HELP_NAME("ktipbio4")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2D, __HELP_NAME("ktipbio4")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2D, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio4" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_29=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2D, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_29=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_29, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x3F 0x01 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x3F 0x01 0x00 0x03 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xF5 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_29=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_29, 0x0) BYTE 0x03 0x03 0x45 0x78 0x70 0x6C 0x6F 0x72 // '??Explor' 0x65 0x72 0x0D 0x0A 0x41 0x6C 0x65 0x78 // 'er??Alex' 0x61 0x6E 0x64 0x65 0x72 0x20 0x61 0x6C // 'ander al' 0x73 0x6F 0x20 0x77 0x61 0x6E 0x74 0x73 // 'so wants' 0x20 0x74 0x6F 0x20 0x70 0x6C 0x61 0x79 // ' to play' 0x20 0x61 0x6E 0x20 0x65 0x78 0x70 0x6C // ' an expl' 0x6F 0x72 0x65 0x72 0x20 0x73 0x65 0x61 // 'orer sea' 0x72 0x63 0x68 0x69 0x6E 0x67 0x20 0x66 // 'rching f' 0x6F 0x72 0x20 0x61 0x20 0x63 0x61 0x74 // 'or a cat' 0x20 0x77 0x68 0x69 0x63 0x68 0x2C 0x20 // ' which, ' 0x6C 0x65 0x67 0x65 0x6E 0x64 0x20 0x68 // 'legend h' 0x61 0x73 0x20 0x69 0x74 0x2C 0x20 0x63 // 'as it, c' 0x61 0x6E 0x20 0x74 0x65 0x6C 0x6C 0x20 // 'an tell ' 0x74 0x68 0x65 0x20 0x66 0x75 0x74 0x75 // 'the futu' 0x72 0x65 0x21 0x20 0x20 0x41 0x6C 0x65 // 're! Ale' 0x78 0x61 0x6E 0x64 0x65 0x72 0x20 0x74 // 'xander t' 0x68 0x69 0x6E 0x6B 0x73 0x20 0x74 0x68 // 'hinks th' 0x61 0x74 0x20 0x68 0x65 0x20 0x68 0x61 // 'at he ha' 0x73 0x20 0x66 0x6F 0x75 0x6E 0x64 0x20 // 's found ' 0x74 0x68 0x65 0x20 0x76 0x69 0x6C 0x6C // 'the vill' 0x61 0x67 0x65 0x20 0x77 0x68 0x65 0x72 // 'age wher' 0x65 0x20 0x74 0x68 0x65 0x20 0x63 0x61 // 'e the ca' 0x74 0x20 0x77 0x61 0x73 0x20 0x6C 0x61 // 't was la' 0x73 0x74 0x20 0x73 0x70 0x6F 0x74 0x74 // 'st spott' 0x65 0x64 0x2C 0x20 0x62 0x75 0x74 0x20 // 'ed, but ' 0x68 0x69 0x73 0x20 0x72 0x69 0x76 0x61 // 'his riva' 0x6C 0x20 0x65 0x78 0x70 0x6C 0x6F 0x72 // 'l explor' 0x65 0x72 0x20 0x69 0x73 0x20 0x61 0x6C // 'er is al' 0x73 0x6F 0x20 0x68 0x6F 0x74 0x20 0x6F // 'so hot o' 0x6E 0x20 0x74 0x68 0x65 0x20 0x74 0x72 // 'n the tr' 0x61 0x69 0x6C 0x2E 0x20 0x0D 0x0A 0x44 // 'ail. ??D' 0x6F 0x65 0x73 0x20 0x73 0x75 0x63 0x68 // 'oes such' 0x20 0x61 0x20 0x63 0x61 0x74 0x20 0x61 // ' a cat a' 0x63 0x74 0x75 0x61 0x6C 0x6C 0x79 0x20 // 'ctually ' 0x65 0x78 0x69 0x73 0x74 0x20 0x61 0x6E // 'exist an' 0x64 0x20 0x77 0x69 0x6C 0x6C 0x20 0x41 // 'd will A' 0x6C 0x65 0x78 0x61 0x6E 0x64 0x65 0x72 // 'lexander' 0x20 0x62 0x65 0x20 0x74 0x68 0x65 0x20 // ' be the ' 0x66 0x69 0x72 0x73 0x74 0x20 0x74 0x6F // 'first to' 0x20 0x66 0x69 0x6E 0x64 0x20 0x69 0x74 // ' find it' 0x3F // '?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2E= ktipbio5 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2E, __HELP_NAME("ktipbio5")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2E, __HELP_NAME("ktipbio5")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_23=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2E, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio5" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_23=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2E, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_23=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_23, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xE1 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0xE1 0x01 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x37 0x01 0x00 0x82 // '????7??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_23=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_23, 0x0) BYTE 0x03 0x03 0x74 0x65 0x6C 0x65 0x67 0x72 // '??telegr' 0x61 0x6D 0x0D 0x0A 0x4F 0x6B 0x61 0x79 // 'am??Okay' 0x2C 0x20 0x73 0x6F 0x20 0x41 0x75 0x67 // ', so Aug' 0x75 0x73 0x74 0x69 0x6E 0x20 0x72 0x65 // 'ustin re' 0x61 0x6C 0x6C 0x79 0x20 0x77 0x61 0x6E // 'ally wan' 0x74 0x65 0x64 0x20 0x74 0x6F 0x20 0x62 // 'ted to b' 0x65 0x20 0x61 0x20 0x72 0x6F 0x63 0x6B // 'e a rock' 0x20 0x73 0x74 0x61 0x72 0x20 0x69 0x6E // ' star in' 0x20 0x49 0x74 0x61 0x6C 0x79 0x2C 0x20 // ' Italy, ' 0x6F 0x72 0x20 0x62 0x65 0x74 0x74 0x65 // 'or bette' 0x72 0x20 0x79 0x65 0x74 0x2C 0x20 0x61 // 'r yet, a' 0x20 0x62 0x69 0x67 0x67 0x65 0x72 0x2D // ' bigger-' 0x74 0x68 0x61 0x6E 0x2D 0x6C 0x69 0x66 // 'than-lif' 0x65 0x20 0x73 0x74 0x61 0x72 0x20 0x69 // 'e star i' 0x6E 0x20 0x61 0x20 0x6D 0x75 0x73 0x69 // 'n a musi' 0x63 0x61 0x6C 0x2E 0x20 0x20 0x48 0x65 // 'cal. He' 0x20 0x74 0x68 0x6F 0x75 0x67 0x68 0x74 // ' thought' 0x20 0x68 0x69 0x73 0x20 0x61 0x67 0x65 // ' his age' 0x20 0x6D 0x69 0x67 0x68 0x74 0x20 0x62 // ' might b' 0x65 0x20 0x61 0x20 0x70 0x72 0x6F 0x62 // 'e a prob' 0x6C 0x65 0x6D 0x2C 0x20 0x74 0x68 0x6F // 'lem, tho' 0x75 0x67 0x68 0x2E 0x20 0x42 0x75 0x74 // 'ugh. But' 0x20 0x62 0x65 0x63 0x61 0x75 0x73 0x65 // ' because' 0x20 0x68 0x65 0x20 0x63 0x6F 0x75 0x6C // ' he coul' 0x64 0x20 0x73 0x68 0x72 0x69 0x6E 0x6B // 'd shrink' 0x2C 0x20 0x65 0x69 0x74 0x68 0x65 0x72 // ', either' 0x20 0x73 0x6C 0x6F 0x77 0x6C 0x79 0x20 // ' slowly ' 0x6F 0x72 0x20 0x71 0x75 0x69 0x63 0x6B // 'or quick' 0x6C 0x79 0x2C 0x20 0x68 0x65 0x20 0x63 // 'ly, he c' 0x6F 0x75 0x6C 0x64 0x20 0x73 0x6E 0x65 // 'ould sne' 0x61 0x6B 0x20 0x69 0x6E 0x74 0x6F 0x20 // 'ak into ' 0x72 0x65 0x63 0x6F 0x72 0x64 0x69 0x6E // 'recordin' 0x67 0x20 0x73 0x74 0x75 0x64 0x69 0x6F // 'g studio' 0x73 0x20 0x61 0x6E 0x64 0x20 0x6C 0x69 // 's and li' 0x73 0x74 0x65 0x6E 0x20 0x74 0x6F 0x20 // 'sten to ' 0x6F 0x74 0x68 0x65 0x72 0x20 0x73 0x69 // 'other si' 0x6E 0x67 0x65 0x72 0x73 0x20 0x66 0x6F // 'ngers fo' 0x72 0x20 0x69 0x6E 0x73 0x70 0x69 0x72 // 'r inspir' 0x61 0x74 0x69 0x6F 0x6E 0x2E 0x20 0x0D // 'ation. ?' 0x0A 0x4F 0x6E 0x65 0x20 0x64 0x61 0x79 // '?One day' 0x20 0x68 0x65 0x20 0x73 0x68 0x72 0x75 // ' he shru' 0x6E 0x6B 0x20 0x68 0x69 0x6D 0x73 0x65 // 'nk himse' 0x6C 0x66 0x20 0x76 0x65 0x72 0x79 0x20 // 'lf very ' 0x73 0x6D 0x61 0x6C 0x6C 0x20 0x61 0x6E // 'small an' 0x64 0x20 0x63 0x72 0x61 0x77 0x6C 0x65 // 'd crawle' 0x64 0x20 0x6F 0x6E 0x74 0x6F 0x20 0x61 // 'd onto a' 0x20 0x6D 0x6F 0x76 0x69 0x65 0x20 0x73 // ' movie s' 0x65 0x74 0x2E 0x20 0x20 0x4A 0x75 0x73 // 'et. Jus' 0x74 0x20 0x61 0x73 0x20 0x68 0x65 0x20 // 't as he ' 0x77 0x61 0x73 0x20 0x67 0x72 0x6F 0x77 // 'was grow' 0x69 0x6E 0x67 0x20 0x62 0x61 0x63 0x6B // 'ing back' 0x2C 0x20 0x61 0x20 0x64 0x69 0x72 0x65 // ', a dire' 0x63 0x74 0x6F 0x72 0x20 0x73 0x70 0x6F // 'ctor spo' 0x74 0x74 0x65 0x64 0x20 0x68 0x69 0x6D // 'tted him' 0x20 0x61 0x6E 0x64 0x20 0x73 0x61 0x69 // ' and sai' 0x64 0x2C 0x20 0x93 0x57 0x65 0x20 0x67 // 'd, We g' 0x6F 0x74 0x74 0x61 0x20 0x68 0x61 0x76 // 'otta hav' 0x65 0x20 0x79 0x6F 0x75 0x20 0x64 0x6F // 'e you do' 0x20 0x74 0x68 0x61 0x74 0x20 0x69 0x6E // ' that in' 0x20 0x61 0x20 0x6D 0x6F 0x76 0x69 0x65 // ' a movie' 0x21 0x94 0x20 // '! ' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2F= ktipbio6 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2F, __HELP_NAME("ktipbio6")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2F, __HELP_NAME("ktipbio6")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2F, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio6" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2F, 0x0) BYTE 0x01 0x00 0x03 0x03 0xDE 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x71 0x02 0x00 0x01 // '????q???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xDD 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2F, 0x0) BYTE 0x03 0x03 0x4F 0x70 0x65 0x72 0x61 0x20 // '??Opera ' 0x53 0x69 0x6E 0x67 0x65 0x72 0x0D 0x0A // 'Singer??' 0x53 0x69 0x6E 0x63 0x65 0x20 0x6F 0x70 // 'Since op' 0x65 0x72 0x61 0x20 0x74 0x65 0x6C 0x6C // 'era tell' 0x73 0x20 0x61 0x20 0x73 0x74 0x6F 0x72 // 's a stor' 0x79 0x2C 0x20 0x61 0x6E 0x64 0x20 0x73 // 'y, and s' 0x69 0x6E 0x63 0x65 0x20 0x41 0x75 0x67 // 'ince Aug' 0x75 0x73 0x74 0x69 0x6E 0x20 0x68 0x61 // 'ustin ha' 0x73 0x20 0x6C 0x6F 0x74 0x73 0x20 0x6F // 's lots o' 0x66 0x20 0x72 0x65 0x61 0x6C 0x6C 0x79 // 'f really' 0x20 0x6F 0x6C 0x64 0x20 0x73 0x63 0x61 // ' old sca' 0x72 0x79 0x20 0x73 0x74 0x6F 0x72 0x69 // 'ry stori' 0x65 0x73 0x20 0x74 0x6F 0x20 0x74 0x65 // 'es to te' 0x6C 0x6C 0x2C 0x20 0x68 0x65 0x92 0x64 // 'll, hed' 0x20 0x6C 0x6F 0x76 0x65 0x20 0x74 0x6F // ' love to' 0x20 0x73 0x74 0x61 0x72 0x20 0x61 0x73 // ' star as' 0x20 0x61 0x6E 0x20 0x6F 0x70 0x65 0x72 // ' an oper' 0x61 0x20 0x73 0x69 0x6E 0x67 0x65 0x72 // 'a singer' 0x20 0x69 0x6E 0x20 0x61 0x20 0x67 0x72 // ' in a gr' 0x61 0x76 0x65 0x79 0x61 0x72 0x64 0x2E // 'aveyard.' 0x20 0x20 0x48 0x65 0x20 0x63 0x6F 0x75 // ' He cou' 0x6C 0x64 0x20 0x6B 0x6E 0x65 0x65 0x6C // 'ld kneel' 0x20 0x62 0x65 0x68 0x69 0x6E 0x64 0x20 // ' behind ' 0x61 0x20 0x67 0x72 0x61 0x76 0x65 0x73 // 'a graves' 0x74 0x6F 0x6E 0x65 0x20 0x61 0x6E 0x64 // 'tone and' 0x20 0x73 0x69 0x6E 0x67 0x20 0x61 0x6E // ' sing an' 0x63 0x69 0x65 0x6E 0x74 0x20 0x6F 0x70 // 'cient op' 0x65 0x72 0x61 0x73 0x20 0x69 0x6E 0x20 // 'eras in ' 0x61 0x20 0x6C 0x6F 0x77 0x2C 0x20 0x63 // 'a low, c' 0x72 0x65 0x65 0x70 0x79 0x20 0x76 0x6F // 'reepy vo' 0x69 0x63 0x65 0x20 0x61 0x73 0x20 0x6B // 'ice as k' 0x69 0x64 0x73 0x20 0x77 0x61 0x6C 0x6B // 'ids walk' 0x65 0x64 0x20 0x74 0x68 0x72 0x6F 0x75 // 'ed throu' 0x67 0x68 0x20 0x74 0x68 0x65 0x20 0x67 // 'gh the g' 0x72 0x61 0x76 0x65 0x79 0x61 0x72 0x64 // 'raveyard' 0x20 0x61 0x74 0x20 0x6E 0x69 0x67 0x68 // ' at nigh' 0x74 0x2E 0x20 0x0D 0x0A 0x42 0x75 0x74 // 't. ??But' 0x20 0x6A 0x75 0x73 0x74 0x20 0x61 0x73 // ' just as' 0x20 0x68 0x65 0x20 0x67 0x65 0x74 0x73 // ' he gets' 0x20 0x73 0x74 0x61 0x72 0x74 0x65 0x64 // ' started' 0x20 0x73 0x69 0x6E 0x67 0x69 0x6E 0x67 // ' singing' 0x2C 0x20 0x68 0x65 0x20 0x68 0x65 0x61 // ', he hea' 0x72 0x73 0x20 0x61 0x20 0x76 0x6F 0x69 // 'rs a voi' 0x63 0x65 0x20 0x73 0x69 0x6E 0x67 0x69 // 'ce singi' 0x6E 0x67 0x20 0x62 0x61 0x63 0x6B 0x2E // 'ng back.' 0x20 0x20 0x54 0x68 0x65 0x20 0x73 0x6F // ' The so' 0x6E 0x67 0x20 0x73 0x65 0x65 0x6D 0x73 // 'ng seems' 0x20 0x74 0x6F 0x20 0x63 0x6F 0x6D 0x65 // ' to come' 0x20 0x66 0x72 0x6F 0x6D 0x20 0x61 0x20 // ' from a ' 0x6E 0x65 0x61 0x72 0x62 0x79 0x20 0x67 // 'nearby g' 0x72 0x61 0x76 0x65 0x2E 0x20 0x20 0x48 // 'rave. H' 0x65 0x20 0x73 0x69 0x6E 0x67 0x73 0x20 // 'e sings ' 0x61 0x6E 0x6F 0x74 0x68 0x65 0x72 0x20 // 'another ' 0x76 0x65 0x72 0x73 0x65 0x2C 0x20 0x61 // 'verse, a' 0x6E 0x64 0x20 0x74 0x68 0x65 0x20 0x76 // 'nd the v' 0x6F 0x69 0x63 0x65 0x20 0x73 0x69 0x6E // 'oice sin' 0x67 0x73 0x20 0x62 0x61 0x63 0x6B 0x20 // 'gs back ' 0x77 0x69 0x74 0x68 0x20 0x74 0x68 0x65 // 'with the' 0x20 0x6E 0x65 0x78 0x74 0x20 0x76 0x65 // ' next ve' 0x72 0x73 0x65 0x2E 0x20 0x0D 0x0A 0x49 // 'rse. ??I' 0x73 0x20 0x74 0x68 0x65 0x72 0x65 0x20 // 's there ' 0x61 0x6E 0x6F 0x74 0x68 0x65 0x72 0x20 // 'another ' 0x61 0x6E 0x63 0x69 0x65 0x6E 0x74 0x20 // 'ancient ' 0x70 0x65 0x72 0x73 0x6F 0x6E 0x20 0x74 // 'person t' 0x72 0x61 0x70 0x70 0x65 0x64 0x20 0x69 // 'rapped i' 0x6E 0x20 0x74 0x68 0x65 0x20 0x67 0x72 // 'n the gr' 0x61 0x76 0x65 0x79 0x61 0x72 0x64 0x3F // 'aveyard?' 0x20 0x57 0x68 0x6F 0x20 0x63 0x6F 0x75 // ' Who cou' 0x6C 0x64 0x20 0x69 0x74 0x20 0x62 0x65 // 'ld it be' 0x3F 0x20 0x49 0x66 0x20 0x41 0x75 0x67 // '? If Aug' 0x75 0x73 0x74 0x69 0x6E 0x20 0x73 0x68 // 'ustin sh' 0x72 0x69 0x6E 0x6B 0x73 0x20 0x74 0x6F // 'rinks to' 0x20 0x61 0x20 0x74 0x69 0x6E 0x79 0x20 // ' a tiny ' 0x73 0x69 0x7A 0x65 0x2C 0x20 0x63 0x61 // 'size, ca' 0x6E 0x20 0x68 0x65 0x20 0x66 0x69 0x6E // 'n he fin' 0x64 0x20 0x74 0x68 0x65 0x20 0x76 0x6F // 'd the vo' 0x69 0x63 0x65 0x20 0x61 0x6E 0x64 0x20 // 'ice and ' 0x72 0x65 0x6C 0x65 0x61 0x73 0x65 0x20 // 'release ' 0x69 0x74 0x3F // 'it?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_30= ktipbio7 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_30, __HELP_NAME("ktipbio7")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_30, __HELP_NAME("ktipbio7")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_34=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_30, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio7" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_34=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_30, 0x0) BYTE 0x01 0x00 0x03 0x03 0x14 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_34=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_34, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x12 0x03 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x7F 0x02 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_34=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_34, 0x0) BYTE 0x03 0x03 0x43 0x6F 0x70 0x0D 0x0A 0x41 // '??Cop??A' 0x75 0x67 0x75 0x73 0x74 0x69 0x6E 0x20 // 'ugustin ' 0x73 0x65 0x65 0x73 0x20 0x68 0x69 0x6D // 'sees him' 0x73 0x65 0x6C 0x66 0x20 0x70 0x6C 0x61 // 'self pla' 0x79 0x69 0x6E 0x67 0x20 0x74 0x68 0x65 // 'ying the' 0x20 0x53 0x75 0x70 0x65 0x72 0x20 0x53 // ' Super S' 0x68 0x72 0x69 0x6E 0x6B 0x69 0x6E 0x67 // 'hrinking' 0x20 0x43 0x6F 0x70 0x97 0x61 0x20 0x63 // ' Copa c' 0x6F 0x70 0x20 0x77 0x68 0x6F 0x20 0x63 // 'op who c' 0x61 0x6E 0x20 0x73 0x68 0x72 0x69 0x6E // 'an shrin' 0x6B 0x20 0x73 0x6F 0x20 0x73 0x6D 0x61 // 'k so sma' 0x6C 0x6C 0x20 0x74 0x68 0x61 0x74 0x20 // 'll that ' 0x68 0x65 0x20 0x63 0x61 0x6E 0x20 0x73 // 'he can s' 0x6E 0x65 0x61 0x6B 0x20 0x61 0x72 0x6F // 'neak aro' 0x75 0x6E 0x64 0x20 0x61 0x6E 0x79 0x77 // 'und anyw' 0x68 0x65 0x72 0x65 0x2C 0x20 0x65 0x76 // 'here, ev' 0x65 0x6E 0x20 0x68 0x69 0x64 0x65 0x20 // 'en hide ' 0x6F 0x6E 0x20 0x74 0x68 0x65 0x20 0x73 // 'on the s' 0x68 0x6F 0x75 0x6C 0x64 0x65 0x72 0x73 // 'houlders' 0x20 0x6F 0x66 0x20 0x63 0x72 0x69 0x6D // ' of crim' 0x69 0x6E 0x61 0x6C 0x73 0x20 0x74 0x6F // 'inals to' 0x20 0x6F 0x76 0x65 0x72 0x68 0x65 0x61 // ' overhea' 0x72 0x20 0x74 0x68 0x65 0x69 0x72 0x20 // 'r their ' 0x70 0x6C 0x61 0x6E 0x73 0x2E 0x20 0x20 // 'plans. ' 0x57 0x68 0x65 0x6E 0x20 0x41 0x75 0x67 // 'When Aug' 0x75 0x73 0x74 0x69 0x6E 0x20 0x67 0x65 // 'ustin ge' 0x74 0x73 0x20 0x74 0x68 0x65 0x20 0x64 // 'ts the d' 0x65 0x74 0x61 0x69 0x6C 0x73 0x20 0x6F // 'etails o' 0x66 0x20 0x74 0x68 0x65 0x20 0x70 0x6C // 'f the pl' 0x61 0x6E 0x97 0x70 0x6F 0x6F 0x66 0x21 // 'anpoof!' 0x97 0x68 0x65 0x20 0x67 0x72 0x6F 0x77 // 'he grow' 0x73 0x20 0x71 0x75 0x69 0x63 0x6B 0x6C // 's quickl' 0x79 0x20 0x74 0x6F 0x20 0x6E 0x6F 0x72 // 'y to nor' 0x6D 0x61 0x6C 0x20 0x73 0x69 0x7A 0x65 // 'mal size' 0x20 0x61 0x6E 0x64 0x20 0x73 0x74 0x6F // ' and sto' 0x70 0x73 0x20 0x74 0x68 0x65 0x20 0x63 // 'ps the c' 0x72 0x69 0x6D 0x69 0x6E 0x61 0x6C 0x73 // 'riminals' 0x20 0x69 0x6E 0x20 0x74 0x68 0x65 0x69 // ' in thei' 0x72 0x20 0x74 0x72 0x61 0x63 0x6B 0x73 // 'r tracks' 0x2E 0x20 0x0D 0x0A 0x42 0x75 0x74 0x20 // '. ??But ' 0x6F 0x6E 0x65 0x20 0x64 0x61 0x79 0x2C // 'one day,' 0x20 0x77 0x68 0x65 0x6E 0x20 0x41 0x75 // ' when Au' 0x67 0x75 0x73 0x74 0x69 0x6E 0x20 0x69 // 'gustin i' 0x73 0x20 0x68 0x61 0x6E 0x67 0x69 0x6E // 's hangin' 0x67 0x20 0x6F 0x75 0x74 0x20 0x73 0x70 // 'g out sp' 0x79 0x69 0x6E 0x67 0x20 0x6F 0x6E 0x20 // 'ying on ' 0x63 0x72 0x69 0x6D 0x69 0x6E 0x61 0x6C // 'criminal' 0x73 0x2C 0x20 0x68 0x65 0x20 0x73 0x74 // 's, he st' 0x61 0x72 0x74 0x73 0x20 0x6C 0x61 0x75 // 'arts lau' 0x67 0x68 0x69 0x6E 0x67 0x20 0x61 0x6E // 'ghing an' 0x64 0x20 0x63 0x61 0x6E 0x92 0x74 0x20 // 'd cant ' 0x73 0x74 0x6F 0x70 0x2E 0x20 0x20 0x48 // 'stop. H' 0x69 0x73 0x20 0x76 0x6F 0x69 0x63 0x65 // 'is voice' 0x20 0x69 0x73 0x20 0x73 0x6D 0x61 0x6C // ' is smal' 0x6C 0x2C 0x20 0x62 0x75 0x74 0x20 0x74 // 'l, but t' 0x68 0x65 0x20 0x63 0x72 0x69 0x6D 0x69 // 'he crimi' 0x6E 0x61 0x6C 0x73 0x20 0x68 0x65 0x61 // 'nals hea' 0x72 0x20 0x69 0x74 0x20 0x61 0x6E 0x64 // 'r it and' 0x20 0x73 0x74 0x61 0x72 0x74 0x20 0x6C // ' start l' 0x6F 0x6F 0x6B 0x69 0x6E 0x67 0x20 0x66 // 'ooking f' 0x6F 0x72 0x20 0x74 0x68 0x65 0x20 0x73 // 'or the s' 0x6F 0x75 0x6E 0x64 0x2E 0x20 0x20 0x41 // 'ound. A' 0x75 0x67 0x75 0x73 0x74 0x69 0x6E 0x20 // 'ugustin ' 0x66 0x61 0x6C 0x6C 0x73 0x20 0x66 0x72 // 'falls fr' 0x6F 0x6D 0x20 0x68 0x69 0x73 0x20 0x68 // 'om his h' 0x69 0x64 0x69 0x6E 0x67 0x20 0x70 0x6C // 'iding pl' 0x61 0x63 0x65 0x20 0x6F 0x6E 0x74 0x6F // 'ace onto' 0x20 0x74 0x68 0x65 0x20 0x66 0x6C 0x6F // ' the flo' 0x6F 0x72 0x2E 0x20 0x20 0x41 0x20 0x63 // 'or. A c' 0x72 0x69 0x6D 0x69 0x6E 0x61 0x6C 0x20 // 'riminal ' 0x77 0x69 0x74 0x68 0x20 0x68 0x75 0x67 // 'with hug' 0x65 0x20 0x66 0x65 0x65 0x74 0x20 0x77 // 'e feet w' 0x61 0x6C 0x6B 0x73 0x20 0x73 0x6C 0x6F // 'alks slo' 0x77 0x6C 0x79 0x20 0x74 0x6F 0x77 0x61 // 'wly towa' 0x72 0x64 0x20 0x41 0x75 0x67 0x75 0x73 // 'rd Augus' 0x74 0x69 0x6E 0x2C 0x20 0x61 0x6E 0x64 // 'tin, and' 0x20 0x69 0x73 0x20 0x6A 0x75 0x73 0x74 // ' is just' 0x20 0x61 0x62 0x6F 0x75 0x74 0x20 0x74 // ' about t' 0x6F 0x20 0x73 0x74 0x65 0x70 0x20 0x6F // 'o step o' 0x6E 0x20 0x68 0x69 0x6D 0x2E 0x20 0x0D // 'n him. ?' 0x0A 0x48 0x6F 0x77 0x20 0x77 0x69 0x6C // '?How wil' 0x6C 0x20 0x41 0x75 0x67 0x75 0x73 0x74 // 'l August' 0x69 0x6E 0x20 0x67 0x65 0x74 0x20 0x6F // 'in get o' 0x75 0x74 0x20 0x6F 0x66 0x20 0x74 0x68 // 'ut of th' 0x69 0x73 0x20 0x66 0x69 0x78 0x20 0x77 // 'is fix w' 0x69 0x74 0x68 0x6F 0x75 0x74 0x20 0x62 // 'ithout b' 0x65 0x69 0x6E 0x67 0x20 0x66 0x6F 0x75 // 'eing fou' 0x6E 0x64 0x20 0x6F 0x75 0x74 0x3F 0x20 // 'nd out? ' 0x20 0x49 0x66 0x20 0x68 0x65 0x20 0x73 // ' If he s' 0x75 0x64 0x64 0x65 0x6E 0x6C 0x79 0x20 // 'uddenly ' 0x67 0x72 0x6F 0x77 0x73 0x20 0x62 0x61 // 'grows ba' 0x63 0x6B 0x20 0x74 0x6F 0x20 0x6E 0x6F // 'ck to no' 0x72 0x6D 0x61 0x6C 0x20 0x73 0x69 0x7A // 'rmal siz' 0x65 0x2C 0x20 0x68 0x65 0x92 0x6C 0x6C // 'e, hell' 0x20 0x62 0x6C 0x6F 0x77 0x20 0x68 0x69 // ' blow hi' 0x73 0x20 0x64 0x69 0x73 0x67 0x75 0x69 // 's disgui' 0x73 0x65 0x2E 0x20 0x57 0x68 0x61 0x74 // 'se. What' 0x20 0x57 0x49 0x4C 0x4C 0x20 0x68 0x65 // ' WILL he' 0x20 0x64 0x6F 0x3F // ' do?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_31= ktipbio8 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_31, __HELP_NAME("ktipbio8")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_31, __HELP_NAME("ktipbio8")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_82=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_31, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio8" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_82=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_31, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_82=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_82, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x28 0x02 0x00 0x01 // '????(???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x92 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_82=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_82, 0x0) BYTE 0x03 0x03 0x48 0x6F 0x6D 0x65 0x20 0x53 // '??Home S' 0x61 0x66 0x65 0x74 0x79 0x20 0x49 0x6E // 'afety In' 0x73 0x70 0x65 0x63 0x74 0x6F 0x72 0x0D // 'spector?' 0x0A 0x41 0x75 0x67 0x75 0x73 0x74 0x69 // '?Augusti' 0x6E 0x20 0x64 0x72 0x65 0x61 0x6D 0x73 // 'n dreams' 0x20 0x6F 0x66 0x20 0x61 0x20 0x72 0x6F // ' of a ro' 0x6C 0x65 0x20 0x69 0x6E 0x20 0x77 0x68 // 'le in wh' 0x69 0x63 0x68 0x20 0x68 0x65 0x20 0x69 // 'ich he i' 0x73 0x20 0x64 0x69 0x73 0x67 0x75 0x69 // 's disgui' 0x73 0x65 0x64 0x20 0x61 0x73 0x20 0x73 // 'sed as s' 0x6F 0x6D 0x65 0x6F 0x6E 0x65 0x20 0x77 // 'omeone w' 0x68 0x6F 0x20 0x69 0x6E 0x73 0x70 0x65 // 'ho inspe' 0x63 0x74 0x73 0x20 0x68 0x6F 0x6D 0x65 // 'cts home' 0x73 0x20 0x66 0x6F 0x72 0x20 0x73 0x61 // 's for sa' 0x66 0x65 0x74 0x79 0x20 0x76 0x69 0x6F // 'fety vio' 0x6C 0x61 0x74 0x69 0x6F 0x6E 0x73 0x2E // 'lations.' 0x20 0x20 0x48 0x65 0x27 0x64 0x20 0x67 // ' He'd g' 0x65 0x74 0x20 0x74 0x6F 0x20 0x69 0x6E // 'et to in' 0x73 0x70 0x65 0x63 0x74 0x20 0x61 0x6C // 'spect al' 0x6C 0x20 0x6B 0x69 0x6E 0x64 0x73 0x20 // 'l kinds ' 0x6F 0x66 0x20 0x70 0x6C 0x61 0x63 0x65 // 'of place' 0x73 0x2C 0x20 0x66 0x72 0x6F 0x6D 0x20 // 's, from ' 0x73 0x6D 0x61 0x6C 0x6C 0x20 0x68 0x75 // 'small hu' 0x74 0x73 0x20 0x74 0x6F 0x20 0x62 0x69 // 'ts to bi' 0x67 0x2C 0x20 0x63 0x72 0x65 0x65 0x70 // 'g, creep' 0x79 0x20 0x68 0x6F 0x75 0x73 0x65 0x73 // 'y houses' 0x2E 0x20 0x20 0x42 0x75 0x74 0x20 0x68 // '. But h' 0x69 0x73 0x20 0x72 0x6F 0x6C 0x65 0x20 // 'is role ' 0x61 0x73 0x20 0x69 0x6E 0x73 0x70 0x65 // 'as inspe' 0x63 0x74 0x6F 0x72 0x20 0x70 0x72 0x6F // 'ctor pro' 0x76 0x69 0x64 0x65 0x73 0x20 0x68 0x69 // 'vides hi' 0x6D 0x20 0x77 0x69 0x74 0x68 0x20 0x61 // 'm with a' 0x20 0x64 0x69 0x73 0x67 0x75 0x69 0x73 // ' disguis' 0x65 0x20 0x66 0x6F 0x72 0x20 0x68 0x69 // 'e for hi' 0x73 0x20 0x72 0x65 0x61 0x6C 0x20 0x6D // 's real m' 0x69 0x73 0x73 0x69 0x6F 0x6E 0x2C 0x20 // 'ission, ' 0x74 0x6F 0x20 0x66 0x69 0x6E 0x64 0x20 // 'to find ' 0x61 0x20 0x6C 0x6F 0x73 0x74 0x20 0x63 // 'a lost c' 0x61 0x74 0x2E 0x20 0x20 0x4E 0x6F 0x74 // 'at. Not' 0x20 0x6A 0x75 0x73 0x74 0x20 0x61 0x6E // ' just an' 0x79 0x20 0x6C 0x6F 0x73 0x74 0x20 0x63 // 'y lost c' 0x61 0x74 0x2C 0x20 0x62 0x75 0x74 0x20 // 'at, but ' 0x74 0x68 0x65 0x20 0x72 0x69 0x63 0x68 // 'the rich' 0x20 0x63 0x61 0x74 0x20 0x77 0x68 0x6F // ' cat who' 0x20 0x73 0x74 0x61 0x72 0x74 0x65 0x64 // ' started' 0x20 0x61 0x20 0x66 0x61 0x6D 0x6F 0x75 // ' a famou' 0x73 0x20 0x63 0x68 0x61 0x69 0x6E 0x20 // 's chain ' 0x6F 0x66 0x20 0x6B 0x69 0x74 0x74 0x79 // 'of kitty' 0x20 0x66 0x61 0x73 0x74 0x20 0x66 0x6F // ' fast fo' 0x6F 0x64 0x20 0x63 0x61 0x66 0xE9 0x73 // 'od cafs' 0x2E 0x20 0x0D 0x0A 0x48 0x6F 0x77 0x20 // '. ??How ' 0x77 0x69 0x6C 0x6C 0x20 0x41 0x75 0x67 // 'will Aug' 0x75 0x73 0x74 0x69 0x6E 0x20 0x66 0x69 // 'ustin fi' 0x6E 0x64 0x20 0x74 0x68 0x65 0x20 0x6C // 'nd the l' 0x6F 0x73 0x74 0x20 0x63 0x61 0x74 0x3F // 'ost cat?' 0x20 0x20 0x41 0x6E 0x64 0x20 0x77 0x69 // ' And wi' 0x6C 0x6C 0x20 0x69 0x6E 0x73 0x70 0x65 // 'll inspe' 0x63 0x74 0x69 0x6E 0x67 0x20 0x68 0x6F // 'cting ho' 0x6D 0x65 0x73 0x20 0x67 0x69 0x76 0x65 // 'mes give' 0x20 0x41 0x75 0x67 0x75 0x73 0x74 0x69 // ' Augusti' 0x6E 0x20 0x61 0x20 0x63 0x68 0x61 0x6E // 'n a chan' 0x63 0x65 0x20 0x74 0x6F 0x20 0x66 0x75 // 'ce to fu' 0x6C 0x66 0x69 0x6C 0x6C 0x20 0x61 0x6E // 'lfill an' 0x6F 0x74 0x68 0x65 0x72 0x20 0x64 0x72 // 'other dr' 0x65 0x61 0x6D 0x97 0x68 0x69 0x73 0x20 // 'eamhis ' 0x64 0x65 0x73 0x69 0x72 0x65 0x20 0x74 // 'desire t' 0x6F 0x20 0x62 0x65 0x20 0x61 0x6E 0x20 // 'o be an ' 0x69 0x6E 0x74 0x65 0x72 0x69 0x6F 0x72 // 'interior' 0x20 0x64 0x65 0x73 0x69 0x67 0x6E 0x65 // ' designe' 0x72 0x3F // 'r?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_32= ktipbio9 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_32, __HELP_NAME("ktipbio9")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_32, __HELP_NAME("ktipbio9")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_31=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_32, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio9" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_31=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_32, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_31=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_31, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x3E 0x02 0x00 0x01 // '????>???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x9E 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_31=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_31, 0x0) BYTE 0x03 0x03 0x63 0x6F 0x6D 0x65 0x64 0x79 // '??comedy' 0x0D 0x0A 0x42 0x65 0x6C 0x6C 0x61 0x27 // '??Bella'' 0x73 0x20 0x61 0x63 0x74 0x20 0x69 0x73 // 's act is' 0x20 0x61 0x74 0x20 0x61 0x20 0x4D 0x65 // ' at a Me' 0x78 0x69 0x63 0x61 0x6E 0x20 0x72 0x65 // 'xican re' 0x73 0x74 0x61 0x75 0x72 0x61 0x6E 0x74 // 'staurant' 0x20 0x62 0x65 0x63 0x61 0x75 0x73 0x65 // ' because' 0x20 0x6E 0x6F 0x20 0x6F 0x6E 0x65 0x20 // ' no one ' 0x65 0x6C 0x73 0x65 0x20 0x77 0x6F 0x75 // 'else wou' 0x6C 0x64 0x20 0x68 0x69 0x72 0x65 0x20 // 'ld hire ' 0x61 0x20 0x74 0x65 0x61 0x63 0x68 0x65 // 'a teache' 0x72 0x20 0x77 0x68 0x6F 0x20 0x74 0x68 // 'r who th' 0x6F 0x75 0x67 0x68 0x74 0x20 0x73 0x68 // 'ought sh' 0x65 0x20 0x77 0x61 0x73 0x20 0x61 0x6C // 'e was al' 0x73 0x6F 0x20 0x61 0x20 0x63 0x6F 0x6D // 'so a com' 0x65 0x64 0x69 0x61 0x6E 0x2E 0x20 0x20 // 'edian. ' 0x41 0x74 0x20 0x66 0x69 0x72 0x73 0x74 // 'At first' 0x20 0x73 0x68 0x65 0x20 0x77 0x61 0x73 // ' she was' 0x20 0x73 0x63 0x61 0x72 0x65 0x64 0x20 // ' scared ' 0x6F 0x6E 0x20 0x73 0x74 0x61 0x67 0x65 // 'on stage' 0x2E 0x20 0x20 0x54 0x68 0x65 0x6E 0x20 // '. Then ' 0x73 0x68 0x65 0x20 0x66 0x69 0x67 0x75 // 'she figu' 0x72 0x65 0x64 0x20 0x73 0x68 0x65 0x20 // 'red she ' 0x68 0x61 0x64 0x20 0x6E 0x6F 0x74 0x68 // 'had noth' 0x69 0x6E 0x67 0x20 0x74 0x6F 0x20 0x6C // 'ing to l' 0x6F 0x73 0x65 0x20 0x61 0x6E 0x64 0x20 // 'ose and ' 0x72 0x65 0x61 0x6C 0x6C 0x79 0x20 0x63 // 'really c' 0x75 0x74 0x20 0x6C 0x6F 0x6F 0x73 0x65 // 'ut loose' 0x20 0x77 0x69 0x74 0x68 0x20 0x74 0x68 // ' with th' 0x65 0x20 0x6A 0x6F 0x6B 0x65 0x73 0x2E // 'e jokes.' 0x20 0x20 0x53 0x68 0x65 0x20 0x73 0x61 // ' She sa' 0x69 0x64 0x20 0x61 0x6C 0x6C 0x20 0x74 // 'id all t' 0x68 0x65 0x20 0x74 0x68 0x69 0x6E 0x67 // 'he thing' 0x73 0x20 0x73 0x68 0x65 0x92 0x64 0x20 // 's shed ' 0x6E 0x65 0x76 0x65 0x72 0x20 0x73 0x61 // 'never sa' 0x69 0x64 0x20 0x62 0x65 0x66 0x6F 0x72 // 'id befor' 0x65 0x2C 0x20 0x61 0x6E 0x64 0x20 0x69 // 'e, and i' 0x6E 0x20 0x61 0x20 0x66 0x75 0x6E 0x6E // 'n a funn' 0x79 0x20 0x77 0x61 0x79 0x2E 0x20 0x20 // 'y way. ' 0x41 0x74 0x20 0x74 0x68 0x65 0x20 0x65 // 'At the e' 0x6E 0x64 0x20 0x6F 0x66 0x20 0x68 0x65 // 'nd of he' 0x72 0x20 0x61 0x63 0x74 0x2C 0x20 0x42 // 'r act, B' 0x65 0x6C 0x6C 0x61 0x20 0x6C 0x61 0x75 // 'ella lau' 0x67 0x68 0x73 0x20 0x62 0x6F 0x6C 0x64 // 'ghs bold' 0x6C 0x79 0x20 0x61 0x6E 0x64 0x20 0x73 // 'ly and s' 0x61 0x79 0x73 0x2C 0x20 0x93 0x54 0x68 // 'ays, Th' 0x61 0x6E 0x6B 0x20 0x79 0x6F 0x75 0x20 // 'ank you ' 0x61 0x6C 0x6C 0x20 0x76 0x65 0x72 0x79 // 'all very' 0x2C 0x20 0x76 0x65 0x72 0x79 0x20 0x6D // ', very m' 0x75 0x63 0x68 0x21 0x22 0x20 0x50 0x65 // 'uch!" Pe' 0x6F 0x70 0x6C 0x65 0x20 0x6C 0x6F 0x76 // 'ople lov' 0x65 0x20 0x68 0x65 0x72 0x2E 0x0D 0x0A // 'e her.??' 0x4D 0x65 0x6C 0x61 0x6E 0x69 0x65 0x2C // 'Melanie,' 0x20 0x6F 0x6E 0x65 0x20 0x6F 0x66 0x20 // ' one of ' 0x4D 0x63 0x5A 0x65 0x65 0x92 0x73 0x20 // 'McZees ' 0x6D 0x6F 0x76 0x69 0x65 0x20 0x64 0x69 // 'movie di' 0x72 0x65 0x63 0x74 0x6F 0x72 0x73 0x2C // 'rectors,' 0x20 0x73 0x61 0x77 0x20 0x68 0x65 0x72 // ' saw her' 0x20 0x61 0x63 0x74 0x20 0x61 0x6E 0x64 // ' act and' 0x20 0x61 0x73 0x6B 0x65 0x64 0x20 0x42 // ' asked B' 0x65 0x6C 0x6C 0x61 0x20 0x74 0x6F 0x20 // 'ella to ' 0x73 0x74 0x61 0x72 0x20 0x69 0x6E 0x20 // 'star in ' 0x61 0x20 0x4D 0x63 0x5A 0x65 0x65 0x20 // 'a McZee ' 0x63 0x6F 0x6D 0x65 0x64 0x79 0x2E 0x20 // 'comedy. ' 0x4E 0x6F 0x77 0x20 0x42 0x65 0x6C 0x6C // 'Now Bell' 0x61 0x20 0x77 0x69 0x6C 0x6C 0x20 0x68 // 'a will h' 0x61 0x76 0x65 0x20 0x74 0x6F 0x20 0x74 // 'ave to t' 0x65 0x6C 0x6C 0x20 0x68 0x65 0x72 0x20 // 'ell her ' 0x70 0x61 0x72 0x65 0x6E 0x74 0x73 0x20 // 'parents ' 0x61 0x62 0x6F 0x75 0x74 0x20 0x68 0x65 // 'about he' 0x72 0x20 0x73 0x65 0x63 0x72 0x65 0x74 // 'r secret' 0x20 0x63 0x61 0x72 0x65 0x65 0x72 0x2E // ' career.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_33= ktipbio10 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_33, __HELP_NAME("ktipbio10")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_33, __HELP_NAME("ktipbio10")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_0=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_33, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio10" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_0=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_33, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_0=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x08 0x02 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x6D 0x01 0x00 0x82 // '????m??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_0=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) BYTE 0x03 0x03 0x4D 0x61 0x64 0x61 0x6D 0x65 // '??Madame' 0x20 0x53 0x70 0x6F 0x6F 0x6B 0x79 0x0D // ' Spooky?' 0x0A 0x57 0x69 0x74 0x68 0x20 0x68 0x65 // '?With he' 0x72 0x20 0x77 0x69 0x74 0x63 0x68 0x20 // 'r witch ' 0x6C 0x61 0x75 0x67 0x68 0x2C 0x20 0x42 // 'laugh, B' 0x65 0x6C 0x6C 0x61 0x20 0x77 0x6F 0x75 // 'ella wou' 0x6C 0x64 0x20 0x6D 0x61 0x6B 0x65 0x20 // 'ld make ' 0x61 0x20 0x66 0x69 0x6E 0x65 0x20 0x68 // 'a fine h' 0x6F 0x73 0x74 0x65 0x73 0x73 0x20 0x69 // 'ostess i' 0x6E 0x20 0x61 0x20 0x73 0x63 0x61 0x72 // 'n a scar' 0x79 0x20 0x6D 0x6F 0x76 0x69 0x65 0x2E // 'y movie.' 0x20 0x20 0x53 0x68 0x65 0x20 0x63 0x61 // ' She ca' 0x6E 0x20 0x73 0x65 0x65 0x20 0x69 0x74 // 'n see it' 0x20 0x61 0x6C 0x6C 0x20 0x6E 0x6F 0x77 // ' all now' 0x97 0x73 0x68 0x65 0x20 0x77 0x6F 0x75 // 'she wou' 0x6C 0x64 0x20 0x68 0x61 0x76 0x65 0x20 // 'ld have ' 0x66 0x61 0x6E 0x67 0x73 0x20 0x61 0x6E // 'fangs an' 0x64 0x20 0x67 0x72 0x65 0x65 0x74 0x20 // 'd greet ' 0x65 0x61 0x63 0x68 0x20 0x6B 0x69 0x64 // 'each kid' 0x20 0x61 0x74 0x20 0x74 0x68 0x65 0x20 // ' at the ' 0x64 0x6F 0x6F 0x72 0x20 0x77 0x69 0x74 // 'door wit' 0x68 0x20 0x68 0x65 0x72 0x20 0x73 0x70 // 'h her sp' 0x6F 0x6F 0x6B 0x79 0x20 0x6C 0x61 0x75 // 'ooky lau' 0x67 0x68 0x2E 0x20 0x20 0x54 0x65 0x6C // 'gh. Tel' 0x6C 0x69 0x6E 0x67 0x20 0x61 0x77 0x66 // 'ling awf' 0x75 0x6C 0x20 0x6A 0x6F 0x6B 0x65 0x73 // 'ul jokes' 0x2C 0x20 0x73 0x68 0x65 0x20 0x77 0x6F // ', she wo' 0x75 0x6C 0x64 0x20 0x6C 0x65 0x61 0x64 // 'uld lead' 0x20 0x74 0x68 0x65 0x20 0x6B 0x69 0x64 // ' the kid' 0x73 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 // 's to the' 0x20 0x6B 0x69 0x74 0x63 0x68 0x65 0x6E // ' kitchen' 0x20 0x66 0x6F 0x72 0x20 0x61 0x20 0x63 // ' for a c' 0x75 0x70 0x20 0x6F 0x66 0x20 0x68 0x65 // 'up of he' 0x72 0x20 0x68 0x6F 0x74 0x2C 0x20 0x73 // 'r hot, s' 0x75 0x67 0x61 0x72 0x79 0x2C 0x20 0x6C // 'ugary, l' 0x65 0x6D 0x6F 0x6E 0x61 0x64 0x65 0x2E // 'emonade.' 0x20 0x20 0x54 0x68 0x65 0x6E 0x20 0x61 // ' Then a' 0x20 0x72 0x61 0x74 0x20 0x77 0x6F 0x75 // ' rat wou' 0x6C 0x64 0x20 0x64 0x72 0x6F 0x70 0x20 // 'ld drop ' 0x64 0x6F 0x77 0x6E 0x20 0x66 0x72 0x6F // 'down fro' 0x6D 0x20 0x61 0x62 0x6F 0x76 0x65 0x2C // 'm above,' 0x20 0x72 0x69 0x67 0x68 0x74 0x20 0x69 // ' right i' 0x6E 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 // 'nto the ' 0x68 0x6F 0x74 0x20 0x70 0x6F 0x74 0x20 // 'hot pot ' 0x6F 0x66 0x20 0x6C 0x65 0x6D 0x6F 0x6E // 'of lemon' 0x61 0x64 0x65 0x2E 0x20 0x0D 0x0A 0x42 // 'ade. ??B' 0x75 0x74 0x20 0x68 0x6F 0x77 0x20 0x77 // 'ut how w' 0x6F 0x75 0x6C 0x64 0x20 0x73 0x68 0x65 // 'ould she' 0x20 0x67 0x65 0x74 0x20 0x74 0x68 0x65 // ' get the' 0x20 0x72 0x61 0x74 0x20 0x6F 0x75 0x74 // ' rat out' 0x20 0x6F 0x66 0x20 0x74 0x68 0x65 0x20 // ' of the ' 0x70 0x6F 0x74 0x3F 0x20 0x20 0x57 0x6F // 'pot? Wo' 0x75 0x6C 0x64 0x20 0x74 0x68 0x65 0x79 // 'uld they' 0x20 0x6E 0x65 0x65 0x64 0x20 0x74 0x6F // ' need to' 0x20 0x68 0x61 0x76 0x65 0x20 0x61 0x20 // ' have a ' 0x63 0x65 0x72 0x65 0x6D 0x6F 0x6E 0x79 // 'ceremony' 0x20 0x6F 0x66 0x20 0x64 0x61 0x6E 0x63 // ' of danc' 0x65 0x73 0x20 0x61 0x6E 0x64 0x20 0x73 // 'es and s' 0x6F 0x6E 0x67 0x73 0x20 0x61 0x6E 0x64 // 'ongs and' 0x20 0x68 0x61 0x76 0x65 0x20 0x56 0x61 // ' have Va' 0x6C 0x65 0x6E 0x74 0x69 0x6E 0x65 0x20 // 'lentine ' 0x74 0x68 0x65 0x20 0x76 0x6F 0x6F 0x64 // 'the vood' 0x6F 0x6F 0x20 0x6D 0x61 0x6E 0x20 0x70 // 'oo man p' 0x65 0x72 0x66 0x6F 0x72 0x6D 0x20 0x74 // 'erform t' 0x68 0x65 0x20 0x72 0x69 0x74 0x75 0x61 // 'he ritua' 0x6C 0x3F // 'l?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_34= ktipbio11 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_34, __HELP_NAME("ktipbio11")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_34, __HELP_NAME("ktipbio11")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_38=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_34, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio11" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_38=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_34, 0x0) BYTE 0x01 0x00 0x03 0x03 0xEB 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_38=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_38, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xCD 0x02 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x24 0x01 0x00 0x82 // '????$??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_38=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_38, 0x0) BYTE 0x03 0x03 0x53 0x74 0x72 0x65 0x65 0x74 // '??Street' 0x20 0x46 0x61 0x69 0x72 0x20 0x45 0x6E // ' Fair En' 0x74 0x65 0x72 0x74 0x61 0x69 0x6E 0x65 // 'tertaine' 0x72 0x0D 0x0A 0x4A 0x75 0x73 0x74 0x20 // 'r??Just ' 0x66 0x6F 0x72 0x20 0x66 0x75 0x6E 0x2C // 'for fun,' 0x20 0x42 0x65 0x6C 0x6C 0x61 0x20 0x77 // ' Bella w' 0x6F 0x75 0x6C 0x64 0x20 0x6C 0x69 0x6B // 'ould lik' 0x65 0x20 0x74 0x6F 0x20 0x73 0x74 0x61 // 'e to sta' 0x72 0x20 0x61 0x73 0x20 0x61 0x20 0x73 // 'r as a s' 0x74 0x72 0x65 0x65 0x74 0x20 0x66 0x61 // 'treet fa' 0x69 0x72 0x20 0x65 0x6E 0x74 0x65 0x72 // 'ir enter' 0x74 0x61 0x69 0x6E 0x65 0x72 0x2E 0x20 // 'tainer. ' 0x20 0x53 0x68 0x65 0x27 0x64 0x20 0x68 // ' She'd h' 0x61 0x76 0x65 0x20 0x68 0x65 0x72 0x20 // 'ave her ' 0x6F 0x77 0x6E 0x20 0x73 0x70 0x6F 0x74 // 'own spot' 0x20 0x75 0x6E 0x64 0x65 0x72 0x20 0x74 // ' under t' 0x68 0x65 0x20 0x62 0x69 0x67 0x20 0x63 // 'he big c' 0x6C 0x6F 0x63 0x6B 0x20 0x61 0x74 0x20 // 'lock at ' 0x74 0x68 0x65 0x20 0x69 0x6E 0x74 0x65 // 'the inte' 0x72 0x73 0x65 0x63 0x74 0x69 0x6F 0x6E // 'rsection' 0x2E 0x20 0x20 0x53 0x68 0x65 0x20 0x63 // '. She c' 0x6F 0x75 0x6C 0x64 0x20 0x70 0x6F 0x6B // 'ould pok' 0x65 0x20 0x66 0x75 0x6E 0x20 0x61 0x74 // 'e fun at' 0x20 0x74 0x68 0x65 0x20 0x70 0x65 0x6F // ' the peo' 0x70 0x6C 0x65 0x20 0x73 0x68 0x65 0x20 // 'ple she ' 0x73 0x65 0x65 0x73 0x20 0x70 0x61 0x73 // 'sees pas' 0x73 0x69 0x6E 0x67 0x20 0x62 0x79 0x20 // 'sing by ' 0x61 0x6E 0x64 0x20 0x6D 0x61 0x6B 0x65 // 'and make' 0x20 0x65 0x76 0x65 0x72 0x79 0x6F 0x6E // ' everyon' 0x65 0x20 0x73 0x6D 0x69 0x6C 0x65 0x2C // 'e smile,' 0x20 0x65 0x76 0x65 0x6E 0x20 0x70 0x65 // ' even pe' 0x6F 0x70 0x6C 0x65 0x20 0x77 0x68 0x6F // 'ople who' 0x20 0x61 0x72 0x65 0x20 0x61 0x6E 0x67 // ' are ang' 0x72 0x79 0x20 0x6F 0x72 0x20 0x74 0x6F // 'ry or to' 0x6F 0x20 0x62 0x75 0x73 0x79 0x20 0x74 // 'o busy t' 0x6F 0x20 0x62 0x65 0x20 0x68 0x61 0x70 // 'o be hap' 0x70 0x79 0x2E 0x20 0x0D 0x0A 0x42 0x75 // 'py. ??Bu' 0x74 0x20 0x42 0x65 0x6C 0x6C 0x61 0x20 // 't Bella ' 0x77 0x6F 0x75 0x6C 0x64 0x20 0x61 0x6C // 'would al' 0x73 0x6F 0x20 0x68 0x61 0x76 0x65 0x20 // 'so have ' 0x73 0x70 0x65 0x63 0x69 0x61 0x6C 0x20 // 'special ' 0x70 0x6F 0x77 0x65 0x72 0x73 0x97 0x73 // 'powerss' 0x6F 0x6D 0x65 0x74 0x69 0x6D 0x65 0x73 // 'ometimes' 0x20 0x73 0x68 0x65 0x20 0x77 0x6F 0x75 // ' she wou' 0x6C 0x64 0x20 0x73 0x65 0x65 0x20 0x70 // 'ld see p' 0x65 0x6F 0x70 0x6C 0x65 0x20 0x63 0x6F // 'eople co' 0x6D 0x69 0x6E 0x67 0x20 0x6F 0x75 0x74 // 'ming out' 0x20 0x6F 0x66 0x20 0x61 0x20 0x72 0x65 // ' of a re' 0x73 0x74 0x61 0x75 0x72 0x61 0x6E 0x74 // 'staurant' 0x20 0x61 0x66 0x74 0x65 0x72 0x20 0x65 // ' after e' 0x61 0x74 0x69 0x6E 0x67 0x20 0x74 0x6F // 'ating to' 0x6F 0x20 0x6D 0x75 0x63 0x68 0x20 0x61 // 'o much a' 0x6E 0x64 0x20 0x74 0x68 0x69 0x6E 0x6B // 'nd think' 0x69 0x6E 0x67 0x2C 0x20 0x93 0x74 0x68 // 'ing, th' 0x65 0x72 0x65 0x20 0x69 0x73 0x20 0x6E // 'ere is n' 0x6F 0x20 0x77 0x61 0x79 0x20 0x49 0x20 // 'o way I ' 0x63 0x61 0x6E 0x20 0x77 0x61 0x6C 0x6B // 'can walk' 0x20 0x62 0x61 0x63 0x6B 0x20 0x68 0x6F // ' back ho' 0x6D 0x65 0x2E 0x2E 0x2E 0x49 0x20 0x77 // 'me...I w' 0x69 0x73 0x68 0x20 0x49 0x20 0x63 0x6F // 'ish I co' 0x75 0x6C 0x64 0x20 0x6A 0x75 0x73 0x74 // 'uld just' 0x20 0x67 0x65 0x74 0x20 0x61 0x20 0x63 // ' get a c' 0x61 0x62 0x20 0x61 0x6E 0x64 0x20 0x67 // 'ab and g' 0x65 0x74 0x20 0x68 0x6F 0x6D 0x65 0x2E // 'et home.' 0x2E 0x2E 0x94 0x20 0x20 0x54 0x68 0x65 // '.. The' 0x69 0x72 0x20 0x77 0x69 0x73 0x68 0x65 // 'ir wishe' 0x73 0x20 0x63 0x6F 0x6D 0x65 0x20 0x74 // 's come t' 0x72 0x75 0x65 0x20 0x62 0x65 0x63 0x61 // 'rue beca' 0x75 0x73 0x65 0x20 0x42 0x65 0x6C 0x6C // 'use Bell' 0x61 0x20 0x6B 0x6E 0x6F 0x77 0x73 0x20 // 'a knows ' 0x74 0x68 0x65 0x79 0x20 0x6E 0x65 0x65 // 'they nee' 0x64 0x20 0x61 0x20 0x63 0x61 0x62 0x2E // 'd a cab.' 0x20 0x20 0x45 0x76 0x65 0x6E 0x20 0x6F // ' Even o' 0x6E 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F // 'n the mo' 0x73 0x74 0x20 0x63 0x72 0x6F 0x77 0x64 // 'st crowd' 0x65 0x64 0x20 0x73 0x74 0x72 0x65 0x65 // 'ed stree' 0x74 0x73 0x2C 0x20 0x42 0x65 0x6C 0x6C // 'ts, Bell' 0x61 0x20 0x69 0x73 0x20 0x61 0x62 0x6C // 'a is abl' 0x65 0x20 0x74 0x6F 0x20 0x68 0x61 0x69 // 'e to hai' 0x6C 0x20 0x61 0x20 0x74 0x61 0x78 0x69 // 'l a taxi' 0x97 0x6A 0x75 0x73 0x74 0x20 0x6C 0x69 // 'just li' 0x6B 0x65 0x20 0x74 0x68 0x61 0x74 0x21 // 'ke that!' 0x20 0x20 0x42 0x75 0x74 0x20 0x77 0x68 // ' But wh' 0x61 0x74 0x20 0x61 0x62 0x6F 0x75 0x74 // 'at about' 0x20 0x42 0x65 0x6C 0x6C 0x61 0x20 0x77 // ' Bella w' 0x68 0x65 0x6E 0x20 0x73 0x68 0x65 0x20 // 'hen she ' 0x6E 0x65 0x65 0x64 0x73 0x20 0x61 0x20 // 'needs a ' 0x63 0x61 0x62 0x3F 0x20 0x20 0x43 0x61 // 'cab? Ca' 0x6E 0x20 0x73 0x68 0x65 0x20 0x67 0x65 // 'n she ge' 0x74 0x20 0x6F 0x6E 0x65 0x3F 0x20 // 't one? ' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_35= ktipbio12 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_35, __HELP_NAME("ktipbio12")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_35, __HELP_NAME("ktipbio12")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_36=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_35, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio12" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_36=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_35, 0x0) BYTE 0x01 0x00 0x03 0x03 0xDB 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_36=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_36, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xAA 0x02 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x09 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_36=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_36, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x75 0x72 0x69 0x73 // '??Touris' 0x74 0x0D 0x0A 0x42 0x65 0x6C 0x6C 0x61 // 't??Bella' 0x20 0x6C 0x69 0x6B 0x65 0x73 0x20 0x68 // ' likes h' 0x61 0x76 0x69 0x6E 0x67 0x20 0x74 0x77 // 'aving tw' 0x6F 0x20 0x64 0x69 0x66 0x66 0x65 0x72 // 'o differ' 0x65 0x6E 0x74 0x20 0x6C 0x69 0x76 0x65 // 'ent live' 0x73 0x2C 0x20 0x61 0x6E 0x64 0x20 0x74 // 's, and t' 0x68 0x69 0x6E 0x6B 0x73 0x20 0x69 0x74 // 'hinks it' 0x20 0x77 0x6F 0x75 0x6C 0x64 0x20 0x62 // ' would b' 0x65 0x20 0x66 0x75 0x6E 0x20 0x74 0x6F // 'e fun to' 0x20 0x70 0x6C 0x61 0x79 0x20 0x61 0x20 // ' play a ' 0x64 0x6F 0x75 0x62 0x6C 0x65 0x20 0x6C // 'double l' 0x69 0x66 0x65 0x20 0x69 0x6E 0x20 0x61 // 'ife in a' 0x20 0x6D 0x6F 0x76 0x69 0x65 0x2E 0x20 // ' movie. ' 0x20 0x53 0x68 0x65 0x20 0x63 0x6F 0x75 // ' She cou' 0x6C 0x64 0x20 0x62 0x65 0x20 0x61 0x6E // 'ld be an' 0x20 0x6F 0x72 0x64 0x69 0x6E 0x61 0x72 // ' ordinar' 0x79 0x20 0x74 0x65 0x61 0x63 0x68 0x65 // 'y teache' 0x72 0x20 0x67 0x6F 0x69 0x6E 0x67 0x20 // 'r going ' 0x6F 0x6E 0x20 0x76 0x61 0x63 0x61 0x74 // 'on vacat' 0x69 0x6F 0x6E 0x20 0x77 0x69 0x74 0x68 // 'ion with' 0x20 0x73 0x6F 0x6D 0x65 0x20 0x6F 0x74 // ' some ot' 0x68 0x65 0x72 0x20 0x74 0x65 0x61 0x63 // 'her teac' 0x68 0x65 0x72 0x73 0x2E 0x20 0x20 0x4F // 'hers. O' 0x6E 0x20 0x74 0x68 0x65 0x20 0x74 0x72 // 'n the tr' 0x69 0x70 0x2C 0x20 0x74 0x68 0x65 0x20 // 'ip, the ' 0x70 0x6C 0x61 0x6E 0x65 0x20 0x62 0x65 // 'plane be' 0x67 0x69 0x6E 0x73 0x20 0x74 0x6F 0x20 // 'gins to ' 0x66 0x61 0x6C 0x6C 0x20 0x20 0x61 0x6E // 'fall an' 0x64 0x20 0x65 0x76 0x65 0x72 0x79 0x6F // 'd everyo' 0x6E 0x65 0x20 0x70 0x61 0x6E 0x69 0x63 // 'ne panic' 0x73 0x2E 0x20 0x20 0x4F 0x6E 0x65 0x20 // 's. One ' 0x6F 0x66 0x20 0x74 0x68 0x65 0x20 0x74 // 'of the t' 0x65 0x61 0x63 0x68 0x65 0x72 0x73 0x20 // 'eachers ' 0x66 0x61 0x69 0x6E 0x74 0x73 0x97 0x62 // 'faintsb' 0x75 0x74 0x20 0x6E 0x6F 0x74 0x20 0x42 // 'ut not B' 0x65 0x6C 0x6C 0x61 0x2E 0x20 0x20 0x53 // 'ella. S' 0x68 0x65 0x20 0x74 0x68 0x69 0x6E 0x6B // 'he think' 0x73 0x20 0x66 0x6F 0x72 0x20 0x61 0x20 // 's for a ' 0x73 0x65 0x63 0x6F 0x6E 0x64 0x2C 0x20 // 'second, ' 0x72 0x75 0x6E 0x73 0x20 0x74 0x6F 0x20 // 'runs to ' 0x74 0x68 0x65 0x20 0x66 0x72 0x6F 0x6E // 'the fron' 0x74 0x20 0x6F 0x66 0x20 0x74 0x68 0x65 // 't of the' 0x20 0x70 0x6C 0x61 0x6E 0x65 0x2C 0x20 // ' plane, ' 0x61 0x6E 0x64 0x20 0x73 0x75 0x64 0x64 // 'and sudd' 0x65 0x6E 0x6C 0x79 0x20 0x73 0x74 0x61 // 'enly sta' 0x72 0x74 0x73 0x20 0x73 0x68 0x72 0x69 // 'rts shri' 0x6E 0x6B 0x69 0x6E 0x67 0x2E 0x20 0x20 // 'nking. ' 0x53 0x68 0x65 0x20 0x73 0x68 0x72 0x69 // 'She shri' 0x6E 0x6B 0x73 0x20 0x65 0x6E 0x6F 0x75 // 'nks enou' 0x67 0x68 0x20 0x74 0x68 0x61 0x74 0x20 // 'gh that ' 0x73 0x68 0x65 0x20 0x64 0x69 0x73 0x61 // 'she disa' 0x70 0x70 0x65 0x61 0x72 0x73 0x2C 0x20 // 'ppears, ' 0x63 0x72 0x61 0x77 0x6C 0x73 0x20 0x69 // 'crawls i' 0x6E 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 // 'nto the ' 0x65 0x6E 0x67 0x69 0x6E 0x65 0x2C 0x20 // 'engine, ' 0x66 0x69 0x78 0x65 0x73 0x20 0x61 0x20 // 'fixes a ' 0x70 0x61 0x72 0x74 0x2C 0x20 0x61 0x6E // 'part, an' 0x64 0x20 0x73 0x74 0x6F 0x70 0x73 0x20 // 'd stops ' 0x74 0x68 0x65 0x20 0x70 0x6C 0x61 0x6E // 'the plan' 0x65 0x20 0x66 0x72 0x6F 0x6D 0x20 0x63 // 'e from c' 0x72 0x61 0x73 0x68 0x69 0x6E 0x67 0x2E // 'rashing.' 0x20 0x20 0x42 0x75 0x74 0x20 0x74 0x68 // ' But th' 0x65 0x6E 0x2C 0x20 0x6A 0x75 0x73 0x74 // 'en, just' 0x20 0x61 0x73 0x20 0x42 0x65 0x6C 0x6C // ' as Bell' 0x61 0x20 0x69 0x73 0x20 0x63 0x6F 0x6D // 'a is com' 0x69 0x6E 0x67 0x20 0x62 0x61 0x63 0x6B // 'ing back' 0x20 0x69 0x6E 0x74 0x6F 0x20 0x74 0x68 // ' into th' 0x65 0x20 0x70 0x6C 0x61 0x6E 0x65 0x2C // 'e plane,' 0x20 0x69 0x74 0x20 0x68 0x69 0x74 0x73 // ' it hits' 0x20 0x61 0x6E 0x20 0x61 0x69 0x72 0x20 // ' an air ' 0x70 0x6F 0x63 0x6B 0x65 0x74 0x2C 0x20 // 'pocket, ' 0x61 0x6E 0x64 0x20 0x74 0x68 0x65 0x20 // 'and the ' 0x77 0x68 0x6F 0x6C 0x65 0x20 0x70 0x6C // 'whole pl' 0x61 0x6E 0x65 0x20 0x6A 0x75 0x6D 0x70 // 'ane jump' 0x73 0x2E 0x20 0x20 0x42 0x65 0x6C 0x6C // 's. Bell' 0x61 0x20 0x73 0x74 0x6F 0x70 0x73 0x20 // 'a stops ' 0x67 0x72 0x6F 0x77 0x69 0x6E 0x67 0x20 // 'growing ' 0x61 0x6E 0x64 0x20 0x69 0x73 0x20 0x73 // 'and is s' 0x74 0x75 0x63 0x6B 0x2E 0x20 0x20 0x48 // 'tuck. H' 0x6F 0x77 0x20 0x77 0x69 0x6C 0x6C 0x20 // 'ow will ' 0x42 0x65 0x6C 0x6C 0x61 0x20 0x67 0x65 // 'Bella ge' 0x74 0x20 0x62 0x61 0x63 0x6B 0x20 0x74 // 't back t' 0x6F 0x20 0x6E 0x6F 0x72 0x6D 0x61 0x6C // 'o normal' 0x20 0x73 0x69 0x7A 0x65 0x20 0x61 0x67 // ' size ag' 0x61 0x69 0x6E 0x3F // 'ain?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_36= ktipbio13 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_36, __HELP_NAME("ktipbio13")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_36, __HELP_NAME("ktipbio13")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_35=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_36, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio13" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_35=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_36, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_35=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_35, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xD8 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x0B 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_35=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_35, 0x0) BYTE 0x03 0x03 0x63 0x68 0x65 0x6D 0x69 0x73 // '??chemis' 0x74 0x72 0x79 0x0D 0x0A 0x45 0x76 0x65 // 'try??Eve' 0x6E 0x20 0x74 0x68 0x6F 0x75 0x67 0x68 // 'n though' 0x20 0x42 0x65 0x6E 0x6E 0x79 0x20 0x77 // ' Benny w' 0x61 0x73 0x20 0x69 0x6E 0x6A 0x75 0x72 // 'as injur' 0x65 0x64 0x20 0x69 0x6E 0x20 0x74 0x68 // 'ed in th' 0x65 0x20 0x65 0x78 0x70 0x6C 0x6F 0x73 // 'e explos' 0x69 0x6F 0x6E 0x2C 0x20 0x68 0x65 0x20 // 'ion, he ' 0x73 0x74 0x69 0x6C 0x6C 0x20 0x6C 0x6F // 'still lo' 0x76 0x65 0x64 0x20 0x63 0x68 0x65 0x6D // 'ved chem' 0x69 0x73 0x74 0x72 0x79 0x2E 0x20 0x20 // 'istry. ' 0x42 0x75 0x74 0x20 0x77 0x68 0x65 0x6E // 'But when' 0x20 0x68 0x65 0x20 0x67 0x6F 0x74 0x20 // ' he got ' 0x6F 0x6C 0x64 0x65 0x72 0x2C 0x20 0x68 // 'older, h' 0x65 0x20 0x68 0x61 0x64 0x20 0x74 0x6F // 'e had to' 0x20 0x65 0x61 0x72 0x6E 0x20 0x61 0x20 // ' earn a ' 0x6C 0x69 0x76 0x69 0x6E 0x67 0x2C 0x20 // 'living, ' 0x73 0x6F 0x20 0x68 0x65 0x20 0x73 0x74 // 'so he st' 0x61 0x72 0x74 0x65 0x64 0x20 0x6D 0x69 // 'arted mi' 0x78 0x69 0x6E 0x67 0x20 0x70 0x65 0x72 // 'xing per' 0x66 0x75 0x6D 0x65 0x20 0x69 0x6E 0x20 // 'fume in ' 0x68 0x69 0x73 0x20 0x62 0x61 0x73 0x65 // 'his base' 0x6D 0x65 0x6E 0x74 0x20 0x6C 0x61 0x62 // 'ment lab' 0x6F 0x72 0x61 0x74 0x6F 0x72 0x79 0x2E // 'oratory.' 0x20 0x20 0x48 0x69 0x73 0x20 0x70 0x65 // ' His pe' 0x72 0x66 0x75 0x6D 0x65 0x20 0x77 0x61 // 'rfume wa' 0x73 0x20 0x61 0x20 0x68 0x69 0x74 0x2E // 's a hit.' 0x20 0x20 0x41 0x20 0x66 0x61 0x6D 0x6F // ' A famo' 0x75 0x73 0x20 0x61 0x63 0x74 0x72 0x65 // 'us actre' 0x73 0x73 0x20 0x63 0x61 0x6C 0x6C 0x65 // 'ss calle' 0x64 0x20 0x61 0x6E 0x64 0x20 0x61 0x73 // 'd and as' 0x6B 0x65 0x64 0x20 0x68 0x69 0x6D 0x20 // 'ked him ' 0x74 0x6F 0x20 0x63 0x72 0x65 0x61 0x74 // 'to creat' 0x65 0x20 0x61 0x20 0x70 0x65 0x72 0x66 // 'e a perf' 0x75 0x6D 0x65 0x20 0x6A 0x75 0x73 0x74 // 'ume just' 0x20 0x66 0x6F 0x72 0x20 0x68 0x65 0x72 // ' for her' 0x2E 0x20 0x20 0x57 0x68 0x65 0x6E 0x20 // '. When ' 0x73 0x68 0x65 0x20 0x6D 0x65 0x74 0x20 // 'she met ' 0x42 0x65 0x6E 0x6E 0x79 0x2C 0x20 0x73 // 'Benny, s' 0x68 0x65 0x20 0x74 0x68 0x6F 0x75 0x67 // 'he thoug' 0x68 0x74 0x20 0x68 0x69 0x73 0x20 0x75 // 'ht his u' 0x6E 0x69 0x71 0x75 0x65 0x20 0x6C 0x6F // 'nique lo' 0x6F 0x6B 0x20 0x77 0x6F 0x75 0x6C 0x64 // 'ok would' 0x20 0x62 0x65 0x20 0x70 0x65 0x72 0x66 // ' be perf' 0x65 0x63 0x74 0x20 0x66 0x6F 0x72 0x20 // 'ect for ' 0x68 0x65 0x72 0x20 0x6E 0x65 0x78 0x74 // 'her next' 0x20 0x6D 0x6F 0x76 0x69 0x65 0x2E 0x20 // ' movie. ' 0x20 0x42 0x65 0x6E 0x6E 0x79 0x20 0x77 // ' Benny w' 0x61 0x73 0x6E 0x27 0x74 0x20 0x73 0x75 // 'asn't su' 0x72 0x65 0x20 0x74 0x68 0x61 0x74 0x20 // 're that ' 0x61 0x63 0x74 0x69 0x6E 0x67 0x20 0x77 // 'acting w' 0x6F 0x75 0x6C 0x64 0x20 0x62 0x65 0x20 // 'ould be ' 0x6D 0x6F 0x72 0x65 0x20 0x66 0x75 0x6E // 'more fun' 0x20 0x74 0x68 0x61 0x74 0x20 0x77 0x6F // ' that wo' 0x72 0x6B 0x69 0x6E 0x67 0x20 0x69 0x6E // 'rking in' 0x20 0x74 0x68 0x65 0x20 0x6C 0x61 0x62 // ' the lab' 0x2C 0x20 0x62 0x75 0x74 0x20 0x68 0x65 // ', but he' 0x20 0x73 0x61 0x69 0x64 0x20 0x68 0x65 // ' said he' 0x27 0x64 0x20 0x74 0x72 0x79 0x20 0x69 // ''d try i' 0x74 0x2E // 't.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_37= ktipbio14 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_37, __HELP_NAME("ktipbio14")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_37, __HELP_NAME("ktipbio14")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_37=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_37, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio14" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_37=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_37, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_37=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_37, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x79 0x01 0x00 0x01 // '????y???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x14 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_37=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_37, 0x0) BYTE 0x03 0x03 0x42 0x61 0x63 0x6B 0x2D 0x74 // '??Back-t' 0x6F 0x2D 0x4C 0x69 0x66 0x65 0x20 0x4D // 'o-Life M' 0x75 0x6D 0x6D 0x79 0x0D 0x0A 0x42 0x65 // 'ummy??Be' 0x6E 0x6E 0x79 0x20 0x62 0x65 0x6C 0x69 // 'nny beli' 0x65 0x76 0x65 0x73 0x20 0x6E 0x6F 0x20 // 'eves no ' 0x6F 0x6E 0x65 0x20 0x77 0x61 0x73 0x20 // 'one was ' 0x62 0x65 0x74 0x74 0x65 0x72 0x20 0x61 // 'better a' 0x74 0x20 0x63 0x68 0x65 0x6D 0x69 0x73 // 't chemis' 0x74 0x72 0x79 0x20 0x74 0x68 0x61 0x6E // 'try than' 0x20 0x74 0x68 0x65 0x20 0x61 0x6E 0x63 // ' the anc' 0x69 0x65 0x6E 0x74 0x20 0x45 0x67 0x79 // 'ient Egy' 0x70 0x74 0x69 0x61 0x6E 0x73 0x2E 0x20 // 'ptians. ' 0x20 0x49 0x74 0x20 0x77 0x6F 0x75 0x6C // ' It woul' 0x64 0x20 0x62 0x65 0x20 0x61 0x20 0x6C // 'd be a l' 0x6F 0x74 0x20 0x6F 0x66 0x20 0x66 0x75 // 'ot of fu' 0x6E 0x20 0x74 0x6F 0x20 0x73 0x74 0x61 // 'n to sta' 0x72 0x20 0x61 0x73 0x20 0x61 0x20 0x70 // 'r as a p' 0x72 0x65 0x73 0x65 0x72 0x76 0x65 0x64 // 'reserved' 0x20 0x45 0x67 0x79 0x70 0x74 0x69 0x61 // ' Egyptia' 0x6E 0x20 0x6D 0x75 0x6D 0x6D 0x79 0x20 // 'n mummy ' 0x77 0x68 0x6F 0x20 0x63 0x61 0x6D 0x65 // 'who came' 0x20 0x62 0x61 0x63 0x6B 0x20 0x74 0x6F // ' back to' 0x20 0x6C 0x69 0x66 0x65 0x2E 0x20 0x20 // ' life. ' 0x48 0x65 0x27 0x73 0x20 0x61 0x6C 0x72 // 'He's alr' 0x65 0x61 0x64 0x79 0x20 0x64 0x72 0x65 // 'eady dre' 0x73 0x73 0x65 0x64 0x20 0x66 0x6F 0x72 // 'ssed for' 0x20 0x74 0x68 0x65 0x20 0x70 0x61 0x72 // ' the par' 0x74 0x2C 0x20 0x61 0x6E 0x64 0x20 0x68 // 't, and h' 0x65 0x20 0x61 0x6C 0x72 0x65 0x61 0x64 // 'e alread' 0x79 0x20 0x68 0x61 0x73 0x20 0x61 0x6C // 'y has al' 0x6C 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F // 'l the mo' 0x76 0x65 0x73 0x20 0x64 0x6F 0x77 0x6E // 'ves down' 0x2E 0x20 0x20 0x48 0x65 0x20 0x63 0x61 // '. He ca' 0x6E 0x20 0x77 0x61 0x6C 0x6B 0x20 0x73 // 'n walk s' 0x6C 0x6F 0x77 0x6C 0x79 0x2C 0x20 0x66 // 'lowly, f' 0x61 0x69 0x6E 0x74 0x2C 0x20 0x61 0x6E // 'aint, an' 0x64 0x20 0x66 0x61 0x6C 0x6C 0x20 0x64 // 'd fall d' 0x6F 0x77 0x6E 0x2E 0x20 0x42 0x75 0x74 // 'own. But' 0x20 0x6F 0x6E 0x63 0x65 0x20 0x68 0x65 // ' once he' 0x20 0x66 0x61 0x6C 0x6C 0x73 0x20 0x64 // ' falls d' 0x6F 0x77 0x6E 0x2C 0x20 0x68 0x6F 0x77 // 'own, how' 0x20 0x77 0x69 0x6C 0x6C 0x20 0x68 0x65 // ' will he' 0x20 0x67 0x65 0x74 0x20 0x62 0x61 0x63 // ' get bac' 0x6B 0x20 0x75 0x70 0x20 0x71 0x75 0x69 // 'k up qui' 0x63 0x6B 0x6C 0x79 0x20 0x74 0x6F 0x20 // 'ckly to ' 0x73 0x63 0x61 0x72 0x65 0x20 0x74 0x68 // 'scare th' 0x65 0x20 0x6E 0x65 0x78 0x74 0x20 0x6B // 'e next k' 0x69 0x64 0x3F // 'id?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_38= ktipbio15 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_38, __HELP_NAME("ktipbio15")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_38, __HELP_NAME("ktipbio15")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_38, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio15" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_38, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD5 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_3A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x77 0x02 0x00 0x01 // '????w???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xF4 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3A, 0x0) BYTE 0x03 0x03 0x49 0x6E 0x6A 0x75 0x72 0x65 // '??Injure' 0x64 0x20 0x56 0x69 0x63 0x74 0x69 0x6D // 'd Victim' 0x0D 0x0A 0x41 0x20 0x63 0x68 0x65 0x6D // '??A chem' 0x69 0x73 0x74 0x72 0x79 0x20 0x74 0x65 // 'istry te' 0x61 0x63 0x68 0x65 0x72 0x20 0x73 0x75 // 'acher su' 0x67 0x67 0x65 0x73 0x74 0x65 0x64 0x20 // 'ggested ' 0x42 0x65 0x6E 0x6E 0x79 0x20 0x77 0x6F // 'Benny wo' 0x75 0x6C 0x64 0x20 0x62 0x65 0x20 0x61 // 'uld be a' 0x20 0x67 0x72 0x65 0x61 0x74 0x20 0x70 // ' great p' 0x65 0x72 0x73 0x6F 0x6E 0x20 0x74 0x6F // 'erson to' 0x20 0x66 0x69 0x6C 0x6C 0x20 0x69 0x6E // ' fill in' 0x20 0x77 0x68 0x65 0x6E 0x20 0x61 0x20 // ' when a ' 0x73 0x74 0x75 0x6E 0x74 0x20 0x77 0x65 // 'stunt we' 0x6E 0x74 0x20 0x62 0x61 0x64 0x6C 0x79 // 'nt badly' 0x2E 0x20 0x20 0x54 0x68 0x65 0x20 0x66 // '. The f' 0x69 0x72 0x73 0x74 0x20 0x73 0x63 0x65 // 'irst sce' 0x6E 0x65 0x20 0x77 0x6F 0x75 0x6C 0x64 // 'ne would' 0x20 0x73 0x68 0x6F 0x77 0x20 0x61 0x20 // ' show a ' 0x73 0x74 0x75 0x6E 0x74 0x20 0x61 0x63 // 'stunt ac' 0x74 0x6F 0x72 0x20 0x64 0x6F 0x69 0x6E // 'tor doin' 0x67 0x20 0x61 0x20 0x64 0x61 0x72 0x69 // 'g a dari' 0x6E 0x67 0x20 0x66 0x61 0x6C 0x6C 0x20 // 'ng fall ' 0x66 0x72 0x6F 0x6D 0x20 0x61 0x20 0x70 // 'from a p' 0x6C 0x61 0x6E 0x65 0x2C 0x20 0x61 0x6E // 'lane, an' 0x64 0x20 0x74 0x68 0x65 0x20 0x73 0x65 // 'd the se' 0x63 0x6F 0x6E 0x64 0x20 0x73 0x63 0x65 // 'cond sce' 0x6E 0x65 0x20 0x77 0x6F 0x75 0x6C 0x64 // 'ne would' 0x20 0x68 0x61 0x76 0x65 0x20 0x42 0x65 // ' have Be' 0x6E 0x6E 0x79 0x20 0x69 0x6E 0x20 0x68 // 'nny in h' 0x69 0x73 0x20 0x62 0x61 0x6E 0x64 0x61 // 'is banda' 0x67 0x65 0x73 0x2C 0x20 0x77 0x61 0x6C // 'ges, wal' 0x6B 0x69 0x6E 0x67 0x20 0x73 0x6C 0x6F // 'king slo' 0x77 0x6C 0x79 0x2C 0x20 0x6F 0x62 0x76 // 'wly, obv' 0x69 0x6F 0x75 0x73 0x6C 0x79 0x20 0x69 // 'iously i' 0x6E 0x20 0x67 0x72 0x65 0x61 0x74 0x20 // 'n great ' 0x70 0x61 0x69 0x6E 0x2E 0x20 0x20 0x54 // 'pain. T' 0x68 0x65 0x20 0x6D 0x6F 0x76 0x69 0x65 // 'he movie' 0x20 0x77 0x6F 0x75 0x6C 0x64 0x20 0x67 // ' would g' 0x65 0x74 0x20 0x65 0x76 0x65 0x6E 0x20 // 'et even ' 0x6A 0x75 0x69 0x63 0x69 0x65 0x72 0x20 // 'juicier ' 0x77 0x68 0x65 0x6E 0x20 0x6E 0x6F 0x62 // 'when nob' 0x6F 0x64 0x79 0x20 0x72 0x65 0x61 0x6C // 'ody real' 0x69 0x7A 0x65 0x64 0x20 0x74 0x68 0x61 // 'ized tha' 0x74 0x20 0x42 0x65 0x6E 0x6E 0x79 0x20 // 't Benny ' 0x77 0x61 0x73 0x20 0x6E 0x6F 0x74 0x20 // 'was not ' 0x74 0x68 0x65 0x20 0x69 0x6E 0x6A 0x75 // 'the inju' 0x72 0x65 0x64 0x20 0x73 0x74 0x75 0x6E // 'red stun' 0x74 0x20 0x61 0x63 0x74 0x6F 0x72 0x20 // 't actor ' 0x61 0x74 0x20 0x61 0x6C 0x6C 0x2C 0x20 // 'at all, ' 0x62 0x75 0x74 0x20 0x61 0x6E 0x20 0x69 // 'but an i' 0x6E 0x6E 0x6F 0x63 0x65 0x6E 0x74 0x20 // 'nnocent ' 0x62 0x79 0x73 0x74 0x61 0x6E 0x64 0x65 // 'bystande' 0x72 0x2E 0x20 0x20 0x48 0x69 0x73 0x20 // 'r. His ' 0x62 0x61 0x6E 0x64 0x61 0x67 0x65 0x73 // 'bandages' 0x20 0x6A 0x75 0x73 0x74 0x20 0x6D 0x61 // ' just ma' 0x6B 0x65 0x20 0x65 0x76 0x65 0x72 0x79 // 'ke every' 0x6F 0x6E 0x65 0x20 0x74 0x68 0x69 0x6E // 'one thin' 0x6B 0x20 0x68 0x65 0x20 0x69 0x73 0x20 // 'k he is ' 0x74 0x68 0x65 0x20 0x72 0x65 0x63 0x6F // 'the reco' 0x76 0x65 0x72 0x69 0x6E 0x67 0x20 0x64 // 'vering d' 0x61 0x72 0x65 0x64 0x65 0x76 0x69 0x6C // 'aredevil' 0x20 0x73 0x74 0x75 0x6E 0x74 0x20 0x6D // ' stunt m' 0x61 0x6E 0x21 0x20 0x0D 0x0A 0x42 0x75 // 'an! ??Bu' 0x74 0x20 0x74 0x68 0x65 0x6E 0x20 0x77 // 't then w' 0x68 0x65 0x72 0x65 0x20 0x69 0x73 0x20 // 'here is ' 0x74 0x68 0x65 0x20 0x69 0x6E 0x6A 0x75 // 'the inju' 0x72 0x65 0x64 0x20 0x64 0x61 0x72 0x65 // 'red dare' 0x64 0x65 0x76 0x69 0x6C 0x3F 0x20 0x20 // 'devil? ' 0x43 0x61 0x6E 0x20 0x42 0x65 0x6E 0x6E // 'Can Benn' 0x79 0x20 0x75 0x73 0x65 0x20 0x68 0x69 // 'y use hi' 0x73 0x20 0x73 0x6B 0x69 0x6C 0x6C 0x73 // 's skills' 0x20 0x74 0x6F 0x20 0x6D 0x69 0x78 0x20 // ' to mix ' 0x61 0x20 0x74 0x72 0x75 0x74 0x68 0x20 // 'a truth ' 0x73 0x65 0x72 0x75 0x6D 0x20 0x74 0x68 // 'serum th' 0x61 0x74 0x20 0x77 0x69 0x6C 0x6C 0x20 // 'at will ' 0x68 0x65 0x6C 0x70 0x20 0x68 0x69 0x6D // 'help him' 0x20 0x72 0x65 0x76 0x65 0x61 0x6C 0x20 // ' reveal ' 0x74 0x68 0x65 0x20 0x72 0x65 0x61 0x6C // 'the real' 0x20 0x76 0x69 0x63 0x74 0x69 0x6D 0x3F // ' victim?' 0x20 // ' ' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_39= ktipbio16 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_39, __HELP_NAME("ktipbio16")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_39, __HELP_NAME("ktipbio16")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_39=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_39, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio16" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_39=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_39, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_39=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_39, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1B 0x01 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xA9 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_39=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_39, 0x0) BYTE 0x03 0x03 0x41 0x6E 0x63 0x69 0x65 0x6E // '??Ancien' 0x74 0x20 0x4D 0x75 0x6D 0x6D 0x79 0x0D // 't Mummy?' 0x0A 0x49 0x74 0x20 0x77 0x6F 0x75 0x6C // '?It woul' 0x64 0x20 0x62 0x65 0x20 0x74 0x6F 0x74 // 'd be tot' 0x61 0x6C 0x6C 0x79 0x20 0x66 0x75 0x6E // 'ally fun' 0x20 0x74 0x6F 0x20 0x70 0x6C 0x61 0x79 // ' to play' 0x20 0x61 0x20 0x6D 0x75 0x6D 0x6D 0x79 // ' a mummy' 0x97 0x69 0x6E 0x20 0x61 0x6E 0x63 0x69 // 'in anci' 0x65 0x6E 0x74 0x20 0x45 0x67 0x79 0x70 // 'ent Egyp' 0x74 0x21 0x20 0x20 0x42 0x65 0x6E 0x6E // 't! Benn' 0x79 0x20 0x68 0x61 0x73 0x20 0x61 0x6C // 'y has al' 0x6C 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F // 'l the mo' 0x76 0x65 0x73 0x20 0x64 0x6F 0x77 0x6E // 'ves down' 0x2C 0x20 0x68 0x65 0x20 0x63 0x61 0x6E // ', he can' 0x20 0x66 0x61 0x69 0x6E 0x74 0x20 0x61 // ' faint a' 0x6E 0x64 0x20 0x66 0x61 0x6C 0x6C 0x20 // 'nd fall ' 0x64 0x6F 0x77 0x6E 0x2C 0x20 0x61 0x6E // 'down, an' 0x64 0x20 0x68 0x65 0x20 0x63 0x61 0x6E // 'd he can' 0x20 0x74 0x68 0x69 0x6E 0x6B 0x20 0x6C // ' think l' 0x69 0x6B 0x65 0x20 0x61 0x6E 0x20 0x45 // 'ike an E' 0x67 0x79 0x70 0x74 0x69 0x61 0x6E 0x2E // 'gyptian.' 0x20 0x0D 0x0A 0x42 0x75 0x74 0x20 0x77 // ' ??But w' 0x68 0x61 0x74 0x20 0x69 0x66 0x20 0x6F // 'hat if o' 0x6E 0x65 0x20 0x6F 0x66 0x20 0x74 0x68 // 'ne of th' 0x6F 0x73 0x65 0x20 0x45 0x67 0x79 0x70 // 'ose Egyp' 0x74 0x69 0x61 0x6E 0x20 0x67 0x72 0x61 // 'tian gra' 0x76 0x65 0x20 0x72 0x6F 0x62 0x62 0x65 // 've robbe' 0x72 0x73 0x20 0x73 0x70 0x6F 0x74 0x74 // 'rs spott' 0x65 0x64 0x20 0x68 0x69 0x6D 0x20 0x61 // 'ed him a' 0x6E 0x64 0x20 0x74 0x6F 0x6F 0x6B 0x20 // 'nd took ' 0x68 0x69 0x6D 0x20 0x62 0x61 0x63 0x6B // 'him back' 0x20 0x74 0x6F 0x20 0x45 0x67 0x79 0x70 // ' to Egyp' 0x74 0x3F 0x20 0x20 0x48 0x6F 0x77 0x20 // 't? How ' 0x77 0x6F 0x75 0x6C 0x64 0x20 0x42 0x65 // 'would Be' 0x6E 0x6E 0x79 0x20 0x67 0x65 0x74 0x20 // 'nny get ' 0x61 0x77 0x61 0x79 0x3F // 'away?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3A= ktipbio17 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3A, __HELP_NAME("ktipbio17")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3A, __HELP_NAME("ktipbio17")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3A, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio17" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x02 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_3B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xFA 0x02 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xF3 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3B, 0x0) BYTE 0x03 0x03 0x64 0x61 0x6E 0x63 0x65 0x0D // '??dance?' 0x0A 0x42 0x65 0x66 0x6F 0x72 0x65 0x20 // '?Before ' 0x62 0x65 0x63 0x6F 0x6D 0x69 0x6E 0x67 // 'becoming' 0x20 0x61 0x20 0x63 0x6F 0x6F 0x6B 0x2C // ' a cook,' 0x20 0x42 0x69 0x6C 0x6C 0x79 0x20 0x66 // ' Billy f' 0x6F 0x6C 0x6C 0x6F 0x77 0x65 0x64 0x20 // 'ollowed ' 0x66 0x61 0x6D 0x69 0x6C 0x79 0x20 0x74 // 'family t' 0x72 0x61 0x64 0x69 0x74 0x69 0x6F 0x6E // 'radition' 0x20 0x61 0x6E 0x64 0x20 0x77 0x6F 0x72 // ' and wor' 0x6B 0x65 0x64 0x20 0x61 0x73 0x20 0x61 // 'ked as a' 0x20 0x66 0x69 0x73 0x68 0x65 0x72 0x6D // ' fisherm' 0x61 0x6E 0x2E 0x20 0x20 0x48 0x65 0x27 // 'an. He'' 0x73 0x20 0x73 0x74 0x72 0x6F 0x6E 0x67 // 's strong' 0x20 0x61 0x6E 0x64 0x20 0x6D 0x75 0x73 // ' and mus' 0x63 0x75 0x6C 0x61 0x72 0x2C 0x20 0x61 // 'cular, a' 0x6E 0x64 0x20 0x63 0x6F 0x75 0x6C 0x64 // 'nd could' 0x20 0x68 0x61 0x75 0x6C 0x20 0x69 0x6E // ' haul in' 0x20 0x73 0x6F 0x6D 0x65 0x20 0x62 0x69 // ' some bi' 0x67 0x20 0x63 0x61 0x74 0x63 0x68 0x65 // 'g catche' 0x73 0x2E 0x20 0x4F 0x6E 0x65 0x20 0x64 // 's. One d' 0x61 0x79 0x20 0x42 0x69 0x6C 0x6C 0x79 // 'ay Billy' 0x20 0x77 0x61 0x73 0x20 0x6F 0x6E 0x20 // ' was on ' 0x74 0x68 0x65 0x20 0x64 0x65 0x63 0x6B // 'the deck' 0x2C 0x20 0x77 0x68 0x69 0x63 0x68 0x20 // ', which ' 0x68 0x61 0x70 0x70 0x65 0x6E 0x65 0x64 // 'happened' 0x20 0x74 0x6F 0x20 0x62 0x65 0x20 0x75 // ' to be u' 0x6E 0x75 0x73 0x75 0x61 0x6C 0x6C 0x79 // 'nusually' 0x20 0x73 0x6C 0x69 0x70 0x70 0x65 0x72 // ' slipper' 0x79 0x2E 0x20 0x48 0x65 0x20 0x6C 0x6F // 'y. He lo' 0x73 0x74 0x20 0x63 0x6F 0x6E 0x74 0x72 // 'st contr' 0x6F 0x6C 0x20 0x6F 0x66 0x20 0x68 0x69 // 'ol of hi' 0x73 0x20 0x6C 0x65 0x67 0x73 0x2C 0x20 // 's legs, ' 0x61 0x6E 0x64 0x20 0x77 0x68 0x69 0x6C // 'and whil' 0x65 0x20 0x68 0x65 0x20 0x74 0x72 0x69 // 'e he tri' 0x65 0x64 0x20 0x74 0x6F 0x20 0x63 0x61 // 'ed to ca' 0x74 0x63 0x68 0x20 0x68 0x69 0x73 0x20 // 'tch his ' 0x62 0x61 0x6C 0x61 0x6E 0x63 0x65 0x2C // 'balance,' 0x20 0x68 0x69 0x73 0x20 0x66 0x61 0x6D // ' his fam' 0x69 0x6C 0x79 0x20 0x73 0x74 0x6F 0x70 // 'ily stop' 0x70 0x65 0x64 0x20 0x74 0x6F 0x20 0x77 // 'ped to w' 0x61 0x74 0x63 0x68 0x20 0x68 0x69 0x6D // 'atch him' 0x2E 0x20 0x20 0x4F 0x74 0x68 0x65 0x72 // '. Other' 0x20 0x66 0x69 0x73 0x68 0x65 0x72 0x6D // ' fisherm' 0x65 0x6E 0x20 0x64 0x72 0x69 0x66 0x74 // 'en drift' 0x69 0x6E 0x67 0x20 0x62 0x79 0x20 0x61 // 'ing by a' 0x6C 0x73 0x6F 0x20 0x73 0x74 0x6F 0x70 // 'lso stop' 0x70 0x65 0x64 0x20 0x74 0x6F 0x20 0x73 // 'ped to s' 0x74 0x61 0x72 0x65 0x2E 0x20 0x20 0x49 // 'tare. I' 0x74 0x20 0x77 0x61 0x73 0x20 0x61 0x20 // 't was a ' 0x6D 0x61 0x67 0x6E 0x69 0x66 0x69 0x63 // 'magnific' 0x65 0x6E 0x74 0x20 0x22 0x64 0x61 0x6E // 'ent "dan' 0x63 0x65 0x21 0x22 0x20 0x41 0x66 0x74 // 'ce!" Aft' 0x65 0x72 0x20 0x61 0x20 0x67 0x72 0x61 // 'er a gra' 0x6E 0x64 0x20 0x66 0x69 0x6E 0x61 0x6C // 'nd final' 0x65 0x2C 0x20 0x42 0x69 0x6C 0x6C 0x79 // 'e, Billy' 0x27 0x73 0x20 0x66 0x61 0x74 0x68 0x65 // ''s fathe' 0x72 0x20 0x73 0x61 0x69 0x64 0x20 0x22 // 'r said "' 0x53 0x6F 0x6E 0x2C 0x20 0x79 0x6F 0x75 // 'Son, you' 0x27 0x72 0x65 0x20 0x6E 0x6F 0x20 0x66 // ''re no f' 0x69 0x73 0x68 0x65 0x72 0x6D 0x61 0x6E // 'isherman' 0x97 0x79 0x6F 0x75 0x27 0x72 0x65 0x20 // 'you're ' 0x61 0x20 0x64 0x61 0x6E 0x63 0x65 0x72 // 'a dancer' 0x2E 0x22 0x20 0x0D 0x0A 0x42 0x69 0x6C // '." ??Bil' 0x6C 0x79 0x20 0x64 0x65 0x63 0x69 0x64 // 'ly decid' 0x65 0x64 0x20 0x74 0x6F 0x20 0x6D 0x6F // 'ed to mo' 0x76 0x65 0x20 0x74 0x6F 0x20 0x54 0x6F // 've to To' 0x72 0x6F 0x6E 0x74 0x6F 0x20 0x74 0x6F // 'ronto to' 0x20 0x67 0x6F 0x20 0x74 0x6F 0x20 0x64 // ' go to d' 0x61 0x6E 0x63 0x65 0x20 0x73 0x63 0x68 // 'ance sch' 0x6F 0x6F 0x6C 0x2E 0x20 0x20 0x42 0x75 // 'ool. Bu' 0x74 0x20 0x68 0x65 0x20 0x77 0x61 0x73 // 't he was' 0x20 0x64 0x69 0x73 0x63 0x6F 0x76 0x65 // ' discove' 0x72 0x65 0x64 0x20 0x61 0x74 0x20 0x74 // 'red at t' 0x68 0x65 0x20 0x72 0x65 0x73 0x74 0x61 // 'he resta' 0x75 0x72 0x61 0x6E 0x74 0x20 0x77 0x68 // 'urant wh' 0x65 0x6E 0x20 0x74 0x68 0x65 0x20 0x66 // 'en the f' 0x6C 0x6F 0x6F 0x72 0x20 0x77 0x61 0x73 // 'loor was' 0x20 0x75 0x6E 0x75 0x73 0x75 0x61 0x6C // ' unusual' 0x6C 0x79 0x20 0x73 0x6C 0x69 0x70 0x70 // 'ly slipp' 0x65 0x72 0x79 0x20 0x6F 0x6E 0x65 0x20 // 'ery one ' 0x65 0x76 0x65 0x6E 0x69 0x6E 0x67 0x2E // 'evening.' 0x20 0x20 0x54 0x68 0x65 0x20 0x64 0x69 // ' The di' 0x72 0x65 0x63 0x74 0x6F 0x72 0x20 0x4D // 'rector M' 0x63 0x5A 0x65 0x65 0x20 0x77 0x61 0x73 // 'cZee was' 0x20 0x68 0x61 0x76 0x69 0x6E 0x67 0x20 // ' having ' 0x64 0x69 0x6E 0x6E 0x65 0x72 0x2C 0x20 // 'dinner, ' 0x61 0x6E 0x64 0x20 0x77 0x61 0x74 0x63 // 'and watc' 0x68 0x65 0x64 0x20 0x42 0x69 0x6C 0x6C // 'hed Bill' 0x79 0x20 0x70 0x72 0x65 0x70 0x61 0x72 // 'y prepar' 0x65 0x20 0x74 0x68 0x65 0x20 0x66 0x69 // 'e the fi' 0x73 0x68 0x20 0x61 0x6E 0x64 0x20 0x64 // 'sh and d' 0x6F 0x20 0x68 0x69 0x73 0x20 0x22 0x64 // 'o his "d' 0x61 0x6E 0x63 0x65 0x2E 0x22 0x20 0x20 // 'ance." ' 0x4E 0x6F 0x77 0x20 0x42 0x69 0x6C 0x6C // 'Now Bill' 0x79 0x27 0x73 0x20 0x61 0x20 0x73 0x74 // 'y's a st' 0x61 0x72 0x2E 0x20 // 'ar. ' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3B= ktipbio18 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3B, __HELP_NAME("ktipbio18")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3B, __HELP_NAME("ktipbio18")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_28=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3B, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio18" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_28=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3B, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE2 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_28=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_28, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xA3 0x02 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x0B 0x02 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_28=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_28, 0x0) BYTE 0x03 0x03 0x47 0x65 0x6E 0x65 0x72 0x61 // '??Genera' 0x6C 0x0D 0x0A 0x42 0x69 0x6C 0x6C 0x79 // 'l??Billy' 0x20 0x74 0x68 0x69 0x6E 0x6B 0x73 0x20 // ' thinks ' 0x68 0x65 0x20 0x77 0x6F 0x75 0x6C 0x64 // 'he would' 0x20 0x62 0x65 0x20 0x61 0x6E 0x20 0x61 // ' be an a' 0x77 0x65 0x73 0x6F 0x6D 0x65 0x20 0x22 // 'wesome "' 0x67 0x65 0x6E 0x65 0x72 0x61 0x6C 0x20 // 'general ' 0x77 0x69 0x74 0x68 0x20 0x61 0x6E 0x20 // 'with an ' 0x61 0x74 0x74 0x69 0x74 0x75 0x64 0x65 // 'attitude' 0x22 0x20 0x69 0x6E 0x20 0x61 0x20 0x74 // '" in a t' 0x68 0x72 0x69 0x6C 0x6C 0x65 0x72 0x20 // 'hriller ' 0x6D 0x6F 0x76 0x69 0x65 0x2E 0x20 0x20 // 'movie. ' 0x53 0x68 0x6F 0x72 0x74 0x20 0x61 0x6E // 'Short an' 0x64 0x20 0x73 0x74 0x72 0x6F 0x6E 0x67 // 'd strong' 0x20 0x61 0x73 0x20 0x61 0x20 0x74 0x61 // ' as a ta' 0x6E 0x6B 0x2C 0x20 0x42 0x69 0x6C 0x6C // 'nk, Bill' 0x79 0x20 0x77 0x6F 0x75 0x6C 0x64 0x20 // 'y would ' 0x77 0x61 0x6C 0x6B 0x20 0x61 0x72 0x6F // 'walk aro' 0x75 0x6E 0x64 0x20 0x73 0x6C 0x6F 0x77 // 'und slow' 0x6C 0x79 0x20 0x61 0x6E 0x64 0x20 0x74 // 'ly and t' 0x68 0x6F 0x75 0x67 0x68 0x74 0x66 0x75 // 'houghtfu' 0x6C 0x6C 0x79 0x20 0x77 0x68 0x69 0x6C // 'lly whil' 0x65 0x20 0x70 0x6C 0x61 0x6E 0x6E 0x69 // 'e planni' 0x6E 0x67 0x20 0x68 0x69 0x73 0x20 0x61 // 'ng his a' 0x74 0x74 0x61 0x63 0x6B 0x73 0x2E 0x20 // 'ttacks. ' 0x20 0x48 0x65 0x20 0x64 0x72 0x65 0x61 // ' He drea' 0x6D 0x73 0x20 0x74 0x68 0x61 0x74 0x20 // 'ms that ' 0x68 0x69 0x73 0x20 0x74 0x72 0x6F 0x6F // 'his troo' 0x70 0x73 0x20 0x77 0x6F 0x75 0x6C 0x64 // 'ps would' 0x20 0x77 0x69 0x6E 0x20 0x61 0x6E 0x20 // ' win an ' 0x69 0x6D 0x70 0x6F 0x72 0x74 0x61 0x6E // 'importan' 0x74 0x20 0x62 0x61 0x74 0x74 0x6C 0x65 // 't battle' 0x20 0x69 0x6E 0x20 0x61 0x20 0x66 0x61 // ' in a fa' 0x72 0x20 0x61 0x77 0x61 0x79 0x20 0x70 // 'r away p' 0x6C 0x61 0x63 0x65 0x20 0x6C 0x69 0x6B // 'lace lik' 0x65 0x20 0x4E 0x6F 0x72 0x74 0x68 0x20 // 'e North ' 0x41 0x66 0x72 0x69 0x63 0x61 0x2E 0x20 // 'Africa. ' 0x20 0x4F 0x6E 0x20 0x74 0x68 0x65 0x20 // ' On the ' 0x70 0x6F 0x72 0x63 0x68 0x20 0x6F 0x66 // 'porch of' 0x20 0x61 0x20 0x4E 0x6F 0x72 0x74 0x68 // ' a North' 0x20 0x41 0x66 0x72 0x69 0x63 0x61 0x6E // ' African' 0x20 0x76 0x69 0x6C 0x6C 0x61 0x2C 0x20 // ' villa, ' 0x42 0x69 0x6C 0x6C 0x79 0x20 0x77 0x6F // 'Billy wo' 0x75 0x6C 0x64 0x20 0x66 0x61 0x63 0x65 // 'uld face' 0x20 0x74 0x68 0x65 0x20 0x65 0x6E 0x65 // ' the ene' 0x6D 0x79 0x92 0x73 0x20 0x6C 0x65 0x61 // 'mys lea' 0x64 0x65 0x72 0x2E 0x20 0x20 0x54 0x68 // 'der. Th' 0x65 0x20 0x6C 0x65 0x61 0x64 0x65 0x72 // 'e leader' 0x20 0x6B 0x6E 0x6F 0x77 0x73 0x20 0x6B // ' knows k' 0x61 0x72 0x61 0x74 0x65 0x2C 0x20 0x62 // 'arate, b' 0x75 0x74 0x20 0x64 0x6F 0x65 0x73 0x6E // 'ut doesn' 0x92 0x74 0x20 0x6B 0x6E 0x6F 0x77 0x20 // 't know ' 0x42 0x69 0x6C 0x6C 0x79 0x27 0x73 0x20 // 'Billy's ' 0x77 0x65 0x61 0x70 0x6F 0x6E 0x97 0x74 // 'weapont' 0x68 0x61 0x74 0x20 0x77 0x68 0x65 0x6E // 'hat when' 0x20 0x42 0x69 0x6C 0x6C 0x79 0x20 0x64 // ' Billy d' 0x61 0x6E 0x63 0x65 0x73 0x2C 0x20 0x68 // 'ances, h' 0x65 0x20 0x63 0x61 0x6E 0x20 0x6D 0x61 // 'e can ma' 0x6B 0x65 0x20 0x70 0x65 0x6F 0x70 0x6C // 'ke peopl' 0x65 0x20 0x66 0x6F 0x72 0x67 0x65 0x74 // 'e forget' 0x20 0x77 0x68 0x79 0x20 0x74 0x68 0x65 // ' why the' 0x79 0x20 0x77 0x65 0x72 0x65 0x20 0x66 // 'y were f' 0x69 0x67 0x68 0x74 0x69 0x6E 0x67 0x20 // 'ighting ' 0x69 0x6E 0x20 0x74 0x68 0x65 0x20 0x66 // 'in the f' 0x69 0x72 0x73 0x74 0x20 0x70 0x6C 0x61 // 'irst pla' 0x63 0x65 0x2E 0x0D 0x0A 0x42 0x69 0x6C // 'ce.??Bil' 0x6C 0x79 0x20 0x63 0x61 0x6E 0x20 0x61 // 'ly can a' 0x76 0x6F 0x69 0x64 0x20 0x74 0x68 0x65 // 'void the' 0x20 0x6C 0x65 0x61 0x64 0x65 0x72 0x27 // ' leader'' 0x73 0x20 0x6B 0x61 0x72 0x61 0x74 0x65 // 's karate' 0x20 0x6B 0x69 0x63 0x6B 0x73 0x2C 0x20 // ' kicks, ' 0x62 0x75 0x74 0x20 0x68 0x6F 0x77 0x20 // 'but how ' 0x63 0x61 0x6E 0x20 0x68 0x65 0x20 0x66 // 'can he f' 0x69 0x6E 0x61 0x6C 0x6C 0x79 0x20 0x6F // 'inally o' 0x75 0x74 0x77 0x69 0x74 0x20 0x74 0x68 // 'utwit th' 0x65 0x20 0x6C 0x65 0x61 0x64 0x65 0x72 // 'e leader' 0x20 0x74 0x6F 0x20 0x77 0x69 0x6E 0x20 // ' to win ' 0x74 0x6F 0x74 0x61 0x6C 0x20 0x76 0x69 // 'total vi' 0x63 0x74 0x6F 0x72 0x79 0x3F 0x20 0x20 // 'ctory? ' 0x44 0x6F 0x65 0x73 0x20 0x42 0x69 0x6C // 'Does Bil' 0x6C 0x79 0x92 0x73 0x20 0x75 0x6E 0x69 // 'lys uni' 0x66 0x6F 0x72 0x6D 0x20 0x67 0x69 0x76 // 'form giv' 0x65 0x20 0x68 0x69 0x6D 0x20 0x73 0x70 // 'e him sp' 0x65 0x63 0x69 0x61 0x6C 0x20 0x70 0x6F // 'ecial po' 0x77 0x65 0x72 0x73 0x3F // 'wers?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3C= ktipbio19 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3C, __HELP_NAME("ktipbio19")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3C, __HELP_NAME("ktipbio19")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3C, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio19" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3C, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_3C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x42 0x02 0x00 0x01 // '????B???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xC4 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3C, 0x0) BYTE 0x03 0x03 0x46 0x6F 0x72 0x65 0x6D 0x61 // '??Forema' 0x6E 0x0D 0x0A 0x42 0x69 0x6C 0x6C 0x79 // 'n??Billy' 0x27 0x73 0x20 0x75 0x6E 0x63 0x6C 0x65 // ''s uncle' 0x20 0x77 0x61 0x73 0x20 0x61 0x20 0x63 // ' was a c' 0x6F 0x6E 0x73 0x74 0x72 0x75 0x63 0x74 // 'onstruct' 0x69 0x6F 0x6E 0x20 0x77 0x6F 0x72 0x6B // 'ion work' 0x65 0x72 0x2C 0x20 0x61 0x6E 0x64 0x20 // 'er, and ' 0x42 0x69 0x6C 0x6C 0x79 0x20 0x68 0x61 // 'Billy ha' 0x73 0x20 0x61 0x6C 0x77 0x61 0x79 0x73 // 's always' 0x20 0x77 0x61 0x6E 0x74 0x65 0x64 0x20 // ' wanted ' 0x74 0x6F 0x20 0x66 0x6F 0x6C 0x6C 0x6F // 'to follo' 0x77 0x20 0x69 0x6E 0x20 0x68 0x69 0x73 // 'w in his' 0x20 0x75 0x6E 0x63 0x6C 0x65 0x27 0x73 // ' uncle's' 0x20 0x66 0x6F 0x6F 0x74 0x73 0x74 0x65 // ' footste' 0x70 0x73 0x97 0x61 0x74 0x20 0x6C 0x65 // 'psat le' 0x61 0x73 0x74 0x20 0x6F 0x6E 0x20 0x66 // 'ast on f' 0x69 0x6C 0x6D 0x2E 0x20 0x20 0x48 0x65 // 'ilm. He' 0x27 0x64 0x20 0x6C 0x6F 0x76 0x65 0x20 // ''d love ' 0x74 0x6F 0x20 0x73 0x74 0x61 0x72 0x20 // 'to star ' 0x61 0x73 0x20 0x61 0x20 0x63 0x6F 0x6E // 'as a con' 0x73 0x74 0x72 0x75 0x63 0x74 0x69 0x6F // 'structio' 0x6E 0x20 0x77 0x6F 0x72 0x6B 0x65 0x72 // 'n worker' 0x20 0x77 0x68 0x6F 0x20 0x62 0x75 0x69 // ' who bui' 0x6C 0x64 0x73 0x20 0x61 0x20 0x63 0x6F // 'lds a co' 0x7A 0x79 0x20 0x63 0x61 0x62 0x69 0x6E // 'zy cabin' 0x20 0x66 0x6F 0x72 0x20 0x61 0x20 0x6C // ' for a l' 0x6F 0x63 0x61 0x6C 0x20 0x6D 0x69 0x6C // 'ocal mil' 0x6C 0x69 0x6F 0x6E 0x61 0x69 0x72 0x65 // 'lionaire' 0x2E 0x20 0x20 0x42 0x75 0x74 0x20 0x77 // '. But w' 0x68 0x65 0x6E 0x20 0x74 0x68 0x65 0x20 // 'hen the ' 0x6D 0x69 0x6C 0x6C 0x69 0x6F 0x6E 0x61 // 'milliona' 0x69 0x72 0x65 0x20 0x64 0x69 0x73 0x61 // 'ire disa' 0x70 0x70 0x65 0x61 0x72 0x73 0x2C 0x20 // 'ppears, ' 0x42 0x69 0x6C 0x6C 0x79 0x20 0x67 0x65 // 'Billy ge' 0x74 0x73 0x20 0x67 0x65 0x74 0x73 0x20 // 'ts gets ' 0x74 0x61 0x6E 0x67 0x6C 0x65 0x64 0x20 // 'tangled ' 0x75 0x70 0x20 0x69 0x6E 0x20 0x74 0x68 // 'up in th' 0x65 0x20 0x6D 0x79 0x73 0x74 0x65 0x72 // 'e myster' 0x69 0x6F 0x75 0x73 0x20 0x64 0x69 0x73 // 'ious dis' 0x61 0x70 0x70 0x65 0x61 0x72 0x61 0x6E // 'appearan' 0x63 0x65 0x2E 0x20 0x20 0x48 0x65 0x20 // 'ce. He ' 0x73 0x65 0x61 0x72 0x63 0x68 0x65 0x73 // 'searches' 0x20 0x74 0x68 0x65 0x20 0x6D 0x61 0x6E // ' the man' 0x92 0x73 0x20 0x63 0x61 0x62 0x69 0x6E // 's cabin' 0x20 0x66 0x6F 0x72 0x20 0x63 0x6C 0x75 // ' for clu' 0x65 0x73 0x2E 0x20 0x20 0x4F 0x6E 0x20 // 'es. On ' 0x74 0x68 0x65 0x20 0x77 0x61 0x6C 0x6C // 'the wall' 0x20 0x69 0x73 0x20 0x61 0x20 0x6D 0x61 // ' is a ma' 0x73 0x6B 0x20 0x77 0x68 0x6F 0x73 0x65 // 'sk whose' 0x20 0x65 0x79 0x65 0x73 0x20 0x73 0x65 // ' eyes se' 0x65 0x6D 0x20 0x74 0x6F 0x20 0x66 0x6F // 'em to fo' 0x6C 0x6C 0x6F 0x77 0x20 0x68 0x69 0x73 // 'llow his' 0x20 0x65 0x76 0x65 0x72 0x79 0x20 0x6D // ' every m' 0x6F 0x76 0x65 0x2E 0x20 0x4F 0x6E 0x20 // 'ove. On ' 0x74 0x68 0x65 0x20 0x74 0x61 0x62 0x6C // 'the tabl' 0x65 0x20 0x69 0x73 0x20 0x61 0x20 0x6D // 'e is a m' 0x61 0x70 0x2E 0x20 0x0D 0x0A 0x48 0x61 // 'ap. ??Ha' 0x73 0x20 0x74 0x68 0x65 0x20 0x6F 0x77 // 's the ow' 0x6E 0x65 0x72 0x20 0x62 0x65 0x65 0x6E // 'ner been' 0x20 0x6B 0x69 0x64 0x6E 0x61 0x70 0x70 // ' kidnapp' 0x65 0x64 0x2C 0x20 0x6F 0x72 0x20 0x69 // 'ed, or i' 0x73 0x20 0x68 0x65 0x20 0x6A 0x75 0x73 // 's he jus' 0x74 0x20 0x69 0x6E 0x20 0x4D 0x69 0x61 // 't in Mia' 0x6D 0x69 0x20 0x6F 0x6E 0x20 0x61 0x20 // 'mi on a ' 0x62 0x75 0x73 0x69 0x6E 0x65 0x73 0x73 // 'business' 0x20 0x74 0x72 0x69 0x70 0x3F 0x20 0x20 // ' trip? ' 0x43 0x61 0x6E 0x20 0x42 0x69 0x6C 0x6C // 'Can Bill' 0x79 0x92 0x73 0x20 0x20 0x64 0x61 0x6E // 'ys dan' 0x63 0x69 0x6E 0x67 0x20 0x73 0x6B 0x69 // 'cing ski' 0x6C 0x6C 0x73 0x20 0x68 0x65 0x6C 0x70 // 'lls help' 0x20 0x68 0x69 0x6D 0x20 0x73 0x61 0x76 // ' him sav' 0x65 0x20 0x68 0x69 0x73 0x20 0x62 0x6F // 'e his bo' 0x73 0x73 0x3F 0x20 // 'ss? ' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3D= ktipbio20 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3D, __HELP_NAME("ktipbio20")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3D, __HELP_NAME("ktipbio20")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3D, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio20" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3D, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_3D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x26 0x02 0x00 0x01 // '????&???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xB0 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3D, 0x0) BYTE 0x03 0x03 0x46 0x6C 0x65 0x61 0x20 0x4D // '??Flea M' 0x61 0x72 0x6B 0x65 0x74 0x20 0x4D 0x61 // 'arket Ma' 0x6E 0x61 0x67 0x65 0x72 0x0D 0x0A 0x41 // 'nager??A' 0x73 0x20 0x74 0x68 0x65 0x20 0x6D 0x61 // 's the ma' 0x6E 0x61 0x67 0x65 0x72 0x20 0x6F 0x66 // 'nager of' 0x20 0x61 0x20 0x66 0x6C 0x65 0x61 0x20 // ' a flea ' 0x6D 0x61 0x72 0x6B 0x65 0x74 0x2C 0x20 // 'market, ' 0x42 0x69 0x6C 0x6C 0x79 0x20 0x63 0x6F // 'Billy co' 0x75 0x6C 0x64 0x20 0x73 0x68 0x6F 0x77 // 'uld show' 0x20 0x6F 0x66 0x66 0x20 0x68 0x69 0x73 // ' off his' 0x20 0x72 0x65 0x61 0x6C 0x20 0x74 0x61 // ' real ta' 0x6C 0x65 0x6E 0x74 0x2E 0x20 0x20 0x42 // 'lent. B' 0x69 0x6C 0x6C 0x79 0x20 0x64 0x72 0x65 // 'illy dre' 0x61 0x6D 0x73 0x20 0x6F 0x66 0x20 0x68 // 'ams of h' 0x61 0x76 0x69 0x6E 0x67 0x20 0x61 0x20 // 'aving a ' 0x63 0x6F 0x6F 0x6C 0x20 0x63 0x61 0x72 // 'cool car' 0x74 0x20 0x77 0x69 0x74 0x68 0x20 0x62 // 't with b' 0x61 0x6C 0x6C 0x6F 0x6F 0x6E 0x73 0x2C // 'alloons,' 0x20 0x74 0x72 0x69 0x6E 0x6B 0x65 0x74 // ' trinket' 0x73 0x2C 0x20 0x70 0x6F 0x70 0x63 0x6F // 's, popco' 0x72 0x6E 0x2C 0x20 0x61 0x6E 0x64 0x20 // 'rn, and ' 0x73 0x77 0x65 0x65 0x74 0x73 0x2E 0x20 // 'sweets. ' 0x20 0x57 0x68 0x65 0x6E 0x20 0x61 0x6E // ' When an' 0x20 0x6F 0x6C 0x64 0x65 0x72 0x20 0x6C // ' older l' 0x61 0x64 0x79 0x20 0x77 0x69 0x74 0x68 // 'ady with' 0x20 0x61 0x20 0x63 0x61 0x74 0x20 0x63 // ' a cat c' 0x6F 0x6D 0x65 0x73 0x20 0x74 0x6F 0x20 // 'omes to ' 0x62 0x75 0x79 0x20 0x73 0x6F 0x6D 0x65 // 'buy some' 0x20 0x63 0x6F 0x74 0x74 0x6F 0x6E 0x20 // ' cotton ' 0x63 0x61 0x6E 0x64 0x79 0x2C 0x20 0x68 // 'candy, h' 0x65 0x72 0x20 0x63 0x61 0x74 0x20 0x72 // 'er cat r' 0x75 0x6E 0x73 0x20 0x61 0x77 0x61 0x79 // 'uns away' 0x2E 0x20 0x20 0x53 0x68 0x65 0x20 0x79 // '. She y' 0x65 0x6C 0x6C 0x73 0x2C 0x20 0x93 0x63 // 'ells, c' 0x61 0x74 0x63 0x68 0x20 0x68 0x69 0x6D // 'atch him' 0x2C 0x20 0x63 0x61 0x74 0x63 0x68 0x20 // ', catch ' 0x68 0x69 0x6D 0x2C 0x20 0x61 0x6C 0x6C // 'him, all' 0x20 0x6D 0x79 0x20 0x6D 0x6F 0x6E 0x65 // ' my mone' 0x79 0x20 0x69 0x73 0x20 0x69 0x6E 0x20 // 'y is in ' 0x68 0x69 0x73 0x20 0x63 0x6F 0x6C 0x6C // 'his coll' 0x61 0x72 0x21 0x94 0x20 0x20 0x54 0x68 // 'ar! Th' 0x65 0x20 0x63 0x61 0x74 0x20 0x72 0x75 // 'e cat ru' 0x6E 0x73 0x20 0x73 0x63 0x61 0x72 0x65 // 'ns scare' 0x64 0x2C 0x20 0x6A 0x75 0x6D 0x70 0x69 // 'd, jumpi' 0x6E 0x67 0x20 0x66 0x72 0x6F 0x6D 0x20 // 'ng from ' 0x62 0x65 0x6E 0x63 0x68 0x20 0x74 0x6F // 'bench to' 0x20 0x62 0x65 0x6E 0x63 0x68 0x2C 0x20 // ' bench, ' 0x63 0x72 0x61 0x77 0x6C 0x69 0x6E 0x67 // 'crawling' 0x20 0x75 0x6E 0x64 0x65 0x72 0x20 0x42 // ' under B' 0x69 0x6C 0x6C 0x79 0x92 0x73 0x20 0x63 // 'illys c' 0x61 0x72 0x74 0x2C 0x20 0x61 0x6E 0x64 // 'art, and' 0x20 0x74 0x68 0x65 0x6E 0x20 0x64 0x61 // ' then da' 0x73 0x68 0x69 0x6E 0x67 0x20 0x6F 0x66 // 'shing of' 0x66 0x20 0x61 0x67 0x61 0x69 0x6E 0x2E // 'f again.' 0x0D 0x0A 0x57 0x69 0x6C 0x6C 0x20 0x42 // '??Will B' 0x69 0x6C 0x6C 0x79 0x92 0x73 0x20 0x64 // 'illys d' 0x61 0x6E 0x63 0x69 0x6E 0x67 0x20 0x74 // 'ancing t' 0x61 0x6C 0x65 0x6E 0x74 0x20 0x68 0x65 // 'alent he' 0x6C 0x70 0x20 0x68 0x69 0x6D 0x20 0x64 // 'lp him d' 0x69 0x73 0x74 0x72 0x61 0x63 0x74 0x20 // 'istract ' 0x74 0x68 0x65 0x20 0x63 0x61 0x74 0x20 // 'the cat ' 0x61 0x6E 0x64 0x20 0x72 0x65 0x63 0x6F // 'and reco' 0x76 0x65 0x72 0x20 0x74 0x68 0x65 0x20 // 'ver the ' 0x77 0x6F 0x6D 0x61 0x6E 0x92 0x73 0x20 // 'womans ' 0x6D 0x6F 0x6E 0x65 0x79 0x3F 0x20 0x20 // 'money? ' 0x41 0x6E 0x64 0x20 0x77 0x69 0x6C 0x6C // 'And will' 0x20 0x73 0x68 0x65 0x20 0x6F 0x66 0x66 // ' she off' 0x65 0x72 0x20 0x68 0x69 0x6D 0x20 0x61 // 'er him a' 0x20 0x72 0x65 0x77 0x61 0x72 0x64 0x3F // ' reward?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3E= ktipbio21 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3E, __HELP_NAME("ktipbio21")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3E, __HELP_NAME("ktipbio21")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3E, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio21" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3E, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_3E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2C 0x02 0x00 0x01 // '????,???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x05 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3E, 0x0) BYTE 0x03 0x03 0x49 0x62 0x6F 0x0D 0x0A 0x42 // '??Ibo??B' 0x69 0x6E 0x6F 0x92 0x73 0x20 0x66 0x61 // 'inos fa' 0x6D 0x69 0x6C 0x79 0x20 0x69 0x73 0x20 // 'mily is ' 0x76 0x65 0x72 0x79 0x20 0x6C 0x61 0x72 // 'very lar' 0x67 0x65 0x20 0x61 0x6E 0x64 0x20 0x74 // 'ge and t' 0x68 0x65 0x79 0x20 0x61 0x6C 0x6C 0x20 // 'hey all ' 0x68 0x61 0x76 0x65 0x20 0x62 0x65 0x61 // 'have bea' 0x75 0x74 0x69 0x66 0x75 0x6C 0x20 0x77 // 'utiful w' 0x68 0x69 0x74 0x65 0x20 0x74 0x65 0x65 // 'hite tee' 0x74 0x68 0x2C 0x20 0x77 0x68 0x69 0x63 // 'th, whic' 0x68 0x20 0x69 0x73 0x20 0x61 0x20 0x67 // 'h is a g' 0x6F 0x6F 0x64 0x20 0x73 0x65 0x6C 0x6C // 'ood sell' 0x69 0x6E 0x67 0x20 0x70 0x6F 0x69 0x6E // 'ing poin' 0x74 0x20 0x69 0x66 0x20 0x79 0x6F 0x75 // 't if you' 0x27 0x72 0x65 0x20 0x69 0x6E 0x20 0x74 // ''re in t' 0x68 0x65 0x20 0x74 0x6F 0x6F 0x74 0x68 // 'he tooth' 0x70 0x61 0x73 0x74 0x65 0x20 0x62 0x75 // 'paste bu' 0x73 0x69 0x6E 0x65 0x73 0x73 0x2E 0x20 // 'siness. ' 0x20 0x57 0x68 0x65 0x6E 0x20 0x68 0x65 // ' When he' 0x20 0x77 0x61 0x73 0x20 0x67 0x72 0x6F // ' was gro' 0x77 0x69 0x6E 0x67 0x20 0x75 0x70 0x2C // 'wing up,' 0x20 0x74 0x68 0x65 0x72 0x65 0x20 0x77 // ' there w' 0x61 0x73 0x20 0x61 0x20 0x62 0x69 0x67 // 'as a big' 0x20 0x6C 0x69 0x6E 0x65 0x20 0x66 0x6F // ' line fo' 0x72 0x20 0x74 0x68 0x65 0x20 0x62 0x61 // 'r the ba' 0x74 0x68 0x72 0x6F 0x6F 0x6D 0x20 0x65 // 'throom e' 0x61 0x63 0x68 0x20 0x6D 0x6F 0x72 0x6E // 'ach morn' 0x69 0x6E 0x67 0x20 0x61 0x6E 0x64 0x20 // 'ing and ' 0x65 0x61 0x63 0x68 0x20 0x6E 0x69 0x67 // 'each nig' 0x68 0x74 0x20 0x77 0x68 0x69 0x6C 0x65 // 'ht while' 0x20 0x42 0x69 0x6E 0x6F 0x20 0x77 0x61 // ' Bino wa' 0x69 0x74 0x65 0x64 0x20 0x74 0x6F 0x20 // 'ited to ' 0x62 0x72 0x75 0x73 0x68 0x20 0x68 0x69 // 'brush hi' 0x73 0x20 0x74 0x65 0x65 0x74 0x68 0x2E // 's teeth.' 0x20 0x20 0x48 0x69 0x73 0x20 0x66 0x61 // ' His fa' 0x6D 0x69 0x6C 0x79 0x20 0x74 0x6F 0x6F // 'mily too' 0x6B 0x20 0x74 0x68 0x61 0x74 0x20 0x74 // 'k that t' 0x69 0x6D 0x65 0x20 0x74 0x6F 0x20 0x73 // 'ime to s' 0x69 0x6E 0x67 0x20 0x74 0x6F 0x67 0x65 // 'ing toge' 0x74 0x68 0x65 0x72 0x20 0x61 0x6E 0x64 // 'ther and' 0x20 0x63 0x6C 0x61 0x70 0x20 0x6F 0x75 // ' clap ou' 0x74 0x20 0x63 0x6F 0x6D 0x70 0x6C 0x65 // 't comple' 0x78 0x20 0x72 0x68 0x79 0x74 0x68 0x6D // 'x rhythm' 0x73 0x2E 0x20 0x20 0x54 0x68 0x65 0x6E // 's. Then' 0x20 0x42 0x69 0x6E 0x6F 0x20 0x61 0x6E // ' Bino an' 0x64 0x20 0x68 0x69 0x73 0x20 0x62 0x72 // 'd his br' 0x6F 0x74 0x68 0x65 0x72 0x73 0x20 0x73 // 'others s' 0x61 0x6E 0x67 0x20 0x74 0x68 0x65 0x73 // 'ang thes' 0x65 0x20 0x73 0x6F 0x6E 0x67 0x73 0x20 // 'e songs ' 0x69 0x6E 0x20 0x74 0x68 0x65 0x20 0x6D // 'in the m' 0x61 0x72 0x6B 0x65 0x74 0x70 0x6C 0x61 // 'arketpla' 0x63 0x65 0x20 0x77 0x68 0x69 0x6C 0x65 // 'ce while' 0x20 0x68 0x69 0x73 0x20 0x66 0x61 0x74 // ' his fat' 0x68 0x65 0x72 0x20 0x73 0x6F 0x6C 0x64 // 'her sold' 0x20 0x74 0x6F 0x6F 0x74 0x68 0x70 0x61 // ' toothpa' 0x73 0x74 0x65 0x2E 0x20 0x20 0x54 0x68 // 'ste. Th' 0x65 0x79 0x20 0x61 0x6C 0x77 0x61 0x79 // 'ey alway' 0x73 0x20 0x67 0x61 0x74 0x68 0x65 0x72 // 's gather' 0x65 0x64 0x20 0x71 0x75 0x69 0x74 0x65 // 'ed quite' 0x20 0x61 0x20 0x63 0x72 0x6F 0x77 0x64 // ' a crowd' 0x2E 0x20 0x20 0x42 0x69 0x6E 0x6F 0x20 // '. Bino ' 0x6C 0x6F 0x76 0x65 0x64 0x20 0x74 0x68 // 'loved th' 0x65 0x20 0x61 0x74 0x74 0x65 0x6E 0x74 // 'e attent' 0x69 0x6F 0x6E 0x2C 0x20 0x61 0x6E 0x64 // 'ion, and' 0x20 0x64 0x65 0x63 0x69 0x64 0x65 0x64 // ' decided' 0x20 0x74 0x68 0x61 0x74 0x20 0x61 0x20 // ' that a ' 0x6C 0x69 0x66 0x65 0x20 0x61 0x73 0x20 // 'life as ' 0x61 0x6E 0x20 0x61 0x63 0x74 0x6F 0x72 // 'an actor' 0x20 0x77 0x61 0x73 0x20 0x66 0x6F 0x72 // ' was for' 0x20 0x68 0x69 0x6D 0x2E 0x20 // ' him. ' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3F= ktipbio22 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3F, __HELP_NAME("ktipbio22")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3F, __HELP_NAME("ktipbio22")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_44=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3F, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio22" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_44=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x26 0x01 0x00 0x00 // '????&???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_44=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_44, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x3F 0x03 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xDB 0x02 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_44=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_44, 0x0) BYTE 0x03 0x03 0x54 0x75 0x74 0x6F 0x72 0x0D // '??Tutor?' 0x0A 0x42 0x69 0x6E 0x6F 0x20 0x74 0x75 // '?Bino tu' 0x74 0x6F 0x72 0x65 0x64 0x20 0x6D 0x61 // 'tored ma' 0x6E 0x79 0x20 0x79 0x6F 0x75 0x6E 0x67 // 'ny young' 0x65 0x72 0x20 0x62 0x72 0x6F 0x74 0x68 // 'er broth' 0x65 0x72 0x73 0x20 0x61 0x6E 0x64 0x20 // 'ers and ' 0x63 0x6F 0x75 0x73 0x69 0x6E 0x73 0x20 // 'cousins ' 0x69 0x6E 0x20 0x68 0x69 0x73 0x20 0x66 // 'in his f' 0x61 0x6D 0x69 0x6C 0x79 0x20 0x77 0x68 // 'amily wh' 0x69 0x6C 0x65 0x20 0x74 0x68 0x65 0x79 // 'ile they' 0x20 0x77 0x65 0x72 0x65 0x20 0x69 0x6E // ' were in' 0x20 0x73 0x63 0x68 0x6F 0x6F 0x6C 0x2E // ' school.' 0x20 0x20 0x48 0x65 0x20 0x77 0x6F 0x75 // ' He wou' 0x6C 0x64 0x20 0x6C 0x69 0x6B 0x65 0x20 // 'ld like ' 0x74 0x6F 0x20 0x70 0x6C 0x61 0x79 0x20 // 'to play ' 0x74 0x68 0x65 0x20 0x70 0x61 0x72 0x74 // 'the part' 0x20 0x6F 0x66 0x20 0x61 0x20 0x74 0x75 // ' of a tu' 0x74 0x6F 0x72 0x20 0x69 0x6E 0x20 0x61 // 'tor in a' 0x20 0x6D 0x6F 0x76 0x69 0x65 0x20 0x62 // ' movie b' 0x65 0x63 0x61 0x75 0x73 0x65 0x20 0x68 // 'ecause h' 0x65 0x20 0x63 0x6F 0x75 0x6C 0x64 0x20 // 'e could ' 0x74 0x65 0x61 0x63 0x68 0x20 0x61 0x62 // 'teach ab' 0x6F 0x75 0x74 0x20 0x61 0x6E 0x63 0x69 // 'out anci' 0x65 0x6E 0x74 0x20 0x70 0x65 0x6F 0x70 // 'ent peop' 0x6C 0x65 0x20 0x61 0x6E 0x64 0x20 0x70 // 'le and p' 0x6C 0x61 0x63 0x65 0x73 0x20 0x62 0x79 // 'laces by' 0x20 0x61 0x63 0x74 0x75 0x61 0x6C 0x6C // ' actuall' 0x79 0x20 0x67 0x6F 0x69 0x6E 0x67 0x20 // 'y going ' 0x74 0x68 0x65 0x72 0x65 0x2C 0x20 0x6F // 'there, o' 0x6E 0x20 0x61 0x20 0x70 0x6C 0x61 0x6E // 'n a plan' 0x65 0x21 0x20 0x20 0x4B 0x69 0x64 0x73 // 'e! Kids' 0x20 0x77 0x6F 0x75 0x6C 0x64 0x20 0x6C // ' would l' 0x6F 0x76 0x65 0x20 0x74 0x6F 0x20 0x68 // 'ove to h' 0x61 0x76 0x65 0x20 0x42 0x69 0x6E 0x6F // 'ave Bino' 0x20 0x61 0x73 0x20 0x74 0x68 0x65 0x69 // ' as thei' 0x72 0x20 0x74 0x75 0x74 0x6F 0x72 0x97 // 'r tutor' 0x77 0x69 0x74 0x68 0x20 0x68 0x69 0x6D // 'with him' 0x2C 0x20 0x6C 0x65 0x61 0x72 0x6E 0x69 // ', learni' 0x6E 0x67 0x20 0x69 0x73 0x20 0x61 0x6E // 'ng is an' 0x20 0x61 0x64 0x76 0x65 0x6E 0x74 0x75 // ' adventu' 0x72 0x65 0x2E 0x20 0x0D 0x0A 0x42 0x69 // 're. ??Bi' 0x6E 0x6F 0x20 0x77 0x6F 0x75 0x6C 0x64 // 'no would' 0x20 0x76 0x69 0x73 0x69 0x74 0x20 0x74 // ' visit t' 0x68 0x65 0x20 0x53 0x70 0x6F 0x6F 0x6B // 'he Spook' 0x79 0x20 0x68 0x6F 0x75 0x73 0x65 0x20 // 'y house ' 0x74 0x6F 0x20 0x62 0x65 0x20 0x74 0x68 // 'to be th' 0x65 0x69 0x72 0x20 0x74 0x75 0x74 0x6F // 'eir tuto' 0x72 0x2E 0x20 0x20 0x46 0x69 0x72 0x73 // 'r. Firs' 0x74 0x20 0x74 0x68 0x65 0x79 0x20 0x77 // 't they w' 0x6F 0x75 0x6C 0x64 0x20 0x74 0x72 0x61 // 'ould tra' 0x76 0x65 0x6C 0x20 0x74 0x6F 0x20 0x61 // 'vel to a' 0x20 0x70 0x72 0x65 0x68 0x69 0x73 0x74 // ' prehist' 0x6F 0x72 0x69 0x63 0x20 0x63 0x61 0x76 // 'oric cav' 0x65 0x20 0x77 0x68 0x65 0x72 0x65 0x20 // 'e where ' 0x61 0x20 0x73 0x63 0x69 0x65 0x6E 0x74 // 'a scient' 0x69 0x73 0x74 0x20 0x74 0x65 0x6C 0x6C // 'ist tell' 0x73 0x20 0x74 0x68 0x65 0x6D 0x20 0x61 // 's them a' 0x62 0x6F 0x75 0x74 0x20 0x63 0x61 0x76 // 'bout cav' 0x65 0x20 0x70 0x61 0x69 0x6E 0x74 0x69 // 'e painti' 0x6E 0x67 0x73 0x2E 0x20 0x20 0x42 0x75 // 'ngs. Bu' 0x74 0x20 0x74 0x68 0x65 0x72 0x65 0x20 // 't there ' 0x69 0x73 0x20 0x61 0x20 0x62 0x69 0x67 // 'is a big' 0x20 0x65 0x78 0x70 0x6C 0x6F 0x73 0x69 // ' explosi' 0x6F 0x6E 0x20 0x61 0x6E 0x64 0x20 0x74 // 'on and t' 0x68 0x65 0x79 0x20 0x68 0x61 0x76 0x65 // 'hey have' 0x20 0x74 0x6F 0x20 0x72 0x75 0x6E 0x20 // ' to run ' 0x74 0x6F 0x20 0x67 0x65 0x74 0x20 0x62 // 'to get b' 0x61 0x63 0x6B 0x20 0x74 0x6F 0x20 0x74 // 'ack to t' 0x68 0x65 0x20 0x70 0x6C 0x61 0x6E 0x65 // 'he plane' 0x2E 0x20 0x0D 0x0A 0x4E 0x65 0x78 0x74 // '. ??Next' 0x20 0x74 0x68 0x65 0x79 0x20 0x6C 0x61 // ' they la' 0x6E 0x64 0x20 0x6E 0x65 0x61 0x72 0x20 // 'nd near ' 0x61 0x20 0x74 0x72 0x6F 0x70 0x69 0x63 // 'a tropic' 0x61 0x6C 0x20 0x68 0x75 0x74 0x20 0x77 // 'al hut w' 0x68 0x65 0x72 0x65 0x20 0x74 0x68 0x65 // 'here the' 0x79 0x20 0x61 0x72 0x65 0x20 0x61 0x73 // 'y are as' 0x6B 0x65 0x64 0x20 0x74 0x6F 0x20 0x66 // 'ked to f' 0x69 0x6E 0x64 0x20 0x61 0x20 0x74 0x72 // 'ind a tr' 0x65 0x61 0x73 0x75 0x72 0x65 0x20 0x63 // 'easure c' 0x68 0x65 0x73 0x74 0x20 0x6C 0x65 0x66 // 'hest lef' 0x74 0x20 0x62 0x79 0x20 0x61 0x6E 0x63 // 't by anc' 0x69 0x65 0x6E 0x74 0x20 0x65 0x78 0x70 // 'ient exp' 0x6C 0x6F 0x72 0x65 0x72 0x73 0x2E 0x20 // 'lorers. ' 0x20 0x42 0x75 0x74 0x20 0x74 0x68 0x65 // ' But the' 0x79 0x20 0x6F 0x6E 0x6C 0x79 0x20 0x66 // 'y only f' 0x69 0x6E 0x64 0x20 0x61 0x20 0x63 0x68 // 'ind a ch' 0x61 0x74 0x74 0x65 0x72 0x69 0x6E 0x67 // 'attering' 0x20 0x73 0x6B 0x75 0x6C 0x6C 0x20 0x74 // ' skull t' 0x68 0x61 0x74 0x20 0x74 0x65 0x6C 0x6C // 'hat tell' 0x73 0x20 0x74 0x68 0x65 0x6D 0x20 0x74 // 's them t' 0x6F 0x20 0x67 0x65 0x74 0x20 0x6F 0x75 // 'o get ou' 0x74 0x21 0x20 0x0D 0x0A 0x57 0x69 0x6C // 't! ??Wil' 0x6C 0x20 0x42 0x69 0x6E 0x6F 0x20 0x61 // 'l Bino a' 0x6E 0x64 0x20 0x68 0x69 0x73 0x20 0x73 // 'nd his s' 0x74 0x75 0x64 0x65 0x6E 0x74 0x73 0x20 // 'tudents ' 0x73 0x74 0x61 0x79 0x20 0x74 0x6F 0x20 // 'stay to ' 0x66 0x69 0x6E 0x64 0x20 0x74 0x68 0x65 // 'find the' 0x20 0x74 0x72 0x65 0x61 0x73 0x75 0x72 // ' treasur' 0x65 0x20 0x63 0x68 0x65 0x73 0x74 0x20 // 'e chest ' 0x6F 0x72 0x20 0x77 0x69 0x6C 0x6C 0x20 // 'or will ' 0x74 0x68 0x65 0x79 0x20 0x67 0x6F 0x20 // 'they go ' 0x6F 0x6E 0x20 0x74 0x6F 0x20 0x74 0x68 // 'on to th' 0x65 0x20 0x6E 0x65 0x78 0x74 0x20 0x6C // 'e next l' 0x6F 0x63 0x61 0x74 0x69 0x6F 0x6E 0x3F // 'ocation?' 0x20 // ' ' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_40= ktipbio23 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_40, __HELP_NAME("ktipbio23")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_40, __HELP_NAME("ktipbio23")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_40, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio23" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_40, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x8B 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xC7 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x03 0x03 0x53 0x74 0x72 0x65 0x65 0x74 // '??Street' 0x20 0x45 0x6E 0x74 0x65 0x72 0x74 0x61 // ' Enterta' 0x69 0x6E 0x65 0x72 0x0D 0x0A 0x0A 0x42 // 'iner???B' 0x61 0x73 0x65 0x64 0x20 0x6F 0x6E 0x20 // 'ased on ' 0x68 0x69 0x73 0x20 0x65 0x78 0x70 0x65 // 'his expe' 0x72 0x69 0x65 0x6E 0x63 0x65 0x20 0x69 // 'rience i' 0x6E 0x20 0x74 0x68 0x65 0x20 0x6D 0x61 // 'n the ma' 0x72 0x6B 0x65 0x74 0x70 0x6C 0x61 0x63 // 'rketplac' 0x65 0x73 0x20 0x6F 0x66 0x20 0x49 0x62 // 'es of Ib' 0x6F 0x6C 0x61 0x6E 0x64 0x2C 0x20 0x42 // 'oland, B' 0x69 0x6E 0x6F 0x20 0x77 0x6F 0x75 0x6C // 'ino woul' 0x64 0x20 0x62 0x65 0x20 0x61 0x6E 0x20 // 'd be an ' 0x65 0x78 0x63 0x65 0x6C 0x6C 0x65 0x6E // 'excellen' 0x74 0x20 0x73 0x74 0x72 0x65 0x65 0x74 // 't street' 0x20 0x65 0x6E 0x74 0x65 0x72 0x74 0x61 // ' enterta' 0x69 0x6E 0x65 0x72 0x20 0x69 0x6E 0x20 // 'iner in ' 0x61 0x20 0x6D 0x6F 0x76 0x69 0x65 0x2E // 'a movie.' 0x20 0x20 0x43 0x72 0x6F 0x77 0x64 0x73 // ' Crowds' 0x20 0x67 0x61 0x74 0x68 0x65 0x72 0x20 // ' gather ' 0x61 0x72 0x6F 0x75 0x6E 0x64 0x20 0x68 // 'around h' 0x69 0x6D 0x20 0x61 0x6E 0x64 0x20 0x74 // 'im and t' 0x72 0x79 0x20 0x74 0x6F 0x20 0x69 0x6D // 'ry to im' 0x69 0x74 0x61 0x74 0x65 0x20 0x68 0x69 // 'itate hi' 0x73 0x20 0x64 0x61 0x6E 0x63 0x65 0x20 // 's dance ' 0x6D 0x6F 0x76 0x65 0x73 0x2E 0x20 0x0D // 'moves. ?' 0x0A 0x42 0x75 0x74 0x20 0x77 0x68 0x65 // '?But whe' 0x6E 0x20 0x61 0x6E 0x20 0x61 0x6C 0x69 // 'n an ali' 0x65 0x6E 0x20 0x73 0x70 0x61 0x63 0x65 // 'en space' 0x73 0x68 0x69 0x70 0x20 0x6C 0x61 0x6E // 'ship lan' 0x64 0x73 0x20 0x69 0x6E 0x20 0x74 0x68 // 'ds in th' 0x65 0x20 0x6D 0x69 0x64 0x64 0x6C 0x65 // 'e middle' 0x20 0x6F 0x66 0x20 0x74 0x68 0x65 0x20 // ' of the ' 0x73 0x74 0x72 0x65 0x65 0x74 0x2C 0x20 // 'street, ' 0x61 0x6E 0x64 0x20 0x74 0x77 0x6F 0x20 // 'and two ' 0x61 0x6C 0x69 0x65 0x6E 0x20 0x72 0x6F // 'alien ro' 0x62 0x6F 0x74 0x73 0x20 0x77 0x61 0x6E // 'bots wan' 0x74 0x20 0x42 0x69 0x6E 0x6F 0x20 0x74 // 't Bino t' 0x6F 0x20 0x63 0x6F 0x6D 0x65 0x20 0x74 // 'o come t' 0x6F 0x20 0x74 0x68 0x65 0x69 0x72 0x20 // 'o their ' 0x70 0x6C 0x61 0x6E 0x65 0x74 0x20 0x74 // 'planet t' 0x6F 0x20 0x74 0x65 0x61 0x63 0x68 0x20 // 'o teach ' 0x65 0x76 0x65 0x72 0x79 0x6F 0x6E 0x65 // 'everyone' 0x20 0x74 0x68 0x65 0x72 0x65 0x20 0x68 // ' there h' 0x6F 0x77 0x20 0x74 0x6F 0x20 0x64 0x61 // 'ow to da' 0x6E 0x63 0x65 0x2C 0x20 0x63 0x61 0x6E // 'nce, can' 0x20 0x68 0x65 0x20 0x72 0x75 0x6E 0x20 // ' he run ' 0x74 0x68 0x72 0x6F 0x75 0x67 0x68 0x20 // 'through ' 0x74 0x68 0x65 0x20 0x6D 0x61 0x6C 0x6C // 'the mall' 0x20 0x61 0x6E 0x64 0x20 0x65 0x73 0x63 // ' and esc' 0x61 0x70 0x65 0x3F 0x20 // 'ape? ' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_41= ktipbio24 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_41, __HELP_NAME("ktipbio24")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_41, __HELP_NAME("ktipbio24")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_41=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_41, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio24" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_41=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_41, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_41=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_41, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x72 0x01 0x00 0x01 // '????r???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x1D 0x01 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_41=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_41, 0x0) BYTE 0x03 0x03 0x4D 0x75 0x73 0x69 0x63 0x20 // '??Music ' 0x4D 0x61 0x73 0x74 0x65 0x72 0x0D 0x0A // 'Master??' 0x42 0x69 0x6E 0x6F 0x20 0x77 0x6F 0x75 // 'Bino wou' 0x6C 0x64 0x20 0x6C 0x6F 0x76 0x65 0x20 // 'ld love ' 0x74 0x6F 0x20 0x70 0x6C 0x61 0x79 0x20 // 'to play ' 0x74 0x68 0x65 0x20 0x70 0x61 0x72 0x74 // 'the part' 0x20 0x6F 0x66 0x20 0x61 0x20 0x66 0x61 // ' of a fa' 0x6D 0x6F 0x75 0x73 0x20 0x6D 0x75 0x73 // 'mous mus' 0x69 0x63 0x69 0x61 0x6E 0x20 0x77 0x68 // 'ician wh' 0x6F 0x20 0x67 0x65 0x74 0x73 0x20 0x66 // 'o gets f' 0x6F 0x6C 0x6C 0x6F 0x77 0x65 0x64 0x20 // 'ollowed ' 0x62 0x79 0x20 0x66 0x61 0x6E 0x73 0x20 // 'by fans ' 0x65 0x76 0x65 0x72 0x79 0x77 0x68 0x65 // 'everywhe' 0x72 0x65 0x20 0x61 0x6E 0x64 0x20 0x64 // 're and d' 0x6F 0x65 0x73 0x6E 0x92 0x74 0x20 0x68 // 'oesnt h' 0x61 0x76 0x65 0x20 0x61 0x20 0x6D 0x6F // 'ave a mo' 0x6D 0x65 0x6E 0x74 0x20 0x74 0x6F 0x20 // 'ment to ' 0x68 0x69 0x6D 0x73 0x65 0x6C 0x66 0x2E // 'himself.' 0x20 0x20 0x57 0x68 0x65 0x6E 0x20 0x6F // ' When o' 0x6E 0x65 0x20 0x6F 0x66 0x20 0x74 0x68 // 'ne of th' 0x65 0x20 0x64 0x61 0x6E 0x63 0x65 0x72 // 'e dancer' 0x73 0x20 0x66 0x72 0x6F 0x6D 0x20 0x68 // 's from h' 0x69 0x73 0x20 0x62 0x61 0x6E 0x64 0x20 // 'is band ' 0x67 0x65 0x74 0x73 0x20 0x73 0x69 0x63 // 'gets sic' 0x6B 0x20 0x61 0x6E 0x64 0x20 0x42 0x69 // 'k and Bi' 0x6E 0x6F 0x20 0x6D 0x75 0x73 0x74 0x20 // 'no must ' 0x66 0x69 0x6E 0x64 0x20 0x61 0x20 0x72 // 'find a r' 0x65 0x70 0x6C 0x61 0x63 0x65 0x6D 0x65 // 'eplaceme' 0x6E 0x74 0x2C 0x20 0x68 0x65 0x20 0x66 // 'nt, he f' 0x6C 0x69 0x65 0x73 0x20 0x61 0x6C 0x6C // 'lies all' 0x20 0x6F 0x76 0x65 0x72 0x20 0x74 0x68 // ' over th' 0x65 0x20 0x77 0x6F 0x72 0x6C 0x64 0x20 // 'e world ' 0x74 0x6F 0x20 0x68 0x6F 0x6C 0x64 0x20 // 'to hold ' 0x74 0x72 0x79 0x6F 0x75 0x74 0x73 0x20 // 'tryouts ' 0x66 0x6F 0x72 0x20 0x64 0x61 0x6E 0x63 // 'for danc' 0x65 0x72 0x73 0x2E 0x20 0x0D 0x0A 0x50 // 'ers. ??P' 0x65 0x6F 0x70 0x6C 0x65 0x20 0x6C 0x69 // 'eople li' 0x6E 0x65 0x20 0x75 0x70 0x20 0x66 0x6F // 'ne up fo' 0x72 0x20 0x6D 0x69 0x6C 0x65 0x73 0x20 // 'r miles ' 0x61 0x6E 0x64 0x20 0x6D 0x69 0x6C 0x65 // 'and mile' 0x73 0x20 0x74 0x6F 0x20 0x64 0x61 0x6E // 's to dan' 0x63 0x65 0x20 0x69 0x6E 0x20 0x66 0x72 // 'ce in fr' 0x6F 0x6E 0x74 0x20 0x6F 0x66 0x20 0x42 // 'ont of B' 0x69 0x6E 0x6F 0x2E 0x20 0x57 0x68 0x6F // 'ino. Who' 0x20 0x77 0x69 0x6C 0x6C 0x20 0x67 0x65 // ' will ge' 0x74 0x20 0x74 0x68 0x65 0x20 0x70 0x61 // 't the pa' 0x72 0x74 0x3F 0x20 // 'rt? ' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_42= ktipbio25 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_42, __HELP_NAME("ktipbio25")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_42, __HELP_NAME("ktipbio25")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_40=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_42, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio25" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_40=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_42, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_40=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_40, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x12 0x02 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xC2 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_40=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_40, 0x0) BYTE 0x03 0x03 0x64 0x69 0x73 0x63 0x6F 0x76 // '??discov' 0x65 0x72 0x65 0x64 0x0D 0x0A 0x4C 0x61 // 'ered??La' 0x74 0x65 0x20 0x61 0x74 0x20 0x6E 0x69 // 'te at ni' 0x67 0x68 0x74 0x2C 0x20 0x42 0x6F 0x20 // 'ght, Bo ' 0x77 0x6F 0x75 0x6C 0x64 0x20 0x77 0x72 // 'would wr' 0x69 0x74 0x65 0x20 0x73 0x74 0x6F 0x72 // 'ite stor' 0x69 0x65 0x73 0x20 0x61 0x62 0x6F 0x75 // 'ies abou' 0x74 0x20 0x41 0x66 0x72 0x69 0x63 0x61 // 't Africa' 0x20 0x61 0x6E 0x64 0x20 0x69 0x74 0x73 // ' and its' 0x20 0x70 0x65 0x6F 0x70 0x6C 0x65 0x2E // ' people.' 0x20 0x20 0x48 0x65 0x92 0x64 0x20 0x73 // ' Hed s' 0x65 0x6E 0x64 0x20 0x74 0x68 0x65 0x20 // 'end the ' 0x73 0x74 0x6F 0x72 0x69 0x65 0x73 0x20 // 'stories ' 0x74 0x6F 0x20 0x4E 0x65 0x77 0x20 0x59 // 'to New Y' 0x6F 0x72 0x6B 0x20 0x61 0x6E 0x64 0x20 // 'ork and ' 0x43 0x61 0x6C 0x69 0x66 0x6F 0x72 0x6E // 'Californ' 0x69 0x61 0x20 0x74 0x6F 0x20 0x73 0x65 // 'ia to se' 0x65 0x20 0x69 0x66 0x20 0x61 0x6E 0x79 // 'e if any' 0x6F 0x6E 0x65 0x20 0x77 0x6F 0x75 0x6C // 'one woul' 0x64 0x20 0x70 0x75 0x62 0x6C 0x69 0x73 // 'd publis' 0x68 0x20 0x74 0x68 0x65 0x6D 0x20 0x6F // 'h them o' 0x72 0x20 0x6D 0x61 0x6B 0x65 0x20 0x74 // 'r make t' 0x68 0x65 0x6D 0x20 0x69 0x6E 0x74 0x6F // 'hem into' 0x20 0x61 0x20 0x6D 0x6F 0x76 0x69 0x65 // ' a movie' 0x2E 0x20 0x0D 0x0A 0x4F 0x6E 0x65 0x20 // '. ??One ' 0x64 0x61 0x79 0x2C 0x20 0x68 0x65 0x20 // 'day, he ' 0x67 0x6F 0x74 0x20 0x61 0x20 0x6C 0x65 // 'got a le' 0x74 0x74 0x65 0x72 0x20 0x66 0x72 0x6F // 'tter fro' 0x6D 0x20 0x61 0x20 0x62 0x6F 0x6F 0x6B // 'm a book' 0x20 0x63 0x6F 0x6D 0x70 0x61 0x6E 0x79 // ' company' 0x20 0x74 0x68 0x61 0x74 0x20 0x77 0x61 // ' that wa' 0x6E 0x74 0x65 0x64 0x20 0x74 0x6F 0x20 // 'nted to ' 0x6D 0x61 0x6B 0x65 0x20 0x6F 0x6E 0x65 // 'make one' 0x20 0x6F 0x66 0x20 0x68 0x69 0x73 0x20 // ' of his ' 0x73 0x74 0x6F 0x72 0x69 0x65 0x73 0x20 // 'stories ' 0x69 0x6E 0x74 0x6F 0x20 0x61 0x20 0x62 // 'into a b' 0x6F 0x6F 0x6B 0x2E 0x20 0x20 0x42 0x6F // 'ook. Bo' 0x20 0x66 0x6C 0x65 0x77 0x20 0x74 0x6F // ' flew to' 0x20 0x4E 0x65 0x77 0x20 0x59 0x6F 0x72 // ' New Yor' 0x6B 0x2C 0x20 0x61 0x6E 0x64 0x20 0x69 // 'k, and i' 0x6E 0x20 0x54 0x69 0x6D 0x65 0x73 0x20 // 'n Times ' 0x53 0x71 0x75 0x61 0x72 0x65 0x20 0x68 // 'Square h' 0x65 0x20 0x6D 0x65 0x74 0x20 0x74 0x68 // 'e met th' 0x65 0x20 0x64 0x69 0x72 0x65 0x63 0x74 // 'e direct' 0x6F 0x72 0x20 0x61 0x6E 0x64 0x20 0x70 // 'or and p' 0x72 0x6F 0x64 0x75 0x63 0x65 0x72 0x20 // 'roducer ' 0x4D 0x63 0x5A 0x65 0x65 0x2C 0x20 0x77 // 'McZee, w' 0x68 0x6F 0x20 0x77 0x61 0x6E 0x74 0x65 // 'ho wante' 0x64 0x20 0x74 0x6F 0x20 0x6D 0x61 0x6B // 'd to mak' 0x65 0x20 0x42 0x6F 0x27 0x73 0x20 0x73 // 'e Bo's s' 0x74 0x6F 0x72 0x79 0x20 0x69 0x6E 0x74 // 'tory int' 0x6F 0x20 0x61 0x20 0x6D 0x6F 0x76 0x69 // 'o a movi' 0x65 0x2C 0x20 0x74 0x6F 0x6F 0x2E 0x20 // 'e, too. ' 0x20 0x4D 0x63 0x5A 0x65 0x65 0x20 0x74 // ' McZee t' 0x6F 0x6F 0x6B 0x20 0x6F 0x6E 0x65 0x20 // 'ook one ' 0x6C 0x6F 0x6F 0x6B 0x20 0x61 0x74 0x20 // 'look at ' 0x68 0x69 0x6D 0x20 0x61 0x6E 0x64 0x20 // 'him and ' 0x72 0x65 0x61 0x6C 0x69 0x7A 0x65 0x64 // 'realized' 0x20 0x42 0x6F 0x20 0x77 0x6F 0x75 0x6C // ' Bo woul' 0x64 0x20 0x61 0x6C 0x73 0x6F 0x20 0x62 // 'd also b' 0x65 0x20 0x74 0x68 0x65 0x20 0x70 0x65 // 'e the pe' 0x72 0x66 0x65 0x63 0x74 0x20 0x70 0x65 // 'rfect pe' 0x72 0x73 0x6F 0x6E 0x20 0x74 0x6F 0x20 // 'rson to ' 0x73 0x74 0x61 0x72 0x20 0x69 0x6E 0x20 // 'star in ' 0x74 0x68 0x65 0x20 0x6D 0x6F 0x76 0x69 // 'the movi' 0x65 0x97 0x61 0x73 0x20 0x68 0x69 0x6D // 'eas him' 0x73 0x65 0x6C 0x66 // 'self' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_43= ktipbio26 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_43, __HELP_NAME("ktipbio26")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_43, __HELP_NAME("ktipbio26")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_43=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_43, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio26" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_43=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_43, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_43=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_43, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x5D 0x02 0x00 0x01 // '????]???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xFF 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_43=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_43, 0x0) BYTE 0x03 0x03 0x44 0x65 0x6E 0x74 0x69 0x73 // '??Dentis' 0x74 0x0D 0x0A 0x42 0x6F 0x20 0x69 0x6D // 't??Bo im' 0x61 0x67 0x69 0x6E 0x65 0x73 0x20 0x68 // 'agines h' 0x65 0x20 0x63 0x6F 0x75 0x6C 0x64 0x20 // 'e could ' 0x70 0x6C 0x61 0x79 0x20 0x61 0x20 0x64 // 'play a d' 0x65 0x6E 0x74 0x69 0x73 0x74 0x20 0x69 // 'entist i' 0x6E 0x20 0x61 0x20 0x73 0x63 0x61 0x72 // 'n a scar' 0x79 0x20 0x6D 0x6F 0x76 0x69 0x65 0x2E // 'y movie.' 0x20 0x20 0x41 0x66 0x74 0x65 0x72 0x20 // ' After ' 0x6B 0x69 0x64 0x73 0x20 0x68 0x61 0x64 // 'kids had' 0x20 0x67 0x6F 0x6E 0x65 0x20 0x74 0x68 // ' gone th' 0x72 0x6F 0x75 0x67 0x68 0x20 0x61 0x20 // 'rough a ' 0x68 0x61 0x75 0x6E 0x74 0x65 0x64 0x20 // 'haunted ' 0x68 0x6F 0x75 0x73 0x65 0x20 0x61 0x6E // 'house an' 0x64 0x20 0x65 0x61 0x74 0x65 0x6E 0x20 // 'd eaten ' 0x6C 0x6F 0x74 0x73 0x20 0x6F 0x66 0x20 // 'lots of ' 0x63 0x61 0x6E 0x64 0x79 0x2C 0x20 0x68 // 'candy, h' 0x65 0x27 0x64 0x20 0x67 0x72 0x65 0x65 // 'e'd gree' 0x74 0x20 0x74 0x68 0x65 0x6D 0x20 0x62 // 't them b' 0x79 0x20 0x73 0x61 0x79 0x69 0x6E 0x67 // 'y saying' 0x2C 0x20 0x93 0x59 0x6F 0x2C 0x20 0x6F // ', Yo, o' 0x70 0x65 0x6E 0x20 0x77 0x69 0x64 0x65 // 'pen wide' 0x2E 0x94 0x20 0x20 0x54 0x68 0x65 0x20 // '. The ' 0x6B 0x69 0x64 0x20 0x77 0x6F 0x75 0x6C // 'kid woul' 0x64 0x20 0x6C 0x6F 0x6F 0x6B 0x20 0x75 // 'd look u' 0x70 0x20 0x61 0x74 0x20 0x68 0x69 0x6D // 'p at him' 0x2C 0x20 0x61 0x6E 0x64 0x20 0x68 0x65 // ', and he' 0x20 0x77 0x6F 0x75 0x6C 0x64 0x20 0x6F // ' would o' 0x70 0x65 0x6E 0x20 0x74 0x68 0x65 0x20 // 'pen the ' 0x6B 0x69 0x64 0x92 0x73 0x20 0x6D 0x6F // 'kids mo' 0x75 0x74 0x68 0x20 0x77 0x69 0x74 0x68 // 'uth with' 0x20 0x68 0x69 0x73 0x20 0x62 0x6F 0x78 // ' his box' 0x69 0x6E 0x67 0x20 0x67 0x6C 0x6F 0x76 // 'ing glov' 0x65 0x73 0x2E 0x20 0x20 0x42 0x75 0x74 // 'es. But' 0x20 0x6A 0x75 0x73 0x74 0x20 0x61 0x73 // ' just as' 0x20 0x74 0x68 0x65 0x20 0x66 0x69 0x72 // ' the fir' 0x73 0x74 0x20 0x6B 0x69 0x64 0x20 0x73 // 'st kid s' 0x74 0x65 0x70 0x73 0x20 0x75 0x70 0x20 // 'teps up ' 0x74 0x6F 0x20 0x42 0x6F 0x2C 0x20 0x74 // 'to Bo, t' 0x68 0x65 0x20 0x65 0x76 0x69 0x6C 0x20 // 'he evil ' 0x74 0x6F 0x6F 0x74 0x68 0x20 0x66 0x61 // 'tooth fa' 0x69 0x72 0x79 0x2C 0x20 0x64 0x72 0x65 // 'iry, dre' 0x73 0x73 0x65 0x64 0x20 0x61 0x73 0x20 // 'ssed as ' 0x61 0x6E 0x20 0x6F 0x6C 0x64 0x20 0x77 // 'an old w' 0x6F 0x6D 0x61 0x6E 0x20 0x6E 0x61 0x6D // 'oman nam' 0x65 0x64 0x20 0x4D 0x61 0x72 0x74 0x68 // 'ed Marth' 0x61 0x2C 0x20 0x64 0x61 0x6E 0x63 0x65 // 'a, dance' 0x73 0x20 0x69 0x6E 0x20 0x61 0x6E 0x64 // 's in and' 0x20 0x6B 0x61 0x72 0x61 0x74 0x65 0x20 // ' karate ' 0x6B 0x69 0x63 0x6B 0x73 0x20 0x42 0x6F // 'kicks Bo' 0x20 0x6F 0x75 0x74 0x20 0x6F 0x66 0x20 // ' out of ' 0x74 0x68 0x65 0x20 0x77 0x61 0x79 0x2E // 'the way.' 0x20 0x20 0x42 0x6F 0x20 0x66 0x61 0x69 // ' Bo fai' 0x6E 0x74 0x73 0x20 0x74 0x6F 0x20 0x74 // 'nts to t' 0x68 0x65 0x20 0x67 0x72 0x6F 0x75 0x6E // 'he groun' 0x64 0x2E 0x20 0x20 0x4D 0x61 0x72 0x74 // 'd. Mart' 0x68 0x61 0x20 0x77 0x61 0x6C 0x6B 0x73 // 'ha walks' 0x20 0x6F 0x76 0x65 0x72 0x20 0x73 0x6C // ' over sl' 0x6F 0x77 0x6C 0x79 0x2C 0x20 0x70 0x6C // 'owly, pl' 0x61 0x6E 0x6E 0x69 0x6E 0x67 0x20 0x74 // 'anning t' 0x6F 0x20 0x70 0x75 0x6C 0x6C 0x20 0x61 // 'o pull a' 0x6C 0x6C 0x20 0x6F 0x66 0x20 0x74 0x68 // 'll of th' 0x65 0x20 0x6B 0x69 0x64 0x92 0x73 0x20 // 'e kids ' 0x74 0x65 0x65 0x74 0x68 0x2E 0x20 0x0D // 'teeth. ?' 0x0A 0x57 0x68 0x6F 0x20 0x77 0x69 0x6C // '?Who wil' 0x6C 0x20 0x73 0x74 0x6F 0x70 0x20 0x74 // 'l stop t' 0x68 0x65 0x20 0x77 0x69 0x63 0x6B 0x65 // 'he wicke' 0x64 0x20 0x74 0x6F 0x6F 0x74 0x68 0x20 // 'd tooth ' 0x66 0x61 0x69 0x72 0x79 0x3F 0x20 0x20 // 'fairy? ' 0x49 0x73 0x20 0x42 0x6F 0x20 0x74 0x6F // 'Is Bo to' 0x6F 0x20 0x62 0x69 0x67 0x20 0x74 0x6F // 'o big to' 0x20 0x6A 0x75 0x6D 0x70 0x20 0x75 0x70 // ' jump up' 0x20 0x61 0x6E 0x64 0x20 0x67 0x65 0x74 // ' and get' 0x20 0x4D 0x61 0x72 0x74 0x68 0x61 0x20 // ' Martha ' 0x6F 0x75 0x74 0x20 0x6F 0x66 0x20 0x74 // 'out of t' 0x68 0x65 0x20 0x77 0x61 0x79 0x3F // 'he way?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_44= ktipbio27 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_44, __HELP_NAME("ktipbio27")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_44, __HELP_NAME("ktipbio27")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_93=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_44, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio27" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_93=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_44, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_93=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_93, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xD7 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xEF 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_93=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_93, 0x0) BYTE 0x03 0x03 0x41 0x73 0x74 0x72 0x6F 0x6E // '??Astron' 0x61 0x75 0x74 0x0D 0x0A 0x45 0x76 0x65 // 'aut??Eve' 0x6E 0x20 0x74 0x68 0x6F 0x75 0x67 0x68 // 'n though' 0x20 0x68 0x65 0x20 0x64 0x6F 0x65 0x73 // ' he does' 0x6E 0x92 0x74 0x20 0x6C 0x6F 0x6F 0x6B // 'nt look' 0x20 0x6C 0x69 0x6B 0x65 0x20 0x68 0x65 // ' like he' 0x20 0x77 0x6F 0x75 0x6C 0x64 0x20 0x62 // ' would b' 0x65 0x2C 0x20 0x42 0x6F 0x20 0x69 0x73 // 'e, Bo is' 0x20 0x70 0x72 0x65 0x74 0x74 0x79 0x20 // ' pretty ' 0x67 0x6F 0x6F 0x64 0x20 0x61 0x74 0x20 // 'good at ' 0x6A 0x75 0x6D 0x70 0x69 0x6E 0x67 0x2E // 'jumping.' 0x20 0x20 0x48 0x65 0x20 0x6C 0x65 0x61 // ' He lea' 0x72 0x6E 0x65 0x64 0x20 0x69 0x74 0x20 // 'rned it ' 0x6B 0x69 0x63 0x6B 0x20 0x62 0x6F 0x78 // 'kick box' 0x69 0x6E 0x67 0x2E 0x20 0x20 0x53 0x6F // 'ing. So' 0x20 0x69 0x74 0x20 0x73 0x65 0x65 0x6D // ' it seem' 0x73 0x20 0x6E 0x61 0x74 0x75 0x72 0x61 // 's natura' 0x6C 0x20 0x66 0x6F 0x72 0x20 0x42 0x6F // 'l for Bo' 0x20 0x74 0x6F 0x20 0x70 0x6C 0x61 0x79 // ' to play' 0x20 0x61 0x6E 0x20 0x61 0x73 0x74 0x72 // ' an astr' 0x6F 0x6E 0x61 0x75 0x74 0x20 0x69 0x6E // 'onaut in' 0x20 0x61 0x20 0x6D 0x6F 0x76 0x69 0x65 // ' a movie' 0x2E 0x20 0x20 0x48 0x65 0x20 0x63 0x6F // '. He co' 0x75 0x6C 0x64 0x20 0x62 0x6F 0x75 0x6E // 'uld boun' 0x63 0x65 0x20 0x61 0x6C 0x6F 0x6E 0x67 // 'ce along' 0x20 0x74 0x68 0x65 0x20 0x6C 0x61 0x6E // ' the lan' 0x64 0x73 0x63 0x61 0x70 0x65 0x20 0x6C // 'dscape l' 0x69 0x6B 0x65 0x20 0x61 0x20 0x62 0x69 // 'ike a bi' 0x67 0x20 0x72 0x75 0x62 0x62 0x65 0x72 // 'g rubber' 0x20 0x62 0x61 0x6C 0x6C 0x2E 0x20 0x0D // ' ball. ?' 0x0A 0x42 0x75 0x74 0x20 0x61 0x20 0x66 // '?But a f' 0x75 0x6E 0x6E 0x79 0x20 0x74 0x68 0x69 // 'unny thi' 0x6E 0x67 0x20 0x6D 0x69 0x67 0x68 0x74 // 'ng might' 0x20 0x68 0x61 0x70 0x70 0x65 0x6E 0x2E // ' happen.' 0x20 0x42 0x65 0x63 0x61 0x75 0x73 0x65 // ' Because' 0x20 0x68 0x65 0x20 0x69 0x73 0x20 0x77 // ' he is w' 0x65 0x69 0x67 0x68 0x74 0x6C 0x65 0x73 // 'eightles' 0x73 0x2C 0x20 0x42 0x6F 0x20 0x62 0x65 // 's, Bo be' 0x67 0x69 0x6E 0x73 0x20 0x74 0x6F 0x20 // 'gins to ' 0x73 0x74 0x72 0x65 0x74 0x63 0x68 0x20 // 'stretch ' 0x77 0x69 0x74 0x68 0x20 0x65 0x76 0x65 // 'with eve' 0x72 0x79 0x20 0x62 0x6F 0x75 0x6E 0x63 // 'ry bounc' 0x65 0x2E 0x20 0x20 0x49 0x66 0x20 0x68 // 'e. If h' 0x65 0x20 0x6B 0x65 0x65 0x70 0x73 0x20 // 'e keeps ' 0x74 0x68 0x69 0x73 0x20 0x75 0x70 0x2C // 'this up,' 0x20 0x68 0x65 0x20 0x77 0x6F 0x6E 0x92 // ' he won' 0x74 0x20 0x66 0x69 0x74 0x20 0x69 0x6E // 't fit in' 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 0x72 // 'to the r' 0x6F 0x63 0x6B 0x65 0x74 0x20 0x66 0x6F // 'ocket fo' 0x72 0x20 0x68 0x69 0x73 0x20 0x72 0x69 // 'r his ri' 0x64 0x65 0x20 0x68 0x6F 0x6D 0x65 0x2E // 'de home.' 0x20 0x20 0x43 0x61 0x6E 0x20 0x42 0x6F // ' Can Bo' 0x20 0x73 0x74 0x6F 0x70 0x20 0x62 0x6F // ' stop bo' 0x75 0x6E 0x63 0x69 0x6E 0x67 0x20 0x61 // 'uncing a' 0x6E 0x64 0x20 0x73 0x68 0x72 0x69 0x6E // 'nd shrin' 0x6B 0x20 0x65 0x6E 0x6F 0x75 0x67 0x68 // 'k enough' 0x20 0x74 0x6F 0x20 0x66 0x69 0x74 0x20 // ' to fit ' 0x69 0x6E 0x74 0x6F 0x20 0x74 0x68 0x65 // 'into the' 0x20 0x72 0x6F 0x63 0x6B 0x65 0x74 0x3F // ' rocket?' 0x20 // ' ' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_45= ktipbio28 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_45, __HELP_NAME("ktipbio28")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_45, __HELP_NAME("ktipbio28")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_46=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_45, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio28" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_46=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_45, 0x0) BYTE 0x01 0x00 0x03 0x03 0xCE 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_46=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_46, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x64 0x02 0x00 0x01 // '????d???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x6D 0x01 0x00 0x82 // '????m??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_46=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_46, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x75 0x72 0x20 0x43 // '??Tour C' 0x6F 0x6F 0x72 0x64 0x69 0x6E 0x61 0x74 // 'oordinat' 0x6F 0x72 0x0D 0x0A 0x42 0x6F 0x20 0x77 // 'or??Bo w' 0x61 0x6E 0x74 0x73 0x20 0x74 0x6F 0x20 // 'ants to ' 0x70 0x6C 0x61 0x79 0x20 0x74 0x68 0x65 // 'play the' 0x20 0x70 0x61 0x72 0x74 0x20 0x6F 0x66 // ' part of' 0x20 0x61 0x20 0x74 0x6F 0x75 0x72 0x20 // ' a tour ' 0x67 0x75 0x69 0x64 0x65 0x2E 0x20 0x48 // 'guide. H' 0x65 0x20 0x69 0x6D 0x61 0x67 0x69 0x6E // 'e imagin' 0x65 0x73 0x20 0x68 0x65 0x20 0x77 0x6F // 'es he wo' 0x75 0x6C 0x64 0x20 0x62 0x6F 0x6F 0x6B // 'uld book' 0x20 0x61 0x20 0x74 0x6F 0x75 0x72 0x20 // ' a tour ' 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 0x53 // 'to the S' 0x6F 0x75 0x74 0x68 0x20 0x6F 0x66 0x20 // 'outh of ' 0x46 0x72 0x61 0x6E 0x63 0x65 0x20 0x74 // 'France t' 0x6F 0x20 0x76 0x69 0x65 0x77 0x20 0x63 // 'o view c' 0x61 0x76 0x65 0x20 0x64 0x72 0x61 0x77 // 'ave draw' 0x69 0x6E 0x67 0x73 0x2E 0x20 0x20 0x42 // 'ings. B' 0x75 0x74 0x20 0x74 0x68 0x65 0x72 0x65 // 'ut there' 0x20 0x69 0x73 0x20 0x74 0x72 0x6F 0x75 // ' is trou' 0x62 0x6C 0x65 0x20 0x6C 0x75 0x72 0x6B // 'ble lurk' 0x69 0x6E 0x67 0x20 0x69 0x6E 0x20 0x74 // 'ing in t' 0x68 0x65 0x20 0x63 0x61 0x76 0x65 0x2E // 'he cave.' 0x20 0x20 0x53 0x6F 0x6D 0x65 0x20 0x74 // ' Some t' 0x68 0x69 0x65 0x76 0x65 0x73 0x20 0x68 // 'hieves h' 0x61 0x76 0x65 0x20 0x6A 0x75 0x73 0x74 // 'ave just' 0x20 0x73 0x74 0x6F 0x6C 0x65 0x6E 0x20 // ' stolen ' 0x61 0x20 0x53 0x70 0x61 0x6E 0x69 0x73 // 'a Spanis' 0x68 0x20 0x41 0x72 0x6D 0x61 0x64 0x61 // 'h Armada' 0x20 0x74 0x72 0x65 0x61 0x73 0x75 0x72 // ' treasur' 0x65 0x20 0x63 0x68 0x65 0x73 0x74 0x20 // 'e chest ' 0x66 0x72 0x6F 0x6D 0x20 0x61 0x20 0x6E // 'from a n' 0x65 0x61 0x72 0x62 0x79 0x20 0x6D 0x75 // 'earby mu' 0x73 0x65 0x75 0x6D 0x2C 0x20 0x61 0x6E // 'seum, an' 0x64 0x20 0x61 0x72 0x65 0x20 0x68 0x69 // 'd are hi' 0x64 0x69 0x6E 0x67 0x20 0x6F 0x75 0x74 // 'ding out' 0x20 0x69 0x6E 0x20 0x74 0x68 0x65 0x20 // ' in the ' 0x63 0x61 0x76 0x65 0x2E 0x20 0x20 0x57 // 'cave. W' 0x68 0x65 0x6E 0x20 0x42 0x6F 0x20 0x61 // 'hen Bo a' 0x6E 0x64 0x20 0x68 0x69 0x73 0x20 0x67 // 'nd his g' 0x72 0x6F 0x75 0x70 0x20 0x61 0x72 0x72 // 'roup arr' 0x69 0x76 0x65 0x2C 0x20 0x74 0x68 0x65 // 'ive, the' 0x79 0x20 0x61 0x72 0x65 0x20 0x69 0x6E // 'y are in' 0x20 0x66 0x6F 0x72 0x20 0x61 0x20 0x62 // ' for a b' 0x69 0x67 0x20 0x73 0x75 0x72 0x70 0x72 // 'ig surpr' 0x69 0x73 0x65 0x2E 0x20 0x0D 0x0A 0x43 // 'ise. ??C' 0x61 0x6E 0x20 0x42 0x6F 0x2C 0x20 0x77 // 'an Bo, w' 0x69 0x74 0x68 0x20 0x68 0x69 0x73 0x20 // 'ith his ' 0x63 0x72 0x65 0x61 0x74 0x69 0x76 0x65 // 'creative' 0x20 0x74 0x68 0x69 0x6E 0x6B 0x69 0x6E // ' thinkin' 0x67 0x20 0x61 0x6E 0x64 0x20 0x6E 0x61 // 'g and na' 0x74 0x75 0x72 0x61 0x6C 0x20 0x6B 0x69 // 'tural ki' 0x63 0x6B 0x20 0x62 0x6F 0x78 0x69 0x6E // 'ck boxin' 0x67 0x20 0x69 0x6E 0x73 0x74 0x69 0x6E // 'g instin' 0x63 0x74 0x2C 0x20 0x73 0x61 0x76 0x65 // 'ct, save' 0x20 0x74 0x68 0x65 0x20 0x74 0x6F 0x75 // ' the tou' 0x72 0x69 0x73 0x74 0x73 0x20 0x61 0x6E // 'rists an' 0x64 0x20 0x74 0x68 0x65 0x20 0x74 0x72 // 'd the tr' 0x65 0x61 0x73 0x75 0x72 0x65 0x3F 0x20 // 'easure? ' 0x20 0x57 0x68 0x61 0x74 0x20 0x68 0x61 // ' What ha' 0x70 0x70 0x65 0x6E 0x73 0x20 0x77 0x68 // 'ppens wh' 0x65 0x6E 0x20 0x42 0x6F 0x20 0x61 0x6E // 'en Bo an' 0x64 0x20 0x74 0x68 0x65 0x20 0x74 0x6F // 'd the to' 0x75 0x72 0x69 0x73 0x74 0x73 0x20 0x65 // 'urists e' 0x6D 0x65 0x72 0x67 0x65 0x20 0x66 0x72 // 'merge fr' 0x6F 0x6D 0x20 0x74 0x68 0x65 0x20 0x63 // 'om the c' 0x61 0x76 0x65 0x3F 0x20 0x20 0x54 0x68 // 'ave? Th' 0x65 0x79 0x20 0x61 0x72 0x65 0x6E 0x27 // 'ey aren'' 0x74 0x20 0x69 0x6E 0x20 0x46 0x72 0x61 // 't in Fra' 0x6E 0x63 0x65 0x20 0x61 0x6E 0x79 0x20 // 'nce any ' 0x6D 0x6F 0x72 0x65 0x2E 0x2E 0x2E 0x62 // 'more...b' 0x75 0x74 0x20 0x77 0x68 0x65 0x72 0x65 // 'ut where' 0x20 0x61 0x72 0x65 0x20 0x74 0x68 0x65 // ' are the' 0x79 0x3F 0x20 0x41 0x6E 0x64 0x20 0x68 // 'y? And h' 0x6F 0x77 0x20 0x77 0x69 0x6C 0x6C 0x20 // 'ow will ' 0x74 0x68 0x65 0x79 0x20 0x67 0x65 0x74 // 'they get' 0x20 0x68 0x6F 0x6D 0x65 0x3F // ' home?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_46= ktipbio29 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_46, __HELP_NAME("ktipbio29")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_46, __HELP_NAME("ktipbio29")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_46, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio29" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_46, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD4 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x60 0x02 0x00 0x01 // '????`???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x47 0x01 0x00 0x82 // '????G??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2D, 0x0) BYTE 0x03 0x03 0x74 0x61 0x6C 0x65 0x6E 0x74 // '??talent' 0x0D 0x0A 0x42 0x61 0x63 0x6B 0x20 0x69 // '??Back i' 0x6E 0x20 0x47 0x65 0x72 0x6D 0x61 0x6E // 'n German' 0x79 0x2C 0x20 0x42 0x65 0x6E 0x6A 0x61 // 'y, Benja' 0x6D 0x69 0x6E 0x20 0x4F 0x6C 0x69 0x76 // 'min Oliv' 0x65 0x72 0x20 0x4E 0x65 0x77 0x6D 0x61 // 'er Newma' 0x6E 0x20 0x47 0x65 0x6F 0x72 0x67 0x65 // 'n George' 0x20 0x4F 0x6C 0x64 0x68 0x61 0x75 0x73 // ' Oldhaus' 0x20 0x77 0x61 0x73 0x20 0x74 0x68 0x65 // ' was the' 0x20 0x73 0x6F 0x6E 0x20 0x6F 0x66 0x20 // ' son of ' 0x74 0x77 0x6F 0x20 0x63 0x69 0x72 0x63 // 'two circ' 0x75 0x73 0x20 0x70 0x65 0x72 0x66 0x6F // 'us perfo' 0x72 0x6D 0x65 0x72 0x73 0x2E 0x20 0x20 // 'rmers. ' 0x57 0x68 0x65 0x6E 0x20 0x68 0x65 0x20 // 'When he ' 0x77 0x61 0x73 0x20 0x62 0x6F 0x72 0x6E // 'was born' 0x2C 0x20 0x68 0x69 0x73 0x20 0x70 0x61 // ', his pa' 0x72 0x65 0x6E 0x74 0x73 0x20 0x28 0x61 // 'rents (a' 0x20 0x74 0x72 0x61 0x70 0x65 0x7A 0x65 // ' trapeze' 0x20 0x61 0x72 0x74 0x69 0x73 0x74 0x20 // ' artist ' 0x61 0x6E 0x64 0x20 0x61 0x20 0x66 0x69 // 'and a fi' 0x72 0x65 0x20 0x73 0x77 0x61 0x6C 0x6C // 're swall' 0x6F 0x77 0x65 0x72 0x29 0x20 0x75 0x73 // 'ower) us' 0x65 0x64 0x20 0x74 0x68 0x65 0x20 0x6E // 'ed the n' 0x61 0x6D 0x65 0x73 0x20 0x6F 0x66 0x20 // 'ames of ' 0x61 0x6C 0x6C 0x20 0x74 0x68 0x65 0x69 // 'all thei' 0x72 0x20 0x66 0x72 0x69 0x65 0x6E 0x64 // 'r friend' 0x73 0x20 0x66 0x6F 0x72 0x20 0x42 0x6F // 's for Bo' 0x6E 0x67 0x6F 0x20 0x61 0x6E 0x64 0x20 // 'ngo and ' 0x68 0x61 0x64 0x20 0x6E 0x6F 0x6E 0x65 // 'had none' 0x20 0x6C 0x65 0x66 0x74 0x20 0x66 0x6F // ' left fo' 0x72 0x20 0x42 0x6F 0x6E 0x67 0x6F 0x92 // 'r Bongo' 0x73 0x20 0x74 0x77 0x69 0x6E 0x20 0x62 // 's twin b' 0x72 0x6F 0x74 0x68 0x65 0x72 0x2C 0x20 // 'rother, ' 0x73 0x6F 0x20 0x74 0x68 0x65 0x79 0x20 // 'so they ' 0x6E 0x61 0x6D 0x65 0x64 0x20 0x68 0x69 // 'named hi' 0x6D 0x20 0x45 0x64 0x2C 0x20 0x74 0x68 // 'm Ed, th' 0x65 0x20 0x73 0x68 0x6F 0x72 0x74 0x65 // 'e shorte' 0x73 0x74 0x20 0x6E 0x61 0x6D 0x65 0x20 // 'st name ' 0x74 0x68 0x65 0x79 0x20 0x63 0x6F 0x75 // 'they cou' 0x6C 0x64 0x20 0x74 0x68 0x69 0x6E 0x6B // 'ld think' 0x20 0x6F 0x66 0x2E 0x20 0x20 0x20 0x0D // ' of. ?' 0x0A 0x42 0x6F 0x6E 0x67 0x6F 0x20 0x61 // '?Bongo a' 0x6E 0x64 0x20 0x45 0x64 0x20 0x77 0x65 // 'nd Ed we' 0x72 0x65 0x20 0x76 0x65 0x72 0x79 0x20 // 're very ' 0x63 0x6C 0x6F 0x73 0x65 0x2C 0x20 0x62 // 'close, b' 0x75 0x74 0x20 0x45 0x64 0x20 0x77 0x61 // 'ut Ed wa' 0x73 0x20 0x61 0x6C 0x77 0x61 0x79 0x73 // 's always' 0x20 0x67 0x65 0x74 0x74 0x69 0x6E 0x67 // ' getting' 0x20 0x69 0x6E 0x74 0x6F 0x20 0x74 0x72 // ' into tr' 0x6F 0x75 0x62 0x6C 0x65 0x20 0x61 0x6E // 'ouble an' 0x64 0x20 0x42 0x6F 0x6E 0x67 0x6F 0x20 // 'd Bongo ' 0x77 0x61 0x73 0x20 0x6D 0x75 0x63 0x68 // 'was much' 0x20 0x73 0x6D 0x61 0x72 0x74 0x65 0x72 // ' smarter' 0x2E 0x20 0x42 0x6F 0x6E 0x67 0x6F 0x20 // '. Bongo ' 0x6F 0x66 0x74 0x65 0x6E 0x20 0x70 0x72 // 'often pr' 0x65 0x74 0x65 0x6E 0x64 0x65 0x64 0x20 // 'etended ' 0x74 0x6F 0x20 0x62 0x65 0x20 0x45 0x64 // 'to be Ed' 0x20 0x73 0x6F 0x20 0x74 0x68 0x61 0x74 // ' so that' 0x20 0x68 0x65 0x20 0x63 0x6F 0x75 0x6C // ' he coul' 0x64 0x20 0x67 0x65 0x74 0x20 0x45 0x64 // 'd get Ed' 0x20 0x6F 0x75 0x74 0x20 0x6F 0x66 0x20 // ' out of ' 0x74 0x72 0x6F 0x75 0x62 0x6C 0x65 0x20 // 'trouble ' 0x77 0x68 0x65 0x6E 0x20 0x68 0x65 0x20 // 'when he ' 0x63 0x61 0x6D 0x65 0x20 0x68 0x6F 0x6D // 'came hom' 0x65 0x20 0x6C 0x61 0x74 0x65 0x2E 0x20 // 'e late. ' 0x20 0x54 0x68 0x61 0x74 0x92 0x73 0x20 // ' Thats ' 0x68 0x6F 0x77 0x20 0x42 0x6F 0x6E 0x67 // 'how Bong' 0x6F 0x20 0x64 0x65 0x76 0x65 0x6C 0x6F // 'o develo' 0x70 0x65 0x64 0x20 0x73 0x75 0x63 0x68 // 'ped such' 0x20 0x61 0x20 0x74 0x61 0x6C 0x65 0x6E // ' a talen' 0x74 0x20 0x66 0x6F 0x72 0x20 0x61 0x63 // 't for ac' 0x74 0x69 0x6E 0x67 0x97 0x62 0x79 0x20 // 'tingby ' 0x69 0x6D 0x69 0x74 0x61 0x74 0x69 0x6E // 'imitatin' 0x67 0x20 0x68 0x69 0x73 0x20 0x62 0x72 // 'g his br' 0x6F 0x74 0x68 0x65 0x72 0x20 0x6F 0x6E // 'other on' 0x20 0x74 0x68 0x65 0x20 0x73 0x70 0x6F // ' the spo' 0x74 0x2E // 't.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_47= ktipbio30 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_47, __HELP_NAME("ktipbio30")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_47, __HELP_NAME("ktipbio30")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_47=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_47, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio30" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_47=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_47, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_47=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_47, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x51 0x01 0x00 0x01 // '????Q???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xFB 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_47=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_47, 0x0) BYTE 0x03 0x03 0x54 0x77 0x69 0x6E 0x20 0x42 // '??Twin B' 0x72 0x6F 0x74 0x68 0x65 0x72 0x0D 0x0A // 'rother??' 0x42 0x6F 0x6E 0x67 0x6F 0x20 0x72 0x65 // 'Bongo re' 0x61 0x6C 0x6C 0x79 0x20 0x77 0x61 0x6E // 'ally wan' 0x74 0x73 0x20 0x74 0x6F 0x20 0x62 0x65 // 'ts to be' 0x20 0x69 0x6E 0x20 0x61 0x20 0x6D 0x6F // ' in a mo' 0x76 0x69 0x65 0x20 0x77 0x69 0x74 0x68 // 'vie with' 0x20 0x68 0x69 0x73 0x20 0x62 0x72 0x6F // ' his bro' 0x74 0x68 0x65 0x72 0x2C 0x20 0x45 0x64 // 'ther, Ed' 0x2E 0x20 0x20 0x42 0x6F 0x6E 0x67 0x6F // '. Bongo' 0x20 0x77 0x6F 0x75 0x6C 0x64 0x20 0x62 // ' would b' 0x65 0x20 0x74 0x68 0x65 0x20 0x67 0x6F // 'e the go' 0x6F 0x64 0x20 0x74 0x77 0x69 0x6E 0x20 // 'od twin ' 0x61 0x6E 0x64 0x20 0x45 0x64 0x20 0x77 // 'and Ed w' 0x6F 0x75 0x6C 0x64 0x20 0x62 0x65 0x20 // 'ould be ' 0x74 0x68 0x65 0x20 0x65 0x76 0x69 0x6C // 'the evil' 0x20 0x74 0x77 0x69 0x6E 0x2E 0x20 0x20 // ' twin. ' 0x54 0x6F 0x67 0x65 0x74 0x68 0x65 0x72 // 'Together' 0x20 0x74 0x68 0x65 0x79 0x20 0x77 0x6F // ' they wo' 0x75 0x6C 0x64 0x20 0x74 0x72 0x79 0x20 // 'uld try ' 0x74 0x6F 0x20 0x6F 0x75 0x74 0x73 0x6D // 'to outsm' 0x61 0x72 0x74 0x20 0x65 0x61 0x63 0x68 // 'art each' 0x20 0x6F 0x74 0x68 0x65 0x72 0x20 0x61 // ' other a' 0x6E 0x64 0x20 0x67 0x65 0x74 0x20 0x68 // 'nd get h' 0x65 0x6C 0x70 0x20 0x66 0x72 0x6F 0x6D // 'elp from' 0x20 0x66 0x72 0x69 0x65 0x6E 0x64 0x73 // ' friends' 0x20 0x74 0x6F 0x20 0x66 0x69 0x6E 0x64 // ' to find' 0x20 0x74 0x68 0x65 0x69 0x72 0x20 0x77 // ' their w' 0x61 0x79 0x20 0x6F 0x75 0x74 0x20 0x6F // 'ay out o' 0x66 0x20 0x61 0x20 0x68 0x61 0x75 0x6E // 'f a haun' 0x74 0x65 0x64 0x20 0x68 0x6F 0x75 0x73 // 'ted hous' 0x65 0x2E 0x20 0x0D 0x0A 0x42 0x75 0x74 // 'e. ??But' 0x20 0x77 0x68 0x6F 0x20 0x63 0x61 0x6E // ' who can' 0x20 0x74 0x65 0x6C 0x6C 0x20 0x74 0x68 // ' tell th' 0x65 0x6D 0x20 0x61 0x70 0x61 0x72 0x74 // 'em apart' 0x20 0x77 0x68 0x65 0x6E 0x20 0x74 0x68 // ' when th' 0x65 0x72 0x65 0x27 0x73 0x20 0x74 0x72 // 'ere's tr' 0x6F 0x75 0x62 0x6C 0x65 0x3F 0x20 0x20 // 'ouble? ' 0x54 0x68 0x61 0x74 0x27 0x73 0x20 0x45 // 'That's E' 0x64 0x2C 0x20 0x72 0x69 0x67 0x68 0x74 // 'd, right' 0x3F 0x20 0x20 0x4F 0x72 0x20 0x69 0x73 // '? Or is' 0x20 0x69 0x74 0x20 0x42 0x6F 0x6E 0x67 // ' it Bong' 0x6F 0x3F 0x20 // 'o? ' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_48= ktipbio31 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_48, __HELP_NAME("ktipbio31")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_48, __HELP_NAME("ktipbio31")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_48=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_48, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio31" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_48=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_48, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_48=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_48, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1E 0x01 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x88 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_48=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_48, 0x0) BYTE 0x03 0x03 0x50 0x6F 0x6C 0x69 0x63 0x65 // '??Police' 0x20 0x4F 0x66 0x66 0x69 0x63 0x65 0x72 // ' Officer' 0x0D 0x0A 0x42 0x65 0x69 0x6E 0x67 0x20 // '??Being ' 0x61 0x20 0x67 0x6F 0x6F 0x64 0x2D 0x6E // 'a good-n' 0x61 0x74 0x75 0x72 0x65 0x64 0x20 0x6B // 'atured k' 0x69 0x6E 0x64 0x20 0x6F 0x66 0x20 0x67 // 'ind of g' 0x75 0x79 0x2C 0x20 0x42 0x6F 0x6E 0x67 // 'uy, Bong' 0x6F 0x20 0x77 0x6F 0x75 0x6C 0x64 0x20 // 'o would ' 0x6C 0x69 0x6B 0x65 0x20 0x74 0x6F 0x20 // 'like to ' 0x70 0x6C 0x61 0x79 0x20 0x74 0x68 0x65 // 'play the' 0x20 0x70 0x61 0x72 0x74 0x20 0x6F 0x66 // ' part of' 0x20 0x61 0x20 0x66 0x72 0x69 0x65 0x6E // ' a frien' 0x64 0x6C 0x79 0x20 0x70 0x6F 0x6C 0x69 // 'dly poli' 0x63 0x65 0x20 0x6F 0x66 0x66 0x69 0x63 // 'ce offic' 0x65 0x72 0x20 0x61 0x6E 0x64 0x20 0x73 // 'er and s' 0x6F 0x6C 0x76 0x65 0x20 0x6D 0x79 0x73 // 'olve mys' 0x74 0x65 0x72 0x69 0x65 0x73 0x2E 0x20 // 'teries. ' 0x0D 0x0A 0x49 0x66 0x20 0x74 0x68 0x65 // '??If the' 0x72 0x65 0x27 0x73 0x20 0x61 0x20 0x74 // 're's a t' 0x68 0x65 0x66 0x74 0x20 0x61 0x74 0x20 // 'heft at ' 0x74 0x68 0x65 0x20 0x6D 0x61 0x6C 0x6C // 'the mall' 0x20 0x61 0x6E 0x64 0x20 0x74 0x68 0x65 // ' and the' 0x20 0x63 0x72 0x69 0x6D 0x69 0x6E 0x61 // ' crimina' 0x6C 0x20 0x65 0x73 0x63 0x61 0x70 0x65 // 'l escape' 0x73 0x20 0x6F 0x6E 0x20 0x61 0x20 0x70 // 's on a p' 0x6C 0x61 0x6E 0x65 0x2C 0x20 0x63 0x6F // 'lane, co' 0x75 0x6C 0x64 0x20 0x42 0x6F 0x6E 0x67 // 'uld Bong' 0x6F 0x20 0x63 0x61 0x74 0x63 0x68 0x20 // 'o catch ' 0x74 0x68 0x65 0x20 0x63 0x72 0x6F 0x6F // 'the croo' 0x6B 0x3F 0x20 0x20 0x57 0x6F 0x75 0x6C // 'k? Woul' 0x64 0x20 0x68 0x65 0x20 0x68 0x61 0x76 // 'd he hav' 0x65 0x20 0x74 0x6F 0x20 0x67 0x6F 0x20 // 'e to go ' 0x75 0x6E 0x64 0x65 0x72 0x63 0x6F 0x76 // 'undercov' 0x65 0x72 0x20 0x74 0x6F 0x20 0x73 0x6F // 'er to so' 0x6C 0x76 0x65 0x20 0x74 0x68 0x65 0x20 // 'lve the ' 0x6D 0x79 0x73 0x74 0x65 0x72 0x79 0x3F // 'mystery?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_49= ktipbio32 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_49, __HELP_NAME("ktipbio32")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_49, __HELP_NAME("ktipbio32")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_49=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_49, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio32" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_49=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_49, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_49=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_49, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xB4 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xF5 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_49=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_49, 0x0) BYTE 0x03 0x03 0x50 0x72 0x69 0x76 0x61 0x74 // '??Privat' 0x65 0x20 0x43 0x61 0x72 0x72 0x69 0x65 // 'e Carrie' 0x72 0x0D 0x0A 0x42 0x6F 0x6E 0x67 0x6F // 'r??Bongo' 0x20 0x66 0x65 0x65 0x6C 0x73 0x20 0x74 // ' feels t' 0x68 0x61 0x74 0x20 0x61 0x73 0x20 0x61 // 'hat as a' 0x20 0x70 0x69 0x6C 0x6F 0x74 0x20 0x66 // ' pilot f' 0x6F 0x72 0x20 0x61 0x20 0x70 0x72 0x69 // 'or a pri' 0x76 0x61 0x74 0x65 0x20 0x61 0x69 0x72 // 'vate air' 0x6C 0x69 0x6E 0x65 0x20 0x63 0x61 0x72 // 'line car' 0x72 0x69 0x65 0x72 0x2C 0x20 0x68 0x65 // 'rier, he' 0x20 0x63 0x6F 0x75 0x6C 0x64 0x20 0x72 // ' could r' 0x65 0x61 0x6C 0x6C 0x79 0x20 0x73 0x68 // 'eally sh' 0x6F 0x77 0x20 0x6F 0x66 0x66 0x20 0x68 // 'ow off h' 0x69 0x73 0x20 0x61 0x62 0x69 0x6C 0x69 // 'is abili' 0x74 0x79 0x20 0x74 0x6F 0x20 0x63 0x72 // 'ty to cr' 0x65 0x61 0x74 0x65 0x20 0x61 0x64 0x76 // 'eate adv' 0x65 0x6E 0x74 0x75 0x72 0x65 0x2E 0x20 // 'enture. ' 0x20 0x48 0x65 0x20 0x63 0x6F 0x75 0x6C // ' He coul' 0x64 0x20 0x66 0x6C 0x79 0x20 0x74 0x6F // 'd fly to' 0x20 0x65 0x78 0x6F 0x74 0x69 0x63 0x20 // ' exotic ' 0x70 0x6C 0x61 0x63 0x65 0x73 0x20 0x61 // 'places a' 0x6E 0x64 0x20 0x70 0x69 0x63 0x6B 0x20 // 'nd pick ' 0x75 0x70 0x20 0x68 0x69 0x73 0x20 0x70 // 'up his p' 0x61 0x73 0x73 0x65 0x6E 0x67 0x65 0x72 // 'assenger' 0x73 0x97 0x66 0x61 0x6D 0x6F 0x75 0x73 // 'sfamous' 0x20 0x73 0x70 0x6F 0x72 0x74 0x73 0x20 // ' sports ' 0x66 0x69 0x67 0x75 0x72 0x65 0x73 0x20 // 'figures ' 0x61 0x6E 0x64 0x20 0x6D 0x61 0x79 0x62 // 'and mayb' 0x65 0x20 0x65 0x76 0x65 0x6E 0x20 0x74 // 'e even t' 0x68 0x65 0x20 0x70 0x72 0x65 0x73 0x69 // 'he presi' 0x64 0x65 0x6E 0x74 0x21 0x0D 0x0A 0x42 // 'dent!??B' 0x75 0x74 0x20 0x77 0x68 0x61 0x74 0x20 // 'ut what ' 0x69 0x66 0x20 0x68 0x65 0x20 0x67 0x65 // 'if he ge' 0x74 0x73 0x20 0x6C 0x6F 0x73 0x74 0x20 // 'ts lost ' 0x61 0x6E 0x64 0x20 0x6C 0x61 0x6E 0x64 // 'and land' 0x73 0x20 0x69 0x6E 0x20 0x61 0x6E 0x6F // 's in ano' 0x74 0x68 0x65 0x72 0x20 0x74 0x69 0x6D // 'ther tim' 0x65 0x3F 0x20 0x20 0x41 0x6E 0x64 0x20 // 'e? And ' 0x6D 0x65 0x65 0x74 0x73 0x20 0x72 0x6F // 'meets ro' 0x62 0x6F 0x74 0x73 0x20 0x61 0x6E 0x64 // 'bots and' 0x20 0x70 0x72 0x65 0x68 0x69 0x73 0x74 // ' prehist' 0x6F 0x72 0x69 0x63 0x20 0x70 0x65 0x6F // 'oric peo' 0x70 0x6C 0x65 0x20 0x61 0x72 0x67 0x75 // 'ple argu' 0x69 0x6E 0x67 0x20 0x69 0x6E 0x20 0x61 // 'ing in a' 0x20 0x6C 0x61 0x6E 0x67 0x75 0x61 0x67 // ' languag' 0x65 0x20 0x68 0x65 0x20 0x64 0x6F 0x65 // 'e he doe' 0x73 0x6E 0x92 0x74 0x20 0x75 0x6E 0x64 // 'snt und' 0x65 0x72 0x73 0x74 0x61 0x6E 0x64 0x3F // 'erstand?' 0x20 0x20 0x57 0x68 0x65 0x6E 0x20 0x74 // ' When t' 0x68 0x65 0x79 0x20 0x74 0x61 0x6B 0x65 // 'hey take' 0x20 0x6F 0x76 0x65 0x72 0x20 0x74 0x68 // ' over th' 0x65 0x20 0x70 0x6C 0x61 0x6E 0x65 0x2C // 'e plane,' 0x20 0x68 0x6F 0x77 0x20 0x77 0x69 0x6C // ' how wil' 0x6C 0x20 0x68 0x65 0x20 0x67 0x65 0x74 // 'l he get' 0x20 0x68 0x6F 0x6D 0x65 0x3F // ' home?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_4A= ktipbio33 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4A, __HELP_NAME("ktipbio33")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4A, __HELP_NAME("ktipbio33")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_5=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4A, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio33" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_5=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4A, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_5=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x30 0x02 0x00 0x01 // '????0???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_5=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x03 0x03 0x62 0x61 0x73 0x6B 0x65 0x74 // '??basket' 0x62 0x61 0x6C 0x6C 0x0D 0x0A 0x0D 0x0A // 'ball????' 0x4F 0x6E 0x65 0x20 0x64 0x61 0x79 0x20 // 'One day ' 0x77 0x68 0x65 0x6E 0x20 0x74 0x68 0x65 // 'when the' 0x20 0x66 0x61 0x6D 0x6F 0x75 0x73 0x20 // ' famous ' 0x66 0x69 0x6C 0x6D 0x20 0x64 0x69 0x72 // 'film dir' 0x65 0x63 0x74 0x6F 0x72 0x20 0x4D 0x63 // 'ector Mc' 0x5A 0x65 0x65 0x20 0x77 0x61 0x73 0x20 // 'Zee was ' 0x61 0x74 0x20 0x74 0x68 0x65 0x20 0x73 // 'at the s' 0x63 0x68 0x6F 0x6F 0x6C 0x20 0x67 0x79 // 'chool gy' 0x6D 0x20 0x73 0x68 0x6F 0x6F 0x74 0x69 // 'm shooti' 0x6E 0x67 0x20 0x61 0x20 0x62 0x61 0x73 // 'ng a bas' 0x6B 0x65 0x74 0x62 0x61 0x6C 0x6C 0x20 // 'ketball ' 0x64 0x6F 0x63 0x75 0x6D 0x65 0x6E 0x74 // 'document' 0x61 0x72 0x79 0x2C 0x20 0x6F 0x6E 0x65 // 'ary, one' 0x20 0x6F 0x66 0x20 0x74 0x68 0x65 0x20 // ' of the ' 0x6C 0x69 0x67 0x68 0x74 0x73 0x20 0x69 // 'lights i' 0x6E 0x20 0x63 0x65 0x6E 0x74 0x65 0x72 // 'n center' 0x20 0x63 0x6F 0x75 0x72 0x74 0x20 0x62 // ' court b' 0x75 0x72 0x6E 0x65 0x64 0x20 0x6F 0x75 // 'urned ou' 0x74 0x2E 0x20 0x20 0x4E 0x6F 0x20 0x6F // 't. No o' 0x6E 0x65 0x20 0x63 0x6F 0x75 0x6C 0x64 // 'ne could' 0x20 0x72 0x65 0x61 0x63 0x68 0x20 0x74 // ' reach t' 0x68 0x65 0x20 0x6C 0x69 0x67 0x68 0x74 // 'he light' 0x20 0x65 0x78 0x63 0x65 0x70 0x74 0x20 // ' except ' 0x43 0x68 0x61 0x72 0x6C 0x69 0x65 0x2E // 'Charlie.' 0x20 0x20 0x54 0x68 0x65 0x6E 0x20 0x43 // ' Then C' 0x68 0x61 0x72 0x6C 0x69 0x65 0x20 0x68 // 'harlie h' 0x61 0x64 0x20 0x61 0x6E 0x20 0x69 0x64 // 'ad an id' 0x65 0x61 0x21 0x20 0x20 0x57 0x69 0x74 // 'ea! Wit' 0x68 0x20 0x61 0x20 0x6C 0x69 0x67 0x68 // 'h a ligh' 0x74 0x20 0x62 0x75 0x6C 0x62 0x20 0x69 // 't bulb i' 0x6E 0x20 0x6F 0x6E 0x65 0x20 0x68 0x61 // 'n one ha' 0x6E 0x64 0x2C 0x20 0x43 0x68 0x61 0x72 // 'nd, Char' 0x6C 0x69 0x65 0x20 0x6C 0x65 0x61 0x70 // 'lie leap' 0x74 0x20 0x69 0x6E 0x74 0x6F 0x20 0x74 // 't into t' 0x68 0x65 0x20 0x61 0x69 0x72 0x20 0x61 // 'he air a' 0x6E 0x64 0x20 0x70 0x75 0x74 0x20 0x69 // 'nd put i' 0x6E 0x20 0x74 0x68 0x65 0x20 0x62 0x75 // 'n the bu' 0x6C 0x62 0x20 0x69 0x6E 0x20 0x74 0x68 // 'lb in th' 0x65 0x20 0x73 0x6F 0x63 0x6B 0x65 0x74 // 'e socket' 0x2E 0x20 0x54 0x68 0x65 0x6E 0x20 0x68 // '. Then h' 0x65 0x20 0x6A 0x75 0x6D 0x70 0x65 0x64 // 'e jumped' 0x20 0x61 0x67 0x61 0x69 0x6E 0x20 0x61 // ' again a' 0x6E 0x64 0x20 0x73 0x70 0x75 0x6E 0x20 // 'nd spun ' 0x61 0x72 0x6F 0x75 0x6E 0x64 0x20 0x74 // 'around t' 0x6F 0x20 0x74 0x75 0x72 0x6E 0x20 0x74 // 'o turn t' 0x68 0x65 0x20 0x62 0x75 0x6C 0x62 0x2E // 'he bulb.' 0x20 0x48 0x65 0x20 0x6B 0x65 0x70 0x74 // ' He kept' 0x20 0x6A 0x75 0x6D 0x70 0x69 0x6E 0x67 // ' jumping' 0x20 0x61 0x6E 0x64 0x20 0x73 0x70 0x69 // ' and spi' 0x6E 0x6E 0x69 0x6E 0x67 0x20 0x75 0x6E // 'nning un' 0x74 0x69 0x6C 0x20 0x74 0x68 0x65 0x20 // 'til the ' 0x62 0x75 0x6C 0x62 0x20 0x77 0x61 0x73 // 'bulb was' 0x20 0x63 0x6F 0x6D 0x70 0x6C 0x65 0x74 // ' complet' 0x65 0x6C 0x79 0x20 0x73 0x63 0x72 0x65 // 'ely scre' 0x77 0x65 0x64 0x20 0x69 0x6E 0x74 0x6F // 'wed into' 0x20 0x74 0x68 0x65 0x20 0x73 0x6F 0x63 // ' the soc' 0x6B 0x65 0x74 0x2E 0x20 0x20 0x4D 0x63 // 'ket. Mc' 0x5A 0x65 0x65 0x20 0x73 0x61 0x69 0x64 // 'Zee said' 0x20 0x74 0x6F 0x20 0x68 0x69 0x6D 0x73 // ' to hims' 0x65 0x6C 0x66 0x2C 0x20 0x93 0x54 0x68 // 'elf, Th' 0x69 0x73 0x20 0x6B 0x69 0x64 0x20 0x69 // 'is kid i' 0x73 0x20 0x72 0x65 0x61 0x6C 0x6C 0x79 // 's really' 0x20 0x73 0x6F 0x6D 0x65 0x74 0x68 0x69 // ' somethi' 0x6E 0x67 0x21 0x94 0x20 0x61 0x6E 0x64 // 'ng! and' 0x20 0x61 0x73 0x6B 0x65 0x64 0x20 0x43 // ' asked C' 0x68 0x61 0x72 0x6C 0x69 0x65 0x20 0x74 // 'harlie t' 0x6F 0x20 0x62 0x65 0x20 0x69 0x6E 0x20 // 'o be in ' 0x68 0x69 0x73 0x20 0x66 0x69 0x6C 0x6D // 'his film' 0x73 0x2E // 's.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_4B= ktipbio34 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4B, __HELP_NAME("ktipbio34")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4B, __HELP_NAME("ktipbio34")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4B, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio34" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4B, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_4A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x52 0x02 0x00 0x01 // '????R???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x0A 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4A, 0x0) BYTE 0x03 0x03 0x53 0x6B 0x65 0x6C 0x65 0x74 // '??Skelet' 0x6F 0x6E 0x0D 0x0A 0x43 0x68 0x61 0x72 // 'on??Char' 0x6C 0x69 0x65 0x20 0x64 0x72 0x65 0x61 // 'lie drea' 0x6D 0x73 0x20 0x6F 0x66 0x20 0x70 0x6C // 'ms of pl' 0x61 0x79 0x69 0x6E 0x67 0x20 0x61 0x20 // 'aying a ' 0x73 0x6B 0x65 0x6C 0x65 0x74 0x6F 0x6E // 'skeleton' 0x20 0x6E 0x61 0x6D 0x65 0x64 0x20 0x93 // ' named ' 0x42 0x6F 0x6E 0x65 0x73 0x94 0x20 0x69 // 'Bones i' 0x6E 0x20 0x61 0x20 0x73 0x63 0x61 0x72 // 'n a scar' 0x79 0x20 0x6D 0x6F 0x76 0x69 0x65 0x2E // 'y movie.' 0x20 0x20 0x49 0x6E 0x20 0x74 0x68 0x65 // ' In the' 0x20 0x6D 0x6F 0x76 0x69 0x65 0x2C 0x20 // ' movie, ' 0x61 0x20 0x6B 0x6E 0x69 0x67 0x68 0x74 // 'a knight' 0x20 0x6F 0x77 0x6E 0x73 0x20 0x61 0x6E // ' owns an' 0x20 0x6F 0x6C 0x64 0x2C 0x20 0x63 0x72 // ' old, cr' 0x65 0x65 0x70 0x79 0x20 0x68 0x6F 0x75 // 'eepy hou' 0x73 0x65 0x2E 0x20 0x20 0x54 0x68 0x65 // 'se. The' 0x20 0x6B 0x6E 0x69 0x67 0x68 0x74 0x20 // ' knight ' 0x68 0x61 0x73 0x20 0x6E 0x6F 0x74 0x20 // 'has not ' 0x73 0x6C 0x65 0x70 0x74 0x20 0x69 0x6E // 'slept in' 0x20 0x79 0x65 0x61 0x72 0x73 0x20 0x61 // ' years a' 0x6E 0x64 0x20 0x77 0x61 0x6E 0x64 0x65 // 'nd wande' 0x72 0x73 0x20 0x61 0x72 0x6F 0x75 0x6E // 'rs aroun' 0x64 0x20 0x74 0x68 0x65 0x20 0x6E 0x65 // 'd the ne' 0x69 0x67 0x68 0x62 0x6F 0x72 0x68 0x6F // 'ighborho' 0x6F 0x64 0x20 0x69 0x6E 0x20 0x74 0x68 // 'od in th' 0x65 0x20 0x6D 0x69 0x64 0x64 0x6C 0x65 // 'e middle' 0x20 0x6F 0x66 0x20 0x74 0x68 0x65 0x20 // ' of the ' 0x6E 0x69 0x67 0x68 0x74 0x2E 0x20 0x20 // 'night. ' 0x48 0x69 0x73 0x20 0x6C 0x6F 0x75 0x64 // 'His loud' 0x20 0x63 0x6C 0x61 0x6E 0x6B 0x69 0x6E // ' clankin' 0x67 0x20 0x6B 0x65 0x65 0x70 0x73 0x20 // 'g keeps ' 0x61 0x6C 0x6C 0x20 0x74 0x68 0x65 0x20 // 'all the ' 0x74 0x65 0x6E 0x61 0x6E 0x74 0x73 0x20 // 'tenants ' 0x6F 0x66 0x20 0x74 0x68 0x65 0x20 0x68 // 'of the h' 0x6F 0x75 0x73 0x65 0x20 0x61 0x77 0x61 // 'ouse awa' 0x6B 0x65 0x2E 0x20 0x20 0x42 0x6F 0x6E // 'ke. Bon' 0x65 0x73 0x20 0x69 0x73 0x20 0x64 0x65 // 'es is de' 0x74 0x65 0x72 0x6D 0x69 0x6E 0x65 0x64 // 'termined' 0x20 0x74 0x6F 0x20 0x6D 0x61 0x6B 0x65 // ' to make' 0x20 0x74 0x68 0x65 0x20 0x6B 0x6E 0x69 // ' the kni' 0x67 0x68 0x74 0x20 0x74 0x69 0x72 0x65 // 'ght tire' 0x64 0x20 0x65 0x6E 0x6F 0x75 0x67 0x68 // 'd enough' 0x20 0x74 0x6F 0x20 0x73 0x6C 0x65 0x65 // ' to slee' 0x70 0x2E 0x20 0x20 0x42 0x6F 0x6E 0x65 // 'p. Bone' 0x73 0x20 0x73 0x6E 0x65 0x61 0x6B 0x73 // 's sneaks' 0x20 0x61 0x72 0x6F 0x75 0x6E 0x64 0x20 // ' around ' 0x74 0x68 0x65 0x20 0x68 0x6F 0x75 0x73 // 'the hous' 0x65 0x20 0x6D 0x61 0x6B 0x69 0x6E 0x67 // 'e making' 0x20 0x74 0x68 0x65 0x20 0x6B 0x6E 0x69 // ' the kni' 0x67 0x68 0x74 0x20 0x74 0x68 0x69 0x6E // 'ght thin' 0x6B 0x20 0x61 0x20 0x74 0x68 0x69 0x65 // 'k a thie' 0x66 0x20 0x69 0x73 0x20 0x69 0x6E 0x20 // 'f is in ' 0x74 0x68 0x65 0x20 0x68 0x6F 0x75 0x73 // 'the hous' 0x65 0x2E 0x20 0x20 0x54 0x68 0x65 0x20 // 'e. The ' 0x6B 0x6E 0x69 0x67 0x68 0x74 0x20 0x63 // 'knight c' 0x68 0x61 0x73 0x65 0x73 0x20 0x42 0x6F // 'hases Bo' 0x6E 0x65 0x73 0x20 0x61 0x72 0x6F 0x75 // 'nes arou' 0x6E 0x64 0x20 0x74 0x72 0x79 0x69 0x6E // 'nd tryin' 0x67 0x20 0x74 0x6F 0x20 0x63 0x61 0x74 // 'g to cat' 0x63 0x68 0x20 0x68 0x69 0x6D 0x2C 0x20 // 'ch him, ' 0x62 0x75 0x74 0x20 0x42 0x6F 0x6E 0x65 // 'but Bone' 0x73 0x20 0x73 0x69 0x6D 0x70 0x6C 0x79 // 's simply' 0x20 0x6A 0x75 0x6D 0x70 0x73 0x20 0x6F // ' jumps o' 0x76 0x65 0x72 0x20 0x74 0x68 0x65 0x20 // 'ver the ' 0x6B 0x6E 0x69 0x67 0x68 0x74 0x2E 0x20 // 'knight. ' 0x20 0x57 0x69 0x6C 0x6C 0x20 0x42 0x6F // ' Will Bo' 0x6E 0x65 0x73 0x20 0x77 0x65 0x61 0x72 // 'nes wear' 0x20 0x6F 0x75 0x74 0x20 0x74 0x68 0x65 // ' out the' 0x20 0x6B 0x6E 0x69 0x67 0x68 0x74 0x3F // ' knight?' 0x20 0x20 0x57 0x69 0x6C 0x6C 0x20 0x74 // ' Will t' 0x68 0x65 0x20 0x6E 0x65 0x69 0x67 0x68 // 'he neigh' 0x62 0x6F 0x72 0x68 0x6F 0x6F 0x64 0x20 // 'borhood ' 0x73 0x6C 0x65 0x65 0x70 0x20 0x61 0x67 // 'sleep ag' 0x61 0x69 0x6E 0x3F // 'ain?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_4C= ktipbio35 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4C, __HELP_NAME("ktipbio35")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4C, __HELP_NAME("ktipbio35")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_13=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4C, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio35" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_13=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x07 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_13=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_13, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2F 0x03 0x00 0x01 // '????/???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x17 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_13=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_13, 0x0) BYTE 0x03 0x03 0x4C 0x61 0x76 0x61 0x20 0x4C // '??Lava L' 0x61 0x6D 0x70 0x20 0x53 0x61 0x6C 0x65 // 'amp Sale' 0x73 0x70 0x65 0x72 0x73 0x6F 0x6E 0x0D // 'sperson?' 0x0A 0x41 0x6E 0x6F 0x74 0x68 0x65 0x72 // '?Another' 0x20 0x72 0x6F 0x6C 0x65 0x20 0x43 0x68 // ' role Ch' 0x61 0x72 0x6C 0x69 0x65 0x20 0x77 0x6F // 'arlie wo' 0x75 0x6C 0x64 0x20 0x6C 0x6F 0x76 0x65 // 'uld love' 0x20 0x74 0x6F 0x20 0x70 0x6C 0x61 0x79 // ' to play' 0x20 0x69 0x73 0x20 0x61 0x20 0x6C 0x61 // ' is a la' 0x76 0x61 0x20 0x6C 0x61 0x6D 0x70 0x20 // 'va lamp ' 0x73 0x61 0x6C 0x65 0x73 0x6D 0x61 0x6E // 'salesman' 0x2E 0x20 0x20 0x48 0x69 0x73 0x20 0x63 // '. His c' 0x6F 0x6D 0x70 0x61 0x6E 0x79 0x20 0x73 // 'ompany s' 0x65 0x6E 0x64 0x73 0x20 0x68 0x69 0x6D // 'ends him' 0x20 0x74 0x6F 0x20 0x4A 0x61 0x6D 0x61 // ' to Jama' 0x69 0x63 0x61 0x20 0x74 0x6F 0x20 0x73 // 'ica to s' 0x65 0x6C 0x6C 0x20 0x6C 0x61 0x76 0x61 // 'ell lava' 0x20 0x6C 0x61 0x6D 0x70 0x73 0x2E 0x20 // ' lamps. ' 0x20 0x50 0x72 0x65 0x74 0x65 0x6E 0x64 // ' Pretend' 0x69 0x6E 0x67 0x20 0x74 0x6F 0x20 0x62 // 'ing to b' 0x65 0x20 0x61 0x20 0x73 0x61 0x6C 0x65 // 'e a sale' 0x73 0x6D 0x61 0x6E 0x20 0x69 0x73 0x20 // 'sman is ' 0x61 0x20 0x70 0x65 0x72 0x66 0x65 0x63 // 'a perfec' 0x74 0x20 0x72 0x6F 0x6C 0x65 0x20 0x62 // 't role b' 0x65 0x63 0x61 0x75 0x73 0x65 0x20 0x43 // 'ecause C' 0x68 0x61 0x72 0x6C 0x69 0x65 0x20 0x72 // 'harlie r' 0x65 0x61 0x6C 0x6C 0x79 0x20 0x77 0x61 // 'eally wa' 0x6E 0x74 0x73 0x20 0x66 0x69 0x6E 0x64 // 'nts find' 0x20 0x74 0x68 0x65 0x20 0x6D 0x79 0x73 // ' the mys' 0x74 0x65 0x72 0x69 0x6F 0x75 0x73 0x20 // 'terious ' 0x4A 0x61 0x6D 0x61 0x69 0x63 0x61 0x6E // 'Jamaican' 0x20 0x74 0x61 0x6C 0x6B 0x69 0x6E 0x67 // ' talking' 0x20 0x73 0x6B 0x75 0x6C 0x6C 0x2E 0x20 // ' skull. ' 0x20 0x54 0x68 0x65 0x20 0x73 0x6B 0x75 // ' The sku' 0x6C 0x6C 0x20 0x69 0x73 0x20 0x76 0x65 // 'll is ve' 0x72 0x79 0x20 0x6F 0x6C 0x64 0x20 0x61 // 'ry old a' 0x6E 0x64 0x20 0x6B 0x6E 0x6F 0x77 0x73 // 'nd knows' 0x20 0x74 0x68 0x65 0x20 0x73 0x65 0x63 // ' the sec' 0x72 0x65 0x74 0x20 0x69 0x6E 0x67 0x72 // 'ret ingr' 0x65 0x64 0x69 0x65 0x6E 0x74 0x73 0x20 // 'edients ' 0x66 0x6F 0x72 0x20 0x62 0x61 0x6E 0x61 // 'for bana' 0x6E 0x61 0x2D 0x73 0x74 0x72 0x61 0x77 // 'na-straw' 0x62 0x65 0x72 0x72 0x79 0x2D 0x70 0x69 // 'berry-pi' 0x6E 0x65 0x61 0x70 0x70 0x6C 0x65 0x20 // 'neapple ' 0x70 0x65 0x61 0x6E 0x75 0x74 0x20 0x62 // 'peanut b' 0x75 0x74 0x74 0x65 0x72 0x2E 0x20 0x20 // 'utter. ' 0x49 0x66 0x20 0x43 0x68 0x61 0x72 0x6C // 'If Charl' 0x69 0x65 0x20 0x67 0x65 0x74 0x73 0x20 // 'ie gets ' 0x74 0x68 0x65 0x20 0x72 0x65 0x63 0x69 // 'the reci' 0x70 0x65 0x2C 0x20 0x68 0x65 0x92 0x6C // 'pe, hel' 0x6C 0x20 0x73 0x65 0x6C 0x6C 0x20 0x65 // 'l sell e' 0x6E 0x6F 0x75 0x67 0x68 0x20 0x6F 0x66 // 'nough of' 0x20 0x74 0x68 0x65 0x20 0x61 0x77 0x65 // ' the awe' 0x73 0x6F 0x6D 0x65 0x20 0x70 0x65 0x61 // 'some pea' 0x6E 0x75 0x74 0x20 0x62 0x75 0x74 0x74 // 'nut butt' 0x65 0x72 0x20 0x74 0x6F 0x20 0x65 0x76 // 'er to ev' 0x65 0x72 0x79 0x6F 0x6E 0x65 0x20 0x61 // 'eryone a' 0x74 0x20 0x63 0x6F 0x6C 0x6C 0x65 0x67 // 't colleg' 0x65 0x2E 0x20 0x20 0x41 0x74 0x20 0x74 // 'e. At t' 0x68 0x65 0x20 0x6C 0x6F 0x63 0x61 0x6C // 'he local' 0x20 0x6D 0x61 0x6C 0x6C 0x2C 0x20 0x43 // ' mall, C' 0x68 0x61 0x72 0x6C 0x69 0x65 0x20 0x67 // 'harlie g' 0x65 0x74 0x73 0x20 0x61 0x20 0x74 0x61 // 'ets a ta' 0x78 0x69 0x20 0x61 0x6E 0x64 0x20 0x67 // 'xi and g' 0x6F 0x65 0x73 0x20 0x74 0x6F 0x20 0x74 // 'oes to t' 0x68 0x65 0x20 0x62 0x61 0x73 0x65 0x20 // 'he base ' 0x6F 0x66 0x20 0x61 0x20 0x6D 0x6F 0x75 // 'of a mou' 0x6E 0x74 0x61 0x69 0x6E 0x20 0x74 0x6F // 'ntain to' 0x20 0x73 0x65 0x61 0x72 0x63 0x68 0x20 // ' search ' 0x66 0x6F 0x72 0x20 0x74 0x68 0x65 0x20 // 'for the ' 0x73 0x6B 0x75 0x6C 0x6C 0x2E 0x20 0x20 // 'skull. ' 0x53 0x6F 0x6F 0x6E 0x20 0x68 0x65 0x20 // 'Soon he ' 0x66 0x69 0x6E 0x64 0x73 0x20 0x61 0x6E // 'finds an' 0x20 0x6F 0x6C 0x64 0x20 0x77 0x6F 0x6F // ' old woo' 0x64 0x65 0x6E 0x20 0x62 0x72 0x69 0x64 // 'den brid' 0x67 0x65 0x20 0x77 0x69 0x74 0x68 0x20 // 'ge with ' 0x61 0x20 0x63 0x61 0x76 0x65 0x20 0x61 // 'a cave a' 0x74 0x20 0x74 0x68 0x65 0x20 0x6F 0x74 // 't the ot' 0x68 0x65 0x72 0x20 0x65 0x6E 0x64 0x2E // 'her end.' 0x20 0x20 0x48 0x65 0x92 0x73 0x20 0x61 // ' Hes a' 0x66 0x72 0x61 0x69 0x64 0x20 0x74 0x68 // 'fraid th' 0x65 0x20 0x62 0x72 0x69 0x64 0x67 0x65 // 'e bridge' 0x20 0x69 0x73 0x20 0x6E 0x6F 0x74 0x20 // ' is not ' 0x73 0x74 0x72 0x6F 0x6E 0x67 0x20 0x65 // 'strong e' 0x6E 0x6F 0x75 0x67 0x68 0x20 0x74 0x6F // 'nough to' 0x20 0x68 0x6F 0x6C 0x64 0x20 0x68 0x69 // ' hold hi' 0x6D 0x2C 0x20 0x62 0x75 0x74 0x20 0x6D // 'm, but m' 0x75 0x73 0x74 0x20 0x67 0x65 0x74 0x20 // 'ust get ' 0x61 0x63 0x72 0x6F 0x73 0x73 0x2E 0x20 // 'across. ' 0x20 0x43 0x61 0x6E 0x20 0x43 0x68 0x61 // ' Can Cha' 0x72 0x6C 0x69 0x65 0x20 0x6A 0x75 0x6D // 'rlie jum' 0x70 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 // 'p to the' 0x20 0x6F 0x74 0x68 0x65 0x72 0x20 0x73 // ' other s' 0x69 0x64 0x65 0x3F 0x20 0x41 0x6E 0x64 // 'ide? And' 0x2C 0x20 0x69 0x66 0x20 0x68 0x65 0x20 // ', if he ' 0x6D 0x61 0x6B 0x65 0x73 0x20 0x69 0x74 // 'makes it' 0x2C 0x20 0x77 0x69 0x6C 0x6C 0x20 0x68 // ', will h' 0x65 0x20 0x66 0x69 0x6E 0x64 0x20 0x74 // 'e find t' 0x68 0x65 0x20 0x74 0x61 0x6C 0x6B 0x69 // 'he talki' 0x6E 0x67 0x20 0x73 0x6B 0x75 0x6C 0x6C // 'ng skull' 0x20 0x62 0x65 0x20 0x69 0x6E 0x20 0x74 // ' be in t' 0x68 0x65 0x20 0x63 0x61 0x76 0x65 0x3F // 'he cave?' 0x20 // ' ' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_4D= ktipbio36 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4D, __HELP_NAME("ktipbio36")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4D, __HELP_NAME("ktipbio36")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_A3=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4D, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio36" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_A3=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4D, 0x0) BYTE 0x01 0x00 0x03 0x03 0xDE 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_A3=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A3, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x9D 0x02 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x09 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_A3=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A3, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x75 0x72 0x69 0x73 // '??Touris' 0x74 0x0D 0x0A 0x43 0x68 0x61 0x72 0x6C // 't??Charl' 0x69 0x65 0x20 0x61 0x6C 0x73 0x6F 0x20 // 'ie also ' 0x64 0x72 0x65 0x61 0x6D 0x73 0x20 0x6F // 'dreams o' 0x66 0x20 0x70 0x6C 0x61 0x79 0x69 0x6E // 'f playin' 0x67 0x20 0x61 0x20 0x74 0x6F 0x75 0x72 // 'g a tour' 0x69 0x73 0x74 0x20 0x77 0x68 0x6F 0x73 // 'ist whos' 0x65 0x20 0x76 0x61 0x63 0x61 0x74 0x69 // 'e vacati' 0x6F 0x6E 0x20 0x74 0x75 0x72 0x6E 0x73 // 'on turns' 0x20 0x69 0x6E 0x74 0x6F 0x20 0x61 0x20 // ' into a ' 0x68 0x75 0x67 0x65 0x20 0x61 0x64 0x76 // 'huge adv' 0x65 0x6E 0x74 0x75 0x72 0x65 0x21 0x20 // 'enture! ' 0x20 0x43 0x68 0x61 0x72 0x6C 0x69 0x65 // ' Charlie' 0x20 0x69 0x73 0x20 0x6F 0x6E 0x20 0x74 // ' is on t' 0x68 0x65 0x20 0x61 0x69 0x72 0x70 0x6C // 'he airpl' 0x61 0x6E 0x65 0x20 0x77 0x68 0x65 0x6E // 'ane when' 0x20 0x73 0x75 0x64 0x64 0x65 0x6E 0x6C // ' suddenl' 0x79 0x20 0x74 0x68 0x65 0x79 0x20 0x66 // 'y they f' 0x6C 0x79 0x20 0x69 0x6E 0x74 0x6F 0x20 // 'ly into ' 0x61 0x20 0x6D 0x79 0x73 0x74 0x65 0x72 // 'a myster' 0x69 0x6F 0x75 0x73 0x2C 0x20 0x68 0x65 // 'ious, he' 0x61 0x76 0x79 0x20 0x66 0x6F 0x67 0x2E // 'avy fog.' 0x20 0x20 0x54 0x68 0x65 0x20 0x66 0x6F // ' The fo' 0x67 0x20 0x67 0x6F 0x65 0x73 0x20 0x6F // 'g goes o' 0x6E 0x20 0x61 0x6E 0x64 0x20 0x6F 0x6E // 'n and on' 0x20 0x75 0x6E 0x74 0x69 0x6C 0x20 0x74 // ' until t' 0x68 0x65 0x79 0x20 0x72 0x75 0x6E 0x20 // 'hey run ' 0x6F 0x75 0x74 0x20 0x6F 0x66 0x20 0x67 // 'out of g' 0x61 0x73 0x20 0x61 0x6E 0x64 0x20 0x61 // 'as and a' 0x72 0x65 0x20 0x66 0x6F 0x72 0x63 0x65 // 're force' 0x64 0x20 0x74 0x6F 0x20 0x6C 0x61 0x6E // 'd to lan' 0x64 0x2E 0x20 0x20 0x42 0x65 0x63 0x61 // 'd. Beca' 0x75 0x73 0x65 0x20 0x74 0x68 0x65 0x20 // 'use the ' 0x66 0x6F 0x67 0x20 0x62 0x6C 0x6F 0x63 // 'fog bloc' 0x6B 0x65 0x64 0x20 0x6E 0x61 0x76 0x69 // 'ked navi' 0x67 0x61 0x74 0x69 0x6F 0x6E 0x20 0x73 // 'gation s' 0x69 0x67 0x6E 0x61 0x6C 0x73 0x2C 0x20 // 'ignals, ' 0x6E 0x6F 0x20 0x6F 0x6E 0x65 0x20 0x6B // 'no one k' 0x6E 0x6F 0x77 0x73 0x20 0x77 0x68 0x65 // 'nows whe' 0x72 0x65 0x20 0x74 0x68 0x65 0x79 0x20 // 're they ' 0x61 0x72 0x65 0x2E 0x20 0x20 0x45 0x76 // 'are. Ev' 0x65 0x72 0x79 0x6F 0x6E 0x65 0x20 0x6C // 'eryone l' 0x6F 0x6F 0x6B 0x73 0x20 0x74 0x6F 0x20 // 'ooks to ' 0x43 0x68 0x61 0x72 0x6C 0x69 0x65 0x20 // 'Charlie ' 0x74 0x6F 0x20 0x67 0x65 0x74 0x20 0x74 // 'to get t' 0x68 0x65 0x6D 0x20 0x68 0x6F 0x6D 0x65 // 'hem home' 0x20 0x73 0x61 0x66 0x65 0x6C 0x79 0x2E // ' safely.' 0x20 0x20 0x42 0x75 0x74 0x20 0x43 0x68 // ' But Ch' 0x61 0x72 0x6C 0x69 0x65 0x20 0x66 0x69 // 'arlie fi' 0x6E 0x64 0x73 0x20 0x6E 0x6F 0x20 0x73 // 'nds no s' 0x69 0x67 0x6E 0x73 0x20 0x6F 0x66 0x20 // 'igns of ' 0x6C 0x69 0x66 0x65 0x20 0x61 0x6E 0x79 // 'life any' 0x77 0x68 0x65 0x72 0x65 0x2E 0x20 0x20 // 'where. ' 0x54 0x68 0x65 0x6E 0x2C 0x20 0x66 0x72 // 'Then, fr' 0x6F 0x6D 0x20 0x6E 0x6F 0x77 0x68 0x65 // 'om nowhe' 0x72 0x65 0x2C 0x20 0x61 0x6E 0x20 0x61 // 're, an a' 0x6C 0x69 0x65 0x6E 0x20 0x73 0x70 0x61 // 'lien spa' 0x63 0x65 0x73 0x68 0x69 0x70 0x20 0x63 // 'ceship c' 0x6F 0x6D 0x65 0x73 0x20 0x69 0x6E 0x74 // 'omes int' 0x6F 0x20 0x73 0x69 0x67 0x68 0x74 0x20 // 'o sight ' 0x61 0x6E 0x64 0x20 0x62 0x65 0x67 0x69 // 'and begi' 0x6E 0x73 0x20 0x63 0x69 0x72 0x63 0x6C // 'ns circl' 0x69 0x6E 0x67 0x20 0x73 0x6C 0x6F 0x77 // 'ing slow' 0x6C 0x79 0x20 0x61 0x62 0x6F 0x76 0x65 // 'ly above' 0x20 0x74 0x68 0x65 0x6D 0x2E 0x20 0x48 // ' them. H' 0x61 0x76 0x65 0x20 0x74 0x68 0x65 0x79 // 'ave they' 0x20 0x6C 0x61 0x6E 0x64 0x65 0x64 0x20 // ' landed ' 0x6F 0x6E 0x20 0x61 0x6E 0x6F 0x74 0x68 // 'on anoth' 0x65 0x72 0x20 0x70 0x6C 0x61 0x6E 0x65 // 'er plane' 0x74 0x3F 0x20 0x43 0x61 0x6E 0x20 0x74 // 't? Can t' 0x68 0x65 0x20 0x73 0x70 0x61 0x63 0x65 // 'he space' 0x73 0x68 0x69 0x70 0x20 0x68 0x65 0x6C // 'ship hel' 0x70 0x20 0x73 0x61 0x76 0x65 0x20 0x74 // 'p save t' 0x68 0x65 0x6D 0x20 0x6F 0x72 0x20 0x69 // 'hem or i' 0x73 0x20 0x69 0x74 0x20 0x74 0x68 0x65 // 's it the' 0x72 0x65 0x20 0x74 0x6F 0x20 0x74 0x61 // 're to ta' 0x6B 0x65 0x20 0x74 0x68 0x65 0x6D 0x20 // 'ke them ' 0x68 0x6F 0x73 0x74 0x61 0x67 0x65 0x3F // 'hostage?' 0x20 0x20 0x48 0x6F 0x77 0x20 0x77 0x69 // ' How wi' 0x6C 0x6C 0x20 0x43 0x68 0x61 0x72 0x6C // 'll Charl' 0x69 0x65 0x20 0x67 0x65 0x74 0x20 0x74 // 'ie get t' 0x68 0x65 0x20 0x67 0x72 0x6F 0x75 0x70 // 'he group' 0x20 0x62 0x61 0x63 0x6B 0x20 0x74 0x6F // ' back to' 0x20 0x65 0x61 0x72 0x74 0x68 0x3F // ' earth?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_4E= ktipbio37 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4E, __HELP_NAME("ktipbio37")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4E, __HELP_NAME("ktipbio37")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_75=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4E, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio37" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_75=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x22 0x01 0x00 0x00 // '????"???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_75=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_75, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x4C 0x03 0x00 0x01 // '????L???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xAF 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_75=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_75, 0x0) BYTE 0x03 0x03 0x4D 0x75 0x73 0x65 0x75 0x6D // '??Museum' 0x20 0x43 0x75 0x72 0x61 0x74 0x6F 0x72 // ' Curator' 0x0D 0x0A 0x43 0x68 0x72 0x69 0x73 0x74 // '??Christ' 0x69 0x6E 0x61 0x20 0x69 0x73 0x20 0x64 // 'ina is d' 0x65 0x76 0x6F 0x74 0x65 0x64 0x20 0x74 // 'evoted t' 0x6F 0x20 0x66 0x69 0x6E 0x64 0x69 0x6E // 'o findin' 0x67 0x20 0x20 0x69 0x6D 0x61 0x67 0x69 // 'g imagi' 0x6E 0x61 0x74 0x69 0x76 0x65 0x2C 0x20 // 'native, ' 0x6F 0x66 0x66 0x62 0x65 0x61 0x74 0x2C // 'offbeat,' 0x20 0x65 0x63 0x6C 0x65 0x63 0x74 0x69 // ' eclecti' 0x63 0x20 0x61 0x72 0x74 0x97 0x66 0x72 // 'c artfr' 0x6F 0x6D 0x20 0x74 0x72 0x65 0x61 0x73 // 'om treas' 0x75 0x72 0x65 0x20 0x63 0x68 0x65 0x73 // 'ure ches' 0x74 0x73 0x20 0x61 0x6E 0x64 0x20 0x61 // 'ts and a' 0x72 0x6D 0x6F 0x72 0x20 0x74 0x6F 0x20 // 'rmor to ' 0x74 0x6F 0x74 0x65 0x6D 0x20 0x70 0x6F // 'totem po' 0x6C 0x65 0x73 0x2E 0x20 0x20 0x46 0x72 // 'les. Fr' 0x69 0x65 0x6E 0x64 0x73 0x20 0x73 0x61 // 'iends sa' 0x79 0x20 0x73 0x68 0x65 0x27 0x73 0x20 // 'y she's ' 0x71 0x75 0x69 0x65 0x74 0x2C 0x20 0x74 // 'quiet, t' 0x61 0x6C 0x65 0x6E 0x74 0x65 0x64 0x2C // 'alented,' 0x20 0x63 0x75 0x72 0x69 0x6F 0x75 0x73 // ' curious' 0x2C 0x20 0x67 0x6C 0x69 0x74 0x7A 0x79 // ', glitzy' 0x2C 0x20 0x67 0x6C 0x61 0x6D 0x6F 0x72 // ', glamor' 0x6F 0x75 0x73 0x2C 0x20 0x61 0x77 0x65 // 'ous, awe' 0x73 0x6F 0x6D 0x65 0x2C 0x20 0x77 0x69 // 'some, wi' 0x6C 0x64 0x2C 0x20 0x61 0x6E 0x64 0x2C // 'ld, and,' 0x20 0x73 0x6F 0x6D 0x65 0x74 0x69 0x6D // ' sometim' 0x65 0x73 0x2C 0x20 0x93 0x6E 0x6F 0x74 // 'es, not' 0x20 0x6F 0x66 0x20 0x74 0x68 0x69 0x73 // ' of this' 0x20 0x77 0x6F 0x72 0x6C 0x64 0x2E 0x94 // ' world.' 0x20 0x20 0x48 0x6F 0x77 0x20 0x63 0x61 // ' How ca' 0x6E 0x20 0x6F 0x6E 0x65 0x20 0x70 0x65 // 'n one pe' 0x72 0x73 0x6F 0x6E 0x20 0x62 0x65 0x20 // 'rson be ' 0x61 0x6C 0x6C 0x20 0x6F 0x66 0x20 0x74 // 'all of t' 0x68 0x65 0x73 0x65 0x20 0x74 0x68 0x69 // 'hese thi' 0x6E 0x67 0x73 0x3F 0x20 0x20 0x57 0x65 // 'ngs? We' 0x6C 0x6C 0x2C 0x20 0x43 0x68 0x72 0x69 // 'll, Chri' 0x73 0x74 0x69 0x6E 0x61 0x20 0x68 0x61 // 'stina ha' 0x73 0x20 0x61 0x20 0x73 0x70 0x65 0x63 // 's a spec' 0x69 0x61 0x6C 0x20 0x74 0x61 0x6C 0x65 // 'ial tale' 0x6E 0x74 0x2E 0x20 0x20 0x41 0x6C 0x6C // 'nt. All' 0x20 0x73 0x68 0x65 0x20 0x68 0x61 0x73 // ' she has' 0x20 0x74 0x6F 0x20 0x64 0x6F 0x20 0x69 // ' to do i' 0x73 0x20 0x66 0x6F 0x63 0x75 0x73 0x20 // 's focus ' 0x6F 0x6E 0x20 0x61 0x20 0x70 0x69 0x65 // 'on a pie' 0x63 0x65 0x20 0x6F 0x66 0x20 0x61 0x72 // 'ce of ar' 0x74 0x2C 0x20 0x61 0x6E 0x64 0x20 0x73 // 't, and s' 0x68 0x65 0x20 0x61 0x63 0x74 0x75 0x61 // 'he actua' 0x6C 0x6C 0x79 0x20 0x62 0x65 0x63 0x6F // 'lly beco' 0x6D 0x65 0x73 0x20 0x74 0x68 0x65 0x20 // 'mes the ' 0x74 0x68 0x69 0x6E 0x67 0x20 0x73 0x68 // 'thing sh' 0x65 0x27 0x73 0x20 0x6C 0x6F 0x6F 0x6B // 'e's look' 0x69 0x6E 0x67 0x20 0x61 0x74 0x2E 0x0D // 'ing at.?' 0x0A 0x49 0x66 0x20 0x73 0x68 0x65 0x20 // '?If she ' 0x66 0x6F 0x63 0x75 0x73 0x65 0x73 0x20 // 'focuses ' 0x6F 0x6E 0x20 0x61 0x20 0x6D 0x75 0x6D // 'on a mum' 0x6D 0x79 0x2C 0x20 0x66 0x6F 0x72 0x20 // 'my, for ' 0x65 0x78 0x61 0x6D 0x70 0x6C 0x65 0x2C // 'example,' 0x20 0x73 0x75 0x64 0x64 0x65 0x6E 0x6C // ' suddenl' 0x79 0x20 0x73 0x68 0x65 0x20 0x62 0x65 // 'y she be' 0x63 0x6F 0x6D 0x65 0x73 0x20 0x74 0x68 // 'comes th' 0x65 0x20 0x6D 0x75 0x6D 0x6D 0x79 0x21 // 'e mummy!' 0x20 0x20 0x53 0x68 0x65 0x92 0x6C 0x6C // ' Shell' 0x20 0x20 0x74 0x61 0x6C 0x6B 0x20 0x6C // ' talk l' 0x69 0x6B 0x65 0x20 0x61 0x20 0x6D 0x75 // 'ike a mu' 0x6D 0x6D 0x79 0x2C 0x20 0x77 0x61 0x6C // 'mmy, wal' 0x6B 0x20 0x6C 0x69 0x6B 0x65 0x20 0x61 // 'k like a' 0x20 0x6D 0x75 0x6D 0x6D 0x79 0x2C 0x20 // ' mummy, ' 0x65 0x76 0x65 0x6E 0x20 0x6C 0x6F 0x6F // 'even loo' 0x6B 0x20 0x6C 0x69 0x6B 0x65 0x20 0x61 // 'k like a' 0x20 0x6D 0x75 0x6D 0x6D 0x79 0x2E 0x20 // ' mummy. ' 0x20 0x4F 0x72 0x20 0x73 0x68 0x65 0x92 // ' Or she' 0x6C 0x6C 0x20 0x62 0x65 0x63 0x6F 0x6D // 'll becom' 0x65 0x20 0x61 0x20 0x74 0x6F 0x74 0x65 // 'e a tote' 0x6D 0x20 0x70 0x6F 0x6C 0x65 0x2E 0x20 // 'm pole. ' 0x20 0x4F 0x72 0x20 0x61 0x20 0x73 0x6B // ' Or a sk' 0x65 0x6C 0x65 0x74 0x6F 0x6E 0x21 0x20 // 'eleton! ' 0x20 0x53 0x6F 0x6D 0x65 0x74 0x69 0x6D // ' Sometim' 0x65 0x73 0x20 0x68 0x65 0x72 0x20 0x74 // 'es her t' 0x72 0x61 0x6E 0x73 0x66 0x6F 0x72 0x6D // 'ransform' 0x61 0x74 0x69 0x6F 0x6E 0x73 0x20 0x68 // 'ations h' 0x61 0x70 0x70 0x65 0x6E 0x20 0x77 0x69 // 'appen wi' 0x74 0x68 0x20 0x61 0x20 0x6C 0x6F 0x75 // 'th a lou' 0x64 0x20 0x4B 0x41 0x42 0x4F 0x4F 0x4D // 'd KABOOM' 0x2C 0x20 0x77 0x68 0x69 0x63 0x68 0x20 // ', which ' 0x69 0x73 0x20 0x65 0x6D 0x62 0x61 0x72 // 'is embar' 0x72 0x61 0x73 0x73 0x69 0x6E 0x67 0x2E // 'rassing.' 0x20 0x20 0x46 0x75 0x6E 0x6E 0x79 0x20 // ' Funny ' 0x74 0x68 0x69 0x6E 0x67 0x20 0x69 0x73 // 'thing is' 0x2C 0x20 0x6E 0x6F 0x20 0x6F 0x6E 0x65 // ', no one' 0x20 0x65 0x6C 0x73 0x65 0x20 0x69 0x6E // ' else in' 0x20 0x74 0x68 0x65 0x20 0x6D 0x75 0x73 // ' the mus' 0x65 0x75 0x6D 0x20 0x73 0x65 0x65 0x6D // 'eum seem' 0x73 0x20 0x74 0x6F 0x20 0x6E 0x6F 0x74 // 's to not' 0x69 0x63 0x65 0x21 0x20 0x20 0x46 0x72 // 'ice! Fr' 0x69 0x65 0x6E 0x64 0x73 0x20 0x74 0x68 // 'iends th' 0x69 0x6E 0x6B 0x20 0x69 0x74 0x92 0x73 // 'ink its' 0x20 0x6A 0x75 0x73 0x74 0x20 0x68 0x65 // ' just he' 0x72 0x20 0x76 0x69 0x76 0x69 0x64 0x20 // 'r vivid ' 0x69 0x6D 0x61 0x67 0x69 0x6E 0x61 0x74 // 'imaginat' 0x69 0x6F 0x6E 0x2E 0x20 0x4F 0x6E 0x6C // 'ion. Onl' 0x79 0x20 0x43 0x68 0x72 0x69 0x73 0x74 // 'y Christ' 0x69 0x6E 0x61 0x20 0x6B 0x6E 0x6F 0x77 // 'ina know' 0x73 0x20 0x74 0x68 0x65 0x20 0x74 0x72 // 's the tr' 0x75 0x74 0x68 0x2E 0x2E 0x2E // 'uth...' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_4F= ktipbio38 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4F, __HELP_NAME("ktipbio38")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4F, __HELP_NAME("ktipbio38")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4F, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio38" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4F, 0x0) BYTE 0x01 0x00 0x03 0x03 0xF0 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_4F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xC7 0x02 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x05 0x02 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4F, 0x0) BYTE 0x03 0x03 0x53 0x69 0x6E 0x67 0x65 0x72 // '??Singer' 0x0D 0x0A 0x43 0x68 0x72 0x69 0x73 0x74 // '??Christ' 0x69 0x6E 0x61 0x20 0x68 0x61 0x73 0x20 // 'ina has ' 0x61 0x6C 0x77 0x61 0x79 0x73 0x20 0x77 // 'always w' 0x61 0x6E 0x74 0x65 0x64 0x20 0x74 0x6F // 'anted to' 0x20 0x62 0x65 0x20 0x61 0x20 0x73 0x69 // ' be a si' 0x6E 0x67 0x65 0x72 0x2E 0x20 0x20 0x53 // 'nger. S' 0x68 0x65 0x92 0x73 0x20 0x63 0x6F 0x6E // 'hes con' 0x73 0x69 0x64 0x65 0x72 0x65 0x64 0x20 // 'sidered ' 0x62 0x65 0x69 0x6E 0x67 0x20 0x61 0x20 // 'being a ' 0x6A 0x61 0x7A 0x7A 0x20 0x73 0x69 0x6E // 'jazz sin' 0x67 0x65 0x72 0x20 0x6F 0x6E 0x20 0x61 // 'ger on a' 0x20 0x93 0x63 0x72 0x75 0x69 0x73 0x65 // ' cruise' 0x20 0x70 0x6C 0x61 0x6E 0x65 0x2E 0x94 // ' plane.' 0x20 0x20 0x45 0x76 0x65 0x72 0x20 0x68 // ' Ever h' 0x65 0x61 0x72 0x64 0x20 0x6F 0x66 0x20 // 'eard of ' 0x61 0x20 0x63 0x72 0x75 0x69 0x73 0x65 // 'a cruise' 0x20 0x70 0x6C 0x61 0x6E 0x65 0x3F 0x20 // ' plane? ' 0x20 0x49 0x74 0x92 0x73 0x20 0x6C 0x69 // ' Its li' 0x6B 0x65 0x20 0x61 0x20 0x63 0x72 0x75 // 'ke a cru' 0x69 0x73 0x65 0x20 0x73 0x68 0x69 0x70 // 'ise ship' 0x2C 0x20 0x62 0x75 0x74 0x20 0x6F 0x6E // ', but on' 0x20 0x61 0x6E 0x20 0x61 0x69 0x72 0x70 // ' an airp' 0x6C 0x61 0x6E 0x65 0x2E 0x20 0x20 0x20 // 'lane. ' 0x43 0x68 0x72 0x69 0x73 0x74 0x69 0x6E // 'Christin' 0x61 0x20 0x74 0x68 0x69 0x6E 0x6B 0x73 // 'a thinks' 0x20 0x61 0x69 0x72 0x6C 0x69 0x6E 0x65 // ' airline' 0x20 0x6D 0x6F 0x76 0x69 0x65 0x73 0x20 // ' movies ' 0x61 0x72 0x65 0x20 0x66 0x69 0x6E 0x65 // 'are fine' 0x20 0x65 0x6E 0x74 0x65 0x72 0x74 0x61 // ' enterta' 0x69 0x6E 0x6D 0x65 0x6E 0x74 0x2C 0x20 // 'inment, ' 0x62 0x75 0x74 0x20 0x6C 0x69 0x76 0x65 // 'but live' 0x20 0x6D 0x75 0x73 0x69 0x63 0x20 0x61 // ' music a' 0x6E 0x64 0x20 0x74 0x68 0x65 0x61 0x74 // 'nd theat' 0x65 0x72 0x20 0x77 0x6F 0x75 0x6C 0x64 // 'er would' 0x20 0x62 0x65 0x20 0x74 0x68 0x65 0x20 // ' be the ' 0x62 0x65 0x73 0x74 0x21 0x20 0x20 0x43 // 'best! C' 0x68 0x72 0x69 0x73 0x74 0x69 0x6E 0x61 // 'hristina' 0x20 0x63 0x6F 0x75 0x6C 0x64 0x20 0x73 // ' could s' 0x69 0x6E 0x67 0x20 0x66 0x6F 0x72 0x20 // 'ing for ' 0x74 0x68 0x65 0x20 0x93 0x72 0x65 0x64 // 'the red' 0x20 0x65 0x79 0x65 0x94 0x20 0x66 0x6C // ' eye fl' 0x69 0x67 0x68 0x74 0x73 0x2E 0x20 0x20 // 'ights. ' 0x53 0x68 0x65 0x92 0x64 0x20 0x74 0x69 // 'Shed ti' 0x74 0x6C 0x65 0x20 0x68 0x65 0x72 0x20 // 'tle her ' 0x67 0x69 0x67 0x20 0x93 0x4C 0x61 0x74 // 'gig Lat' 0x65 0x20 0x4E 0x69 0x67 0x68 0x74 0x20 // 'e Night ' 0x77 0x69 0x74 0x68 0x20 0x43 0x68 0x72 // 'with Chr' 0x69 0x73 0x74 0x69 0x6E 0x61 0x94 0x97 // 'istina' 0x73 0x69 0x74 0x20 0x62 0x61 0x63 0x6B // 'sit back' 0x20 0x61 0x6E 0x64 0x20 0x72 0x65 0x6C // ' and rel' 0x61 0x78 0x2E 0x20 0x20 0x54 0x68 0x65 // 'ax. The' 0x20 0x70 0x61 0x72 0x65 0x6E 0x74 0x73 // ' parents' 0x20 0x77 0x6F 0x75 0x6C 0x64 0x20 0x6C // ' would l' 0x6F 0x76 0x65 0x20 0x69 0x74 0x97 0x61 // 'ove ita' 0x6C 0x6C 0x20 0x74 0x68 0x65 0x20 0x62 // 'll the b' 0x61 0x62 0x69 0x65 0x73 0x20 0x77 0x6F // 'abies wo' 0x75 0x6C 0x64 0x20 0x62 0x65 0x20 0x61 // 'uld be a' 0x73 0x6C 0x65 0x65 0x70 0x20 0x69 0x6E // 'sleep in' 0x20 0x6D 0x69 0x6E 0x75 0x74 0x65 0x73 // ' minutes' 0x2E 0x20 0x20 0x49 0x74 0x20 0x77 0x6F // '. It wo' 0x75 0x6C 0x64 0x20 0x62 0x65 0x20 0x62 // 'uld be b' 0x65 0x74 0x74 0x65 0x72 0x20 0x74 0x68 // 'etter th' 0x61 0x6E 0x20 0x61 0x20 0x6C 0x75 0x6C // 'an a lul' 0x6C 0x61 0x62 0x79 0x21 0x0D 0x0A 0x42 // 'laby!??B' 0x75 0x74 0x20 0x77 0x68 0x61 0x74 0x20 // 'ut what ' 0x77 0x69 0x6C 0x6C 0x20 0x68 0x61 0x70 // 'will hap' 0x70 0x65 0x6E 0x20 0x77 0x68 0x65 0x6E // 'pen when' 0x20 0x43 0x68 0x72 0x69 0x73 0x74 0x69 // ' Christi' 0x6E 0x61 0x20 0x64 0x69 0x73 0x63 0x6F // 'na disco' 0x76 0x65 0x72 0x73 0x20 0x74 0x68 0x61 // 'vers tha' 0x74 0x20 0x73 0x68 0x65 0x92 0x73 0x20 // 't shes ' 0x61 0x66 0x72 0x61 0x69 0x64 0x20 0x6F // 'afraid o' 0x66 0x20 0x66 0x6C 0x79 0x69 0x6E 0x67 // 'f flying' 0x20 0x61 0x6E 0x64 0x20 0x73 0x68 0x65 // ' and she' 0x20 0x66 0x61 0x69 0x6E 0x74 0x73 0x3F // ' faints?' 0x20 0x20 0x57 0x69 0x6C 0x6C 0x20 0x74 // ' Will t' 0x68 0x65 0x72 0x65 0x20 0x62 0x65 0x20 // 'here be ' 0x61 0x6E 0x79 0x6F 0x6E 0x65 0x20 0x65 // 'anyone e' 0x6C 0x73 0x65 0x20 0x6F 0x6E 0x20 0x62 // 'lse on b' 0x6F 0x61 0x72 0x64 0x20 0x74 0x6F 0x20 // 'oard to ' 0x74 0x61 0x6B 0x65 0x20 0x6F 0x76 0x65 // 'take ove' 0x72 0x20 0x68 0x65 0x72 0x20 0x61 0x63 // 'r her ac' 0x74 0x3F 0x20 0x20 0x4D 0x61 0x79 0x62 // 't? Mayb' 0x65 0x20 0x74 0x68 0x65 0x20 0x6F 0x6E // 'e the on' 0x65 0x20 0x62 0x61 0x62 0x79 0x20 0x74 // 'e baby t' 0x68 0x61 0x74 0x20 0x69 0x73 0x6E 0x92 // 'hat isn' 0x74 0x20 0x61 0x6C 0x72 0x65 0x61 0x64 // 't alread' 0x79 0x20 0x61 0x73 0x6C 0x65 0x65 0x70 // 'y asleep' 0x3F // '?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_50= ktipbio39 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_50, __HELP_NAME("ktipbio39")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_50, __HELP_NAME("ktipbio39")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_50=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_50, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio39" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_50=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_50, 0x0) BYTE 0x01 0x00 0x03 0x03 0xF4 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_50=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_50, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xDE 0x02 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xDE 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_50=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_50, 0x0) BYTE 0x03 0x03 0x48 0x6F 0x6D 0x65 0x20 0x4F // '??Home O' 0x77 0x6E 0x65 0x72 0x0D 0x0A 0x43 0x68 // 'wner??Ch' 0x72 0x69 0x73 0x74 0x69 0x6E 0x61 0x20 // 'ristina ' 0x68 0x61 0x73 0x20 0x64 0x72 0x65 0x61 // 'has drea' 0x6D 0x65 0x64 0x20 0x6F 0x66 0x20 0x62 // 'med of b' 0x65 0x69 0x6E 0x67 0x20 0x61 0x20 0x68 // 'eing a h' 0x6F 0x6D 0x65 0x20 0x6F 0x77 0x6E 0x65 // 'ome owne' 0x72 0x2E 0x20 0x20 0x41 0x20 0x73 0x6D // 'r. A sm' 0x61 0x6C 0x6C 0x20 0x4E 0x65 0x77 0x20 // 'all New ' 0x59 0x6F 0x72 0x6B 0x20 0x61 0x70 0x61 // 'York apa' 0x72 0x74 0x6D 0x65 0x6E 0x74 0x20 0x69 // 'rtment i' 0x73 0x20 0x61 0x6C 0x6C 0x20 0x73 0x68 // 's all sh' 0x65 0x20 0x63 0x61 0x6E 0x20 0x61 0x66 // 'e can af' 0x66 0x6F 0x72 0x64 0x2C 0x20 0x62 0x75 // 'ford, bu' 0x74 0x20 0x43 0x68 0x72 0x69 0x73 0x74 // 't Christ' 0x69 0x6E 0x61 0x20 0x77 0x61 0x6E 0x74 // 'ina want' 0x73 0x20 0x61 0x20 0x62 0x69 0x67 0x20 // 's a big ' 0x68 0x6F 0x75 0x73 0x65 0x2C 0x20 0x6F // 'house, o' 0x6E 0x65 0x20 0x77 0x68 0x65 0x72 0x65 // 'ne where' 0x20 0x65 0x76 0x65 0x72 0x79 0x74 0x68 // ' everyth' 0x69 0x6E 0x67 0x20 0x69 0x73 0x20 0x75 // 'ing is u' 0x6E 0x64 0x65 0x72 0x20 0x6F 0x6E 0x65 // 'nder one' 0x20 0x72 0x6F 0x6F 0x66 0x97 0x61 0x20 // ' roofa ' 0x70 0x6C 0x61 0x63 0x65 0x20 0x74 0x6F // 'place to' 0x20 0x72 0x65 0x61 0x64 0x2C 0x20 0x63 // ' read, c' 0x6F 0x6F 0x6B 0x2C 0x20 0x68 0x6F 0x73 // 'ook, hos' 0x74 0x20 0x63 0x6F 0x6E 0x63 0x65 0x72 // 't concer' 0x74 0x73 0x20 0x61 0x6E 0x64 0x20 0x77 // 'ts and w' 0x69 0x6C 0x64 0x20 0x64 0x61 0x6E 0x63 // 'ild danc' 0x65 0x73 0x2C 0x20 0x61 0x6E 0x64 0x20 // 'es, and ' 0x73 0x65 0x74 0x20 0x75 0x70 0x20 0x61 // 'set up a' 0x20 0x63 0x6F 0x6E 0x73 0x65 0x72 0x76 // ' conserv' 0x61 0x74 0x69 0x6F 0x6E 0x20 0x6C 0x61 // 'ation la' 0x62 0x2E 0x20 0x20 0x54 0x68 0x65 0x20 // 'b. The ' 0x6C 0x61 0x62 0x20 0x77 0x6F 0x75 0x6C // 'lab woul' 0x64 0x20 0x62 0x65 0x20 0x69 0x6E 0x20 // 'd be in ' 0x74 0x68 0x65 0x20 0x74 0x75 0x72 0x72 // 'the turr' 0x65 0x74 0x20 0x6F 0x66 0x20 0x74 0x68 // 'et of th' 0x65 0x20 0x68 0x6F 0x75 0x73 0x65 0x2C // 'e house,' 0x20 0x73 0x6F 0x20 0x73 0x68 0x65 0x27 // ' so she'' 0x64 0x20 0x68 0x61 0x76 0x65 0x20 0x61 // 'd have a' 0x20 0x76 0x69 0x65 0x77 0x2E 0x20 0x20 // ' view. ' 0x4D 0x6F 0x73 0x74 0x20 0x70 0x65 0x6F // 'Most peo' 0x70 0x6C 0x65 0x20 0x77 0x61 0x6E 0x74 // 'ple want' 0x20 0x61 0x20 0x76 0x69 0x65 0x77 0x20 // ' a view ' 0x6F 0x66 0x20 0x74 0x68 0x65 0x20 0x6D // 'of the m' 0x6F 0x75 0x6E 0x74 0x61 0x69 0x6E 0x73 // 'ountains' 0x20 0x6F 0x72 0x20 0x74 0x68 0x65 0x20 // ' or the ' 0x77 0x61 0x74 0x65 0x72 0x3B 0x20 0x43 // 'water; C' 0x68 0x72 0x69 0x73 0x74 0x69 0x6E 0x61 // 'hristina' 0x20 0x77 0x61 0x6E 0x74 0x73 0x20 0x61 // ' wants a' 0x20 0x76 0x69 0x65 0x77 0x20 0x6F 0x66 // ' view of' 0x20 0x61 0x20 0x67 0x72 0x61 0x76 0x65 // ' a grave' 0x79 0x61 0x72 0x64 0x2E 0x20 0x20 0x57 // 'yard. W' 0x69 0x74 0x68 0x20 0x61 0x6C 0x6C 0x20 // 'ith all ' 0x74 0x68 0x6F 0x73 0x65 0x20 0x73 0x70 // 'those sp' 0x69 0x72 0x69 0x74 0x73 0x2C 0x20 0x73 // 'irits, s' 0x68 0x65 0x92 0x64 0x20 0x6E 0x65 0x76 // 'hed nev' 0x65 0x72 0x20 0x67 0x65 0x74 0x20 0x6C // 'er get l' 0x6F 0x6E 0x65 0x6C 0x79 0x2E 0x0D 0x0A // 'onely.??' 0x42 0x75 0x74 0x20 0x77 0x69 0x6C 0x6C // 'But will' 0x20 0x43 0x68 0x72 0x69 0x73 0x74 0x69 // ' Christi' 0x6E 0x61 0x92 0x73 0x20 0x64 0x72 0x65 // 'nas dre' 0x61 0x6D 0x73 0x20 0x6F 0x66 0x20 0x61 // 'ams of a' 0x20 0x68 0x61 0x70 0x70 0x79 0x20 0x68 // ' happy h' 0x6F 0x6D 0x65 0x20 0x74 0x75 0x72 0x6E // 'ome turn' 0x20 0x73 0x63 0x61 0x72 0x79 0x20 0x77 // ' scary w' 0x68 0x65 0x6E 0x20 0x73 0x68 0x65 0x20 // 'hen she ' 0x72 0x65 0x61 0x6C 0x69 0x7A 0x65 0x73 // 'realizes' 0x20 0x74 0x68 0x61 0x74 0x20 0x68 0x65 // ' that he' 0x72 0x20 0x6E 0x65 0x69 0x67 0x68 0x62 // 'r neighb' 0x6F 0x72 0x73 0x20 0x61 0x72 0x65 0x20 // 'ors are ' 0x61 0x20 0x6D 0x75 0x6D 0x6D 0x79 0x2C // 'a mummy,' 0x20 0x61 0x20 0x70 0x72 0x65 0x68 0x69 // ' a prehi' 0x73 0x74 0x6F 0x72 0x69 0x63 0x20 0x6D // 'storic m' 0x61 0x6E 0x2C 0x20 0x61 0x6E 0x64 0x20 // 'an, and ' 0x61 0x20 0x62 0x61 0x62 0x79 0x20 0x77 // 'a baby w' 0x69 0x74 0x68 0x20 0x61 0x6E 0x20 0x61 // 'ith an a' 0x74 0x74 0x69 0x74 0x75 0x64 0x65 0x3F // 'ttitude?' 0x20 0x20 0x57 0x69 0x6C 0x6C 0x20 0x43 // ' Will C' 0x68 0x72 0x69 0x73 0x74 0x69 0x6E 0x61 // 'hristina' 0x20 0x64 0x65 0x63 0x69 0x64 0x65 0x20 // ' decide ' 0x74 0x6F 0x20 0x6D 0x6F 0x76 0x65 0x20 // 'to move ' 0x62 0x61 0x63 0x6B 0x20 0x74 0x6F 0x20 // 'back to ' 0x4E 0x65 0x77 0x20 0x59 0x6F 0x72 0x6B // 'New York' 0x2C 0x20 0x6F 0x72 0x20 0x77 0x69 0x6C // ', or wil' 0x6C 0x20 0x73 0x68 0x65 0x20 0x74 0x68 // 'l she th' 0x72 0x6F 0x77 0x20 0x61 0x20 0x64 0x61 // 'row a da' 0x6E 0x63 0x65 0x20 0x70 0x61 0x72 0x74 // 'nce part' 0x79 0x20 0x66 0x6F 0x72 0x20 0x68 0x65 // 'y for he' 0x72 0x20 0x6E 0x65 0x77 0x20 0x6E 0x65 // 'r new ne' 0x69 0x67 0x68 0x62 0x6F 0x72 0x73 0x3F // 'ighbors?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_51= ktipbio40 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_51, __HELP_NAME("ktipbio40")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_51, __HELP_NAME("ktipbio40")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_51=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_51, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio40" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_51=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_51, 0x0) BYTE 0x01 0x00 0x03 0x03 0x04 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_51=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_51, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xF4 0x02 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x21 0x02 0x00 0x82 // '????!??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_51=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_51, 0x0) BYTE 0x03 0x03 0x44 0x65 0x74 0x65 0x63 0x74 // '??Detect' 0x69 0x76 0x65 0x0D 0x0A 0x43 0x68 0x72 // 'ive??Chr' 0x69 0x73 0x74 0x69 0x6E 0x61 0x20 0x68 // 'istina h' 0x61 0x73 0x20 0x61 0x6E 0x20 0x65 0x79 // 'as an ey' 0x65 0x20 0x66 0x6F 0x72 0x20 0x64 0x65 // 'e for de' 0x74 0x61 0x69 0x6C 0x20 0x61 0x6E 0x64 // 'tail and' 0x20 0x77 0x6F 0x75 0x6C 0x64 0x20 0x6D // ' would m' 0x61 0x6B 0x65 0x20 0x61 0x20 0x67 0x6F // 'ake a go' 0x6F 0x64 0x20 0x64 0x65 0x74 0x65 0x63 // 'od detec' 0x74 0x69 0x76 0x65 0x2E 0x20 0x20 0x49 // 'tive. I' 0x6E 0x20 0x74 0x68 0x69 0x73 0x20 0x72 // 'n this r' 0x6F 0x6C 0x65 0x2C 0x20 0x43 0x68 0x72 // 'ole, Chr' 0x69 0x73 0x74 0x69 0x6E 0x61 0x20 0x66 // 'istina f' 0x69 0x6E 0x64 0x73 0x20 0x4E 0x65 0x77 // 'inds New' 0x20 0x59 0x6F 0x72 0x6B 0x92 0x73 0x20 // ' Yorks ' 0x6C 0x6F 0x6E 0x67 0x20 0x6C 0x6F 0x73 // 'long los' 0x74 0x20 0x74 0x72 0x65 0x61 0x73 0x75 // 't treasu' 0x72 0x65 0x20 0x63 0x68 0x65 0x73 0x74 // 're chest' 0x20 0x69 0x6E 0x20 0x61 0x20 0x72 0x61 // ' in a ra' 0x6D 0x62 0x6C 0x69 0x6E 0x67 0x20 0x67 // 'mbling g' 0x72 0x61 0x76 0x65 0x79 0x61 0x72 0x64 // 'raveyard' 0x20 0x6E 0x6F 0x72 0x74 0x68 0x20 0x6F // ' north o' 0x66 0x20 0x74 0x68 0x65 0x20 0x63 0x69 // 'f the ci' 0x74 0x79 0x2E 0x20 0x20 0x54 0x68 0x65 // 'ty. The' 0x20 0x61 0x72 0x65 0x61 0x20 0x77 0x61 // ' area wa' 0x73 0x20 0x6F 0x6E 0x63 0x65 0x20 0x61 // 's once a' 0x20 0x73 0x74 0x6F 0x6D 0x70 0x69 0x6E // ' stompin' 0x67 0x20 0x67 0x72 0x6F 0x75 0x6E 0x64 // 'g ground' 0x20 0x66 0x6F 0x72 0x20 0x49 0x6E 0x64 // ' for Ind' 0x69 0x61 0x6E 0x20 0x63 0x61 0x76 0x65 // 'ian cave' 0x20 0x64 0x77 0x65 0x6C 0x6C 0x65 0x72 // ' dweller' 0x73 0x2E 0x20 0x20 0x43 0x68 0x72 0x69 // 's. Chri' 0x73 0x74 0x69 0x6E 0x61 0x20 0x68 0x61 // 'stina ha' 0x70 0x70 0x65 0x6E 0x73 0x20 0x74 0x6F // 'ppens to' 0x20 0x62 0x65 0x20 0x69 0x6E 0x20 0x74 // ' be in t' 0x68 0x65 0x20 0x67 0x72 0x61 0x76 0x65 // 'he grave' 0x79 0x61 0x72 0x64 0x20 0x6F 0x6E 0x65 // 'yard one' 0x20 0x64 0x61 0x79 0x20 0x73 0x74 0x75 // ' day stu' 0x64 0x79 0x69 0x6E 0x67 0x20 0x66 0x61 // 'dying fa' 0x6D 0x6F 0x75 0x73 0x20 0x70 0x65 0x6F // 'mous peo' 0x70 0x6C 0x65 0x92 0x73 0x20 0x67 0x72 // 'ples gr' 0x61 0x76 0x65 0x73 0x2E 0x20 0x20 0x53 // 'aves. S' 0x68 0x65 0x20 0x73 0x74 0x75 0x6D 0x62 // 'he stumb' 0x6C 0x65 0x73 0x20 0x75 0x70 0x6F 0x6E // 'les upon' 0x20 0x61 0x6E 0x20 0x6F 0x6C 0x64 0x20 // ' an old ' 0x63 0x61 0x76 0x65 0x2C 0x20 0x61 0x6E // 'cave, an' 0x64 0x20 0x73 0x69 0x74 0x74 0x69 0x6E // 'd sittin' 0x67 0x20 0x69 0x6E 0x73 0x69 0x64 0x65 // 'g inside' 0x20 0x69 0x73 0x20 0x61 0x20 0x74 0x72 // ' is a tr' 0x65 0x61 0x73 0x75 0x72 0x65 0x20 0x63 // 'easure c' 0x68 0x65 0x73 0x74 0x20 0x6F 0x66 0x20 // 'hest of ' 0x67 0x6F 0x6C 0x64 0x21 0x20 0x20 0x48 // 'gold! H' 0x65 0x72 0x20 0x73 0x74 0x6F 0x72 0x79 // 'er story' 0x20 0x6D 0x61 0x6B 0x65 0x73 0x20 0x74 // ' makes t' 0x68 0x65 0x20 0x6E 0x61 0x74 0x69 0x6F // 'he natio' 0x6E 0x61 0x6C 0x20 0x6E 0x65 0x77 0x73 // 'nal news' 0x2C 0x20 0x61 0x6E 0x64 0x20 0x73 0x68 // ', and sh' 0x65 0x20 0x67 0x65 0x74 0x73 0x20 0x63 // 'e gets c' 0x61 0x6C 0x6C 0x73 0x20 0x66 0x72 0x6F // 'alls fro' 0x6D 0x20 0x70 0x6F 0x6C 0x69 0x63 0x65 // 'm police' 0x20 0x63 0x68 0x69 0x65 0x66 0x73 0x20 // ' chiefs ' 0x61 0x6E 0x64 0x20 0x73 0x68 0x65 0x72 // 'and sher' 0x69 0x66 0x66 0x73 0x20 0x65 0x76 0x65 // 'iffs eve' 0x72 0x79 0x77 0x68 0x65 0x72 0x65 0x20 // 'rywhere ' 0x62 0x65 0x67 0x67 0x69 0x6E 0x67 0x20 // 'begging ' 0x66 0x6F 0x72 0x20 0x68 0x65 0x72 0x20 // 'for her ' 0x73 0x6C 0x65 0x75 0x74 0x68 0x69 0x6E // 'sleuthin' 0x67 0x20 0x73 0x6B 0x69 0x6C 0x6C 0x73 // 'g skills' 0x2E 0x0D 0x0A 0x57 0x68 0x65 0x6E 0x20 // '.??When ' 0x43 0x68 0x72 0x69 0x73 0x74 0x69 0x6E // 'Christin' 0x61 0x20 0x6E 0x65 0x65 0x64 0x73 0x20 // 'a needs ' 0x74 0x6F 0x20 0x75 0x6E 0x63 0x6F 0x76 // 'to uncov' 0x65 0x72 0x20 0x61 0x20 0x72 0x69 0x6E // 'er a rin' 0x67 0x20 0x6F 0x66 0x20 0x6D 0x75 0x6D // 'g of mum' 0x6D 0x79 0x20 0x73 0x6D 0x75 0x67 0x67 // 'my smugg' 0x6C 0x65 0x72 0x73 0x2C 0x20 0x77 0x69 // 'lers, wi' 0x6C 0x6C 0x20 0x73 0x68 0x65 0x20 0x75 // 'll she u' 0x73 0x65 0x20 0x68 0x65 0x72 0x20 0x73 // 'se her s' 0x6B 0x69 0x6C 0x6C 0x20 0x61 0x74 0x20 // 'kill at ' 0x74 0x72 0x61 0x6E 0x73 0x66 0x6F 0x72 // 'transfor' 0x6D 0x69 0x6E 0x67 0x20 0x68 0x65 0x72 // 'ming her' 0x73 0x65 0x6C 0x66 0x20 0x69 0x6E 0x74 // 'self int' 0x6F 0x20 0x61 0x72 0x74 0x3F 0x20 0x20 // 'o art? ' 0x49 0x66 0x20 0x74 0x68 0x65 0x20 0x73 // 'If the s' 0x6D 0x75 0x67 0x67 0x6C 0x65 0x72 0x73 // 'mugglers' 0x20 0x64 0x6F 0x6E 0x92 0x74 0x20 0x72 // ' dont r' 0x65 0x61 0x6C 0x69 0x7A 0x65 0x20 0x74 // 'ealize t' 0x68 0x61 0x74 0x20 0x73 0x68 0x65 0x20 // 'hat she ' 0x69 0x73 0x6E 0x92 0x74 0x20 0x72 0x65 // 'isnt re' 0x61 0x6C 0x6C 0x79 0x20 0x61 0x20 0x6D // 'ally a m' 0x75 0x6D 0x6D 0x79 0x2C 0x20 0x77 0x69 // 'ummy, wi' 0x6C 0x6C 0x20 0x74 0x68 0x65 0x79 0x20 // 'll they ' 0x74 0x72 0x79 0x20 0x74 0x6F 0x20 0x73 // 'try to s' 0x74 0x65 0x61 0x6C 0x20 0x68 0x65 0x72 // 'teal her' 0x2C 0x20 0x74 0x6F 0x6F 0x3F // ', too?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_52= ktipbio41 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_52, __HELP_NAME("ktipbio41")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_52, __HELP_NAME("ktipbio41")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_53=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_52, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio41" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_53=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_52, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE2 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_53=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_53, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x66 0x02 0x00 0x01 // '????f???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x3E 0x01 0x00 0x82 // '????>??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_53=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_53, 0x0) BYTE 0x03 0x03 0x6C 0x69 0x76 0x65 0x20 0x64 // '??live d' 0x61 0x6E 0x67 0x65 0x72 0x6F 0x75 0x73 // 'angerous' 0x6C 0x79 0x0D 0x0A 0x43 0x6C 0x61 0x75 // 'ly??Clau' 0x64 0x69 0x61 0x20 0x68 0x61 0x73 0x20 // 'dia has ' 0x61 0x6C 0x77 0x61 0x79 0x73 0x20 0x62 // 'always b' 0x65 0x65 0x6E 0x20 0x61 0x20 0x76 0x65 // 'een a ve' 0x72 0x79 0x20 0x6D 0x6F 0x64 0x65 0x72 // 'ry moder' 0x6E 0x20 0x49 0x6E 0x64 0x69 0x61 0x6E // 'n Indian' 0x20 0x6C 0x61 0x64 0x79 0x20 0x61 0x6E // ' lady an' 0x64 0x20 0x77 0x61 0x73 0x20 0x72 0x65 // 'd was re' 0x61 0x6C 0x6C 0x79 0x20 0x65 0x78 0x63 // 'ally exc' 0x69 0x74 0x65 0x64 0x20 0x77 0x68 0x65 // 'ited whe' 0x6E 0x20 0x73 0x68 0x65 0x20 0x67 0x6F // 'n she go' 0x74 0x20 0x61 0x20 0x73 0x63 0x68 0x6F // 't a scho' 0x6C 0x61 0x72 0x73 0x68 0x69 0x70 0x20 // 'larship ' 0x74 0x6F 0x20 0x73 0x74 0x75 0x64 0x79 // 'to study' 0x20 0x69 0x6E 0x20 0x74 0x68 0x65 0x20 // ' in the ' 0x55 0x6E 0x69 0x74 0x65 0x64 0x20 0x53 // 'United S' 0x74 0x61 0x74 0x65 0x73 0x2E 0x20 0x20 // 'tates. ' 0x54 0x68 0x61 0x74 0x92 0x73 0x20 0x77 // 'Thats w' 0x68 0x65 0x6E 0x20 0x73 0x68 0x65 0x20 // 'hen she ' 0x72 0x65 0x61 0x6C 0x6C 0x79 0x20 0x73 // 'really s' 0x74 0x61 0x72 0x74 0x65 0x64 0x20 0x6C // 'tarted l' 0x69 0x76 0x69 0x6E 0x67 0x20 0x64 0x61 // 'iving da' 0x6E 0x67 0x65 0x72 0x6F 0x75 0x73 0x6C // 'ngerousl' 0x79 0x2E 0x20 0x20 0x53 0x68 0x65 0x92 // 'y. She' 0x73 0x20 0x74 0x72 0x69 0x65 0x64 0x20 // 's tried ' 0x77 0x61 0x6C 0x6B 0x69 0x6E 0x67 0x20 // 'walking ' 0x61 0x20 0x74 0x69 0x67 0x68 0x74 0x2D // 'a tight-' 0x72 0x6F 0x70 0x65 0x20 0x69 0x6E 0x20 // 'rope in ' 0x61 0x20 0x63 0x69 0x72 0x63 0x75 0x73 // 'a circus' 0x2C 0x20 0x70 0x61 0x72 0x61 0x63 0x68 // ', parach' 0x75 0x74 0x69 0x6E 0x67 0x20 0x6F 0x75 // 'uting ou' 0x74 0x20 0x6F 0x66 0x20 0x61 0x69 0x72 // 't of air' 0x70 0x6C 0x61 0x6E 0x65 0x73 0x2C 0x20 // 'planes, ' 0x61 0x6E 0x64 0x20 0x62 0x65 0x69 0x6E // 'and bein' 0x67 0x20 0x61 0x20 0x73 0x74 0x75 0x6E // 'g a stun' 0x74 0x20 0x70 0x69 0x6C 0x6F 0x74 0x20 // 't pilot ' 0x69 0x6E 0x20 0x61 0x69 0x72 0x20 0x73 // 'in air s' 0x68 0x6F 0x77 0x73 0x2E 0x20 0x0D 0x0A // 'hows. ??' 0x4F 0x6E 0x65 0x20 0x64 0x61 0x79 0x20 // 'One day ' 0x73 0x68 0x65 0x20 0x64 0x65 0x63 0x69 // 'she deci' 0x64 0x65 0x64 0x20 0x74 0x6F 0x20 0x74 // 'ded to t' 0x72 0x79 0x20 0x70 0x61 0x72 0x61 0x63 // 'ry parac' 0x68 0x75 0x74 0x69 0x6E 0x67 0x20 0x66 // 'huting f' 0x72 0x6F 0x6D 0x20 0x61 0x20 0x68 0x6F // 'rom a ho' 0x74 0x20 0x61 0x69 0x72 0x20 0x62 0x61 // 't air ba' 0x6C 0x6C 0x6F 0x6F 0x6E 0x2E 0x20 0x54 // 'lloon. T' 0x68 0x65 0x20 0x66 0x61 0x6C 0x6C 0x20 // 'he fall ' 0x77 0x65 0x6E 0x74 0x20 0x6A 0x75 0x73 // 'went jus' 0x74 0x20 0x66 0x69 0x6E 0x65 0x2C 0x20 // 't fine, ' 0x62 0x75 0x74 0x20 0x43 0x6C 0x61 0x75 // 'but Clau' 0x64 0x69 0x61 0x20 0x6C 0x61 0x6E 0x64 // 'dia land' 0x65 0x64 0x20 0x72 0x69 0x67 0x68 0x74 // 'ed right' 0x20 0x69 0x6E 0x20 0x74 0x68 0x65 0x20 // ' in the ' 0x6D 0x69 0x64 0x64 0x6C 0x65 0x20 0x6F // 'middle o' 0x66 0x20 0x61 0x20 0x6D 0x6F 0x76 0x69 // 'f a movi' 0x65 0x20 0x73 0x65 0x74 0x2E 0x20 0x20 // 'e set. ' 0x54 0x68 0x65 0x20 0x64 0x69 0x72 0x65 // 'The dire' 0x63 0x74 0x6F 0x72 0x20 0x68 0x61 0x64 // 'ctor had' 0x20 0x74 0x68 0x65 0x20 0x73 0x63 0x72 // ' the scr' 0x69 0x70 0x74 0x20 0x72 0x65 0x77 0x72 // 'ipt rewr' 0x69 0x74 0x74 0x65 0x6E 0x20 0x6F 0x6E // 'itten on' 0x20 0x74 0x68 0x65 0x20 0x73 0x70 0x6F // ' the spo' 0x74 0x20 0x74 0x6F 0x20 0x69 0x6E 0x63 // 't to inc' 0x6C 0x75 0x64 0x65 0x20 0x43 0x6C 0x61 // 'lude Cla' 0x75 0x64 0x69 0x61 0x92 0x73 0x20 0x73 // 'udias s' 0x74 0x75 0x6E 0x74 0x2E 0x20 0x20 0x54 // 'tunt. T' 0x68 0x61 0x74 0x92 0x73 0x20 0x68 0x6F // 'hats ho' 0x77 0x20 0x43 0x6C 0x61 0x75 0x64 0x69 // 'w Claudi' 0x61 0x20 0x66 0x65 0x6C 0x6C 0x20 0x69 // 'a fell i' 0x6E 0x74 0x6F 0x20 0x61 0x63 0x74 0x69 // 'nto acti' 0x6E 0x67 0x2E 0x20 0x41 0x6E 0x64 0x20 // 'ng. And ' 0x73 0x68 0x65 0x27 0x73 0x20 0x62 0x65 // 'she's be' 0x65 0x6E 0x20 0x64 0x6F 0x69 0x6E 0x67 // 'en doing' 0x20 0x69 0x74 0x20 0x65 0x76 0x65 0x72 // ' it ever' 0x20 0x73 0x69 0x6E 0x63 0x65 0x2E 0x20 // ' since. ' 0x0D 0x0A // '??' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_53= ktipbio42 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_53, __HELP_NAME("ktipbio42")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_53, __HELP_NAME("ktipbio42")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_52=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_53, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio42" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_52=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_53, 0x0) BYTE 0x01 0x00 0x03 0x03 0x36 0x01 0x00 0x00 // '????6???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_52=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_52, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x86 0x03 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xED 0x02 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_52=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_52, 0x0) BYTE 0x03 0x03 0x48 0x69 0x70 0x70 0x69 0x65 // '??Hippie' 0x0D 0x0A 0x4F 0x6E 0x65 0x20 0x6F 0x66 // '??One of' 0x20 0x74 0x68 0x65 0x20 0x72 0x6F 0x6C // ' the rol' 0x65 0x73 0x20 0x43 0x6C 0x61 0x75 0x64 // 'es Claud' 0x69 0x61 0x20 0x77 0x6F 0x75 0x6C 0x64 // 'ia would' 0x20 0x6C 0x69 0x6B 0x65 0x20 0x74 0x6F // ' like to' 0x20 0x70 0x6C 0x61 0x79 0x20 0x69 0x73 // ' play is' 0x20 0x61 0x20 0x68 0x69 0x70 0x70 0x69 // ' a hippi' 0x65 0x2C 0x20 0x62 0x75 0x74 0x20 0x68 // 'e, but h' 0x65 0x72 0x20 0x68 0x69 0x70 0x70 0x69 // 'er hippi' 0x65 0x20 0x6C 0x6F 0x6F 0x6B 0x20 0x77 // 'e look w' 0x6F 0x75 0x6C 0x64 0x20 0x62 0x65 0x20 // 'ould be ' 0x61 0x20 0x63 0x6F 0x76 0x65 0x72 0x20 // 'a cover ' 0x66 0x6F 0x72 0x20 0x68 0x65 0x72 0x20 // 'for her ' 0x72 0x65 0x61 0x6C 0x20 0x6D 0x69 0x73 // 'real mis' 0x73 0x69 0x6F 0x6E 0x97 0x74 0x6F 0x20 // 'sionto ' 0x66 0x69 0x6E 0x64 0x20 0x61 0x6E 0x6F // 'find ano' 0x74 0x68 0x65 0x72 0x20 0x68 0x69 0x70 // 'ther hip' 0x70 0x69 0x65 0x20 0x77 0x68 0x6F 0x20 // 'pie who ' 0x64 0x69 0x73 0x61 0x70 0x70 0x65 0x61 // 'disappea' 0x72 0x65 0x64 0x20 0x62 0x61 0x63 0x6B // 'red back' 0x20 0x69 0x6E 0x20 0x74 0x68 0x65 0x20 // ' in the ' 0x36 0x30 0x73 0x20 0x69 0x6E 0x20 0x73 // '60s in s' 0x6F 0x6D 0x65 0x20 0x73 0x6F 0x72 0x74 // 'ome sort' 0x20 0x6F 0x66 0x20 0x66 0x75 0x6E 0x6B // ' of funk' 0x79 0x20 0x68 0x61 0x75 0x6E 0x74 0x65 // 'y haunte' 0x64 0x20 0x68 0x6F 0x75 0x73 0x65 0x2E // 'd house.' 0x20 0x20 0x54 0x68 0x65 0x20 0x68 0x69 // ' The hi' 0x70 0x70 0x69 0x65 0x92 0x73 0x20 0x6E // 'ppies n' 0x61 0x6D 0x65 0x20 0x77 0x61 0x73 0x20 // 'ame was ' 0x4A 0x65 0x72 0x65 0x6D 0x79 0x2C 0x20 // 'Jeremy, ' 0x61 0x6E 0x64 0x20 0x49 0x6E 0x64 0x69 // 'and Indi' 0x61 0x6E 0x20 0x73 0x74 0x6F 0x72 0x79 // 'an story' 0x2D 0x74 0x65 0x6C 0x6C 0x65 0x72 0x73 // '-tellers' 0x20 0x77 0x68 0x6F 0x20 0x6D 0x65 0x74 // ' who met' 0x20 0x68 0x69 0x6D 0x20 0x72 0x65 0x6D // ' him rem' 0x65 0x6D 0x62 0x65 0x72 0x20 0x68 0x6F // 'ember ho' 0x77 0x20 0x68 0x65 0x20 0x63 0x6F 0x75 // 'w he cou' 0x6C 0x64 0x20 0x73 0x6D 0x65 0x6C 0x6C // 'ld smell' 0x20 0x73 0x6F 0x6D 0x65 0x6F 0x6E 0x65 // ' someone' 0x92 0x73 0x20 0x66 0x75 0x74 0x75 0x72 // 's futur' 0x65 0x20 0x69 0x6E 0x20 0x74 0x68 0x65 // 'e in the' 0x69 0x72 0x20 0x68 0x61 0x69 0x72 0x2E // 'ir hair.' 0x20 0x20 0x53 0x6F 0x2C 0x20 0x62 0x65 // ' So, be' 0x69 0x6E 0x67 0x20 0x72 0x65 0x61 0x6C // 'ing real' 0x6C 0x79 0x20 0x67 0x72 0x6F 0x6F 0x76 // 'ly groov' 0x79 0x2C 0x20 0x43 0x6C 0x61 0x75 0x64 // 'y, Claud' 0x69 0x61 0x20 0x77 0x6F 0x75 0x6C 0x64 // 'ia would' 0x20 0x67 0x6F 0x20 0x74 0x6F 0x20 0x74 // ' go to t' 0x68 0x65 0x20 0x68 0x61 0x75 0x6E 0x74 // 'he haunt' 0x65 0x64 0x20 0x68 0x6F 0x75 0x73 0x65 // 'ed house' 0x20 0x61 0x6E 0x64 0x20 0x74 0x65 0x6C // ' and tel' 0x6C 0x20 0x74 0x68 0x65 0x20 0x6F 0x77 // 'l the ow' 0x6E 0x65 0x72 0x20 0x74 0x68 0x61 0x74 // 'ner that' 0x20 0x73 0x68 0x65 0x20 0x77 0x61 0x73 // ' she was' 0x20 0x61 0x20 0x6C 0x61 0x74 0x65 0x2D // ' a late-' 0x62 0x6C 0x6F 0x6F 0x6D 0x69 0x6E 0x67 // 'blooming' 0x20 0x62 0x75 0x74 0x20 0x68 0x6F 0x6D // ' but hom' 0x65 0x6C 0x65 0x73 0x73 0x20 0x68 0x69 // 'eless hi' 0x70 0x70 0x69 0x65 0x2C 0x20 0x61 0x6E // 'ppie, an' 0x64 0x20 0x61 0x73 0x6B 0x20 0x69 0x66 // 'd ask if' 0x20 0x73 0x68 0x65 0x20 0x63 0x6F 0x75 // ' she cou' 0x6C 0x64 0x20 0x73 0x70 0x65 0x6E 0x64 // 'ld spend' 0x20 0x6A 0x75 0x73 0x74 0x20 0x6F 0x6E // ' just on' 0x65 0x20 0x6E 0x69 0x67 0x68 0x74 0x2E // 'e night.' 0x20 0x20 0x54 0x68 0x65 0x20 0x65 0x76 // ' The ev' 0x69 0x6C 0x20 0x6F 0x77 0x6E 0x65 0x72 // 'il owner' 0x20 0x77 0x6F 0x75 0x6C 0x64 0x20 0x67 // ' would g' 0x6C 0x61 0x64 0x6C 0x79 0x20 0x69 0x6E // 'ladly in' 0x76 0x69 0x74 0x65 0x20 0x68 0x65 0x72 // 'vite her' 0x20 0x69 0x6E 0x73 0x69 0x64 0x65 0x2C // ' inside,' 0x20 0x74 0x68 0x69 0x6E 0x6B 0x69 0x6E // ' thinkin' 0x67 0x20 0x68 0x65 0x20 0x68 0x61 0x64 // 'g he had' 0x20 0x63 0x61 0x70 0x74 0x75 0x72 0x65 // ' capture' 0x64 0x20 0x79 0x65 0x74 0x20 0x61 0x6E // 'd yet an' 0x6F 0x74 0x68 0x65 0x72 0x20 0x70 0x65 // 'other pe' 0x72 0x73 0x6F 0x6E 0x2E 0x20 0x20 0x42 // 'rson. B' 0x75 0x74 0x20 0x74 0x68 0x65 0x20 0x6F // 'ut the o' 0x77 0x6E 0x65 0x72 0x20 0x77 0x6F 0x75 // 'wner wou' 0x6C 0x64 0x20 0x6E 0x6F 0x74 0x20 0x6B // 'ld not k' 0x6E 0x6F 0x77 0x20 0x74 0x68 0x61 0x74 // 'now that' 0x20 0x43 0x6C 0x61 0x75 0x64 0x69 0x61 // ' Claudia' 0x20 0x63 0x61 0x6E 0x20 0x73 0x68 0x72 // ' can shr' 0x69 0x6E 0x6B 0x20 0x61 0x6E 0x64 0x20 // 'ink and ' 0x73 0x71 0x75 0x61 0x73 0x68 0x20 0x73 // 'squash s' 0x6F 0x20 0x73 0x6D 0x61 0x6C 0x6C 0x20 // 'o small ' 0x74 0x68 0x61 0x74 0x20 0x73 0x68 0x65 // 'that she' 0x20 0x63 0x61 0x6E 0x20 0x73 0x6E 0x65 // ' can sne' 0x61 0x6B 0x20 0x61 0x6C 0x6D 0x6F 0x73 // 'ak almos' 0x74 0x20 0x61 0x6E 0x79 0x77 0x68 0x65 // 't anywhe' 0x72 0x65 0x20 0x77 0x69 0x74 0x68 0x6F // 're witho' 0x75 0x74 0x20 0x61 0x6E 0x79 0x6F 0x6E // 'ut anyon' 0x65 0x20 0x73 0x65 0x65 0x69 0x6E 0x67 // 'e seeing' 0x20 0x68 0x65 0x72 0x2E 0x0D 0x0A 0x42 // ' her.??B' 0x75 0x74 0x20 0x77 0x69 0x6C 0x6C 0x20 // 'ut will ' 0x74 0x68 0x65 0x20 0x74 0x69 0x6E 0x79 // 'the tiny' 0x20 0x43 0x6C 0x61 0x75 0x64 0x69 0x61 // ' Claudia' 0x20 0x62 0x65 0x20 0x73 0x6E 0x69 0x66 // ' be snif' 0x66 0x65 0x64 0x20 0x6F 0x75 0x74 0x20 // 'fed out ' 0x62 0x79 0x20 0x74 0x68 0x65 0x20 0x6F // 'by the o' 0x77 0x6E 0x65 0x72 0x73 0x20 0x64 0x69 // 'wners di' 0x72 0x74 0x79 0x20 0x72 0x61 0x74 0x73 // 'rty rats' 0x20 0x61 0x6E 0x64 0x20 0x62 0x65 0x63 // ' and bec' 0x6F 0x6D 0x65 0x20 0x70 0x61 0x72 0x74 // 'ome part' 0x20 0x6F 0x66 0x20 0x74 0x68 0x65 0x69 // ' of thei' 0x72 0x20 0x64 0x69 0x6E 0x6E 0x65 0x72 // 'r dinner' 0x3F 0x20 0x20 0x48 0x6F 0x77 0x20 0x77 // '? How w' 0x69 0x6C 0x6C 0x20 0x73 0x68 0x65 0x20 // 'ill she ' 0x67 0x65 0x74 0x20 0x66 0x72 0x65 0x65 // 'get free' 0x3F 0x20 0x20 0x41 0x6E 0x64 0x20 0x68 // '? And h' 0x6F 0x77 0x20 0x77 0x69 0x6C 0x6C 0x20 // 'ow will ' 0x73 0x68 0x65 0x20 0x66 0x69 0x6E 0x64 // 'she find' 0x20 0x4A 0x65 0x72 0x65 0x6D 0x79 0x3F // ' Jeremy?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_54= ktipbio43 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_54, __HELP_NAME("ktipbio43")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_54, __HELP_NAME("ktipbio43")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_54=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_54, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio43" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_54=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_54, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_54=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_54, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x19 0x02 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xE1 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_54=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_54, 0x0) BYTE 0x03 0x03 0x43 0x6F 0x70 0x0D 0x0A 0x43 // '??Cop??C' 0x6C 0x61 0x75 0x64 0x69 0x61 0x20 0x6C // 'laudia l' 0x6F 0x76 0x65 0x73 0x20 0x64 0x61 0x6E // 'oves dan' 0x67 0x65 0x72 0x2C 0x20 0x62 0x75 0x74 // 'ger, but' 0x20 0x73 0x68 0x65 0x20 0x68 0x61 0x74 // ' she hat' 0x65 0x73 0x20 0x76 0x69 0x6F 0x6C 0x65 // 'es viole' 0x6E 0x63 0x65 0x2E 0x20 0x20 0x53 0x6F // 'nce. So' 0x20 0x6F 0x6E 0x65 0x20 0x6F 0x66 0x20 // ' one of ' 0x68 0x65 0x72 0x20 0x64 0x72 0x65 0x61 // 'her drea' 0x6D 0x20 0x72 0x6F 0x6C 0x65 0x73 0x20 // 'm roles ' 0x77 0x6F 0x75 0x6C 0x64 0x20 0x62 0x65 // 'would be' 0x20 0x70 0x6C 0x61 0x79 0x69 0x6E 0x67 // ' playing' 0x20 0x61 0x20 0x63 0x6F 0x70 0x20 0x77 // ' a cop w' 0x68 0x6F 0x20 0x68 0x61 0x73 0x20 0x61 // 'ho has a' 0x20 0x73 0x70 0x65 0x63 0x69 0x61 0x6C // ' special' 0x20 0x74 0x69 0x65 0x20 0x74 0x68 0x61 // ' tie tha' 0x74 0x20 0x70 0x75 0x74 0x73 0x20 0x62 // 't puts b' 0x61 0x64 0x20 0x67 0x75 0x79 0x73 0x20 // 'ad guys ' 0x73 0x68 0x65 0x20 0x63 0x61 0x74 0x63 // 'she catc' 0x68 0x65 0x73 0x20 0x74 0x6F 0x20 0x73 // 'hes to s' 0x6C 0x65 0x65 0x70 0x2E 0x20 0x20 0x54 // 'leep. T' 0x68 0x65 0x6E 0x20 0x73 0x68 0x65 0x20 // 'hen she ' 0x6B 0x6E 0x65 0x65 0x6C 0x73 0x20 0x62 // 'kneels b' 0x65 0x73 0x69 0x64 0x65 0x20 0x74 0x68 // 'eside th' 0x65 0x6D 0x20 0x61 0x6E 0x64 0x20 0x72 // 'em and r' 0x65 0x63 0x69 0x74 0x65 0x73 0x20 0x61 // 'ecites a' 0x6E 0x20 0x6F 0x6C 0x64 0x20 0x73 0x74 // 'n old st' 0x6F 0x72 0x79 0x20 0x66 0x72 0x6F 0x6D // 'ory from' 0x20 0x49 0x6E 0x64 0x69 0x61 0x20 0x61 // ' India a' 0x62 0x6F 0x75 0x74 0x20 0x68 0x6F 0x77 // 'bout how' 0x20 0x74 0x68 0x65 0x79 0x20 0x6E 0x65 // ' they ne' 0x65 0x64 0x20 0x74 0x6F 0x20 0x68 0x65 // 'ed to he' 0x6C 0x70 0x20 0x74 0x68 0x65 0x20 0x77 // 'lp the w' 0x6F 0x72 0x6C 0x64 0x20 0x69 0x6E 0x73 // 'orld ins' 0x74 0x65 0x61 0x64 0x20 0x6F 0x66 0x20 // 'tead of ' 0x68 0x75 0x72 0x74 0x69 0x6E 0x67 0x20 // 'hurting ' 0x69 0x74 0x2E 0x20 0x20 0x57 0x68 0x65 // 'it. Whe' 0x6E 0x20 0x74 0x68 0x65 0x79 0x20 0x77 // 'n they w' 0x61 0x6B 0x65 0x20 0x75 0x70 0x2C 0x20 // 'ake up, ' 0x74 0x68 0x65 0x20 0x63 0x72 0x69 0x6D // 'the crim' 0x69 0x6E 0x61 0x6C 0x73 0x20 0x61 0x72 // 'inals ar' 0x65 0x20 0x74 0x72 0x61 0x6E 0x73 0x66 // 'e transf' 0x6F 0x72 0x6D 0x65 0x64 0x20 0x66 0x72 // 'ormed fr' 0x6F 0x6D 0x20 0x62 0x61 0x64 0x20 0x67 // 'om bad g' 0x75 0x79 0x73 0x20 0x74 0x6F 0x20 0x67 // 'uys to g' 0x6F 0x6F 0x64 0x20 0x67 0x75 0x79 0x73 // 'ood guys' 0x2E 0x20 0x20 0x42 0x75 0x74 0x20 0x73 // '. But s' 0x6F 0x6D 0x65 0x20 0x6F 0x66 0x20 0x74 // 'ome of t' 0x68 0x65 0x20 0x62 0x61 0x64 0x20 0x67 // 'he bad g' 0x75 0x79 0x73 0x20 0x63 0x61 0x74 0x63 // 'uys catc' 0x68 0x20 0x6F 0x6E 0x74 0x6F 0x20 0x68 // 'h onto h' 0x65 0x72 0x20 0x74 0x72 0x69 0x63 0x6B // 'er trick' 0x20 0x61 0x6E 0x64 0x20 0x74 0x68 0x72 // ' and thr' 0x65 0x61 0x74 0x65 0x6E 0x20 0x74 0x6F // 'eaten to' 0x20 0x73 0x68 0x72 0x69 0x6E 0x6B 0x20 // ' shrink ' 0x43 0x6C 0x61 0x75 0x64 0x69 0x61 0x20 // 'Claudia ' 0x73 0x6F 0x20 0x73 0x68 0x65 0x20 0x63 // 'so she c' 0x61 0x6E 0x92 0x74 0x20 0x74 0x72 0x61 // 'ant tra' 0x6E 0x73 0x66 0x6F 0x72 0x6D 0x20 0x74 // 'nsform t' 0x68 0x65 0x6D 0x20 0x74 0x6F 0x6F 0x2E // 'hem too.' 0x20 0x0D 0x0A 0x48 0x6F 0x77 0x20 0x77 // ' ??How w' 0x69 0x6C 0x6C 0x20 0x43 0x6C 0x61 0x75 // 'ill Clau' 0x64 0x69 0x61 0x20 0x73 0x74 0x6F 0x70 // 'dia stop' 0x20 0x74 0x68 0x65 0x69 0x72 0x20 0x70 // ' their p' 0x6C 0x61 0x6E 0x20 0x61 0x6E 0x64 0x20 // 'lan and ' 0x70 0x72 0x6F 0x74 0x65 0x63 0x74 0x20 // 'protect ' 0x68 0x65 0x72 0x20 0x70 0x6F 0x77 0x65 // 'her powe' 0x72 0x73 0x3F // 'rs?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_55= ktipbio44 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_55, __HELP_NAME("ktipbio44")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_55, __HELP_NAME("ktipbio44")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_59=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_55, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio44" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_59=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_55, 0x0) BYTE 0x01 0x00 0x03 0x03 0xDC 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_59=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_59, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x4D 0x02 0x00 0x01 // '????M???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xCB 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_59=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_59, 0x0) BYTE 0x03 0x03 0x50 0x69 0x6C 0x6F 0x74 0x0D // '??Pilot?' 0x0A 0x43 0x6C 0x61 0x75 0x64 0x69 0x61 // '?Claudia' 0x20 0x69 0x6D 0x61 0x67 0x69 0x6E 0x65 // ' imagine' 0x73 0x20 0x70 0x6C 0x61 0x79 0x69 0x6E // 's playin' 0x67 0x20 0x61 0x20 0x73 0x70 0x61 0x63 // 'g a spac' 0x65 0x20 0x63 0x6F 0x70 0x20 0x69 0x6E // 'e cop in' 0x20 0x74 0x68 0x65 0x20 0x79 0x65 0x61 // ' the yea' 0x72 0x20 0x32 0x30 0x38 0x30 0x2E 0x20 // 'r 2080. ' 0x20 0x42 0x79 0x20 0x74 0x68 0x65 0x6E // ' By then' 0x2C 0x20 0x61 0x6C 0x6C 0x20 0x74 0x68 // ', all th' 0x65 0x20 0x63 0x6F 0x70 0x73 0x20 0x77 // 'e cops w' 0x69 0x6C 0x6C 0x20 0x64 0x72 0x69 0x76 // 'ill driv' 0x65 0x20 0x73 0x70 0x61 0x63 0x65 0x20 // 'e space ' 0x72 0x6F 0x63 0x6B 0x65 0x74 0x73 0x20 // 'rockets ' 0x69 0x6E 0x73 0x74 0x65 0x61 0x64 0x20 // 'instead ' 0x6F 0x66 0x20 0x70 0x61 0x74 0x72 0x6F // 'of patro' 0x6C 0x20 0x63 0x61 0x72 0x73 0x2E 0x20 // 'l cars. ' 0x20 0x49 0x6E 0x20 0x74 0x68 0x69 0x73 // ' In this' 0x20 0x72 0x6F 0x6C 0x65 0x2C 0x20 0x43 // ' role, C' 0x6C 0x61 0x75 0x64 0x69 0x61 0x20 0x77 // 'laudia w' 0x6F 0x75 0x6C 0x64 0x20 0x63 0x61 0x70 // 'ould cap' 0x74 0x75 0x72 0x65 0x20 0x74 0x68 0x65 // 'ture the' 0x20 0x53 0x71 0x75 0x61 0x73 0x68 0x65 // ' Squashe' 0x72 0x2C 0x20 0x74 0x68 0x65 0x20 0x77 // 'r, the w' 0x65 0x69 0x72 0x64 0x20 0x67 0x75 0x79 // 'eird guy' 0x20 0x77 0x68 0x6F 0x20 0x63 0x61 0x6E // ' who can' 0x92 0x74 0x20 0x73 0x74 0x61 0x6E 0x64 // 't stand' 0x20 0x6B 0x69 0x64 0x73 0x20 0x61 0x6E // ' kids an' 0x64 0x20 0x74 0x72 0x61 0x6E 0x73 0x66 // 'd transf' 0x6F 0x72 0x6D 0x73 0x20 0x65 0x76 0x65 // 'orms eve' 0x72 0x79 0x20 0x6B 0x69 0x64 0x20 0x68 // 'ry kid h' 0x65 0x20 0x73 0x65 0x65 0x73 0x20 0x69 // 'e sees i' 0x6E 0x74 0x6F 0x20 0x61 0x20 0x73 0x71 // 'nto a sq' 0x75 0x61 0x73 0x68 0x65 0x64 0x20 0x6D // 'uashed m' 0x65 0x73 0x73 0x2E 0x20 0x0D 0x0A 0x53 // 'ess. ??S' 0x68 0x65 0x20 0x73 0x70 0x6F 0x74 0x73 // 'he spots' 0x20 0x53 0x71 0x75 0x61 0x73 0x68 0x65 // ' Squashe' 0x72 0x20 0x66 0x6C 0x79 0x69 0x6E 0x67 // 'r flying' 0x20 0x68 0x69 0x73 0x20 0x6A 0x65 0x74 // ' his jet' 0x20 0x70 0x6C 0x61 0x6E 0x65 0x2C 0x20 // ' plane, ' 0x61 0x6E 0x64 0x20 0x74 0x61 0x6B 0x65 // 'and take' 0x73 0x20 0x6F 0x66 0x66 0x20 0x69 0x6E // 's off in' 0x20 0x68 0x65 0x72 0x20 0x72 0x6F 0x63 // ' her roc' 0x6B 0x65 0x74 0x20 0x74 0x6F 0x20 0x63 // 'ket to c' 0x61 0x74 0x63 0x68 0x20 0x68 0x69 0x6D // 'atch him' 0x2E 0x20 0x20 0x42 0x75 0x74 0x20 0x74 // '. But t' 0x68 0x65 0x6E 0x2C 0x20 0x6A 0x75 0x73 // 'hen, jus' 0x74 0x20 0x61 0x73 0x20 0x73 0x68 0x65 // 't as she' 0x20 0x6C 0x61 0x6E 0x64 0x73 0x2C 0x20 // ' lands, ' 0x74 0x68 0x65 0x72 0x65 0x20 0x69 0x73 // 'there is' 0x20 0x61 0x20 0x68 0x75 0x67 0x65 0x20 // ' a huge ' 0x65 0x78 0x70 0x6C 0x6F 0x73 0x69 0x6F // 'explosio' 0x6E 0x2C 0x20 0x61 0x6E 0x64 0x20 0x74 // 'n, and t' 0x68 0x65 0x20 0x53 0x71 0x75 0x61 0x73 // 'he Squas' 0x68 0x65 0x72 0x20 0x69 0x73 0x20 0x6E // 'her is n' 0x6F 0x77 0x68 0x65 0x72 0x65 0x20 0x74 // 'owhere t' 0x6F 0x20 0x62 0x65 0x20 0x73 0x65 0x65 // 'o be see' 0x6E 0x2E 0x20 0x0D 0x0A 0x48 0x61 0x73 // 'n. ??Has' 0x20 0x74 0x68 0x65 0x20 0x53 0x71 0x75 // ' the Squ' 0x61 0x73 0x68 0x65 0x72 0x20 0x67 0x6F // 'asher go' 0x74 0x74 0x65 0x6E 0x20 0x61 0x77 0x61 // 'tten awa' 0x79 0x20 0x61 0x67 0x61 0x69 0x6E 0x3F // 'y again?' 0x20 0x20 0x44 0x69 0x64 0x20 0x68 0x65 // ' Did he' 0x20 0x70 0x61 0x72 0x61 0x63 0x68 0x75 // ' parachu' 0x74 0x65 0x20 0x74 0x6F 0x20 0x73 0x61 // 'te to sa' 0x66 0x65 0x74 0x79 0x20 0x62 0x65 0x66 // 'fety bef' 0x6F 0x72 0x65 0x20 0x74 0x68 0x65 0x20 // 'ore the ' 0x65 0x78 0x70 0x6C 0x6F 0x73 0x69 0x6F // 'explosio' 0x6E 0x3F 0x20 0x20 0x41 0x6E 0x64 0x20 // 'n? And ' 0x63 0x61 0x6E 0x20 0x43 0x6C 0x61 0x75 // 'can Clau' 0x64 0x69 0x61 0x20 0x66 0x69 0x6E 0x64 // 'dia find' 0x20 0x68 0x69 0x6D 0x20 0x61 0x6E 0x64 // ' him and' 0x20 0x62 0x72 0x69 0x6E 0x67 0x20 0x68 // ' bring h' 0x69 0x6D 0x20 0x69 0x6E 0x3F 0x20 // 'im in? ' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_56= ktipbio45 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_56, __HELP_NAME("ktipbio45")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_56, __HELP_NAME("ktipbio45")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_55=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_56, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio45" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_55=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_56, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_55=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_55, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xBF 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xAE 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_55=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_55, 0x0) BYTE 0x03 0x03 0x69 0x73 0x6C 0x61 0x6E 0x64 // '??island' 0x0D 0x0A 0x43 0x72 0x61 0x73 0x68 0x20 // '??Crash ' 0x69 0x73 0x20 0x6D 0x61 0x64 0x65 0x20 // 'is made ' 0x6F 0x66 0x20 0x6D 0x65 0x74 0x61 0x6C // 'of metal' 0x2C 0x20 0x73 0x6F 0x20 0x68 0x65 0x20 // ', so he ' 0x63 0x6F 0x75 0x6C 0x64 0x6E 0x92 0x74 // 'couldnt' 0x20 0x73 0x77 0x69 0x6D 0x20 0x6F 0x66 // ' swim of' 0x66 0x20 0x74 0x68 0x65 0x20 0x69 0x73 // 'f the is' 0x6C 0x61 0x6E 0x64 0x2E 0x20 0x20 0x49 // 'land. I' 0x6E 0x73 0x74 0x65 0x61 0x64 0x20 0x68 // 'nstead h' 0x65 0x20 0x70 0x72 0x61 0x63 0x74 0x69 // 'e practi' 0x63 0x65 0x64 0x20 0x72 0x75 0x6E 0x6E // 'ced runn' 0x69 0x6E 0x67 0x20 0x61 0x6E 0x64 0x20 // 'ing and ' 0x6A 0x75 0x6D 0x70 0x69 0x6E 0x67 0x2E // 'jumping.' 0x20 0x20 0x4D 0x61 0x79 0x62 0x65 0x20 // ' Maybe ' 0x77 0x69 0x74 0x68 0x20 0x68 0x69 0x73 // 'with his' 0x20 0x72 0x6F 0x62 0x6F 0x74 0x20 0x6C // ' robot l' 0x65 0x67 0x73 0x20 0x68 0x65 0x20 0x63 // 'egs he c' 0x6F 0x75 0x6C 0x64 0x20 0x6A 0x75 0x6D // 'ould jum' 0x70 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 // 'p to the' 0x20 0x6E 0x65 0x78 0x74 0x20 0x69 0x73 // ' next is' 0x6C 0x61 0x6E 0x64 0x21 0x20 0x0D 0x0A // 'land! ??' 0x48 0x65 0x20 0x6A 0x75 0x6D 0x70 0x65 // 'He jumpe' 0x64 0x20 0x66 0x61 0x72 0x20 0x65 0x6E // 'd far en' 0x6F 0x75 0x67 0x68 0x2C 0x20 0x61 0x6C // 'ough, al' 0x6C 0x20 0x72 0x69 0x67 0x68 0x74 0x97 // 'l right' 0x61 0x6E 0x64 0x20 0x6C 0x61 0x6E 0x64 // 'and land' 0x65 0x64 0x20 0x61 0x74 0x20 0x74 0x68 // 'ed at th' 0x65 0x20 0x64 0x6F 0x6F 0x72 0x20 0x6F // 'e door o' 0x66 0x20 0x61 0x20 0x66 0x61 0x6D 0x6F // 'f a famo' 0x75 0x73 0x20 0x43 0x68 0x69 0x6E 0x65 // 'us Chine' 0x73 0x65 0x20 0x72 0x65 0x73 0x74 0x61 // 'se resta' 0x75 0x72 0x61 0x6E 0x74 0x20 0x77 0x68 // 'urant wh' 0x65 0x72 0x65 0x20 0x61 0x20 0x67 0x72 // 'ere a gr' 0x6F 0x75 0x70 0x20 0x6F 0x66 0x20 0x6D // 'oup of m' 0x6F 0x76 0x69 0x65 0x20 0x73 0x74 0x61 // 'ovie sta' 0x72 0x73 0x20 0x77 0x65 0x72 0x65 0x20 // 'rs were ' 0x65 0x61 0x74 0x69 0x6E 0x67 0x2E 0x20 // 'eating. ' 0x20 0x45 0x76 0x65 0x72 0x79 0x6F 0x6E // ' Everyon' 0x65 0x20 0x63 0x72 0x6F 0x77 0x64 0x65 // 'e crowde' 0x64 0x20 0x61 0x72 0x6F 0x75 0x6E 0x64 // 'd around' 0x20 0x68 0x69 0x6D 0x20 0x77 0x69 0x74 // ' him wit' 0x68 0x20 0x74 0x68 0x65 0x69 0x72 0x20 // 'h their ' 0x63 0x68 0x6F 0x70 0x73 0x74 0x69 0x63 // 'chopstic' 0x6B 0x73 0x2C 0x20 0x62 0x75 0x74 0x20 // 'ks, but ' 0x6F 0x6E 0x65 0x20 0x61 0x63 0x74 0x6F // 'one acto' 0x72 0x20 0x73 0x6E 0x65 0x61 0x6B 0x65 // 'r sneake' 0x64 0x20 0x75 0x70 0x20 0x62 0x65 0x68 // 'd up beh' 0x69 0x6E 0x64 0x20 0x43 0x72 0x61 0x73 // 'ind Cras' 0x68 0x20 0x61 0x6E 0x64 0x20 0x77 0x68 // 'h and wh' 0x69 0x73 0x6B 0x65 0x64 0x20 0x68 0x69 // 'isked hi' 0x6D 0x20 0x61 0x77 0x61 0x79 0x20 0x74 // 'm away t' 0x6F 0x20 0x73 0x65 0x65 0x20 0x4D 0x63 // 'o see Mc' 0x5A 0x65 0x65 0x2C 0x20 0x74 0x68 0x65 // 'Zee, the' 0x20 0x66 0x61 0x6D 0x6F 0x75 0x73 0x20 // ' famous ' 0x64 0x69 0x72 0x65 0x63 0x74 0x6F 0x72 // 'director' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_57= ktipbio46 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_57, __HELP_NAME("ktipbio46")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_57, __HELP_NAME("ktipbio46")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_8=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_57, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio46" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_8=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_57, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_8=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xE9 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x77 0x01 0x00 0x82 // '????w??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_8=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) BYTE 0x03 0x03 0x57 0x69 0x6C 0x6C 0x79 0x92 // '??Willy' 0x73 0x20 0x49 0x6E 0x76 0x65 0x6E 0x74 // 's Invent' 0x69 0x6F 0x6E 0x0D 0x0A 0x4D 0x6F 0x73 // 'ion??Mos' 0x74 0x6C 0x79 0x2C 0x20 0x43 0x72 0x61 // 'tly, Cra' 0x73 0x68 0x20 0x77 0x61 0x6E 0x74 0x73 // 'sh wants' 0x20 0x61 0x20 0x66 0x61 0x74 0x68 0x65 // ' a fathe' 0x72 0x20 0x66 0x69 0x67 0x75 0x72 0x65 // 'r figure' 0x2E 0x20 0x20 0x48 0x65 0x20 0x64 0x72 // '. He dr' 0x65 0x61 0x6D 0x73 0x20 0x6F 0x66 0x20 // 'eams of ' 0x62 0x65 0x69 0x6E 0x67 0x20 0x69 0x6E // 'being in' 0x20 0x61 0x20 0x6D 0x6F 0x76 0x69 0x65 // ' a movie' 0x20 0x77 0x68 0x65 0x72 0x65 0x20 0x68 // ' where h' 0x65 0x92 0x64 0x20 0x62 0x65 0x20 0x69 // 'ed be i' 0x6E 0x76 0x65 0x6E 0x74 0x65 0x64 0x20 // 'nvented ' 0x62 0x79 0x20 0x61 0x20 0x73 0x63 0x69 // 'by a sci' 0x65 0x6E 0x74 0x69 0x73 0x74 0x20 0x6E // 'entist n' 0x61 0x6D 0x65 0x64 0x20 0x57 0x69 0x6C // 'amed Wil' 0x6C 0x79 0x2C 0x20 0x61 0x20 0x67 0x72 // 'ly, a gr' 0x65 0x65 0x6E 0x20 0x73 0x63 0x69 0x65 // 'een scie' 0x6E 0x74 0x69 0x73 0x74 0x20 0x77 0x68 // 'ntist wh' 0x6F 0x20 0x77 0x61 0x6E 0x74 0x73 0x20 // 'o wants ' 0x43 0x72 0x61 0x73 0x68 0x20 0x74 0x6F // 'Crash to' 0x20 0x68 0x65 0x6C 0x70 0x20 0x68 0x69 // ' help hi' 0x6D 0x20 0x67 0x75 0x61 0x72 0x64 0x20 // 'm guard ' 0x74 0x68 0x65 0x20 0x6C 0x61 0x62 0x6F // 'the labo' 0x72 0x61 0x74 0x6F 0x72 0x79 0x20 0x61 // 'ratory a' 0x67 0x61 0x69 0x6E 0x73 0x74 0x20 0x61 // 'gainst a' 0x20 0x67 0x69 0x61 0x6E 0x74 0x20 0x72 // ' giant r' 0x61 0x74 0x2E 0x20 0x20 0x54 0x68 0x65 // 'at. The' 0x20 0x72 0x61 0x74 0x20 0x68 0x61 0x73 // ' rat has' 0x20 0x67 0x72 0x6F 0x77 0x6E 0x20 0x73 // ' grown s' 0x6F 0x20 0x6C 0x61 0x72 0x67 0x65 0x20 // 'o large ' 0x62 0x79 0x20 0x64 0x72 0x69 0x6E 0x6B // 'by drink' 0x69 0x6E 0x67 0x20 0x6F 0x6E 0x65 0x20 // 'ing one ' 0x6F 0x66 0x20 0x57 0x69 0x6C 0x6C 0x79 // 'of Willy' 0x92 0x73 0x20 0x73 0x63 0x69 0x65 0x6E // 's scien' 0x63 0x65 0x20 0x65 0x78 0x70 0x65 0x72 // 'ce exper' 0x69 0x6D 0x65 0x6E 0x74 0x73 0x2E 0x20 // 'iments. ' 0x42 0x75 0x74 0x20 0x74 0x68 0x65 0x20 // 'But the ' 0x72 0x61 0x74 0x20 0x69 0x73 0x20 0x74 // 'rat is t' 0x77 0x69 0x63 0x65 0x20 0x74 0x68 0x65 // 'wice the' 0x20 0x73 0x69 0x7A 0x65 0x20 0x6F 0x66 // ' size of' 0x20 0x43 0x72 0x61 0x73 0x68 0x20 0x61 // ' Crash a' 0x6E 0x64 0x20 0x6D 0x69 0x67 0x68 0x74 // 'nd might' 0x20 0x67 0x65 0x74 0x20 0x65 0x76 0x65 // ' get eve' 0x6E 0x20 0x62 0x69 0x67 0x67 0x65 0x72 // 'n bigger' 0x97 0x66 0x61 0x73 0x74 0x2E 0x20 0x0D // 'fast. ?' 0x0A 0x48 0x6F 0x77 0x20 0x77 0x69 0x6C // '?How wil' 0x6C 0x20 0x43 0x72 0x61 0x73 0x68 0x20 // 'l Crash ' 0x70 0x72 0x6F 0x74 0x65 0x63 0x74 0x20 // 'protect ' 0x68 0x69 0x6D 0x73 0x65 0x6C 0x66 0x20 // 'himself ' 0x61 0x6E 0x64 0x20 0x68 0x69 0x73 0x20 // 'and his ' 0x69 0x6E 0x76 0x65 0x6E 0x74 0x6F 0x72 // 'inventor' 0x20 0x66 0x61 0x74 0x68 0x65 0x72 0x20 // ' father ' 0x66 0x72 0x6F 0x6D 0x20 0x74 0x68 0x65 // 'from the' 0x20 0x72 0x61 0x74 0x20 0x61 0x74 0x74 // ' rat att' 0x61 0x63 0x6B 0x3F 0x20 0x20 0x57 0x69 // 'ack? Wi' 0x6C 0x6C 0x20 0x68 0x69 0x73 0x20 0x6A // 'll his j' 0x75 0x6D 0x70 0x69 0x6E 0x67 0x20 0x73 // 'umping s' 0x6B 0x69 0x6C 0x6C 0x73 0x20 0x68 0x65 // 'kills he' 0x6C 0x70 0x20 0x68 0x69 0x6D 0x20 0x6F // 'lp him o' 0x75 0x74 0x3F // 'ut?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_58= ktipbio47 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_58, __HELP_NAME("ktipbio47")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_58, __HELP_NAME("ktipbio47")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_58=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_58, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio47" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_58=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_58, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_58=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_58, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xE1 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x79 0x01 0x00 0x82 // '????y??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_58=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_58, 0x0) BYTE 0x03 0x03 0x52 0x6F 0x62 0x6F 0x74 0x20 // '??Robot ' 0x43 0x6F 0x70 0x0D 0x0A 0x43 0x72 0x61 // 'Cop??Cra' 0x73 0x68 0x20 0x73 0x65 0x65 0x73 0x20 // 'sh sees ' 0x68 0x69 0x6D 0x73 0x65 0x6C 0x66 0x20 // 'himself ' 0x70 0x6C 0x61 0x79 0x69 0x6E 0x67 0x20 // 'playing ' 0x61 0x20 0x66 0x61 0x72 0x2D 0x6F 0x75 // 'a far-ou' 0x74 0x20 0x63 0x6F 0x70 0x20 0x69 0x6E // 't cop in' 0x20 0x74 0x68 0x65 0x20 0x79 0x65 0x61 // ' the yea' 0x72 0x20 0x32 0x30 0x32 0x30 0x97 0x74 // 'r 2020t' 0x68 0x65 0x20 0x6B 0x69 0x6E 0x64 0x20 // 'he kind ' 0x6F 0x66 0x20 0x63 0x6F 0x70 0x20 0x77 // 'of cop w' 0x68 0x6F 0x20 0x63 0x61 0x6E 0x20 0x77 // 'ho can w' 0x61 0x6C 0x6B 0x20 0x74 0x68 0x72 0x6F // 'alk thro' 0x75 0x67 0x68 0x20 0x77 0x61 0x6C 0x6C // 'ugh wall' 0x73 0x20 0x61 0x6E 0x64 0x20 0x64 0x72 // 's and dr' 0x6F 0x70 0x20 0x74 0x68 0x72 0x6F 0x75 // 'op throu' 0x67 0x68 0x20 0x74 0x68 0x65 0x20 0x66 // 'gh the f' 0x6C 0x6F 0x6F 0x72 0x20 0x74 0x6F 0x20 // 'loor to ' 0x63 0x61 0x74 0x63 0x68 0x20 0x62 0x61 // 'catch ba' 0x64 0x20 0x67 0x75 0x79 0x73 0x2E 0x20 // 'd guys. ' 0x20 0x48 0x69 0x73 0x20 0x70 0x61 0x72 // ' His par' 0x74 0x6E 0x65 0x72 0x20 0x68 0x61 0x73 // 'tner has' 0x20 0x62 0x65 0x65 0x6E 0x20 0x63 0x61 // ' been ca' 0x70 0x74 0x75 0x72 0x65 0x64 0x20 0x62 // 'ptured b' 0x79 0x20 0x63 0x72 0x6F 0x6F 0x6B 0x73 // 'y crooks' 0x20 0x77 0x68 0x6F 0x20 0x77 0x61 0x6E // ' who wan' 0x74 0x20 0x24 0x31 0x20 0x6D 0x69 0x6C // 't $1 mil' 0x6C 0x69 0x6F 0x6E 0x20 0x74 0x6F 0x20 // 'lion to ' 0x73 0x65 0x74 0x20 0x68 0x69 0x6D 0x20 // 'set him ' 0x66 0x72 0x65 0x65 0x2E 0x20 0x20 0x43 // 'free. C' 0x72 0x61 0x73 0x68 0x20 0x70 0x6C 0x61 // 'rash pla' 0x6E 0x73 0x20 0x74 0x6F 0x20 0x6D 0x65 // 'ns to me' 0x65 0x74 0x20 0x74 0x68 0x65 0x6D 0x20 // 'et them ' 0x61 0x74 0x20 0x74 0x68 0x65 0x20 0x63 // 'at the c' 0x6C 0x6F 0x63 0x6B 0x20 0x74 0x6F 0x77 // 'lock tow' 0x65 0x72 0x20 0x61 0x74 0x20 0x6D 0x69 // 'er at mi' 0x64 0x6E 0x69 0x67 0x68 0x74 0x2C 0x20 // 'dnight, ' 0x61 0x6C 0x6F 0x6E 0x65 0x2C 0x20 0x77 // 'alone, w' 0x69 0x74 0x68 0x20 0x74 0x68 0x65 0x20 // 'ith the ' 0x6D 0x6F 0x6E 0x65 0x79 0x2E 0x20 0x20 // 'money. ' 0x41 0x74 0x20 0x6D 0x69 0x64 0x6E 0x69 // 'At midni' 0x67 0x68 0x74 0x2C 0x20 0x43 0x72 0x61 // 'ght, Cra' 0x73 0x68 0x20 0x69 0x73 0x20 0x73 0x75 // 'sh is su' 0x72 0x72 0x6F 0x75 0x6E 0x64 0x65 0x64 // 'rrounded' 0x20 0x62 0x79 0x20 0x33 0x20 0x6D 0x65 // ' by 3 me' 0x61 0x6E 0x2D 0x6C 0x6F 0x6F 0x6B 0x69 // 'an-looki' 0x6E 0x67 0x20 0x67 0x75 0x79 0x73 0x2E // 'ng guys.' 0x20 0x0D 0x0A 0x48 0x6F 0x77 0x20 0x77 // ' ??How w' 0x69 0x6C 0x6C 0x20 0x43 0x72 0x61 0x73 // 'ill Cras' 0x68 0x20 0x64 0x65 0x66 0x65 0x6E 0x64 // 'h defend' 0x20 0x68 0x69 0x6D 0x73 0x65 0x6C 0x66 // ' himself' 0x3F 0x20 0x20 0x41 0x6E 0x64 0x20 0x68 // '? And h' 0x6F 0x77 0x20 0x77 0x69 0x6C 0x6C 0x20 // 'ow will ' 0x68 0x65 0x20 0x67 0x65 0x74 0x20 0x74 // 'he get t' 0x68 0x65 0x6D 0x20 0x74 0x6F 0x20 0x62 // 'hem to b' 0x6C 0x61 0x62 0x20 0x61 0x62 0x6F 0x75 // 'lab abou' 0x74 0x20 0x77 0x68 0x65 0x72 0x65 0x20 // 't where ' 0x74 0x68 0x65 0x79 0x92 0x76 0x65 0x20 // 'theyve ' 0x68 0x69 0x64 0x64 0x65 0x6E 0x20 0x68 // 'hidden h' 0x69 0x73 0x20 0x70 0x61 0x72 0x74 0x6E // 'is partn' 0x65 0x72 0x3F // 'er?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_59= ktipbio48 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_59, __HELP_NAME("ktipbio48")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_59, __HELP_NAME("ktipbio48")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_5A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_59, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio48" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_5A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_59, 0x0) BYTE 0x01 0x00 0x03 0x03 0xDC 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_5A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x8F 0x02 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xEB 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_5A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5A, 0x0) BYTE 0x03 0x03 0x46 0x6C 0x69 0x67 0x68 0x74 // '??Flight' 0x20 0x41 0x74 0x74 0x65 0x6E 0x64 0x61 // ' Attenda' 0x6E 0x74 0x0D 0x0A 0x54 0x68 0x65 0x20 // 'nt??The ' 0x6F 0x6E 0x6C 0x79 0x20 0x66 0x6C 0x61 // 'only fla' 0x77 0x20 0x69 0x6E 0x20 0x43 0x72 0x61 // 'w in Cra' 0x73 0x68 0x92 0x73 0x20 0x72 0x6F 0x62 // 'shs rob' 0x6F 0x74 0x20 0x64 0x65 0x73 0x69 0x67 // 'ot desig' 0x6E 0x20 0x69 0x73 0x20 0x68 0x69 0x73 // 'n is his' 0x20 0x62 0x61 0x74 0x74 0x65 0x72 0x79 // ' battery' 0x2E 0x20 0x20 0x49 0x66 0x20 0x68 0x65 // '. If he' 0x20 0x64 0x6F 0x65 0x73 0x6E 0x92 0x74 // ' doesnt' 0x20 0x73 0x74 0x61 0x79 0x20 0x63 0x68 // ' stay ch' 0x61 0x72 0x67 0x65 0x64 0x2C 0x20 0x68 // 'arged, h' 0x65 0x20 0x66 0x61 0x69 0x6E 0x74 0x73 // 'e faints' 0x20 0x61 0x6E 0x64 0x20 0x66 0x61 0x6C // ' and fal' 0x6C 0x73 0x20 0x6F 0x76 0x65 0x72 0x2E // 'ls over.' 0x20 0x20 0x43 0x72 0x61 0x73 0x68 0x20 // ' Crash ' 0x64 0x72 0x65 0x61 0x6D 0x73 0x20 0x6F // 'dreams o' 0x66 0x20 0x70 0x6C 0x61 0x79 0x69 0x6E // 'f playin' 0x67 0x20 0x61 0x20 0x66 0x6C 0x69 0x67 // 'g a flig' 0x68 0x74 0x20 0x61 0x74 0x74 0x65 0x6E // 'ht atten' 0x64 0x61 0x6E 0x74 0x20 0x6F 0x6E 0x20 // 'dant on ' 0x61 0x20 0x70 0x6C 0x61 0x6E 0x65 0x20 // 'a plane ' 0x77 0x68 0x65 0x72 0x65 0x20 0x74 0x68 // 'where th' 0x65 0x20 0x70 0x69 0x6C 0x6F 0x74 0x20 // 'e pilot ' 0x61 0x6E 0x64 0x20 0x63 0x6F 0x2D 0x70 // 'and co-p' 0x69 0x6C 0x6F 0x74 0x20 0x61 0x72 0x65 // 'ilot are' 0x20 0x62 0x61 0x74 0x74 0x65 0x72 0x79 // ' battery' 0x2D 0x70 0x6F 0x77 0x65 0x72 0x65 0x64 // '-powered' 0x20 0x72 0x6F 0x62 0x6F 0x74 0x73 0x2C // ' robots,' 0x20 0x74 0x6F 0x6F 0x2E 0x20 0x20 0x43 // ' too. C' 0x72 0x61 0x73 0x68 0x92 0x73 0x20 0x6A // 'rashs j' 0x6F 0x62 0x20 0x69 0x73 0x20 0x74 0x6F // 'ob is to' 0x20 0x67 0x72 0x65 0x65 0x74 0x20 0x70 // ' greet p' 0x61 0x73 0x73 0x65 0x6E 0x67 0x65 0x72 // 'assenger' 0x73 0x20 0x61 0x6E 0x64 0x20 0x77 0x61 // 's and wa' 0x74 0x63 0x68 0x20 0x6F 0x75 0x74 0x20 // 'tch out ' 0x74 0x68 0x65 0x20 0x77 0x69 0x6E 0x64 // 'the wind' 0x6F 0x77 0x20 0x66 0x6F 0x72 0x20 0x61 // 'ow for a' 0x20 0x6D 0x79 0x73 0x74 0x65 0x72 0x69 // ' mysteri' 0x6F 0x75 0x73 0x20 0x74 0x72 0x6F 0x70 // 'ous trop' 0x69 0x63 0x61 0x6C 0x20 0x69 0x73 0x6C // 'ical isl' 0x61 0x6E 0x64 0x2E 0x20 0x20 0x54 0x68 // 'and. Th' 0x65 0x20 0x69 0x73 0x6C 0x61 0x6E 0x64 // 'e island' 0x20 0x68 0x61 0x73 0x20 0x61 0x20 0x63 // ' has a c' 0x61 0x76 0x65 0x20 0x77 0x69 0x74 0x68 // 'ave with' 0x20 0x61 0x20 0x6D 0x61 0x67 0x69 0x63 // ' a magic' 0x20 0x70 0x6F 0x77 0x65 0x72 0x20 0x62 // ' power b' 0x6F 0x78 0x20 0x69 0x6E 0x73 0x69 0x64 // 'ox insid' 0x65 0x20 0x74 0x68 0x61 0x74 0x20 0x77 // 'e that w' 0x69 0x6C 0x6C 0x20 0x72 0x65 0x63 0x68 // 'ill rech' 0x61 0x72 0x67 0x65 0x20 0x74 0x68 0x65 // 'arge the' 0x20 0x72 0x6F 0x62 0x6F 0x74 0x73 0x20 // ' robots ' 0x66 0x6F 0x72 0x20 0x6C 0x69 0x66 0x65 // 'for life' 0x2E 0x20 0x20 0x42 0x75 0x74 0x20 0x74 // '. But t' 0x68 0x65 0x79 0x20 0x6F 0x6E 0x6C 0x79 // 'hey only' 0x20 0x68 0x61 0x76 0x65 0x20 0x61 0x20 // ' have a ' 0x66 0x65 0x77 0x20 0x68 0x6F 0x75 0x72 // 'few hour' 0x73 0x20 0x6C 0x65 0x66 0x74 0x20 0x6F // 's left o' 0x6E 0x20 0x74 0x68 0x65 0x69 0x72 0x20 // 'n their ' 0x62 0x61 0x74 0x74 0x65 0x72 0x69 0x65 // 'batterie' 0x73 0x2E 0x20 0x0D 0x0A 0x57 0x69 0x6C // 's. ??Wil' 0x6C 0x20 0x74 0x68 0x65 0x79 0x20 0x66 // 'l they f' 0x69 0x6E 0x64 0x20 0x74 0x68 0x65 0x20 // 'ind the ' 0x69 0x73 0x6C 0x61 0x6E 0x64 0x20 0x61 // 'island a' 0x6E 0x64 0x20 0x74 0x68 0x65 0x20 0x63 // 'nd the c' 0x61 0x76 0x65 0x20 0x62 0x65 0x66 0x6F // 'ave befo' 0x72 0x65 0x20 0x74 0x68 0x65 0x79 0x20 // 're they ' 0x72 0x75 0x6E 0x20 0x6F 0x75 0x74 0x20 // 'run out ' 0x6F 0x66 0x20 0x70 0x2D 0x6F 0x2D 0x77 // 'of p-o-w' 0x2D 0x65 0x2D 0x72 0x2E 0x2E 0x2E 0x3F // '-e-r...?' 0x20 0x20 0x57 0x69 0x74 0x68 0x20 0x6F // ' With o' 0x6E 0x6C 0x79 0x20 0x73 0x65 0x63 0x6F // 'nly seco' 0x6E 0x64 0x73 0x20 0x6C 0x65 0x66 0x74 // 'nds left' 0x2C 0x20 0x68 0x6F 0x77 0x20 0x77 0x69 // ', how wi' 0x6C 0x6C 0x20 0x74 0x68 0x65 0x20 0x72 // 'll the r' 0x6F 0x62 0x6F 0x74 0x73 0x20 0x67 0x65 // 'obots ge' 0x74 0x20 0x61 0x63 0x72 0x6F 0x73 0x73 // 't across' 0x20 0x74 0x68 0x65 0x20 0x73 0x77 0x69 // ' the swi' 0x6E 0x67 0x69 0x6E 0x67 0x20 0x62 0x72 // 'nging br' 0x69 0x64 0x67 0x65 0x20 0x74 0x6F 0x20 // 'idge to ' 0x74 0x68 0x65 0x20 0x63 0x61 0x76 0x65 // 'the cave' 0x3F // '?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_5A= ktipbio49 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5A, __HELP_NAME("ktipbio49")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5A, __HELP_NAME("ktipbio49")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_B6=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5A, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio49" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_B6=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5A, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_B6=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B6, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x02 0x02 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xDC 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_B6=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B6, 0x0) BYTE 0x03 0x03 0x64 0x61 0x6E 0x63 0x69 0x6E // '??dancin' 0x67 0x0D 0x0A 0x48 0x65 0x72 0x20 0x6D // 'g??Her m' 0x6F 0x74 0x68 0x65 0x72 0x20 0x73 0x61 // 'other sa' 0x79 0x73 0x20 0x69 0x74 0x20 0x77 0x69 // 'ys it wi' 0x6C 0x6C 0x20 0x6E 0x65 0x76 0x65 0x72 // 'll never' 0x20 0x68 0x61 0x70 0x70 0x65 0x6E 0x2C // ' happen,' 0x20 0x62 0x75 0x74 0x20 0x45 0x6C 0x69 // ' but Eli' 0x7A 0x61 0x20 0x64 0x72 0x65 0x61 0x6D // 'za dream' 0x73 0x20 0x6F 0x66 0x20 0x62 0x65 0x63 // 's of bec' 0x6F 0x6D 0x69 0x6E 0x67 0x20 0x61 0x6E // 'oming an' 0x20 0x61 0x63 0x74 0x72 0x65 0x73 0x73 // ' actress' 0x20 0x77 0x68 0x6F 0x20 0x63 0x61 0x6E // ' who can' 0x20 0x74 0x61 0x6B 0x65 0x20 0x6F 0x6E // ' take on' 0x20 0x61 0x6E 0x79 0x20 0x70 0x61 0x72 // ' any par' 0x74 0x2E 0x20 0x20 0x45 0x76 0x65 0x72 // 't. Ever' 0x79 0x20 0x64 0x61 0x79 0x20 0x73 0x68 // 'y day sh' 0x65 0x20 0x70 0x72 0x61 0x63 0x74 0x69 // 'e practi' 0x63 0x65 0x73 0x20 0x74 0x68 0x65 0x20 // 'ces the ' 0x6D 0x6F 0x76 0x65 0x73 0x20 0x73 0x68 // 'moves sh' 0x65 0x20 0x6D 0x69 0x67 0x68 0x74 0x20 // 'e might ' 0x6E 0x65 0x65 0x64 0x2C 0x20 0x6C 0x69 // 'need, li' 0x6B 0x65 0x20 0x66 0x61 0x69 0x6E 0x74 // 'ke faint' 0x69 0x6E 0x67 0x2C 0x20 0x6C 0x61 0x75 // 'ing, lau' 0x67 0x68 0x69 0x6E 0x67 0x2C 0x20 0x66 // 'ghing, f' 0x61 0x6C 0x6C 0x69 0x6E 0x67 0x2C 0x20 // 'alling, ' 0x61 0x6E 0x64 0x20 0x6B 0x61 0x72 0x61 // 'and kara' 0x74 0x65 0x20 0x6B 0x69 0x63 0x6B 0x69 // 'te kicki' 0x6E 0x67 0x2E 0x20 0x0D 0x0A 0x42 0x75 // 'ng. ??Bu' 0x74 0x20 0x73 0x68 0x65 0x20 0x73 0x70 // 't she sp' 0x65 0x6E 0x64 0x73 0x20 0x6D 0x6F 0x73 // 'ends mos' 0x74 0x20 0x6F 0x66 0x20 0x68 0x65 0x72 // 't of her' 0x20 0x74 0x69 0x6D 0x65 0x20 0x70 0x72 // ' time pr' 0x61 0x63 0x74 0x69 0x63 0x69 0x6E 0x67 // 'acticing' 0x20 0x68 0x65 0x72 0x20 0x64 0x61 0x6E // ' her dan' 0x63 0x69 0x6E 0x67 0x2E 0x20 0x20 0x53 // 'cing. S' 0x68 0x65 0x27 0x73 0x20 0x73 0x6F 0x20 // 'he's so ' 0x74 0x61 0x6C 0x65 0x6E 0x74 0x65 0x64 // 'talented' 0x20 0x74 0x68 0x61 0x74 0x20 0x73 0x68 // ' that sh' 0x65 0x20 0x77 0x61 0x73 0x20 0x61 0x73 // 'e was as' 0x6B 0x65 0x64 0x20 0x74 0x6F 0x20 0x64 // 'ked to d' 0x6F 0x20 0x61 0x20 0x73 0x6F 0x6C 0x6F // 'o a solo' 0x20 0x64 0x61 0x6E 0x63 0x65 0x20 0x72 // ' dance r' 0x6F 0x75 0x74 0x69 0x6E 0x65 0x20 0x66 // 'outine f' 0x6F 0x72 0x20 0x61 0x20 0x4D 0x65 0x78 // 'or a Mex' 0x69 0x63 0x61 0x6E 0x20 0x74 0x68 0x65 // 'ican the' 0x61 0x74 0x65 0x72 0x20 0x67 0x72 0x6F // 'ater gro' 0x75 0x70 0x20 0x74 0x68 0x61 0x74 0x20 // 'up that ' 0x77 0x61 0x73 0x20 0x74 0x6F 0x75 0x72 // 'was tour' 0x69 0x6E 0x67 0x20 0x74 0x68 0x65 0x20 // 'ing the ' 0x55 0x6E 0x69 0x74 0x65 0x64 0x20 0x53 // 'United S' 0x74 0x61 0x74 0x65 0x73 0x2E 0x20 0x20 // 'tates. ' 0x4D 0x65 0x6C 0x61 0x6E 0x69 0x65 0x2C // 'Melanie,' 0x20 0x77 0x68 0x6F 0x20 0x69 0x73 0x20 // ' who is ' 0x61 0x6C 0x77 0x61 0x79 0x73 0x20 0x6C // 'always l' 0x6F 0x6F 0x6B 0x69 0x6E 0x67 0x20 0x66 // 'ooking f' 0x6F 0x72 0x20 0x6E 0x65 0x77 0x20 0x74 // 'or new t' 0x61 0x6C 0x65 0x6E 0x74 0x2C 0x20 0x73 // 'alent, s' 0x61 0x77 0x20 0x45 0x6C 0x69 0x7A 0x61 // 'aw Eliza' 0x92 0x73 0x20 0x73 0x6F 0x6C 0x6F 0x20 // 's solo ' 0x61 0x6E 0x64 0x20 0x61 0x73 0x6B 0x65 // 'and aske' 0x64 0x20 0x68 0x65 0x72 0x20 0x74 0x6F // 'd her to' 0x20 0x61 0x75 0x64 0x69 0x74 0x69 0x6F // ' auditio' 0x6E 0x20 0x66 0x6F 0x72 0x20 0x61 0x20 // 'n for a ' 0x4D 0x63 0x5A 0x65 0x65 0x20 0x6D 0x6F // 'McZee mo' 0x76 0x69 0x65 0x2E // 'vie.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_5B= ktipbio50 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5B, __HELP_NAME("ktipbio50")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5B, __HELP_NAME("ktipbio50")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_5B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5B, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio50" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_5B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5B, 0x0) BYTE 0x01 0x00 0x03 0x03 0xF2 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_5B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xA9 0x02 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x23 0x02 0x00 0x82 // '????#??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_5B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5B, 0x0) BYTE 0x03 0x03 0x48 0x69 0x70 0x70 0x69 0x65 // '??Hippie' 0x0D 0x0A 0x54 0x68 0x65 0x20 0x70 0x61 // '??The pa' 0x72 0x74 0x20 0x6F 0x66 0x20 0x61 0x20 // 'rt of a ' 0x36 0x30 0x73 0x20 0x68 0x69 0x70 0x70 // '60s hipp' 0x69 0x65 0x20 0x77 0x6F 0x75 0x6C 0x64 // 'ie would' 0x20 0x62 0x65 0x20 0x70 0x65 0x72 0x66 // ' be perf' 0x65 0x63 0x74 0x20 0x66 0x6F 0x72 0x20 // 'ect for ' 0x45 0x6C 0x69 0x7A 0x61 0x2C 0x20 0x73 // 'Eliza, s' 0x68 0x65 0x20 0x74 0x68 0x69 0x6E 0x6B // 'he think' 0x73 0x2E 0x20 0x53 0x68 0x65 0x20 0x68 // 's. She h' 0x61 0x73 0x20 0x74 0x68 0x65 0x20 0x67 // 'as the g' 0x72 0x6F 0x6F 0x76 0x79 0x20 0x63 0x6C // 'roovy cl' 0x6F 0x74 0x68 0x65 0x73 0x2E 0x20 0x20 // 'othes. ' 0x53 0x68 0x65 0x20 0x73 0x65 0x65 0x73 // 'She sees' 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F 0x76 // ' the mov' 0x69 0x65 0x20 0x73 0x74 0x61 0x72 0x74 // 'ie start' 0x69 0x6E 0x67 0x20 0x61 0x74 0x20 0x68 // 'ing at h' 0x65 0x72 0x20 0x61 0x75 0x6E 0x74 0x20 // 'er aunt ' 0x4D 0x61 0x72 0x74 0x68 0x61 0x92 0x73 // 'Marthas' 0x20 0x6F 0x6C 0x64 0x20 0x68 0x6F 0x75 // ' old hou' 0x73 0x65 0x2E 0x20 0x0D 0x0A 0x4C 0x69 // 'se. ??Li' 0x6B 0x65 0x20 0x61 0x20 0x74 0x72 0x75 // 'ke a tru' 0x65 0x20 0x68 0x69 0x70 0x70 0x69 0x65 // 'e hippie' 0x2C 0x20 0x45 0x6C 0x69 0x7A 0x61 0x20 // ', Eliza ' 0x69 0x73 0x20 0x69 0x6E 0x20 0x74 0x75 // 'is in tu' 0x6E 0x65 0x20 0x77 0x69 0x74 0x68 0x20 // 'ne with ' 0x74 0x68 0x65 0x20 0x75 0x6E 0x69 0x76 // 'the univ' 0x65 0x72 0x73 0x65 0x2E 0x20 0x20 0x57 // 'erse. W' 0x68 0x65 0x6E 0x20 0x73 0x68 0x65 0x20 // 'hen she ' 0x73 0x65 0x6E 0x73 0x65 0x73 0x20 0x65 // 'senses e' 0x76 0x69 0x6C 0x20 0x66 0x6F 0x72 0x63 // 'vil forc' 0x65 0x73 0x20 0x61 0x74 0x20 0x77 0x6F // 'es at wo' 0x72 0x6B 0x20 0x69 0x6E 0x20 0x74 0x68 // 'rk in th' 0x65 0x20 0x68 0x6F 0x75 0x73 0x65 0x2C // 'e house,' 0x20 0x73 0x68 0x65 0x20 0x6B 0x6E 0x65 // ' she kne' 0x65 0x6C 0x73 0x20 0x74 0x6F 0x20 0x6D // 'els to m' 0x65 0x64 0x69 0x74 0x61 0x74 0x65 0x20 // 'editate ' 0x61 0x77 0x61 0x79 0x20 0x74 0x68 0x65 // 'away the' 0x20 0x65 0x76 0x69 0x6C 0x2E 0x20 0x20 // ' evil. ' 0x4A 0x75 0x73 0x74 0x20 0x74 0x68 0x65 // 'Just the' 0x6E 0x2C 0x20 0x69 0x6E 0x20 0x74 0x68 // 'n, in th' 0x65 0x20 0x63 0x6F 0x72 0x6E 0x65 0x72 // 'e corner' 0x20 0x6F 0x66 0x20 0x74 0x68 0x65 0x20 // ' of the ' 0x6C 0x69 0x62 0x72 0x61 0x72 0x79 0x2C // 'library,' 0x20 0x74 0x68 0x65 0x20 0x6C 0x69 0x64 // ' the lid' 0x20 0x6F 0x6E 0x20 0x61 0x20 0x77 0x6F // ' on a wo' 0x6F 0x64 0x65 0x6E 0x20 0x63 0x6F 0x66 // 'oden cof' 0x66 0x69 0x6E 0x20 0x63 0x72 0x65 0x61 // 'fin crea' 0x6B 0x73 0x20 0x6F 0x70 0x65 0x6E 0x2C // 'ks open,' 0x20 0x61 0x6E 0x64 0x20 0x6F 0x75 0x74 // ' and out' 0x20 0x63 0x6F 0x6D 0x65 0x73 0x20 0x61 // ' comes a' 0x20 0x67 0x68 0x6F 0x73 0x74 0x2D 0x77 // ' ghost-w' 0x68 0x69 0x74 0x65 0x20 0x67 0x75 0x79 // 'hite guy' 0x20 0x77 0x69 0x74 0x68 0x20 0x61 0x20 // ' with a ' 0x62 0x61 0x67 0x20 0x6F 0x76 0x65 0x72 // 'bag over' 0x20 0x68 0x69 0x73 0x20 0x68 0x65 0x61 // ' his hea' 0x64 0x2E 0x20 0x20 0x49 0x73 0x20 0x74 // 'd. Is t' 0x68 0x69 0x73 0x20 0x61 0x20 0x70 0x68 // 'his a ph' 0x61 0x6E 0x74 0x6F 0x6D 0x3F 0x20 0x20 // 'antom? ' 0x53 0x68 0x65 0x20 0x6C 0x6F 0x6F 0x6B // 'She look' 0x73 0x20 0x61 0x67 0x61 0x69 0x6E 0x20 // 's again ' 0x61 0x6E 0x64 0x20 0x62 0x65 0x67 0x69 // 'and begi' 0x6E 0x73 0x20 0x77 0x61 0x6C 0x6B 0x69 // 'ns walki' 0x6E 0x67 0x20 0x62 0x61 0x63 0x6B 0x77 // 'ng backw' 0x61 0x72 0x64 0x2E 0x20 0x54 0x68 0x65 // 'ard. The' 0x20 0x70 0x68 0x61 0x6E 0x74 0x6F 0x6D // ' phantom' 0x20 0x77 0x61 0x6C 0x6B 0x73 0x20 0x74 // ' walks t' 0x6F 0x77 0x61 0x72 0x64 0x20 0x68 0x65 // 'oward he' 0x72 0x2E 0x20 0x0D 0x0A 0x48 0x6F 0x77 // 'r. ??How' 0x20 0x77 0x69 0x6C 0x6C 0x20 0x45 0x6C // ' will El' 0x69 0x7A 0x61 0x20 0x64 0x65 0x61 0x6C // 'iza deal' 0x20 0x77 0x69 0x74 0x68 0x20 0x74 0x68 // ' with th' 0x69 0x73 0x20 0x62 0x61 0x67 0x2D 0x68 // 'is bag-h' 0x65 0x61 0x64 0x3F 0x20 0x20 0x57 0x69 // 'ead? Wi' 0x6C 0x6C 0x20 0x68 0x65 0x72 0x20 0x70 // 'll her p' 0x65 0x61 0x63 0x65 0x20 0x6E 0x65 0x63 // 'eace nec' 0x6B 0x6C 0x61 0x63 0x65 0x20 0x70 0x72 // 'klace pr' 0x6F 0x74 0x65 0x63 0x74 0x20 0x68 0x65 // 'otect he' 0x72 0x2C 0x20 0x6F 0x72 0x20 0x77 0x69 // 'r, or wi' 0x6C 0x6C 0x20 0x73 0x68 0x65 0x20 0x6E // 'll she n' 0x65 0x65 0x64 0x20 0x74 0x6F 0x20 0x75 // 'eed to u' 0x73 0x65 0x20 0x6B 0x61 0x72 0x61 0x74 // 'se karat' 0x65 0x20 0x74 0x6F 0x20 0x73 0x63 0x61 // 'e to sca' 0x72 0x65 0x20 0x74 0x68 0x65 0x20 0x73 // 're the s' 0x63 0x61 0x72 0x79 0x20 0x62 0x65 0x69 // 'cary bei' 0x6E 0x67 0x3F // 'ng?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_5C= ktipbio51 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5C, __HELP_NAME("ktipbio51")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5C, __HELP_NAME("ktipbio51")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_5D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5C, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio51" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_5D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5C, 0x0) BYTE 0x01 0x00 0x03 0x03 0xDF 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_5D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x71 0x02 0x00 0x01 // '????q???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xE8 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_5D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5D, 0x0) BYTE 0x03 0x03 0x4E 0x75 0x72 0x73 0x65 0x0D // '??Nurse?' 0x0A 0x45 0x6C 0x69 0x7A 0x61 0x20 0x64 // '?Eliza d' 0x72 0x65 0x61 0x6D 0x73 0x20 0x6F 0x66 // 'reams of' 0x20 0x70 0x6C 0x61 0x79 0x69 0x6E 0x67 // ' playing' 0x20 0x61 0x20 0x73 0x75 0x70 0x65 0x72 // ' a super' 0x20 0x6E 0x75 0x72 0x73 0x65 0x20 0x77 // ' nurse w' 0x68 0x6F 0x20 0x63 0x61 0x6E 0x20 0x73 // 'ho can s' 0x68 0x72 0x69 0x6E 0x6B 0x20 0x6F 0x72 // 'hrink or' 0x20 0x67 0x72 0x6F 0x77 0x20 0x74 0x6F // ' grow to' 0x20 0x68 0x65 0x6C 0x70 0x20 0x67 0x65 // ' help ge' 0x74 0x20 0x70 0x65 0x6F 0x70 0x6C 0x65 // 't people' 0x20 0x6F 0x75 0x74 0x20 0x6F 0x66 0x20 // ' out of ' 0x61 0x63 0x63 0x69 0x64 0x65 0x6E 0x74 // 'accident' 0x73 0x2C 0x20 0x6F 0x72 0x20 0x66 0x65 // 's, or fe' 0x65 0x6C 0x20 0x62 0x65 0x74 0x74 0x65 // 'el bette' 0x72 0x20 0x77 0x68 0x65 0x6E 0x20 0x74 // 'r when t' 0x68 0x65 0x79 0x27 0x72 0x65 0x20 0x68 // 'hey're h' 0x75 0x72 0x74 0x2E 0x20 0x20 0x49 0x6E // 'urt. In' 0x20 0x6F 0x6E 0x65 0x20 0x73 0x63 0x65 // ' one sce' 0x6E 0x65 0x2C 0x20 0x45 0x6C 0x69 0x7A // 'ne, Eliz' 0x61 0x20 0x67 0x65 0x74 0x73 0x20 0x61 // 'a gets a' 0x20 0x63 0x61 0x6C 0x6C 0x20 0x66 0x72 // ' call fr' 0x6F 0x6D 0x20 0x74 0x68 0x65 0x20 0x63 // 'om the c' 0x6F 0x77 0x62 0x6F 0x79 0x20 0x63 0x61 // 'owboy ca' 0x66 0xE9 0x2E 0x20 0x41 0x20 0x6D 0x61 // 'f. A ma' 0x6E 0x20 0x69 0x73 0x20 0x63 0x68 0x6F // 'n is cho' 0x6B 0x69 0x6E 0x67 0x20 0x6F 0x6E 0x20 // 'king on ' 0x61 0x20 0x54 0x2D 0x62 0x6F 0x6E 0x65 // 'a T-bone' 0x21 0x20 0x20 0x53 0x68 0x65 0x20 0x6A // '! She j' 0x75 0x6D 0x70 0x73 0x20 0x69 0x6E 0x20 // 'umps in ' 0x74 0x68 0x65 0x20 0x61 0x6D 0x62 0x75 // 'the ambu' 0x6C 0x61 0x6E 0x63 0x65 0x20 0x77 0x69 // 'lance wi' 0x74 0x68 0x6F 0x75 0x74 0x20 0x77 0x61 // 'thout wa' 0x69 0x74 0x69 0x6E 0x67 0x20 0x66 0x6F // 'iting fo' 0x72 0x20 0x74 0x68 0x65 0x20 0x64 0x72 // 'r the dr' 0x69 0x76 0x65 0x72 0x2E 0x20 0x0D 0x0A // 'iver. ??' 0x41 0x74 0x20 0x74 0x68 0x65 0x20 0x63 // 'At the c' 0x61 0x66 0xE9 0x2C 0x20 0x70 0x65 0x6F // 'af, peo' 0x70 0x6C 0x65 0x20 0x61 0x72 0x65 0x20 // 'ple are ' 0x63 0x72 0x6F 0x77 0x64 0x65 0x64 0x20 // 'crowded ' 0x61 0x72 0x6F 0x75 0x6E 0x64 0x20 0x74 // 'around t' 0x68 0x65 0x20 0x67 0x75 0x79 0x20 0x6C // 'he guy l' 0x79 0x69 0x6E 0x67 0x20 0x6F 0x6E 0x20 // 'ying on ' 0x74 0x68 0x65 0x20 0x66 0x6C 0x6F 0x6F // 'the floo' 0x72 0x2E 0x20 0x45 0x6C 0x69 0x7A 0x61 // 'r. Eliza' 0x20 0x73 0x68 0x72 0x69 0x6E 0x6B 0x73 // ' shrinks' 0x20 0x66 0x61 0x73 0x74 0x2C 0x20 0x73 // ' fast, s' 0x6E 0x65 0x61 0x6B 0x73 0x20 0x62 0x65 // 'neaks be' 0x74 0x77 0x65 0x65 0x6E 0x20 0x74 0x68 // 'tween th' 0x65 0x20 0x6C 0x65 0x67 0x73 0x20 0x6F // 'e legs o' 0x66 0x20 0x74 0x68 0x65 0x20 0x63 0x72 // 'f the cr' 0x6F 0x77 0x64 0x2C 0x20 0x61 0x6E 0x64 // 'owd, and' 0x20 0x74 0x68 0x65 0x6E 0x20 0x67 0x72 // ' then gr' 0x6F 0x77 0x73 0x20 0x61 0x67 0x61 0x69 // 'ows agai' 0x6E 0x2E 0x20 0x20 0x4A 0x75 0x73 0x74 // 'n. Just' 0x20 0x74 0x68 0x65 0x6E 0x20 0x73 0x68 // ' then sh' 0x65 0x20 0x72 0x65 0x61 0x6C 0x69 0x7A // 'e realiz' 0x65 0x73 0x20 0x74 0x68 0x65 0x20 0x93 // 'es the ' 0x67 0x75 0x79 0x94 0x20 0x69 0x73 0x20 // 'guy is ' 0x72 0x65 0x61 0x6C 0x6C 0x79 0x20 0x61 // 'really a' 0x20 0x72 0x6F 0x62 0x6F 0x74 0x21 0x20 // ' robot! ' 0x0D 0x0A 0x48 0x6F 0x77 0x20 0x77 0x69 // '??How wi' 0x6C 0x6C 0x20 0x73 0x68 0x65 0x20 0x73 // 'll she s' 0x61 0x76 0x65 0x20 0x61 0x20 0x72 0x6F // 'ave a ro' 0x62 0x6F 0x74 0x3F 0x20 0x20 0x4F 0x72 // 'bot? Or' 0x20 0x77 0x69 0x6C 0x6C 0x20 0x73 0x68 // ' will sh' 0x65 0x20 0x68 0x61 0x76 0x65 0x20 0x74 // 'e have t' 0x6F 0x20 0x70 0x75 0x74 0x20 0x74 0x68 // 'o put th' 0x65 0x20 0x74 0x69 0x6E 0x2D 0x6D 0x61 // 'e tin-ma' 0x6E 0x20 0x69 0x6E 0x20 0x74 0x68 0x65 // 'n in the' 0x20 0x61 0x6D 0x62 0x75 0x6C 0x61 0x6E // ' ambulan' 0x63 0x65 0x20 0x61 0x6E 0x64 0x20 0x71 // 'ce and q' 0x75 0x69 0x63 0x6B 0x6C 0x79 0x20 0x66 // 'uickly f' 0x69 0x6E 0x64 0x20 0x68 0x69 0x73 0x20 // 'ind his ' 0x69 0x6E 0x76 0x65 0x6E 0x74 0x6F 0x72 // 'inventor' 0x2C 0x20 0x61 0x20 0x67 0x65 0x6E 0x69 // ', a geni' 0x75 0x73 0x20 0x67 0x72 0x65 0x65 0x6E // 'us green' 0x20 0x73 0x63 0x69 0x65 0x6E 0x74 0x69 // ' scienti' 0x73 0x74 0x3F // 'st?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_5D= ktipbio52 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5D, __HELP_NAME("ktipbio52")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5D, __HELP_NAME("ktipbio52")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_68=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5D, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio52" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_68=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5D, 0x0) BYTE 0x01 0x00 0x03 0x03 0xFA 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_68=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_68, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xBC 0x02 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x1A 0x02 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_68=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_68, 0x0) BYTE 0x03 0x03 0x45 0x78 0x70 0x6C 0x6F 0x72 // '??Explor' 0x65 0x72 0x0D 0x0A 0x43 0x6F 0x6D 0x69 // 'er??Comi' 0x6E 0x67 0x20 0x66 0x72 0x6F 0x6D 0x20 // 'ng from ' 0x61 0x20 0x73 0x6D 0x61 0x6C 0x6C 0x20 // 'a small ' 0x4D 0x65 0x78 0x69 0x63 0x61 0x6E 0x20 // 'Mexican ' 0x76 0x69 0x6C 0x6C 0x61 0x67 0x65 0x2C // 'village,' 0x20 0x45 0x6C 0x69 0x7A 0x61 0x20 0x64 // ' Eliza d' 0x72 0x65 0x61 0x6D 0x73 0x20 0x6F 0x66 // 'reams of' 0x20 0x73 0x74 0x61 0x72 0x72 0x69 0x6E // ' starrin' 0x67 0x20 0x69 0x6E 0x20 0x61 0x64 0x76 // 'g in adv' 0x65 0x6E 0x74 0x75 0x72 0x65 0x20 0x6D // 'enture m' 0x6F 0x76 0x69 0x65 0x73 0x20 0x74 0x68 // 'ovies th' 0x61 0x74 0x20 0x74 0x61 0x6B 0x65 0x20 // 'at take ' 0x68 0x65 0x72 0x20 0x74 0x6F 0x20 0x66 // 'her to f' 0x61 0x72 0x2D 0x61 0x77 0x61 0x79 0x20 // 'ar-away ' 0x70 0x6C 0x61 0x63 0x65 0x73 0x20 0x77 // 'places w' 0x69 0x74 0x68 0x20 0x68 0x65 0x72 0x20 // 'ith her ' 0x62 0x65 0x73 0x74 0x20 0x66 0x72 0x69 // 'best fri' 0x65 0x6E 0x64 0x2C 0x20 0x61 0x20 0x63 // 'end, a c' 0x61 0x74 0x20 0x77 0x68 0x6F 0x20 0x6B // 'at who k' 0x6E 0x6F 0x77 0x73 0x20 0x73 0x65 0x63 // 'nows sec' 0x72 0x65 0x74 0x73 0x20 0x74 0x6F 0x20 // 'rets to ' 0x75 0x6E 0x6C 0x6F 0x63 0x6B 0x69 0x6E // 'unlockin' 0x67 0x20 0x61 0x6C 0x6C 0x20 0x6B 0x69 // 'g all ki' 0x6E 0x64 0x73 0x20 0x6F 0x66 0x20 0x74 // 'nds of t' 0x72 0x65 0x61 0x73 0x75 0x72 0x65 0x73 // 'reasures' 0x2E 0x20 0x0D 0x0A 0x45 0x6C 0x69 0x7A // '. ??Eliz' 0x61 0x20 0x61 0x6E 0x64 0x20 0x68 0x65 // 'a and he' 0x72 0x20 0x63 0x61 0x74 0x20 0x66 0x6C // 'r cat fl' 0x79 0x20 0x6F 0x66 0x66 0x20 0x74 0x6F // 'y off to' 0x20 0x61 0x20 0x64 0x69 0x73 0x74 0x61 // ' a dista' 0x6E 0x74 0x20 0x6D 0x6F 0x75 0x6E 0x74 // 'nt mount' 0x61 0x69 0x6E 0x20 0x77 0x68 0x65 0x72 // 'ain wher' 0x65 0x20 0x74 0x68 0x65 0x72 0x65 0x20 // 'e there ' 0x69 0x73 0x20 0x73 0x61 0x69 0x64 0x20 // 'is said ' 0x74 0x6F 0x20 0x62 0x65 0x20 0x61 0x20 // 'to be a ' 0x63 0x61 0x62 0x69 0x6E 0x20 0x77 0x69 // 'cabin wi' 0x74 0x68 0x20 0x74 0x72 0x65 0x61 0x73 // 'th treas' 0x75 0x72 0x65 0x20 0x69 0x6E 0x73 0x69 // 'ure insi' 0x64 0x65 0x2E 0x20 0x20 0x45 0x6C 0x69 // 'de. Eli' 0x7A 0x61 0x20 0x65 0x6E 0x74 0x65 0x72 // 'za enter' 0x73 0x20 0x74 0x68 0x65 0x20 0x63 0x61 // 's the ca' 0x62 0x69 0x6E 0x20 0x61 0x6E 0x64 0x20 // 'bin and ' 0x73 0x65 0x61 0x72 0x63 0x68 0x65 0x73 // 'searches' 0x20 0x65 0x76 0x65 0x72 0x79 0x77 0x68 // ' everywh' 0x65 0x72 0x65 0x2E 0x20 0x20 0x54 0x68 // 'ere. Th' 0x65 0x6E 0x20 0x74 0x68 0x65 0x20 0x63 // 'en the c' 0x61 0x74 0x20 0x73 0x74 0x72 0x65 0x74 // 'at stret' 0x63 0x68 0x65 0x73 0x20 0x74 0x6F 0x77 // 'ches tow' 0x61 0x72 0x64 0x20 0x74 0x68 0x65 0x20 // 'ard the ' 0x6C 0x61 0x64 0x64 0x65 0x72 0x2E 0x20 // 'ladder. ' 0x20 0x45 0x6C 0x69 0x7A 0x61 0x20 0x77 // ' Eliza w' 0x61 0x6C 0x6B 0x73 0x20 0x73 0x6C 0x6F // 'alks slo' 0x77 0x6C 0x79 0x20 0x74 0x6F 0x20 0x74 // 'wly to t' 0x68 0x65 0x20 0x6C 0x61 0x64 0x64 0x65 // 'he ladde' 0x72 0x20 0x61 0x6E 0x64 0x20 0x68 0x65 // 'r and he' 0x61 0x72 0x73 0x20 0x74 0x65 0x72 0x72 // 'ars terr' 0x69 0x62 0x6C 0x65 0x20 0x6E 0x6F 0x69 // 'ible noi' 0x73 0x65 0x73 0x2E 0x20 0x20 0x41 0x20 // 'ses. A ' 0x6D 0x61 0x73 0x6B 0x20 0x69 0x73 0x20 // 'mask is ' 0x67 0x75 0x61 0x72 0x64 0x69 0x6E 0x67 // 'guarding' 0x20 0x74 0x68 0x65 0x20 0x74 0x72 0x65 // ' the tre' 0x61 0x73 0x75 0x72 0x65 0x20 0x63 0x68 // 'asure ch' 0x65 0x73 0x74 0x20 0x61 0x6E 0x64 0x20 // 'est and ' 0x77 0x61 0x72 0x6E 0x69 0x6E 0x67 0x20 // 'warning ' 0x68 0x65 0x72 0x20 0x74 0x6F 0x20 0x73 // 'her to s' 0x74 0x61 0x79 0x20 0x61 0x77 0x61 0x79 // 'tay away' 0x2E 0x20 0x0D 0x0A 0x48 0x6F 0x77 0x20 // '. ??How ' 0x77 0x69 0x6C 0x6C 0x20 0x45 0x6C 0x69 // 'will Eli' 0x7A 0x61 0x20 0x67 0x65 0x74 0x20 0x70 // 'za get p' 0x61 0x73 0x74 0x20 0x74 0x68 0x65 0x20 // 'ast the ' 0x6D 0x61 0x73 0x6B 0x20 0x74 0x6F 0x20 // 'mask to ' 0x74 0x68 0x65 0x20 0x74 0x72 0x65 0x61 // 'the trea' 0x73 0x75 0x72 0x65 0x3F 0x20 0x20 0x41 // 'sure? A' 0x6E 0x64 0x20 0x68 0x6F 0x77 0x20 0x77 // 'nd how w' 0x69 0x6C 0x6C 0x20 0x73 0x68 0x65 0x20 // 'ill she ' 0x70 0x65 0x72 0x73 0x75 0x61 0x64 0x65 // 'persuade' 0x20 0x68 0x65 0x72 0x20 0x74 0x65 0x72 // ' her ter' 0x72 0x69 0x66 0x69 0x65 0x64 0x20 0x63 // 'rified c' 0x61 0x74 0x20 0x74 0x6F 0x20 0x63 0x6F // 'at to co' 0x6D 0x65 0x20 0x6F 0x75 0x74 0x20 0x66 // 'me out f' 0x72 0x6F 0x6D 0x20 0x62 0x65 0x68 0x69 // 'rom behi' 0x6E 0x64 0x20 0x74 0x68 0x65 0x20 0x74 // 'nd the t' 0x6F 0x74 0x65 0x6D 0x20 0x70 0x6F 0x6C // 'otem pol' 0x65 0x20 0x61 0x6E 0x64 0x20 0x6F 0x70 // 'e and op' 0x65 0x6E 0x20 0x74 0x68 0x65 0x20 0x74 // 'en the t' 0x72 0x65 0x61 0x73 0x75 0x72 0x65 0x20 // 'reasure ' 0x63 0x68 0x65 0x73 0x74 0x3F // 'chest?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_5E= ktipbio53 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5E, __HELP_NAME("ktipbio53")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5E, __HELP_NAME("ktipbio53")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_5E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5E, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio53" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_5E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5E, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_5E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x8F 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x0F 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_5E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5E, 0x0) BYTE 0x03 0x03 0x6D 0x69 0x73 0x75 0x6E 0x64 // '??misund' 0x65 0x72 0x73 0x74 0x6F 0x6F 0x64 0x0D // 'erstood?' 0x0A 0x50 0x65 0x6F 0x70 0x6C 0x65 0x20 // '?People ' 0x64 0x6F 0x6E 0x92 0x74 0x20 0x75 0x6E // 'dont un' 0x64 0x65 0x72 0x73 0x74 0x61 0x6E 0x64 // 'derstand' 0x20 0x74 0x68 0x61 0x74 0x20 0x46 0x72 // ' that Fr' 0x61 0x6E 0x6B 0x20 0x72 0x65 0x61 0x6C // 'ank real' 0x6C 0x79 0x20 0x69 0x73 0x6E 0x92 0x74 // 'ly isnt' 0x20 0x61 0x20 0x74 0x6F 0x75 0x67 0x68 // ' a tough' 0x20 0x67 0x75 0x79 0x2E 0x20 0x20 0x42 // ' guy. B' 0x75 0x74 0x20 0x46 0x72 0x61 0x6E 0x6B // 'ut Frank' 0x20 0x68 0x61 0x73 0x20 0x75 0x73 0x65 // ' has use' 0x64 0x20 0x74 0x68 0x69 0x73 0x20 0x6D // 'd this m' 0x69 0x73 0x75 0x6E 0x64 0x65 0x72 0x73 // 'isunders' 0x74 0x61 0x6E 0x64 0x69 0x6E 0x67 0x20 // 'tanding ' 0x74 0x6F 0x20 0x6D 0x61 0x6B 0x65 0x20 // 'to make ' 0x6C 0x6F 0x74 0x73 0x20 0x6F 0x66 0x20 // 'lots of ' 0x6D 0x6F 0x6E 0x65 0x79 0x20 0x61 0x63 // 'money ac' 0x74 0x69 0x6E 0x67 0x2E 0x20 0x20 0x57 // 'ting. W' 0x68 0x65 0x6E 0x20 0x68 0x65 0x20 0x77 // 'hen he w' 0x61 0x73 0x20 0x32 0x30 0x2C 0x20 0x68 // 'as 20, h' 0x65 0x20 0x74 0x72 0x69 0x65 0x64 0x20 // 'e tried ' 0x6F 0x75 0x74 0x20 0x66 0x6F 0x72 0x20 // 'out for ' 0x6D 0x6F 0x76 0x69 0x65 0x20 0x70 0x61 // 'movie pa' 0x72 0x74 0x2C 0x20 0x61 0x6E 0x64 0x20 // 'rt, and ' 0x65 0x76 0x65 0x72 0x79 0x6F 0x6E 0x65 // 'everyone' 0x20 0x73 0x61 0x69 0x64 0x20 0x68 0x6F // ' said ho' 0x77 0x20 0x6D 0x75 0x63 0x68 0x20 0x68 // 'w much h' 0x65 0x20 0x6C 0x6F 0x6F 0x6B 0x65 0x64 // 'e looked' 0x20 0x6C 0x69 0x6B 0x65 0x20 0x61 0x20 // ' like a ' 0x62 0x6F 0x64 0x79 0x20 0x67 0x75 0x61 // 'body gua' 0x72 0x64 0x20 0x69 0x6E 0x20 0x61 0x20 // 'rd in a ' 0x67 0x61 0x6E 0x67 0x73 0x74 0x65 0x72 // 'gangster' 0x20 0x6D 0x6F 0x76 0x69 0x65 0x2E 0x20 // ' movie. ' 0x20 0x53 0x69 0x6E 0x63 0x65 0x20 0x74 // ' Since t' 0x68 0x65 0x6E 0x2C 0x20 0x68 0x65 0x92 // 'hen, he' 0x73 0x20 0x70 0x6C 0x61 0x79 0x65 0x64 // 's played' 0x20 0x74 0x68 0x61 0x74 0x20 0x70 0x61 // ' that pa' 0x72 0x74 0x20 0x69 0x6E 0x20 0x61 0x20 // 'rt in a ' 0x64 0x6F 0x7A 0x65 0x6E 0x20 0x6D 0x6F // 'dozen mo' 0x76 0x69 0x65 0x73 0x2C 0x20 0x62 0x75 // 'vies, bu' 0x74 0x20 0x6E 0x6F 0x77 0x20 0x69 0x74 // 't now it' 0x27 0x73 0x20 0x74 0x6F 0x6F 0x20 0x65 // ''s too e' 0x61 0x73 0x79 0x2E 0x20 0x20 0x48 0x65 // 'asy. He' 0x20 0x77 0x61 0x6E 0x74 0x73 0x20 0x70 // ' wants p' 0x61 0x72 0x74 0x73 0x20 0x77 0x68 0x65 // 'arts whe' 0x72 0x65 0x20 0x68 0x65 0x20 0x63 0x61 // 're he ca' 0x6E 0x20 0x64 0x6F 0x20 0x73 0x6F 0x6D // 'n do som' 0x65 0x20 0x93 0x72 0x65 0x61 0x6C 0x94 // 'e real' 0x20 0x61 0x63 0x74 0x69 0x6E 0x67 0x2E // ' acting.' 0x20 // ' ' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_5F= ktipbio54 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5F, __HELP_NAME("ktipbio54")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5F, __HELP_NAME("ktipbio54")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_5F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5F, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio54" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_5F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5F, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_5F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xDE 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x3D 0x01 0x00 0x82 // '????=??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_5F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5F, 0x0) BYTE 0x03 0x03 0x47 0x75 0x69 0x6E 0x65 0x61 // '??Guinea' 0x20 0x50 0x69 0x67 0x0D 0x0A 0x4A 0x75 // ' Pig??Ju' 0x73 0x74 0x20 0x66 0x6F 0x72 0x20 0x66 // 'st for f' 0x75 0x6E 0x2C 0x20 0x46 0x72 0x61 0x6E // 'un, Fran' 0x6B 0x20 0x77 0x61 0x6E 0x74 0x73 0x20 // 'k wants ' 0x74 0x6F 0x20 0x62 0x65 0x20 0x74 0x68 // 'to be th' 0x65 0x20 0x67 0x75 0x79 0x20 0x77 0x68 // 'e guy wh' 0x6F 0x20 0x69 0x73 0x20 0x61 0x6C 0x77 // 'o is alw' 0x61 0x79 0x73 0x20 0x74 0x68 0x65 0x20 // 'ays the ' 0x66 0x69 0x72 0x73 0x74 0x20 0x74 0x6F // 'first to' 0x20 0x74 0x72 0x79 0x20 0x74 0x68 0x65 // ' try the' 0x20 0x6C 0x61 0x74 0x65 0x73 0x74 0x20 // ' latest ' 0x62 0x75 0x62 0x62 0x6C 0x69 0x6E 0x67 // 'bubbling' 0x20 0x64 0x72 0x69 0x6E 0x6B 0x20 0x63 // ' drink c' 0x6F 0x6F 0x6B 0x65 0x64 0x20 0x75 0x70 // 'ooked up' 0x20 0x62 0x79 0x20 0x74 0x68 0x65 0x20 // ' by the ' 0x77 0x69 0x66 0x65 0x20 0x6F 0x66 0x20 // 'wife of ' 0x74 0x68 0x65 0x20 0x65 0x76 0x69 0x6C // 'the evil' 0x20 0x6F 0x77 0x6E 0x65 0x72 0x20 0x6F // ' owner o' 0x66 0x20 0x61 0x20 0x68 0x61 0x75 0x6E // 'f a haun' 0x74 0x65 0x64 0x20 0x68 0x6F 0x75 0x73 // 'ted hous' 0x65 0x2E 0x20 0x20 0x54 0x68 0x65 0x20 // 'e. The ' 0x73 0x63 0x65 0x6E 0x65 0x20 0x77 0x6F // 'scene wo' 0x75 0x6C 0x64 0x20 0x73 0x74 0x61 0x72 // 'uld star' 0x74 0x20 0x6F 0x75 0x74 0x20 0x77 0x69 // 't out wi' 0x74 0x68 0x20 0x46 0x72 0x61 0x6E 0x6B // 'th Frank' 0x20 0x6C 0x6F 0x6F 0x6B 0x69 0x6E 0x67 // ' looking' 0x20 0x6E 0x6F 0x72 0x6D 0x61 0x6C 0x2E // ' normal.' 0x20 0x20 0x54 0x68 0x65 0x6E 0x20 0x68 // ' Then h' 0x65 0x27 0x64 0x20 0x67 0x65 0x74 0x20 // 'e'd get ' 0x61 0x20 0x77 0x68 0x69 0x66 0x66 0x20 // 'a whiff ' 0x6F 0x66 0x20 0x74 0x68 0x65 0x20 0x64 // 'of the d' 0x72 0x69 0x6E 0x6B 0x2C 0x20 0x61 0x6E // 'rink, an' 0x64 0x97 0x62 0x61 0x6D 0x21 0x97 0x74 // 'dbam!t' 0x75 0x72 0x6E 0x20 0x67 0x72 0x65 0x65 // 'urn gree' 0x6E 0x2C 0x20 0x66 0x61 0x69 0x6E 0x74 // 'n, faint' 0x2C 0x20 0x61 0x6E 0x64 0x20 0x66 0x61 // ', and fa' 0x6C 0x6C 0x20 0x66 0x6C 0x61 0x74 0x20 // 'll flat ' 0x6F 0x6E 0x20 0x68 0x69 0x73 0x20 0x66 // 'on his f' 0x61 0x63 0x65 0x2E 0x20 0x0D 0x0A 0x54 // 'ace. ??T' 0x68 0x65 0x20 0x70 0x72 0x6F 0x62 0x6C // 'he probl' 0x65 0x6D 0x20 0x69 0x73 0x2C 0x20 0x46 // 'em is, F' 0x72 0x61 0x6E 0x6B 0x20 0x68 0x61 0x73 // 'rank has' 0x6E 0x92 0x74 0x20 0x66 0x69 0x67 0x75 // 'nt figu' 0x72 0x65 0x64 0x20 0x6F 0x75 0x74 0x20 // 'red out ' 0x68 0x6F 0x77 0x20 0x68 0x65 0x92 0x64 // 'how hed' 0x20 0x63 0x68 0x61 0x6E 0x67 0x65 0x20 // ' change ' 0x62 0x61 0x63 0x6B 0x20 0x74 0x6F 0x20 // 'back to ' 0x68 0x69 0x73 0x20 0x6E 0x6F 0x72 0x6D // 'his norm' 0x61 0x6C 0x20 0x63 0x6F 0x6C 0x6F 0x72 // 'al color' 0x2E 0x20 0x20 0x57 0x6F 0x75 0x6C 0x64 // '. Would' 0x20 0x68 0x65 0x20 0x63 0x68 0x61 0x6E // ' he chan' 0x67 0x65 0x20 0x62 0x61 0x63 0x6B 0x20 // 'ge back ' 0x77 0x68 0x65 0x6E 0x20 0x68 0x65 0x20 // 'when he ' 0x73 0x65 0x65 0x73 0x20 0x6F 0x6E 0x65 // 'sees one' 0x20 0x6F 0x66 0x20 0x68 0x69 0x73 0x20 // ' of his ' 0x66 0x72 0x69 0x65 0x6E 0x64 0x73 0x3F // 'friends?' 0x20 0x20 0x4F 0x72 0x20 0x6D 0x61 0x79 // ' Or may' 0x62 0x65 0x20 0x61 0x20 0x67 0x69 0x72 // 'be a gir' 0x6C 0x66 0x72 0x69 0x65 0x6E 0x64 0x3F // 'lfriend?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_60= ktipbio55 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_60, __HELP_NAME("ktipbio55")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_60, __HELP_NAME("ktipbio55")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_61=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_60, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio55" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_61=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_60, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_61=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_61, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xED 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x5C 0x01 0x00 0x82 // '????\??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_61=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_61, 0x0) BYTE 0x03 0x03 0x56 0x69 0x6C 0x6C 0x61 0x69 // '??Villai' 0x6E 0x0D 0x0A 0x46 0x72 0x61 0x6E 0x6B // 'n??Frank' 0x73 0x20 0x6B 0x6E 0x6F 0x77 0x73 0x20 // 's knows ' 0x68 0x65 0x20 0x63 0x61 0x6E 0x20 0x62 // 'he can b' 0x65 0x20 0x74 0x68 0x65 0x20 0x62 0x65 // 'e the be' 0x73 0x74 0x20 0x62 0x61 0x64 0x20 0x67 // 'st bad g' 0x75 0x79 0x20 0x65 0x76 0x65 0x72 0x2E // 'uy ever.' 0x20 0x48 0x65 0x92 0x73 0x20 0x73 0x68 // ' Hes sh' 0x6F 0x72 0x74 0x2C 0x20 0x73 0x6F 0x20 // 'ort, so ' 0x68 0x65 0x20 0x63 0x61 0x6E 0x20 0x62 // 'he can b' 0x65 0x20 0x76 0x65 0x72 0x79 0x20 0x73 // 'e very s' 0x6E 0x65 0x61 0x6B 0x79 0x20 0x61 0x6E // 'neaky an' 0x64 0x20 0x71 0x75 0x69 0x63 0x6B 0x2C // 'd quick,' 0x20 0x65 0x73 0x70 0x65 0x63 0x69 0x61 // ' especia' 0x6C 0x6C 0x79 0x20 0x77 0x68 0x65 0x6E // 'lly when' 0x20 0x68 0x65 0x20 0x77 0x65 0x61 0x72 // ' he wear' 0x73 0x20 0x68 0x69 0x73 0x20 0x76 0x69 // 's his vi' 0x6C 0x6C 0x61 0x69 0x6E 0x92 0x73 0x20 // 'llains ' 0x76 0x65 0x73 0x74 0x2E 0x20 0x20 0x42 // 'vest. B' 0x75 0x74 0x20 0x68 0x65 0x27 0x64 0x20 // 'ut he'd ' 0x6F 0x6E 0x6C 0x79 0x20 0x62 0x65 0x20 // 'only be ' 0x61 0x20 0x62 0x61 0x64 0x20 0x67 0x75 // 'a bad gu' 0x79 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 // 'y to the' 0x20 0x62 0x61 0x64 0x20 0x67 0x75 0x79 // ' bad guy' 0x73 0x2C 0x20 0x73 0x69 0x6E 0x63 0x65 // 's, since' 0x20 0x68 0x65 0x92 0x64 0x20 0x61 0x6C // ' hed al' 0x77 0x61 0x79 0x73 0x20 0x62 0x65 0x20 // 'ways be ' 0x70 0x72 0x6F 0x74 0x65 0x63 0x74 0x69 // 'protecti' 0x6E 0x67 0x20 0x6B 0x69 0x64 0x73 0x20 // 'ng kids ' 0x61 0x67 0x61 0x69 0x6E 0x73 0x74 0x20 // 'against ' 0x62 0x75 0x6C 0x6C 0x69 0x65 0x73 0x2E // 'bullies.' 0x20 0x20 0x48 0x65 0x20 0x77 0x6F 0x75 // ' He wou' 0x6C 0x64 0x20 0x77 0x65 0x61 0x72 0x20 // 'ld wear ' 0x68 0x69 0x73 0x20 0x76 0x65 0x73 0x74 // 'his vest' 0x20 0x61 0x6E 0x64 0x20 0x68 0x61 0x6E // ' and han' 0x67 0x20 0x6F 0x75 0x74 0x20 0x61 0x72 // 'g out ar' 0x6F 0x75 0x6E 0x64 0x20 0x74 0x68 0x65 // 'ound the' 0x20 0x6D 0x61 0x6C 0x6C 0x2C 0x20 0x73 // ' mall, s' 0x74 0x6F 0x70 0x70 0x69 0x6E 0x67 0x20 // 'topping ' 0x70 0x75 0x6E 0x6B 0x73 0x20 0x62 0x65 // 'punks be' 0x66 0x6F 0x72 0x65 0x20 0x74 0x68 0x65 // 'fore the' 0x79 0x20 0x65 0x76 0x65 0x72 0x20 0x77 // 'y ever w' 0x65 0x6E 0x74 0x20 0x69 0x6E 0x73 0x69 // 'ent insi' 0x64 0x65 0x2E 0x20 0x0D 0x0A 0x42 0x75 // 'de. ??Bu' 0x74 0x20 0x77 0x68 0x61 0x74 0x20 0x69 // 't what i' 0x66 0x20 0x61 0x20 0x62 0x75 0x6E 0x63 // 'f a bunc' 0x68 0x20 0x6F 0x66 0x20 0x74 0x68 0x75 // 'h of thu' 0x67 0x73 0x20 0x73 0x68 0x6F 0x77 0x65 // 'gs showe' 0x64 0x20 0x75 0x70 0x3F 0x20 0x20 0x57 // 'd up? W' 0x6F 0x75 0x6C 0x64 0x20 0x68 0x69 0x73 // 'ould his' 0x20 0x76 0x65 0x73 0x74 0x20 0x67 0x69 // ' vest gi' 0x76 0x65 0x20 0x68 0x69 0x6D 0x20 0x73 // 've him s' 0x70 0x65 0x63 0x69 0x61 0x6C 0x20 0x70 // 'pecial p' 0x6F 0x77 0x65 0x72 0x73 0x20 0x74 0x6F // 'owers to' 0x20 0x73 0x74 0x6F 0x70 0x20 0x74 0x68 // ' stop th' 0x65 0x6D 0x3F 0x20 0x41 0x6E 0x64 0x20 // 'em? And ' 0x77 0x6F 0x75 0x6C 0x64 0x20 0x68 0x69 // 'would hi' 0x73 0x20 0x73 0x69 0x6E 0x67 0x69 0x6E // 's singin' 0x67 0x20 0x68 0x65 0x6C 0x70 0x20 0x68 // 'g help h' 0x69 0x6D 0x20 0x6F 0x75 0x74 0x20 0x6F // 'im out o' 0x66 0x20 0x61 0x20 0x74 0x69 0x67 0x68 // 'f a tigh' 0x74 0x20 0x73 0x70 0x6F 0x74 0x3F // 't spot?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_61= ktipbio56 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_61, __HELP_NAME("ktipbio56")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_61, __HELP_NAME("ktipbio56")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_60=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_61, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio56" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_60=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_61, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_60=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_60, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x07 0x02 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x80 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_60=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_60, 0x0) BYTE 0x03 0x03 0x4A 0x75 0x6E 0x67 0x6C 0x65 // '??Jungle' 0x20 0x4D 0x61 0x6E 0x0D 0x0A 0x57 0x68 // ' Man??Wh' 0x61 0x74 0x20 0x69 0x66 0x20 0x46 0x72 // 'at if Fr' 0x61 0x6E 0x6B 0x20 0x77 0x65 0x72 0x65 // 'ank were' 0x20 0x74 0x68 0x65 0x20 0x63 0x6F 0x6F // ' the coo' 0x6C 0x65 0x73 0x74 0x20 0x6A 0x75 0x6E // 'lest jun' 0x67 0x6C 0x65 0x20 0x6D 0x61 0x6E 0x20 // 'gle man ' 0x69 0x6E 0x20 0x5A 0x61 0x6D 0x62 0x69 // 'in Zambi' 0x61 0x2C 0x20 0x41 0x66 0x72 0x69 0x63 // 'a, Afric' 0x61 0x3F 0x20 0x20 0x4F 0x6E 0x65 0x20 // 'a? One ' 0x64 0x61 0x79 0x2C 0x20 0x68 0x65 0x20 // 'day, he ' 0x61 0x6E 0x64 0x20 0x68 0x69 0x73 0x20 // 'and his ' 0x64 0x6F 0x67 0x20 0x77 0x6F 0x75 0x6C // 'dog woul' 0x64 0x20 0x67 0x65 0x74 0x20 0x75 0x70 // 'd get up' 0x20 0x65 0x61 0x72 0x6C 0x79 0x20 0x61 // ' early a' 0x6E 0x64 0x20 0x65 0x78 0x70 0x6C 0x6F // 'nd explo' 0x72 0x65 0x20 0x61 0x6E 0x6F 0x74 0x68 // 're anoth' 0x65 0x72 0x20 0x76 0x69 0x6C 0x6C 0x61 // 'er villa' 0x67 0x65 0x2E 0x20 0x20 0x54 0x68 0x65 // 'ge. The' 0x79 0x27 0x64 0x20 0x66 0x69 0x6E 0x64 // 'y'd find' 0x20 0x61 0x20 0x77 0x6F 0x6F 0x64 0x65 // ' a woode' 0x6E 0x20 0x67 0x61 0x74 0x65 0x77 0x61 // 'n gatewa' 0x79 0x20 0x62 0x65 0x66 0x6F 0x72 0x65 // 'y before' 0x20 0x74 0x68 0x65 0x20 0x65 0x6E 0x74 // ' the ent' 0x72 0x61 0x6E 0x63 0x65 0x20 0x74 0x6F // 'rance to' 0x20 0x61 0x20 0x63 0x61 0x62 0x69 0x6E // ' a cabin' 0x2E 0x20 0x20 0x54 0x68 0x65 0x20 0x63 // '. The c' 0x61 0x62 0x69 0x6E 0x20 0x6D 0x69 0x67 // 'abin mig' 0x68 0x74 0x20 0x62 0x65 0x20 0x65 0x6D // 'ht be em' 0x70 0x74 0x79 0x20 0x61 0x6E 0x64 0x20 // 'pty and ' 0x73 0x69 0x6C 0x65 0x6E 0x74 0x2C 0x20 // 'silent, ' 0x62 0x75 0x74 0x20 0x6F 0x6E 0x20 0x61 // 'but on a' 0x20 0x74 0x61 0x62 0x6C 0x65 0x2C 0x20 // ' table, ' 0x61 0x20 0x63 0x61 0x6E 0x64 0x6C 0x65 // 'a candle' 0x20 0x77 0x6F 0x75 0x6C 0x64 0x20 0x62 // ' would b' 0x65 0x20 0x62 0x75 0x72 0x6E 0x69 0x6E // 'e burnin' 0x67 0x20 0x6E 0x65 0x78 0x74 0x20 0x74 // 'g next t' 0x6F 0x20 0x61 0x20 0x6D 0x61 0x70 0x2E // 'o a map.' 0x20 0x20 0x54 0x68 0x65 0x72 0x65 0x20 // ' There ' 0x77 0x6F 0x75 0x6C 0x64 0x20 0x62 0x65 // 'would be' 0x20 0x61 0x20 0x62 0x69 0x67 0x2C 0x20 // ' a big, ' 0x72 0x65 0x64 0x20 0x58 0x20 0x6F 0x6E // 'red X on' 0x20 0x74 0x68 0x65 0x20 0x6D 0x61 0x70 // ' the map' 0x2C 0x20 0x6E 0x65 0x61 0x72 0x20 0x74 // ', near t' 0x68 0x65 0x20 0x43 0x68 0x61 0x6D 0x62 // 'he Chamb' 0x65 0x7A 0x69 0x20 0x72 0x69 0x76 0x65 // 'ezi rive' 0x72 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 // 'r to the' 0x20 0x6E 0x6F 0x72 0x74 0x68 0x2E 0x20 // ' north. ' 0x0D 0x0A 0x57 0x68 0x79 0x20 0x77 0x61 // '??Why wa' 0x73 0x20 0x74 0x68 0x69 0x73 0x20 0x73 // 's this s' 0x70 0x6F 0x74 0x20 0x6D 0x61 0x72 0x6B // 'pot mark' 0x65 0x64 0x3F 0x20 0x20 0x57 0x68 0x61 // 'ed? Wha' 0x74 0x20 0x68 0x61 0x70 0x70 0x65 0x6E // 't happen' 0x65 0x64 0x20 0x74 0x6F 0x20 0x74 0x68 // 'ed to th' 0x65 0x20 0x70 0x65 0x72 0x73 0x6F 0x6E // 'e person' 0x20 0x77 0x68 0x6F 0x20 0x6C 0x69 0x76 // ' who liv' 0x65 0x64 0x20 0x69 0x6E 0x20 0x74 0x68 // 'ed in th' 0x65 0x20 0x63 0x61 0x62 0x69 0x6E 0x3F // 'e cabin?' 0x20 0x20 0x48 0x6F 0x77 0x20 0x77 0x6F // ' How wo' 0x75 0x6C 0x64 0x20 0x46 0x72 0x61 0x6E // 'uld Fran' 0x6B 0x20 0x61 0x6E 0x64 0x20 0x68 0x69 // 'k and hi' 0x73 0x20 0x64 0x6F 0x67 0x20 0x73 0x6E // 's dog sn' 0x69 0x66 0x66 0x20 0x6F 0x75 0x74 0x20 // 'iff out ' 0x74 0x68 0x65 0x73 0x65 0x20 0x6D 0x79 // 'these my' 0x73 0x74 0x65 0x72 0x69 0x65 0x73 0x3F // 'steries?' 0x20 // ' ' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_62= ktipbio57 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_62, __HELP_NAME("ktipbio57")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_62, __HELP_NAME("ktipbio57")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_30=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_62, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio57" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_30=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_62, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_30=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_30, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xD2 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x0A 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_30=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_30, 0x0) BYTE 0x03 0x03 0x63 0x72 0x61 0x77 0x6C 0x69 // '??crawli' 0x6E 0x67 0x0D 0x0A 0x53 0x6F 0x20 0x6A // 'ng??So j' 0x75 0x73 0x74 0x20 0x68 0x6F 0x77 0x20 // 'ust how ' 0x64 0x6F 0x65 0x73 0x20 0x47 0x61 0x62 // 'does Gab' 0x72 0x69 0x65 0x6C 0x20 0x6B 0x65 0x65 // 'riel kee' 0x70 0x20 0x66 0x72 0x6F 0x6D 0x20 0x67 // 'p from g' 0x65 0x74 0x74 0x69 0x6E 0x67 0x20 0x6B // 'etting k' 0x69 0x64 0x6E 0x61 0x70 0x70 0x65 0x64 // 'idnapped' 0x20 0x6F 0x72 0x20 0x6D 0x75 0x67 0x67 // ' or mugg' 0x65 0x64 0x20 0x77 0x68 0x65 0x6E 0x20 // 'ed when ' 0x68 0x65 0x92 0x73 0x20 0x61 0x74 0x20 // 'hes at ' 0x74 0x68 0x65 0x20 0x6D 0x61 0x6C 0x6C // 'the mall' 0x20 0x6F 0x72 0x20 0x62 0x65 0x61 0x63 // ' or beac' 0x68 0x3F 0x20 0x20 0x57 0x68 0x65 0x6E // 'h? When' 0x20 0x68 0x65 0x20 0x77 0x61 0x73 0x20 // ' he was ' 0x79 0x6F 0x75 0x6E 0x67 0x65 0x72 0x2C // 'younger,' 0x20 0x68 0x65 0x20 0x6C 0x65 0x61 0x72 // ' he lear' 0x6E 0x65 0x64 0x20 0x74 0x6F 0x20 0x73 // 'ned to s' 0x70 0x69 0x6E 0x20 0x61 0x72 0x6F 0x75 // 'pin arou' 0x6E 0x64 0x20 0x73 0x6F 0x20 0x66 0x61 // 'nd so fa' 0x73 0x74 0x20 0x74 0x68 0x61 0x74 0x20 // 'st that ' 0x6E 0x6F 0x20 0x6F 0x6E 0x65 0x20 0x63 // 'no one c' 0x6F 0x75 0x6C 0x64 0x20 0x74 0x6F 0x75 // 'ould tou' 0x63 0x68 0x20 0x68 0x69 0x6D 0x2E 0x20 // 'ch him. ' 0x20 0x41 0x66 0x74 0x65 0x72 0x20 0x68 // ' After h' 0x65 0x20 0x6C 0x65 0x61 0x72 0x6E 0x65 // 'e learne' 0x64 0x20 0x74 0x6F 0x20 0x77 0x61 0x6C // 'd to wal' 0x6B 0x2C 0x20 0x68 0x65 0x20 0x73 0x74 // 'k, he st' 0x69 0x6C 0x6C 0x20 0x63 0x6F 0x75 0x6C // 'ill coul' 0x64 0x20 0x73 0x70 0x69 0x6E 0x20 0x66 // 'd spin f' 0x61 0x73 0x74 0x20 0x69 0x66 0x20 0x68 // 'ast if h' 0x65 0x20 0x77 0x61 0x73 0x20 0x69 0x6E // 'e was in' 0x20 0x74 0x72 0x6F 0x75 0x62 0x6C 0x65 // ' trouble' 0x2E 0x20 0x20 0x48 0x65 0x20 0x64 0x69 // '. He di' 0x64 0x20 0x74 0x68 0x61 0x74 0x20 0x61 // 'd that a' 0x74 0x20 0x74 0x68 0x65 0x20 0x62 0x65 // 't the be' 0x61 0x63 0x68 0x20 0x6F 0x6E 0x65 0x20 // 'ach one ' 0x61 0x66 0x74 0x65 0x72 0x6E 0x6F 0x6F // 'afternoo' 0x6E 0x2C 0x20 0x61 0x6E 0x64 0x20 0x73 // 'n, and s' 0x70 0x72 0x61 0x79 0x65 0x64 0x20 0x73 // 'prayed s' 0x61 0x6E 0x64 0x20 0x61 0x6C 0x6C 0x20 // 'and all ' 0x6F 0x76 0x65 0x72 0x20 0x4D 0x63 0x5A // 'over McZ' 0x65 0x65 0x2C 0x20 0x74 0x68 0x65 0x20 // 'ee, the ' 0x6D 0x6F 0x76 0x69 0x65 0x20 0x64 0x69 // 'movie di' 0x72 0x65 0x63 0x74 0x6F 0x72 0x2E 0x20 // 'rector. ' 0x20 0x4D 0x63 0x5A 0x65 0x65 0x20 0x72 // ' McZee r' 0x65 0x61 0x6C 0x69 0x7A 0x65 0x64 0x20 // 'ealized ' 0x74 0x68 0x69 0x73 0x20 0x77 0x61 0x73 // 'this was' 0x20 0x72 0x61 0x77 0x2C 0x20 0x79 0x6F // ' raw, yo' 0x75 0x6E 0x67 0x20 0x74 0x61 0x6C 0x65 // 'ung tale' 0x6E 0x74 0x2C 0x20 0x61 0x6E 0x64 0x20 // 'nt, and ' 0x63 0x6F 0x6E 0x76 0x69 0x6E 0x63 0x65 // 'convince' 0x64 0x20 0x47 0x61 0x62 0x72 0x69 0x65 // 'd Gabrie' 0x6C 0x92 0x73 0x20 0x70 0x61 0x72 0x65 // 'ls pare' 0x6E 0x74 0x73 0x20 0x74 0x6F 0x20 0x6C // 'nts to l' 0x65 0x74 0x20 0x47 0x61 0x62 0x72 0x69 // 'et Gabri' 0x65 0x6C 0x20 0x62 0x65 0x20 0x69 0x6E // 'el be in' 0x20 0x68 0x69 0x73 0x20 0x6D 0x6F 0x76 // ' his mov' 0x69 0x65 0x73 0x2E // 'ies.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_63= ktipbio58 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_63, __HELP_NAME("ktipbio58")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_63, __HELP_NAME("ktipbio58")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_63=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_63, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio58" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_63=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_63, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_63=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_63, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xB3 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x72 0x01 0x00 0x82 // '????r??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_63=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_63, 0x0) BYTE 0x03 0x03 0x53 0x70 0x6F 0x6F 0x6B 0x79 // '??Spooky' 0x92 0x73 0x20 0x59 0x6F 0x75 0x6E 0x67 // 's Young' 0x65 0x73 0x74 0x20 0x53 0x6F 0x6E 0x0D // 'est Son?' 0x0A 0x53 0x70 0x6F 0x6F 0x6B 0x79 0x20 // '?Spooky ' 0x77 0x6F 0x75 0x6C 0x64 0x20 0x70 0x6C // 'would pl' 0x61 0x79 0x20 0x61 0x20 0x73 0x65 0x72 // 'ay a ser' 0x69 0x6F 0x75 0x73 0x6C 0x79 0x20 0x63 // 'iously c' 0x6F 0x6F 0x6C 0x20 0x44 0x61 0x64 0x20 // 'ool Dad ' 0x69 0x6E 0x20 0x74 0x68 0x69 0x73 0x20 // 'in this ' 0x6D 0x6F 0x76 0x69 0x65 0x2C 0x20 0x61 // 'movie, a' 0x6E 0x64 0x20 0x47 0x61 0x62 0x72 0x69 // 'nd Gabri' 0x65 0x6C 0x20 0x64 0x72 0x65 0x61 0x6D // 'el dream' 0x73 0x20 0x6F 0x66 0x20 0x62 0x65 0x69 // 's of bei' 0x6E 0x67 0x20 0x68 0x69 0x73 0x20 0x79 // 'ng his y' 0x6F 0x75 0x6E 0x67 0x65 0x73 0x74 0x20 // 'oungest ' 0x73 0x6F 0x6E 0x2E 0x20 0x20 0x47 0x61 // 'son. Ga' 0x62 0x72 0x69 0x65 0x6C 0x20 0x73 0x65 // 'briel se' 0x65 0x73 0x20 0x68 0x69 0x6D 0x73 0x65 // 'es himse' 0x6C 0x66 0x20 0x74 0x61 0x6B 0x69 0x6E // 'lf takin' 0x67 0x20 0x53 0x70 0x6F 0x6F 0x6B 0x79 // 'g Spooky' 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 // ' to the ' 0x6D 0x61 0x6C 0x6C 0x20 0x77 0x69 0x74 // 'mall wit' 0x68 0x20 0x68 0x69 0x6D 0x20 0x61 0x6E // 'h him an' 0x64 0x20 0x68 0x61 0x76 0x69 0x6E 0x67 // 'd having' 0x20 0x68 0x69 0x6D 0x20 0x74 0x72 0x79 // ' him try' 0x20 0x6F 0x6E 0x20 0x74 0x68 0x65 0x20 // ' on the ' 0x68 0x6F 0x74 0x74 0x65 0x73 0x74 0x20 // 'hottest ' 0x62 0x61 0x74 0x68 0x69 0x6E 0x67 0x20 // 'bathing ' 0x73 0x75 0x69 0x74 0x73 0x20 0x61 0x6E // 'suits an' 0x64 0x20 0x73 0x68 0x6F 0x72 0x74 0x73 // 'd shorts' 0x2E 0x20 0x20 0x57 0x68 0x69 0x6C 0x65 // '. While' 0x20 0x53 0x70 0x6F 0x6F 0x6B 0x79 0x20 // ' Spooky ' 0x69 0x73 0x20 0x69 0x6E 0x20 0x74 0x68 // 'is in th' 0x65 0x20 0x73 0x74 0x6F 0x72 0x65 0x2C // 'e store,' 0x20 0x47 0x61 0x62 0x72 0x69 0x65 0x6C // ' Gabriel' 0x20 0x77 0x61 0x6E 0x64 0x65 0x72 0x73 // ' wanders' 0x20 0x61 0x72 0x6F 0x75 0x6E 0x64 0x20 // ' around ' 0x6F 0x75 0x74 0x73 0x69 0x64 0x65 0x2E // 'outside.' 0x20 0x20 0x53 0x75 0x64 0x64 0x65 0x6E // ' Sudden' 0x6C 0x79 0x20 0x47 0x61 0x62 0x72 0x69 // 'ly Gabri' 0x65 0x6C 0x20 0x68 0x65 0x61 0x72 0x73 // 'el hears' 0x20 0x74 0x68 0x65 0x20 0x73 0x74 0x6F // ' the sto' 0x72 0x65 0x20 0x63 0x6C 0x65 0x72 0x6B // 're clerk' 0x20 0x79 0x65 0x6C 0x6C 0x2C 0x20 0x93 // ' yell, ' 0x53 0x74 0x6F 0x70 0x20 0x74 0x68 0x61 // 'Stop tha' 0x74 0x20 0x74 0x68 0x69 0x65 0x66 0x21 // 't thief!' 0x94 0x20 0x0D 0x0A 0x47 0x61 0x62 0x72 // ' ??Gabr' 0x69 0x65 0x6C 0x20 0x73 0x70 0x6F 0x74 // 'iel spot' 0x73 0x20 0x74 0x68 0x65 0x20 0x74 0x68 // 's the th' 0x69 0x65 0x66 0x20 0x63 0x6F 0x6D 0x69 // 'ief comi' 0x6E 0x67 0x20 0x68 0x69 0x73 0x20 0x77 // 'ng his w' 0x61 0x79 0x2E 0x20 0x20 0x43 0x61 0x6E // 'ay. Can' 0x20 0x68 0x65 0x20 0x73 0x74 0x6F 0x70 // ' he stop' 0x20 0x61 0x20 0x67 0x72 0x6F 0x77 0x6E // ' a grown' 0x20 0x6D 0x61 0x6E 0x3F // ' man?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_64= ktipbio59 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_64, __HELP_NAME("ktipbio59")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_64, __HELP_NAME("ktipbio59")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_67=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_64, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio59" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_67=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_64, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_67=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_67, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xB1 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x17 0x01 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_67=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_67, 0x0) BYTE 0x03 0x03 0x53 0x74 0x61 0x72 0x0D 0x0A // '??Star??' 0x57 0x68 0x61 0x74 0x20 0x74 0x68 0x65 // 'What the' 0x20 0x77 0x6F 0x72 0x6C 0x64 0x20 0x6E // ' world n' 0x65 0x65 0x64 0x73 0x20 0x69 0x73 0x20 // 'eeds is ' 0x61 0x6E 0x20 0x69 0x6E 0x66 0x61 0x6E // 'an infan' 0x74 0x20 0x73 0x74 0x61 0x72 0x2C 0x20 // 't star, ' 0x61 0x6E 0x64 0x20 0x47 0x61 0x62 0x72 // 'and Gabr' 0x69 0x65 0x6C 0x20 0x64 0x72 0x65 0x61 // 'iel drea' 0x6D 0x73 0x20 0x6F 0x66 0x20 0x62 0x65 // 'ms of be' 0x69 0x6E 0x67 0x20 0x74 0x68 0x61 0x74 // 'ing that' 0x20 0x73 0x74 0x61 0x72 0x2E 0x20 0x20 // ' star. ' 0x4E 0x6F 0x74 0x20 0x6A 0x75 0x73 0x74 // 'Not just' 0x20 0x61 0x6E 0x79 0x20 0x63 0x72 0x61 // ' any cra' 0x6E 0x6B 0x79 0x20 0x62 0x61 0x62 0x79 // 'nky baby' 0x2C 0x20 0x62 0x75 0x74 0x20 0x61 0x20 // ', but a ' 0x73 0x74 0x75 0x6E 0x74 0x20 0x62 0x61 // 'stunt ba' 0x62 0x79 0x21 0x20 0x47 0x61 0x62 0x72 // 'by! Gabr' 0x69 0x65 0x6C 0x20 0x69 0x6D 0x61 0x67 // 'iel imag' 0x69 0x6E 0x65 0x73 0x20 0x74 0x68 0x61 // 'ines tha' 0x74 0x20 0x68 0x69 0x73 0x20 0x64 0x69 // 't his di' 0x61 0x70 0x65 0x72 0x73 0x20 0x77 0x6F // 'apers wo' 0x75 0x6C 0x64 0x20 0x70 0x72 0x6F 0x74 // 'uld prot' 0x65 0x63 0x74 0x20 0x68 0x69 0x6D 0x20 // 'ect him ' 0x66 0x72 0x6F 0x6D 0x20 0x61 0x6C 0x6C // 'from all' 0x20 0x66 0x61 0x6C 0x6C 0x73 0x2C 0x20 // ' falls, ' 0x73 0x6F 0x20 0x68 0x65 0x20 0x63 0x6F // 'so he co' 0x75 0x6C 0x64 0x20 0x6A 0x75 0x6D 0x70 // 'uld jump' 0x20 0x6F 0x75 0x74 0x20 0x61 0x20 0x77 // ' out a w' 0x69 0x6E 0x64 0x6F 0x77 0x2C 0x20 0x73 // 'indow, s' 0x71 0x75 0x61 0x73 0x68 0x20 0x75 0x70 // 'quash up' 0x2C 0x20 0x72 0x65 0x74 0x75 0x72 0x6E // ', return' 0x20 0x74 0x6F 0x20 0x6E 0x6F 0x72 0x6D // ' to norm' 0x61 0x6C 0x20 0x73 0x69 0x7A 0x65 0x2C // 'al size,' 0x20 0x61 0x6E 0x64 0x20 0x72 0x75 0x6E // ' and run' 0x20 0x61 0x77 0x61 0x79 0x2E 0x20 0x0D // ' away. ?' 0x0A 0x42 0x75 0x74 0x20 0x77 0x68 0x61 // '?But wha' 0x74 0x20 0x69 0x66 0x20 0x68 0x65 0x20 // 't if he ' 0x6A 0x75 0x6D 0x70 0x65 0x64 0x20 0x61 // 'jumped a' 0x6E 0x64 0x20 0x6C 0x61 0x6E 0x64 0x65 // 'nd lande' 0x64 0x20 0x72 0x69 0x67 0x68 0x74 0x20 // 'd right ' 0x69 0x6E 0x20 0x74 0x68 0x65 0x20 0x70 // 'in the p' 0x61 0x74 0x68 0x20 0x6F 0x66 0x20 0x61 // 'ath of a' 0x20 0x74 0x61 0x78 0x69 0x20 0x63 0x61 // ' taxi ca' 0x62 0x20 0x61 0x73 0x20 0x68 0x65 0x20 // 'b as he ' 0x77 0x61 0x73 0x20 0x72 0x65 0x74 0x75 // 'was retu' 0x72 0x6E 0x69 0x6E 0x67 0x20 0x74 0x6F // 'rning to' 0x20 0x6E 0x6F 0x72 0x6D 0x61 0x6C 0x20 // ' normal ' 0x73 0x69 0x7A 0x65 0x3F 0x20 0x20 0x47 // 'size? G' 0x61 0x62 0x72 0x69 0x65 0x6C 0x20 0x63 // 'abriel c' 0x61 0x6E 0x20 0x73 0x71 0x75 0x61 0x73 // 'an squas' 0x68 0x20 0x61 0x6E 0x64 0x20 0x67 0x72 // 'h and gr' 0x6F 0x77 0x2C 0x20 0x62 0x75 0x74 0x20 // 'ow, but ' 0x63 0x61 0x6E 0x20 0x68 0x65 0x20 0x61 // 'can he a' 0x6C 0x73 0x6F 0x20 0x73 0x68 0x72 0x69 // 'lso shri' 0x6E 0x6B 0x3F // 'nk?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_65= ktipbio60 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_65, __HELP_NAME("ktipbio60")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_65, __HELP_NAME("ktipbio60")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_65=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_65, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio60" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_65=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_65, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_65=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_65, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xAE 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x5E 0x01 0x00 0x82 // '????^??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_65=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_65, 0x0) BYTE 0x03 0x03 0x59 0x6F 0x75 0x6E 0x67 0x20 // '??Young ' 0x4E 0x61 0x74 0x69 0x76 0x65 0x0D 0x0A // 'Native??' 0x41 0x6E 0x6F 0x74 0x68 0x65 0x72 0x20 // 'Another ' 0x64 0x72 0x65 0x61 0x6D 0x20 0x47 0x61 // 'dream Ga' 0x62 0x72 0x69 0x65 0x6C 0x20 0x68 0x61 // 'briel ha' 0x73 0x20 0x69 0x73 0x20 0x74 0x6F 0x20 // 's is to ' 0x70 0x6C 0x61 0x79 0x20 0x74 0x68 0x65 // 'play the' 0x20 0x70 0x61 0x72 0x74 0x20 0x6F 0x66 // ' part of' 0x20 0x61 0x20 0x62 0x61 0x62 0x79 0x20 // ' a baby ' 0x77 0x68 0x6F 0x20 0x68 0x61 0x73 0x20 // 'who has ' 0x62 0x65 0x65 0x6E 0x20 0x72 0x61 0x69 // 'been rai' 0x73 0x65 0x64 0x20 0x62 0x79 0x20 0x77 // 'sed by w' 0x69 0x6C 0x64 0x20 0x61 0x6E 0x69 0x6D // 'ild anim' 0x61 0x6C 0x73 0x20 0x69 0x6E 0x20 0x74 // 'als in t' 0x68 0x65 0x20 0x6A 0x75 0x6E 0x67 0x6C // 'he jungl' 0x65 0x2E 0x20 0x20 0x48 0x65 0x20 0x73 // 'e. He s' 0x65 0x65 0x73 0x20 0x68 0x69 0x6D 0x73 // 'ees hims' 0x65 0x6C 0x66 0x20 0x6A 0x75 0x6D 0x70 // 'elf jump' 0x69 0x6E 0x67 0x20 0x66 0x72 0x6F 0x6D // 'ing from' 0x20 0x74 0x72 0x65 0x65 0x73 0x20 0x61 // ' trees a' 0x6E 0x64 0x20 0x73 0x71 0x75 0x61 0x73 // 'nd squas' 0x68 0x69 0x6E 0x67 0x20 0x77 0x68 0x65 // 'hing whe' 0x6E 0x20 0x68 0x65 0x20 0x6C 0x61 0x6E // 'n he lan' 0x64 0x73 0x2C 0x20 0x6C 0x69 0x6B 0x65 // 'ds, like' 0x20 0x61 0x20 0x6D 0x6F 0x6E 0x6B 0x65 // ' a monke' 0x79 0x2E 0x20 0x20 0x42 0x75 0x74 0x20 // 'y. But ' 0x6F 0x6E 0x65 0x20 0x64 0x61 0x79 0x20 // 'one day ' 0x68 0x65 0x20 0x69 0x73 0x20 0x61 0x62 // 'he is ab' 0x64 0x75 0x63 0x74 0x65 0x64 0x20 0x62 // 'ducted b' 0x79 0x20 0x6E 0x61 0x74 0x69 0x76 0x65 // 'y native' 0x73 0x20 0x61 0x6E 0x64 0x20 0x74 0x61 // 's and ta' 0x6B 0x65 0x6E 0x20 0x74 0x6F 0x20 0x74 // 'ken to t' 0x68 0x65 0x69 0x72 0x20 0x76 0x69 0x6C // 'heir vil' 0x6C 0x61 0x67 0x65 0x2E 0x20 0x20 0x48 // 'lage. H' 0x65 0x20 0x6F 0x76 0x65 0x72 0x68 0x65 // 'e overhe' 0x61 0x72 0x73 0x20 0x74 0x68 0x65 0x20 // 'ars the ' 0x76 0x69 0x6C 0x6C 0x61 0x67 0x65 0x72 // 'villager' 0x73 0x20 0x70 0x6C 0x61 0x6E 0x6E 0x69 // 's planni' 0x6E 0x67 0x20 0x74 0x6F 0x20 0x63 0x61 // 'ng to ca' 0x70 0x74 0x75 0x72 0x65 0x20 0x74 0x68 // 'pture th' 0x65 0x20 0x77 0x69 0x6C 0x64 0x20 0x61 // 'e wild a' 0x6E 0x69 0x6D 0x61 0x6C 0x73 0x20 0x61 // 'nimals a' 0x6E 0x64 0x20 0x73 0x65 0x6C 0x6C 0x20 // 'nd sell ' 0x74 0x68 0x65 0x6D 0x2E 0x20 0x0D 0x0A // 'them. ??' 0x43 0x61 0x6E 0x20 0x47 0x61 0x62 0x72 // 'Can Gabr' 0x69 0x65 0x6C 0x20 0x66 0x69 0x6E 0x64 // 'iel find' 0x20 0x61 0x20 0x77 0x61 0x79 0x20 0x74 // ' a way t' 0x6F 0x20 0x73 0x74 0x6F 0x70 0x20 0x74 // 'o stop t' 0x68 0x65 0x6D 0x3F 0x20 0x20 0x57 0x69 // 'hem? Wi' 0x6C 0x6C 0x20 0x68 0x69 0x73 0x20 0x70 // 'll his p' 0x61 0x63 0x69 0x66 0x69 0x65 0x72 0x20 // 'acifier ' 0x67 0x69 0x76 0x65 0x20 0x68 0x69 0x6D // 'give him' 0x20 0x73 0x70 0x65 0x63 0x69 0x61 0x6C // ' special' 0x20 0x70 0x6F 0x77 0x65 0x72 0x73 0x3F // ' powers?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_66= ktipbio61 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_66, __HELP_NAME("ktipbio61")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_66, __HELP_NAME("ktipbio61")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_64=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_66, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio61" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_64=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_66, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_64=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_64, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x58 0x01 0x00 0x01 // '????X???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x07 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_64=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_64, 0x0) BYTE 0x03 0x03 0x64 0x72 0x61 0x6D 0x61 0x0D // '??drama?' 0x0A 0x4F 0x6E 0x65 0x20 0x64 0x61 0x79 // '?One day' 0x20 0x69 0x6E 0x20 0x47 0x72 0x65 0x67 // ' in Greg' 0x6F 0x72 0x79 0x27 0x73 0x20 0x64 0x72 // 'ory's dr' 0x61 0x6D 0x61 0x20 0x63 0x6C 0x61 0x73 // 'ama clas' 0x73 0x2C 0x20 0x74 0x68 0x65 0x20 0x67 // 's, the g' 0x72 0x65 0x61 0x74 0x20 0x66 0x69 0x6C // 'reat fil' 0x6D 0x20 0x64 0x69 0x72 0x65 0x63 0x74 // 'm direct' 0x6F 0x72 0x20 0x4D 0x63 0x5A 0x65 0x65 // 'or McZee' 0x20 0x63 0x61 0x6D 0x65 0x20 0x74 0x6F // ' came to' 0x20 0x74 0x65 0x6C 0x6C 0x20 0x74 0x68 // ' tell th' 0x65 0x20 0x63 0x6C 0x61 0x73 0x73 0x20 // 'e class ' 0x61 0x62 0x6F 0x75 0x74 0x20 0x68 0x6F // 'about ho' 0x77 0x20 0x68 0x65 0x20 0x6D 0x61 0x6B // 'w he mak' 0x65 0x73 0x20 0x6D 0x6F 0x76 0x69 0x65 // 'es movie' 0x73 0x2E 0x20 0x20 0x41 0x66 0x74 0x65 // 's. Afte' 0x72 0x20 0x74 0x68 0x65 0x20 0x6C 0x65 // 'r the le' 0x63 0x74 0x75 0x72 0x65 0x2C 0x20 0x73 // 'cture, s' 0x65 0x76 0x65 0x72 0x61 0x6C 0x20 0x73 // 'everal s' 0x74 0x75 0x64 0x65 0x6E 0x74 0x73 0x20 // 'tudents ' 0x64 0x69 0x64 0x20 0x61 0x20 0x73 0x6B // 'did a sk' 0x69 0x74 0x20 0x74 0x68 0x65 0x79 0x27 // 'it they'' 0x64 0x20 0x77 0x72 0x69 0x74 0x74 0x65 // 'd writte' 0x6E 0x20 0x66 0x6F 0x72 0x20 0x4D 0x63 // 'n for Mc' 0x5A 0x65 0x65 0x2E 0x20 0x20 0x47 0x72 // 'Zee. Gr' 0x65 0x67 0x6F 0x72 0x79 0x20 0x77 0x61 // 'egory wa' 0x73 0x20 0x61 0x20 0x62 0x75 0x6D 0x62 // 's a bumb' 0x6C 0x69 0x6E 0x67 0x20 0x64 0x65 0x74 // 'ling det' 0x65 0x63 0x74 0x69 0x76 0x65 0x20 0x77 // 'ective w' 0x68 0x6F 0x20 0x66 0x61 0x6C 0x6C 0x73 // 'ho falls' 0x20 0x64 0x6F 0x77 0x6E 0x20 0x61 0x20 // ' down a ' 0x6C 0x6F 0x74 0x20 0x61 0x6E 0x64 0x20 // 'lot and ' 0x68 0x61 0x73 0x20 0x61 0x20 0x6B 0x6E // 'has a kn' 0x61 0x63 0x6B 0x20 0x66 0x6F 0x72 0x20 // 'ack for ' 0x66 0x69 0x6E 0x64 0x69 0x6E 0x67 0x20 // 'finding ' 0x74 0x72 0x6F 0x75 0x62 0x6C 0x65 0x2E // 'trouble.' 0x20 0x20 0x4D 0x63 0x5A 0x65 0x65 0x20 // ' McZee ' 0x6C 0x6F 0x76 0x65 0x64 0x20 0x69 0x74 // 'loved it' 0x2E 0x20 0x48 0x65 0x20 0x61 0x73 0x6B // '. He ask' 0x65 0x64 0x20 0x47 0x72 0x65 0x67 0x6F // 'ed Grego' 0x72 0x79 0x20 0x74 0x6F 0x20 0x62 0x65 // 'ry to be' 0x20 0x69 0x6E 0x20 0x68 0x69 0x73 0x20 // ' in his ' 0x6E 0x65 0x78 0x74 0x20 0x66 0x69 0x6C // 'next fil' 0x6D 0x2E // 'm.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_67= ktipbio62 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_67, __HELP_NAME("ktipbio62")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_67, __HELP_NAME("ktipbio62")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_66=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_67, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio62" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_66=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_67, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_66=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_66, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x9A 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x2F 0x01 0x00 0x82 // '????/??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_66=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_66, 0x0) BYTE 0x03 0x03 0x4D 0x61 0x67 0x69 0x63 0x69 // '??Magici' 0x61 0x6E 0x0D 0x0A 0x54 0x68 0x65 0x20 // 'an??The ' 0x75 0x6C 0x74 0x69 0x6D 0x61 0x74 0x65 // 'ultimate' 0x20 0x72 0x6F 0x6C 0x65 0x20 0x66 0x6F // ' role fo' 0x72 0x20 0x47 0x72 0x65 0x67 0x6F 0x72 // 'r Gregor' 0x79 0x20 0x77 0x6F 0x75 0x6C 0x64 0x20 // 'y would ' 0x62 0x65 0x20 0x74 0x6F 0x20 0x70 0x6C // 'be to pl' 0x61 0x79 0x20 0x61 0x20 0x6D 0x61 0x67 // 'ay a mag' 0x69 0x63 0x69 0x61 0x6E 0x2E 0x20 0x49 // 'ician. I' 0x6E 0x20 0x74 0x68 0x65 0x20 0x72 0x6F // 'n the ro' 0x6C 0x65 0x2C 0x20 0x47 0x72 0x65 0x67 // 'le, Greg' 0x6F 0x72 0x79 0x20 0x6C 0x69 0x76 0x65 // 'ory live' 0x73 0x20 0x6E 0x65 0x78 0x74 0x20 0x64 // 's next d' 0x6F 0x6F 0x72 0x20 0x74 0x6F 0x20 0x61 // 'oor to a' 0x20 0x68 0x61 0x75 0x6E 0x74 0x65 0x64 // ' haunted' 0x20 0x68 0x6F 0x75 0x73 0x65 0x20 0x6F // ' house o' 0x77 0x6E 0x65 0x64 0x20 0x62 0x79 0x20 // 'wned by ' 0x61 0x20 0x63 0x72 0x65 0x65 0x70 0x79 // 'a creepy' 0x20 0x6D 0x61 0x6E 0x2E 0x20 0x20 0x47 // ' man. G' 0x72 0x65 0x67 0x6F 0x72 0x79 0x20 0x61 // 'regory a' 0x6E 0x64 0x20 0x68 0x69 0x73 0x20 0x66 // 'nd his f' 0x72 0x69 0x65 0x6E 0x64 0x73 0x20 0x64 // 'riends d' 0x65 0x63 0x69 0x64 0x65 0x20 0x74 0x6F // 'ecide to' 0x20 0x69 0x6E 0x76 0x65 0x73 0x74 0x69 // ' investi' 0x67 0x61 0x74 0x65 0x20 0x74 0x68 0x65 // 'gate the' 0x20 0x68 0x6F 0x75 0x73 0x65 0x20 0x6F // ' house o' 0x6E 0x65 0x20 0x61 0x66 0x74 0x65 0x72 // 'ne after' 0x6E 0x6F 0x6F 0x6E 0x2E 0x20 0x20 0x4F // 'noon. O' 0x6E 0x63 0x65 0x20 0x69 0x6E 0x73 0x69 // 'nce insi' 0x64 0x65 0x20 0x74 0x68 0x65 0x20 0x6C // 'de the l' 0x69 0x62 0x72 0x61 0x72 0x79 0x2C 0x20 // 'ibrary, ' 0x73 0x74 0x72 0x61 0x6E 0x67 0x65 0x20 // 'strange ' 0x67 0x72 0x6F 0x61 0x6E 0x73 0x20 0x63 // 'groans c' 0x6F 0x6D 0x65 0x20 0x66 0x72 0x6F 0x6D // 'ome from' 0x20 0x61 0x6C 0x6C 0x20 0x74 0x68 0x65 // ' all the' 0x20 0x62 0x6F 0x6F 0x6B 0x73 0x20 0x6F // ' books o' 0x6E 0x20 0x74 0x68 0x65 0x20 0x73 0x68 // 'n the sh' 0x65 0x6C 0x76 0x65 0x73 0x2E 0x20 0x0D // 'elves. ?' 0x0A 0x43 0x61 0x6E 0x20 0x47 0x72 0x65 // '?Can Gre' 0x67 0x6F 0x72 0x79 0x20 0x75 0x73 0x65 // 'gory use' 0x20 0x68 0x69 0x73 0x20 0x6D 0x61 0x67 // ' his mag' 0x69 0x63 0x61 0x6C 0x20 0x70 0x6F 0x77 // 'ical pow' 0x65 0x72 0x73 0x20 0x74 0x6F 0x20 0x73 // 'ers to s' 0x68 0x72 0x69 0x6E 0x6B 0x20 0x6F 0x72 // 'hrink or' 0x20 0x67 0x72 0x6F 0x77 0x20 0x68 0x69 // ' grow hi' 0x6D 0x73 0x65 0x6C 0x66 0x20 0x61 0x6E // 'mself an' 0x64 0x20 0x67 0x65 0x74 0x20 0x74 0x68 // 'd get th' 0x65 0x6D 0x20 0x6F 0x75 0x74 0x20 0x6F // 'em out o' 0x66 0x20 0x74 0x68 0x65 0x20 0x68 0x61 // 'f the ha' 0x75 0x6E 0x74 0x65 0x64 0x20 0x68 0x6F // 'unted ho' 0x75 0x73 0x65 0x2E 0x2E 0x2E 0x61 0x6C // 'use...al' 0x69 0x76 0x65 0x3F // 'ive?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_68= ktipbio63 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_68, __HELP_NAME("ktipbio63")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_68, __HELP_NAME("ktipbio63")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_69=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_68, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio63" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_69=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_68, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_69=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_69, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x5E 0x02 0x00 0x01 // '????^???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xBD 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_69=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_69, 0x0) BYTE 0x03 0x03 0x4E 0x65 0x77 0x73 0x70 0x61 // '??Newspa' 0x70 0x65 0x72 0x20 0x42 0x6F 0x79 0x0D // 'per Boy?' 0x0A 0x47 0x72 0x65 0x67 0x6F 0x72 0x79 // '?Gregory' 0x20 0x74 0x68 0x69 0x6E 0x6B 0x73 0x20 // ' thinks ' 0x69 0x74 0x20 0x77 0x6F 0x75 0x6C 0x64 // 'it would' 0x20 0x62 0x65 0x20 0x63 0x6F 0x6F 0x6C // ' be cool' 0x20 0x74 0x6F 0x20 0x70 0x6C 0x61 0x79 // ' to play' 0x20 0x61 0x20 0x6E 0x65 0x77 0x73 0x70 // ' a newsp' 0x61 0x70 0x65 0x72 0x20 0x62 0x6F 0x79 // 'aper boy' 0x20 0x77 0x68 0x6F 0x20 0x77 0x69 0x74 // ' who wit' 0x6E 0x65 0x73 0x73 0x65 0x73 0x20 0x61 // 'nesses a' 0x20 0x72 0x6F 0x62 0x62 0x65 0x72 0x79 // ' robbery' 0x2E 0x20 0x20 0x42 0x65 0x66 0x6F 0x72 // '. Befor' 0x65 0x20 0x74 0x68 0x65 0x20 0x72 0x6F // 'e the ro' 0x62 0x62 0x65 0x72 0x20 0x6A 0x75 0x6D // 'bber jum' 0x70 0x73 0x20 0x6F 0x75 0x74 0x20 0x61 // 'ps out a' 0x20 0x77 0x69 0x6E 0x64 0x6F 0x77 0x20 // ' window ' 0x74 0x6F 0x20 0x6D 0x61 0x6B 0x65 0x20 // 'to make ' 0x68 0x69 0x73 0x20 0x65 0x73 0x63 0x61 // 'his esca' 0x70 0x65 0x2C 0x20 0x68 0x65 0x20 0x63 // 'pe, he c' 0x61 0x74 0x63 0x68 0x65 0x73 0x20 0x61 // 'atches a' 0x20 0x67 0x6C 0x69 0x6D 0x70 0x73 0x65 // ' glimpse' 0x20 0x6F 0x66 0x20 0x47 0x72 0x65 0x67 // ' of Greg' 0x6F 0x72 0x79 0x2E 0x20 0x20 0x48 0x65 // 'ory. He' 0x20 0x6B 0x6E 0x6F 0x77 0x73 0x20 0x47 // ' knows G' 0x72 0x65 0x67 0x6F 0x72 0x79 0x20 0x73 // 'regory s' 0x61 0x77 0x20 0x68 0x69 0x6D 0x2E 0x0D // 'aw him.?' 0x0A 0x42 0x75 0x74 0x20 0x62 0x79 0x73 // '?But bys' 0x74 0x61 0x6E 0x64 0x65 0x72 0x73 0x20 // 'tanders ' 0x74 0x65 0x6C 0x6C 0x20 0x74 0x68 0x65 // 'tell the' 0x20 0x70 0x6F 0x6C 0x69 0x63 0x65 0x20 // ' police ' 0x74 0x68 0x61 0x74 0x20 0x74 0x68 0x65 // 'that the' 0x79 0x20 0x73 0x61 0x77 0x20 0x47 0x72 // 'y saw Gr' 0x65 0x67 0x6F 0x72 0x79 0x20 0x61 0x74 // 'egory at' 0x20 0x74 0x68 0x65 0x20 0x73 0x63 0x65 // ' the sce' 0x6E 0x65 0x20 0x6F 0x66 0x20 0x74 0x68 // 'ne of th' 0x65 0x20 0x63 0x72 0x69 0x6D 0x65 0x2C // 'e crime,' 0x20 0x61 0x6E 0x64 0x20 0x6E 0x6F 0x77 // ' and now' 0x20 0x74 0x68 0x65 0x20 0x63 0x6F 0x70 // ' the cop' 0x73 0x20 0x74 0x68 0x69 0x6E 0x6B 0x20 // 's think ' 0x47 0x72 0x65 0x67 0x6F 0x72 0x79 0x20 // 'Gregory ' 0x64 0x69 0x64 0x20 0x69 0x74 0x2E 0x20 // 'did it. ' 0x47 0x72 0x65 0x67 0x6F 0x72 0x79 0x20 // 'Gregory ' 0x68 0x61 0x73 0x20 0x74 0x6F 0x20 0x68 // 'has to h' 0x69 0x64 0x65 0x20 0x66 0x72 0x6F 0x6D // 'ide from' 0x20 0x74 0x68 0x65 0x20 0x70 0x6F 0x6C // ' the pol' 0x69 0x63 0x65 0x20 0x61 0x6E 0x64 0x20 // 'ice and ' 0x74 0x68 0x65 0x20 0x72 0x65 0x61 0x6C // 'the real' 0x20 0x72 0x6F 0x62 0x62 0x65 0x72 0x20 // ' robber ' 0x77 0x68 0x69 0x6C 0x65 0x20 0x68 0x65 // 'while he' 0x20 0x66 0x69 0x67 0x75 0x72 0x65 0x73 // ' figures' 0x20 0x6F 0x75 0x74 0x20 0x68 0x6F 0x77 // ' out how' 0x20 0x74 0x6F 0x20 0x70 0x72 0x6F 0x76 // ' to prov' 0x65 0x20 0x77 0x68 0x6F 0x20 0x74 0x68 // 'e who th' 0x65 0x20 0x72 0x6F 0x62 0x62 0x65 0x72 // 'e robber' 0x20 0x69 0x73 0x2E 0x20 0x0D 0x0A 0x57 // ' is. ??W' 0x69 0x6C 0x6C 0x20 0x47 0x72 0x65 0x67 // 'ill Greg' 0x6F 0x72 0x79 0x20 0x62 0x65 0x20 0x61 // 'ory be a' 0x62 0x6C 0x65 0x20 0x74 0x6F 0x20 0x70 // 'ble to p' 0x72 0x6F 0x76 0x65 0x20 0x68 0x69 0x73 // 'rove his' 0x20 0x69 0x6E 0x6E 0x6F 0x63 0x65 0x6E // ' innocen' 0x63 0x65 0x3F 0x20 0x20 0x43 0x61 0x6E // 'ce? Can' 0x20 0x68 0x65 0x20 0x68 0x65 0x6C 0x70 // ' he help' 0x20 0x6C 0x65 0x61 0x64 0x20 0x74 0x68 // ' lead th' 0x65 0x20 0x70 0x6F 0x6C 0x69 0x63 0x65 // 'e police' 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 // ' to the ' 0x72 0x65 0x61 0x6C 0x20 0x72 0x6F 0x62 // 'real rob' 0x62 0x65 0x72 0x20 0x77 0x69 0x74 0x68 // 'ber with' 0x6F 0x75 0x74 0x20 0x62 0x65 0x69 0x6E // 'out bein' 0x67 0x20 0x61 0x72 0x72 0x65 0x73 0x74 // 'g arrest' 0x65 0x64 0x20 0x68 0x69 0x6D 0x73 0x65 // 'ed himse' 0x6C 0x66 0x2C 0x20 0x6F 0x72 0x20 0x77 // 'lf, or w' 0x6F 0x72 0x73 0x65 0x2C 0x20 0x62 0x65 // 'orse, be' 0x69 0x6E 0x67 0x20 0x66 0x6F 0x75 0x6E // 'ing foun' 0x64 0x20 0x62 0x79 0x20 0x74 0x68 0x65 // 'd by the' 0x20 0x72 0x6F 0x62 0x62 0x65 0x72 0x3F // ' robber?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_69= ktipbio64 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_69, __HELP_NAME("ktipbio64")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_69, __HELP_NAME("ktipbio64")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_73=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_69, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio64" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_73=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_69, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_73=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_73, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1B 0x03 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x87 0x02 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_73=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_73, 0x0) BYTE 0x03 0x03 0x42 0x6F 0x79 0x20 0x53 0x63 // '??Boy Sc' 0x6F 0x75 0x74 0x0D 0x0A 0x47 0x72 0x65 // 'out??Gre' 0x67 0x6F 0x72 0x79 0x20 0x69 0x6D 0x61 // 'gory ima' 0x67 0x69 0x6E 0x65 0x73 0x20 0x61 0x20 // 'gines a ' 0x6D 0x6F 0x76 0x69 0x65 0x20 0x69 0x6E // 'movie in' 0x20 0x77 0x68 0x69 0x63 0x68 0x20 0x68 // ' which h' 0x65 0x20 0x70 0x6C 0x61 0x79 0x73 0x20 // 'e plays ' 0x61 0x20 0x62 0x6F 0x79 0x20 0x73 0x63 // 'a boy sc' 0x6F 0x75 0x74 0x20 0x77 0x68 0x6F 0x73 // 'out whos' 0x65 0x20 0x74 0x72 0x6F 0x6F 0x70 0x20 // 'e troop ' 0x74 0x72 0x61 0x76 0x65 0x6C 0x73 0x20 // 'travels ' 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 0x69 // 'to the i' 0x73 0x6C 0x61 0x6E 0x64 0x20 0x6F 0x66 // 'sland of' 0x20 0x46 0x69 0x6A 0x69 0x2E 0x20 0x20 // ' Fiji. ' 0x54 0x68 0x65 0x20 0x74 0x72 0x6F 0x6F // 'The troo' 0x70 0x20 0x76 0x69 0x73 0x69 0x74 0x73 // 'p visits' 0x20 0x61 0x20 0x74 0x72 0x69 0x62 0x61 // ' a triba' 0x6C 0x20 0x68 0x6F 0x75 0x73 0x65 0x20 // 'l house ' 0x6F 0x6E 0x63 0x65 0x20 0x75 0x73 0x65 // 'once use' 0x64 0x20 0x62 0x79 0x20 0x69 0x73 0x6C // 'd by isl' 0x61 0x6E 0x64 0x20 0x63 0x68 0x69 0x65 // 'and chie' 0x66 0x73 0x2E 0x20 0x20 0x47 0x72 0x65 // 'fs. Gre' 0x67 0x6F 0x72 0x79 0x20 0x62 0x75 0x6D // 'gory bum' 0x70 0x73 0x20 0x69 0x6E 0x74 0x6F 0x20 // 'ps into ' 0x61 0x20 0x74 0x6F 0x74 0x65 0x6D 0x20 // 'a totem ' 0x70 0x6F 0x6C 0x65 0x2C 0x20 0x77 0x68 // 'pole, wh' 0x69 0x63 0x68 0x20 0x74 0x61 0x6C 0x6B // 'ich talk' 0x73 0x20 0x74 0x6F 0x20 0x68 0x69 0x6D // 's to him' 0x21 0x20 0x20 0x54 0x68 0x65 0x20 0x70 // '! The p' 0x6F 0x6C 0x65 0x20 0x74 0x65 0x6C 0x6C // 'ole tell' 0x73 0x20 0x47 0x72 0x65 0x67 0x6F 0x72 // 's Gregor' 0x79 0x20 0x6F 0x66 0x20 0x61 0x20 0x62 // 'y of a b' 0x75 0x72 0x69 0x65 0x64 0x20 0x74 0x72 // 'uried tr' 0x65 0x61 0x73 0x75 0x72 0x65 0x20 0x63 // 'easure c' 0x68 0x65 0x73 0x74 0x20 0x74 0x68 0x61 // 'hest tha' 0x74 0x20 0x77 0x61 0x73 0x20 0x73 0x74 // 't was st' 0x6F 0x6C 0x65 0x6E 0x20 0x6C 0x6F 0x6E // 'olen lon' 0x67 0x20 0x61 0x67 0x6F 0x2E 0x20 0x20 // 'g ago. ' 0x49 0x74 0x20 0x61 0x73 0x6B 0x73 0x20 // 'It asks ' 0x47 0x72 0x65 0x67 0x6F 0x72 0x79 0x20 // 'Gregory ' 0x74 0x6F 0x20 0x62 0x72 0x69 0x6E 0x67 // 'to bring' 0x20 0x74 0x68 0x65 0x20 0x63 0x68 0x65 // ' the che' 0x73 0x74 0x20 0x62 0x61 0x63 0x6B 0x20 // 'st back ' 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 0x76 // 'to the v' 0x69 0x6C 0x6C 0x61 0x67 0x65 0x2C 0x20 // 'illage, ' 0x62 0x75 0x74 0x20 0x77 0x61 0x72 0x6E // 'but warn' 0x73 0x2C 0x20 0x22 0x54 0x68 0x65 0x72 // 's, "Ther' 0x65 0x20 0x69 0x73 0x20 0x67 0x72 0x65 // 'e is gre' 0x61 0x74 0x20 0x64 0x61 0x6E 0x67 0x65 // 'at dange' 0x72 0x20 0x69 0x6E 0x20 0x79 0x6F 0x75 // 'r in you' 0x72 0x20 0x6A 0x6F 0x75 0x72 0x6E 0x65 // 'r journe' 0x79 0x2E 0x20 0x20 0x59 0x6F 0x75 0x20 // 'y. You ' 0x6D 0x75 0x73 0x74 0x20 0x63 0x72 0x6F // 'must cro' 0x73 0x73 0x20 0x61 0x6E 0x20 0x6F 0x6C // 'ss an ol' 0x64 0x20 0x62 0x72 0x69 0x64 0x67 0x65 // 'd bridge' 0x2C 0x20 0x61 0x6E 0x64 0x20 0x66 0x69 // ', and fi' 0x67 0x68 0x74 0x20 0x61 0x20 0x62 0x69 // 'ght a bi' 0x67 0x20 0x6D 0x61 0x6E 0x2E 0x20 0x20 // 'g man. ' 0x49 0x66 0x20 0x79 0x6F 0x75 0x20 0x63 // 'If you c' 0x61 0x6E 0x20 0x6D 0x61 0x6B 0x65 0x20 // 'an make ' 0x74 0x68 0x65 0x20 0x6D 0x61 0x6E 0x20 // 'the man ' 0x66 0x61 0x6C 0x6C 0x20 0x6F 0x66 0x66 // 'fall off' 0x20 0x6F 0x66 0x20 0x74 0x68 0x65 0x20 // ' of the ' 0x62 0x72 0x69 0x64 0x67 0x65 0x2C 0x20 // 'bridge, ' 0x79 0x6F 0x75 0x20 0x6D 0x61 0x79 0x20 // 'you may ' 0x63 0x6F 0x6E 0x74 0x69 0x6E 0x75 0x65 // 'continue' 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 // ' to the ' 0x63 0x61 0x76 0x65 0x2E 0x20 0x20 0x49 // 'cave. I' 0x6E 0x20 0x74 0x68 0x65 0x20 0x63 0x61 // 'n the ca' 0x76 0x65 0x20 0x79 0x6F 0x75 0x20 0x6D // 've you m' 0x75 0x73 0x74 0x20 0x6C 0x61 0x75 0x67 // 'ust laug' 0x68 0x20 0x74 0x77 0x69 0x63 0x65 0x20 // 'h twice ' 0x61 0x74 0x20 0x74 0x68 0x65 0x20 0x73 // 'at the s' 0x6B 0x65 0x6C 0x65 0x74 0x6F 0x6E 0x2E // 'keleton.' 0x20 0x20 0x4F 0x6E 0x6C 0x79 0x20 0x74 // ' Only t' 0x68 0x65 0x6E 0x20 0x77 0x69 0x6C 0x6C // 'hen will' 0x20 0x79 0x6F 0x75 0x20 0x62 0x65 0x20 // ' you be ' 0x61 0x6C 0x6C 0x6F 0x77 0x65 0x64 0x20 // 'allowed ' 0x74 0x6F 0x20 0x74 0x61 0x6B 0x65 0x20 // 'to take ' 0x74 0x68 0x65 0x20 0x74 0x72 0x65 0x61 // 'the trea' 0x73 0x75 0x72 0x65 0x2E 0x22 0x20 0x0D // 'sure." ?' 0x0A 0x57 0x69 0x6C 0x6C 0x20 0x47 0x72 // '?Will Gr' 0x65 0x67 0x6F 0x72 0x79 0x20 0x68 0x65 // 'egory he' 0x65 0x64 0x20 0x74 0x68 0x69 0x73 0x20 // 'ed this ' 0x61 0x64 0x76 0x69 0x63 0x65 0x3F 0x20 // 'advice? ' 0x20 0x43 0x61 0x6E 0x20 0x68 0x65 0x20 // ' Can he ' 0x6D 0x61 0x6E 0x61 0x67 0x65 0x20 0x74 // 'manage t' 0x6F 0x20 0x62 0x72 0x69 0x6E 0x67 0x20 // 'o bring ' 0x74 0x68 0x65 0x20 0x74 0x72 0x65 0x61 // 'the trea' 0x73 0x75 0x72 0x65 0x20 0x63 0x68 0x65 // 'sure che' 0x73 0x74 0x20 0x73 0x61 0x66 0x65 0x6C // 'st safel' 0x79 0x20 0x62 0x61 0x63 0x6B 0x20 0x74 // 'y back t' 0x6F 0x20 0x74 0x68 0x65 0x20 0x76 0x69 // 'o the vi' 0x6C 0x6C 0x61 0x67 0x65 0x3F 0x20 0x20 // 'llage? ' 0x57 0x69 0x6C 0x6C 0x20 0x68 0x69 0x73 // 'Will his' 0x20 0x73 0x63 0x6F 0x75 0x74 0x20 0x6D // ' scout m' 0x6F 0x74 0x74 0x6F 0x20 0x22 0x42 0x65 // 'otto "Be' 0x20 0x70 0x72 0x65 0x70 0x61 0x72 0x65 // ' prepare' 0x64 0x22 0x20 0x62 0x65 0x20 0x65 0x6E // 'd" be en' 0x6F 0x75 0x67 0x68 0x3F // 'ough?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_6A= ktipbio65 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6A, __HELP_NAME("ktipbio65")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6A, __HELP_NAME("ktipbio65")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_6A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6A, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio65" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_6A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6A, 0x0) BYTE 0x01 0x00 0x03 0x03 0xCB 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_6A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x35 0x02 0x00 0x01 // '????5???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xF6 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_6A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6A, 0x0) BYTE 0x03 0x03 0x64 0x61 0x6E 0x63 0x69 0x6E // '??dancin' 0x67 0x0D 0x0A 0x41 0x73 0x20 0x61 0x20 // 'g??As a ' 0x63 0x68 0x69 0x6C 0x64 0x2C 0x20 0x47 // 'child, G' 0x75 0x73 0x74 0x61 0x76 0x65 0x20 0x6D // 'ustave m' 0x65 0x6D 0x6F 0x72 0x69 0x7A 0x65 0x64 // 'emorized' 0x20 0x61 0x6C 0x6C 0x20 0x74 0x68 0x65 // ' all the' 0x20 0x64 0x61 0x6E 0x63 0x65 0x73 0x20 // ' dances ' 0x69 0x6E 0x20 0x6F 0x6C 0x64 0x20 0x6D // 'in old m' 0x6F 0x76 0x69 0x65 0x73 0x2E 0x20 0x20 // 'ovies. ' 0x41 0x6E 0x64 0x20 0x61 0x73 0x20 0x68 // 'And as h' 0x65 0x20 0x67 0x6F 0x74 0x20 0x6F 0x6C // 'e got ol' 0x64 0x65 0x72 0x2C 0x20 0x68 0x65 0x20 // 'der, he ' 0x77 0x61 0x74 0x63 0x68 0x65 0x64 0x20 // 'watched ' 0x64 0x61 0x6E 0x63 0x65 0x72 0x73 0x20 // 'dancers ' 0x69 0x6E 0x20 0x41 0x6D 0x65 0x72 0x69 // 'in Ameri' 0x63 0x61 0x6E 0x20 0x6D 0x75 0x73 0x69 // 'can musi' 0x63 0x20 0x76 0x69 0x64 0x65 0x6F 0x73 // 'c videos' 0x2E 0x20 0x20 0x48 0x65 0x20 0x64 0x65 // '. He de' 0x66 0x69 0x6E 0x69 0x74 0x65 0x6C 0x79 // 'finitely' 0x20 0x6B 0x6E 0x65 0x77 0x20 0x74 0x68 // ' knew th' 0x65 0x20 0x6D 0x6F 0x76 0x65 0x73 0x2E // 'e moves.' 0x0D 0x0A 0x4F 0x6E 0x65 0x20 0x6D 0x6F // '??One mo' 0x72 0x6E 0x69 0x6E 0x67 0x2C 0x20 0x47 // 'rning, G' 0x75 0x73 0x74 0x61 0x76 0x65 0x2C 0x20 // 'ustave, ' 0x6E 0x6F 0x77 0x20 0x6A 0x6F 0x62 0x6C // 'now jobl' 0x65 0x73 0x73 0x2C 0x20 0x62 0x75 0x74 // 'ess, but' 0x20 0x77 0x65 0x61 0x72 0x69 0x6E 0x67 // ' wearing' 0x20 0x69 0x6E 0x20 0x68 0x69 0x73 0x20 // ' in his ' 0x64 0x61 0x6E 0x63 0x69 0x6E 0x67 0x20 // 'dancing ' 0x73 0x68 0x6F 0x65 0x73 0x2C 0x20 0x74 // 'shoes, t' 0x77 0x6F 0x2D 0x73 0x74 0x65 0x70 0x70 // 'wo-stepp' 0x65 0x64 0x20 0x74 0x68 0x72 0x6F 0x75 // 'ed throu' 0x67 0x68 0x20 0x74 0x68 0x65 0x20 0x73 // 'gh the s' 0x74 0x72 0x65 0x65 0x74 0x73 0x20 0x6F // 'treets o' 0x66 0x20 0x50 0x6F 0x72 0x74 0x6F 0x66 // 'f Portof' 0x69 0x6E 0x6F 0x20 0x61 0x6E 0x64 0x20 // 'ino and ' 0x64 0x69 0x72 0x65 0x63 0x74 0x6C 0x79 // 'directly' 0x20 0x6F 0x6E 0x74 0x6F 0x20 0x74 0x68 // ' onto th' 0x65 0x20 0x73 0x65 0x74 0x20 0x6F 0x66 // 'e set of' 0x20 0x61 0x20 0x6E 0x65 0x77 0x20 0x6D // ' a new m' 0x6F 0x76 0x69 0x65 0x97 0x72 0x69 0x67 // 'ovierig' 0x68 0x74 0x20 0x69 0x6E 0x20 0x74 0x68 // 'ht in th' 0x65 0x20 0x6D 0x69 0x64 0x64 0x6C 0x65 // 'e middle' 0x20 0x6F 0x66 0x20 0x61 0x20 0x6C 0x6F // ' of a lo' 0x76 0x65 0x20 0x73 0x63 0x65 0x6E 0x65 // 've scene' 0x2E 0x20 0x20 0x45 0x76 0x65 0x72 0x79 // '. Every' 0x6F 0x6E 0x65 0x20 0x79 0x65 0x6C 0x6C // 'one yell' 0x65 0x64 0x20 0x66 0x6F 0x72 0x20 0x68 // 'ed for h' 0x69 0x6D 0x20 0x74 0x6F 0x20 0x6D 0x6F // 'im to mo' 0x76 0x65 0x20 0x69 0x74 0x2E 0x20 0x20 // 've it. ' 0x45 0x76 0x65 0x72 0x79 0x6F 0x6E 0x65 // 'Everyone' 0x20 0x65 0x78 0x63 0x65 0x70 0x74 0x20 // ' except ' 0x4D 0x65 0x6C 0x61 0x6E 0x69 0x65 0x2C // 'Melanie,' 0x20 0x61 0x20 0x79 0x6F 0x75 0x6E 0x67 // ' a young' 0x20 0x64 0x69 0x72 0x65 0x63 0x74 0x6F // ' directo' 0x72 0x20 0x77 0x68 0x6F 0x20 0x74 0x68 // 'r who th' 0x6F 0x75 0x67 0x68 0x74 0x20 0x47 0x75 // 'ought Gu' 0x73 0x74 0x61 0x76 0x65 0x20 0x77 0x61 // 'stave wa' 0x73 0x20 0x74 0x68 0x65 0x20 0x68 0x69 // 's the hi' 0x70 0x70 0x65 0x73 0x74 0x20 0x64 0x61 // 'ppest da' 0x6E 0x63 0x65 0x72 0x20 0x73 0x68 0x65 // 'ncer she' 0x92 0x64 0x20 0x65 0x76 0x65 0x72 0x20 // 'd ever ' 0x73 0x65 0x65 0x6E 0x2E 0x20 0x0D 0x0A // 'seen. ??' 0x4F 0x6E 0x20 0x74 0x68 0x65 0x20 0x73 // 'On the s' 0x70 0x6F 0x74 0x2C 0x20 0x73 0x68 0x65 // 'pot, she' 0x20 0x73 0x69 0x67 0x6E 0x65 0x64 0x20 // ' signed ' 0x47 0x75 0x73 0x74 0x61 0x76 0x65 0x20 // 'Gustave ' 0x74 0x6F 0x20 0x73 0x74 0x61 0x72 0x20 // 'to star ' 0x69 0x6E 0x20 0x68 0x65 0x72 0x20 0x6E // 'in her n' 0x65 0x78 0x74 0x20 0x72 0x6F 0x63 0x6B // 'ext rock' 0x20 0x76 0x69 0x64 0x65 0x6F 0x2E // ' video.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_6B= ktipbio66 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6B, __HELP_NAME("ktipbio66")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6B, __HELP_NAME("ktipbio66")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6B, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio66" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6B, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xB2 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x38 0x01 0x00 0x82 // '????8??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D, 0x0) BYTE 0x03 0x03 0x42 0x75 0x74 0x6C 0x65 0x72 // '??Butler' 0x0D 0x0A 0x41 0x6E 0x20 0x69 0x64 0x65 // '??An ide' 0x61 0x6C 0x20 0x72 0x6F 0x6C 0x65 0x20 // 'al role ' 0x66 0x6F 0x72 0x20 0x47 0x75 0x73 0x74 // 'for Gust' 0x61 0x76 0x65 0x20 0x77 0x6F 0x75 0x6C // 'ave woul' 0x64 0x20 0x62 0x65 0x20 0x74 0x68 0x65 // 'd be the' 0x20 0x62 0x75 0x74 0x6C 0x65 0x72 0x20 // ' butler ' 0x61 0x74 0x20 0x61 0x20 0x68 0x61 0x75 // 'at a hau' 0x6E 0x74 0x65 0x64 0x20 0x68 0x6F 0x75 // 'nted hou' 0x73 0x65 0x2E 0x20 0x49 0x6E 0x20 0x74 // 'se. In t' 0x68 0x69 0x73 0x20 0x72 0x6F 0x6C 0x65 // 'his role' 0x2C 0x20 0x47 0x75 0x73 0x74 0x61 0x76 // ', Gustav' 0x65 0x20 0x69 0x73 0x20 0x6E 0x6F 0x74 // 'e is not' 0x20 0x72 0x65 0x61 0x6C 0x6C 0x79 0x20 // ' really ' 0x61 0x20 0x62 0x75 0x74 0x6C 0x65 0x72 // 'a butler' 0x2C 0x20 0x62 0x75 0x74 0x20 0x61 0x20 // ', but a ' 0x73 0x65 0x63 0x72 0x65 0x74 0x20 0x61 // 'secret a' 0x67 0x65 0x6E 0x74 0x20 0x69 0x6E 0x20 // 'gent in ' 0x61 0x20 0x62 0x75 0x74 0x6C 0x65 0x72 // 'a butler' 0x20 0x64 0x69 0x73 0x67 0x75 0x69 0x73 // ' disguis' 0x65 0x2E 0x20 0x20 0x54 0x68 0x65 0x20 // 'e. The ' 0x68 0x61 0x75 0x6E 0x74 0x65 0x64 0x20 // 'haunted ' 0x68 0x6F 0x75 0x73 0x65 0x20 0x69 0x73 // 'house is' 0x20 0x6F 0x77 0x6E 0x65 0x64 0x20 0x62 // ' owned b' 0x79 0x20 0x61 0x6E 0x20 0x65 0x76 0x69 // 'y an evi' 0x6C 0x20 0x6D 0x61 0x6E 0x20 0x77 0x68 // 'l man wh' 0x6F 0x20 0x64 0x6F 0x65 0x73 0x6E 0x92 // 'o doesn' 0x74 0x20 0x6C 0x69 0x6B 0x65 0x20 0x63 // 't like c' 0x68 0x69 0x6C 0x64 0x72 0x65 0x6E 0x2E // 'hildren.' 0x20 0x20 0x48 0x65 0x20 0x68 0x61 0x73 // ' He has' 0x20 0x61 0x20 0x74 0x65 0x72 0x72 0x69 // ' a terri' 0x62 0x6C 0x65 0x20 0x70 0x6C 0x6F 0x74 // 'ble plot' 0x20 0x74 0x6F 0x20 0x64 0x6F 0x20 0x61 // ' to do a' 0x77 0x61 0x79 0x20 0x77 0x69 0x74 0x68 // 'way with' 0x20 0x63 0x68 0x6F 0x63 0x6F 0x6C 0x61 // ' chocola' 0x74 0x65 0x20 0x61 0x6E 0x64 0x20 0x48 // 'te and H' 0x61 0x6C 0x6C 0x6F 0x77 0x65 0x65 0x6E // 'alloween' 0x20 0x63 0x61 0x6E 0x64 0x79 0x20 0x66 // ' candy f' 0x6F 0x72 0x65 0x76 0x65 0x72 0x2E 0x20 // 'orever. ' 0x0D 0x0A 0x47 0x75 0x73 0x74 0x61 0x76 // '??Gustav' 0x65 0x20 0x6D 0x75 0x73 0x74 0x20 0x73 // 'e must s' 0x74 0x6F 0x70 0x20 0x68 0x69 0x6D 0x2E // 'top him.' 0x20 0x20 0x42 0x75 0x74 0x20 0x68 0x6F // ' But ho' 0x77 0x3F 0x20 0x20 0x4F 0x72 0x20 0x77 // 'w? Or w' 0x69 0x6C 0x6C 0x20 0x74 0x68 0x65 0x20 // 'ill the ' 0x65 0x76 0x69 0x6C 0x20 0x6F 0x77 0x6E // 'evil own' 0x65 0x72 0x20 0x67 0x65 0x74 0x20 0x68 // 'er get h' 0x69 0x73 0x20 0x77 0x61 0x79 0x3F 0x20 // 'is way? ' 0x20 0x57 0x69 0x6C 0x6C 0x20 0x61 0x6E // ' Will an' 0x79 0x6F 0x6E 0x65 0x20 0x65 0x6C 0x73 // 'yone els' 0x65 0x20 0x69 0x6E 0x20 0x74 0x68 0x65 // 'e in the' 0x20 0x68 0x61 0x75 0x6E 0x74 0x65 0x64 // ' haunted' 0x20 0x68 0x6F 0x75 0x73 0x65 0x20 0x68 // ' house h' 0x65 0x6C 0x70 0x20 0x47 0x75 0x73 0x74 // 'elp Gust' 0x61 0x76 0x65 0x3F // 'ave?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_6C= ktipbio67 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6C, __HELP_NAME("ktipbio67")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6C, __HELP_NAME("ktipbio67")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_6C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6C, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio67" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_6C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6C, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_6C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xA9 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x0D 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_6C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6C, 0x0) BYTE 0x03 0x03 0x43 0x61 0x66 0x65 0x20 0x57 // '??Cafe W' 0x61 0x69 0x74 0x65 0x72 0x0D 0x0A 0x47 // 'aiter??G' 0x75 0x73 0x74 0x61 0x76 0x65 0x20 0x64 // 'ustave d' 0x72 0x65 0x61 0x6D 0x73 0x20 0x6F 0x66 // 'reams of' 0x20 0x73 0x6F 0x6C 0x76 0x69 0x6E 0x67 // ' solving' 0x20 0x63 0x72 0x69 0x6D 0x65 0x73 0x20 // ' crimes ' 0x77 0x68 0x69 0x6C 0x65 0x20 0x68 0x65 // 'while he' 0x20 0x70 0x72 0x65 0x74 0x65 0x6E 0x64 // ' pretend' 0x73 0x20 0x74 0x6F 0x20 0x62 0x65 0x20 // 's to be ' 0x61 0x20 0x73 0x69 0x6E 0x67 0x69 0x6E // 'a singin' 0x67 0x2F 0x64 0x61 0x6E 0x63 0x69 0x6E // 'g/dancin' 0x67 0x20 0x77 0x61 0x69 0x74 0x65 0x72 // 'g waiter' 0x20 0x69 0x6E 0x20 0x61 0x20 0x63 0x61 // ' in a ca' 0x66 0x65 0x2E 0x20 0x20 0x4D 0x61 0x79 // 'fe. May' 0x62 0x65 0x20 0x68 0x65 0x20 0x63 0x6F // 'be he co' 0x75 0x6C 0x64 0x20 0x66 0x69 0x6E 0x64 // 'uld find' 0x20 0x74 0x68 0x65 0x20 0x74 0x65 0x65 // ' the tee' 0x6E 0x61 0x67 0x65 0x72 0x20 0x77 0x68 // 'nager wh' 0x6F 0x20 0x64 0x69 0x73 0x61 0x70 0x70 // 'o disapp' 0x65 0x61 0x72 0x65 0x64 0x20 0x61 0x20 // 'eared a ' 0x66 0x65 0x77 0x20 0x77 0x65 0x65 0x6B // 'few week' 0x73 0x20 0x61 0x67 0x6F 0x20 0x66 0x72 // 's ago fr' 0x6F 0x6D 0x20 0x61 0x20 0x6E 0x65 0x61 // 'om a nea' 0x72 0x62 0x79 0x20 0x46 0x72 0x65 0x6E // 'rby Fren' 0x63 0x68 0x20 0x72 0x65 0x73 0x74 0x61 // 'ch resta' 0x75 0x72 0x61 0x6E 0x74 0x2E 0x20 0x20 // 'urant. ' 0x43 0x75 0x73 0x74 0x6F 0x6D 0x65 0x72 // 'Customer' 0x73 0x20 0x6B 0x65 0x65 0x70 0x20 0x68 // 's keep h' 0x65 0x61 0x72 0x69 0x6E 0x67 0x20 0x61 // 'earing a' 0x20 0x77 0x65 0x61 0x6B 0x20 0x63 0x72 // ' weak cr' 0x79 0x20 0x66 0x6F 0x72 0x20 0x68 0x65 // 'y for he' 0x6C 0x70 0x2E 0x20 0x20 0x57 0x68 0x61 // 'lp. Wha' 0x74 0x20 0x63 0x6F 0x75 0x6C 0x64 0x20 // 't could ' 0x68 0x61 0x76 0x65 0x20 0x68 0x61 0x70 // 'have hap' 0x70 0x65 0x6E 0x65 0x64 0x97 0x77 0x61 // 'penedwa' 0x73 0x20 0x74 0x68 0x65 0x20 0x62 0x6F // 's the bo' 0x79 0x20 0x63 0x61 0x70 0x74 0x75 0x72 // 'y captur' 0x65 0x64 0x20 0x61 0x6E 0x64 0x20 0x73 // 'ed and s' 0x68 0x72 0x75 0x6E 0x6B 0x3F 0x20 0x20 // 'hrunk? ' 0x57 0x69 0x6C 0x6C 0x20 0x47 0x75 0x73 // 'Will Gus' 0x74 0x61 0x76 0x65 0x20 0x6E 0x65 0x65 // 'tave nee' 0x64 0x20 0x68 0x65 0x6C 0x70 0x20 0x66 // 'd help f' 0x72 0x6F 0x6D 0x20 0x61 0x20 0x73 0x6E // 'rom a sn' 0x69 0x66 0x66 0x69 0x6E 0x67 0x20 0x64 // 'iffing d' 0x6F 0x67 0x20 0x77 0x68 0x6F 0x20 0x6C // 'og who l' 0x6F 0x76 0x65 0x73 0x20 0x46 0x72 0x65 // 'oves Fre' 0x6E 0x63 0x68 0x20 0x66 0x6F 0x6F 0x64 // 'nch food' 0x3F 0x20 0x20 0x41 0x6E 0x64 0x20 0x68 // '? And h' 0x6F 0x77 0x20 0x77 0x69 0x6C 0x6C 0x20 // 'ow will ' 0x68 0x65 0x20 0x73 0x6E 0x65 0x61 0x6B // 'he sneak' 0x20 0x61 0x20 0x64 0x6F 0x67 0x20 0x69 // ' a dog i' 0x6E 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 // 'nto the ' 0x72 0x65 0x73 0x74 0x61 0x75 0x72 0x61 // 'restaura' 0x6E 0x74 0x3F // 'nt?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_6D= ktipbio68 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6D, __HELP_NAME("ktipbio68")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6D, __HELP_NAME("ktipbio68")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_6D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6D, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio68" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_6D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6D, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_6D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xC2 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x0A 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_6D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6D, 0x0) BYTE 0x03 0x03 0x45 0x78 0x70 0x6C 0x6F 0x72 // '??Explor' 0x65 0x72 0x0D 0x0A 0x54 0x68 0x65 0x20 // 'er??The ' 0x6D 0x6F 0x73 0x74 0x20 0x66 0x75 0x6E // 'most fun' 0x2C 0x20 0x47 0x75 0x73 0x74 0x61 0x76 // ', Gustav' 0x65 0x20 0x74 0x68 0x69 0x6E 0x6B 0x73 // 'e thinks' 0x2C 0x20 0x77 0x6F 0x75 0x6C 0x64 0x20 // ', would ' 0x62 0x65 0x20 0x74 0x6F 0x20 0x70 0x6C // 'be to pl' 0x61 0x79 0x20 0x61 0x6E 0x20 0x65 0x78 // 'ay an ex' 0x70 0x6C 0x6F 0x72 0x65 0x72 0x2E 0x20 // 'plorer. ' 0x47 0x75 0x73 0x74 0x61 0x76 0x65 0x20 // 'Gustave ' 0x77 0x6F 0x75 0x6C 0x64 0x20 0x67 0x6F // 'would go' 0x20 0x73 0x6F 0x6D 0x65 0x77 0x68 0x65 // ' somewhe' 0x72 0x65 0x20 0x6D 0x79 0x73 0x74 0x65 // 're myste' 0x72 0x69 0x6F 0x75 0x73 0x2C 0x20 0x6C // 'rious, l' 0x69 0x6B 0x65 0x20 0x4D 0x65 0x78 0x69 // 'ike Mexi' 0x63 0x6F 0x20 0x43 0x69 0x74 0x79 0x2C // 'co City,' 0x20 0x74 0x6F 0x20 0x66 0x69 0x6E 0x64 // ' to find' 0x20 0x68 0x69 0x73 0x20 0x6C 0x6F 0x73 // ' his los' 0x74 0x20 0x66 0x72 0x69 0x65 0x6E 0x64 // 't friend' 0x2C 0x20 0x42 0x65 0x6E 0x65 0x64 0x69 // ', Benedi' 0x63 0x74 0x2E 0x20 0x20 0x42 0x65 0x6E // 'ct. Ben' 0x65 0x64 0x69 0x63 0x74 0x20 0x68 0x61 // 'edict ha' 0x73 0x20 0x62 0x65 0x65 0x6E 0x20 0x6D // 's been m' 0x69 0x73 0x73 0x69 0x6E 0x67 0x20 0x66 // 'issing f' 0x6F 0x72 0x20 0x32 0x20 0x6D 0x6F 0x6E // 'or 2 mon' 0x74 0x68 0x73 0x2C 0x20 0x61 0x62 0x64 // 'ths, abd' 0x75 0x63 0x74 0x65 0x64 0x20 0x62 0x79 // 'ucted by' 0x20 0x67 0x61 0x6E 0x67 0x73 0x74 0x65 // ' gangste' 0x72 0x73 0x2E 0x20 0x50 0x65 0x6F 0x70 // 'rs. Peop' 0x6C 0x65 0x20 0x69 0x6E 0x20 0x4D 0x65 // 'le in Me' 0x78 0x69 0x63 0x6F 0x20 0x43 0x69 0x74 // 'xico Cit' 0x79 0x20 0x73 0x61 0x79 0x20 0x74 0x68 // 'y say th' 0x61 0x74 0x20 0x74 0x68 0x65 0x20 0x41 // 'at the A' 0x6D 0x65 0x72 0x69 0x63 0x61 0x6E 0x20 // 'merican ' 0x69 0x73 0x20 0x62 0x65 0x69 0x6E 0x67 // 'is being' 0x20 0x68 0x65 0x6C 0x64 0x20 0x69 0x6E // ' held in' 0x20 0x61 0x6E 0x20 0x49 0x6E 0x64 0x69 // ' an Indi' 0x61 0x6E 0x20 0x68 0x75 0x74 0x20 0x67 // 'an hut g' 0x75 0x61 0x72 0x64 0x65 0x64 0x20 0x62 // 'uarded b' 0x79 0x20 0x61 0x6E 0x63 0x69 0x65 0x6E // 'y ancien' 0x74 0x20 0x74 0x75 0x73 0x6B 0x73 0x20 // 't tusks ' 0x74 0x68 0x61 0x74 0x20 0x68 0x61 0x76 // 'that hav' 0x65 0x20 0x74 0x68 0x65 0x20 0x70 0x6F // 'e the po' 0x77 0x65 0x72 0x20 0x74 0x6F 0x20 0x73 // 'wer to s' 0x71 0x75 0x61 0x73 0x68 0x20 0x69 0x6E // 'quash in' 0x74 0x72 0x75 0x64 0x65 0x72 0x73 0x2E // 'truders.' 0x20 0x20 0x48 0x6F 0x77 0x20 0x77 0x69 // ' How wi' 0x6C 0x6C 0x20 0x47 0x75 0x73 0x74 0x61 // 'll Gusta' 0x76 0x65 0x20 0x66 0x72 0x65 0x65 0x20 // 've free ' 0x68 0x69 0x73 0x20 0x66 0x72 0x69 0x65 // 'his frie' 0x6E 0x64 0x3F 0x20 0x20 0x57 0x69 0x6C // 'nd? Wil' 0x6C 0x20 0x68 0x69 0x73 0x20 0x65 0x79 // 'l his ey' 0x65 0x2D 0x70 0x61 0x74 0x63 0x68 0x20 // 'e-patch ' 0x70 0x72 0x6F 0x74 0x65 0x63 0x74 0x20 // 'protect ' 0x68 0x69 0x6D 0x20 0x66 0x72 0x6F 0x6D // 'him from' 0x20 0x74 0x68 0x65 0x20 0x74 0x75 0x73 // ' the tus' 0x6B 0x73 0x3F 0x20 // 'ks? ' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_6E= ktipbio69 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6E, __HELP_NAME("ktipbio69--CUT")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6E, __HELP_NAME("ktipbio69--CUT")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_D1=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6E, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio69" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_D1=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6E, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_D1=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D1, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x03 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x13 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_D1=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D1, 0x0) BYTE 0x03 0x03 0x43 0x75 0x74 0x2E 0x2E 0x2E // '??Cut...' 0x48 0x65 0x6E 0x72 0x79 0x2D 0x2D 0x70 // 'Henry--p' 0x6F 0x70 0x75 0x70 0x31 // 'opup1' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_6F= ktipbio70 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6F, __HELP_NAME("ktipbio70--CUT")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6F, __HELP_NAME("ktipbio70--CUT")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_6F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6F, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio70" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_6F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6F, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_6F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x03 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0D 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_6F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6F, 0x0) BYTE 0x03 0x03 0x48 0x65 0x6E 0x72 0x79 0x2D // '??Henry-' 0x2D 0x70 0x6F 0x70 0x75 0x70 0x32 // '-popup2' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_70= ktipbio71 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_70, __HELP_NAME("ktipbio7--CUT")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_70, __HELP_NAME("ktipbio7--CUT")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_70=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_70, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio71" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_70=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_70, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_70=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_70, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x03 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0D 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_70=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_70, 0x0) BYTE 0x03 0x03 0x48 0x65 0x6E 0x72 0x79 0x2D // '??Henry-' 0x2D 0x70 0x6F 0x70 0x75 0x70 0x33 // '-popup3' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_71= ktipbio72 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_71, __HELP_NAME("ktipbio72--CUT")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_71, __HELP_NAME("ktipbio72--CUT")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_71=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_71, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio72" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_71=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_71, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_71=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_71, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x03 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0D 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_71=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_71, 0x0) BYTE 0x03 0x03 0x48 0x65 0x6E 0x72 0x79 0x2D // '??Henry-' 0x2D 0x70 0x6F 0x70 0x75 0x70 0x34 // '-popup4' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_72= ktipbio73 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_72, __HELP_NAME("ktipbio73")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_72, __HELP_NAME("ktipbio73")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_72, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio73" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_72, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_3F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x5E 0x02 0x00 0x01 // '????^???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x64 0x01 0x00 0x82 // '????d??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3F, 0x0) BYTE 0x03 0x03 0x6A 0x6F 0x6B 0x65 0x73 0x0D // '??jokes?' 0x0A 0x48 0x69 0x72 0x6F 0x92 0x73 0x20 // '?Hiros ' 0x61 0x62 0x69 0x6C 0x69 0x74 0x79 0x20 // 'ability ' 0x74 0x6F 0x20 0x74 0x65 0x6C 0x6C 0x20 // 'to tell ' 0x6A 0x6F 0x6B 0x65 0x73 0x20 0x61 0x6E // 'jokes an' 0x64 0x20 0x77 0x72 0x69 0x74 0x65 0x20 // 'd write ' 0x66 0x75 0x6E 0x6E 0x79 0x20 0x70 0x6C // 'funny pl' 0x61 0x79 0x73 0x20 0x6D 0x61 0x64 0x65 // 'ays made' 0x20 0x68 0x69 0x6D 0x20 0x70 0x6F 0x70 // ' him pop' 0x75 0x6C 0x61 0x72 0x20 0x61 0x72 0x6F // 'ular aro' 0x75 0x6E 0x64 0x20 0x74 0x68 0x65 0x20 // 'und the ' 0x6E 0x65 0x69 0x67 0x68 0x62 0x6F 0x72 // 'neighbor' 0x68 0x6F 0x6F 0x64 0x2E 0x20 0x20 0x54 // 'hood. T' 0x68 0x65 0x72 0x65 0x20 0x77 0x65 0x72 // 'here wer' 0x65 0x20 0x61 0x20 0x6C 0x6F 0x74 0x20 // 'e a lot ' 0x6F 0x66 0x20 0x67 0x61 0x6E 0x67 0x73 // 'of gangs' 0x20 0x69 0x6E 0x20 0x68 0x69 0x73 0x20 // ' in his ' 0x61 0x72 0x65 0x61 0x2C 0x20 0x61 0x6E // 'area, an' 0x64 0x20 0x74 0x6F 0x20 0x6B 0x65 0x65 // 'd to kee' 0x70 0x20 0x74 0x68 0x65 0x20 0x70 0x65 // 'p the pe' 0x61 0x63 0x65 0x2C 0x20 0x68 0x65 0x20 // 'ace, he ' 0x77 0x6F 0x75 0x6C 0x64 0x20 0x63 0x61 // 'would ca' 0x73 0x74 0x20 0x74 0x68 0x65 0x20 0x67 // 'st the g' 0x61 0x6E 0x67 0x20 0x6D 0x65 0x6D 0x62 // 'ang memb' 0x65 0x72 0x73 0x20 0x69 0x6E 0x20 0x68 // 'ers in h' 0x69 0x73 0x20 0x70 0x6C 0x61 0x79 0x73 // 'is plays' 0x2E 0x20 0x20 0x54 0x68 0x65 0x73 0x65 // '. These' 0x20 0x70 0x6C 0x61 0x79 0x73 0x20 0x62 // ' plays b' 0x65 0x63 0x61 0x6D 0x65 0x20 0x73 0x6F // 'ecame so' 0x20 0x70 0x6F 0x70 0x75 0x6C 0x61 0x72 // ' popular' 0x20 0x74 0x68 0x61 0x74 0x20 0x70 0x65 // ' that pe' 0x6F 0x70 0x6C 0x65 0x20 0x66 0x72 0x6F // 'ople fro' 0x6D 0x20 0x61 0x6C 0x6C 0x20 0x6F 0x76 // 'm all ov' 0x65 0x72 0x20 0x4A 0x61 0x70 0x61 0x6E // 'er Japan' 0x20 0x73 0x74 0x61 0x72 0x74 0x65 0x64 // ' started' 0x20 0x73 0x68 0x6F 0x77 0x69 0x6E 0x67 // ' showing' 0x20 0x75 0x70 0x20 0x69 0x6E 0x20 0x74 // ' up in t' 0x68 0x65 0x20 0x70 0x6F 0x6F 0x72 0x20 // 'he poor ' 0x6E 0x65 0x69 0x67 0x68 0x62 0x6F 0x72 // 'neighbor' 0x68 0x6F 0x6F 0x64 0x20 0x6A 0x75 0x73 // 'hood jus' 0x74 0x20 0x74 0x6F 0x20 0x73 0x65 0x65 // 't to see' 0x20 0x48 0x69 0x72 0x6F 0x92 0x73 0x20 // ' Hiros ' 0x6D 0x61 0x73 0x74 0x65 0x72 0x66 0x75 // 'masterfu' 0x6C 0x20 0x63 0x6F 0x6D 0x65 0x64 0x69 // 'l comedi' 0x65 0x73 0x2E 0x20 0x0D 0x0A 0x4D 0x65 // 'es. ??Me' 0x6C 0x61 0x6E 0x69 0x65 0x20 0x77 0x61 // 'lanie wa' 0x73 0x20 0x76 0x69 0x73 0x69 0x74 0x69 // 's visiti' 0x6E 0x67 0x20 0x66 0x72 0x69 0x65 0x6E // 'ng frien' 0x64 0x73 0x20 0x69 0x6E 0x20 0x4A 0x61 // 'ds in Ja' 0x70 0x61 0x6E 0x20 0x77 0x68 0x65 0x6E // 'pan when' 0x20 0x73 0x68 0x65 0x20 0x68 0x65 0x61 // ' she hea' 0x72 0x64 0x20 0x6F 0x66 0x20 0x79 0x6F // 'rd of yo' 0x75 0x6E 0x67 0x20 0x48 0x69 0x72 0x6F // 'ung Hiro' 0x20 0x61 0x6E 0x64 0x20 0x68 0x69 0x73 // ' and his' 0x20 0x70 0x6C 0x61 0x79 0x73 0x2E 0x20 // ' plays. ' 0x20 0x57 0x68 0x65 0x6E 0x20 0x73 0x68 // ' When sh' 0x65 0x20 0x73 0x61 0x77 0x20 0x68 0x69 // 'e saw hi' 0x73 0x20 0x77 0x6F 0x72 0x6B 0x20 0x61 // 's work a' 0x6E 0x64 0x20 0x68 0x65 0x61 0x72 0x64 // 'nd heard' 0x20 0x74 0x68 0x65 0x20 0x65 0x6E 0x74 // ' the ent' 0x69 0x72 0x65 0x20 0x6E 0x65 0x69 0x67 // 'ire neig' 0x68 0x62 0x6F 0x72 0x68 0x6F 0x6F 0x64 // 'hborhood' 0x20 0x6C 0x61 0x75 0x67 0x68 0x69 0x6E // ' laughin' 0x67 0x2C 0x20 0x73 0x68 0x65 0x20 0x6B // 'g, she k' 0x6E 0x65 0x77 0x20 0x74 0x68 0x61 0x74 // 'new that' 0x20 0x48 0x69 0x72 0x6F 0x20 0x77 0x6F // ' Hiro wo' 0x75 0x6C 0x64 0x20 0x62 0x65 0x20 0x67 // 'uld be g' 0x72 0x65 0x61 0x74 0x20 0x74 0x6F 0x20 // 'reat to ' 0x77 0x6F 0x72 0x6B 0x20 0x77 0x69 0x74 // 'work wit' 0x68 0x20 0x6F 0x6E 0x20 0x61 0x20 0x6D // 'h on a m' 0x6F 0x76 0x69 0x65 0x2E 0x20 0x20 0x48 // 'ovie. H' 0x69 0x72 0x6F 0x20 0x77 0x61 0x73 0x20 // 'iro was ' 0x74 0x68 0x72 0x69 0x6C 0x6C 0x65 0x64 // 'thrilled' 0x20 0x61 0x6E 0x64 0x20 0x61 0x67 0x72 // ' and agr' 0x65 0x65 0x64 0x20 0x69 0x6D 0x6D 0x65 // 'eed imme' 0x64 0x69 0x61 0x74 0x65 0x6C 0x79 0x2E // 'diately.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_73= ktipbio74 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_73, __HELP_NAME("ktipbio74")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_73, __HELP_NAME("ktipbio74")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_AD=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_73, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio74" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_AD=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_73, 0x0) BYTE 0x01 0x00 0x03 0x03 0xCA 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_AD=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_AD, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x79 0x02 0x00 0x01 // '????y???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x92 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_AD=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_AD, 0x0) BYTE 0x03 0x03 0x46 0x6F 0x6F 0x64 0x20 0x54 // '??Food T' 0x65 0x73 0x74 0x65 0x72 0x0D 0x0A 0x48 // 'ester??H' 0x69 0x72 0x6F 0x20 0x6C 0x6F 0x76 0x65 // 'iro love' 0x73 0x20 0x74 0x6F 0x20 0x65 0x61 0x74 // 's to eat' 0x20 0x61 0x6E 0x64 0x20 0x74 0x68 0x69 // ' and thi' 0x6E 0x6B 0x73 0x20 0x69 0x74 0x20 0x77 // 'nks it w' 0x6F 0x75 0x6C 0x64 0x20 0x62 0x65 0x20 // 'ould be ' 0x63 0x6F 0x6F 0x6C 0x20 0x74 0x6F 0x20 // 'cool to ' 0x70 0x6C 0x61 0x79 0x20 0x61 0x20 0x66 // 'play a f' 0x6F 0x6F 0x64 0x20 0x74 0x65 0x73 0x74 // 'ood test' 0x65 0x72 0x20 0x66 0x6F 0x72 0x20 0x74 // 'er for t' 0x68 0x65 0x20 0x6F 0x77 0x6E 0x65 0x72 // 'he owner' 0x20 0x6F 0x66 0x20 0x61 0x20 0x68 0x61 // ' of a ha' 0x75 0x6E 0x74 0x65 0x64 0x20 0x68 0x6F // 'unted ho' 0x75 0x73 0x65 0x2E 0x20 0x20 0x54 0x68 // 'use. Th' 0x65 0x20 0x6F 0x6E 0x6C 0x79 0x20 0x70 // 'e only p' 0x72 0x6F 0x62 0x6C 0x65 0x6D 0x20 0x69 // 'roblem i' 0x73 0x20 0x74 0x68 0x61 0x74 0x20 0x48 // 's that H' 0x69 0x72 0x6F 0x20 0x69 0x73 0x20 0x74 // 'iro is t' 0x68 0x65 0x20 0x6E 0x65 0x77 0x65 0x73 // 'he newes' 0x74 0x20 0x6F 0x66 0x20 0x74 0x68 0x72 // 't of thr' 0x65 0x65 0x20 0x66 0x6F 0x6F 0x64 0x20 // 'ee food ' 0x74 0x65 0x73 0x74 0x65 0x72 0x73 0x20 // 'testers ' 0x77 0x68 0x6F 0x20 0x68 0x61 0x76 0x65 // 'who have' 0x20 0x62 0x65 0x65 0x6E 0x20 0x61 0x74 // ' been at' 0x20 0x74 0x68 0x65 0x20 0x68 0x6F 0x75 // ' the hou' 0x73 0x65 0x20 0x69 0x6E 0x20 0x74 0x68 // 'se in th' 0x65 0x20 0x6C 0x61 0x73 0x74 0x20 0x74 // 'e last t' 0x68 0x72 0x65 0x65 0x20 0x64 0x61 0x79 // 'hree day' 0x73 0x2E 0x20 0x20 0x4F 0x6E 0x65 0x20 // 's. One ' 0x6F 0x66 0x20 0x74 0x68 0x65 0x20 0x6F // 'of the o' 0x74 0x68 0x65 0x72 0x20 0x66 0x6F 0x6F // 'ther foo' 0x64 0x20 0x74 0x65 0x73 0x74 0x65 0x72 // 'd tester' 0x73 0x20 0x6C 0x65 0x66 0x74 0x20 0x61 // 's left a' 0x66 0x74 0x65 0x72 0x20 0x74 0x77 0x6F // 'fter two' 0x20 0x64 0x61 0x79 0x73 0x20 0x77 0x69 // ' days wi' 0x74 0x68 0x20 0x68 0x69 0x73 0x20 0x63 // 'th his c' 0x6F 0x6C 0x6C 0x61 0x72 0x20 0x70 0x75 // 'ollar pu' 0x6C 0x6C 0x65 0x64 0x20 0x75 0x70 0x20 // 'lled up ' 0x61 0x72 0x6F 0x75 0x6E 0x64 0x20 0x68 // 'around h' 0x69 0x73 0x20 0x6E 0x6F 0x73 0x65 0x2E // 'is nose.' 0x20 0x20 0x41 0x6E 0x6F 0x74 0x68 0x65 // ' Anothe' 0x72 0x20 0x74 0x65 0x73 0x74 0x65 0x72 // 'r tester' 0x20 0x6C 0x65 0x66 0x74 0x20 0x61 0x66 // ' left af' 0x74 0x65 0x72 0x20 0x6F 0x6E 0x6C 0x79 // 'ter only' 0x20 0x6F 0x6E 0x65 0x20 0x64 0x61 0x79 // ' one day' 0x2C 0x20 0x61 0x6E 0x64 0x20 0x68 0x65 // ', and he' 0x20 0x77 0x61 0x73 0x20 0x77 0x72 0x61 // ' was wra' 0x70 0x70 0x65 0x64 0x20 0x69 0x6E 0x20 // 'pped in ' 0x62 0x61 0x6E 0x64 0x61 0x67 0x65 0x73 // 'bandages' 0x2E 0x20 0x0D 0x0A 0x57 0x68 0x61 0x74 // '. ??What' 0x20 0x69 0x73 0x20 0x69 0x74 0x20 0x77 // ' is it w' 0x69 0x74 0x68 0x20 0x74 0x68 0x65 0x20 // 'ith the ' 0x63 0x6F 0x6F 0x6B 0x20 0x74 0x68 0x61 // 'cook tha' 0x74 0x27 0x73 0x20 0x63 0x61 0x75 0x73 // 't's caus' 0x69 0x6E 0x67 0x20 0x61 0x6C 0x6C 0x20 // 'ing all ' 0x6F 0x66 0x20 0x74 0x68 0x65 0x20 0x74 // 'of the t' 0x65 0x73 0x74 0x65 0x72 0x73 0x20 0x74 // 'esters t' 0x6F 0x20 0x73 0x61 0x79 0x20 0x22 0x53 // 'o say "S' 0x65 0x65 0x20 0x79 0x61 0x21 0x22 0x3F // 'ee ya!"?' 0x20 0x20 0x57 0x68 0x79 0x20 0x64 0x6F // ' Why do' 0x65 0x73 0x6E 0x92 0x74 0x20 0x56 0x65 // 'esnt Ve' 0x6E 0x69 0x65 0x2C 0x20 0x74 0x68 0x65 // 'nie, the' 0x20 0x6F 0x77 0x6E 0x65 0x72 0x20 0x6F // ' owner o' 0x66 0x20 0x74 0x68 0x65 0x20 0x68 0x6F // 'f the ho' 0x75 0x73 0x65 0x2C 0x20 0x74 0x72 0x75 // 'use, tru' 0x73 0x74 0x20 0x74 0x68 0x65 0x20 0x63 // 'st the c' 0x6F 0x6F 0x6B 0x20 0x6F 0x72 0x20 0x74 // 'ook or t' 0x68 0x65 0x20 0x73 0x6F 0x75 0x73 0x2D // 'he sous-' 0x63 0x68 0x65 0x66 0x3F 0x20 0x20 0x57 // 'chef? W' 0x69 0x6C 0x6C 0x20 0x48 0x69 0x72 0x6F // 'ill Hiro' 0x20 0x66 0x69 0x6E 0x64 0x20 0x6F 0x75 // ' find ou' 0x74 0x20 0x77 0x68 0x61 0x74 0x92 0x73 // 't whats' 0x20 0x73 0x70 0x6F 0x69 0x6C 0x69 0x6E // ' spoilin' 0x67 0x20 0x74 0x68 0x65 0x20 0x73 0x6F // 'g the so' 0x75 0x70 0x2C 0x20 0x6F 0x72 0x20 0x77 // 'up, or w' 0x69 0x6C 0x6C 0x20 0x48 0x69 0x72 0x6F // 'ill Hiro' 0x20 0x62 0x65 0x20 0x74 0x68 0x65 0x20 // ' be the ' 0x6E 0x65 0x78 0x74 0x20 0x74 0x6F 0x20 // 'next to ' 0x67 0x6F 0x3F // 'go?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_74= ktipbio75 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_74, __HELP_NAME("ktipbio75")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_74, __HELP_NAME("ktipbio75")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_74=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_74, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio75" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_74=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_74, 0x0) BYTE 0x01 0x00 0x03 0x03 0x0D 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_74=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_74, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x32 0x03 0x00 0x01 // '????2???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xDE 0x02 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_74=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_74, 0x0) BYTE 0x03 0x03 0x4D 0x65 0x6D 0x62 0x65 0x72 // '??Member' 0x20 0x6F 0x66 0x20 0x74 0x68 0x65 0x20 // ' of the ' 0x4B 0x69 0x64 0x73 0x27 0x20 0x4D 0x79 // 'Kids' My' 0x73 0x74 0x65 0x72 0x79 0x20 0x43 0x6C // 'stery Cl' 0x75 0x62 0x0D 0x0A 0x48 0x69 0x72 0x6F // 'ub??Hiro' 0x20 0x77 0x6F 0x75 0x6C 0x64 0x20 0x6C // ' would l' 0x69 0x6B 0x65 0x20 0x74 0x6F 0x20 0x70 // 'ike to p' 0x6C 0x61 0x79 0x20 0x61 0x20 0x6D 0x65 // 'lay a me' 0x6D 0x62 0x65 0x72 0x20 0x6F 0x66 0x20 // 'mber of ' 0x74 0x68 0x65 0x20 0x4B 0x69 0x64 0x73 // 'the Kids' 0x27 0x20 0x4D 0x79 0x73 0x74 0x65 0x72 // '' Myster' 0x79 0x20 0x43 0x6C 0x75 0x62 0x2C 0x20 // 'y Club, ' 0x61 0x20 0x67 0x72 0x6F 0x75 0x70 0x20 // 'a group ' 0x6F 0x66 0x20 0x79 0x6F 0x75 0x6E 0x67 // 'of young' 0x20 0x64 0x65 0x74 0x65 0x63 0x74 0x69 // ' detecti' 0x76 0x65 0x73 0x20 0x77 0x68 0x6F 0x20 // 'ves who ' 0x6C 0x69 0x6B 0x65 0x20 0x74 0x6F 0x20 // 'like to ' 0x73 0x6F 0x6C 0x76 0x65 0x20 0x6D 0x79 // 'solve my' 0x73 0x74 0x65 0x72 0x69 0x65 0x73 0x2E // 'steries.' 0x20 0x20 0x54 0x68 0x65 0x20 0x68 0x65 // ' The he' 0x69 0x72 0x20 0x74 0x6F 0x20 0x61 0x20 // 'ir to a ' 0x73 0x6F 0x66 0x74 0x20 0x64 0x72 0x69 // 'soft dri' 0x6E 0x6B 0x20 0x66 0x6F 0x72 0x74 0x75 // 'nk fortu' 0x6E 0x65 0x20 0x68 0x61 0x73 0x20 0x62 // 'ne has b' 0x65 0x65 0x6E 0x20 0x6B 0x69 0x64 0x6E // 'een kidn' 0x61 0x70 0x70 0x65 0x64 0x20 0x61 0x6E // 'apped an' 0x64 0x20 0x74 0x68 0x65 0x20 0x4B 0x69 // 'd the Ki' 0x64 0x73 0x20 0x4D 0x79 0x73 0x74 0x65 // 'ds Myste' 0x72 0x79 0x20 0x43 0x6C 0x75 0x62 0x20 // 'ry Club ' 0x69 0x73 0x20 0x6F 0x75 0x74 0x20 0x74 // 'is out t' 0x6F 0x20 0x66 0x69 0x6E 0x64 0x20 0x68 // 'o find h' 0x69 0x6D 0x2E 0x20 0x20 0x53 0x69 0x6E // 'im. Sin' 0x63 0x65 0x20 0x74 0x68 0x65 0x20 0x73 // 'ce the s' 0x6F 0x64 0x61 0x20 0x6B 0x69 0x6E 0x67 // 'oda king' 0x20 0x77 0x61 0x73 0x20 0x6C 0x61 0x73 // ' was las' 0x74 0x20 0x73 0x70 0x6F 0x74 0x74 0x65 // 't spotte' 0x64 0x20 0x61 0x74 0x20 0x74 0x68 0x65 // 'd at the' 0x20 0x70 0x61 0x72 0x6B 0x20 0x6E 0x65 // ' park ne' 0x61 0x72 0x20 0x74 0x68 0x65 0x20 0x77 // 'ar the w' 0x61 0x74 0x65 0x72 0x66 0x72 0x6F 0x6E // 'aterfron' 0x74 0x2C 0x20 0x48 0x69 0x72 0x6F 0x20 // 't, Hiro ' 0x61 0x6E 0x64 0x20 0x68 0x69 0x73 0x20 // 'and his ' 0x66 0x72 0x69 0x65 0x6E 0x64 0x73 0x20 // 'friends ' 0x62 0x65 0x67 0x69 0x6E 0x20 0x61 0x73 // 'begin as' 0x6B 0x69 0x6E 0x67 0x20 0x71 0x75 0x65 // 'king que' 0x73 0x74 0x69 0x6F 0x6E 0x73 0x20 0x69 // 'stions i' 0x6E 0x20 0x74 0x68 0x61 0x74 0x20 0x61 // 'n that a' 0x72 0x65 0x61 0x2E 0x20 0x0D 0x0A 0x55 // 'rea. ??U' 0x6E 0x66 0x6F 0x72 0x74 0x75 0x6E 0x61 // 'nfortuna' 0x74 0x65 0x6C 0x79 0x2C 0x20 0x6E 0x6F // 'tely, no' 0x20 0x6F 0x6E 0x65 0x20 0x73 0x65 0x65 // ' one see' 0x6D 0x73 0x20 0x74 0x6F 0x20 0x6B 0x6E // 'ms to kn' 0x6F 0x77 0x20 0x61 0x6E 0x79 0x74 0x68 // 'ow anyth' 0x69 0x6E 0x67 0x20 0x61 0x62 0x6F 0x75 // 'ing abou' 0x74 0x20 0x74 0x68 0x65 0x20 0x6B 0x69 // 't the ki' 0x64 0x6E 0x61 0x70 0x70 0x69 0x6E 0x67 // 'dnapping' 0x2E 0x20 0x20 0x54 0x68 0x65 0x20 0x43 // '. The C' 0x6C 0x75 0x62 0x20 0x6D 0x65 0x6D 0x62 // 'lub memb' 0x65 0x72 0x73 0x20 0x73 0x70 0x65 0x6E // 'ers spen' 0x64 0x20 0x68 0x6F 0x75 0x72 0x73 0x20 // 'd hours ' 0x61 0x73 0x6B 0x69 0x6E 0x67 0x20 0x71 // 'asking q' 0x75 0x65 0x73 0x74 0x69 0x6F 0x6E 0x73 // 'uestions' 0x20 0x61 0x6E 0x64 0x20 0x6C 0x6F 0x6F // ' and loo' 0x6B 0x69 0x6E 0x67 0x20 0x66 0x6F 0x72 // 'king for' 0x20 0x63 0x6C 0x75 0x65 0x73 0x2C 0x20 // ' clues, ' 0x62 0x75 0x74 0x20 0x66 0x69 0x6E 0x64 // 'but find' 0x20 0x6E 0x6F 0x74 0x68 0x69 0x6E 0x67 // ' nothing' 0x2E 0x20 0x4A 0x75 0x73 0x74 0x20 0x61 // '. Just a' 0x73 0x20 0x74 0x68 0x65 0x79 0x20 0x61 // 's they a' 0x72 0x65 0x20 0x62 0x65 0x63 0x6F 0x6D // 're becom' 0x69 0x6E 0x67 0x20 0x64 0x69 0x73 0x63 // 'ing disc' 0x6F 0x75 0x72 0x61 0x67 0x65 0x64 0x2C // 'ouraged,' 0x20 0x74 0x68 0x65 0x79 0x20 0x68 0x65 // ' they he' 0x61 0x72 0x20 0x61 0x20 0x73 0x6D 0x61 // 'ar a sma' 0x6C 0x6C 0x20 0x76 0x6F 0x69 0x63 0x65 // 'll voice' 0x20 0x63 0x61 0x6C 0x6C 0x20 0x6F 0x75 // ' call ou' 0x74 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 // 't to the' 0x6D 0x2E 0x20 0x20 0x54 0x68 0x65 0x79 // 'm. They' 0x20 0x6C 0x6F 0x6F 0x6B 0x20 0x64 0x6F // ' look do' 0x77 0x6E 0x20 0x74 0x6F 0x77 0x61 0x72 // 'wn towar' 0x64 0x20 0x74 0x68 0x65 0x69 0x72 0x20 // 'd their ' 0x66 0x65 0x65 0x74 0x20 0x61 0x6E 0x64 // 'feet and' 0x20 0x66 0x69 0x6E 0x64 0x2C 0x20 0x6D // ' find, m' 0x75 0x63 0x68 0x20 0x74 0x6F 0x20 0x74 // 'uch to t' 0x68 0x65 0x69 0x72 0x20 0x61 0x73 0x74 // 'heir ast' 0x6F 0x6E 0x69 0x73 0x68 0x6D 0x65 0x6E // 'onishmen' 0x74 0x2C 0x20 0x61 0x20 0x6D 0x69 0x6E // 't, a min' 0x69 0x61 0x74 0x75 0x72 0x65 0x20 0x77 // 'iature w' 0x6F 0x6D 0x61 0x6E 0x2C 0x20 0x6F 0x6E // 'oman, on' 0x6C 0x79 0x20 0x61 0x20 0x66 0x65 0x77 // 'ly a few' 0x20 0x69 0x6E 0x63 0x68 0x65 0x73 0x20 // ' inches ' 0x74 0x61 0x6C 0x6C 0x21 0x20 0x0D 0x0A // 'tall! ??' 0x57 0x68 0x6F 0x20 0x69 0x73 0x20 0x74 // 'Who is t' 0x68 0x69 0x73 0x20 0x77 0x6F 0x6D 0x61 // 'his woma' 0x6E 0x2C 0x20 0x61 0x6E 0x64 0x20 0x69 // 'n, and i' 0x73 0x20 0x73 0x68 0x65 0x20 0x63 0x6F // 's she co' 0x6E 0x6E 0x65 0x63 0x74 0x65 0x64 0x20 // 'nnected ' 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 0x64 // 'to the d' 0x69 0x73 0x61 0x70 0x70 0x65 0x61 0x72 // 'isappear' 0x61 0x6E 0x63 0x65 0x20 0x6F 0x66 0x20 // 'ance of ' 0x74 0x68 0x65 0x20 0x73 0x6F 0x66 0x74 // 'the soft' 0x20 0x64 0x72 0x69 0x6E 0x6B 0x20 0x68 // ' drink h' 0x65 0x69 0x72 0x3F // 'eir?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_75= ktipbio76 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_75, __HELP_NAME("ktipbio76")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_75, __HELP_NAME("ktipbio76")) __HELP_PACK2 BO OSK LONG kgobPopTip kgobPopTip 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_7C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_75, 0x0) GST(0) ITEM "kgobPopTip" ITEM "ktipbio76" ITEM "kgobPopTip" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_7C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_75, 0x0) BYTE 0x01 0x00 0x03 0x03 0x33 0x01 0x00 0x00 // '????3???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_7C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x8A 0x03 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x3C 0x03 0x00 0x82 // '???????' 0x01 0x00 0x00 0x00 0xB9 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x21 0x00 0x00 0x03 // '???!???' 0x00 0x00 0x00 0x00 0x25 0x00 0x00 0x03 // '????%???' 0x0F 0x00 0x00 0xFD 0x2B 0x00 0x00 0x03 // '???+???' 0x00 0x00 0x00 0x00 0x5C 0x00 0x00 0x03 // '????\???' 0x0A 0x00 0x00 0xFD 0x92 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0xBC 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x0E 0x01 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x52 0x01 0x00 0x03 // '????R???' 0x0A 0x00 0x00 0xFD 0x7A 0x01 0x00 0x03 // '???z???' 0x00 0x00 0x00 0x00 0xB9 0x01 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x23 0x00 0x00 0x80 // '????#??' 0x00 0x00 0x02 0x00 0x5C 0x00 0x00 0x80 // '????\??' 0x00 0x00 0x00 0x00 0x92 0x00 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0xBC 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0x0E 0x01 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x52 0x01 0x00 0x80 // '????R??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x23 0x00 0x00 0x82 // '????#??' 0x0A 0x00 0x00 0x00 0x5C 0x00 0x00 0x82 // '????\??' 0x05 0x00 0x00 0x00 0x92 0x00 0x00 0x82 // '??????' 0x0A 0x00 0x00 0x00 0xBC 0x00 0x00 0x82 // '??????' 0x05 0x00 0x00 0x00 0x0E 0x01 0x00 0x82 // '???????' 0x0A 0x00 0x00 0x00 0x52 0x01 0x00 0x82 // '????R??' 0x05 0x00 0x00 0x00 0x36 0x00 0x00 0xC0 // '????6??' 0x03 0x00 0x00 0x00 0x4D 0x00 0x00 0xC0 // '????M??' 0x02 0x00 0x00 0x00 0xAD 0x00 0x00 0xC0 // '??????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_7=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x72 0x65 0x70 // '??To rep' 0x6F 0x73 0x69 0x74 0x69 0x6F 0x6E 0x20 // 'osition ' 0x61 0x6E 0x20 0x61 0x63 0x74 0x6F 0x72 // 'an actor' 0x20 0x75 0x70 0x20 0x6F 0x72 0x20 0x64 // ' up or d' 0x6F 0x77 0x6E 0x0D 0x0A 0x95 0x09 0x43 // 'own???C' 0x6C 0x69 0x63 0x6B 0x20 0x52 0x65 0x70 // 'lick Rep' 0x6F 0x73 0x69 0x74 0x69 0x6F 0x6E 0x2D // 'osition-' 0x01 0x2C 0x20 0x74 0x75 0x72 0x6E 0x20 // '?, turn ' 0x22 0x6F 0x6E 0x22 0x20 0x55 0x70 0x20 // '"on" Up ' 0x26 0x20 0x44 0x6F 0x77 0x6E 0x2D 0x01 // '& Down-?' 0x2C 0x20 0x74 0x68 0x65 0x6E 0x20 0x64 // ', then d' 0x72 0x61 0x67 0x2E 0x0D 0x0A 0x54 0x6F // 'rag.??To' 0x09 0x72 0x65 0x70 0x6C 0x61 0x63 0x65 // '?replace' 0x20 0x74 0x68 0x65 0x20 0x65 0x6E 0x74 // ' the ent' 0x69 0x72 0x65 0x20 0x70 0x61 0x74 0x68 // 'ire path' 0x20 0x66 0x72 0x6F 0x6D 0x20 0x74 0x68 // ' from th' 0x65 0x20 0x63 0x75 0x72 0x72 0x65 0x6E // 'e curren' 0x74 0x20 0x66 0x72 0x61 0x6D 0x65 0x20 // 't frame ' 0x6F 0x6E 0x0D 0x0A 0x95 0x09 0x43 0x6C // 'on???Cl' 0x69 0x63 0x6B 0x20 0x52 0x65 0x73 0x75 // 'ick Resu' 0x6D 0x65 0x20 0x4C 0x61 0x73 0x74 0x20 // 'me Last ' 0x41 0x63 0x74 0x69 0x6F 0x6E 0x2D 0x01 // 'Action-?' 0x2C 0x20 0x74 0x68 0x65 0x6E 0x20 0x64 // ', then d' 0x72 0x61 0x67 0x2E 0x0D 0x0A 0x54 0x6F // 'rag.??To' 0x09 0x72 0x65 0x70 0x6C 0x61 0x63 0x65 // '?replace' 0x20 0x70 0x61 0x72 0x74 0x20 0x6F 0x66 // ' part of' 0x20 0x61 0x20 0x70 0x61 0x74 0x68 0x97 // ' a path' 0x74 0x68 0x65 0x20 0x6E 0x65 0x77 0x20 // 'the new ' 0x70 0x61 0x74 0x68 0x20 0x72 0x65 0x6A // 'path rej' 0x6F 0x69 0x6E 0x73 0x20 0x74 0x68 0x65 // 'oins the' 0x20 0x6F 0x6C 0x64 0x20 0x70 0x61 0x74 // ' old pat' 0x68 0x20 0x61 0x74 0x20 0x74 0x68 0x65 // 'h at the' 0x20 0x63 0x6C 0x6F 0x73 0x65 0x73 0x74 // ' closest' 0x20 0x70 0x6F 0x69 0x6E 0x74 0x0D 0x0A // ' point??' 0x95 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 // '?Click ' 0x52 0x65 0x73 0x75 0x6D 0x65 0x20 0x4C // 'Resume L' 0x61 0x73 0x74 0x20 0x41 0x63 0x74 0x69 // 'ast Acti' 0x6F 0x6E 0x2C 0x20 0x74 0x68 0x65 0x6E // 'on, then' 0x20 0x68 0x6F 0x6C 0x64 0x20 0x64 0x6F // ' hold do' 0x77 0x6E 0x20 0x43 0x74 0x72 0x6C 0x2B // 'wn Ctrl+' 0x53 0x68 0x69 0x66 0x74 0x20 0x61 0x73 // 'Shift as' 0x20 0x79 0x6F 0x75 0x20 0x64 0x72 0x61 // ' you dra' 0x67 0x2E 0x0D 0x0A 0x54 0x6F 0x09 0x66 // 'g.??To?f' 0x72 0x65 0x65 0x7A 0x65 0x20 0x61 0x6E // 'reeze an' 0x20 0x61 0x63 0x74 0x69 0x6F 0x6E 0x20 // ' action ' 0x61 0x73 0x20 0x79 0x6F 0x75 0x20 0x63 // 'as you c' 0x72 0x65 0x61 0x74 0x65 0x20 0x61 0x20 // 'reate a ' 0x70 0x61 0x74 0x68 0x0D 0x0A 0x95 0x09 // 'path???' 0x43 0x6C 0x69 0x63 0x6B 0x20 0x52 0x65 // 'Click Re' 0x73 0x75 0x6D 0x65 0x20 0x4C 0x61 0x73 // 'sume Las' 0x74 0x20 0x41 0x63 0x74 0x69 0x6F 0x6E // 't Action' 0x2C 0x20 0x74 0x68 0x65 0x6E 0x20 0x68 // ', then h' 0x6F 0x6C 0x64 0x20 0x64 0x6F 0x77 0x6E // 'old down' 0x20 0x53 0x68 0x69 0x66 0x74 0x20 0x61 // ' Shift a' 0x73 0x20 0x79 0x6F 0x75 0x20 0x64 0x72 // 's you dr' 0x61 0x67 0x2E // 'ag.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_8= ktpcBook10Tips5 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8, __HELP_NAME("(L) Tips Pg 5")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8, __HELP_NAME("(L) Tips Pg 5")) __HELP_PACK2 BO OSK LONG kgobHelpBookPageLeft kgobHelpBookPageLeft 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_0=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8, 0x0) GST(0) ITEM "kgobHelpBookPageLeft" ITEM "ktpcBook10Tips5" ITEM "kgobHelpBookPageLeft" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_0=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA8 0x01 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_A=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpActorsContinue __HELP_SYMBOL( STN "mbmpActorsContinue" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_0=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x22 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '"???????' 0x01 0x00 0x00 0x00 0x42 0x00 0x00 0x01 // '????B???' 0x01 0xF6 0x00 0x00 0x5D 0x00 0x00 0x01 // '???]???' 0x01 0x00 0x00 0x00 0x5E 0x00 0x00 0x01 // '????^???' 0x01 0xF6 0x00 0x00 0x81 0x00 0x00 0x01 // '??????' 0x01 0xF6 0x00 0x00 0x94 0x00 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0xBC 0x00 0x00 0x01 // '???????' 0x05 0x00 0x00 0x00 0xBE 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0x26 0x01 0x00 0x01 // '????&???' 0x01 0x00 0x00 0x00 0x3D 0x01 0x00 0x01 // '????=???' 0x01 0x00 0x00 0x00 0xB9 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x40 0x00 0x00 0x03 // '???@???' 0x00 0x00 0x00 0x00 0x42 0x00 0x00 0x03 // '????B???' 0x0F 0x00 0x00 0xFD 0x44 0x00 0x00 0x03 // '???D???' 0x00 0x00 0x00 0x00 0x5E 0x00 0x00 0x03 // '????^???' 0x0F 0x00 0x00 0xFD 0x70 0x00 0x00 0x03 // '???p???' 0x00 0x00 0x00 0x00 0x96 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xBC 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x71 0x01 0x00 0x03 // '????q???' 0x0A 0x00 0x00 0xFD 0xAC 0x01 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0xB9 0x01 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x42 0x00 0x00 0x80 // '????B??' 0x00 0x00 0x02 0x00 0x96 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0xBE 0x00 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0x71 0x01 0x00 0x80 // '????q??' 0x00 0x00 0x00 0x00 0xAE 0x01 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x42 0x00 0x00 0x82 // '????B??' 0x00 0x00 0x00 0x00 0x96 0x00 0x00 0x82 // '??????' 0x05 0x00 0x00 0x00 0xBE 0x00 0x00 0x82 // '??????' 0x0A 0x00 0x00 0x00 0x71 0x01 0x00 0x82 // '????q??' 0x05 0x00 0x00 0x00 0xAE 0x01 0x00 0x82 // '??????' 0x0A 0x00 0x00 0x00 0x5D 0x00 0x00 0xC0 // '????]??' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_0=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x6D 0x6F 0x76 // '??To mov' 0x65 0x20 0x61 0x6E 0x20 0x61 0x63 0x74 // 'e an act' 0x6F 0x72 0x20 0x6E 0x65 0x61 0x72 0x20 // 'or near ' 0x6F 0x72 0x20 0x66 0x61 0x72 0x20 0x61 // 'or far a' 0x6E 0x64 0x20 0x75 0x70 0x20 0x6F 0x72 // 'nd up or' 0x20 0x64 0x6F 0x77 0x6E 0x20 0x61 0x73 // ' down as' 0x20 0x79 0x6F 0x75 0x20 0x63 0x72 0x65 // ' you cre' 0x61 0x74 0x65 0x20 0x61 0x20 0x70 0x61 // 'ate a pa' 0x74 0x68 0x0D 0x0A 0x95 0x09 0x43 0x6C // 'th???Cl' 0x69 0x63 0x6B 0x20 0x52 0x65 0x73 0x75 // 'ick Resu' 0x6D 0x65 0x20 0x4C 0x61 0x73 0x74 0x20 // 'me Last ' 0x41 0x63 0x74 0x69 0x6F 0x6E 0x2D 0x01 // 'Action-?' 0x2C 0x20 0x74 0x68 0x65 0x6E 0x20 0x68 // ', then h' 0x6F 0x6C 0x64 0x20 0x64 0x6F 0x77 0x6E // 'old down' 0x20 0x74 0x68 0x65 0x20 0x55 0x70 0x20 // ' the Up ' 0x6F 0x72 0x20 0x44 0x6F 0x77 0x6E 0x20 // 'or Down ' 0x41 0x72 0x72 0x6F 0x77 0x20 0x6B 0x65 // 'Arrow ke' 0x79 0x20 0x61 0x73 0x20 0x79 0x6F 0x75 // 'y as you' 0x20 0x64 0x72 0x61 0x67 0x2E 0x0D 0x0A // ' drag.??' 0x54 0x6F 0x09 0x63 0x68 0x61 0x6E 0x67 // 'To?chang' 0x65 0x20 0x74 0x68 0x65 0x20 0x61 0x63 // 'e the ac' 0x74 0x69 0x6F 0x6E 0x20 0x73 0x74 0x61 // 'tion sta' 0x72 0x74 0x69 0x6E 0x67 0x20 0x70 0x6F // 'rting po' 0x73 0x69 0x74 0x69 0x6F 0x6E 0x0D 0x0A // 'sition??' 0x95 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 // '?Click ' 0x52 0x65 0x73 0x75 0x6D 0x65 0x20 0x4C // 'Resume L' 0x61 0x73 0x74 0x20 0x41 0x63 0x74 0x69 // 'ast Acti' 0x6F 0x6E 0x2C 0x20 0x74 0x68 0x65 0x6E // 'on, then' 0x20 0x6D 0x6F 0x76 0x65 0x20 0x74 0x68 // ' move th' 0x65 0x20 0x6D 0x6F 0x75 0x73 0x65 0x20 // 'e mouse ' 0x63 0x75 0x72 0x73 0x6F 0x72 0x20 0x6F // 'cursor o' 0x76 0x65 0x72 0x20 0x74 0x68 0x65 0x20 // 'ver the ' 0x61 0x63 0x74 0x6F 0x72 0x20 0x77 0x68 // 'actor wh' 0x6F 0x73 0x65 0x20 0x61 0x63 0x74 0x69 // 'ose acti' 0x6F 0x6E 0x20 0x79 0x6F 0x75 0x20 0x77 // 'on you w' 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 0x63 // 'ant to c' 0x68 0x61 0x6E 0x67 0x65 0x2E 0x20 0x20 // 'hange. ' 0x48 0x6F 0x6C 0x64 0x20 0x64 0x6F 0x77 // 'Hold dow' 0x6E 0x20 0x43 0x74 0x72 0x6C 0x20 0x61 // 'n Ctrl a' 0x6E 0x64 0x20 0x74 0x68 0x65 0x20 0x6D // 'nd the m' 0x6F 0x75 0x73 0x65 0x20 0x62 0x75 0x74 // 'ouse but' 0x74 0x6F 0x6E 0x20 0x75 0x6E 0x74 0x69 // 'ton unti' 0x6C 0x20 0x79 0x6F 0x75 0x20 0x66 0x69 // 'l you fi' 0x6E 0x64 0x20 0x74 0x68 0x65 0x20 0x70 // 'nd the p' 0x6F 0x73 0x69 0x74 0x69 0x6F 0x6E 0x20 // 'osition ' 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 // 'you want' 0x2E 0x0D 0x0A 0x54 0x6F 0x20 0x63 0x68 // '.??To ch' 0x61 0x6E 0x67 0x65 0x20 0x62 0x61 0x63 // 'ange bac' 0x6B 0x20 0x61 0x6E 0x64 0x20 0x66 0x6F // 'k and fo' 0x72 0x74 0x68 0x20 0x62 0x65 0x74 0x77 // 'rth betw' 0x65 0x65 0x6E 0x20 0x6E 0x65 0x61 0x72 // 'een near' 0x20 0x6F 0x72 0x20 0x66 0x61 0x72 0x20 // ' or far ' 0x61 0x6E 0x64 0x20 0x75 0x70 0x20 0x6F // 'and up o' 0x72 0x20 0x64 0x6F 0x77 0x6E 0x0D 0x0A // 'r down??' 0x95 0x09 0x50 0x72 0x65 0x73 0x73 0x20 // '?Press ' 0x46 0x39 0x2E // 'F9.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_A= ktpcBook10Tips6 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_A, __HELP_NAME("(L) Tips Pg 6")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_A, __HELP_NAME("(L) Tips Pg 6")) __HELP_PACK2 BO OSK LONG kgobHelpBookPageLeft kgobHelpBookPageLeft 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_A, 0x0) GST(0) ITEM "kgobHelpBookPageLeft" ITEM "ktpcBook10Tips6" ITEM "kgobHelpBookPageLeft" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_A, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA8 0x01 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_8=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpRewind __HELP_SYMBOL( STN "mbmpRewind" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpForward __HELP_SYMBOL( STN "mbmpForward" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSettingsCameras __HELP_SYMBOL( STN "mbmpSettingsCameras" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSceneSorter __HELP_SYMBOL( STN "mbmpSceneSorter" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x22 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '"???????' 0x01 0x00 0x00 0x00 0x32 0x00 0x00 0x01 // '????2???' 0x01 0xFD 0x00 0x00 0x5D 0x00 0x00 0x01 // '???]???' 0x01 0x00 0x00 0x00 0x5F 0x00 0x00 0x01 // '????_???' 0x01 0xFD 0x00 0x00 0x67 0x00 0x00 0x01 // '???g???' 0x01 0x00 0x00 0x00 0x68 0x00 0x00 0x01 // '????h???' 0x01 0xFD 0x00 0x00 0x84 0x00 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0xDA 0x00 0x00 0x01 // '???????' 0x01 0xF6 0x00 0x00 0x03 0x01 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0x41 0x01 0x00 0x01 // '????A???' 0x01 0xF6 0x00 0x00 0x5C 0x01 0x00 0x01 // '???\???' 0x01 0xF6 0x00 0x00 0x83 0x01 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0x84 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x30 0x00 0x00 0x03 // '???0???' 0x00 0x00 0x00 0x00 0x86 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xD8 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x06 0x01 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x3F 0x01 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x32 0x00 0x00 0x80 // '????2??' 0x00 0x00 0x02 0x00 0x86 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0xDA 0x00 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0x06 0x01 0x00 0x80 // '???????' 0x00 0x00 0x00 0x00 0x41 0x01 0x00 0x80 // '????A??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x32 0x00 0x00 0x82 // '????2??' 0x0A 0x00 0x00 0x00 0x86 0x00 0x00 0x82 // '??????' 0x05 0x00 0x00 0x00 0xDA 0x00 0x00 0x82 // '??????' 0x0A 0x00 0x00 0x00 0x06 0x01 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x41 0x01 0x00 0x82 // '????A??' 0x00 0x00 0x00 0x00 0x5D 0x00 0x00 0xC0 // '????]??' 0x01 0x00 0x00 0x00 0x67 0x00 0x00 0xC0 // '????g??' 0x02 0x00 0x00 0x00 0x03 0x01 0x00 0xC0 // '???????' 0x03 0x00 0x00 0x00 0x83 0x01 0x00 0xC0 // '??????' 0x04 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x61 0x64 0x64 // '??To add' 0x20 0x66 0x72 0x61 0x6D 0x65 0x73 0x20 // ' frames ' 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 0x62 // 'to the b' 0x65 0x67 0x69 0x6E 0x6E 0x69 0x6E 0x67 // 'eginning' 0x20 0x6F 0x72 0x20 0x65 0x6E 0x64 0x20 // ' or end ' 0x6F 0x66 0x20 0x61 0x20 0x73 0x63 0x65 // 'of a sce' 0x6E 0x65 0x0D 0x0A 0x95 0x09 0x48 0x6F // 'ne???Ho' 0x6C 0x64 0x20 0x64 0x6F 0x77 0x6E 0x20 // 'ld down ' 0x43 0x74 0x72 0x6C 0x20 0x61 0x73 0x20 // 'Ctrl as ' 0x79 0x6F 0x75 0x20 0x63 0x6C 0x69 0x63 // 'you clic' 0x6B 0x20 0x74 0x68 0x65 0x20 0x50 0x72 // 'k the Pr' 0x65 0x76 0x69 0x6F 0x75 0x73 0x2D 0x01 // 'evious-?' 0x20 0x6F 0x72 0x20 0x4E 0x65 0x78 0x74 // ' or Next' 0x2D 0x01 0x20 0x62 0x75 0x74 0x74 0x6F // '-? butto' 0x6E 0x20 0x6F 0x6E 0x20 0x74 0x68 0x65 // 'n on the' 0x20 0x46 0x72 0x61 0x6D 0x65 0x20 0x53 // ' Frame S' 0x6C 0x69 0x64 0x65 0x72 0x2E 0x0D 0x0A // 'lider.??' 0x54 0x6F 0x20 0x63 0x68 0x61 0x6E 0x67 // 'To chang' 0x65 0x20 0x74 0x68 0x65 0x20 0x63 0x61 // 'e the ca' 0x6D 0x65 0x72 0x61 0x20 0x61 0x6E 0x67 // 'mera ang' 0x6C 0x65 0x20 0x28 0x74 0x68 0x65 0x72 // 'le (ther' 0x65 0x20 0x61 0x72 0x65 0x20 0x6D 0x61 // 'e are ma' 0x6E 0x79 0x20 0x64 0x69 0x66 0x66 0x65 // 'ny diffe' 0x72 0x65 0x6E 0x74 0x20 0x63 0x61 0x6D // 'rent cam' 0x65 0x72 0x61 0x20 0x61 0x6E 0x67 0x6C // 'era angl' 0x65 0x73 0x20 0x66 0x6F 0x72 0x20 0x65 // 'es for e' 0x61 0x63 0x68 0x20 0x73 0x63 0x65 0x6E // 'ach scen' 0x65 0x29 0x0D 0x0A 0x95 0x09 0x43 0x6C // 'e)???Cl' 0x69 0x63 0x6B 0x20 0x53 0x63 0x65 0x6E // 'ick Scen' 0x65 0x73 0x2C 0x20 0x74 0x68 0x65 0x6E // 'es, then' 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 0x43 // ' click C' 0x61 0x6D 0x65 0x72 0x61 0x20 0x41 0x6E // 'amera An' 0x67 0x6C 0x65 0x73 0x2D 0x01 0x0D 0x0A // 'gles-???' 0x54 0x6F 0x20 0x61 0x64 0x64 0x20 0x74 // 'To add t' 0x72 0x61 0x6E 0x73 0x69 0x74 0x69 0x6F // 'ransitio' 0x6E 0x73 0x20 0x62 0x65 0x74 0x77 0x65 // 'ns betwe' 0x65 0x6E 0x20 0x73 0x63 0x65 0x6E 0x65 // 'en scene' 0x73 0x20 0x6C 0x69 0x6B 0x65 0x20 0x63 // 's like c' 0x75 0x74 0x73 0x20 0x61 0x6E 0x64 0x20 // 'uts and ' 0x64 0x69 0x73 0x73 0x6F 0x6C 0x76 0x65 // 'dissolve' 0x73 0x0D 0x0A 0x20 0x95 0x09 0x43 0x6C // 's?? ?Cl' 0x69 0x63 0x6B 0x20 0x53 0x63 0x65 0x6E // 'ick Scen' 0x65 0x73 0x2C 0x20 0x63 0x6C 0x69 0x63 // 'es, clic' 0x6B 0x20 0x4D 0x6F 0x72 0x65 0x20 0x54 // 'k More T' 0x6F 0x6F 0x6C 0x73 0x2C 0x20 0x74 0x68 // 'ools, th' 0x65 0x6E 0x20 0x63 0x6C 0x69 0x63 0x6B // 'en click' 0x20 0x74 0x68 0x65 0x20 0x53 0x63 0x65 // ' the Sce' 0x6E 0x65 0x20 0x4F 0x72 0x67 0x61 0x6E // 'ne Organ' 0x69 0x7A 0x65 0x72 0x2D 0x01 // 'izer-?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_10= ktpcBook10Tips9 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_10, __HELP_NAME("(L) Tips Pg 9")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_10, __HELP_NAME("(L) Tips Pg 9")) __HELP_PACK2 BO OSK LONG kgobHelpBookPageLeft kgobHelpBookPageLeft 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_8=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_10, 0x0) GST(0) ITEM "kgobHelpBookPageLeft" ITEM "ktpcBook10Tips9" ITEM "kgobHelpBookPageLeft" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_8=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_10, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA8 0x01 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_9=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) AG(4) FREE ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSceneSorter __HELP_SYMBOL( STN "mbmpSceneSorter" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpPortfolio __HELP_SYMBOL( STN "mbmpPortfolio" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_8=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x1D 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1B 0x00 0x00 0x01 // '????????' 0x01 0xF6 0x00 0x00 0x5C 0x00 0x00 0x01 // '???\???' 0x01 0x00 0x00 0x00 0x5D 0x00 0x00 0x01 // '????]???' 0x01 0xE7 0x00 0x00 0x5F 0x00 0x00 0x01 // '???_???' 0x01 0x00 0x00 0x00 0xD5 0x00 0x00 0x01 // '???????' 0x01 0xF6 0x00 0x00 0xFE 0x00 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0xFF 0x00 0x00 0x01 // '???????' 0x01 0xF6 0x00 0x00 0x19 0x01 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xBB 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x19 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x5F 0x00 0x00 0x03 // '????_???' 0x0A 0x00 0x00 0xFD 0xD3 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x19 0x01 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x63 0x01 0x00 0x03 // '???c???' 0x00 0x00 0x00 0x00 0xBB 0x01 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x1B 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x5F 0x00 0x00 0x80 // '????_??' 0x00 0x00 0x00 0x00 0xD5 0x00 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0x19 0x01 0x00 0x80 // '???????' 0x00 0x00 0x00 0x00 0x65 0x01 0x00 0x80 // '????e??' 0x00 0x00 0x02 0x00 0x1B 0x00 0x00 0x82 // '???????' 0x0A 0x00 0x00 0x00 0x5F 0x00 0x00 0x82 // '????_??' 0x05 0x00 0x00 0x00 0xD5 0x00 0x00 0x82 // '??????' 0x0A 0x00 0x00 0x00 0x19 0x01 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x65 0x01 0x00 0x82 // '????e??' 0x00 0x00 0x00 0x00 0x5C 0x00 0x00 0xC0 // '????\??' 0x02 0x00 0x00 0x00 0xFE 0x00 0x00 0xC0 // '??????' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_8=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x63 0x68 0x61 // '??To cha' 0x6E 0x67 0x65 0x20 0x74 0x68 0x65 0x20 // 'nge the ' 0x73 0x63 0x65 0x6E 0x65 0x20 0x6F 0x72 // 'scene or' 0x64 0x65 0x72 0x0D 0x0A 0x95 0x09 0x43 // 'der???C' 0x6C 0x69 0x63 0x6B 0x20 0x53 0x63 0x65 // 'lick Sce' 0x6E 0x65 0x73 0x2C 0x20 0x63 0x6C 0x69 // 'nes, cli' 0x63 0x6B 0x20 0x4D 0x6F 0x72 0x65 0x20 // 'ck More ' 0x54 0x6F 0x6F 0x6C 0x73 0x2C 0x20 0x74 // 'Tools, t' 0x68 0x65 0x6E 0x20 0x63 0x6C 0x69 0x63 // 'hen clic' 0x6B 0x20 0x74 0x68 0x65 0x20 0x53 0x63 // 'k the Sc' 0x65 0x6E 0x65 0x20 0x4F 0x72 0x67 0x61 // 'ene Orga' 0x6E 0x69 0x7A 0x65 0x72 0x2D 0x01 0x0D // 'nizer-??' 0x0A 0x54 0x6F 0x20 0x61 0x74 0x74 0x61 // '?To atta' 0x63 0x68 0x20 0x61 0x20 0x6D 0x6F 0x76 // 'ch a mov' 0x69 0x65 0x20 0x74 0x6F 0x20 0x74 0x68 // 'ie to th' 0x65 0x20 0x65 0x6E 0x64 0x20 0x6F 0x66 // 'e end of' 0x20 0x61 0x6E 0x6F 0x74 0x68 0x65 0x72 // ' another' 0x20 0x28 0x66 0x6F 0x72 0x20 0x65 0x78 // ' (for ex' 0x61 0x6D 0x70 0x6C 0x65 0x2C 0x20 0x79 // 'ample, y' 0x6F 0x75 0x20 0x6D 0x61 0x79 0x20 0x77 // 'ou may w' 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 0x61 // 'ant to a' 0x64 0x64 0x20 0x74 0x68 0x65 0x20 0x73 // 'dd the s' 0x61 0x6D 0x65 0x20 0x63 0x72 0x65 0x64 // 'ame cred' 0x69 0x74 0x73 0x20 0x74 0x6F 0x20 0x74 // 'its to t' 0x68 0x65 0x20 0x65 0x6E 0x64 0x20 0x6F // 'he end o' 0x66 0x20 0x65 0x61 0x63 0x68 0x20 0x6D // 'f each m' 0x6F 0x76 0x69 0x65 0x29 0x0D 0x0A 0x95 // 'ovie)??' 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 0x53 // '?Click S' 0x63 0x65 0x6E 0x65 0x73 0x2C 0x20 0x74 // 'cenes, t' 0x68 0x65 0x6E 0x20 0x63 0x6C 0x69 0x63 // 'hen clic' 0x6B 0x20 0x74 0x68 0x65 0x20 0x50 0x6F // 'k the Po' 0x72 0x74 0x66 0x6F 0x6C 0x69 0x6F 0x2D // 'rtfolio-' 0x01 0x20 0x69 0x6E 0x20 0x74 0x68 0x65 // '? in the' 0x20 0x53 0x63 0x65 0x6E 0x65 0x20 0x4F // ' Scene O' 0x72 0x67 0x61 0x6E 0x69 0x7A 0x65 0x72 // 'rganizer' 0x2E 0x0D 0x0A 0x54 0x6F 0x20 0x73 0x65 // '.??To se' 0x6C 0x65 0x63 0x74 0x20 0x61 0x6E 0x20 // 'lect an ' 0x61 0x63 0x74 0x6F 0x72 0x2C 0x20 0x70 // 'actor, p' 0x72 0x6F 0x70 0x2C 0x20 0x6F 0x72 0x20 // 'rop, or ' 0x33 0x44 0x20 0x77 0x6F 0x72 0x64 0x20 // '3D word ' 0x74 0x68 0x61 0x74 0x20 0x69 0x73 0x20 // 'that is ' 0x62 0x65 0x68 0x69 0x6E 0x64 0x20 0x61 // 'behind a' 0x6E 0x6F 0x74 0x68 0x65 0x72 0x20 0x6F // 'nother o' 0x72 0x20 0x6F 0x75 0x74 0x20 0x6F 0x66 // 'r out of' 0x20 0x76 0x69 0x65 0x77 0x0D 0x0A 0x95 // ' view??' 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 0x69 // '?Click i' 0x74 0x73 0x20 0x70 0x69 0x63 0x74 0x75 // 'ts pictu' 0x72 0x65 0x20 0x69 0x6E 0x20 0x74 0x68 // 're in th' 0x65 0x20 0x41 0x63 0x74 0x6F 0x72 0x20 // 'e Actor ' 0x6F 0x72 0x20 0x50 0x72 0x6F 0x70 0x20 // 'or Prop ' 0x4C 0x69 0x73 0x74 0x97 0x6C 0x6F 0x63 // 'Listloc' 0x61 0x74 0x65 0x64 0x20 0x6F 0x6E 0x20 // 'ated on ' 0x65 0x69 0x74 0x68 0x65 0x72 0x20 0x73 // 'either s' 0x69 0x64 0x65 0x20 0x6F 0x66 0x20 0x74 // 'ide of t' 0x68 0x65 0x20 0x77 0x6F 0x72 0x6B 0x73 // 'he works' 0x70 0x61 0x63 0x65 0x2E // 'pace.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_12= ktpcBook10Tips10 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_12, __HELP_NAME("(L) Tips Pg 10")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_12, __HELP_NAME("(L) Tips Pg 10")) __HELP_PACK2 BO OSK LONG kgobHelpBookPageLeft kgobHelpBookPageLeft 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_12, 0x0) GST(0) ITEM "kgobHelpBookPageLeft" ITEM "ktpcBook10Tips10" ITEM "kgobHelpBookPageLeft" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_12, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA8 0x01 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_6=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpActorActions __HELP_SYMBOL( STN "mbmpActorActions" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpActorsContinue __HELP_SYMBOL( STN "mbmpActorsContinue" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpActorsSpletters __HELP_SYMBOL( STN "mbmpActorsSpletters" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x1C 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x32 0x00 0x00 0x01 // '????2???' 0x01 0xF6 0x00 0x00 0x6F 0x00 0x00 0x01 // '???o???' 0x01 0x00 0x00 0x00 0x70 0x00 0x00 0x01 // '????p???' 0x01 0xF1 0x00 0x00 0x72 0x00 0x00 0x01 // '???r???' 0x01 0xF6 0x00 0x00 0x9B 0x00 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0x9C 0x00 0x00 0x01 // '???????' 0x01 0xF6 0x00 0x00 0xB0 0x00 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0x29 0x01 0x00 0x01 // '????)???' 0x01 0xF6 0x00 0x00 0x2B 0x01 0x00 0x01 // '???+???' 0x01 0x00 0x00 0x00 0x68 0x01 0x00 0x01 // '????h???' 0x01 0xF6 0x00 0x00 0x9E 0x01 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0x9F 0x01 0x00 0x01 // '???????' 0x01 0xF6 0x00 0x00 0x25 0x02 0x00 0x01 // '???%???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x32 0x00 0x00 0x03 // '???2???' 0x00 0x00 0x00 0x00 0x74 0x00 0x00 0x03 // '????t???' 0x0F 0x00 0x00 0xFD 0xB7 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x2B 0x01 0x00 0x03 // '????+???' 0x0A 0x00 0x00 0xFD 0x66 0x01 0x00 0x03 // '???f???' 0x00 0x00 0x00 0x00 0x32 0x00 0x00 0x80 // '????2??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x72 0x00 0x00 0x82 // '????r??' 0x0A 0x00 0x00 0x00 0x2B 0x01 0x00 0x82 // '????+??' 0x05 0x00 0x00 0x00 0x68 0x01 0x00 0x82 // '????h??' 0xF6 0xFF 0x00 0x00 0x6F 0x00 0x00 0xC0 // '??o??' 0x03 0x00 0x00 0x00 0x9B 0x00 0x00 0xC0 // '??????' 0x01 0x00 0x00 0x00 0x9E 0x01 0x00 0xC0 // '??????' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x61 0x6E 0x69 // '??To ani' 0x6D 0x61 0x74 0x65 0x20 0x33 0x44 0x20 // 'mate 3D ' 0x77 0x6F 0x72 0x64 0x73 0x20 0x6A 0x75 // 'words ju' 0x73 0x74 0x20 0x6C 0x69 0x6B 0x65 0x20 // 'st like ' 0x79 0x6F 0x75 0x20 0x61 0x6E 0x69 0x6D // 'you anim' 0x61 0x74 0x65 0x20 0x61 0x63 0x74 0x6F // 'ate acto' 0x72 0x73 0x0D 0x0A 0x31 0x09 0x54 0x6F // 'rs??1?To' 0x20 0x63 0x72 0x65 0x61 0x74 0x65 0x20 // ' create ' 0x61 0x20 0x33 0x44 0x20 0x77 0x6F 0x72 // 'a 3D wor' 0x64 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B // 'd, click' 0x20 0x41 0x63 0x74 0x6F 0x72 0x73 0x20 // ' Actors ' 0x26 0x20 0x50 0x72 0x6F 0x70 0x73 0x2E // '& Props.' 0x20 0x20 0x43 0x6C 0x69 0x63 0x6B 0x20 // ' Click ' 0x33 0x44 0x20 0x57 0x6F 0x72 0x64 0x73 // '3D Words' 0x2D 0x01 0x0D 0x0A 0x32 0x09 0x54 0x6F // '-???2?To' 0x20 0x61 0x6E 0x69 0x6D 0x61 0x74 0x65 // ' animate' 0x20 0x61 0x20 0x33 0x44 0x20 0x77 0x6F // ' a 3D wo' 0x72 0x64 0x2C 0x20 0x63 0x68 0x6F 0x6F // 'rd, choo' 0x73 0x65 0x20 0x61 0x6E 0x20 0x61 0x63 // 'se an ac' 0x74 0x69 0x6F 0x6E 0x2D 0x01 0x2C 0x20 // 'tion-?, ' 0x74 0x68 0x65 0x6E 0x20 0x63 0x6C 0x69 // 'then cli' 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 0x33 // 'ck the 3' 0x44 0x20 0x77 0x6F 0x72 0x64 0x2E 0x20 // 'D word. ' 0x20 0x44 0x65 0x70 0x65 0x6E 0x64 0x69 // ' Dependi' 0x6E 0x67 0x20 0x75 0x70 0x6F 0x6E 0x20 // 'ng upon ' 0x74 0x68 0x65 0x20 0x65 0x66 0x66 0x65 // 'the effe' 0x63 0x74 0x20 0x79 0x6F 0x75 0x20 0x77 // 'ct you w' 0x61 0x6E 0x74 0x2C 0x20 0x65 0x69 0x74 // 'ant, eit' 0x68 0x65 0x72 0x20 0x68 0x6F 0x6C 0x64 // 'her hold' 0x20 0x64 0x6F 0x77 0x6E 0x20 0x74 0x68 // ' down th' 0x65 0x20 0x6D 0x6F 0x75 0x73 0x65 0x20 // 'e mouse ' 0x62 0x75 0x74 0x74 0x6F 0x6E 0x20 0x6F // 'button o' 0x72 0x20 0x64 0x72 0x61 0x67 0x20 0x74 // 'r drag t' 0x68 0x65 0x20 0x77 0x6F 0x72 0x64 0x73 // 'he words' 0x20 0x77 0x68 0x65 0x72 0x65 0x20 0x79 // ' where y' 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 // 'ou want ' 0x74 0x68 0x65 0x6D 0x20 0x74 0x6F 0x20 // 'them to ' 0x67 0x6F 0x2E 0x0D 0x0A 0x54 0x6F 0x20 // 'go.??To ' 0x63 0x6F 0x6E 0x74 0x69 0x6E 0x75 0x65 // 'continue' 0x20 0x74 0x68 0x65 0x20 0x6C 0x61 0x73 // ' the las' 0x74 0x20 0x61 0x63 0x74 0x69 0x6F 0x6E // 't action' 0x20 0x61 0x6E 0x20 0x61 0x63 0x74 0x6F // ' an acto' 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 0x2C // 'r, prop,' 0x20 0x6F 0x72 0x20 0x33 0x44 0x20 0x77 // ' or 3D w' 0x6F 0x72 0x64 0x20 0x75 0x73 0x65 0x64 // 'ord used' 0x0D 0x0A 0x95 0x09 0x43 0x6C 0x69 0x63 // '???Clic' 0x6B 0x20 0x41 0x63 0x74 0x6F 0x72 0x73 // 'k Actors' 0x20 0x26 0x20 0x50 0x72 0x6F 0x70 0x73 // ' & Props' 0x2C 0x20 0x74 0x68 0x65 0x6E 0x20 0x63 // ', then c' 0x6C 0x69 0x63 0x6B 0x20 0x52 0x65 0x73 // 'lick Res' 0x75 0x6D 0x65 0x20 0x4C 0x61 0x73 0x74 // 'ume Last' 0x20 0x41 0x63 0x74 0x69 0x6F 0x6E 0x2D // ' Action-' 0x01 0x2E 0x20 0x20 0x4D 0x6F 0x76 0x65 // '?. Move' 0x20 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F // ' the mo' 0x75 0x73 0x65 0x20 0x63 0x75 0x72 0x73 // 'use curs' 0x6F 0x72 0x20 0x6F 0x76 0x65 0x72 0x20 // 'or over ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x6F // 'the acto' 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 0x2C // 'r, prop,' 0x20 0x6F 0x72 0x20 0x33 0x44 0x20 0x77 // ' or 3D w' 0x6F 0x72 0x64 0x20 0x77 0x68 0x6F 0x73 // 'ord whos' 0x65 0x20 0x61 0x63 0x74 0x69 0x6F 0x6E // 'e action' 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E // ' you wan' 0x74 0x20 0x74 0x6F 0x20 0x63 0x6F 0x6E // 't to con' 0x74 0x69 0x6E 0x75 0x65 0x2E 0x20 0x20 // 'tinue. ' 0x48 0x6F 0x6C 0x64 0x20 0x64 0x6F 0x77 // 'Hold dow' 0x6E 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F // 'n the mo' 0x75 0x73 0x65 0x20 0x62 0x75 0x74 0x74 // 'use butt' 0x6F 0x6E 0x20 0x61 0x73 0x20 0x79 0x6F // 'on as yo' 0x75 0x20 0x64 0x72 0x61 0x67 0x2E // 'u drag.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_14= ktpcBook10Tips11 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_14, __HELP_NAME("(L) Tips Pg 11")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_14, __HELP_NAME("(L) Tips Pg 11")) __HELP_PACK2 BO OSK LONG kgobHelpBookPageLeft kgobHelpBookPageLeft 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_14, 0x0) GST(0) ITEM "kgobHelpBookPageLeft" ITEM "ktpcBook10Tips11" ITEM "kgobHelpBookPageLeft" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_14, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA8 0x01 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_E=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpActorsCompose __HELP_SYMBOL( STN "mbmpActorsCompose" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpActorsCostume __HELP_SYMBOL( STN "mbmpActorsCostume" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpActorsContinue __HELP_SYMBOL( STN "mbmpActorsContinue" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x28 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '(???????' 0x01 0x00 0x00 0x00 0x36 0x00 0x00 0x01 // '????6???' 0x01 0xF6 0x00 0x00 0x68 0x00 0x00 0x01 // '???h???' 0x01 0x00 0x00 0x00 0x69 0x00 0x00 0x01 // '????i???' 0x01 0xF6 0x00 0x00 0x7A 0x00 0x00 0x01 // '???z???' 0x01 0xF6 0x00 0x00 0x8B 0x00 0x00 0x01 // '??????' 0x01 0xF6 0x00 0x00 0xA3 0x00 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0xC9 0x00 0x00 0x01 // '???????' 0x05 0x00 0x00 0x00 0xCC 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xD9 0x00 0x00 0x01 // '???????' 0x01 0xF6 0x00 0x00 0x02 0x01 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0x03 0x01 0x00 0x01 // '????????' 0x01 0xF6 0x00 0x00 0x39 0x01 0x00 0x01 // '???9???' 0x01 0x00 0x00 0x00 0x6A 0x01 0x00 0x01 // '????j???' 0x05 0x00 0x00 0x00 0x7E 0x01 0x00 0x01 // '????~???' 0x01 0x00 0x00 0x00 0x81 0x01 0x00 0x01 // '???????' 0x01 0xF6 0x00 0x00 0xB2 0x01 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0xB3 0x01 0x00 0x01 // '???????' 0x01 0xF6 0x00 0x00 0xE9 0x01 0x00 0x01 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x34 0x00 0x00 0x03 // '???4???' 0x00 0x00 0x00 0x00 0xA3 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xD7 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x3B 0x01 0x00 0x03 // '????;???' 0x0A 0x00 0x00 0xFD 0x81 0x01 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0x00 0x00 0x00 0x00 0x36 0x00 0x00 0x80 // '????6??' 0x00 0x00 0x02 0x00 0xA3 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0xD9 0x00 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0x3B 0x01 0x00 0x80 // '????;??' 0x00 0x00 0x00 0x00 0x81 0x01 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x36 0x00 0x00 0x82 // '????6??' 0x0A 0x00 0x00 0x00 0xA3 0x00 0x00 0x82 // '??????' 0x05 0x00 0x00 0x00 0xD9 0x00 0x00 0x82 // '??????' 0x0A 0x00 0x00 0x00 0x3B 0x01 0x00 0x82 // '????;??' 0x05 0x00 0x00 0x00 0x81 0x01 0x00 0x82 // '??????' 0xF6 0xFF 0x00 0x00 0x68 0x00 0x00 0xC0 // '??h??' 0x02 0x00 0x00 0x00 0x02 0x01 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0xB2 0x01 0x00 0xC0 // '??????' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x63 0x68 0x61 // '??To cha' 0x6E 0x67 0x65 0x20 0x61 0x6E 0x20 0x61 // 'nge an a' 0x63 0x74 0x6F 0x72 0x27 0x73 0x20 0x63 // 'ctor's c' 0x6F 0x73 0x74 0x75 0x6D 0x65 0x20 0x6F // 'ostume o' 0x72 0x20 0x65 0x76 0x65 0x6E 0x20 0x61 // 'r even a' 0x64 0x64 0x20 0x61 0x63 0x63 0x65 0x73 // 'dd acces' 0x73 0x6F 0x72 0x69 0x65 0x73 0x0D 0x0A // 'sories??' 0x95 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 // '?Click ' 0x41 0x63 0x74 0x6F 0x72 0x73 0x20 0x26 // 'Actors &' 0x20 0x50 0x72 0x6F 0x70 0x73 0x2C 0x20 // ' Props, ' 0x63 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 // 'click th' 0x65 0x20 0x43 0x6F 0x73 0x74 0x75 0x6D // 'e Costum' 0x65 0x20 0x43 0x68 0x61 0x6E 0x67 0x65 // 'e Change' 0x72 0x2D 0x01 0x2C 0x20 0x74 0x68 0x65 // 'r-?, the' 0x6E 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 // 'n click ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x6F // 'the acto' 0x72 0x20 0x77 0x68 0x6F 0x73 0x65 0x20 // 'r whose ' 0x63 0x6F 0x73 0x74 0x75 0x6D 0x65 0x20 // 'costume ' 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 // 'you want' 0x20 0x74 0x6F 0x20 0x63 0x68 0x61 0x6E // ' to chan' 0x67 0x65 0x2E 0x0D 0x0A 0x54 0x6F 0x20 // 'ge.??To ' 0x72 0x65 0x70 0x6F 0x73 0x69 0x74 0x69 // 'repositi' 0x6F 0x6E 0x20 0x61 0x20 0x33 0x44 0x20 // 'on a 3D ' 0x6F 0x62 0x6A 0x65 0x63 0x74 0x20 0x6E // 'object n' 0x65 0x61 0x72 0x20 0x6F 0x72 0x20 0x66 // 'ear or f' 0x61 0x72 0x20 0x61 0x6E 0x64 0x20 0x75 // 'ar and u' 0x70 0x20 0x6F 0x72 0x20 0x64 0x6F 0x77 // 'p or dow' 0x6E 0x0D 0x0A 0x95 0x09 0x43 0x6C 0x69 // 'n???Cli' 0x63 0x6B 0x20 0x41 0x63 0x74 0x6F 0x72 // 'ck Actor' 0x73 0x20 0x26 0x20 0x50 0x72 0x6F 0x70 // 's & Prop' 0x73 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B // 's, click' 0x20 0x52 0x65 0x70 0x6F 0x73 0x69 0x74 // ' Reposit' 0x69 0x6F 0x6E 0x2D 0x01 0x2C 0x20 0x74 // 'ion-?, t' 0x68 0x65 0x6E 0x20 0x68 0x6F 0x6C 0x64 // 'hen hold' 0x20 0x64 0x6F 0x77 0x6E 0x20 0x74 0x68 // ' down th' 0x65 0x20 0x55 0x70 0x20 0x6F 0x72 0x20 // 'e Up or ' 0x44 0x6F 0x77 0x6E 0x20 0x41 0x72 0x72 // 'Down Arr' 0x6F 0x77 0x20 0x6B 0x65 0x79 0x20 0x61 // 'ow key a' 0x73 0x20 0x79 0x6F 0x75 0x20 0x64 0x72 // 's you dr' 0x61 0x67 0x2E 0x0D 0x0A 0x54 0x6F 0x20 // 'ag.??To ' 0x6D 0x6F 0x76 0x65 0x20 0x61 0x20 0x33 // 'move a 3' 0x44 0x20 0x6F 0x62 0x6A 0x65 0x63 0x74 // 'D object' 0x20 0x6E 0x65 0x61 0x72 0x20 0x6F 0x72 // ' near or' 0x20 0x66 0x61 0x72 0x20 0x61 0x6E 0x64 // ' far and' 0x20 0x75 0x70 0x20 0x6F 0x72 0x20 0x64 // ' up or d' 0x6F 0x77 0x6E 0x20 0x61 0x73 0x20 0x79 // 'own as y' 0x6F 0x75 0x20 0x63 0x72 0x65 0x61 0x74 // 'ou creat' 0x65 0x20 0x61 0x20 0x70 0x61 0x74 0x68 // 'e a path' 0x3F 0x0D 0x0A 0x95 0x09 0x43 0x6C 0x69 // '????Cli' 0x63 0x6B 0x20 0x41 0x63 0x74 0x6F 0x72 // 'ck Actor' 0x73 0x20 0x26 0x20 0x50 0x72 0x6F 0x70 // 's & Prop' 0x73 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B // 's, click' 0x20 0x52 0x65 0x73 0x75 0x6D 0x65 0x20 // ' Resume ' 0x4C 0x61 0x73 0x74 0x20 0x41 0x63 0x74 // 'Last Act' 0x69 0x6F 0x6E 0x2D 0x01 0x2C 0x20 0x74 // 'ion-?, t' 0x68 0x65 0x6E 0x20 0x68 0x6F 0x6C 0x64 // 'hen hold' 0x20 0x64 0x6F 0x77 0x6E 0x20 0x74 0x68 // ' down th' 0x65 0x20 0x55 0x70 0x20 0x6F 0x72 0x20 // 'e Up or ' 0x44 0x6F 0x77 0x6E 0x20 0x41 0x72 0x72 // 'Down Arr' 0x6F 0x77 0x20 0x6B 0x65 0x79 0x20 0x61 // 'ow key a' 0x73 0x20 0x79 0x6F 0x75 0x20 0x64 0x72 // 's you dr' 0x61 0x67 0x2E // 'ag.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_18= ktpcBook10Tips13 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_18, __HELP_NAME("(L) Tips Pg 13")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_18, __HELP_NAME("(L) Tips Pg 13")) __HELP_PACK2 BO OSK LONG kgobHelpBookPageLeft kgobHelpBookPageLeft 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_6=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_18, 0x0) GST(0) ITEM "kgobHelpBookPageLeft" ITEM "ktpcBook10Tips13" ITEM "kgobHelpBookPageLeft" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_6=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_18, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA8 0x01 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_0=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpCutCopyPaste __HELP_SYMBOL( STN "mbmpCutCopyPaste" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpCCPCopyRoute __HELP_SYMBOL( STN "mbmpCCPCopyRoute" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_6=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x14 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x26 0x00 0x00 0x01 // '????&???' 0x01 0xF6 0x00 0x00 0x5C 0x00 0x00 0x01 // '???\???' 0x01 0x00 0x00 0x00 0x5F 0x00 0x00 0x01 // '????_???' 0x01 0xF6 0x00 0x00 0x6F 0x00 0x00 0x01 // '???o???' 0x01 0x00 0x00 0x00 0x70 0x00 0x00 0x01 // '????p???' 0x01 0xF6 0x00 0x00 0x9F 0x00 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0xCA 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0x22 0x02 0x00 0x01 // '????"???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x24 0x00 0x00 0x03 // '???$???' 0x00 0x00 0x00 0x00 0xCC 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x22 0x02 0x00 0x03 // '???"???' 0x00 0x00 0x00 0x00 0x22 0x02 0x00 0x40 // '????"??@' 0x00 0x00 0x00 0x00 0x26 0x00 0x00 0x80 // '????&??' 0x00 0x00 0x02 0x00 0xCC 0x00 0x00 0x80 // '??????' 0x00 0x00 0x03 0x00 0x00 0x00 0x00 0x82 // '???????' 0x0A 0x00 0x00 0x00 0xCC 0x00 0x00 0x82 // '??????' 0x05 0x00 0x00 0x00 0x5C 0x00 0x00 0xC0 // '????\??' 0x01 0x00 0x00 0x00 0x6F 0x00 0x00 0xC0 // '????o??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_6=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x6D 0x61 0x6B // '??To mak' 0x65 0x20 0x74 0x77 0x6F 0x20 0x61 0x63 // 'e two ac' 0x74 0x6F 0x72 0x73 0x20 0x66 0x6F 0x6C // 'tors fol' 0x6C 0x6F 0x77 0x20 0x65 0x61 0x63 0x68 // 'low each' 0x20 0x6F 0x74 0x68 0x65 0x72 0x0D 0x0A // ' other??' 0x95 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 // '?Click ' 0x41 0x63 0x74 0x6F 0x72 0x73 0x20 0x26 // 'Actors &' 0x20 0x50 0x72 0x6F 0x70 0x73 0x2C 0x20 // ' Props, ' 0x74 0x68 0x65 0x6E 0x20 0x63 0x6C 0x69 // 'then cli' 0x63 0x6B 0x20 0x43 0x75 0x74 0x2C 0x20 // 'ck Cut, ' 0x43 0x6F 0x70 0x79 0x2C 0x20 0x26 0x20 // 'Copy, & ' 0x50 0x61 0x73 0x74 0x65 0x2D 0x01 0x0D // 'Paste-??' 0x0A 0x95 0x09 0x55 0x73 0x65 0x20 0x43 // '??Use C' 0x6F 0x70 0x79 0x20 0x50 0x61 0x74 0x68 // 'opy Path' 0x2D 0x01 0x20 0x74 0x6F 0x20 0x63 0x6F // '-? to co' 0x70 0x79 0x20 0x74 0x68 0x65 0x20 0x70 // 'py the p' 0x61 0x74 0x68 0x20 0x6F 0x66 0x20 0x61 // 'ath of a' 0x6E 0x20 0x61 0x63 0x74 0x6F 0x72 0x2C // 'n actor,' 0x20 0x70 0x72 0x6F 0x70 0x2C 0x20 0x6F // ' prop, o' 0x72 0x20 0x33 0x44 0x20 0x77 0x6F 0x72 // 'r 3D wor' 0x64 0x20 0x61 0x6E 0x64 0x20 0x70 0x61 // 'd and pa' 0x73 0x74 0x65 0x20 0x74 0x68 0x65 0x20 // 'ste the ' 0x70 0x61 0x74 0x68 0x20 0x6F 0x6E 0x74 // 'path ont' 0x6F 0x20 0x61 0x6E 0x6F 0x74 0x68 0x65 // 'o anothe' 0x72 0x20 0x33 0x44 0x20 0x6F 0x62 0x6A // 'r 3D obj' 0x65 0x63 0x74 0x2E 0x0D 0x0A 0x57 0x68 // 'ect.??Wh' 0x65 0x6E 0x20 0x79 0x6F 0x75 0x20 0x63 // 'en you c' 0x6F 0x70 0x79 0x20 0x61 0x20 0x70 0x61 // 'opy a pa' 0x74 0x68 0x2C 0x20 0x79 0x6F 0x75 0x20 // 'th, you ' 0x63 0x6F 0x70 0x79 0x20 0x6F 0x6E 0x6C // 'copy onl' 0x79 0x20 0x74 0x68 0x65 0x20 0x70 0x61 // 'y the pa' 0x74 0x68 0x2D 0x2D 0x6E 0x6F 0x74 0x20 // 'th--not ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x69 // 'the acti' 0x6F 0x6E 0x2E 0x20 0x20 0x49 0x66 0x20 // 'on. If ' 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 // 'you want' 0x20 0x74 0x77 0x6F 0x20 0x61 0x63 0x74 // ' two act' 0x6F 0x72 0x73 0x20 0x74 0x6F 0x20 0x77 // 'ors to w' 0x61 0x6C 0x6B 0x20 0x73 0x69 0x64 0x65 // 'alk side' 0x2D 0x62 0x79 0x2D 0x73 0x69 0x64 0x65 // '-by-side' 0x2C 0x20 0x79 0x6F 0x75 0x20 0x6E 0x65 // ', you ne' 0x65 0x64 0x20 0x74 0x6F 0x20 0x67 0x69 // 'ed to gi' 0x76 0x65 0x20 0x62 0x6F 0x74 0x68 0x20 // 've both ' 0x6F 0x66 0x20 0x74 0x68 0x65 0x6D 0x20 // 'of them ' 0x74 0x68 0x65 0x20 0x57 0x61 0x6C 0x6B // 'the Walk' 0x20 0x61 0x63 0x74 0x69 0x6F 0x6E 0x2E // ' action.' 0x20 0x20 0x4E 0x6F 0x74 0x65 0x3A 0x20 // ' Note: ' 0x20 0x42 0x69 0x67 0x20 0x61 0x63 0x74 // ' Big act' 0x6F 0x72 0x73 0x20 0x74 0x65 0x6E 0x64 // 'ors tend' 0x20 0x74 0x6F 0x20 0x77 0x61 0x6C 0x6B // ' to walk' 0x20 0x66 0x61 0x73 0x74 0x65 0x72 0x20 // ' faster ' 0x74 0x68 0x61 0x6E 0x20 0x73 0x6D 0x61 // 'than sma' 0x6C 0x6C 0x20 0x61 0x63 0x74 0x6F 0x72 // 'll actor' 0x73 0x2E 0x20 0x20 0x54 0x6F 0x20 0x67 // 's. To g' 0x65 0x74 0x20 0x74 0x68 0x65 0x20 0x65 // 'et the e' 0x66 0x66 0x65 0x63 0x74 0x20 0x79 0x6F // 'ffect yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x2C 0x20 // 'u want, ' 0x79 0x6F 0x75 0x20 0x6D 0x61 0x79 0x20 // 'you may ' 0x6E 0x65 0x65 0x64 0x20 0x74 0x6F 0x20 // 'need to ' 0x67 0x69 0x76 0x65 0x20 0x74 0x68 0x65 // 'give the' 0x20 0x62 0x69 0x67 0x20 0x61 0x63 0x74 // ' big act' 0x6F 0x72 0x20 0x74 0x68 0x65 0x20 0x57 // 'or the W' 0x61 0x6C 0x6B 0x20 0x53 0x6C 0x6F 0x77 // 'alk Slow' 0x6C 0x79 0x20 0x61 0x63 0x74 0x69 0x6F // 'ly actio' 0x6E 0x20 0x61 0x6E 0x64 0x20 0x74 0x68 // 'n and th' 0x65 0x20 0x6C 0x69 0x74 0x74 0x6C 0x65 // 'e little' 0x20 0x61 0x63 0x74 0x6F 0x72 0x20 0x74 // ' actor t' 0x68 0x65 0x20 0x57 0x61 0x6C 0x6B 0x20 // 'he Walk ' 0x46 0x61 0x73 0x74 0x20 0x61 0x63 0x74 // 'Fast act' 0x69 0x6F 0x6E 0x2E // 'ion.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1A= ktpcBook10Tips14 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1A, __HELP_NAME("(L) Tips Pg 14")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1A, __HELP_NAME("(L) Tips Pg 14")) __HELP_PACK2 BO OSK LONG kgobHelpBookPageLeft kgobHelpBookPageLeft 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1A, 0x0) GST(0) ITEM "kgobHelpBookPageLeft" ITEM "ktpcBook10Tips14" ITEM "kgobHelpBookPageLeft" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1A, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA8 0x01 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpActorsSooner __HELP_SYMBOL( STN "mbmpActorsSooner" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_2=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0E 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x9D 0x00 0x00 0x01 // '???????' 0x01 0xF6 0x00 0x00 0xDF 0x00 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0xE0 0x00 0x00 0x01 // '???????' 0x01 0xF1 0x00 0x00 0xE3 0x00 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0x1B 0x02 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x49 0x00 0x00 0x03 // '???I???' 0x00 0x00 0x00 0x00 0x49 0x00 0x00 0x80 // '????I??' 0x00 0x00 0x02 0x00 0x88 0x01 0x00 0x80 // '??????' 0x00 0x00 0x03 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x9D 0x00 0x00 0x82 // '??????' 0x0F 0x00 0x00 0x00 0x13 0x01 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0xDF 0x00 0x00 0xC0 // '??????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x63 0x68 0x61 // '??To cha' 0x6E 0x67 0x65 0x20 0x77 0x68 0x65 0x6E // 'nge when' 0x20 0x61 0x6E 0x20 0x61 0x63 0x74 0x6F // ' an acto' 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 0x2C // 'r, prop,' 0x20 0x6F 0x72 0x20 0x33 0x44 0x20 0x77 // ' or 3D w' 0x6F 0x72 0x64 0x20 0x67 0x65 0x74 0x73 // 'ord gets' 0x20 0x74 0x6F 0x20 0x61 0x20 0x70 0x61 // ' to a pa' 0x72 0x74 0x69 0x63 0x75 0x6C 0x61 0x72 // 'rticular' 0x20 0x6C 0x6F 0x63 0x61 0x74 0x69 0x6F // ' locatio' 0x6E 0x0D 0x0A 0x31 0x09 0x47 0x6F 0x20 // 'n??1?Go ' 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 0x70 // 'to the p' 0x6C 0x61 0x63 0x65 0x20 0x69 0x6E 0x20 // 'lace in ' 0x79 0x6F 0x75 0x72 0x20 0x6D 0x6F 0x76 // 'your mov' 0x69 0x65 0x20 0x77 0x68 0x65 0x72 0x65 // 'ie where' 0x20 0x74 0x68 0x65 0x20 0x61 0x63 0x74 // ' the act' 0x6F 0x72 0x20 0x61 0x72 0x72 0x69 0x76 // 'or arriv' 0x65 0x73 0x20 0x61 0x74 0x20 0x74 0x68 // 'es at th' 0x65 0x20 0x20 0x6C 0x6F 0x63 0x61 0x74 // 'e locat' 0x69 0x6F 0x6E 0x20 0x79 0x6F 0x75 0x20 // 'ion you ' 0x77 0x61 0x6E 0x74 0x2E 0x0D 0x0A 0x32 // 'want.??2' 0x20 0x20 0x43 0x6C 0x69 0x63 0x6B 0x20 // ' Click ' 0x41 0x63 0x74 0x6F 0x72 0x73 0x20 0x26 // 'Actors &' 0x20 0x50 0x72 0x6F 0x70 0x73 0x2C 0x20 // ' Props, ' 0x63 0x6C 0x69 0x63 0x6B 0x20 0x4D 0x6F // 'click Mo' 0x72 0x65 0x20 0x54 0x6F 0x6F 0x6C 0x73 // 're Tools' 0x2C 0x20 0x74 0x68 0x65 0x6E 0x20 0x63 // ', then c' 0x6C 0x69 0x63 0x6B 0x20 0x53 0x79 0x6E // 'lick Syn' 0x63 0x68 0x72 0x6F 0x6E 0x69 0x7A 0x65 // 'chronize' 0x2D 0x01 0x2E 0x20 0x20 0x43 0x6C 0x69 // '-?. Cli' 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 0x61 // 'ck the a' 0x63 0x74 0x6F 0x72 0x20 0x74 0x6F 0x20 // 'ctor to ' 0x66 0x72 0x65 0x65 0x7A 0x65 0x20 0x69 // 'freeze i' 0x74 0x20 0x69 0x6E 0x20 0x74 0x68 0x61 // 't in tha' 0x74 0x20 0x6C 0x6F 0x63 0x61 0x74 0x69 // 't locati' 0x6F 0x6E 0x2E 0x0D 0x0A 0x33 0x09 0x49 // 'on.??3?I' 0x66 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 // 'f you wa' 0x6E 0x74 0x20 0x74 0x68 0x65 0x20 0x61 // 'nt the a' 0x63 0x74 0x6F 0x72 0x20 0x74 0x6F 0x20 // 'ctor to ' 0x61 0x72 0x72 0x69 0x76 0x65 0x20 0x61 // 'arrive a' 0x74 0x20 0x74 0x68 0x65 0x20 0x6C 0x6F // 't the lo' 0x63 0x61 0x74 0x69 0x6F 0x6E 0x20 0x6C // 'cation l' 0x61 0x74 0x65 0x72 0x2C 0x20 0x63 0x6C // 'ater, cl' 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 // 'ick the ' 0x46 0x6F 0x72 0x77 0x61 0x72 0x64 0x20 // 'Forward ' 0x41 0x72 0x72 0x6F 0x77 0x20 0x74 0x6F // 'Arrow to' 0x20 0x6D 0x6F 0x76 0x65 0x20 0x74 0x68 // ' move th' 0x65 0x20 0x6D 0x6F 0x76 0x69 0x65 0x20 // 'e movie ' 0x66 0x6F 0x72 0x77 0x61 0x72 0x64 0x20 // 'forward ' 0x69 0x6E 0x20 0x74 0x69 0x6D 0x65 0x2E // 'in time.' 0x0D 0x0A 0x2D 0x2D 0x6F 0x72 0x2D 0x2D // '??--or--' 0x0D 0x0A 0x49 0x66 0x20 0x79 0x6F 0x75 // '??If you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 0x68 // ' want th' 0x65 0x20 0x61 0x63 0x74 0x6F 0x72 0x20 // 'e actor ' 0x74 0x6F 0x20 0x61 0x72 0x72 0x69 0x76 // 'to arriv' 0x65 0x20 0x65 0x61 0x72 0x6C 0x69 0x65 // 'e earlie' 0x72 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B // 'r, click' 0x20 0x74 0x68 0x65 0x20 0x42 0x61 0x63 // ' the Bac' 0x6B 0x20 0x41 0x72 0x72 0x6F 0x77 0x20 // 'k Arrow ' 0x74 0x6F 0x20 0x6D 0x6F 0x76 0x65 0x20 // 'to move ' 0x74 0x68 0x65 0x20 0x6D 0x6F 0x76 0x69 // 'the movi' 0x65 0x20 0x62 0x61 0x63 0x6B 0x77 0x61 // 'e backwa' 0x72 0x64 0x73 0x20 0x69 0x6E 0x20 0x74 // 'rds in t' 0x69 0x6D 0x65 0x2E 0x20 0x20 0x43 0x6C // 'ime. Cl' 0x69 0x63 0x6B 0x20 0x61 0x6E 0x79 0x77 // 'ick anyw' 0x68 0x65 0x72 0x65 0x20 0x74 0x6F 0x20 // 'here to ' 0x22 0x75 0x6E 0x66 0x72 0x65 0x65 0x7A // '"unfreez' 0x65 0x22 0x20 0x74 0x68 0x65 0x20 0x61 // 'e" the a' 0x63 0x74 0x6F 0x72 0x2E // 'ctor.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1C= ktpcBook10Tips15 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1C, __HELP_NAME("(L) Tips Pg 15")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1C, __HELP_NAME("(L) Tips Pg 15")) __HELP_PACK2 BO OSK LONG kgobHelpBookPageLeft kgobHelpBookPageLeft 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1C, 0x0) GST(0) ITEM "kgobHelpBookPageLeft" ITEM "ktpcBook10Tips15" ITEM "kgobHelpBookPageLeft" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1C, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA8 0x01 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_3=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpActorsSquash __HELP_SYMBOL( STN "mbmpActorsSquash" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpActorActions __HELP_SYMBOL( STN "mbmpActorActions" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0F 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x31 0x00 0x00 0x01 // '????1???' 0x01 0xF1 0x00 0x00 0x77 0x00 0x00 0x01 // '???w???' 0x01 0xF6 0x00 0x00 0xB3 0x00 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0xB6 0x00 0x00 0x01 // '???????' 0x01 0xF6 0x00 0x00 0x40 0x01 0x00 0x01 // '???@???' 0x01 0x00 0x00 0x00 0x41 0x01 0x00 0x01 // '????A???' 0x01 0xF6 0x00 0x00 0x65 0x01 0x00 0x01 // '???e???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x2F 0x00 0x00 0x03 // '???/???' 0x00 0x00 0x00 0x00 0x31 0x00 0x00 0x80 // '????1??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x14 0x00 0x00 0x00 0xB6 0x00 0x00 0x82 // '??????' 0x05 0x00 0x00 0x00 0xB3 0x00 0x00 0xC0 // '??????' 0x01 0x00 0x00 0x00 0x40 0x01 0x00 0xC0 // '????@??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x73 0x71 0x75 // '??To squ' 0x61 0x73 0x68 0x20 0x6F 0x72 0x20 0x73 // 'ash or s' 0x74 0x72 0x65 0x74 0x63 0x68 0x20 0x61 // 'tretch a' 0x6E 0x20 0x61 0x63 0x74 0x6F 0x72 0x2C // 'n actor,' 0x20 0x70 0x72 0x6F 0x70 0x2C 0x20 0x6F // ' prop, o' 0x72 0x20 0x33 0x44 0x20 0x77 0x6F 0x72 // 'r 3D wor' 0x64 0x0D 0x0A 0x95 0x09 0x49 0x66 0x20 // 'd???If ' 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 // 'you want' 0x20 0x74 0x6F 0x20 0x73 0x68 0x72 0x69 // ' to shri' 0x6E 0x6B 0x20 0x6F 0x72 0x20 0x73 0x74 // 'nk or st' 0x72 0x65 0x74 0x63 0x68 0x20 0x61 0x6E // 'retch an' 0x20 0x61 0x63 0x74 0x6F 0x72 0x2C 0x20 // ' actor, ' 0x70 0x72 0x6F 0x70 0x2C 0x20 0x6F 0x72 // 'prop, or' 0x20 0x33 0x44 0x20 0x77 0x6F 0x72 0x64 // ' 3D word' 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 // ', click ' 0x20 0x41 0x63 0x74 0x6F 0x72 0x73 0x20 // ' Actors ' 0x26 0x20 0x50 0x72 0x6F 0x70 0x73 0x2C // '& Props,' 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 0x4D // ' click M' 0x6F 0x72 0x65 0x20 0x54 0x6F 0x6F 0x6C // 'ore Tool' 0x73 0x2C 0x20 0x74 0x68 0x65 0x6E 0x20 // 's, then ' 0x75 0x73 0x65 0x20 0x53 0x71 0x75 0x61 // 'use Squa' 0x73 0x68 0x20 0x26 0x20 0x53 0x74 0x72 // 'sh & Str' 0x65 0x74 0x63 0x68 0x2D 0x01 0x0D 0x0A // 'etch-???' 0x95 0x09 0x49 0x66 0x20 0x79 0x6F 0x75 // '?If you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F // ' want to' 0x20 0x77 0x61 0x74 0x63 0x68 0x20 0x61 // ' watch a' 0x73 0x20 0x61 0x6E 0x20 0x61 0x63 0x74 // 's an act' 0x6F 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 // 'or, prop' 0x2C 0x20 0x6F 0x72 0x20 0x33 0x44 0x20 // ', or 3D ' 0x77 0x6F 0x72 0x64 0x20 0x73 0x68 0x72 // 'word shr' 0x69 0x6E 0x6B 0x73 0x20 0x6F 0x72 0x20 // 'inks or ' 0x73 0x74 0x72 0x65 0x74 0x63 0x68 0x65 // 'stretche' 0x73 0x20 0x62 0x65 0x66 0x6F 0x72 0x65 // 's before' 0x20 0x79 0x6F 0x75 0x72 0x20 0x76 0x65 // ' your ve' 0x72 0x79 0x20 0x65 0x79 0x65 0x73 0x2C // 'ry eyes,' 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 0x41 // ' click A' 0x63 0x74 0x6F 0x72 0x73 0x20 0x26 0x20 // 'ctors & ' 0x50 0x72 0x6F 0x70 0x73 0x2C 0x20 0x74 // 'Props, t' 0x68 0x65 0x6E 0x20 0x63 0x6C 0x69 0x63 // 'hen clic' 0x6B 0x20 0x41 0x63 0x74 0x69 0x6F 0x6E // 'k Action' 0x73 0x2D 0x01 0x2E 0x20 0x20 0x43 0x68 // 's-?. Ch' 0x6F 0x6F 0x73 0x65 0x20 0x74 0x68 0x65 // 'oose the' 0x20 0x47 0x72 0x6F 0x77 0x20 0x6F 0x72 // ' Grow or' 0x20 0x53 0x68 0x72 0x69 0x6E 0x6B 0x20 // ' Shrink ' 0x61 0x63 0x74 0x69 0x6F 0x6E 0x2E // 'action.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1E= ktpcBook10Tips16 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1E, __HELP_NAME("(L) Tips Pg 16")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1E, __HELP_NAME("(L) Tips Pg 16")) __HELP_PACK2 BO OSK LONG kgobHelpBookPageLeft kgobHelpBookPageLeft 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1E, 0x0) GST(0) ITEM "kgobHelpBookPageLeft" ITEM "ktpcBook10Tips16" ITEM "kgobHelpBookPageLeft" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1E, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA8 0x01 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_D=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSoundsEfxBrowser __HELP_SYMBOL( STN "mbmpSoundsEfxBrowser" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSoundsMicBrowser __HELP_SYMBOL( STN "mbmpSoundsMicBrowser" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpRecordMic __HELP_SYMBOL( STN "mbmpRecordMic" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_4=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x1C 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x4C 0x00 0x00 0x01 // '????L???' 0x01 0xF6 0x00 0x00 0x5A 0x00 0x00 0x01 // '???Z???' 0x01 0xF6 0x00 0x00 0x5F 0x00 0x00 0x01 // '???_???' 0x01 0x00 0x00 0x00 0x60 0x00 0x00 0x01 // '????`???' 0x01 0xF6 0x00 0x00 0x81 0x00 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0x70 0x01 0x00 0x01 // '????p???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x1B 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x84 0x00 0x00 0x03 // '??????' 0x0A 0x00 0x00 0xFD 0xAE 0x00 0x00 0x03 // '??????' 0x0F 0x00 0x00 0xFD 0x13 0x01 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x2D 0x01 0x00 0x03 // '???-???' 0x00 0x00 0x00 0x00 0x4B 0x00 0x00 0x80 // '????K??' 0x00 0x00 0x03 0x00 0x6A 0x00 0x00 0x80 // '????j??' 0x00 0x00 0x02 0x00 0x84 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0xAE 0x00 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0x13 0x01 0x00 0x80 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x1B 0x00 0x00 0x82 // '???????' 0x0F 0x00 0x00 0x00 0x4B 0x00 0x00 0x82 // '????K??' 0x0A 0x00 0x00 0x00 0x84 0x00 0x00 0x82 // '??????' 0x05 0x00 0x00 0x00 0xAE 0x00 0x00 0x82 // '??????' 0x0A 0x00 0x00 0x00 0x13 0x01 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x2F 0x01 0x00 0x82 // '????/??' 0x00 0x00 0x00 0x00 0x4B 0x00 0x00 0xC0 // '????K??' 0x01 0x00 0x00 0x00 0x5F 0x00 0x00 0xC0 // '????_??' 0x02 0x00 0x00 0x00 0x81 0x00 0x00 0xC0 // '??????' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x72 0x65 0x63 // '??To rec' 0x6F 0x72 0x64 0x20 0x79 0x6F 0x75 0x72 // 'ord your' 0x20 0x6F 0x77 0x6E 0x20 0x73 0x6F 0x75 // ' own sou' 0x6E 0x64 0x73 0x0D 0x0A 0x31 0x09 0x43 // 'nds??1?C' 0x68 0x6F 0x6F 0x73 0x65 0x20 0x74 0x68 // 'hoose th' 0x65 0x20 0x74 0x79 0x70 0x65 0x20 0x6F // 'e type o' 0x66 0x20 0x73 0x6F 0x75 0x6E 0x64 0x20 // 'f sound ' 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 // 'you want' 0x20 0x74 0x6F 0x20 0x72 0x65 0x63 0x6F // ' to reco' 0x72 0x64 0x3A 0x0D 0x0A 0x01 0x2D 0x53 // 'rd:???-S' 0x6F 0x75 0x6E 0x64 0x20 0x45 0x66 0x66 // 'ound Eff' 0x65 0x63 0x74 0x73 0x20 0x6F 0x72 0x20 // 'ects or ' 0x09 0x01 0x2D 0x53 0x70 0x65 0x65 0x63 // '??-Speec' 0x68 0x2E 0x0D 0x0A 0x32 0x09 0x43 0x6C // 'h.??2?Cl' 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 // 'ick the ' 0x6D 0x69 0x63 0x72 0x6F 0x70 0x68 0x6F // 'micropho' 0x6E 0x65 0x2D 0x01 0x0D 0x0A 0x54 0x6F // 'ne-???To' 0x20 0x72 0x65 0x63 0x6F 0x72 0x64 0x20 // ' record ' 0x79 0x6F 0x75 0x72 0x20 0x76 0x6F 0x69 // 'your voi' 0x63 0x65 0x20 0x61 0x74 0x20 0x74 0x68 // 'ce at th' 0x65 0x20 0x62 0x65 0x73 0x74 0x20 0x71 // 'e best q' 0x75 0x61 0x6C 0x69 0x74 0x79 0x0D 0x0A // 'uality??' 0x95 0x09 0x55 0x73 0x65 0x20 0x74 0x68 // '?Use th' 0x65 0x20 0x6D 0x69 0x63 0x72 0x6F 0x70 // 'e microp' 0x68 0x6F 0x6E 0x65 0x20 0x66 0x6F 0x75 // 'hone fou' 0x6E 0x64 0x20 0x69 0x6E 0x20 0x53 0x6F // 'nd in So' 0x75 0x6E 0x64 0x20 0x45 0x66 0x66 0x65 // 'und Effe' 0x63 0x74 0x73 0x20 0x72 0x61 0x74 0x68 // 'cts rath' 0x65 0x72 0x20 0x74 0x68 0x61 0x6E 0x20 // 'er than ' 0x53 0x70 0x65 0x65 0x63 0x68 0x20 0x28 // 'Speech (' 0x74 0x68 0x69 0x73 0x20 0x77 0x69 0x6C // 'this wil' 0x6C 0x20 0x74 0x61 0x6B 0x65 0x20 0x75 // 'l take u' 0x70 0x20 0x6D 0x6F 0x72 0x65 0x20 0x64 // 'p more d' 0x69 0x73 0x6B 0x20 0x73 0x70 0x61 0x63 // 'isk spac' 0x65 0x29 0x2E 0x0D 0x0A 0x54 0x6F 0x20 // 'e).??To ' 0x61 0x64 0x64 0x20 0x79 0x6F 0x75 0x72 // 'add your' 0x20 0x66 0x61 0x76 0x6F 0x72 0x69 0x74 // ' favorit' 0x65 0x20 0x6D 0x75 0x73 0x69 0x63 0x0D // 'e music?' 0x0A 0x95 0x09 0x55 0x73 0x65 0x20 0x74 // '??Use t' 0x68 0x65 0x20 0x53 0x6F 0x75 0x6E 0x64 // 'he Sound' 0x20 0x45 0x66 0x66 0x65 0x63 0x74 0x73 // ' Effects' 0x20 0x6D 0x69 0x63 0x72 0x6F 0x70 0x68 // ' microph' 0x6F 0x6E 0x65 0x20 0x61 0x6E 0x64 0x20 // 'one and ' 0x72 0x65 0x63 0x6F 0x72 0x64 0x20 0x66 // 'record f' 0x72 0x6F 0x6D 0x20 0x79 0x6F 0x75 0x72 // 'rom your' 0x20 0x62 0x6F 0x6F 0x6D 0x20 0x62 0x6F // ' boom bo' 0x78 0x2E // 'x.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_20= ktpcBook10Tips17 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_20, __HELP_NAME("(L) Tips Pg 17")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_20, __HELP_NAME("(L) Tips Pg 17")) __HELP_PACK2 BO OSK LONG kgobHelpBookPageLeft kgobHelpBookPageLeft 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_5=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_20, 0x0) GST(0) ITEM "kgobHelpBookPageLeft" ITEM "ktpcBook10Tips17" ITEM "kgobHelpBookPageLeft" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_5=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_20, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA8 0x01 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_B=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpPausesSound __HELP_SYMBOL( STN "mbmpPausesSound" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_5=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x15 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x8E 0x01 0x00 0x01 // '???????' 0x01 0xF6 0x00 0x00 0xD1 0x01 0x00 0x01 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x8E 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0xCF 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xFC 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x60 0x01 0x00 0x03 // '????`???' 0x0A 0x00 0x00 0xFD 0x8C 0x01 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x8E 0x00 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0xD1 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0xFE 0x00 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0x60 0x01 0x00 0x80 // '????`??' 0x00 0x00 0x00 0x00 0x8E 0x01 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x8E 0x00 0x00 0x82 // '??????' 0x0A 0x00 0x00 0x00 0xD1 0x00 0x00 0x82 // '??????' 0x05 0x00 0x00 0x00 0xFE 0x00 0x00 0x82 // '??????' 0x0A 0x00 0x00 0x00 0x60 0x01 0x00 0x82 // '????`??' 0x05 0x00 0x00 0x00 0x8E 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0xD1 0x01 0x00 0xC0 // '??????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_5=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x03 0x03 0x45 0x76 0x65 0x72 0x79 0x74 // '??Everyt' 0x69 0x6D 0x65 0x20 0x79 0x6F 0x75 0x20 // 'ime you ' 0x72 0x65 0x63 0x6F 0x72 0x64 0x20 0x6F // 'record o' 0x72 0x20 0x69 0x6D 0x70 0x6F 0x72 0x74 // 'r import' 0x20 0x61 0x20 0x73 0x6F 0x75 0x6E 0x64 // ' a sound' 0x2C 0x20 0x69 0x74 0x20 0x69 0x73 0x20 // ', it is ' 0x61 0x64 0x64 0x65 0x64 0x20 0x74 0x6F // 'added to' 0x20 0x74 0x68 0x65 0x20 0x53 0x6F 0x75 // ' the Sou' 0x6E 0x64 0x20 0x45 0x66 0x66 0x65 0x63 // 'nd Effec' 0x74 0x73 0x20 0x6F 0x72 0x20 0x53 0x70 // 'ts or Sp' 0x65 0x65 0x63 0x68 0x20 0x63 0x68 0x6F // 'eech cho' 0x69 0x63 0x65 0x73 0x2E 0x20 0x20 0x54 // 'ices. T' 0x6F 0x20 0x72 0x65 0x6D 0x6F 0x76 0x65 // 'o remove' 0x20 0x61 0x20 0x73 0x6F 0x75 0x6E 0x64 // ' a sound' 0x20 0x79 0x6F 0x75 0x20 0x68 0x61 0x76 // ' you hav' 0x65 0x20 0x72 0x65 0x63 0x6F 0x72 0x64 // 'e record' 0x65 0x64 0x20 0x6F 0x72 0x20 0x69 0x6D // 'ed or im' 0x70 0x6F 0x72 0x74 0x65 0x64 0x0D 0x0A // 'ported??' 0x95 0x09 0x53 0x65 0x6C 0x65 0x63 0x74 // '?Select' 0x20 0x74 0x68 0x65 0x20 0x73 0x6F 0x75 // ' the sou' 0x6E 0x64 0x20 0x79 0x6F 0x75 0x20 0x77 // 'nd you w' 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 0x72 // 'ant to r' 0x65 0x6D 0x6F 0x76 0x65 0x2C 0x20 0x74 // 'emove, t' 0x68 0x65 0x6E 0x20 0x70 0x72 0x65 0x73 // 'hen pres' 0x73 0x20 0x74 0x68 0x65 0x20 0x44 0x65 // 's the De' 0x6C 0x65 0x74 0x65 0x20 0x6B 0x65 0x79 // 'lete key' 0x2E 0x0D 0x0A 0x54 0x6F 0x20 0x6D 0x61 // '.??To ma' 0x6B 0x65 0x20 0x74 0x77 0x6F 0x20 0x73 // 'ke two s' 0x6F 0x75 0x6E 0x64 0x73 0x20 0x70 0x6C // 'ounds pl' 0x61 0x79 0x20 0x6F 0x6E 0x65 0x20 0x61 // 'ay one a' 0x66 0x74 0x65 0x72 0x20 0x74 0x68 0x65 // 'fter the' 0x20 0x6F 0x74 0x68 0x65 0x72 0x0D 0x0A // ' other??' 0x95 0x09 0x41 0x74 0x74 0x61 0x63 0x68 // '?Attach' 0x20 0x74 0x68 0x65 0x20 0x66 0x69 0x72 // ' the fir' 0x73 0x74 0x20 0x73 0x6F 0x75 0x6E 0x64 // 'st sound' 0x2C 0x20 0x74 0x68 0x65 0x6E 0x20 0x68 // ', then h' 0x6F 0x6C 0x64 0x20 0x64 0x6F 0x77 0x6E // 'old down' 0x20 0x43 0x74 0x72 0x6C 0x20 0x61 0x73 // ' Ctrl as' 0x20 0x79 0x6F 0x75 0x20 0x61 0x74 0x74 // ' you att' 0x61 0x63 0x68 0x20 0x74 0x68 0x65 0x20 // 'ach the ' 0x73 0x65 0x63 0x6F 0x6E 0x64 0x20 0x73 // 'second s' 0x6F 0x75 0x6E 0x64 0x20 0x74 0x6F 0x20 // 'ound to ' 0x74 0x68 0x65 0x20 0x73 0x61 0x6D 0x65 // 'the same' 0x20 0x6F 0x62 0x6A 0x65 0x63 0x74 0x2E // ' object.' 0x0D 0x0A 0x54 0x6F 0x20 0x70 0x61 0x75 // '??To pau' 0x73 0x65 0x20 0x74 0x68 0x65 0x20 0x6D // 'se the m' 0x6F 0x76 0x69 0x65 0x20 0x75 0x6E 0x74 // 'ovie unt' 0x69 0x6C 0x20 0x61 0x20 0x73 0x6F 0x75 // 'il a sou' 0x6E 0x64 0x20 0x69 0x73 0x20 0x66 0x69 // 'nd is fi' 0x6E 0x69 0x73 0x68 0x65 0x64 0x0D 0x0A // 'nished??' 0x95 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 // '?Click ' 0x53 0x6F 0x75 0x6E 0x64 0x73 0x2C 0x20 // 'Sounds, ' 0x63 0x6C 0x69 0x63 0x6B 0x20 0x4D 0x6F // 'click Mo' 0x72 0x65 0x20 0x54 0x6F 0x6F 0x6C 0x73 // 're Tools' 0x2C 0x20 0x74 0x68 0x65 0x6E 0x20 0x63 // ', then c' 0x6C 0x69 0x63 0x6B 0x20 0x57 0x61 0x69 // 'lick Wai' 0x74 0x20 0x66 0x6F 0x72 0x20 0x53 0x6F // 't for So' 0x75 0x6E 0x64 0x20 0x74 0x6F 0x20 0x45 // 'und to E' 0x6E 0x64 0x2D 0x01 // 'nd-?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_22= ktpcBook10Tips18 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_22, __HELP_NAME("(L) Tips Pg 18")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_22, __HELP_NAME("(L) Tips Pg 18")) __HELP_PACK2 BO OSK LONG kgobHelpBookPageLeft kgobHelpBookPageLeft 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_9=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_22, 0x0) GST(0) ITEM "kgobHelpBookPageLeft" ITEM "ktpcBook10Tips18" ITEM "kgobHelpBookPageLeft" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_9=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_22, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA8 0x01 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_7=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_9, 0x0) AG(4) FREE ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSoundsListen __HELP_SYMBOL( STN "mbmpSoundsListen" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_9=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_9, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x19 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2B 0x00 0x00 0x01 // '????+???' 0x01 0xF6 0x00 0x00 0x7F 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xC5 0x00 0x00 0x01 // '???????' 0x01 0xF6 0x00 0x00 0xC7 0x00 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0x77 0x01 0x00 0x01 // '????w???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x2B 0x00 0x00 0x03 // '???+???' 0x00 0x00 0x00 0x00 0xC7 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xEF 0x00 0x00 0x03 // '??????' 0x0F 0x00 0x00 0xFD 0x38 0x01 0x00 0x03 // '???8???' 0x0A 0x00 0x00 0xFD 0x4B 0x01 0x00 0x03 // '???K???' 0x0F 0x00 0x00 0xFD 0x77 0x01 0x00 0x03 // '???w???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0x00 0x00 0x00 0x00 0x2B 0x00 0x00 0x80 // '????+??' 0x00 0x00 0x02 0x00 0xC7 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0xEF 0x00 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0x3A 0x01 0x00 0x80 // '????:??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x56 0x00 0x00 0x82 // '????V??' 0x0A 0x00 0x00 0x00 0xC7 0x00 0x00 0x82 // '??????' 0x05 0x00 0x00 0x00 0xEF 0x00 0x00 0x82 // '??????' 0x0A 0x00 0x00 0x00 0x3A 0x01 0x00 0x82 // '????:??' 0x05 0x00 0x00 0x00 0x4B 0x01 0x00 0x82 // '????K??' 0x00 0x00 0x00 0x00 0x7F 0x00 0x00 0xC0 // '???????' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_9=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_9, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x63 0x68 0x61 // '??To cha' 0x6E 0x67 0x65 0x20 0x74 0x68 0x65 0x20 // 'nge the ' 0x76 0x6F 0x6C 0x75 0x6D 0x65 0x20 0x6F // 'volume o' 0x66 0x20 0x69 0x6E 0x64 0x69 0x76 0x69 // 'f indivi' 0x64 0x75 0x61 0x6C 0x20 0x73 0x6F 0x75 // 'dual sou' 0x6E 0x64 0x73 0x0D 0x0A 0x31 0x09 0x47 // 'nds??1?G' 0x6F 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 // 'o to the' 0x20 0x66 0x72 0x61 0x6D 0x65 0x20 0x77 // ' frame w' 0x68 0x65 0x72 0x65 0x20 0x74 0x68 0x65 // 'here the' 0x20 0x73 0x6F 0x75 0x6E 0x64 0x20 0x73 // ' sound s' 0x74 0x61 0x72 0x74 0x73 0x2E 0x0D 0x0A // 'tarts.??' 0x32 0x20 0x20 0x43 0x6C 0x69 0x63 0x6B // '2 Click' 0x20 0x53 0x6F 0x75 0x6E 0x64 0x73 0x2C // ' Sounds,' 0x20 0x74 0x68 0x65 0x6E 0x20 0x63 0x6C // ' then cl' 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 // 'ick the ' 0x4C 0x69 0x73 0x74 0x65 0x6E 0x65 0x72 // 'Listener' 0x2D 0x01 0x0D 0x0A 0x33 0x09 0x43 0x6C // '-???3?Cl' 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 // 'ick the ' 0x33 0x44 0x20 0x6F 0x62 0x6A 0x65 0x63 // '3D objec' 0x74 0x20 0x6F 0x72 0x20 0x62 0x61 0x63 // 't or bac' 0x6B 0x67 0x72 0x6F 0x75 0x6E 0x64 0x20 // 'kground ' 0x77 0x68 0x6F 0x73 0x65 0x20 0x73 0x6F // 'whose so' 0x75 0x6E 0x64 0x20 0x79 0x6F 0x75 0x20 // 'und you ' 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 // 'want to ' 0x61 0x64 0x6A 0x75 0x73 0x74 0x2E 0x0D // 'adjust.?' 0x0A 0x54 0x6F 0x20 0x63 0x75 0x74 0x2C // '?To cut,' 0x20 0x63 0x6F 0x70 0x79 0x2C 0x20 0x6F // ' copy, o' 0x72 0x20 0x6D 0x6F 0x76 0x65 0x20 0x61 // 'r move a' 0x20 0x77 0x68 0x6F 0x6C 0x65 0x20 0x77 // ' whole w' 0x6F 0x72 0x64 0x20 0x62 0x6F 0x78 0x0D // 'ord box?' 0x0A 0x95 0x09 0x4D 0x61 0x6B 0x65 0x20 // '??Make ' 0x73 0x75 0x72 0x65 0x20 0x79 0x6F 0x75 // 'sure you' 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 0x6F // ' click o' 0x6E 0x65 0x20 0x6F 0x66 0x20 0x74 0x68 // 'ne of th' 0x65 0x20 0x77 0x6F 0x72 0x64 0x20 0x62 // 'e word b' 0x6F 0x78 0x20 0x65 0x64 0x67 0x65 0x73 // 'ox edges' 0x2C 0x20 0x4E 0x4F 0x54 0x20 0x74 0x68 // ', NOT th' 0x65 0x20 0x77 0x6F 0x72 0x64 0x73 0x20 // 'e words ' 0x69 0x6E 0x73 0x69 0x64 0x65 0x20 0x69 // 'inside i' 0x74 0x2E 0x0D 0x0A 0x54 0x6F 0x20 0x63 // 't.??To c' 0x68 0x61 0x6E 0x67 0x65 0x20 0x77 0x6F // 'hange wo' 0x72 0x64 0x73 0x0D 0x0A 0x95 0x09 0x43 // 'rds???C' 0x6C 0x69 0x63 0x6B 0x20 0x57 0x6F 0x72 // 'lick Wor' 0x64 0x73 0x2C 0x20 0x74 0x68 0x65 0x6E // 'ds, then' 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 0x69 // ' click i' 0x6E 0x73 0x69 0x64 0x65 0x20 0x61 0x20 // 'nside a ' 0x77 0x6F 0x72 0x64 0x20 0x62 0x6F 0x78 // 'word box' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK ================================================ FILE: src/help/bktocbas.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ #undef __HELP_NAME #undef __HELP_SYMBOL #undef __HELP_PACK #undef __HELP_PACK2 #ifdef NO_HELP_NAMES #define __HELP_NAME(name) "" #else #define __HELP_NAME(name) name #endif #ifdef NO_HELP_SYMBOLS #define __HELP_SYMBOL(stuff) #else #define __HELP_SYMBOL(stuff) stuff #endif #ifdef PACK_HELP #define __HELP_PACK PACK #else #define __HELP_PACK #endif #ifdef HELP_SINGLE_CHUNK #define __HELP_PACK2 #else #define __HELP_PACK2 __HELP_PACK #endif SET _help_48544F50_0= ktpcBook1TOC #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("Book: (L) Table of contents ")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("Book: (L) Table of contents ")) __HELP_PACK2 BO OSK LONG kgobHelpBookPageLeft kgobHelpBookPageLeft 0x0 ktpcBook1TOC 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_0=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) GST(0) ITEM "kgobHelpBookPageLeft" ITEM "ktpcBook1TOC" ITEM "kgobHelpBookPageLeft" ITEM "" ITEM "ktpcBook1TOC" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_0=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA8 0x01 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) AG(4) ITEM LONG 0x2000004 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ITEM LONG 0x40000001 VAR BYTE 0x01 0xFF 0xFF 0xFF 0xFF // '?' ITEM LONG 0xC0000004 VAR LONG 'GOKD' _gobHelpSquishy 0xFFFFFFFF __HELP_SYMBOL( STN "_gobHelpSquishy" ) ITEM LONG 0x40000001 VAR BYTE 0x02 0xFF 0xFF 0xFF 0xFF // '?' ITEM LONG 0x40000001 VAR BYTE 0x03 0xFF 0xFF 0xFF 0xFF // '?' ITEM LONG 0x40000001 VAR BYTE 0x04 0xFF 0xFF 0xFF 0xFF // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_0=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x2E 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '.???????' 0x01 0x00 0x00 0x00 0xD6 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x4E 0x00 0x00 0x02 // '????N???' 0x00 0x00 0x00 0x00 0x58 0x00 0x00 0x02 // '????X???' 0x01 0x00 0x00 0x00 0x6D 0x00 0x00 0x02 // '????m???' 0x01 0x00 0x00 0x00 0xE8 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0xED 0x00 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0xD6 0x01 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0B 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x71 0x00 0x00 0x03 // '????q???' 0x0A 0x00 0x00 0xFD 0x7B 0x00 0x00 0x03 // '???{???' 0x00 0x00 0x00 0x00 0xED 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xF5 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x7B 0x01 0x00 0x03 // '????{???' 0x0A 0x00 0x00 0xFD 0x82 0x01 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x05 // '????????' 0x01 0x00 0x00 0x00 0x0B 0x00 0x00 0x05 // '????????' 0x00 0x00 0x00 0x00 0x6F 0x00 0x00 0x05 // '????o???' 0x02 0x00 0x00 0x00 0x7B 0x00 0x00 0x05 // '????{???' 0x00 0x00 0x00 0x00 0xEA 0x00 0x00 0x05 // '???????' 0x01 0x00 0x00 0x00 0xF5 0x00 0x00 0x05 // '???????' 0x00 0x00 0x00 0x00 0x78 0x01 0x00 0x05 // '????x???' 0x02 0x00 0x00 0x00 0x82 0x01 0x00 0x05 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x40 // '???????@' 0x02 0x00 0x00 0x00 0x0B 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x6F 0x00 0x00 0x40 // '????o??@' 0x04 0x00 0x00 0x00 0x7B 0x00 0x00 0x40 // '????{??@' 0x00 0x00 0x00 0x00 0xEA 0x00 0x00 0x40 // '??????@' 0x05 0x00 0x00 0x00 0xF5 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x78 0x01 0x00 0x40 // '????x??@' 0x06 0x00 0x00 0x00 0x82 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x0D 0x00 0x00 0x80 // '???????' 0x00 0x00 0x03 0x00 0x6F 0x00 0x00 0x80 // '????o??' 0x00 0x00 0x00 0x00 0x7D 0x00 0x00 0x80 // '????}??' 0x00 0x00 0x03 0x00 0xEA 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0xF7 0x00 0x00 0x80 // '??????' 0x00 0x00 0x03 0x00 0x78 0x01 0x00 0x80 // '????x??' 0x00 0x00 0x00 0x00 0x84 0x01 0x00 0x80 // '??????' 0x00 0x00 0x03 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x84 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x03 0x00 0x00 0x00 0x6F 0x00 0x00 0xC0 // '????o??' 0x03 0x00 0x00 0x00 0xEA 0x00 0x00 0xC0 // '??????' 0x03 0x00 0x00 0x00 0x78 0x01 0x00 0xC0 // '????x??' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_0=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) BYTE 0x03 0x03 0x01 0x20 0x42 0x61 0x73 0x69 // '??? Basi' 0x63 0x73 0x2E 0x2E 0x2E 0x0D 0x0A 0x46 // 'cs...??F' 0x69 0x6E 0x64 0x20 0x6F 0x75 0x74 0x20 // 'ind out ' 0x68 0x6F 0x77 0x20 0x74 0x6F 0x20 0x73 // 'how to s' 0x74 0x61 0x72 0x74 0x20 0x61 0x20 0x6E // 'tart a n' 0x65 0x77 0x20 0x6D 0x6F 0x76 0x69 0x65 // 'ew movie' 0x2C 0x20 0x6F 0x70 0x65 0x6E 0x20 0x61 // ', open a' 0x20 0x6D 0x6F 0x76 0x69 0x65 0x2C 0x20 // ' movie, ' 0x73 0x61 0x76 0x65 0x20 0x79 0x6F 0x75 // 'save you' 0x72 0x20 0x77 0x6F 0x72 0x6B 0x2C 0x20 // 'r work, ' 0x67 0x65 0x74 0x20 0x68 0x65 0x6C 0x70 // 'get help' 0x2C 0x20 0x75 0x73 0x65 0x20 0x74 0x68 // ', use th' 0x65 0x20 0x6D 0x61 0x70 0x2C 0x20 0x6F // 'e map, o' 0x72 0x20 0x71 0x75 0x69 0x74 0x2E 0x0D // 'r quit.?' 0x0A 0x01 0x09 0x20 0x48 0x6F 0x77 0x20 // '??? How ' 0x54 0x6F 0x2E 0x2E 0x2E 0x0D 0x0A 0x43 // 'To...??C' 0x68 0x6F 0x6F 0x73 0x65 0x20 0x61 0x20 // 'hoose a ' 0x63 0x61 0x74 0x65 0x67 0x6F 0x72 0x79 // 'category' 0x2C 0x20 0x74 0x68 0x65 0x6E 0x20 0x63 // ', then c' 0x68 0x6F 0x6F 0x73 0x65 0x20 0x74 0x68 // 'hoose th' 0x65 0x20 0x74 0x61 0x73 0x6B 0x20 0x79 // 'e task y' 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 // 'ou want ' 0x68 0x65 0x6C 0x70 0x20 0x77 0x69 0x74 // 'help wit' 0x68 0x2E 0x20 0x20 0x49 0x27 0x6C 0x6C // 'h. I'll' 0x20 0x67 0x75 0x69 0x64 0x65 0x20 0x79 // ' guide y' 0x6F 0x75 0x20 0x74 0x68 0x72 0x6F 0x75 // 'ou throu' 0x67 0x68 0x20 0x65 0x61 0x63 0x68 0x20 // 'gh each ' 0x74 0x61 0x73 0x6B 0x20 0x73 0x74 0x65 // 'task ste' 0x70 0x2D 0x62 0x79 0x2D 0x73 0x74 0x65 // 'p-by-ste' 0x70 0x2E 0x0D 0x0A 0x01 0x20 0x20 0x54 // 'p.??? T' 0x6F 0x6F 0x6C 0x73 0x2E 0x2E 0x2E 0x0D // 'ools...?' 0x0A 0x53 0x68 0x6F 0x77 0x73 0x20 0x79 // '?Shows y' 0x6F 0x75 0x20 0x61 0x6C 0x6C 0x20 0x74 // 'ou all t' 0x68 0x65 0x20 0x74 0x6F 0x6F 0x6C 0x73 // 'he tools' 0x20 0x79 0x6F 0x75 0x20 0x63 0x61 0x6E // ' you can' 0x20 0x75 0x73 0x65 0x20 0x74 0x6F 0x20 // ' use to ' 0x63 0x72 0x65 0x61 0x74 0x65 0x20 0x61 // 'create a' 0x20 0x67 0x72 0x65 0x61 0x74 0x20 0x6D // ' great m' 0x6F 0x76 0x69 0x65 0x2E 0x20 0x20 0x54 // 'ovie. T' 0x6F 0x20 0x66 0x69 0x6E 0x64 0x20 0x6F // 'o find o' 0x75 0x74 0x20 0x6D 0x6F 0x72 0x65 0x2C // 'ut more,' 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 0x74 // ' click t' 0x68 0x65 0x20 0x70 0x69 0x63 0x74 0x75 // 'he pictu' 0x72 0x65 0x20 0x6F 0x66 0x20 0x74 0x68 // 're of th' 0x65 0x20 0x74 0x6F 0x6F 0x6C 0x20 0x79 // 'e tool y' 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 // 'ou want ' 0x68 0x65 0x6C 0x70 0x20 0x6F 0x6E 0x2E // 'help on.' 0x0D 0x0A 0x01 0x20 0x20 0x54 0x69 0x70 // '??? Tip' 0x73 0x2E 0x2E 0x2E 0x0D 0x0A 0x46 0x65 // 's...??Fe' 0x61 0x74 0x75 0x72 0x69 0x6E 0x67 0x20 // 'aturing ' 0x6D 0x79 0x20 0x70 0x65 0x72 0x73 0x6F // 'my perso' 0x6E 0x61 0x6C 0x20 0x66 0x61 0x76 0x6F // 'nal favo' 0x72 0x69 0x74 0x65 0x73 0x2E 0x20 0x20 // 'rites. ' 0x59 0x6F 0x75 0x27 0x6C 0x6C 0x20 0x61 // 'You'll a' 0x6C 0x73 0x6F 0x20 0x73 0x65 0x65 0x20 // 'lso see ' 0x61 0x20 0x6C 0x69 0x73 0x74 0x20 0x6F // 'a list o' 0x66 0x20 0x61 0x6C 0x6C 0x20 0x74 0x68 // 'f all th' 0x65 0x20 0x73 0x68 0x6F 0x72 0x74 0x63 // 'e shortc' 0x75 0x74 0x20 0x6B 0x65 0x79 0x73 0x21 // 'ut keys!' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2= ktpcBook2Basics #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2, __HELP_NAME("(L) - basics pg 1")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2, __HELP_NAME("(L) - basics pg 1")) __HELP_PACK2 BO OSK LONG kgobHelpBookPageLeft kgobHelpBookPageLeft 0x0 kidHelpBookBasics 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2, 0x0) GST(0) ITEM "kgobHelpBookPageLeft" ITEM "ktpcBook2Basics" ITEM "kgobHelpBookPageLeft" ITEM "" ITEM "kidHelpBookBasics" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA8 0x01 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) AG(4) ITEM LONG 0x2000004 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ITEM LONG 0x40000001 VAR BYTE 3 LONG kidBasics03 __HELP_SYMBOL( STN "kidBasics03" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG kidBasics04 __HELP_SYMBOL( STN "kidBasics04" ) ITEM LONG 0xC0000007 VAR LONG 'GOKD' _gobHelpSquishy 0xFFFFFFFF __HELP_SYMBOL( STN "_gobHelpSquishy" ) ITEM LONG 0x40000001 VAR BYTE 5 LONG kidBasics05 __HELP_SYMBOL( STN "kidBasics05" ) ITEM LONG 0x40000001 VAR BYTE 6 LONG kidBasics06 __HELP_SYMBOL( STN "kidBasics06" ) ITEM LONG 0x40000001 VAR BYTE 7 LONG kidBasics07 __HELP_SYMBOL( STN "kidBasics07" ) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG kidBasics01 __HELP_SYMBOL( STN "kidBasics01" ) ITEM LONG 0x40000001 VAR BYTE 2 LONG kidBasics02 __HELP_SYMBOL( STN "kidBasics02" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_3=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x3C 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '???' 0x01 0x00 0x00 0x00 0x42 0x00 0x00 0x02 // '????B???' 0x00 0x00 0x00 0x00 0x7A 0x00 0x00 0x02 // '????z???' 0x01 0x00 0x00 0x00 0x7C 0x00 0x00 0x02 // '????|???' 0x00 0x00 0x00 0x00 0x7F 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x8E 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0xCB 0x00 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0xD1 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0xED 0x00 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0xFF 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0x00 0x01 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0C 0x01 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x0E 0x01 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x50 0x01 0x00 0x02 // '????P???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x35 0x00 0x00 0x03 // '???5???' 0x00 0x00 0x00 0x00 0x3A 0x00 0x00 0x03 // '????:???' 0x0F 0x00 0x00 0xFD 0x7A 0x00 0x00 0x03 // '???z???' 0x0A 0x00 0x00 0xFD 0x7C 0x00 0x00 0x03 // '???|???' 0x00 0x00 0x00 0x00 0x7F 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0xC8 0x00 0x00 0x03 // '??????' 0x0A 0x00 0x00 0xFD 0xCB 0x00 0x00 0x03 // '??????' 0x0F 0x00 0x00 0xFD 0x0E 0x01 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x50 0x01 0x00 0x03 // '????P???' 0x00 0x00 0x00 0x00 0x37 0x00 0x00 0x40 // '????7??@' 0x08 0x00 0x00 0x00 0x7A 0x00 0x00 0x40 // '????z??@' 0x00 0x00 0x00 0x00 0x7C 0x00 0x00 0x40 // '????|??@' 0x06 0x00 0x00 0x00 0xC6 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xC8 0x00 0x00 0x40 // '??????@' 0x03 0x00 0x00 0x00 0x0C 0x01 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x0E 0x01 0x00 0x40 // '???????@' 0x02 0x00 0x00 0x00 0x50 0x01 0x00 0x40 // '????P??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x0A 0x00 0x00 0x00 0x37 0x00 0x00 0xC0 // '????7??' 0x05 0x00 0x00 0x00 0x7C 0x00 0x00 0xC0 // '????|??' 0x04 0x00 0x00 0x00 0xC8 0x00 0x00 0xC0 // '??????' 0x09 0x00 0x00 0x00 0x0E 0x01 0x00 0xC0 // '???????' 0x0A 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) BYTE 0x03 0x03 0x57 0x6F 0x72 0x64 0x73 0x97 // '??Words' 0x63 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 // 'click th' 0x65 0x20 0x70 0x69 0x63 0x74 0x75 0x72 // 'e pictur' 0x65 0x20 0x6F 0x66 0x20 0x74 0x68 0x65 // 'e of the' 0x20 0x74 0x6F 0x6F 0x6C 0x20 0x79 0x6F // ' tool yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 0x68 // 'u want h' 0x65 0x6C 0x70 0x20 0x6F 0x6E 0x2E 0x0D // 'elp on.?' 0x0A 0x01 0x09 0x09 0x57 0x6F 0x72 0x64 // '????Word' 0x20 0x42 0x6F 0x78 0x2E 0x2E 0x2E 0x2E // ' Box....' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x61 0x64 0x64 0x20 0x77 0x6F // '..add wo' 0x72 0x64 0x73 0x20 0x6F 0x72 0x20 0x63 // 'rds or c' 0x72 0x65 0x64 0x69 0x74 0x73 0x20 0x74 // 'redits t' 0x6F 0x20 0x79 0x6F 0x75 0x72 0x20 0x6D // 'o your m' 0x6F 0x76 0x69 0x65 0x0D 0x0A 0x01 0x09 // 'ovie????' 0x09 0x49 0x6E 0x73 0x65 0x72 0x74 0x69 // '?Inserti' 0x6F 0x6E 0x20 0x50 0x6F 0x69 0x6E 0x74 // 'on Point' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x6D 0x6F 0x76 // '.....mov' 0x65 0x2C 0x20 0x72 0x65 0x73 0x69 0x7A // 'e, resiz' 0x65 0x2C 0x20 0x6F 0x72 0x20 0x63 0x68 // 'e, or ch' 0x61 0x6E 0x67 0x65 0x20 0x77 0x6F 0x72 // 'ange wor' 0x64 0x73 0x20 0x69 0x6E 0x20 0x61 0x20 // 'ds in a ' 0x77 0x6F 0x72 0x64 0x20 0x62 0x6F 0x78 // 'word box' 0x0D 0x0A 0x01 0x09 0x09 0x4C 0x65 0x74 // '?????Let' 0x74 0x65 0x72 0x73 0x2E 0x2E 0x2E 0x2E // 'ters....' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x63 0x68 // '......ch' 0x61 0x6E 0x67 0x65 0x20 0x74 0x68 0x65 // 'ange the' 0x20 0x77 0x61 0x79 0x20 0x79 0x6F 0x75 // ' way you' 0x72 0x20 0x6C 0x65 0x74 0x74 0x65 0x72 // 'r letter' 0x73 0x20 0x6C 0x6F 0x6F 0x6B 0x0D 0x0A // 's look??' 0x01 0x09 0x09 0x53 0x74 0x79 0x6C 0x65 // '???Style' 0x73 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // 's.......' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x6D 0x61 // '......ma' 0x6B 0x65 0x20 0x6C 0x65 0x74 0x74 0x65 // 'ke lette' 0x72 0x73 0x20 0x20 0x62 0x6F 0x6C 0x64 // 'rs bold' 0x20 0x6F 0x72 0x20 0x69 0x74 0x61 0x6C // ' or ital' 0x69 0x63 // 'ic' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_F= ktpcBookWordTools2 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_F, __HELP_NAME("(L) Word Tools Pg 2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_F, __HELP_NAME("(L) Word Tools Pg 2")) __HELP_PACK2 BO OSK LONG kgobHelpBookPageLeft kgobHelpBookPageLeft 0x0 ktpcBookToolTopics 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_11=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_F, 0x0) GST(0) ITEM "kgobHelpBookPageLeft" ITEM "ktpcBookWordTools2" ITEM "kgobHelpBookPageLeft" ITEM "" ITEM "ktpcBookToolTopics" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_11=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_F, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA8 0x01 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_10=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_11, 0x0) AG(4) ITEM LONG 0x200000C VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ITEM LONG 0x40000001 VAR BYTE 2 LONG thLetterColor __HELP_SYMBOL( STN "thLetterColor" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpTextsFontSize __HELP_SYMBOL( STN "mbmpTextsFontSize" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG thBackground_Color __HELP_SYMBOL( STN "thBackground_Color" ) FREE ITEM LONG 0x40000001 VAR BYTE 4 LONG thScrolling_NonScrolling __HELP_SYMBOL( STN "thScrolling_NonScrolling" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpTextsFontColor __HELP_SYMBOL( STN "mbmpTextsFontColor" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpTextsBkgdColor __HELP_SYMBOL( STN "mbmpTextsBkgdColor" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG thLetterSize __HELP_SYMBOL( STN "thLetterSize" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpTextsScrollType __HELP_SYMBOL( STN "mbmpTextsScrollType" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_11=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_11, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x42 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // 'B???????' 0x01 0x00 0x00 0x00 0x37 0x00 0x00 0x01 // '????7???' 0x00 0x00 0x00 0x00 0x3A 0x00 0x00 0x01 // '????:???' 0x01 0x00 0x00 0x00 0x45 0x00 0x00 0x01 // '????E???' 0x00 0x00 0x00 0x00 0x7B 0x00 0x00 0x01 // '????{???' 0x01 0x00 0x00 0x00 0x87 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0xAF 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xB1 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0xB4 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xC4 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x02 0x01 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x04 0x01 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x07 0x01 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1C 0x01 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x21 0x01 0x00 0x01 // '????!???' 0x01 0x00 0x00 0x00 0x30 0x01 0x00 0x01 // '????0???' 0x00 0x00 0x00 0x00 0x3A 0x00 0x00 0x02 // '????:???' 0x01 0x00 0x00 0x00 0x45 0x00 0x00 0x02 // '????E???' 0x00 0x00 0x00 0x00 0x58 0x00 0x00 0x02 // '????X???' 0x01 0x00 0x00 0x00 0x62 0x00 0x00 0x02 // '????b???' 0x00 0x00 0x00 0x00 0x7B 0x00 0x00 0x02 // '????{???' 0x01 0x00 0x00 0x00 0x87 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0x99 0x00 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0xA3 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0xAF 0x00 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0xB1 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0xB4 0x00 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0xC4 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0xCE 0x00 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0xE2 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0xE3 0x00 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0xEE 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0xF2 0x00 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0xF3 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0xFF 0x00 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0x04 0x01 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x07 0x01 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x11 0x01 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x21 0x01 0x00 0x02 // '????!???' 0x00 0x00 0x00 0x00 0x22 0x01 0x00 0x02 // '????"???' 0x01 0x00 0x00 0x00 0x29 0x01 0x00 0x02 // '????)???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x35 0x00 0x00 0x03 // '???5???' 0x00 0x00 0x00 0x00 0x3A 0x00 0x00 0x03 // '????:???' 0x0F 0x00 0x00 0xFD 0x78 0x00 0x00 0x03 // '???x???' 0x00 0x00 0x00 0x00 0x7B 0x00 0x00 0x03 // '????{???' 0x0F 0x00 0x00 0xFD 0xAF 0x00 0x00 0x03 // '??????' 0x0A 0x00 0x00 0xFD 0xB1 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0xB4 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x02 0x01 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x04 0x01 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x5B 0x01 0x00 0x03 // '???[???' 0x00 0x00 0x00 0x00 0x37 0x00 0x00 0x40 // '????7??@' 0x09 0x00 0x00 0x00 0x76 0x00 0x00 0x40 // '????v??@' 0x00 0x00 0x00 0x00 0x78 0x00 0x00 0x40 // '????x??@' 0x02 0x00 0x00 0x00 0xAF 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xB1 0x00 0x00 0x40 // '??????@' 0x04 0x00 0x00 0x00 0x02 0x01 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x04 0x01 0x00 0x40 // '???????@' 0x06 0x00 0x00 0x00 0x5B 0x01 0x00 0x40 // '????[??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x0A 0x00 0x00 0x00 0x04 0x01 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x37 0x00 0x00 0xC0 // '????7??' 0x03 0x00 0x00 0x00 0x78 0x00 0x00 0xC0 // '????x??' 0x07 0x00 0x00 0x00 0xB1 0x00 0x00 0xC0 // '??????' 0x08 0x00 0x00 0x00 0x04 0x01 0x00 0xC0 // '???????' 0x0A 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_11=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_11, 0x0) BYTE 0x03 0x03 0x57 0x6F 0x72 0x64 0x73 0x97 // '??Words' 0x63 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 // 'click th' 0x65 0x20 0x70 0x69 0x63 0x74 0x75 0x72 // 'e pictur' 0x65 0x20 0x6F 0x66 0x20 0x74 0x68 0x65 // 'e of the' 0x20 0x74 0x6F 0x6F 0x6C 0x20 0x79 0x6F // ' tool yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 0x68 // 'u want h' 0x65 0x6C 0x70 0x20 0x6F 0x6E 0x2E 0x0D // 'elp on.?' 0x0A 0x01 0x09 0x09 0x4C 0x65 0x74 0x74 // '????Lett' 0x65 0x72 0x20 0x53 0x69 0x7A 0x65 0x2E // 'er Size.' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x63 0x68 0x61 0x6E 0x67 0x65 0x20 // '.change ' 0x74 0x68 0x65 0x20 0x73 0x69 0x7A 0x65 // 'the size' 0x20 0x6F 0x66 0x20 0x79 0x6F 0x75 0x72 // ' of your' 0x20 0x6C 0x65 0x74 0x74 0x65 0x72 0x73 // ' letters' 0x0D 0x0A 0x01 0x09 0x09 0x4C 0x65 0x74 // '?????Let' 0x74 0x65 0x72 0x20 0x43 0x6F 0x6C 0x6F // 'ter Colo' 0x72 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // 'r.......' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x63 0x68 0x61 0x6E 0x67 0x65 // '..change' 0x20 0x74 0x68 0x65 0x20 0x6C 0x65 0x74 // ' the let' 0x74 0x65 0x72 0x20 0x63 0x6F 0x6C 0x6F // 'ter colo' 0x72 0x0D 0x0A 0x01 0x09 0x09 0x42 0x61 // 'r?????Ba' 0x63 0x6B 0x67 0x72 0x6F 0x75 0x6E 0x64 // 'ckground' 0x20 0x43 0x6F 0x6C 0x6F 0x72 0x2E 0x2E // ' Color..' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x63 // '.......c' 0x68 0x61 0x6E 0x67 0x65 0x20 0x74 0x68 // 'hange th' 0x65 0x20 0x62 0x61 0x63 0x6B 0x67 0x72 // 'e backgr' 0x6F 0x75 0x6E 0x64 0x20 0x63 0x6F 0x6C // 'ound col' 0x6F 0x72 0x20 0x6F 0x66 0x20 0x61 0x20 // 'or of a ' 0x77 0x6F 0x72 0x64 0x20 0x09 0x09 0x09 // 'word ???' 0x09 0x09 0x09 0x09 0x09 0x09 0x09 0x09 // '????????' 0x09 0x62 0x6F 0x78 0x0D 0x0A 0x01 0x09 // '?box????' 0x09 0x53 0x63 0x72 0x6F 0x6C 0x6C 0x69 // '?Scrolli' 0x6E 0x67 0x20 0x6F 0x72 0x20 0x4E 0x6F // 'ng or No' 0x6E 0x2D 0x09 0x09 0x09 0x09 0x0D 0x0A // 'n-??????' 0x09 0x09 0x09 0x53 0x63 0x72 0x6F 0x6C // '???Scrol' 0x6C 0x69 0x6E 0x67 0x20 0x57 0x6F 0x72 // 'ling Wor' 0x64 0x73 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // 'ds......' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x6D 0x61 // '......ma' 0x6B 0x65 0x20 0x77 0x6F 0x72 0x64 0x73 // 'ke words' 0x20 0x73 0x63 0x72 0x6F 0x6C 0x6C 0x20 // ' scroll ' 0x6F 0x72 0x20 0x73 0x74 0x61 0x79 0x20 // 'or stay ' 0x73 0x74 0x69 0x6C 0x6C // 'still' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_10= ktpcBookWordTools3 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_10, __HELP_NAME("(L) Word Tools Pg 3")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_10, __HELP_NAME("(L) Word Tools Pg 3")) __HELP_PACK2 BO OSK LONG kgobHelpBookPageLeft kgobHelpBookPageLeft 0x0 ktpcBookToolTopics 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_10, 0x0) GST(0) ITEM "kgobHelpBookPageLeft" ITEM "ktpcBookWordTools3" ITEM "kgobHelpBookPageLeft" ITEM "" ITEM "ktpcBookToolTopics" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_10, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA8 0x01 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_4=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) AG(4) ITEM LONG 0x2000002 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpFONonScrolling __HELP_SYMBOL( STN "mbmpFONonScrolling" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG thScrolling __HELP_SYMBOL( STN "thScrolling" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpFOScrolling __HELP_SYMBOL( STN "mbmpFOScrolling" ) ITEM LONG 0x40000001 VAR BYTE 2 LONG thStory __HELP_SYMBOL( STN "thStory" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_3=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x1D 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x37 0x00 0x00 0x01 // '????7???' 0x00 0x00 0x00 0x00 0x3A 0x00 0x00 0x01 // '????:???' 0x01 0x00 0x00 0x00 0x43 0x00 0x00 0x01 // '????C???' 0x00 0x00 0x00 0x00 0xAD 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xAF 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0xB2 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xBF 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0xF2 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x3A 0x00 0x00 0x02 // '????:???' 0x01 0x00 0x00 0x00 0x43 0x00 0x00 0x02 // '????C???' 0x00 0x00 0x00 0x00 0xAD 0x00 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0xAF 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0xF2 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x35 0x00 0x00 0x03 // '???5???' 0x00 0x00 0x00 0x00 0x3A 0x00 0x00 0x03 // '????:???' 0x0F 0x00 0x00 0xFD 0xAD 0x00 0x00 0x03 // '??????' 0x0A 0x00 0x00 0xFD 0xAF 0x00 0x00 0x03 // '??????' 0x0F 0x00 0x00 0xFD 0xB2 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0xD0 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0xF2 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x37 0x00 0x00 0x40 // '????7??@' 0x03 0x00 0x00 0x00 0xAD 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xAF 0x00 0x00 0x40 // '??????@' 0x05 0x00 0x00 0x00 0xF2 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x0A 0x00 0x00 0x00 0x37 0x00 0x00 0xC0 // '????7??' 0x04 0x00 0x00 0x00 0xAF 0x00 0x00 0xC0 // '??????' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) BYTE 0x03 0x03 0x57 0x6F 0x72 0x64 0x73 0x97 // '??Words' 0x63 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 // 'click th' 0x65 0x20 0x70 0x69 0x63 0x74 0x75 0x72 // 'e pictur' 0x65 0x20 0x6F 0x66 0x20 0x74 0x68 0x65 // 'e of the' 0x20 0x74 0x6F 0x6F 0x6C 0x20 0x79 0x6F // ' tool yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 0x68 // 'u want h' 0x65 0x6C 0x70 0x20 0x6F 0x6E 0x2E 0x0D // 'elp on.?' 0x0A 0x01 0x09 0x09 0x53 0x63 0x72 0x6F // '????Scro' 0x6C 0x6C 0x69 0x6E 0x67 0x2E 0x2E 0x2E // 'lling...' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x6D 0x61 // '......ma' 0x6B 0x65 0x20 0x77 0x6F 0x72 0x64 0x73 // 'ke words' 0x20 0x69 0x6E 0x20 0x61 0x20 0x77 0x6F // ' in a wo' 0x72 0x64 0x20 0x62 0x6F 0x78 0x20 0x72 // 'rd box r' 0x6F 0x6C 0x6C 0x20 0x74 0x6F 0x20 0x74 // 'oll to t' 0x68 0x65 0x20 0x74 0x6F 0x70 0x20 0x09 // 'he top ?' 0x09 0x09 0x09 0x09 0x09 0x09 0x09 0x09 // '????????' 0x09 0x09 0x20 0x20 0x20 0x20 0x20 0x77 // '?? w' 0x68 0x65 0x6E 0x20 0x79 0x6F 0x75 0x20 // 'hen you ' 0x70 0x6C 0x61 0x79 0x20 0x79 0x6F 0x75 // 'play you' 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 0x0D // 'r movie?' 0x0A 0x01 0x09 0x09 0x4E 0x6F 0x6E 0x2D // '????Non-' 0x53 0x63 0x72 0x6F 0x6C 0x6C 0x69 0x6E // 'Scrollin' 0x67 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // 'g.......' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x6D 0x61 0x6B 0x65 0x20 0x77 0x6F // '.make wo' 0x72 0x64 0x73 0x20 0x69 0x6E 0x20 0x61 // 'rds in a' 0x20 0x77 0x6F 0x72 0x64 0x20 0x62 0x6F // ' word bo' 0x78 0x20 0x73 0x74 0x61 0x79 0x20 0x73 // 'x stay s' 0x74 0x69 0x6C 0x6C // 'till' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_12= ktpcBookMasterTools1 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_12, __HELP_NAME("(L) Master Tools Pg 1")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_12, __HELP_NAME("(L) Master Tools Pg 1")) __HELP_PACK2 BO OSK LONG kgobHelpBookPageLeft kgobHelpBookPageLeft 0x0 ktpcBookToolTopics 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_12, 0x0) GST(0) ITEM "kgobHelpBookPageLeft" ITEM "ktpcBookMasterTools1" ITEM "kgobHelpBookPageLeft" ITEM "" ITEM "ktpcBookToolTopics" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_12, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA8 0x01 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_7=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ITEM LONG 0x40000001 VAR BYTE 1 LONG thFrameSlider __HELP_SYMBOL( STN "thFrameSlider" ) ITEM LONG 0x40000001 VAR BYTE 2 LONG thSceneSlider __HELP_SYMBOL( STN "thSceneSlider" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpPlay __HELP_SYMBOL( STN "mbmpPlay" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG thPlayStop __HELP_SYMBOL( STN "thPlayStop" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpFrameSlider __HELP_SYMBOL( STN "mbmpFrameSlider" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSceneSlider __HELP_SYMBOL( STN "mbmpSceneSlider" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x24 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '$???????' 0x01 0x00 0x00 0x00 0x3C 0x00 0x00 0x01 // '??????@' 0x02 0x00 0x00 0x00 0x9D 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xA2 0x00 0x00 0x40 // '??????@' 0x03 0x00 0x00 0x00 0xF0 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xF4 0x00 0x00 0x40 // '??????@' 0x05 0x00 0x00 0x00 0x35 0x01 0x00 0x40 // '????5??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x0A 0x00 0x00 0x00 0x3E 0x00 0x00 0x82 // '????>??' 0x05 0x00 0x00 0x00 0x41 0x00 0x00 0x82 // '????A??' 0x0A 0x00 0x00 0x00 0xA2 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0xA5 0x00 0x00 0x82 // '??????' 0x0A 0x00 0x00 0x00 0xF2 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x3E 0x00 0x00 0xC0 // '????>??' 0x06 0x00 0x00 0x00 0xA2 0x00 0x00 0xC0 // '??????' 0x07 0x00 0x00 0x00 0xF4 0x00 0x00 0xC0 // '??????' 0x04 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) BYTE 0x03 0x03 0x4D 0x61 0x73 0x74 0x65 0x72 // '??Master' 0x20 0x54 0x6F 0x6F 0x6C 0x73 0x97 0x63 // ' Toolsc' 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 // 'lick the' 0x20 0x70 0x69 0x63 0x74 0x75 0x72 0x65 // ' picture' 0x20 0x6F 0x66 0x20 0x74 0x68 0x65 0x20 // ' of the ' 0x74 0x6F 0x6F 0x6C 0x20 0x79 0x6F 0x75 // 'tool you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x68 0x65 // ' want he' 0x6C 0x70 0x20 0x6F 0x6E 0x2E 0x0D 0x0A // 'lp on.??' 0x01 0x0D 0x0A 0x46 0x72 0x61 0x6D 0x65 // '???Frame' 0x20 0x53 0x6C 0x69 0x64 0x65 0x72 0x2E // ' Slider.' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x6D 0x6F // '......mo' 0x76 0x65 0x20 0x66 0x6F 0x72 0x77 0x61 // 've forwa' 0x72 0x64 0x20 0x6F 0x72 0x20 0x62 0x61 // 'rd or ba' 0x63 0x6B 0x20 0x69 0x6E 0x20 0x74 0x68 // 'ck in th' 0x65 0x20 0x63 0x75 0x72 0x72 0x65 0x6E // 'e curren' 0x74 0x20 0x73 0x63 0x65 0x6E 0x65 0x20 // 't scene ' 0x09 0x09 0x0D 0x0A 0x01 0x0D 0x0A 0x53 // '???????S' 0x63 0x65 0x6E 0x65 0x20 0x53 0x6C 0x69 // 'cene Sli' 0x64 0x65 0x72 0x2E 0x2E 0x2E 0x2E 0x2E // 'der.....' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x6D 0x6F 0x76 0x65 0x20 0x66 // '..move f' 0x72 0x6F 0x6D 0x20 0x73 0x63 0x65 0x6E // 'rom scen' 0x65 0x20 0x74 0x6F 0x20 0x73 0x63 0x65 // 'e to sce' 0x6E 0x65 0x0D 0x0A 0x0D 0x0A 0x01 0x09 // 'ne??????' 0x50 0x6C 0x61 0x79 0x2F 0x53 0x74 0x6F // 'Play/Sto' 0x70 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // 'p.......' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x70 0x6C 0x61 0x79 0x20 0x61 // '..play a' 0x6E 0x64 0x20 0x73 0x74 0x6F 0x70 0x20 // 'nd stop ' 0x61 0x20 0x6D 0x6F 0x76 0x69 0x65 // 'a movie' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_13= ktpcBookMasterTools2 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_13, __HELP_NAME("(L) Master Tools Pg 2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_13, __HELP_NAME("(L) Master Tools Pg 2")) __HELP_PACK2 BO OSK LONG kgobHelpBookPageLeft kgobHelpBookPageLeft 0x0 ktpcBookToolTopics 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_6=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_13, 0x0) GST(0) ITEM "kgobHelpBookPageLeft" ITEM "ktpcBookMasterTools2" ITEM "kgobHelpBookPageLeft" ITEM "" ITEM "ktpcBookToolTopics" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_6=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_13, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA8 0x01 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_3=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) AG(4) ITEM LONG 0x200000A VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' FREE ITEM LONG 0x40000001 VAR BYTE 4 LONG thCut __HELP_SYMBOL( STN "thCut" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpUndo __HELP_SYMBOL( STN "mbmpUndo" ) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG thVolumeControl __HELP_SYMBOL( STN "thVolumeControl" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpCutCopyPaste __HELP_SYMBOL( STN "mbmpCutCopyPaste" ) ITEM LONG 0x40000001 VAR BYTE 2 LONG thUndoRedo __HELP_SYMBOL( STN "thUndoRedo" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG thVolumeControl __HELP_SYMBOL( STN "thVolumeControl" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpVolumeControl __HELP_SYMBOL( STN "mbmpVolumeControl" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpCCPCut __HELP_SYMBOL( STN "mbmpCCPCut" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG thCutCopyPaste __HELP_SYMBOL( STN "thCutCopyPaste" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_6=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x38 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '8???????' 0x01 0x00 0x00 0x00 0x3E 0x00 0x00 0x01 // '????>???' 0x00 0x00 0x00 0x00 0x41 0x00 0x00 0x01 // '????A???' 0x01 0x00 0x00 0x00 0x4F 0x00 0x00 0x01 // '????O???' 0x00 0x00 0x00 0x00 0x85 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0x8E 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0xEE 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0x02 0x01 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x39 0x01 0x00 0x01 // '????9???' 0x01 0x00 0x00 0x00 0x3C 0x01 0x00 0x01 // '??????@' 0x06 0x00 0x00 0x00 0x80 0x00 0x00 0x40 // '??????@' 0x09 0x00 0x00 0x00 0x82 0x00 0x00 0x40 // '??????@' 0x08 0x00 0x00 0x00 0xEC 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xEE 0x00 0x00 0x40 // '??????@' 0x0C 0x00 0x00 0x00 0x34 0x01 0x00 0x40 // '????4??@' 0x00 0x00 0x00 0x00 0x36 0x01 0x00 0x40 // '????6??@' 0x03 0x00 0x00 0x00 0x8C 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x0A 0x00 0x00 0x00 0x36 0x01 0x00 0x82 // '????6??' 0x08 0x00 0x00 0x00 0x3E 0x00 0x00 0xC0 // '????>??' 0x0A 0x00 0x00 0x00 0x82 0x00 0x00 0xC0 // '??????' 0x04 0x00 0x00 0x00 0xEE 0x00 0x00 0xC0 // '??????' 0x07 0x00 0x00 0x00 0x36 0x01 0x00 0xC0 // '????6??' 0x0B 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_6=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) BYTE 0x03 0x03 0x4D 0x61 0x73 0x74 0x65 0x72 // '??Master' 0x20 0x54 0x6F 0x6F 0x6C 0x73 0x97 0x63 // ' Toolsc' 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 // 'lick the' 0x20 0x70 0x69 0x63 0x74 0x75 0x72 0x65 // ' picture' 0x20 0x6F 0x66 0x20 0x74 0x68 0x65 0x20 // ' of the ' 0x74 0x6F 0x6F 0x6C 0x20 0x79 0x6F 0x75 // 'tool you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x68 0x65 // ' want he' 0x6C 0x70 0x20 0x6F 0x6E 0x2E 0x0D 0x0A // 'lp on.??' 0x01 0x09 0x09 0x56 0x6F 0x6C 0x75 0x6D // '???Volum' 0x65 0x20 0x43 0x6F 0x6E 0x74 0x72 0x6F // 'e Contro' 0x6C 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // 'l.......' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x61 0x64 0x6A 0x75 0x73 // '...adjus' 0x74 0x20 0x74 0x68 0x65 0x20 0x76 0x6F // 't the vo' 0x6C 0x75 0x6D 0x65 0x20 0x6F 0x66 0x20 // 'lume of ' 0x61 0x6C 0x6C 0x20 0x73 0x6F 0x75 0x6E // 'all soun' 0x64 0x73 0x0D 0x0A 0x01 0x09 0x09 0x55 // 'ds?????U' 0x6E 0x64 0x6F 0x2F 0x52 0x65 0x64 0x6F // 'ndo/Redo' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x75 0x6E 0x64 0x6F 0x20 0x74 0x68 // '.undo th' 0x65 0x20 0x6C 0x61 0x73 0x74 0x20 0x74 // 'e last t' 0x68 0x69 0x6E 0x67 0x20 0x79 0x6F 0x75 // 'hing you' 0x20 0x64 0x69 0x64 0x2C 0x20 0x6F 0x72 // ' did, or' 0x20 0x72 0x65 0x64 0x6F 0x20 0x77 0x68 // ' redo wh' 0x61 0x74 0x20 0x09 0x09 0x09 0x09 0x09 // 'at ?????' 0x09 0x09 0x09 0x09 0x09 0x20 0x20 0x20 // '????? ' 0x20 0x09 0x20 0x20 0x20 0x79 0x6F 0x75 // ' ? you' 0x20 0x75 0x6E 0x64 0x69 0x64 0x0D 0x0A // ' undid??' 0x01 0x09 0x09 0x43 0x75 0x74 0x2C 0x20 // '???Cut, ' 0x43 0x6F 0x70 0x79 0x2C 0x26 0x20 0x50 // 'Copy,& P' 0x61 0x73 0x74 0x65 0x2E 0x2E 0x2E 0x2E // 'aste....' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x67 // '.......g' 0x65 0x74 0x20 0x72 0x69 0x64 0x20 0x6F // 'et rid o' 0x66 0x2C 0x20 0x63 0x6F 0x70 0x79 0x2C // 'f, copy,' 0x20 0x70 0x61 0x73 0x74 0x65 0x2C 0x20 // ' paste, ' 0x6F 0x72 0x20 0x6D 0x6F 0x76 0x65 0x20 // 'or move ' 0x74 0x68 0x69 0x6E 0x67 0x73 0x0D 0x0A // 'things??' 0x01 0x09 0x09 0x43 0x75 0x74 0x2E 0x2E // '???Cut..' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x63 0x75 // '......cu' 0x74 0x20 0x73 0x6F 0x6D 0x65 0x74 0x68 // 't someth' 0x69 0x6E 0x67 0x20 0x79 0x6F 0x75 0x20 // 'ing you ' 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 // 'want to ' 0x6D 0x6F 0x76 0x65 0x20 0x65 0x6C 0x73 // 'move els' 0x65 0x77 0x68 0x65 0x72 0x65 // 'ewhere' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_14= ktpcBookMasterTools3 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_14, __HELP_NAME("(L) MasterTools Pg 3")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_14, __HELP_NAME("(L) MasterTools Pg 3")) __HELP_PACK2 BO OSK LONG kgobHelpBookPageLeft kgobHelpBookPageLeft 0x0 ktpcBookToolTopics 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_7=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_14, 0x0) GST(0) ITEM "kgobHelpBookPageLeft" ITEM "ktpcBookMasterTools3" ITEM "kgobHelpBookPageLeft" ITEM "" ITEM "ktpcBookToolTopics" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_7=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_14, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA8 0x01 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_F=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) AG(4) ITEM LONG 0x200000E VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' FREE ITEM LONG 0x40000001 VAR BYTE 2 LONG thCopyPath __HELP_SYMBOL( STN "thCopyPath" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpCCPRemoveScene __HELP_SYMBOL( STN "mbmpCCPRemoveScene" ) FREE FREE ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpCCPPaste __HELP_SYMBOL( STN "mbmpCCPPaste" ) FREE ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpCCPCopyRoute __HELP_SYMBOL( STN "mbmpCCPCopyRoute" ) FREE ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpCCPCopy __HELP_SYMBOL( STN "mbmpCCPCopy" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG thCopy __HELP_SYMBOL( STN "thCopy" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG thPaste __HELP_SYMBOL( STN "thPaste" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG thGetRidEntireScene __HELP_SYMBOL( STN "thGetRidEntireScene" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_7=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x44 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // 'D???????' 0x01 0x00 0x00 0x00 0x3E 0x00 0x00 0x01 // '????>???' 0x00 0x00 0x00 0x00 0x41 0x00 0x00 0x01 // '????A???' 0x01 0x00 0x00 0x00 0x45 0x00 0x00 0x01 // '????E???' 0x00 0x00 0x00 0x00 0x94 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0x9D 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x0A 0x01 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0F 0x01 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x71 0x01 0x00 0x01 // '????q???' 0x00 0x00 0x00 0x00 0x74 0x01 0x00 0x01 // '????t???' 0x01 0x00 0x00 0x00 0x87 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0xD1 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x41 0x00 0x00 0x02 // '????A???' 0x01 0x00 0x00 0x00 0x45 0x00 0x00 0x02 // '????E???' 0x00 0x00 0x00 0x00 0x6B 0x00 0x00 0x02 // '????k???' 0x01 0x00 0x00 0x00 0x6D 0x00 0x00 0x02 // '????m???' 0x00 0x00 0x00 0x00 0x6E 0x00 0x00 0x02 // '????n???' 0x01 0x00 0x00 0x00 0x6F 0x00 0x00 0x02 // '????o???' 0x00 0x00 0x00 0x00 0x7D 0x00 0x00 0x02 // '????}???' 0x01 0x00 0x00 0x00 0x83 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0x8F 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0x94 0x00 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0x9D 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0x0A 0x01 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0E 0x01 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x33 0x01 0x00 0x02 // '????3???' 0x01 0x00 0x00 0x00 0x49 0x01 0x00 0x02 // '????I???' 0x00 0x00 0x00 0x00 0x4A 0x01 0x00 0x02 // '????J???' 0x01 0x00 0x00 0x00 0x5A 0x01 0x00 0x02 // '????Z???' 0x00 0x00 0x00 0x00 0x69 0x01 0x00 0x02 // '????i???' 0x01 0x00 0x00 0x00 0x6F 0x01 0x00 0x02 // '????o???' 0x00 0x00 0x00 0x00 0x71 0x01 0x00 0x02 // '????q???' 0x00 0x00 0x00 0x00 0x7A 0x01 0x00 0x02 // '????z???' 0x01 0x00 0x00 0x00 0x87 0x01 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0x8C 0x01 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0x96 0x01 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0x9D 0x01 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0xA3 0x01 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0xA4 0x01 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0xAE 0x01 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0xBD 0x01 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0xC7 0x01 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0xD1 0x01 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x3C 0x00 0x00 0x03 // '?????@' 0x0C 0x00 0x00 0x00 0x8F 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x91 0x00 0x00 0x40 // '??????@' 0x03 0x00 0x00 0x00 0x05 0x01 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x07 0x01 0x00 0x40 // '???????@' 0x0D 0x00 0x00 0x00 0x6F 0x01 0x00 0x40 // '????o??@' 0x00 0x00 0x00 0x00 0x71 0x01 0x00 0x40 // '????q??@' 0x0E 0x00 0x00 0x00 0xD1 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x0A 0x00 0x00 0x00 0x71 0x01 0x00 0x82 // '????q??' 0x00 0x00 0x00 0x00 0x3E 0x00 0x00 0xC0 // '????>??' 0x0B 0x00 0x00 0x00 0x91 0x00 0x00 0xC0 // '??????' 0x09 0x00 0x00 0x00 0x07 0x01 0x00 0xC0 // '???????' 0x07 0x00 0x00 0x00 0x71 0x01 0x00 0xC0 // '????q??' 0x04 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_7=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) BYTE 0x03 0x03 0x4D 0x61 0x73 0x74 0x65 0x72 // '??Master' 0x20 0x54 0x6F 0x6F 0x6C 0x73 0x97 0x63 // ' Toolsc' 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 // 'lick the' 0x20 0x70 0x69 0x63 0x74 0x75 0x72 0x65 // ' picture' 0x20 0x6F 0x66 0x20 0x74 0x68 0x65 0x20 // ' of the ' 0x74 0x6F 0x6F 0x6C 0x20 0x79 0x6F 0x75 // 'tool you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x68 0x65 // ' want he' 0x6C 0x70 0x20 0x6F 0x6E 0x2E 0x0D 0x0A // 'lp on.??' 0x01 0x09 0x09 0x43 0x6F 0x70 0x79 0x2E // '???Copy.' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x63 0x6F 0x70 0x79 // '....copy' 0x20 0x73 0x6F 0x6D 0x65 0x74 0x68 0x69 // ' somethi' 0x6E 0x67 0x20 0x61 0x6E 0x64 0x20 0x70 // 'ng and p' 0x61 0x73 0x74 0x65 0x20 0x69 0x74 0x20 // 'aste it ' 0x65 0x6C 0x73 0x65 0x77 0x68 0x65 0x72 // 'elsewher' 0x65 0x0D 0x0A 0x01 0x09 0x09 0x43 0x6F // 'e?????Co' 0x70 0x79 0x20 0x50 0x61 0x74 0x68 0x2E // 'py Path.' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x63 0x6F 0x70 0x79 0x20 0x61 // '..copy a' 0x20 0x70 0x61 0x74 0x68 0x20 0x61 0x6E // ' path an' 0x64 0x20 0x70 0x61 0x73 0x74 0x65 0x20 // 'd paste ' 0x69 0x74 0x20 0x6F 0x6E 0x74 0x6F 0x20 // 'it onto ' 0x61 0x6E 0x6F 0x74 0x68 0x65 0x72 0x20 // 'another ' 0x09 0x09 0x09 0x09 0x09 0x09 0x09 0x09 // '????????' 0x09 0x09 0x09 0x09 0x20 0x20 0x20 0x20 // '???? ' 0x61 0x63 0x74 0x6F 0x72 0x2C 0x20 0x70 // 'actor, p' 0x72 0x6F 0x70 0x2C 0x20 0x6F 0x72 0x20 // 'rop, or ' 0x33 0x44 0x20 0x77 0x6F 0x72 0x64 0x0D // '3D word?' 0x0A 0x01 0x09 0x09 0x50 0x61 0x73 0x74 // '????Past' 0x65 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // 'e.......' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x70 0x61 0x73 0x74 // '....past' 0x65 0x20 0x77 0x68 0x61 0x74 0x65 0x76 // 'e whatev' 0x65 0x72 0x20 0x79 0x6F 0x75 0x20 0x6D // 'er you m' 0x6F 0x73 0x74 0x20 0x72 0x65 0x63 0x65 // 'ost rece' 0x6E 0x74 0x6C 0x79 0x20 0x63 0x75 0x74 // 'ntly cut' 0x20 0x6F 0x72 0x20 0x09 0x09 0x09 0x09 // ' or ????' 0x09 0x09 0x09 0x09 0x09 0x09 0x09 0x20 // '??????? ' 0x20 0x20 0x20 0x63 0x6F 0x70 0x69 0x65 // ' copie' 0x64 0x0D 0x0A 0x01 0x09 0x09 0x52 0x65 // 'd?????Re' 0x6D 0x6F 0x76 0x65 0x20 0x45 0x6E 0x74 // 'move Ent' 0x69 0x72 0x65 0x20 0x53 0x63 0x65 0x6E // 'ire Scen' 0x65 0x2E 0x2E 0x2E 0x2E 0x72 0x65 0x6D // 'e....rem' 0x6F 0x76 0x65 0x20 0x74 0x68 0x65 0x20 // 'ove the ' 0x63 0x75 0x72 0x72 0x65 0x6E 0x74 0x20 // 'current ' 0x73 0x63 0x65 0x6E 0x65 0x20 0x69 0x6E // 'scene in' 0x63 0x6C 0x75 0x64 0x69 0x6E 0x67 0x20 // 'cluding ' 0x09 0x09 0x09 0x09 0x09 0x09 0x09 0x09 // '????????' 0x09 0x09 0x09 0x09 0x20 0x20 0x20 0x61 // '???? a' 0x6C 0x6C 0x20 0x61 0x63 0x74 0x6F 0x72 // 'll actor' 0x73 0x20 0x61 0x6E 0x64 0x20 0x70 0x72 // 's and pr' 0x6F 0x70 0x73 // 'ops' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_15= ktpcBookMasterTools4 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_15, __HELP_NAME("(L) Master Tools Pg 4")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_15, __HELP_NAME("(L) Master Tools Pg 4")) __HELP_PACK2 BO OSK LONG kgobHelpBookPageLeft kgobHelpBookPageLeft 0x0 ktpcBookToolTopics 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_15, 0x0) GST(0) ITEM "kgobHelpBookPageLeft" ITEM "ktpcBookMasterTools4" ITEM "kgobHelpBookPageLeft" ITEM "" ITEM "ktpcBookToolTopics" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_15, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA8 0x01 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_A=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B, 0x0) AG(4) ITEM LONG 0x200000A VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ITEM LONG 0x40000001 VAR BYTE 3 LONG thGetRidWordBox __HELP_SYMBOL( STN "thGetRidWordBox" ) FREE ITEM LONG 0x40000001 VAR BYTE 4 LONG thPortfolio __HELP_SYMBOL( STN "thPortfolio" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpPortfolio __HELP_SYMBOL( STN "mbmpPortfolio" ) FREE ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpCutWordBox __HELP_SYMBOL( STN "mbmpCutWordBox" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpNukeSound __HELP_SYMBOL( STN "mbmpNukeSound" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpCCPRemoveObject __HELP_SYMBOL( STN "mbmpCCPRemoveObject" ) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG thGetRid3DObject __HELP_SYMBOL( STN "thGetRid3DObject" ) ITEM LONG 0x40000001 VAR BYTE 2 LONG thRemoveSound __HELP_SYMBOL( STN "thRemoveSound" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x37 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '7???????' 0x01 0x00 0x00 0x00 0x3E 0x00 0x00 0x01 // '????>???' 0x00 0x00 0x00 0x00 0x41 0x00 0x00 0x01 // '????A???' 0x01 0x00 0x00 0x00 0x51 0x00 0x00 0x01 // '????Q???' 0x00 0x00 0x00 0x00 0xA5 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xB1 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x1C 0x01 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2B 0x01 0x00 0x01 // '????+???' 0x00 0x00 0x00 0x00 0x5F 0x01 0x00 0x01 // '????_???' 0x00 0x00 0x00 0x00 0x62 0x01 0x00 0x01 // '????b???' 0x01 0x00 0x00 0x00 0x6B 0x01 0x00 0x01 // '????k???' 0x00 0x00 0x00 0x00 0xCD 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x5C 0x00 0x00 0x02 // '????\???' 0x01 0x00 0x00 0x00 0x61 0x00 0x00 0x02 // '????a???' 0x00 0x00 0x00 0x00 0xA0 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0xC4 0x00 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0xCA 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0x27 0x01 0x00 0x02 // '????'???' 0x01 0x00 0x00 0x00 0x2B 0x01 0x00 0x02 // '????+???' 0x00 0x00 0x00 0x00 0x36 0x01 0x00 0x02 // '????6???' 0x01 0x00 0x00 0x00 0x3C 0x01 0x00 0x02 // '??????@' 0x0B 0x00 0x00 0x00 0xA0 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xA2 0x00 0x00 0x40 // '??????@' 0x0C 0x00 0x00 0x00 0x17 0x01 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x19 0x01 0x00 0x40 // '???????@' 0x02 0x00 0x00 0x00 0x5D 0x01 0x00 0x40 // '????]??@' 0x00 0x00 0x00 0x00 0x5F 0x01 0x00 0x40 // '????_??@' 0x04 0x00 0x00 0x00 0xCD 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x0A 0x00 0x00 0x00 0x5F 0x01 0x00 0x82 // '????_??' 0x00 0x00 0x00 0x00 0x3E 0x00 0x00 0xC0 // '????>??' 0x09 0x00 0x00 0x00 0xA2 0x00 0x00 0xC0 // '??????' 0x08 0x00 0x00 0x00 0x19 0x01 0x00 0xC0 // '???????' 0x07 0x00 0x00 0x00 0x5F 0x01 0x00 0xC0 // '????_??' 0x05 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B, 0x0) BYTE 0x03 0x03 0x4D 0x61 0x73 0x74 0x65 0x72 // '??Master' 0x20 0x54 0x6F 0x6F 0x6C 0x73 0x97 0x63 // ' Toolsc' 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 // 'lick the' 0x20 0x70 0x69 0x63 0x74 0x75 0x72 0x65 // ' picture' 0x20 0x6F 0x66 0x20 0x74 0x68 0x65 0x20 // ' of the ' 0x74 0x6F 0x6F 0x6C 0x20 0x79 0x6F 0x75 // 'tool you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x68 0x65 // ' want he' 0x6C 0x70 0x20 0x6F 0x6E 0x2E 0x0D 0x0A // 'lp on.??' 0x01 0x09 0x09 0x52 0x65 0x6D 0x6F 0x76 // '???Remov' 0x65 0x20 0x33 0x44 0x20 0x4F 0x62 0x6A // 'e 3D Obj' 0x65 0x63 0x74 0x2E 0x2E 0x2E 0x2E 0x2E // 'ect.....' 0x2E 0x2E 0x2E 0x2E 0x72 0x65 0x6D 0x6F // '....remo' 0x76 0x65 0x20 0x61 0x6E 0x20 0x61 0x63 // 've an ac' 0x74 0x6F 0x72 0x2C 0x20 0x70 0x72 0x6F // 'tor, pro' 0x70 0x2C 0x20 0x6F 0x72 0x20 0x33 0x44 // 'p, or 3D' 0x20 0x77 0x6F 0x72 0x64 0x20 0x66 0x72 // ' word fr' 0x6F 0x6D 0x20 0x74 0x68 0x65 0x20 0x09 // 'om the ?' 0x09 0x09 0x09 0x09 0x09 0x09 0x09 0x09 // '????????' 0x09 0x20 0x20 0x20 0x20 0x63 0x75 0x72 // '? cur' 0x72 0x65 0x6E 0x74 0x20 0x73 0x63 0x65 // 'rent sce' 0x6E 0x65 0x0D 0x0A 0x01 0x09 0x09 0x52 // 'ne?????R' 0x65 0x6D 0x6F 0x76 0x65 0x20 0x53 0x6F // 'emove So' 0x75 0x6E 0x64 0x2E 0x2E 0x2E 0x2E 0x2E // 'und.....' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x72 0x65 0x6D // '.....rem' 0x6F 0x76 0x65 0x20 0x61 0x20 0x73 0x6F // 'ove a so' 0x75 0x6E 0x64 0x20 0x79 0x6F 0x75 0x20 // 'und you ' 0x61 0x74 0x74 0x61 0x63 0x68 0x65 0x64 // 'attached' 0x20 0x74 0x6F 0x20 0x61 0x20 0x09 0x09 // ' to a ??' 0x09 0x09 0x09 0x09 0x09 0x09 0x09 0x09 // '????????' 0x09 0x09 0x09 0x20 0x20 0x20 0x62 0x61 // '??? ba' 0x63 0x6B 0x67 0x72 0x6F 0x75 0x6E 0x64 // 'ckground' 0x2C 0x20 0x61 0x63 0x74 0x6F 0x72 0x2C // ', actor,' 0x20 0x70 0x72 0x6F 0x70 0x2C 0x20 0x6F // ' prop, o' 0x72 0x20 0x33 0x44 0x20 0x77 0x6F 0x72 // 'r 3D wor' 0x64 0x0D 0x0A 0x01 0x09 0x09 0x52 0x65 // 'd?????Re' 0x6D 0x6F 0x76 0x65 0x20 0x57 0x6F 0x72 // 'move Wor' 0x64 0x20 0x42 0x6F 0x78 0x2E 0x2E 0x2E // 'd Box...' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x72 // '.......r' 0x65 0x6D 0x6F 0x76 0x65 0x20 0x61 0x20 // 'emove a ' 0x77 0x6F 0x72 0x64 0x20 0x62 0x6F 0x78 // 'word box' 0x20 0x66 0x72 0x6F 0x6D 0x20 0x74 0x68 // ' from th' 0x65 0x20 0x63 0x75 0x72 0x72 0x65 0x6E // 'e curren' 0x74 0x20 0x73 0x63 0x65 0x6E 0x65 0x0D // 't scene?' 0x0A 0x01 0x09 0x09 0x50 0x6F 0x72 0x74 // '????Port' 0x66 0x6F 0x6C 0x69 0x6F 0x2E 0x2E 0x2E // 'folio...' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x73 0x74 0x61 0x72 0x74 0x20 // '..start ' 0x61 0x20 0x6E 0x65 0x77 0x20 0x6D 0x6F // 'a new mo' 0x76 0x69 0x65 0x2C 0x20 0x6F 0x70 0x65 // 'vie, ope' 0x6E 0x20 0x61 0x6E 0x20 0x6F 0x6C 0x64 // 'n an old' 0x20 0x6D 0x6F 0x76 0x69 0x65 0x2C 0x20 // ' movie, ' 0x6F 0x72 0x20 0x09 0x09 0x09 0x09 0x09 // 'or ?????' 0x09 0x09 0x09 0x09 0x09 0x09 0x20 0x20 // '?????? ' 0x20 0x73 0x61 0x76 0x65 0x20 0x79 0x6F // ' save yo' 0x75 0x72 0x20 0x77 0x6F 0x72 0x6B // 'ur work' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_16= ktpcBookMasterTools5 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_16, __HELP_NAME("(L) MasterTools Pg 5")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_16, __HELP_NAME("(L) MasterTools Pg 5")) __HELP_PACK2 BO OSK LONG kgobHelpBookPageLeft kgobHelpBookPageLeft 0x0 ktpcBookToolTopics 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_16, 0x0) GST(0) ITEM "kgobHelpBookPageLeft" ITEM "ktpcBookMasterTools5" ITEM "kgobHelpBookPageLeft" ITEM "" ITEM "ktpcBookToolTopics" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_16, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA8 0x01 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_5=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 3 LONG thSave __HELP_SYMBOL( STN "thSave" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG thSaveAs __HELP_SYMBOL( STN "thSaveAs" ) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG thNew __HELP_SYMBOL( STN "thNew" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpPortfolioOpen __HELP_SYMBOL( STN "mbmpPortfolioOpen" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpPortsSave __HELP_SYMBOL( STN "mbmpPortsSave" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpPortfolioSaveAs __HELP_SYMBOL( STN "mbmpPortfolioSaveAs" ) ITEM LONG 0x40000001 VAR BYTE 2 LONG thOpen __HELP_SYMBOL( STN "thOpen" ) FREE ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpPortsNew __HELP_SYMBOL( STN "mbmpPortsNew" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_1=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x1F 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x3E 0x00 0x00 0x01 // '????>???' 0x00 0x00 0x00 0x00 0xDA 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xDC 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x1D 0x01 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x1D 0x01 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x3C 0x00 0x00 0x03 // '?????@' 0x04 0x00 0x00 0x00 0x70 0x00 0x00 0x40 // '????p??@' 0x00 0x00 0x00 0x00 0x72 0x00 0x00 0x40 // '????r??@' 0x08 0x00 0x00 0x00 0xA9 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xAB 0x00 0x00 0x40 // '??????@' 0x01 0x00 0x00 0x00 0xDA 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xDC 0x00 0x00 0x40 // '??????@' 0x02 0x00 0x00 0x00 0x1D 0x01 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x0A 0x00 0x00 0x00 0xDC 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x3E 0x00 0x00 0xC0 // '????>??' 0x0A 0x00 0x00 0x00 0x72 0x00 0x00 0xC0 // '????r??' 0x05 0x00 0x00 0x00 0xAB 0x00 0x00 0xC0 // '??????' 0x06 0x00 0x00 0x00 0xDC 0x00 0x00 0xC0 // '??????' 0x07 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x03 0x03 0x4D 0x61 0x73 0x74 0x65 0x72 // '??Master' 0x20 0x54 0x6F 0x6F 0x6C 0x73 0x97 0x63 // ' Toolsc' 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 // 'lick the' 0x20 0x70 0x69 0x63 0x74 0x75 0x72 0x65 // ' picture' 0x20 0x6F 0x66 0x20 0x74 0x68 0x65 0x20 // ' of the ' 0x74 0x6F 0x6F 0x6C 0x20 0x79 0x6F 0x75 // 'tool you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x68 0x65 // ' want he' 0x6C 0x70 0x20 0x6F 0x6E 0x2E 0x0D 0x0A // 'lp on.??' 0x01 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '?.......' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x73 0x74 0x61 0x72 0x74 0x20 0x61 // '.start a' 0x20 0x6E 0x65 0x77 0x20 0x6D 0x6F 0x76 // ' new mov' 0x69 0x65 0x0D 0x0A 0x01 0x2E 0x2E 0x2E // 'ie???...' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x6F 0x70 0x65 // '.....ope' 0x6E 0x20 0x61 0x6E 0x20 0x65 0x78 0x69 // 'n an exi' 0x73 0x74 0x69 0x6E 0x67 0x20 0x6D 0x6F // 'sting mo' 0x76 0x69 0x65 0x0D 0x0A 0x01 0x2E 0x2E // 'vie???..' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x73 0x61 // '......sa' 0x76 0x65 0x20 0x79 0x6F 0x75 0x72 0x20 // 've your ' 0x77 0x6F 0x72 0x6B 0x0D 0x0A 0x01 0x2E // 'work???.' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x73 // '.......s' 0x61 0x76 0x65 0x20 0x79 0x6F 0x75 0x72 // 'ave your' 0x20 0x77 0x6F 0x72 0x6B 0x20 0x75 0x6E // ' work un' 0x64 0x65 0x72 0x20 0x61 0x20 0x20 0x6E // 'der a n' 0x65 0x77 0x20 0x6E 0x61 0x6D 0x65 // 'ew name' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_17= ktpcBookMasterTools6 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_17, __HELP_NAME("(L) Master Tools Pg 6")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_17, __HELP_NAME("(L) Master Tools Pg 6")) __HELP_PACK2 BO OSK LONG kgobHelpBookPageLeft kgobHelpBookPageLeft 0x0 ktpcBookToolTopics 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_17, 0x0) GST(0) ITEM "kgobHelpBookPageLeft" ITEM "ktpcBookMasterTools6" ITEM "kgobHelpBookPageLeft" ITEM "" ITEM "ktpcBookToolTopics" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_17, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA8 0x01 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 2 LONG thMap __HELP_SYMBOL( STN "thMap" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG thExit __HELP_SYMBOL( STN "thExit" ) FREE ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpMap __HELP_SYMBOL( STN "mbmpMap" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpExit __HELP_SYMBOL( STN "mbmpExit" ) FREE ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpBook __HELP_SYMBOL( STN "mbmpBook" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG thHelp __HELP_SYMBOL( STN "thHelp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_4=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x18 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x3E 0x00 0x00 0x01 // '????>???' 0x00 0x00 0x00 0x00 0x42 0x00 0x00 0x01 // '????B???' 0x01 0x00 0x00 0x00 0x4E 0x00 0x00 0x01 // '????N???' 0x00 0x00 0x00 0x00 0xA0 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xA3 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0xED 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xF1 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x3C 0x00 0x00 0x03 // '?????@' 0x08 0x00 0x00 0x00 0x9A 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x9C 0x00 0x00 0x40 // '??????@' 0x01 0x00 0x00 0x00 0xE8 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xEA 0x00 0x00 0x40 // '??????@' 0x02 0x00 0x00 0x00 0x1C 0x01 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x0A 0x00 0x00 0x00 0x3E 0x00 0x00 0xC0 // '????>??' 0x07 0x00 0x00 0x00 0x9C 0x00 0x00 0xC0 // '??????' 0x04 0x00 0x00 0x00 0xEA 0x00 0x00 0xC0 // '??????' 0x05 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) BYTE 0x03 0x03 0x4D 0x61 0x73 0x74 0x65 0x72 // '??Master' 0x20 0x54 0x6F 0x6F 0x6C 0x73 0x97 0x63 // ' Toolsc' 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 // 'lick the' 0x20 0x70 0x69 0x63 0x74 0x75 0x72 0x65 // ' picture' 0x20 0x6F 0x66 0x20 0x74 0x68 0x65 0x20 // ' of the ' 0x74 0x6F 0x6F 0x6C 0x20 0x79 0x6F 0x75 // 'tool you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x68 0x65 // ' want he' 0x6C 0x70 0x20 0x6F 0x6E 0x2E 0x0D 0x0A // 'lp on.??' 0x01 0x09 0x09 0x09 0x48 0x65 0x6C 0x70 // '????Help' 0x20 0x4D 0x61 0x63 0x68 0x69 0x6E 0x65 // ' Machine' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x66 0x69 0x6E 0x64 // '....find' 0x20 0x61 0x6C 0x6C 0x20 0x74 0x68 0x65 // ' all the' 0x20 0x61 0x6E 0x73 0x77 0x65 0x72 0x73 // ' answers' 0x20 0x74 0x6F 0x20 0x79 0x6F 0x75 0x72 // ' to your' 0x20 0x6D 0x6F 0x76 0x69 0x65 0x2D 0x6D // ' movie-m' 0x61 0x6B 0x69 0x6E 0x67 0x20 0x09 0x09 // 'aking ??' 0x09 0x09 0x09 0x09 0x09 0x09 0x09 0x09 // '????????' 0x09 0x20 0x20 0x71 0x75 0x65 0x73 0x74 // '? quest' 0x69 0x6F 0x6E 0x73 0x0D 0x0A 0x01 0x09 // 'ions????' 0x09 0x09 0x4D 0x61 0x70 0x2E 0x2E 0x2E // '??Map...' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x71 0x75 0x69 0x63 // '....quic' 0x6B 0x6C 0x79 0x20 0x7A 0x69 0x70 0x20 // 'kly zip ' 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 0x72 // 'to the r' 0x6F 0x6F 0x6D 0x20 0x6F 0x66 0x20 0x79 // 'oom of y' 0x6F 0x75 0x72 0x20 0x63 0x68 0x6F 0x69 // 'our choi' 0x63 0x65 0x0D 0x0A 0x01 0x09 0x09 0x45 // 'ce?????E' 0x78 0x69 0x74 0x2E 0x2E 0x2E 0x2E 0x2E // 'xit.....' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E 0x2E // '........' 0x2E 0x2E 0x71 0x75 0x69 0x74 0x20 0x77 // '..quit w' 0x6F 0x72 0x6B 0x69 0x6E 0x67 // 'orking' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK ================================================ FILE: src/help/booktpc.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ #undef __HELP_NAME #undef __HELP_SYMBOL #undef __HELP_PACK #undef __HELP_PACK2 #ifdef NO_HELP_NAMES #define __HELP_NAME(name) "" #else #define __HELP_NAME(name) name #endif #ifdef NO_HELP_SYMBOLS #define __HELP_SYMBOL(stuff) #else #define __HELP_SYMBOL(stuff) stuff #endif #ifdef PACK_HELP #define __HELP_PACK PACK #else #define __HELP_PACK #endif #ifdef HELP_SINGLE_CHUNK #define __HELP_PACK2 #else #define __HELP_PACK2 __HELP_PACK #endif SET _help_48544F50_A= tpcPageNumber #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_A, __HELP_NAME("Page Number")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_A, __HELP_NAME("Page Number")) __HELP_PACK2 BO OSK LONG kgobHelpBookPageNum kgobHelpBookPageNum 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_13=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_A, 0x0) GST(0) ITEM "kgobHelpBookPageNum" ITEM "tpcPageNumber" ITEM "kgobHelpBookPageNum" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_13=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x48 0x00 0x00 0x00 // '????H???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_13=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_13, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x03 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x09 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0x00 0x00 0x00 0x02 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_13=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_13, 0x0) BYTE 0x03 0x03 0x20 0x7E 0x31 0x20 0x6F 0x66 // '?? ~1 of' 0x20 0x7E 0x32 // ' ~2' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_C= tpcTitle1 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_C, __HELP_NAME("Book: Table of Contents title")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_C, __HELP_NAME("Book: Table of Contents title")) __HELP_PACK2 BO OSK LONG kgobHelpBookBkgd kgobHelpBookBkgd 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_9=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_C, 0x0) GST(0) ITEM "kgobHelpBookBkgd" ITEM "tpcTitle1" ITEM "kgobHelpBookBkgd" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_9=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_C, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE0 0x01 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_6=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_9, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x10 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_9=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_9, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x0A 0x00 0x11 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x11 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0x00 0x00 0x00 0x02 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_9=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_9, 0x0) BYTE 0x03 0x03 0x54 0x61 0x62 0x6C 0x65 0x20 // '??Table ' 0x6F 0x66 0x20 0x43 0x6F 0x6E 0x74 0x65 // 'of Conte' 0x6E 0x74 0x73 // 'nts' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_D= tpcTitle2 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_D, __HELP_NAME("Book: Basics title")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_D, __HELP_NAME("Book: Basics title")) __HELP_PACK2 BO OSK LONG kgobHelpBookBkgd kgobHelpBookBkgd 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_0=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_D, 0x0) GST(0) ITEM "kgobHelpBookBkgd" ITEM "tpcTitle2" ITEM "kgobHelpBookBkgd" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_0=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_D, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE0 0x01 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_0=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x10 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_0=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x0A 0x00 0x06 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x06 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0x00 0x00 0x00 0x02 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_0=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) BYTE 0x03 0x03 0x42 0x61 0x73 0x69 0x63 0x73 // '??Basics' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_E= tpcTitle3 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_E, __HELP_NAME("Book: How to #1 Scenes")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_E, __HELP_NAME("Book: How to #1 Scenes")) __HELP_PACK2 BO OSK LONG kgobHelpBookBkgd kgobHelpBookBkgd 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_E, 0x0) GST(0) ITEM "kgobHelpBookBkgd" ITEM "tpcTitle3" ITEM "kgobHelpBookBkgd" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_E, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE0 0x01 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_7=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x10 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x0A 0x00 0x0F 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0F 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0x00 0x00 0x00 0x02 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) BYTE 0x03 0x03 0x48 0x6F 0x77 0x20 0x54 0x6F // '??How To' 0x2E 0x2E 0x2E 0x53 0x63 0x65 0x6E 0x65 // '...Scene' 0x73 // 's' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_F= tpcTitle4 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_F, __HELP_NAME("Book: How to #2 ActProp")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_F, __HELP_NAME("Book: How to #2 ActProp")) __HELP_PACK2 BO OSK LONG kgobHelpBookBkgd kgobHelpBookBkgd 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_F, 0x0) GST(0) ITEM "kgobHelpBookBkgd" ITEM "tpcTitle4" ITEM "kgobHelpBookBkgd" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_F, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE0 0x01 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x10 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x0A 0x00 0x17 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0F 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x17 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0x00 0x00 0x00 0x02 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) BYTE 0x03 0x03 0x48 0x6F 0x77 0x20 0x54 0x6F // '??How To' 0x2E 0x2E 0x2E 0x41 0x63 0x74 0x6F 0x72 // '...Actor' 0x73 0x20 0x26 0x20 0x50 0x72 0x6F 0x70 // 's & Prop' 0x73 // 's' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_10= tpcTitle5 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_10, __HELP_NAME("Book: How to #3 Action")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_10, __HELP_NAME("Book: How to #3 Action")) __HELP_PACK2 BO OSK LONG kgobHelpBookBkgd kgobHelpBookBkgd 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_10, 0x0) GST(0) ITEM "kgobHelpBookBkgd" ITEM "tpcTitle5" ITEM "kgobHelpBookBkgd" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_10, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE0 0x01 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_9=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x10 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x0A 0x00 0x0F 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0F 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0x00 0x00 0x00 0x02 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) BYTE 0x03 0x03 0x48 0x6F 0x77 0x20 0x54 0x6F // '??How To' 0x2E 0x2E 0x2E 0x41 0x63 0x74 0x69 0x6F // '...Actio' 0x6E // 'n' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_11= tpcTitle6 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_11, __HELP_NAME("Book: How to #4 Sounds")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_11, __HELP_NAME("Book: How to #4 Sounds")) __HELP_PACK2 BO OSK LONG kgobHelpBookBkgd kgobHelpBookBkgd 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_11, 0x0) GST(0) ITEM "kgobHelpBookBkgd" ITEM "tpcTitle6" ITEM "kgobHelpBookBkgd" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_11, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE0 0x01 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_8=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x10 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x0A 0x00 0x0F 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0F 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0x00 0x00 0x00 0x02 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B, 0x0) BYTE 0x03 0x03 0x48 0x6F 0x77 0x20 0x54 0x6F // '??How To' 0x2E 0x2E 0x2E 0x53 0x6F 0x75 0x6E 0x64 // '...Sound' 0x73 // 's' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_12= tpcTitle7 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_12, __HELP_NAME("Book: How to #5 Words")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_12, __HELP_NAME("Book: How to #5 Words")) __HELP_PACK2 BO OSK LONG kgobHelpBookBkgd kgobHelpBookBkgd 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_12, 0x0) GST(0) ITEM "kgobHelpBookBkgd" ITEM "tpcTitle7" ITEM "kgobHelpBookBkgd" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_12, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE0 0x01 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_A=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x10 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x0A 0x00 0x0E 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0E 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0x00 0x00 0x00 0x02 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D, 0x0) BYTE 0x03 0x03 0x48 0x6F 0x77 0x20 0x54 0x6F // '??How To' 0x2E 0x2E 0x2E 0x57 0x6F 0x72 0x64 0x73 // '...Words' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_13= tpcTitle8 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_13, __HELP_NAME("Book: How to #6 Editing")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_13, __HELP_NAME("Book: How to #6 Editing")) __HELP_PACK2 BO OSK LONG kgobHelpBookBkgd kgobHelpBookBkgd 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_13, 0x0) GST(0) ITEM "kgobHelpBookBkgd" ITEM "tpcTitle8" ITEM "kgobHelpBookBkgd" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_13, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE0 0x01 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_B=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x10 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x0A 0x00 0x10 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x10 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0x00 0x00 0x00 0x02 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) BYTE 0x03 0x03 0x48 0x6F 0x77 0x20 0x54 0x6F // '??How To' 0x2E 0x2E 0x2E 0x45 0x64 0x69 0x74 0x69 // '...Editi' 0x6E 0x67 // 'ng' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_14= tpcTitle9 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_14, __HELP_NAME("Book: Scene Tools Title")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_14, __HELP_NAME("Book: Scene Tools Title")) __HELP_PACK2 BO OSK LONG kgobHelpBookBkgd kgobHelpBookBkgd 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_14, 0x0) GST(0) ITEM "kgobHelpBookBkgd" ITEM "tpcTitle9" ITEM "kgobHelpBookBkgd" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_14, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE0 0x01 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_C=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x10 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x0A 0x00 0x05 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x05 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x05 0x00 0x00 0x03 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0x00 0x00 0x00 0x02 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x6F 0x6C 0x73 // '??Tools' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_15= tpcTitle10 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_15, __HELP_NAME("Book: Tips title")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_15, __HELP_NAME("Book: Tips title")) __HELP_PACK2 BO OSK LONG kgobHelpBookBkgd kgobHelpBookBkgd 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_5=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_15, 0x0) GST(0) ITEM "kgobHelpBookBkgd" ITEM "tpcTitle10" ITEM "kgobHelpBookBkgd" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_5=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_15, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE0 0x01 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_3=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x10 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_5=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x0A 0x00 0x04 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x04 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0x00 0x00 0x00 0x02 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_5=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x03 0x03 0x54 0x69 0x70 0x73 // '??Tips' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_16= ttBookCancel #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_16, __HELP_NAME("TTBook: Close")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_16, __HELP_NAME("TTBook: Close")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kgobHelpBookCancel kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHelpBook1 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_16, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "ttBookCancel" ITEM "" ITEM "kgobHelpBookCancel" ITEM "kidPlayHelpSounds" ITEM "kwavHelpBook1" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_16, 0x0) BYTE 0x01 0x00 0x03 0x03 0x6E 0x00 0x00 0x00 // '????n???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x27 0x00 0x00 0x01 // '????'???' 0x00 0x00 0x00 0x00 0x27 0x00 0x00 0x02 // '????'???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x05 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x6F 0x73 0x65 0x0D // '??Close?' 0x0A 0x43 0x6C 0x69 0x63 0x6B 0x20 0x74 // '?Click t' 0x6F 0x20 0x63 0x6C 0x6F 0x73 0x65 0x20 // 'o close ' 0x74 0x68 0x65 0x20 0x48 0x65 0x6C 0x70 // 'the Help' 0x20 0x4D 0x61 0x63 0x68 0x69 0x6E 0x65 // ' Machine' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_17= ttBookPageFwd #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_17, __HELP_NAME("TTBook: Next Screen")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_17, __HELP_NAME("TTBook: Next Screen")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kgobHelpBookPageFwd kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHelpBook2 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_17, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "ttBookPageFwd" ITEM "" ITEM "kgobHelpBookPageFwd" ITEM "kidPlayHelpSounds" ITEM "kwavHelpBook2" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_17, 0x0) BYTE 0x01 0x00 0x03 0x03 0x6A 0x00 0x00 0x00 // '????j???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_3=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2C 0x00 0x00 0x01 // '????,???' 0x00 0x00 0x00 0x00 0x2C 0x00 0x00 0x02 // '????,???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0B 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) BYTE 0x03 0x03 0x4E 0x65 0x78 0x74 0x20 0x53 // '??Next S' 0x63 0x72 0x65 0x65 0x6E 0x0D 0x0A 0x43 // 'creen??C' 0x6C 0x69 0x63 0x6B 0x20 0x74 0x6F 0x20 // 'lick to ' 0x67 0x6F 0x20 0x74 0x6F 0x20 0x74 0x68 // 'go to th' 0x65 0x20 0x6E 0x65 0x78 0x74 0x20 0x73 // 'e next s' 0x63 0x72 0x65 0x65 0x6E 0x2E // 'creen.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_18= ttBookPageBack #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_18, __HELP_NAME("TTBook: Previous Screen")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_18, __HELP_NAME("TTBook: Previous Screen")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kgobHelpBookPageBack kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHelpBook3 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_18, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "ttBookPageBack" ITEM "" ITEM "kgobHelpBookPageBack" ITEM "kidPlayHelpSounds" ITEM "kwavHelpBook3" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_18, 0x0) BYTE 0x01 0x00 0x03 0x03 0x6F 0x00 0x00 0x00 // '????o???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_4=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x34 0x00 0x00 0x01 // '????4???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x11 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0F 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) BYTE 0x03 0x03 0x50 0x72 0x65 0x76 0x69 0x6F // '??Previo' 0x75 0x73 0x20 0x53 0x63 0x72 0x65 0x65 // 'us Scree' 0x6E 0x0D 0x0A 0x43 0x6C 0x69 0x63 0x6B // 'n??Click' 0x20 0x74 0x6F 0x20 0x67 0x6F 0x20 0x74 // ' to go t' 0x6F 0x20 0x74 0x68 0x65 0x20 0x70 0x72 // 'o the pr' 0x65 0x76 0x69 0x6F 0x75 0x73 0x20 0x73 // 'evious s' 0x63 0x72 0x65 0x65 0x6E 0x2E // 'creen.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_19= ttBookVolume #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_19, __HELP_NAME("TTBook: Volume Control ")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_19, __HELP_NAME("TTBook: Volume Control ")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kgobHelpBookVolume kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHelpBook4 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_8=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_19, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "ttBookVolume" ITEM "" ITEM "kgobHelpBookVolume" ITEM "kidPlayHelpSounds" ITEM "kwavHelpBook4" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_8=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_19, 0x0) BYTE 0x01 0x00 0x03 0x03 0x8F 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_5=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_8=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0E 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x10 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x3E 0x00 0x00 0x01 // '????>???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x3E 0x00 0x00 0x02 // '????>???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0E 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_8=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) BYTE 0x03 0x03 0x56 0x6F 0x6C 0x75 0x6D 0x65 // '??Volume' 0x20 0x43 0x6F 0x6E 0x74 0x72 0x6F 0x6C // ' Control' 0x0D 0x0A 0x41 0x64 0x6A 0x75 0x73 0x74 // '??Adjust' 0x20 0x74 0x68 0x65 0x20 0x76 0x6F 0x6C // ' the vol' 0x75 0x6D 0x65 0x20 0x66 0x6F 0x72 0x20 // 'ume for ' 0x61 0x6C 0x6C 0x20 0x74 0x68 0x65 0x20 // 'all the ' 0x73 0x6F 0x75 0x6E 0x64 0x73 0x20 0x79 // 'sounds y' 0x6F 0x75 0x20 0x68 0x65 0x61 0x72 0x2E // 'ou hear.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1A= ttBookVoice #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1A, __HELP_NAME("TTBook: Voice On Off Control ")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1A, __HELP_NAME("TTBook: Voice On Off Control ")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kgobHelpBookVoice kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHelpBook5 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_6=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1A, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "ttBookVoice" ITEM "" ITEM "kgobHelpBookVoice" ITEM "kidPlayHelpSounds" ITEM "kwavHelpBook5" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_6=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x62 0x00 0x00 0x00 // '????b???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_4=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) AG(4) ITEM LONG 0x2000002 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_6=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2D 0x00 0x00 0x01 // '????-???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0D 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x0F 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x2D 0x00 0x00 0x02 // '????-???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0F 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x2D 0x00 0x00 0x03 // '???-???' 0x00 0x00 0x00 0x00 0x0F 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_6=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) BYTE 0x03 0x03 0x4D 0x63 0x5A 0x65 0x65 0x27 // '??McZee'' 0x73 0x20 0x56 0x6F 0x69 0x63 0x65 0x0D // 's Voice?' 0x0A 0x54 0x75 0x72 0x6E 0x20 0x4D 0x63 // '?Turn Mc' 0x5A 0x65 0x65 0x27 0x73 0x20 0x76 0x6F // 'Zee's vo' 0x69 0x63 0x65 0x20 0x6F 0x6E 0x20 0x61 // 'ice on a' 0x6E 0x64 0x20 0x6F 0x66 0x66 0x2E // 'nd off.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1B= 0x1B #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1B, __HELP_NAME("On Idle--Help Machine")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1B, __HELP_NAME("On Idle--Help Machine")) __HELP_PACK2 BO OSK LONG 0xFFFFFFFF 0x0 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1B, 0x0) GST(0) ITEM "" ITEM "" ITEM "" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1B, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_15=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1D, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpLeannOk __HELP_SYMBOL( STN "mbmpLeannOk" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_1D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x14 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x16 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x77 0x00 0x00 0x01 // '????w???' 0x01 0xFB 0x00 0x00 0x88 0x00 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0x8A 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x14 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x89 0x00 0x00 0xC0 // '??????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1D, 0x0) BYTE 0x03 0x03 0x48 0x65 0x79 0x3F 0x20 0x20 // '??Hey? ' 0x45 0x76 0x65 0x72 0x79 0x74 0x68 0x69 // 'Everythi' 0x6E 0x67 0x20 0x4F 0x4B 0x3F 0x0D 0x0A // 'ng OK???' 0x54 0x6F 0x20 0x67 0x65 0x74 0x20 0x68 // 'To get h' 0x65 0x6C 0x70 0x2C 0x20 0x63 0x6C 0x69 // 'elp, cli' 0x63 0x6B 0x20 0x61 0x20 0x62 0x75 0x74 // 'ck a but' 0x74 0x6F 0x6E 0x20 0x61 0x74 0x20 0x74 // 'ton at t' 0x68 0x65 0x20 0x74 0x6F 0x70 0x20 0x6F // 'he top o' 0x66 0x20 0x74 0x68 0x65 0x20 0x48 0x65 // 'f the He' 0x6C 0x70 0x20 0x4D 0x61 0x63 0x68 0x69 // 'lp Machi' 0x6E 0x65 0x2C 0x20 0x74 0x68 0x65 0x6E // 'ne, then' 0x20 0x63 0x68 0x6F 0x6F 0x73 0x65 0x20 // ' choose ' 0x61 0x20 0x74 0x6F 0x70 0x69 0x63 0x2E // 'a topic.' 0x20 0x20 0x49 0x66 0x20 0x79 0x6F 0x75 // ' If you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F // ' want to' 0x20 0x63 0x6C 0x6F 0x73 0x65 0x20 0x68 // ' close h' 0x65 0x6C 0x70 0x2C 0x20 0x63 0x6C 0x69 // 'elp, cli' 0x63 0x6B 0x20 0x01 // 'ck ?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1C= 0x1C #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1C, __HELP_NAME("On Idle--Workspace")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1C, __HELP_NAME("On Idle--Workspace")) __HELP_PACK2 BO OSK LONG 0xFFFFFFFF 0x0 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1C, 0x0) GST(0) ITEM "" ITEM "" ITEM "" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1C, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA9 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x32 0x00 0x00 0x01 // '????2???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x25 0x00 0x00 0x03 // '???%???' 0x0A 0x00 0x00 0xFD 0x31 0x00 0x00 0x03 // '???1???' 0x0F 0x00 0x00 0xFD 0x32 0x00 0x00 0x03 // '???2???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1E, 0x0) BYTE 0x03 0x03 0x52 0x65 0x6D 0x65 0x6D 0x62 // '??Rememb' 0x65 0x72 0x2C 0x20 0x69 0x66 0x20 0x79 // 'er, if y' 0x6F 0x75 0x20 0x6E 0x65 0x65 0x64 0x20 // 'ou need ' 0x68 0x65 0x6C 0x70 0x20 0x63 0x6C 0x69 // 'help cli' 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 0x48 // 'ck the H' 0x65 0x6C 0x70 0x20 0x4D 0x61 0x63 0x68 // 'elp Mach' 0x69 0x6E 0x65 0x21 // 'ine!' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK ================================================ FILE: src/help/easelhp.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ #undef __HELP_NAME #undef __HELP_SYMBOL #undef __HELP_PACK #undef __HELP_PACK2 #ifdef NO_HELP_NAMES #define __HELP_NAME(name) "" #else #define __HELP_NAME(name) name #endif #ifdef NO_HELP_SYMBOLS #define __HELP_SYMBOL(stuff) #else #define __HELP_SYMBOL(stuff) stuff #endif #ifdef PACK_HELP #define __HELP_PACK PACK #else #define __HELP_PACK #endif #ifdef HELP_SINGLE_CHUNK #define __HELP_PACK2 #else #define __HELP_PACK2 __HELP_PACK #endif SET _help_48544F50_0= ktpcEaselHelp00 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("CO UP--SCENE ORGANIZER")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("CO UP--SCENE ORGANIZER")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x0 0x0 0x57415645 kwavEaselHelp00 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_40=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcEaselHelp00" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavEaselHelp00" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_40=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0x3B 0x01 0x00 0x00 // '????;???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_13=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_40, 0x0) AG(4) FREE FREE FREE FREE ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcEaselHelp2F __HELP_SYMBOL( STN "ktpcEaselHelp2F" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcEaselHelp2E __HELP_SYMBOL( STN "ktpcEaselHelp2E" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_40=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_40, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x10 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0F 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x75 0x00 0x00 0x01 // '????u???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0F 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x75 0x00 0x00 0x03 // '????u???' 0x00 0x00 0x00 0x00 0x25 0x00 0x00 0x04 // '????%???' 0x0D 0x00 0x00 0xFE 0x2A 0x00 0x00 0x04 // '???*???' 0x00 0x00 0x00 0x00 0x56 0x00 0x00 0x04 // '????V???' 0x0D 0x00 0x00 0xFE 0x5A 0x00 0x00 0x04 // '???Z???' 0x00 0x00 0x00 0x00 0x25 0x00 0x00 0x40 // '????%??@' 0x06 0x00 0x00 0x00 0x2A 0x00 0x00 0x40 // '????*??@' 0x00 0x00 0x00 0x00 0x56 0x00 0x00 0x40 // '????V??@' 0x05 0x00 0x00 0x00 0x5A 0x00 0x00 0x40 // '????Z??@' 0x00 0x00 0x00 0x00 0x75 0x00 0x00 0x40 // '????u??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_40=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_40, 0x0) BYTE 0x03 0x03 0x53 0x63 0x65 0x6E 0x65 0x20 // '??Scene ' 0x4F 0x72 0x67 0x61 0x6E 0x69 0x7A 0x65 // 'Organize' 0x72 0x0D 0x0A 0x53 0x68 0x6F 0x77 0x73 // 'r??Shows' 0x20 0x79 0x6F 0x75 0x20 0x74 0x68 0x65 // ' you the' 0x20 0x66 0x69 0x72 0x73 0x74 0x20 0x66 // ' first f' 0x72 0x61 0x6D 0x65 0x20 0x6F 0x66 0x20 // 'rame of ' 0x65 0x61 0x63 0x68 0x20 0x73 0x63 0x65 // 'each sce' 0x6E 0x65 0x2E 0x20 0x20 0x54 0x6F 0x20 // 'ne. To ' 0x63 0x68 0x61 0x6E 0x67 0x65 0x20 0x74 // 'change t' 0x68 0x65 0x20 0x73 0x63 0x65 0x6E 0x65 // 'he scene' 0x20 0x6F 0x72 0x64 0x65 0x72 0x2C 0x20 // ' order, ' 0x64 0x72 0x61 0x67 0x20 0x61 0x20 0x73 // 'drag a s' 0x63 0x65 0x6E 0x65 0x20 0x77 0x68 0x65 // 'cene whe' 0x72 0x65 0x20 0x79 0x6F 0x75 0x20 0x77 // 're you w' 0x61 0x6E 0x74 0x20 0x69 0x74 0x2E // 'ant it.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1= ktpcEaselHelp01 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("blank")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("blank")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavEaselHelp01 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_5=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcEaselHelp01" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavEaselHelp01" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_6=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0xF8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_6=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_6=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) BYTE 0x03 0x03 0x62 0x6C 0x61 0x6E 0x6B // '??blank' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2= kttTransition1 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2, __HELP_NAME("tt--Cut to Black")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2, __HELP_NAME("tt--Cut to Black")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 0x0 kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavEaselHelp02 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttTransition1" ITEM "" ITEM "" ITEM "kidPlayToolTipSounds" ITEM "kwavEaselHelp02" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2, 0x0) BYTE 0x01 0x00 0x03 0x03 0x4D 0x00 0x00 0x00 // '????M???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0C 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0C 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) BYTE 0x03 0x03 0x43 0x75 0x74 0x20 0x74 0x6F // '??Cut to' 0x20 0x42 0x6C 0x61 0x63 0x6B // ' Black' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3= kttTransition2 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3, __HELP_NAME("tt--Dissolve")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3, __HELP_NAME("tt--Dissolve")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 0x0 kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavEaselHelp03 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttTransition2" ITEM "" ITEM "" ITEM "kidPlayToolTipSounds" ITEM "kwavEaselHelp03" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3, 0x0) BYTE 0x01 0x00 0x03 0x03 0x35 0x00 0x00 0x00 // '????5???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x08 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x08 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2D, 0x0) BYTE 0x03 0x03 0x44 0x69 0x73 0x73 0x6F 0x6C // '??Dissol' 0x76 0x65 // 've' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_4= kttTransition3 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4, __HELP_NAME("tt--Disolve with black")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4, __HELP_NAME("tt--Disolve with black")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 0x0 kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavEaselHelp04 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_20=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttTransition3" ITEM "" ITEM "" ITEM "kidPlayToolTipSounds" ITEM "kwavEaselHelp04" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_20=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4, 0x0) BYTE 0x01 0x00 0x03 0x03 0x71 0x00 0x00 0x00 // '????q???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_20=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_20, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x13 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x13 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_20=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_20, 0x0) BYTE 0x03 0x03 0x44 0x69 0x73 0x73 0x6F 0x6C // '??Dissol' 0x76 0x65 0x20 0x77 0x69 0x74 0x68 0x20 // 've with ' 0x42 0x6C 0x61 0x63 0x6B // 'Black' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_5= kttTransition4 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5, __HELP_NAME("tt--Dissolve with white")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5, __HELP_NAME("tt--Dissolve with white")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 0x0 kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavEaselHelp05 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttTransition4" ITEM "" ITEM "" ITEM "kidPlayToolTipSounds" ITEM "kwavEaselHelp05" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5, 0x0) BYTE 0x01 0x00 0x03 0x03 0x75 0x00 0x00 0x00 // '????u???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x13 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x13 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1B, 0x0) BYTE 0x03 0x03 0x44 0x69 0x73 0x73 0x6F 0x6C // '??Dissol' 0x76 0x65 0x20 0x77 0x69 0x74 0x68 0x20 // 've with ' 0x57 0x68 0x69 0x74 0x65 // 'White' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_6= kttSSorterHand #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6, __HELP_NAME("tt--Mover")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6, __HELP_NAME("tt--Mover")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 0x0 kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavEaselHelp06 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_31=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttSSorterHand" ITEM "" ITEM "" ITEM "kidPlayToolTipSounds" ITEM "kwavEaselHelp06" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_31=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6, 0x0) BYTE 0x01 0x00 0x03 0x03 0xBD 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_E=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_31, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcEaselHelp2F __HELP_SYMBOL( STN "ktpcEaselHelp2F" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_31=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_31, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0B 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x05 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x07 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x26 0x00 0x00 0x01 // '????&???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x05 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x07 0x00 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x0B 0x00 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x07 0x00 0x00 0x40 // '???????@' 0x02 0x00 0x00 0x00 0x0B 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x26 0x00 0x00 0x40 // '????&??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_31=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_31, 0x0) BYTE 0x03 0x03 0x4D 0x6F 0x76 0x65 0x72 0x0D // '??Mover?' 0x0A 0x44 0x72 0x61 0x67 0x20 0x61 0x20 // '?Drag a ' 0x73 0x63 0x65 0x6E 0x65 0x20 0x74 0x6F // 'scene to' 0x20 0x61 0x20 0x6E 0x65 0x77 0x20 0x6C // ' a new l' 0x6F 0x63 0x61 0x74 0x69 0x6F 0x6E 0x2E // 'ocation.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_7= kttSSorterNuke #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7, __HELP_NAME("tt--Remove Entire Scene")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7, __HELP_NAME("tt--Remove Entire Scene")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 0x0 kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavEaselHelp07 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttSSorterNuke" ITEM "" ITEM "" ITEM "kidPlayToolTipSounds" ITEM "kwavEaselHelp07" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA4 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_8=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x10 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_4=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x13 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x15 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x30 0x00 0x00 0x01 // '????0???' 0x00 0x00 0x00 0x00 0x15 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x1B 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x13 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x15 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x30 0x00 0x00 0x03 // '???0???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) BYTE 0x03 0x03 0x52 0x65 0x6D 0x6F 0x76 0x65 // '??Remove' 0x20 0x45 0x6E 0x74 0x69 0x72 0x65 0x20 // ' Entire ' 0x53 0x63 0x65 0x6E 0x65 0x0D 0x0A 0x52 // 'Scene??R' 0x65 0x6D 0x6F 0x76 0x65 0x20 0x74 0x68 // 'emove th' 0x65 0x20 0x73 0x63 0x65 0x6E 0x65 0x20 // 'e scene ' 0x79 0x6F 0x75 0x20 0x63 0x6C 0x69 0x63 // 'you clic' 0x6B 0x2E // 'k.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_8= kttSSorterOpen #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8, __HELP_NAME("tt--Find movie")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8, __HELP_NAME("tt--Find movie")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 0x0 kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavEaselHelp08 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_29=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttSSorterOpen" ITEM "" ITEM "" ITEM "kidPlayToolTipSounds" ITEM "kwavEaselHelp08" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_29=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC0 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_29=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_29, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x47 0x00 0x00 0x01 // '????G???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0A 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_29=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_29, 0x0) BYTE 0x03 0x03 0x46 0x69 0x6E 0x64 0x20 0x4D // '??Find M' 0x6F 0x76 0x69 0x65 0x0D 0x0A 0x46 0x69 // 'ovie??Fi' 0x6E 0x64 0x20 0x74 0x68 0x65 0x20 0x6D // 'nd the m' 0x6F 0x76 0x69 0x65 0x20 0x79 0x6F 0x75 // 'ovie you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F // ' want to' 0x20 0x61 0x74 0x74 0x61 0x63 0x68 0x20 // ' attach ' 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 0x65 // 'to the e' 0x6E 0x64 0x20 0x6F 0x66 0x20 0x74 0x68 // 'nd of th' 0x69 0x73 0x20 0x6D 0x6F 0x76 0x69 0x65 // 'is movie' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_9= kttEaselCancel #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_9, __HELP_NAME("tt--Cancel")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_9, __HELP_NAME("tt--Cancel")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip 0x0 0x0 kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavEaselHelp09 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_9, 0x0) GST(0) ITEM "kgobBalloonToolTip" ITEM "kttEaselCancel" ITEM "" ITEM "" ITEM "kidPlayToolTipSounds" ITEM "kwavEaselHelp09" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_9, 0x0) BYTE 0x01 0x00 0x03 0x03 0x79 0x00 0x00 0x00 // '????y???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x29 0x00 0x00 0x01 // '????)???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x08 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x29 0x00 0x00 0x03 // '???)???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2F, 0x0) BYTE 0x03 0x03 0x43 0x61 0x6E 0x63 0x65 0x6C // '??Cancel' 0x0D 0x0A 0x43 0x6C 0x6F 0x73 0x65 0x20 // '??Close ' 0x77 0x69 0x74 0x68 0x6F 0x75 0x74 0x20 // 'without ' 0x6D 0x61 0x6B 0x69 0x6E 0x67 0x20 0x61 // 'making a' 0x6E 0x79 0x20 0x63 0x68 0x61 0x6E 0x67 // 'ny chang' 0x65 0x73 0x2E // 'es.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_A= kttEaselOk #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_A, __HELP_NAME("tt--OK")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_A, __HELP_NAME("tt--OK")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip 0x0 0x0 kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavEaselHelp0A ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_A, 0x0) GST(0) ITEM "kgobBalloonToolTip" ITEM "kttEaselOk" ITEM "" ITEM "" ITEM "kidPlayToolTipSounds" ITEM "kwavEaselHelp0A" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x5A 0x00 0x00 0x00 // '????Z???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1F 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x04 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x1F 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B, 0x0) BYTE 0x03 0x03 0x4F 0x4B 0x0D 0x0A 0x43 0x6C // '??OK??Cl' 0x6F 0x73 0x65 0x20 0x61 0x6E 0x64 0x20 // 'ose and ' 0x6D 0x61 0x6B 0x65 0x20 0x61 0x6C 0x6C // 'make all' 0x20 0x63 0x68 0x61 0x6E 0x67 0x65 0x73 // ' changes' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_B= ktpcEaselHelp0B #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_B, __HELP_NAME("CO UP--3D WORDS")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_B, __HELP_NAME("CO UP--3D WORDS")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x0 0x57415645 kwavEaselHelp0B ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_B, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcEaselHelp0B" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavEaselHelp0B" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_B, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC9 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x08 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x0A 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x41 0x00 0x00 0x01 // '????A???' 0x01 0x00 0x00 0x00 0x4B 0x00 0x00 0x01 // '????K???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x08 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x4B 0x00 0x00 0x40 // '????K??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2A, 0x0) BYTE 0x03 0x03 0x33 0x44 0x20 0x57 0x6F 0x72 // '??3D Wor' 0x64 0x73 0x0D 0x0A 0x54 0x79 0x70 0x65 // 'ds??Type' 0x20 0x74 0x68 0x65 0x20 0x77 0x6F 0x72 // ' the wor' 0x64 0x73 0x20 0x79 0x6F 0x75 0x20 0x77 // 'ds you w' 0x61 0x6E 0x74 0x2E 0x20 0x20 0x49 0x66 // 'ant. If' 0x20 0x79 0x6F 0x75 0x20 0x6D 0x61 0x6B // ' you mak' 0x65 0x20 0x61 0x20 0x6D 0x69 0x73 0x74 // 'e a mist' 0x61 0x6B 0x65 0x2C 0x20 0x70 0x72 0x65 // 'ake, pre' 0x73 0x73 0x20 0x42 0x61 0x63 0x6B 0x73 // 'ss Backs' 0x70 0x61 0x63 0x65 0x2E // 'pace.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_C= ktpcEaselHelp0C #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_C, __HELP_NAME("Tip: More help")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_C, __HELP_NAME("Tip: More help")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavEaselHelp0C ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_C, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcEaselHelp0C" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavEaselHelp0C" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_0=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x15 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_A=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_0=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0C 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x0E 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1E 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x20 0x00 0x00 0x01 // '???? ???' 0x01 0x00 0x00 0x00 0x77 0x00 0x00 0x01 // '????w???' 0x00 0x00 0x00 0x00 0x0E 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x1E 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x20 0x00 0x00 0x80 // '???? ??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x20 0x00 0x00 0x82 // '???? ??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_0=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x4D 0x6F 0x72 // '??? Mor' 0x65 0x20 0x68 0x65 0x6C 0x70 0x0D 0x0A // 'e help??' 0x54 0x6F 0x20 0x67 0x65 0x74 0x20 0x6D // 'To get m' 0x6F 0x72 0x65 0x20 0x68 0x65 0x6C 0x70 // 'ore help' 0x0D 0x0A 0x95 0x09 0x4D 0x6F 0x76 0x65 // '???Move' 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 // ' the mou' 0x73 0x65 0x20 0x63 0x75 0x72 0x73 0x6F // 'se curso' 0x72 0x20 0x6F 0x76 0x65 0x72 0x20 0x74 // 'r over t' 0x68 0x65 0x20 0x74 0x68 0x69 0x6E 0x67 // 'he thing' 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E // ' you wan' 0x74 0x20 0x68 0x65 0x6C 0x70 0x20 0x6F // 't help o' 0x6E 0x2E 0x20 0x20 0x57 0x61 0x69 0x74 // 'n. Wait' 0x2E 0x2E 0x2E 0x61 0x20 0x64 0x65 0x73 // '...a des' 0x63 0x72 0x69 0x70 0x74 0x69 0x6F 0x6E // 'cription' 0x20 0x61 0x70 0x70 0x65 0x61 0x72 0x73 // ' appears' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_D= kttSpltFont #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_D, __HELP_NAME("tt--Letters")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_D, __HELP_NAME("tt--Letters")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip 0x0 0x0 kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavEaselHelp0D ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_6=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_D, 0x0) GST(0) ITEM "kgobBalloonToolTip" ITEM "kttSpltFont" ITEM "" ITEM "" ITEM "kidPlayToolTipSounds" ITEM "kwavEaselHelp0D" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_5=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_D, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_5=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x25 0x00 0x00 0x01 // '????%???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x25 0x00 0x00 0x02 // '????%???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x09 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x25 0x00 0x00 0x03 // '???%???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_5=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x03 0x03 0x4C 0x65 0x74 0x74 0x65 0x72 // '??Letter' 0x73 0x0D 0x0A 0x43 0x68 0x61 0x6E 0x67 // 's??Chang' 0x65 0x20 0x74 0x68 0x65 0x20 0x77 0x61 // 'e the wa' 0x79 0x20 0x6C 0x65 0x74 0x74 0x65 0x72 // 'y letter' 0x73 0x20 0x6C 0x6F 0x6F 0x6B 0x21 // 's look!' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_E= kttSpltShape #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_E, __HELP_NAME("tt--Shape")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_E, __HELP_NAME("tt--Shape")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip 0x0 0x0 kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavEaselHelp0E ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_E, 0x0) GST(0) ITEM "kgobBalloonToolTip" ITEM "kttSpltShape" ITEM "" ITEM "" ITEM "kidPlayToolTipSounds" ITEM "kwavEaselHelp0E" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_E, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE9 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_12=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3E, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_3E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2D 0x00 0x00 0x01 // '????-???' 0x00 0x00 0x00 0x00 0x05 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x07 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x07 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x2D 0x00 0x00 0x03 // '???-???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3E, 0x0) BYTE 0x03 0x03 0x53 0x68 0x61 0x70 0x65 0x0D // '??Shape?' 0x0A 0x57 0x61 0x72 0x70 0x20 0x79 0x6F // '?Warp yo' 0x75 0x72 0x20 0x77 0x6F 0x72 0x64 0x73 // 'ur words' 0x20 0x69 0x6E 0x74 0x6F 0x20 0x64 0x69 // ' into di' 0x66 0x66 0x65 0x72 0x65 0x6E 0x74 0x20 // 'fferent ' 0x73 0x68 0x61 0x70 0x65 0x73 0x2E // 'shapes.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_F= kttSpltTextures #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_F, __HELP_NAME("tt--Patterns & Colors")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_F, __HELP_NAME("tt--Patterns & Colors")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip 0x0 0x0 kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavEaselHelp0F ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_26=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_F, 0x0) GST(0) ITEM "kgobBalloonToolTip" ITEM "kttSpltTextures" ITEM "" ITEM "" ITEM "kidPlayToolTipSounds" ITEM "kwavEaselHelp0F" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_26=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x69 0x00 0x00 0x00 // '????i???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_26=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_26, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x11 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x11 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_26=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_26, 0x0) BYTE 0x03 0x03 0x50 0x61 0x74 0x74 0x65 0x72 // '??Patter' 0x6E 0x73 0x20 0x26 0x20 0x43 0x6F 0x6C // 'ns & Col' 0x6F 0x72 0x73 // 'ors' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_10= kttSpltTransmogrify #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_10, __HELP_NAME("tt--Cool ideas")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_10, __HELP_NAME("tt--Cool ideas")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip 0x0 0x0 kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavEaselHelp10 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_18=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_10, 0x0) GST(0) ITEM "kgobBalloonToolTip" ITEM "kttSpltTransmogrify" ITEM "" ITEM "" ITEM "kidPlayToolTipSounds" ITEM "kwavEaselHelp10" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_18=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_10, 0x0) BYTE 0x01 0x00 0x03 0x03 0x40 0x00 0x00 0x00 // '????@???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_18=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_18, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0A 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0A 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_18=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_18, 0x0) BYTE 0x03 0x03 0x43 0x6F 0x6F 0x6C 0x20 0x49 // '??Cool I' 0x64 0x65 0x61 0x73 // 'deas' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_11= kttSpltRotate #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_11, __HELP_NAME("tt--Preview")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_11, __HELP_NAME("tt--Preview")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip 0x0 0x0 kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavEaselHelp11 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_11, 0x0) GST(0) ITEM "kgobBalloonToolTip" ITEM "kttSpltRotate" ITEM "" ITEM "" ITEM "kidPlayToolTipSounds" ITEM "kwavEaselHelp11" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_11, 0x0) BYTE 0x01 0x00 0x03 0x03 0xCA 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x4E 0x00 0x00 0x01 // '????N???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x09 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x4E 0x00 0x00 0x03 // '???N???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) BYTE 0x03 0x03 0x50 0x72 0x65 0x76 0x69 0x65 // '??Previe' 0x77 0x0D 0x0A 0x43 0x6C 0x69 0x63 0x6B // 'w??Click' 0x20 0x72 0x65 0x70 0x65 0x61 0x74 0x65 // ' repeate' 0x64 0x6C 0x79 0x20 0x74 0x6F 0x20 0x73 // 'dly to s' 0x65 0x65 0x20 0x77 0x68 0x61 0x74 0x20 // 'ee what ' 0x79 0x6F 0x75 0x72 0x20 0x33 0x44 0x20 // 'your 3D ' 0x77 0x6F 0x72 0x64 0x73 0x20 0x6C 0x6F // 'words lo' 0x6F 0x6B 0x20 0x6C 0x69 0x6B 0x65 0x20 // 'ok like ' 0x66 0x72 0x6F 0x6D 0x20 0x61 0x6C 0x6C // 'from all' 0x20 0x61 0x6E 0x67 0x6C 0x65 0x73 0x2E // ' angles.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_12= ktpcEaselHelp12 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_12, __HELP_NAME("Cut")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_12, __HELP_NAME("Cut")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip 0x0 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 kwavEaselHelp12 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_12, 0x0) GST(0) ITEM "kgobBalloonToolTip" ITEM "ktpcEaselHelp12" ITEM "" ITEM "" ITEM "" ITEM "kwavEaselHelp12" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_12, 0x0) BYTE 0x01 0x00 0x03 0x03 0xEF 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x8C 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x03 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x1D 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x62 0x00 0x00 0x03 // '???b???' 0x0A 0x00 0x00 0xFD 0x6D 0x00 0x00 0x03 // '???m???' 0x0F 0x00 0x00 0xFD 0x78 0x00 0x00 0x03 // '???x???' 0x0A 0x00 0x00 0xFD 0x7C 0x00 0x00 0x03 // '???|???' 0x0F 0x00 0x00 0xFD 0x81 0x00 0x00 0x03 // '??????' 0x0A 0x00 0x00 0xFD 0x85 0x00 0x00 0x03 // '??????' 0x0F 0x00 0x00 0xFD 0x8C 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D, 0x0) BYTE 0x03 0x03 0x43 0x75 0x74 0x0D 0x0A 0x46 // '??Cut??F' 0x69 0x6E 0x64 0x20 0x50 0x61 0x74 0x74 // 'ind Patt' 0x65 0x72 0x6E 0x73 0x20 0x26 0x20 0x43 // 'erns & C' 0x6F 0x6C 0x6F 0x72 0x73 0x0D 0x0A 0x46 // 'olors??F' 0x69 0x6E 0x64 0x20 0x6F 0x74 0x68 0x65 // 'ind othe' 0x72 0x20 0x70 0x61 0x74 0x74 0x65 0x72 // 'r patter' 0x6E 0x73 0x20 0x79 0x6F 0x75 0x20 0x77 // 'ns you w' 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 0x61 // 'ant to a' 0x70 0x70 0x6C 0x79 0x20 0x74 0x6F 0x20 // 'pply to ' 0x79 0x6F 0x75 0x72 0x20 0x33 0x44 0x20 // 'your 3D ' 0x77 0x6F 0x72 0x64 0x73 0x2E 0x20 0x20 // 'words. ' 0x59 0x6F 0x75 0x20 0x63 0x61 0x6E 0x20 // 'You can ' 0x75 0x73 0x65 0x20 0x46 0x69 0x6E 0x65 // 'use Fine' 0x20 0x41 0x72 0x74 0x69 0x73 0x74 0x20 // ' Artist ' 0x70 0x69 0x63 0x74 0x75 0x72 0x65 0x73 // 'pictures' 0x2C 0x20 0x2E 0x62 0x6D 0x70 0x20 0x61 // ', .bmp a' 0x6E 0x64 0x20 0x2E 0x77 0x6D 0x66 0x20 // 'nd .wmf ' 0x66 0x69 0x6C 0x65 0x73 0x2E // 'files.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_13= ktpcEaselHelp13 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_13, __HELP_NAME("CO UP--LISTENER BROWSER")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_13, __HELP_NAME("CO UP--LISTENER BROWSER")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x154 0x57415645 kwavEaselHelp13 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_12=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_13, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcEaselHelp13" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavEaselHelp13" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_12=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_13, 0x0) BYTE 0x01 0x00 0x03 0x03 0xF5 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_4=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_12, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'GOKD' 0x16102 0xFFFFFFFF __HELP_SYMBOL( STN ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcEaselHelp3B __HELP_SYMBOL( STN "ktpcEaselHelp3B" ) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcEaselHelp2F __HELP_SYMBOL( STN "ktpcEaselHelp2F" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_12=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_12, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x10 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x08 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x0A 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x94 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x08 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x0A 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x7F 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x64 0x00 0x00 0x04 // '????d???' 0x0D 0x00 0x00 0xFE 0x68 0x00 0x00 0x04 // '???h???' 0x00 0x00 0x00 0x00 0x64 0x00 0x00 0x40 // '????d??@' 0x04 0x00 0x00 0x00 0x68 0x00 0x00 0x40 // '????h??@' 0x00 0x00 0x00 0x00 0x81 0x00 0x00 0x40 // '??????@' 0x02 0x00 0x00 0x00 0x94 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x81 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x81 0x00 0x00 0xC0 // '??????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_12=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_12, 0x0) BYTE 0x03 0x03 0x4C 0x69 0x73 0x74 0x65 0x6E // '??Listen' 0x65 0x72 0x0D 0x0A 0x53 0x68 0x6F 0x77 // 'er??Show' 0x73 0x20 0x79 0x6F 0x75 0x20 0x61 0x6C // 's you al' 0x6C 0x20 0x74 0x68 0x65 0x20 0x73 0x6F // 'l the so' 0x75 0x6E 0x64 0x73 0x20 0x61 0x74 0x74 // 'unds att' 0x61 0x63 0x68 0x65 0x64 0x20 0x74 0x6F // 'ached to' 0x20 0x74 0x68 0x65 0x20 0x6F 0x62 0x6A // ' the obj' 0x65 0x63 0x74 0x20 0x79 0x6F 0x75 0x20 // 'ect you ' 0x63 0x6C 0x69 0x63 0x6B 0x65 0x64 0x2E // 'clicked.' 0x20 0x20 0x54 0x6F 0x20 0x63 0x68 0x61 // ' To cha' 0x6E 0x67 0x65 0x20 0x74 0x68 0x65 0x20 // 'nge the ' 0x73 0x6F 0x75 0x6E 0x64 0x20 0x76 0x6F // 'sound vo' 0x6C 0x75 0x6D 0x65 0x2C 0x20 0x64 0x72 // 'lume, dr' 0x61 0x67 0x20 0x74 0x68 0x65 0x20 0x73 // 'ag the s' 0x6C 0x69 0x64 0x65 0x72 0x20 0x75 0x70 // 'lider up' 0x20 0x6F 0x72 0x20 0x64 0x6F 0x77 0x6E // ' or down' 0x2E 0x0D 0x0A 0x01 0x20 0x20 0x52 0x65 // '.??? Re' 0x6D 0x6F 0x76 0x69 0x6E 0x67 0x20 0x61 // 'moving a' 0x20 0x73 0x6F 0x75 0x6E 0x64 // ' sound' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_14= kttListenVolSpeech #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_14, __HELP_NAME("tt--Slider")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_14, __HELP_NAME("tt--Slider")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip 0x0 0x0 kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavEaselHelp14 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_14, 0x0) GST(0) ITEM "kgobBalloonToolTip" ITEM "kttListenVolSpeech" ITEM "" ITEM "" ITEM "kidPlayToolTipSounds" ITEM "kwavEaselHelp14" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_14, 0x0) BYTE 0x01 0x00 0x03 0x03 0x2A 0x00 0x00 0x00 // '????*???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x06 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x06 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) BYTE 0x03 0x03 0x53 0x6C 0x69 0x64 0x65 0x72 // '??Slider' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_15= ktpcEaselHelp15 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_15, __HELP_NAME("CO UP--COSTUME CHANGER")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_15, __HELP_NAME("CO UP--COSTUME CHANGER")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x0 0x57415645 kwavEaselHelp15 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_9=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_15, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcEaselHelp15" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavEaselHelp15" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_9=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_15, 0x0) BYTE 0x01 0x00 0x03 0x03 0xF3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_9=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_9, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0F 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x64 0x00 0x00 0x01 // '????d???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0F 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x26 0x00 0x00 0x03 // '???&???' 0x00 0x00 0x00 0x00 0x64 0x00 0x00 0x03 // '????d???' 0x00 0x00 0x00 0x00 0x64 0x00 0x00 0x40 // '????d??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_9=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_9, 0x0) BYTE 0x03 0x03 0x43 0x6F 0x73 0x74 0x75 0x6D // '??Costum' 0x65 0x20 0x43 0x68 0x61 0x6E 0x67 0x65 // 'e Change' 0x72 0x0D 0x0A 0x54 0x6F 0x20 0x63 0x68 // 'r??To ch' 0x61 0x6E 0x67 0x65 0x20 0x61 0x20 0x63 // 'ange a c' 0x6F 0x73 0x74 0x75 0x6D 0x65 0x2C 0x20 // 'ostume, ' 0x63 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 // 'click th' 0x65 0x20 0x61 0x63 0x74 0x6F 0x72 0x20 // 'e actor ' 0x6F 0x72 0x20 0x70 0x72 0x6F 0x70 0x20 // 'or prop ' 0x75 0x6E 0x74 0x69 0x6C 0x20 0x79 0x6F // 'until yo' 0x75 0x20 0x66 0x69 0x6E 0x64 0x20 0x74 // 'u find t' 0x68 0x65 0x20 0x22 0x63 0x6F 0x73 0x74 // 'he "cost' 0x75 0x6D 0x65 0x22 0x20 0x79 0x6F 0x75 // 'ume" you' 0x20 0x6C 0x69 0x6B 0x65 0x2E // ' like.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_16= kttCostAccessories #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_16, __HELP_NAME("tt--Accessories")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_16, __HELP_NAME("tt--Accessories")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip 0x0 0x0 kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavEaselHelp16 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_16, 0x0) GST(0) ITEM "kgobBalloonToolTip" ITEM "kttCostAccessories" ITEM "" ITEM "" ITEM "kidPlayToolTipSounds" ITEM "kwavEaselHelp16" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_16, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x59 0x00 0x00 0x01 // '????Y???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0D 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x59 0x00 0x00 0x03 // '???Y???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1D, 0x0) BYTE 0x03 0x03 0x41 0x63 0x63 0x65 0x73 0x73 // '??Access' 0x6F 0x72 0x69 0x65 0x73 0x0D 0x0A 0x41 // 'ories??A' 0x64 0x64 0x20 0x61 0x63 0x63 0x65 0x73 // 'dd acces' 0x73 0x6F 0x72 0x69 0x65 0x73 0x97 0x68 // 'soriesh' 0x61 0x74 0x73 0x2C 0x20 0x67 0x6C 0x61 // 'ats, gla' 0x73 0x73 0x65 0x73 0x2C 0x20 0x61 0x6E // 'sses, an' 0x64 0x20 0x73 0x6F 0x20 0x6F 0x6E 0x97 // 'd so on' 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 0x70 // 'to the p' 0x61 0x72 0x74 0x20 0x6F 0x66 0x20 0x74 // 'art of t' 0x68 0x65 0x20 0x61 0x63 0x74 0x6F 0x72 // 'he actor' 0x20 0x79 0x6F 0x75 0x20 0x63 0x6C 0x69 // ' you cli' 0x63 0x6B 0x2E // 'ck.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_17= kttCostRotate #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_17, __HELP_NAME("tt--Preview Costume")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_17, __HELP_NAME("tt--Preview Costume")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip 0x0 0x0 kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavEaselHelp17 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_17, 0x0) GST(0) ITEM "kgobBalloonToolTip" ITEM "kttCostRotate" ITEM "" ITEM "" ITEM "kidPlayToolTipSounds" ITEM "kwavEaselHelp17" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_17, 0x0) BYTE 0x01 0x00 0x03 0x03 0xDC 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x51 0x00 0x00 0x01 // '????Q???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x09 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x51 0x00 0x00 0x03 // '???Q???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1C, 0x0) BYTE 0x03 0x03 0x50 0x72 0x65 0x76 0x69 0x65 // '??Previe' 0x77 0x0D 0x0A 0x43 0x6C 0x69 0x63 0x6B // 'w??Click' 0x20 0x72 0x65 0x70 0x65 0x61 0x74 0x65 // ' repeate' 0x64 0x6C 0x79 0x20 0x74 0x6F 0x20 0x73 // 'dly to s' 0x65 0x65 0x20 0x77 0x68 0x61 0x74 0x20 // 'ee what ' 0x74 0x68 0x65 0x20 0x6E 0x65 0x77 0x20 // 'the new ' 0x63 0x6F 0x73 0x74 0x75 0x6D 0x65 0x20 // 'costume ' 0x6C 0x6F 0x6F 0x6B 0x73 0x20 0x6C 0x69 // 'looks li' 0x6B 0x65 0x20 0x66 0x72 0x6F 0x6D 0x20 // 'ke from ' 0x61 0x6C 0x6C 0x20 0x61 0x6E 0x67 0x6C // 'all angl' 0x65 0x73 0x2E // 'es.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_18= kttCostCostumes #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_18, __HELP_NAME("tt--Costumes")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_18, __HELP_NAME("tt--Costumes")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip 0x0 0x0 kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavEaselHelp18 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_18, 0x0) GST(0) ITEM "kgobBalloonToolTip" ITEM "kttCostCostumes" ITEM "" ITEM "" ITEM "kidPlayToolTipSounds" ITEM "kwavEaselHelp18" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_18, 0x0) BYTE 0x01 0x00 0x03 0x03 0xEE 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_3=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x59 0x00 0x00 0x01 // '????Y???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0A 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x59 0x00 0x00 0x03 // '???Y???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) BYTE 0x03 0x03 0x43 0x6F 0x73 0x74 0x75 0x6D // '??Costum' 0x65 0x73 0x0D 0x0A 0x43 0x68 0x61 0x6E // 'es??Chan' 0x67 0x65 0x20 0x63 0x6F 0x73 0x74 0x75 // 'ge costu' 0x6D 0x65 0x73 0x20 0x62 0x79 0x20 0x63 // 'mes by c' 0x6C 0x69 0x63 0x6B 0x69 0x6E 0x67 0x20 // 'licking ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x6F // 'the acto' 0x72 0x20 0x6F 0x72 0x20 0x70 0x72 0x6F // 'r or pro' 0x70 0x20 0x75 0x6E 0x74 0x69 0x6C 0x20 // 'p until ' 0x79 0x6F 0x75 0x20 0x73 0x65 0x65 0x20 // 'you see ' 0x61 0x20 0x63 0x6F 0x73 0x74 0x75 0x6D // 'a costum' 0x65 0x20 0x79 0x6F 0x75 0x20 0x6C 0x69 // 'e you li' 0x6B 0x65 0x2E // 'ke.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_19= ktpcEaselHelp19 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_19, __HELP_NAME("CO Up--SOUND EFFECTS")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_19, __HELP_NAME("CO Up--SOUND EFFECTS")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0xF1 0x0 0x57415645 kwavEaselHelp19 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_19, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcEaselHelp19" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavEaselHelp19" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_19, 0x0) BYTE 0x01 0x00 0x03 0x03 0x00 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x42 0x00 0x00 0x01 // '????B???' 0x01 0x00 0x00 0x00 0x56 0x00 0x00 0x01 // '????V???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x00 0x00 0x00 0x00 0x56 0x00 0x00 0x40 // '????V??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2C, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x73 0x6F 0x75 0x6E // 'the soun' 0x64 0x20 0x65 0x66 0x66 0x65 0x63 0x74 // 'd effect' 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E // ' you wan' 0x74 0x20 0x74 0x6F 0x20 0x70 0x72 0x65 // 't to pre' 0x76 0x69 0x65 0x77 0x2E 0x0D 0x0A 0x57 // 'view.??W' 0x68 0x65 0x6E 0x20 0x79 0x6F 0x75 0x20 // 'hen you ' 0x66 0x69 0x6E 0x64 0x20 0x74 0x68 0x65 // 'find the' 0x20 0x6F 0x6E 0x65 0x20 0x79 0x6F 0x75 // ' one you' 0x20 0x77 0x61 0x6E 0x74 0x2C 0x20 0x63 // ' want, c' 0x6C 0x69 0x63 0x6B 0x20 0x4F 0x4B 0x2E // 'lick OK.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1A= kttBrowserRecord #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1A, __HELP_NAME("tt--Remove sound")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1A, __HELP_NAME("tt--Remove sound")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip 0x0 0x0 kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavEaselHelp1A ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1A, 0x0) GST(0) ITEM "kgobBalloonToolTip" ITEM "kttBrowserRecord" ITEM "" ITEM "" ITEM "kidPlayToolTipSounds" ITEM "kwavEaselHelp1A" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x67 0x00 0x00 0x00 // '????g???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0F 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0F 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2E, 0x0) BYTE 0x03 0x03 0x52 0x65 0x63 0x6F 0x72 0x64 // '??Record' 0x20 0x59 0x6F 0x75 0x72 0x20 0x4F 0x77 // ' Your Ow' 0x6E // 'n' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1B= kttBrowserImportFX #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1B, __HELP_NAME("tt--Find sound effects")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1B, __HELP_NAME("tt--Find sound effects")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip 0x0 0x0 kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavEaselHelp1B ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1B, 0x0) GST(0) ITEM "kgobBalloonToolTip" ITEM "kttBrowserImportFX" ITEM "" ITEM "" ITEM "kidPlayToolTipSounds" ITEM "kwavEaselHelp1B" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1B, 0x0) BYTE 0x01 0x00 0x03 0x03 0xF6 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x61 0x00 0x00 0x01 // '????a???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x12 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x61 0x00 0x00 0x03 // '???a???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) BYTE 0x03 0x03 0x46 0x69 0x6E 0x64 0x20 0x53 // '??Find S' 0x6F 0x75 0x6E 0x64 0x20 0x45 0x66 0x66 // 'ound Eff' 0x65 0x63 0x74 0x73 0x0D 0x0A 0x46 0x69 // 'ects??Fi' 0x6E 0x64 0x20 0x6F 0x74 0x68 0x65 0x72 // 'nd other' 0x20 0x73 0x6F 0x75 0x6E 0x64 0x20 0x65 // ' sound e' 0x66 0x66 0x65 0x63 0x74 0x73 0x2E 0x20 // 'ffects. ' 0x20 0x59 0x6F 0x75 0x20 0x63 0x61 0x6E // ' You can' 0x20 0x69 0x6D 0x70 0x6F 0x72 0x74 0x20 // ' import ' 0x57 0x61 0x76 0x65 0x20 0x6F 0x72 0x20 // 'Wave or ' 0x6F 0x74 0x68 0x65 0x72 0x20 0x33 0x44 // 'other 3D' 0x20 0x4D 0x6F 0x76 0x69 0x65 0x20 0x4D // ' Movie M' 0x61 0x6B 0x65 0x72 0x20 0x66 0x69 0x6C // 'aker fil' 0x65 0x73 0x2E // 'es.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1C= ktpcEaselHelp1C #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1C, __HELP_NAME("tt--Cancel")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1C, __HELP_NAME("tt--Cancel")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip 0x0 0x0 kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavEaselHelp1C ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1C, 0x0) GST(0) ITEM "kgobBalloonToolTip" ITEM "ktpcEaselHelp1C" ITEM "" ITEM "" ITEM "kidPlayToolTipSounds" ITEM "kwavEaselHelp1C" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x73 0x00 0x00 0x00 // '????s???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x08 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x08 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x15 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) BYTE 0x03 0x03 0x43 0x61 0x6E 0x63 0x65 0x6C // '??Cancel' 0x0D 0x0A 0x55 0x73 0x65 0x20 0x74 0x6F // '??Use to' 0x70 0x69 0x63 0x20 0x23 0x39 0x2E // 'pic #9.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1D= ktpcEaselHelp1D #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1D, __HELP_NAME("tt--OK")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1D, __HELP_NAME("tt--OK")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip 0x0 0x0 kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavEaselHelp1D ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_19=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1D, 0x0) GST(0) ITEM "kgobBalloonToolTip" ITEM "ktpcEaselHelp1D" ITEM "" ITEM "" ITEM "kidPlayToolTipSounds" ITEM "kwavEaselHelp1D" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_19=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x54 0x00 0x00 0x00 // '????T???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_19=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_19, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x04 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x04 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x12 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_19=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_19, 0x0) BYTE 0x03 0x03 0x4F 0x4B 0x0D 0x0A 0x55 0x73 // '??OK??Us' 0x65 0x20 0x74 0x6F 0x70 0x69 0x63 0x20 // 'e topic ' 0x23 0x31 0x30 0x2E // '#10.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1E= ktpcEaselHelp1E #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1E, __HELP_NAME("CO Up--RECORD YOUR OWN")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1E, __HELP_NAME("CO Up--RECORD YOUR OWN")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x0 0x57415645 kwavEaselHelp1E ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1E, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcEaselHelp1E" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavEaselHelp1E" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1E, 0x0) BYTE 0x01 0x00 0x03 0x03 0xCE 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1F, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSoundRecord __HELP_SYMBOL( STN "mbmpSoundRecord" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_1F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0F 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1A 0x00 0x00 0x01 // '????????' 0x01 0xF6 0x00 0x00 0x31 0x00 0x00 0x01 // '???1???' 0x01 0x00 0x00 0x00 0x9C 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x1A 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x1B 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x1C 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x9C 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x34 0x00 0x00 0x80 // '????4??' 0x00 0x00 0x03 0x00 0x51 0x00 0x00 0x80 // '????Q??' 0x00 0x00 0x02 0x00 0x73 0x00 0x00 0x80 // '????s??' 0x00 0x00 0x00 0x00 0x34 0x00 0x00 0x82 // '????4??' 0x05 0x00 0x00 0x00 0x91 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x31 0x00 0x00 0xC0 // '????1??' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1F, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x72 0x65 0x63 // '??To rec' 0x6F 0x72 0x64 0x20 0x79 0x6F 0x75 0x72 // 'ord your' 0x20 0x6F 0x77 0x6E 0x20 0x73 0x6F 0x75 // ' own sou' 0x6E 0x64 0x0D 0x0A 0x31 0x09 0x43 0x6C // 'nd??1?Cl' 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 // 'ick the ' 0x4D 0x69 0x63 0x72 0x6F 0x70 0x68 0x6F // 'Micropho' 0x6E 0x65 0x2D 0x01 0x0D 0x0A 0x54 0x68 // 'ne-???Th' 0x65 0x20 0x62 0x75 0x74 0x74 0x6F 0x6E // 'e button' 0x20 0x63 0x68 0x61 0x6E 0x67 0x65 0x73 // ' changes' 0x20 0x74 0x6F 0x20 0x53 0x74 0x6F 0x70 // ' to Stop' 0x2E 0x0D 0x0A 0x32 0x09 0x54 0x6F 0x20 // '.??2?To ' 0x73 0x74 0x6F 0x70 0x20 0x72 0x65 0x63 // 'stop rec' 0x6F 0x72 0x64 0x69 0x6E 0x67 0x2C 0x20 // 'ording, ' 0x63 0x6C 0x69 0x63 0x6B 0x20 0x53 0x74 // 'click St' 0x6F 0x70 0x2E 0x0D 0x0A 0x33 0x09 0x54 // 'op.??3?T' 0x79 0x70 0x65 0x20 0x61 0x20 0x6E 0x61 // 'ype a na' 0x6D 0x65 0x20 0x66 0x6F 0x72 0x20 0x74 // 'me for t' 0x68 0x65 0x20 0x73 0x6F 0x75 0x6E 0x64 // 'he sound' 0x2E 0x0D 0x0A 0x34 0x09 0x43 0x6C 0x69 // '.??4?Cli' 0x63 0x6B 0x20 0x4F 0x4B 0x2E // 'ck OK.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1F= kttRecordRecord #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1F, __HELP_NAME("tt--Microphone")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1F, __HELP_NAME("tt--Microphone")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip 0x0 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 kwavEaselHelp1F ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_0=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1F, 0x0) GST(0) ITEM "kgobBalloonToolTip" ITEM "kttRecordRecord" ITEM "" ITEM "" ITEM "" ITEM "kwavEaselHelp1F" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x88 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x35 0x00 0x00 0x01 // '????5???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0A 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x35 0x00 0x00 0x03 // '???5???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x03 0x03 0x4D 0x69 0x63 0x72 0x6F 0x70 // '??Microp' 0x68 0x6F 0x6E 0x65 0x0D 0x0A 0x52 0x65 // 'hone??Re' 0x63 0x6F 0x72 0x64 0x20 0x79 0x6F 0x75 // 'cord you' 0x72 0x20 0x6F 0x77 0x6E 0x20 0x73 0x6F // 'r own so' 0x75 0x6E 0x64 0x20 0x28 0x75 0x70 0x20 // 'und (up ' 0x74 0x6F 0x20 0x31 0x30 0x20 0x73 0x65 // 'to 10 se' 0x63 0x6F 0x6E 0x64 0x73 0x29 0x2E // 'conds).' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_20= kttRecordPlay #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_20, __HELP_NAME("tt--Play")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_20, __HELP_NAME("tt--Play")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip 0x0 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 kwavEaselHelp20 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_16=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_20, 0x0) GST(0) ITEM "kgobBalloonToolTip" ITEM "kttRecordPlay" ITEM "" ITEM "" ITEM "" ITEM "kwavEaselHelp20" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_17=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_20, 0x0) BYTE 0x01 0x00 0x03 0x03 0x5C 0x00 0x00 0x00 // '????\???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_17=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_17, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x22 0x00 0x00 0x01 // '????"???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x04 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x22 0x00 0x00 0x03 // '???"???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_17=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_17, 0x0) BYTE 0x03 0x03 0x50 0x6C 0x61 0x79 0x0D 0x0A // '??Play??' 0x50 0x6C 0x61 0x79 0x20 0x62 0x61 0x63 // 'Play bac' 0x6B 0x20 0x77 0x68 0x61 0x74 0x20 0x79 // 'k what y' 0x6F 0x75 0x20 0x72 0x65 0x63 0x6F 0x72 // 'ou recor' 0x64 0x65 0x64 0x2E // 'ded.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_21= ktpcEaselHelp21 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_21, __HELP_NAME("tt--Name Sound")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_21, __HELP_NAME("tt--Name Sound")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip 0x0 0x0 kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavEaselHelp21 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_21, 0x0) GST(0) ITEM "kgobBalloonToolTip" ITEM "ktpcEaselHelp21" ITEM "" ITEM "" ITEM "kidPlayToolTipSounds" ITEM "kwavEaselHelp21" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_21, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x50 0x00 0x00 0x01 // '????P???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0C 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x50 0x00 0x00 0x03 // '???P???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1A, 0x0) BYTE 0x03 0x03 0x4E 0x61 0x6D 0x65 0x20 0x53 // '??Name S' 0x6F 0x75 0x6E 0x64 0x0D 0x0A 0x54 0x79 // 'ound??Ty' 0x70 0x65 0x20 0x61 0x20 0x6E 0x61 0x6D // 'pe a nam' 0x65 0x20 0x66 0x6F 0x72 0x20 0x79 0x6F // 'e for yo' 0x75 0x72 0x20 0x73 0x6F 0x75 0x6E 0x64 // 'ur sound' 0x2E 0x20 0x20 0x49 0x66 0x20 0x79 0x6F // '. If yo' 0x75 0x20 0x6D 0x61 0x6B 0x65 0x20 0x61 // 'u make a' 0x20 0x6D 0x69 0x73 0x74 0x61 0x6B 0x65 // ' mistake' 0x2C 0x20 0x70 0x72 0x65 0x73 0x73 0x20 // ', press ' 0x42 0x61 0x63 0x6B 0x73 0x70 0x61 0x63 // 'Backspac' 0x65 0x2E // 'e.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_22= ktpcEaselHelp22 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_22, __HELP_NAME("tt--Cancel")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_22, __HELP_NAME("tt--Cancel")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip 0x0 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 kwavEaselHelp22 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_14=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_22, 0x0) GST(0) ITEM "kgobBalloonToolTip" ITEM "ktpcEaselHelp22" ITEM "" ITEM "" ITEM "" ITEM "kwavEaselHelp22" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_14=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_22, 0x0) BYTE 0x01 0x00 0x03 0x03 0x73 0x00 0x00 0x00 // '????s???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_14=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_14, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x08 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x08 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x15 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_14=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_14, 0x0) BYTE 0x03 0x03 0x43 0x61 0x6E 0x63 0x65 0x6C // '??Cancel' 0x0D 0x0A 0x55 0x73 0x65 0x20 0x74 0x6F // '??Use to' 0x70 0x69 0x63 0x20 0x23 0x39 0x2E // 'pic #9.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_23= ktpcEaselHelp23 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_23, __HELP_NAME("tt--OK")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_23, __HELP_NAME("tt--OK")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip 0x0 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 kwavEaselHelp23 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_21=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_23, 0x0) GST(0) ITEM "kgobBalloonToolTip" ITEM "ktpcEaselHelp23" ITEM "" ITEM "" ITEM "" ITEM "kwavEaselHelp23" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_21=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_23, 0x0) BYTE 0x01 0x00 0x03 0x03 0x54 0x00 0x00 0x00 // '????T???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_21=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_21, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x04 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x04 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x12 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_21=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_21, 0x0) BYTE 0x03 0x03 0x4F 0x4B 0x0D 0x0A 0x55 0x73 // '??OK??Us' 0x65 0x20 0x74 0x6F 0x70 0x69 0x63 0x20 // 'e topic ' 0x23 0x31 0x30 0x2E // '#10.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_24= ktpcEaselHelp24 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_24, __HELP_NAME("CO UP--SPEECH BROWSER")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_24, __HELP_NAME("CO UP--SPEECH BROWSER")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0xF1 0x0 0x57415645 kwavEaselHelp24 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_36=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_24, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcEaselHelp24" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavEaselHelp24" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_36=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_24, 0x0) BYTE 0x01 0x00 0x03 0x03 0x51 0x01 0x00 0x00 // '????Q???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_36=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_36, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x6D 0x00 0x00 0x01 // '????m???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x00 0x00 0x00 0x00 0x6D 0x00 0x00 0x40 // '????m??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_36=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_36, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x6C 0x69 0x6E 0x65 // 'the line' 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E // ' you wan' 0x74 0x2E 0x20 0x20 0x4F 0x72 0x2C 0x20 // 't. Or, ' 0x74 0x6F 0x20 0x72 0x65 0x63 0x6F 0x72 // 'to recor' 0x64 0x20 0x79 0x6F 0x75 0x72 0x20 0x6F // 'd your o' 0x77 0x6E 0x20 0x64 0x69 0x61 0x6C 0x6F // 'wn dialo' 0x67 0x75 0x65 0x2C 0x20 0x63 0x6C 0x69 // 'gue, cli' 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 0x6D // 'ck the m' 0x69 0x63 0x72 0x6F 0x70 0x68 0x6F 0x6E // 'icrophon' 0x65 0x2E 0x20 0x20 0x57 0x68 0x65 0x6E // 'e. When' 0x20 0x79 0x6F 0x75 0x27 0x72 0x65 0x20 // ' you're ' 0x64 0x6F 0x6E 0x65 0x2C 0x20 0x63 0x6C // 'done, cl' 0x69 0x63 0x6B 0x20 0x4F 0x4B 0x2E // 'ick OK.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_25= kttBrowserImportSpeech #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_25, __HELP_NAME("tt--Find dialogue")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_25, __HELP_NAME("tt--Find dialogue")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip 0x0 0x0 kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavEaselHelp25 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_25, 0x0) GST(0) ITEM "kgobBalloonToolTip" ITEM "kttBrowserImportSpeech" ITEM "" ITEM "" ITEM "kidPlayToolTipSounds" ITEM "kwavEaselHelp25" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_25, 0x0) BYTE 0x01 0x00 0x03 0x03 0xDE 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x57 0x00 0x00 0x01 // '????W???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0D 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x57 0x00 0x00 0x03 // '???W???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1E, 0x0) BYTE 0x03 0x03 0x46 0x69 0x6E 0x64 0x20 0x44 // '??Find D' 0x69 0x61 0x6C 0x6F 0x67 0x75 0x65 0x0D // 'ialogue?' 0x0A 0x46 0x69 0x6E 0x64 0x20 0x6F 0x74 // '?Find ot' 0x68 0x65 0x72 0x20 0x64 0x69 0x61 0x6C // 'her dial' 0x6F 0x67 0x75 0x65 0x2E 0x20 0x20 0x59 // 'ogue. Y' 0x6F 0x75 0x20 0x63 0x61 0x6E 0x20 0x69 // 'ou can i' 0x6D 0x70 0x6F 0x72 0x74 0x20 0x57 0x61 // 'mport Wa' 0x76 0x65 0x20 0x6F 0x72 0x20 0x6F 0x74 // 've or ot' 0x68 0x65 0x72 0x20 0x33 0x44 0x20 0x4D // 'her 3D M' 0x6F 0x76 0x69 0x65 0x20 0x4D 0x61 0x6B // 'ovie Mak' 0x65 0x72 0x20 0x66 0x69 0x6C 0x65 0x73 // 'er files' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_26= ktpcEaselHelp26 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_26, __HELP_NAME("tt--Cancel")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_26, __HELP_NAME("tt--Cancel")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip 0x0 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 kwavEaselHelp26 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_27=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_26, 0x0) GST(0) ITEM "kgobBalloonToolTip" ITEM "ktpcEaselHelp26" ITEM "" ITEM "" ITEM "" ITEM "kwavEaselHelp26" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_27=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_26, 0x0) BYTE 0x01 0x00 0x03 0x03 0x73 0x00 0x00 0x00 // '????s???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_27=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_27, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x08 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x08 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x15 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_27=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_27, 0x0) BYTE 0x03 0x03 0x43 0x61 0x6E 0x63 0x65 0x6C // '??Cancel' 0x0D 0x0A 0x55 0x73 0x65 0x20 0x74 0x6F // '??Use to' 0x70 0x69 0x63 0x20 0x23 0x39 0x2E // 'pic #9.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_27= ktpcEaselHelp27 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_27, __HELP_NAME("tt--OK")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_27, __HELP_NAME("tt--OK")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip 0x0 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 kwavEaselHelp27 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_27, 0x0) GST(0) ITEM "kgobBalloonToolTip" ITEM "ktpcEaselHelp27" ITEM "" ITEM "" ITEM "" ITEM "kwavEaselHelp27" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_27, 0x0) BYTE 0x01 0x00 0x03 0x03 0x54 0x00 0x00 0x00 // '????T???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x04 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x04 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x12 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2B, 0x0) BYTE 0x03 0x03 0x4F 0x4B 0x0D 0x0A 0x55 0x73 // '??OK??Us' 0x65 0x20 0x74 0x6F 0x70 0x69 0x63 0x20 // 'e topic ' 0x23 0x31 0x30 0x2E // '#10.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_28= ktpcEaselHelp28 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_28, __HELP_NAME("tt--Record your own")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_28, __HELP_NAME("tt--Record your own")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip 0x0 0x0 kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavEaselHelp28 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_15=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_28, 0x0) GST(0) ITEM "kgobBalloonToolTip" ITEM "ktpcEaselHelp28" ITEM "" ITEM "" ITEM "kidPlayToolTipSounds" ITEM "kwavEaselHelp28" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_15=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_28, 0x0) BYTE 0x01 0x00 0x03 0x03 0x67 0x00 0x00 0x00 // '????g???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_15=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_15, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0F 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0F 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_15=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_15, 0x0) BYTE 0x03 0x03 0x52 0x65 0x63 0x6F 0x72 0x64 // '??Record' 0x20 0x59 0x6F 0x75 0x72 0x20 0x4F 0x77 // ' Your Ow' 0x6E // 'n' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_29= ktpcEaselHelp29 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_29, __HELP_NAME("CO UP--MUSIC BROWSER")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_29, __HELP_NAME("CO UP--MUSIC BROWSER")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0xF1 0x0 0x57415645 kwavEaselHelp29 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_11=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_29, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcEaselHelp29" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavEaselHelp29" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_11=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_29, 0x0) BYTE 0x01 0x00 0x03 0x03 0xFD 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_11=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_11, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x51 0x00 0x00 0x01 // '????Q???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x00 0x00 0x00 0x00 0x51 0x00 0x00 0x40 // '????Q??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_11=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_11, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x6D 0x75 0x73 0x69 // 'the musi' 0x63 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 // 'c you wa' 0x6E 0x74 0x20 0x74 0x6F 0x20 0x70 0x72 // 'nt to pr' 0x65 0x76 0x69 0x65 0x77 0x2E 0x20 0x20 // 'eview. ' 0x57 0x68 0x65 0x6E 0x20 0x79 0x6F 0x75 // 'When you' 0x20 0x66 0x69 0x6E 0x64 0x20 0x74 0x68 // ' find th' 0x65 0x20 0x70 0x69 0x65 0x63 0x65 0x20 // 'e piece ' 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 // 'you want' 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 // ', click ' 0x4F 0x4B 0x2E // 'OK.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2A= kttBrowserImportMidi #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2A, __HELP_NAME("tt--Find music")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2A, __HELP_NAME("tt--Find music")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip 0x0 0x0 kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavEaselHelp2A ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_7=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2A, 0x0) GST(0) ITEM "kgobBalloonToolTip" ITEM "kttBrowserImportMidi" ITEM "" ITEM "" ITEM "kidPlayToolTipSounds" ITEM "kwavEaselHelp2A" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_7=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x9D 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_7=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x3F 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0A 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x3F 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_7=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) BYTE 0x03 0x03 0x46 0x69 0x6E 0x64 0x20 0x4D // '??Find M' 0x75 0x73 0x69 0x63 0x0D 0x0A 0x46 0x69 // 'usic??Fi' 0x6E 0x64 0x20 0x6F 0x74 0x68 0x65 0x72 // 'nd other' 0x20 0x6D 0x75 0x73 0x69 0x63 0x2E 0x20 // ' music. ' 0x20 0x59 0x6F 0x75 0x20 0x63 0x61 0x6E // ' You can' 0x20 0x69 0x6D 0x70 0x6F 0x72 0x74 0x20 // ' import ' 0x6F 0x74 0x68 0x65 0x72 0x20 0x4D 0x49 // 'other MI' 0x44 0x49 0x20 0x66 0x69 0x6C 0x65 0x73 // 'DI files' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2B= ktpcEaselHelp2B #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2B, __HELP_NAME("tt--Cancel")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2B, __HELP_NAME("tt--Cancel")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip 0x0 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 kwavEaselHelp2B ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_24=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2B, 0x0) GST(0) ITEM "kgobBalloonToolTip" ITEM "ktpcEaselHelp2B" ITEM "" ITEM "" ITEM "" ITEM "kwavEaselHelp2B" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_24=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x73 0x00 0x00 0x00 // '????s???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_24=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_24, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x08 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x08 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x15 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_24=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_24, 0x0) BYTE 0x03 0x03 0x43 0x61 0x6E 0x63 0x65 0x6C // '??Cancel' 0x0D 0x0A 0x55 0x73 0x65 0x20 0x74 0x6F // '??Use to' 0x70 0x69 0x63 0x20 0x23 0x39 0x2E // 'pic #9.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2C= ktpcEaselHelp2C #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2C, __HELP_NAME("tt--OK")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2C, __HELP_NAME("tt--OK")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip 0x0 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 kwavEaselHelp2C ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_28=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2C, 0x0) GST(0) ITEM "kgobBalloonToolTip" ITEM "ktpcEaselHelp2C" ITEM "" ITEM "" ITEM "" ITEM "kwavEaselHelp2C" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_28=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x54 0x00 0x00 0x00 // '????T???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_28=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_28, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x04 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x04 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x12 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_28=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_28, 0x0) BYTE 0x03 0x03 0x4F 0x4B 0x0D 0x0A 0x55 0x73 // '??OK??Us' 0x65 0x20 0x74 0x6F 0x70 0x69 0x63 0x20 // 'e topic ' 0x23 0x31 0x30 0x2E // '#10.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2D= ktpcEaselHelp2D #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2D, __HELP_NAME("CO UP--ACTION BROWSER")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2D, __HELP_NAME("CO UP--ACTION BROWSER")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x0 0x57415645 kwavEaselHelp2D ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_17=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2D, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcEaselHelp2D" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavEaselHelp2D" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_16=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2D, 0x0) BYTE 0x01 0x00 0x03 0x03 0xFB 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_0=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_16, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcEaselHelp3F __HELP_SYMBOL( STN "ktpcEaselHelp3F" ) ITEM LONG 0xC0000001 VAR LONG 'GOKD' 0x16104 0xFFFFFFFF __HELP_SYMBOL( STN ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_16=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_16, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x69 0x00 0x00 0x01 // '????i???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x00 0x00 0x00 0x00 0x52 0x00 0x00 0x40 // '????R??@' 0x01 0x00 0x00 0x00 0x69 0x00 0x00 0x40 // '????i??@' 0x00 0x00 0x00 0x00 0x52 0x00 0x00 0xC0 // '????R??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_16=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_16, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x69 // 'the acti' 0x6F 0x6E 0x20 0x79 0x6F 0x75 0x20 0x77 // 'on you w' 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 0x70 // 'ant to p' 0x72 0x65 0x76 0x69 0x65 0x77 0x2E 0x20 // 'review. ' 0x20 0x57 0x68 0x65 0x6E 0x20 0x79 0x6F // ' When yo' 0x75 0x20 0x66 0x69 0x6E 0x64 0x20 0x74 // 'u find t' 0x68 0x65 0x20 0x6F 0x6E 0x65 0x20 0x79 // 'he one y' 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 0x2C // 'ou want,' 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 0x4F // ' click O' 0x4B 0x2E 0x0D 0x0A 0x01 0x09 0x57 0x68 // 'K.????Wh' 0x61 0x74 0x20 0x64 0x6F 0x65 0x73 0x20 // 'at does ' 0x74 0x68 0x65 0x20 0x2A 0x20 0x6D 0x65 // 'the * me' 0x61 0x6E 0x3F // 'an?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2E= ktpcEaselHelp2E #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2E, __HELP_NAME("Def: frame")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2E, __HELP_NAME("Def: frame")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavEaselHelp2E ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_8=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2E, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcEaselHelp2E" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavEaselHelp2E" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_8=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x39 0x01 0x00 0x00 // '????9???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_F=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) AG(4) ITEM LONG 0x2000002 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpFrameSlider __HELP_SYMBOL( STN "mbmpFrameSlider" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_8=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x13 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x9A 0x00 0x00 0x01 // '???????' 0x05 0x00 0x00 0x00 0x9C 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xC6 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x6B 0x00 0x00 0x02 // '????k???' 0x01 0x00 0x00 0x00 0x71 0x00 0x00 0x02 // '????q???' 0x00 0x00 0x00 0x00 0xA1 0x00 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0xC6 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x05 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x07 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x23 0x00 0x00 0x03 // '???#???' 0x0A 0x00 0x00 0xFD 0x4D 0x00 0x00 0x03 // '???M???' 0x0F 0x00 0x00 0xFD 0x66 0x00 0x00 0x03 // '???f???' 0x0A 0x00 0x00 0xFD 0x69 0x00 0x00 0x03 // '???i???' 0x0F 0x00 0x00 0xFD 0x6B 0x00 0x00 0x03 // '???k???' 0x00 0x00 0x00 0x00 0x68 0x00 0x00 0x80 // '????h??' 0x00 0x00 0x03 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x68 0x00 0x00 0xC0 // '????h??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_8=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) BYTE 0x03 0x03 0x66 0x72 0x61 0x6D 0x65 0x0D // '??frame?' 0x0A 0x4F 0x6E 0x65 0x20 0x73 0x63 0x72 // '?One scr' 0x65 0x65 0x6E 0x20 0x6F 0x66 0x20 0x79 // 'een of y' 0x6F 0x75 0x72 0x20 0x6D 0x6F 0x76 0x69 // 'our movi' 0x65 0x2E 0x20 0x0D 0x0A 0x54 0x6F 0x20 // 'e. ??To ' 0x6D 0x6F 0x76 0x65 0x20 0x66 0x72 0x6F // 'move fro' 0x6D 0x20 0x66 0x72 0x61 0x6D 0x65 0x20 // 'm frame ' 0x74 0x6F 0x20 0x66 0x72 0x61 0x6D 0x65 // 'to frame' 0x20 0x77 0x69 0x74 0x68 0x69 0x6E 0x20 // ' within ' 0x61 0x20 0x73 0x63 0x65 0x6E 0x65 0x0D // 'a scene?' 0x0A 0x95 0x09 0x55 0x73 0x65 0x20 0x74 // '??Use t' 0x68 0x65 0x20 0x46 0x72 0x61 0x6D 0x65 // 'he Frame' 0x20 0x53 0x6C 0x69 0x64 0x65 0x72 0x2E // ' Slider.' 0x0D 0x0A 0x01 0x0D 0x0A 0x43 0x6C 0x69 // '?????Cli' 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 0x46 // 'ck the F' 0x69 0x72 0x73 0x74 0x2C 0x20 0x50 0x72 // 'irst, Pr' 0x65 0x76 0x69 0x6F 0x75 0x73 0x2C 0x20 // 'evious, ' 0x4E 0x65 0x78 0x74 0x2C 0x20 0x6F 0x72 // 'Next, or' 0x20 0x4C 0x61 0x73 0x74 0x20 0x41 0x72 // ' Last Ar' 0x72 0x6F 0x77 0x20 0x6F 0x72 0x20 0x64 // 'row or d' 0x72 0x61 0x67 0x20 0x74 0x68 0x65 0x20 // 'rag the ' 0x73 0x6C 0x69 0x64 0x65 0x72 0x20 0x69 // 'slider i' 0x6E 0x20 0x74 0x68 0x65 0x20 0x6D 0x69 // 'n the mi' 0x64 0x64 0x6C 0x65 0x20 0x6F 0x66 0x20 // 'ddle of ' 0x74 0x68 0x65 0x20 0x62 0x61 0x72 0x2E // 'the bar.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2F= ktpcEaselHelp2F #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2F, __HELP_NAME("Def: Drag")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2F, __HELP_NAME("Def: Drag")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavEaselHelp2F ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_23=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2F, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcEaselHelp2F" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavEaselHelp2F" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_23=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2F, 0x0) BYTE 0x01 0x00 0x03 0x03 0xCE 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_23=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_23, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x04 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xCF 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x79 0x00 0x00 0x03 // '????y???' 0x0A 0x00 0x00 0xFD 0x88 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x79 0x00 0x00 0x80 // '????y??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x79 0x00 0x00 0x82 // '????y??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_23=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_23, 0x0) BYTE 0x03 0x03 0x44 0x72 0x61 0x67 0x0D 0x0A // '??Drag??' 0x31 0x09 0x48 0x6F 0x6C 0x64 0x20 0x64 // '1?Hold d' 0x6F 0x77 0x6E 0x20 0x74 0x68 0x65 0x20 // 'own the ' 0x6D 0x6F 0x75 0x73 0x65 0x20 0x62 0x75 // 'mouse bu' 0x74 0x74 0x6F 0x6E 0x20 0x61 0x73 0x20 // 'tton as ' 0x79 0x6F 0x75 0x20 0x6D 0x6F 0x76 0x65 // 'you move' 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 // ' the mou' 0x73 0x65 0x2E 0x0D 0x0A 0x32 0x09 0x57 // 'se.??2?W' 0x68 0x65 0x6E 0x20 0x79 0x6F 0x75 0x27 // 'hen you'' 0x76 0x65 0x20 0x66 0x69 0x6E 0x69 0x73 // 've finis' 0x68 0x65 0x64 0x20 0x64 0x72 0x61 0x67 // 'hed drag' 0x67 0x69 0x6E 0x67 0x2C 0x20 0x6C 0x65 // 'ging, le' 0x74 0x20 0x67 0x6F 0x20 0x6F 0x66 0x20 // 't go of ' 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 0x73 // 'the mous' 0x65 0x20 0x62 0x75 0x74 0x74 0x6F 0x6E // 'e button' 0x2E 0x0D 0x0A 0x54 0x69 0x70 0x20 0x66 // '.??Tip f' 0x72 0x6F 0x6D 0x20 0x4D 0x63 0x5A 0x65 // 'rom McZe' 0x65 0x3A 0x20 0x20 0x59 0x6F 0x75 0x27 // 'e: You'' 0x6C 0x6C 0x20 0x67 0x65 0x74 0x20 0x74 // 'll get t' 0x68 0x65 0x20 0x62 0x65 0x73 0x74 0x20 // 'he best ' 0x72 0x65 0x73 0x75 0x6C 0x74 0x73 0x20 // 'results ' 0x69 0x66 0x20 0x79 0x6F 0x75 0x20 0x6D // 'if you m' 0x6F 0x76 0x65 0x20 0x74 0x68 0x65 0x20 // 'ove the ' 0x6D 0x6F 0x75 0x73 0x65 0x20 0x73 0x6C // 'mouse sl' 0x6F 0x77 0x6C 0x79 0x20 0x61 0x73 0x20 // 'owly as ' 0x79 0x6F 0x75 0x20 0x64 0x72 0x61 0x67 // 'you drag' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_30= ktpcEaselHelp30 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_30, __HELP_NAME("tt--Rename actor, prop--Costume Changer")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_30, __HELP_NAME("tt--Rename actor, prop--Costume Changer")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip 0x0 0x0 kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavEaselHelp30 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_22=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_30, 0x0) GST(0) ITEM "kgobBalloonToolTip" ITEM "ktpcEaselHelp30" ITEM "" ITEM "" ITEM "kidPlayToolTipSounds" ITEM "kwavEaselHelp30" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_22=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_30, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE1 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_22=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_22, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x65 0x00 0x00 0x01 // '????e???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_22=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_22, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x63 0x68 0x61 // '??To cha' 0x6E 0x67 0x65 0x20 0x61 0x6E 0x20 0x61 // 'nge an a' 0x63 0x74 0x6F 0x72 0x27 0x73 0x20 0x6F // 'ctor's o' 0x72 0x20 0x70 0x72 0x6F 0x70 0x27 0x73 // 'r prop's' 0x20 0x6E 0x61 0x6D 0x65 0x2C 0x20 0x74 // ' name, t' 0x79 0x70 0x65 0x20 0x74 0x68 0x65 0x20 // 'ype the ' 0x6E 0x65 0x77 0x20 0x6E 0x61 0x6D 0x65 // 'new name' 0x20 0x68 0x65 0x72 0x65 0x2E 0x20 0x20 // ' here. ' 0x49 0x66 0x20 0x79 0x6F 0x75 0x20 0x6D // 'If you m' 0x61 0x6B 0x65 0x20 0x61 0x20 0x6D 0x69 // 'ake a mi' 0x73 0x74 0x61 0x6B 0x65 0x2C 0x20 0x70 // 'stake, p' 0x72 0x65 0x73 0x73 0x20 0x42 0x61 0x63 // 'ress Bac' 0x6B 0x73 0x70 0x61 0x63 0x65 0x2E // 'kspace.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_31= ktpcEaselHelp31 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_31, __HELP_NAME("cut tt--Rename actor, prop--Costume Changer")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_31, __HELP_NAME("cut tt--Rename actor, prop--Costume Changer")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip 0x0 0x0 kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavEaselHelp31 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_10=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_31, 0x0) GST(0) ITEM "kgobBalloonToolTip" ITEM "ktpcEaselHelp31" ITEM "" ITEM "" ITEM "kidPlayToolTipSounds" ITEM "kwavEaselHelp31" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_10=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_31, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_10=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_10, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x66 0x00 0x00 0x01 // '????f???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x11 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_10=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_10, 0x0) BYTE 0x03 0x03 0x43 0x75 0x74 0x0D 0x0A 0x52 // '??Cut??R' 0x65 0x6D 0x6F 0x76 0x65 0x20 0x53 0x6F // 'emove So' 0x75 0x6E 0x64 0x0D 0x0A 0x54 0x6F 0x20 // 'und??To ' 0x72 0x65 0x6D 0x6F 0x76 0x65 0x20 0x61 // 'remove a' 0x20 0x73 0x6F 0x75 0x6E 0x64 0x20 0x79 // ' sound y' 0x6F 0x75 0x20 0x72 0x65 0x63 0x6F 0x72 // 'ou recor' 0x64 0x65 0x64 0x20 0x6F 0x72 0x20 0x69 // 'ded or i' 0x6D 0x70 0x6F 0x72 0x74 0x65 0x64 0x2C // 'mported,' 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 0x74 // ' click t' 0x68 0x65 0x20 0x73 0x6F 0x75 0x6E 0x64 // 'he sound' 0x20 0x74 0x68 0x65 0x6E 0x20 0x63 0x6C // ' then cl' 0x69 0x63 0x6B 0x20 0x74 0x68 0x69 0x73 // 'ick this' 0x20 0x62 0x75 0x74 0x74 0x6F 0x6E 0x2E // ' button.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_32= ktpcEaselHelp32 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_32, __HELP_NAME("CO UP--SCENE ORGANIZER 2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_32, __HELP_NAME("CO UP--SCENE ORGANIZER 2")) __HELP_PACK2 BO OSK LONG kgobEaselBalloonP kgobHowtoSequence 0x0 0xFFFFFFFF 0x140 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_13=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_32, 0x0) GST(0) ITEM "kgobEaselBalloonP" ITEM "ktpcEaselHelp32" ITEM "kgobHowtoSequence" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_13=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_32, 0x0) BYTE 0x01 0x00 0x03 0x03 0x67 0x01 0x00 0x00 // '????g???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_3=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_13, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktpcEaselHelp0C __HELP_SYMBOL( STN "ktpcEaselHelp0C" ) ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) FREE FREE ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcEaselHelp2F __HELP_SYMBOL( STN "ktpcEaselHelp2F" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcEaselHelp2E __HELP_SYMBOL( STN "ktpcEaselHelp2E" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_13=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_13, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x12 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0F 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x82 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0F 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x82 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x25 0x00 0x00 0x04 // '????%???' 0x0D 0x00 0x00 0xFE 0x2A 0x00 0x00 0x04 // '???*???' 0x00 0x00 0x00 0x00 0x56 0x00 0x00 0x04 // '????V???' 0x0D 0x00 0x00 0xFE 0x5A 0x00 0x00 0x04 // '???Z???' 0x00 0x00 0x00 0x00 0x25 0x00 0x00 0x40 // '????%??@' 0x06 0x00 0x00 0x00 0x2A 0x00 0x00 0x40 // '????*??@' 0x00 0x00 0x00 0x00 0x56 0x00 0x00 0x40 // '????V??@' 0x05 0x00 0x00 0x00 0x5A 0x00 0x00 0x40 // '????Z??@' 0x00 0x00 0x00 0x00 0x77 0x00 0x00 0x40 // '????w??@' 0x01 0x00 0x00 0x00 0x82 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x77 0x00 0x00 0xC0 // '????w??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_13=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_13, 0x0) BYTE 0x03 0x03 0x53 0x63 0x65 0x6E 0x65 0x20 // '??Scene ' 0x4F 0x72 0x67 0x61 0x6E 0x69 0x7A 0x65 // 'Organize' 0x72 0x0D 0x0A 0x53 0x68 0x6F 0x77 0x73 // 'r??Shows' 0x20 0x79 0x6F 0x75 0x20 0x74 0x68 0x65 // ' you the' 0x20 0x66 0x69 0x72 0x73 0x74 0x20 0x66 // ' first f' 0x72 0x61 0x6D 0x65 0x20 0x6F 0x66 0x20 // 'rame of ' 0x65 0x61 0x63 0x68 0x20 0x73 0x63 0x65 // 'each sce' 0x6E 0x65 0x2E 0x20 0x20 0x54 0x6F 0x20 // 'ne. To ' 0x63 0x68 0x61 0x6E 0x67 0x65 0x20 0x74 // 'change t' 0x68 0x65 0x20 0x73 0x63 0x65 0x6E 0x65 // 'he scene' 0x20 0x6F 0x72 0x64 0x65 0x72 0x2C 0x20 // ' order, ' 0x64 0x72 0x61 0x67 0x20 0x61 0x20 0x73 // 'drag a s' 0x63 0x65 0x6E 0x65 0x20 0x77 0x68 0x65 // 'cene whe' 0x72 0x65 0x20 0x79 0x6F 0x75 0x20 0x77 // 're you w' 0x61 0x6E 0x74 0x20 0x69 0x74 0x2E 0x20 // 'ant it. ' 0x20 0x01 0x20 0x4D 0x6F 0x72 0x65 0x20 // ' ? More ' 0x68 0x65 0x6C 0x70 // 'help' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_33= ktpcEaselHelp33 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_33, __HELP_NAME("CO UP--3D WORDS 2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_33, __HELP_NAME("CO UP--3D WORDS 2")) __HELP_PACK2 BO OSK LONG kgobEaselBalloonP kgobHowtoSequence 0x0 0xFFFFFFFF 0x140 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_30=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_33, 0x0) GST(0) ITEM "kgobEaselBalloonP" ITEM "ktpcEaselHelp33" ITEM "kgobHowtoSequence" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_30=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_33, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC9 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_5=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_30, 0x0) AG(4) FREE ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcEaselHelp0C __HELP_SYMBOL( STN "ktpcEaselHelp0C" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_30=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_30, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x08 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x0A 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x41 0x00 0x00 0x01 // '????A???' 0x01 0x00 0x00 0x00 0x58 0x00 0x00 0x01 // '????X???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x08 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x4D 0x00 0x00 0x40 // '????M??@' 0x03 0x00 0x00 0x00 0x58 0x00 0x00 0x40 // '????X??@' 0x00 0x00 0x00 0x00 0x4D 0x00 0x00 0xC0 // '????M??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_30=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_30, 0x0) BYTE 0x03 0x03 0x33 0x44 0x20 0x57 0x6F 0x72 // '??3D Wor' 0x64 0x73 0x0D 0x0A 0x54 0x79 0x70 0x65 // 'ds??Type' 0x20 0x74 0x68 0x65 0x20 0x77 0x6F 0x72 // ' the wor' 0x64 0x73 0x20 0x79 0x6F 0x75 0x20 0x77 // 'ds you w' 0x61 0x6E 0x74 0x2E 0x20 0x20 0x49 0x66 // 'ant. If' 0x20 0x79 0x6F 0x75 0x20 0x6D 0x61 0x6B // ' you mak' 0x65 0x20 0x61 0x20 0x6D 0x69 0x73 0x74 // 'e a mist' 0x61 0x6B 0x65 0x2C 0x20 0x70 0x72 0x65 // 'ake, pre' 0x73 0x73 0x20 0x42 0x61 0x63 0x6B 0x73 // 'ss Backs' 0x70 0x61 0x63 0x65 0x2E 0x0D 0x0A 0x01 // 'pace.???' 0x20 0x4D 0x6F 0x72 0x65 0x20 0x68 0x65 // ' More he' 0x6C 0x70 // 'lp' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_34= ktpcEaselHelp34 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_34, __HELP_NAME("CO UP--LISTENER BROWSER 2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_34, __HELP_NAME("CO UP--LISTENER BROWSER 2")) __HELP_PACK2 BO OSK LONG kgobEaselBalloonP kgobHowtoSequence 0x0 0xFFFFFFFF 0x140 0x186 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_35=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_34, 0x0) GST(0) ITEM "kgobEaselBalloonP" ITEM "ktpcEaselHelp34" ITEM "kgobHowtoSequence" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_35=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_34, 0x0) BYTE 0x01 0x00 0x03 0x03 0xF5 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_D=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_35, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcEaselHelp0C __HELP_SYMBOL( STN "ktpcEaselHelp0C" ) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcEaselHelp2F __HELP_SYMBOL( STN "ktpcEaselHelp2F" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_35=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_35, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x12 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x08 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x0A 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x7F 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x8C 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x08 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x0A 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x7F 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x8C 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x64 0x00 0x00 0x04 // '????d???' 0x0D 0x00 0x00 0xFE 0x68 0x00 0x00 0x04 // '???h???' 0x00 0x00 0x00 0x00 0x64 0x00 0x00 0x40 // '????d??@' 0x04 0x00 0x00 0x00 0x68 0x00 0x00 0x40 // '????h??@' 0x00 0x00 0x00 0x00 0x81 0x00 0x00 0x40 // '??????@' 0x02 0x00 0x00 0x00 0x8C 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x81 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0x81 0x00 0x00 0xC0 // '??????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_35=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_35, 0x0) BYTE 0x03 0x03 0x4C 0x69 0x73 0x74 0x65 0x6E // '??Listen' 0x65 0x72 0x0D 0x0A 0x53 0x68 0x6F 0x77 // 'er??Show' 0x73 0x20 0x79 0x6F 0x75 0x20 0x61 0x6C // 's you al' 0x6C 0x20 0x74 0x68 0x65 0x20 0x73 0x6F // 'l the so' 0x75 0x6E 0x64 0x73 0x20 0x61 0x74 0x74 // 'unds att' 0x61 0x63 0x68 0x65 0x64 0x20 0x74 0x6F // 'ached to' 0x20 0x74 0x68 0x65 0x20 0x6F 0x62 0x6A // ' the obj' 0x65 0x63 0x74 0x20 0x79 0x6F 0x75 0x20 // 'ect you ' 0x63 0x6C 0x69 0x63 0x6B 0x65 0x64 0x2E // 'clicked.' 0x20 0x20 0x54 0x6F 0x20 0x63 0x68 0x61 // ' To cha' 0x6E 0x67 0x65 0x20 0x74 0x68 0x65 0x20 // 'nge the ' 0x73 0x6F 0x75 0x6E 0x64 0x20 0x76 0x6F // 'sound vo' 0x6C 0x75 0x6D 0x65 0x2C 0x20 0x64 0x72 // 'lume, dr' 0x61 0x67 0x20 0x74 0x68 0x65 0x20 0x73 // 'ag the s' 0x6C 0x69 0x64 0x65 0x72 0x20 0x75 0x70 // 'lider up' 0x20 0x6F 0x72 0x20 0x64 0x6F 0x77 0x6E // ' or down' 0x2E 0x0D 0x0A 0x01 0x20 0x4D 0x6F 0x72 // '.??? Mor' 0x65 0x20 0x68 0x65 0x6C 0x70 // 'e help' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_35= ktpcEaselHelp35 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_35, __HELP_NAME("CO UP--COSTUME CHANGER 2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_35, __HELP_NAME("CO UP--COSTUME CHANGER 2")) __HELP_PACK2 BO OSK LONG kgobEaselBalloonP kgobHowtoSequence 0x0 0xFFFFFFFF 0x140 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_35, 0x0) GST(0) ITEM "kgobEaselBalloonP" ITEM "ktpcEaselHelp35" ITEM "kgobHowtoSequence" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_35, 0x0) BYTE 0x01 0x00 0x03 0x03 0xF4 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_10=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3D, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcEaselHelp0C __HELP_SYMBOL( STN "ktpcEaselHelp0C" ) FREE ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_3D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0F 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x70 0x00 0x00 0x01 // '????p???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0F 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x26 0x00 0x00 0x03 // '???&???' 0x00 0x00 0x00 0x00 0x70 0x00 0x00 0x03 // '????p???' 0x00 0x00 0x00 0x00 0x65 0x00 0x00 0x40 // '????e??@' 0x02 0x00 0x00 0x00 0x70 0x00 0x00 0x40 // '????p??@' 0x00 0x00 0x00 0x00 0x65 0x00 0x00 0xC0 // '????e??' 0x04 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3D, 0x0) BYTE 0x03 0x03 0x43 0x6F 0x73 0x74 0x75 0x6D // '??Costum' 0x65 0x20 0x43 0x68 0x61 0x6E 0x67 0x65 // 'e Change' 0x72 0x0D 0x0A 0x54 0x6F 0x20 0x63 0x68 // 'r??To ch' 0x61 0x6E 0x67 0x65 0x20 0x61 0x20 0x63 // 'ange a c' 0x6F 0x73 0x74 0x75 0x6D 0x65 0x2C 0x20 // 'ostume, ' 0x63 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 // 'click th' 0x65 0x20 0x61 0x63 0x74 0x6F 0x72 0x20 // 'e actor ' 0x6F 0x72 0x20 0x70 0x72 0x6F 0x70 0x20 // 'or prop ' 0x75 0x6E 0x74 0x69 0x6C 0x20 0x79 0x6F // 'until yo' 0x75 0x20 0x66 0x69 0x6E 0x64 0x20 0x74 // 'u find t' 0x68 0x65 0x20 0x22 0x63 0x6F 0x73 0x74 // 'he "cost' 0x75 0x6D 0x65 0x22 0x20 0x79 0x6F 0x75 // 'ume" you' 0x20 0x6C 0x69 0x6B 0x65 0x2E 0x20 0x01 // ' like. ?' 0x20 0x4D 0x6F 0x72 0x65 0x20 0x68 0x65 // ' More he' 0x6C 0x70 // 'lp' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_36= ktpcEaselHelp36 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_36, __HELP_NAME("CO Up--SOUND EFFECTS 2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_36, __HELP_NAME("CO Up--SOUND EFFECTS 2")) __HELP_PACK2 BO OSK LONG kgobEaselBalloonP kgobHowtoSequence 0x0 0xFFFFFFFF 0x140 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_34=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_36, 0x0) GST(0) ITEM "kgobEaselBalloonP" ITEM "ktpcEaselHelp36" ITEM "kgobHowtoSequence" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_34=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_36, 0x0) BYTE 0x01 0x00 0x03 0x03 0x2F 0x01 0x00 0x00 // '????/???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_C=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_34, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktpcEaselHelp0C __HELP_SYMBOL( STN "ktpcEaselHelp0C" ) ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_34=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_34, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x42 0x00 0x00 0x01 // '????B???' 0x01 0x00 0x00 0x00 0x63 0x00 0x00 0x01 // '????c???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x00 0x00 0x00 0x00 0x58 0x00 0x00 0x40 // '????X??@' 0x01 0x00 0x00 0x00 0x63 0x00 0x00 0x40 // '????c??@' 0x00 0x00 0x00 0x00 0x58 0x00 0x00 0xC0 // '????X??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_34=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_34, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x73 0x6F 0x75 0x6E // 'the soun' 0x64 0x20 0x65 0x66 0x66 0x65 0x63 0x74 // 'd effect' 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E // ' you wan' 0x74 0x20 0x74 0x6F 0x20 0x70 0x72 0x65 // 't to pre' 0x76 0x69 0x65 0x77 0x2E 0x20 0x20 0x57 // 'view. W' 0x68 0x65 0x6E 0x20 0x79 0x6F 0x75 0x20 // 'hen you ' 0x66 0x69 0x6E 0x64 0x20 0x74 0x68 0x65 // 'find the' 0x20 0x6F 0x6E 0x65 0x20 0x79 0x6F 0x75 // ' one you' 0x20 0x77 0x61 0x6E 0x74 0x2C 0x20 0x63 // ' want, c' 0x6C 0x69 0x63 0x6B 0x20 0x4F 0x4B 0x2E // 'lick OK.' 0x20 0x20 0x01 0x20 0x4D 0x6F 0x72 0x65 // ' ? More' 0x20 0x68 0x65 0x6C 0x70 // ' help' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_37= ktpcEaselHelp37 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_37, __HELP_NAME("CO Up--RECORD YOUR OWN 2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_37, __HELP_NAME("CO Up--RECORD YOUR OWN 2")) __HELP_PACK2 BO OSK LONG kgobEaselBalloonP kgobHowtoSequence 0x0 0xFFFFFFFF 0x140 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_32=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_37, 0x0) GST(0) ITEM "kgobEaselBalloonP" ITEM "ktpcEaselHelp37" ITEM "kgobHowtoSequence" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_32=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_37, 0x0) BYTE 0x01 0x00 0x03 0x03 0xCB 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_11=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_32, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcEaselHelp0C __HELP_SYMBOL( STN "ktpcEaselHelp0C" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSoundRecord __HELP_SYMBOL( STN "mbmpSoundRecord" ) ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_32=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_32, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x11 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1A 0x00 0x00 0x01 // '????????' 0x01 0xF6 0x00 0x00 0x31 0x00 0x00 0x01 // '???1???' 0x01 0x00 0x00 0x00 0xA9 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x1A 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x1B 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x1C 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x9E 0x00 0x00 0x40 // '??????@' 0x01 0x00 0x00 0x00 0xA9 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x34 0x00 0x00 0x80 // '????4??' 0x00 0x00 0x03 0x00 0x51 0x00 0x00 0x80 // '????Q??' 0x00 0x00 0x02 0x00 0x73 0x00 0x00 0x80 // '????s??' 0x00 0x00 0x00 0x00 0x34 0x00 0x00 0x82 // '????4??' 0x05 0x00 0x00 0x00 0x9E 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x31 0x00 0x00 0xC0 // '????1??' 0x02 0x00 0x00 0x00 0x9E 0x00 0x00 0xC0 // '??????' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_32=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_32, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x72 0x65 0x63 // '??To rec' 0x6F 0x72 0x64 0x20 0x79 0x6F 0x75 0x72 // 'ord your' 0x20 0x6F 0x77 0x6E 0x20 0x73 0x6F 0x75 // ' own sou' 0x6E 0x64 0x0D 0x0A 0x31 0x09 0x43 0x6C // 'nd??1?Cl' 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 // 'ick the ' 0x4D 0x69 0x63 0x72 0x6F 0x70 0x68 0x6F // 'Micropho' 0x6E 0x65 0x2D 0x01 0x0D 0x0A 0x54 0x68 // 'ne-???Th' 0x65 0x20 0x62 0x75 0x74 0x74 0x6F 0x6E // 'e button' 0x20 0x63 0x68 0x61 0x6E 0x67 0x65 0x73 // ' changes' 0x20 0x74 0x6F 0x20 0x53 0x74 0x6F 0x70 // ' to Stop' 0x2E 0x0D 0x0A 0x32 0x09 0x54 0x6F 0x20 // '.??2?To ' 0x73 0x74 0x6F 0x70 0x20 0x72 0x65 0x63 // 'stop rec' 0x6F 0x72 0x64 0x69 0x6E 0x67 0x2C 0x20 // 'ording, ' 0x63 0x6C 0x69 0x63 0x6B 0x20 0x53 0x74 // 'click St' 0x6F 0x70 0x2E 0x0D 0x0A 0x33 0x09 0x54 // 'op.??3?T' 0x79 0x70 0x65 0x20 0x61 0x20 0x6E 0x61 // 'ype a na' 0x6D 0x65 0x20 0x66 0x6F 0x72 0x20 0x74 // 'me for t' 0x68 0x65 0x20 0x73 0x6F 0x75 0x6E 0x64 // 'he sound' 0x2E 0x0D 0x0A 0x34 0x09 0x43 0x6C 0x69 // '.??4?Cli' 0x63 0x6B 0x20 0x4F 0x4B 0x2E 0x0D 0x0A // 'ck OK.??' 0x01 0x20 0x4D 0x6F 0x72 0x65 0x20 0x68 // '? More h' 0x65 0x6C 0x70 // 'elp' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_38= ktpcEaselHelp38 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_38, __HELP_NAME("CO UP--SPEECH BROWSER 2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_38, __HELP_NAME("CO UP--SPEECH BROWSER 2")) __HELP_PACK2 BO OSK LONG kgobEaselBalloonP kgobHowtoSequence 0x0 0xFFFFFFFF 0x140 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_38, 0x0) GST(0) ITEM "kgobEaselBalloonP" ITEM "ktpcEaselHelp38" ITEM "kgobHowtoSequence" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_38, 0x0) BYTE 0x01 0x00 0x03 0x03 0x8C 0x01 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_15=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3B, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcEaselHelp0C __HELP_SYMBOL( STN "ktpcEaselHelp0C" ) ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_3B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x5C 0x00 0x00 0x01 // '????\???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x00 0x00 0x00 0x00 0x51 0x00 0x00 0x40 // '????Q??@' 0x01 0x00 0x00 0x00 0x5C 0x00 0x00 0x40 // '????\??@' 0x00 0x00 0x00 0x00 0x51 0x00 0x00 0xC0 // '????Q??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3B, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x72 0x65 0x63 // '??To rec' 0x6F 0x72 0x64 0x20 0x79 0x6F 0x75 0x72 // 'ord your' 0x20 0x6F 0x77 0x6E 0x20 0x64 0x69 0x61 // ' own dia' 0x6C 0x6F 0x67 0x75 0x65 0x2C 0x20 0x63 // 'logue, c' 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 // 'lick the' 0x20 0x6D 0x69 0x63 0x72 0x6F 0x70 0x68 // ' microph' 0x6F 0x6E 0x65 0x2E 0x0D 0x0A 0x57 0x68 // 'one.??Wh' 0x65 0x6E 0x20 0x79 0x6F 0x75 0x27 0x72 // 'en you'r' 0x65 0x20 0x64 0x6F 0x6E 0x65 0x2C 0x20 // 'e done, ' 0x63 0x6C 0x69 0x63 0x6B 0x20 0x4F 0x4B // 'click OK' 0x2E 0x20 0x20 0x01 0x20 0x4D 0x6F 0x72 // '. ? Mor' 0x65 0x20 0x68 0x65 0x6C 0x70 // 'e help' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_39= ktpcEaselHelp39 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_39, __HELP_NAME("CO UP--MUSIC BROWSER 2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_39, __HELP_NAME("CO UP--MUSIC BROWSER 2")) __HELP_PACK2 BO OSK LONG kgobEaselBalloonP kgobHowtoSequence 0x0 0xFFFFFFFF 0x140 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_33=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_39, 0x0) GST(0) ITEM "kgobEaselBalloonP" ITEM "ktpcEaselHelp39" ITEM "kgobHowtoSequence" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_33=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_39, 0x0) BYTE 0x01 0x00 0x03 0x03 0x20 0x01 0x00 0x00 // '???? ???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_B=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_33, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcEaselHelp0C __HELP_SYMBOL( STN "ktpcEaselHelp0C" ) ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_33=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_33, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x5E 0x00 0x00 0x01 // '????^???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x00 0x00 0x00 0x00 0x53 0x00 0x00 0x40 // '????S??@' 0x01 0x00 0x00 0x00 0x5E 0x00 0x00 0x40 // '????^??@' 0x00 0x00 0x00 0x00 0x53 0x00 0x00 0xC0 // '????S??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_33=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_33, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x6D 0x75 0x73 0x69 // 'the musi' 0x63 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 // 'c you wa' 0x6E 0x74 0x20 0x74 0x6F 0x20 0x70 0x72 // 'nt to pr' 0x65 0x76 0x69 0x65 0x77 0x2E 0x20 0x20 // 'eview. ' 0x57 0x68 0x65 0x6E 0x20 0x79 0x6F 0x75 // 'When you' 0x20 0x66 0x69 0x6E 0x64 0x20 0x74 0x68 // ' find th' 0x65 0x20 0x70 0x69 0x65 0x63 0x65 0x20 // 'e piece ' 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 // 'you want' 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 // ', click ' 0x4F 0x4B 0x2E 0x20 0x20 0x01 0x20 0x4D // 'OK. ? M' 0x6F 0x72 0x65 0x20 0x68 0x65 0x6C 0x70 // 'ore help' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3A= ktpcEaselHelp3A #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3A, __HELP_NAME("CO UP--ACTION BROWSER 2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3A, __HELP_NAME("CO UP--ACTION BROWSER 2")) __HELP_PACK2 BO OSK LONG kgobEaselBalloonP kgobHowtoSequence 0x0 0xFFFFFFFF 0x140 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_25=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3A, 0x0) GST(0) ITEM "kgobEaselBalloonP" ITEM "ktpcEaselHelp3A" ITEM "kgobHowtoSequence" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_25=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3A, 0x0) BYTE 0x01 0x00 0x03 0x03 0xFA 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_6=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_25, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0xC0000001 VAR LONG 'GOKD' 0x16104 0xFFFFFFFF __HELP_SYMBOL( STN ) FREE ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcEaselHelp0C __HELP_SYMBOL( STN "ktpcEaselHelp0C" ) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcEaselHelp3F __HELP_SYMBOL( STN "ktpcEaselHelp3F" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_25=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_25, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x09 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x76 0x00 0x00 0x01 // '????v???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x00 0x00 0x00 0x00 0x52 0x00 0x00 0x40 // '????R??@' 0x06 0x00 0x00 0x00 0x69 0x00 0x00 0x40 // '????i??@' 0x00 0x00 0x00 0x00 0x6B 0x00 0x00 0x40 // '????k??@' 0x04 0x00 0x00 0x00 0x76 0x00 0x00 0x40 // '????v??@' 0x00 0x00 0x00 0x00 0x52 0x00 0x00 0xC0 // '????R??' 0x02 0x00 0x00 0x00 0x6B 0x00 0x00 0xC0 // '????k??' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_25=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_25, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x69 // 'the acti' 0x6F 0x6E 0x20 0x79 0x6F 0x75 0x20 0x77 // 'on you w' 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 0x70 // 'ant to p' 0x72 0x65 0x76 0x69 0x65 0x77 0x2E 0x20 // 'review. ' 0x20 0x57 0x68 0x65 0x6E 0x20 0x79 0x6F // ' When yo' 0x75 0x20 0x66 0x69 0x6E 0x64 0x20 0x74 // 'u find t' 0x68 0x65 0x20 0x6F 0x6E 0x65 0x20 0x79 // 'he one y' 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 0x2C // 'ou want,' 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 0x4F // ' click O' 0x4B 0x2E 0x0D 0x0A 0x01 0x09 0x57 0x68 // 'K.????Wh' 0x61 0x74 0x20 0x64 0x6F 0x65 0x73 0x20 // 'at does ' 0x74 0x68 0x65 0x20 0x2A 0x20 0x6D 0x65 // 'the * me' 0x61 0x6E 0x3F 0x0D 0x0A 0x01 0x20 0x4D // 'an???? M' 0x6F 0x72 0x65 0x20 0x68 0x65 0x6C 0x70 // 'ore help' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3B= ktpcEaselHelp3B #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3B, __HELP_NAME("Tip: Removing a sound")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3B, __HELP_NAME("Tip: Removing a sound")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3B, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcEaselHelp3B" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x15 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_9=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3C, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpNukeSound __HELP_SYMBOL( STN "mbmpNukeSound" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_3C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0E 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x13 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x15 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x26 0x00 0x00 0x01 // '????&???' 0x00 0x00 0x00 0x00 0x28 0x00 0x00 0x01 // '????(???' 0x01 0xF6 0x00 0x00 0x30 0x00 0x00 0x01 // '???0???' 0x01 0x00 0x00 0x00 0x31 0x00 0x00 0x01 // '????1???' 0x00 0x00 0x00 0x00 0x15 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x26 0x00 0x00 0x03 // '???&???' 0x00 0x00 0x00 0x00 0x28 0x00 0x00 0x80 // '????(??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x28 0x00 0x00 0x82 // '????(??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0x30 0x00 0x00 0xC0 // '????0??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3C, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x52 0x65 0x6D // '??? Rem' 0x6F 0x76 0x69 0x6E 0x67 0x20 0x61 0x20 // 'oving a ' 0x73 0x6F 0x75 0x6E 0x64 0x0D 0x0A 0x54 // 'sound??T' 0x6F 0x20 0x72 0x65 0x6D 0x6F 0x76 0x65 // 'o remove' 0x20 0x61 0x20 0x73 0x6F 0x75 0x6E 0x64 // ' a sound' 0x0D 0x0A 0x95 0x09 0x43 0x6C 0x69 0x63 // '???Clic' 0x6B 0x20 0x01 // 'k ?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3C= kttRecordEaselOk #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3C, __HELP_NAME("tt--OK")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3C, __HELP_NAME("tt--OK")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip 0x0 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3C, 0x0) GST(0) ITEM "kgobBalloonToolTip" ITEM "kttRecordEaselOk" ITEM "" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x5A 0x00 0x00 0x00 // '????Z???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_3A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1F 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x04 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x1F 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3A, 0x0) BYTE 0x03 0x03 0x4F 0x4B 0x0D 0x0A 0x43 0x6C // '??OK??Cl' 0x6F 0x73 0x65 0x20 0x61 0x6E 0x64 0x20 // 'ose and ' 0x6D 0x61 0x6B 0x65 0x20 0x61 0x6C 0x6C // 'make all' 0x20 0x63 0x68 0x61 0x6E 0x67 0x65 0x73 // ' changes' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3D= kttRecordEaselCancel #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3D, __HELP_NAME("tt--Cancel")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3D, __HELP_NAME("tt--Cancel")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip 0x0 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_37=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3D, 0x0) GST(0) ITEM "kgobBalloonToolTip" ITEM "kttRecordEaselCancel" ITEM "" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_37=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x79 0x00 0x00 0x00 // '????y???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_37=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_37, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x29 0x00 0x00 0x01 // '????)???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x08 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x29 0x00 0x00 0x03 // '???)???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_37=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_37, 0x0) BYTE 0x03 0x03 0x43 0x61 0x6E 0x63 0x65 0x6C // '??Cancel' 0x0D 0x0A 0x43 0x6C 0x6F 0x73 0x65 0x20 // '??Close ' 0x77 0x69 0x74 0x68 0x6F 0x75 0x74 0x20 // 'without ' 0x6D 0x61 0x6B 0x69 0x6E 0x67 0x20 0x61 // 'making a' 0x6E 0x79 0x20 0x63 0x68 0x61 0x6E 0x67 // 'ny chang' 0x65 0x73 0x2E // 'es.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3E= kttListenNukeSpeech #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3E, __HELP_NAME("tt--Remove Sound")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3E, __HELP_NAME("tt--Remove Sound")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip 0x0 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 kwavEaselHelp3E ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3E, 0x0) GST(0) ITEM "kgobBalloonToolTip" ITEM "kttListenNukeSpeech" ITEM "" ITEM "" ITEM "" ITEM "kwavEaselHelp3E" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x91 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_3F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x26 0x00 0x00 0x01 // '????&???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0E 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x26 0x00 0x00 0x03 // '???&???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3F, 0x0) BYTE 0x03 0x03 0x52 0x65 0x6D 0x6F 0x76 0x65 // '??Remove' 0x20 0x53 0x6F 0x75 0x6E 0x64 0x0D 0x0A // ' Sound??' 0x43 0x6C 0x69 0x63 0x6B 0x20 0x74 0x6F // 'Click to' 0x20 0x72 0x65 0x6D 0x6F 0x76 0x65 0x20 // ' remove ' 0x61 0x20 0x73 0x6F 0x75 0x6E 0x64 0x2E // 'a sound.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3F= ktpcEaselHelp3F #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3F, __HELP_NAME("Tip: What does * mean?")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3F, __HELP_NAME("Tip: What does * mean?")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_38=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3F, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcEaselHelp3F" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_38=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3F, 0x0) BYTE 0x01 0x00 0x03 0x03 0xFB 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_14=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_38, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_38=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_38, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x18 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x1A 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xDA 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x1A 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_38=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_38, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x57 0x68 0x61 // '??? Wha' 0x74 0x20 0x64 0x6F 0x65 0x73 0x20 0x74 // 't does t' 0x68 0x65 0x20 0x2A 0x20 0x6D 0x65 0x61 // 'he * mea' 0x6E 0x3F 0x0D 0x0A 0x41 0x63 0x74 0x69 // 'n???Acti' 0x6F 0x6E 0x73 0x20 0x66 0x6F 0x6C 0x6C // 'ons foll' 0x6F 0x77 0x65 0x64 0x20 0x62 0x79 0x20 // 'owed by ' 0x61 0x6E 0x20 0x61 0x73 0x74 0x65 0x72 // 'an aster' 0x69 0x73 0x6B 0x20 0x28 0x2A 0x29 0x20 // 'isk (*) ' 0x77 0x6F 0x72 0x6B 0x20 0x62 0x65 0x73 // 'work bes' 0x74 0x20 0x77 0x68 0x65 0x6E 0x20 0x79 // 't when y' 0x6F 0x75 0x20 0x68 0x6F 0x6C 0x64 0x20 // 'ou hold ' 0x64 0x6F 0x77 0x6E 0x20 0x74 0x68 0x65 // 'down the' 0x20 0x6D 0x6F 0x75 0x73 0x65 0x20 0x62 // ' mouse b' 0x75 0x74 0x74 0x6F 0x6E 0x20 0x61 0x6E // 'utton an' 0x64 0x20 0x64 0x72 0x61 0x67 0x2E 0x20 // 'd drag. ' 0x20 0x4F 0x74 0x68 0x65 0x72 0x77 0x69 // ' Otherwi' 0x73 0x65 0x2C 0x20 0x68 0x6F 0x6C 0x64 // 'se, hold' 0x20 0x64 0x6F 0x77 0x6E 0x20 0x74 0x68 // ' down th' 0x65 0x20 0x6D 0x6F 0x75 0x73 0x65 0x20 // 'e mouse ' 0x62 0x75 0x74 0x74 0x6F 0x6E 0x20 0x61 // 'button a' 0x6E 0x64 0x20 0x77 0x61 0x69 0x74 0x20 // 'nd wait ' 0x75 0x6E 0x74 0x69 0x6C 0x20 0x74 0x68 // 'until th' 0x65 0x20 0x61 0x63 0x74 0x6F 0x72 0x2C // 'e actor,' 0x20 0x70 0x72 0x6F 0x70 0x2C 0x20 0x6F // ' prop, o' 0x72 0x20 0x33 0x44 0x20 0x77 0x6F 0x72 // 'r 3D wor' 0x64 0x20 0x61 0x6E 0x69 0x6D 0x61 0x74 // 'd animat' 0x65 0x73 0x20 0x69 0x6E 0x20 0x70 0x6C // 'es in pl' 0x61 0x63 0x65 0x2E // 'ace.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK ================================================ FILE: src/help/errors.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ #undef __HELP_NAME #undef __HELP_SYMBOL #undef __HELP_PACK #undef __HELP_PACK2 #ifdef NO_HELP_NAMES #define __HELP_NAME(name) "" #else #define __HELP_NAME(name) name #endif #ifdef NO_HELP_SYMBOLS #define __HELP_SYMBOL(stuff) #else #define __HELP_SYMBOL(stuff) stuff #endif #ifdef PACK_HELP #define __HELP_PACK PACK #else #define __HELP_PACK #endif #ifdef HELP_SINGLE_CHUNK #define __HELP_PACK2 #else #define __HELP_PACK2 __HELP_PACK #endif SET _help_48544F50_0= ktpcercOomHq #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("ercOomHq")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("ercOomHq")) __HELP_PACK2 BO OSK LONG kgobBalloonError 0x0 0x0 ktpcErrorScript 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_35=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) GST(0) ITEM "kgobBalloonError" ITEM "ktpcercOomHq" ITEM "" ITEM "" ITEM "ktpcErrorScript" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_35=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_35=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_35, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'GOKD' kgobOkButton 0xFFFFFFFF __HELP_SYMBOL( STN "kgobOkButton" ) ITEM LONG 0x40000001 VAR BYTE 0x01 0xFF 0xFF 0xFF 0xFF // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_35=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_35, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x12 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x27 0x00 0x00 0x01 // '????'???' 0x01 0x00 0xFC 0xFF 0x29 0x00 0x00 0x01 // '??)???' 0x01 0x00 0x00 0x00 0x85 0x00 0x00 0x01 // '???????' 0x01 0x00 0xFC 0xFF 0x87 0x00 0x00 0x01 // '?????' 0x01 0x00 0x00 0x00 0xC1 0x00 0x00 0x01 // '???????' 0x01 0x00 0xFC 0xFF 0xC5 0x00 0x00 0x01 // '?????' 0x01 0x00 0x00 0x00 0xC6 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x05 0x00 0x00 0xFD 0x25 0x00 0x00 0x03 // '???%???' 0x0F 0x00 0x00 0xFD 0xC6 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0xC5 0x00 0x00 0x40 // '??????@' 0x02 0x00 0x00 0x00 0xC6 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x27 0x00 0x00 0x80 // '????'??' 0x00 0x00 0x00 0x02 0x29 0x00 0x00 0x80 // '????)??' 0x00 0x00 0x00 0x00 0x43 0x00 0x00 0x80 // '????C??' 0x00 0x00 0x02 0x00 0xC3 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x02 0xC5 0x00 0x00 0xC0 // '??????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_35=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_35, 0x0) BYTE 0x03 0x03 0x57 0x68 0x6F 0x61 0x21 0x20 // '??Whoa! ' 0x79 0x6F 0x75 0x72 0x20 0x63 0x6F 0x6D // 'your com' 0x70 0x75 0x74 0x65 0x72 0x20 0x69 0x73 // 'puter is' 0x20 0x6F 0x75 0x74 0x20 0x6F 0x66 0x20 // ' out of ' 0x6D 0x65 0x6D 0x6F 0x72 0x79 0x21 0x0D // 'memory!?' 0x0A 0x0D 0x0A 0x54 0x72 0x79 0x20 0x66 // '???Try f' 0x72 0x65 0x65 0x69 0x6E 0x67 0x20 0x73 // 'reeing s' 0x6F 0x6D 0x65 0x20 0x6D 0x65 0x6D 0x6F // 'ome memo' 0x72 0x79 0x2E 0x0D 0x0A 0x2A 0x20 0x20 // 'ry.??* ' 0x53 0x77 0x69 0x74 0x63 0x68 0x20 0x74 // 'Switch t' 0x6F 0x20 0x57 0x69 0x6E 0x64 0x6F 0x77 // 'o Window' 0x73 0x20 0x28 0x70 0x72 0x65 0x73 0x73 // 's (press' 0x20 0x43 0x54 0x52 0x4C 0x2B 0x45 0x53 // ' CTRL+ES' 0x43 0x29 0x20 0x61 0x6E 0x64 0x20 0x63 // 'C) and c' 0x6C 0x6F 0x73 0x65 0x20 0x6F 0x74 0x68 // 'lose oth' 0x65 0x72 0x20 0x70 0x72 0x6F 0x67 0x72 // 'er progr' 0x61 0x6D 0x73 0x2E 0x20 0x0D 0x0A 0x0D // 'ams. ???' 0x0A 0x2A 0x20 0x20 0x4F 0x72 0x2C 0x20 // '?* Or, ' 0x64 0x65 0x6C 0x65 0x74 0x65 0x20 0x6F // 'delete o' 0x6E 0x65 0x20 0x6F 0x72 0x20 0x74 0x77 // 'ne or tw' 0x6F 0x20 0x61 0x63 0x74 0x6F 0x72 0x73 // 'o actors' 0x20 0x6F 0x72 0x20 0x70 0x72 0x6F 0x70 // ' or prop' 0x73 0x20 0x66 0x72 0x6F 0x6D 0x20 0x79 // 's from y' 0x6F 0x75 0x72 0x20 0x6D 0x6F 0x76 0x69 // 'our movi' 0x65 0x2E 0x20 0x0D 0x0A 0x0D 0x0A 0x01 // 'e. ?????' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1= ktpcercOomPv #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("ercOomPv")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("ercOomPv")) __HELP_PACK2 BO OSK LONG kgobBalloonError 0x0 0x0 ktpcErrorScript 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_25=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) GST(0) ITEM "kgobBalloonError" ITEM "ktpcercOomPv" ITEM "" ITEM "" ITEM "ktpcErrorScript" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_25=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_25=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_25, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'GOKD' kgobOkButton 0xFFFFFFFF __HELP_SYMBOL( STN "kgobOkButton" ) ITEM LONG 0x40000001 VAR BYTE 0x01 0xFF 0xFF 0xFF 0xFF // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_25=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_25, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x12 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x27 0x00 0x00 0x01 // '????'???' 0x01 0x00 0xFC 0xFF 0x29 0x00 0x00 0x01 // '??)???' 0x01 0x00 0x00 0x00 0x84 0x00 0x00 0x01 // '???????' 0x01 0x00 0xFC 0xFF 0x86 0x00 0x00 0x01 // '?????' 0x01 0x00 0x00 0x00 0xC2 0x00 0x00 0x01 // '???????' 0x01 0x00 0xFC 0xFF 0xC4 0x00 0x00 0x01 // '?????' 0x01 0x00 0x00 0x00 0xC5 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x05 0x00 0x00 0xFD 0x25 0x00 0x00 0x03 // '???%???' 0x0F 0x00 0x00 0xFD 0xC5 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0xC4 0x00 0x00 0x40 // '??????@' 0x02 0x00 0x00 0x00 0xC5 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x27 0x00 0x00 0x80 // '????'??' 0x00 0x00 0x00 0x02 0x29 0x00 0x00 0x80 // '????)??' 0x00 0x00 0x00 0x00 0x43 0x00 0x00 0x80 // '????C??' 0x00 0x00 0x02 0x00 0xC2 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x02 0xC4 0x00 0x00 0xC0 // '??????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_25=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_25, 0x0) BYTE 0x03 0x03 0x57 0x68 0x6F 0x61 0x21 0x20 // '??Whoa! ' 0x79 0x6F 0x75 0x72 0x20 0x63 0x6F 0x6D // 'your com' 0x70 0x75 0x74 0x65 0x72 0x20 0x69 0x73 // 'puter is' 0x20 0x6F 0x75 0x74 0x20 0x6F 0x66 0x20 // ' out of ' 0x6D 0x65 0x6D 0x6F 0x72 0x79 0x21 0x0D // 'memory!?' 0x0A 0x0D 0x0A 0x54 0x72 0x79 0x20 0x66 // '???Try f' 0x72 0x65 0x65 0x69 0x6E 0x67 0x20 0x73 // 'reeing s' 0x6F 0x6D 0x65 0x20 0x6D 0x65 0x6D 0x6F // 'ome memo' 0x72 0x79 0x2E 0x0D 0x0A 0x2A 0x20 0x20 // 'ry.??* ' 0x53 0x77 0x69 0x74 0x63 0x68 0x20 0x74 // 'Switch t' 0x6F 0x20 0x57 0x69 0x6E 0x64 0x6F 0x77 // 'o Window' 0x73 0x20 0x28 0x70 0x72 0x65 0x73 0x73 // 's (press' 0x20 0x43 0x54 0x52 0x4C 0x2B 0x45 0x53 // ' CTRL+ES' 0x43 0x29 0x20 0x61 0x6E 0x64 0x20 0x63 // 'C) and c' 0x6C 0x6F 0x73 0x65 0x20 0x6F 0x74 0x68 // 'lose oth' 0x65 0x72 0x20 0x70 0x72 0x6F 0x67 0x72 // 'er progr' 0x61 0x6D 0x73 0x2E 0x0D 0x0A 0x0D 0x0A // 'ams.????' 0x2A 0x20 0x20 0x4F 0x72 0x2C 0x20 0x64 // '* Or, d' 0x65 0x6C 0x65 0x74 0x65 0x20 0x6F 0x6E // 'elete on' 0x65 0x20 0x6F 0x72 0x20 0x74 0x77 0x6F // 'e or two' 0x20 0x61 0x63 0x74 0x6F 0x72 0x73 0x20 // ' actors ' 0x6F 0x72 0x20 0x70 0x72 0x6F 0x70 0x73 // 'or props' 0x20 0x66 0x72 0x6F 0x6D 0x20 0x79 0x6F // ' from yo' 0x75 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 // 'ur movie' 0x2E 0x20 0x0D 0x0A 0x0D 0x0A 0x01 // '. ?????' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2= ktpcercOomNew #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2, __HELP_NAME("ercOomNew")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2, __HELP_NAME("ercOomNew")) __HELP_PACK2 BO OSK LONG kgobBalloonError 0x0 0x0 ktpcErrorScript 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_31=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2, 0x0) GST(0) ITEM "kgobBalloonError" ITEM "ktpcercOomNew" ITEM "" ITEM "" ITEM "ktpcErrorScript" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_31=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_31=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_31, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'GOKD' kgobOkButton 0xFFFFFFFF __HELP_SYMBOL( STN "kgobOkButton" ) ITEM LONG 0x40000001 VAR BYTE 0x01 0xFF 0xFF 0xFF 0xFF // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_31=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_31, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x12 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x27 0x00 0x00 0x01 // '????'???' 0x01 0x00 0xFC 0xFF 0x29 0x00 0x00 0x01 // '??)???' 0x01 0x00 0x00 0x00 0x84 0x00 0x00 0x01 // '???????' 0x01 0x00 0xFC 0xFF 0x86 0x00 0x00 0x01 // '?????' 0x01 0x00 0x00 0x00 0xC2 0x00 0x00 0x01 // '???????' 0x01 0x00 0xFC 0xFF 0xC4 0x00 0x00 0x01 // '?????' 0x01 0x00 0x00 0x00 0xC5 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x05 0x00 0x00 0xFD 0x25 0x00 0x00 0x03 // '???%???' 0x0F 0x00 0x00 0xFD 0xC5 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0xC4 0x00 0x00 0x40 // '??????@' 0x02 0x00 0x00 0x00 0xC5 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x27 0x00 0x00 0x80 // '????'??' 0x00 0x00 0x00 0x02 0x29 0x00 0x00 0x80 // '????)??' 0x00 0x00 0x00 0x00 0x43 0x00 0x00 0x80 // '????C??' 0x00 0x00 0x02 0x00 0xC2 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x02 0xC4 0x00 0x00 0xC0 // '??????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_31=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_31, 0x0) BYTE 0x03 0x03 0x57 0x68 0x6F 0x61 0x21 0x20 // '??Whoa! ' 0x79 0x6F 0x75 0x72 0x20 0x63 0x6F 0x6D // 'your com' 0x70 0x75 0x74 0x65 0x72 0x20 0x69 0x73 // 'puter is' 0x20 0x6F 0x75 0x74 0x20 0x6F 0x66 0x20 // ' out of ' 0x6D 0x65 0x6D 0x6F 0x72 0x79 0x21 0x0D // 'memory!?' 0x0A 0x0D 0x0A 0x54 0x72 0x79 0x20 0x66 // '???Try f' 0x72 0x65 0x65 0x69 0x6E 0x67 0x20 0x73 // 'reeing s' 0x6F 0x6D 0x65 0x20 0x6D 0x65 0x6D 0x6F // 'ome memo' 0x72 0x79 0x2E 0x0D 0x0A 0x2A 0x20 0x53 // 'ry.??* S' 0x77 0x69 0x74 0x63 0x68 0x20 0x74 0x6F // 'witch to' 0x20 0x57 0x69 0x6E 0x64 0x6F 0x77 0x73 // ' Windows' 0x20 0x28 0x70 0x72 0x65 0x73 0x73 0x20 // ' (press ' 0x43 0x54 0x52 0x4C 0x2B 0x45 0x53 0x43 // 'CTRL+ESC' 0x29 0x20 0x61 0x6E 0x64 0x20 0x63 0x6C // ') and cl' 0x6F 0x73 0x65 0x20 0x6F 0x74 0x68 0x65 // 'ose othe' 0x72 0x20 0x70 0x72 0x6F 0x67 0x72 0x61 // 'r progra' 0x6D 0x73 0x2E 0x20 0x0D 0x0A 0x0D 0x0A // 'ms. ????' 0x2A 0x20 0x20 0x4F 0x72 0x2C 0x20 0x64 // '* Or, d' 0x65 0x6C 0x65 0x74 0x65 0x20 0x6F 0x6E // 'elete on' 0x65 0x20 0x6F 0x72 0x20 0x74 0x77 0x6F // 'e or two' 0x20 0x61 0x63 0x74 0x6F 0x72 0x73 0x20 // ' actors ' 0x6F 0x72 0x20 0x70 0x72 0x6F 0x70 0x73 // 'or props' 0x20 0x66 0x72 0x6F 0x6D 0x20 0x79 0x6F // ' from yo' 0x75 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 // 'ur movie' 0x2E 0x20 0x0D 0x0A 0x0D 0x0A 0x01 // '. ?????' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3= ktpcercSocNoSndOnPaste #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3, __HELP_NAME("ercSocNoSndOnPaste")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3, __HELP_NAME("ercSocNoSndOnPaste")) __HELP_PACK2 BO OSK LONG kgobBalloonError 0x0 0x0 ktpcErrorScript 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3, 0x0) GST(0) ITEM "kgobBalloonError" ITEM "ktpcercSocNoSndOnPaste" ITEM "" ITEM "" ITEM "ktpcErrorScript" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'GOKD' kgobOkButton 0xFFFFFFFF __HELP_SYMBOL( STN "kgobOkButton" ) ITEM LONG 0x40000001 VAR BYTE 0x01 0xFF 0xFF 0xFF 0xFF // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x09 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x70 0x00 0x00 0x01 // '????p???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x05 0x00 0x00 0xFD 0x70 0x00 0x00 0x03 // '???p???' 0x00 0x00 0x00 0x00 0x74 0x00 0x00 0x40 // '????t??@' 0x02 0x00 0x00 0x00 0x75 0x00 0x00 0x40 // '????u??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0x00 0x00 0x00 0x00 0x74 0x00 0x00 0x80 // '????t??' 0x00 0x00 0x00 0x02 0x74 0x00 0x00 0xC0 // '????t??' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x03 0x03 0x4A 0x75 0x73 0x74 0x20 0x73 // '??Just s' 0x6F 0x20 0x79 0x6F 0x75 0x20 0x6B 0x6E // 'o you kn' 0x6F 0x77 0x2E 0x2E 0x2E 0x74 0x68 0x65 // 'ow...the' 0x20 0x61 0x63 0x74 0x6F 0x72 0x20 0x79 // ' actor y' 0x6F 0x75 0x20 0x6A 0x75 0x73 0x74 0x20 // 'ou just ' 0x70 0x61 0x73 0x74 0x65 0x64 0x20 0x77 // 'pasted w' 0x69 0x6C 0x6C 0x20 0x6E 0x6F 0x74 0x20 // 'ill not ' 0x68 0x61 0x76 0x65 0x20 0x61 0x6E 0x79 // 'have any' 0x20 0x73 0x6F 0x75 0x6E 0x64 0x73 0x20 // ' sounds ' 0x74 0x68 0x61 0x74 0x20 0x77 0x65 0x72 // 'that wer' 0x65 0x20 0x64 0x65 0x6C 0x65 0x74 0x65 // 'e delete' 0x64 0x20 0x66 0x72 0x6F 0x6D 0x20 0x69 // 'd from i' 0x74 0x73 0x20 0x6F 0x72 0x69 0x67 0x69 // 'ts origi' 0x6E 0x61 0x6C 0x20 0x6D 0x6F 0x76 0x69 // 'nal movi' 0x65 0x2E 0x0D 0x0A 0x0D 0x0A 0x01 // 'e.?????' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_4= ktpcercFileGeneral #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4, __HELP_NAME("ercFileGeneral")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4, __HELP_NAME("ercFileGeneral")) __HELP_PACK2 BO OSK LONG kgobBalloonError 0x0 0x0 ktpcErrorScript 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_37=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4, 0x0) GST(0) ITEM "kgobBalloonError" ITEM "ktpcercFileGeneral" ITEM "" ITEM "" ITEM "ktpcErrorScript" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_37=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_37=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_37, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'GOKD' kgobOkButton 0xFFFFFFFF __HELP_SYMBOL( STN "kgobOkButton" ) ITEM LONG 0x40000001 VAR BYTE 0x01 0xFF 0xFF 0xFF 0xFF // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_37=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_37, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x16 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x28 0x00 0x00 0x01 // '????(???' 0x01 0x00 0xFC 0xFF 0x2A 0x00 0x00 0x01 // '??*???' 0x01 0x00 0x00 0x00 0xAE 0x00 0x00 0x01 // '???????' 0x01 0x00 0xFC 0xFF 0xB0 0x00 0x00 0x01 // '?????' 0x01 0x00 0x00 0x00 0xF8 0x00 0x00 0x01 // '???????' 0x01 0x00 0xFC 0xFF 0xFA 0x00 0x00 0x01 // '?????' 0x01 0x00 0x00 0x00 0x6F 0x01 0x00 0x01 // '????o???' 0x01 0x00 0xFC 0xFF 0x71 0x01 0x00 0x01 // '??q???' 0x01 0x00 0x00 0x00 0x74 0x01 0x00 0x01 // '????t???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x05 0x00 0x00 0xFD 0x28 0x00 0x00 0x03 // '???(???' 0x0F 0x00 0x00 0xFD 0xFA 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x6F 0x01 0x00 0x03 // '????o???' 0x0F 0x00 0x00 0xFD 0x74 0x01 0x00 0x03 // '???t???' 0x00 0x00 0x00 0x00 0x73 0x01 0x00 0x40 // '????s??@' 0x02 0x00 0x00 0x00 0x74 0x01 0x00 0x40 // '????t??@' 0x00 0x00 0x00 0x00 0x5A 0x00 0x00 0x80 // '????Z??' 0x00 0x00 0x02 0x00 0xF8 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0xFA 0x00 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0x71 0x01 0x00 0x80 // '????q??' 0x00 0x00 0x00 0x02 0x73 0x01 0x00 0xC0 // '????s??' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_37=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_37, 0x0) BYTE 0x03 0x03 0x4F 0x6F 0x70 0x73 0x2E 0x20 // '??Oops. ' 0x20 0x57 0x65 0x20 0x68 0x61 0x64 0x20 // ' We had ' 0x74 0x72 0x6F 0x75 0x62 0x6C 0x65 0x20 // 'trouble ' 0x20 0x77 0x69 0x74 0x68 0x20 0x74 0x68 // ' with th' 0x69 0x73 0x20 0x66 0x69 0x6C 0x65 0x2E // 'is file.' 0x0D 0x0A 0x0D 0x0A 0x42 0x65 0x66 0x6F // '????Befo' 0x72 0x65 0x20 0x79 0x6F 0x75 0x20 0x74 // 're you t' 0x72 0x79 0x20 0x61 0x67 0x61 0x69 0x6E // 'ry again' 0x2C 0x20 0x63 0x68 0x65 0x63 0x6B 0x20 // ', check ' 0x74 0x68 0x65 0x73 0x65 0x20 0x73 0x75 // 'these su' 0x67 0x67 0x65 0x73 0x74 0x69 0x6F 0x6E // 'ggestion' 0x73 0x2E 0x0D 0x0A 0x2A 0x20 0x20 0x49 // 's.??* I' 0x66 0x20 0x79 0x6F 0x75 0x27 0x72 0x65 // 'f you're' 0x20 0x75 0x73 0x69 0x6E 0x67 0x20 0x61 // ' using a' 0x20 0x66 0x6C 0x6F 0x70 0x70 0x79 0x20 // ' floppy ' 0x64 0x69 0x73 0x6B 0x2C 0x20 0x6D 0x61 // 'disk, ma' 0x6B 0x65 0x20 0x73 0x75 0x72 0x65 0x20 // 'ke sure ' 0x69 0x74 0x20 0x69 0x73 0x20 0x63 0x6F // 'it is co' 0x72 0x72 0x65 0x63 0x74 0x6C 0x79 0x20 // 'rrectly ' 0x69 0x6E 0x73 0x65 0x72 0x74 0x65 0x64 // 'inserted' 0x20 0x69 0x6E 0x20 0x74 0x68 0x65 0x20 // ' in the ' 0x64 0x72 0x69 0x76 0x65 0x2E 0x0D 0x0A // 'drive.??' 0x0D 0x0A 0x2A 0x20 0x20 0x4D 0x61 0x6B // '??* Mak' 0x65 0x20 0x73 0x75 0x72 0x65 0x20 0x74 // 'e sure t' 0x68 0x65 0x20 0x33 0x44 0x20 0x4D 0x6F // 'he 3D Mo' 0x76 0x69 0x65 0x20 0x4D 0x61 0x6B 0x65 // 'vie Make' 0x72 0x20 0x43 0x44 0x20 0x69 0x73 0x20 // 'r CD is ' 0x63 0x6F 0x72 0x72 0x65 0x63 0x74 0x6C // 'correctl' 0x79 0x20 0x69 0x6E 0x73 0x65 0x72 0x74 // 'y insert' 0x65 0x64 0x20 0x69 0x6E 0x20 0x74 0x68 // 'ed in th' 0x65 0x20 0x64 0x72 0x69 0x76 0x65 0x2E // 'e drive.' 0x0D 0x0A 0x0D 0x0A 0x2A 0x20 0x20 0x20 // '????* ' 0x59 0x6F 0x75 0x72 0x20 0x63 0x6F 0x6D // 'Your com' 0x70 0x75 0x74 0x65 0x72 0x27 0x73 0x20 // 'puter's ' 0x68 0x61 0x72 0x64 0x20 0x64 0x72 0x69 // 'hard dri' 0x76 0x65 0x20 0x6D 0x61 0x79 0x20 0x62 // 've may b' 0x65 0x20 0x66 0x75 0x6C 0x6C 0x2E 0x20 // 'e full. ' 0x53 0x77 0x69 0x74 0x63 0x68 0x20 0x74 // 'Switch t' 0x6F 0x20 0x57 0x69 0x6E 0x64 0x6F 0x77 // 'o Window' 0x73 0x20 0x28 0x70 0x72 0x65 0x73 0x73 // 's (press' 0x20 0x43 0x54 0x52 0x4C 0x2B 0x45 0x53 // ' CTRL+ES' 0x43 0x29 0x20 0x61 0x6E 0x64 0x20 0x6D // 'C) and m' 0x6F 0x76 0x65 0x20 0x6F 0x72 0x20 0x64 // 'ove or d' 0x65 0x6C 0x65 0x74 0x65 0x20 0x75 0x6E // 'elete un' 0x6E 0x65 0x63 0x65 0x73 0x73 0x61 0x72 // 'necessar' 0x79 0x20 0x66 0x69 0x6C 0x65 0x73 0x2E // 'y files.' 0x20 0x0D 0x0A 0x0D 0x0A 0x01 // ' ?????' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_5= ktpcercCflOpen #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5, __HELP_NAME("ercCflOpen")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5, __HELP_NAME("ercCflOpen")) __HELP_PACK2 BO OSK LONG kgobBalloonError 0x0 0x0 ktpcErrorScript 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_0=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5, 0x0) GST(0) ITEM "kgobBalloonError" ITEM "ktpcercCflOpen" ITEM "" ITEM "" ITEM "ktpcErrorScript" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_0=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_0=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'GOKD' kgobOkButton 0xFFFFFFFF __HELP_SYMBOL( STN "kgobOkButton" ) ITEM LONG 0x40000001 VAR BYTE 0x01 0xFF 0xFF 0xFF 0xFF // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_0=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x19 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x38 0x00 0x00 0x01 // '????8???' 0x01 0x00 0xFC 0xFF 0x3A 0x00 0x00 0x01 // '??:???' 0x01 0x00 0x00 0x00 0xA2 0x00 0x00 0x01 // '???????' 0x01 0x00 0xFC 0xFF 0xA4 0x00 0x00 0x01 // '?????' 0x01 0x00 0x00 0x00 0xE6 0x00 0x00 0x01 // '???????' 0x01 0x00 0xFC 0xFF 0xE8 0x00 0x00 0x01 // '?????' 0x01 0x00 0x00 0x00 0x35 0x01 0x00 0x01 // '????5???' 0x01 0x00 0xFC 0xFF 0x37 0x01 0x00 0x01 // '??7???' 0x01 0x00 0x00 0x00 0x7F 0x01 0x00 0x01 // '????????' 0x01 0x00 0xFC 0xFF 0x81 0x01 0x00 0x01 // '?????' 0x01 0x00 0x00 0x00 0x84 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x05 0x00 0x00 0xFD 0x38 0x00 0x00 0x03 // '???8???' 0x0F 0x00 0x00 0xFD 0xA4 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x33 0x01 0x00 0x03 // '????3???' 0x0F 0x00 0x00 0xFD 0x84 0x01 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x83 0x01 0x00 0x40 // '??????@' 0x02 0x00 0x00 0x00 0x84 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x5A 0x00 0x00 0x80 // '????Z??' 0x00 0x00 0x02 0x00 0xA2 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0xA4 0x00 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0x35 0x01 0x00 0x80 // '????5??' 0x00 0x00 0x00 0x00 0x81 0x01 0x00 0x80 // '??????' 0x00 0x00 0x00 0x02 0x83 0x01 0x00 0xC0 // '??????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_0=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) BYTE 0x03 0x03 0x44 0x75 0x65 0x20 0x74 0x6F // '??Due to' 0x20 0x74 0x65 0x63 0x68 0x6E 0x69 0x63 // ' technic' 0x61 0x6C 0x20 0x64 0x69 0x66 0x66 0x69 // 'al diffi' 0x63 0x75 0x6C 0x74 0x69 0x65 0x73 0x20 // 'culties ' 0x77 0x65 0x20 0x63 0x61 0x6E 0x27 0x74 // 'we can't' 0x20 0x6F 0x70 0x65 0x6E 0x20 0x74 0x68 // ' open th' 0x69 0x73 0x20 0x66 0x69 0x6C 0x65 0x2E // 'is file.' 0x0D 0x0A 0x0D 0x0A 0x54 0x72 0x79 0x20 // '????Try ' 0x74 0x68 0x65 0x20 0x66 0x6F 0x6C 0x6C // 'the foll' 0x6F 0x77 0x69 0x6E 0x67 0x20 0x73 0x75 // 'owing su' 0x67 0x67 0x65 0x73 0x74 0x69 0x6F 0x6E // 'ggestion' 0x73 0x2E 0x0D 0x0A 0x2A 0x20 0x20 0x4D // 's.??* M' 0x61 0x6B 0x65 0x20 0x73 0x75 0x72 0x65 // 'ake sure' 0x20 0x61 0x6E 0x79 0x20 0x64 0x69 0x73 // ' any dis' 0x6B 0x20 0x79 0x6F 0x75 0x27 0x72 0x65 // 'k you're' 0x20 0x75 0x73 0x69 0x6E 0x67 0x20 0x69 // ' using i' 0x73 0x20 0x63 0x6F 0x72 0x72 0x65 0x63 // 's correc' 0x74 0x6C 0x79 0x20 0x69 0x6E 0x73 0x65 // 'tly inse' 0x72 0x74 0x65 0x64 0x20 0x69 0x6E 0x20 // 'rted in ' 0x69 0x74 0x73 0x20 0x64 0x72 0x69 0x76 // 'its driv' 0x65 0x2E 0x0D 0x0A 0x0D 0x0A 0x2A 0x20 // 'e.????* ' 0x20 0x53 0x77 0x69 0x74 0x63 0x68 0x20 // ' Switch ' 0x74 0x6F 0x20 0x57 0x69 0x6E 0x64 0x6F // 'to Windo' 0x77 0x73 0x20 0x28 0x70 0x72 0x65 0x73 // 'ws (pres' 0x73 0x20 0x43 0x54 0x52 0x4C 0x2B 0x45 // 's CTRL+E' 0x53 0x43 0x29 0x20 0x61 0x6E 0x64 0x20 // 'SC) and ' 0x63 0x6C 0x6F 0x73 0x65 0x20 0x6F 0x74 // 'close ot' 0x68 0x65 0x72 0x20 0x70 0x72 0x6F 0x67 // 'her prog' 0x72 0x61 0x6D 0x73 0x2E 0x20 0x0D 0x0A // 'rams. ??' 0x0D 0x0A 0x2A 0x20 0x20 0x53 0x77 0x69 // '??* Swi' 0x74 0x63 0x68 0x20 0x74 0x6F 0x20 0x57 // 'tch to W' 0x69 0x6E 0x64 0x6F 0x77 0x73 0x20 0x28 // 'indows (' 0x70 0x72 0x65 0x73 0x73 0x20 0x43 0x54 // 'press CT' 0x52 0x4C 0x2B 0x45 0x53 0x43 0x29 0x20 // 'RL+ESC) ' 0x61 0x6E 0x64 0x20 0x6D 0x6F 0x76 0x65 // 'and move' 0x20 0x6F 0x72 0x20 0x64 0x65 0x6C 0x65 // ' or dele' 0x74 0x65 0x20 0x75 0x6E 0x6E 0x63 0x65 // 'te unnce' 0x73 0x73 0x61 0x72 0x79 0x20 0x66 0x69 // 'ssary fi' 0x6C 0x65 0x73 0x2E 0x20 0x0D 0x0A 0x0D // 'les. ???' 0x0A 0x4F 0x74 0x68 0x65 0x72 0x77 0x69 // '?Otherwi' 0x73 0x65 0x2C 0x20 0x74 0x68 0x65 0x20 // 'se, the ' 0x66 0x69 0x6C 0x65 0x20 0x6D 0x61 0x79 // 'file may' 0x20 0x62 0x65 0x20 0x63 0x6F 0x72 0x72 // ' be corr' 0x75 0x70 0x74 0x2C 0x20 0x6F 0x72 0x20 // 'upt, or ' 0x69 0x74 0x20 0x69 0x73 0x20 0x6E 0x6F // 'it is no' 0x74 0x20 0x61 0x20 0x33 0x44 0x20 0x4D // 't a 3D M' 0x6F 0x76 0x69 0x65 0x20 0x4D 0x61 0x6B // 'ovie Mak' 0x65 0x72 0x20 0x66 0x69 0x6C 0x65 0x2E // 'er file.' 0x20 0x0D 0x0A 0x0D 0x0A 0x01 // ' ?????' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_6= ktpcercCflSave #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6, __HELP_NAME("ercCflSave")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6, __HELP_NAME("ercCflSave")) __HELP_PACK2 BO OSK LONG kgobBalloonError 0x0 0x0 ktpcErrorScript 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_7=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6, 0x0) GST(0) ITEM "kgobBalloonError" ITEM "ktpcercCflSave" ITEM "" ITEM "" ITEM "ktpcErrorScript" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_7=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_7=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'GOKD' kgobOkButton 0xFFFFFFFF __HELP_SYMBOL( STN "kgobOkButton" ) ITEM LONG 0x40000001 VAR BYTE 0x01 0xFF 0xFF 0xFF 0xFF // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_7=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x16 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x24 0x00 0x00 0x01 // '????$???' 0x01 0x00 0xFC 0xFF 0x26 0x00 0x00 0x01 // '??&???' 0x01 0x00 0x00 0x00 0xA6 0x00 0x00 0x01 // '???????' 0x01 0x00 0xFC 0xFF 0xA8 0x00 0x00 0x01 // '?????' 0x01 0x00 0x00 0x00 0xEA 0x00 0x00 0x01 // '???????' 0x01 0x00 0xFC 0xFF 0xEC 0x00 0x00 0x01 // '?????' 0x01 0x00 0x00 0x00 0x37 0x01 0x00 0x01 // '????7???' 0x01 0x00 0xFC 0xFF 0x39 0x01 0x00 0x01 // '??9???' 0x01 0x00 0x00 0x00 0x3C 0x01 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0x41 0x00 0x00 0x01 // '????A???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x05 0x00 0x00 0xFD 0x1F 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0x40 // '????@??@' 0x02 0x00 0x00 0x00 0x41 0x00 0x00 0x40 // '????A??@' 0x00 0x00 0x00 0x00 0x3E 0x00 0x00 0x80 // '????>??' 0x00 0x00 0x00 0x02 0x40 0x00 0x00 0xC0 // '????@??' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_12=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_12, 0x0) BYTE 0x03 0x03 0x4F 0x6F 0x70 0x73 0x2C 0x20 // '??Oops, ' 0x74 0x68 0x69 0x73 0x20 0x33 0x44 0x20 // 'this 3D ' 0x66 0x6F 0x6E 0x74 0x20 0x69 0x73 0x20 // 'font is ' 0x62 0x72 0x6F 0x6B 0x65 0x6E 0x2E 0x0D // 'broken.?' 0x0A 0x0D 0x0A 0x50 0x6C 0x65 0x61 0x73 // '???Pleas' 0x65 0x20 0x63 0x68 0x6F 0x6F 0x73 0x65 // 'e choose' 0x20 0x61 0x6E 0x6F 0x74 0x68 0x65 0x72 // ' another' 0x20 0x66 0x6F 0x6E 0x74 0x2E 0x0D 0x0A // ' font.??' 0x0D 0x0A 0x01 // '???' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3B= ktpcercSocNoActrMidi #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3B, __HELP_NAME("ercSocNoActrMidi")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3B, __HELP_NAME("ercSocNoActrMidi")) __HELP_PACK2 BO OSK LONG kgobBalloonError 0x0 0x0 ktpcErrorScript 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3B, 0x0) GST(0) ITEM "kgobBalloonError" ITEM "ktpcercSocNoActrMidi" ITEM "" ITEM "" ITEM "ktpcErrorScript" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3B, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2E=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2E, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'GOKD' kgobOkButton 0xFFFFFFFF __HELP_SYMBOL( STN "kgobOkButton" ) ITEM LONG 0x40000001 VAR BYTE 0x01 0xFF 0xFF 0xFF 0xFF // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0E 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x3F 0x00 0x00 0x01 // '????????' 0x01 0x00 0xFC 0xFF 0x41 0x00 0x00 0x01 // '??A???' 0x01 0x00 0x00 0x00 0x77 0x00 0x00 0x01 // '????w???' 0x01 0x00 0xFC 0xFF 0x79 0x00 0x00 0x01 // '??y???' 0x01 0x00 0x00 0x00 0xF7 0x00 0x00 0x01 // '???????' 0x01 0x00 0xFC 0xFF 0xF9 0x00 0x00 0x01 // '?????' 0x01 0x00 0x00 0x00 0xFA 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x05 0x00 0x00 0xFD 0x3C 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x2D 0x00 0x00 0x03 // '????-???' 0x0A 0x00 0x00 0xFD 0x3A 0x00 0x00 0x03 // '???:???' 0x00 0x00 0x00 0x00 0x3D 0x00 0x00 0x40 // '????=??@' 0x01 0x00 0x00 0x00 0x3E 0x00 0x00 0x40 // '????>??@' 0x00 0x00 0x00 0x00 0x3D 0x00 0x00 0x80 // '????=??' 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x3D 0x00 0x00 0x82 // '????=??' 0x00 0x00 0x00 0x00 0x3D 0x00 0x00 0xC0 // '????=??' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_12=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_12, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x73 0x65 0x65 // '??To see' 0x20 0x74 0x68 0x65 0x20 0x73 0x63 0x65 // ' the sce' 0x6E 0x65 0x73 0x20 0x79 0x6F 0x75 0x20 // 'nes you ' 0x63 0x61 0x6E 0x20 0x63 0x68 0x6F 0x6F // 'can choo' 0x73 0x65 0x20 0x66 0x72 0x6F 0x6D 0x2C // 'se from,' 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 0x53 // ' click S' 0x63 0x65 0x6E 0x65 0x20 0x43 0x68 0x6F // 'cene Cho' 0x69 0x63 0x65 0x73 0x2E 0x0D 0x0A 0x01 // 'ices.???' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1= CO__Click_the_scene_you_want #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("CO--Click the scene you want...")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("CO--Click the scene you want...")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobGuideHelp 0x0 kidPlayGuideSounds 0xAA 0x32 0x57415645 kwavGuideHelp01 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "CO__Click_the_scene_you_want" ITEM "kgobGuideHelp" ITEM "" ITEM "kidPlayGuideSounds" ITEM "kwavGuideHelp01" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0x96 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x19 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x73 0x63 0x65 0x6E // 'the scen' 0x65 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 // 'e you wa' 0x6E 0x74 0x2E // 'nt.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2= CO___then_click_the_camera #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2, __HELP_NAME("CO--Click the camera")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2, __HELP_NAME("CO--Click the camera")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobGuideHelp 0x0 kidPlayGuideSounds 0x140 0x32 0x57415645 kwavGuideHelp02 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_9=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "CO___then_click_the_camera" ITEM "kgobGuideHelp" ITEM "" ITEM "kidPlayGuideSounds" ITEM "kwavGuideHelp02" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_8=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_8=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x4B 0x00 0x00 0x01 // '????K???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_8=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) BYTE 0x03 0x03 0x54 0x68 0x65 0x6E 0x20 0x63 // '??Then c' 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 // 'lick the' 0x20 0x63 0x61 0x6D 0x65 0x72 0x61 0x20 // ' camera ' 0x61 0x6E 0x67 0x6C 0x65 0x20 0x79 0x6F // 'angle yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 // 'u want t' 0x6F 0x20 0x75 0x73 0x65 0x20 0x61 0x74 // 'o use at' 0x20 0x74 0x68 0x65 0x20 0x62 0x65 0x67 // ' the beg' 0x69 0x6E 0x6E 0x69 0x6E 0x67 0x20 0x6F // 'inning o' 0x66 0x20 0x79 0x6F 0x75 0x72 0x20 0x6D // 'f your m' 0x6F 0x76 0x69 0x65 0x2E // 'ovie.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3= CO__When_you_re_ready #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3, __HELP_NAME("CO--When_you're_ready")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3, __HELP_NAME("CO--When_you're_ready")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobGuideHelp kidActorsCover kidPlayGuideSounds 0x0 0x0 0x57415645 kwavGuideHelp03 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "CO__When_you_re_ready" ITEM "kgobGuideHelp" ITEM "kidActorsCover" ITEM "kidPlayGuideSounds" ITEM "kwavGuideHelp03" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3, 0x0) BYTE 0x01 0x00 0x03 0x03 0xAD 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x28 0x00 0x00 0x01 // '????(???' 0x00 0x00 0x00 0x00 0x29 0x00 0x00 0x01 // '????)???' 0x01 0x00 0x00 0x00 0x37 0x00 0x00 0x01 // '????7???' 0x00 0x00 0x00 0x00 0x29 0x00 0x00 0x03 // '????)???' 0x0A 0x00 0x00 0xFD 0x37 0x00 0x00 0x03 // '???7???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) BYTE 0x03 0x03 0x57 0x68 0x65 0x6E 0x20 0x79 // '??When y' 0x6F 0x75 0x92 0x72 0x65 0x20 0x72 0x65 // 'oure re' 0x61 0x64 0x79 0x20 0x74 0x6F 0x20 0x61 // 'ady to a' 0x64 0x64 0x20 0x61 0x6E 0x20 0x61 0x63 // 'dd an ac' 0x74 0x6F 0x72 0x2C 0x20 0x63 0x6C 0x69 // 'tor, cli' 0x63 0x6B 0x20 0x41 0x63 0x74 0x6F 0x72 // 'ck Actor' 0x73 0x20 0x26 0x20 0x50 0x72 0x6F 0x70 // 's & Prop' 0x73 0x2E // 's.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_4= CO__Click_Actors #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4, __HELP_NAME("CO--Click Actors")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4, __HELP_NAME("CO--Click Actors")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobGuideHelp kidActorsBrowser kidPlayGuideSounds 0x0 0x0 0x57415645 kwavGuideHelp04 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "CO__Click_Actors" ITEM "kgobGuideHelp" ITEM "kidActorsBrowser" ITEM "kidPlayGuideSounds" ITEM "kwavGuideHelp04" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4, 0x0) BYTE 0x01 0x00 0x03 0x03 0x4A 0x00 0x00 0x00 // '????J???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x05 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0D 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0C 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x41 0x63 0x74 0x6F 0x72 0x73 0x2E // 'Actors.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_5= CO__Click_the_actor_you_want #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5, __HELP_NAME("CO--Click the actor you want")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5, __HELP_NAME("CO--Click the actor you want")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobGuideHelp 0x0 kidPlayGuideSounds 0xAA 0x32 0x57415645 kwavGuideHelp05 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_15=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "CO__Click_the_actor_you_want" ITEM "kgobGuideHelp" ITEM "" ITEM "kidPlayGuideSounds" ITEM "kwavGuideHelp05" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_15=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5, 0x0) BYTE 0x01 0x00 0x03 0x03 0x96 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_15=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_15, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x19 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_15=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_15, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x6F // 'the acto' 0x72 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 // 'r you wa' 0x6E 0x74 0x2E // 'nt.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_6= CO__Click_where_you_want_to #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6, __HELP_NAME("CO--Click where you want to ")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6, __HELP_NAME("CO--Click where you want to ")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobGuideHelp 0x0 kidPlayGuideSounds 0x140 0x6E 0x57415645 kwavGuideHelp06 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_8=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "CO__Click_where_you_want_to" ITEM "kgobGuideHelp" ITEM "" ITEM "kidPlayGuideSounds" ITEM "kwavGuideHelp06" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6, 0x0) BYTE 0x01 0x00 0x03 0x03 0xEF 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x88 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x2A 0x00 0x00 0x82 // '????*??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x77 0x68 0x65 0x72 0x65 0x20 0x79 0x6F // 'where yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 // 'u want t' 0x6F 0x20 0x70 0x6C 0x61 0x63 0x65 0x20 // 'o place ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x6F // 'the acto' 0x72 0x2E 0x0D 0x0A 0x49 0x66 0x20 0x79 // 'r.??If y' 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 // 'ou want ' 0x74 0x6F 0x20 0x6D 0x6F 0x76 0x65 0x20 // 'to move ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x6F // 'the acto' 0x72 0x20 0x75 0x70 0x20 0x6F 0x72 0x20 // 'r up or ' 0x64 0x6F 0x77 0x6E 0x2C 0x20 0x68 0x6F // 'down, ho' 0x6C 0x64 0x20 0x64 0x6F 0x77 0x6E 0x20 // 'ld down ' 0x74 0x68 0x65 0x20 0x55 0x70 0x20 0x6F // 'the Up o' 0x72 0x20 0x44 0x6F 0x77 0x6E 0x20 0x41 // 'r Down A' 0x72 0x72 0x6F 0x77 0x20 0x6B 0x65 0x79 // 'rrow key' 0x20 0x62 0x65 0x66 0x6F 0x72 0x65 0x20 // ' before ' 0x79 0x6F 0x75 0x20 0x63 0x6C 0x69 0x63 // 'you clic' 0x6B 0x2E // 'k.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_7= CO__To_make_an_actor_move #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7, __HELP_NAME("CO--To make an actor move")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7, __HELP_NAME("CO--To make an actor move")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobGuideHelp kidActorsActionBrowser kidPlayGuideSounds 0x0 0x0 0x57415645 kwavGuideHelp07 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "CO__To_make_an_actor_move" ITEM "kgobGuideHelp" ITEM "kidActorsActionBrowser" ITEM "kidPlayGuideSounds" ITEM "kwavGuideHelp07" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7, 0x0) BYTE 0x01 0x00 0x03 0x03 0x6E 0x00 0x00 0x00 // '????n???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1D 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x1E 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x25 0x00 0x00 0x01 // '????%???' 0x00 0x00 0x00 0x00 0x1E 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x25 0x00 0x00 0x03 // '???%???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x6D 0x61 0x6B // '??To mak' 0x65 0x20 0x61 0x6E 0x20 0x61 0x63 0x74 // 'e an act' 0x6F 0x72 0x20 0x20 0x6D 0x6F 0x76 0x65 // 'or move' 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 // ', click ' 0x41 0x63 0x74 0x69 0x6F 0x6E 0x73 0x2E // 'Actions.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_8= CO__Click_the_actor #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8, __HELP_NAME("CO--Click the actor.")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8, __HELP_NAME("CO--Click the actor.")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobGuideHelp 0x0 kidPlayGuideSounds 0x140 0x6E 0x57415645 kwavGuideHelp08 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "CO__Click_the_actor" ITEM "kgobGuideHelp" ITEM "" ITEM "kidPlayGuideSounds" ITEM "kwavGuideHelp08" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8, 0x0) BYTE 0x01 0x00 0x03 0x03 0x5C 0x00 0x00 0x00 // '????\???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x10 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x6F // 'the acto' 0x72 0x2E // 'r.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_9= CO__Click_the_action_you #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_9, __HELP_NAME("CO--Click the action you")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_9, __HELP_NAME("CO--Click the action you")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobGuideHelp 0x0 kidPlayGuideSounds 0x140 0x32 0x57415645 kwavGuideHelp09 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_9, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "CO__Click_the_action_you" ITEM "kgobGuideHelp" ITEM "" ITEM "kidPlayGuideSounds" ITEM "kwavGuideHelp09" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_9, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB0 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_6=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG Tip__Choose_Start_Position __HELP_SYMBOL( STN "Tip__Choose_Start_Position" ) ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_2=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x27 0x00 0x00 0x01 // '????'???' 0x01 0x00 0x00 0x00 0x6E 0x00 0x00 0x01 // '????n???' 0x00 0x00 0x00 0x00 0x52 0x00 0x00 0x40 // '????R??@' 0x01 0x00 0x00 0x00 0x6E 0x00 0x00 0x40 // '????n??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x52 0x00 0x00 0x82 // '????R??' 0x00 0x00 0x00 0x00 0x52 0x00 0x00 0xC0 // '????R??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x69 // 'the acti' 0x6F 0x6E 0x20 0x79 0x6F 0x75 0x20 0x77 // 'on you w' 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 0x70 // 'ant to p' 0x72 0x65 0x76 0x69 0x65 0x77 0x2E 0x20 // 'review. ' 0x20 0x57 0x68 0x65 0x6E 0x20 0x79 0x6F // ' When yo' 0x75 0x20 0x66 0x69 0x6E 0x64 0x20 0x74 // 'u find t' 0x68 0x65 0x20 0x6F 0x6E 0x65 0x20 0x79 // 'he one y' 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 0x2C // 'ou want,' 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 0x4F // ' click O' 0x4B 0x2E 0x0D 0x0A 0x01 0x20 0x20 0x53 // 'K.??? S' 0x65 0x74 0x74 0x69 0x6E 0x67 0x20 0x74 // 'etting t' 0x68 0x65 0x20 0x73 0x74 0x61 0x72 0x74 // 'he start' 0x69 0x6E 0x67 0x20 0x70 0x6F 0x73 0x65 // 'ing pose' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_A= CO__Drag_the_actor #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_A, __HELP_NAME("CO--Drag the actor")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_A, __HELP_NAME("CO--Drag the actor")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobGuideHelp 0x0 kidPlayGuideSounds 0x140 0x6E 0x57415645 kwavGuideHelp0A ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_7=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_A, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "CO__Drag_the_actor" ITEM "kgobGuideHelp" ITEM "" ITEM "kidPlayGuideSounds" ITEM "kwavGuideHelp0A" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_7=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x00 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_3=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG Tip___Move_Up_Down __HELP_SYMBOL( STN "Tip___Move_Up_Down" ) FREE FREE FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG Def_Drag __HELP_SYMBOL( STN "Def_Drag" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_7=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0E 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xA3 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x04 0x00 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x7F 0x00 0x00 0x04 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x40 // '???????@' 0x06 0x00 0x00 0x00 0x04 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x7F 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x81 0x00 0x00 0x40 // '??????@' 0x02 0x00 0x00 0x00 0xA3 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x81 0x00 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0x31 0x00 0x00 0x82 // '????1??' 0x05 0x00 0x00 0x00 0x81 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x81 0x00 0x00 0xC0 // '??????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_7=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) BYTE 0x03 0x03 0x44 0x72 0x61 0x67 0x20 0x74 // '??Drag t' 0x68 0x65 0x20 0x61 0x63 0x74 0x6F 0x72 // 'he actor' 0x20 0x77 0x68 0x65 0x72 0x65 0x20 0x79 // ' where y' 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 // 'ou want ' 0x69 0x74 0x20 0x74 0x6F 0x20 0x67 0x6F // 'it to go' 0x2E 0x0D 0x0A 0x2D 0x2D 0x6F 0x72 0x2D // '.??--or-' 0x2D 0x0D 0x0A 0x4D 0x6F 0x76 0x65 0x20 // '-??Move ' 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 0x73 // 'the mous' 0x65 0x20 0x63 0x75 0x72 0x73 0x6F 0x72 // 'e cursor' 0x20 0x6F 0x76 0x65 0x72 0x20 0x74 0x68 // ' over th' 0x65 0x20 0x61 0x63 0x74 0x6F 0x72 0x20 // 'e actor ' 0x74 0x68 0x65 0x6E 0x20 0x68 0x6F 0x6C // 'then hol' 0x64 0x20 0x64 0x6F 0x77 0x6E 0x20 0x74 // 'd down t' 0x68 0x65 0x20 0x6D 0x6F 0x75 0x73 0x65 // 'he mouse' 0x20 0x62 0x75 0x74 0x74 0x6F 0x6E 0x20 // ' button ' 0x61 0x6E 0x64 0x20 0x77 0x61 0x69 0x74 // 'and wait' 0x2E 0x0D 0x0A 0x01 0x4D 0x6F 0x76 0x69 // '.???Movi' 0x6E 0x67 0x20 0x75 0x70 0x20 0x6F 0x72 // 'ng up or' 0x20 0x64 0x6F 0x77 0x6E 0x20 0x61 0x6E // ' down an' 0x64 0x20 0x6E 0x65 0x61 0x72 0x20 0x6F // 'd near o' 0x72 0x20 0x66 0x61 0x72 // 'r far' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_B= CO__To_see_what_your #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_B, __HELP_NAME("CO--To see what your ")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_B, __HELP_NAME("CO--To see what your ")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobGuideHelp kidPlay kidPlayGuideSounds 0x0 0x0 0x57415645 kwavGuideHelp0B ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_B, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "CO__To_see_what_your" ITEM "kgobGuideHelp" ITEM "kidPlay" ITEM "kidPlayGuideSounds" ITEM "kwavGuideHelp0B" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_9=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_B, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC2 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_9=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_9, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x40 0x00 0x00 0x01 // '????@???' 0x00 0x00 0x00 0x00 0x34 0x00 0x00 0x03 // '????4???' 0x0A 0x00 0x00 0xFD 0x38 0x00 0x00 0x03 // '???8???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_9=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_9, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x73 0x65 0x65 // '??To see' 0x20 0x77 0x68 0x61 0x74 0x20 0x79 0x6F // ' what yo' 0x75 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 // 'ur movie' 0x20 0x6C 0x6F 0x6F 0x6B 0x73 0x20 0x6C // ' looks l' 0x69 0x6B 0x65 0x20 0x73 0x6F 0x20 0x66 // 'ike so f' 0x61 0x72 0x2C 0x20 0x63 0x6C 0x69 0x63 // 'ar, clic' 0x6B 0x20 0x74 0x68 0x65 0x20 0x50 0x6C // 'k the Pl' 0x61 0x79 0x20 0x62 0x75 0x74 0x74 0x6F // 'ay butto' 0x6E 0x2E // 'n.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_C= CO__If_you_want_to_save #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_C, __HELP_NAME("CO--If you want to save ")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_C, __HELP_NAME("CO--If you want to save ")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobGuideHelp 0x0 kidPlayGuideSounds 0x140 0xF0 0x57415645 kwavGuideHelp0C ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_14=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_C, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "CO__If_you_want_to_save" ITEM "kgobGuideHelp" ITEM "" ITEM "kidPlayGuideSounds" ITEM "kwavGuideHelp0C" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_14=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x96 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_14=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_14, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x29 0x00 0x00 0x01 // '????)???' 0x00 0x00 0x00 0x00 0x2A 0x00 0x00 0x01 // '????*???' 0x01 0x00 0x00 0x00 0x2E 0x00 0x00 0x01 // '????.???' 0x00 0x00 0x00 0x00 0x2F 0x00 0x00 0x01 // '????/???' 0x01 0x00 0x00 0x00 0x30 0x00 0x00 0x01 // '????0???' 0x00 0x00 0x00 0x00 0x2A 0x00 0x00 0x03 // '????*???' 0x0A 0x00 0x00 0xFD 0x2E 0x00 0x00 0x03 // '???.???' 0x00 0x00 0x00 0x00 0x2F 0x00 0x00 0x03 // '????/???' 0x0A 0x00 0x00 0xFD 0x30 0x00 0x00 0x03 // '???0???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_14=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_14, 0x0) BYTE 0x03 0x03 0x49 0x66 0x20 0x79 0x6F 0x75 // '??If you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F // ' want to' 0x20 0x73 0x61 0x76 0x65 0x20 0x79 0x6F // ' save yo' 0x75 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 // 'ur movie' 0x2C 0x20 0x68 0x6F 0x6C 0x64 0x20 0x64 // ', hold d' 0x6F 0x77 0x6E 0x20 0x43 0x74 0x72 0x6C // 'own Ctrl' 0x2B 0x53 0x2E // '+S.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_D= Tip__Choose_Start_Position #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_D, __HELP_NAME("Tip: Set Starting Pose")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_D, __HELP_NAME("Tip: Set Starting Pose")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobGuideHelpHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_D, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "Tip__Choose_Start_Position" ITEM "kgobGuideHelpHot" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x10 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_8=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_3=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x02 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1B 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x1D 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1D 0x01 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0xA0 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xB8 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0xBA 0x00 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xBA 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) BYTE 0x03 0x03 0x01 0x20 0x53 0x65 0x74 0x74 // '??? Sett' 0x69 0x6E 0x67 0x20 0x74 0x68 0x65 0x20 // 'ing the ' 0x73 0x74 0x61 0x72 0x74 0x69 0x6E 0x67 // 'starting' 0x20 0x70 0x6F 0x73 0x65 0x0D 0x0A 0x57 // ' pose??W' 0x68 0x65 0x6E 0x20 0x79 0x6F 0x75 0x20 // 'hen you ' 0x63 0x68 0x6F 0x6F 0x73 0x65 0x20 0x61 // 'choose a' 0x6E 0x20 0x61 0x63 0x74 0x69 0x6F 0x6E // 'n action' 0x2C 0x20 0x79 0x6F 0x75 0x20 0x63 0x61 // ', you ca' 0x6E 0x20 0x64 0x65 0x63 0x69 0x64 0x65 // 'n decide' 0x20 0x77 0x68 0x65 0x72 0x65 0x20 0x79 // ' where y' 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 // 'ou want ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x69 // 'the acti' 0x6F 0x6E 0x20 0x74 0x6F 0x20 0x62 0x65 // 'on to be' 0x67 0x69 0x6E 0x20 0x28 0x62 0x6F 0x74 // 'gin (bot' 0x68 0x20 0x66 0x65 0x65 0x74 0x20 0x6F // 'h feet o' 0x6E 0x20 0x74 0x68 0x65 0x20 0x67 0x72 // 'n the gr' 0x6F 0x75 0x6E 0x64 0x2C 0x20 0x72 0x69 // 'ound, ri' 0x67 0x68 0x74 0x20 0x66 0x6F 0x6F 0x74 // 'ght foot' 0x20 0x75 0x70 0x2C 0x20 0x61 0x6E 0x64 // ' up, and' 0x20 0x73 0x6F 0x20 0x6F 0x6E 0x29 0x2E // ' so on).' 0x0D 0x0A 0x54 0x6F 0x20 0x73 0x65 0x74 // '??To set' 0x20 0x74 0x68 0x65 0x20 0x73 0x74 0x61 // ' the sta' 0x72 0x74 0x69 0x6E 0x67 0x20 0x70 0x6F // 'rting po' 0x73 0x65 0x0D 0x0A 0x95 0x09 0x43 0x6C // 'se???Cl' 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 // 'ick the ' 0x61 0x72 0x72 0x6F 0x77 0x73 0x20 0x74 // 'arrows t' 0x6F 0x20 0x74 0x68 0x65 0x20 0x72 0x69 // 'o the ri' 0x67 0x68 0x74 0x20 0x6F 0x66 0x20 0x53 // 'ght of S' 0x65 0x74 0x20 0x53 0x74 0x61 0x72 0x74 // 'et Start' 0x69 0x6E 0x67 0x20 0x50 0x6F 0x73 0x65 // 'ing Pose' 0x20 0x75 0x6E 0x74 0x69 0x6C 0x20 0x79 // ' until y' 0x6F 0x75 0x20 0x66 0x69 0x6E 0x64 0x20 // 'ou find ' 0x74 0x68 0x65 0x20 0x73 0x74 0x61 0x72 // 'the star' 0x74 0x69 0x6E 0x67 0x20 0x70 0x6F 0x73 // 'ting pos' 0x69 0x74 0x69 0x6F 0x6E 0x20 0x79 0x6F // 'ition yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x2E // 'u want.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_E= Def_Drag #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_E, __HELP_NAME("Def: Drag")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_E, __HELP_NAME("Def: Drag")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobGuideHelpHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_11=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_E, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "Def_Drag" ITEM "kgobGuideHelpHot" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_11=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_E, 0x0) BYTE 0x01 0x00 0x03 0x03 0xCE 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_11=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_11, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x04 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xD0 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x79 0x00 0x00 0x03 // '????y???' 0x0A 0x00 0x00 0xFD 0x88 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x79 0x00 0x00 0x80 // '????y??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x79 0x00 0x00 0x82 // '????y??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_11=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_11, 0x0) BYTE 0x03 0x03 0x44 0x72 0x61 0x67 0x0D 0x0A // '??Drag??' 0x31 0x09 0x48 0x6F 0x6C 0x64 0x20 0x64 // '1?Hold d' 0x6F 0x77 0x6E 0x20 0x74 0x68 0x65 0x20 // 'own the ' 0x6D 0x6F 0x75 0x73 0x65 0x20 0x62 0x75 // 'mouse bu' 0x74 0x74 0x6F 0x6E 0x20 0x61 0x73 0x20 // 'tton as ' 0x79 0x6F 0x75 0x20 0x6D 0x6F 0x76 0x65 // 'you move' 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 // ' the mou' 0x73 0x65 0x2E 0x0D 0x0A 0x32 0x09 0x57 // 'se.??2?W' 0x68 0x65 0x6E 0x20 0x79 0x6F 0x75 0x27 // 'hen you'' 0x76 0x65 0x20 0x66 0x69 0x6E 0x69 0x73 // 've finis' 0x68 0x65 0x64 0x20 0x64 0x72 0x61 0x67 // 'hed drag' 0x67 0x69 0x6E 0x67 0x2C 0x20 0x6C 0x65 // 'ging, le' 0x74 0x20 0x67 0x6F 0x20 0x6F 0x66 0x20 // 't go of ' 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 0x73 // 'the mous' 0x65 0x20 0x62 0x75 0x74 0x74 0x6F 0x6E // 'e button' 0x2E 0x0D 0x0A 0x54 0x69 0x70 0x20 0x66 // '.??Tip f' 0x72 0x6F 0x6D 0x20 0x4D 0x63 0x5A 0x65 // 'rom McZe' 0x65 0x3A 0x20 0x20 0x59 0x6F 0x75 0x27 // 'e: You'' 0x6C 0x6C 0x20 0x67 0x65 0x74 0x20 0x74 // 'll get t' 0x68 0x65 0x20 0x62 0x65 0x73 0x74 0x20 // 'he best ' 0x72 0x65 0x73 0x75 0x6C 0x74 0x73 0x20 // 'results ' 0x69 0x66 0x20 0x79 0x6F 0x75 0x20 0x6D // 'if you m' 0x6F 0x76 0x65 0x20 0x74 0x68 0x65 0x20 // 'ove the ' 0x6D 0x6F 0x75 0x73 0x65 0x20 0x73 0x6C // 'mouse sl' 0x6F 0x77 0x6C 0x79 0x20 0x61 0x73 0x20 // 'owly as ' 0x79 0x6F 0x75 0x20 0x64 0x72 0x61 0x67 // 'you drag' 0x2E 0x20 // '. ' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_F= Tip___Change_Start_Position #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_F, __HELP_NAME("Tip: Change Start Position")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_F, __HELP_NAME("Tip: Change Start Position")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobGuideHelpHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_10=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_F, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "Tip___Change_Start_Position" ITEM "kgobGuideHelpHot" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_10=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_F, 0x0) BYTE 0x01 0x00 0x03 0x03 0xEC 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_7=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_10, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_10=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_10, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0x02 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x27 0x00 0x00 0x01 // '????'???' 0x00 0x00 0x00 0x00 0x29 0x00 0x00 0x01 // '????)???' 0x01 0x00 0x00 0x00 0x4F 0x00 0x00 0x01 // '????O???' 0x00 0x00 0x00 0x00 0x51 0x00 0x00 0x01 // '????Q???' 0x01 0x00 0x00 0x00 0x09 0x01 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x29 0x00 0x00 0x03 // '????)???' 0x0A 0x00 0x00 0xFD 0x4F 0x00 0x00 0x03 // '???O???' 0x00 0x00 0x00 0x00 0x51 0x00 0x00 0x80 // '????Q??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xBE 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_10=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_10, 0x0) BYTE 0x03 0x03 0x01 0x20 0x43 0x68 0x61 0x6E // '??? Chan' 0x67 0x69 0x6E 0x67 0x20 0x74 0x68 0x65 // 'ging the' 0x20 0x61 0x63 0x74 0x69 0x6F 0x6E 0x20 // ' action ' 0x73 0x74 0x61 0x72 0x74 0x69 0x6E 0x67 // 'starting' 0x20 0x70 0x6F 0x73 0x69 0x74 0x69 0x6F // ' positio' 0x6E 0x0D 0x0A 0x54 0x6F 0x20 0x63 0x68 // 'n??To ch' 0x61 0x6E 0x67 0x65 0x20 0x74 0x68 0x65 // 'ange the' 0x20 0x61 0x63 0x74 0x69 0x6F 0x6E 0x20 // ' action ' 0x73 0x74 0x61 0x72 0x74 0x69 0x6E 0x67 // 'starting' 0x20 0x70 0x6F 0x73 0x69 0x74 0x69 0x6F // ' positio' 0x6E 0x0D 0x0A 0x31 0x09 0x4D 0x6F 0x76 // 'n??1?Mov' 0x65 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F // 'e the mo' 0x75 0x73 0x65 0x20 0x63 0x75 0x72 0x73 // 'use curs' 0x6F 0x72 0x20 0x6F 0x76 0x65 0x72 0x20 // 'or over ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x6F // 'the acto' 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 0x2C // 'r, prop,' 0x20 0x6F 0x72 0x20 0x33 0x44 0x20 0x77 // ' or 3D w' 0x6F 0x72 0x64 0x20 0x77 0x68 0x6F 0x73 // 'ord whos' 0x65 0x20 0x61 0x63 0x74 0x69 0x6F 0x6E // 'e action' 0x20 0x73 0x74 0x61 0x72 0x74 0x69 0x6E // ' startin' 0x67 0x20 0x70 0x6F 0x73 0x69 0x74 0x69 // 'g positi' 0x6F 0x6E 0x20 0x79 0x6F 0x75 0x20 0x77 // 'on you w' 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 0x63 // 'ant to c' 0x68 0x61 0x6E 0x67 0x65 0x2E 0x0D 0x0A // 'hange.??' 0x32 0x09 0x48 0x6F 0x6C 0x64 0x20 0x64 // '2?Hold d' 0x6F 0x77 0x6E 0x20 0x43 0x74 0x72 0x6C // 'own Ctrl' 0x20 0x61 0x6E 0x64 0x20 0x74 0x68 0x65 // ' and the' 0x20 0x6D 0x6F 0x75 0x73 0x65 0x20 0x62 // ' mouse b' 0x75 0x74 0x74 0x6F 0x6E 0x20 0x75 0x6E // 'utton un' 0x74 0x69 0x6C 0x20 0x79 0x6F 0x75 0x20 // 'til you ' 0x66 0x69 0x6E 0x64 0x20 0x74 0x68 0x65 // 'find the' 0x20 0x70 0x6F 0x73 0x69 0x74 0x69 0x6F // ' positio' 0x6E 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 // 'n you wa' 0x6E 0x74 0x2E // 'nt.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_10= ktpcGuideHelp10 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_10, __HELP_NAME("CO--To choose the camera angle")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_10, __HELP_NAME("CO--To choose the camera angle")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobGuideHelp kidSettingsCameras kidPlayGuideSounds 0x0 0x0 0x57415645 kwavGuideHelp10 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_0=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_10, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcGuideHelp10" ITEM "kgobGuideHelp" ITEM "kidSettingsCameras" ITEM "kidPlayGuideSounds" ITEM "kwavGuideHelp10" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_0=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_10, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_0=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG Def___camera_angle __HELP_SYMBOL( STN "Def___camera_angle" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_0=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x30 0x00 0x00 0x01 // '????0???' 0x00 0x00 0x00 0x00 0x22 0x00 0x00 0x03 // '????"???' 0x0A 0x00 0x00 0xFD 0x2F 0x00 0x00 0x03 // '???/???' 0x00 0x00 0x00 0x00 0x0E 0x00 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x1A 0x00 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x0E 0x00 0x00 0x40 // '???????@' 0x01 0x00 0x00 0x00 0x1A 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_0=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x63 0x68 0x6F // '??To cho' 0x6F 0x73 0x65 0x20 0x74 0x68 0x65 0x20 // 'ose the ' 0x63 0x61 0x6D 0x65 0x72 0x61 0x20 0x61 // 'camera a' 0x6E 0x67 0x6C 0x65 0x2C 0x20 0x63 0x6C // 'ngle, cl' 0x69 0x63 0x6B 0x20 0x43 0x61 0x6D 0x65 // 'ick Came' 0x72 0x61 0x20 0x41 0x6E 0x67 0x6C 0x65 // 'ra Angle' 0x73 0x2E // 's.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_11= Def___camera_angle #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_11, __HELP_NAME("Def: Camera Angle")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_11, __HELP_NAME("Def: Camera Angle")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobGuideHelpHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_5=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_11, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "Def___camera_angle" ITEM "kgobGuideHelpHot" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_5=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_11, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC5 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_5=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0C 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x0E 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xA6 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x0E 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_5=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x03 0x03 0x43 0x61 0x6D 0x65 0x72 0x61 // '??Camera' 0x20 0x61 0x6E 0x67 0x6C 0x65 0x0D 0x0A // ' angle??' 0x45 0x61 0x63 0x68 0x20 0x73 0x63 0x65 // 'Each sce' 0x6E 0x65 0x20 0x68 0x61 0x73 0x20 0x6D // 'ne has m' 0x61 0x6E 0x79 0x20 0x64 0x69 0x66 0x66 // 'any diff' 0x65 0x72 0x65 0x6E 0x74 0x20 0x63 0x61 // 'erent ca' 0x6D 0x65 0x72 0x61 0x20 0x61 0x6E 0x67 // 'mera ang' 0x6C 0x65 0x73 0x2E 0x20 0x20 0x57 0x68 // 'les. Wh' 0x65 0x6E 0x20 0x79 0x6F 0x75 0x20 0x63 // 'en you c' 0x68 0x6F 0x6F 0x73 0x65 0x20 0x61 0x20 // 'hoose a ' 0x63 0x61 0x6D 0x65 0x72 0x61 0x20 0x61 // 'camera a' 0x6E 0x67 0x6C 0x65 0x2C 0x20 0x79 0x6F // 'ngle, yo' 0x75 0x20 0x61 0x72 0x65 0x6E 0x27 0x74 // 'u aren't' 0x20 0x63 0x68 0x61 0x6E 0x67 0x69 0x6E // ' changin' 0x67 0x20 0x74 0x68 0x65 0x20 0x73 0x63 // 'g the sc' 0x65 0x6E 0x65 0x97 0x79 0x6F 0x75 0x27 // 'eneyou'' 0x72 0x65 0x20 0x6A 0x75 0x73 0x74 0x20 // 're just ' 0x63 0x68 0x61 0x6E 0x67 0x69 0x6E 0x67 // 'changing' 0x20 0x74 0x68 0x65 0x20 0x76 0x69 0x65 // ' the vie' 0x77 0x20 0x6F 0x66 0x20 0x74 0x68 0x61 // 'w of tha' 0x74 0x20 0x73 0x63 0x65 0x6E 0x65 0x2E // 't scene.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_59= Tip___Freezing_Action #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_59, __HELP_NAME("Tip: Freezing an Action")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_59, __HELP_NAME("Tip: Freezing an Action")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobGuideHelpHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_13=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_59, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "Tip___Freezing_Action" ITEM "kgobGuideHelpHot" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_13=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_59, 0x0) BYTE 0x01 0x00 0x03 0x03 0xFB 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_13, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_13=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_13, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x15 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x17 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x4E 0x01 0x00 0x01 // '????N???' 0x00 0x00 0x00 0x00 0xED 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x00 0x01 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x02 0x01 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x02 0x01 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_13=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_13, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x46 0x72 0x65 // '??? Fre' 0x65 0x7A 0x69 0x6E 0x67 0x20 0x61 0x6E // 'ezing an' 0x20 0x61 0x63 0x74 0x69 0x6F 0x6E 0x0D // ' action?' 0x0A 0x57 0x68 0x65 0x6E 0x20 0x79 0x6F // '?When yo' 0x75 0x20 0x6D 0x6F 0x76 0x65 0x20 0x61 // 'u move a' 0x6E 0x20 0x61 0x63 0x74 0x6F 0x72 0x20 // 'n actor ' 0x61 0x63 0x72 0x6F 0x73 0x73 0x20 0x74 // 'across t' 0x68 0x65 0x20 0x73 0x74 0x61 0x67 0x65 // 'he stage' 0x2C 0x20 0x79 0x6F 0x75 0x20 0x63 0x61 // ', you ca' 0x6E 0x20 0x22 0x66 0x72 0x65 0x65 0x7A // 'n "freez' 0x65 0x22 0x20 0x61 0x6E 0x20 0x61 0x63 // 'e" an ac' 0x74 0x69 0x6F 0x6E 0x2E 0x20 0x20 0x46 // 'tion. F' 0x6F 0x72 0x20 0x65 0x78 0x61 0x6D 0x70 // 'or examp' 0x6C 0x65 0x2C 0x20 0x69 0x66 0x20 0x79 // 'le, if y' 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 // 'ou want ' 0x61 0x6E 0x20 0x61 0x63 0x74 0x6F 0x72 // 'an actor' 0x20 0x74 0x6F 0x20 0x6A 0x75 0x6D 0x70 // ' to jump' 0x20 0x75 0x70 0x20 0x69 0x6E 0x74 0x6F // ' up into' 0x20 0x74 0x68 0x65 0x20 0x61 0x69 0x72 // ' the air' 0x2C 0x20 0x79 0x6F 0x75 0x20 0x63 0x61 // ', you ca' 0x6E 0x20 0x66 0x72 0x65 0x65 0x7A 0x65 // 'n freeze' 0x20 0x74 0x68 0x65 0x20 0x6A 0x75 0x6D // ' the jum' 0x70 0x20 0x61 0x63 0x74 0x69 0x6F 0x6E // 'p action' 0x20 0x61 0x6E 0x64 0x20 0x63 0x6F 0x6E // ' and con' 0x74 0x69 0x6E 0x75 0x65 0x20 0x64 0x72 // 'tinue dr' 0x61 0x67 0x67 0x69 0x6E 0x67 0x20 0x74 // 'agging t' 0x6F 0x20 0x63 0x72 0x65 0x61 0x74 0x65 // 'o create' 0x20 0x61 0x20 0x22 0x66 0x6C 0x6F 0x61 // ' a "floa' 0x74 0x69 0x6E 0x67 0x22 0x20 0x65 0x66 // 'ting" ef' 0x66 0x65 0x63 0x74 0x2E 0x0D 0x0A 0x54 // 'fect.??T' 0x6F 0x20 0x66 0x72 0x65 0x65 0x7A 0x65 // 'o freeze' 0x20 0x61 0x6E 0x20 0x61 0x63 0x74 0x69 // ' an acti' 0x6F 0x6E 0x0D 0x0A 0x95 0x09 0x48 0x6F // 'on???Ho' 0x6C 0x64 0x20 0x64 0x6F 0x77 0x6E 0x20 // 'ld down ' 0x53 0x68 0x69 0x66 0x74 0x20 0x61 0x73 // 'Shift as' 0x20 0x79 0x6F 0x75 0x20 0x64 0x72 0x61 // ' you dra' 0x67 0x20 0x74 0x68 0x65 0x20 0x61 0x63 // 'g the ac' 0x74 0x6F 0x72 0x2C 0x20 0x70 0x72 0x6F // 'tor, pro' 0x70 0x2C 0x20 0x6F 0x72 0x20 0x33 0x44 // 'p, or 3D' 0x20 0x77 0x6F 0x72 0x64 0x20 0x77 0x68 // ' word wh' 0x65 0x72 0x65 0x20 0x79 0x6F 0x75 0x20 // 'ere you ' 0x77 0x61 0x6E 0x74 0x20 0x69 0x74 0x2E // 'want it.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_5C= Tip___Move_Up_Down #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5C, __HELP_NAME("Tip: Move Up Down Near Far")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5C, __HELP_NAME("Tip: Move Up Down Near Far")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobGuideHelpHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_6=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5C, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "Tip___Move_Up_Down" ITEM "kgobGuideHelpHot" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_6=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x0A 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_4=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_6=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0D 0x00 0x00 0x00 0x04 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x25 0x00 0x00 0x01 // '????%???' 0x00 0x00 0x00 0x00 0x27 0x00 0x00 0x01 // '????'???' 0x01 0x00 0x00 0x00 0x64 0x00 0x00 0x01 // '????d???' 0x00 0x00 0x00 0x00 0x66 0x00 0x00 0x01 // '????f???' 0x01 0x00 0x00 0x00 0xB5 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x03 // '????????' 0x46 0x00 0x00 0xFD 0x04 0x00 0x00 0x03 // 'F??????' 0x00 0x00 0x00 0x00 0x27 0x00 0x00 0x03 // '????'???' 0x0A 0x00 0x00 0xFD 0x64 0x00 0x00 0x03 // '???d???' 0x00 0x00 0x00 0x00 0x66 0x00 0x00 0x80 // '????f??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_6=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x20 0x4D 0x6F // '??? Mo' 0x76 0x69 0x6E 0x67 0x20 0x75 0x70 0x20 // 'ving up ' 0x6F 0x72 0x20 0x64 0x6F 0x77 0x6E 0x20 // 'or down ' 0x61 0x6E 0x64 0x20 0x6E 0x65 0x61 0x72 // 'and near' 0x20 0x6F 0x72 0x20 0x66 0x61 0x72 0x0D // ' or far?' 0x0A 0x54 0x6F 0x20 0x6D 0x6F 0x76 0x65 // '?To move' 0x20 0x61 0x6E 0x20 0x61 0x63 0x74 0x6F // ' an acto' 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 0x2C // 'r, prop,' 0x20 0x6F 0x72 0x20 0x33 0x44 0x20 0x77 // ' or 3D w' 0x6F 0x72 0x64 0x20 0x75 0x70 0x20 0x6F // 'ord up o' 0x72 0x20 0x64 0x6F 0x77 0x6E 0x20 0x61 // 'r down a' 0x6E 0x64 0x20 0x6E 0x65 0x61 0x72 0x20 // 'nd near ' 0x6F 0x72 0x20 0x66 0x61 0x72 0x0D 0x0A // 'or far??' 0x95 0x09 0x48 0x6F 0x6C 0x64 0x20 0x64 // '?Hold d' 0x6F 0x77 0x6E 0x20 0x74 0x68 0x65 0x20 // 'own the ' 0x55 0x70 0x20 0x6F 0x72 0x20 0x44 0x6F // 'Up or Do' 0x77 0x6E 0x20 0x41 0x72 0x72 0x6F 0x77 // 'wn Arrow' 0x20 0x6B 0x65 0x79 0x20 0x61 0x73 0x20 // ' key as ' 0x79 0x6F 0x75 0x20 0x68 0x6F 0x6C 0x64 // 'you hold' 0x20 0x64 0x6F 0x77 0x6E 0x20 0x74 0x68 // ' down th' 0x65 0x20 0x6D 0x6F 0x75 0x73 0x65 0x20 // 'e mouse ' 0x62 0x75 0x74 0x74 0x6F 0x6E 0x20 0x6F // 'button o' 0x72 0x20 0x64 0x72 0x61 0x67 0x2E // 'r drag.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_92= Tip___Path_through #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_92, __HELP_NAME("blank")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_92, __HELP_NAME("blank")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobGuideHelpHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_92, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "Tip___Path_through" ITEM "kgobGuideHelpHot" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_92, 0x0) BYTE 0x01 0x00 0x03 0x03 0x7C 0x01 0x00 0x00 // '????|???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) BYTE 0x03 0x03 // '??' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK ================================================ FILE: src/help/help.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ #define NO_HELP_NAMES #define HELP_SINGLE_CHUNK #define NO_HELP_SYMBOLS //#define PACK_HELP #include "kidgs.chh" #include "stdiodef.h" #include "helptops.h" #include "helpbook.h" #include "projmain.h" #include "helpres.h" #include "balloons.chh" #include "socdefn.h" #include "sharedef.h" #include "biopage.chh" #include "help\toolhelp.cht" #include "help\tooltips.cht" #include "help\bkhowto.cht" #include "help\bktips.cht" #include "help\bktocbas.cht" #include "help\bktools.cht" #include "help\booktpc.cht" #include "help\basics.cht" #include "help\htscenes.cht" #include "help\logo.cht" #include "help\prjalert.cht" #include "help\prjintro.cht" #include "help\prjtips.cht" #include "help\project1.cht" #include "help\project2.cht" #include "help\project3.cht" #include "help\project4.cht" #include "help\project5.cht" #include "help\project6.cht" #include "help\gadget1.cht" #include "help\gadget2.cht" #include "help\gadget3.cht" #include "help\gadget4.cht" #include "help\gadget5.cht" #include "help\gadget6.cht" #include "help\easelhp.cht" #include "help\errors.cht" #include "help\guidhelp.cht" #include "help\htactors.cht" #include "help\htalerts.cht" #include "help\htsounds.cht" #include "help\htwords.cht" #include "help\app.cht" // Help topics from the building #include "help\topics1.cht" // Bio page topics #include "help\bio.cht" ================================================ FILE: src/help/htactors.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ #undef __HELP_NAME #undef __HELP_SYMBOL #undef __HELP_PACK #undef __HELP_PACK2 #ifdef NO_HELP_NAMES #define __HELP_NAME(name) "" #else #define __HELP_NAME(name) name #endif #ifdef NO_HELP_SYMBOLS #define __HELP_SYMBOL(stuff) #else #define __HELP_SYMBOL(stuff) stuff #endif #ifdef PACK_HELP #define __HELP_PACK PACK #else #define __HELP_PACK #endif #ifdef HELP_SINGLE_CHUNK #define __HELP_PACK2 #else #define __HELP_PACK2 __HELP_PACK #endif SET _help_48544F50_0= ktpcHowToActors00 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("CO--Actors & Props")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("CO--Actors & Props")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence kidActorsCover kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTActors00 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcHowToActors00" ITEM "kgobHowtoSequence" ITEM "kidActorsCover" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors00" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0x81 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x15 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x14 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1D, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x41 0x63 0x74 0x6F 0x72 0x73 0x20 0x26 // 'Actors &' 0x20 0x50 0x72 0x6F 0x70 0x73 0x2E // ' Props.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1= ktpcHowToActors01 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("CO 1) To see the characters")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("CO 1) To see the characters")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence kidActorsBrowser kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTActors01 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_7D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcHowToActors01" ITEM "kgobHowtoSequence" ITEM "kidActorsBrowser" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors01" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_7D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0x00 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_3=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7D, 0x0) AG(4) ITEM LONG 0x2000003 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToActors93 __HELP_SYMBOL( STN "ktpcHowToActors93" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_7D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x14 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x7B 0x00 0x00 0x01 // '????{???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0B 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x15 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x29 0x00 0x00 0x02 // '????)???' 0x00 0x00 0x00 0x00 0x6F 0x00 0x00 0x02 // '????o???' 0x01 0x00 0x00 0x00 0x74 0x00 0x00 0x02 // '????t???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x29 0x00 0x00 0x03 // '???)???' 0x00 0x00 0x00 0x00 0x74 0x00 0x00 0x03 // '????t???' 0x0A 0x00 0x00 0xFD 0x7A 0x00 0x00 0x03 // '???z???' 0x0F 0x00 0x00 0xFD 0x7B 0x00 0x00 0x03 // '???{???' 0x00 0x00 0x00 0x00 0x2D 0x00 0x00 0x04 // '????-???' 0x0D 0x00 0x00 0xFE 0x3C 0x00 0x00 0x04 // '?????@' 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0x40 // '????@??@' 0x03 0x00 0x00 0x00 0x4A 0x00 0x00 0x40 // '????J??@' 0x00 0x00 0x00 0x00 0x4C 0x00 0x00 0x40 // '????L??@' 0x05 0x00 0x00 0x00 0x5B 0x00 0x00 0x40 // '????[??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x1F 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x1F 0x00 0x00 0xC0 // '???????' 0x06 0x00 0x00 0x00 0x28 0x00 0x00 0xC0 // '????(??' 0x06 0x00 0x00 0x00 0x40 0x00 0x00 0xC0 // '????@??' 0x06 0x00 0x00 0x00 0x4C 0x00 0x00 0xC0 // '????L??' 0x06 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_28=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_28, 0x0) BYTE 0x03 0x03 0x43 0x68 0x6F 0x6F 0x73 0x69 // '??Choosi' 0x6E 0x67 0x20 0x61 0x6E 0x20 0x61 0x63 // 'ng an ac' 0x74 0x6F 0x72 0x2D 0x2D 0x57 0x68 0x61 // 'tor--Wha' 0x74 0x20 0x6E 0x65 0x78 0x74 0x3F 0x0D // 't next??' 0x0A 0x01 0x20 0x20 0x55 0x6E 0x64 0x6F // '?? Undo' 0x0D 0x0A 0x01 0x20 0x41 0x73 0x73 0x69 // '??? Assi' 0x67 0x6E 0x69 0x6E 0x67 0x20 0x61 0x6E // 'gning an' 0x20 0x61 0x63 0x74 0x69 0x6F 0x6E 0x20 // ' action ' 0x0D 0x0A 0x01 0x20 0x52 0x65 0x6D 0x6F // '??? Remo' 0x76 0x69 0x6E 0x67 0x0D 0x0A 0x01 0x20 // 'ving??? ' 0x52 0x65 0x70 0x6F 0x73 0x69 0x74 0x69 // 'Repositi' 0x6F 0x6E 0x69 0x6E 0x67 // 'oning' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_5= ktpcHowToActors05 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5, __HELP_NAME("CO 1) To see the props")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5, __HELP_NAME("CO 1) To see the props")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence kidActorsPropBrowser kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTActors05 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_17=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcHowToActors05" ITEM "kgobHowtoSequence" ITEM "kidActorsPropBrowser" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors05" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_17=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE5 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_4A=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_17, 0x0) AG(4) ITEM LONG 0x2000003 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToActors93 __HELP_SYMBOL( STN "ktpcHowToActors93" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_17=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_17, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x14 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x73 0x00 0x00 0x01 // '????s???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0B 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x10 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x24 0x00 0x00 0x02 // '????$???' 0x00 0x00 0x00 0x00 0x68 0x00 0x00 0x02 // '????h???' 0x01 0x00 0x00 0x00 0x6D 0x00 0x00 0x02 // '????m???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x24 0x00 0x00 0x03 // '???$???' 0x00 0x00 0x00 0x00 0x6D 0x00 0x00 0x03 // '????m???' 0x0A 0x00 0x00 0xFD 0x72 0x00 0x00 0x03 // '???r???' 0x0F 0x00 0x00 0xFD 0x73 0x00 0x00 0x03 // '???s???' 0x00 0x00 0x00 0x00 0x28 0x00 0x00 0x04 // '????(???' 0x0D 0x00 0x00 0xFE 0x37 0x00 0x00 0x04 // '???7???' 0x00 0x00 0x00 0x00 0x28 0x00 0x00 0x40 // '????(??@' 0x03 0x00 0x00 0x00 0x37 0x00 0x00 0x40 // '????7??@' 0x00 0x00 0x00 0x00 0x26 0x00 0x00 0x80 // '????&??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x65 0x00 0x00 0x82 // '????e??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_17=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_17, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x73 0x65 0x65 // '??To see' 0x20 0x74 0x68 0x65 0x20 0x70 0x72 0x6F // ' the pro' 0x70 0x73 0x20 0x79 0x6F 0x75 0x20 0x63 // 'ps you c' 0x61 0x6E 0x20 0x63 0x68 0x6F 0x6F 0x73 // 'an choos' 0x65 0x20 0x66 0x72 0x6F 0x6D 0x0D 0x0A // 'e from??' 0x31 0x09 0x47 0x6F 0x20 0x74 0x6F 0x20 // '1?Go to ' 0x74 0x68 0x65 0x20 0x70 0x6C 0x61 0x63 // 'the plac' 0x65 0x20 0x69 0x6E 0x20 0x79 0x6F 0x75 // 'e in you' 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 0x20 // 'r movie ' 0x77 0x68 0x65 0x72 0x65 0x20 0x79 0x6F // 'where yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 // 'u want t' 0x6F 0x20 0x61 0x64 0x64 0x20 0x61 0x20 // 'o add a ' 0x70 0x72 0x6F 0x70 0x2E 0x0D 0x0A 0x32 // 'prop.??2' 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 0x50 // '?Click P' 0x72 0x6F 0x70 0x73 0x2E // 'rops.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_6= ktpcHowToActors06 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6, __HELP_NAME("CO 2) Click the actor you ")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6, __HELP_NAME("CO 2) Click the actor you ")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x0 0x57415645 kwavHTActors06 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_91=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToActors06" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors06" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_91=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6, 0x0) BYTE 0x01 0x00 0x03 0x03 0x96 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_91=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_91, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x18 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_91=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_91, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x70 0x72 0x6F 0x70 // 'the prop' 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E // ' you wan' 0x74 0x2E // 't.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_7= ktpcHowToActors07 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7, __HELP_NAME("CO 3) Click where you 2 ")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7, __HELP_NAME("CO 3) Click where you 2 ")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTActors07 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_58=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToActors07" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors07" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_58=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_58=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_58, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x86 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x29 0x00 0x00 0x82 // '????)??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_58=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_58, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x77 0x68 0x65 0x72 0x65 0x20 0x79 0x6F // 'where yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 // 'u want t' 0x6F 0x20 0x70 0x6C 0x61 0x63 0x65 0x20 // 'o place ' 0x74 0x68 0x65 0x20 0x70 0x72 0x6F 0x70 // 'the prop' 0x2E 0x0D 0x0A 0x49 0x66 0x20 0x79 0x6F // '.??If yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 // 'u want t' 0x6F 0x20 0x6D 0x6F 0x76 0x65 0x20 0x74 // 'o move t' 0x68 0x65 0x20 0x70 0x72 0x6F 0x70 0x20 // 'he prop ' 0x75 0x70 0x20 0x6F 0x72 0x20 0x64 0x6F // 'up or do' 0x77 0x6E 0x2C 0x20 0x68 0x6F 0x6C 0x64 // 'wn, hold' 0x20 0x64 0x6F 0x77 0x6E 0x20 0x74 0x68 // ' down th' 0x65 0x20 0x55 0x70 0x20 0x6F 0x72 0x20 // 'e Up or ' 0x44 0x6F 0x77 0x6E 0x20 0x41 0x72 0x72 // 'Down Arr' 0x6F 0x77 0x20 0x6B 0x65 0x79 0x20 0x62 // 'ow key b' 0x65 0x66 0x6F 0x72 0x65 0x20 0x79 0x6F // 'efore yo' 0x75 0x20 0x63 0x6C 0x69 0x63 0x6B 0x2E // 'u click.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_8= ktpcHowToActors08 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8, __HELP_NAME("Prop--What Next?")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8, __HELP_NAME("Prop--What Next?")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTActors08 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_13=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToActors08" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors08" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_13=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_B=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_13, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToActors79 __HELP_SYMBOL( STN "ktpcHowToActors79" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktpcHowToActors7B __HELP_SYMBOL( STN "ktpcHowToActors7B" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToActors78 __HELP_SYMBOL( STN "ktpcHowToActors78" ) ITEM LONG 0x40000001 VAR BYTE 5 LONG ktpcHowToActors7C __HELP_SYMBOL( STN "ktpcHowToActors7C" ) ITEM LONG 0xC0000004 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_13=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_13, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x14 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1B 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x1D 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x58 0x00 0x00 0x01 // '????X???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x1B 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x1D 0x00 0x00 0x40 // '???????@' 0x03 0x00 0x00 0x00 0x23 0x00 0x00 0x40 // '????#??@' 0x00 0x00 0x00 0x00 0x25 0x00 0x00 0x40 // '????%??@' 0x01 0x00 0x00 0x00 0x3B 0x00 0x00 0x40 // '????;??@' 0x00 0x00 0x00 0x00 0x3D 0x00 0x00 0x40 // '????=??@' 0x02 0x00 0x00 0x00 0x47 0x00 0x00 0x40 // '????G??@' 0x00 0x00 0x00 0x00 0x49 0x00 0x00 0x40 // '????I??@' 0x04 0x00 0x00 0x00 0x58 0x00 0x00 0x40 // '????X??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x1D 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x1D 0x00 0x00 0xC0 // '???????' 0x05 0x00 0x00 0x00 0x25 0x00 0x00 0xC0 // '????%??' 0x05 0x00 0x00 0x00 0x3D 0x00 0x00 0xC0 // '????=??' 0x05 0x00 0x00 0x00 0x49 0x00 0x00 0xC0 // '????I??' 0x05 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_13=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_13, 0x0) BYTE 0x03 0x03 0x43 0x68 0x6F 0x6F 0x73 0x69 // '??Choosi' 0x6E 0x67 0x20 0x61 0x20 0x70 0x72 0x6F // 'ng a pro' 0x70 0x2D 0x2D 0x57 0x68 0x61 0x74 0x20 // 'p--What ' 0x6E 0x65 0x78 0x74 0x3F 0x0D 0x0A 0x01 // 'next????' 0x20 0x55 0x6E 0x64 0x6F 0x0D 0x0A 0x01 // ' Undo???' 0x20 0x41 0x73 0x73 0x69 0x67 0x6E 0x69 // ' Assigni' 0x6E 0x67 0x20 0x61 0x6E 0x20 0x61 0x63 // 'ng an ac' 0x74 0x69 0x6F 0x6E 0x20 0x0D 0x0A 0x01 // 'tion ???' 0x20 0x52 0x65 0x6D 0x6F 0x76 0x69 0x6E // ' Removin' 0x67 0x0D 0x0A 0x01 0x20 0x52 0x65 0x70 // 'g??? Rep' 0x6F 0x73 0x69 0x74 0x69 0x6F 0x6E 0x69 // 'ositioni' 0x6E 0x67 // 'ng' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_9= ktpcHowToActors09 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_9, __HELP_NAME("CO 1) To create a 3D word")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_9, __HELP_NAME("CO 1) To create a 3D word")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence kidActorsSpletters kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTActors09 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_5=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_9, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcHowToActors09" ITEM "kgobHowtoSequence" ITEM "kidActorsSpletters" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors09" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_5=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_9, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE6 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_27=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToActors93 __HELP_SYMBOL( STN "ktpcHowToActors93" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_5=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x11 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x6B 0x00 0x00 0x01 // '????k???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x62 0x00 0x00 0x02 // '????b???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x13 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x62 0x00 0x00 0x03 // '????b???' 0x0A 0x00 0x00 0xFD 0x6A 0x00 0x00 0x03 // '???j???' 0x0F 0x00 0x00 0xFD 0x6B 0x00 0x00 0x03 // '???k???' 0x00 0x00 0x00 0x00 0x17 0x00 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x26 0x00 0x00 0x04 // '???&???' 0x00 0x00 0x00 0x00 0x17 0x00 0x00 0x40 // '???????@' 0x03 0x00 0x00 0x00 0x26 0x00 0x00 0x40 // '????&??@' 0x00 0x00 0x00 0x00 0x15 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x5A 0x00 0x00 0x82 // '????Z??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_5=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x63 0x72 0x65 // '??To cre' 0x61 0x74 0x65 0x20 0x61 0x20 0x33 0x44 // 'ate a 3D' 0x20 0x77 0x6F 0x72 0x64 0x0D 0x0A 0x31 // ' word??1' 0x09 0x47 0x6F 0x20 0x74 0x6F 0x20 0x74 // '?Go to t' 0x68 0x65 0x20 0x70 0x6C 0x61 0x63 0x65 // 'he place' 0x20 0x69 0x6E 0x20 0x79 0x6F 0x75 0x72 // ' in your' 0x20 0x6D 0x6F 0x76 0x69 0x65 0x20 0x77 // ' movie w' 0x68 0x65 0x72 0x65 0x20 0x79 0x6F 0x75 // 'here you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F // ' want to' 0x20 0x63 0x72 0x65 0x61 0x74 0x65 0x20 // ' create ' 0x61 0x20 0x33 0x44 0x20 0x77 0x6F 0x72 // 'a 3D wor' 0x64 0x2E 0x0D 0x0A 0x32 0x09 0x43 0x6C // 'd.??2?Cl' 0x69 0x63 0x6B 0x20 0x33 0x44 0x20 0x57 // 'ick 3D W' 0x6F 0x72 0x64 0x73 0x2E // 'ords.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_A= ktpcHowToActors0A #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_A, __HELP_NAME("CO 2) Standard 3D Word Easel")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_A, __HELP_NAME("CO 2) Standard 3D Word Easel")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon0 kgobHowtoSequence 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 kwavHTActors0A ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_6B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_A, 0x0) GST(0) ITEM "kgobCalloutBalloon0" ITEM "ktpcHowToActors0A" ITEM "kgobHowtoSequence" ITEM "" ITEM "" ITEM "kwavHTActors0A" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_6B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x86 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_6B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_6B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6B, 0x0) BYTE 0x03 0x03 0x4E 0x6F 0x74 0x65 0x20 0x74 // '??Note t' 0x6F 0x20 0x54 0x6F 0x6E 0x79 0x3A 0x20 // 'o Tony: ' 0x20 0x55 0x73 0x65 0x20 0x74 0x65 0x78 // ' Use tex' 0x74 0x20 0x74 0x68 0x61 0x74 0x20 0x61 // 't that a' 0x70 0x70 0x65 0x61 0x72 0x73 0x20 0x77 // 'ppears w' 0x68 0x65 0x6E 0x20 0x74 0x68 0x65 0x79 // 'hen they' 0x20 0x75 0x73 0x65 0x20 0x33 0x44 0x20 // ' use 3D ' 0x65 0x61 0x73 0x65 0x6C 0x2E // 'easel.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_B= ktpcHowToActors0B #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_B, __HELP_NAME("CO 3) Click where you 3")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_B, __HELP_NAME("CO 3) Click where you 3")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTActors0B ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_B, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToActors0B" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors0B" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_B, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x8C 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x2C 0x00 0x00 0x82 // '????,??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1C, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x77 0x68 0x65 0x72 0x65 0x20 0x79 0x6F // 'where yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 // 'u want t' 0x6F 0x20 0x70 0x6C 0x61 0x63 0x65 0x20 // 'o place ' 0x74 0x68 0x65 0x20 0x33 0x44 0x20 0x77 // 'the 3D w' 0x6F 0x72 0x64 0x2E 0x0D 0x0A 0x49 0x66 // 'ord.??If' 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E // ' you wan' 0x74 0x20 0x74 0x6F 0x20 0x6D 0x6F 0x76 // 't to mov' 0x65 0x20 0x74 0x68 0x65 0x20 0x33 0x44 // 'e the 3D' 0x20 0x77 0x6F 0x72 0x64 0x20 0x75 0x70 // ' word up' 0x20 0x6F 0x72 0x20 0x64 0x6F 0x77 0x6E // ' or down' 0x2C 0x20 0x68 0x6F 0x6C 0x64 0x20 0x64 // ', hold d' 0x6F 0x77 0x6E 0x20 0x74 0x68 0x65 0x20 // 'own the ' 0x55 0x70 0x20 0x6F 0x72 0x20 0x44 0x6F // 'Up or Do' 0x77 0x6E 0x20 0x41 0x72 0x72 0x6F 0x77 // 'wn Arrow' 0x20 0x6B 0x65 0x79 0x20 0x62 0x65 0x66 // ' key bef' 0x6F 0x72 0x65 0x20 0x79 0x6F 0x75 0x20 // 'ore you ' 0x63 0x6C 0x69 0x63 0x6B 0x2E // 'click.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_C= ktpcHowToActors0C #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_C, __HELP_NAME("3D Word--What Next?")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_C, __HELP_NAME("3D Word--What Next?")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTActors0C ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_11=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_C, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToActors0C" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors0C" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_11=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_C, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD4 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_0=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_11, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToActors79 __HELP_SYMBOL( STN "ktpcHowToActors79" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktpcHowToActors7B __HELP_SYMBOL( STN "ktpcHowToActors7B" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToActors78 __HELP_SYMBOL( STN "ktpcHowToActors78" ) ITEM LONG 0x40000001 VAR BYTE 5 LONG ktpcHowToActors7C __HELP_SYMBOL( STN "ktpcHowToActors7C" ) ITEM LONG 0xC0000004 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_11=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_11, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x14 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1E 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x20 0x00 0x00 0x01 // '???? ???' 0x01 0x00 0x00 0x00 0x5B 0x00 0x00 0x01 // '????[???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x1E 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x20 0x00 0x00 0x40 // '???? ??@' 0x03 0x00 0x00 0x00 0x26 0x00 0x00 0x40 // '????&??@' 0x00 0x00 0x00 0x00 0x28 0x00 0x00 0x40 // '????(??@' 0x01 0x00 0x00 0x00 0x3E 0x00 0x00 0x40 // '????>??@' 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0x40 // '????@??@' 0x02 0x00 0x00 0x00 0x4A 0x00 0x00 0x40 // '????J??@' 0x00 0x00 0x00 0x00 0x4C 0x00 0x00 0x40 // '????L??@' 0x04 0x00 0x00 0x00 0x5B 0x00 0x00 0x40 // '????[??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x20 0x00 0x00 0x82 // '???? ??' 0x00 0x00 0x00 0x00 0x20 0x00 0x00 0xC0 // '???? ??' 0x05 0x00 0x00 0x00 0x28 0x00 0x00 0xC0 // '????(??' 0x05 0x00 0x00 0x00 0x40 0x00 0x00 0xC0 // '????@??' 0x05 0x00 0x00 0x00 0x4C 0x00 0x00 0xC0 // '????L??' 0x05 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_11=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_11, 0x0) BYTE 0x03 0x03 0x43 0x72 0x65 0x61 0x74 0x69 // '??Creati' 0x6E 0x67 0x20 0x61 0x20 0x33 0x44 0x20 // 'ng a 3D ' 0x77 0x6F 0x72 0x64 0x2D 0x2D 0x57 0x68 // 'word--Wh' 0x61 0x74 0x20 0x6E 0x65 0x78 0x74 0x3F // 'at next?' 0x0D 0x0A 0x01 0x20 0x55 0x6E 0x64 0x6F // '??? Undo' 0x0D 0x0A 0x01 0x20 0x41 0x73 0x73 0x69 // '??? Assi' 0x67 0x6E 0x69 0x6E 0x67 0x20 0x61 0x6E // 'gning an' 0x20 0x61 0x63 0x74 0x69 0x6F 0x6E 0x20 // ' action ' 0x0D 0x0A 0x01 0x20 0x52 0x65 0x6D 0x6F // '??? Remo' 0x76 0x69 0x6E 0x67 0x0D 0x0A 0x01 0x20 // 'ving??? ' 0x52 0x65 0x70 0x6F 0x73 0x69 0x74 0x69 // 'Repositi' 0x6F 0x6E 0x69 0x6E 0x67 // 'oning' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_D= ktpcHowToActors0D #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_D, __HELP_NAME("CO 1) To change the way")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_D, __HELP_NAME("CO 1) To change the way")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence kidActorsCostume kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTActors0D ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_6D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_D, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcHowToActors0D" ITEM "kgobHowtoSequence" ITEM "kidActorsCostume" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors0D" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_6D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_D, 0x0) BYTE 0x01 0x00 0x03 0x03 0xDF 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_55=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6D, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToActors93 __HELP_SYMBOL( STN "ktpcHowToActors93" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_6D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0F 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x92 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x32 0x00 0x00 0x03 // '???2???' 0x00 0x00 0x00 0x00 0x82 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x91 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x36 0x00 0x00 0x04 // '????6???' 0x0D 0x00 0x00 0xFE 0x45 0x00 0x00 0x04 // '???E???' 0x00 0x00 0x00 0x00 0x36 0x00 0x00 0x40 // '????6??@' 0x03 0x00 0x00 0x00 0x45 0x00 0x00 0x40 // '????E??@' 0x00 0x00 0x00 0x00 0x34 0x00 0x00 0x80 // '????4??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x76 0x00 0x00 0x82 // '????v??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_6D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6D, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x63 0x68 0x61 // '??To cha' 0x6E 0x67 0x65 0x20 0x74 0x68 0x65 0x20 // 'nge the ' 0x77 0x61 0x79 0x20 0x61 0x6E 0x20 0x61 // 'way an a' 0x63 0x74 0x6F 0x72 0x2C 0x20 0x70 0x72 // 'ctor, pr' 0x6F 0x70 0x2C 0x20 0x6F 0x72 0x20 0x33 // 'op, or 3' 0x44 0x20 0x77 0x6F 0x72 0x64 0x20 0x6C // 'D word l' 0x6F 0x6F 0x6B 0x73 0x0D 0x0A 0x31 0x09 // 'ooks??1?' 0x47 0x6F 0x20 0x74 0x6F 0x20 0x74 0x68 // 'Go to th' 0x65 0x20 0x70 0x6C 0x61 0x63 0x65 0x20 // 'e place ' 0x69 0x6E 0x20 0x79 0x6F 0x75 0x72 0x20 // 'in your ' 0x6D 0x6F 0x76 0x69 0x65 0x20 0x77 0x68 // 'movie wh' 0x65 0x72 0x65 0x20 0x79 0x6F 0x75 0x20 // 'ere you ' 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 // 'want to ' 0x6D 0x61 0x6B 0x65 0x20 0x61 0x20 0x63 // 'make a c' 0x68 0x61 0x6E 0x67 0x65 0x2E 0x0D 0x0A // 'hange.??' 0x32 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 // '2?Click ' 0x74 0x68 0x65 0x20 0x43 0x6F 0x73 0x74 // 'the Cost' 0x75 0x6D 0x65 0x20 0x43 0x68 0x61 0x6E // 'ume Chan' 0x67 0x65 0x72 0x2E // 'ger.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_E= ktpcHowToActors0E #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_E, __HELP_NAME("CO 2) Standard 3D Word Easel")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_E, __HELP_NAME("CO 2) Standard 3D Word Easel")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon0 kgobHowtoSequence 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 kwavHTActors0E ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_E, 0x0) GST(0) ITEM "kgobCalloutBalloon0" ITEM "ktpcHowToActors0E" ITEM "kgobHowtoSequence" ITEM "" ITEM "" ITEM "kwavHTActors0E" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x86 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) BYTE 0x03 0x03 0x4E 0x6F 0x74 0x65 0x20 0x74 // '??Note t' 0x6F 0x20 0x54 0x6F 0x6E 0x79 0x3A 0x20 // 'o Tony: ' 0x20 0x55 0x73 0x65 0x20 0x74 0x65 0x78 // ' Use tex' 0x74 0x20 0x74 0x68 0x61 0x74 0x20 0x61 // 't that a' 0x70 0x70 0x65 0x61 0x72 0x73 0x20 0x77 // 'ppears w' 0x68 0x65 0x6E 0x20 0x74 0x68 0x65 0x79 // 'hen they' 0x20 0x75 0x73 0x65 0x20 0x33 0x44 0x20 // ' use 3D ' 0x65 0x61 0x73 0x65 0x6C 0x2E // 'easel.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_F= ktpcHowToActors0F #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_F, __HELP_NAME("CO 2) Standard Actor Easel")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_F, __HELP_NAME("CO 2) Standard Actor Easel")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon0 kgobHowtoSequence 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 kwavHTActors0F ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_F, 0x0) GST(0) ITEM "kgobCalloutBalloon0" ITEM "ktpcHowToActors0F" ITEM "kgobHowtoSequence" ITEM "" ITEM "" ITEM "kwavHTActors0F" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x86 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_4=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) BYTE 0x03 0x03 0x4E 0x6F 0x74 0x65 0x20 0x74 // '??Note t' 0x6F 0x20 0x54 0x6F 0x6E 0x79 0x3A 0x20 // 'o Tony: ' 0x20 0x55 0x73 0x65 0x20 0x74 0x65 0x78 // ' Use tex' 0x74 0x20 0x74 0x68 0x61 0x74 0x20 0x61 // 't that a' 0x70 0x70 0x65 0x61 0x72 0x73 0x20 0x77 // 'ppears w' 0x68 0x65 0x6E 0x20 0x74 0x68 0x65 0x79 // 'hen they' 0x20 0x75 0x73 0x65 0x20 0x41 0x63 0x74 // ' use Act' 0x6F 0x72 0x20 0x65 0x61 0x73 0x65 0x6C // 'or easel' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_10= ktpcHowToActors10 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_10, __HELP_NAME("CO 2) Standard Prop Easel")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_10, __HELP_NAME("CO 2) Standard Prop Easel")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon0 kgobHowtoSequence 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 kwavHTActors10 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_10, 0x0) GST(0) ITEM "kgobCalloutBalloon0" ITEM "ktpcHowToActors10" ITEM "kgobHowtoSequence" ITEM "" ITEM "" ITEM "kwavHTActors10" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_10, 0x0) BYTE 0x01 0x00 0x03 0x03 0x86 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D, 0x0) BYTE 0x03 0x03 0x4E 0x6F 0x74 0x65 0x20 0x74 // '??Note t' 0x6F 0x20 0x54 0x6F 0x6E 0x79 0x3A 0x20 // 'o Tony: ' 0x20 0x55 0x73 0x65 0x20 0x74 0x65 0x78 // ' Use tex' 0x74 0x20 0x74 0x68 0x61 0x74 0x20 0x61 // 't that a' 0x70 0x70 0x65 0x61 0x72 0x73 0x20 0x77 // 'ppears w' 0x68 0x65 0x6E 0x20 0x74 0x68 0x65 0x79 // 'hen they' 0x20 0x75 0x73 0x65 0x20 0x50 0x72 0x6F // ' use Pro' 0x70 0x20 0x65 0x61 0x73 0x65 0x6C 0x2E // 'p easel.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_11= ktpcHowToActors11 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_11, __HELP_NAME("Costume--What Next?")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_11, __HELP_NAME("Costume--What Next?")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTActors11 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_10=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_11, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToActors11" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors11" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_10=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_11, 0x0) BYTE 0x01 0x00 0x03 0x03 0xBE 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_49=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_10, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToActors78 __HELP_SYMBOL( STN "ktpcHowToActors78" ) FREE ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_10=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_10, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0B 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1D 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x1F 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x25 0x00 0x00 0x01 // '????%???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x1D 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x1F 0x00 0x00 0x40 // '???????@' 0x01 0x00 0x00 0x00 0x25 0x00 0x00 0x40 // '????%??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x1F 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x1F 0x00 0x00 0xC0 // '???????' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_10=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_10, 0x0) BYTE 0x03 0x03 0x43 0x68 0x61 0x6E 0x67 0x69 // '??Changi' 0x6E 0x67 0x20 0x74 0x68 0x65 0x20 0x6C // 'ng the l' 0x6F 0x6F 0x6B 0x2D 0x2D 0x57 0x68 0x61 // 'ook--Wha' 0x74 0x20 0x6E 0x65 0x78 0x74 0x3F 0x0D // 't next??' 0x0A 0x01 0x20 0x55 0x6E 0x64 0x6F // '?? Undo' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_12= ktpcHowToActors12 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_12, __HELP_NAME("CO 1) To use the same actor")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_12, __HELP_NAME("CO 1) To use the same actor")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon7 kgobHowtoSequence kidRollCallActor kidPlayHelpSounds 0x2E 0x8B 0x57415645 kwavHTActors12 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_68=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_12, 0x0) GST(0) ITEM "kgobCalloutBalloon7" ITEM "ktpcHowToActors12" ITEM "kgobHowtoSequence" ITEM "kidRollCallActor" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors12" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_68=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_12, 0x0) BYTE 0x01 0x00 0x03 0x03 0x37 0x01 0x00 0x00 // '????7???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2B=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_68, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToActors93 __HELP_SYMBOL( STN "ktpcHowToActors93" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_68=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_68, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0D 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xB7 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x33 0x00 0x00 0x03 // '???3???' 0x00 0x00 0x00 0x00 0xAC 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xB6 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x37 0x00 0x00 0x04 // '????7???' 0x0D 0x00 0x00 0xFE 0x46 0x00 0x00 0x04 // '???F???' 0x00 0x00 0x00 0x00 0x37 0x00 0x00 0x40 // '????7??@' 0x01 0x00 0x00 0x00 0x46 0x00 0x00 0x40 // '????F??@' 0x00 0x00 0x00 0x00 0x35 0x00 0x00 0x80 // '????5??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x89 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_68=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_68, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x75 0x73 0x65 // '??To use' 0x20 0x74 0x68 0x65 0x20 0x73 0x61 0x6D // ' the sam' 0x65 0x20 0x61 0x63 0x74 0x6F 0x72 0x20 // 'e actor ' 0x69 0x6E 0x20 0x61 0x6E 0x6F 0x74 0x68 // 'in anoth' 0x65 0x72 0x20 0x70 0x61 0x72 0x74 0x20 // 'er part ' 0x6F 0x66 0x20 0x79 0x6F 0x75 0x72 0x20 // 'of your ' 0x6D 0x6F 0x76 0x69 0x65 0x0D 0x0A 0x31 // 'movie??1' 0x09 0x47 0x6F 0x20 0x74 0x6F 0x20 0x74 // '?Go to t' 0x68 0x65 0x20 0x70 0x6C 0x61 0x63 0x65 // 'he place' 0x20 0x69 0x6E 0x20 0x79 0x6F 0x75 0x72 // ' in your' 0x20 0x6D 0x6F 0x76 0x69 0x65 0x20 0x77 // ' movie w' 0x68 0x65 0x72 0x65 0x20 0x79 0x6F 0x75 // 'here you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F // ' want to' 0x20 0x61 0x64 0x64 0x20 0x61 0x6E 0x20 // ' add an ' 0x61 0x63 0x74 0x6F 0x72 0x20 0x79 0x6F // 'actor yo' 0x75 0x27 0x76 0x65 0x20 0x75 0x73 0x65 // 'u've use' 0x64 0x20 0x62 0x65 0x66 0x6F 0x72 0x65 // 'd before' 0x2E 0x0D 0x0A 0x32 0x09 0x43 0x6C 0x69 // '.??2?Cli' 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 0x61 // 'ck the a' 0x63 0x74 0x6F 0x72 0x27 0x73 0x20 0x70 // 'ctor's p' 0x69 0x63 0x74 0x75 0x72 0x65 0x20 0x69 // 'icture i' 0x6E 0x20 0x74 0x68 0x65 0x20 0x41 0x63 // 'n the Ac' 0x74 0x6F 0x72 0x20 0x4C 0x69 0x73 0x74 // 'tor List' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_13= ktpcHowToActors13 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_13, __HELP_NAME("CO 2) Click where 4")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_13, __HELP_NAME("CO 2) Click where 4")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTActors13 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_13, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToActors13" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors13" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_13, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC4 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x88 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x2A 0x00 0x00 0x82 // '????*??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x77 0x68 0x65 0x72 0x65 0x20 0x79 0x6F // 'where yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 // 'u want t' 0x6F 0x20 0x70 0x6C 0x61 0x63 0x65 0x20 // 'o place ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x6F // 'the acto' 0x72 0x2E 0x0D 0x0A 0x49 0x66 0x20 0x79 // 'r.??If y' 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 // 'ou want ' 0x74 0x6F 0x20 0x6D 0x6F 0x76 0x65 0x20 // 'to move ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x6F // 'the acto' 0x72 0x20 0x75 0x70 0x20 0x6F 0x72 0x20 // 'r up or ' 0x64 0x6F 0x77 0x6E 0x2C 0x20 0x68 0x6F // 'down, ho' 0x6C 0x64 0x20 0x64 0x6F 0x77 0x6E 0x20 // 'ld down ' 0x74 0x68 0x65 0x20 0x55 0x70 0x20 0x6F // 'the Up o' 0x72 0x20 0x44 0x6F 0x77 0x6E 0x20 0x41 // 'r Down A' 0x72 0x72 0x6F 0x77 0x20 0x6B 0x65 0x79 // 'rrow key' 0x20 0x62 0x65 0x66 0x6F 0x72 0x65 0x20 // ' before ' 0x79 0x6F 0x75 0x20 0x63 0x6C 0x69 0x63 // 'you clic' 0x6B 0x2E // 'k.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_14= ktpcHowToActors14 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_14, __HELP_NAME("Actor List--What Next?")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_14, __HELP_NAME("Actor List--What Next?")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTActors14 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_6E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_14, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToActors14" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors14" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_6E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_14, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD9 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_46=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6E, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToActors79 __HELP_SYMBOL( STN "ktpcHowToActors79" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktpcHowToActors7C __HELP_SYMBOL( STN "ktpcHowToActors7C" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToActors78 __HELP_SYMBOL( STN "ktpcHowToActors78" ) ITEM LONG 0xC0000004 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktpcHowToActors7B __HELP_SYMBOL( STN "ktpcHowToActors7B" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_6E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x14 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x20 0x00 0x00 0x01 // '???? ???' 0x00 0x00 0x00 0x00 0x22 0x00 0x00 0x01 // '????"???' 0x01 0x00 0x00 0x00 0x5D 0x00 0x00 0x01 // '????]???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x20 0x00 0x00 0x03 // '??? ???' 0x00 0x00 0x00 0x00 0x22 0x00 0x00 0x40 // '????"??@' 0x03 0x00 0x00 0x00 0x28 0x00 0x00 0x40 // '????(??@' 0x00 0x00 0x00 0x00 0x2A 0x00 0x00 0x40 // '????*??@' 0x01 0x00 0x00 0x00 0x40 0x00 0x00 0x40 // '????@??@' 0x00 0x00 0x00 0x00 0x42 0x00 0x00 0x40 // '????B??@' 0x05 0x00 0x00 0x00 0x4C 0x00 0x00 0x40 // '????L??@' 0x00 0x00 0x00 0x00 0x4E 0x00 0x00 0x40 // '????N??@' 0x02 0x00 0x00 0x00 0x5D 0x00 0x00 0x40 // '????]??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x22 0x00 0x00 0x82 // '????"??' 0x00 0x00 0x00 0x00 0x22 0x00 0x00 0xC0 // '????"??' 0x04 0x00 0x00 0x00 0x2A 0x00 0x00 0xC0 // '????*??' 0x04 0x00 0x00 0x00 0x42 0x00 0x00 0xC0 // '????B??' 0x04 0x00 0x00 0x00 0x4E 0x00 0x00 0xC0 // '????N??' 0x04 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_6E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6E, 0x0) BYTE 0x03 0x03 0x55 0x73 0x69 0x6E 0x67 0x20 // '??Using ' 0x74 0x68 0x65 0x20 0x73 0x61 0x6D 0x65 // 'the same' 0x20 0x61 0x63 0x74 0x6F 0x72 0x2D 0x2D // ' actor--' 0x57 0x68 0x61 0x74 0x20 0x6E 0x65 0x78 // 'What nex' 0x74 0x3F 0x0D 0x0A 0x01 0x20 0x55 0x6E // 't???? Un' 0x64 0x6F 0x0D 0x0A 0x01 0x20 0x41 0x73 // 'do??? As' 0x73 0x69 0x67 0x6E 0x69 0x6E 0x67 0x20 // 'signing ' 0x61 0x6E 0x20 0x61 0x63 0x74 0x69 0x6F // 'an actio' 0x6E 0x20 0x0D 0x0A 0x01 0x20 0x52 0x65 // 'n ??? Re' 0x6D 0x6F 0x76 0x69 0x6E 0x67 0x0D 0x0A // 'moving??' 0x01 0x20 0x52 0x65 0x70 0x6F 0x73 0x69 // '? Reposi' 0x74 0x69 0x6F 0x6E 0x69 0x6E 0x67 // 'tioning' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_15= ktpcHowToActors15 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_15, __HELP_NAME("CO 1) To use the same prop")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_15, __HELP_NAME("CO 1) To use the same prop")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon5 kgobHowtoSequence kidRollCallProp kidPlayHelpSounds 0x24E 0x82 0x57415645 kwavHTActors15 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_8=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_15, 0x0) GST(0) ITEM "kgobCalloutBalloon5" ITEM "ktpcHowToActors15" ITEM "kgobHowtoSequence" ITEM "kidRollCallProp" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors15" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_8=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_15, 0x0) BYTE 0x01 0x00 0x03 0x03 0x35 0x01 0x00 0x00 // '????5???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_8=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToActors93 __HELP_SYMBOL( STN "ktpcHowToActors93" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_8=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0E 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xC9 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x3D 0x00 0x00 0x03 // '???=???' 0x00 0x00 0x00 0x00 0xBF 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xC8 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0xC9 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x41 0x00 0x00 0x04 // '????A???' 0x0D 0x00 0x00 0xFE 0x50 0x00 0x00 0x04 // '???P???' 0x00 0x00 0x00 0x00 0x41 0x00 0x00 0x40 // '????A??@' 0x02 0x00 0x00 0x00 0x50 0x00 0x00 0x40 // '????P??@' 0x00 0x00 0x00 0x00 0x3F 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x9C 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_8=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x75 0x73 0x65 // '??To use' 0x20 0x74 0x68 0x65 0x20 0x73 0x61 0x6D // ' the sam' 0x65 0x20 0x70 0x72 0x6F 0x70 0x20 0x6F // 'e prop o' 0x72 0x20 0x33 0x44 0x20 0x77 0x6F 0x72 // 'r 3D wor' 0x64 0x20 0x69 0x6E 0x20 0x61 0x6E 0x6F // 'd in ano' 0x74 0x68 0x65 0x72 0x20 0x70 0x61 0x72 // 'ther par' 0x74 0x20 0x6F 0x66 0x20 0x79 0x6F 0x75 // 't of you' 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 0x0D // 'r movie?' 0x0A 0x31 0x09 0x47 0x6F 0x20 0x74 0x6F // '?1?Go to' 0x20 0x74 0x68 0x65 0x20 0x70 0x6C 0x61 // ' the pla' 0x63 0x65 0x20 0x69 0x6E 0x20 0x79 0x6F // 'ce in yo' 0x75 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 // 'ur movie' 0x20 0x77 0x68 0x65 0x72 0x65 0x20 0x79 // ' where y' 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 // 'ou want ' 0x74 0x6F 0x20 0x61 0x64 0x64 0x20 0x61 // 'to add a' 0x20 0x70 0x72 0x6F 0x70 0x20 0x6F 0x72 // ' prop or' 0x20 0x33 0x44 0x20 0x77 0x6F 0x72 0x64 // ' 3D word' 0x20 0x79 0x6F 0x75 0x27 0x76 0x65 0x20 // ' you've ' 0x75 0x73 0x65 0x64 0x20 0x62 0x65 0x66 // 'used bef' 0x6F 0x72 0x65 0x2E 0x0D 0x0A 0x32 0x09 // 'ore.??2?' 0x43 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 // 'Click th' 0x65 0x20 0x70 0x72 0x6F 0x70 0x20 0x6F // 'e prop o' 0x72 0x20 0x33 0x44 0x20 0x77 0x6F 0x72 // 'r 3D wor' 0x64 0x20 0x69 0x6E 0x20 0x74 0x68 0x65 // 'd in the' 0x20 0x50 0x72 0x6F 0x70 0x20 0x4C 0x69 // ' Prop Li' 0x73 0x74 0x2E // 'st.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_16= ktpcHowToActors16 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_16, __HELP_NAME("CO 2) Click place prop")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_16, __HELP_NAME("CO 2) Click place prop")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTActors16 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_7=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_16, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToActors16" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors16" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_7=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_16, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD6 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_7=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x9C 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x34 0x00 0x00 0x82 // '????4??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_7=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x77 0x68 0x65 0x72 0x65 0x20 0x79 0x6F // 'where yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 // 'u want t' 0x6F 0x20 0x70 0x6C 0x61 0x63 0x65 0x20 // 'o place ' 0x74 0x68 0x65 0x20 0x70 0x72 0x6F 0x70 // 'the prop' 0x20 0x6F 0x72 0x20 0x33 0x44 0x20 0x77 // ' or 3D w' 0x6F 0x72 0x64 0x2E 0x0D 0x0A 0x49 0x66 // 'ord.??If' 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E // ' you wan' 0x74 0x20 0x74 0x6F 0x20 0x6D 0x6F 0x76 // 't to mov' 0x65 0x20 0x74 0x68 0x65 0x20 0x70 0x72 // 'e the pr' 0x6F 0x70 0x20 0x6F 0x72 0x20 0x33 0x44 // 'op or 3D' 0x20 0x77 0x6F 0x72 0x64 0x20 0x75 0x70 // ' word up' 0x20 0x6F 0x72 0x20 0x64 0x6F 0x77 0x6E // ' or down' 0x2C 0x20 0x68 0x6F 0x6C 0x64 0x20 0x64 // ', hold d' 0x6F 0x77 0x6E 0x20 0x74 0x68 0x65 0x20 // 'own the ' 0x55 0x70 0x20 0x6F 0x72 0x20 0x44 0x6F // 'Up or Do' 0x77 0x6E 0x20 0x41 0x72 0x72 0x6F 0x77 // 'wn Arrow' 0x20 0x6B 0x65 0x79 0x20 0x62 0x65 0x66 // ' key bef' 0x6F 0x72 0x65 0x20 0x79 0x6F 0x75 0x20 // 'ore you ' 0x63 0x6C 0x69 0x63 0x6B 0x2E // 'click.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_17= ktpcHowToActors17 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_17, __HELP_NAME("Prop List--What Next?")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_17, __HELP_NAME("Prop List--What Next?")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTActors17 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_17, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToActors17" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors17" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_17, 0x0) BYTE 0x01 0x00 0x03 0x03 0x1B 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_5E=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1F, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToActors79 __HELP_SYMBOL( STN "ktpcHowToActors79" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktpcHowToActors7B __HELP_SYMBOL( STN "ktpcHowToActors7B" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToActors78 __HELP_SYMBOL( STN "ktpcHowToActors78" ) ITEM LONG 0x40000001 VAR BYTE 5 LONG ktpcHowToActors7C __HELP_SYMBOL( STN "ktpcHowToActors7C" ) ITEM LONG 0xC0000004 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_1F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x14 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2A 0x00 0x00 0x01 // '????*???' 0x00 0x00 0x00 0x00 0x2C 0x00 0x00 0x01 // '????,???' 0x01 0x00 0x00 0x00 0x67 0x00 0x00 0x01 // '????g???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x2A 0x00 0x00 0x03 // '???*???' 0x00 0x00 0x00 0x00 0x2C 0x00 0x00 0x40 // '????,??@' 0x03 0x00 0x00 0x00 0x32 0x00 0x00 0x40 // '????2??@' 0x00 0x00 0x00 0x00 0x34 0x00 0x00 0x40 // '????4??@' 0x01 0x00 0x00 0x00 0x4A 0x00 0x00 0x40 // '????J??@' 0x00 0x00 0x00 0x00 0x4C 0x00 0x00 0x40 // '????L??@' 0x02 0x00 0x00 0x00 0x56 0x00 0x00 0x40 // '????V??@' 0x00 0x00 0x00 0x00 0x58 0x00 0x00 0x40 // '????X??@' 0x04 0x00 0x00 0x00 0x67 0x00 0x00 0x40 // '????g??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x2C 0x00 0x00 0x82 // '????,??' 0x00 0x00 0x00 0x00 0x2C 0x00 0x00 0xC0 // '????,??' 0x05 0x00 0x00 0x00 0x34 0x00 0x00 0xC0 // '????4??' 0x05 0x00 0x00 0x00 0x4C 0x00 0x00 0xC0 // '????L??' 0x05 0x00 0x00 0x00 0x58 0x00 0x00 0xC0 // '????X??' 0x05 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1F, 0x0) BYTE 0x03 0x03 0x55 0x73 0x69 0x6E 0x67 0x20 // '??Using ' 0x74 0x68 0x65 0x20 0x73 0x61 0x6D 0x65 // 'the same' 0x20 0x70 0x72 0x6F 0x70 0x20 0x6F 0x72 // ' prop or' 0x20 0x33 0x44 0x20 0x77 0x6F 0x72 0x64 // ' 3D word' 0x2D 0x2D 0x57 0x68 0x61 0x74 0x20 0x6E // '--What n' 0x65 0x78 0x74 0x3F 0x0D 0x0A 0x01 0x20 // 'ext???? ' 0x55 0x6E 0x64 0x6F 0x0D 0x0A 0x01 0x20 // 'Undo??? ' 0x41 0x73 0x73 0x69 0x67 0x6E 0x69 0x6E // 'Assignin' 0x67 0x20 0x61 0x6E 0x20 0x61 0x63 0x74 // 'g an act' 0x69 0x6F 0x6E 0x20 0x0D 0x0A 0x01 0x20 // 'ion ??? ' 0x52 0x65 0x6D 0x6F 0x76 0x69 0x6E 0x67 // 'Removing' 0x0D 0x0A 0x01 0x20 0x52 0x65 0x70 0x6F // '??? Repo' 0x73 0x69 0x74 0x69 0x6F 0x6E 0x69 0x6E // 'sitionin' 0x67 // 'g' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_18= ktpcHowToActors18 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_18, __HELP_NAME("CO 1) To animate")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_18, __HELP_NAME("CO 1) To animate")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon1 kgobHowtoSequence kidActorsActionBrowser kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTActors18 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_27=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_18, 0x0) GST(0) ITEM "kgobCalloutBalloon1" ITEM "ktpcHowToActors18" ITEM "kgobHowtoSequence" ITEM "kidActorsActionBrowser" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors18" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_27=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_18, 0x0) BYTE 0x01 0x00 0x03 0x03 0xF8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_19=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_27, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToActors93 __HELP_SYMBOL( STN "ktpcHowToActors93" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_27=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_27, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0F 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x91 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x27 0x00 0x00 0x03 // '???'???' 0x00 0x00 0x00 0x00 0x89 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x90 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x2B 0x00 0x00 0x04 // '????+???' 0x0D 0x00 0x00 0xFE 0x3A 0x00 0x00 0x04 // '???:???' 0x00 0x00 0x00 0x00 0x2B 0x00 0x00 0x40 // '????+??@' 0x03 0x00 0x00 0x00 0x3A 0x00 0x00 0x40 // '????:??@' 0x00 0x00 0x00 0x00 0x29 0x00 0x00 0x80 // '????)??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x81 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_27=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_27, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x6D 0x61 0x6B // '??To mak' 0x65 0x20 0x61 0x6E 0x20 0x61 0x63 0x74 // 'e an act' 0x6F 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 // 'or, prop' 0x2C 0x20 0x6F 0x72 0x20 0x33 0x44 0x20 // ', or 3D ' 0x77 0x6F 0x72 0x64 0x20 0x6D 0x6F 0x76 // 'word mov' 0x65 0x0D 0x0A 0x31 0x09 0x47 0x6F 0x20 // 'e??1?Go ' 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 0x70 // 'to the p' 0x6C 0x61 0x63 0x65 0x20 0x69 0x6E 0x20 // 'lace in ' 0x79 0x6F 0x75 0x72 0x20 0x6D 0x6F 0x76 // 'your mov' 0x69 0x65 0x20 0x77 0x68 0x65 0x72 0x65 // 'ie where' 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E // ' you wan' 0x74 0x20 0x74 0x6F 0x20 0x61 0x6E 0x69 // 't to ani' 0x6D 0x61 0x74 0x65 0x20 0x74 0x68 0x65 // 'mate the' 0x20 0x61 0x63 0x74 0x6F 0x72 0x2C 0x20 // ' actor, ' 0x70 0x72 0x6F 0x70 0x2C 0x20 0x6F 0x72 // 'prop, or' 0x20 0x33 0x44 0x20 0x77 0x6F 0x72 0x64 // ' 3D word' 0x2E 0x0D 0x0A 0x32 0x09 0x43 0x6C 0x69 // '.??2?Cli' 0x63 0x6B 0x20 0x41 0x63 0x74 0x69 0x6F // 'ck Actio' 0x6E 0x73 0x2E // 'ns.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_19= ktpcHowToActors19 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_19, __HELP_NAME("CO 2) Click the 3D object animate")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_19, __HELP_NAME("CO 2) Click the 3D object animate")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTActors19 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_74=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_19, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToActors19" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors19" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_74=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_19, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_74=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_74, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x03 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x36 0x00 0x00 0x01 // '????6???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_74=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_74, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x6F // 'the acto' 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 0x2C // 'r, prop,' 0x20 0x6F 0x72 0x20 0x33 0x44 0x20 0x77 // ' or 3D w' 0x6F 0x72 0x64 0x20 0x79 0x6F 0x75 0x20 // 'ord you ' 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 // 'want to ' 0x61 0x6E 0x69 0x6D 0x61 0x74 0x65 0x2E // 'animate.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1A= ktpcHowToActors1A #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1A, __HELP_NAME("CO 3) Standard Action Browser")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1A, __HELP_NAME("CO 3) Standard Action Browser")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon0 kgobHowtoSequence 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 kwavHTActors1A ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1A, 0x0) GST(0) ITEM "kgobCalloutBalloon0" ITEM "ktpcHowToActors1A" ITEM "kgobHowtoSequence" ITEM "" ITEM "" ITEM "kwavHTActors1A" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1A, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE1 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1A, 0x0) BYTE 0x03 0x03 0x4E 0x6F 0x74 0x65 0x20 0x74 // '??Note t' 0x6F 0x20 0x54 0x6F 0x6E 0x79 0x3A 0x20 // 'o Tony: ' 0x20 0x55 0x73 0x65 0x20 0x73 0x74 0x61 // ' Use sta' 0x6E 0x64 0x61 0x72 0x64 0x20 0x41 0x63 // 'ndard Ac' 0x74 0x69 0x6F 0x6E 0x20 0x42 0x72 0x6F // 'tion Bro' 0x77 0x73 0x65 0x72 0x20 0x62 0x61 0x6C // 'wser bal' 0x6C 0x6F 0x6F 0x6E 0x2E // 'loon.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1B= ktpcHowToActors1B #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1B, __HELP_NAME("CO 4) If the action you picked")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1B, __HELP_NAME("CO 4) If the action you picked")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTActors1B ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_71=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1B, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToActors1B" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors1B" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_71=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x17 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_45=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_71, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToActors7E __HELP_SYMBOL( STN "ktpcHowToActors7E" ) ITEM LONG 0xC0000003 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToActors94 __HELP_SYMBOL( STN "ktpcHowToActors94" ) FREE ITEM LONG 0x40000001 VAR BYTE 3 LONG ktpcHowToActors7D __HELP_SYMBOL( STN "ktpcHowToActors7D" ) FREE ITEM LONG 0x40000001 VAR BYTE 5 LONG ktpcHowToActors7F __HELP_SYMBOL( STN "ktpcHowToActors7F" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_71=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_71, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x1B 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x12 0x01 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x2C 0x00 0x00 0x03 // '???,???' 0x00 0x00 0x00 0x00 0x31 0x00 0x00 0x03 // '????1???' 0x0F 0x00 0x00 0xFD 0xAC 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x31 0x00 0x00 0x04 // '????1???' 0x0D 0x00 0x00 0xFE 0x35 0x00 0x00 0x04 // '???5???' 0x00 0x00 0x00 0x00 0x31 0x00 0x00 0x40 // '????1??@' 0x04 0x00 0x00 0x00 0x35 0x00 0x00 0x40 // '????5??@' 0x00 0x00 0x00 0x00 0xB7 0x00 0x00 0x40 // '??????@' 0x02 0x00 0x00 0x00 0xD7 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xD9 0x00 0x00 0x40 // '??????@' 0x06 0x00 0x00 0x00 0xED 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xEF 0x00 0x00 0x40 // '??????@' 0x08 0x00 0x00 0x00 0x12 0x01 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x2F 0x00 0x00 0x80 // '????/??' 0x00 0x00 0x02 0x00 0x58 0x00 0x00 0x80 // '????X??' 0x00 0x00 0x03 0x00 0x60 0x00 0x00 0x80 // '????`??' 0x00 0x00 0x02 0x00 0xB7 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x2F 0x00 0x00 0x82 // '????/??' 0x00 0x00 0x00 0x00 0x60 0x00 0x00 0x82 // '????`??' 0x05 0x00 0x00 0x00 0xB7 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0xB7 0x00 0x00 0xC0 // '??????' 0x03 0x00 0x00 0x00 0xD9 0x00 0x00 0xC0 // '??????' 0x03 0x00 0x00 0x00 0xEF 0x00 0x00 0xC0 // '??????' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_71=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_71, 0x0) BYTE 0x03 0x03 0x44 0x65 0x70 0x65 0x6E 0x64 // '??Depend' 0x69 0x6E 0x67 0x20 0x6F 0x6E 0x20 0x74 // 'ing on t' 0x68 0x65 0x20 0x61 0x63 0x74 0x69 0x6F // 'he actio' 0x6E 0x20 0x79 0x6F 0x75 0x20 0x73 0x65 // 'n you se' 0x6C 0x65 0x63 0x74 0x65 0x64 0x2C 0x20 // 'lected, ' 0x65 0x69 0x74 0x68 0x65 0x72 0x3A 0x0D // 'either:?' 0x0A 0x95 0x09 0x44 0x72 0x61 0x67 0x20 // '??Drag ' 0x74 0x68 0x65 0x20 0x33 0x44 0x20 0x6F // 'the 3D o' 0x62 0x6A 0x65 0x63 0x74 0x20 0x77 0x68 // 'bject wh' 0x65 0x72 0x65 0x20 0x79 0x6F 0x75 0x20 // 'ere you ' 0x77 0x61 0x6E 0x74 0x20 0x69 0x74 0x2E // 'want it.' 0x0D 0x0A 0x2D 0x2D 0x6F 0x72 0x2D 0x2D // '??--or--' 0x0D 0x0A 0x95 0x09 0x4D 0x6F 0x76 0x65 // '???Move' 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 // ' the mou' 0x73 0x65 0x20 0x63 0x75 0x72 0x73 0x6F // 'se curso' 0x72 0x20 0x6F 0x76 0x65 0x72 0x20 0x74 // 'r over t' 0x68 0x65 0x20 0x33 0x44 0x20 0x6F 0x62 // 'he 3D ob' 0x6A 0x65 0x63 0x74 0x2C 0x20 0x74 0x68 // 'ject, th' 0x65 0x6E 0x20 0x68 0x6F 0x6C 0x64 0x20 // 'en hold ' 0x64 0x6F 0x77 0x6E 0x20 0x74 0x68 0x65 // 'down the' 0x20 0x6D 0x6F 0x75 0x73 0x65 0x20 0x62 // ' mouse b' 0x75 0x74 0x74 0x6F 0x6E 0x20 0x61 0x6E // 'utton an' 0x64 0x20 0x77 0x61 0x69 0x74 0x2E 0x0D // 'd wait.?' 0x0A 0x01 0x20 0x43 0x68 0x61 0x6E 0x67 // '?? Chang' 0x69 0x6E 0x67 0x20 0x74 0x68 0x65 0x20 // 'ing the ' 0x73 0x74 0x61 0x72 0x74 0x69 0x6E 0x67 // 'starting' 0x20 0x70 0x6F 0x73 0x69 0x74 0x69 0x6F // ' positio' 0x6E 0x0D 0x0A 0x01 0x20 0x46 0x72 0x65 // 'n??? Fre' 0x65 0x7A 0x69 0x6E 0x67 0x20 0x61 0x6E // 'ezing an' 0x20 0x61 0x63 0x74 0x69 0x6F 0x6E 0x0D // ' action?' 0x0A 0x01 0x20 0x4D 0x6F 0x76 0x69 0x6E // '?? Movin' 0x67 0x20 0x75 0x70 0x20 0x6F 0x72 0x20 // 'g up or ' 0x64 0x6F 0x77 0x6E 0x20 0x61 0x6E 0x64 // 'down and' 0x20 0x6E 0x65 0x61 0x72 0x20 0x6F 0x72 // ' near or' 0x20 0x66 0x61 0x72 // ' far' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1C= ktpcHowToActors1C #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1C, __HELP_NAME("Actions--What Next?")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1C, __HELP_NAME("Actions--What Next?")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xC8 0x57415645 kwavHTActors1C ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_8C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1C, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToActors1C" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors1C" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_8C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1C, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB0 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_21=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8C, 0x0) AG(4) FREE FREE ITEM LONG 0x40000001 VAR BYTE 5 LONG ktpcHowToActors7C __HELP_SYMBOL( STN "ktpcHowToActors7C" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToActors78 __HELP_SYMBOL( STN "ktpcHowToActors78" ) ITEM LONG 0xC0000004 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) FREE FREE ITEM LONG 0x40000001 VAR BYTE 3 LONG ktpcHowToActors81 __HELP_SYMBOL( STN "ktpcHowToActors81" ) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToActors89 __HELP_SYMBOL( STN "ktpcHowToActors89" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_8C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x15 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x32 0x00 0x00 0x01 // '????2???' 0x00 0x00 0x00 0x00 0x34 0x00 0x00 0x01 // '????4???' 0x01 0x00 0x00 0x00 0x78 0x00 0x00 0x01 // '????x???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x32 0x00 0x00 0x03 // '???2???' 0x00 0x00 0x00 0x00 0x34 0x00 0x00 0x40 // '????4??@' 0x04 0x00 0x00 0x00 0x3A 0x00 0x00 0x40 // '????:??@' 0x00 0x00 0x00 0x00 0x3C 0x00 0x00 0x40 // '???????' 0x00 0x00 0x00 0x00 0x3E 0x00 0x00 0x40 // '????>??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_40=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_40, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x6F // 'the acto' 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 0x2C // 'r, prop,' 0x20 0x6F 0x72 0x20 0x33 0x44 0x20 0x77 // ' or 3D w' 0x6F 0x72 0x64 0x2E 0x20 0x20 0x54 0x68 // 'ord. Th' 0x65 0x20 0x33 0x44 0x20 0x6F 0x62 0x6A // 'e 3D obj' 0x65 0x63 0x74 0x20 0x69 0x73 0x20 0x22 // 'ect is "' 0x66 0x72 0x6F 0x7A 0x65 0x6E 0x2E 0x22 // 'frozen."' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_32= ktpcHowToActors32 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_32, __HELP_NAME("CO 3) Click Forward or Back")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_32, __HELP_NAME("CO 3) Click Forward or Back")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTActors32 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_32, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToActors32" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors32" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_32, 0x0) BYTE 0x01 0x00 0x03 0x03 0xF4 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x94 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x94 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x52 0x00 0x00 0x82 // '????R??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2C, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x46 0x6F 0x72 0x77 // 'the Forw' 0x61 0x72 0x64 0x20 0x6F 0x72 0x20 0x42 // 'ard or B' 0x61 0x63 0x6B 0x20 0x41 0x72 0x72 0x6F // 'ack Arro' 0x77 0x20 0x74 0x6F 0x20 0x6D 0x6F 0x76 // 'w to mov' 0x65 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F // 'e the mo' 0x76 0x69 0x65 0x20 0x66 0x6F 0x72 0x77 // 'vie forw' 0x61 0x72 0x64 0x73 0x20 0x6F 0x72 0x20 // 'ards or ' 0x62 0x61 0x63 0x6B 0x77 0x61 0x72 0x64 // 'backward' 0x73 0x20 0x69 0x6E 0x20 0x74 0x69 0x6D // 's in tim' 0x65 0x2E 0x0D 0x0A 0x54 0x6F 0x20 0x63 // 'e.??To c' 0x68 0x65 0x63 0x6B 0x20 0x79 0x6F 0x75 // 'heck you' 0x72 0x20 0x63 0x68 0x61 0x6E 0x67 0x65 // 'r change' 0x73 0x2C 0x20 0x72 0x65 0x77 0x69 0x6E // 's, rewin' 0x64 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F // 'd the mo' 0x76 0x69 0x65 0x20 0x61 0x6E 0x64 0x20 // 'vie and ' 0x63 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 // 'click th' 0x65 0x20 0x50 0x6C 0x61 0x79 0x20 0x62 // 'e Play b' 0x75 0x74 0x74 0x6F 0x6E 0x2E // 'utton.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_33= ktpcHowToActors33 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_33, __HELP_NAME("Synchronize--What Next?")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_33, __HELP_NAME("Synchronize--What Next?")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTActors33 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_37=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_33, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToActors33" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors33" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_37=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_33, 0x0) BYTE 0x01 0x00 0x03 0x03 0x04 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_29=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_37, 0x0) AG(4) FREE ITEM LONG 0xC0000002 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToActors78 __HELP_SYMBOL( STN "ktpcHowToActors78" ) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToActors81 __HELP_SYMBOL( STN "ktpcHowToActors81" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_37=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_37, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0F 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x52 0x00 0x00 0x01 // '????R???' 0x00 0x00 0x00 0x00 0x54 0x00 0x00 0x01 // '????T???' 0x01 0x00 0x00 0x00 0x70 0x00 0x00 0x01 // '????p???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x52 0x00 0x00 0x03 // '???R???' 0x00 0x00 0x00 0x00 0x54 0x00 0x00 0x40 // '????T??@' 0x04 0x00 0x00 0x00 0x5A 0x00 0x00 0x40 // '????Z??@' 0x00 0x00 0x00 0x00 0x5C 0x00 0x00 0x40 // '????\??@' 0x05 0x00 0x00 0x00 0x70 0x00 0x00 0x40 // '????p??@' 0x00 0x00 0x00 0x00 0x54 0x00 0x00 0x80 // '????T??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x54 0x00 0x00 0x82 // '????T??' 0x00 0x00 0x00 0x00 0x54 0x00 0x00 0xC0 // '????T??' 0x02 0x00 0x00 0x00 0x5C 0x00 0x00 0xC0 // '????\??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_37=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_37, 0x0) BYTE 0x03 0x03 0x43 0x68 0x61 0x6E 0x67 0x69 // '??Changi' 0x6E 0x67 0x20 0x77 0x68 0x65 0x6E 0x20 // 'ng when ' 0x61 0x6E 0x20 0x61 0x63 0x74 0x6F 0x72 // 'an actor' 0x2C 0x20 0x70 0x72 0x6F 0x70 0x2C 0x20 // ', prop, ' 0x6F 0x72 0x20 0x33 0x44 0x20 0x77 0x6F // 'or 3D wo' 0x72 0x64 0x20 0x67 0x65 0x74 0x73 0x20 // 'rd gets ' 0x74 0x6F 0x20 0x61 0x20 0x70 0x61 0x72 // 'to a par' 0x74 0x69 0x63 0x75 0x6C 0x61 0x72 0x20 // 'ticular ' 0x6C 0x6F 0x63 0x61 0x74 0x69 0x6F 0x6E // 'location' 0x2D 0x2D 0x57 0x68 0x61 0x74 0x20 0x6E // '--What n' 0x65 0x78 0x74 0x3F 0x0D 0x0A 0x01 0x20 // 'ext???? ' 0x55 0x6E 0x64 0x6F 0x0D 0x0A 0x01 0x20 // 'Undo??? ' 0x50 0x6C 0x61 0x79 0x69 0x6E 0x67 0x20 // 'Playing ' 0x59 0x6F 0x75 0x72 0x20 0x4D 0x6F 0x76 // 'Your Mov' 0x69 0x65 // 'ie' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_34= ktpcHowToActors34 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_34, __HELP_NAME("CO 1) To change path timing")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_34, __HELP_NAME("CO 1) To change path timing")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon3 kgobHowtoSequence kidActorsSooner kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTActors34 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_18=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_34, 0x0) GST(0) ITEM "kgobCalloutBalloon3" ITEM "ktpcHowToActors34" ITEM "kgobHowtoSequence" ITEM "kidActorsSooner" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors34" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_18=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_34, 0x0) BYTE 0x01 0x00 0x03 0x03 0xFC 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_6=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_18, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToActors93 __HELP_SYMBOL( STN "ktpcHowToActors93" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_18=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_18, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x11 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xE8 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x41 0x00 0x00 0x03 // '???A???' 0x00 0x00 0x00 0x00 0x43 0x00 0x00 0x03 // '????C???' 0x0F 0x00 0x00 0xFD 0xDC 0x00 0x00 0x03 // '??????' 0x0A 0x00 0x00 0xFD 0xE7 0x00 0x00 0x03 // '??????' 0x0F 0x00 0x00 0xFD 0xE8 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x45 0x00 0x00 0x04 // '????E???' 0x0D 0x00 0x00 0xFE 0x54 0x00 0x00 0x04 // '???T???' 0x00 0x00 0x00 0x00 0x45 0x00 0x00 0x40 // '????E??@' 0x03 0x00 0x00 0x00 0x54 0x00 0x00 0x40 // '????T??@' 0x00 0x00 0x00 0x00 0x43 0x00 0x00 0x80 // '????C??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xD4 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_18=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_18, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x63 0x68 0x61 // '??To cha' 0x6E 0x67 0x65 0x20 0x70 0x61 0x74 0x68 // 'nge path' 0x20 0x74 0x69 0x6D 0x69 0x6E 0x67 0x20 // ' timing ' 0x73 0x6F 0x20 0x74 0x68 0x61 0x74 0x20 // 'so that ' 0x74 0x77 0x6F 0x20 0x61 0x63 0x74 0x6F // 'two acto' 0x72 0x73 0x20 0x20 0x6D 0x65 0x65 0x74 // 'rs meet' 0x20 0x75 0x70 0x20 0x77 0x69 0x74 0x68 // ' up with' 0x20 0x65 0x61 0x63 0x68 0x20 0x6F 0x74 // ' each ot' 0x68 0x65 0x72 0x0D 0x0A 0x31 0x09 0x47 // 'her??1?G' 0x6F 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 // 'o to the' 0x20 0x70 0x6C 0x61 0x63 0x65 0x20 0x69 // ' place i' 0x6E 0x20 0x79 0x6F 0x75 0x72 0x20 0x6D // 'n your m' 0x6F 0x76 0x69 0x65 0x20 0x77 0x68 0x65 // 'ovie whe' 0x72 0x65 0x20 0x79 0x6F 0x75 0x20 0x77 // 're you w' 0x61 0x6E 0x74 0x20 0x74 0x68 0x65 0x20 // 'ant the ' 0x33 0x44 0x20 0x6F 0x62 0x6A 0x65 0x63 // '3D objec' 0x74 0x73 0x20 0x74 0x6F 0x20 0x6D 0x65 // 'ts to me' 0x65 0x74 0x2E 0x20 0x20 0x4E 0x6F 0x74 // 'et. Not' 0x65 0x3A 0x20 0x20 0x4F 0x6E 0x65 0x20 // 'e: One ' 0x6F 0x66 0x20 0x74 0x68 0x65 0x20 0x6F // 'of the o' 0x62 0x6A 0x65 0x63 0x74 0x73 0x20 0x6D // 'bjects m' 0x75 0x73 0x74 0x20 0x61 0x6C 0x72 0x65 // 'ust alre' 0x61 0x64 0x79 0x20 0x62 0x65 0x20 0x70 // 'ady be p' 0x6F 0x73 0x69 0x74 0x69 0x6F 0x6E 0x65 // 'ositione' 0x64 0x20 0x77 0x68 0x65 0x72 0x65 0x20 // 'd where ' 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 // 'you want' 0x20 0x69 0x74 0x2E 0x0D 0x0A 0x32 0x09 // ' it.??2?' 0x43 0x6C 0x69 0x63 0x6B 0x20 0x53 0x79 // 'Click Sy' 0x6E 0x63 0x68 0x72 0x6F 0x6E 0x69 0x7A // 'nchroniz' 0x65 0x2E // 'e.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_35= ktpcHowToActors35 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_35, __HELP_NAME("CO 2) To freeze in right spot")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_35, __HELP_NAME("CO 2) To freeze in right spot")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTActors35 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_79=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_35, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToActors35" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors35" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_79=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_35, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_79=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_79, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x03 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x57 0x00 0x00 0x01 // '????W???' 0x00 0x00 0x00 0x00 0x57 0x00 0x00 0x40 // '????W??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_79=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_79, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x6F // 'the acto' 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 0x2C // 'r, prop,' 0x20 0x6F 0x72 0x20 0x33 0x44 0x20 0x77 // ' or 3D w' 0x6F 0x72 0x64 0x20 0x74 0x68 0x61 0x74 // 'ord that' 0x20 0x69 0x73 0x20 0x69 0x6E 0x20 0x74 // ' is in t' 0x68 0x65 0x20 0x72 0x69 0x67 0x68 0x74 // 'he right' 0x20 0x73 0x70 0x6F 0x74 0x2E 0x20 0x54 // ' spot. T' 0x68 0x65 0x20 0x33 0x44 0x20 0x6F 0x62 // 'he 3D ob' 0x6A 0x65 0x63 0x74 0x20 0x69 0x73 0x20 // 'ject is ' 0x22 0x66 0x72 0x6F 0x7A 0x65 0x6E 0x2E // '"frozen.' 0x22 // '"' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_36= ktpcHowToActors36 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_36, __HELP_NAME("CO 3) Click arrows until")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_36, __HELP_NAME("CO 3) Click arrows until")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTActors36 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_35=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_36, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToActors36" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors36" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_35=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_36, 0x0) BYTE 0x01 0x00 0x03 0x03 0xF5 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_35=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_35, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x93 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x51 0x00 0x00 0x82 // '????Q??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_35=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_35, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x46 0x6F 0x72 0x77 // 'the Forw' 0x61 0x72 0x64 0x20 0x6F 0x72 0x20 0x42 // 'ard or B' 0x61 0x63 0x6B 0x20 0x41 0x72 0x72 0x6F // 'ack Arro' 0x77 0x20 0x75 0x6E 0x74 0x69 0x6C 0x20 // 'w until ' 0x74 0x68 0x65 0x20 0x6F 0x74 0x68 0x65 // 'the othe' 0x72 0x20 0x33 0x44 0x20 0x6F 0x62 0x6A // 'r 3D obj' 0x65 0x63 0x74 0x20 0x69 0x73 0x20 0x77 // 'ect is w' 0x68 0x65 0x72 0x65 0x20 0x79 0x6F 0x75 // 'here you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x69 0x74 // ' want it' 0x2E 0x0D 0x0A 0x54 0x6F 0x20 0x63 0x68 // '.??To ch' 0x65 0x63 0x6B 0x20 0x79 0x6F 0x75 0x72 // 'eck your' 0x20 0x63 0x68 0x61 0x6E 0x67 0x65 0x73 // ' changes' 0x2C 0x20 0x72 0x65 0x77 0x69 0x6E 0x64 // ', rewind' 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F 0x76 // ' the mov' 0x69 0x65 0x20 0x61 0x6E 0x64 0x20 0x63 // 'ie and c' 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 // 'lick the' 0x20 0x50 0x6C 0x61 0x79 0x20 0x62 0x75 // ' Play bu' 0x74 0x74 0x6F 0x6E 0x2E // 'tton.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_37= ktpcHowToActors37 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_37, __HELP_NAME("Meet up--What Next?")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_37, __HELP_NAME("Meet up--What Next?")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTActors37 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_37, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToActors37" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors37" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_37, 0x0) BYTE 0x01 0x00 0x03 0x03 0xF5 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_F=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3A, 0x0) AG(4) FREE ITEM LONG 0xC0000002 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToActors78 __HELP_SYMBOL( STN "ktpcHowToActors78" ) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToActors81 __HELP_SYMBOL( STN "ktpcHowToActors81" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_3A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0F 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x22 0x00 0x00 0x01 // '????"???' 0x00 0x00 0x00 0x00 0x24 0x00 0x00 0x01 // '????$???' 0x01 0x00 0x00 0x00 0x40 0x00 0x00 0x01 // '????@???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x22 0x00 0x00 0x03 // '???"???' 0x00 0x00 0x00 0x00 0x24 0x00 0x00 0x40 // '????$??@' 0x04 0x00 0x00 0x00 0x2A 0x00 0x00 0x40 // '????*??@' 0x00 0x00 0x00 0x00 0x2C 0x00 0x00 0x40 // '????,??@' 0x05 0x00 0x00 0x00 0x40 0x00 0x00 0x40 // '????@??@' 0x00 0x00 0x00 0x00 0x24 0x00 0x00 0x80 // '????$??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x24 0x00 0x00 0x82 // '????$??' 0x00 0x00 0x00 0x00 0x24 0x00 0x00 0xC0 // '????$??' 0x02 0x00 0x00 0x00 0x2C 0x00 0x00 0xC0 // '????,??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3A, 0x0) BYTE 0x03 0x03 0x4D 0x61 0x6B 0x69 0x6E 0x67 // '??Making' 0x20 0x74 0x77 0x6F 0x20 0x61 0x63 0x74 // ' two act' 0x6F 0x72 0x73 0x20 0x6D 0x65 0x65 0x74 // 'ors meet' 0x2D 0x2D 0x57 0x68 0x61 0x74 0x20 0x6E // '--What n' 0x65 0x78 0x74 0x3F 0x0D 0x0A 0x01 0x20 // 'ext???? ' 0x55 0x6E 0x64 0x6F 0x0D 0x0A 0x01 0x20 // 'Undo??? ' 0x50 0x6C 0x61 0x79 0x69 0x6E 0x67 0x20 // 'Playing ' 0x59 0x6F 0x75 0x72 0x20 0x4D 0x6F 0x76 // 'Your Mov' 0x69 0x65 // 'ie' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_38= ktpcHowToActors38 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_38, __HELP_NAME("CO 1) To copy path")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_38, __HELP_NAME("CO 1) To copy path")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidCutCopyPaste kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTActors38 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_38, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToActors38" ITEM "kgobHowtoSequence" ITEM "kidCutCopyPaste" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors38" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_38, 0x0) BYTE 0x01 0x00 0x03 0x03 0xFA 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1B=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2A, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' FREE ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToActors93 __HELP_SYMBOL( STN "ktpcHowToActors93" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_2A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x11 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xC4 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x52 0x00 0x00 0x03 // '???R???' 0x00 0x00 0x00 0x00 0x54 0x00 0x00 0x03 // '????T???' 0x0F 0x00 0x00 0xFD 0xAB 0x00 0x00 0x03 // '??????' 0x0A 0x00 0x00 0xFD 0xC3 0x00 0x00 0x03 // '??????' 0x0F 0x00 0x00 0xFD 0xC4 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x56 0x00 0x00 0x04 // '????V???' 0x0D 0x00 0x00 0xFE 0x65 0x00 0x00 0x04 // '???e???' 0x00 0x00 0x00 0x00 0x56 0x00 0x00 0x40 // '????V??@' 0x03 0x00 0x00 0x00 0x65 0x00 0x00 0x40 // '????e??@' 0x00 0x00 0x00 0x00 0x54 0x00 0x00 0x80 // '????T??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x9F 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2A, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x63 0x6F 0x70 // '??To cop' 0x79 0x20 0x74 0x68 0x65 0x20 0x70 0x61 // 'y the pa' 0x74 0x68 0x20 0x6F 0x66 0x20 0x61 0x6E // 'th of an' 0x20 0x61 0x63 0x74 0x6F 0x72 0x2C 0x20 // ' actor, ' 0x70 0x72 0x6F 0x70 0x2C 0x20 0x6F 0x72 // 'prop, or' 0x20 0x33 0x44 0x20 0x77 0x6F 0x72 0x64 // ' 3D word' 0x20 0x61 0x6E 0x64 0x20 0x70 0x61 0x73 // ' and pas' 0x74 0x65 0x20 0x69 0x74 0x20 0x6F 0x6E // 'te it on' 0x74 0x6F 0x20 0x61 0x6E 0x6F 0x74 0x68 // 'to anoth' 0x65 0x72 0x20 0x33 0x44 0x20 0x6F 0x62 // 'er 3D ob' 0x6A 0x65 0x63 0x74 0x0D 0x0A 0x31 0x09 // 'ject??1?' 0x47 0x6F 0x20 0x74 0x6F 0x20 0x74 0x68 // 'Go to th' 0x65 0x20 0x70 0x6C 0x61 0x63 0x65 0x20 // 'e place ' 0x69 0x6E 0x20 0x79 0x6F 0x75 0x72 0x20 // 'in your ' 0x6D 0x6F 0x76 0x69 0x65 0x20 0x77 0x68 // 'movie wh' 0x65 0x72 0x65 0x20 0x79 0x6F 0x75 0x20 // 'ere you ' 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 // 'want to ' 0x62 0x65 0x67 0x69 0x6E 0x20 0x63 0x6F // 'begin co' 0x70 0x79 0x69 0x6E 0x67 0x20 0x74 0x68 // 'pying th' 0x65 0x20 0x70 0x61 0x74 0x68 0x2E 0x0D // 'e path.?' 0x0A 0x32 0x09 0x43 0x6C 0x69 0x63 0x6B // '?2?Click' 0x20 0x74 0x68 0x65 0x20 0x43 0x75 0x74 // ' the Cut' 0x2C 0x20 0x43 0x6F 0x70 0x79 0x2C 0x20 // ', Copy, ' 0x26 0x20 0x50 0x61 0x73 0x74 0x65 0x20 // '& Paste ' 0x54 0x6F 0x6F 0x6C 0x73 0x2E // 'Tools.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_39= ktpcHowToActors39 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_39, __HELP_NAME("CO 2) Click Copy Path")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_39, __HELP_NAME("CO 2) Click Copy Path")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidCCPCopyRoute kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTActors39 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_7B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_39, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToActors39" ITEM "kgobHowtoSequence" ITEM "kidCCPCopyRoute" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors39" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_7B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_39, 0x0) BYTE 0x01 0x00 0x03 0x03 0x64 0x00 0x00 0x00 // '????d???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_7B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x10 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0F 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x10 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_7B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7B, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x43 0x6F 0x70 0x79 0x20 0x50 0x61 0x74 // 'Copy Pat' 0x68 0x2E // 'h.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3A= ktpcHowToActors3A #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3A, __HELP_NAME("CO 3) Click actor copy path")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3A, __HELP_NAME("CO 3) Click actor copy path")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTActors3A ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_0=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3A, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToActors3A" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors3A" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_0=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x93 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_0=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x3E 0x00 0x00 0x01 // '????>???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x3E 0x00 0x00 0x03 // '???>???' 0x00 0x00 0x00 0x00 0x3E 0x00 0x00 0x40 // '????>??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_0=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x6F // 'the acto' 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 0x2C // 'r, prop,' 0x20 0x6F 0x72 0x20 0x33 0x44 0x20 0x77 // ' or 3D w' 0x6F 0x72 0x64 0x20 0x77 0x68 0x6F 0x73 // 'ord whos' 0x65 0x20 0x70 0x61 0x74 0x68 0x20 0x79 // 'e path y' 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 // 'ou want ' 0x74 0x6F 0x20 0x63 0x6F 0x70 0x79 0x2E // 'to copy.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3B= ktpcHowToActors3B #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3B, __HELP_NAME("CO 4) Click Cut, Copy, Paste")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3B, __HELP_NAME("CO 4) Click Cut, Copy, Paste")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidCutCopyPaste kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTActors3B ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3B, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToActors3B" ITEM "kgobHowtoSequence" ITEM "kidCutCopyPaste" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors3B" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3B, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE1 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_44=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4F, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToActors93 __HELP_SYMBOL( STN "ktpcHowToActors93" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_4F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0F 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x72 0x00 0x00 0x01 // '????r???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x08 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x59 0x00 0x00 0x03 // '???Y???' 0x0A 0x00 0x00 0xFD 0x71 0x00 0x00 0x03 // '???q???' 0x0F 0x00 0x00 0xFD 0x72 0x00 0x00 0x03 // '???r???' 0x00 0x00 0x00 0x00 0x0C 0x00 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x1B 0x00 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x0C 0x00 0x00 0x40 // '???????@' 0x02 0x00 0x00 0x00 0x1B 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x72 0x00 0x00 0x40 // '????r??@' 0x00 0x00 0x00 0x00 0x0A 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x4D 0x00 0x00 0x82 // '????M??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4F, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x70 0x61 0x73 // '??To pas' 0x74 0x65 0x0D 0x0A 0x31 0x09 0x47 0x6F // 'te??1?Go' 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 // ' to the ' 0x70 0x6C 0x61 0x63 0x65 0x20 0x69 0x6E // 'place in' 0x20 0x79 0x6F 0x75 0x72 0x20 0x6D 0x6F // ' your mo' 0x76 0x69 0x65 0x20 0x77 0x68 0x65 0x72 // 'vie wher' 0x65 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 // 'e you wa' 0x6E 0x74 0x20 0x74 0x6F 0x20 0x70 0x61 // 'nt to pa' 0x73 0x74 0x65 0x20 0x74 0x68 0x65 0x20 // 'ste the ' 0x70 0x61 0x74 0x68 0x2E 0x0D 0x0A 0x32 // 'path.??2' 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 0x74 // '?Click t' 0x68 0x65 0x20 0x43 0x75 0x74 0x2C 0x20 // 'he Cut, ' 0x43 0x6F 0x70 0x79 0x2C 0x20 0x26 0x20 // 'Copy, & ' 0x50 0x61 0x73 0x74 0x65 0x20 0x54 0x6F // 'Paste To' 0x6F 0x6C 0x73 0x2E // 'ols.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3C= ktpcHowToActors3C #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3C, __HELP_NAME("CO 5) Click Paste")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3C, __HELP_NAME("CO 5) Click Paste")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidCCPPaste kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTActors3C ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3C, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToActors3C" ITEM "kgobHowtoSequence" ITEM "kidCCPPaste" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors3C" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x46 0x00 0x00 0x00 // '????F???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_3B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0C 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x06 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x0B 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x0C 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x0C 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3B, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x50 0x61 0x73 0x74 0x65 0x2E // 'Paste.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3D= ktpcHowToActors3D #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3D, __HELP_NAME("CO 6) Apply paste")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3D, __HELP_NAME("CO 6) Apply paste")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTActors3D ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3D, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToActors3D" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors3D" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3D, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC9 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x40 0x00 0x00 0x01 // '????@???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x40 0x00 0x00 0x03 // '???@???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x6F // 'the acto' 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 0x2C // 'r, prop,' 0x20 0x6F 0x72 0x20 0x33 0x44 0x20 0x77 // ' or 3D w' 0x6F 0x72 0x64 0x20 0x79 0x6F 0x75 0x20 // 'ord you ' 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 // 'want to ' 0x61 0x70 0x70 0x6C 0x79 0x20 0x74 0x68 // 'apply th' 0x65 0x20 0x70 0x61 0x74 0x68 0x20 0x74 // 'e path t' 0x6F 0x2E // 'o.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3E= ktpcHowToActors3E #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3E, __HELP_NAME("Copy Path--What Next?")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3E, __HELP_NAME("Copy Path--What Next?")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTActors3E ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_14=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3E, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToActors3E" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors3E" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_14=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3E, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE2 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2A=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_14, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToActors78 __HELP_SYMBOL( STN "ktpcHowToActors78" ) FREE ITEM LONG 0xC0000002 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToActors89 __HELP_SYMBOL( STN "ktpcHowToActors89" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_14=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_14, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0F 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1A 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x1C 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x39 0x00 0x00 0x01 // '????9???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x1A 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x1C 0x00 0x00 0x40 // '???????@' 0x01 0x00 0x00 0x00 0x22 0x00 0x00 0x40 // '????"??@' 0x00 0x00 0x00 0x00 0x24 0x00 0x00 0x40 // '????$??@' 0x04 0x00 0x00 0x00 0x39 0x00 0x00 0x40 // '????9??@' 0x00 0x00 0x00 0x00 0x1C 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x1C 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x1C 0x00 0x00 0xC0 // '???????' 0x03 0x00 0x00 0x00 0x24 0x00 0x00 0xC0 // '????$??' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_14=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_14, 0x0) BYTE 0x03 0x03 0x43 0x6F 0x70 0x79 0x69 0x6E // '??Copyin' 0x67 0x20 0x61 0x20 0x70 0x61 0x74 0x68 // 'g a path' 0x2D 0x2D 0x57 0x68 0x61 0x74 0x20 0x6E // '--What n' 0x65 0x78 0x74 0x3F 0x0D 0x0A 0x01 0x20 // 'ext???? ' 0x55 0x6E 0x64 0x6F 0x0D 0x0A 0x01 0x20 // 'Undo??? ' 0x43 0x68 0x61 0x6E 0x67 0x69 0x6E 0x67 // 'Changing' 0x20 0x74 0x68 0x65 0x20 0x61 0x63 0x74 // ' the act' 0x69 0x6F 0x6E // 'ion' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3F= ktpcHowToActors3F #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3F, __HELP_NAME("CO 1) To copy and paste")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3F, __HELP_NAME("CO 1) To copy and paste")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidCutCopyPaste kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTActors3F ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_45=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3F, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToActors3F" ITEM "kgobHowtoSequence" ITEM "kidCutCopyPaste" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors3F" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_45=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x0E 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_42=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_45, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToActors93 __HELP_SYMBOL( STN "ktpcHowToActors93" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_45=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_45, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x15 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x98 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x2C 0x00 0x00 0x03 // '???,???' 0x00 0x00 0x00 0x00 0x2E 0x00 0x00 0x03 // '????.???' 0x0F 0x00 0x00 0xFD 0x71 0x00 0x00 0x03 // '???q???' 0x00 0x00 0x00 0x00 0x7F 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x97 0x00 0x00 0x03 // '??????' 0x0F 0x00 0x00 0xFD 0x98 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x30 0x00 0x00 0x04 // '????0???' 0x0D 0x00 0x00 0xFE 0x3F 0x00 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x30 0x00 0x00 0x40 // '????0??@' 0x03 0x00 0x00 0x00 0x3F 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x76 0x00 0x00 0x40 // '????v??@' 0x00 0x00 0x00 0x00 0x7F 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x2E 0x00 0x00 0x80 // '????.??' 0x00 0x00 0x02 0x00 0x73 0x00 0x00 0x80 // '????s??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x73 0x00 0x00 0x82 // '????s??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_45=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_45, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x63 0x6F 0x70 // '??To cop' 0x79 0x20 0x61 0x6E 0x64 0x20 0x70 0x61 // 'y and pa' 0x73 0x74 0x65 0x20 0x61 0x6E 0x20 0x61 // 'ste an a' 0x63 0x74 0x6F 0x72 0x2C 0x20 0x70 0x72 // 'ctor, pr' 0x6F 0x70 0x2C 0x20 0x6F 0x72 0x20 0x33 // 'op, or 3' 0x44 0x20 0x77 0x6F 0x72 0x64 0x0D 0x0A // 'D word??' 0x31 0x09 0x47 0x6F 0x20 0x74 0x6F 0x20 // '1?Go to ' 0x74 0x68 0x65 0x20 0x70 0x6C 0x61 0x63 // 'the plac' 0x65 0x20 0x69 0x6E 0x20 0x79 0x6F 0x75 // 'e in you' 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 0x20 // 'r movie ' 0x77 0x68 0x65 0x72 0x65 0x20 0x79 0x6F // 'where yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 // 'u want t' 0x6F 0x20 0x63 0x6F 0x70 0x79 0x20 0x61 // 'o copy a' 0x20 0x33 0x44 0x20 0x6F 0x62 0x6A 0x65 // ' 3D obje' 0x63 0x74 0x2E 0x0D 0x0A 0x32 0x09 0x43 // 'ct.??2?C' 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 // 'lick the' 0x20 0x43 0x75 0x74 0x2C 0x20 0x43 0x6F // ' Cut, Co' 0x70 0x79 0x2C 0x20 0x26 0x20 0x50 0x61 // 'py, & Pa' 0x73 0x74 0x65 0x20 0x54 0x6F 0x6F 0x6C // 'ste Tool' 0x73 0x2E // 's.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_40= ktpcHowToActors40 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_40, __HELP_NAME("CO 2) Click Copy ")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_40, __HELP_NAME("CO 2) Click Copy ")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidCCPCopy kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTActors40 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_42=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_40, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToActors40" ITEM "kgobHowtoSequence" ITEM "kidCCPCopy" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors40" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_42=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_40, 0x0) BYTE 0x01 0x00 0x03 0x03 0x43 0x00 0x00 0x00 // '????C???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_42=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_42, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x06 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0B 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0A 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x0B 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_42=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_42, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x43 0x6F 0x70 0x79 0x2E // 'Copy.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_41= ktpcHowToActors41 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_41, __HELP_NAME("CO 3) Click actor copy")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_41, __HELP_NAME("CO 3) Click actor copy")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTActors41 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_41=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_41, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToActors41" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors41" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_41=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_41, 0x0) BYTE 0x01 0x00 0x03 0x03 0x9D 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_41=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_41, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x33 0x00 0x00 0x01 // '????3???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x33 0x00 0x00 0x03 // '???3???' 0x00 0x00 0x00 0x00 0x33 0x00 0x00 0x40 // '????3??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_41=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_41, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x6F // 'the acto' 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 0x2C // 'r, prop,' 0x20 0x6F 0x72 0x20 0x33 0x44 0x20 0x77 // ' or 3D w' 0x6F 0x72 0x64 0x20 0x79 0x6F 0x75 0x20 // 'ord you ' 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 // 'want to ' 0x63 0x6F 0x70 0x79 0x2E // 'copy.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_42= ktpcHowToActors42 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_42, __HELP_NAME("CO 4) To paste")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_42, __HELP_NAME("CO 4) To paste")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidCutCopyPaste kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTActors42 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_32=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_42, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToActors42" ITEM "kgobHowtoSequence" ITEM "kidCutCopyPaste" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors42" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_32=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_42, 0x0) BYTE 0x01 0x00 0x03 0x03 0x06 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_25=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_32, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToActors93 __HELP_SYMBOL( STN "ktpcHowToActors93" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_32=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_32, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x13 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x78 0x00 0x00 0x01 // '????x???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x09 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x0B 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x53 0x00 0x00 0x03 // '???S???' 0x00 0x00 0x00 0x00 0x5F 0x00 0x00 0x03 // '????_???' 0x0A 0x00 0x00 0xFD 0x77 0x00 0x00 0x03 // '???w???' 0x0F 0x00 0x00 0xFD 0x78 0x00 0x00 0x03 // '???x???' 0x00 0x00 0x00 0x00 0x0D 0x00 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x1C 0x00 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x0D 0x00 0x00 0x40 // '???????@' 0x03 0x00 0x00 0x00 0x1C 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x5F 0x00 0x00 0x40 // '????_??@' 0x00 0x00 0x00 0x00 0x0B 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x53 0x00 0x00 0x82 // '????S??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_32=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_32, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x20 0x70 0x61 // '??To pa' 0x73 0x74 0x65 0x0D 0x0A 0x31 0x09 0x47 // 'ste??1?G' 0x6F 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 // 'o to the' 0x20 0x70 0x6C 0x61 0x63 0x65 0x20 0x69 // ' place i' 0x6E 0x20 0x79 0x6F 0x75 0x72 0x20 0x6D // 'n your m' 0x6F 0x76 0x69 0x65 0x20 0x77 0x68 0x65 // 'ovie whe' 0x72 0x65 0x20 0x79 0x6F 0x75 0x20 0x77 // 're you w' 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 0x70 // 'ant to p' 0x61 0x73 0x74 0x65 0x20 0x74 0x68 0x65 // 'aste the' 0x20 0x33 0x44 0x20 0x6F 0x62 0x6A 0x65 // ' 3D obje' 0x63 0x74 0x2E 0x0D 0x0A 0x32 0x09 0x43 // 'ct.??2?C' 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 // 'lick the' 0x20 0x43 0x75 0x74 0x2C 0x20 0x43 0x6F // ' Cut, Co' 0x70 0x79 0x2C 0x20 0x26 0x20 0x50 0x61 // 'py, & Pa' 0x73 0x74 0x65 0x20 0x54 0x6F 0x6F 0x6C // 'ste Tool' 0x73 0x2E // 's.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_43= ktpcHowToActors43 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_43, __HELP_NAME("CO 5) To paste")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_43, __HELP_NAME("CO 5) To paste")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidCCPPaste kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTActors43 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_39=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_43, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToActors43" ITEM "kgobHowtoSequence" ITEM "kidCCPPaste" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors43" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_39=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_43, 0x0) BYTE 0x01 0x00 0x03 0x03 0x4B 0x00 0x00 0x00 // '????K???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_39=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_39, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x06 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x07 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0D 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x07 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0D 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x07 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_39=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_39, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x20 0x50 0x61 0x73 0x74 0x65 0x2E // ' Paste.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_44= ktpcHowToActors44 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_44, __HELP_NAME("CO 6) Click where paste")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_44, __HELP_NAME("CO 6) Click where paste")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTActors44 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_83=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_44, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToActors44" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors44" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_83=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_44, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD0 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_83=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_83, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x9E 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x3C 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x2F 0x00 0x00 0x40 // '????/??@' 0x03 0x00 0x00 0x00 0x3E 0x00 0x00 0x40 // '????>??@' 0x00 0x00 0x00 0x00 0x7D 0x00 0x00 0x40 // '????}??@' 0x00 0x00 0x00 0x00 0x2D 0x00 0x00 0x80 // '????-??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x71 0x00 0x00 0x82 // '????q??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_33=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_33, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x63 0x75 0x74 // '??To cut' 0x20 0x61 0x6E 0x64 0x20 0x70 0x61 0x73 // ' and pas' 0x74 0x65 0x20 0x61 0x6E 0x20 0x61 0x63 // 'te an ac' 0x74 0x6F 0x72 0x2C 0x20 0x70 0x72 0x6F // 'tor, pro' 0x70 0x2C 0x20 0x6F 0x72 0x20 0x33 0x44 // 'p, or 3D' 0x20 0x77 0x6F 0x72 0x64 0x0D 0x0A 0x31 // ' word??1' 0x09 0x47 0x6F 0x20 0x74 0x6F 0x20 0x74 // '?Go to t' 0x68 0x65 0x20 0x70 0x6C 0x61 0x63 0x65 // 'he place' 0x20 0x69 0x6E 0x20 0x79 0x6F 0x75 0x72 // ' in your' 0x20 0x6D 0x6F 0x76 0x69 0x65 0x20 0x77 // ' movie w' 0x68 0x65 0x72 0x65 0x20 0x79 0x6F 0x75 // 'here you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F // ' want to' 0x20 0x63 0x75 0x74 0x20 0x61 0x20 0x33 // ' cut a 3' 0x44 0x20 0x6F 0x62 0x6A 0x65 0x63 0x74 // 'D object' 0x2E 0x0D 0x0A 0x32 0x09 0x43 0x6C 0x69 // '.??2?Cli' 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 0x43 // 'ck the C' 0x75 0x74 0x2C 0x20 0x43 0x6F 0x70 0x79 // 'ut, Copy' 0x2C 0x20 0x26 0x20 0x50 0x61 0x73 0x74 // ', & Past' 0x65 0x20 0x54 0x6F 0x6F 0x6C 0x73 0x2E // 'e Tools.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_47= ktpcHowToActors47 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_47, __HELP_NAME("CO 2) Click Cut")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_47, __HELP_NAME("CO 2) Click Cut")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidCCPCut kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTActors47 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_48=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_47, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToActors47" ITEM "kgobHowtoSequence" ITEM "kidCCPCut" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors47" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_48=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_47, 0x0) BYTE 0x01 0x00 0x03 0x03 0x3B 0x00 0x00 0x00 // '????;???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_48=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_48, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0A 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x09 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x0A 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_48=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_48, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x43 0x75 0x74 0x2E // 'Cut.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_48= ktpcHowToActors48 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_48, __HELP_NAME("CO 3) Click actor cut")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_48, __HELP_NAME("CO 3) Click actor cut")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTActors48 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_43=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_48, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToActors48" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors48" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_43=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_48, 0x0) BYTE 0x01 0x00 0x03 0x03 0x96 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_43=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_43, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x32 0x00 0x00 0x01 // '????2???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x32 0x00 0x00 0x03 // '???2???' 0x00 0x00 0x00 0x00 0x32 0x00 0x00 0x40 // '????2??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_43=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_43, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x6F // 'the acto' 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 0x2C // 'r, prop,' 0x20 0x6F 0x72 0x20 0x33 0x44 0x20 0x77 // ' or 3D w' 0x6F 0x72 0x64 0x20 0x79 0x6F 0x75 0x20 // 'ord you ' 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 // 'want to ' 0x63 0x75 0x74 0x2E // 'cut.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_49= ktpcHowToActors49 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_49, __HELP_NAME("CO 4) To paste 2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_49, __HELP_NAME("CO 4) To paste 2")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidCutCopyPaste kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTActors49 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_46=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_49, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToActors49" ITEM "kgobHowtoSequence" ITEM "kidCutCopyPaste" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors49" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_46=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_49, 0x0) BYTE 0x01 0x00 0x03 0x03 0x00 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2D=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_46, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToActors93 __HELP_SYMBOL( STN "ktpcHowToActors93" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_46=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_46, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x12 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x78 0x00 0x00 0x01 // '????x???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x09 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x0B 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x56 0x00 0x00 0x03 // '???V???' 0x00 0x00 0x00 0x00 0x5F 0x00 0x00 0x03 // '????_???' 0x0A 0x00 0x00 0xFD 0x77 0x00 0x00 0x03 // '???w???' 0x0F 0x00 0x00 0xFD 0x78 0x00 0x00 0x03 // '???x???' 0x00 0x00 0x00 0x00 0x0D 0x00 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x1C 0x00 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x0D 0x00 0x00 0x40 // '???????@' 0x03 0x00 0x00 0x00 0x1C 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x0B 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x53 0x00 0x00 0x82 // '????S??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_46=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_46, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x20 0x70 0x61 // '??To pa' 0x73 0x74 0x65 0x0D 0x0A 0x31 0x09 0x47 // 'ste??1?G' 0x6F 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 // 'o to the' 0x20 0x70 0x6C 0x61 0x63 0x65 0x20 0x69 // ' place i' 0x6E 0x20 0x79 0x6F 0x75 0x72 0x20 0x6D // 'n your m' 0x6F 0x76 0x69 0x65 0x20 0x77 0x68 0x65 // 'ovie whe' 0x72 0x65 0x20 0x79 0x6F 0x75 0x20 0x77 // 're you w' 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 0x70 // 'ant to p' 0x61 0x73 0x74 0x65 0x20 0x74 0x68 0x65 // 'aste the' 0x20 0x33 0x44 0x20 0x6F 0x62 0x6A 0x65 // ' 3D obje' 0x63 0x74 0x2E 0x0D 0x0A 0x32 0x09 0x43 // 'ct.??2?C' 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 // 'lick the' 0x20 0x43 0x75 0x74 0x2C 0x20 0x43 0x6F // ' Cut, Co' 0x70 0x79 0x2C 0x20 0x26 0x20 0x50 0x61 // 'py, & Pa' 0x73 0x74 0x65 0x20 0x54 0x6F 0x6F 0x6C // 'ste Tool' 0x73 0x2E // 's.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_4A= ktpcHowToActors4A #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4A, __HELP_NAME("CO 5) To paste 2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4A, __HELP_NAME("CO 5) To paste 2")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidCCPPaste kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTActors4A ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4A, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToActors4A" ITEM "kgobHowtoSequence" ITEM "kidCCPPaste" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors4A" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x4B 0x00 0x00 0x00 // '????K???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_4B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0C 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0B 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x0C 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4B, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x50 0x61 0x73 0x74 0x65 0x2E // 'Paste.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_4B= ktpcHowToActors4B #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4B, __HELP_NAME("CO 6) Click where paste 2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4B, __HELP_NAME("CO 6) Click where paste 2")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTActors4B ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_77=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4B, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToActors4B" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors4B" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_77=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4B, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD2 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_77=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_77, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x9E 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x3C 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x23 0x00 0x00 0x03 // '???#???' 0x00 0x00 0x00 0x00 0x25 0x00 0x00 0x40 // '????%??@' 0x03 0x00 0x00 0x00 0x2B 0x00 0x00 0x40 // '????+??@' 0x00 0x00 0x00 0x00 0x2D 0x00 0x00 0x40 // '????-??@' 0x04 0x00 0x00 0x00 0x3E 0x00 0x00 0x40 // '????>??@' 0x00 0x00 0x00 0x00 0x25 0x00 0x00 0x80 // '????%??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x25 0x00 0x00 0x82 // '????%??' 0x00 0x00 0x00 0x00 0x25 0x00 0x00 0xC0 // '????%??' 0x02 0x00 0x00 0x00 0x2D 0x00 0x00 0xC0 // '????-??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_54=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_54, 0x0) BYTE 0x03 0x03 0x54 0x69 0x70 0x70 0x69 0x6E // '??Tippin' 0x67 0x20 0x66 0x6F 0x72 0x77 0x61 0x72 // 'g forwar' 0x64 0x20 0x6F 0x72 0x20 0x62 0x61 0x63 // 'd or bac' 0x6B 0x2D 0x2D 0x57 0x68 0x61 0x74 0x20 // 'k--What ' 0x6E 0x65 0x78 0x74 0x3F 0x0D 0x0A 0x01 // 'next????' 0x20 0x55 0x6E 0x64 0x6F 0x0D 0x0A 0x01 // ' Undo???' 0x20 0x50 0x6C 0x61 0x79 0x20 0x79 0x6F // ' Play yo' 0x75 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 // 'ur movie' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_55= ktpcHowToActors55 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_55, __HELP_NAME("CO 1) To turn left or right")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_55, __HELP_NAME("CO 1) To turn left or right")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence kidActorsRotate kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTActors55 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_59=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_55, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcHowToActors55" ITEM "kgobHowtoSequence" ITEM "kidActorsRotate" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors55" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_59=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_55, 0x0) BYTE 0x01 0x00 0x03 0x03 0x1C 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_3A=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_59, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToActors93 __HELP_SYMBOL( STN "ktpcHowToActors93" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_59=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_59, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x13 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x90 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x30 0x00 0x00 0x03 // '???0???' 0x00 0x00 0x00 0x00 0x32 0x00 0x00 0x03 // '????2???' 0x0F 0x00 0x00 0xFD 0x79 0x00 0x00 0x03 // '???y???' 0x00 0x00 0x00 0x00 0x83 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x8F 0x00 0x00 0x03 // '??????' 0x0F 0x00 0x00 0xFD 0x90 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x34 0x00 0x00 0x04 // '????4???' 0x0D 0x00 0x00 0xFE 0x43 0x00 0x00 0x04 // '???C???' 0x00 0x00 0x00 0x00 0x34 0x00 0x00 0x40 // '????4??@' 0x03 0x00 0x00 0x00 0x43 0x00 0x00 0x40 // '????C??@' 0x00 0x00 0x00 0x00 0x90 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x32 0x00 0x00 0x80 // '????2??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x77 0x00 0x00 0x82 // '????w??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_59=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_59, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x74 0x75 0x72 // '??To tur' 0x6E 0x20 0x61 0x6E 0x20 0x61 0x63 0x74 // 'n an act' 0x6F 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 // 'or, prop' 0x2C 0x20 0x6F 0x72 0x20 0x33 0x44 0x20 // ', or 3D ' 0x77 0x6F 0x72 0x64 0x20 0x6C 0x65 0x66 // 'word lef' 0x74 0x20 0x6F 0x72 0x20 0x72 0x69 0x67 // 't or rig' 0x68 0x74 0x0D 0x0A 0x31 0x09 0x47 0x6F // 'ht??1?Go' 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 // ' to the ' 0x70 0x6C 0x61 0x63 0x65 0x20 0x69 0x6E // 'place in' 0x20 0x79 0x6F 0x75 0x72 0x20 0x6D 0x6F // ' your mo' 0x76 0x69 0x65 0x20 0x77 0x68 0x65 0x72 // 'vie wher' 0x65 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 // 'e you wa' 0x6E 0x74 0x20 0x74 0x6F 0x20 0x74 0x75 // 'nt to tu' 0x72 0x6E 0x20 0x61 0x20 0x33 0x44 0x20 // 'rn a 3D ' 0x6F 0x62 0x6A 0x65 0x63 0x74 0x2E 0x0D // 'object.?' 0x0A 0x32 0x09 0x43 0x6C 0x69 0x63 0x6B // '?2?Click' 0x20 0x74 0x68 0x65 0x20 0x52 0x6F 0x74 // ' the Rot' 0x61 0x74 0x65 0x20 0x54 0x6F 0x6F 0x6C // 'ate Tool' 0x73 0x2E // 's.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_56= ktpcHowToActors56 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_56, __HELP_NAME("CO 2) Click Turn Left Right")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_56, __HELP_NAME("CO 2) Click Turn Left Right")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon8 kgobHowtoSequence kidActorsRotateY kidPlayHelpSounds 0x0 0x2 0x57415645 kwavHTActors56 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_29=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_56, 0x0) GST(0) ITEM "kgobCalloutBalloon8" ITEM "ktpcHowToActors56" ITEM "kgobHowtoSequence" ITEM "kidActorsRotateY" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors56" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_29=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_56, 0x0) BYTE 0x01 0x00 0x03 0x03 0x94 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_29=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_29, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x05 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x19 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x18 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x19 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_29=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_29, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x54 0x75 0x72 0x6E 0x20 0x4C 0x65 0x66 // 'Turn Lef' 0x74 0x20 0x6F 0x72 0x20 0x52 0x69 0x67 // 't or Rig' 0x68 0x74 0x2E // 'ht.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_57= ktpcHowToActors57 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_57, __HELP_NAME("CO 3) Drag until 2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_57, __HELP_NAME("CO 3) Drag until 2")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTActors57 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_57, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToActors57" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors57" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_57, 0x0) BYTE 0x01 0x00 0x03 0x03 0xED 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_A=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3F, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToActors94 __HELP_SYMBOL( STN "ktpcHowToActors94" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_3F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x91 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x4B 0x00 0x00 0x04 // '????K???' 0x0D 0x00 0x00 0xFE 0x4F 0x00 0x00 0x04 // '???O???' 0x00 0x00 0x00 0x00 0x4B 0x00 0x00 0x40 // '????K??@' 0x01 0x00 0x00 0x00 0x4F 0x00 0x00 0x40 // '????O??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x4B 0x00 0x00 0x82 // '????K??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3F, 0x0) BYTE 0x03 0x03 0x4D 0x6F 0x76 0x65 0x20 0x74 // '??Move t' 0x68 0x65 0x20 0x6D 0x6F 0x75 0x73 0x65 // 'he mouse' 0x20 0x63 0x75 0x72 0x73 0x6F 0x72 0x20 // ' cursor ' 0x6F 0x76 0x65 0x72 0x20 0x74 0x68 0x65 // 'over the' 0x20 0x61 0x63 0x74 0x6F 0x72 0x2C 0x20 // ' actor, ' 0x70 0x72 0x6F 0x70 0x2C 0x20 0x6F 0x72 // 'prop, or' 0x20 0x33 0x44 0x20 0x77 0x6F 0x72 0x64 // ' 3D word' 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E // ' you wan' 0x74 0x20 0x74 0x6F 0x20 0x74 0x75 0x72 // 't to tur' 0x6E 0x2E 0x20 0x0D 0x0A 0x44 0x72 0x61 // 'n. ??Dra' 0x67 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F // 'g the mo' 0x75 0x73 0x65 0x20 0x75 0x6E 0x74 0x69 // 'use unti' 0x6C 0x20 0x74 0x68 0x65 0x20 0x61 0x63 // 'l the ac' 0x74 0x6F 0x72 0x2C 0x20 0x70 0x72 0x6F // 'tor, pro' 0x70 0x2C 0x20 0x6F 0x72 0x20 0x33 0x44 // 'p, or 3D' 0x20 0x77 0x6F 0x72 0x64 0x20 0x69 0x73 // ' word is' 0x20 0x77 0x68 0x65 0x72 0x65 0x20 0x79 // ' where y' 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 // 'ou want ' 0x69 0x74 0x2E // 'it.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_58= ktpcHowToActors58 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_58, __HELP_NAME("Turn Left Right--What Next?")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_58, __HELP_NAME("Turn Left Right--What Next?")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTActors58 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_34=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_58, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToActors58" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors58" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_34=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_58, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_20=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_34, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToActors81 __HELP_SYMBOL( STN "ktpcHowToActors81" ) ITEM LONG 0xC0000002 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) FREE FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToActors78 __HELP_SYMBOL( STN "ktpcHowToActors78" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_34=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_34, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0F 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x21 0x00 0x00 0x01 // '????!???' 0x00 0x00 0x00 0x00 0x23 0x00 0x00 0x01 // '????#???' 0x01 0x00 0x00 0x00 0x3C 0x00 0x00 0x01 // '???????' 0x0F 0x00 0x00 0xFD 0xC9 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0xCB 0x00 0x00 0x40 // '??????@' 0x03 0x00 0x00 0x00 0xD1 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xCB 0x00 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xCB 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0xCB 0x00 0x00 0xC0 // '??????' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_8F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8F, 0x0) BYTE 0x03 0x03 0x53 0x65 0x6C 0x65 0x63 0x74 // '??Select' 0x69 0x6E 0x67 0x20 0x61 0x6E 0x20 0x61 // 'ing an a' 0x63 0x74 0x6F 0x72 0x20 0x62 0x65 0x68 // 'ctor beh' 0x69 0x6E 0x64 0x20 0x61 0x6E 0x6F 0x74 // 'ind anot' 0x68 0x65 0x72 0x20 0x6F 0x72 0x20 0x6F // 'her or o' 0x75 0x74 0x20 0x6F 0x66 0x20 0x76 0x69 // 'ut of vi' 0x65 0x77 0x2D 0x2D 0x57 0x68 0x61 0x74 // 'ew--What' 0x20 0x4E 0x65 0x78 0x74 0x3F 0x0D 0x0A // ' Next???' 0x49 0x66 0x20 0x74 0x68 0x65 0x20 0x61 // 'If the a' 0x63 0x74 0x6F 0x72 0x20 0x77 0x61 0x73 // 'ctor was' 0x20 0x6F 0x75 0x74 0x20 0x6F 0x66 0x20 // ' out of ' 0x76 0x69 0x65 0x77 0x2C 0x20 0x74 0x68 // 'view, th' 0x65 0x20 0x61 0x63 0x74 0x6F 0x72 0x20 // 'e actor ' 0x72 0x65 0x61 0x70 0x70 0x65 0x61 0x72 // 'reappear' 0x73 0x20 0x6F 0x6E 0x2D 0x73 0x74 0x61 // 's on-sta' 0x67 0x65 0x2E 0x20 0x20 0x4D 0x6F 0x76 // 'ge. Mov' 0x65 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F // 'e the mo' 0x75 0x73 0x65 0x20 0x75 0x6E 0x74 0x69 // 'use unti' 0x6C 0x20 0x79 0x6F 0x75 0x20 0x66 0x69 // 'l you fi' 0x6E 0x64 0x20 0x74 0x68 0x65 0x20 0x70 // 'nd the p' 0x6C 0x61 0x63 0x65 0x20 0x79 0x6F 0x75 // 'lace you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F // ' want to' 0x20 0x70 0x75 0x74 0x20 0x74 0x68 0x65 // ' put the' 0x20 0x61 0x63 0x74 0x6F 0x72 0x2C 0x20 // ' actor, ' 0x74 0x68 0x65 0x6E 0x20 0x63 0x6C 0x69 // 'then cli' 0x63 0x6B 0x2E 0x0D 0x0A 0x01 0x20 0x55 // 'ck.??? U' 0x6E 0x64 0x6F // 'ndo' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_66= ktpcHowToActors66 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_66, __HELP_NAME("CO 1) To select prop")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_66, __HELP_NAME("CO 1) To select prop")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon5 kgobHowtoSequence kidRollCallProp kidPlayHelpSounds 0x24E 0x85 0x57415645 kwavHTActors66 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_26=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_66, 0x0) GST(0) ITEM "kgobCalloutBalloon5" ITEM "ktpcHowToActors66" ITEM "kgobHowtoSequence" ITEM "kidRollCallProp" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors66" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_26=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_66, 0x0) BYTE 0x01 0x00 0x03 0x03 0xFC 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_12=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_26, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToActors93 __HELP_SYMBOL( STN "ktpcHowToActors93" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_26=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_26, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x12 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xB7 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x41 0x00 0x00 0x03 // '???A???' 0x00 0x00 0x00 0x00 0x43 0x00 0x00 0x03 // '????C???' 0x0F 0x00 0x00 0xFD 0x92 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0xAD 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xB6 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x45 0x00 0x00 0x04 // '????E???' 0x0D 0x00 0x00 0xFE 0x54 0x00 0x00 0x04 // '???T???' 0x00 0x00 0x00 0x00 0x45 0x00 0x00 0x40 // '????E??@' 0x03 0x00 0x00 0x00 0x54 0x00 0x00 0x40 // '????T??@' 0x00 0x00 0x00 0x00 0xB7 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x43 0x00 0x00 0x80 // '????C??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x92 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_26=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_26, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x73 0x65 0x6C // '??To sel' 0x65 0x63 0x74 0x20 0x61 0x20 0x70 0x72 // 'ect a pr' 0x6F 0x70 0x20 0x6F 0x72 0x20 0x33 0x44 // 'op or 3D' 0x20 0x77 0x6F 0x72 0x64 0x20 0x74 0x68 // ' word th' 0x61 0x74 0x20 0x69 0x73 0x20 0x62 0x65 // 'at is be' 0x68 0x69 0x6E 0x64 0x20 0x61 0x6E 0x6F // 'hind ano' 0x74 0x68 0x65 0x72 0x20 0x6F 0x72 0x20 // 'ther or ' 0x6F 0x75 0x74 0x20 0x6F 0x66 0x20 0x76 // 'out of v' 0x69 0x65 0x77 0x0D 0x0A 0x31 0x09 0x47 // 'iew??1?G' 0x6F 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 // 'o to the' 0x20 0x70 0x6C 0x61 0x63 0x65 0x20 0x69 // ' place i' 0x6E 0x20 0x79 0x6F 0x75 0x72 0x20 0x6D // 'n your m' 0x6F 0x76 0x69 0x65 0x20 0x77 0x68 0x65 // 'ovie whe' 0x72 0x65 0x20 0x79 0x6F 0x75 0x20 0x77 // 're you w' 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 0x73 // 'ant to s' 0x65 0x6C 0x65 0x63 0x74 0x20 0x74 0x68 // 'elect th' 0x65 0x20 0x70 0x72 0x6F 0x70 0x20 0x6F // 'e prop o' 0x72 0x20 0x33 0x44 0x20 0x77 0x6F 0x72 // 'r 3D wor' 0x64 0x2E 0x0D 0x0A 0x32 0x09 0x43 0x6C // 'd.??2?Cl' 0x69 0x63 0x6B 0x20 0x69 0x74 0x73 0x20 // 'ick its ' 0x70 0x69 0x63 0x74 0x75 0x72 0x65 0x20 // 'picture ' 0x69 0x6E 0x20 0x74 0x68 0x65 0x20 0x50 // 'in the P' 0x72 0x6F 0x70 0x20 0x4C 0x69 0x73 0x74 // 'rop List' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_67= ktpcHowToActors67 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_67, __HELP_NAME("Select Prop--What Next?")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_67, __HELP_NAME("Select Prop--What Next?")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTActors67 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_36=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_67, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToActors67" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors67" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_36=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_67, 0x0) BYTE 0x01 0x00 0x03 0x03 0xF3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_28=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_36, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToActors78 __HELP_SYMBOL( STN "ktpcHowToActors78" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_36=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_36, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0E 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x45 0x00 0x00 0x01 // '????E???' 0x00 0x00 0x00 0x00 0x47 0x00 0x00 0x01 // '????G???' 0x01 0x00 0x00 0x00 0xEE 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x45 0x00 0x00 0x03 // '???E???' 0x00 0x00 0x00 0x00 0x47 0x00 0x00 0x03 // '????G???' 0x0F 0x00 0x00 0xFD 0xE6 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0xE8 0x00 0x00 0x40 // '??????@' 0x03 0x00 0x00 0x00 0xEE 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xE8 0x00 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xE8 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0xE8 0x00 0x00 0xC0 // '??????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_36=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_36, 0x0) BYTE 0x03 0x03 0x53 0x65 0x6C 0x65 0x63 0x74 // '??Select' 0x69 0x6E 0x67 0x20 0x61 0x20 0x70 0x72 // 'ing a pr' 0x6F 0x70 0x20 0x6F 0x72 0x20 0x33 0x44 // 'op or 3D' 0x20 0x77 0x6F 0x72 0x64 0x20 0x62 0x65 // ' word be' 0x68 0x69 0x6E 0x64 0x20 0x61 0x6E 0x6F // 'hind ano' 0x74 0x68 0x65 0x72 0x20 0x6F 0x72 0x20 // 'ther or ' 0x6F 0x75 0x74 0x20 0x6F 0x66 0x20 0x76 // 'out of v' 0x69 0x65 0x77 0x2D 0x2D 0x57 0x68 0x61 // 'iew--Wha' 0x74 0x20 0x6E 0x65 0x78 0x74 0x3F 0x0D // 't next??' 0x0A 0x49 0x66 0x20 0x74 0x68 0x65 0x20 // '?If the ' 0x70 0x72 0x6F 0x70 0x20 0x6F 0x72 0x20 // 'prop or ' 0x33 0x44 0x20 0x77 0x6F 0x72 0x64 0x20 // '3D word ' 0x77 0x61 0x73 0x20 0x6F 0x75 0x74 0x20 // 'was out ' 0x6F 0x66 0x20 0x76 0x69 0x65 0x77 0x2C // 'of view,' 0x20 0x74 0x68 0x65 0x20 0x70 0x72 0x6F // ' the pro' 0x70 0x20 0x6F 0x72 0x20 0x33 0x44 0x20 // 'p or 3D ' 0x77 0x6F 0x72 0x64 0x20 0x72 0x65 0x61 // 'word rea' 0x70 0x70 0x65 0x61 0x72 0x73 0x20 0x6F // 'ppears o' 0x6E 0x2D 0x73 0x74 0x61 0x67 0x65 0x2E // 'n-stage.' 0x20 0x4D 0x6F 0x76 0x65 0x20 0x74 0x68 // ' Move th' 0x65 0x20 0x6D 0x6F 0x75 0x73 0x65 0x20 // 'e mouse ' 0x75 0x6E 0x74 0x69 0x6C 0x20 0x79 0x6F // 'until yo' 0x75 0x20 0x66 0x69 0x6E 0x64 0x20 0x74 // 'u find t' 0x68 0x65 0x20 0x70 0x6C 0x61 0x63 0x65 // 'he place' 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E // ' you wan' 0x74 0x20 0x74 0x6F 0x20 0x70 0x75 0x74 // 't to put' 0x20 0x74 0x68 0x65 0x20 0x6F 0x62 0x6A // ' the obj' 0x65 0x63 0x74 0x2C 0x20 0x74 0x68 0x65 // 'ect, the' 0x6E 0x20 0x63 0x6C 0x69 0x63 0x6B 0x2E // 'n click.' 0x0D 0x0A 0x01 0x20 0x55 0x6E 0x64 0x6F // '??? Undo' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_68= ktpcHowToActors68 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_68, __HELP_NAME("CO 1) To size evenly")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_68, __HELP_NAME("CO 1) To size evenly")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon3 kgobHowtoSequence kidActorsTransform kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTActors68 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_65=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_68, 0x0) GST(0) ITEM "kgobCalloutBalloon3" ITEM "ktpcHowToActors68" ITEM "kgobHowtoSequence" ITEM "kidActorsTransform" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors68" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_65=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_68, 0x0) BYTE 0x01 0x00 0x03 0x03 0x33 0x01 0x00 0x00 // '????3???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_3E=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_65, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x10 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToActors93 __HELP_SYMBOL( STN "ktpcHowToActors93" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_65=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_65, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x13 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x96 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x33 0x00 0x00 0x03 // '???3???' 0x00 0x00 0x00 0x00 0x35 0x00 0x00 0x03 // '????5???' 0x0F 0x00 0x00 0xFD 0x7F 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x8B 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x95 0x00 0x00 0x03 // '??????' 0x0F 0x00 0x00 0xFD 0x96 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x37 0x00 0x00 0x04 // '????7???' 0x0D 0x00 0x00 0xFE 0x46 0x00 0x00 0x04 // '???F???' 0x00 0x00 0x00 0x00 0x37 0x00 0x00 0x40 // '????7??@' 0x03 0x00 0x00 0x00 0x46 0x00 0x00 0x40 // '????F??@' 0x00 0x00 0x00 0x00 0x96 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x35 0x00 0x00 0x80 // '????5??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x7F 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_65=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_65, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x65 0x76 0x65 // '??To eve' 0x6E 0x6C 0x79 0x20 0x67 0x72 0x6F 0x77 // 'nly grow' 0x20 0x6F 0x72 0x20 0x73 0x68 0x72 0x69 // ' or shri' 0x6E 0x6B 0x20 0x61 0x6E 0x20 0x61 0x63 // 'nk an ac' 0x74 0x6F 0x72 0x2C 0x20 0x70 0x72 0x6F // 'tor, pro' 0x70 0x2C 0x20 0x6F 0x72 0x20 0x33 0x44 // 'p, or 3D' 0x20 0x77 0x6F 0x72 0x64 0x0D 0x0A 0x31 // ' word??1' 0x09 0x47 0x6F 0x20 0x74 0x6F 0x20 0x74 // '?Go to t' 0x68 0x65 0x20 0x70 0x6C 0x61 0x63 0x65 // 'he place' 0x20 0x69 0x6E 0x20 0x79 0x6F 0x75 0x72 // ' in your' 0x20 0x6D 0x6F 0x76 0x69 0x65 0x20 0x77 // ' movie w' 0x68 0x65 0x72 0x65 0x20 0x79 0x6F 0x75 // 'here you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F // ' want to' 0x20 0x6D 0x61 0x6B 0x69 0x6E 0x67 0x20 // ' making ' 0x73 0x69 0x7A 0x69 0x6E 0x67 0x20 0x63 // 'sizing c' 0x68 0x61 0x6E 0x67 0x65 0x73 0x2E 0x0D // 'hanges.?' 0x0A 0x32 0x09 0x43 0x6C 0x69 0x63 0x6B // '?2?Click' 0x20 0x74 0x68 0x65 0x20 0x53 0x69 0x7A // ' the Siz' 0x65 0x20 0x54 0x6F 0x6F 0x6C 0x73 0x2E // 'e Tools.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_69= ktpcHowToActors69 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_69, __HELP_NAME("CO 2) Click Size Evenly")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_69, __HELP_NAME("CO 2) Click Size Evenly")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon4 kgobHowtoSequence kidActorsShrink kidPlayHelpSounds 0x0 0xFFFFFFEC 0x57415645 kwavHTActors69 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_69, 0x0) GST(0) ITEM "kgobCalloutBalloon4" ITEM "ktpcHowToActors69" ITEM "kgobHowtoSequence" ITEM "kidActorsShrink" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors69" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_69, 0x0) BYTE 0x01 0x00 0x03 0x03 0x6C 0x00 0x00 0x00 // '????l???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x12 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x11 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x12 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2F, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x53 0x69 0x7A 0x65 0x20 0x45 0x76 0x65 // 'Size Eve' 0x6E 0x6C 0x79 0x2E // 'nly.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_6A= ktpcHowToActors6A #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6A, __HELP_NAME("CO 3) Move cursor")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6A, __HELP_NAME("CO 3) Move cursor")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTActors6A ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_78=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6A, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToActors6A" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors6A" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_78=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6A, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC5 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_37=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_78, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToActors94 __HELP_SYMBOL( STN "ktpcHowToActors94" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_78=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_78, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x77 0x00 0x00 0x01 // '????w???' 0x00 0x00 0x00 0x00 0x4F 0x00 0x00 0x03 // '????O???' 0x0F 0x00 0x00 0xFD 0x56 0x00 0x00 0x03 // '???V???' 0x00 0x00 0x00 0x00 0x4F 0x00 0x00 0x04 // '????O???' 0x0D 0x00 0x00 0xFE 0x53 0x00 0x00 0x04 // '???S???' 0x00 0x00 0x00 0x00 0x4F 0x00 0x00 0x40 // '????O??@' 0x01 0x00 0x00 0x00 0x53 0x00 0x00 0x40 // '????S??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x3C 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_75=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_75, 0x0) BYTE 0x03 0x03 0x4D 0x6F 0x76 0x65 0x20 0x74 // '??Move t' 0x68 0x65 0x20 0x6D 0x6F 0x75 0x73 0x65 // 'he mouse' 0x20 0x63 0x75 0x72 0x73 0x6F 0x72 0x20 // ' cursor ' 0x6F 0x76 0x65 0x72 0x20 0x74 0x68 0x65 // 'over the' 0x20 0x33 0x44 0x20 0x6F 0x62 0x6A 0x65 // ' 3D obje' 0x63 0x74 0x20 0x79 0x6F 0x75 0x20 0x77 // 'ct you w' 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 0x63 // 'ant to c' 0x68 0x61 0x6E 0x67 0x65 0x2E 0x0D 0x0A // 'hange.??' 0x54 0x6F 0x20 0x73 0x71 0x75 0x61 0x73 // 'To squas' 0x68 0x20 0x73 0x6F 0x6D 0x65 0x74 0x68 // 'h someth' 0x69 0x6E 0x67 0x2C 0x20 0x64 0x72 0x61 // 'ing, dra' 0x67 0x20 0x64 0x6F 0x77 0x6E 0x2E 0x20 // 'g down. ' 0x54 0x6F 0x20 0x73 0x74 0x72 0x65 0x74 // 'To stret' 0x63 0x68 0x20 0x73 0x6F 0x6D 0x65 0x74 // 'ch somet' 0x68 0x69 0x6E 0x67 0x2C 0x20 0x64 0x72 // 'hing, dr' 0x61 0x67 0x20 0x75 0x70 0x2E 0x20 // 'ag up. ' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_6F= ktpcHowToActors6F #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6F, __HELP_NAME("Squash--What Next?")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6F, __HELP_NAME("Squash--What Next?")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTActors6F ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_92=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6F, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToActors6F" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors6F" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_92=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6F, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_53=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_92, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToActors78 __HELP_SYMBOL( STN "ktpcHowToActors78" ) ITEM LONG 0xC0000002 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToActors90 __HELP_SYMBOL( STN "ktpcHowToActors90" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_92=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_92, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0F 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x22 0x00 0x00 0x01 // '????"???' 0x00 0x00 0x00 0x00 0x24 0x00 0x00 0x01 // '????$???' 0x01 0x00 0x00 0x00 0x4D 0x00 0x00 0x01 // '????M???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x22 0x00 0x00 0x03 // '???"???' 0x00 0x00 0x00 0x00 0x24 0x00 0x00 0x40 // '????$??@' 0x02 0x00 0x00 0x00 0x29 0x00 0x00 0x40 // '????)??@' 0x00 0x00 0x00 0x00 0x2B 0x00 0x00 0x40 // '????+??@' 0x04 0x00 0x00 0x00 0x4D 0x00 0x00 0x40 // '????M??@' 0x00 0x00 0x00 0x00 0x24 0x00 0x00 0x80 // '????$??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x24 0x00 0x00 0x82 // '????$??' 0x00 0x00 0x00 0x00 0x24 0x00 0x00 0xC0 // '????$??' 0x03 0x00 0x00 0x00 0x2B 0x00 0x00 0xC0 // '????+??' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_92=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_92, 0x0) BYTE 0x03 0x03 0x53 0x71 0x75 0x61 0x73 0x68 // '??Squash' 0x69 0x6E 0x67 0x20 0x26 0x20 0x73 0x74 // 'ing & st' 0x72 0x65 0x74 0x63 0x68 0x69 0x6E 0x67 // 'retching' 0x2D 0x2D 0x57 0x68 0x61 0x74 0x20 0x6E // '--What n' 0x65 0x78 0x74 0x3F 0x0D 0x0A 0x01 0x55 // 'ext????U' 0x6E 0x64 0x6F 0x0D 0x0A 0x01 0x53 0x71 // 'ndo???Sq' 0x75 0x61 0x73 0x68 0x69 0x6E 0x67 0x20 // 'uashing ' 0x6F 0x72 0x20 0x73 0x74 0x72 0x65 0x74 // 'or stret' 0x63 0x68 0x69 0x6E 0x67 0x20 0x6F 0x76 // 'ching ov' 0x65 0x72 0x20 0x74 0x69 0x6D 0x65 // 'er time' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_70= ktpcHowToActors70 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_70, __HELP_NAME("CO 1) To change back 2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_70, __HELP_NAME("CO 1) To change back 2")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon3 kgobHowtoSequence kidActorsTransform kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTActors70 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_6=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_70, 0x0) GST(0) ITEM "kgobCalloutBalloon3" ITEM "ktpcHowToActors70" ITEM "kgobHowtoSequence" ITEM "kidActorsTransform" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors70" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_6=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_70, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE4 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_10=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToActors93 __HELP_SYMBOL( STN "ktpcHowToActors93" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_6=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x13 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xA2 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x3E 0x00 0x00 0x03 // '???>???' 0x00 0x00 0x00 0x00 0x41 0x00 0x00 0x03 // '????A???' 0x0F 0x00 0x00 0xFD 0x8B 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x97 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xA1 0x00 0x00 0x03 // '??????' 0x0F 0x00 0x00 0xFD 0xA2 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x43 0x00 0x00 0x04 // '????C???' 0x0D 0x00 0x00 0xFE 0x52 0x00 0x00 0x04 // '???R???' 0x00 0x00 0x00 0x00 0x43 0x00 0x00 0x40 // '????C??@' 0x03 0x00 0x00 0x00 0x52 0x00 0x00 0x40 // '????R??@' 0x00 0x00 0x00 0x00 0xA2 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0x80 // '????@??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x8B 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_6=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x63 0x68 0x61 // '??To cha' 0x6E 0x67 0x65 0x20 0x61 0x6E 0x20 0x61 // 'nge an a' 0x63 0x74 0x6F 0x72 0x2C 0x20 0x70 0x72 // 'ctor, pr' 0x6F 0x70 0x2C 0x20 0x6F 0x72 0x20 0x33 // 'op, or 3' 0x44 0x20 0x77 0x6F 0x72 0x64 0x20 0x62 // 'D word b' 0x61 0x63 0x6B 0x20 0x74 0x6F 0x20 0x69 // 'ack to i' 0x74 0x73 0x20 0x6F 0x72 0x69 0x67 0x69 // 'ts origi' 0x6E 0x61 0x6C 0x20 0x73 0x69 0x7A 0x65 // 'nal size' 0x0D 0x0A 0x20 0x31 0x09 0x47 0x6F 0x20 // '?? 1?Go ' 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 0x70 // 'to the p' 0x6C 0x61 0x63 0x65 0x20 0x69 0x6E 0x20 // 'lace in ' 0x79 0x6F 0x75 0x72 0x20 0x6D 0x6F 0x76 // 'your mov' 0x69 0x65 0x20 0x77 0x68 0x65 0x72 0x65 // 'ie where' 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E // ' you wan' 0x74 0x20 0x74 0x6F 0x20 0x6D 0x61 0x6B // 't to mak' 0x69 0x6E 0x67 0x20 0x73 0x69 0x7A 0x69 // 'ing sizi' 0x6E 0x67 0x20 0x63 0x68 0x61 0x6E 0x67 // 'ng chang' 0x65 0x73 0x2E 0x0D 0x0A 0x32 0x09 0x43 // 'es.??2?C' 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 // 'lick the' 0x20 0x53 0x69 0x7A 0x65 0x20 0x54 0x6F // ' Size To' 0x6F 0x6C 0x73 0x2E // 'ols.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_71= ktpcHowToActors71 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_71, __HELP_NAME("CO 2) Click Change Back 2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_71, __HELP_NAME("CO 2) Click Change Back 2")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon4 kgobHowtoSequence kidActorsTransformNorm kidPlayHelpSounds 0x0 0xFFFFFFEC 0x57415645 kwavHTActors71 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_87=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_71, 0x0) GST(0) ITEM "kgobCalloutBalloon4" ITEM "ktpcHowToActors71" ITEM "kgobHowtoSequence" ITEM "kidActorsTransformNorm" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors71" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_87=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_71, 0x0) BYTE 0x01 0x00 0x03 0x03 0x6F 0x00 0x00 0x00 // '????o???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_87=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_87, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x05 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x07 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x13 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x07 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x12 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x13 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_87=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_87, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x20 0x43 0x68 0x61 0x6E 0x67 0x65 0x20 // ' Change ' 0x42 0x61 0x63 0x6B 0x2E // 'Back.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_72= ktpcHowToActors72 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_72, __HELP_NAME("CO 3) Click change back 3")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_72, __HELP_NAME("CO 3) Click change back 3")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTActors72 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_6C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_72, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToActors72" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors72" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_6C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_72, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB5 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_6C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x3A 0x00 0x00 0x01 // '????:???' 0x00 0x00 0x00 0x00 0x39 0x00 0x00 0x04 // '????9???' 0x00 0x00 0x00 0x00 0x39 0x00 0x00 0x40 // '????9??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_6C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6C, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x6F // 'the acto' 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 0x2C // 'r, prop,' 0x20 0x6F 0x72 0x20 0x33 0x44 0x20 0x77 // ' or 3D w' 0x6F 0x72 0x64 0x20 0x79 0x6F 0x75 0x20 // 'ord you ' 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 // 'want to ' 0x63 0x68 0x61 0x6E 0x67 0x65 0x20 0x62 // 'change b' 0x61 0x63 0x6B 0x2E // 'ack.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_73= ktpcHowToActors73 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_73, __HELP_NAME("Change Back 2--What Next?")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_73, __HELP_NAME("Change Back 2--What Next?")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTActors73 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_5C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_73, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToActors73" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors73" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_5C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_73, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE2 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_3C=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5C, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToActors78 __HELP_SYMBOL( STN "ktpcHowToActors78" ) ITEM LONG 0xC0000002 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToActors81 __HELP_SYMBOL( STN "ktpcHowToActors81" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_5C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0F 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x19 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x1B 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x35 0x00 0x00 0x01 // '????5???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x19 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x1B 0x00 0x00 0x40 // '???????@' 0x02 0x00 0x00 0x00 0x20 0x00 0x00 0x40 // '???? ??@' 0x00 0x00 0x00 0x00 0x22 0x00 0x00 0x40 // '????"??@' 0x04 0x00 0x00 0x00 0x35 0x00 0x00 0x40 // '????5??@' 0x00 0x00 0x00 0x00 0x1B 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x1B 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x1B 0x00 0x00 0xC0 // '???????' 0x03 0x00 0x00 0x00 0x22 0x00 0x00 0xC0 // '????"??' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_5C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5C, 0x0) BYTE 0x03 0x03 0x43 0x68 0x61 0x6E 0x67 0x69 // '??Changi' 0x6E 0x67 0x20 0x62 0x61 0x63 0x6B 0x2D // 'ng back-' 0x2D 0x57 0x68 0x61 0x74 0x20 0x6E 0x65 // '-What ne' 0x78 0x74 0x3F 0x0D 0x0A 0x01 0x55 0x6E // 'xt????Un' 0x64 0x6F 0x0D 0x0A 0x01 0x50 0x6C 0x61 // 'do???Pla' 0x79 0x69 0x6E 0x67 0x20 0x79 0x6F 0x75 // 'ying you' 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 // 'r movie' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_74= ktpcHowToActors74 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_74, __HELP_NAME("CO 1) To change costume")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_74, __HELP_NAME("CO 1) To change costume")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence kidActorsCostume kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTActors74 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_70=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_74, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcHowToActors74" ITEM "kgobHowtoSequence" ITEM "kidActorsCostume" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors74" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_70=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_74, 0x0) BYTE 0x01 0x00 0x03 0x03 0x31 0x01 0x00 0x00 // '????1???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_4B=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_70, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' FREE FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToActors93 __HELP_SYMBOL( STN "ktpcHowToActors93" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_70=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_70, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x14 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x91 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x32 0x00 0x00 0x03 // '???2???' 0x00 0x00 0x00 0x00 0x34 0x00 0x00 0x03 // '????4???' 0x0F 0x00 0x00 0xFD 0x73 0x00 0x00 0x03 // '???s???' 0x00 0x00 0x00 0x00 0x81 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x90 0x00 0x00 0x03 // '??????' 0x0F 0x00 0x00 0xFD 0x91 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x36 0x00 0x00 0x04 // '????6???' 0x0D 0x00 0x00 0xFE 0x45 0x00 0x00 0x04 // '???E???' 0x00 0x00 0x00 0x00 0x36 0x00 0x00 0x40 // '????6??@' 0x04 0x00 0x00 0x00 0x45 0x00 0x00 0x40 // '????E??@' 0x00 0x00 0x00 0x00 0x91 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x34 0x00 0x00 0x80 // '????4??' 0x00 0x00 0x02 0x00 0x75 0x00 0x00 0x80 // '????u??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x75 0x00 0x00 0x82 // '????u??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_70=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_70, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x63 0x68 0x61 // '??To cha' 0x6E 0x67 0x65 0x20 0x74 0x68 0x65 0x20 // 'nge the ' 0x77 0x61 0x79 0x20 0x61 0x6E 0x20 0x61 // 'way an a' 0x63 0x74 0x6F 0x72 0x2C 0x20 0x70 0x72 // 'ctor, pr' 0x6F 0x70 0x2C 0x20 0x6F 0x72 0x20 0x33 // 'op, or 3' 0x44 0x20 0x77 0x6F 0x72 0x64 0x20 0x6C // 'D word l' 0x6F 0x6F 0x6B 0x73 0x0D 0x0A 0x31 0x09 // 'ooks??1?' 0x47 0x6F 0x20 0x74 0x6F 0x20 0x74 0x68 // 'Go to th' 0x65 0x20 0x70 0x6C 0x61 0x63 0x65 0x20 // 'e place ' 0x69 0x6E 0x20 0x79 0x6F 0x75 0x72 0x20 // 'in your ' 0x6D 0x6F 0x76 0x69 0x65 0x20 0x77 0x68 // 'movie wh' 0x65 0x72 0x65 0x20 0x79 0x6F 0x75 0x20 // 'ere you ' 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 // 'want to ' 0x6D 0x61 0x6B 0x65 0x20 0x63 0x68 0x61 // 'make cha' 0x6E 0x67 0x65 0x73 0x2E 0x0D 0x0A 0x32 // 'nges.??2' 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 0x74 // '?Click t' 0x68 0x65 0x20 0x43 0x6F 0x73 0x74 0x75 // 'he Costu' 0x6D 0x65 0x20 0x43 0x68 0x61 0x6E 0x67 // 'me Chang' 0x65 0x72 0x2E // 'er.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_75= ktpcHowToActors75 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_75, __HELP_NAME("CO 2) Click one costume")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_75, __HELP_NAME("CO 2) Click one costume")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTActors75 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_19=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_75, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToActors75" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors75" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_19=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_75, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_19=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_19, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x03 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x35 0x00 0x00 0x01 // '????5???' 0x00 0x00 0x00 0x00 0x35 0x00 0x00 0x40 // '????5??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_19=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_19, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x6F // 'the acto' 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 0x2C // 'r, prop,' 0x20 0x6F 0x72 0x20 0x33 0x44 0x20 0x77 // ' or 3D w' 0x6F 0x72 0x64 0x20 0x79 0x6F 0x75 0x20 // 'ord you ' 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 // 'want to ' 0x63 0x68 0x61 0x6E 0x67 0x65 0x2E // 'change.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_76= ktpcHowToActors76 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_76, __HELP_NAME("CO 3) Costume or 3D Easel")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_76, __HELP_NAME("CO 3) Costume or 3D Easel")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon0 kgobHowtoSequence 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 kwavHTActors76 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_76=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_76, 0x0) GST(0) ITEM "kgobCalloutBalloon0" ITEM "ktpcHowToActors76" ITEM "kgobHowtoSequence" ITEM "" ITEM "" ITEM "kwavHTActors76" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_76=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_76, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA4 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_76=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_76, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0xA1 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_76=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_76, 0x0) BYTE 0x03 0x03 0x4E 0x6F 0x74 0x65 0x20 0x74 // '??Note t' 0x6F 0x20 0x54 0x6F 0x6E 0x79 0x3A 0x0D // 'o Tony:?' 0x0A 0x20 0x49 0x66 0x20 0x74 0x68 0x65 // '? If the' 0x79 0x20 0x63 0x6C 0x69 0x63 0x6B 0x65 // 'y clicke' 0x64 0x20 0x61 0x6E 0x20 0x61 0x63 0x74 // 'd an act' 0x6F 0x72 0x20 0x6F 0x72 0x20 0x70 0x72 // 'or or pr' 0x6F 0x70 0x2C 0x20 0x64 0x69 0x73 0x70 // 'op, disp' 0x6C 0x61 0x79 0x20 0x73 0x74 0x61 0x6E // 'lay stan' 0x64 0x61 0x72 0x64 0x20 0x43 0x6F 0x73 // 'dard Cos' 0x74 0x75 0x6D 0x65 0x20 0x43 0x68 0x61 // 'tume Cha' 0x6E 0x67 0x65 0x72 0x20 0x62 0x61 0x6C // 'nger bal' 0x6C 0x6F 0x6F 0x6E 0x2E 0x0D 0x0A 0x0D // 'loon.???' 0x0A 0x49 0x66 0x20 0x74 0x68 0x65 0x79 // '?If they' 0x20 0x63 0x6C 0x69 0x63 0x6B 0x65 0x64 // ' clicked' 0x20 0x61 0x20 0x33 0x44 0x20 0x77 0x6F // ' a 3D wo' 0x72 0x64 0x2C 0x20 0x64 0x69 0x73 0x70 // 'rd, disp' 0x6C 0x61 0x79 0x20 0x73 0x74 0x61 0x6E // 'lay stan' 0x64 0x61 0x72 0x64 0x20 0x33 0x44 0x20 // 'dard 3D ' 0x57 0x6F 0x72 0x64 0x20 0x45 0x61 0x73 // 'Word Eas' 0x65 0x6C 0x20 0x62 0x61 0x6C 0x6C 0x6F // 'el ballo' 0x6F 0x6E 0x2E // 'on.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_77= ktpcHowToActors77 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_77, __HELP_NAME("Costume--What Next?")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_77, __HELP_NAME("Costume--What Next?")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTActors77 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_30=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_77, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToActors77" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors77" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_30=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_77, 0x0) BYTE 0x01 0x00 0x03 0x03 0xBC 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_22=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_30, 0x0) AG(4) FREE ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToActors78 __HELP_SYMBOL( STN "ktpcHowToActors78" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_30=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_30, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1D 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x1F 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x24 0x00 0x00 0x01 // '????$???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x1D 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x1F 0x00 0x00 0x40 // '???????@' 0x03 0x00 0x00 0x00 0x24 0x00 0x00 0x40 // '????$??@' 0x00 0x00 0x00 0x00 0x1F 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x1F 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x1F 0x00 0x00 0xC0 // '???????' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_30=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_30, 0x0) BYTE 0x03 0x03 0x43 0x68 0x61 0x6E 0x67 0x69 // '??Changi' 0x6E 0x67 0x20 0x74 0x68 0x65 0x20 0x6C // 'ng the l' 0x6F 0x6F 0x6B 0x2D 0x2D 0x57 0x68 0x61 // 'ook--Wha' 0x74 0x20 0x6E 0x65 0x78 0x74 0x3F 0x0D // 't next??' 0x0A 0x01 0x55 0x6E 0x64 0x6F // '??Undo' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_78= ktpcHowToActors78 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_78, __HELP_NAME("Tip: Undo")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_78, __HELP_NAME("Tip: Undo")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTActors78 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_94=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_78, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToActors78" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTActors78" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_94=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_78, 0x0) BYTE 0x01 0x00 0x03 0x03 0xBD 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_47=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_94, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpUndo __HELP_SYMBOL( STN "mbmpUndo" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpRedo __HELP_SYMBOL( STN "mbmpRedo" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_94=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_94, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x13 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0C 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x0E 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2C 0x00 0x00 0x01 // '????,???' 0x00 0x00 0x00 0x00 0x2E 0x00 0x00 0x01 // '????.???' 0x01 0xF1 0x00 0x00 0x3B 0x00 0x00 0x01 // '???;???' 0x01 0x00 0x00 0x00 0x3C 0x00 0x00 0x01 // '???????' 0x0A 0x00 0x00 0xFD 0x54 0x00 0x00 0x03 // '???T???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x56 0x00 0x00 0x82 // '????V??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0x3B 0x00 0x00 0xC0 // '????;??' 0x02 0x00 0x00 0x00 0x63 0x00 0x00 0xC0 // '????c??' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_94=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_94, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x55 0x6E 0x64 // '??? Und' 0x6F 0x2F 0x52 0x65 0x64 0x6F 0x0D 0x0A // 'o/Redo??' 0x54 0x6F 0x20 0x75 0x6E 0x64 0x6F 0x20 // 'To undo ' 0x74 0x68 0x65 0x20 0x6C 0x61 0x73 0x74 // 'the last' 0x20 0x74 0x68 0x69 0x6E 0x67 0x20 0x79 // ' thing y' 0x6F 0x75 0x20 0x64 0x69 0x64 0x0D 0x0A // 'ou did??' 0x95 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 // '?Click ' 0x55 0x6E 0x64 0x6F 0x2D 0x01 0x0D 0x0A // 'Undo-???' 0x54 0x6F 0x20 0x72 0x65 0x64 0x6F 0x20 // 'To redo ' 0x77 0x68 0x61 0x74 0x20 0x79 0x6F 0x75 // 'what you' 0x20 0x75 0x6E 0x64 0x69 0x64 0x0D 0x0A // ' undid??' 0x95 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 // '?Click ' 0x52 0x65 0x64 0x6F 0x2D 0x01 // 'Redo-?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_79= ktpcHowToActors79 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_79, __HELP_NAME("Tip: Assign Action")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_79, __HELP_NAME("Tip: Assign Action")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTActors79 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_16=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_79, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToActors79" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTActors79" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_16=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_79, 0x0) BYTE 0x01 0x00 0x03 0x03 0x27 0x01 0x00 0x00 // '????'???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_41=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_16, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpActorActions __HELP_SYMBOL( STN "mbmpActorActions" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_16=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_16, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0E 0x00 0x00 0x00 0x04 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x17 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x19 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x4A 0x00 0x00 0x01 // '????J???' 0x00 0x00 0x00 0x00 0x4C 0x00 0x00 0x01 // '????L???' 0x01 0xF6 0x00 0x00 0x5C 0x00 0x00 0x01 // '???\???' 0x01 0x00 0x00 0x00 0xA4 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x19 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x4A 0x00 0x00 0x03 // '???J???' 0x00 0x00 0x00 0x00 0x4C 0x00 0x00 0x80 // '????L??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x5F 0x00 0x00 0x82 // '????_??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0x5C 0x00 0x00 0xC0 // '????\??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_16=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_16, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x20 0x41 0x73 // '??? As' 0x73 0x69 0x67 0x6E 0x69 0x6E 0x67 0x20 // 'signing ' 0x61 0x6E 0x20 0x61 0x63 0x74 0x69 0x6F // 'an actio' 0x6E 0x0D 0x0A 0x54 0x6F 0x20 0x61 0x73 // 'n??To as' 0x73 0x69 0x67 0x6E 0x20 0x61 0x6E 0x20 // 'sign an ' 0x61 0x63 0x74 0x69 0x6F 0x6E 0x20 0x74 // 'action t' 0x6F 0x20 0x61 0x6E 0x20 0x61 0x63 0x74 // 'o an act' 0x6F 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 // 'or, prop' 0x2C 0x20 0x6F 0x72 0x20 0x33 0x44 0x20 // ', or 3D ' 0x77 0x6F 0x72 0x64 0x0D 0x0A 0x31 0x09 // 'word??1?' 0x43 0x6C 0x69 0x63 0x6B 0x20 0x41 0x63 // 'Click Ac' 0x74 0x69 0x6F 0x6E 0x73 0x2D 0x01 0x0D // 'tions-??' 0x0A 0x32 0x09 0x43 0x6C 0x69 0x63 0x6B // '?2?Click' 0x20 0x74 0x68 0x65 0x20 0x61 0x63 0x74 // ' the act' 0x6F 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 // 'or, prop' 0x2C 0x20 0x6F 0x72 0x20 0x33 0x44 0x20 // ', or 3D ' 0x77 0x6F 0x72 0x64 0x20 0x79 0x6F 0x75 // 'word you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F // ' want to' 0x20 0x61 0x73 0x73 0x69 0x67 0x6E 0x20 // ' assign ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x69 // 'the acti' 0x6F 0x6E 0x20 0x74 0x6F 0x2E // 'on to.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_7A= ktpcHowToActors7A #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7A, __HELP_NAME("Tip: Move Up or Down")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7A, __HELP_NAME("Tip: Move Up or Down")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTActors7A ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7A, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToActors7A" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTActors7A" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x69 0x01 0x00 0x00 // '????i???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2C=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4A, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpActorsCompose __HELP_SYMBOL( STN "mbmpActorsCompose" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpActorsXY __HELP_SYMBOL( STN "mbmpActorsXY" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_4A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x13 0x00 0x00 0x00 0x04 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x15 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x17 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x51 0x00 0x00 0x01 // '????Q???' 0x00 0x00 0x00 0x00 0x53 0x00 0x00 0x01 // '????S???' 0x01 0xF6 0x00 0x00 0x66 0x00 0x00 0x01 // '???f???' 0x01 0x00 0x00 0x00 0x69 0x00 0x00 0x01 // '????i???' 0x01 0xF6 0x00 0x00 0x8A 0x00 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0x10 0x01 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x17 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x51 0x00 0x00 0x03 // '???Q???' 0x00 0x00 0x00 0x00 0x53 0x00 0x00 0x80 // '????S??' 0x00 0x00 0x02 0x00 0x8D 0x00 0x00 0x80 // '??????' 0x00 0x00 0x03 0x00 0xC3 0x00 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xC3 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x02 0x00 0x00 0x00 0x66 0x00 0x00 0xC0 // '????f??' 0x01 0x00 0x00 0x00 0x8A 0x00 0x00 0xC0 // '??????' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4A, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x20 0x4D 0x6F // '??? Mo' 0x76 0x69 0x6E 0x67 0x20 0x75 0x70 0x20 // 'ving up ' 0x6F 0x72 0x20 0x64 0x6F 0x77 0x6E 0x0D // 'or down?' 0x0A 0x54 0x6F 0x20 0x6D 0x6F 0x76 0x65 // '?To move' 0x20 0x61 0x6E 0x20 0x61 0x63 0x74 0x6F // ' an acto' 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 0x2C // 'r, prop,' 0x20 0x6F 0x72 0x20 0x33 0x44 0x20 0x77 // ' or 3D w' 0x6F 0x72 0x64 0x20 0x61 0x6E 0x64 0x20 // 'ord and ' 0x69 0x74 0x73 0x20 0x70 0x61 0x74 0x68 // 'its path' 0x20 0x75 0x70 0x20 0x6F 0x72 0x20 0x64 // ' up or d' 0x6F 0x77 0x6E 0x0D 0x0A 0x31 0x09 0x43 // 'own??1?C' 0x6C 0x69 0x63 0x6B 0x20 0x52 0x65 0x70 // 'lick Rep' 0x6F 0x73 0x69 0x74 0x69 0x6F 0x6E 0x2D // 'osition-' 0x01 0x0D 0x0A 0x32 0x09 0x22 0x54 0x75 // '???2?"Tu' 0x72 0x6E 0x20 0x6F 0x6E 0x22 0x20 0x74 // 'rn on" t' 0x68 0x65 0x20 0x55 0x70 0x20 0x26 0x20 // 'he Up & ' 0x44 0x6F 0x77 0x6E 0x20 0x62 0x75 0x74 // 'Down but' 0x74 0x6F 0x6E 0x2D 0x01 0x0D 0x0A 0x57 // 'ton-???W' 0x68 0x65 0x6E 0x20 0x22 0x6F 0x6E 0x2C // 'hen "on,' 0x22 0x20 0x74 0x68 0x65 0x20 0x62 0x75 // '" the bu' 0x74 0x74 0x6F 0x6E 0x20 0x69 0x73 0x20 // 'tton is ' 0x70 0x75 0x73 0x68 0x65 0x64 0x20 0x69 // 'pushed i' 0x6E 0x20 0x61 0x6E 0x64 0x20 0x69 0x74 // 'n and it' 0x20 0x6C 0x69 0x67 0x68 0x74 0x73 0x20 // ' lights ' 0x75 0x70 0x2E 0x0D 0x0A 0x33 0x09 0x48 // 'up.??3?H' 0x6F 0x6C 0x64 0x20 0x64 0x6F 0x77 0x6E // 'old down' 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 // ' the mou' 0x73 0x65 0x20 0x62 0x75 0x74 0x74 0x6F // 'se butto' 0x6E 0x20 0x61 0x6E 0x64 0x20 0x64 0x72 // 'n and dr' 0x61 0x67 0x20 0x74 0x68 0x65 0x20 0x61 // 'ag the a' 0x63 0x74 0x6F 0x72 0x2C 0x20 0x70 0x72 // 'ctor, pr' 0x6F 0x70 0x2C 0x20 0x6F 0x72 0x20 0x33 // 'op, or 3' 0x44 0x20 0x77 0x6F 0x72 0x64 0x20 0x75 // 'D word u' 0x70 0x20 0x6F 0x72 0x20 0x64 0x6F 0x77 // 'p or dow' 0x6E 0x2E // 'n.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_7B= ktpcHowToActors7B #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7B, __HELP_NAME("Tip: Remove")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7B, __HELP_NAME("Tip: Remove")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTActors7B ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_6A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7B, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToActors7B" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTActors7B" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_6A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x79 0x01 0x00 0x00 // '????y???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_54=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6A, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpCutCopyPaste __HELP_SYMBOL( STN "mbmpCutCopyPaste" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) FREE ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpCCPRemoveObject __HELP_SYMBOL( STN "mbmpCCPRemoveObject" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_6A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x14 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0B 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x0D 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x48 0x00 0x00 0x01 // '????H???' 0x00 0x00 0x00 0x00 0x4A 0x00 0x00 0x01 // '????J???' 0x01 0xF6 0x00 0x00 0x6F 0x00 0x00 0x01 // '???o???' 0x01 0x00 0x00 0x00 0x72 0x00 0x00 0x01 // '????r???' 0x01 0xF6 0x00 0x00 0x8B 0x00 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0x8C 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xBB 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x0D 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x48 0x00 0x00 0x03 // '???H???' 0x00 0x00 0x00 0x00 0x6F 0x00 0x00 0x03 // '????o???' 0x0A 0x00 0x00 0xFD 0x70 0x00 0x00 0x03 // '???p???' 0x00 0x00 0x00 0x00 0x4A 0x00 0x00 0x80 // '????J??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x8E 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x02 0x00 0x00 0x00 0x6F 0x00 0x00 0xC0 // '????o??' 0x01 0x00 0x00 0x00 0x8B 0x00 0x00 0xC0 // '??????' 0x04 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_6A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6A, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x52 0x65 0x6D // '??? Rem' 0x6F 0x76 0x69 0x6E 0x67 0x0D 0x0A 0x54 // 'oving??T' 0x6F 0x20 0x72 0x65 0x6D 0x6F 0x76 0x65 // 'o remove' 0x20 0x61 0x6E 0x20 0x61 0x63 0x74 0x6F // ' an acto' 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 0x2C // 'r, prop,' 0x20 0x6F 0x72 0x20 0x33 0x44 0x20 0x77 // ' or 3D w' 0x6F 0x72 0x64 0x20 0x66 0x72 0x6F 0x6D // 'ord from' 0x20 0x74 0x68 0x65 0x20 0x63 0x75 0x72 // ' the cur' 0x72 0x65 0x6E 0x74 0x20 0x73 0x63 0x65 // 'rent sce' 0x6E 0x65 0x0D 0x0A 0x31 0x09 0x43 0x6C // 'ne??1?Cl' 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 // 'ick the ' 0x43 0x75 0x74 0x2C 0x20 0x43 0x6F 0x70 // 'Cut, Cop' 0x79 0x2C 0x20 0x26 0x20 0x50 0x61 0x73 // 'y, & Pas' 0x74 0x65 0x20 0x54 0x6F 0x6F 0x6C 0x73 // 'te Tools' 0x2D 0x01 0x0D 0x0A 0x32 0x09 0x43 0x6C // '-???2?Cl' 0x69 0x63 0x6B 0x20 0x52 0x65 0x6D 0x6F // 'ick Remo' 0x76 0x65 0x20 0x33 0x44 0x20 0x4F 0x62 // 've 3D Ob' 0x6A 0x65 0x63 0x74 0x2D 0x01 0x0D 0x0A // 'ject-???' 0x33 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 // '3?Click ' 0x74 0x68 0x65 0x20 0x33 0x44 0x20 0x6F // 'the 3D o' 0x62 0x6A 0x65 0x63 0x74 0x20 0x79 0x6F // 'bject yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 // 'u want t' 0x6F 0x20 0x67 0x65 0x74 0x20 0x72 0x69 // 'o get ri' 0x64 0x20 0x6F 0x66 0x2E // 'd of.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_7C= ktpcHowToActors7C #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7C, __HELP_NAME("Tip: Reposition")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7C, __HELP_NAME("Tip: Reposition")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTActors7C ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_7C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7C, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToActors7C" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTActors7C" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_7C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x74 0x01 0x00 0x00 // '????t???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_5B=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7C, 0x0) AG(4) FREE ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpActorsCompose __HELP_SYMBOL( STN "mbmpActorsCompose" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_7C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x16 0x00 0x00 0x00 0x04 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x64 0x00 0x00 0x01 // '????d???' 0x01 0xF6 0x00 0x00 0x77 0x00 0x00 0x01 // '???w???' 0x01 0x00 0x00 0x00 0x78 0x00 0x00 0x01 // '????x???' 0x01 0x00 0x00 0x00 0xC2 0x00 0x00 0x01 // '???????' 0x05 0x00 0x00 0x00 0xD0 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xD7 0x00 0x00 0x01 // '???????' 0x05 0x00 0x00 0x00 0xE0 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0x9C 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x03 // '????????' 0x00 0x00 0x00 0x00 0x13 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x62 0x00 0x00 0x03 // '???b???' 0x00 0x00 0x00 0x00 0x64 0x00 0x00 0x80 // '????d??' 0x00 0x00 0x02 0x00 0x7A 0x00 0x00 0x80 // '????z??' 0x00 0x00 0x02 0x00 0xC2 0x00 0x00 0x80 // '??????' 0x00 0x00 0x03 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xE2 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x0B 0x01 0x00 0x82 // '???????' 0x0A 0x00 0x00 0x00 0x6D 0x01 0x00 0x82 // '????m??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x02 0x00 0x00 0x00 0x77 0x00 0x00 0xC0 // '????w??' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_7C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7C, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x20 0x52 0x65 // '??? Re' 0x70 0x6F 0x73 0x69 0x74 0x69 0x6F 0x6E // 'position' 0x69 0x6E 0x67 0x0D 0x0A 0x54 0x6F 0x20 // 'ing??To ' 0x72 0x65 0x70 0x6F 0x73 0x69 0x74 0x69 // 'repositi' 0x6F 0x6E 0x20 0x61 0x6E 0x20 0x61 0x63 // 'on an ac' 0x74 0x6F 0x72 0x2C 0x20 0x70 0x72 0x6F // 'tor, pro' 0x70 0x2C 0x20 0x6F 0x72 0x20 0x33 0x44 // 'p, or 3D' 0x20 0x77 0x6F 0x72 0x64 0x20 0x61 0x6E // ' word an' 0x64 0x20 0x69 0x74 0x73 0x20 0x70 0x61 // 'd its pa' 0x74 0x68 0x20 0x66 0x72 0x6F 0x6D 0x20 // 'th from ' 0x74 0x68 0x65 0x20 0x63 0x75 0x72 0x72 // 'the curr' 0x65 0x6E 0x74 0x20 0x66 0x72 0x61 0x6D // 'ent fram' 0x65 0x20 0x6F 0x6E 0x0D 0x0A 0x31 0x09 // 'e on??1?' 0x43 0x6C 0x69 0x63 0x6B 0x20 0x52 0x65 // 'Click Re' 0x70 0x6F 0x73 0x69 0x74 0x69 0x6F 0x6E // 'position' 0x2D 0x01 0x0D 0x0A 0x32 0x09 0x48 0x6F // '-???2?Ho' 0x6C 0x64 0x20 0x64 0x6F 0x77 0x6E 0x20 // 'ld down ' 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 0x73 // 'the mous' 0x65 0x20 0x62 0x75 0x74 0x74 0x6F 0x6E // 'e button' 0x20 0x61 0x6E 0x64 0x20 0x64 0x72 0x61 // ' and dra' 0x67 0x20 0x74 0x68 0x65 0x20 0x33 0x44 // 'g the 3D' 0x20 0x6F 0x62 0x6A 0x65 0x63 0x74 0x20 // ' object ' 0x77 0x68 0x65 0x72 0x65 0x20 0x79 0x6F // 'where yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 0x69 // 'u want i' 0x74 0x2E 0x0D 0x0A 0x49 0x66 0x20 0x79 // 't.??If y' 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 // 'ou want ' 0x74 0x6F 0x09 0x09 0x09 0x09 0x09 0x09 // 'to??????' 0x09 0x48 0x6F 0x6C 0x64 0x20 0x64 0x6F // '?Hold do' 0x77 0x6E 0x0D 0x0A 0x4D 0x6F 0x76 0x65 // 'wn??Move' 0x20 0x74 0x68 0x65 0x20 0x33 0x44 0x20 // ' the 3D ' 0x6F 0x62 0x6A 0x65 0x63 0x74 0x20 0x75 // 'object u' 0x70 0x09 0x09 0x09 0x09 0x74 0x68 0x65 // 'p????the' 0x20 0x55 0x70 0x20 0x6F 0x72 0x20 0x44 // ' Up or D' 0x6F 0x77 0x6E 0x0D 0x0A 0x6F 0x72 0x20 // 'own??or ' 0x64 0x6F 0x77 0x6E 0x20 0x61 0x6E 0x64 // 'down and' 0x20 0x6E 0x65 0x61 0x72 0x20 0x6F 0x72 // ' near or' 0x20 0x66 0x61 0x72 0x09 0x09 0x09 0x09 // ' far????' 0x41 0x72 0x72 0x6F 0x77 0x20 0x6B 0x65 // 'Arrow ke' 0x79 0x20 0x61 0x73 0x20 0x79 0x6F 0x75 // 'y as you' 0x20 0x64 0x72 0x61 0x67 0x2E 0x0D 0x0A // ' drag.??' 0x52 0x65 0x70 0x6F 0x73 0x69 0x74 0x69 // 'Repositi' 0x6F 0x6E 0x20 0x6F 0x6E 0x6C 0x79 0x20 // 'on only ' 0x6F 0x6E 0x65 0x20 0x66 0x72 0x61 0x6D // 'one fram' 0x65 0x09 0x09 0x09 0x43 0x74 0x72 0x6C // 'e???Ctrl' 0x20 0x61 0x73 0x20 0x79 0x6F 0x75 0x20 // ' as you ' 0x64 0x72 0x61 0x67 0x2E 0x0D 0x0A 0x52 // 'drag.??R' 0x65 0x70 0x6F 0x73 0x69 0x74 0x69 0x6F // 'epositio' 0x6E 0x20 0x74 0x68 0x65 0x20 0x65 0x6E // 'n the en' 0x74 0x69 0x72 0x65 0x20 0x70 0x61 0x74 // 'tire pat' 0x68 0x09 0x09 0x09 0x53 0x68 0x69 0x66 // 'h???Shif' 0x74 0x20 0x61 0x73 0x20 0x79 0x6F 0x75 // 't as you' 0x20 0x64 0x72 0x61 0x67 0x2E // ' drag.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_7D= ktpcHowToActors7D #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7D, __HELP_NAME("Tip: Freezing an Action")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7D, __HELP_NAME("Tip: Freezing an Action")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTActors7D ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_7F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7D, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToActors7D" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTActors7D" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_7F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x06 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_51=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7F, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_7F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x04 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x16 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x18 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x4F 0x01 0x00 0x01 // '????O???' 0x00 0x00 0x00 0x00 0xEE 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x01 0x01 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x03 0x01 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x03 0x01 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_7F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7F, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x20 0x46 0x72 // '??? Fr' 0x65 0x65 0x7A 0x69 0x6E 0x67 0x20 0x61 // 'eezing a' 0x6E 0x20 0x61 0x63 0x74 0x69 0x6F 0x6E // 'n action' 0x0D 0x0A 0x57 0x68 0x65 0x6E 0x20 0x79 // '??When y' 0x6F 0x75 0x20 0x6D 0x6F 0x76 0x65 0x20 // 'ou move ' 0x61 0x6E 0x20 0x61 0x63 0x74 0x6F 0x72 // 'an actor' 0x20 0x61 0x63 0x72 0x6F 0x73 0x73 0x20 // ' across ' 0x74 0x68 0x65 0x20 0x73 0x74 0x61 0x67 // 'the stag' 0x65 0x2C 0x20 0x79 0x6F 0x75 0x20 0x63 // 'e, you c' 0x61 0x6E 0x20 0x22 0x66 0x72 0x65 0x65 // 'an "free' 0x7A 0x65 0x22 0x20 0x61 0x6E 0x20 0x61 // 'ze" an a' 0x63 0x74 0x69 0x6F 0x6E 0x2E 0x20 0x20 // 'ction. ' 0x46 0x6F 0x72 0x20 0x65 0x78 0x61 0x6D // 'For exam' 0x70 0x6C 0x65 0x2C 0x20 0x69 0x66 0x20 // 'ple, if ' 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 // 'you want' 0x20 0x61 0x6E 0x20 0x61 0x63 0x74 0x6F // ' an acto' 0x72 0x20 0x74 0x6F 0x20 0x6A 0x75 0x6D // 'r to jum' 0x70 0x20 0x75 0x70 0x20 0x69 0x6E 0x74 // 'p up int' 0x6F 0x20 0x74 0x68 0x65 0x20 0x61 0x69 // 'o the ai' 0x72 0x2C 0x20 0x79 0x6F 0x75 0x20 0x63 // 'r, you c' 0x61 0x6E 0x20 0x66 0x72 0x65 0x65 0x7A // 'an freez' 0x65 0x20 0x74 0x68 0x65 0x20 0x6A 0x75 // 'e the ju' 0x6D 0x70 0x20 0x61 0x63 0x74 0x69 0x6F // 'mp actio' 0x6E 0x20 0x61 0x6E 0x64 0x20 0x63 0x6F // 'n and co' 0x6E 0x74 0x69 0x6E 0x75 0x65 0x20 0x64 // 'ntinue d' 0x72 0x61 0x67 0x67 0x69 0x6E 0x67 0x20 // 'ragging ' 0x74 0x6F 0x20 0x63 0x72 0x65 0x61 0x74 // 'to creat' 0x65 0x20 0x61 0x20 0x22 0x66 0x6C 0x6F // 'e a "flo' 0x61 0x74 0x69 0x6E 0x67 0x22 0x20 0x65 // 'ating" e' 0x66 0x66 0x65 0x63 0x74 0x2E 0x0D 0x0A // 'ffect.??' 0x54 0x6F 0x20 0x66 0x72 0x65 0x65 0x7A // 'To freez' 0x65 0x20 0x61 0x6E 0x20 0x61 0x63 0x74 // 'e an act' 0x69 0x6F 0x6E 0x0D 0x0A 0x95 0x09 0x48 // 'ion???H' 0x6F 0x6C 0x64 0x20 0x64 0x6F 0x77 0x6E // 'old down' 0x20 0x53 0x68 0x69 0x66 0x74 0x20 0x61 // ' Shift a' 0x73 0x20 0x79 0x6F 0x75 0x20 0x64 0x72 // 's you dr' 0x61 0x67 0x20 0x74 0x68 0x65 0x20 0x61 // 'ag the a' 0x63 0x74 0x6F 0x72 0x2C 0x20 0x70 0x72 // 'ctor, pr' 0x6F 0x70 0x2C 0x20 0x6F 0x72 0x20 0x33 // 'op, or 3' 0x44 0x20 0x77 0x6F 0x72 0x64 0x20 0x77 // 'D word w' 0x68 0x65 0x72 0x65 0x20 0x79 0x6F 0x75 // 'here you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x69 0x74 // ' want it' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_7E= ktpcHowToActors7E #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7E, __HELP_NAME("Tip: Change Start Position")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7E, __HELP_NAME("Tip: Change Start Position")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTActors7E ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7E, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToActors7E" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTActors7E" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x0C 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0x04 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x22 0x00 0x00 0x01 // '????"???' 0x00 0x00 0x00 0x00 0x24 0x00 0x00 0x01 // '????$???' 0x01 0x00 0x00 0x00 0x4A 0x00 0x00 0x01 // '????J???' 0x00 0x00 0x00 0x00 0x4C 0x00 0x00 0x01 // '????L???' 0x01 0x00 0x00 0x00 0x04 0x01 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x24 0x00 0x00 0x03 // '????$???' 0x0A 0x00 0x00 0xFD 0x4A 0x00 0x00 0x03 // '???J???' 0x00 0x00 0x00 0x00 0x4C 0x00 0x00 0x80 // '????L??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xB9 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x20 0x43 0x68 // '??? Ch' 0x61 0x6E 0x67 0x69 0x6E 0x67 0x20 0x74 // 'anging t' 0x68 0x65 0x20 0x73 0x74 0x61 0x72 0x74 // 'he start' 0x69 0x6E 0x67 0x20 0x70 0x6F 0x73 0x69 // 'ing posi' 0x74 0x69 0x6F 0x6E 0x0D 0x0A 0x54 0x6F // 'tion??To' 0x20 0x63 0x68 0x61 0x6E 0x67 0x65 0x20 // ' change ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x69 // 'the acti' 0x6F 0x6E 0x20 0x73 0x74 0x61 0x72 0x74 // 'on start' 0x69 0x6E 0x67 0x20 0x70 0x6F 0x73 0x69 // 'ing posi' 0x74 0x69 0x6F 0x6E 0x0D 0x0A 0x31 0x09 // 'tion??1?' 0x4D 0x6F 0x76 0x65 0x20 0x74 0x68 0x65 // 'Move the' 0x20 0x6D 0x6F 0x75 0x73 0x65 0x20 0x63 // ' mouse c' 0x75 0x72 0x73 0x6F 0x72 0x20 0x6F 0x76 // 'ursor ov' 0x65 0x72 0x20 0x74 0x68 0x65 0x20 0x61 // 'er the a' 0x63 0x74 0x6F 0x72 0x2C 0x20 0x70 0x72 // 'ctor, pr' 0x6F 0x70 0x2C 0x20 0x6F 0x72 0x20 0x33 // 'op, or 3' 0x44 0x20 0x77 0x6F 0x72 0x64 0x20 0x77 // 'D word w' 0x68 0x6F 0x73 0x65 0x20 0x61 0x63 0x74 // 'hose act' 0x69 0x6F 0x6E 0x20 0x73 0x74 0x61 0x72 // 'ion star' 0x74 0x69 0x6E 0x67 0x20 0x70 0x6F 0x73 // 'ting pos' 0x69 0x74 0x69 0x6F 0x6E 0x20 0x79 0x6F // 'ition yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 // 'u want t' 0x6F 0x20 0x63 0x68 0x61 0x6E 0x67 0x65 // 'o change' 0x2E 0x0D 0x0A 0x32 0x09 0x48 0x6F 0x6C // '.??2?Hol' 0x64 0x20 0x64 0x6F 0x77 0x6E 0x20 0x43 // 'd down C' 0x74 0x72 0x6C 0x20 0x61 0x6E 0x64 0x20 // 'trl and ' 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 0x73 // 'the mous' 0x65 0x20 0x62 0x75 0x74 0x74 0x6F 0x6E // 'e button' 0x20 0x75 0x6E 0x74 0x69 0x6C 0x20 0x79 // ' until y' 0x6F 0x75 0x20 0x66 0x69 0x6E 0x64 0x20 // 'ou find ' 0x74 0x68 0x65 0x20 0x70 0x6F 0x73 0x69 // 'the posi' 0x74 0x69 0x6F 0x6E 0x20 0x79 0x6F 0x75 // 'tion you' 0x20 0x77 0x61 0x6E 0x74 0x2E // ' want.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_7F= ktpcHowToActors7F #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7F, __HELP_NAME("Tip: Move Up or Down 2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7F, __HELP_NAME("Tip: Move Up or Down 2")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTActors7F ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_7E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7F, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToActors7F" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTActors7F" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_7E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x05 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_50=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7E, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_7E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0x04 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x25 0x00 0x00 0x01 // '????%???' 0x00 0x00 0x00 0x00 0x27 0x00 0x00 0x01 // '????'???' 0x01 0x00 0x00 0x00 0x64 0x00 0x00 0x01 // '????d???' 0x00 0x00 0x00 0x00 0x66 0x00 0x00 0x01 // '????f???' 0x01 0x00 0x00 0x00 0xB5 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x27 0x00 0x00 0x03 // '????'???' 0x0A 0x00 0x00 0xFD 0x64 0x00 0x00 0x03 // '???d???' 0x00 0x00 0x00 0x00 0x66 0x00 0x00 0x80 // '????f??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x66 0x00 0x00 0x82 // '????f??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_7E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7E, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x20 0x4D 0x6F // '??? Mo' 0x76 0x69 0x6E 0x67 0x20 0x75 0x70 0x20 // 'ving up ' 0x6F 0x72 0x20 0x64 0x6F 0x77 0x6E 0x20 // 'or down ' 0x61 0x6E 0x64 0x20 0x6E 0x65 0x61 0x72 // 'and near' 0x20 0x6F 0x72 0x20 0x66 0x61 0x72 0x0D // ' or far?' 0x0A 0x54 0x6F 0x20 0x6D 0x6F 0x76 0x65 // '?To move' 0x20 0x61 0x6E 0x20 0x61 0x63 0x74 0x6F // ' an acto' 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 0x2C // 'r, prop,' 0x20 0x6F 0x72 0x20 0x33 0x44 0x20 0x77 // ' or 3D w' 0x6F 0x72 0x64 0x20 0x75 0x70 0x20 0x6F // 'ord up o' 0x72 0x20 0x64 0x6F 0x77 0x6E 0x20 0x61 // 'r down a' 0x6E 0x64 0x20 0x6E 0x65 0x61 0x72 0x20 // 'nd near ' 0x6F 0x72 0x20 0x66 0x61 0x72 0x0D 0x0A // 'or far??' 0x95 0x09 0x48 0x6F 0x6C 0x64 0x20 0x64 // '?Hold d' 0x6F 0x77 0x6E 0x20 0x74 0x68 0x65 0x20 // 'own the ' 0x55 0x70 0x20 0x6F 0x72 0x20 0x44 0x6F // 'Up or Do' 0x77 0x6E 0x20 0x41 0x72 0x72 0x6F 0x77 // 'wn Arrow' 0x20 0x6B 0x65 0x79 0x20 0x61 0x73 0x20 // ' key as ' 0x79 0x6F 0x75 0x20 0x68 0x6F 0x6C 0x64 // 'you hold' 0x20 0x64 0x6F 0x77 0x6E 0x20 0x74 0x68 // ' down th' 0x65 0x20 0x6D 0x6F 0x75 0x73 0x65 0x20 // 'e mouse ' 0x62 0x75 0x74 0x74 0x6F 0x6E 0x20 0x6F // 'button o' 0x72 0x20 0x64 0x72 0x61 0x67 0x2E // 'r drag.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_80= ktpcHowToActors80 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_80, __HELP_NAME("Tip: Change Action")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_80, __HELP_NAME("Tip: Change Action")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTActors80 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_7A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_80, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToActors80" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTActors80" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_7A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_80, 0x0) BYTE 0x01 0x00 0x03 0x03 0x42 0x01 0x00 0x00 // '????B???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_E=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7A, 0x0) AG(4) FREE ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpFrameSlider __HELP_SYMBOL( STN "mbmpFrameSlider" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSceneSlider __HELP_SYMBOL( STN "mbmpSceneSlider" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpActorActions __HELP_SYMBOL( STN "mbmpActorActions" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_7A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x18 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x16 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x18 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2C 0x00 0x00 0x01 // '????,???' 0x00 0x00 0x00 0x00 0x2E 0x00 0x00 0x01 // '????.???' 0x01 0x00 0x00 0x00 0xF7 0x00 0x00 0x01 // '???????' 0x01 0xF6 0x00 0x00 0x07 0x01 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0x50 0x01 0x00 0x01 // '????P???' 0x01 0xFB 0x00 0x00 0x76 0x01 0x00 0x01 // '???v???' 0x00 0x00 0x00 0x00 0x18 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x2C 0x00 0x00 0x03 // '???,???' 0x00 0x00 0x00 0x00 0x30 0x00 0x00 0x03 // '????0???' 0x0F 0x00 0x00 0xFD 0x5D 0x00 0x00 0x03 // '???]???' 0x00 0x00 0x00 0x00 0x8B 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0xF5 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x2E 0x00 0x00 0x80 // '????.??' 0x00 0x00 0x02 0x00 0x8E 0x00 0x00 0x80 // '??????' 0x00 0x00 0x03 0x00 0xF7 0x00 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x50 0x01 0x00 0x82 // '????P??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x02 0x00 0x00 0x00 0x8E 0x00 0x00 0xC0 // '??????' 0x03 0x00 0x00 0x00 0x91 0x00 0x00 0xC0 // '??????' 0x04 0x00 0x00 0x00 0x07 0x01 0x00 0xC0 // '???????' 0x05 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_7A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7A, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x43 0x68 0x61 // '??? Cha' 0x6E 0x67 0x69 0x6E 0x67 0x20 0x74 0x68 // 'nging th' 0x65 0x20 0x61 0x63 0x74 0x69 0x6F 0x6E // 'e action' 0x0D 0x0A 0x54 0x6F 0x20 0x63 0x68 0x61 // '??To cha' 0x6E 0x67 0x65 0x20 0x74 0x68 0x65 0x20 // 'nge the ' 0x61 0x63 0x74 0x69 0x6F 0x6E 0x0D 0x0A // 'action??' 0x31 0x09 0x47 0x6F 0x20 0x74 0x6F 0x20 // '1?Go to ' 0x74 0x68 0x65 0x20 0x70 0x6C 0x61 0x63 // 'the plac' 0x65 0x20 0x77 0x68 0x65 0x72 0x65 0x20 // 'e where ' 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 // 'you want' 0x20 0x74 0x6F 0x20 0x63 0x68 0x61 0x6E // ' to chan' 0x67 0x65 0x20 0x74 0x68 0x65 0x20 0x61 // 'ge the a' 0x63 0x74 0x69 0x6F 0x6E 0x20 0x61 0x73 // 'ction as' 0x73 0x69 0x67 0x6E 0x65 0x64 0x20 0x74 // 'signed t' 0x6F 0x20 0x61 0x6E 0x20 0x61 0x63 0x74 // 'o an act' 0x6F 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 // 'or, prop' 0x2C 0x20 0x6F 0x72 0x20 0x33 0x44 0x20 // ', or 3D ' 0x77 0x6F 0x72 0x64 0x2E 0x20 0x0D 0x0A // 'word. ??' 0x01 0x0D 0x0A 0x01 0x0D 0x0A 0x54 0x6F // '??????To' 0x20 0x6D 0x6F 0x76 0x65 0x20 0x77 0x69 // ' move wi' 0x74 0x68 0x69 0x6E 0x20 0x61 0x20 0x73 // 'thin a s' 0x63 0x65 0x6E 0x65 0x2C 0x20 0x75 0x73 // 'cene, us' 0x65 0x20 0x74 0x68 0x65 0x20 0x46 0x72 // 'e the Fr' 0x61 0x6D 0x65 0x20 0x53 0x6C 0x69 0x64 // 'ame Slid' 0x65 0x72 0x2E 0x0D 0x0A 0x54 0x6F 0x20 // 'er.??To ' 0x6D 0x6F 0x76 0x65 0x20 0x66 0x72 0x6F // 'move fro' 0x6D 0x20 0x73 0x63 0x65 0x6E 0x65 0x20 // 'm scene ' 0x74 0x6F 0x20 0x73 0x63 0x65 0x6E 0x65 // 'to scene' 0x2C 0x20 0x75 0x73 0x65 0x20 0x74 0x68 // ', use th' 0x65 0x20 0x53 0x63 0x65 0x6E 0x65 0x20 // 'e Scene ' 0x53 0x6C 0x69 0x64 0x65 0x72 0x2E 0x0D // 'Slider.?' 0x0A 0x32 0x09 0x43 0x6C 0x69 0x63 0x6B // '?2?Click' 0x20 0x41 0x63 0x74 0x69 0x6F 0x6E 0x73 // ' Actions' 0x2D 0x01 0x0D 0x0A 0x33 0x09 0x43 0x6C // '-???3?Cl' 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 // 'ick the ' 0x61 0x63 0x74 0x6F 0x72 0x2C 0x20 0x70 // 'actor, p' 0x72 0x6F 0x70 0x2C 0x20 0x6F 0x72 0x20 // 'rop, or ' 0x33 0x44 0x20 0x77 0x6F 0x72 0x64 0x20 // '3D word ' 0x77 0x68 0x6F 0x73 0x65 0x20 0x61 0x63 // 'whose ac' 0x74 0x69 0x6F 0x6E 0x20 0x79 0x6F 0x75 // 'tion you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F // ' want to' 0x20 0x63 0x68 0x61 0x6E 0x67 0x65 0x2E // ' change.' 0x0D 0x0A 0x34 0x09 0x43 0x6C 0x69 0x63 // '??4?Clic' 0x6B 0x20 0x74 0x68 0x65 0x20 0x6E 0x65 // 'k the ne' 0x77 0x20 0x61 0x63 0x74 0x69 0x6F 0x6E // 'w action' 0x2C 0x20 0x74 0x68 0x65 0x6E 0x20 0x63 // ', then c' 0x6C 0x69 0x63 0x6B 0x20 0x4F 0x4B 0x2E // 'lick OK.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_81= ktpcHowToActors81 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_81, __HELP_NAME("Tip: Play Movie")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_81, __HELP_NAME("Tip: Play Movie")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTActors81 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_5B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_81, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToActors81" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTActors81" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_5B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_81, 0x0) BYTE 0x01 0x00 0x03 0x03 0x5E 0x01 0x00 0x00 // '????^???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_5=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5B, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpFrameSlider __HELP_SYMBOL( STN "mbmpFrameSlider" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSceneSlider __HELP_SYMBOL( STN "mbmpSceneSlider" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpPlay __HELP_SYMBOL( STN "mbmpPlay" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_5B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x13 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xE9 0x00 0x00 0x01 // '???????' 0x01 0xF1 0x00 0x00 0x01 0x01 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0x7A 0x01 0x00 0x01 // '????z???' 0x00 0x00 0x00 0x00 0x7A 0x01 0x00 0x02 // '????z???' 0x00 0x00 0x00 0x00 0x03 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x15 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x2B 0x00 0x00 0x03 // '???+???' 0x0F 0x00 0x00 0xFD 0xE7 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x2B 0x00 0x00 0x80 // '????+??' 0x00 0x00 0x02 0x00 0x80 0x00 0x00 0x80 // '??????' 0x00 0x00 0x03 0x00 0xE9 0x00 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0x04 0x01 0x00 0x80 // '???????' 0x00 0x00 0x03 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x04 0x01 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0x80 0x00 0x00 0xC0 // '??????' 0x02 0x00 0x00 0x00 0x83 0x00 0x00 0xC0 // '??????' 0x03 0x00 0x00 0x00 0x01 0x01 0x00 0xC0 // '???????' 0x04 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_5B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5B, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x50 0x6C 0x61 // '??? Pla' 0x79 0x69 0x6E 0x67 0x20 0x79 0x6F 0x75 // 'ying you' 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 0x0D // 'r movie?' 0x0A 0x54 0x6F 0x20 0x70 0x6C 0x61 0x79 // '?To play' 0x20 0x79 0x6F 0x75 0x72 0x20 0x6D 0x6F // ' your mo' 0x76 0x69 0x65 0x0D 0x0A 0x31 0x09 0x55 // 'vie??1?U' 0x73 0x65 0x20 0x74 0x68 0x65 0x20 0x46 // 'se the F' 0x72 0x61 0x6D 0x65 0x20 0x61 0x6E 0x64 // 'rame and' 0x20 0x53 0x63 0x65 0x6E 0x65 0x20 0x53 // ' Scene S' 0x6C 0x69 0x64 0x65 0x72 0x73 0x20 0x74 // 'liders t' 0x6F 0x20 0x72 0x65 0x77 0x69 0x6E 0x64 // 'o rewind' 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F 0x76 // ' the mov' 0x69 0x65 0x20 0x74 0x6F 0x20 0x74 0x68 // 'ie to th' 0x65 0x20 0x70 0x61 0x72 0x74 0x20 0x79 // 'e part y' 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 // 'ou want ' 0x74 0x6F 0x20 0x70 0x6C 0x61 0x79 0x2E // 'to play.' 0x0D 0x0A 0x01 0x0D 0x0A 0x01 0x0D 0x0A // '????????' 0x54 0x6F 0x20 0x6D 0x6F 0x76 0x65 0x20 // 'To move ' 0x77 0x69 0x74 0x68 0x69 0x6E 0x20 0x61 // 'within a' 0x20 0x73 0x63 0x65 0x6E 0x65 0x2C 0x20 // ' scene, ' 0x75 0x73 0x65 0x20 0x74 0x68 0x65 0x20 // 'use the ' 0x46 0x72 0x61 0x6D 0x65 0x20 0x53 0x6C // 'Frame Sl' 0x69 0x64 0x65 0x72 0x2E 0x0D 0x0A 0x54 // 'ider.??T' 0x6F 0x20 0x6D 0x6F 0x76 0x65 0x20 0x66 // 'o move f' 0x72 0x6F 0x6D 0x20 0x73 0x63 0x65 0x6E // 'rom scen' 0x65 0x20 0x74 0x6F 0x20 0x73 0x63 0x65 // 'e to sce' 0x6E 0x65 0x2C 0x20 0x75 0x73 0x65 0x20 // 'ne, use ' 0x74 0x68 0x65 0x20 0x53 0x63 0x65 0x6E // 'the Scen' 0x65 0x20 0x53 0x6C 0x69 0x64 0x65 0x72 // 'e Slider' 0x2E 0x0D 0x0A 0x32 0x09 0x43 0x6C 0x69 // '.??2?Cli' 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 0x50 // 'ck the P' 0x6C 0x61 0x79 0x20 0x62 0x75 0x74 0x74 // 'lay butt' 0x6F 0x6E 0x2D 0x01 0x0D 0x0A 0x4E 0x6F // 'on-???No' 0x74 0x65 0x3A 0x20 0x20 0x49 0x66 0x20 // 'te: If ' 0x79 0x6F 0x75 0x27 0x72 0x65 0x20 0x61 // 'you're a' 0x74 0x20 0x74 0x68 0x65 0x20 0x6C 0x61 // 't the la' 0x73 0x74 0x20 0x66 0x72 0x61 0x6D 0x65 // 'st frame' 0x20 0x6F 0x66 0x20 0x74 0x68 0x65 0x20 // ' of the ' 0x6D 0x6F 0x76 0x69 0x65 0x20 0x77 0x68 // 'movie wh' 0x65 0x6E 0x20 0x79 0x6F 0x75 0x20 0x63 // 'en you c' 0x6C 0x69 0x63 0x6B 0x20 0x50 0x6C 0x61 // 'lick Pla' 0x79 0x2C 0x20 0x74 0x68 0x65 0x20 0x6D // 'y, the m' 0x6F 0x76 0x69 0x65 0x20 0x61 0x75 0x74 // 'ovie aut' 0x6F 0x6D 0x61 0x74 0x69 0x63 0x61 0x6C // 'omatical' 0x6C 0x79 0x20 0x72 0x65 0x77 0x69 0x6E // 'ly rewin' 0x64 0x73 0x20 0x74 0x6F 0x20 0x74 0x68 // 'ds to th' 0x65 0x20 0x62 0x65 0x67 0x69 0x6E 0x6E // 'e beginn' 0x69 0x6E 0x67 0x2E // 'ing.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_82= ktpcHowToActors82 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_82, __HELP_NAME("Cut--Replace Path Tip")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_82, __HELP_NAME("Cut--Replace Path Tip")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 kwavHTActors82 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_8E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_82, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToActors82" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTActors82" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_8E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_82, 0x0) BYTE 0x01 0x00 0x03 0x03 0x50 0x01 0x00 0x00 // '????P???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_8E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_8E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8E, 0x0) BYTE 0x03 0x03 0x43 0x75 0x74 // '??Cut' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_83= ktpcHowToActors83 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_83, __HELP_NAME("Tip: Move Up or Down 3")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_83, __HELP_NAME("Tip: Move Up or Down 3")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTActors83 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_23=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_83, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToActors83" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTActors83" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_23=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_83, 0x0) BYTE 0x01 0x00 0x03 0x03 0xF5 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_5D=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_23, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_23=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_23, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0x04 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x25 0x00 0x00 0x01 // '????%???' 0x00 0x00 0x00 0x00 0x27 0x00 0x00 0x01 // '????'???' 0x01 0x00 0x00 0x00 0x64 0x00 0x00 0x01 // '????d???' 0x00 0x00 0x00 0x00 0x66 0x00 0x00 0x01 // '????f???' 0x01 0x00 0x00 0x00 0x97 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x27 0x00 0x00 0x03 // '????'???' 0x0A 0x00 0x00 0xFD 0x64 0x00 0x00 0x03 // '???d???' 0x00 0x00 0x00 0x00 0x66 0x00 0x00 0x80 // '????f??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x66 0x00 0x00 0x82 // '????f??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_23=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_23, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x20 0x4D 0x6F // '??? Mo' 0x76 0x69 0x6E 0x67 0x20 0x75 0x70 0x20 // 'ving up ' 0x6F 0x72 0x20 0x64 0x6F 0x77 0x6E 0x20 // 'or down ' 0x61 0x6E 0x64 0x20 0x6E 0x65 0x61 0x72 // 'and near' 0x20 0x6F 0x72 0x20 0x66 0x61 0x72 0x0D // ' or far?' 0x0A 0x54 0x6F 0x20 0x6D 0x6F 0x76 0x65 // '?To move' 0x20 0x61 0x6E 0x20 0x61 0x63 0x74 0x6F // ' an acto' 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 0x2C // 'r, prop,' 0x20 0x6F 0x72 0x20 0x33 0x44 0x20 0x77 // ' or 3D w' 0x6F 0x72 0x64 0x20 0x75 0x70 0x20 0x6F // 'ord up o' 0x72 0x20 0x64 0x6F 0x77 0x6E 0x20 0x61 // 'r down a' 0x6E 0x64 0x20 0x6E 0x65 0x61 0x72 0x20 // 'nd near ' 0x6F 0x72 0x20 0x66 0x61 0x72 0x0D 0x0A // 'or far??' 0x95 0x09 0x48 0x6F 0x6C 0x64 0x20 0x64 // '?Hold d' 0x6F 0x77 0x6E 0x20 0x74 0x68 0x65 0x20 // 'own the ' 0x55 0x70 0x20 0x6F 0x72 0x20 0x44 0x6F // 'Up or Do' 0x77 0x6E 0x20 0x41 0x72 0x72 0x6F 0x77 // 'wn Arrow' 0x20 0x6B 0x65 0x79 0x20 0x61 0x73 0x20 // ' key as ' 0x79 0x6F 0x75 0x20 0x64 0x72 0x61 0x67 // 'you drag' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_84= ktpcHowToActors84 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_84, __HELP_NAME("Tip: Reposition one frame")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_84, __HELP_NAME("Tip: Reposition one frame")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTActors84 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_84=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_84, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToActors84" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTActors84" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_84=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_84, 0x0) BYTE 0x01 0x00 0x03 0x03 0x33 0x01 0x00 0x00 // '????3???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_56=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_84, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_84=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_84, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x04 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x4F 0x00 0x00 0x01 // '????O???' 0x00 0x00 0x00 0x00 0x51 0x00 0x00 0x01 // '????Q???' 0x01 0x00 0x00 0x00 0x6E 0x00 0x00 0x01 // '????n???' 0x00 0x00 0x00 0x00 0x1D 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x4F 0x00 0x00 0x03 // '???O???' 0x00 0x00 0x00 0x00 0x51 0x00 0x00 0x80 // '????Q??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x51 0x00 0x00 0x82 // '????Q??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_84=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_84, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x20 0x52 0x65 // '??? Re' 0x70 0x6F 0x73 0x69 0x74 0x69 0x6F 0x6E // 'position' 0x69 0x6E 0x67 0x20 0x6F 0x6E 0x65 0x20 // 'ing one ' 0x66 0x72 0x61 0x6D 0x65 0x0D 0x0A 0x54 // 'frame??T' 0x6F 0x20 0x72 0x65 0x70 0x6F 0x73 0x69 // 'o reposi' 0x74 0x69 0x6F 0x6E 0x20 0x6F 0x6E 0x6C // 'tion onl' 0x79 0x20 0x6F 0x6E 0x65 0x20 0x66 0x72 // 'y one fr' 0x61 0x6D 0x65 0x20 0x6F 0x66 0x20 0x61 // 'ame of a' 0x20 0x33 0x44 0x20 0x6F 0x62 0x6A 0x65 // ' 3D obje' 0x63 0x74 0x27 0x73 0x20 0x70 0x61 0x74 // 'ct's pat' 0x68 0x0D 0x0A 0x95 0x09 0x48 0x6F 0x6C // 'h???Hol' 0x64 0x20 0x64 0x6F 0x77 0x6E 0x20 0x43 // 'd down C' 0x74 0x72 0x6C 0x20 0x61 0x73 0x20 0x79 // 'trl as y' 0x6F 0x75 0x20 0x64 0x72 0x61 0x67 0x2E // 'ou drag.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_85= ktpcHowToActors85 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_85, __HELP_NAME("Tip: Reposition Entire Path")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_85, __HELP_NAME("Tip: Reposition Entire Path")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTActors85 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_9=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_85, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToActors85" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTActors85" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_9=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_85, 0x0) BYTE 0x01 0x00 0x03 0x03 0x33 0x01 0x00 0x00 // '????3???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1D=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_9, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_9=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_9, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x04 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x40 0x00 0x00 0x01 // '????@???' 0x00 0x00 0x00 0x00 0x42 0x00 0x00 0x01 // '????B???' 0x01 0x00 0x00 0x00 0x60 0x00 0x00 0x01 // '????`???' 0x00 0x00 0x00 0x00 0x23 0x00 0x00 0x03 // '????#???' 0x0A 0x00 0x00 0xFD 0x40 0x00 0x00 0x03 // '???@???' 0x00 0x00 0x00 0x00 0x42 0x00 0x00 0x80 // '????B??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x42 0x00 0x00 0x82 // '????B??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_9=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_9, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x20 0x52 0x65 // '??? Re' 0x70 0x6F 0x73 0x69 0x74 0x69 0x6F 0x6E // 'position' 0x69 0x6E 0x67 0x20 0x74 0x68 0x65 0x20 // 'ing the ' 0x65 0x6E 0x74 0x69 0x72 0x65 0x20 0x70 // 'entire p' 0x61 0x74 0x68 0x0D 0x0A 0x54 0x6F 0x20 // 'ath??To ' 0x72 0x65 0x70 0x6F 0x73 0x69 0x74 0x69 // 'repositi' 0x6F 0x6E 0x20 0x74 0x68 0x65 0x20 0x65 // 'on the e' 0x6E 0x74 0x69 0x72 0x65 0x20 0x70 0x61 // 'ntire pa' 0x74 0x68 0x0D 0x0A 0x95 0x09 0x48 0x6F // 'th???Ho' 0x6C 0x64 0x20 0x64 0x6F 0x77 0x6E 0x20 // 'ld down ' 0x53 0x68 0x69 0x66 0x74 0x20 0x61 0x73 // 'Shift as' 0x20 0x79 0x6F 0x75 0x20 0x64 0x72 0x61 // ' you dra' 0x67 0x2E // 'g.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_86= ktpcHowToActors86 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_86, __HELP_NAME("Def: Turn on")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_86, __HELP_NAME("Def: Turn on")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTActors86 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_8D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_86, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToActors86" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTActors86" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_8D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_86, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB4 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_8D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x10 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x07 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x09 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x20 0x00 0x00 0x01 // '???? ???' 0x00 0x00 0x00 0x00 0x22 0x00 0x00 0x01 // '????"???' 0x01 0x00 0x00 0x00 0xA9 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x09 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x20 0x00 0x00 0x03 // '??? ???' 0x00 0x00 0x00 0x00 0x50 0x00 0x00 0x03 // '????P???' 0x0A 0x00 0x00 0xFD 0x68 0x00 0x00 0x03 // '???h???' 0x00 0x00 0x00 0x00 0x09 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x2F 0x00 0x00 0x80 // '????/??' 0x00 0x00 0x03 0x00 0x50 0x00 0x00 0x80 // '????P??' 0x00 0x00 0x02 0x00 0x7D 0x00 0x00 0x80 // '????}??' 0x00 0x00 0x03 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x7D 0x00 0x00 0x82 // '????}??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_8D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8D, 0x0) BYTE 0x03 0x03 0x54 0x75 0x72 0x6E 0x20 0x6F // '??Turn o' 0x6E 0x0D 0x0A 0x54 0x6F 0x20 0x22 0x74 // 'n??To "t' 0x75 0x72 0x6E 0x20 0x6F 0x6E 0x22 0x20 // 'urn on" ' 0x74 0x68 0x65 0x20 0x62 0x75 0x74 0x74 // 'the butt' 0x6F 0x6E 0x0D 0x0A 0x95 0x09 0x43 0x6C // 'on???Cl' 0x69 0x63 0x6B 0x20 0x69 0x74 0x2E 0x0D // 'ick it.?' 0x0A 0x57 0x68 0x65 0x6E 0x20 0x22 0x6F // '?When "o' 0x6E 0x2C 0x22 0x20 0x79 0x6F 0x75 0x20 // 'n," you ' 0x73 0x65 0x65 0x20 0x61 0x20 0x72 0x65 // 'see a re' 0x64 0x20 0x6C 0x69 0x67 0x68 0x74 0x2E // 'd light.' 0x0D 0x0A 0x54 0x6F 0x20 0x22 0x74 0x75 // '??To "tu' 0x72 0x6E 0x20 0x6F 0x66 0x66 0x22 0x20 // 'rn off" ' 0x74 0x68 0x65 0x20 0x62 0x75 0x74 0x74 // 'the butt' 0x6F 0x6E 0x0D 0x0A 0x95 0x09 0x43 0x6C // 'on???Cl' 0x69 0x63 0x6B 0x20 0x69 0x74 0x20 0x61 // 'ick it a' 0x67 0x61 0x69 0x6E 0x2E 0x0D 0x0A 0x57 // 'gain.??W' 0x68 0x65 0x6E 0x20 0x22 0x6F 0x66 0x66 // 'hen "off' 0x2C 0x22 0x20 0x79 0x6F 0x75 0x20 0x6E // '," you n' 0x6F 0x20 0x6C 0x6F 0x6E 0x67 0x65 0x72 // 'o longer' 0x20 0x73 0x65 0x65 0x20 0x74 0x68 0x65 // ' see the' 0x20 0x72 0x65 0x64 0x20 0x6C 0x69 0x67 // ' red lig' 0x68 0x74 0x2E // 'ht.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_87= ktpcHowToActors87 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_87, __HELP_NAME("Key: Up Down")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_87, __HELP_NAME("Key: Up Down")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTActors87 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_87, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToActors87" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTActors87" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_87, 0x0) BYTE 0x01 0x00 0x03 0x03 0xF0 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_7=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) AG(4) FREE ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1020_bmp __HELP_SYMBOL( STN "helppic1020_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x02 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0E 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x10 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x35 0x00 0x00 0x01 // '????5???' 0x00 0x00 0x00 0x00 0x1C 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x1E 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x10 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x10 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) BYTE 0x03 0x03 0x01 0x20 0x53 0x68 0x6F 0x72 // '??? Shor' 0x74 0x63 0x75 0x74 0x20 0x6B 0x65 0x79 // 'tcut key' 0x0D 0x0A 0x95 0x09 0x48 0x6F 0x6C 0x64 // '???Hold' 0x20 0x64 0x6F 0x77 0x6E 0x20 0x46 0x39 // ' down F9' 0x20 0x61 0x73 0x20 0x79 0x6F 0x75 0x20 // ' as you ' 0x64 0x72 0x61 0x67 0x20 0x74 0x68 0x65 // 'drag the' 0x20 0x6D 0x6F 0x75 0x73 0x65 0x2E // ' mouse.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_88= ktpcHowToActors88 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_88, __HELP_NAME("Tip: Move Near Far ")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_88, __HELP_NAME("Tip: Move Near Far ")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTActors88 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_86=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_88, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToActors88" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTActors88" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_86=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_88, 0x0) BYTE 0x01 0x00 0x03 0x03 0xED 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_58=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_86, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_86=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_86, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x24 0x00 0x00 0x01 // '????$???' 0x00 0x00 0x00 0x00 0x26 0x00 0x00 0x01 // '????&???' 0x01 0x00 0x00 0x00 0x48 0x00 0x00 0x01 // '????H???' 0x00 0x00 0x00 0x00 0x4A 0x00 0x00 0x01 // '????J???' 0x01 0x00 0x00 0x00 0x85 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x26 0x00 0x00 0x03 // '????&???' 0x0A 0x00 0x00 0xFD 0x48 0x00 0x00 0x03 // '???H???' 0x00 0x00 0x00 0x00 0x4A 0x00 0x00 0x80 // '????J??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x4A 0x00 0x00 0x82 // '????J??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_86=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_86, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x4D 0x6F 0x76 // '??? Mov' 0x69 0x6E 0x67 0x20 0x6E 0x65 0x61 0x72 // 'ing near' 0x20 0x6F 0x72 0x20 0x66 0x61 0x72 0x20 // ' or far ' 0x61 0x6E 0x64 0x20 0x75 0x70 0x20 0x6F // 'and up o' 0x72 0x20 0x64 0x6F 0x77 0x6E 0x0D 0x0A // 'r down??' 0x54 0x6F 0x20 0x6D 0x6F 0x76 0x65 0x20 // 'To move ' 0x6E 0x65 0x61 0x72 0x20 0x6F 0x72 0x20 // 'near or ' 0x66 0x61 0x72 0x20 0x61 0x6E 0x64 0x20 // 'far and ' 0x75 0x70 0x20 0x6F 0x72 0x20 0x64 0x6F // 'up or do' 0x77 0x6E 0x0D 0x0A 0x95 0x09 0x48 0x6F // 'wn???Ho' 0x6C 0x64 0x20 0x64 0x6F 0x77 0x6E 0x20 // 'ld down ' 0x74 0x68 0x65 0x20 0x44 0x6F 0x77 0x6E // 'the Down' 0x20 0x6F 0x72 0x20 0x55 0x70 0x20 0x41 // ' or Up A' 0x72 0x72 0x6F 0x77 0x20 0x6B 0x65 0x79 // 'rrow key' 0x20 0x61 0x73 0x20 0x79 0x6F 0x75 0x20 // ' as you ' 0x64 0x72 0x61 0x67 0x20 0x74 0x68 0x65 // 'drag the' 0x20 0x6D 0x6F 0x75 0x73 0x65 0x2E // ' mouse.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_89= ktpcHowToActors89 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_89, __HELP_NAME("Tip: Change Action")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_89, __HELP_NAME("Tip: Change Action")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTActors89 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_20=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_89, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToActors89" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTActors89" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_20=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_89, 0x0) BYTE 0x01 0x00 0x03 0x03 0x00 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_4D=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_20, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpActorActions __HELP_SYMBOL( STN "mbmpActorActions" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_20=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_20, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x11 0x00 0x00 0x00 0x04 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x17 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x19 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x54 0x00 0x00 0x01 // '????T???' 0x00 0x00 0x00 0x00 0x56 0x00 0x00 0x01 // '????V???' 0x01 0xF6 0x00 0x00 0x66 0x00 0x00 0x01 // '???f???' 0x01 0x00 0x00 0x00 0xAF 0x00 0x00 0x01 // '???????' 0x01 0xFB 0x00 0x00 0xDA 0x00 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0x11 0x01 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x19 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x54 0x00 0x00 0x03 // '???T???' 0x00 0x00 0x00 0x00 0x56 0x00 0x00 0x80 // '????V??' 0x00 0x00 0x02 0x00 0xDC 0x00 0x00 0x80 // '??????' 0x00 0x00 0x03 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xDC 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0x66 0x00 0x00 0xC0 // '????f??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_20=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_20, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x20 0x43 0x68 // '??? Ch' 0x61 0x6E 0x67 0x69 0x6E 0x67 0x20 0x74 // 'anging t' 0x68 0x65 0x20 0x61 0x63 0x74 0x69 0x6F // 'he actio' 0x6E 0x0D 0x0A 0x54 0x6F 0x20 0x63 0x68 // 'n??To ch' 0x61 0x6E 0x67 0x65 0x20 0x74 0x68 0x65 // 'ange the' 0x20 0x61 0x63 0x74 0x69 0x6F 0x6E 0x20 // ' action ' 0x61 0x73 0x73 0x69 0x67 0x6E 0x65 0x64 // 'assigned' 0x20 0x74 0x6F 0x20 0x61 0x6E 0x20 0x61 // ' to an a' 0x63 0x74 0x6F 0x72 0x2C 0x20 0x70 0x72 // 'ctor, pr' 0x6F 0x70 0x2C 0x20 0x6F 0x72 0x20 0x33 // 'op, or 3' 0x44 0x20 0x77 0x6F 0x72 0x64 0x0D 0x0A // 'D word??' 0x31 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 // '1?Click ' 0x41 0x63 0x74 0x69 0x6F 0x6E 0x73 0x2D // 'Actions-' 0x01 0x0D 0x0A 0x32 0x09 0x43 0x6C 0x69 // '???2?Cli' 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 0x61 // 'ck the a' 0x63 0x74 0x6F 0x72 0x2C 0x20 0x70 0x72 // 'ctor, pr' 0x6F 0x70 0x2C 0x20 0x6F 0x72 0x20 0x33 // 'op, or 3' 0x44 0x20 0x77 0x6F 0x72 0x64 0x20 0x77 // 'D word w' 0x68 0x6F 0x73 0x65 0x20 0x61 0x63 0x74 // 'hose act' 0x69 0x6F 0x6E 0x20 0x79 0x6F 0x75 0x20 // 'ion you ' 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 // 'want to ' 0x63 0x68 0x61 0x6E 0x67 0x65 0x2E 0x0D // 'change.?' 0x0A 0x33 0x09 0x43 0x6C 0x69 0x63 0x6B // '?3?Click' 0x20 0x74 0x68 0x65 0x20 0x61 0x63 0x74 // ' the act' 0x69 0x6F 0x6E 0x20 0x79 0x6F 0x75 0x20 // 'ion you ' 0x77 0x61 0x6E 0x74 0x2C 0x20 0x74 0x68 // 'want, th' 0x65 0x6E 0x20 0x63 0x6C 0x69 0x63 0x6B // 'en click' 0x20 0x4F 0x4B 0x2E 0x0D 0x0A 0x54 0x68 // ' OK.??Th' 0x65 0x20 0x61 0x63 0x74 0x69 0x6F 0x6E // 'e action' 0x20 0x69 0x73 0x20 0x63 0x68 0x61 0x6E // ' is chan' 0x67 0x65 0x64 0x20 0x66 0x72 0x6F 0x6D // 'ged from' 0x20 0x74 0x68 0x65 0x20 0x63 0x75 0x72 // ' the cur' 0x72 0x65 0x6E 0x74 0x20 0x66 0x72 0x61 // 'rent fra' 0x6D 0x65 0x20 0x66 0x6F 0x72 0x77 0x61 // 'me forwa' 0x72 0x64 0x2E // 'rd.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_8A= ktpcHowToActors8A #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8A, __HELP_NAME("Blank")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8A, __HELP_NAME("Blank")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon0 kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 kwavHTActors8A ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_8A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8A, 0x0) GST(0) ITEM "kgobCalloutBalloon0" ITEM "ktpcHowToActors8A" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTActors8A" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_8A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x65 0x00 0x00 0x00 // '????e???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_8A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_8A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8A, 0x0) BYTE 0x03 0x03 0x42 0x6C 0x61 0x6E 0x6B // '??Blank' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_8B= ktpcHowToActors8B #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8B, __HELP_NAME("Def: rewind")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8B, __HELP_NAME("Def: rewind")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTActors8B ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8B, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToActors8B" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTActors8B" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x5D 0x01 0x00 0x00 // '????]???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_24=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3E, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpFrameSlider __HELP_SYMBOL( STN "mbmpFrameSlider" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSceneSlider __HELP_SYMBOL( STN "mbmpSceneSlider" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_3E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xA9 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x06 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x08 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0xA9 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x08 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x42 0x00 0x00 0x80 // '????B??' 0x00 0x00 0x03 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x77 0x00 0x00 0x82 // '????w??' 0x00 0x00 0x00 0x00 0x42 0x00 0x00 0xC0 // '????B??' 0x01 0x00 0x00 0x00 0x45 0x00 0x00 0xC0 // '????E??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3E, 0x0) BYTE 0x03 0x03 0x72 0x65 0x77 0x69 0x6E 0x64 // '??rewind' 0x0D 0x0A 0x95 0x09 0x54 0x6F 0x20 0x72 // '???To r' 0x65 0x77 0x69 0x6E 0x64 0x20 0x79 0x6F // 'ewind yo' 0x75 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 // 'ur movie' 0x2C 0x20 0x75 0x73 0x65 0x20 0x74 0x68 // ', use th' 0x65 0x20 0x46 0x72 0x61 0x6D 0x65 0x20 // 'e Frame ' 0x61 0x6E 0x64 0x20 0x53 0x63 0x65 0x6E // 'and Scen' 0x65 0x20 0x53 0x6C 0x69 0x64 0x65 0x72 // 'e Slider' 0x73 0x2E 0x0D 0x0A 0x01 0x0D 0x0A 0x01 // 's.??????' 0x0D 0x0A 0x54 0x6F 0x20 0x6D 0x6F 0x76 // '??To mov' 0x65 0x20 0x77 0x69 0x74 0x68 0x69 0x6E // 'e within' 0x20 0x61 0x20 0x73 0x63 0x65 0x6E 0x65 // ' a scene' 0x2C 0x20 0x75 0x73 0x65 0x20 0x74 0x68 // ', use th' 0x65 0x20 0x46 0x72 0x61 0x6D 0x65 0x20 // 'e Frame ' 0x53 0x6C 0x69 0x64 0x65 0x72 0x2E 0x0D // 'Slider.?' 0x0A 0x54 0x6F 0x20 0x6D 0x6F 0x76 0x65 // '?To move' 0x20 0x66 0x72 0x6F 0x6D 0x20 0x73 0x63 // ' from sc' 0x65 0x6E 0x65 0x20 0x74 0x6F 0x20 0x73 // 'ene to s' 0x63 0x65 0x6E 0x65 0x2C 0x20 0x75 0x73 // 'cene, us' 0x65 0x20 0x74 0x68 0x65 0x20 0x53 0x63 // 'e the Sc' 0x65 0x6E 0x65 0x20 0x53 0x6C 0x69 0x64 // 'ene Slid' 0x65 0x72 0x2E // 'er.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_8C= ktpcHowToActors8C #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8C, __HELP_NAME("Def: Play button")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8C, __HELP_NAME("Def: Play button")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTActors8C ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8C, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToActors8C" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTActors8C" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x4A 0x00 0x00 0x00 // '????J???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_57=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2E, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpPlay __HELP_SYMBOL( STN "mbmpPlay" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_2E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0E 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x0D 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x0D 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2E, 0x0) BYTE 0x03 0x03 0x50 0x6C 0x61 0x79 0x20 0x62 // '??Play b' 0x75 0x74 0x74 0x6F 0x6E 0x0D 0x0A 0x01 // 'utton???' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_8D= ktpcHowToActors8D #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8D, __HELP_NAME("Tip: Select Object Behind")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8D, __HELP_NAME("Tip: Select Object Behind")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTActors8D ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8D, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToActors8D" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTActors8D" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x23 0x01 0x00 0x00 // '????#???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_4E=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2B, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_2B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x26 0x00 0x00 0x01 // '????&???' 0x00 0x00 0x00 0x00 0x28 0x00 0x00 0x01 // '????(???' 0x01 0x00 0x00 0x00 0x4A 0x00 0x00 0x01 // '????J???' 0x00 0x00 0x00 0x00 0x4C 0x00 0x00 0x01 // '????L???' 0x01 0x00 0x00 0x00 0xA8 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x28 0x00 0x00 0x03 // '????(???' 0x0A 0x00 0x00 0xFD 0x4A 0x00 0x00 0x03 // '???J???' 0x00 0x00 0x00 0x00 0x4C 0x00 0x00 0x80 // '????L??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x4C 0x00 0x00 0x82 // '????L??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2B, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x20 0x53 0x65 // '??? Se' 0x6C 0x65 0x63 0x74 0x69 0x6E 0x67 0x20 // 'lecting ' 0x61 0x6E 0x20 0x6F 0x62 0x6A 0x65 0x63 // 'an objec' 0x74 0x20 0x62 0x65 0x68 0x69 0x6E 0x64 // 't behind' 0x20 0x61 0x6E 0x6F 0x74 0x68 0x65 0x72 // ' another' 0x0D 0x0A 0x54 0x6F 0x20 0x73 0x65 0x6C // '??To sel' 0x65 0x63 0x74 0x20 0x61 0x6E 0x20 0x6F // 'ect an o' 0x62 0x6A 0x65 0x63 0x74 0x20 0x62 0x65 // 'bject be' 0x68 0x69 0x6E 0x64 0x20 0x61 0x6E 0x6F // 'hind ano' 0x74 0x68 0x65 0x72 0x0D 0x0A 0x95 0x09 // 'ther???' 0x43 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 // 'Click th' 0x65 0x20 0x6F 0x62 0x6A 0x65 0x63 0x74 // 'e object' 0x27 0x73 0x20 0x70 0x69 0x63 0x74 0x75 // ''s pictu' 0x72 0x65 0x20 0x69 0x6E 0x20 0x74 0x68 // 're in th' 0x65 0x20 0x41 0x63 0x74 0x6F 0x72 0x20 // 'e Actor ' 0x6F 0x72 0x20 0x50 0x72 0x6F 0x70 0x20 // 'or Prop ' 0x4C 0x69 0x73 0x74 0x2D 0x2D 0x6C 0x6F // 'List--lo' 0x63 0x61 0x74 0x65 0x64 0x20 0x6F 0x6E // 'cated on' 0x20 0x65 0x69 0x74 0x68 0x65 0x72 0x20 // ' either ' 0x73 0x69 0x64 0x65 0x20 0x6F 0x66 0x20 // 'side of ' 0x74 0x68 0x65 0x20 0x73 0x74 0x61 0x67 // 'the stag' 0x65 0x2E // 'e.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_8E= ktpcHowToActors8E #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8E, __HELP_NAME("Tip: Select Object Out View")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8E, __HELP_NAME("Tip: Select Object Out View")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTActors8E ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_56=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8E, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToActors8E" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTActors8E" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_56=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x49 0x01 0x00 0x00 // '????I???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_38=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_56, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_56=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_56, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x11 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x23 0x00 0x00 0x01 // '????#???' 0x00 0x00 0x00 0x00 0x25 0x00 0x00 0x01 // '????%???' 0x01 0x00 0x00 0x00 0x44 0x00 0x00 0x01 // '????D???' 0x00 0x00 0x00 0x00 0x46 0x00 0x00 0x01 // '????F???' 0x01 0x00 0x00 0x00 0x2D 0x01 0x00 0x01 // '????-???' 0x00 0x00 0x00 0x00 0x25 0x00 0x00 0x03 // '????%???' 0x0A 0x00 0x00 0xFD 0x44 0x00 0x00 0x03 // '???D???' 0x00 0x00 0x00 0x00 0xA4 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0xC2 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0xC6 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x2D 0x01 0x00 0x03 // '???-???' 0x00 0x00 0x00 0x00 0x46 0x00 0x00 0x80 // '????F??' 0x00 0x00 0x02 0x00 0xA4 0x00 0x00 0x80 // '??????' 0x00 0x00 0x03 0x00 0xC4 0x00 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_56=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_56, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x20 0x53 0x65 // '??? Se' 0x6C 0x65 0x63 0x74 0x69 0x6E 0x67 0x20 // 'lecting ' 0x61 0x6E 0x20 0x6F 0x62 0x6A 0x65 0x63 // 'an objec' 0x74 0x20 0x6F 0x75 0x74 0x20 0x6F 0x66 // 't out of' 0x20 0x76 0x69 0x65 0x77 0x0D 0x0A 0x54 // ' view??T' 0x6F 0x20 0x73 0x65 0x6C 0x65 0x63 0x74 // 'o select' 0x20 0x61 0x6E 0x20 0x6F 0x62 0x6A 0x65 // ' an obje' 0x63 0x74 0x20 0x6F 0x75 0x74 0x20 0x6F // 'ct out o' 0x66 0x20 0x76 0x69 0x65 0x77 0x0D 0x0A // 'f view??' 0x31 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 // '1?Click ' 0x74 0x68 0x65 0x20 0x6F 0x62 0x6A 0x65 // 'the obje' 0x63 0x74 0x27 0x73 0x20 0x70 0x69 0x63 // 'ct's pic' 0x74 0x75 0x72 0x65 0x20 0x69 0x6E 0x20 // 'ture in ' 0x74 0x68 0x65 0x20 0x41 0x63 0x74 0x6F // 'the Acto' 0x72 0x20 0x6F 0x72 0x20 0x50 0x72 0x6F // 'r or Pro' 0x70 0x20 0x4C 0x69 0x73 0x74 0x2D 0x2D // 'p List--' 0x6C 0x6F 0x63 0x61 0x74 0x65 0x64 0x20 // 'located ' 0x6F 0x6E 0x20 0x65 0x69 0x74 0x68 0x65 // 'on eithe' 0x72 0x20 0x73 0x69 0x64 0x65 0x20 0x6F // 'r side o' 0x66 0x20 0x74 0x68 0x65 0x20 0x73 0x74 // 'f the st' 0x61 0x67 0x65 0x2E 0x0D 0x0A 0x54 0x68 // 'age.??Th' 0x65 0x20 0x6F 0x62 0x6A 0x65 0x63 0x74 // 'e object' 0x20 0x72 0x65 0x61 0x70 0x70 0x65 0x61 // ' reappea' 0x72 0x73 0x20 0x6F 0x6E 0x2D 0x73 0x74 // 'rs on-st' 0x61 0x67 0x65 0x2E 0x0D 0x0A 0x32 0x09 // 'age.??2?' 0x54 0x6F 0x20 0x70 0x6F 0x73 0x69 0x74 // 'To posit' 0x69 0x6F 0x6E 0x20 0x74 0x68 0x65 0x20 // 'ion the ' 0x6F 0x62 0x6A 0x65 0x63 0x74 0x2C 0x20 // 'object, ' 0x6D 0x6F 0x76 0x65 0x20 0x74 0x68 0x65 // 'move the' 0x20 0x6D 0x6F 0x75 0x73 0x65 0x20 0x75 // ' mouse u' 0x6E 0x74 0x69 0x6C 0x20 0x79 0x6F 0x75 // 'ntil you' 0x20 0x66 0x69 0x6E 0x64 0x20 0x74 0x68 // ' find th' 0x65 0x20 0x70 0x6C 0x61 0x63 0x65 0x20 // 'e place ' 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 // 'you want' 0x20 0x74 0x6F 0x20 0x70 0x75 0x74 0x20 // ' to put ' 0x74 0x68 0x65 0x20 0x6F 0x62 0x6A 0x65 // 'the obje' 0x63 0x74 0x2C 0x20 0x74 0x68 0x65 0x6E // 'ct, then' 0x20 0x63 0x6C 0x69 0x63 0x6B 0x2E // ' click.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_8F= ktpcHowToActors8F #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8F, __HELP_NAME("Tip: Shrink Grow Over Time")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8F, __HELP_NAME("Tip: Shrink Grow Over Time")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTActors8F ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_81=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8F, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToActors8F" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTActors8F" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_81=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x37 0x01 0x00 0x00 // '????7???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1A=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_81, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpActorActions __HELP_SYMBOL( STN "mbmpActorActions" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_81=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_81, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0F 0x00 0x00 0x00 0x02 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x21 0x00 0x00 0x01 // '????!???' 0x00 0x00 0x00 0x00 0x23 0x00 0x00 0x01 // '????#???' 0x01 0x00 0x00 0x00 0x48 0x00 0x00 0x01 // '????H???' 0x00 0x00 0x00 0x00 0x4A 0x00 0x00 0x01 // '????J???' 0x01 0x00 0x00 0x00 0x98 0x00 0x00 0x01 // '???????' 0x01 0xF6 0x00 0x00 0xA8 0x00 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0x9D 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x23 0x00 0x00 0x03 // '????#???' 0x0A 0x00 0x00 0xFD 0x48 0x00 0x00 0x03 // '???H???' 0x00 0x00 0x00 0x00 0x4A 0x00 0x00 0x80 // '????J??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x22 0x01 0x00 0x82 // '????"??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0xA8 0x00 0x00 0xC0 // '??????' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_81=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_81, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x53 0x68 0x72 // '??? Shr' 0x69 0x6E 0x6B 0x69 0x6E 0x67 0x20 0x6F // 'inking o' 0x72 0x20 0x67 0x72 0x6F 0x77 0x69 0x6E // 'r growin' 0x67 0x20 0x6F 0x76 0x65 0x72 0x20 0x74 // 'g over t' 0x69 0x6D 0x65 0x0D 0x0A 0x54 0x6F 0x20 // 'ime??To ' 0x73 0x68 0x72 0x69 0x6E 0x6B 0x20 0x6F // 'shrink o' 0x72 0x20 0x67 0x72 0x6F 0x77 0x20 0x61 // 'r grow a' 0x6E 0x20 0x6F 0x62 0x6A 0x65 0x63 0x74 // 'n object' 0x20 0x6F 0x76 0x65 0x72 0x20 0x74 0x69 // ' over ti' 0x6D 0x65 0x0D 0x0A 0x31 0x09 0x47 0x6F // 'me??1?Go' 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 // ' to the ' 0x70 0x6C 0x61 0x63 0x65 0x20 0x69 0x6E // 'place in' 0x20 0x79 0x6F 0x75 0x72 0x20 0x6D 0x6F // ' your mo' 0x76 0x69 0x65 0x20 0x77 0x68 0x65 0x72 // 'vie wher' 0x65 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 // 'e you wa' 0x6E 0x74 0x20 0x74 0x6F 0x20 0x73 0x68 // 'nt to sh' 0x72 0x69 0x6E 0x6B 0x20 0x6F 0x72 0x20 // 'rink or ' 0x67 0x72 0x6F 0x77 0x20 0x74 0x68 0x65 // 'grow the' 0x20 0x6F 0x62 0x6A 0x65 0x63 0x74 0x2E // ' object.' 0x0D 0x0A 0x32 0x09 0x43 0x6C 0x69 0x63 // '??2?Clic' 0x6B 0x20 0x41 0x63 0x74 0x69 0x6F 0x6E // 'k Action' 0x73 0x2D 0x01 0x0D 0x0A 0x33 0x09 0x43 // 's-???3?C' 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 // 'lick the' 0x20 0x61 0x63 0x74 0x6F 0x72 0x2C 0x20 // ' actor, ' 0x70 0x72 0x6F 0x70 0x2C 0x20 0x6F 0x72 // 'prop, or' 0x20 0x33 0x44 0x20 0x77 0x6F 0x72 0x64 // ' 3D word' 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E // ' you wan' 0x74 0x20 0x74 0x6F 0x20 0x73 0x68 0x72 // 't to shr' 0x69 0x6E 0x6B 0x20 0x6F 0x72 0x20 0x67 // 'ink or g' 0x72 0x6F 0x77 0x20 0x6F 0x76 0x65 0x72 // 'row over' 0x20 0x74 0x69 0x6D 0x65 0x2E 0x0D 0x0A // ' time.??' 0x34 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 // '4?Click ' 0x22 0x53 0x68 0x72 0x69 0x6E 0x6B 0x22 // '"Shrink"' 0x20 0x6F 0x72 0x20 0x22 0x47 0x72 0x6F // ' or "Gro' 0x77 0x2C 0x22 0x20 0x74 0x68 0x65 0x6E // 'w," then' 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 0x4F // ' click O' 0x4B 0x2E 0x0D 0x0A 0x35 0x09 0x4D 0x6F // 'K.??5?Mo' 0x76 0x65 0x20 0x74 0x68 0x65 0x20 0x6D // 've the m' 0x6F 0x75 0x73 0x65 0x20 0x63 0x75 0x72 // 'ouse cur' 0x73 0x6F 0x72 0x20 0x6F 0x76 0x65 0x72 // 'sor over' 0x20 0x74 0x68 0x65 0x20 0x33 0x44 0x20 // ' the 3D ' 0x6F 0x62 0x6A 0x65 0x63 0x74 0x2C 0x20 // 'object, ' 0x74 0x68 0x65 0x6E 0x20 0x68 0x6F 0x6C // 'then hol' 0x64 0x20 0x64 0x6F 0x77 0x6E 0x20 0x74 // 'd down t' 0x68 0x65 0x20 0x6D 0x6F 0x75 0x73 0x65 // 'he mouse' 0x20 0x62 0x75 0x74 0x74 0x6F 0x6E 0x20 // ' button ' 0x61 0x6E 0x64 0x20 0x77 0x61 0x69 0x74 // 'and wait' 0x20 0x75 0x6E 0x74 0x69 0x6C 0x20 0x74 // ' until t' 0x68 0x65 0x20 0x6F 0x62 0x6A 0x65 0x63 // 'he objec' 0x74 0x20 0x69 0x73 0x20 0x74 0x68 0x65 // 't is the' 0x20 0x73 0x69 0x7A 0x65 0x20 0x79 0x6F // ' size yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x2E // 'u want.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_90= ktpcHowToActors90 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_90, __HELP_NAME("Tip: Squash Stretch Over Time")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_90, __HELP_NAME("Tip: Squash Stretch Over Time")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTActors90 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_90, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToActors90" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTActors90" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_90, 0x0) BYTE 0x01 0x00 0x03 0x03 0x37 0x01 0x00 0x00 // '????7???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_17=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpActorActions __HELP_SYMBOL( STN "mbmpActorActions" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_1=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0F 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x25 0x00 0x00 0x01 // '????%???' 0x00 0x00 0x00 0x00 0x27 0x00 0x00 0x01 // '????'???' 0x01 0x00 0x00 0x00 0x4F 0x00 0x00 0x01 // '????O???' 0x00 0x00 0x00 0x00 0x51 0x00 0x00 0x01 // '????Q???' 0x01 0x00 0x00 0x00 0xA2 0x00 0x00 0x01 // '???????' 0x01 0xFB 0x00 0x00 0xB2 0x00 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0xAD 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x27 0x00 0x00 0x03 // '????'???' 0x0A 0x00 0x00 0xFD 0x4F 0x00 0x00 0x03 // '???O???' 0x00 0x00 0x00 0x00 0x51 0x00 0x00 0x80 // '????Q??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x32 0x01 0x00 0x82 // '????2??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0xB2 0x00 0x00 0xC0 // '??????' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x20 0x53 0x71 // '??? Sq' 0x75 0x61 0x73 0x68 0x69 0x6E 0x67 0x20 // 'uashing ' 0x6F 0x72 0x20 0x73 0x74 0x72 0x65 0x74 // 'or stret' 0x63 0x68 0x69 0x6E 0x67 0x20 0x6F 0x76 // 'ching ov' 0x65 0x72 0x20 0x74 0x69 0x6D 0x65 0x0D // 'er time?' 0x0A 0x54 0x6F 0x20 0x73 0x71 0x75 0x61 // '?To squa' 0x73 0x68 0x20 0x6F 0x72 0x20 0x73 0x74 // 'sh or st' 0x72 0x65 0x74 0x63 0x68 0x20 0x61 0x6E // 'retch an' 0x20 0x6F 0x62 0x6A 0x65 0x63 0x74 0x20 // ' object ' 0x6F 0x76 0x65 0x72 0x20 0x74 0x69 0x6D // 'over tim' 0x65 0x0D 0x0A 0x31 0x09 0x47 0x6F 0x20 // 'e??1?Go ' 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 0x70 // 'to the p' 0x6C 0x61 0x63 0x65 0x20 0x69 0x6E 0x20 // 'lace in ' 0x79 0x6F 0x75 0x72 0x20 0x6D 0x6F 0x76 // 'your mov' 0x69 0x65 0x20 0x77 0x68 0x65 0x72 0x65 // 'ie where' 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E // ' you wan' 0x74 0x20 0x74 0x6F 0x20 0x73 0x71 0x75 // 't to squ' 0x61 0x73 0x68 0x20 0x6F 0x72 0x20 0x73 // 'ash or s' 0x74 0x72 0x65 0x74 0x63 0x68 0x20 0x74 // 'tretch t' 0x68 0x65 0x20 0x6F 0x62 0x6A 0x65 0x63 // 'he objec' 0x74 0x2E 0x0D 0x0A 0x32 0x09 0x43 0x6C // 't.??2?Cl' 0x69 0x63 0x6B 0x20 0x41 0x63 0x74 0x69 // 'ick Acti' 0x6F 0x6E 0x73 0x2D 0x01 0x0D 0x0A 0x33 // 'ons-???3' 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 0x74 // '?Click t' 0x68 0x65 0x20 0x61 0x63 0x74 0x6F 0x72 // 'he actor' 0x2C 0x20 0x70 0x72 0x6F 0x70 0x2C 0x20 // ', prop, ' 0x6F 0x72 0x20 0x33 0x44 0x20 0x77 0x6F // 'or 3D wo' 0x72 0x64 0x20 0x79 0x6F 0x75 0x20 0x77 // 'rd you w' 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 0x73 // 'ant to s' 0x71 0x75 0x61 0x73 0x68 0x20 0x6F 0x72 // 'quash or' 0x20 0x73 0x74 0x72 0x65 0x74 0x63 0x68 // ' stretch' 0x20 0x6F 0x76 0x65 0x72 0x20 0x74 0x69 // ' over ti' 0x6D 0x65 0x2E 0x0D 0x0A 0x34 0x09 0x43 // 'me.??4?C' 0x6C 0x69 0x63 0x6B 0x20 0x22 0x53 0x71 // 'lick "Sq' 0x75 0x61 0x73 0x68 0x22 0x20 0x6F 0x72 // 'uash" or' 0x20 0x22 0x53 0x74 0x72 0x65 0x74 0x63 // ' "Stretc' 0x68 0x2C 0x22 0x20 0x74 0x68 0x65 0x6E // 'h," then' 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 0x4F // ' click O' 0x4B 0x2E 0x0D 0x0A 0x35 0x09 0x4D 0x6F // 'K.??5?Mo' 0x76 0x65 0x20 0x74 0x68 0x65 0x20 0x6D // 've the m' 0x6F 0x75 0x73 0x65 0x20 0x63 0x75 0x72 // 'ouse cur' 0x73 0x6F 0x72 0x20 0x6F 0x76 0x65 0x72 // 'sor over' 0x20 0x74 0x68 0x65 0x20 0x33 0x44 0x20 // ' the 3D ' 0x6F 0x62 0x6A 0x65 0x63 0x74 0x2C 0x20 // 'object, ' 0x74 0x68 0x65 0x6E 0x20 0x68 0x6F 0x6C // 'then hol' 0x64 0x20 0x64 0x6F 0x77 0x6E 0x20 0x74 // 'd down t' 0x68 0x65 0x20 0x6D 0x6F 0x75 0x73 0x65 // 'he mouse' 0x20 0x62 0x75 0x74 0x74 0x6F 0x6E 0x20 // ' button ' 0x61 0x6E 0x64 0x20 0x77 0x61 0x69 0x74 // 'and wait' 0x20 0x75 0x6E 0x74 0x69 0x6C 0x20 0x74 // ' until t' 0x68 0x65 0x20 0x6F 0x62 0x6A 0x65 0x63 // 'he objec' 0x74 0x20 0x69 0x73 0x20 0x74 0x68 0x65 // 't is the' 0x20 0x73 0x69 0x7A 0x65 0x20 0x79 0x6F // ' size yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x2E // 'u want.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_91= ktpcHowToActors91 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_91, __HELP_NAME("CO 2) Click Resume Last")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_91, __HELP_NAME("CO 2) Click Resume Last")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence kidActorsContinue kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTActors91 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_91, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcHowToActors91" ITEM "kgobHowtoSequence" ITEM "kidActorsContinue" ITEM "kidPlayHelpSounds" ITEM "kwavHTActors91" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_91, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA1 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x05 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x07 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1A 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x07 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x19 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2D, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x20 0x52 0x65 0x73 0x75 0x6D 0x65 0x20 // ' Resume ' 0x4C 0x61 0x73 0x74 0x20 0x41 0x63 0x74 // 'Last Act' 0x69 0x6F 0x6E 0x2E // 'ion.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_92= ktpcHowToActors92 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_92, __HELP_NAME("Tip: Path through ground")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_92, __HELP_NAME("Tip: Path through ground")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTActors92 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_85=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_92, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToActors92" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTActors92" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_85=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_92, 0x0) BYTE 0x01 0x00 0x03 0x03 0x2C 0x01 0x00 0x00 // '????,???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_4=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_85, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpActorsGround __HELP_SYMBOL( STN "mbmpActorsGround" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_85=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_85, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x10 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x24 0x00 0x00 0x01 // '????$???' 0x00 0x00 0x00 0x00 0x26 0x00 0x00 0x01 // '????&???' 0x01 0x00 0x00 0x00 0x63 0x00 0x00 0x01 // '????c???' 0x00 0x00 0x00 0x00 0x65 0x00 0x00 0x01 // '????e???' 0x01 0xF6 0x00 0x00 0x90 0x00 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0x1D 0x01 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x26 0x00 0x00 0x03 // '????&???' 0x0A 0x00 0x00 0xFD 0x63 0x00 0x00 0x03 // '???c???' 0x00 0x00 0x00 0x00 0x65 0x00 0x00 0x80 // '????e??' 0x00 0x00 0x02 0x00 0x93 0x00 0x00 0x80 // '??????' 0x00 0x00 0x03 0x00 0xC9 0x00 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xC9 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x02 0x00 0x00 0x00 0x90 0x00 0x00 0xC0 // '??????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_85=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_85, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x4D 0x6F 0x76 // '??? Mov' 0x69 0x6E 0x67 0x20 0x74 0x68 0x72 0x6F // 'ing thro' 0x75 0x67 0x68 0x20 0x74 0x68 0x65 0x20 // 'ugh the ' 0x67 0x72 0x6F 0x75 0x6E 0x64 0x20 0x73 // 'ground s' 0x75 0x72 0x66 0x61 0x63 0x65 0x0D 0x0A // 'urface??' 0x54 0x6F 0x20 0x6D 0x6F 0x76 0x65 0x20 // 'To move ' 0x61 0x6E 0x20 0x61 0x63 0x74 0x6F 0x72 // 'an actor' 0x2C 0x20 0x70 0x72 0x6F 0x70 0x2C 0x20 // ', prop, ' 0x6F 0x72 0x20 0x33 0x44 0x20 0x77 0x6F // 'or 3D wo' 0x72 0x64 0x20 0x74 0x68 0x72 0x6F 0x75 // 'rd throu' 0x67 0x68 0x20 0x74 0x68 0x65 0x20 0x67 // 'gh the g' 0x72 0x6F 0x75 0x6E 0x64 0x20 0x73 0x75 // 'round su' 0x72 0x66 0x61 0x63 0x65 0x0D 0x0A 0x31 // 'rface??1' 0x09 0x22 0x54 0x75 0x72 0x6E 0x20 0x6F // '?"Turn o' 0x6E 0x22 0x20 0x74 0x68 0x65 0x20 0x46 // 'n" the F' 0x61 0x6C 0x6C 0x20 0x54 0x68 0x72 0x6F // 'all Thro' 0x75 0x67 0x68 0x20 0x47 0x72 0x6F 0x75 // 'ugh Grou' 0x6E 0x64 0x20 0x62 0x75 0x74 0x74 0x6F // 'nd butto' 0x6E 0x2D 0x01 0x0D 0x0A 0x57 0x68 0x65 // 'n-???Whe' 0x6E 0x20 0x22 0x6F 0x6E 0x2C 0x22 0x20 // 'n "on," ' 0x74 0x68 0x65 0x20 0x62 0x75 0x74 0x74 // 'the butt' 0x6F 0x6E 0x20 0x69 0x73 0x20 0x70 0x75 // 'on is pu' 0x73 0x68 0x65 0x64 0x20 0x69 0x6E 0x20 // 'shed in ' 0x61 0x6E 0x64 0x20 0x69 0x74 0x20 0x6C // 'and it l' 0x69 0x67 0x68 0x74 0x73 0x20 0x75 0x70 // 'ights up' 0x2E 0x0D 0x0A 0x32 0x09 0x48 0x6F 0x6C // '.??2?Hol' 0x64 0x20 0x64 0x6F 0x77 0x6E 0x20 0x74 // 'd down t' 0x68 0x65 0x20 0x44 0x6F 0x77 0x6E 0x20 // 'he Down ' 0x41 0x72 0x72 0x6F 0x77 0x20 0x6B 0x65 // 'Arrow ke' 0x79 0x20 0x61 0x73 0x20 0x79 0x6F 0x75 // 'y as you' 0x20 0x64 0x72 0x61 0x67 0x20 0x74 0x68 // ' drag th' 0x65 0x20 0x33 0x44 0x20 0x6F 0x62 0x6A // 'e 3D obj' 0x65 0x63 0x74 0x20 0x74 0x68 0x72 0x6F // 'ect thro' 0x75 0x67 0x68 0x20 0x74 0x68 0x65 0x20 // 'ugh the ' 0x67 0x72 0x6F 0x75 0x6E 0x64 0x20 0x73 // 'ground s' 0x75 0x72 0x66 0x61 0x63 0x65 0x2E // 'urface.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_93= ktpcHowToActors93 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_93, __HELP_NAME("Def: Go to the place")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_93, __HELP_NAME("Def: Go to the place")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTActors93 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_50=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_93, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToActors93" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTActors93" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_50=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_93, 0x0) BYTE 0x01 0x00 0x03 0x03 0x36 0x01 0x00 0x00 // '????6???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_23=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_50, 0x0) AG(4) ITEM LONG 0x2000002 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpFrameSlider __HELP_SYMBOL( STN "mbmpFrameSlider" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSceneSlider __HELP_SYMBOL( STN "mbmpSceneSlider" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_50=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_50, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x13 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0F 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x4D 0x01 0x00 0x01 // '????M???' 0x00 0x00 0x00 0x00 0x5C 0x00 0x00 0x02 // '????\???' 0x01 0x00 0x00 0x00 0x62 0x00 0x00 0x02 // '????b???' 0x00 0x00 0x00 0x00 0xF2 0x00 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0xF8 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x3D 0x00 0x00 0x03 // '???=???' 0x00 0x00 0x00 0x00 0xB9 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xD4 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x59 0x00 0x00 0x80 // '????Y??' 0x00 0x00 0x03 0x00 0xB9 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0xEF 0x00 0x00 0x80 // '??????' 0x00 0x00 0x03 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xF2 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x59 0x00 0x00 0xC0 // '????Y??' 0x02 0x00 0x00 0x00 0xEF 0x00 0x00 0xC0 // '??????' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_50=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_50, 0x0) BYTE 0x03 0x03 0x47 0x6F 0x20 0x74 0x6F 0x20 // '??Go to ' 0x74 0x68 0x65 0x20 0x70 0x6C 0x61 0x63 // 'the plac' 0x65 0x0D 0x0A 0x54 0x6F 0x20 0x6D 0x6F // 'e??To mo' 0x76 0x65 0x20 0x66 0x6F 0x72 0x77 0x61 // 've forwa' 0x72 0x64 0x73 0x20 0x6F 0x72 0x20 0x62 // 'rds or b' 0x61 0x63 0x6B 0x77 0x61 0x72 0x64 0x73 // 'ackwards' 0x20 0x77 0x69 0x74 0x68 0x69 0x6E 0x20 // ' within ' 0x61 0x20 0x73 0x63 0x65 0x6E 0x65 0x0D // 'a scene?' 0x0A 0x95 0x09 0x55 0x73 0x65 0x20 0x74 // '??Use t' 0x68 0x65 0x20 0x46 0x72 0x61 0x6D 0x65 // 'he Frame' 0x20 0x53 0x6C 0x69 0x64 0x65 0x72 0x2E // ' Slider.' 0x20 0x0D 0x0A 0x01 0x0D 0x0A 0x43 0x6C // ' ?????Cl' 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 // 'ick the ' 0x46 0x69 0x72 0x73 0x74 0x2C 0x20 0x50 // 'First, P' 0x72 0x65 0x76 0x69 0x6F 0x75 0x73 0x2C // 'revious,' 0x20 0x4E 0x65 0x78 0x74 0x2C 0x20 0x6F // ' Next, o' 0x72 0x20 0x4C 0x61 0x73 0x74 0x20 0x41 // 'r Last A' 0x72 0x72 0x6F 0x77 0x20 0x6F 0x72 0x20 // 'rrow or ' 0x64 0x72 0x61 0x67 0x20 0x74 0x68 0x65 // 'drag the' 0x20 0x73 0x6C 0x69 0x64 0x65 0x72 0x20 // ' slider ' 0x69 0x6E 0x20 0x74 0x68 0x65 0x20 0x6D // 'in the m' 0x69 0x64 0x64 0x6C 0x65 0x20 0x6F 0x66 // 'iddle of' 0x20 0x74 0x68 0x65 0x20 0x62 0x61 0x72 // ' the bar' 0x2E 0x0D 0x0A 0x54 0x6F 0x20 0x6D 0x6F // '.??To mo' 0x76 0x65 0x20 0x66 0x72 0x6F 0x6D 0x20 // 've from ' 0x73 0x63 0x65 0x6E 0x65 0x20 0x74 0x6F // 'scene to' 0x20 0x73 0x63 0x65 0x6E 0x65 0x0D 0x0A // ' scene??' 0x95 0x09 0x55 0x73 0x65 0x20 0x74 0x68 // '?Use th' 0x65 0x20 0x53 0x63 0x65 0x6E 0x65 0x20 // 'e Scene ' 0x53 0x6C 0x69 0x64 0x65 0x72 0x2E 0x0D // 'Slider.?' 0x0A 0x01 0x0D 0x0A 0x43 0x6C 0x69 0x63 // '????Clic' 0x6B 0x20 0x74 0x68 0x65 0x20 0x46 0x69 // 'k the Fi' 0x72 0x73 0x74 0x2C 0x20 0x50 0x72 0x65 // 'rst, Pre' 0x76 0x69 0x6F 0x75 0x73 0x2C 0x20 0x4E // 'vious, N' 0x65 0x78 0x74 0x2C 0x20 0x6F 0x72 0x20 // 'ext, or ' 0x4C 0x61 0x73 0x74 0x20 0x41 0x72 0x72 // 'Last Arr' 0x6F 0x77 0x20 0x6F 0x72 0x20 0x64 0x72 // 'ow or dr' 0x61 0x67 0x20 0x74 0x68 0x65 0x20 0x73 // 'ag the s' 0x6C 0x69 0x64 0x65 0x72 0x20 0x69 0x6E // 'lider in' 0x20 0x74 0x68 0x65 0x20 0x6D 0x69 0x64 // ' the mid' 0x64 0x6C 0x65 0x20 0x6F 0x66 0x20 0x74 // 'dle of t' 0x68 0x65 0x20 0x62 0x61 0x72 0x2E // 'he bar.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_94= ktpcHowToActors94 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_94, __HELP_NAME("Def: Drag")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_94, __HELP_NAME("Def: Drag")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTActors94 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_64=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_94, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToActors94" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTActors94" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_64=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_94, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_64=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_64, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x04 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xD0 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x79 0x00 0x00 0x03 // '????y???' 0x0A 0x00 0x00 0xFD 0x88 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x79 0x00 0x00 0x80 // '????y??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x79 0x00 0x00 0x82 // '????y??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_64=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_64, 0x0) BYTE 0x03 0x03 0x44 0x72 0x61 0x67 0x0D 0x0A // '??Drag??' 0x31 0x09 0x48 0x6F 0x6C 0x64 0x20 0x64 // '1?Hold d' 0x6F 0x77 0x6E 0x20 0x74 0x68 0x65 0x20 // 'own the ' 0x6D 0x6F 0x75 0x73 0x65 0x20 0x62 0x75 // 'mouse bu' 0x74 0x74 0x6F 0x6E 0x20 0x61 0x73 0x20 // 'tton as ' 0x79 0x6F 0x75 0x20 0x6D 0x6F 0x76 0x65 // 'you move' 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 // ' the mou' 0x73 0x65 0x2E 0x0D 0x0A 0x32 0x09 0x57 // 'se.??2?W' 0x68 0x65 0x6E 0x20 0x79 0x6F 0x75 0x27 // 'hen you'' 0x76 0x65 0x20 0x66 0x69 0x6E 0x69 0x73 // 've finis' 0x68 0x65 0x64 0x20 0x64 0x72 0x61 0x67 // 'hed drag' 0x67 0x69 0x6E 0x67 0x2C 0x20 0x6C 0x65 // 'ging, le' 0x74 0x20 0x67 0x6F 0x20 0x6F 0x66 0x20 // 't go of ' 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 0x73 // 'the mous' 0x65 0x20 0x62 0x75 0x74 0x74 0x6F 0x6E // 'e button' 0x2E 0x0D 0x0A 0x54 0x69 0x70 0x20 0x66 // '.??Tip f' 0x72 0x6F 0x6D 0x20 0x4D 0x63 0x5A 0x65 // 'rom McZe' 0x65 0x3A 0x20 0x20 0x59 0x6F 0x75 0x27 // 'e: You'' 0x6C 0x6C 0x20 0x67 0x65 0x74 0x20 0x74 // 'll get t' 0x68 0x65 0x20 0x62 0x65 0x73 0x74 0x20 // 'he best ' 0x72 0x65 0x73 0x75 0x6C 0x74 0x73 0x20 // 'results ' 0x69 0x66 0x20 0x79 0x6F 0x75 0x20 0x6D // 'if you m' 0x6F 0x76 0x65 0x20 0x74 0x68 0x65 0x20 // 'ove the ' 0x6D 0x6F 0x75 0x73 0x65 0x20 0x73 0x6C // 'mouse sl' 0x6F 0x77 0x6C 0x79 0x20 0x61 0x73 0x20 // 'owly as ' 0x79 0x6F 0x75 0x20 0x64 0x72 0x61 0x67 // 'you drag' 0x2E 0x20 // '. ' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK ================================================ FILE: src/help/htalerts.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ #undef __HELP_NAME #undef __HELP_SYMBOL #undef __HELP_PACK #undef __HELP_PACK2 #ifdef NO_HELP_NAMES #define __HELP_NAME(name) "" #else #define __HELP_NAME(name) name #endif #ifdef NO_HELP_SYMBOLS #define __HELP_SYMBOL(stuff) #else #define __HELP_SYMBOL(stuff) stuff #endif #ifdef PACK_HELP #define __HELP_PACK PACK #else #define __HELP_PACK #endif #ifdef HELP_SINGLE_CHUNK #define __HELP_PACK2 #else #define __HELP_PACK2 __HELP_PACK #endif SET _help_48544F50_0= No_Scene #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("No Scene")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("No Scene")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTAlert00 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "No_Scene" ITEM "kgobHowtoSequence" ITEM "" ITEM "" ITEM "kwavHTAlert00" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD5 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) AG(4) FREE ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSceneChoices __HELP_SYMBOL( STN "mbmpSceneChoices" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_2=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0B 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x40 0x00 0x00 0x01 // '????@???' 0x00 0x00 0x00 0x00 0x42 0x00 0x00 0x01 // '????B???' 0x01 0x00 0x00 0x00 0x86 0x00 0x00 0x01 // '???????' 0x01 0xF6 0x00 0x00 0x9C 0x00 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0x9D 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x40 0x00 0x00 0x03 // '???@???' 0x00 0x00 0x00 0x00 0x42 0x00 0x00 0x80 // '????B??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x9C 0x00 0x00 0xC0 // '??????' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) BYTE 0x03 0x03 0x4F 0x6F 0x70 0x73 0x21 0x20 // '??Oops! ' 0x20 0x42 0x65 0x66 0x6F 0x72 0x65 0x20 // ' Before ' 0x79 0x6F 0x75 0x20 0x63 0x61 0x6E 0x20 // 'you can ' 0x64 0x6F 0x20 0x61 0x6E 0x79 0x74 0x68 // 'do anyth' 0x69 0x6E 0x67 0x20 0x65 0x6C 0x73 0x65 // 'ing else' 0x2C 0x20 0x79 0x6F 0x75 0x20 0x6E 0x65 // ', you ne' 0x65 0x64 0x20 0x74 0x6F 0x20 0x61 0x64 // 'ed to ad' 0x64 0x20 0x61 0x20 0x73 0x63 0x65 0x6E // 'd a scen' 0x65 0x2E 0x0D 0x0A 0x31 0x09 0x49 0x66 // 'e.??1?If' 0x20 0x79 0x6F 0x75 0x20 0x73 0x65 0x65 // ' you see' 0x20 0x74 0x68 0x65 0x20 0x53 0x63 0x65 // ' the Sce' 0x6E 0x65 0x73 0x20 0x62 0x75 0x74 0x74 // 'nes butt' 0x6F 0x6E 0x20 0x61 0x74 0x20 0x74 0x68 // 'on at th' 0x65 0x20 0x74 0x6F 0x70 0x20 0x6F 0x66 // 'e top of' 0x20 0x74 0x68 0x65 0x20 0x73 0x63 0x72 // ' the scr' 0x65 0x65 0x6E 0x2C 0x20 0x63 0x6C 0x69 // 'een, cli' 0x63 0x6B 0x20 0x69 0x74 0x2E 0x0D 0x0A // 'ck it.??' 0x32 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 // '2?Click ' 0x53 0x63 0x65 0x6E 0x65 0x20 0x43 0x68 // 'Scene Ch' 0x6F 0x69 0x63 0x65 0x73 0x2D 0x01 // 'oices-?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1= No_Actor #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("No Actor")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("No Actor")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTAlert01 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_0=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "No_Actor" ITEM "kgobHowtoSequence" ITEM "" ITEM "" ITEM "kwavHTAlert01" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0xF5 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_0=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpActorsBrowser __HELP_SYMBOL( STN "mbmpActorsBrowser" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpActorsPropBrowser __HELP_SYMBOL( STN "mbmpActorsPropBrowser" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpActorsSpletters __HELP_SYMBOL( STN "mbmpActorsSpletters" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_1=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x19 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x50 0x00 0x00 0x01 // '????P???' 0x00 0x00 0x00 0x00 0x52 0x00 0x00 0x01 // '????R???' 0x01 0x00 0x00 0x00 0xA0 0x00 0x00 0x01 // '???????' 0x05 0x00 0x00 0x00 0xA2 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xAA 0x00 0x00 0x01 // '???????' 0x05 0x00 0x00 0x00 0xAF 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xB1 0x00 0x00 0x01 // '???????' 0x01 0xF1 0x00 0x00 0xC1 0x00 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0xC4 0x00 0x00 0x01 // '???????' 0x01 0xF1 0x00 0x00 0xD3 0x00 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0xD6 0x00 0x00 0x01 // '???????' 0x01 0xF1 0x00 0x00 0xE9 0x00 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0xEA 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x50 0x00 0x00 0x03 // '???P???' 0x00 0x00 0x00 0x00 0x63 0x00 0x00 0x03 // '????c???' 0x0F 0x00 0x00 0xFD 0x9C 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0xF7 0xFF 0x00 0x00 0x52 0x00 0x00 0x80 // '??R??' 0x00 0x00 0x02 0x00 0xB1 0x00 0x00 0x80 // '??????' 0x00 0x00 0x03 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xC1 0x00 0x00 0xC0 // '??????' 0x01 0x00 0x00 0x00 0xD3 0x00 0x00 0xC0 // '??????' 0x02 0x00 0x00 0x00 0xE9 0x00 0x00 0xC0 // '??????' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x03 0x03 0x4F 0x6F 0x70 0x73 0x21 0x20 // '??Oops! ' 0x20 0x42 0x65 0x66 0x6F 0x72 0x65 0x20 // ' Before ' 0x79 0x6F 0x75 0x20 0x63 0x61 0x6E 0x20 // 'you can ' 0x75 0x73 0x65 0x20 0x74 0x68 0x69 0x73 // 'use this' 0x20 0x74 0x6F 0x6F 0x6C 0x2C 0x20 0x79 // ' tool, y' 0x6F 0x75 0x20 0x6E 0x65 0x65 0x64 0x20 // 'ou need ' 0x74 0x6F 0x20 0x61 0x64 0x64 0x20 0x61 // 'to add a' 0x6E 0x20 0x61 0x63 0x74 0x6F 0x72 0x2C // 'n actor,' 0x20 0x70 0x72 0x6F 0x70 0x2C 0x20 0x6F // ' prop, o' 0x72 0x20 0x33 0x44 0x20 0x77 0x6F 0x72 // 'r 3D wor' 0x64 0x2E 0x0D 0x0A 0x31 0x09 0x49 0x66 // 'd.??1?If' 0x20 0x79 0x6F 0x75 0x20 0x73 0x65 0x65 // ' you see' 0x20 0x74 0x68 0x65 0x20 0x41 0x63 0x74 // ' the Act' 0x6F 0x72 0x73 0x20 0x26 0x20 0x50 0x72 // 'ors & Pr' 0x6F 0x70 0x73 0x20 0x62 0x75 0x74 0x74 // 'ops butt' 0x6F 0x6E 0x20 0x61 0x74 0x20 0x74 0x68 // 'on at th' 0x65 0x20 0x74 0x6F 0x70 0x20 0x6F 0x66 // 'e top of' 0x20 0x74 0x68 0x65 0x20 0x73 0x63 0x72 // ' the scr' 0x65 0x65 0x6E 0x2C 0x20 0x63 0x6C 0x69 // 'een, cli' 0x63 0x6B 0x20 0x69 0x74 0x2E 0x0D 0x0A // 'ck it.??' 0x32 0x09 0x54 0x6F 0x09 0x09 0x09 0x09 // '2?To????' 0x09 0x09 0x09 0x09 0x43 0x6C 0x69 0x63 // '????Clic' 0x6B 0x0D 0x0A 0x41 0x64 0x64 0x20 0x61 // 'k??Add a' 0x6E 0x20 0x61 0x63 0x74 0x6F 0x72 0x09 // 'n actor?' 0x09 0x09 0x09 0x01 0x0D 0x0A 0x41 0x64 // '??????Ad' 0x64 0x20 0x61 0x20 0x70 0x72 0x6F 0x70 // 'd a prop' 0x09 0x09 0x09 0x09 0x09 0x01 0x0D 0x0A // '????????' 0x43 0x72 0x65 0x61 0x74 0x65 0x20 0x61 // 'Create a' 0x20 0x33 0x44 0x20 0x77 0x6F 0x72 0x64 // ' 3D word' 0x09 0x09 0x09 0x01 // '????' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2= No_Word_Box #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2, __HELP_NAME("No Word Box")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2, __HELP_NAME("No Word Box")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTAlert02 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "No_Word_Box" ITEM "kgobHowtoSequence" ITEM "" ITEM "" ITEM "kwavHTAlert02" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_3=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpTextsCreate __HELP_SYMBOL( STN "mbmpTextsCreate" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_3=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0B 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x40 0x00 0x00 0x01 // '????@???' 0x00 0x00 0x00 0x00 0x42 0x00 0x00 0x01 // '????B???' 0x01 0x00 0x00 0x00 0x85 0x00 0x00 0x01 // '???????' 0x01 0xF6 0x00 0x00 0x9A 0x00 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0x9B 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x40 0x00 0x00 0x03 // '???@???' 0x00 0x00 0x00 0x00 0x42 0x00 0x00 0x80 // '????B??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x9A 0x00 0x00 0xC0 // '??????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) BYTE 0x03 0x03 0x4F 0x6F 0x70 0x73 0x21 0x20 // '??Oops! ' 0x20 0x42 0x65 0x66 0x6F 0x72 0x65 0x20 // ' Before ' 0x79 0x6F 0x75 0x20 0x63 0x61 0x6E 0x20 // 'you can ' 0x75 0x73 0x65 0x20 0x74 0x68 0x69 0x73 // 'use this' 0x20 0x74 0x6F 0x6F 0x6C 0x2C 0x20 0x79 // ' tool, y' 0x6F 0x75 0x20 0x6E 0x65 0x65 0x64 0x20 // 'ou need ' 0x74 0x6F 0x20 0x61 0x64 0x64 0x20 0x61 // 'to add a' 0x20 0x77 0x6F 0x72 0x64 0x20 0x62 0x6F // ' word bo' 0x78 0x2E 0x0D 0x0A 0x31 0x09 0x49 0x66 // 'x.??1?If' 0x20 0x79 0x6F 0x75 0x20 0x73 0x65 0x65 // ' you see' 0x20 0x74 0x68 0x65 0x20 0x57 0x6F 0x72 // ' the Wor' 0x64 0x73 0x20 0x62 0x75 0x74 0x74 0x6F // 'ds butto' 0x6E 0x20 0x61 0x74 0x20 0x74 0x68 0x65 // 'n at the' 0x20 0x74 0x6F 0x70 0x20 0x6F 0x66 0x20 // ' top of ' 0x74 0x68 0x65 0x20 0x73 0x63 0x72 0x65 // 'the scre' 0x65 0x6E 0x2C 0x20 0x63 0x6C 0x69 0x63 // 'en, clic' 0x6B 0x20 0x69 0x74 0x2E 0x0D 0x0A 0x32 // 'k it.??2' 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 0x74 // '?Click t' 0x68 0x65 0x20 0x57 0x6F 0x72 0x64 0x20 // 'he Word ' 0x42 0x6F 0x78 0x2D 0x01 // 'Box-?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3= No_Undo #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3, __HELP_NAME("No Undo")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3, __HELP_NAME("No Undo")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "No_Undo" ITEM "kgobHowtoSequence" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3, 0x0) BYTE 0x01 0x00 0x03 0x03 0x7B 0x00 0x00 0x00 // '????{???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_4=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x25 0x00 0x00 0x01 // '????%???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x25 0x00 0x00 0x03 // '???%???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) BYTE 0x03 0x03 0x53 0x6F 0x72 0x72 0x79 0x21 // '??Sorry!' 0x20 0x20 0x59 0x6F 0x75 0x20 0x63 0x61 // ' You ca' 0x6E 0x27 0x74 0x20 0x75 0x73 0x65 0x20 // 'n't use ' 0x55 0x6E 0x64 0x6F 0x20 0x72 0x69 0x67 // 'Undo rig' 0x68 0x74 0x20 0x6E 0x6F 0x77 0x2E // 'ht now.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK ================================================ FILE: src/help/htscenes.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ #undef __HELP_NAME #undef __HELP_SYMBOL #undef __HELP_PACK #undef __HELP_PACK2 #ifdef NO_HELP_NAMES #define __HELP_NAME(name) "" #else #define __HELP_NAME(name) name #endif #ifdef NO_HELP_SYMBOLS #define __HELP_SYMBOL(stuff) #else #define __HELP_SYMBOL(stuff) stuff #endif #ifdef PACK_HELP #define __HELP_PACK PACK #else #define __HELP_PACK #endif #ifdef HELP_SINGLE_CHUNK #define __HELP_PACK2 #else #define __HELP_PACK2 __HELP_PACK #endif SET _help_48544F50_0= ktpcHowToScenes00 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("CO--Click Scenes.")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("CO--Click Scenes.")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon1 kgobHowtoSequence kidSettingsCover kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTScenes00 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_7=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) GST(0) ITEM "kgobCalloutBalloon1" ITEM "ktpcHowToScenes00" ITEM "kgobHowtoSequence" ITEM "kidSettingsCover" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes00" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_7=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0x4E 0x00 0x00 0x00 // '????N???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_7=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0D 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0C 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_7=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x53 0x63 0x65 0x6E 0x65 0x73 0x2E // 'Scenes.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1= ktpcHowToScenes01 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("CO 1) If you're choosing")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("CO 1) If you're choosing")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon1 kgobHowtoSequence kidSettingsBrowser kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTScenes01 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) GST(0) ITEM "kgobCalloutBalloon1" ITEM "ktpcHowToScenes01" ITEM "kgobHowtoSequence" ITEM "kidSettingsBrowser" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes01" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0x68 0x01 0x00 0x00 // '????h???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2E, 0x0) AG(4) ITEM LONG 0x2000002 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToScenes2B __HELP_SYMBOL( STN "ktpcHowToScenes2B" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_2E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x14 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xD1 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x36 0x00 0x00 0x02 // '????6???' 0x01 0x00 0x00 0x00 0x45 0x00 0x00 0x02 // '????E???' 0x00 0x00 0x00 0x00 0xC2 0x00 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0xD1 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x2D 0x00 0x00 0x03 // '???-???' 0x00 0x00 0x00 0x00 0x37 0x00 0x00 0x03 // '????7???' 0x0A 0x00 0x00 0xFD 0x44 0x00 0x00 0x03 // '???D???' 0x00 0x00 0x00 0x00 0x47 0x00 0x00 0x03 // '????G???' 0x0F 0x00 0x00 0xFD 0x81 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0xC3 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xD0 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x85 0x00 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0x94 0x00 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0x85 0x00 0x00 0x40 // '??????@' 0x02 0x00 0x00 0x00 0x94 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xBB 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2E, 0x0) BYTE 0x03 0x03 0x49 0x66 0x20 0x79 0x6F 0x75 // '??If you' 0x27 0x72 0x65 0x20 0x63 0x68 0x6F 0x6F // ''re choo' 0x73 0x69 0x6E 0x67 0x20 0x61 0x20 0x73 // 'sing a s' 0x63 0x65 0x6E 0x65 0x20 0x66 0x6F 0x72 // 'cene for' 0x20 0x74 0x68 0x65 0x20 0x66 0x69 0x72 // ' the fir' 0x73 0x74 0x20 0x74 0x69 0x6D 0x65 0x0D // 'st time?' 0x0A 0x95 0x09 0x43 0x6C 0x69 0x63 0x6B // '??Click' 0x20 0x53 0x63 0x65 0x6E 0x65 0x20 0x43 // ' Scene C' 0x68 0x6F 0x69 0x63 0x65 0x73 0x2E 0x0D // 'hoices.?' 0x0A 0x49 0x66 0x20 0x79 0x6F 0x75 0x27 // '?If you'' 0x76 0x65 0x20 0x61 0x6C 0x72 0x65 0x61 // 've alrea' 0x64 0x79 0x20 0x61 0x64 0x64 0x65 0x64 // 'dy added' 0x20 0x61 0x20 0x73 0x63 0x65 0x6E 0x65 // ' a scene' 0x20 0x61 0x6E 0x64 0x20 0x77 0x61 0x6E // ' and wan' 0x74 0x20 0x74 0x6F 0x20 0x63 0x68 0x6F // 't to cho' 0x6F 0x73 0x65 0x20 0x61 0x6E 0x6F 0x74 // 'ose anot' 0x68 0x65 0x72 0x0D 0x0A 0x31 0x09 0x47 // 'her??1?G' 0x6F 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 // 'o to the' 0x20 0x70 0x6C 0x61 0x63 0x65 0x20 0x77 // ' place w' 0x68 0x65 0x72 0x65 0x20 0x79 0x6F 0x75 // 'here you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F // ' want to' 0x20 0x61 0x64 0x64 0x20 0x74 0x68 0x65 // ' add the' 0x20 0x6E 0x65 0x77 0x20 0x73 0x63 0x65 // ' new sce' 0x6E 0x65 0x2E 0x0D 0x0A 0x32 0x09 0x43 // 'ne.??2?C' 0x6C 0x69 0x63 0x6B 0x20 0x53 0x63 0x65 // 'lick Sce' 0x6E 0x65 0x20 0x43 0x68 0x6F 0x69 0x63 // 'ne Choic' 0x65 0x73 0x2E // 'es.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2= ktpcHowToScenes02 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2, __HELP_NAME("CO 2) Click the scene you ")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2, __HELP_NAME("CO 2) Click the scene you ")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0xAA 0x0 0x57415645 kwavHTScenes02 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_15=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToScenes02" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes02" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_15=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2, 0x0) BYTE 0x01 0x00 0x03 0x03 0x97 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_15=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_15, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x19 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_15=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_15, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x73 0x63 0x65 0x6E // 'the scen' 0x65 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 // 'e you wa' 0x6E 0x74 0x2E // 'nt.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3= ktpcHowToScenes03 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3, __HELP_NAME("CO 3) Click the camera")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3, __HELP_NAME("CO 3) Click the camera")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x0 0x57415645 kwavHTScenes03 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToScenes03" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes03" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3, 0x0) BYTE 0x01 0x00 0x03 0x03 0x87 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_8=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3D, 0x0) AG(4) ITEM LONG 0x2000002 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToScenes33 __HELP_SYMBOL( STN "ktpcHowToScenes33" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_3D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x27 0x00 0x00 0x01 // '????'???' 0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0A 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x16 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x26 0x00 0x00 0x02 // '????&???' 0x00 0x00 0x00 0x00 0x0A 0x00 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x16 0x00 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x0A 0x00 0x00 0x40 // '???????@' 0x03 0x00 0x00 0x00 0x16 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3D, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x63 0x61 0x6D 0x65 // 'the came' 0x72 0x61 0x20 0x61 0x6E 0x67 0x6C 0x65 // 'ra angle' 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E // ' you wan' 0x74 0x20 0x74 0x6F 0x20 0x75 0x73 0x65 // 't to use' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_4= ktpcHowToScenes04 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4, __HELP_NAME("What Next--Scenes")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4, __HELP_NAME("What Next--Scenes")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTScenes04 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToScenes04" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes04" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD0 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_21=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2F, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'GOKD' 0x16102 0xFFFFFFFF __HELP_SYMBOL( STN ) ITEM LONG 0xC0000004 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToScenes5C __HELP_SYMBOL( STN "ktpcHowToScenes5C" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToScenes44 __HELP_SYMBOL( STN "ktpcHowToScenes44" ) FREE FREE FREE ITEM LONG 0x40000001 VAR BYTE 3 LONG ktpcHowToScenes46 __HELP_SYMBOL( STN "ktpcHowToScenes46" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktpcHowToScenes2C __HELP_SYMBOL( STN "ktpcHowToScenes2C" ) ITEM LONG 0x40000001 VAR BYTE 5 LONG ktpcHowToScenes2D __HELP_SYMBOL( STN "ktpcHowToScenes2D" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_2F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x16 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1C 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x1E 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x93 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x1C 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x1E 0x00 0x00 0x40 // '???????@' 0x04 0x00 0x00 0x00 0x24 0x00 0x00 0x40 // '????$??@' 0x00 0x00 0x00 0x00 0x26 0x00 0x00 0x40 // '????&??@' 0x03 0x00 0x00 0x00 0x48 0x00 0x00 0x40 // '????H??@' 0x08 0x00 0x00 0x00 0x63 0x00 0x00 0x40 // '????c??@' 0x00 0x00 0x00 0x00 0x65 0x00 0x00 0x40 // '????e??@' 0x09 0x00 0x00 0x00 0x7F 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x81 0x00 0x00 0x40 // '??????@' 0x0A 0x00 0x00 0x00 0x93 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x1E 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x1E 0x00 0x00 0xC0 // '???????' 0x02 0x00 0x00 0x00 0x26 0x00 0x00 0xC0 // '????&??' 0x01 0x00 0x00 0x00 0x48 0x00 0x00 0xC0 // '????H??' 0x02 0x00 0x00 0x00 0x65 0x00 0x00 0xC0 // '????e??' 0x02 0x00 0x00 0x00 0x81 0x00 0x00 0xC0 // '??????' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2F, 0x0) BYTE 0x03 0x03 0x43 0x68 0x6F 0x6F 0x73 0x69 // '??Choosi' 0x6E 0x67 0x20 0x61 0x20 0x73 0x63 0x65 // 'ng a sce' 0x6E 0x65 0x2D 0x2D 0x57 0x68 0x61 0x74 // 'ne--What' 0x20 0x6E 0x65 0x78 0x74 0x3F 0x0D 0x0A // ' next???' 0x01 0x20 0x55 0x6E 0x64 0x6F 0x0D 0x0A // '? Undo??' 0x01 0x09 0x41 0x64 0x64 0x69 0x6E 0x67 // '??Adding' 0x20 0x65 0x78 0x74 0x72 0x61 0x20 0x66 // ' extra f' 0x72 0x61 0x6D 0x65 0x73 0x20 0x74 0x6F // 'rames to' 0x20 0x61 0x20 0x73 0x63 0x65 0x6E 0x65 // ' a scene' 0x0D 0x0A 0x01 0x20 0x43 0x68 0x61 0x6E // '??? Chan' 0x67 0x69 0x6E 0x67 0x20 0x74 0x68 0x65 // 'ging the' 0x20 0x63 0x61 0x6D 0x65 0x72 0x61 0x20 // ' camera ' 0x61 0x6E 0x67 0x6C 0x65 0x0D 0x0A 0x01 // 'angle???' 0x20 0x43 0x68 0x61 0x6E 0x67 0x69 0x6E // ' Changin' 0x67 0x20 0x74 0x68 0x65 0x20 0x73 0x63 // 'g the sc' 0x65 0x6E 0x65 0x20 0x6F 0x72 0x64 0x65 // 'ene orde' 0x72 0x0D 0x0A 0x01 0x20 0x52 0x65 0x6D // 'r??? Rem' 0x6F 0x76 0x69 0x6E 0x67 0x20 0x61 0x20 // 'oving a ' 0x73 0x63 0x65 0x6E 0x65 // 'scene' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_5= ktpcHowToScenes05 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5, __HELP_NAME("CO 1) To change the camera")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5, __HELP_NAME("CO 1) To change the camera")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence kidSettingsCameras kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTScenes05 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_19=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcHowToScenes05" ITEM "kgobHowtoSequence" ITEM "kidSettingsCameras" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes05" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_19=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5, 0x0) BYTE 0x01 0x00 0x03 0x03 0xCC 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_19, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToScenes2B __HELP_SYMBOL( STN "ktpcHowToScenes2B" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_19=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_19, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x10 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x70 0x00 0x00 0x01 // '????p???' 0x00 0x00 0x00 0x00 0x61 0x00 0x00 0x02 // '????a???' 0x01 0x00 0x00 0x00 0x62 0x00 0x00 0x02 // '????b???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x1A 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x62 0x00 0x00 0x03 // '????b???' 0x0A 0x00 0x00 0xFD 0x6F 0x00 0x00 0x03 // '???o???' 0x0F 0x00 0x00 0xFD 0x70 0x00 0x00 0x03 // '???p???' 0x00 0x00 0x00 0x00 0x1E 0x00 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x2D 0x00 0x00 0x04 // '???-???' 0x00 0x00 0x00 0x00 0x1E 0x00 0x00 0x40 // '???????@' 0x03 0x00 0x00 0x00 0x2D 0x00 0x00 0x40 // '????-??@' 0x00 0x00 0x00 0x00 0x1C 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x5A 0x00 0x00 0x82 // '????Z??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_19=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_19, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x63 0x68 0x61 // '??To cha' 0x6E 0x67 0x65 0x20 0x74 0x68 0x65 0x20 // 'nge the ' 0x63 0x61 0x6D 0x65 0x72 0x61 0x20 0x61 // 'camera a' 0x6E 0x67 0x6C 0x65 0x0D 0x0A 0x31 0x09 // 'ngle??1?' 0x47 0x6F 0x20 0x74 0x6F 0x20 0x74 0x68 // 'Go to th' 0x65 0x20 0x70 0x6C 0x61 0x63 0x65 0x20 // 'e place ' 0x77 0x68 0x65 0x72 0x65 0x20 0x79 0x6F // 'where yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 // 'u want t' 0x6F 0x20 0x63 0x68 0x61 0x6E 0x67 0x65 // 'o change' 0x20 0x74 0x68 0x65 0x20 0x63 0x61 0x6D // ' the cam' 0x65 0x72 0x61 0x20 0x61 0x6E 0x67 0x6C // 'era angl' 0x65 0x2E 0x0D 0x0A 0x32 0x09 0x43 0x6C // 'e.??2?Cl' 0x69 0x63 0x6B 0x20 0x43 0x61 0x6D 0x65 // 'ick Came' 0x72 0x61 0x20 0x41 0x6E 0x67 0x6C 0x65 // 'ra Angle' 0x73 0x2E // 's.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_6= ktpcHowToScenes06 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6, __HELP_NAME("CO 2) Click the view you ")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6, __HELP_NAME("CO 2) Click the view you ")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTScenes06 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_12=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToScenes06" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes06" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_12=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6, 0x0) BYTE 0x01 0x00 0x03 0x03 0x8C 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_12=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_12, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x18 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_12=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_12, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x76 0x69 0x65 0x77 // 'the view' 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E // ' you wan' 0x74 0x2E // 't.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_7= ktpcHowToScenes07 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7, __HELP_NAME("What Next--Camera Angles")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7, __HELP_NAME("What Next--Camera Angles")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTScenes07 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToScenes07" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes07" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7, 0x0) BYTE 0x01 0x00 0x03 0x03 0xF5 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_20=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1F, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToScenes44 __HELP_SYMBOL( STN "ktpcHowToScenes44" ) ITEM LONG 0xC0000002 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToScenes2E __HELP_SYMBOL( STN "ktpcHowToScenes2E" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_1F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0E 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x25 0x00 0x00 0x01 // '????%???' 0x00 0x00 0x00 0x00 0x27 0x00 0x00 0x01 // '????'???' 0x01 0x00 0x00 0x00 0x43 0x00 0x00 0x01 // '????C???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x25 0x00 0x00 0x03 // '???%???' 0x00 0x00 0x00 0x00 0x27 0x00 0x00 0x40 // '????'??@' 0x02 0x00 0x00 0x00 0x2D 0x00 0x00 0x40 // '????-??@' 0x00 0x00 0x00 0x00 0x2F 0x00 0x00 0x40 // '????/??@' 0x04 0x00 0x00 0x00 0x43 0x00 0x00 0x40 // '????C??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x27 0x00 0x00 0x82 // '????'??' 0x00 0x00 0x00 0x00 0x27 0x00 0x00 0xC0 // '????'??' 0x03 0x00 0x00 0x00 0x2F 0x00 0x00 0xC0 // '????/??' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1F, 0x0) BYTE 0x03 0x03 0x43 0x68 0x61 0x6E 0x67 0x69 // '??Changi' 0x6E 0x67 0x20 0x74 0x68 0x65 0x20 0x63 // 'ng the c' 0x61 0x6D 0x65 0x72 0x61 0x20 0x61 0x6E // 'amera an' 0x67 0x6C 0x65 0x2D 0x2D 0x57 0x68 0x61 // 'gle--Wha' 0x74 0x20 0x6E 0x65 0x78 0x74 0x3F 0x0D // 't next??' 0x0A 0x01 0x20 0x55 0x6E 0x64 0x6F 0x0D // '?? Undo?' 0x0A 0x01 0x20 0x50 0x6C 0x61 0x79 0x69 // '?? Playi' 0x6E 0x67 0x20 0x79 0x6F 0x75 0x72 0x20 // 'ng your ' 0x6D 0x6F 0x76 0x69 0x65 // 'movie' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_8= ktpcHowToScenes08 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8, __HELP_NAME("Cut")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8, __HELP_NAME("Cut")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence kidPausesMouse kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTScenes08 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_5=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcHowToScenes08" ITEM "kgobHowtoSequence" ITEM "kidPausesMouse" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes08" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_5=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8, 0x0) BYTE 0x01 0x00 0x03 0x03 0x20 0x00 0x00 0x00 // '???? ???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_5=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x03 0x00 0x00 0x00 0x03 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_5=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x03 0x03 0x43 0x75 0x74 // '??Cut' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_9= ktpcHowToScenes09 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_9, __HELP_NAME("Cut")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_9, __HELP_NAME("Cut")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTScenes09 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_6=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_9, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToScenes09" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes09" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_6=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_9, 0x0) BYTE 0x01 0x00 0x03 0x03 0x24 0x00 0x00 0x00 // '????$???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_6=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x03 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x03 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_6=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) BYTE 0x03 0x03 0x43 0x75 0x74 // '??Cut' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_A= ktpcHowToScenes0A #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_A, __HELP_NAME("CO 1) To wait for sound")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_A, __HELP_NAME("CO 1) To wait for sound")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence kidPausesSound kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTScenes0A ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_A, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcHowToScenes0A" ITEM "kgobHowtoSequence" ITEM "kidPausesSound" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes0A" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_A, 0x0) BYTE 0x01 0x00 0x03 0x03 0xF3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_13=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1B, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToScenes45 __HELP_SYMBOL( STN "ktpcHowToScenes45" ) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToScenes2B __HELP_SYMBOL( STN "ktpcHowToScenes2B" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_1B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x15 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xB2 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x04 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x20 0x00 0x00 0x02 // '???? ???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x4D 0x00 0x00 0x03 // '???M???' 0x0F 0x00 0x00 0xFD 0x9C 0x00 0x00 0x03 // '??????' 0x0A 0x00 0x00 0xFD 0xB1 0x00 0x00 0x03 // '??????' 0x0F 0x00 0x00 0xFD 0xB2 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x3A 0x00 0x00 0x04 // '????:???' 0x0D 0x00 0x00 0xFE 0x3F 0x00 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x51 0x00 0x00 0x04 // '????Q???' 0x0D 0x00 0x00 0xFE 0x60 0x00 0x00 0x04 // '???`???' 0x00 0x00 0x00 0x00 0x3A 0x00 0x00 0x40 // '????:??@' 0x02 0x00 0x00 0x00 0x3F 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x51 0x00 0x00 0x40 // '????Q??@' 0x03 0x00 0x00 0x00 0x60 0x00 0x00 0x40 // '????`??@' 0x00 0x00 0x00 0x00 0xB2 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x4F 0x00 0x00 0x80 // '????O??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x94 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1B, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x70 0x61 0x75 // '??To pau' 0x73 0x65 0x20 0x74 0x68 0x65 0x20 0x6D // 'se the m' 0x6F 0x76 0x69 0x65 0x20 0x61 0x63 0x74 // 'ovie act' 0x69 0x6F 0x6E 0x20 0x75 0x6E 0x74 0x69 // 'ion unti' 0x6C 0x20 0x61 0x6C 0x6C 0x20 0x73 0x6F // 'l all so' 0x75 0x6E 0x64 0x73 0x20 0x61 0x74 0x20 // 'unds at ' 0x74 0x68 0x65 0x20 0x63 0x75 0x72 0x72 // 'the curr' 0x65 0x6E 0x74 0x20 0x66 0x72 0x61 0x6D // 'ent fram' 0x65 0x20 0x68 0x61 0x76 0x65 0x20 0x66 // 'e have f' 0x69 0x6E 0x69 0x73 0x68 0x65 0x64 0x0D // 'inished?' 0x0A 0x31 0x09 0x47 0x6F 0x20 0x74 0x6F // '?1?Go to' 0x20 0x74 0x68 0x65 0x20 0x70 0x6C 0x61 // ' the pla' 0x63 0x65 0x20 0x69 0x6E 0x20 0x79 0x6F // 'ce in yo' 0x75 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 // 'ur movie' 0x20 0x77 0x68 0x65 0x72 0x65 0x20 0x79 // ' where y' 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 // 'ou want ' 0x74 0x6F 0x20 0x70 0x61 0x75 0x73 0x65 // 'to pause' 0x20 0x74 0x68 0x65 0x20 0x61 0x63 0x74 // ' the act' 0x69 0x6F 0x6E 0x2E 0x0D 0x0A 0x32 0x09 // 'ion.??2?' 0x43 0x6C 0x69 0x63 0x6B 0x20 0x57 0x61 // 'Click Wa' 0x69 0x74 0x20 0x66 0x6F 0x72 0x20 0x53 // 'it for S' 0x6F 0x75 0x6E 0x64 0x20 0x74 0x6F 0x20 // 'ound to ' 0x45 0x6E 0x64 0x2E // 'End.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_B= ktpcHowToScenes0B #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_B, __HELP_NAME("What Next--Wait for Sound")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_B, __HELP_NAME("What Next--Wait for Sound")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTScenes0B ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_B, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToScenes0B" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes0B" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x9E 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_22=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToScenes44 __HELP_SYMBOL( STN "ktpcHowToScenes44" ) ITEM LONG 0xC0000003 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) FREE FREE ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToScenes2E __HELP_SYMBOL( STN "ktpcHowToScenes2E" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktpcHowToScenes2F __HELP_SYMBOL( STN "ktpcHowToScenes2F" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x11 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2D 0x00 0x00 0x01 // '????-???' 0x00 0x00 0x00 0x00 0x2F 0x00 0x00 0x01 // '????/???' 0x01 0x00 0x00 0x00 0x5F 0x00 0x00 0x01 // '????_???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x2D 0x00 0x00 0x03 // '???-???' 0x00 0x00 0x00 0x00 0x2F 0x00 0x00 0x40 // '????/??@' 0x01 0x00 0x00 0x00 0x35 0x00 0x00 0x40 // '????5??@' 0x00 0x00 0x00 0x00 0x37 0x00 0x00 0x40 // '????7??@' 0x05 0x00 0x00 0x00 0x4B 0x00 0x00 0x40 // '????K??@' 0x00 0x00 0x00 0x00 0x4D 0x00 0x00 0x40 // '????M??@' 0x06 0x00 0x00 0x00 0x5F 0x00 0x00 0x40 // '????_??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x2F 0x00 0x00 0x82 // '????/??' 0x00 0x00 0x00 0x00 0x2F 0x00 0x00 0xC0 // '????/??' 0x02 0x00 0x00 0x00 0x37 0x00 0x00 0xC0 // '????7??' 0x02 0x00 0x00 0x00 0x4D 0x00 0x00 0xC0 // '????M??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) BYTE 0x03 0x03 0x57 0x61 0x69 0x74 0x69 0x6E // '??Waitin' 0x67 0x20 0x75 0x6E 0x74 0x69 0x6C 0x20 // 'g until ' 0x61 0x20 0x73 0x6F 0x75 0x6E 0x64 0x20 // 'a sound ' 0x69 0x73 0x20 0x66 0x69 0x6E 0x69 0x73 // 'is finis' 0x68 0x65 0x64 0x2D 0x2D 0x57 0x68 0x61 // 'hed--Wha' 0x74 0x20 0x6E 0x65 0x78 0x74 0x3F 0x0D // 't next??' 0x0A 0x01 0x20 0x55 0x6E 0x64 0x6F 0x0D // '?? Undo?' 0x0A 0x01 0x20 0x50 0x6C 0x61 0x79 0x69 // '?? Playi' 0x6E 0x67 0x20 0x79 0x6F 0x75 0x72 0x20 // 'ng your ' 0x6D 0x6F 0x76 0x69 0x65 0x0D 0x0A 0x01 // 'movie???' 0x20 0x52 0x65 0x6D 0x6F 0x76 0x69 0x6E // ' Removin' 0x67 0x20 0x61 0x20 0x70 0x61 0x75 0x73 // 'g a paus' 0x65 // 'e' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_C= ktpcHowToScenes0C #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_C, __HELP_NAME("Cut")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_C, __HELP_NAME("Cut")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence kidPausesClear kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTScenes0C ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_C, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcHowToScenes0C" ITEM "kgobHowtoSequence" ITEM "kidPausesClear" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes0C" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x24 0x00 0x00 0x00 // '????$???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_3=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x03 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x03 0x00 0x00 0x04 // '????????' 0x00 0x00 0x00 0x00 0x03 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) BYTE 0x03 0x03 0x43 0x75 0x74 // '??Cut' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_D= ktpcHowToScenes0D #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_D, __HELP_NAME("CO 1) To add a transition")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_D, __HELP_NAME("CO 1) To add a transition")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence kidSceneSorter kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTScenes0D ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_D, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcHowToScenes0D" ITEM "kgobHowtoSequence" ITEM "kidSceneSorter" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes0D" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_D, 0x0) BYTE 0x01 0x00 0x03 0x03 0xCF 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x3E 0x00 0x00 0x01 // '????>???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x2E 0x00 0x00 0x03 // '???.???' 0x0A 0x00 0x00 0xFD 0x3D 0x00 0x00 0x03 // '???=???' 0x0F 0x00 0x00 0xFD 0x3E 0x00 0x00 0x03 // '???>???' 0x00 0x00 0x00 0x00 0x3E 0x00 0x00 0x04 // '????>???' 0x00 0x00 0x00 0x00 0x3E 0x00 0x00 0x40 // '????>??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2C, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x61 0x64 0x64 // '??To add' 0x20 0x61 0x20 0x74 0x72 0x61 0x6E 0x73 // ' a trans' 0x69 0x74 0x69 0x6F 0x6E 0x20 0x62 0x65 // 'ition be' 0x74 0x77 0x65 0x65 0x6E 0x20 0x73 0x63 // 'tween sc' 0x65 0x6E 0x65 0x73 0x2C 0x20 0x63 0x6C // 'enes, cl' 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 // 'ick the ' 0x53 0x63 0x65 0x6E 0x65 0x20 0x4F 0x72 // 'Scene Or' 0x67 0x61 0x6E 0x69 0x7A 0x65 0x72 0x2E // 'ganizer.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_E= ktpcHowToScenes0E #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_E, __HELP_NAME("CO 2) Click the transition")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_E, __HELP_NAME("CO 2) Click the transition")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon7 kgobHowtoSequence 0x0 kidPlayHelpSounds 0xD2 0x6E 0x57415645 kwavHTScenes0E ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_35=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_E, 0x0) GST(0) ITEM "kgobCalloutBalloon7" ITEM "ktpcHowToScenes0E" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes0E" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_35=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_E, 0x0) BYTE 0x01 0x00 0x03 0x03 0xF5 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_9=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_35, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToScenes27 __HELP_SYMBOL( STN "ktpcHowToScenes27" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_35=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_35, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x09 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x4A 0x00 0x00 0x01 // '????J???' 0x01 0xFB 0x00 0x00 0x65 0x00 0x00 0x01 // '???e???' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x25 0x00 0x00 0x04 // '???%???' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x40 // '???????@' 0x02 0x00 0x00 0x00 0x25 0x00 0x00 0x40 // '????%??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x4A 0x00 0x00 0x82 // '????J??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_35=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_35, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x6F 0x6E 0x65 0x20 0x6F 0x66 0x20 0x74 // 'one of t' 0x68 0x65 0x20 0x34 0x20 0x74 0x72 0x61 // 'he 4 tra' 0x6E 0x73 0x69 0x74 0x69 0x6F 0x6E 0x20 // 'nsition ' 0x63 0x68 0x6F 0x69 0x63 0x65 0x73 0x20 // 'choices ' 0x6C 0x69 0x73 0x74 0x65 0x64 0x20 0x74 // 'listed t' 0x6F 0x20 0x74 0x68 0x65 0x20 0x72 0x69 // 'o the ri' 0x67 0x68 0x74 0x20 0x6F 0x66 0x20 0x65 // 'ght of e' 0x61 0x63 0x68 0x20 0x73 0x63 0x65 0x6E // 'ach scen' 0x65 0x2E 0x0D 0x0A 0x57 0x68 0x65 0x6E // 'e.??When' 0x20 0x79 0x6F 0x75 0x27 0x72 0x65 0x20 // ' you're ' 0x64 0x6F 0x6E 0x65 0x2C 0x20 0x63 0x6C // 'done, cl' 0x69 0x63 0x6B 0x20 0x4F 0x4B 0x2E // 'ick OK.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_F= ktpcHowToScenes0F #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_F, __HELP_NAME("What Next--Transitions")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_F, __HELP_NAME("What Next--Transitions")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTScenes0F ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_23=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_F, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToScenes0F" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes0F" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_23=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_F, 0x0) BYTE 0x01 0x00 0x03 0x03 0xAD 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_D=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_23, 0x0) AG(4) FREE ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToScenes2E __HELP_SYMBOL( STN "ktpcHowToScenes2E" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_23=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_23, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0B 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2D 0x00 0x00 0x01 // '????-???' 0x01 0x00 0x00 0x00 0x43 0x00 0x00 0x01 // '????C???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x2D 0x00 0x00 0x03 // '???-???' 0x00 0x00 0x00 0x00 0x2D 0x00 0x00 0x40 // '????-??@' 0x00 0x00 0x00 0x00 0x2F 0x00 0x00 0x40 // '????/??@' 0x03 0x00 0x00 0x00 0x43 0x00 0x00 0x40 // '????C??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x2F 0x00 0x00 0x82 // '????/??' 0x00 0x00 0x00 0x00 0x2F 0x00 0x00 0xC0 // '????/??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_23=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_23, 0x0) BYTE 0x03 0x03 0x41 0x64 0x64 0x69 0x6E 0x67 // '??Adding' 0x20 0x74 0x72 0x61 0x6E 0x73 0x69 0x74 // ' transit' 0x69 0x6F 0x6E 0x73 0x20 0x62 0x65 0x74 // 'ions bet' 0x77 0x65 0x65 0x6E 0x20 0x73 0x63 0x65 // 'ween sce' 0x6E 0x65 0x73 0x2D 0x2D 0x57 0x68 0x61 // 'nes--Wha' 0x74 0x20 0x6E 0x65 0x78 0x74 0x3F 0x0D // 't next??' 0x0A 0x01 0x20 0x50 0x6C 0x61 0x79 0x69 // '?? Playi' 0x6E 0x67 0x20 0x79 0x6F 0x75 0x72 0x20 // 'ng your ' 0x6D 0x6F 0x76 0x69 0x65 // 'movie' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_10= ktpcHowToScenes10 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_10, __HELP_NAME("CO 1) To change the scene")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_10, __HELP_NAME("CO 1) To change the scene")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence kidSceneSorter kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTScenes10 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_25=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_10, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcHowToScenes10" ITEM "kgobHowtoSequence" ITEM "kidSceneSorter" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes10" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_25=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_10, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_25=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_25, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x35 0x00 0x00 0x01 // '????5???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x25 0x00 0x00 0x03 // '???%???' 0x0A 0x00 0x00 0xFD 0x34 0x00 0x00 0x03 // '???4???' 0x0F 0x00 0x00 0xFD 0x35 0x00 0x00 0x03 // '???5???' 0x00 0x00 0x00 0x00 0x35 0x00 0x00 0x04 // '????5???' 0x00 0x00 0x00 0x00 0x35 0x00 0x00 0x40 // '????5??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_25=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_25, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x63 0x68 0x61 // '??To cha' 0x6E 0x67 0x65 0x20 0x74 0x68 0x65 0x20 // 'nge the ' 0x73 0x63 0x65 0x6E 0x65 0x20 0x6F 0x72 // 'scene or' 0x64 0x65 0x72 0x2C 0x20 0x63 0x6C 0x69 // 'der, cli' 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 0x53 // 'ck the S' 0x63 0x65 0x6E 0x65 0x20 0x4F 0x72 0x67 // 'cene Org' 0x61 0x6E 0x69 0x7A 0x65 0x72 0x2E // 'anizer.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_11= ktpcHowToScenes11 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_11, __HELP_NAME("CO 2) Drag a scene where ")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_11, __HELP_NAME("CO 2) Drag a scene where ")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x0 0x57415645 kwavHTScenes11 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_21=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_11, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToScenes11" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes11" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_21=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_11, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC1 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_A=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_21, 0x0) AG(4) FREE FREE FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToScenes51 __HELP_SYMBOL( STN "ktpcHowToScenes51" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_21=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_21, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x3B 0x00 0x00 0x01 // '????;???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x04 0x00 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x40 // '???????@' 0x04 0x00 0x00 0x00 0x04 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x3B 0x00 0x00 0x40 // '????;??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_21=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_21, 0x0) BYTE 0x03 0x03 0x44 0x72 0x61 0x67 0x20 0x61 // '??Drag a' 0x20 0x73 0x63 0x65 0x6E 0x65 0x20 0x77 // ' scene w' 0x68 0x65 0x72 0x65 0x20 0x79 0x6F 0x75 // 'here you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x69 0x74 // ' want it' 0x2E 0x20 0x57 0x68 0x65 0x6E 0x20 0x79 // '. When y' 0x6F 0x75 0x27 0x72 0x65 0x20 0x64 0x6F // 'ou're do' 0x6E 0x65 0x2C 0x20 0x63 0x6C 0x69 0x63 // 'ne, clic' 0x6B 0x20 0x4F 0x4B 0x2E // 'k OK.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_12= ktpcHowToScenes12 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_12, __HELP_NAME("What Next--Scene Order")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_12, __HELP_NAME("What Next--Scene Order")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTScenes12 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_12, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToScenes12" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes12" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_12, 0x0) BYTE 0x01 0x00 0x03 0x03 0xEA 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_11=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3F, 0x0) AG(4) FREE ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToScenes2E __HELP_SYMBOL( STN "ktpcHowToScenes2E" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_3F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0B 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x24 0x00 0x00 0x01 // '????$???' 0x00 0x00 0x00 0x00 0x26 0x00 0x00 0x01 // '????&???' 0x01 0x00 0x00 0x00 0x3A 0x00 0x00 0x01 // '????:???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x24 0x00 0x00 0x03 // '???$???' 0x00 0x00 0x00 0x00 0x26 0x00 0x00 0x40 // '????&??@' 0x03 0x00 0x00 0x00 0x3A 0x00 0x00 0x40 // '????:??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x26 0x00 0x00 0x82 // '????&??' 0x00 0x00 0x00 0x00 0x26 0x00 0x00 0xC0 // '????&??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3F, 0x0) BYTE 0x03 0x03 0x43 0x68 0x61 0x6E 0x67 0x69 // '??Changi' 0x6E 0x67 0x20 0x74 0x68 0x65 0x20 0x73 // 'ng the s' 0x63 0x65 0x6E 0x65 0x20 0x6F 0x72 0x64 // 'cene ord' 0x65 0x72 0x2D 0x2D 0x57 0x68 0x61 0x74 // 'er--What' 0x20 0x6E 0x65 0x78 0x74 0x3F 0x0D 0x0A // ' next???' 0x01 0x20 0x50 0x6C 0x61 0x79 0x69 0x6E // '? Playin' 0x67 0x20 0x79 0x6F 0x75 0x72 0x20 0x6D // 'g your m' 0x6F 0x76 0x69 0x65 // 'ovie' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_13= ktpcHowToScenes13 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_13, __HELP_NAME("CO 1) To move from scene")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_13, __HELP_NAME("CO 1) To move from scene")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidSceneBackground kidPlayHelpSounds 0x12 0x5 0x57415645 kwavHTScenes13 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_11=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_13, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToScenes13" ITEM "kgobHowtoSequence" ITEM "kidSceneBackground" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes13" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_11=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_13, 0x0) BYTE 0x01 0x00 0x03 0x03 0x38 0x01 0x00 0x00 // '????8???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_17=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_11, 0x0) AG(4) ITEM LONG 0x2000003 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToScenes51 __HELP_SYMBOL( STN "ktpcHowToScenes51" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_11=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_11, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x1A 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x9B 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x32 0x00 0x00 0x02 // '????2???' 0x01 0x00 0x00 0x00 0x34 0x00 0x00 0x02 // '????4???' 0x00 0x00 0x00 0x00 0x36 0x00 0x00 0x02 // '????6???' 0x01 0x00 0x00 0x00 0x3C 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x21 0x00 0x00 0x03 // '???!???' 0x00 0x00 0x00 0x00 0x23 0x00 0x00 0x40 // '????#??@' 0x03 0x00 0x00 0x00 0x3E 0x00 0x00 0x40 // '????>??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x23 0x00 0x00 0x82 // '????#??' 0x00 0x00 0x00 0x00 0x23 0x00 0x00 0xC0 // '????#??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B, 0x0) BYTE 0x03 0x03 0x4D 0x6F 0x76 0x69 0x6E 0x67 // '??Moving' 0x20 0x77 0x69 0x74 0x68 0x69 0x6E 0x20 // ' within ' 0x61 0x20 0x73 0x63 0x65 0x6E 0x65 0x2D // 'a scene-' 0x2D 0x57 0x68 0x61 0x74 0x20 0x6E 0x65 // '-What ne' 0x78 0x74 0x3F 0x0D 0x0A 0x01 0x4D 0x6F // 'xt????Mo' 0x76 0x69 0x6E 0x67 0x20 0x66 0x72 0x6F // 'ving fro' 0x6D 0x20 0x73 0x63 0x65 0x6E 0x65 0x20 // 'm scene ' 0x74 0x6F 0x20 0x73 0x63 0x65 0x6E 0x65 // 'to scene' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_17= ktpcHowToScenes17 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_17, __HELP_NAME("CO 1) To remove the entire ")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_17, __HELP_NAME("CO 1) To remove the entire ")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidCutCopyPaste kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTScenes17 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_17, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToScenes17" ITEM "kgobHowtoSequence" ITEM "kidCutCopyPaste" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes17" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_17, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE2 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1E=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords52 __HELP_SYMBOL( STN "ktpcHowToWords52" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0F 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x83 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x19 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x6A 0x00 0x00 0x03 // '???j???' 0x0A 0x00 0x00 0xFD 0x82 0x00 0x00 0x03 // '??????' 0x0F 0x00 0x00 0xFD 0x83 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x1D 0x00 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x2C 0x00 0x00 0x04 // '???,???' 0x00 0x00 0x00 0x00 0x1D 0x00 0x00 0x40 // '???????@' 0x01 0x00 0x00 0x00 0x2C 0x00 0x00 0x40 // '????,??@' 0x00 0x00 0x00 0x00 0x83 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x1B 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x5E 0x00 0x00 0x82 // '????^??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x72 0x65 0x6D // '??To rem' 0x6F 0x76 0x65 0x20 0x61 0x6E 0x20 0x65 // 'ove an e' 0x6E 0x74 0x69 0x72 0x65 0x20 0x73 0x63 // 'ntire sc' 0x65 0x6E 0x65 0x0D 0x0A 0x31 0x09 0x47 // 'ene??1?G' 0x6F 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 // 'o to the' 0x20 0x70 0x6C 0x61 0x63 0x65 0x20 0x69 // ' place i' 0x6E 0x20 0x79 0x6F 0x75 0x72 0x20 0x6D // 'n your m' 0x6F 0x76 0x69 0x65 0x20 0x77 0x68 0x65 // 'ovie whe' 0x72 0x65 0x20 0x79 0x6F 0x75 0x20 0x77 // 're you w' 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 0x72 // 'ant to r' 0x65 0x6D 0x6F 0x76 0x65 0x20 0x61 0x20 // 'emove a ' 0x73 0x63 0x65 0x6E 0x65 0x2E 0x0D 0x0A // 'scene.??' 0x32 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 // '2?Click ' 0x74 0x68 0x65 0x20 0x43 0x75 0x74 0x2C // 'the Cut,' 0x20 0x43 0x6F 0x70 0x79 0x2C 0x20 0x26 // ' Copy, &' 0x20 0x50 0x61 0x73 0x74 0x65 0x20 0x54 // ' Paste T' 0x6F 0x6F 0x6C 0x73 0x2E // 'ools.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_18= ktpcHowToScenes18 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_18, __HELP_NAME("CO 2) Click Remove Entire")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_18, __HELP_NAME("CO 2) Click Remove Entire")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidCCPActorNuke kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTScenes18 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_8=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_18, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToScenes18" ITEM "kgobHowtoSequence" ITEM "kidCCPActorNuke" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes18" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_8=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_18, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_8=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1A 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x19 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x1A 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_8=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x52 0x65 0x6D 0x6F 0x76 0x65 0x20 0x45 // 'Remove E' 0x6E 0x74 0x69 0x72 0x65 0x20 0x53 0x63 // 'ntire Sc' 0x65 0x6E 0x65 0x2E // 'ene.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_19= ktpcHowToScenes19 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_19, __HELP_NAME("What Next--Remove Entire")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_19, __HELP_NAME("What Next--Remove Entire")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTScenes19 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_41=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_19, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToScenes19" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes19" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_41=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_19, 0x0) BYTE 0x01 0x00 0x03 0x03 0xF0 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_27=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_41, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToScenes44 __HELP_SYMBOL( STN "ktpcHowToScenes44" ) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToScenes2E __HELP_SYMBOL( STN "ktpcHowToScenes2E" ) ITEM LONG 0xC0000002 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_41=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_41, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0E 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x24 0x00 0x00 0x01 // '????$???' 0x00 0x00 0x00 0x00 0x26 0x00 0x00 0x01 // '????&???' 0x01 0x00 0x00 0x00 0x42 0x00 0x00 0x01 // '????B???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x24 0x00 0x00 0x03 // '???$???' 0x00 0x00 0x00 0x00 0x26 0x00 0x00 0x40 // '????&??@' 0x01 0x00 0x00 0x00 0x2C 0x00 0x00 0x40 // '????,??@' 0x00 0x00 0x00 0x00 0x2E 0x00 0x00 0x40 // '????.??@' 0x02 0x00 0x00 0x00 0x42 0x00 0x00 0x40 // '????B??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x26 0x00 0x00 0x82 // '????&??' 0x00 0x00 0x00 0x00 0x26 0x00 0x00 0xC0 // '????&??' 0x03 0x00 0x00 0x00 0x2E 0x00 0x00 0xC0 // '????.??' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_41=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_41, 0x0) BYTE 0x03 0x03 0x52 0x65 0x6D 0x6F 0x76 0x69 // '??Removi' 0x6E 0x67 0x20 0x61 0x6E 0x20 0x65 0x6E // 'ng an en' 0x74 0x69 0x72 0x65 0x20 0x73 0x63 0x65 // 'tire sce' 0x6E 0x65 0x2D 0x2D 0x57 0x68 0x61 0x74 // 'ne--What' 0x20 0x6E 0x65 0x78 0x74 0x3F 0x0D 0x0A // ' next???' 0x01 0x20 0x55 0x6E 0x64 0x6F 0x0D 0x0A // '? Undo??' 0x01 0x20 0x50 0x6C 0x61 0x79 0x69 0x6E // '? Playin' 0x67 0x20 0x79 0x6F 0x75 0x72 0x20 0x6D // 'g your m' 0x6F 0x76 0x69 0x65 // 'ovie' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1A= ktpcHowToScenes1A #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1A, __HELP_NAME("CO 1) To remove before")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1A, __HELP_NAME("CO 1) To remove before")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence kidCCPSceneChopBack kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTScenes1A ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1A, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcHowToScenes1A" ITEM "kgobHowtoSequence" ITEM "kidCCPSceneChopBack" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes1A" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x25 0x01 0x00 0x00 // '????%???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_26=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToScenes2B __HELP_SYMBOL( STN "ktpcHowToScenes2B" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_2=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0F 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xAD 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x2D 0x00 0x00 0x03 // '???-???' 0x0F 0x00 0x00 0xFD 0x94 0x00 0x00 0x03 // '??????' 0x0A 0x00 0x00 0xFD 0xAC 0x00 0x00 0x03 // '??????' 0x0F 0x00 0x00 0xFD 0xAD 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x31 0x00 0x00 0x04 // '????1???' 0x0D 0x00 0x00 0xFE 0x40 0x00 0x00 0x04 // '???@???' 0x00 0x00 0x00 0x00 0x31 0x00 0x00 0x40 // '????1??@' 0x02 0x00 0x00 0x00 0x40 0x00 0x00 0x40 // '????@??@' 0x00 0x00 0x00 0x00 0xAD 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x2F 0x00 0x00 0x80 // '????/??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x8C 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x72 0x65 0x6D // '??To rem' 0x6F 0x76 0x65 0x20 0x65 0x76 0x65 0x72 // 'ove ever' 0x79 0x74 0x68 0x69 0x6E 0x67 0x20 0x62 // 'ything b' 0x65 0x66 0x6F 0x72 0x65 0x20 0x74 0x68 // 'efore th' 0x65 0x20 0x63 0x75 0x72 0x72 0x65 0x6E // 'e curren' 0x74 0x20 0x66 0x72 0x61 0x6D 0x65 0x0D // 't frame?' 0x0A 0x31 0x09 0x47 0x6F 0x20 0x74 0x6F // '?1?Go to' 0x20 0x74 0x68 0x65 0x20 0x70 0x6C 0x61 // ' the pla' 0x63 0x65 0x20 0x69 0x6E 0x20 0x79 0x6F // 'ce in yo' 0x75 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 // 'ur movie' 0x20 0x74 0x68 0x61 0x74 0x20 0x79 0x6F // ' that yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 // 'u want t' 0x6F 0x20 0x6D 0x61 0x6B 0x65 0x20 0x74 // 'o make t' 0x68 0x65 0x20 0x66 0x69 0x72 0x73 0x74 // 'he first' 0x20 0x66 0x72 0x61 0x6D 0x65 0x20 0x6F // ' frame o' 0x66 0x20 0x74 0x68 0x65 0x20 0x63 0x75 // 'f the cu' 0x72 0x72 0x65 0x6E 0x74 0x20 0x73 0x63 // 'rrent sc' 0x65 0x6E 0x65 0x2E 0x0D 0x0A 0x32 0x09 // 'ene.??2?' 0x43 0x6C 0x69 0x63 0x6B 0x20 0x52 0x65 // 'Click Re' 0x6D 0x6F 0x76 0x65 0x20 0x45 0x76 0x65 // 'move Eve' 0x72 0x79 0x74 0x68 0x69 0x6E 0x67 0x20 // 'rything ' 0x42 0x65 0x66 0x6F 0x72 0x65 0x2E // 'Before.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1B= ktpcHowToScenes1B #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1B, __HELP_NAME("Cut")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1B, __HELP_NAME("Cut")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidCCPSceneChopBack kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTScenes1B ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_17=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1B, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToScenes1B" ITEM "kgobHowtoSequence" ITEM "kidCCPSceneChopBack" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes1B" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_17=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1B, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC1 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_17=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_17, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x03 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x03 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_17=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_17, 0x0) BYTE 0x03 0x03 0x63 0x75 0x74 // '??cut' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1C= ktpcHowToScenes1C #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1C, __HELP_NAME("CO 3) Click anywhere")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1C, __HELP_NAME("CO 3) Click anywhere")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTScenes1C ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_13=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1C, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToScenes1C" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes1C" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_13=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1C, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC4 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_13=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_13, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0B 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x31 0x00 0x00 0x01 // '????1???' 0x05 0x00 0x00 0x00 0x37 0x00 0x00 0x01 // '????7???' 0x01 0x00 0x00 0x00 0x56 0x00 0x00 0x01 // '????V???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x56 0x00 0x00 0x03 // '???V???' 0x00 0x00 0x00 0x00 0x56 0x00 0x00 0x40 // '????V??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x22 0x00 0x00 0x80 // '????"??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x22 0x00 0x00 0x82 // '????"??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_13=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_13, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x61 0x6E 0x79 0x77 0x68 0x65 0x72 0x65 // 'anywhere' 0x20 0x69 0x6E 0x20 0x74 0x68 0x65 0x20 // ' in the ' 0x77 0x6F 0x72 0x6B 0x73 0x70 0x61 0x63 // 'workspac' 0x65 0x2E 0x0D 0x0A 0x41 0x6C 0x6C 0x20 // 'e.??All ' 0x74 0x68 0x65 0x20 0x66 0x72 0x61 0x6D // 'the fram' 0x65 0x73 0x20 0x62 0x65 0x66 0x6F 0x72 // 'es befor' 0x65 0x20 0x74 0x68 0x65 0x20 0x63 0x75 // 'e the cu' 0x72 0x72 0x65 0x6E 0x74 0x20 0x66 0x72 // 'rrent fr' 0x61 0x6D 0x65 0x20 0x61 0x72 0x65 0x20 // 'ame are ' 0x72 0x65 0x6D 0x6F 0x76 0x65 0x64 0x2E // 'removed.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1D= ktpcHowToScenes1D #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1D, __HELP_NAME("What Next--Remove Everything Before")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1D, __HELP_NAME("What Next--Remove Everything Before")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTScenes1D ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1D, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToScenes1D" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes1D" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1D, 0x0) BYTE 0x01 0x00 0x03 0x03 0xAD 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_6=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToScenes2E __HELP_SYMBOL( STN "ktpcHowToScenes2E" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToScenes44 __HELP_SYMBOL( STN "ktpcHowToScenes44" ) ITEM LONG 0xC0000002 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0E 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x34 0x00 0x00 0x01 // '????4???' 0x00 0x00 0x00 0x00 0x36 0x00 0x00 0x01 // '????6???' 0x01 0x00 0x00 0x00 0x52 0x00 0x00 0x01 // '????R???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x34 0x00 0x00 0x03 // '???4???' 0x00 0x00 0x00 0x00 0x36 0x00 0x00 0x40 // '????6??@' 0x02 0x00 0x00 0x00 0x3C 0x00 0x00 0x40 // '??????@' 0x01 0x00 0x00 0x00 0x52 0x00 0x00 0x40 // '????R??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x36 0x00 0x00 0x82 // '????6??' 0x00 0x00 0x00 0x00 0x36 0x00 0x00 0xC0 // '????6??' 0x03 0x00 0x00 0x00 0x3E 0x00 0x00 0xC0 // '????>??' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) BYTE 0x03 0x03 0x52 0x65 0x6D 0x6F 0x76 0x69 // '??Removi' 0x6E 0x67 0x20 0x66 0x72 0x61 0x6D 0x65 // 'ng frame' 0x73 0x20 0x62 0x65 0x66 0x6F 0x72 0x65 // 's before' 0x20 0x74 0x68 0x65 0x20 0x63 0x75 0x72 // ' the cur' 0x72 0x65 0x6E 0x74 0x20 0x66 0x72 0x61 // 'rent fra' 0x6D 0x65 0x2D 0x2D 0x57 0x68 0x61 0x74 // 'me--What' 0x20 0x6E 0x65 0x78 0x74 0x3F 0x0D 0x0A // ' next???' 0x01 0x20 0x55 0x6E 0x64 0x6F 0x0D 0x0A // '? Undo??' 0x01 0x20 0x50 0x6C 0x61 0x79 0x69 0x6E // '? Playin' 0x67 0x20 0x79 0x6F 0x75 0x72 0x20 0x6D // 'g your m' 0x6F 0x76 0x69 0x65 // 'ovie' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1E= ktpcHowToScenes1E #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1E, __HELP_NAME("CO 1) To remove after")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1E, __HELP_NAME("CO 1) To remove after")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence kidCCPSceneChopFwd kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTScenes1E ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_26=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1E, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcHowToScenes1E" ITEM "kgobHowtoSequence" ITEM "kidCCPSceneChopFwd" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes1E" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_26=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x24 0x01 0x00 0x00 // '????$???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_7=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_26, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToScenes2B __HELP_SYMBOL( STN "ktpcHowToScenes2B" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_26=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_26, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0F 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xAA 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x2C 0x00 0x00 0x03 // '???,???' 0x0F 0x00 0x00 0xFD 0x92 0x00 0x00 0x03 // '??????' 0x0A 0x00 0x00 0xFD 0xA9 0x00 0x00 0x03 // '??????' 0x0F 0x00 0x00 0xFD 0xAA 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x30 0x00 0x00 0x04 // '????0???' 0x0D 0x00 0x00 0xFE 0x3F 0x00 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x30 0x00 0x00 0x40 // '????0??@' 0x02 0x00 0x00 0x00 0x3F 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0xAA 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x2E 0x00 0x00 0x80 // '????.??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x8A 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_26=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_26, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x72 0x65 0x6D // '??To rem' 0x6F 0x76 0x65 0x20 0x65 0x76 0x65 0x72 // 'ove ever' 0x79 0x74 0x68 0x69 0x6E 0x67 0x20 0x61 // 'ything a' 0x66 0x74 0x65 0x72 0x20 0x74 0x68 0x65 // 'fter the' 0x20 0x63 0x75 0x72 0x72 0x65 0x6E 0x74 // ' current' 0x20 0x66 0x72 0x61 0x6D 0x65 0x0D 0x0A // ' frame??' 0x31 0x09 0x47 0x6F 0x20 0x74 0x6F 0x20 // '1?Go to ' 0x74 0x68 0x65 0x20 0x70 0x6C 0x61 0x63 // 'the plac' 0x65 0x20 0x69 0x6E 0x20 0x79 0x6F 0x75 // 'e in you' 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 0x20 // 'r movie ' 0x74 0x68 0x61 0x74 0x20 0x79 0x6F 0x75 // 'that you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F // ' want to' 0x20 0x6D 0x61 0x6B 0x65 0x20 0x74 0x68 // ' make th' 0x65 0x20 0x6C 0x61 0x73 0x74 0x20 0x66 // 'e last f' 0x72 0x61 0x6D 0x65 0x20 0x6F 0x66 0x20 // 'rame of ' 0x74 0x68 0x65 0x20 0x63 0x75 0x72 0x72 // 'the curr' 0x65 0x6E 0x74 0x20 0x73 0x63 0x65 0x6E // 'ent scen' 0x65 0x2E 0x0D 0x0A 0x32 0x09 0x43 0x6C // 'e.??2?Cl' 0x69 0x63 0x6B 0x20 0x52 0x65 0x6D 0x6F // 'ick Remo' 0x76 0x65 0x20 0x45 0x76 0x65 0x72 0x79 // 've Every' 0x74 0x68 0x69 0x6E 0x67 0x20 0x41 0x66 // 'thing Af' 0x74 0x65 0x72 0x2E // 'ter.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1F= ktpcHowToScenes1F #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1F, __HELP_NAME("Cut")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1F, __HELP_NAME("Cut")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidCCPSceneChopFwd kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTScenes1F ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1F, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToScenes1F" ITEM "kgobHowtoSequence" ITEM "kidCCPSceneChopFwd" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes1F" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1F, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x03 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x03 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1C, 0x0) BYTE 0x03 0x03 0x43 0x75 0x74 // '??Cut' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_20= ktpcHowToScenes20 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_20, __HELP_NAME("CO 3) Click anywhere")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_20, __HELP_NAME("CO 3) Click anywhere")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTScenes20 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_20, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToScenes20" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes20" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_20, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC1 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_4=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0B 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x31 0x00 0x00 0x01 // '????1???' 0x05 0x00 0x00 0x00 0x36 0x00 0x00 0x01 // '????6???' 0x01 0x00 0x00 0x00 0x55 0x00 0x00 0x01 // '????U???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x55 0x00 0x00 0x03 // '???U???' 0x00 0x00 0x00 0x00 0x55 0x00 0x00 0x40 // '????U??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x22 0x00 0x00 0x80 // '????"??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x22 0x00 0x00 0x82 // '????"??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x61 0x6E 0x79 0x77 0x68 0x65 0x72 0x65 // 'anywhere' 0x20 0x69 0x6E 0x20 0x74 0x68 0x65 0x20 // ' in the ' 0x77 0x6F 0x72 0x6B 0x73 0x70 0x61 0x63 // 'workspac' 0x65 0x2E 0x0D 0x0A 0x41 0x6C 0x6C 0x20 // 'e.??All ' 0x74 0x68 0x65 0x20 0x66 0x72 0x61 0x6D // 'the fram' 0x65 0x73 0x20 0x61 0x66 0x74 0x65 0x72 // 'es after' 0x20 0x74 0x68 0x65 0x20 0x63 0x75 0x72 // ' the cur' 0x72 0x65 0x6E 0x74 0x20 0x66 0x72 0x61 // 'rent fra' 0x6D 0x65 0x20 0x61 0x72 0x65 0x20 0x72 // 'me are r' 0x65 0x6D 0x6F 0x76 0x65 0x64 0x2E // 'emoved.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_21= ktpcHowToScenes21 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_21, __HELP_NAME("What Next--Remove Everything After")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_21, __HELP_NAME("What Next--Remove Everything After")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTScenes21 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_21, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToScenes21" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes21" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_21, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB2 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_18=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2D, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToScenes2E __HELP_SYMBOL( STN "ktpcHowToScenes2E" ) ITEM LONG 0xC0000002 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) FREE FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToScenes44 __HELP_SYMBOL( STN "ktpcHowToScenes44" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_2D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0E 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x33 0x00 0x00 0x01 // '????3???' 0x00 0x00 0x00 0x00 0x35 0x00 0x00 0x01 // '????5???' 0x01 0x00 0x00 0x00 0x51 0x00 0x00 0x01 // '????Q???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x33 0x00 0x00 0x03 // '???3???' 0x00 0x00 0x00 0x00 0x35 0x00 0x00 0x40 // '????5??@' 0x05 0x00 0x00 0x00 0x3B 0x00 0x00 0x40 // '????;??@' 0x00 0x00 0x00 0x00 0x3D 0x00 0x00 0x40 // '????=??@' 0x01 0x00 0x00 0x00 0x51 0x00 0x00 0x40 // '????Q??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x35 0x00 0x00 0x82 // '????5??' 0x00 0x00 0x00 0x00 0x35 0x00 0x00 0xC0 // '????5??' 0x02 0x00 0x00 0x00 0x3D 0x00 0x00 0xC0 // '????=??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2D, 0x0) BYTE 0x03 0x03 0x52 0x65 0x6D 0x6F 0x76 0x69 // '??Removi' 0x6E 0x67 0x20 0x66 0x72 0x61 0x6D 0x65 // 'ng frame' 0x73 0x20 0x61 0x66 0x74 0x65 0x72 0x20 // 's after ' 0x74 0x68 0x65 0x20 0x63 0x75 0x72 0x72 // 'the curr' 0x65 0x6E 0x74 0x20 0x66 0x72 0x61 0x6D // 'ent fram' 0x65 0x2D 0x2D 0x57 0x68 0x61 0x74 0x20 // 'e--What ' 0x6E 0x65 0x78 0x74 0x3F 0x0D 0x0A 0x01 // 'next????' 0x20 0x55 0x6E 0x64 0x6F 0x0D 0x0A 0x01 // ' Undo???' 0x20 0x50 0x6C 0x61 0x79 0x69 0x6E 0x67 // ' Playing' 0x20 0x79 0x6F 0x75 0x72 0x20 0x6D 0x6F // ' your mo' 0x76 0x69 0x65 // 'vie' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_22= ktpcHowToScenes22 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_22, __HELP_NAME("CO 1) To attach one movie")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_22, __HELP_NAME("CO 1) To attach one movie")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence kidSceneSorter kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTScenes22 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_20=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_22, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcHowToScenes22" ITEM "kgobHowtoSequence" ITEM "kidSceneSorter" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes22" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_20=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_22, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD2 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_20=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_20, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x45 0x00 0x00 0x01 // '????E???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x35 0x00 0x00 0x03 // '???5???' 0x0A 0x00 0x00 0xFD 0x45 0x00 0x00 0x03 // '???E???' 0x00 0x00 0x00 0x00 0x45 0x00 0x00 0x40 // '????E??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_20=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_20, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x61 0x74 0x74 // '??To att' 0x61 0x63 0x68 0x20 0x6F 0x6E 0x65 0x20 // 'ach one ' 0x6D 0x6F 0x76 0x69 0x65 0x20 0x74 0x6F // 'movie to' 0x20 0x74 0x68 0x65 0x20 0x65 0x6E 0x64 // ' the end' 0x20 0x6F 0x66 0x20 0x61 0x6E 0x6F 0x74 // ' of anot' 0x68 0x65 0x72 0x2C 0x20 0x63 0x6C 0x69 // 'her, cli' 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 0x53 // 'ck the S' 0x63 0x65 0x6E 0x65 0x20 0x4F 0x72 0x67 // 'cene Org' 0x61 0x6E 0x69 0x7A 0x65 0x72 0x2E // 'anizer.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_23= ktpcHowToScenes23 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_23, __HELP_NAME("CO 2) Click the portfolio")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_23, __HELP_NAME("CO 2) Click the portfolio")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidSSorterOpen kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTScenes23 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_29=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_23, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToScenes23" ITEM "kgobHowtoSequence" ITEM "kidSSorterOpen" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes23" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_29=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_23, 0x0) BYTE 0x01 0x00 0x03 0x03 0x6D 0x00 0x00 0x00 // '????m???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_29=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_29, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x14 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x0A 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x13 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x14 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x14 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_29=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_29, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x50 0x6F 0x72 0x74 // 'the Port' 0x66 0x6F 0x6C 0x69 0x6F 0x2E // 'folio.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_24= ktpcHowToScenes24 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_24, __HELP_NAME("CO 3) Click the movie")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_24, __HELP_NAME("CO 3) Click the movie")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon5 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTScenes24 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_10=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_24, 0x0) GST(0) ITEM "kgobCalloutBalloon5" ITEM "ktpcHowToScenes24" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes24" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_10=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_24, 0x0) BYTE 0x01 0x00 0x03 0x03 0x95 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_10=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_10, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x20 0x00 0x00 0x01 // '???? ???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x20 0x00 0x00 0x03 // '??? ???' 0x00 0x00 0x00 0x00 0x20 0x00 0x00 0x40 // '???? ??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_10=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_10, 0x0) BYTE 0x03 0x03 0x43 0x75 0x74 0x2D 0x2D 0x67 // '??Cut--g' 0x6F 0x20 0x74 0x6F 0x20 0x73 0x74 0x61 // 'o to sta' 0x6E 0x64 0x61 0x72 0x64 0x20 0x69 0x6D // 'ndard im' 0x70 0x6F 0x72 0x74 0x20 0x61 0x75 0x64 // 'port aud' 0x69 0x6F // 'io' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_25= ktpcHowToScenes25 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_25, __HELP_NAME("CO 4) The new movie is ")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_25, __HELP_NAME("CO 4) The new movie is ")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x0 0x57415645 kwavHTScenes25 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_22=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_25, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToScenes25" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes25" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_22=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_25, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_22=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_22, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x03 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x5F 0x00 0x00 0x01 // '????_???' 0x00 0x00 0x00 0x00 0x5F 0x00 0x00 0x40 // '????_??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_22=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_22, 0x0) BYTE 0x03 0x03 0x54 0x68 0x65 0x20 0x6E 0x65 // '??The ne' 0x77 0x20 0x6D 0x6F 0x76 0x69 0x65 0x20 // 'w movie ' 0x69 0x73 0x20 0x61 0x74 0x74 0x61 0x63 // 'is attac' 0x68 0x65 0x64 0x20 0x74 0x6F 0x20 0x74 // 'hed to t' 0x68 0x65 0x20 0x65 0x6E 0x64 0x20 0x6F // 'he end o' 0x66 0x20 0x79 0x6F 0x75 0x72 0x20 0x63 // 'f your c' 0x75 0x72 0x72 0x65 0x6E 0x74 0x20 0x6D // 'urrent m' 0x6F 0x76 0x69 0x65 0x2E 0x20 0x20 0x54 // 'ovie. T' 0x6F 0x20 0x72 0x65 0x74 0x75 0x72 0x6E // 'o return' 0x20 0x74 0x6F 0x20 0x79 0x6F 0x75 0x72 // ' to your' 0x20 0x6D 0x6F 0x76 0x69 0x65 0x2C 0x20 // ' movie, ' 0x63 0x6C 0x69 0x63 0x6B 0x20 0x4F 0x4B // 'click OK' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_26= ktpcHowToScenes26 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_26, __HELP_NAME("CO 1) To undo the last thing")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_26, __HELP_NAME("CO 1) To undo the last thing")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidUndo kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTScenes26 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_9=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_26, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToScenes26" ITEM "kgobHowtoSequence" ITEM "kidUndo" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes26" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_9=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_26, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB6 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_9=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_9, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0E 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x54 0x00 0x00 0x01 // '????T???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x1E 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x28 0x00 0x00 0x03 // '???(???' 0x0A 0x00 0x00 0xFD 0x2C 0x00 0x00 0x03 // '???,???' 0x0F 0x00 0x00 0xFD 0x2F 0x00 0x00 0x03 // '???/???' 0x0A 0x00 0x00 0xFD 0x47 0x00 0x00 0x03 // '???G???' 0x0F 0x00 0x00 0xFD 0x4F 0x00 0x00 0x03 // '???O???' 0x0A 0x00 0x00 0xFD 0x53 0x00 0x00 0x03 // '???S???' 0x0F 0x00 0x00 0xFD 0x54 0x00 0x00 0x03 // '???T???' 0x00 0x00 0x00 0x00 0x54 0x00 0x00 0x40 // '????T??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x47 0x00 0x00 0x82 // '????G??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_9=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_9, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x75 0x6E 0x64 // '??To und' 0x6F 0x20 0x74 0x68 0x65 0x20 0x6C 0x61 // 'o the la' 0x73 0x74 0x20 0x74 0x68 0x69 0x6E 0x67 // 'st thing' 0x20 0x79 0x6F 0x75 0x20 0x64 0x69 0x64 // ' you did' 0x0D 0x0A 0x95 0x09 0x43 0x6C 0x69 0x63 // '???Clic' 0x6B 0x20 0x55 0x6E 0x64 0x6F 0x2E 0x0D // 'k Undo.?' 0x0A 0x54 0x6F 0x20 0x72 0x65 0x64 0x6F // '?To redo' 0x20 0x77 0x68 0x61 0x74 0x20 0x79 0x6F // ' what yo' 0x75 0x20 0x75 0x6E 0x64 0x69 0x64 0x0D // 'u undid?' 0x0A 0x95 0x09 0x43 0x6C 0x69 0x63 0x6B // '??Click' 0x20 0x52 0x65 0x64 0x6F 0x2E // ' Redo.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_27= ktpcHowToScenes27 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_27, __HELP_NAME("Def: 4 choices")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_27, __HELP_NAME("Def: 4 choices")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTScenes27 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_37=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_27, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToScenes27" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTScenes27" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_37=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_27, 0x0) BYTE 0x01 0x00 0x03 0x03 0x98 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_B=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_37, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSOTransition1 __HELP_SYMBOL( STN "mbmpSOTransition1" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSOTransition2 __HELP_SYMBOL( STN "mbmpSOTransition2" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSOTransition3 __HELP_SYMBOL( STN "mbmpSOTransition3" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSOTransition4 __HELP_SYMBOL( STN "mbmpSOTransition4" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_37=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_37, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x10 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x14 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x18 0x00 0x00 0x01 // '????????' 0x01 0xFD 0x00 0x00 0x24 0x00 0x00 0x01 // '???$???' 0x01 0x00 0x00 0x00 0x28 0x00 0x00 0x01 // '????(???' 0x01 0xFD 0x00 0x00 0x30 0x00 0x00 0x01 // '???0???' 0x01 0x00 0x00 0x00 0x34 0x00 0x00 0x01 // '????4???' 0x01 0xFD 0x00 0x00 0x47 0x00 0x00 0x01 // '???G???' 0x01 0x00 0x00 0x00 0x4B 0x00 0x00 0x01 // '????K???' 0x01 0xFD 0x00 0x00 0x5E 0x00 0x00 0x01 // '???^???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x49 0x00 0x00 0x82 // '????I??' 0x00 0x00 0x00 0x00 0x16 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0x26 0x00 0x00 0xC0 // '????&??' 0x02 0x00 0x00 0x00 0x32 0x00 0x00 0xC0 // '????2??' 0x03 0x00 0x00 0x00 0x49 0x00 0x00 0xC0 // '????I??' 0x04 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_37=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_37, 0x0) BYTE 0x03 0x03 0x34 0x20 0x74 0x72 0x61 0x6E // '??4 tran' 0x73 0x69 0x74 0x69 0x6F 0x6E 0x20 0x63 // 'sition c' 0x68 0x6F 0x69 0x63 0x65 0x73 0x0D 0x0A // 'hoices??' 0x01 0x09 0x43 0x75 0x74 0x20 0x74 0x6F // '??Cut to' 0x20 0x62 0x6C 0x61 0x63 0x6B 0x0D 0x0A // ' black??' 0x01 0x09 0x44 0x69 0x73 0x73 0x6F 0x6C // '??Dissol' 0x76 0x65 0x0D 0x0A 0x01 0x09 0x44 0x69 // 've????Di' 0x73 0x73 0x6F 0x6C 0x76 0x65 0x20 0x77 // 'ssolve w' 0x69 0x74 0x68 0x20 0x62 0x6C 0x61 0x63 // 'ith blac' 0x6B 0x0D 0x0A 0x01 0x09 0x44 0x69 0x73 // 'k????Dis' 0x73 0x6F 0x6C 0x76 0x65 0x20 0x77 0x69 // 'solve wi' 0x74 0x68 0x20 0x77 0x68 0x69 0x74 0x65 // 'th white' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_28= ktpcHowToScenes28 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_28, __HELP_NAME("Cut")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_28, __HELP_NAME("Cut")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTScenes28 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_0=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_28, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToScenes28" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes28" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_0=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_28, 0x0) BYTE 0x01 0x00 0x03 0x03 0x1A 0x00 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_0=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x03 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x03 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_0=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) BYTE 0x03 0x03 0x43 0x75 0x74 // '??Cut' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_29= ktpcHowToScenes29 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_29, __HELP_NAME("What Next--Attach Movie")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_29, __HELP_NAME("What Next--Attach Movie")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTScenes29 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_29, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToScenes29" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes29" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_29, 0x0) BYTE 0x01 0x00 0x03 0x03 0xBB 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1B=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3E, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToScenes2E __HELP_SYMBOL( STN "ktpcHowToScenes2E" ) ITEM LONG 0xC0000002 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) FREE FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToScenes44 __HELP_SYMBOL( STN "ktpcHowToScenes44" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_3E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0E 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x36 0x00 0x00 0x01 // '????6???' 0x00 0x00 0x00 0x00 0x38 0x00 0x00 0x01 // '????8???' 0x01 0x00 0x00 0x00 0x54 0x00 0x00 0x01 // '????T???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x36 0x00 0x00 0x03 // '???6???' 0x00 0x00 0x00 0x00 0x38 0x00 0x00 0x40 // '????8??@' 0x05 0x00 0x00 0x00 0x3E 0x00 0x00 0x40 // '????>??@' 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0x40 // '????@??@' 0x01 0x00 0x00 0x00 0x54 0x00 0x00 0x40 // '????T??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x38 0x00 0x00 0x82 // '????8??' 0x00 0x00 0x00 0x00 0x38 0x00 0x00 0xC0 // '????8??' 0x02 0x00 0x00 0x00 0x40 0x00 0x00 0xC0 // '????@??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3E, 0x0) BYTE 0x03 0x03 0x41 0x74 0x74 0x61 0x63 0x68 // '??Attach' 0x69 0x6E 0x67 0x20 0x6F 0x6E 0x65 0x20 // 'ing one ' 0x6D 0x6F 0x76 0x69 0x65 0x20 0x74 0x6F // 'movie to' 0x20 0x74 0x68 0x65 0x20 0x65 0x6E 0x64 // ' the end' 0x20 0x6F 0x66 0x20 0x61 0x6E 0x6F 0x74 // ' of anot' 0x68 0x65 0x72 0x2D 0x2D 0x20 0x57 0x68 // 'her-- Wh' 0x61 0x74 0x20 0x6E 0x65 0x78 0x74 0x3F // 'at next?' 0x0D 0x0A 0x01 0x20 0x55 0x6E 0x64 0x6F // '??? Undo' 0x0D 0x0A 0x01 0x20 0x50 0x6C 0x61 0x79 // '??? Play' 0x69 0x6E 0x67 0x20 0x79 0x6F 0x75 0x72 // 'ing your' 0x20 0x6D 0x6F 0x76 0x69 0x65 // ' movie' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2A= ktpcHowToScenes2A #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2A, __HELP_NAME("What Next--Undo")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2A, __HELP_NAME("What Next--Undo")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTScenes2A ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_40=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2A, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToScenes2A" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes2A" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_40=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2A, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD1 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_24=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_40, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToScenes2E __HELP_SYMBOL( STN "ktpcHowToScenes2E" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_40=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_40, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0B 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1F 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x21 0x00 0x00 0x01 // '????!???' 0x01 0x00 0x00 0x00 0x35 0x00 0x00 0x01 // '????5???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x1F 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x21 0x00 0x00 0x40 // '????!??@' 0x02 0x00 0x00 0x00 0x35 0x00 0x00 0x40 // '????5??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x21 0x00 0x00 0x82 // '????!??' 0x00 0x00 0x00 0x00 0x21 0x00 0x00 0xC0 // '????!??' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_40=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_40, 0x0) BYTE 0x03 0x03 0x55 0x6E 0x64 0x6F 0x69 0x6E // '??Undoin' 0x67 0x20 0x61 0x6E 0x64 0x20 0x72 0x65 // 'g and re' 0x64 0x6F 0x69 0x6E 0x67 0x2D 0x2D 0x57 // 'doing--W' 0x68 0x61 0x74 0x20 0x6E 0x65 0x78 0x74 // 'hat next' 0x3F 0x0D 0x0A 0x01 0x20 0x50 0x6C 0x61 // '???? Pla' 0x79 0x69 0x6E 0x67 0x20 0x79 0x6F 0x75 // 'ying you' 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 // 'r movie' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2B= ktpcHowToScenes2B #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2B, __HELP_NAME("Def: Go to the place")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2B, __HELP_NAME("Def: Go to the place")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTScenes2B ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2B, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToScenes2B" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTScenes2B" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x38 0x01 0x00 0x00 // '????8???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_14=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) AG(4) ITEM LONG 0x2000002 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpFrameSlider __HELP_SYMBOL( STN "mbmpFrameSlider" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSceneSlider __HELP_SYMBOL( STN "mbmpSceneSlider" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_1=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x13 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0F 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x4D 0x01 0x00 0x01 // '????M???' 0x00 0x00 0x00 0x00 0x5C 0x00 0x00 0x02 // '????\???' 0x01 0x00 0x00 0x00 0x62 0x00 0x00 0x02 // '????b???' 0x00 0x00 0x00 0x00 0xF2 0x00 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0xF8 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x3D 0x00 0x00 0x03 // '???=???' 0x00 0x00 0x00 0x00 0xB9 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xD4 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x59 0x00 0x00 0x80 // '????Y??' 0x00 0x00 0x03 0x00 0xB9 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0xEF 0x00 0x00 0x80 // '??????' 0x00 0x00 0x03 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xF2 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x59 0x00 0x00 0xC0 // '????Y??' 0x02 0x00 0x00 0x00 0xEF 0x00 0x00 0xC0 // '??????' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x03 0x03 0x47 0x6F 0x20 0x74 0x6F 0x20 // '??Go to ' 0x74 0x68 0x65 0x20 0x70 0x6C 0x61 0x63 // 'the plac' 0x65 0x0D 0x0A 0x54 0x6F 0x20 0x6D 0x6F // 'e??To mo' 0x76 0x65 0x20 0x66 0x6F 0x72 0x77 0x61 // 've forwa' 0x72 0x64 0x73 0x20 0x6F 0x72 0x20 0x62 // 'rds or b' 0x61 0x63 0x6B 0x77 0x61 0x72 0x64 0x73 // 'ackwards' 0x20 0x77 0x69 0x74 0x68 0x69 0x6E 0x20 // ' within ' 0x61 0x20 0x73 0x63 0x65 0x6E 0x65 0x0D // 'a scene?' 0x0A 0x95 0x09 0x55 0x73 0x65 0x20 0x74 // '??Use t' 0x68 0x65 0x20 0x46 0x72 0x61 0x6D 0x65 // 'he Frame' 0x20 0x53 0x6C 0x69 0x64 0x65 0x72 0x2E // ' Slider.' 0x20 0x0D 0x0A 0x01 0x0D 0x0A 0x43 0x6C // ' ?????Cl' 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 // 'ick the ' 0x46 0x69 0x72 0x73 0x74 0x2C 0x20 0x50 // 'First, P' 0x72 0x65 0x76 0x69 0x6F 0x75 0x73 0x2C // 'revious,' 0x20 0x4E 0x65 0x78 0x74 0x2C 0x20 0x6F // ' Next, o' 0x72 0x20 0x4C 0x61 0x73 0x74 0x20 0x41 // 'r Last A' 0x72 0x72 0x6F 0x77 0x20 0x6F 0x72 0x20 // 'rrow or ' 0x64 0x72 0x61 0x67 0x20 0x74 0x68 0x65 // 'drag the' 0x20 0x73 0x6C 0x69 0x64 0x65 0x72 0x20 // ' slider ' 0x69 0x6E 0x20 0x74 0x68 0x65 0x20 0x6D // 'in the m' 0x69 0x64 0x64 0x6C 0x65 0x20 0x6F 0x66 // 'iddle of' 0x20 0x74 0x68 0x65 0x20 0x62 0x61 0x72 // ' the bar' 0x2E 0x0D 0x0A 0x54 0x6F 0x20 0x6D 0x6F // '.??To mo' 0x76 0x65 0x20 0x66 0x72 0x6F 0x6D 0x20 // 've from ' 0x73 0x63 0x65 0x6E 0x65 0x20 0x74 0x6F // 'scene to' 0x20 0x73 0x63 0x65 0x6E 0x65 0x0D 0x0A // ' scene??' 0x95 0x09 0x55 0x73 0x65 0x20 0x74 0x68 // '?Use th' 0x65 0x20 0x53 0x63 0x65 0x6E 0x65 0x20 // 'e Scene ' 0x53 0x6C 0x69 0x64 0x65 0x72 0x2E 0x0D // 'Slider.?' 0x0A 0x01 0x0D 0x0A 0x43 0x6C 0x69 0x63 // '????Clic' 0x6B 0x20 0x74 0x68 0x65 0x20 0x46 0x69 // 'k the Fi' 0x72 0x73 0x74 0x2C 0x20 0x50 0x72 0x65 // 'rst, Pre' 0x76 0x69 0x6F 0x75 0x73 0x2C 0x20 0x4E // 'vious, N' 0x65 0x78 0x74 0x2C 0x20 0x6F 0x72 0x20 // 'ext, or ' 0x4C 0x61 0x73 0x74 0x20 0x41 0x72 0x72 // 'Last Arr' 0x6F 0x77 0x20 0x6F 0x72 0x20 0x64 0x72 // 'ow or dr' 0x61 0x67 0x20 0x74 0x68 0x65 0x20 0x73 // 'ag the s' 0x6C 0x69 0x64 0x65 0x72 0x20 0x69 0x6E // 'lider in' 0x20 0x74 0x68 0x65 0x20 0x6D 0x69 0x64 // ' the mid' 0x64 0x6C 0x65 0x20 0x6F 0x66 0x20 0x74 // 'dle of t' 0x68 0x65 0x20 0x62 0x61 0x72 0x2E // 'he bar.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2C= ktpcHowToScenes2C #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2C, __HELP_NAME("Tip: Change Scene Order")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2C, __HELP_NAME("Tip: Change Scene Order")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTScenes2C ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_28=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2C, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToScenes2C" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTScenes2C" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_28=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x34 0x01 0x00 0x00 // '????4???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_16=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_28, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) FREE ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSceneSorter __HELP_SYMBOL( STN "mbmpSceneSorter" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_28=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_28, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0F 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1B 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x38 0x00 0x00 0x01 // '????8???' 0x01 0xF1 0x00 0x00 0x4D 0x00 0x00 0x01 // '???M???' 0x01 0xF6 0x00 0x00 0x69 0x00 0x00 0x01 // '???i???' 0x01 0x00 0x00 0x00 0x92 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x03 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x1B 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x38 0x00 0x00 0x03 // '???8???' 0x0F 0x00 0x00 0xFD 0x92 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x38 0x00 0x00 0x80 // '????8??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x6C 0x00 0x00 0x82 // '????l??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0x69 0x00 0x00 0xC0 // '????i??' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_28=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_28, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x43 0x68 0x61 // '??? Cha' 0x6E 0x67 0x69 0x6E 0x67 0x20 0x74 0x68 // 'nging th' 0x65 0x20 0x73 0x63 0x65 0x6E 0x65 0x20 // 'e scene ' 0x6F 0x72 0x64 0x65 0x72 0x0D 0x0A 0x54 // 'order??T' 0x6F 0x20 0x63 0x68 0x61 0x6E 0x67 0x65 // 'o change' 0x20 0x74 0x68 0x65 0x20 0x73 0x63 0x65 // ' the sce' 0x6E 0x65 0x20 0x6F 0x72 0x64 0x65 0x72 // 'ne order' 0x0D 0x0A 0x31 0x09 0x43 0x6C 0x69 0x63 // '??1?Clic' 0x6B 0x20 0x4D 0x6F 0x72 0x65 0x20 0x54 // 'k More T' 0x6F 0x6F 0x6C 0x73 0x2E 0x0D 0x0A 0x32 // 'ools.??2' 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 0x74 // '?Click t' 0x68 0x65 0x20 0x53 0x63 0x65 0x6E 0x65 // 'he Scene' 0x20 0x4F 0x72 0x67 0x61 0x6E 0x69 0x7A // ' Organiz' 0x65 0x72 0x2D 0x01 0x0D 0x0A 0x33 0x09 // 'er-???3?' 0x44 0x72 0x61 0x67 0x20 0x74 0x68 0x65 // 'Drag the' 0x20 0x73 0x63 0x65 0x6E 0x65 0x73 0x20 // ' scenes ' 0x77 0x68 0x65 0x72 0x65 0x20 0x79 0x6F // 'where yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 // 'u want t' 0x68 0x65 0x6D 0x2E // 'hem.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2D= ktpcHowToScenes2D #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2D, __HELP_NAME("Tip: Remove Scene")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2D, __HELP_NAME("Tip: Remove Scene")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTScenes2D ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_39=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2D, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToScenes2D" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTScenes2D" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_39=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x10 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_10=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_39, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpCutCopyPaste __HELP_SYMBOL( STN "mbmpCutCopyPaste" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpCCPRemoveScene __HELP_SYMBOL( STN "mbmpCCPRemoveScene" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_39=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_39, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x12 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x28 0x00 0x00 0x01 // '????(???' 0x01 0xF6 0x00 0x00 0x4D 0x00 0x00 0x01 // '???M???' 0x01 0x00 0x00 0x00 0x50 0x00 0x00 0x01 // '????P???' 0x01 0xF6 0x00 0x00 0x6C 0x00 0x00 0x01 // '???l???' 0x01 0x00 0x00 0x00 0x6D 0x00 0x00 0x01 // '????m???' 0x00 0x00 0x00 0x00 0x03 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x13 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x28 0x00 0x00 0x03 // '???(???' 0x0F 0x00 0x00 0xFD 0x4D 0x00 0x00 0x03 // '???M???' 0x0A 0x00 0x00 0xFD 0x4E 0x00 0x00 0x03 // '???N???' 0x0F 0x00 0x00 0xFD 0x6D 0x00 0x00 0x03 // '???m???' 0x00 0x00 0x00 0x00 0x28 0x00 0x00 0x80 // '????(??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x50 0x00 0x00 0x82 // '????P??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0x4D 0x00 0x00 0xC0 // '????M??' 0x02 0x00 0x00 0x00 0x6C 0x00 0x00 0xC0 // '????l??' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_39=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_39, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x52 0x65 0x6D // '??? Rem' 0x6F 0x76 0x69 0x6E 0x67 0x20 0x61 0x20 // 'oving a ' 0x73 0x63 0x65 0x6E 0x65 0x0D 0x0A 0x54 // 'scene??T' 0x6F 0x20 0x72 0x65 0x6D 0x6F 0x76 0x65 // 'o remove' 0x20 0x61 0x20 0x73 0x63 0x65 0x6E 0x65 // ' a scene' 0x0D 0x0A 0x31 0x09 0x43 0x6C 0x69 0x63 // '??1?Clic' 0x6B 0x20 0x74 0x68 0x65 0x20 0x43 0x75 // 'k the Cu' 0x74 0x2C 0x20 0x43 0x6F 0x70 0x79 0x2C // 't, Copy,' 0x20 0x26 0x20 0x50 0x61 0x73 0x74 0x65 // ' & Paste' 0x20 0x54 0x6F 0x6F 0x6C 0x73 0x2D 0x01 // ' Tools-?' 0x0D 0x0A 0x32 0x09 0x43 0x6C 0x69 0x63 // '??2?Clic' 0x6B 0x20 0x52 0x65 0x6D 0x6F 0x76 0x65 // 'k Remove' 0x20 0x45 0x6E 0x74 0x69 0x72 0x65 0x20 // ' Entire ' 0x53 0x63 0x65 0x6E 0x65 0x2D 0x01 // 'Scene-?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2E= ktpcHowToScenes2E #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2E, __HELP_NAME("Tip: Play Movie")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2E, __HELP_NAME("Tip: Play Movie")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTScenes2E ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2E, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToScenes2E" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTScenes2E" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x5F 0x01 0x00 0x00 // '????_???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_C=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpPlay __HELP_SYMBOL( STN "mbmpPlay" ) FREE ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpFrameSlider __HELP_SYMBOL( STN "mbmpFrameSlider" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSceneSlider __HELP_SYMBOL( STN "mbmpSceneSlider" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x12 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xE9 0x00 0x00 0x01 // '???????' 0x01 0xF1 0x00 0x00 0x01 0x01 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0x7A 0x01 0x00 0x01 // '????z???' 0x00 0x00 0x00 0x00 0x03 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x15 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x2B 0x00 0x00 0x03 // '???+???' 0x0F 0x00 0x00 0xFD 0xE7 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x2B 0x00 0x00 0x80 // '????+??' 0x00 0x00 0x02 0x00 0x80 0x00 0x00 0x80 // '??????' 0x00 0x00 0x03 0x00 0xE9 0x00 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0x04 0x01 0x00 0x80 // '???????' 0x00 0x00 0x03 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x04 0x01 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0x80 0x00 0x00 0xC0 // '??????' 0x04 0x00 0x00 0x00 0x83 0x00 0x00 0xC0 // '??????' 0x05 0x00 0x00 0x00 0x01 0x01 0x00 0xC0 // '???????' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x50 0x6C 0x61 // '??? Pla' 0x79 0x69 0x6E 0x67 0x20 0x79 0x6F 0x75 // 'ying you' 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 0x0D // 'r movie?' 0x0A 0x54 0x6F 0x20 0x70 0x6C 0x61 0x79 // '?To play' 0x20 0x79 0x6F 0x75 0x72 0x20 0x6D 0x6F // ' your mo' 0x76 0x69 0x65 0x0D 0x0A 0x31 0x09 0x55 // 'vie??1?U' 0x73 0x65 0x20 0x74 0x68 0x65 0x20 0x46 // 'se the F' 0x72 0x61 0x6D 0x65 0x20 0x61 0x6E 0x64 // 'rame and' 0x20 0x53 0x63 0x65 0x6E 0x65 0x20 0x53 // ' Scene S' 0x6C 0x69 0x64 0x65 0x72 0x73 0x20 0x74 // 'liders t' 0x6F 0x20 0x72 0x65 0x77 0x69 0x6E 0x64 // 'o rewind' 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F 0x76 // ' the mov' 0x69 0x65 0x20 0x74 0x6F 0x20 0x74 0x68 // 'ie to th' 0x65 0x20 0x70 0x61 0x72 0x74 0x20 0x79 // 'e part y' 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 // 'ou want ' 0x74 0x6F 0x20 0x70 0x6C 0x61 0x79 0x2E // 'to play.' 0x0D 0x0A 0x01 0x0D 0x0A 0x01 0x0D 0x0A // '????????' 0x54 0x6F 0x20 0x6D 0x6F 0x76 0x65 0x20 // 'To move ' 0x77 0x69 0x74 0x68 0x69 0x6E 0x20 0x61 // 'within a' 0x20 0x73 0x63 0x65 0x6E 0x65 0x2C 0x20 // ' scene, ' 0x75 0x73 0x65 0x20 0x74 0x68 0x65 0x20 // 'use the ' 0x46 0x72 0x61 0x6D 0x65 0x20 0x53 0x6C // 'Frame Sl' 0x69 0x64 0x65 0x72 0x2E 0x0D 0x0A 0x54 // 'ider.??T' 0x6F 0x20 0x6D 0x6F 0x76 0x65 0x20 0x66 // 'o move f' 0x72 0x6F 0x6D 0x20 0x73 0x63 0x65 0x6E // 'rom scen' 0x65 0x20 0x74 0x6F 0x20 0x73 0x63 0x65 // 'e to sce' 0x6E 0x65 0x2C 0x20 0x75 0x73 0x65 0x20 // 'ne, use ' 0x74 0x68 0x65 0x20 0x53 0x63 0x65 0x6E // 'the Scen' 0x65 0x20 0x53 0x6C 0x69 0x64 0x65 0x72 // 'e Slider' 0x2E 0x0D 0x0A 0x32 0x09 0x43 0x6C 0x69 // '.??2?Cli' 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 0x50 // 'ck the P' 0x6C 0x61 0x79 0x20 0x62 0x75 0x74 0x74 // 'lay butt' 0x6F 0x6E 0x2D 0x01 0x0D 0x0A 0x4E 0x6F // 'on-???No' 0x74 0x65 0x3A 0x20 0x20 0x49 0x66 0x20 // 'te: If ' 0x79 0x6F 0x75 0x27 0x72 0x65 0x20 0x61 // 'you're a' 0x74 0x20 0x74 0x68 0x65 0x20 0x6C 0x61 // 't the la' 0x73 0x74 0x20 0x66 0x72 0x61 0x6D 0x65 // 'st frame' 0x20 0x6F 0x66 0x20 0x74 0x68 0x65 0x20 // ' of the ' 0x6D 0x6F 0x76 0x69 0x65 0x20 0x77 0x68 // 'movie wh' 0x65 0x6E 0x20 0x79 0x6F 0x75 0x20 0x63 // 'en you c' 0x6C 0x69 0x63 0x6B 0x20 0x50 0x6C 0x61 // 'lick Pla' 0x79 0x2C 0x20 0x74 0x68 0x65 0x20 0x6D // 'y, the m' 0x6F 0x76 0x69 0x65 0x20 0x61 0x75 0x74 // 'ovie aut' 0x6F 0x6D 0x61 0x74 0x69 0x63 0x61 0x6C // 'omatical' 0x6C 0x79 0x20 0x72 0x65 0x77 0x69 0x6E // 'ly rewin' 0x64 0x73 0x20 0x74 0x6F 0x20 0x74 0x68 // 'ds to th' 0x65 0x20 0x62 0x65 0x67 0x69 0x6E 0x6E // 'e beginn' 0x69 0x6E 0x67 0x2E // 'ing.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2F= ktpcHowToScenes2F #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2F, __HELP_NAME("Tip: Remove Pause")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2F, __HELP_NAME("Tip: Remove Pause")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTScenes2F ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2F, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToScenes2F" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTScenes2F" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2F, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_19=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3A, 0x0) AG(4) FREE FREE FREE FREE FREE ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_3A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x10 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x13 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x15 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x26 0x00 0x00 0x01 // '????&???' 0x00 0x00 0x00 0x00 0x28 0x00 0x00 0x01 // '????(???' 0x01 0x00 0x00 0x00 0x97 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x03 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x13 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x15 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x26 0x00 0x00 0x03 // '???&???' 0x0F 0x00 0x00 0xFD 0x97 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x60 0x00 0x00 0x80 // '????`??' 0x00 0x00 0x03 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x60 0x00 0x00 0x82 // '????`??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x06 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3A, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x52 0x65 0x6D // '??? Rem' 0x6F 0x76 0x69 0x6E 0x67 0x20 0x61 0x20 // 'oving a ' 0x70 0x61 0x75 0x73 0x65 0x0D 0x0A 0x54 // 'pause??T' 0x6F 0x20 0x72 0x65 0x6D 0x6F 0x76 0x65 // 'o remove' 0x20 0x61 0x20 0x70 0x61 0x75 0x73 0x65 // ' a pause' 0x0D 0x0A 0x95 0x09 0x54 0x75 0x72 0x6E // '???Turn' 0x20 0x6F 0x66 0x66 0x20 0x57 0x61 0x69 // ' off Wai' 0x74 0x20 0x66 0x6F 0x72 0x20 0x53 0x6F // 't for So' 0x75 0x6E 0x64 0x20 0x74 0x6F 0x20 0x45 // 'und to E' 0x6E 0x64 0x20 0x62 0x79 0x20 0x63 0x6C // 'nd by cl' 0x69 0x63 0x6B 0x69 0x6E 0x67 0x20 0x69 // 'icking i' 0x74 0x20 0x61 0x67 0x61 0x69 0x6E 0x2E // 't again.' 0x0D 0x0A 0x54 0x68 0x65 0x20 0x62 0x75 // '??The bu' 0x74 0x74 0x6F 0x6E 0x20 0x69 0x73 0x20 // 'tton is ' 0x6F 0x66 0x66 0x20 0x77 0x68 0x65 0x6E // 'off when' 0x20 0x79 0x6F 0x75 0x20 0x6E 0x6F 0x20 // ' you no ' 0x6C 0x6F 0x6E 0x67 0x65 0x72 0x20 0x73 // 'longer s' 0x65 0x65 0x20 0x74 0x68 0x65 0x20 0x72 // 'ee the r' 0x65 0x64 0x20 0x6C 0x69 0x67 0x68 0x74 // 'ed light' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_30= ktpcHowToScenes30 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_30, __HELP_NAME("Cut")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_30, __HELP_NAME("Cut")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTScenes30 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_30, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToScenes30" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes30" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_30, 0x0) BYTE 0x01 0x00 0x03 0x03 0x59 0x01 0x00 0x00 // '????Y???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2A, 0x0) BYTE 0x03 0x03 0x43 0x75 0x74 // '??Cut' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_31= ktpcHowToScenes31 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_31, __HELP_NAME("Tip: Moving Scene to Scene")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_31, __HELP_NAME("Tip: Moving Scene to Scene")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTScenes31 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_31, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToScenes31" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTScenes31" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_31, 0x0) BYTE 0x01 0x00 0x03 0x03 0x51 0x01 0x00 0x00 // '????Q???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1D=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3B, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ITEM LONG 0x2000004 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSceneSlider __HELP_SYMBOL( STN "mbmpSceneSlider" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_3B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x17 0x00 0x00 0x00 0x02 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1D 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x1F 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x8D 0x00 0x00 0x01 // '???????' 0x05 0x00 0x00 0x00 0x8F 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xB9 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x1F 0x00 0x00 0x02 // '????????' 0x02 0x00 0x00 0x00 0x22 0x00 0x00 0x02 // '????"???' 0x00 0x00 0x00 0x00 0x35 0x00 0x00 0x02 // '????5???' 0x02 0x00 0x00 0x00 0x3A 0x00 0x00 0x02 // '????:???' 0x00 0x00 0x00 0x00 0x5E 0x00 0x00 0x02 // '????^???' 0x02 0x00 0x00 0x00 0x64 0x00 0x00 0x02 // '????d???' 0x00 0x00 0x00 0x00 0x95 0x00 0x00 0x02 // '???????' 0x02 0x00 0x00 0x00 0xB9 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0x1F 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x3C 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0x40 // '????@??@' 0x01 0x00 0x00 0x00 0x46 0x00 0x00 0x40 // '????F??@' 0x00 0x00 0x00 0x00 0x48 0x00 0x00 0x40 // '????H??@' 0x02 0x00 0x00 0x00 0x5C 0x00 0x00 0x40 // '????\??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x40 0x00 0x00 0x82 // '????@??' 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0xC0 // '????@??' 0x03 0x00 0x00 0x00 0x48 0x00 0x00 0xC0 // '????H??' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1E, 0x0) BYTE 0x03 0x03 0x41 0x64 0x64 0x69 0x6E 0x67 // '??Adding' 0x20 0x61 0x20 0x74 0x72 0x61 0x6E 0x73 // ' a trans' 0x69 0x74 0x69 0x6F 0x6E 0x20 0x74 0x6F // 'ition to' 0x20 0x74 0x68 0x65 0x20 0x62 0x65 0x67 // ' the beg' 0x69 0x6E 0x6E 0x69 0x6E 0x67 0x20 0x6F // 'inning o' 0x66 0x20 0x79 0x6F 0x75 0x72 0x20 0x6D // 'f your m' 0x6F 0x76 0x69 0x65 0x2D 0x2D 0x57 0x68 // 'ovie--Wh' 0x61 0x74 0x20 0x6E 0x65 0x78 0x74 0x3F // 'at next?' 0x0D 0x0A 0x01 0x20 0x55 0x6E 0x64 0x6F // '??? Undo' 0x0D 0x0A 0x01 0x20 0x50 0x6C 0x61 0x79 // '??? Play' 0x69 0x6E 0x67 0x20 0x79 0x6F 0x75 0x72 // 'ing your' 0x20 0x6D 0x6F 0x76 0x69 0x65 // ' movie' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3B= ktpcHowToScenes3B #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3B, __HELP_NAME("CO 2a) Click the scene.")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3B, __HELP_NAME("CO 2a) Click the scene.")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTScenes3B ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3B, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToScenes3B" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTScenes3B" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x61 0x00 0x00 0x00 // '????a???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x10 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x10 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x10 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2B, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x73 0x63 0x65 0x6E // 'the scen' 0x65 0x2E // 'e.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_44= ktpcHowToScenes44 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_44, __HELP_NAME("Tip: Undo")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_44, __HELP_NAME("Tip: Undo")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTScenes44 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_33=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_44, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToScenes44" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTScenes44" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_33=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_44, 0x0) BYTE 0x01 0x00 0x03 0x03 0xBB 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_3=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_33, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpUndo __HELP_SYMBOL( STN "mbmpUndo" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpRedo __HELP_SYMBOL( STN "mbmpRedo" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_33=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_33, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x14 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0C 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x0E 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2C 0x00 0x00 0x01 // '????,???' 0x00 0x00 0x00 0x00 0x2E 0x00 0x00 0x01 // '????.???' 0x01 0xF6 0x00 0x00 0x3B 0x00 0x00 0x01 // '???;???' 0x01 0x00 0x00 0x00 0x3C 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0x56 0x00 0x00 0x01 // '????V???' 0x01 0xF6 0x00 0x00 0x63 0x00 0x00 0x01 // '???c???' 0x01 0x00 0x00 0x00 0x64 0x00 0x00 0x01 // '????d???' 0x00 0x00 0x00 0x00 0x0E 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x2C 0x00 0x00 0x03 // '???,???' 0x00 0x00 0x00 0x00 0x3E 0x00 0x00 0x03 // '????>???' 0x0A 0x00 0x00 0xFD 0x54 0x00 0x00 0x03 // '???T???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x56 0x00 0x00 0x82 // '????V??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0x3B 0x00 0x00 0xC0 // '????;??' 0x02 0x00 0x00 0x00 0x63 0x00 0x00 0xC0 // '????c??' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_33=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_33, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x55 0x6E 0x64 // '??? Und' 0x6F 0x2F 0x52 0x65 0x64 0x6F 0x0D 0x0A // 'o/Redo??' 0x54 0x6F 0x20 0x75 0x6E 0x64 0x6F 0x20 // 'To undo ' 0x74 0x68 0x65 0x20 0x6C 0x61 0x73 0x74 // 'the last' 0x20 0x74 0x68 0x69 0x6E 0x67 0x20 0x79 // ' thing y' 0x6F 0x75 0x20 0x64 0x69 0x64 0x0D 0x0A // 'ou did??' 0x95 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 // '?Click ' 0x55 0x6E 0x64 0x6F 0x2D 0x01 0x0D 0x0A // 'Undo-???' 0x54 0x6F 0x20 0x72 0x65 0x64 0x6F 0x20 // 'To redo ' 0x77 0x68 0x61 0x74 0x20 0x79 0x6F 0x75 // 'what you' 0x20 0x75 0x6E 0x64 0x69 0x64 0x0D 0x0A // ' undid??' 0x95 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 // '?Click ' 0x52 0x65 0x64 0x6F 0x2D 0x01 // 'Redo-?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_45= ktpcHowToScenes45 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_45, __HELP_NAME("Def: frame")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_45, __HELP_NAME("Def: frame")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTScenes45 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_45, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToScenes45" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTScenes45" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_45, 0x0) BYTE 0x01 0x00 0x03 0x03 0x56 0x01 0x00 0x00 // '????V???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1A=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) AG(4) ITEM LONG 0x2000002 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpFrameSlider __HELP_SYMBOL( STN "mbmpFrameSlider" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x15 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xA4 0x00 0x00 0x01 // '???????' 0x05 0x00 0x00 0x00 0xA6 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xD0 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x74 0x00 0x00 0x02 // '????t???' 0x01 0x00 0x00 0x00 0x7A 0x00 0x00 0x02 // '????z???' 0x00 0x00 0x00 0x00 0xAB 0x00 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0xD0 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x05 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x07 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x23 0x00 0x00 0x03 // '???#???' 0x0A 0x00 0x00 0xFD 0x4F 0x00 0x00 0x03 // '???O???' 0x0F 0x00 0x00 0xFD 0x68 0x00 0x00 0x03 // '???h???' 0x0A 0x00 0x00 0xFD 0x6B 0x00 0x00 0x03 // '???k???' 0x0F 0x00 0x00 0xFD 0x74 0x00 0x00 0x03 // '???t???' 0x00 0x00 0x00 0x00 0xAB 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x6A 0x00 0x00 0x80 // '????j??' 0x00 0x00 0x03 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x6D 0x00 0x00 0x82 // '????m??' 0x00 0x00 0x00 0x00 0x6A 0x00 0x00 0xC0 // '????j??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) BYTE 0x03 0x03 0x46 0x72 0x61 0x6D 0x65 0x0D // '??Frame?' 0x0A 0x4F 0x6E 0x65 0x20 0x73 0x63 0x72 // '?One scr' 0x65 0x65 0x6E 0x20 0x6F 0x66 0x20 0x79 // 'een of y' 0x6F 0x75 0x72 0x20 0x6D 0x6F 0x76 0x69 // 'our movi' 0x65 0x2E 0x20 0x0D 0x0A 0x54 0x6F 0x20 // 'e. ??To ' 0x6D 0x6F 0x76 0x65 0x20 0x66 0x6F 0x72 // 'move for' 0x77 0x61 0x72 0x64 0x73 0x20 0x6F 0x72 // 'wards or' 0x20 0x62 0x61 0x63 0x6B 0x77 0x61 0x72 // ' backwar' 0x64 0x73 0x20 0x77 0x69 0x74 0x68 0x69 // 'ds withi' 0x6E 0x20 0x61 0x20 0x73 0x63 0x65 0x6E // 'n a scen' 0x65 0x0D 0x0A 0x95 0x09 0x55 0x73 0x65 // 'e???Use' 0x20 0x74 0x68 0x65 0x20 0x46 0x72 0x61 // ' the Fra' 0x6D 0x65 0x20 0x53 0x6C 0x69 0x64 0x65 // 'me Slide' 0x72 0x2E 0x0D 0x0A 0x01 0x0D 0x0A 0x4E // 'r.?????N' 0x6F 0x74 0x65 0x3A 0x20 0x20 0x43 0x6C // 'ote: Cl' 0x69 0x63 0x6B 0x20 0x20 0x74 0x68 0x65 // 'ick the' 0x20 0x46 0x69 0x72 0x73 0x74 0x2C 0x20 // ' First, ' 0x50 0x72 0x65 0x76 0x69 0x6F 0x75 0x73 // 'Previous' 0x2C 0x20 0x4E 0x65 0x78 0x74 0x2C 0x20 // ', Next, ' 0x6F 0x72 0x20 0x4C 0x61 0x73 0x74 0x20 // 'or Last ' 0x41 0x72 0x72 0x6F 0x77 0x20 0x6F 0x72 // 'Arrow or' 0x20 0x64 0x72 0x61 0x67 0x20 0x74 0x68 // ' drag th' 0x65 0x20 0x73 0x6C 0x69 0x64 0x65 0x72 // 'e slider' 0x20 0x69 0x6E 0x20 0x74 0x68 0x65 0x20 // ' in the ' 0x6D 0x69 0x64 0x64 0x6C 0x65 0x20 0x6F // 'middle o' 0x66 0x20 0x74 0x68 0x65 0x20 0x62 0x61 // 'f the ba' 0x72 0x2E // 'r.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_46= ktpcHowToScenes46 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_46, __HELP_NAME("Tip: Change Camera Angle")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_46, __HELP_NAME("Tip: Change Camera Angle")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTScenes46 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_18=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_46, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToScenes46" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTScenes46" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_18=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_46, 0x0) BYTE 0x01 0x00 0x03 0x03 0x4D 0x01 0x00 0x00 // '????M???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_E=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_18, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSettingsCameras __HELP_SYMBOL( STN "mbmpSettingsCameras" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_18=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_18, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0D 0x00 0x00 0x00 0x02 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x71 0x00 0x00 0x01 // '????q???' 0x01 0xF6 0x00 0x00 0x87 0x00 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0xAC 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x53 0x00 0x00 0x03 // '???S???' 0x0A 0x00 0x00 0xFD 0x71 0x00 0x00 0x03 // '???q???' 0x0F 0x00 0x00 0xFD 0xAC 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x71 0x00 0x00 0x80 // '????q??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x8A 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0x87 0x00 0x00 0xC0 // '??????' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_18=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_18, 0x0) BYTE 0x03 0x03 0x01 0x20 0x43 0x68 0x61 0x6E // '??? Chan' 0x67 0x69 0x6E 0x67 0x20 0x74 0x68 0x65 // 'ging the' 0x20 0x63 0x61 0x6D 0x65 0x72 0x61 0x20 // ' camera ' 0x61 0x6E 0x67 0x6C 0x65 0x0D 0x0A 0x54 // 'angle??T' 0x68 0x65 0x72 0x65 0x20 0x61 0x72 0x65 // 'here are' 0x20 0x6D 0x61 0x6E 0x79 0x20 0x70 0x6F // ' many po' 0x73 0x73 0x69 0x62 0x6C 0x65 0x20 0x63 // 'ssible c' 0x61 0x6D 0x65 0x72 0x61 0x20 0x61 0x6E // 'amera an' 0x67 0x6C 0x65 0x73 0x20 0x66 0x6F 0x72 // 'gles for' 0x20 0x65 0x61 0x63 0x68 0x20 0x73 0x63 // ' each sc' 0x65 0x6E 0x65 0x2E 0x20 0x0D 0x0A 0x54 // 'ene. ??T' 0x6F 0x20 0x63 0x68 0x61 0x6E 0x67 0x65 // 'o change' 0x20 0x74 0x68 0x65 0x20 0x63 0x61 0x6D // ' the cam' 0x65 0x72 0x61 0x20 0x61 0x6E 0x67 0x6C // 'era angl' 0x65 0x0D 0x0A 0x31 0x09 0x43 0x6C 0x69 // 'e??1?Cli' 0x63 0x6B 0x20 0x43 0x61 0x6D 0x65 0x72 // 'ck Camer' 0x61 0x20 0x41 0x6E 0x67 0x6C 0x65 0x73 // 'a Angles' 0x2D 0x01 0x0D 0x0A 0x32 0x09 0x43 0x6C // '-???2?Cl' 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 // 'ick the ' 0x63 0x61 0x6D 0x65 0x72 0x61 0x20 0x61 // 'camera a' 0x6E 0x67 0x6C 0x65 0x20 0x79 0x6F 0x75 // 'ngle you' 0x20 0x77 0x61 0x6E 0x74 0x2E // ' want.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_49= ktpcHowToScenes49 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_49, __HELP_NAME("Tip: Moving Within Scene")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_49, __HELP_NAME("Tip: Moving Within Scene")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTScenes49 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_30=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_49, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToScenes49" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTScenes49" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_30=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_49, 0x0) BYTE 0x01 0x00 0x03 0x03 0x4E 0x01 0x00 0x00 // '????N???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1F=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_30, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ITEM LONG 0x2000002 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpFrameSlider __HELP_SYMBOL( STN "mbmpFrameSlider" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_30=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_30, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x13 0x00 0x00 0x00 0x02 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x18 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x1A 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x99 0x00 0x00 0x01 // '???????' 0x05 0x00 0x00 0x00 0x9B 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xC5 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x6A 0x00 0x00 0x02 // '????j???' 0x02 0x00 0x00 0x00 0x70 0x00 0x00 0x02 // '????p???' 0x00 0x00 0x00 0x00 0xA1 0x00 0x00 0x02 // '???????' 0x02 0x00 0x00 0x00 0xC5 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0x1A 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x48 0x00 0x00 0x03 // '???H???' 0x0F 0x00 0x00 0xFD 0x6A 0x00 0x00 0x03 // '???j???' 0x00 0x00 0x00 0x00 0xA1 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x60 0x00 0x00 0x80 // '????`??' 0x00 0x00 0x03 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x63 0x00 0x00 0x82 // '????c??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0x60 0x00 0x00 0xC0 // '????`??' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_30=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_30, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x4D 0x6F 0x76 // '??? Mov' 0x69 0x6E 0x67 0x20 0x77 0x69 0x74 0x68 // 'ing with' 0x69 0x6E 0x20 0x61 0x20 0x73 0x63 0x65 // 'in a sce' 0x6E 0x65 0x0D 0x0A 0x54 0x6F 0x20 0x6D // 'ne??To m' 0x6F 0x76 0x65 0x20 0x66 0x6F 0x72 0x77 // 'ove forw' 0x61 0x72 0x64 0x73 0x20 0x6F 0x72 0x20 // 'ards or ' 0x62 0x61 0x63 0x6B 0x77 0x61 0x72 0x64 // 'backward' 0x73 0x20 0x77 0x69 0x74 0x68 0x69 0x6E // 's within' 0x20 0x61 0x20 0x73 0x63 0x65 0x6E 0x65 // ' a scene' 0x0D 0x0A 0x95 0x09 0x55 0x73 0x65 0x20 // '???Use ' 0x74 0x68 0x65 0x20 0x46 0x72 0x61 0x6D // 'the Fram' 0x65 0x20 0x53 0x6C 0x69 0x64 0x65 0x72 // 'e Slider' 0x0D 0x0A 0x01 0x0D 0x0A 0x4E 0x6F 0x74 // '?????Not' 0x65 0x3A 0x20 0x20 0x43 0x6C 0x69 0x63 // 'e: Clic' 0x6B 0x20 0x74 0x68 0x65 0x20 0x46 0x69 // 'k the Fi' 0x72 0x73 0x74 0x2C 0x20 0x50 0x72 0x65 // 'rst, Pre' 0x76 0x69 0x6F 0x75 0x73 0x2C 0x20 0x4E // 'vious, N' 0x65 0x78 0x74 0x2C 0x20 0x6F 0x72 0x20 // 'ext, or ' 0x4C 0x61 0x73 0x74 0x20 0x41 0x72 0x72 // 'Last Arr' 0x6F 0x77 0x20 0x6F 0x72 0x20 0x64 0x72 // 'ow or dr' 0x61 0x67 0x20 0x74 0x68 0x65 0x20 0x73 // 'ag the s' 0x6C 0x69 0x64 0x65 0x72 0x20 0x69 0x6E // 'lider in' 0x20 0x74 0x68 0x65 0x20 0x6D 0x69 0x64 // ' the mid' 0x64 0x6C 0x65 0x20 0x6F 0x66 0x20 0x74 // 'dle of t' 0x68 0x65 0x20 0x62 0x61 0x72 0x2E // 'he bar.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_51= ktpcHowToScenes51 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_51, __HELP_NAME("Def: Drag")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_51, __HELP_NAME("Def: Drag")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTScenes51 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_36=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_51, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToScenes51" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTScenes51" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_36=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_51, 0x0) BYTE 0x01 0x00 0x03 0x03 0xCD 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_36=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_36, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x04 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xD0 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x79 0x00 0x00 0x03 // '????y???' 0x0A 0x00 0x00 0xFD 0x88 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x79 0x00 0x00 0x80 // '????y??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x79 0x00 0x00 0x82 // '????y??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_36=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_36, 0x0) BYTE 0x03 0x03 0x44 0x72 0x61 0x67 0x0D 0x0A // '??Drag??' 0x31 0x09 0x48 0x6F 0x6C 0x64 0x20 0x64 // '1?Hold d' 0x6F 0x77 0x6E 0x20 0x74 0x68 0x65 0x20 // 'own the ' 0x6D 0x6F 0x75 0x73 0x65 0x20 0x62 0x75 // 'mouse bu' 0x74 0x74 0x6F 0x6E 0x20 0x61 0x73 0x20 // 'tton as ' 0x79 0x6F 0x75 0x20 0x6D 0x6F 0x76 0x65 // 'you move' 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 // ' the mou' 0x73 0x65 0x2E 0x0D 0x0A 0x32 0x09 0x57 // 'se.??2?W' 0x68 0x65 0x6E 0x20 0x79 0x6F 0x75 0x27 // 'hen you'' 0x76 0x65 0x20 0x66 0x69 0x6E 0x69 0x73 // 've finis' 0x68 0x65 0x64 0x20 0x64 0x72 0x61 0x67 // 'hed drag' 0x67 0x69 0x6E 0x67 0x2C 0x20 0x6C 0x65 // 'ging, le' 0x74 0x20 0x67 0x6F 0x20 0x6F 0x66 0x20 // 't go of ' 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 0x73 // 'the mous' 0x65 0x20 0x62 0x75 0x74 0x74 0x6F 0x6E // 'e button' 0x2E 0x0D 0x0A 0x54 0x69 0x70 0x20 0x66 // '.??Tip f' 0x72 0x6F 0x6D 0x20 0x4D 0x63 0x5A 0x65 // 'rom McZe' 0x65 0x3A 0x20 0x20 0x59 0x6F 0x75 0x27 // 'e: You'' 0x6C 0x6C 0x20 0x67 0x65 0x74 0x20 0x74 // 'll get t' 0x68 0x65 0x20 0x62 0x65 0x73 0x74 0x20 // 'he best ' 0x72 0x65 0x73 0x75 0x6C 0x74 0x73 0x20 // 'results ' 0x69 0x66 0x20 0x79 0x6F 0x75 0x20 0x6D // 'if you m' 0x6F 0x76 0x65 0x20 0x74 0x68 0x65 0x20 // 'ove the ' 0x6D 0x6F 0x75 0x73 0x65 0x20 0x73 0x6C // 'mouse sl' 0x6F 0x77 0x6C 0x79 0x20 0x61 0x73 0x20 // 'owly as ' 0x79 0x6F 0x75 0x20 0x64 0x72 0x61 0x67 // 'you drag' 0x2E 0x20 // '. ' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_5C= ktpcHowToScenes5C #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5C, __HELP_NAME("Tip: Add frames")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5C, __HELP_NAME("Tip: Add frames")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp 0x0 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_38=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5C, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToScenes5C" ITEM "" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_38=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x54 0x01 0x00 0x00 // '????T???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1C=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_38, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpRewind __HELP_SYMBOL( STN "mbmpRewind" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpForward __HELP_SYMBOL( STN "mbmpForward" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_38=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_38, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x14 0x00 0x00 0x00 0x02 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x4D 0x00 0x00 0x01 // '????M???' 0x01 0xFE 0x00 0x00 0x7F 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0x80 0x00 0x00 0x01 // '???????' 0x01 0xFE 0x00 0x00 0x83 0x00 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0xDD 0x00 0x00 0x01 // '???????' 0x01 0xFE 0x00 0x00 0x0D 0x01 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0x0E 0x01 0x00 0x01 // '????????' 0x01 0xFE 0x00 0x00 0x11 0x01 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0x23 0x01 0x00 0x01 // '????#???' 0x00 0x00 0x00 0x00 0x22 0x00 0x00 0x03 // '????"???' 0x0A 0x00 0x00 0xFD 0x4D 0x00 0x00 0x03 // '???M???' 0x00 0x00 0x00 0x00 0xBA 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xDD 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xDF 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x02 0x00 0x00 0x00 0x7F 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0x0D 0x01 0x00 0xC0 // '???????' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_38=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_38, 0x0) BYTE 0x03 0x03 0x01 0x20 0x41 0x64 0x64 0x69 // '??? Addi' 0x6E 0x67 0x20 0x65 0x78 0x74 0x72 0x61 // 'ng extra' 0x20 0x66 0x72 0x61 0x6D 0x65 0x73 0x20 // ' frames ' 0x74 0x6F 0x20 0x61 0x20 0x73 0x63 0x65 // 'to a sce' 0x6E 0x65 0x0D 0x0A 0x54 0x6F 0x20 0x61 // 'ne??To a' 0x64 0x64 0x20 0x66 0x72 0x61 0x6D 0x65 // 'dd frame' 0x73 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 // 's to the' 0x20 0x62 0x65 0x67 0x69 0x6E 0x6E 0x69 // ' beginni' 0x6E 0x67 0x20 0x6F 0x66 0x20 0x61 0x20 // 'ng of a ' 0x73 0x63 0x65 0x6E 0x65 0x0D 0x0A 0x95 // 'scene??' 0x09 0x48 0x6F 0x6C 0x64 0x20 0x64 0x6F // '?Hold do' 0x77 0x6E 0x20 0x43 0x74 0x72 0x6C 0x20 // 'wn Ctrl ' 0x61 0x73 0x20 0x79 0x6F 0x75 0x20 0x63 // 'as you c' 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 // 'lick the' 0x20 0x50 0x72 0x65 0x76 0x69 0x6F 0x75 // ' Previou' 0x73 0x20 0x62 0x75 0x74 0x74 0x6F 0x6E // 's button' 0x2D 0x01 0x20 0x6F 0x6E 0x20 0x74 0x68 // '-? on th' 0x65 0x20 0x46 0x72 0x61 0x6D 0x65 0x20 // 'e Frame ' 0x53 0x6C 0x69 0x64 0x65 0x72 0x20 0x28 // 'Slider (' 0x6C 0x6F 0x63 0x61 0x74 0x65 0x64 0x20 // 'located ' 0x69 0x6E 0x20 0x74 0x68 0x65 0x20 0x6C // 'in the l' 0x6F 0x77 0x65 0x72 0x2D 0x6C 0x65 0x66 // 'ower-lef' 0x74 0x20 0x63 0x6F 0x72 0x6E 0x65 0x72 // 't corner' 0x29 0x2E 0x0D 0x0A 0x54 0x6F 0x20 0x61 // ').??To a' 0x64 0x64 0x20 0x66 0x72 0x61 0x6D 0x65 // 'dd frame' 0x73 0x20 0x61 0x74 0x20 0x74 0x68 0x65 // 's at the' 0x20 0x65 0x6E 0x64 0x20 0x6F 0x66 0x20 // ' end of ' 0x61 0x20 0x73 0x63 0x65 0x6E 0x65 0x0D // 'a scene?' 0x0A 0x95 0x09 0x48 0x6F 0x6C 0x64 0x20 // '??Hold ' 0x64 0x6F 0x77 0x6E 0x20 0x43 0x74 0x72 // 'down Ctr' 0x6C 0x20 0x61 0x73 0x20 0x79 0x6F 0x75 // 'l as you' 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 0x74 // ' click t' 0x68 0x65 0x20 0x4E 0x65 0x78 0x74 0x20 // 'he Next ' 0x62 0x75 0x74 0x74 0x6F 0x6E 0x2D 0x01 // 'button-?' 0x20 0x6F 0x6E 0x20 0x74 0x68 0x65 0x20 // ' on the ' 0x46 0x72 0x61 0x6D 0x65 0x20 0x53 0x6C // 'Frame Sl' 0x69 0x64 0x65 0x72 0x2E // 'ider.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK ================================================ FILE: src/help/htsounds.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ #undef __HELP_NAME #undef __HELP_SYMBOL #undef __HELP_PACK #undef __HELP_PACK2 #ifdef NO_HELP_NAMES #define __HELP_NAME(name) "" #else #define __HELP_NAME(name) name #endif #ifdef NO_HELP_SYMBOLS #define __HELP_SYMBOL(stuff) #else #define __HELP_SYMBOL(stuff) stuff #endif #ifdef PACK_HELP #define __HELP_PACK PACK #else #define __HELP_PACK #endif #ifdef HELP_SINGLE_CHUNK #define __HELP_PACK2 #else #define __HELP_PACK2 __HELP_PACK #endif SET _help_48544F50_0= ktpcHowToSounds00 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("CO--Click Sounds")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("CO--Click Sounds")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence kidSoundsCover kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTSounds00 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcHowToSounds00" ITEM "kgobHowtoSequence" ITEM "kidSoundsCover" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds00" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0x4E 0x00 0x00 0x00 // '????N???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0D 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0C 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2F, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x53 0x6F 0x75 0x6E 0x64 0x73 0x2E // 'Sounds.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1= ktpcHowToSounds01 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("CO 1) To see the sound effect")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("CO 1) To see the sound effect")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence kidSoundsEfxBrowser kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTSounds01 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_21=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcHowToSounds01" ITEM "kgobHowtoSequence" ITEM "kidSoundsEfxBrowser" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds01" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_21=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0x12 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_26=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_21, 0x0) AG(4) ITEM LONG 0x2000002 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToSounds52 __HELP_SYMBOL( STN "ktpcHowToSounds52" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_21=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_21, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x13 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x8B 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x78 0x00 0x00 0x02 // '????x???' 0x01 0x00 0x00 0x00 0x7E 0x00 0x00 0x02 // '????~???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x2C 0x00 0x00 0x03 // '???,???' 0x0F 0x00 0x00 0xFD 0x7C 0x00 0x00 0x03 // '???|???' 0x00 0x00 0x00 0x00 0x7D 0x00 0x00 0x03 // '????}???' 0x0A 0x00 0x00 0xFD 0x8A 0x00 0x00 0x03 // '??????' 0x0F 0x00 0x00 0xFD 0x8B 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x30 0x00 0x00 0x04 // '????0???' 0x0D 0x00 0x00 0xFE 0x3F 0x00 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x30 0x00 0x00 0x40 // '????0??@' 0x03 0x00 0x00 0x00 0x3F 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x2E 0x00 0x00 0x80 // '????.??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x75 0x00 0x00 0x82 // '????u??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_21=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_21, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x73 0x65 0x65 // '??To see' 0x20 0x74 0x68 0x65 0x20 0x73 0x6F 0x75 // ' the sou' 0x6E 0x64 0x20 0x65 0x66 0x66 0x65 0x63 // 'nd effec' 0x74 0x73 0x20 0x79 0x6F 0x75 0x20 0x63 // 'ts you c' 0x61 0x6E 0x20 0x63 0x68 0x6F 0x6F 0x73 // 'an choos' 0x65 0x20 0x66 0x72 0x6F 0x6D 0x0D 0x0A // 'e from??' 0x31 0x09 0x47 0x6F 0x20 0x74 0x6F 0x20 // '1?Go to ' 0x74 0x68 0x65 0x20 0x70 0x6C 0x61 0x63 // 'the plac' 0x65 0x20 0x69 0x6E 0x20 0x79 0x6F 0x75 // 'e in you' 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 0x20 // 'r movie ' 0x77 0x68 0x65 0x72 0x65 0x20 0x79 0x6F // 'where yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 // 'u want t' 0x6F 0x20 0x61 0x64 0x64 0x20 0x61 0x20 // 'o add a ' 0x73 0x6F 0x75 0x6E 0x64 0x20 0x65 0x66 // 'sound ef' 0x66 0x65 0x63 0x74 0x2E 0x0D 0x0A 0x32 // 'fect.??2' 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 0x53 // '?Click S' 0x6F 0x75 0x6E 0x64 0x20 0x45 0x66 0x66 // 'ound Eff' 0x65 0x63 0x74 0x73 0x2E // 'ects.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2= ktpcHowToSounds02 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2, __HELP_NAME("CO 2) Sound Effects Browser")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2, __HELP_NAME("CO 2) Sound Effects Browser")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon0 kgobHowtoSequence 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 kwavHTSounds02 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2, 0x0) GST(0) ITEM "kgobCalloutBalloon0" ITEM "ktpcHowToSounds02" ITEM "kgobHowtoSequence" ITEM "" ITEM "" ITEM "kwavHTSounds02" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2, 0x0) BYTE 0x01 0x00 0x03 0x03 0x80 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x03 0x03 0x4E 0x6F 0x74 0x65 0x20 0x74 // '??Note t' 0x6F 0x20 0x54 0x6F 0x6E 0x79 0x3A 0x20 // 'o Tony: ' 0x20 0x55 0x73 0x65 0x20 0x74 0x65 0x78 // ' Use tex' 0x74 0x20 0x74 0x68 0x61 0x74 0x20 0x61 // 't that a' 0x70 0x70 0x65 0x61 0x72 0x73 0x20 0x77 // 'ppears w' 0x68 0x65 0x6E 0x20 0x74 0x68 0x65 0x79 // 'hen they' 0x20 0x75 0x73 0x65 0x20 0x53 0x6F 0x75 // ' use Sou' 0x6E 0x64 0x20 0x45 0x66 0x66 0x65 0x63 // 'nd Effec' 0x74 0x73 0x20 0x62 0x72 0x6F 0x77 0x73 // 'ts brows' 0x65 0x72 0x2E // 'er.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3= ktpcHowToSounds03 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3, __HELP_NAME("CO 3) Click the actor, prop")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3, __HELP_NAME("CO 3) Click the actor, prop")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTSounds03 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_9=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToSounds03" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds03" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_9=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3, 0x0) BYTE 0x01 0x00 0x03 0x03 0x0E 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_21=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_9, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToSounds77 __HELP_SYMBOL( STN "ktpcHowToSounds77" ) ITEM LONG 0xC0000003 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktpcHowToSounds60 __HELP_SYMBOL( STN "ktpcHowToSounds60" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToSounds61 __HELP_SYMBOL( STN "ktpcHowToSounds61" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_9=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_9, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0E 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xB3 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x57 0x00 0x00 0x40 // '????W??@' 0x05 0x00 0x00 0x00 0x77 0x00 0x00 0x40 // '????w??@' 0x00 0x00 0x00 0x00 0x79 0x00 0x00 0x40 // '????y??@' 0x02 0x00 0x00 0x00 0x93 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x95 0x00 0x00 0x40 // '??????@' 0x04 0x00 0x00 0x00 0xB3 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x57 0x00 0x00 0x80 // '????W??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x57 0x00 0x00 0x82 // '????W??' 0x00 0x00 0x00 0x00 0x57 0x00 0x00 0xC0 // '????W??' 0x03 0x00 0x00 0x00 0x79 0x00 0x00 0xC0 // '????y??' 0x03 0x00 0x00 0x00 0x95 0x00 0x00 0xC0 // '??????' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_9=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_9, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x6F // 'the acto' 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 0x2C // 'r, prop,' 0x20 0x33 0x44 0x20 0x77 0x6F 0x72 0x64 // ' 3D word' 0x2C 0x20 0x6F 0x72 0x20 0x62 0x61 0x63 // ', or bac' 0x6B 0x67 0x72 0x6F 0x75 0x6E 0x64 0x20 // 'kground ' 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 // 'you want' 0x20 0x74 0x6F 0x20 0x61 0x74 0x74 0x61 // ' to atta' 0x63 0x68 0x20 0x74 0x68 0x65 0x20 0x73 // 'ch the s' 0x6F 0x75 0x6E 0x64 0x20 0x65 0x66 0x66 // 'ound eff' 0x65 0x63 0x74 0x20 0x74 0x6F 0x2E 0x0D // 'ect to.?' 0x0A 0x01 0x20 0x41 0x74 0x74 0x61 0x63 // '?? Attac' 0x68 0x69 0x6E 0x67 0x20 0x61 0x20 0x73 // 'hing a s' 0x6F 0x75 0x6E 0x64 0x20 0x74 0x6F 0x20 // 'ound to ' 0x61 0x6E 0x20 0x61 0x63 0x74 0x69 0x6F // 'an actio' 0x6E 0x0D 0x0A 0x01 0x20 0x43 0x68 0x61 // 'n??? Cha' 0x69 0x6E 0x69 0x6E 0x67 0x20 0x73 0x6F // 'ining so' 0x75 0x6E 0x64 0x73 0x20 0x74 0x6F 0x67 // 'unds tog' 0x65 0x74 0x68 0x65 0x72 0x0D 0x0A 0x01 // 'ether???' 0x20 0x50 0x6C 0x61 0x79 0x69 0x6E 0x67 // ' Playing' 0x20 0x61 0x20 0x73 0x6F 0x75 0x6E 0x64 // ' a sound' 0x20 0x63 0x6F 0x6E 0x74 0x69 0x6E 0x75 // ' continu' 0x6F 0x75 0x73 0x6C 0x79 // 'ously' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_4= ktpcHowToSounds04 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4, __HELP_NAME("What Next--Sound Effects")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4, __HELP_NAME("What Next--Sound Effects")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTSounds04 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_24=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToSounds04" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds04" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_24=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4, 0x0) BYTE 0x01 0x00 0x03 0x03 0x05 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_0=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_24, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToSounds69 __HELP_SYMBOL( STN "ktpcHowToSounds69" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToSounds44 __HELP_SYMBOL( STN "ktpcHowToSounds44" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktpcHowToSounds62 __HELP_SYMBOL( STN "ktpcHowToSounds62" ) ITEM LONG 0xC0000004 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktpcHowToSounds73 __HELP_SYMBOL( STN "ktpcHowToSounds73" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_24=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_24, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x17 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x19 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x1B 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x75 0x00 0x00 0x01 // '????u???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x19 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x25 0x00 0x00 0x03 // '????%???' 0x0F 0x00 0x00 0xFD 0x4D 0x00 0x00 0x03 // '???M???' 0x00 0x00 0x00 0x00 0x1B 0x00 0x00 0x40 // '???????@' 0x03 0x00 0x00 0x00 0x21 0x00 0x00 0x40 // '????!??@' 0x00 0x00 0x00 0x00 0x23 0x00 0x00 0x40 // '????#??@' 0x02 0x00 0x00 0x00 0x4F 0x00 0x00 0x40 // '????O??@' 0x04 0x00 0x00 0x00 0x61 0x00 0x00 0x40 // '????a??@' 0x00 0x00 0x00 0x00 0x63 0x00 0x00 0x40 // '????c??@' 0x06 0x00 0x00 0x00 0x75 0x00 0x00 0x40 // '????u??@' 0x00 0x00 0x00 0x00 0x1B 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x4F 0x00 0x00 0x80 // '????O??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x1B 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x1B 0x00 0x00 0xC0 // '???????' 0x05 0x00 0x00 0x00 0x23 0x00 0x00 0xC0 // '????#??' 0x05 0x00 0x00 0x00 0x4F 0x00 0x00 0xC0 // '????O??' 0x05 0x00 0x00 0x00 0x63 0x00 0x00 0xC0 // '????c??' 0x05 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_24=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_24, 0x0) BYTE 0x03 0x03 0x53 0x6F 0x75 0x6E 0x64 0x20 // '??Sound ' 0x65 0x66 0x66 0x65 0x63 0x74 0x73 0x2D // 'effects-' 0x2D 0x57 0x68 0x61 0x74 0x20 0x6E 0x65 // '-What ne' 0x78 0x74 0x3F 0x0D 0x0A 0x01 0x20 0x55 // 'xt???? U' 0x6E 0x64 0x6F 0x0D 0x0A 0x01 0x20 0x43 // 'ndo??? C' 0x68 0x61 0x6E 0x67 0x69 0x6E 0x67 0x20 // 'hanging ' 0x74 0x68 0x65 0x20 0x76 0x6F 0x6C 0x75 // 'the volu' 0x6D 0x65 0x20 0x6F 0x66 0x20 0x69 0x6E // 'me of in' 0x64 0x69 0x76 0x69 0x64 0x75 0x61 0x6C // 'dividual' 0x20 0x73 0x6F 0x75 0x6E 0x64 0x73 0x0D // ' sounds?' 0x0A 0x01 0x20 0x52 0x65 0x6D 0x6F 0x76 // '?? Remov' 0x69 0x6E 0x67 0x20 0x61 0x20 0x73 0x6F // 'ing a so' 0x75 0x6E 0x64 0x0D 0x0A 0x01 0x20 0x53 // 'und??? S' 0x74 0x6F 0x70 0x70 0x69 0x6E 0x67 0x20 // 'topping ' 0x61 0x20 0x73 0x6F 0x75 0x6E 0x64 // 'a sound' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_5= ktpcHowToSounds05 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5, __HELP_NAME("CO 1) To add dialogue")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5, __HELP_NAME("CO 1) To add dialogue")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence kidSoundsMicBrowser kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTSounds05 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_23=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcHowToSounds05" ITEM "kgobHowtoSequence" ITEM "kidSoundsMicBrowser" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds05" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_23=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD1 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_11=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_23, 0x0) AG(4) ITEM LONG 0x2000002 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToSounds52 __HELP_SYMBOL( STN "ktpcHowToSounds52" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_23=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_23, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x14 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x61 0x00 0x00 0x01 // '????a???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x55 0x00 0x00 0x02 // '????U???' 0x01 0x00 0x00 0x00 0x5A 0x00 0x00 0x02 // '????Z???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0F 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x55 0x00 0x00 0x03 // '???U???' 0x00 0x00 0x00 0x00 0x5A 0x00 0x00 0x03 // '????Z???' 0x0A 0x00 0x00 0xFD 0x60 0x00 0x00 0x03 // '???`???' 0x00 0x00 0x00 0x00 0x13 0x00 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x22 0x00 0x00 0x04 // '???"???' 0x00 0x00 0x00 0x00 0x13 0x00 0x00 0x40 // '???????@' 0x03 0x00 0x00 0x00 0x22 0x00 0x00 0x40 // '????"??@' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x52 0x00 0x00 0x80 // '????R??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x52 0x00 0x00 0x82 // '????R??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_23=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_23, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x61 0x64 0x64 // '??To add' 0x20 0x64 0x69 0x61 0x6C 0x6F 0x67 0x75 // ' dialogu' 0x65 0x0D 0x0A 0x31 0x09 0x47 0x6F 0x20 // 'e??1?Go ' 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 0x70 // 'to the p' 0x6C 0x61 0x63 0x65 0x20 0x69 0x6E 0x20 // 'lace in ' 0x79 0x6F 0x75 0x72 0x20 0x6D 0x6F 0x76 // 'your mov' 0x69 0x65 0x20 0x77 0x68 0x65 0x72 0x65 // 'ie where' 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E // ' you wan' 0x74 0x20 0x74 0x6F 0x20 0x61 0x64 0x64 // 't to add' 0x20 0x64 0x69 0x61 0x6C 0x6F 0x67 0x75 // ' dialogu' 0x65 0x2E 0x0D 0x0A 0x32 0x09 0x43 0x6C // 'e.??2?Cl' 0x69 0x63 0x6B 0x20 0x53 0x70 0x65 0x65 // 'ick Spee' 0x63 0x68 0x2E // 'ch.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_6= ktpcHowToSounds06 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6, __HELP_NAME("CO 2) Speech Browser")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6, __HELP_NAME("CO 2) Speech Browser")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon0 kgobHowtoSequence 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 kwavHTSounds06 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_0=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6, 0x0) GST(0) ITEM "kgobCalloutBalloon0" ITEM "ktpcHowToSounds06" ITEM "kgobHowtoSequence" ITEM "" ITEM "" ITEM "kwavHTSounds06" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_0=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6, 0x0) BYTE 0x01 0x00 0x03 0x03 0x80 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_0=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_0=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) BYTE 0x03 0x03 0x4E 0x6F 0x74 0x65 0x20 0x74 // '??Note t' 0x6F 0x20 0x54 0x6F 0x6E 0x79 0x3A 0x20 // 'o Tony: ' 0x20 0x55 0x73 0x65 0x20 0x74 0x65 0x78 // ' Use tex' 0x74 0x20 0x74 0x68 0x61 0x74 0x20 0x61 // 't that a' 0x70 0x70 0x65 0x61 0x72 0x73 0x20 0x77 // 'ppears w' 0x68 0x65 0x6E 0x20 0x74 0x68 0x65 0x79 // 'hen they' 0x20 0x75 0x73 0x65 0x20 0x53 0x70 0x65 // ' use Spe' 0x65 0x63 0x68 0x20 0x62 0x72 0x6F 0x77 // 'ech brow' 0x73 0x65 0x72 0x2E // 'ser.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_7= ktpcHowToSounds07 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7, __HELP_NAME("CO 3) Click the actor")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7, __HELP_NAME("CO 3) Click the actor")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTSounds07 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_26=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToSounds07" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds07" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_26=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7, 0x0) BYTE 0x01 0x00 0x03 0x03 0xCD 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_18=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_26, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToSounds77 __HELP_SYMBOL( STN "ktpcHowToSounds77" ) ITEM LONG 0xC0000002 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToSounds61 __HELP_SYMBOL( STN "ktpcHowToSounds61" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_26=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_26, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0B 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x5F 0x00 0x00 0x01 // '????_???' 0x00 0x00 0x00 0x00 0x23 0x00 0x00 0x40 // '????#??@' 0x04 0x00 0x00 0x00 0x43 0x00 0x00 0x40 // '????C??@' 0x00 0x00 0x00 0x00 0x45 0x00 0x00 0x40 // '????E??@' 0x02 0x00 0x00 0x00 0x5F 0x00 0x00 0x40 // '????_??@' 0x00 0x00 0x00 0x00 0x23 0x00 0x00 0x80 // '????#??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x23 0x00 0x00 0x82 // '????#??' 0x00 0x00 0x00 0x00 0x23 0x00 0x00 0xC0 // '????#??' 0x03 0x00 0x00 0x00 0x45 0x00 0x00 0xC0 // '????E??' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_26=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_26, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x6F // 'the acto' 0x72 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 // 'r you wa' 0x6E 0x74 0x20 0x74 0x6F 0x20 0x74 0x61 // 'nt to ta' 0x6C 0x6B 0x2E 0x0D 0x0A 0x01 0x20 0x41 // 'lk.??? A' 0x74 0x74 0x61 0x63 0x68 0x69 0x6E 0x67 // 'ttaching' 0x20 0x61 0x20 0x73 0x6F 0x75 0x6E 0x64 // ' a sound' 0x20 0x74 0x6F 0x20 0x61 0x6E 0x20 0x61 // ' to an a' 0x63 0x74 0x69 0x6F 0x6E 0x0D 0x0A 0x01 // 'ction???' 0x20 0x43 0x68 0x61 0x69 0x6E 0x69 0x6E // ' Chainin' 0x67 0x20 0x73 0x6F 0x75 0x6E 0x64 0x73 // 'g sounds' 0x20 0x74 0x6F 0x67 0x65 0x74 0x68 0x65 // ' togethe' 0x72 // 'r' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_8= ktpcHowToSounds08 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8, __HELP_NAME("What Next--Speech")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8, __HELP_NAME("What Next--Speech")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTSounds08 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_6=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToSounds08" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds08" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_6=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8, 0x0) BYTE 0x01 0x00 0x03 0x03 0x2C 0x01 0x00 0x00 // '????,???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_4=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToSounds69 __HELP_SYMBOL( STN "ktpcHowToSounds69" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktpcHowToSounds63 __HELP_SYMBOL( STN "ktpcHowToSounds63" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktpcHowToSounds62 __HELP_SYMBOL( STN "ktpcHowToSounds62" ) ITEM LONG 0xC0000004 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToSounds44 __HELP_SYMBOL( STN "ktpcHowToSounds44" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_6=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x19 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x12 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x14 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x8E 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x12 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x1E 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x46 0x00 0x00 0x03 // '???F???' 0x00 0x00 0x00 0x00 0x8E 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x14 0x00 0x00 0x40 // '???????@' 0x06 0x00 0x00 0x00 0x1A 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x1C 0x00 0x00 0x40 // '???????@' 0x02 0x00 0x00 0x00 0x46 0x00 0x00 0x40 // '????F??@' 0x00 0x00 0x00 0x00 0x48 0x00 0x00 0x40 // '????H??@' 0x03 0x00 0x00 0x00 0x7A 0x00 0x00 0x40 // '????z??@' 0x00 0x00 0x00 0x00 0x7C 0x00 0x00 0x40 // '????|??@' 0x04 0x00 0x00 0x00 0x8E 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x14 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x7C 0x00 0x00 0x80 // '????|??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x14 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x14 0x00 0x00 0xC0 // '???????' 0x05 0x00 0x00 0x00 0x1C 0x00 0x00 0xC0 // '???????' 0x05 0x00 0x00 0x00 0x48 0x00 0x00 0xC0 // '????H??' 0x05 0x00 0x00 0x00 0x7C 0x00 0x00 0xC0 // '????|??' 0x05 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_6=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) BYTE 0x03 0x03 0x53 0x70 0x65 0x65 0x63 0x68 // '??Speech' 0x2D 0x2D 0x57 0x68 0x61 0x74 0x20 0x6E // '--What n' 0x65 0x78 0x74 0x3F 0x0D 0x0A 0x01 0x20 // 'ext???? ' 0x55 0x6E 0x64 0x6F 0x0D 0x0A 0x01 0x20 // 'Undo??? ' 0x43 0x68 0x61 0x6E 0x67 0x69 0x6E 0x67 // 'Changing' 0x20 0x74 0x68 0x65 0x20 0x76 0x6F 0x6C // ' the vol' 0x75 0x6D 0x65 0x20 0x6F 0x66 0x20 0x69 // 'ume of i' 0x6E 0x64 0x69 0x76 0x69 0x64 0x75 0x61 // 'ndividua' 0x6C 0x20 0x73 0x6F 0x75 0x6E 0x64 0x73 // 'l sounds' 0x0D 0x0A 0x01 0x20 0x50 0x61 0x75 0x73 // '??? Paus' 0x69 0x6E 0x67 0x20 0x74 0x68 0x65 0x20 // 'ing the ' 0x6D 0x6F 0x76 0x69 0x65 0x20 0x75 0x6E // 'movie un' 0x74 0x69 0x6C 0x20 0x61 0x6E 0x20 0x61 // 'til an a' 0x63 0x74 0x6F 0x72 0x20 0x69 0x73 0x20 // 'ctor is ' 0x64 0x6F 0x6E 0x65 0x20 0x74 0x61 0x6C // 'done tal' 0x6B 0x69 0x6E 0x67 0x0D 0x0A 0x01 0x20 // 'king??? ' 0x52 0x65 0x6D 0x6F 0x76 0x69 0x6E 0x67 // 'Removing' 0x20 0x61 0x20 0x73 0x6F 0x75 0x6E 0x64 // ' a sound' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_9= ktpcHowToSounds09 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_9, __HELP_NAME("CO 1) To add music")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_9, __HELP_NAME("CO 1) To add music")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence kidSoundsMusicBrowser kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTSounds09 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_8=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_9, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcHowToSounds09" ITEM "kgobHowtoSequence" ITEM "kidSoundsMusicBrowser" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds09" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_8=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_9, 0x0) BYTE 0x01 0x00 0x03 0x03 0xCE 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_5=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) AG(4) ITEM LONG 0x2000002 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToSounds52 __HELP_SYMBOL( STN "ktpcHowToSounds52" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_8=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x13 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x5A 0x00 0x00 0x01 // '????Z???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x02 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x4F 0x00 0x00 0x02 // '????O???' 0x01 0x00 0x00 0x00 0x53 0x00 0x00 0x02 // '????S???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0C 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x0E 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x4C 0x00 0x00 0x03 // '???L???' 0x00 0x00 0x00 0x00 0x54 0x00 0x00 0x03 // '????T???' 0x0A 0x00 0x00 0xFD 0x59 0x00 0x00 0x03 // '???Y???' 0x00 0x00 0x00 0x00 0x10 0x00 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x1F 0x00 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x10 0x00 0x00 0x40 // '???????@' 0x03 0x00 0x00 0x00 0x1F 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x0E 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x4C 0x00 0x00 0x82 // '????L??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_8=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x61 0x64 0x64 // '??To add' 0x20 0x6D 0x75 0x73 0x69 0x63 0x0D 0x0A // ' music??' 0x31 0x09 0x47 0x6F 0x20 0x74 0x6F 0x20 // '1?Go to ' 0x74 0x68 0x65 0x20 0x70 0x6C 0x61 0x63 // 'the plac' 0x65 0x20 0x69 0x6E 0x20 0x79 0x6F 0x75 // 'e in you' 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 0x20 // 'r movie ' 0x77 0x68 0x65 0x72 0x65 0x20 0x79 0x6F // 'where yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 // 'u want t' 0x6F 0x20 0x61 0x64 0x64 0x20 0x6D 0x75 // 'o add mu' 0x73 0x69 0x63 0x2E 0x0D 0x0A 0x32 0x09 // 'sic.??2?' 0x43 0x6C 0x69 0x63 0x6B 0x20 0x4D 0x75 // 'Click Mu' 0x73 0x69 0x63 0x2E // 'sic.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_A= ktpcHowToSounds0A #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_A, __HELP_NAME("CO 2) Music Browser")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_A, __HELP_NAME("CO 2) Music Browser")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon0 kgobHowtoSequence 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 kwavHTSounds0A ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_16=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_A, 0x0) GST(0) ITEM "kgobCalloutBalloon0" ITEM "ktpcHowToSounds0A" ITEM "kgobHowtoSequence" ITEM "" ITEM "" ITEM "kwavHTSounds0A" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_16=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x8C 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_16=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_16, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_16=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_16, 0x0) BYTE 0x03 0x03 0x4E 0x6F 0x74 0x65 0x20 0x74 // '??Note t' 0x6F 0x20 0x54 0x6F 0x6E 0x79 0x3A 0x20 // 'o Tony: ' 0x20 0x55 0x73 0x65 0x20 0x74 0x65 0x78 // ' Use tex' 0x74 0x20 0x74 0x68 0x61 0x74 0x20 0x61 // 't that a' 0x70 0x70 0x65 0x61 0x72 0x73 0x20 0x77 // 'ppears w' 0x68 0x65 0x6E 0x20 0x74 0x68 0x65 0x79 // 'hen they' 0x20 0x75 0x73 0x65 0x20 0x4D 0x75 0x73 // ' use Mus' 0x69 0x63 0x20 0x42 0x72 0x6F 0x77 0x73 // 'ic Brows' 0x65 0x72 0x2E // 'er.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_B= ktpcHowToSounds0B #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_B, __HELP_NAME("CO 3) Click the background")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_B, __HELP_NAME("CO 3) Click the background")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTSounds0B ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_14=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_B, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToSounds0B" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds0B" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_14=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_B, 0x0) BYTE 0x01 0x00 0x03 0x03 0xBE 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_F=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_14, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToSounds60 __HELP_SYMBOL( STN "ktpcHowToSounds60" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_14=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_14, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x55 0x00 0x00 0x01 // '????U???' 0x00 0x00 0x00 0x00 0x37 0x00 0x00 0x40 // '????7??@' 0x03 0x00 0x00 0x00 0x55 0x00 0x00 0x40 // '????U??@' 0x00 0x00 0x00 0x00 0x37 0x00 0x00 0x80 // '????7??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x37 0x00 0x00 0x82 // '????7??' 0x00 0x00 0x00 0x00 0x37 0x00 0x00 0xC0 // '????7??' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_14=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_14, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x62 0x61 0x63 0x6B // 'the back' 0x67 0x72 0x6F 0x75 0x6E 0x64 0x20 0x79 // 'ground y' 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 // 'ou want ' 0x74 0x6F 0x20 0x61 0x74 0x74 0x61 0x63 // 'to attac' 0x68 0x20 0x74 0x68 0x65 0x20 0x6D 0x75 // 'h the mu' 0x73 0x69 0x63 0x20 0x74 0x6F 0x2E 0x0D // 'sic to.?' 0x0A 0x01 0x20 0x50 0x6C 0x61 0x79 0x69 // '?? Playi' 0x6E 0x67 0x20 0x61 0x20 0x73 0x6F 0x75 // 'ng a sou' 0x6E 0x64 0x20 0x63 0x6F 0x6E 0x74 0x69 // 'nd conti' 0x6E 0x75 0x6F 0x75 0x73 0x6C 0x79 // 'nuously' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_C= ktpcHowToSounds0C #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_C, __HELP_NAME("What Next--Music")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_C, __HELP_NAME("What Next--Music")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTSounds0C ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_C, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToSounds0C" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds0C" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x09 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_12=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 4 LONG ktpcHowToSounds73 __HELP_SYMBOL( STN "ktpcHowToSounds73" ) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToSounds69 __HELP_SYMBOL( STN "ktpcHowToSounds69" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktpcHowToSounds62 __HELP_SYMBOL( STN "ktpcHowToSounds62" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToSounds44 __HELP_SYMBOL( STN "ktpcHowToSounds44" ) ITEM LONG 0xC0000004 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x19 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x11 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x13 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x6D 0x00 0x00 0x01 // '????m???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x11 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x13 0x00 0x00 0x03 // '????????' 0x00 0x00 0x00 0x00 0x1D 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x45 0x00 0x00 0x03 // '???E???' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x13 0x00 0x00 0x40 // '???????@' 0x05 0x00 0x00 0x00 0x19 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x1B 0x00 0x00 0x40 // '???????@' 0x03 0x00 0x00 0x00 0x47 0x00 0x00 0x40 // '????G??@' 0x04 0x00 0x00 0x00 0x59 0x00 0x00 0x40 // '????Y??@' 0x00 0x00 0x00 0x00 0x5B 0x00 0x00 0x40 // '????[??@' 0x02 0x00 0x00 0x00 0x6D 0x00 0x00 0x40 // '????m??@' 0x00 0x00 0x00 0x00 0x13 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x47 0x00 0x00 0x80 // '????G??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x13 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x13 0x00 0x00 0xC0 // '???????' 0x06 0x00 0x00 0x00 0x1B 0x00 0x00 0xC0 // '???????' 0x06 0x00 0x00 0x00 0x47 0x00 0x00 0xC0 // '????G??' 0x06 0x00 0x00 0x00 0x5B 0x00 0x00 0xC0 // '????[??' 0x06 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B, 0x0) BYTE 0x03 0x03 0x4D 0x75 0x73 0x69 0x63 0x2D // '??Music-' 0x2D 0x57 0x68 0x61 0x74 0x20 0x6E 0x65 // '-What ne' 0x78 0x74 0x3F 0x0D 0x0A 0x01 0x20 0x55 // 'xt???? U' 0x6E 0x64 0x6F 0x0D 0x0A 0x01 0x20 0x43 // 'ndo??? C' 0x68 0x61 0x6E 0x67 0x69 0x6E 0x67 0x20 // 'hanging ' 0x74 0x68 0x65 0x20 0x76 0x6F 0x6C 0x75 // 'the volu' 0x6D 0x65 0x20 0x6F 0x66 0x20 0x69 0x6E // 'me of in' 0x64 0x69 0x76 0x69 0x64 0x75 0x61 0x6C // 'dividual' 0x20 0x73 0x6F 0x75 0x6E 0x64 0x73 0x0D // ' sounds?' 0x0A 0x01 0x20 0x52 0x65 0x6D 0x6F 0x76 // '?? Remov' 0x69 0x6E 0x67 0x20 0x61 0x20 0x73 0x6F // 'ing a so' 0x75 0x6E 0x64 0x0D 0x0A 0x01 0x20 0x53 // 'und??? S' 0x74 0x6F 0x70 0x70 0x69 0x6E 0x67 0x20 // 'topping ' 0x61 0x20 0x73 0x6F 0x75 0x6E 0x64 // 'a sound' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_D= ktpcHowToSounds0D #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_D, __HELP_NAME("CO 1) To play once")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_D, __HELP_NAME("CO 1) To play once")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x1AF 0x30 0x57415645 kwavHTSounds0D ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_D, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcHowToSounds0D" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds0D" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_D, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2A=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3A, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToSounds74 __HELP_SYMBOL( STN "ktpcHowToSounds74" ) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToSounds52 __HELP_SYMBOL( STN "ktpcHowToSounds52" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_3A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x11 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x89 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x26 0x00 0x00 0x03 // '???&???' 0x0F 0x00 0x00 0xFD 0x28 0x00 0x00 0x03 // '???(???' 0x00 0x00 0x00 0x00 0x89 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x2A 0x00 0x00 0x04 // '????*???' 0x0D 0x00 0x00 0xFE 0x39 0x00 0x00 0x04 // '???9???' 0x00 0x00 0x00 0x00 0x6F 0x00 0x00 0x04 // '????o???' 0x0D 0x00 0x00 0xFE 0x7F 0x00 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x2A 0x00 0x00 0x40 // '????*??@' 0x03 0x00 0x00 0x00 0x39 0x00 0x00 0x40 // '????9??@' 0x00 0x00 0x00 0x00 0x6F 0x00 0x00 0x40 // '????o??@' 0x01 0x00 0x00 0x00 0x7F 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x28 0x00 0x00 0x80 // '????(??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x6D 0x00 0x00 0x82 // '????m??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3A, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x61 0x74 0x74 // '??To att' 0x61 0x63 0x68 0x20 0x61 0x20 0x73 0x6F // 'ach a so' 0x75 0x6E 0x64 0x20 0x61 0x6E 0x64 0x20 // 'und and ' 0x70 0x6C 0x61 0x79 0x20 0x69 0x74 0x20 // 'play it ' 0x6F 0x6E 0x65 0x20 0x74 0x69 0x6D 0x65 // 'one time' 0x0D 0x0A 0x31 0x09 0x47 0x6F 0x20 0x74 // '??1?Go t' 0x6F 0x20 0x74 0x68 0x65 0x20 0x70 0x6C // 'o the pl' 0x61 0x63 0x65 0x20 0x69 0x6E 0x20 0x79 // 'ace in y' 0x6F 0x75 0x72 0x20 0x6D 0x6F 0x76 0x69 // 'our movi' 0x65 0x20 0x77 0x68 0x65 0x72 0x65 0x20 // 'e where ' 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 // 'you want' 0x20 0x74 0x6F 0x20 0x61 0x74 0x74 0x61 // ' to atta' 0x63 0x68 0x20 0x74 0x68 0x65 0x20 0x73 // 'ch the s' 0x6F 0x75 0x6E 0x64 0x2E 0x0D 0x0A 0x32 // 'ound.??2' 0x09 0x43 0x68 0x6F 0x6F 0x73 0x65 0x20 // '?Choose ' 0x74 0x68 0x65 0x20 0x73 0x6F 0x75 0x6E // 'the soun' 0x64 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 // 'd you wa' 0x6E 0x74 0x2E // 'nt.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_E= ktpcHowToSounds0E #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_E, __HELP_NAME("CO 2) Click the actor, prop")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_E, __HELP_NAME("CO 2) Click the actor, prop")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTSounds0E ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_E, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToSounds0E" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds0E" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x07 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_17=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) AG(4) ITEM LONG 0xC0000002 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) FREE ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToSounds76 __HELP_SYMBOL( STN "ktpcHowToSounds76" ) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToSounds77 __HELP_SYMBOL( STN "ktpcHowToSounds77" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_4=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0B 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x8B 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x50 0x00 0x00 0x40 // '????P??@' 0x05 0x00 0x00 0x00 0x6A 0x00 0x00 0x40 // '????j??@' 0x00 0x00 0x00 0x00 0x6C 0x00 0x00 0x40 // '????l??@' 0x03 0x00 0x00 0x00 0x8B 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x50 0x00 0x00 0x80 // '????P??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x50 0x00 0x00 0x82 // '????P??' 0x00 0x00 0x00 0x00 0x50 0x00 0x00 0xC0 // '????P??' 0x01 0x00 0x00 0x00 0x6C 0x00 0x00 0xC0 // '????l??' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x6F // 'the acto' 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 0x2C // 'r, prop,' 0x20 0x33 0x44 0x20 0x77 0x6F 0x72 0x64 // ' 3D word' 0x2C 0x20 0x6F 0x72 0x20 0x62 0x61 0x63 // ', or bac' 0x6B 0x67 0x72 0x6F 0x75 0x6E 0x64 0x20 // 'kground ' 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 // 'you want' 0x20 0x74 0x6F 0x20 0x61 0x74 0x74 0x61 // ' to atta' 0x63 0x68 0x20 0x74 0x68 0x65 0x20 0x73 // 'ch the s' 0x6F 0x75 0x6E 0x64 0x20 0x74 0x6F 0x2E // 'ound to.' 0x0D 0x0A 0x01 0x20 0x43 0x68 0x61 0x69 // '??? Chai' 0x6E 0x69 0x6E 0x67 0x20 0x73 0x6F 0x75 // 'ning sou' 0x6E 0x64 0x73 0x20 0x74 0x6F 0x67 0x65 // 'nds toge' 0x74 0x68 0x65 0x72 0x0D 0x0A 0x01 0x20 // 'ther??? ' 0x48 0x6F 0x77 0x20 0x6D 0x61 0x6E 0x79 // 'How many' 0x20 0x73 0x6F 0x75 0x6E 0x64 0x73 0x20 // ' sounds ' 0x63 0x61 0x6E 0x20 0x49 0x20 0x61 0x74 // 'can I at' 0x74 0x61 0x63 0x68 0x3F // 'tach?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_F= ktpcHowToSounds0F #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_F, __HELP_NAME("What Next--Play Once")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_F, __HELP_NAME("What Next--Play Once")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTSounds0F ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_F, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToSounds0F" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds0F" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x06 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_7=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToSounds69 __HELP_SYMBOL( STN "ktpcHowToSounds69" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktpcHowToSounds62 __HELP_SYMBOL( STN "ktpcHowToSounds62" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktpcHowToSounds73 __HELP_SYMBOL( STN "ktpcHowToSounds73" ) ITEM LONG 0xC0000004 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) FREE FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToSounds44 __HELP_SYMBOL( STN "ktpcHowToSounds44" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x18 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x20 0x00 0x00 0x01 // '???? ???' 0x00 0x00 0x00 0x00 0x22 0x00 0x00 0x01 // '????"???' 0x01 0x00 0x00 0x00 0x7C 0x00 0x00 0x01 // '????|???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x20 0x00 0x00 0x03 // '??? ???' 0x00 0x00 0x00 0x00 0x2C 0x00 0x00 0x03 // '????,???' 0x0F 0x00 0x00 0xFD 0x54 0x00 0x00 0x03 // '???T???' 0x00 0x00 0x00 0x00 0x20 0x00 0x00 0x40 // '???? ??@' 0x00 0x00 0x00 0x00 0x22 0x00 0x00 0x40 // '????"??@' 0x07 0x00 0x00 0x00 0x28 0x00 0x00 0x40 // '????(??@' 0x00 0x00 0x00 0x00 0x2A 0x00 0x00 0x40 // '????*??@' 0x01 0x00 0x00 0x00 0x56 0x00 0x00 0x40 // '????V??@' 0x02 0x00 0x00 0x00 0x68 0x00 0x00 0x40 // '????h??@' 0x00 0x00 0x00 0x00 0x6A 0x00 0x00 0x40 // '????j??@' 0x03 0x00 0x00 0x00 0x7C 0x00 0x00 0x40 // '????|??@' 0x00 0x00 0x00 0x00 0x22 0x00 0x00 0x80 // '????"??' 0x00 0x00 0x02 0x00 0x56 0x00 0x00 0x80 // '????V??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x22 0x00 0x00 0x82 // '????"??' 0x00 0x00 0x00 0x00 0x22 0x00 0x00 0xC0 // '????"??' 0x04 0x00 0x00 0x00 0x2A 0x00 0x00 0xC0 // '????*??' 0x04 0x00 0x00 0x00 0x56 0x00 0x00 0xC0 // '????V??' 0x04 0x00 0x00 0x00 0x6A 0x00 0x00 0xC0 // '????j??' 0x04 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) BYTE 0x03 0x03 0x50 0x6C 0x61 0x79 0x69 0x6E // '??Playin' 0x67 0x20 0x61 0x20 0x73 0x6F 0x75 0x6E // 'g a soun' 0x64 0x20 0x6F 0x6E 0x63 0x65 0x2D 0x2D // 'd once--' 0x57 0x68 0x61 0x74 0x20 0x6E 0x65 0x78 // 'What nex' 0x74 0x3F 0x0D 0x0A 0x01 0x20 0x55 0x6E // 't???? Un' 0x64 0x6F 0x0D 0x0A 0x01 0x20 0x43 0x68 // 'do??? Ch' 0x61 0x6E 0x67 0x69 0x6E 0x67 0x20 0x74 // 'anging t' 0x68 0x65 0x20 0x76 0x6F 0x6C 0x75 0x6D // 'he volum' 0x65 0x20 0x6F 0x66 0x20 0x69 0x6E 0x64 // 'e of ind' 0x69 0x76 0x69 0x64 0x75 0x61 0x6C 0x20 // 'ividual ' 0x73 0x6F 0x75 0x6E 0x64 0x73 0x0D 0x0A // 'sounds??' 0x01 0x20 0x52 0x65 0x6D 0x6F 0x76 0x69 // '? Removi' 0x6E 0x67 0x20 0x61 0x20 0x73 0x6F 0x75 // 'ng a sou' 0x6E 0x64 0x0D 0x0A 0x01 0x20 0x53 0x74 // 'nd??? St' 0x6F 0x70 0x70 0x69 0x6E 0x67 0x20 0x61 // 'opping a' 0x20 0x73 0x6F 0x75 0x6E 0x64 // ' sound' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_10= ktpcHowToSounds10 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_10, __HELP_NAME("CO 1) To play again & again")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_10, __HELP_NAME("CO 1) To play again & again")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x1AF 0x30 0x57415645 kwavHTSounds10 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_39=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_10, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcHowToSounds10" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds10" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_39=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_10, 0x0) BYTE 0x01 0x00 0x03 0x03 0x04 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_29=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_39, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToSounds52 __HELP_SYMBOL( STN "ktpcHowToSounds52" ) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToSounds74 __HELP_SYMBOL( STN "ktpcHowToSounds74" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_39=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_39, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x12 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x8D 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x12 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x2A 0x00 0x00 0x02 // '????*???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x2A 0x00 0x00 0x03 // '???*???' 0x00 0x00 0x00 0x00 0x8D 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x2E 0x00 0x00 0x04 // '????.???' 0x0D 0x00 0x00 0xFE 0x3D 0x00 0x00 0x04 // '???=???' 0x00 0x00 0x00 0x00 0x73 0x00 0x00 0x04 // '????s???' 0x0D 0x00 0x00 0xFE 0x83 0x00 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0x2E 0x00 0x00 0x40 // '????.??@' 0x01 0x00 0x00 0x00 0x3D 0x00 0x00 0x40 // '????=??@' 0x00 0x00 0x00 0x00 0x73 0x00 0x00 0x40 // '????s??@' 0x02 0x00 0x00 0x00 0x83 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x2C 0x00 0x00 0x80 // '????,??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x71 0x00 0x00 0x82 // '????q??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_39=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_39, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x61 0x74 0x74 // '??To att' 0x61 0x63 0x68 0x20 0x61 0x20 0x73 0x6F // 'ach a so' 0x75 0x6E 0x64 0x20 0x61 0x6E 0x64 0x20 // 'und and ' 0x70 0x6C 0x61 0x79 0x20 0x69 0x74 0x20 // 'play it ' 0x63 0x6F 0x6E 0x74 0x69 0x6E 0x75 0x6F // 'continuo' 0x75 0x73 0x6C 0x79 0x0D 0x0A 0x31 0x09 // 'usly??1?' 0x47 0x6F 0x20 0x74 0x6F 0x20 0x74 0x68 // 'Go to th' 0x65 0x20 0x70 0x6C 0x61 0x63 0x65 0x20 // 'e place ' 0x69 0x6E 0x20 0x79 0x6F 0x75 0x72 0x20 // 'in your ' 0x6D 0x6F 0x76 0x69 0x65 0x20 0x77 0x68 // 'movie wh' 0x65 0x72 0x65 0x20 0x79 0x6F 0x75 0x20 // 'ere you ' 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 // 'want to ' 0x61 0x74 0x74 0x61 0x63 0x68 0x20 0x74 // 'attach t' 0x68 0x65 0x20 0x73 0x6F 0x75 0x6E 0x64 // 'he sound' 0x2E 0x0D 0x0A 0x32 0x09 0x43 0x68 0x6F // '.??2?Cho' 0x6F 0x73 0x65 0x20 0x74 0x68 0x65 0x20 // 'ose the ' 0x73 0x6F 0x75 0x6E 0x64 0x20 0x79 0x6F // 'sound yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x2E // 'u want.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_11= ktpcHowToSounds11 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_11, __HELP_NAME("CO 2) Click the actor, prop")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_11, __HELP_NAME("CO 2) Click the actor, prop")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTSounds11 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_38=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_11, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToSounds11" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds11" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_38=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_11, 0x0) BYTE 0x01 0x00 0x03 0x03 0x07 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_27=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_38, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToSounds76 __HELP_SYMBOL( STN "ktpcHowToSounds76" ) ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_38=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_38, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x6F 0x00 0x00 0x01 // '????o???' 0x00 0x00 0x00 0x00 0x50 0x00 0x00 0x40 // '????P??@' 0x01 0x00 0x00 0x00 0x6F 0x00 0x00 0x40 // '????o??@' 0x00 0x00 0x00 0x00 0x50 0x00 0x00 0x80 // '????P??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x50 0x00 0x00 0x82 // '????P??' 0x00 0x00 0x00 0x00 0x50 0x00 0x00 0xC0 // '????P??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_38=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_38, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x6F // 'the acto' 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 0x2C // 'r, prop,' 0x20 0x33 0x44 0x20 0x77 0x6F 0x72 0x64 // ' 3D word' 0x2C 0x20 0x6F 0x72 0x20 0x62 0x61 0x63 // ', or bac' 0x6B 0x67 0x72 0x6F 0x75 0x6E 0x64 0x20 // 'kground ' 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 // 'you want' 0x20 0x74 0x6F 0x20 0x61 0x74 0x74 0x61 // ' to atta' 0x63 0x68 0x20 0x74 0x68 0x65 0x20 0x73 // 'ch the s' 0x6F 0x75 0x6E 0x64 0x20 0x74 0x6F 0x2E // 'ound to.' 0x0D 0x0A 0x01 0x20 0x48 0x6F 0x77 0x20 // '??? How ' 0x6D 0x61 0x6E 0x79 0x20 0x73 0x6F 0x75 // 'many sou' 0x6E 0x64 0x73 0x20 0x63 0x61 0x6E 0x20 // 'nds can ' 0x49 0x20 0x61 0x74 0x74 0x61 0x63 0x68 // 'I attach' 0x3F // '?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_12= ktpcHowToSounds12 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_12, __HELP_NAME("What Next--Play Again & Again")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_12, __HELP_NAME("What Next--Play Again & Again")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTSounds12 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_12, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToSounds12" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds12" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_12, 0x0) BYTE 0x01 0x00 0x03 0x03 0x02 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_8=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToSounds69 __HELP_SYMBOL( STN "ktpcHowToSounds69" ) ITEM LONG 0x40000001 VAR BYTE 5 LONG ktpcHowToSounds73 __HELP_SYMBOL( STN "ktpcHowToSounds73" ) FREE ITEM LONG 0xC0000005 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToSounds44 __HELP_SYMBOL( STN "ktpcHowToSounds44" ) FREE ITEM LONG 0x40000001 VAR BYTE 3 LONG ktpcHowToSounds2E __HELP_SYMBOL( STN "ktpcHowToSounds2E" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktpcHowToSounds62 __HELP_SYMBOL( STN "ktpcHowToSounds62" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x1E 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x69 0x00 0x00 0x01 // '????i???' 0x00 0x00 0x00 0x00 0x6B 0x00 0x00 0x01 // '????k???' 0x01 0x00 0x00 0x00 0xDB 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x2A 0x00 0x00 0x03 // '???*???' 0x0F 0x00 0x00 0xFD 0x69 0x00 0x00 0x03 // '???i???' 0x00 0x00 0x00 0x00 0x75 0x00 0x00 0x03 // '????u???' 0x0F 0x00 0x00 0xFD 0x9D 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0xA1 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0xB5 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x69 0x00 0x00 0x40 // '????i??@' 0x00 0x00 0x00 0x00 0x6B 0x00 0x00 0x40 // '????k??@' 0x05 0x00 0x00 0x00 0x71 0x00 0x00 0x40 // '????q??@' 0x00 0x00 0x00 0x00 0x73 0x00 0x00 0x40 // '????s??@' 0x01 0x00 0x00 0x00 0x9F 0x00 0x00 0x40 // '??????@' 0x07 0x00 0x00 0x00 0xB3 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xB5 0x00 0x00 0x40 // '??????@' 0x08 0x00 0x00 0x00 0xC7 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xC9 0x00 0x00 0x40 // '??????@' 0x02 0x00 0x00 0x00 0xDB 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x6B 0x00 0x00 0x80 // '????k??' 0x00 0x00 0x02 0x00 0x9F 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x6B 0x00 0x00 0x82 // '????k??' 0x00 0x00 0x00 0x00 0x6B 0x00 0x00 0xC0 // '????k??' 0x04 0x00 0x00 0x00 0x73 0x00 0x00 0xC0 // '????s??' 0x04 0x00 0x00 0x00 0x9F 0x00 0x00 0xC0 // '??????' 0x04 0x00 0x00 0x00 0xB5 0x00 0x00 0xC0 // '??????' 0x04 0x00 0x00 0x00 0xC9 0x00 0x00 0xC0 // '??????' 0x04 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) BYTE 0x03 0x03 0x50 0x6C 0x61 0x79 0x69 0x6E // '??Playin' 0x67 0x20 0x61 0x20 0x73 0x6F 0x75 0x6E // 'g a soun' 0x64 0x20 0x63 0x6F 0x6E 0x74 0x69 0x6E // 'd contin' 0x75 0x6F 0x75 0x73 0x6C 0x79 0x2D 0x2D // 'uously--' 0x57 0x68 0x61 0x74 0x20 0x6E 0x65 0x78 // 'What nex' 0x74 0x3F 0x0D 0x0A 0x4E 0x6F 0x74 0x65 // 't???Note' 0x3A 0x20 0x20 0x59 0x6F 0x75 0x20 0x77 // ': You w' 0x6F 0x6E 0x27 0x74 0x20 0x68 0x65 0x61 // 'on't hea' 0x72 0x20 0x74 0x68 0x65 0x20 0x73 0x6F // 'r the so' 0x75 0x6E 0x64 0x20 0x6C 0x6F 0x6F 0x70 // 'und loop' 0x20 0x75 0x6E 0x74 0x69 0x6C 0x20 0x79 // ' until y' 0x6F 0x75 0x20 0x70 0x6C 0x61 0x79 0x20 // 'ou play ' 0x79 0x6F 0x75 0x72 0x20 0x6D 0x6F 0x76 // 'your mov' 0x69 0x65 0x2E 0x0D 0x0A 0x01 0x20 0x55 // 'ie.??? U' 0x6E 0x64 0x6F 0x0D 0x0A 0x01 0x20 0x43 // 'ndo??? C' 0x68 0x61 0x6E 0x67 0x69 0x6E 0x67 0x20 // 'hanging ' 0x74 0x68 0x65 0x20 0x76 0x6F 0x6C 0x75 // 'the volu' 0x6D 0x65 0x20 0x6F 0x66 0x20 0x69 0x6E // 'me of in' 0x64 0x69 0x76 0x69 0x64 0x75 0x61 0x6C // 'dividual' 0x20 0x73 0x6F 0x75 0x6E 0x64 0x73 0x0D // ' sounds?' 0x0A 0x01 0x20 0x50 0x6C 0x61 0x79 0x69 // '?? Playi' 0x6E 0x67 0x20 0x79 0x6F 0x75 0x72 0x20 // 'ng your ' 0x6D 0x6F 0x76 0x69 0x65 0x0D 0x0A 0x01 // 'movie???' 0x20 0x52 0x65 0x6D 0x6F 0x76 0x69 0x6E // ' Removin' 0x67 0x20 0x61 0x20 0x73 0x6F 0x75 0x6E // 'g a soun' 0x64 0x0D 0x0A 0x01 0x20 0x53 0x74 0x6F // 'd??? Sto' 0x70 0x70 0x69 0x6E 0x67 0x20 0x61 0x20 // 'pping a ' 0x73 0x6F 0x75 0x6E 0x64 // 'sound' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_13= ktpcHowToSounds13 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_13, __HELP_NAME("CO 1) To attach sound+action")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_13, __HELP_NAME("CO 1) To attach sound+action")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x1AF 0x30 0x57415645 kwavHTSounds13 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_13, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcHowToSounds13" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds13" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_13, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE5 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_3=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) AG(4) ITEM LONG 0x2000003 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToSounds74 __HELP_SYMBOL( STN "ktpcHowToSounds74" ) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToSounds52 __HELP_SYMBOL( STN "ktpcHowToSounds52" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_2=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x1A 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x81 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x04 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x09 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x14 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x15 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x17 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x18 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x1E 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x81 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x1E 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x81 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x22 0x00 0x00 0x04 // '????"???' 0x0D 0x00 0x00 0xFE 0x31 0x00 0x00 0x04 // '???1???' 0x00 0x00 0x00 0x00 0x67 0x00 0x00 0x04 // '????g???' 0x0D 0x00 0x00 0xFE 0x77 0x00 0x00 0x04 // '???w???' 0x00 0x00 0x00 0x00 0x81 0x00 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x22 0x00 0x00 0x40 // '????"??@' 0x04 0x00 0x00 0x00 0x31 0x00 0x00 0x40 // '????1??@' 0x00 0x00 0x00 0x00 0x67 0x00 0x00 0x40 // '????g??@' 0x02 0x00 0x00 0x00 0x77 0x00 0x00 0x40 // '????w??@' 0x00 0x00 0x00 0x00 0x81 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x20 0x00 0x00 0x80 // '???? ??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x65 0x00 0x00 0x82 // '????e??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x61 0x74 0x74 // '??To att' 0x61 0x63 0x68 0x20 0x61 0x20 0x73 0x6F // 'ach a so' 0x75 0x6E 0x64 0x20 0x74 0x6F 0x20 0x61 // 'und to a' 0x6E 0x20 0x61 0x63 0x74 0x69 0x6F 0x6E // 'n action' 0x0D 0x0A 0x31 0x09 0x47 0x6F 0x20 0x74 // '??1?Go t' 0x6F 0x20 0x74 0x68 0x65 0x20 0x70 0x6C // 'o the pl' 0x61 0x63 0x65 0x20 0x69 0x6E 0x20 0x79 // 'ace in y' 0x6F 0x75 0x72 0x20 0x6D 0x6F 0x76 0x69 // 'our movi' 0x65 0x20 0x77 0x68 0x65 0x72 0x65 0x20 // 'e where ' 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 // 'you want' 0x20 0x74 0x6F 0x20 0x61 0x74 0x74 0x61 // ' to atta' 0x63 0x68 0x20 0x74 0x68 0x65 0x20 0x73 // 'ch the s' 0x6F 0x75 0x6E 0x64 0x2E 0x0D 0x0A 0x32 // 'ound.??2' 0x09 0x43 0x68 0x6F 0x6F 0x73 0x65 0x20 // '?Choose ' 0x74 0x68 0x65 0x20 0x73 0x6F 0x75 0x6E // 'the soun' 0x64 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 // 'd you wa' 0x6E 0x74 0x2E // 'nt.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_14= ktpcHowToSounds14 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_14, __HELP_NAME("CO 2) Click the actor, prop")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_14, __HELP_NAME("CO 2) Click the actor, prop")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTSounds14 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_34=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_14, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToSounds14" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds14" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_34=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_14, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_14=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_34, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToSounds76 __HELP_SYMBOL( STN "ktpcHowToSounds76" ) FREE ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_34=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_34, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x63 0x00 0x00 0x01 // '????c???' 0x00 0x00 0x00 0x00 0x44 0x00 0x00 0x40 // '????D??@' 0x01 0x00 0x00 0x00 0x63 0x00 0x00 0x40 // '????c??@' 0x00 0x00 0x00 0x00 0x44 0x00 0x00 0x80 // '????D??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x44 0x00 0x00 0x82 // '????D??' 0x00 0x00 0x00 0x00 0x44 0x00 0x00 0xC0 // '????D??' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_34=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_34, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x6F // 'the acto' 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 0x2C // 'r, prop,' 0x20 0x6F 0x72 0x20 0x33 0x44 0x20 0x77 // ' or 3D w' 0x6F 0x72 0x64 0x20 0x79 0x6F 0x75 0x20 // 'ord you ' 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 // 'want to ' 0x61 0x74 0x74 0x61 0x63 0x68 0x20 0x74 // 'attach t' 0x68 0x65 0x20 0x73 0x6F 0x75 0x6E 0x64 // 'he sound' 0x20 0x74 0x6F 0x2E 0x0D 0x0A 0x01 0x20 // ' to.??? ' 0x48 0x6F 0x77 0x20 0x6D 0x61 0x6E 0x79 // 'How many' 0x20 0x73 0x6F 0x75 0x6E 0x64 0x73 0x20 // ' sounds ' 0x63 0x61 0x6E 0x20 0x49 0x20 0x61 0x74 // 'can I at' 0x74 0x61 0x63 0x68 0x3F // 'tach?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_15= ktpcHowToSounds15 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_15, __HELP_NAME("What Next--Action Matcher")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_15, __HELP_NAME("What Next--Action Matcher")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTSounds15 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_17=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_15, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToSounds15" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds15" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_17=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_15, 0x0) BYTE 0x01 0x00 0x03 0x03 0x14 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_A=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_17, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToSounds69 __HELP_SYMBOL( STN "ktpcHowToSounds69" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktpcHowToSounds62 __HELP_SYMBOL( STN "ktpcHowToSounds62" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktpcHowToSounds73 __HELP_SYMBOL( STN "ktpcHowToSounds73" ) ITEM LONG 0xC0000004 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) FREE FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToSounds44 __HELP_SYMBOL( STN "ktpcHowToSounds44" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_17=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_17, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x17 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2A 0x00 0x00 0x01 // '????*???' 0x00 0x00 0x00 0x00 0x2C 0x00 0x00 0x01 // '????,???' 0x01 0x00 0x00 0x00 0x86 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x2A 0x00 0x00 0x03 // '???*???' 0x00 0x00 0x00 0x00 0x36 0x00 0x00 0x03 // '????6???' 0x0F 0x00 0x00 0xFD 0x5E 0x00 0x00 0x03 // '???^???' 0x00 0x00 0x00 0x00 0x2C 0x00 0x00 0x40 // '????,??@' 0x07 0x00 0x00 0x00 0x32 0x00 0x00 0x40 // '????2??@' 0x00 0x00 0x00 0x00 0x34 0x00 0x00 0x40 // '????4??@' 0x01 0x00 0x00 0x00 0x60 0x00 0x00 0x40 // '????`??@' 0x02 0x00 0x00 0x00 0x72 0x00 0x00 0x40 // '????r??@' 0x00 0x00 0x00 0x00 0x74 0x00 0x00 0x40 // '????t??@' 0x03 0x00 0x00 0x00 0x86 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x2C 0x00 0x00 0x80 // '????,??' 0x00 0x00 0x02 0x00 0x60 0x00 0x00 0x80 // '????`??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x2C 0x00 0x00 0x82 // '????,??' 0x00 0x00 0x00 0x00 0x2C 0x00 0x00 0xC0 // '????,??' 0x04 0x00 0x00 0x00 0x34 0x00 0x00 0xC0 // '????4??' 0x04 0x00 0x00 0x00 0x60 0x00 0x00 0xC0 // '????`??' 0x04 0x00 0x00 0x00 0x74 0x00 0x00 0xC0 // '????t??' 0x04 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_17=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_17, 0x0) BYTE 0x03 0x03 0x41 0x74 0x74 0x61 0x63 0x68 // '??Attach' 0x69 0x6E 0x67 0x20 0x61 0x20 0x73 0x6F // 'ing a so' 0x75 0x6E 0x64 0x20 0x74 0x6F 0x20 0x61 // 'und to a' 0x6E 0x20 0x61 0x63 0x74 0x69 0x6F 0x6E // 'n action' 0x2D 0x2D 0x57 0x68 0x61 0x74 0x20 0x6E // '--What n' 0x65 0x78 0x74 0x3F 0x0D 0x0A 0x01 0x20 // 'ext???? ' 0x55 0x6E 0x64 0x6F 0x0D 0x0A 0x01 0x20 // 'Undo??? ' 0x43 0x68 0x61 0x6E 0x67 0x69 0x6E 0x67 // 'Changing' 0x20 0x74 0x68 0x65 0x20 0x76 0x6F 0x6C // ' the vol' 0x75 0x6D 0x65 0x20 0x6F 0x66 0x20 0x69 // 'ume of i' 0x6E 0x64 0x69 0x76 0x69 0x64 0x75 0x61 // 'ndividua' 0x6C 0x20 0x73 0x6F 0x75 0x6E 0x64 0x73 // 'l sounds' 0x0D 0x0A 0x01 0x20 0x52 0x65 0x6D 0x6F // '??? Remo' 0x76 0x69 0x6E 0x67 0x20 0x61 0x20 0x73 // 'ving a s' 0x6F 0x75 0x6E 0x64 0x0D 0x0A 0x01 0x20 // 'ound??? ' 0x53 0x74 0x6F 0x70 0x70 0x69 0x6E 0x67 // 'Stopping' 0x20 0x61 0x20 0x73 0x6F 0x75 0x6E 0x64 // ' a sound' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_16= ktpcHowToSounds16 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_16, __HELP_NAME("CO 1) To change all volume")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_16, __HELP_NAME("CO 1) To change all volume")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidVolumeSlider kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTSounds16 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_16, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToSounds16" ITEM "kgobHowtoSequence" ITEM "kidVolumeSlider" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds16" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_16, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB5 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_3=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x09 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x50 0x00 0x00 0x01 // '????P???' 0x00 0x00 0x00 0x00 0x50 0x00 0x00 0x02 // '????P???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x41 0x00 0x00 0x03 // '???A???' 0x0A 0x00 0x00 0xFD 0x4F 0x00 0x00 0x03 // '???O???' 0x0F 0x00 0x00 0xFD 0x50 0x00 0x00 0x03 // '???P???' 0x00 0x00 0x00 0x00 0x50 0x00 0x00 0x04 // '????P???' 0x00 0x00 0x00 0x00 0x50 0x00 0x00 0x40 // '????P??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x63 0x68 0x61 // '??To cha' 0x6E 0x67 0x65 0x20 0x74 0x68 0x65 0x20 // 'nge the ' 0x76 0x6F 0x6C 0x75 0x6D 0x65 0x20 0x66 // 'volume f' 0x6F 0x72 0x20 0x61 0x6C 0x6C 0x20 0x73 // 'or all s' 0x6F 0x75 0x6E 0x64 0x73 0x20 0x69 0x6E // 'ounds in' 0x20 0x33 0x44 0x20 0x4D 0x6F 0x76 0x69 // ' 3D Movi' 0x65 0x20 0x4D 0x61 0x6B 0x65 0x72 0x2C // 'e Maker,' 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 0x74 // ' click t' 0x68 0x65 0x20 0x56 0x6F 0x6C 0x75 0x6D // 'he Volum' 0x65 0x20 0x43 0x6F 0x6E 0x74 0x72 0x6F // 'e Contro' 0x6C 0x2E // 'l.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_17= ktpcHowToSounds17 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_17, __HELP_NAME("CO 2) Drag the Volume Control")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_17, __HELP_NAME("CO 2) Drag the Volume Control")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidVolumeSlider kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTSounds17 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_7=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_17, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToSounds17" ITEM "kgobHowtoSequence" ITEM "kidVolumeSlider" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds17" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_7=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_17, 0x0) BYTE 0x01 0x00 0x03 0x03 0x99 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_16=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToSounds51 __HELP_SYMBOL( STN "ktpcHowToSounds51" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_7=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x09 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2A 0x00 0x00 0x01 // '????*???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x2A 0x00 0x00 0x03 // '???*???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x04 0x00 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x40 // '???????@' 0x02 0x00 0x00 0x00 0x04 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x2A 0x00 0x00 0x40 // '????*??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_7=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) BYTE 0x03 0x03 0x44 0x72 0x61 0x67 0x20 0x74 // '??Drag t' 0x68 0x65 0x20 0x56 0x6F 0x6C 0x75 0x6D // 'he Volum' 0x65 0x20 0x43 0x6F 0x6E 0x74 0x72 0x6F // 'e Contro' 0x6C 0x20 0x73 0x6C 0x69 0x64 0x65 0x72 // 'l slider' 0x20 0x75 0x70 0x20 0x6F 0x72 0x20 0x64 // ' up or d' 0x6F 0x77 0x6E 0x2E // 'own.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_18= ktpcHowToSounds18 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_18, __HELP_NAME("What Next--Volume Control")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_18, __HELP_NAME("What Next--Volume Control")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTSounds18 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_12=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_18, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToSounds18" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds18" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_12=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_18, 0x0) BYTE 0x01 0x00 0x03 0x03 0x22 0x01 0x00 0x00 // '????"???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_D=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_12, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToSounds69 __HELP_SYMBOL( STN "ktpcHowToSounds69" ) ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_12=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_12, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0E 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2F 0x00 0x00 0x01 // '????/???' 0x00 0x00 0x00 0x00 0x31 0x00 0x00 0x01 // '????1???' 0x01 0x00 0x00 0x00 0x5B 0x00 0x00 0x01 // '????[???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x2F 0x00 0x00 0x03 // '???/???' 0x00 0x00 0x00 0x00 0x33 0x00 0x00 0x03 // '????3???' 0x0F 0x00 0x00 0xFD 0x5B 0x00 0x00 0x03 // '???[???' 0x00 0x00 0x00 0x00 0x31 0x00 0x00 0x40 // '????1??@' 0x02 0x00 0x00 0x00 0x5B 0x00 0x00 0x40 // '????[??@' 0x00 0x00 0x00 0x00 0x31 0x00 0x00 0x80 // '????1??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x31 0x00 0x00 0x82 // '????1??' 0x00 0x00 0x00 0x00 0x31 0x00 0x00 0xC0 // '????1??' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_12=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_12, 0x0) BYTE 0x03 0x03 0x41 0x64 0x6A 0x75 0x73 0x74 // '??Adjust' 0x69 0x6E 0x67 0x20 0x74 0x68 0x65 0x20 // 'ing the ' 0x76 0x6F 0x6C 0x75 0x6D 0x65 0x20 0x66 // 'volume f' 0x6F 0x72 0x20 0x61 0x6C 0x6C 0x20 0x73 // 'or all s' 0x6F 0x75 0x6E 0x64 0x73 0x2D 0x2D 0x57 // 'ounds--W' 0x68 0x61 0x74 0x20 0x6E 0x65 0x78 0x74 // 'hat next' 0x3F 0x0D 0x0A 0x01 0x20 0x43 0x68 0x61 // '???? Cha' 0x6E 0x67 0x69 0x6E 0x67 0x20 0x74 0x68 // 'nging th' 0x65 0x20 0x76 0x6F 0x6C 0x75 0x6D 0x65 // 'e volume' 0x20 0x6F 0x66 0x20 0x69 0x6E 0x64 0x69 // ' of indi' 0x76 0x69 0x64 0x75 0x61 0x6C 0x20 0x73 // 'vidual s' 0x6F 0x75 0x6E 0x64 0x73 // 'ounds' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_19= ktpcHowToSounds19 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_19, __HELP_NAME("CO 1) To change individual volume")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_19, __HELP_NAME("CO 1) To change individual volume")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence kidSoundsListen kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTSounds19 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_19, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcHowToSounds19" ITEM "kgobHowtoSequence" ITEM "kidSoundsListen" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds19" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_19, 0x0) BYTE 0x01 0x00 0x03 0x03 0xFE 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_9=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) AG(4) FREE ITEM LONG 0x2000002 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToSounds52 __HELP_SYMBOL( STN "ktpcHowToSounds52" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x12 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xC8 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x09 0x00 0x00 0x02 // '????????' 0x02 0x00 0x00 0x00 0x0C 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x1D 0x00 0x00 0x02 // '????????' 0x02 0x00 0x00 0x00 0x2B 0x00 0x00 0x02 // '????+???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x3F 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x43 0x00 0x00 0x03 // '???C???' 0x00 0x00 0x00 0x00 0xBF 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xC7 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x43 0x00 0x00 0x04 // '????C???' 0x0D 0x00 0x00 0xFE 0x52 0x00 0x00 0x04 // '???R???' 0x00 0x00 0x00 0x00 0x43 0x00 0x00 0x40 // '????C??@' 0x03 0x00 0x00 0x00 0x52 0x00 0x00 0x40 // '????R??@' 0x00 0x00 0x00 0x00 0x41 0x00 0x00 0x80 // '????A??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xB3 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x6C 0x69 0x73 // '??To lis' 0x74 0x65 0x6E 0x20 0x74 0x6F 0x2C 0x20 // 'ten to, ' 0x72 0x65 0x6D 0x6F 0x76 0x65 0x2C 0x20 // 'remove, ' 0x6F 0x72 0x20 0x63 0x68 0x61 0x6E 0x67 // 'or chang' 0x65 0x20 0x74 0x68 0x65 0x20 0x76 0x6F // 'e the vo' 0x6C 0x75 0x6D 0x65 0x20 0x6F 0x66 0x20 // 'lume of ' 0x69 0x6E 0x64 0x69 0x76 0x69 0x64 0x75 // 'individu' 0x61 0x6C 0x20 0x73 0x6F 0x75 0x6E 0x64 // 'al sound' 0x73 0x0D 0x0A 0x31 0x09 0x47 0x6F 0x20 // 's??1?Go ' 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 0x70 // 'to the p' 0x6C 0x61 0x63 0x65 0x20 0x69 0x6E 0x20 // 'lace in ' 0x79 0x6F 0x75 0x72 0x20 0x6D 0x6F 0x76 // 'your mov' 0x69 0x65 0x20 0x77 0x68 0x65 0x72 0x65 // 'ie where' 0x20 0x74 0x68 0x65 0x20 0x73 0x6F 0x75 // ' the sou' 0x6E 0x64 0x20 0x62 0x65 0x67 0x69 0x6E // 'nd begin' 0x73 0x2E 0x20 0x20 0x59 0x6F 0x75 0x27 // 's. You'' 0x6C 0x6C 0x20 0x68 0x65 0x61 0x72 0x20 // 'll hear ' 0x74 0x68 0x65 0x20 0x73 0x6F 0x75 0x6E // 'the soun' 0x64 0x73 0x20 0x61 0x73 0x20 0x79 0x6F // 'ds as yo' 0x75 0x20 0x6D 0x6F 0x76 0x65 0x20 0x66 // 'u move f' 0x72 0x6F 0x6D 0x20 0x66 0x72 0x61 0x6D // 'rom fram' 0x65 0x20 0x74 0x6F 0x20 0x66 0x72 0x61 // 'e to fra' 0x6D 0x65 0x2E 0x0D 0x0A 0x32 0x09 0x43 // 'me.??2?C' 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 // 'lick the' 0x20 0x4C 0x69 0x73 0x74 0x65 0x6E 0x65 // ' Listene' 0x72 0x2E // 'r.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1A= ktpcHowToSounds1A #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1A, __HELP_NAME("CO 2) To listen to ")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1A, __HELP_NAME("CO 2) To listen to ")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTSounds1A ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1A, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToSounds1A" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds1A" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1A, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xEC 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0xEC 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x73 0x00 0x00 0x82 // '????s??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x6C 0x69 0x73 // '??To lis' 0x74 0x65 0x6E 0x20 0x74 0x6F 0x20 0x73 // 'ten to s' 0x6F 0x75 0x6E 0x64 0x73 0x2C 0x20 0x6D // 'ounds, m' 0x6F 0x76 0x65 0x20 0x74 0x68 0x65 0x20 // 'ove the ' 0x6D 0x6F 0x75 0x73 0x65 0x20 0x63 0x75 // 'mouse cu' 0x72 0x73 0x6F 0x72 0x20 0x6F 0x76 0x65 // 'rsor ove' 0x72 0x20 0x74 0x68 0x65 0x20 0x61 0x63 // 'r the ac' 0x74 0x6F 0x72 0x2C 0x20 0x70 0x72 0x6F // 'tor, pro' 0x70 0x2C 0x20 0x6F 0x72 0x20 0x33 0x44 // 'p, or 3D' 0x20 0x77 0x6F 0x72 0x64 0x20 0x77 0x68 // ' word wh' 0x6F 0x73 0x65 0x20 0x73 0x6F 0x75 0x6E // 'ose soun' 0x64 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 // 'd you wa' 0x6E 0x74 0x20 0x74 0x6F 0x20 0x68 0x65 // 'nt to he' 0x61 0x72 0x2E 0x0D 0x0A 0x2D 0x2D 0x6F // 'ar.??--o' 0x72 0x2D 0x2D 0x0D 0x0A 0x54 0x6F 0x20 // 'r--??To ' 0x63 0x68 0x61 0x6E 0x67 0x65 0x20 0x74 // 'change t' 0x68 0x65 0x20 0x73 0x6F 0x75 0x6E 0x64 // 'he sound' 0x20 0x76 0x6F 0x6C 0x75 0x6D 0x65 0x20 // ' volume ' 0x6F 0x72 0x20 0x72 0x65 0x6D 0x6F 0x76 // 'or remov' 0x65 0x20 0x61 0x20 0x73 0x6F 0x75 0x6E // 'e a soun' 0x64 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B // 'd, click' 0x20 0x74 0x68 0x65 0x20 0x33 0x44 0x20 // ' the 3D ' 0x6F 0x62 0x6A 0x65 0x63 0x74 0x20 0x6F // 'object o' 0x72 0x20 0x62 0x61 0x63 0x6B 0x67 0x72 // 'r backgr' 0x6F 0x75 0x6E 0x64 0x20 0x77 0x68 0x6F // 'ound who' 0x73 0x65 0x20 0x73 0x6F 0x75 0x6E 0x64 // 'se sound' 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E // ' you wan' 0x74 0x20 0x74 0x6F 0x20 0x63 0x68 0x61 // 't to cha' 0x6E 0x67 0x65 0x20 0x6F 0x72 0x20 0x72 // 'nge or r' 0x65 0x6D 0x6F 0x76 0x65 0x2E // 'emove.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1B= ktpcHowToSounds1B #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1B, __HELP_NAME("CO 3) Listener Easel")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1B, __HELP_NAME("CO 3) Listener Easel")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon0 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTSounds1B ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_19=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1B, 0x0) GST(0) ITEM "kgobCalloutBalloon0" ITEM "ktpcHowToSounds1B" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds1B" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_19=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x8C 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_19=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_19, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_19=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_19, 0x0) BYTE 0x03 0x03 0x4E 0x6F 0x74 0x65 0x20 0x74 // '??Note t' 0x6F 0x20 0x54 0x6F 0x6E 0x79 0x3A 0x20 // 'o Tony: ' 0x20 0x55 0x73 0x65 0x20 0x74 0x65 0x78 // ' Use tex' 0x74 0x20 0x74 0x68 0x61 0x74 0x20 0x61 // 't that a' 0x70 0x70 0x65 0x61 0x72 0x73 0x20 0x77 // 'ppears w' 0x68 0x65 0x6E 0x20 0x74 0x68 0x65 0x79 // 'hen they' 0x20 0x75 0x73 0x65 0x20 0x74 0x68 0x65 // ' use the' 0x20 0x4C 0x69 0x73 0x74 0x65 0x6E 0x65 // ' Listene' 0x72 0x20 0x65 0x61 0x73 0x65 0x6C 0x2E // 'r easel.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1C= ktpcHowToSounds1C #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1C, __HELP_NAME("What Next--Listener")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1C, __HELP_NAME("What Next--Listener")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTSounds1C ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_15=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1C, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToSounds1C" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds1C" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_15=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1C, 0x0) BYTE 0x01 0x00 0x03 0x03 0xF0 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_28=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_15, 0x0) AG(4) FREE ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToSounds44 __HELP_SYMBOL( STN "ktpcHowToSounds44" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_15=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_15, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0E 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x4F 0x00 0x00 0x01 // '????O???' 0x00 0x00 0x00 0x00 0x51 0x00 0x00 0x01 // '????Q???' 0x01 0x00 0x00 0x00 0x57 0x00 0x00 0x01 // '????W???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x4F 0x00 0x00 0x03 // '???O???' 0x00 0x00 0x00 0x00 0x53 0x00 0x00 0x03 // '????S???' 0x0F 0x00 0x00 0xFD 0x57 0x00 0x00 0x03 // '???W???' 0x00 0x00 0x00 0x00 0x51 0x00 0x00 0x40 // '????Q??@' 0x03 0x00 0x00 0x00 0x57 0x00 0x00 0x40 // '????W??@' 0x00 0x00 0x00 0x00 0x51 0x00 0x00 0x80 // '????Q??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x51 0x00 0x00 0x82 // '????Q??' 0x00 0x00 0x00 0x00 0x51 0x00 0x00 0xC0 // '????Q??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_15=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_15, 0x0) BYTE 0x03 0x03 0x4C 0x69 0x73 0x74 0x65 0x6E // '??Listen' 0x69 0x6E 0x67 0x20 0x74 0x6F 0x2C 0x20 // 'ing to, ' 0x72 0x65 0x6D 0x6F 0x76 0x69 0x6E 0x67 // 'removing' 0x2C 0x20 0x6F 0x72 0x20 0x63 0x68 0x61 // ', or cha' 0x6E 0x67 0x69 0x6E 0x67 0x20 0x74 0x68 // 'nging th' 0x65 0x20 0x76 0x6F 0x6C 0x75 0x6D 0x65 // 'e volume' 0x20 0x6F 0x66 0x20 0x69 0x6E 0x64 0x69 // ' of indi' 0x76 0x69 0x64 0x75 0x61 0x6C 0x20 0x73 // 'vidual s' 0x6F 0x75 0x6E 0x64 0x73 0x2D 0x2D 0x57 // 'ounds--W' 0x68 0x61 0x74 0x20 0x6E 0x65 0x78 0x74 // 'hat next' 0x3F 0x0D 0x0A 0x01 0x20 0x55 0x6E 0x64 // '???? Und' 0x6F // 'o' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1D= ktpcHowToSounds1D #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1D, __HELP_NAME("CO 1) Turn off McZee")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1D, __HELP_NAME("CO 1) Turn off McZee")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon5 kgobHowtoSequence kidBook kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTSounds1D ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_20=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1D, 0x0) GST(0) ITEM "kgobCalloutBalloon5" ITEM "ktpcHowToSounds1D" ITEM "kgobHowtoSequence" ITEM "kidBook" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds1D" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_20=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1D, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB4 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_20=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_20, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x38 0x00 0x00 0x01 // '????8???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x2B 0x00 0x00 0x03 // '???+???' 0x0A 0x00 0x00 0xFD 0x37 0x00 0x00 0x03 // '???7???' 0x0F 0x00 0x00 0xFD 0x38 0x00 0x00 0x03 // '???8???' 0x00 0x00 0x00 0x00 0x38 0x00 0x00 0x40 // '????8??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_20=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_20, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x74 0x75 0x72 // '??To tur' 0x6E 0x20 0x4D 0x63 0x5A 0x65 0x65 0x27 // 'n McZee'' 0x73 0x20 0x76 0x6F 0x69 0x63 0x65 0x20 // 's voice ' 0x6F 0x6E 0x20 0x6F 0x72 0x20 0x6F 0x66 // 'on or of' 0x66 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B // 'f, click' 0x20 0x74 0x68 0x65 0x20 0x48 0x65 0x6C // ' the Hel' 0x70 0x20 0x4D 0x61 0x63 0x68 0x69 0x6E // 'p Machin' 0x65 0x2E // 'e.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1E= ktpcHowToSounds1E #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1E, __HELP_NAME("CO 2) Click audio on/off")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1E, __HELP_NAME("CO 2) Click audio on/off")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon5 kgobHowtoSequence kgobHelpBookVoice kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTSounds1E ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1E, 0x0) GST(0) ITEM "kgobCalloutBalloon5" ITEM "ktpcHowToSounds1E" ITEM "kgobHowtoSequence" ITEM "kgobHelpBookVoice" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds1E" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x65 0x00 0x00 0x00 // '????e???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x12 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2C, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x69 0x73 0x20 0x62 0x75 0x74 // 'this but' 0x74 0x6F 0x6E 0x2E // 'ton.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1F= ktpcHowToSounds1F #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1F, __HELP_NAME("CO 2) Click Close.")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1F, __HELP_NAME("CO 2) Click Close.")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon5 kgobHowtoSequence kgobHelpBookCancel kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTSounds1F ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_5=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1F, 0x0) GST(0) ITEM "kgobCalloutBalloon5" ITEM "ktpcHowToSounds1F" ITEM "kgobHowtoSequence" ITEM "kgobHelpBookCancel" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds1F" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_5=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x44 0x00 0x00 0x00 // '????D???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_5=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0C 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_5=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x43 0x6C 0x6F 0x73 0x65 0x2E // 'Close.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_20= ktpcHowToSounds20 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_20, __HELP_NAME("CO 1) To chain sounds together")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_20, __HELP_NAME("CO 1) To chain sounds together")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x1AF 0x30 0x57415645 kwavHTSounds20 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_10=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_20, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcHowToSounds20" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds20" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_10=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_20, 0x0) BYTE 0x01 0x00 0x03 0x03 0xED 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_C=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_10, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToSounds74 __HELP_SYMBOL( STN "ktpcHowToSounds74" ) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToSounds52 __HELP_SYMBOL( STN "ktpcHowToSounds52" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_10=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_10, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x10 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xAA 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x47 0x00 0x00 0x03 // '???G???' 0x0F 0x00 0x00 0xFD 0x49 0x00 0x00 0x03 // '???I???' 0x00 0x00 0x00 0x00 0x4B 0x00 0x00 0x04 // '????K???' 0x0D 0x00 0x00 0xFE 0x5A 0x00 0x00 0x04 // '???Z???' 0x00 0x00 0x00 0x00 0x90 0x00 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xA0 0x00 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0x4B 0x00 0x00 0x40 // '????K??@' 0x03 0x00 0x00 0x00 0x5A 0x00 0x00 0x40 // '????Z??@' 0x00 0x00 0x00 0x00 0x90 0x00 0x00 0x40 // '??????@' 0x01 0x00 0x00 0x00 0xA0 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x49 0x00 0x00 0x80 // '????I??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x8E 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_10=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_10, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x63 0x68 0x61 // '??To cha' 0x69 0x6E 0x20 0x61 0x20 0x73 0x6F 0x75 // 'in a sou' 0x6E 0x64 0x20 0x74 0x6F 0x20 0x61 0x6E // 'nd to an' 0x6F 0x74 0x68 0x65 0x72 0x20 0x73 0x6F // 'other so' 0x75 0x6E 0x64 0x20 0x73 0x6F 0x20 0x74 // 'und so t' 0x68 0x61 0x74 0x20 0x74 0x68 0x65 0x79 // 'hat they' 0x20 0x70 0x6C 0x61 0x79 0x20 0x6F 0x6E // ' play on' 0x65 0x20 0x61 0x66 0x74 0x65 0x72 0x20 // 'e after ' 0x74 0x68 0x65 0x20 0x6F 0x74 0x68 0x65 // 'the othe' 0x72 0x0D 0x0A 0x31 0x09 0x47 0x6F 0x20 // 'r??1?Go ' 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 0x70 // 'to the p' 0x6C 0x61 0x63 0x65 0x20 0x69 0x6E 0x20 // 'lace in ' 0x79 0x6F 0x75 0x72 0x20 0x6D 0x6F 0x76 // 'your mov' 0x69 0x65 0x20 0x77 0x68 0x65 0x72 0x65 // 'ie where' 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E // ' you wan' 0x74 0x20 0x74 0x6F 0x20 0x61 0x74 0x74 // 't to att' 0x61 0x63 0x68 0x20 0x74 0x68 0x65 0x20 // 'ach the ' 0x73 0x6F 0x75 0x6E 0x64 0x2E 0x0D 0x0A // 'sound.??' 0x32 0x09 0x43 0x68 0x6F 0x6F 0x73 0x65 // '2?Choose' 0x20 0x74 0x68 0x65 0x20 0x73 0x6F 0x75 // ' the sou' 0x6E 0x64 0x20 0x79 0x6F 0x75 0x20 0x77 // 'nd you w' 0x61 0x6E 0x74 0x2E // 'ant.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_21= ktpcHowToSounds21 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_21, __HELP_NAME("CO 2) Click Play Once.")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_21, __HELP_NAME("CO 2) Click Play Once.")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence kidSoundsPlayOnce kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTSounds21 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_21, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcHowToSounds21" ITEM "kgobHowtoSequence" ITEM "kidSoundsPlayOnce" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds21" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_21, 0x0) BYTE 0x01 0x00 0x03 0x03 0x5D 0x00 0x00 0x00 // '????]???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0F 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0F 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x10 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1C, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x50 0x6C 0x61 0x79 0x20 0x4F 0x6E 0x63 // 'Play Onc' 0x65 0x2E // 'e.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_22= ktpcHowToSounds22 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_22, __HELP_NAME("CO 3) Hold down Ctrl when ")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_22, __HELP_NAME("CO 3) Hold down Ctrl when ")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTSounds22 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_11=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_22, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToSounds22" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds22" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_11=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_22, 0x0) BYTE 0x01 0x00 0x03 0x03 0x09 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_11=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_11, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0B 0x01 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x0B 0x01 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x68 0x00 0x00 0x82 // '????h??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_11=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_11, 0x0) BYTE 0x03 0x03 0x48 0x6F 0x6C 0x64 0x20 0x64 // '??Hold d' 0x6F 0x77 0x6E 0x20 0x43 0x74 0x72 0x6C // 'own Ctrl' 0x20 0x77 0x68 0x65 0x6E 0x20 0x79 0x6F // ' when yo' 0x75 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 // 'u click ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x6F // 'the acto' 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 0x2C // 'r, prop,' 0x20 0x33 0x44 0x20 0x77 0x6F 0x72 0x64 // ' 3D word' 0x2C 0x20 0x6F 0x72 0x20 0x62 0x61 0x63 // ', or bac' 0x6B 0x67 0x72 0x6F 0x75 0x6E 0x64 0x20 // 'kground ' 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 // 'you want' 0x20 0x74 0x6F 0x20 0x61 0x74 0x74 0x61 // ' to atta' 0x63 0x68 0x20 0x74 0x68 0x65 0x20 0x73 // 'ch the s' 0x6F 0x75 0x6E 0x64 0x20 0x74 0x6F 0x2E // 'ound to.' 0x0D 0x0A 0x54 0x68 0x65 0x20 0x73 0x6F // '??The so' 0x75 0x6E 0x64 0x20 0x69 0x73 0x20 0x63 // 'und is c' 0x68 0x61 0x69 0x6E 0x65 0x64 0x20 0x74 // 'hained t' 0x6F 0x20 0x74 0x68 0x65 0x20 0x73 0x6F // 'o the so' 0x75 0x6E 0x64 0x20 0x74 0x68 0x61 0x74 // 'und that' 0x20 0x79 0x6F 0x75 0x20 0x70 0x72 0x65 // ' you pre' 0x76 0x69 0x6F 0x75 0x73 0x6C 0x79 0x20 // 'viously ' 0x61 0x74 0x74 0x61 0x63 0x68 0x65 0x64 // 'attached' 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 // ' to the ' 0x6F 0x62 0x6A 0x65 0x63 0x74 0x2E 0x20 // 'object. ' 0x20 0x54 0x68 0x65 0x20 0x6E 0x65 0x77 // ' The new' 0x20 0x73 0x6F 0x75 0x6E 0x64 0x20 0x70 // ' sound p' 0x6C 0x61 0x79 0x73 0x20 0x61 0x74 0x20 // 'lays at ' 0x74 0x68 0x65 0x20 0x65 0x6E 0x64 0x20 // 'the end ' 0x6F 0x66 0x20 0x74 0x68 0x65 0x20 0x63 // 'of the c' 0x68 0x61 0x69 0x6E 0x2D 0x2D 0x79 0x6F // 'hain--yo' 0x75 0x20 0x63 0x61 0x6E 0x27 0x74 0x20 // 'u can't ' 0x69 0x6E 0x73 0x65 0x72 0x74 0x20 0x61 // 'insert a' 0x20 0x73 0x6F 0x75 0x6E 0x64 0x20 0x69 // ' sound i' 0x6E 0x20 0x74 0x68 0x65 0x20 0x6D 0x69 // 'n the mi' 0x64 0x64 0x6C 0x65 0x2E // 'ddle.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_23= ktpcHowToSounds23 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_23, __HELP_NAME("CO 1) To stop a sound")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_23, __HELP_NAME("CO 1) To stop a sound")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x1AF 0x30 0x57415645 kwavHTSounds23 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_23, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcHowToSounds23" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds23" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_23, 0x0) BYTE 0x01 0x00 0x03 0x03 0x13 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_B=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1A, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToSounds74 __HELP_SYMBOL( STN "ktpcHowToSounds74" ) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToSounds52 __HELP_SYMBOL( STN "ktpcHowToSounds52" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_1A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x10 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x80 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0F 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x11 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x13 0x00 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x22 0x00 0x00 0x04 // '???"???' 0x00 0x00 0x00 0x00 0x56 0x00 0x00 0x04 // '????V???' 0x0D 0x00 0x00 0xFE 0x6E 0x00 0x00 0x04 // '???n???' 0x00 0x00 0x00 0x00 0x13 0x00 0x00 0x40 // '???????@' 0x03 0x00 0x00 0x00 0x22 0x00 0x00 0x40 // '????"??@' 0x00 0x00 0x00 0x00 0x56 0x00 0x00 0x40 // '????V??@' 0x01 0x00 0x00 0x00 0x6E 0x00 0x00 0x40 // '????n??@' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x54 0x00 0x00 0x82 // '????T??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1A, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x73 0x74 0x6F // '??To sto' 0x70 0x20 0x61 0x20 0x73 0x6F 0x75 0x6E // 'p a soun' 0x64 0x0D 0x0A 0x31 0x09 0x47 0x6F 0x20 // 'd??1?Go ' 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 0x70 // 'to the p' 0x6C 0x61 0x63 0x65 0x20 0x69 0x6E 0x20 // 'lace in ' 0x79 0x6F 0x75 0x72 0x20 0x6D 0x6F 0x76 // 'your mov' 0x69 0x65 0x20 0x77 0x68 0x65 0x72 0x65 // 'ie where' 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E // ' you wan' 0x74 0x20 0x74 0x6F 0x20 0x73 0x74 0x6F // 't to sto' 0x70 0x20 0x74 0x68 0x65 0x20 0x73 0x6F // 'p the so' 0x75 0x6E 0x64 0x2E 0x0D 0x0A 0x32 0x09 // 'und.??2?' 0x43 0x68 0x6F 0x6F 0x73 0x65 0x20 0x74 // 'Choose t' 0x68 0x65 0x20 0x6B 0x69 0x6E 0x64 0x20 // 'he kind ' 0x6F 0x66 0x20 0x73 0x6F 0x75 0x6E 0x64 // 'of sound' 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E // ' you wan' 0x74 0x20 0x74 0x6F 0x20 0x73 0x74 0x6F // 't to sto' 0x70 0x2E // 'p.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_24= ktpcHowToSounds24 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_24, __HELP_NAME("CO 2) Click No Sound")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_24, __HELP_NAME("CO 2) Click No Sound")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidSoundsClear kidPlayHelpSounds 0x140 0x0 0x57415645 kwavHTSounds24 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_24, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToSounds24" ITEM "kgobHowtoSequence" ITEM "kidSoundsClear" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds24" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_24, 0x0) BYTE 0x01 0x00 0x03 0x03 0x86 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x03 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x25 0x00 0x00 0x01 // '????%???' 0x00 0x00 0x00 0x00 0x25 0x00 0x00 0x40 // '????%??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x22 0x53 0x6F 0x75 0x6E 0x64 0x20 0x53 // '"Sound S' 0x74 0x6F 0x70 0x70 0x65 0x72 0x2C 0x22 // 'topper,"' 0x20 0x74 0x68 0x65 0x6E 0x20 0x63 0x6C // ' then cl' 0x69 0x63 0x6B 0x20 0x4F 0x4B 0x2E // 'ick OK.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_25= ktpcHowToSounds25 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_25, __HELP_NAME("What Next--Stop Sound")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_25, __HELP_NAME("What Next--Stop Sound")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTSounds25 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_35=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_25, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToSounds25" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds25" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_37=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_25, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB9 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_13=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_37, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToSounds2E __HELP_SYMBOL( STN "ktpcHowToSounds2E" ) ITEM LONG 0xC0000002 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToSounds44 __HELP_SYMBOL( STN "ktpcHowToSounds44" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_37=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_37, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x13 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1C 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x1E 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x3A 0x00 0x00 0x01 // '????:???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x1C 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x20 0x00 0x00 0x03 // '???? ???' 0x0F 0x00 0x00 0xFD 0x26 0x00 0x00 0x03 // '???&???' 0x00 0x00 0x00 0x00 0x28 0x00 0x00 0x03 // '????(???' 0x0F 0x00 0x00 0xFD 0x3A 0x00 0x00 0x03 // '???:???' 0x00 0x00 0x00 0x00 0x1E 0x00 0x00 0x40 // '???????@' 0x04 0x00 0x00 0x00 0x24 0x00 0x00 0x40 // '????$??@' 0x00 0x00 0x00 0x00 0x26 0x00 0x00 0x40 // '????&??@' 0x02 0x00 0x00 0x00 0x3A 0x00 0x00 0x40 // '????:??@' 0x00 0x00 0x00 0x00 0x1E 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x1E 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x1E 0x00 0x00 0xC0 // '???????' 0x03 0x00 0x00 0x00 0x26 0x00 0x00 0xC0 // '????&??' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_37=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_37, 0x0) BYTE 0x03 0x03 0x53 0x74 0x6F 0x70 0x70 0x69 // '??Stoppi' 0x6E 0x67 0x20 0x61 0x20 0x73 0x6F 0x75 // 'ng a sou' 0x6E 0x64 0x2D 0x2D 0x57 0x68 0x61 0x74 // 'nd--What' 0x20 0x6E 0x65 0x78 0x74 0x3F 0x0D 0x0A // ' next???' 0x01 0x20 0x55 0x6E 0x64 0x6F 0x0D 0x0A // '? Undo??' 0x01 0x20 0x50 0x6C 0x61 0x79 0x69 0x6E // '? Playin' 0x67 0x20 0x79 0x6F 0x75 0x72 0x20 0x6D // 'g your m' 0x6F 0x76 0x69 0x65 // 'ovie' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_26= ktpcHowToSounds26 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_26, __HELP_NAME("What Next--Chain Sounds")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_26, __HELP_NAME("What Next--Chain Sounds")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTSounds26 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_26, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToSounds26" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds26" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_26, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB6 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_E=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1B, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToSounds2E __HELP_SYMBOL( STN "ktpcHowToSounds2E" ) ITEM LONG 0xC0000002 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToSounds44 __HELP_SYMBOL( STN "ktpcHowToSounds44" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_1B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x13 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1B 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x1D 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x39 0x00 0x00 0x01 // '????9???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x1B 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x1F 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x25 0x00 0x00 0x03 // '???%???' 0x00 0x00 0x00 0x00 0x27 0x00 0x00 0x03 // '????'???' 0x0F 0x00 0x00 0xFD 0x39 0x00 0x00 0x03 // '???9???' 0x00 0x00 0x00 0x00 0x1D 0x00 0x00 0x40 // '???????@' 0x04 0x00 0x00 0x00 0x23 0x00 0x00 0x40 // '????#??@' 0x00 0x00 0x00 0x00 0x25 0x00 0x00 0x40 // '????%??@' 0x01 0x00 0x00 0x00 0x39 0x00 0x00 0x40 // '????9??@' 0x00 0x00 0x00 0x00 0x1D 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x1D 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x1D 0x00 0x00 0xC0 // '???????' 0x02 0x00 0x00 0x00 0x25 0x00 0x00 0xC0 // '????%??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1B, 0x0) BYTE 0x03 0x03 0x43 0x68 0x61 0x69 0x6E 0x69 // '??Chaini' 0x6E 0x67 0x20 0x73 0x6F 0x75 0x6E 0x64 // 'ng sound' 0x73 0x2D 0x2D 0x57 0x68 0x61 0x74 0x20 // 's--What ' 0x6E 0x65 0x78 0x74 0x3F 0x0D 0x0A 0x01 // 'next????' 0x20 0x55 0x6E 0x64 0x6F 0x0D 0x0A 0x01 // ' Undo???' 0x20 0x50 0x6C 0x61 0x79 0x69 0x6E 0x67 // ' Playing' 0x20 0x79 0x6F 0x75 0x72 0x20 0x6D 0x6F // ' your mo' 0x76 0x69 0x65 // 'vie' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_27= ktpcHowToSounds27 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_27, __HELP_NAME("CO 1) To remove a sound")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_27, __HELP_NAME("CO 1) To remove a sound")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidCutCopyPaste kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTSounds27 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_37=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_27, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToSounds27" ITEM "kgobHowtoSequence" ITEM "kidCutCopyPaste" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds27" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_35=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_27, 0x0) BYTE 0x01 0x00 0x03 0x03 0x02 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1D=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_35, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToSounds52 __HELP_SYMBOL( STN "ktpcHowToSounds52" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_35=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_35, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x12 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xAA 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x11 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x15 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x91 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xA9 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x04 // '????????' 0x00 0x00 0x00 0x00 0x15 0x00 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x24 0x00 0x00 0x04 // '???$???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x15 0x00 0x00 0x40 // '???????@' 0x02 0x00 0x00 0x00 0x24 0x00 0x00 0x40 // '????$??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0x00 0x00 0x00 0x00 0x13 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x85 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_35=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_35, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x72 0x65 0x6D // '??To rem' 0x6F 0x76 0x65 0x20 0x61 0x20 0x73 0x6F // 'ove a so' 0x75 0x6E 0x64 0x0D 0x0A 0x31 0x09 0x47 // 'und??1?G' 0x6F 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 // 'o to the' 0x20 0x70 0x6C 0x61 0x63 0x65 0x20 0x69 // ' place i' 0x6E 0x20 0x79 0x6F 0x75 0x72 0x20 0x6D // 'n your m' 0x6F 0x76 0x69 0x65 0x20 0x77 0x68 0x65 // 'ovie whe' 0x72 0x65 0x20 0x74 0x68 0x65 0x20 0x73 // 're the s' 0x6F 0x75 0x6E 0x64 0x20 0x62 0x65 0x67 // 'ound beg' 0x69 0x6E 0x73 0x2E 0x20 0x20 0x59 0x6F // 'ins. Yo' 0x75 0x27 0x6C 0x6C 0x20 0x68 0x65 0x61 // 'u'll hea' 0x72 0x20 0x74 0x68 0x65 0x20 0x73 0x6F // 'r the so' 0x75 0x6E 0x64 0x73 0x20 0x61 0x73 0x20 // 'unds as ' 0x79 0x6F 0x75 0x20 0x6D 0x6F 0x76 0x65 // 'you move' 0x20 0x66 0x72 0x6F 0x6D 0x20 0x66 0x72 // ' from fr' 0x61 0x6D 0x65 0x20 0x74 0x6F 0x20 0x66 // 'ame to f' 0x72 0x61 0x6D 0x65 0x2E 0x0D 0x0A 0x32 // 'rame.??2' 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 0x74 // '?Click t' 0x68 0x65 0x20 0x43 0x75 0x74 0x2C 0x20 // 'he Cut, ' 0x43 0x6F 0x70 0x79 0x2C 0x20 0x26 0x20 // 'Copy, & ' 0x50 0x61 0x73 0x74 0x65 0x20 0x54 0x6F // 'Paste To' 0x6F 0x6C 0x73 0x2E // 'ols.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_28= ktpcHowToSounds28 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_28, __HELP_NAME("CO 2) Click Remove Sound")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_28, __HELP_NAME("CO 2) Click Remove Sound")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidCCPActorNuke kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTSounds28 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_25=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_28, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToSounds28" ITEM "kgobHowtoSequence" ITEM "kidCCPActorNuke" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds28" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_25=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_28, 0x0) BYTE 0x01 0x00 0x03 0x03 0x73 0x00 0x00 0x00 // '????s???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_25=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_25, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x05 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x12 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x12 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_25=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_25, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x52 0x65 0x6D 0x6F 0x76 0x65 0x20 0x53 // 'Remove S' 0x6F 0x75 0x6E 0x64 0x2E // 'ound.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_29= ktpcHowToSounds29 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_29, __HELP_NAME("CO 3) Click the actor")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_29, __HELP_NAME("CO 3) Click the actor")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTSounds29 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_22=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_29, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToSounds29" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds29" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_22=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_29, 0x0) BYTE 0x01 0x00 0x03 0x03 0x9C 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_22=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_22, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x4C 0x00 0x00 0x01 // '????L???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_22=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_22, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x6F // 'the acto' 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 0x2C // 'r, prop,' 0x20 0x33 0x44 0x20 0x77 0x6F 0x72 0x64 // ' 3D word' 0x20 0x6F 0x72 0x20 0x62 0x61 0x63 0x6B // ' or back' 0x67 0x72 0x6F 0x75 0x6E 0x64 0x20 0x77 // 'ground w' 0x68 0x6F 0x73 0x65 0x20 0x73 0x6F 0x75 // 'hose sou' 0x6E 0x64 0x20 0x79 0x6F 0x75 0x20 0x77 // 'nd you w' 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 0x72 // 'ant to r' 0x65 0x6D 0x6F 0x76 0x65 0x2E // 'emove.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2A= ktpcHowToSounds2A #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2A, __HELP_NAME("Remove Sound--What Next?")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2A, __HELP_NAME("Remove Sound--What Next?")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTSounds2A ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_36=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2A, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToSounds2A" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds2A" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_36=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2A, 0x0) BYTE 0x01 0x00 0x03 0x03 0xBC 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_15=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_36, 0x0) AG(4) FREE ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToSounds2E __HELP_SYMBOL( STN "ktpcHowToSounds2E" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_36=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_36, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0E 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1C 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x1E 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x32 0x00 0x00 0x01 // '????2???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x1C 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x20 0x00 0x00 0x03 // '???? ???' 0x0F 0x00 0x00 0xFD 0x32 0x00 0x00 0x03 // '???2???' 0x00 0x00 0x00 0x00 0x1E 0x00 0x00 0x40 // '???????@' 0x03 0x00 0x00 0x00 0x32 0x00 0x00 0x40 // '????2??@' 0x00 0x00 0x00 0x00 0x1E 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x1E 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x1E 0x00 0x00 0xC0 // '???????' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_36=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_36, 0x0) BYTE 0x03 0x03 0x52 0x65 0x6D 0x6F 0x76 0x69 // '??Removi' 0x6E 0x67 0x20 0x61 0x20 0x73 0x6F 0x75 // 'ng a sou' 0x6E 0x64 0x2D 0x2D 0x57 0x68 0x61 0x74 // 'nd--What' 0x20 0x6E 0x65 0x78 0x74 0x3F 0x0D 0x0A // ' next???' 0x01 0x20 0x50 0x6C 0x61 0x79 0x69 0x6E // '? Playin' 0x67 0x20 0x79 0x6F 0x75 0x72 0x20 0x6D // 'g your m' 0x6F 0x76 0x69 0x65 // 'ovie' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2C= ktpcHowToSounds2C #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2C, __HELP_NAME("CO 1a) Click Loop")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2C, __HELP_NAME("CO 1a) Click Loop")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence kidSoundsLooping kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTSounds2C ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2C, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcHowToSounds2C" ITEM "kgobHowtoSequence" ITEM "kidSoundsLooping" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds2C" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x3F 0x00 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1C=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2B, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0B 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x06 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x05 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0B 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x04 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2B, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x4C 0x6F 0x6F 0x70 0x2E // 'Loop.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2D= ktpcHowToSounds2D #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2D, __HELP_NAME("CO 1a) Click Action Matcher")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2D, __HELP_NAME("CO 1a) Click Action Matcher")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence kidSoundsAttachToCell kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTSounds2D ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2D, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcHowToSounds2D" ITEM "kgobHowtoSequence" ITEM "kidSoundsAttachToCell" ITEM "kidPlayHelpSounds" ITEM "kwavHTSounds2D" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x9A 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_6=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2A, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0D 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x19 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x06 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x05 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x09 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x19 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x04 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2A, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x41 0x63 0x74 0x69 // 'the Acti' 0x6F 0x6E 0x20 0x4D 0x61 0x74 0x63 0x68 // 'on Match' 0x65 0x72 0x2E // 'er.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2E= ktpcHowToSounds2E #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2E, __HELP_NAME("Tip: Play Movie")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2E, __HELP_NAME("Tip: Play Movie")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTSounds2E ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2E, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToSounds2E" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTSounds2E" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x58 0x01 0x00 0x00 // '????X???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_10=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1E, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpFrameSlider __HELP_SYMBOL( STN "mbmpFrameSlider" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSceneSlider __HELP_SYMBOL( STN "mbmpSceneSlider" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpPlay __HELP_SYMBOL( STN "mbmpPlay" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_1E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x13 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xE9 0x00 0x00 0x01 // '???????' 0x01 0xF1 0x00 0x00 0x01 0x01 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0x7A 0x01 0x00 0x01 // '????z???' 0x00 0x00 0x00 0x00 0x7A 0x01 0x00 0x02 // '????z???' 0x00 0x00 0x00 0x00 0x03 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x15 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x2B 0x00 0x00 0x03 // '???+???' 0x0F 0x00 0x00 0xFD 0xE7 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x2B 0x00 0x00 0x80 // '????+??' 0x00 0x00 0x02 0x00 0x80 0x00 0x00 0x80 // '??????' 0x00 0x00 0x03 0x00 0xE9 0x00 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0x04 0x01 0x00 0x80 // '???????' 0x00 0x00 0x03 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x04 0x01 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0x80 0x00 0x00 0xC0 // '??????' 0x02 0x00 0x00 0x00 0x83 0x00 0x00 0xC0 // '??????' 0x03 0x00 0x00 0x00 0x01 0x01 0x00 0xC0 // '???????' 0x04 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1E, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x50 0x6C 0x61 // '??? Pla' 0x79 0x69 0x6E 0x67 0x20 0x79 0x6F 0x75 // 'ying you' 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 0x0D // 'r movie?' 0x0A 0x54 0x6F 0x20 0x70 0x6C 0x61 0x79 // '?To play' 0x20 0x79 0x6F 0x75 0x72 0x20 0x6D 0x6F // ' your mo' 0x76 0x69 0x65 0x0D 0x0A 0x31 0x09 0x55 // 'vie??1?U' 0x73 0x65 0x20 0x74 0x68 0x65 0x20 0x46 // 'se the F' 0x72 0x61 0x6D 0x65 0x20 0x61 0x6E 0x64 // 'rame and' 0x20 0x53 0x63 0x65 0x6E 0x65 0x20 0x53 // ' Scene S' 0x6C 0x69 0x64 0x65 0x72 0x73 0x20 0x74 // 'liders t' 0x6F 0x20 0x72 0x65 0x77 0x69 0x6E 0x64 // 'o rewind' 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F 0x76 // ' the mov' 0x69 0x65 0x20 0x74 0x6F 0x20 0x74 0x68 // 'ie to th' 0x65 0x20 0x70 0x61 0x72 0x74 0x20 0x79 // 'e part y' 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 // 'ou want ' 0x74 0x6F 0x20 0x70 0x6C 0x61 0x79 0x2E // 'to play.' 0x0D 0x0A 0x01 0x0D 0x0A 0x01 0x0D 0x0A // '????????' 0x54 0x6F 0x20 0x6D 0x6F 0x76 0x65 0x20 // 'To move ' 0x77 0x69 0x74 0x68 0x69 0x6E 0x20 0x61 // 'within a' 0x20 0x73 0x63 0x65 0x6E 0x65 0x2C 0x20 // ' scene, ' 0x75 0x73 0x65 0x20 0x74 0x68 0x65 0x20 // 'use the ' 0x46 0x72 0x61 0x6D 0x65 0x20 0x53 0x6C // 'Frame Sl' 0x69 0x64 0x65 0x72 0x2E 0x0D 0x0A 0x54 // 'ider.??T' 0x6F 0x20 0x6D 0x6F 0x76 0x65 0x20 0x66 // 'o move f' 0x72 0x6F 0x6D 0x20 0x73 0x63 0x65 0x6E // 'rom scen' 0x65 0x20 0x74 0x6F 0x20 0x73 0x63 0x65 // 'e to sce' 0x6E 0x65 0x2C 0x20 0x75 0x73 0x65 0x20 // 'ne, use ' 0x74 0x68 0x65 0x20 0x53 0x63 0x65 0x6E // 'the Scen' 0x65 0x20 0x53 0x6C 0x69 0x64 0x65 0x72 // 'e Slider' 0x2E 0x0D 0x0A 0x32 0x09 0x43 0x6C 0x69 // '.??2?Cli' 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 0x50 // 'ck the P' 0x6C 0x61 0x79 0x20 0x62 0x75 0x74 0x74 // 'lay butt' 0x6F 0x6E 0x2D 0x01 0x0D 0x0A 0x4E 0x6F // 'on-???No' 0x74 0x65 0x3A 0x20 0x20 0x49 0x66 0x20 // 'te: If ' 0x79 0x6F 0x75 0x27 0x72 0x65 0x20 0x61 // 'you're a' 0x74 0x20 0x74 0x68 0x65 0x20 0x6C 0x61 // 't the la' 0x73 0x74 0x20 0x66 0x72 0x61 0x6D 0x65 // 'st frame' 0x20 0x6F 0x66 0x20 0x74 0x68 0x65 0x20 // ' of the ' 0x6D 0x6F 0x76 0x69 0x65 0x20 0x77 0x68 // 'movie wh' 0x65 0x6E 0x20 0x79 0x6F 0x75 0x20 0x63 // 'en you c' 0x6C 0x69 0x63 0x6B 0x20 0x50 0x6C 0x61 // 'lick Pla' 0x79 0x2C 0x20 0x74 0x68 0x65 0x20 0x6D // 'y, the m' 0x6F 0x76 0x69 0x65 0x20 0x61 0x75 0x74 // 'ovie aut' 0x6F 0x6D 0x61 0x74 0x69 0x63 0x61 0x6C // 'omatical' 0x6C 0x79 0x20 0x72 0x65 0x77 0x69 0x6E // 'ly rewin' 0x64 0x73 0x20 0x74 0x6F 0x20 0x74 0x68 // 'ds to th' 0x65 0x20 0x62 0x65 0x67 0x69 0x6E 0x6E // 'e beginn' 0x69 0x6E 0x67 0x2E // 'ing.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_44= ktpcHowToSounds44 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_44, __HELP_NAME("Tip: Undo")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_44, __HELP_NAME("Tip: Undo")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTSounds44 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_44, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToSounds44" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTSounds44" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_44, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1F, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpUndo __HELP_SYMBOL( STN "mbmpUndo" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpRedo __HELP_SYMBOL( STN "mbmpRedo" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_1F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x12 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0C 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x0E 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2C 0x00 0x00 0x01 // '????,???' 0x00 0x00 0x00 0x00 0x2E 0x00 0x00 0x01 // '????.???' 0x01 0xF1 0x00 0x00 0x3B 0x00 0x00 0x01 // '???;???' 0x01 0x00 0x00 0x00 0x56 0x00 0x00 0x01 // '????V???' 0x01 0xF6 0x00 0x00 0x63 0x00 0x00 0x01 // '???c???' 0x01 0x00 0x00 0x00 0x64 0x00 0x00 0x01 // '????d???' 0x00 0x00 0x00 0x00 0x0E 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x2C 0x00 0x00 0x03 // '???,???' 0x00 0x00 0x00 0x00 0x3E 0x00 0x00 0x03 // '????>???' 0x0A 0x00 0x00 0xFD 0x54 0x00 0x00 0x03 // '???T???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x56 0x00 0x00 0x82 // '????V??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0x3B 0x00 0x00 0xC0 // '????;??' 0x02 0x00 0x00 0x00 0x63 0x00 0x00 0xC0 // '????c??' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1F, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x55 0x6E 0x64 // '??? Und' 0x6F 0x2F 0x52 0x65 0x64 0x6F 0x0D 0x0A // 'o/Redo??' 0x54 0x6F 0x20 0x75 0x6E 0x64 0x6F 0x20 // 'To undo ' 0x74 0x68 0x65 0x20 0x6C 0x61 0x73 0x74 // 'the last' 0x20 0x74 0x68 0x69 0x6E 0x67 0x20 0x79 // ' thing y' 0x6F 0x75 0x20 0x64 0x69 0x64 0x0D 0x0A // 'ou did??' 0x95 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 // '?Click ' 0x55 0x6E 0x64 0x6F 0x2D 0x01 0x0D 0x0A // 'Undo-???' 0x54 0x6F 0x20 0x72 0x65 0x64 0x6F 0x20 // 'To redo ' 0x77 0x68 0x61 0x74 0x20 0x79 0x6F 0x75 // 'what you' 0x20 0x75 0x6E 0x64 0x69 0x64 0x0D 0x0A // ' undid??' 0x95 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 // '?Click ' 0x52 0x65 0x64 0x6F 0x2D 0x01 // 'Redo-?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_51= ktpcHowToSounds51 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_51, __HELP_NAME("Def: Drag")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_51, __HELP_NAME("Def: Drag")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTSounds51 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_31=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_51, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToSounds51" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTSounds51" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_31=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_51, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_31=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_31, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x04 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xD0 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x79 0x00 0x00 0x03 // '????y???' 0x0A 0x00 0x00 0xFD 0x88 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x79 0x00 0x00 0x80 // '????y??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x79 0x00 0x00 0x82 // '????y??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_31=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_31, 0x0) BYTE 0x03 0x03 0x44 0x72 0x61 0x67 0x0D 0x0A // '??Drag??' 0x31 0x09 0x48 0x6F 0x6C 0x64 0x20 0x64 // '1?Hold d' 0x6F 0x77 0x6E 0x20 0x74 0x68 0x65 0x20 // 'own the ' 0x6D 0x6F 0x75 0x73 0x65 0x20 0x62 0x75 // 'mouse bu' 0x74 0x74 0x6F 0x6E 0x20 0x61 0x73 0x20 // 'tton as ' 0x79 0x6F 0x75 0x20 0x6D 0x6F 0x76 0x65 // 'you move' 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 // ' the mou' 0x73 0x65 0x2E 0x0D 0x0A 0x32 0x09 0x57 // 'se.??2?W' 0x68 0x65 0x6E 0x20 0x79 0x6F 0x75 0x27 // 'hen you'' 0x76 0x65 0x20 0x66 0x69 0x6E 0x69 0x73 // 've finis' 0x68 0x65 0x64 0x20 0x64 0x72 0x61 0x67 // 'hed drag' 0x67 0x69 0x6E 0x67 0x2C 0x20 0x6C 0x65 // 'ging, le' 0x74 0x20 0x67 0x6F 0x20 0x6F 0x66 0x20 // 't go of ' 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 0x73 // 'the mous' 0x65 0x20 0x62 0x75 0x74 0x74 0x6F 0x6E // 'e button' 0x2E 0x0D 0x0A 0x54 0x69 0x70 0x20 0x66 // '.??Tip f' 0x72 0x6F 0x6D 0x20 0x4D 0x63 0x5A 0x65 // 'rom McZe' 0x65 0x3A 0x20 0x20 0x59 0x6F 0x75 0x27 // 'e: You'' 0x6C 0x6C 0x20 0x67 0x65 0x74 0x20 0x74 // 'll get t' 0x68 0x65 0x20 0x62 0x65 0x73 0x74 0x20 // 'he best ' 0x72 0x65 0x73 0x75 0x6C 0x74 0x73 0x20 // 'results ' 0x69 0x66 0x20 0x79 0x6F 0x75 0x20 0x6D // 'if you m' 0x6F 0x76 0x65 0x20 0x74 0x68 0x65 0x20 // 'ove the ' 0x6D 0x6F 0x75 0x73 0x65 0x20 0x73 0x6C // 'mouse sl' 0x6F 0x77 0x6C 0x79 0x20 0x61 0x73 0x20 // 'owly as ' 0x79 0x6F 0x75 0x20 0x64 0x72 0x61 0x67 // 'you drag' 0x2E 0x20 // '. ' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_52= ktpcHowToSounds52 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_52, __HELP_NAME("Def: Go to the place")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_52, __HELP_NAME("Def: Go to the place")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTSounds52 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_52, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToSounds52" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTSounds52" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_52, 0x0) BYTE 0x01 0x00 0x03 0x03 0x41 0x01 0x00 0x00 // '????A???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_23=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1D, 0x0) AG(4) ITEM LONG 0x2000002 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpFrameSlider __HELP_SYMBOL( STN "mbmpFrameSlider" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSceneSlider __HELP_SYMBOL( STN "mbmpSceneSlider" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_1D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x13 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0F 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x4D 0x01 0x00 0x01 // '????M???' 0x00 0x00 0x00 0x00 0x5C 0x00 0x00 0x02 // '????\???' 0x01 0x00 0x00 0x00 0x62 0x00 0x00 0x02 // '????b???' 0x00 0x00 0x00 0x00 0xF2 0x00 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0xF8 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x3D 0x00 0x00 0x03 // '???=???' 0x00 0x00 0x00 0x00 0xB9 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xD4 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x59 0x00 0x00 0x80 // '????Y??' 0x00 0x00 0x03 0x00 0xB9 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0xEF 0x00 0x00 0x80 // '??????' 0x00 0x00 0x03 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xF2 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x59 0x00 0x00 0xC0 // '????Y??' 0x02 0x00 0x00 0x00 0xEF 0x00 0x00 0xC0 // '??????' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1D, 0x0) BYTE 0x03 0x03 0x47 0x6F 0x20 0x74 0x6F 0x20 // '??Go to ' 0x74 0x68 0x65 0x20 0x70 0x6C 0x61 0x63 // 'the plac' 0x65 0x0D 0x0A 0x54 0x6F 0x20 0x6D 0x6F // 'e??To mo' 0x76 0x65 0x20 0x66 0x6F 0x72 0x77 0x61 // 've forwa' 0x72 0x64 0x73 0x20 0x6F 0x72 0x20 0x62 // 'rds or b' 0x61 0x63 0x6B 0x77 0x61 0x72 0x64 0x73 // 'ackwards' 0x20 0x77 0x69 0x74 0x68 0x69 0x6E 0x20 // ' within ' 0x61 0x20 0x73 0x63 0x65 0x6E 0x65 0x0D // 'a scene?' 0x0A 0x95 0x09 0x55 0x73 0x65 0x20 0x74 // '??Use t' 0x68 0x65 0x20 0x46 0x72 0x61 0x6D 0x65 // 'he Frame' 0x20 0x53 0x6C 0x69 0x64 0x65 0x72 0x2E // ' Slider.' 0x20 0x0D 0x0A 0x01 0x0D 0x0A 0x43 0x6C // ' ?????Cl' 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 // 'ick the ' 0x46 0x69 0x72 0x73 0x74 0x2C 0x20 0x50 // 'First, P' 0x72 0x65 0x76 0x69 0x6F 0x75 0x73 0x2C // 'revious,' 0x20 0x4E 0x65 0x78 0x74 0x2C 0x20 0x6F // ' Next, o' 0x72 0x20 0x4C 0x61 0x73 0x74 0x20 0x41 // 'r Last A' 0x72 0x72 0x6F 0x77 0x20 0x6F 0x72 0x20 // 'rrow or ' 0x64 0x72 0x61 0x67 0x20 0x74 0x68 0x65 // 'drag the' 0x20 0x73 0x6C 0x69 0x64 0x65 0x72 0x20 // ' slider ' 0x69 0x6E 0x20 0x74 0x68 0x65 0x20 0x6D // 'in the m' 0x69 0x64 0x64 0x6C 0x65 0x20 0x6F 0x66 // 'iddle of' 0x20 0x74 0x68 0x65 0x20 0x62 0x61 0x72 // ' the bar' 0x2E 0x0D 0x0A 0x54 0x6F 0x20 0x6D 0x6F // '.??To mo' 0x76 0x65 0x20 0x66 0x72 0x6F 0x6D 0x20 // 've from ' 0x73 0x63 0x65 0x6E 0x65 0x20 0x74 0x6F // 'scene to' 0x20 0x73 0x63 0x65 0x6E 0x65 0x0D 0x0A // ' scene??' 0x95 0x09 0x55 0x73 0x65 0x20 0x74 0x68 // '?Use th' 0x65 0x20 0x53 0x63 0x65 0x6E 0x65 0x20 // 'e Scene ' 0x53 0x6C 0x69 0x64 0x65 0x72 0x2E 0x0D // 'Slider.?' 0x0A 0x01 0x0D 0x0A 0x43 0x6C 0x69 0x63 // '????Clic' 0x6B 0x20 0x74 0x68 0x65 0x20 0x46 0x69 // 'k the Fi' 0x72 0x73 0x74 0x2C 0x20 0x50 0x72 0x65 // 'rst, Pre' 0x76 0x69 0x6F 0x75 0x73 0x2C 0x20 0x4E // 'vious, N' 0x65 0x78 0x74 0x2C 0x20 0x6F 0x72 0x20 // 'ext, or ' 0x4C 0x61 0x73 0x74 0x20 0x41 0x72 0x72 // 'Last Arr' 0x6F 0x77 0x20 0x6F 0x72 0x20 0x64 0x72 // 'ow or dr' 0x61 0x67 0x20 0x74 0x68 0x65 0x20 0x73 // 'ag the s' 0x6C 0x69 0x64 0x65 0x72 0x20 0x69 0x6E // 'lider in' 0x20 0x74 0x68 0x65 0x20 0x6D 0x69 0x64 // ' the mid' 0x64 0x6C 0x65 0x20 0x6F 0x66 0x20 0x74 // 'dle of t' 0x68 0x65 0x20 0x62 0x61 0x72 0x2E // 'he bar.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_60= ktpcHowToSounds60 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_60, __HELP_NAME("Tip: Play continuously")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_60, __HELP_NAME("Tip: Play continuously")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTSounds60 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_60, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToSounds60" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTSounds60" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_60, 0x0) BYTE 0x01 0x00 0x03 0x03 0x3F 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_25=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2D, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSoundsLooping __HELP_SYMBOL( STN "mbmpSoundsLooping" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_2D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0F 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1F 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x21 0x00 0x00 0x01 // '????!???' 0x01 0x00 0x00 0x00 0x3D 0x00 0x00 0x01 // '????=???' 0x00 0x00 0x00 0x00 0x3F 0x00 0x00 0x01 // '????????' 0x01 0xF6 0x00 0x00 0x6C 0x00 0x00 0x01 // '???l???' 0x01 0x00 0x00 0x00 0xBF 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x21 0x00 0x00 0x03 // '????!???' 0x0A 0x00 0x00 0xFD 0x3D 0x00 0x00 0x03 // '???=???' 0x00 0x00 0x00 0x00 0x21 0x00 0x00 0x80 // '????!??' 0x00 0x00 0x00 0x00 0x3F 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x6F 0x00 0x00 0x82 // '????o??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0x6C 0x00 0x00 0xC0 // '????l??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2D, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x50 0x6C 0x61 // '??? Pla' 0x79 0x69 0x6E 0x67 0x20 0x61 0x20 0x73 // 'ying a s' 0x6F 0x75 0x6E 0x64 0x20 0x63 0x6F 0x6E // 'ound con' 0x74 0x69 0x6E 0x75 0x6F 0x75 0x73 0x6C // 'tinuousl' 0x79 0x0D 0x0A 0x54 0x6F 0x20 0x70 0x6C // 'y??To pl' 0x61 0x79 0x20 0x61 0x20 0x73 0x6F 0x75 // 'ay a sou' 0x6E 0x64 0x20 0x63 0x6F 0x6E 0x74 0x69 // 'nd conti' 0x6E 0x75 0x6F 0x75 0x73 0x6C 0x79 0x0D // 'nuously?' 0x0A 0x31 0x09 0x43 0x68 0x6F 0x6F 0x73 // '?1?Choos' 0x65 0x20 0x74 0x68 0x65 0x20 0x73 0x6F // 'e the so' 0x75 0x6E 0x64 0x20 0x79 0x6F 0x75 0x20 // 'und you ' 0x77 0x61 0x6E 0x74 0x2C 0x20 0x74 0x68 // 'want, th' 0x65 0x6E 0x20 0x63 0x6C 0x69 0x63 0x6B // 'en click' 0x20 0x4C 0x6F 0x6F 0x70 0x2D 0x01 0x0D // ' Loop-??' 0x0A 0x32 0x09 0x43 0x6C 0x69 0x63 0x6B // '?2?Click' 0x20 0x74 0x68 0x65 0x20 0x61 0x63 0x74 // ' the act' 0x6F 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 // 'or, prop' 0x2C 0x20 0x33 0x44 0x20 0x77 0x6F 0x72 // ', 3D wor' 0x64 0x2C 0x20 0x6F 0x72 0x20 0x62 0x61 // 'd, or ba' 0x63 0x6B 0x67 0x72 0x6F 0x75 0x6E 0x64 // 'ckground' 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E // ' you wan' 0x74 0x20 0x74 0x6F 0x20 0x61 0x74 0x74 // 't to att' 0x61 0x63 0x68 0x20 0x74 0x68 0x65 0x20 // 'ach the ' 0x73 0x6F 0x75 0x6E 0x64 0x20 0x74 0x6F // 'sound to' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_61= ktpcHowToSounds61 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_61, __HELP_NAME("Tip: Attach action")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_61, __HELP_NAME("Tip: Attach action")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTSounds61 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_18=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_61, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToSounds61" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTSounds61" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_18=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_61, 0x0) BYTE 0x01 0x00 0x03 0x03 0x20 0x01 0x00 0x00 // '???? ???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1F=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_18, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSoundsAttachToCell __HELP_SYMBOL( STN "mbmpSoundsAttachToCell" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_18=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_18, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x11 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x21 0x00 0x00 0x01 // '????!???' 0x00 0x00 0x00 0x00 0x23 0x00 0x00 0x01 // '????#???' 0x01 0x00 0x00 0x00 0x53 0x00 0x00 0x01 // '????S???' 0x00 0x00 0x00 0x00 0x55 0x00 0x00 0x01 // '????U???' 0x01 0x00 0x00 0x00 0xCF 0x00 0x00 0x01 // '???????' 0x01 0xF1 0x00 0x00 0xE4 0x00 0x00 0x01 // '??????' 0x01 0xF6 0x00 0x00 0xFF 0x00 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0x46 0x01 0x00 0x01 // '????F???' 0x00 0x00 0x00 0x00 0x23 0x00 0x00 0x03 // '????#???' 0x0A 0x00 0x00 0xFD 0x53 0x00 0x00 0x03 // '???S???' 0x00 0x00 0x00 0x00 0x23 0x00 0x00 0x80 // '????#??' 0x00 0x00 0x00 0x00 0x55 0x00 0x00 0x80 // '????U??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x02 0x01 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0xFF 0x00 0x00 0xC0 // '??????' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_18=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_18, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x41 0x74 0x74 // '??? Att' 0x61 0x63 0x68 0x69 0x6E 0x67 0x20 0x61 // 'aching a' 0x20 0x73 0x6F 0x75 0x6E 0x64 0x20 0x74 // ' sound t' 0x6F 0x20 0x61 0x6E 0x20 0x61 0x63 0x74 // 'o an act' 0x69 0x6F 0x6E 0x0D 0x0A 0x54 0x6F 0x20 // 'ion??To ' 0x61 0x74 0x74 0x61 0x63 0x68 0x20 0x61 // 'attach a' 0x20 0x73 0x6F 0x75 0x6E 0x64 0x20 0x74 // ' sound t' 0x6F 0x20 0x74 0x68 0x65 0x20 0x63 0x75 // 'o the cu' 0x72 0x72 0x65 0x6E 0x74 0x20 0x61 0x63 // 'rrent ac' 0x74 0x69 0x6F 0x6E 0x20 0x70 0x6F 0x73 // 'tion pos' 0x69 0x74 0x69 0x6F 0x6E 0x0D 0x0A 0x31 // 'ition??1' 0x09 0x47 0x6F 0x20 0x74 0x6F 0x20 0x74 // '?Go to t' 0x68 0x65 0x20 0x70 0x6C 0x61 0x63 0x65 // 'he place' 0x20 0x69 0x6E 0x20 0x79 0x6F 0x75 0x72 // ' in your' 0x20 0x6D 0x6F 0x76 0x69 0x65 0x20 0x77 // ' movie w' 0x68 0x65 0x72 0x65 0x20 0x79 0x6F 0x75 // 'here you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F // ' want to' 0x20 0x61 0x74 0x74 0x61 0x63 0x68 0x20 // ' attach ' 0x74 0x68 0x65 0x20 0x73 0x6F 0x75 0x6E // 'the soun' 0x64 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 // 'd to the' 0x20 0x61 0x63 0x74 0x69 0x6F 0x6E 0x20 // ' action ' 0x70 0x6F 0x73 0x69 0x74 0x69 0x6F 0x6E // 'position' 0x2E 0x0D 0x0A 0x32 0x09 0x43 0x68 0x6F // '.??2?Cho' 0x6F 0x73 0x65 0x20 0x74 0x68 0x65 0x20 // 'ose the ' 0x73 0x6F 0x75 0x6E 0x64 0x20 0x79 0x6F // 'sound yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x2E 0x0D // 'u want.?' 0x0A 0x33 0x09 0x43 0x6C 0x69 0x63 0x6B // '?3?Click' 0x20 0x4D 0x6F 0x72 0x65 0x20 0x54 0x6F // ' More To' 0x6F 0x6C 0x73 0x2E 0x0D 0x0A 0x34 0x09 // 'ols.??4?' 0x43 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 // 'Click th' 0x65 0x20 0x41 0x63 0x74 0x69 0x6F 0x6E // 'e Action' 0x20 0x4D 0x61 0x74 0x63 0x68 0x65 0x72 // ' Matcher' 0x2D 0x01 0x0D 0x0A 0x35 0x09 0x43 0x6C // '-???5?Cl' 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 // 'ick the ' 0x61 0x63 0x74 0x6F 0x72 0x2C 0x20 0x70 // 'actor, p' 0x72 0x6F 0x70 0x2C 0x20 0x6F 0x72 0x20 // 'rop, or ' 0x33 0x44 0x20 0x77 0x6F 0x72 0x64 0x20 // '3D word ' 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 // 'you want' 0x20 0x74 0x6F 0x20 0x61 0x74 0x74 0x61 // ' to atta' 0x63 0x68 0x20 0x74 0x68 0x65 0x20 0x73 // 'ch the s' 0x6F 0x75 0x6E 0x64 0x20 0x74 0x6F 0x2E // 'ound to.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_62= ktpcHowToSounds62 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_62, __HELP_NAME("Tip: Remove Sound")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_62, __HELP_NAME("Tip: Remove Sound")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTSounds62 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_13=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_62, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToSounds62" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTSounds62" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_13=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_62, 0x0) BYTE 0x01 0x00 0x03 0x03 0x04 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_24=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_13, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpCutCopyPaste __HELP_SYMBOL( STN "mbmpCutCopyPaste" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpNukeSound __HELP_SYMBOL( STN "mbmpNukeSound" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_13=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_13, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x12 0x00 0x00 0x00 0x02 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x13 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x15 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x28 0x00 0x00 0x01 // '????(???' 0x01 0xF6 0x00 0x00 0x4D 0x00 0x00 0x01 // '???M???' 0x01 0x00 0x00 0x00 0x4E 0x00 0x00 0x01 // '????N???' 0x01 0xF1 0x00 0x00 0x50 0x00 0x00 0x01 // '???P???' 0x01 0xF6 0x00 0x00 0x65 0x00 0x00 0x01 // '???e???' 0x01 0x00 0x00 0x00 0xAD 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xF3 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x15 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x28 0x00 0x00 0x03 // '???(???' 0x00 0x00 0x00 0x00 0x50 0x00 0x00 0x80 // '????P??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xAD 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x03 0x00 0x00 0x00 0x4D 0x00 0x00 0xC0 // '????M??' 0x01 0x00 0x00 0x00 0x65 0x00 0x00 0xC0 // '????e??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_13=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_13, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x52 0x65 0x6D // '??? Rem' 0x6F 0x76 0x69 0x6E 0x67 0x20 0x61 0x20 // 'oving a ' 0x73 0x6F 0x75 0x6E 0x64 0x0D 0x0A 0x54 // 'sound??T' 0x6F 0x20 0x72 0x65 0x6D 0x6F 0x76 0x65 // 'o remove' 0x20 0x61 0x20 0x73 0x6F 0x75 0x6E 0x64 // ' a sound' 0x0D 0x0A 0x31 0x09 0x43 0x6C 0x69 0x63 // '??1?Clic' 0x6B 0x20 0x74 0x68 0x65 0x20 0x43 0x75 // 'k the Cu' 0x74 0x2C 0x20 0x43 0x6F 0x70 0x79 0x2C // 't, Copy,' 0x20 0x26 0x20 0x50 0x61 0x73 0x74 0x65 // ' & Paste' 0x20 0x54 0x6F 0x6F 0x6C 0x73 0x2D 0x01 // ' Tools-?' 0x0D 0x0A 0x32 0x09 0x43 0x6C 0x69 0x63 // '??2?Clic' 0x6B 0x20 0x52 0x65 0x6D 0x6F 0x76 0x65 // 'k Remove' 0x20 0x53 0x6F 0x75 0x6E 0x64 0x2D 0x01 // ' Sound-?' 0x0D 0x0A 0x33 0x09 0x43 0x6C 0x69 0x63 // '??3?Clic' 0x6B 0x20 0x74 0x68 0x65 0x20 0x33 0x44 // 'k the 3D' 0x20 0x6F 0x62 0x6A 0x65 0x63 0x74 0x20 // ' object ' 0x6F 0x72 0x20 0x62 0x61 0x63 0x6B 0x67 // 'or backg' 0x72 0x6F 0x75 0x6E 0x64 0x20 0x77 0x68 // 'round wh' 0x6F 0x73 0x65 0x20 0x73 0x6F 0x75 0x6E // 'ose soun' 0x64 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 // 'd you wa' 0x6E 0x74 0x20 0x74 0x6F 0x20 0x72 0x65 // 'nt to re' 0x6D 0x6F 0x76 0x65 0x2E 0x0D 0x0A 0x34 // 'move.??4' 0x09 0x48 0x6F 0x6C 0x64 0x20 0x64 0x6F // '?Hold do' 0x77 0x6E 0x20 0x74 0x68 0x65 0x20 0x6D // 'wn the m' 0x6F 0x75 0x73 0x65 0x20 0x62 0x75 0x74 // 'ouse but' 0x74 0x6F 0x6E 0x20 0x61 0x6E 0x64 0x20 // 'ton and ' 0x64 0x72 0x61 0x67 0x20 0x74 0x68 0x65 // 'drag the' 0x20 0x76 0x6F 0x6C 0x75 0x6D 0x65 0x20 // ' volume ' 0x73 0x6C 0x69 0x64 0x65 0x72 0x20 0x74 // 'slider t' 0x6F 0x20 0x74 0x68 0x65 0x20 0x62 0x6F // 'o the bo' 0x74 0x74 0x6F 0x6D 0x2E // 'ttom.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_63= ktpcHowToSounds63 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_63, __HELP_NAME("Tip: Pause Sound")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_63, __HELP_NAME("Tip: Pause Sound")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTSounds63 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_27=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_63, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToSounds63" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTSounds63" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_27=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_63, 0x0) BYTE 0x01 0x00 0x03 0x03 0x38 0x01 0x00 0x00 // '????8???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_19=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_27, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpPausesSound __HELP_SYMBOL( STN "mbmpPausesSound" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_27=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_27, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x11 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x33 0x00 0x00 0x01 // '????3???' 0x00 0x00 0x00 0x00 0x35 0x00 0x00 0x01 // '????5???' 0x01 0x00 0x00 0x00 0x66 0x00 0x00 0x01 // '????f???' 0x00 0x00 0x00 0x00 0x68 0x00 0x00 0x01 // '????h???' 0x01 0x00 0x00 0x00 0xC1 0x00 0x00 0x01 // '???????' 0x01 0xF6 0x00 0x00 0xDF 0x00 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0xE0 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x35 0x00 0x00 0x03 // '????5???' 0x0A 0x00 0x00 0xFD 0x66 0x00 0x00 0x03 // '???f???' 0x00 0x00 0x00 0x00 0x68 0x00 0x00 0x03 // '????h???' 0x0F 0x00 0x00 0xFD 0xE0 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x68 0x00 0x00 0x80 // '????h??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xC1 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0xDF 0x00 0x00 0xC0 // '??????' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_27=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_27, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x50 0x61 0x75 // '??? Pau' 0x73 0x69 0x6E 0x67 0x20 0x74 0x68 0x65 // 'sing the' 0x20 0x6D 0x6F 0x76 0x69 0x65 0x20 0x75 // ' movie u' 0x6E 0x74 0x69 0x6C 0x20 0x61 0x6E 0x20 // 'ntil an ' 0x61 0x63 0x74 0x6F 0x72 0x20 0x69 0x73 // 'actor is' 0x20 0x64 0x6F 0x6E 0x65 0x20 0x74 0x61 // ' done ta' 0x6C 0x6B 0x69 0x6E 0x67 0x0D 0x0A 0x54 // 'lking??T' 0x6F 0x20 0x70 0x61 0x75 0x73 0x65 0x20 // 'o pause ' 0x74 0x68 0x65 0x20 0x6D 0x6F 0x76 0x69 // 'the movi' 0x65 0x20 0x75 0x6E 0x74 0x69 0x6C 0x20 // 'e until ' 0x61 0x6E 0x20 0x61 0x63 0x74 0x6F 0x72 // 'an actor' 0x20 0x69 0x73 0x20 0x64 0x6F 0x6E 0x65 // ' is done' 0x20 0x74 0x61 0x6C 0x6B 0x69 0x6E 0x67 // ' talking' 0x0D 0x0A 0x31 0x09 0x47 0x6F 0x20 0x74 // '??1?Go t' 0x6F 0x20 0x74 0x68 0x65 0x20 0x70 0x6C // 'o the pl' 0x61 0x63 0x65 0x20 0x69 0x6E 0x20 0x79 // 'ace in y' 0x6F 0x75 0x72 0x20 0x6D 0x6F 0x76 0x69 // 'our movi' 0x65 0x20 0x77 0x68 0x65 0x72 0x65 0x20 // 'e where ' 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 // 'you want' 0x20 0x74 0x6F 0x20 0x70 0x61 0x75 0x73 // ' to paus' 0x65 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F // 'e the mo' 0x76 0x69 0x65 0x2E 0x0D 0x0A 0x32 0x09 // 'vie.??2?' 0x43 0x6C 0x69 0x63 0x6B 0x20 0x4D 0x6F // 'Click Mo' 0x72 0x65 0x20 0x54 0x6F 0x6F 0x6C 0x73 // 're Tools' 0x2E 0x0D 0x0A 0x32 0x09 0x43 0x6C 0x69 // '.??2?Cli' 0x63 0x6B 0x20 0x57 0x61 0x69 0x74 0x20 // 'ck Wait ' 0x66 0x6F 0x72 0x20 0x53 0x6F 0x75 0x6E // 'for Soun' 0x64 0x20 0x74 0x6F 0x20 0x45 0x6E 0x64 // 'd to End' 0x2D 0x01 // '-?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_69= ktpcHowToSounds69 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_69, __HELP_NAME("Tip: Individual sounds")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_69, __HELP_NAME("Tip: Individual sounds")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTSounds69 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_30=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_69, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToSounds69" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTSounds69" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_30=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_69, 0x0) BYTE 0x01 0x00 0x03 0x03 0x00 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_20=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_30, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSoundsListen __HELP_SYMBOL( STN "mbmpSoundsListen" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_30=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_30, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0E 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2B 0x00 0x00 0x01 // '????+???' 0x00 0x00 0x00 0x00 0x2D 0x00 0x00 0x01 // '????-???' 0x01 0x00 0x00 0x00 0x58 0x00 0x00 0x01 // '????X???' 0x01 0xF6 0x00 0x00 0x6D 0x00 0x00 0x01 // '???m???' 0x01 0x00 0x00 0x00 0xA9 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x2D 0x00 0x00 0x03 // '????-???' 0x0A 0x00 0x00 0xFD 0x58 0x00 0x00 0x03 // '???X???' 0x0F 0x00 0x00 0xFD 0xA9 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x58 0x00 0x00 0x80 // '????X??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x70 0x00 0x00 0x82 // '????p??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0x6D 0x00 0x00 0xC0 // '????m??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_30=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_30, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x43 0x68 0x61 // '??? Cha' 0x6E 0x67 0x69 0x6E 0x67 0x20 0x74 0x68 // 'nging th' 0x65 0x20 0x76 0x6F 0x6C 0x75 0x6D 0x65 // 'e volume' 0x20 0x6F 0x66 0x20 0x69 0x6E 0x64 0x69 // ' of indi' 0x76 0x69 0x64 0x75 0x61 0x6C 0x20 0x73 // 'vidual s' 0x6F 0x75 0x6E 0x64 0x73 0x0D 0x0A 0x54 // 'ounds??T' 0x6F 0x20 0x63 0x68 0x61 0x6E 0x67 0x65 // 'o change' 0x20 0x74 0x68 0x65 0x20 0x76 0x6F 0x6C // ' the vol' 0x75 0x6D 0x65 0x20 0x6F 0x66 0x20 0x69 // 'ume of i' 0x6E 0x64 0x69 0x76 0x69 0x64 0x75 0x61 // 'ndividua' 0x6C 0x20 0x73 0x6F 0x75 0x6E 0x64 0x73 // 'l sounds' 0x0D 0x0A 0x31 0x09 0x43 0x6C 0x69 0x63 // '??1?Clic' 0x6B 0x20 0x74 0x68 0x65 0x20 0x4C 0x69 // 'k the Li' 0x73 0x74 0x65 0x6E 0x65 0x72 0x2D 0x01 // 'stener-?' 0x0D 0x0A 0x32 0x09 0x43 0x6C 0x69 0x63 // '??2?Clic' 0x6B 0x20 0x74 0x68 0x65 0x20 0x6F 0x62 // 'k the ob' 0x6A 0x65 0x63 0x74 0x20 0x77 0x68 0x6F // 'ject who' 0x73 0x65 0x20 0x73 0x6F 0x75 0x6E 0x64 // 'se sound' 0x20 0x76 0x6F 0x6C 0x75 0x6D 0x65 0x20 // ' volume ' 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 // 'you want' 0x20 0x74 0x6F 0x20 0x63 0x68 0x61 0x6E // ' to chan' 0x67 0x65 0x2E // 'ge.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_73= ktpcHowToSounds73 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_73, __HELP_NAME("Tip: Stop sound")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_73, __HELP_NAME("Tip: Stop sound")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTSounds73 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_28=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_73, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToSounds73" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTSounds73" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_28=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_73, 0x0) BYTE 0x01 0x00 0x03 0x03 0x01 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1A=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_28, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSoundsEfxBrowser __HELP_SYMBOL( STN "mbmpSoundsEfxBrowser" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSoundsMicBrowser __HELP_SYMBOL( STN "mbmpSoundsMicBrowser" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSoundsMusicBrowser __HELP_SYMBOL( STN "mbmpSoundsMusicBrowser" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_28=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_28, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x16 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x13 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x15 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x97 0x00 0x00 0x01 // '???????' 0x01 0xF6 0x00 0x00 0xA5 0x00 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0xA8 0x00 0x00 0x01 // '???????' 0x01 0xF6 0x00 0x00 0xAF 0x00 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0xB2 0x00 0x00 0x01 // '???????' 0x01 0xF6 0x00 0x00 0xB8 0x00 0x00 0x01 // '??????' 0x00 0x00 0x00 0x00 0xBA 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xDD 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x15 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x24 0x00 0x00 0x03 // '???$???' 0x00 0x00 0x00 0x00 0x26 0x00 0x00 0x80 // '????&??' 0x00 0x00 0x02 0x00 0x96 0x00 0x00 0x80 // '??????' 0x00 0x00 0x03 0x00 0xBA 0x00 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xD2 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0x96 0x00 0x00 0xC0 // '??????' 0x02 0x00 0x00 0x00 0xA7 0x00 0x00 0xC0 // '??????' 0x03 0x00 0x00 0x00 0xB1 0x00 0x00 0xC0 // '??????' 0x04 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_28=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_28, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x53 0x74 0x6F // '??? Sto' 0x70 0x70 0x69 0x6E 0x67 0x20 0x61 0x20 // 'pping a ' 0x73 0x6F 0x75 0x6E 0x64 0x0D 0x0A 0x54 // 'sound??T' 0x6F 0x20 0x73 0x74 0x6F 0x70 0x20 0x61 // 'o stop a' 0x20 0x73 0x6F 0x75 0x6E 0x64 0x0D 0x0A // ' sound??' 0x31 0x09 0x47 0x6F 0x20 0x74 0x6F 0x20 // '1?Go to ' 0x74 0x68 0x65 0x20 0x70 0x6C 0x61 0x63 // 'the plac' 0x65 0x20 0x69 0x6E 0x20 0x79 0x6F 0x75 // 'e in you' 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 0x20 // 'r movie ' 0x77 0x68 0x65 0x72 0x65 0x20 0x79 0x6F // 'where yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 // 'u want t' 0x6F 0x20 0x73 0x74 0x6F 0x70 0x20 0x74 // 'o stop t' 0x68 0x65 0x20 0x73 0x6F 0x75 0x6E 0x64 // 'he sound' 0x2E 0x0D 0x0A 0x32 0x09 0x43 0x6C 0x69 // '.??2?Cli' 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 0x6B // 'ck the k' 0x69 0x6E 0x64 0x20 0x6F 0x66 0x20 0x73 // 'ind of s' 0x6F 0x75 0x6E 0x64 0x20 0x79 0x6F 0x75 // 'ound you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F // ' want to' 0x20 0x73 0x74 0x6F 0x70 0x3A 0x0D 0x0A // ' stop:??' 0x01 0x2D 0x53 0x6F 0x75 0x6E 0x64 0x20 // '?-Sound ' 0x45 0x66 0x66 0x65 0x63 0x74 0x73 0x0D // 'Effects?' 0x0A 0x01 0x2D 0x53 0x70 0x65 0x65 0x63 // '??-Speec' 0x68 0x0D 0x0A 0x01 0x2D 0x4D 0x75 0x73 // 'h???-Mus' 0x69 0x63 0x0D 0x0A 0x33 0x09 0x43 0x6C // 'ic??3?Cl' 0x69 0x63 0x6B 0x20 0x53 0x6F 0x75 0x6E // 'ick Soun' 0x64 0x20 0x53 0x74 0x6F 0x70 0x70 0x65 // 'd Stoppe' 0x72 0x2E 0x0D 0x0A 0x34 0x09 0x43 0x6C // 'r.??4?Cl' 0x69 0x63 0x6B 0x20 0x4F 0x4B 0x2E // 'ick OK.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_74= ktpcHowToSounds74 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_74, __HELP_NAME("Def: Choose sound")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_74, __HELP_NAME("Def: Choose sound")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTSounds74 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_33=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_74, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToSounds74" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTSounds74" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_33=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_74, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_33, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSoundsEfxBrowser __HELP_SYMBOL( STN "mbmpSoundsEfxBrowser" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSoundsMicBrowser __HELP_SYMBOL( STN "mbmpSoundsMicBrowser" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSoundsMusicBrowser __HELP_SYMBOL( STN "mbmpSoundsMusicBrowser" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_33=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_33, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x13 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x23 0x00 0x00 0x01 // '????#???' 0x00 0x00 0x00 0x00 0x25 0x00 0x00 0x01 // '????%???' 0x01 0xF6 0x00 0x00 0x43 0x00 0x00 0x01 // '???C???' 0x01 0x00 0x00 0x00 0x46 0x00 0x00 0x01 // '????F???' 0x01 0xF6 0x00 0x00 0x5F 0x00 0x00 0x01 // '???_???' 0x01 0x00 0x00 0x00 0x62 0x00 0x00 0x01 // '????b???' 0x01 0xF6 0x00 0x00 0x78 0x00 0x00 0x01 // '???x???' 0x01 0x00 0x00 0x00 0x79 0x00 0x00 0x01 // '????y???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x10 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x23 0x00 0x00 0x03 // '???#???' 0x00 0x00 0x00 0x00 0x25 0x00 0x00 0x80 // '????%??' 0x00 0x00 0x02 0x00 0x7B 0x00 0x00 0x80 // '????{??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x62 0x00 0x00 0x82 // '????b??' 0x00 0x00 0x00 0x00 0x43 0x00 0x00 0xC0 // '????C??' 0x01 0x00 0x00 0x00 0x5F 0x00 0x00 0xC0 // '????_??' 0x02 0x00 0x00 0x00 0x78 0x00 0x00 0xC0 // '????x??' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_33=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_33, 0x0) BYTE 0x03 0x03 0x43 0x68 0x6F 0x6F 0x73 0x65 // '??Choose' 0x20 0x74 0x68 0x65 0x20 0x73 0x6F 0x75 // ' the sou' 0x6E 0x64 0x0D 0x0A 0x54 0x6F 0x20 0x63 // 'nd??To c' 0x68 0x6F 0x6F 0x73 0x65 0x20 0x61 0x20 // 'hoose a ' 0x73 0x6F 0x75 0x6E 0x64 0x0D 0x0A 0x95 // 'sound??' 0x09 0x54 0x6F 0x20 0x61 0x64 0x64 0x20 // '?To add ' 0x73 0x6F 0x75 0x6E 0x64 0x20 0x65 0x66 // 'sound ef' 0x66 0x65 0x63 0x74 0x73 0x2C 0x20 0x63 // 'fects, c' 0x6C 0x69 0x63 0x6B 0x20 0x01 0x0D 0x0A // 'lick ???' 0x95 0x09 0x54 0x6F 0x20 0x61 0x64 0x64 // '?To add' 0x20 0x64 0x69 0x61 0x6C 0x6F 0x67 0x75 // ' dialogu' 0x65 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B // 'e, click' 0x20 0x01 0x0D 0x0A 0x95 0x09 0x54 0x6F // ' ????To' 0x20 0x61 0x64 0x64 0x20 0x6D 0x75 0x73 // ' add mus' 0x69 0x63 0x2C 0x20 0x63 0x6C 0x69 0x63 // 'ic, clic' 0x6B 0x20 0x01 0x0D 0x0A // 'k ???' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_76= ktpcHowToSounds76 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_76, __HELP_NAME("Tip: How many sounds")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_76, __HELP_NAME("Tip: How many sounds")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTSounds76 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_76, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToSounds76" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTSounds76" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_76, 0x0) BYTE 0x01 0x00 0x03 0x03 0x1D 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1E=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2E, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_2E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x01 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xD4 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x32 0x00 0x00 0x80 // '????2??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x7C 0x00 0x00 0x82 // '????|??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2E, 0x0) BYTE 0x03 0x03 0x01 0x20 0x48 0x6F 0x77 0x20 // '??? How ' 0x6D 0x61 0x6E 0x79 0x20 0x73 0x6F 0x75 // 'many sou' 0x6E 0x64 0x73 0x20 0x63 0x61 0x6E 0x20 // 'nds can ' 0x49 0x20 0x61 0x74 0x74 0x61 0x63 0x68 // 'I attach' 0x3F 0x0D 0x0A 0x59 0x6F 0x75 0x20 0x63 // '???You c' 0x61 0x6E 0x20 0x61 0x74 0x74 0x61 0x63 // 'an attac' 0x68 0x3A 0x0D 0x0A 0x95 0x09 0x54 0x77 // 'h:???Tw' 0x6F 0x20 0x73 0x6F 0x75 0x6E 0x64 0x73 // 'o sounds' 0x20 0x74 0x6F 0x20 0x61 0x20 0x62 0x61 // ' to a ba' 0x63 0x6B 0x67 0x72 0x6F 0x75 0x6E 0x64 // 'ckground' 0x20 0x28 0x6F 0x6E 0x65 0x20 0x73 0x6F // ' (one so' 0x75 0x6E 0x64 0x20 0x65 0x66 0x66 0x65 // 'und effe' 0x63 0x74 0x20 0x61 0x6E 0x64 0x20 0x6F // 'ct and o' 0x6E 0x65 0x20 0x6D 0x75 0x73 0x69 0x63 // 'ne music' 0x20 0x73 0x65 0x6C 0x65 0x63 0x74 0x69 // ' selecti' 0x6F 0x6E 0x29 0x2E 0x0D 0x0A 0x95 0x09 // 'on).???' 0x54 0x77 0x6F 0x20 0x73 0x6F 0x75 0x6E // 'Two soun' 0x64 0x73 0x20 0x74 0x6F 0x20 0x61 0x6E // 'ds to an' 0x20 0x61 0x63 0x74 0x6F 0x72 0x2C 0x20 // ' actor, ' 0x70 0x72 0x6F 0x70 0x2C 0x20 0x6F 0x72 // 'prop, or' 0x20 0x33 0x44 0x20 0x77 0x6F 0x72 0x64 // ' 3D word' 0x20 0x20 0x28 0x6F 0x6E 0x65 0x20 0x73 // ' (one s' 0x6F 0x75 0x6E 0x64 0x20 0x65 0x66 0x66 // 'ound eff' 0x65 0x63 0x74 0x20 0x61 0x6E 0x64 0x20 // 'ect and ' 0x6F 0x6E 0x65 0x20 0x73 0x70 0x65 0x65 // 'one spee' 0x63 0x68 0x20 0x72 0x65 0x63 0x6F 0x72 // 'ch recor' 0x64 0x69 0x6E 0x67 0x29 0x2E // 'ding).' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_77= ktpcHowToSounds77 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_77, __HELP_NAME("Tip: Chaining sounds")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_77, __HELP_NAME("Tip: Chaining sounds")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTSounds77 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_32=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_77, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToSounds77" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTSounds77" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_32=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_77, 0x0) BYTE 0x01 0x00 0x03 0x03 0x00 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_22=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_32, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_32=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_32, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0B 0x00 0x00 0x00 0x02 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1B 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x1D 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x61 0x01 0x00 0x01 // '????a???' 0x00 0x00 0x00 0x00 0x1D 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x5D 0x00 0x00 0x03 // '???]???' 0x00 0x00 0x00 0x00 0x5D 0x00 0x00 0x80 // '????]??' 0x00 0x00 0x02 0x00 0xBE 0x00 0x00 0x80 // '??????' 0x00 0x00 0x03 0x00 0x1D 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xBE 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_32=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_32, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x43 0x68 0x61 // '??? Cha' 0x69 0x6E 0x69 0x6E 0x67 0x20 0x73 0x6F // 'ining so' 0x75 0x6E 0x64 0x73 0x20 0x74 0x6F 0x67 // 'unds tog' 0x65 0x74 0x68 0x65 0x72 0x0D 0x0A 0x54 // 'ether??T' 0x6F 0x20 0x63 0x68 0x61 0x69 0x6E 0x20 // 'o chain ' 0x73 0x6F 0x75 0x6E 0x64 0x73 0x20 0x74 // 'sounds t' 0x6F 0x67 0x65 0x74 0x68 0x65 0x72 0x20 // 'ogether ' 0x73 0x6F 0x20 0x74 0x68 0x61 0x74 0x20 // 'so that ' 0x74 0x68 0x65 0x79 0x20 0x70 0x6C 0x61 // 'they pla' 0x79 0x20 0x6F 0x6E 0x65 0x20 0x61 0x66 // 'y one af' 0x74 0x65 0x72 0x20 0x74 0x68 0x65 0x20 // 'ter the ' 0x6F 0x74 0x68 0x65 0x72 0x0D 0x0A 0x31 // 'other??1' 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 0x50 // '?Click P' 0x6C 0x61 0x79 0x20 0x4F 0x6E 0x63 0x65 // 'lay Once' 0x2E 0x0D 0x0A 0x32 0x09 0x48 0x6F 0x6C // '.??2?Hol' 0x64 0x20 0x64 0x6F 0x77 0x6E 0x20 0x43 // 'd down C' 0x74 0x72 0x6C 0x20 0x77 0x68 0x65 0x6E // 'trl when' 0x20 0x79 0x6F 0x75 0x20 0x63 0x6C 0x69 // ' you cli' 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 0x6F // 'ck the o' 0x62 0x6A 0x65 0x63 0x74 0x20 0x79 0x6F // 'bject yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 // 'u want t' 0x6F 0x20 0x61 0x74 0x74 0x61 0x63 0x68 // 'o attach' 0x20 0x74 0x68 0x65 0x20 0x73 0x6F 0x75 // ' the sou' 0x6E 0x64 0x20 0x74 0x6F 0x2E 0x0D 0x0A // 'nd to.??' 0x54 0x68 0x65 0x20 0x73 0x6F 0x75 0x6E // 'The soun' 0x64 0x20 0x69 0x73 0x20 0x63 0x68 0x61 // 'd is cha' 0x69 0x6E 0x65 0x64 0x20 0x74 0x6F 0x20 // 'ined to ' 0x74 0x68 0x65 0x20 0x73 0x6F 0x75 0x6E // 'the soun' 0x64 0x20 0x74 0x68 0x61 0x74 0x20 0x79 // 'd that y' 0x6F 0x75 0x20 0x70 0x72 0x65 0x76 0x69 // 'ou previ' 0x6F 0x75 0x73 0x6C 0x79 0x20 0x61 0x74 // 'ously at' 0x74 0x61 0x63 0x68 0x65 0x64 0x20 0x74 // 'tached t' 0x6F 0x20 0x74 0x68 0x65 0x20 0x6F 0x62 // 'o the ob' 0x6A 0x65 0x63 0x74 0x2E 0x20 0x20 0x54 // 'ject. T' 0x68 0x65 0x20 0x6E 0x65 0x77 0x20 0x73 // 'he new s' 0x6F 0x75 0x6E 0x64 0x20 0x70 0x6C 0x61 // 'ound pla' 0x79 0x73 0x20 0x61 0x74 0x20 0x74 0x68 // 'ys at th' 0x65 0x20 0x65 0x6E 0x64 0x20 0x6F 0x66 // 'e end of' 0x20 0x74 0x68 0x65 0x20 0x63 0x68 0x61 // ' the cha' 0x69 0x6E 0x2D 0x2D 0x79 0x6F 0x75 0x20 // 'in--you ' 0x63 0x61 0x6E 0x27 0x74 0x20 0x69 0x6E // 'can't in' 0x73 0x65 0x72 0x74 0x20 0x61 0x20 0x73 // 'sert a s' 0x6F 0x75 0x6E 0x64 0x20 0x69 0x6E 0x20 // 'ound in ' 0x74 0x68 0x65 0x20 0x6D 0x69 0x64 0x64 // 'the midd' 0x6C 0x65 0x2E // 'le.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK ================================================ FILE: src/help/htwords.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ #undef __HELP_NAME #undef __HELP_SYMBOL #undef __HELP_PACK #undef __HELP_PACK2 #ifdef NO_HELP_NAMES #define __HELP_NAME(name) "" #else #define __HELP_NAME(name) name #endif #ifdef NO_HELP_SYMBOLS #define __HELP_SYMBOL(stuff) #else #define __HELP_SYMBOL(stuff) stuff #endif #ifdef PACK_HELP #define __HELP_PACK PACK #else #define __HELP_PACK #endif #ifdef HELP_SINGLE_CHUNK #define __HELP_PACK2 #else #define __HELP_PACK2 __HELP_PACK #endif SET _help_48544F50_0= ktpcHowToWords00 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("CO--Click Words")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("CO--Click Words")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon3 kgobHowtoSequence kidTextsCover kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTWords00 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) GST(0) ITEM "kgobCalloutBalloon3" ITEM "ktpcHowToWords00" ITEM "kgobHowtoSequence" ITEM "kidTextsCover" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords00" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0x4E 0x00 0x00 0x00 // '????N???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0C 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0B 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x57 0x6F 0x72 0x64 0x73 0x2E // 'Words.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1= ktpcHowToWords01 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("CO 1) To add words")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("CO 1) To add words")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon3 kgobHowtoSequence kidTextsCreate kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTWords01 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) GST(0) ITEM "kgobCalloutBalloon3" ITEM "ktpcHowToWords01" ITEM "kgobHowtoSequence" ITEM "kidTextsCreate" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords01" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0xF0 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_9=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2A, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords52 __HELP_SYMBOL( STN "ktpcHowToWords52" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_2A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x11 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x92 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x3D 0x00 0x00 0x03 // '???=???' 0x00 0x00 0x00 0x00 0x3F 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x7D 0x00 0x00 0x03 // '???}???' 0x00 0x00 0x00 0x00 0x89 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x91 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x41 0x00 0x00 0x04 // '????A???' 0x0D 0x00 0x00 0xFE 0x50 0x00 0x00 0x04 // '???P???' 0x00 0x00 0x00 0x00 0x41 0x00 0x00 0x40 // '????A??@' 0x03 0x00 0x00 0x00 0x50 0x00 0x00 0x40 // '????P??@' 0x00 0x00 0x00 0x00 0x3F 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x7D 0x00 0x00 0x82 // '????}??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2A, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x63 0x72 0x65 // '??To cre' 0x61 0x74 0x65 0x20 0x61 0x20 0x77 0x6F // 'ate a wo' 0x72 0x64 0x20 0x62 0x6F 0x78 0x20 0x77 // 'rd box w' 0x68 0x65 0x72 0x65 0x20 0x79 0x6F 0x75 // 'here you' 0x20 0x63 0x61 0x6E 0x20 0x74 0x79 0x70 // ' can typ' 0x65 0x20 0x79 0x6F 0x75 0x72 0x20 0x73 // 'e your s' 0x74 0x6F 0x72 0x79 0x20 0x6F 0x72 0x20 // 'tory or ' 0x63 0x72 0x65 0x64 0x69 0x74 0x73 0x0D // 'credits?' 0x0A 0x31 0x09 0x47 0x6F 0x20 0x74 0x6F // '?1?Go to' 0x20 0x74 0x68 0x65 0x20 0x70 0x6C 0x61 // ' the pla' 0x63 0x65 0x20 0x69 0x6E 0x20 0x79 0x6F // 'ce in yo' 0x75 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 // 'ur movie' 0x20 0x77 0x68 0x65 0x72 0x65 0x20 0x79 // ' where y' 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 // 'ou want ' 0x74 0x6F 0x20 0x61 0x64 0x64 0x20 0x77 // 'to add w' 0x6F 0x72 0x64 0x73 0x2E 0x0D 0x0A 0x32 // 'ords.??2' 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 0x74 // '?Click t' 0x68 0x65 0x20 0x57 0x6F 0x72 0x64 0x20 // 'he Word ' 0x42 0x6F 0x78 0x2E // 'Box.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2= ktpcHowToWords02 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2, __HELP_NAME("CO 2) Click Story or Credits")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2, __HELP_NAME("CO 2) Click Story or Credits")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x0 0x57415645 kwavHTWords02 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToWords02" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords02" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2, 0x0) BYTE 0x01 0x00 0x03 0x03 0xF2 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_17=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3E, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords67 __HELP_SYMBOL( STN "ktpcHowToWords67" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_3E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0F 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x7C 0x00 0x00 0x01 // '????|???' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0C 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x0F 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x16 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x3E 0x00 0x00 0x03 // '????>???' 0x0F 0x00 0x00 0xFD 0x44 0x00 0x00 0x03 // '???D???' 0x00 0x00 0x00 0x00 0x3E 0x00 0x00 0x04 // '????>???' 0x0D 0x00 0x00 0xFE 0x44 0x00 0x00 0x04 // '???D???' 0x00 0x00 0x00 0x00 0x3E 0x00 0x00 0x40 // '????>??@' 0x02 0x00 0x00 0x00 0x44 0x00 0x00 0x40 // '????D??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x34 0x00 0x00 0x82 // '????4??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3E, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x53 0x74 0x6F 0x72 0x79 0x20 0x6F 0x72 // 'Story or' 0x20 0x43 0x72 0x65 0x64 0x69 0x74 0x73 // ' Credits' 0x2E 0x0D 0x0A 0x95 0x09 0x53 0x74 0x6F // '.???Sto' 0x72 0x79 0x20 0x77 0x6F 0x72 0x64 0x73 // 'ry words' 0x20 0x64 0x6F 0x6E 0x27 0x74 0x20 0x6D // ' don't m' 0x6F 0x76 0x65 0x2E 0x0D 0x0A 0x95 0x09 // 'ove.???' 0x43 0x72 0x65 0x64 0x69 0x74 0x73 0x20 // 'Credits ' 0x73 0x63 0x72 0x6F 0x6C 0x6C 0x20 0x74 // 'scroll t' 0x6F 0x77 0x61 0x72 0x64 0x73 0x20 0x74 // 'owards t' 0x68 0x65 0x20 0x74 0x6F 0x70 0x20 0x6F // 'he top o' 0x66 0x20 0x74 0x68 0x65 0x20 0x73 0x63 // 'f the sc' 0x72 0x65 0x65 0x6E 0x20 0x77 0x68 0x65 // 'reen whe' 0x6E 0x20 0x79 0x6F 0x75 0x20 0x70 0x6C // 'n you pl' 0x61 0x79 0x20 0x79 0x6F 0x75 0x72 0x20 // 'ay your ' 0x6D 0x6F 0x76 0x69 0x65 0x2E // 'movie.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3= ktpcHowToWords03 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3, __HELP_NAME("CO 3) Type the words you ")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3, __HELP_NAME("CO 3) Type the words you ")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTWords03 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_34=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToWords03" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords03" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_34=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_34=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_34, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'GOKD' 0x16102 0xFFFFFFFF __HELP_SYMBOL( STN ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords4B __HELP_SYMBOL( STN "ktpcHowToWords4B" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_34=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_34, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x5A 0x00 0x00 0x01 // '????Z???' 0x00 0x00 0x00 0x00 0x43 0x00 0x00 0x40 // '????C??@' 0x02 0x00 0x00 0x00 0x5A 0x00 0x00 0x40 // '????Z??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x43 0x00 0x00 0x82 // '????C??' 0x00 0x00 0x00 0x00 0x43 0x00 0x00 0xC0 // '????C??' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_34=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_34, 0x0) BYTE 0x03 0x03 0x54 0x79 0x70 0x65 0x20 0x74 // '??Type t' 0x68 0x65 0x20 0x77 0x6F 0x72 0x64 0x73 // 'he words' 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E // ' you wan' 0x74 0x2E 0x20 0x20 0x49 0x66 0x20 0x79 // 't. If y' 0x6F 0x75 0x20 0x6D 0x61 0x6B 0x65 0x20 // 'ou make ' 0x61 0x20 0x6D 0x69 0x73 0x74 0x61 0x6B // 'a mistak' 0x65 0x2C 0x20 0x70 0x72 0x65 0x73 0x73 // 'e, press' 0x20 0x42 0x61 0x63 0x6B 0x73 0x70 0x61 // ' Backspa' 0x63 0x65 0x2E 0x0D 0x0A 0x01 0x09 0x4D // 'ce.????M' 0x61 0x6B 0x69 0x6E 0x67 0x20 0x63 0x72 // 'aking cr' 0x65 0x64 0x69 0x74 0x73 0x20 0x73 0x63 // 'edits sc' 0x72 0x6F 0x6C 0x6C // 'roll' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_4= ktpcHowToWords04 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4, __HELP_NAME("Words--What Next?")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4, __HELP_NAME("Words--What Next?")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTWords04 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_52=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToWords04" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords04" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_52=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4, 0x0) BYTE 0x01 0x00 0x03 0x03 0xCD 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_35=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_52, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktpcHowToWords66 __HELP_SYMBOL( STN "ktpcHowToWords66" ) FREE ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToWords43 __HELP_SYMBOL( STN "ktpcHowToWords43" ) ITEM LONG 0xC0000004 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktpcHowToWords45 __HELP_SYMBOL( STN "ktpcHowToWords45" ) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords44 __HELP_SYMBOL( STN "ktpcHowToWords44" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_52=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_52, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x15 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1F 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x21 0x00 0x00 0x01 // '????!???' 0x01 0x00 0x00 0x00 0x6D 0x00 0x00 0x01 // '????m???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x1F 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x21 0x00 0x00 0x40 // '????!??@' 0x07 0x00 0x00 0x00 0x26 0x00 0x00 0x40 // '????&??@' 0x00 0x00 0x00 0x00 0x28 0x00 0x00 0x40 // '????(??@' 0x03 0x00 0x00 0x00 0x43 0x00 0x00 0x40 // '????C??@' 0x00 0x00 0x00 0x00 0x45 0x00 0x00 0x40 // '????E??@' 0x05 0x00 0x00 0x00 0x57 0x00 0x00 0x40 // '????W??@' 0x00 0x00 0x00 0x00 0x59 0x00 0x00 0x40 // '????Y??@' 0x01 0x00 0x00 0x00 0x6D 0x00 0x00 0x40 // '????m??@' 0x00 0x00 0x00 0x00 0x21 0x00 0x00 0x80 // '????!??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x21 0x00 0x00 0x82 // '????!??' 0x00 0x00 0x00 0x00 0x21 0x00 0x00 0xC0 // '????!??' 0x04 0x00 0x00 0x00 0x28 0x00 0x00 0xC0 // '????(??' 0x04 0x00 0x00 0x00 0x45 0x00 0x00 0xC0 // '????E??' 0x04 0x00 0x00 0x00 0x59 0x00 0x00 0xC0 // '????Y??' 0x04 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_52=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_52, 0x0) BYTE 0x03 0x03 0x43 0x72 0x65 0x61 0x74 0x69 // '??Creati' 0x6E 0x67 0x20 0x61 0x20 0x77 0x6F 0x72 // 'ng a wor' 0x64 0x20 0x62 0x6F 0x78 0x2D 0x2D 0x57 // 'd box--W' 0x68 0x61 0x74 0x20 0x6E 0x65 0x78 0x74 // 'hat next' 0x3F 0x0D 0x0A 0x01 0x55 0x6E 0x64 0x6F // '????Undo' 0x0D 0x0A 0x01 0x43 0x68 0x61 0x6E 0x67 // '???Chang' 0x69 0x6E 0x67 0x20 0x74 0x68 0x65 0x20 // 'ing the ' 0x77 0x6F 0x72 0x64 0x20 0x62 0x6F 0x78 // 'word box' 0x20 0x73 0x69 0x7A 0x65 0x0D 0x0A 0x01 // ' size???' 0x4D 0x6F 0x76 0x69 0x6E 0x67 0x20 0x61 // 'Moving a' 0x20 0x77 0x6F 0x72 0x64 0x20 0x62 0x6F // ' word bo' 0x78 0x0D 0x0A 0x01 0x52 0x65 0x6D 0x6F // 'x???Remo' 0x76 0x69 0x6E 0x67 0x20 0x61 0x20 0x77 // 'ving a w' 0x6F 0x72 0x64 0x20 0x62 0x6F 0x78 // 'ord box' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_5= ktpcHowToWords05 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5, __HELP_NAME("CO 1) To change the way")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5, __HELP_NAME("CO 1) To change the way")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence kidTextsFont kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTWords05 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_6=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcHowToWords05" ITEM "kgobHowtoSequence" ITEM "kidTextsFont" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords05" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_6=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5, 0x0) BYTE 0x01 0x00 0x03 0x03 0xF3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_4=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords52 __HELP_SYMBOL( STN "ktpcHowToWords52" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_6=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x12 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x77 0x00 0x00 0x01 // '????w???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x23 0x00 0x00 0x03 // '???#???' 0x00 0x00 0x00 0x00 0x25 0x00 0x00 0x03 // '????%???' 0x0F 0x00 0x00 0xFD 0x67 0x00 0x00 0x03 // '???g???' 0x00 0x00 0x00 0x00 0x6F 0x00 0x00 0x03 // '????o???' 0x0A 0x00 0x00 0xFD 0x76 0x00 0x00 0x03 // '???v???' 0x00 0x00 0x00 0x00 0x77 0x00 0x00 0x03 // '????w???' 0x00 0x00 0x00 0x00 0x27 0x00 0x00 0x04 // '????'???' 0x0D 0x00 0x00 0xFE 0x36 0x00 0x00 0x04 // '???6???' 0x00 0x00 0x00 0x00 0x27 0x00 0x00 0x40 // '????'??@' 0x03 0x00 0x00 0x00 0x36 0x00 0x00 0x40 // '????6??@' 0x00 0x00 0x00 0x00 0x25 0x00 0x00 0x80 // '????%??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x67 0x00 0x00 0x82 // '????g??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_6=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x63 0x68 0x61 // '??To cha' 0x6E 0x67 0x65 0x20 0x74 0x68 0x65 0x20 // 'nge the ' 0x77 0x61 0x79 0x20 0x79 0x6F 0x75 0x72 // 'way your' 0x20 0x6C 0x65 0x74 0x74 0x65 0x72 0x73 // ' letters' 0x20 0x6C 0x6F 0x6F 0x6B 0x0D 0x0A 0x31 // ' look??1' 0x09 0x47 0x6F 0x20 0x74 0x6F 0x20 0x74 // '?Go to t' 0x68 0x65 0x20 0x70 0x6C 0x61 0x63 0x65 // 'he place' 0x20 0x69 0x6E 0x20 0x79 0x6F 0x75 0x72 // ' in your' 0x20 0x6D 0x6F 0x76 0x69 0x65 0x20 0x77 // ' movie w' 0x68 0x65 0x72 0x65 0x20 0x79 0x6F 0x75 // 'here you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F // ' want to' 0x20 0x6D 0x61 0x6B 0x65 0x20 0x61 0x20 // ' make a ' 0x63 0x68 0x61 0x6E 0x67 0x65 0x2E 0x0D // 'change.?' 0x0A 0x32 0x09 0x43 0x6C 0x69 0x63 0x6B // '?2?Click' 0x20 0x4C 0x65 0x74 0x74 0x65 0x72 0x73 // ' Letters' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_6= ktpcHowToWords06 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6, __HELP_NAME("CO 2) Click the letter style")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6, __HELP_NAME("CO 2) Click the letter style")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon8 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x14E 0xD3 0x57415645 kwavHTWords06 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_47=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6, 0x0) GST(0) ITEM "kgobCalloutBalloon8" ITEM "ktpcHowToWords06" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords06" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_47=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB4 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_47=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_47, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x20 0x00 0x00 0x01 // '???? ???' 0x00 0x00 0x00 0x00 0x20 0x00 0x00 0x02 // '???? ???' 0x00 0x00 0x00 0x00 0x20 0x00 0x00 0x04 // '???? ???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_47=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_47, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x6C 0x65 0x74 0x74 // 'the lett' 0x65 0x72 0x20 0x73 0x74 0x79 0x6C 0x65 // 'er style' 0x20 0x79 0x6F 0x75 0x20 0x6C 0x69 0x6B // ' you lik' 0x65 0x2E // 'e.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_7= ktpcHowToWords07 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7, __HELP_NAME("CO 3) Drag the mouse over")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7, __HELP_NAME("CO 3) Drag the mouse over")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTWords07 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_7=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToWords07" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords07" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_7=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD5 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_18=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords50 __HELP_SYMBOL( STN "ktpcHowToWords50" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_7=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x42 0x00 0x00 0x01 // '????B???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x42 0x00 0x00 0x03 // '???B???' 0x00 0x00 0x00 0x00 0x0F 0x00 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x13 0x00 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x42 0x00 0x00 0x04 // '????B???' 0x00 0x00 0x00 0x00 0x0F 0x00 0x00 0x40 // '???????@' 0x01 0x00 0x00 0x00 0x13 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x42 0x00 0x00 0x40 // '????B??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_7=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) BYTE 0x03 0x03 0x49 0x6E 0x20 0x61 0x20 0x77 // '??In a w' 0x6F 0x72 0x64 0x20 0x62 0x6F 0x78 0x2C // 'ord box,' 0x20 0x64 0x72 0x61 0x67 0x20 0x74 0x68 // ' drag th' 0x65 0x20 0x6D 0x6F 0x75 0x73 0x65 0x20 // 'e mouse ' 0x6F 0x76 0x65 0x72 0x20 0x74 0x68 0x65 // 'over the' 0x20 0x6C 0x65 0x74 0x74 0x65 0x72 0x73 // ' letters' 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E // ' you wan' 0x74 0x20 0x74 0x6F 0x20 0x63 0x68 0x61 // 't to cha' 0x6E 0x67 0x65 0x2E // 'nge.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_8= ktpcHowToWords08 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8, __HELP_NAME("Letters--What Next?")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8, __HELP_NAME("Letters--What Next?")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTWords08 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_49=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToWords08" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords08" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_49=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8, 0x0) BYTE 0x01 0x00 0x03 0x03 0x11 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1E=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_49, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToWords4A __HELP_SYMBOL( STN "ktpcHowToWords4A" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktpcHowToWords47 __HELP_SYMBOL( STN "ktpcHowToWords47" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktpcHowToWords48 __HELP_SYMBOL( STN "ktpcHowToWords48" ) ITEM LONG 0xC0000004 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords44 __HELP_SYMBOL( STN "ktpcHowToWords44" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_49=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_49, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x15 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x29 0x00 0x00 0x01 // '????)???' 0x00 0x00 0x00 0x00 0x2B 0x00 0x00 0x01 // '????+???' 0x01 0x00 0x00 0x00 0x72 0x00 0x00 0x01 // '????r???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x29 0x00 0x00 0x03 // '???)???' 0x00 0x00 0x00 0x00 0x72 0x00 0x00 0x04 // '????r???' 0x00 0x00 0x00 0x00 0x2B 0x00 0x00 0x40 // '????+??@' 0x06 0x00 0x00 0x00 0x31 0x00 0x00 0x40 // '????1??@' 0x00 0x00 0x00 0x00 0x33 0x00 0x00 0x40 // '????3??@' 0x02 0x00 0x00 0x00 0x47 0x00 0x00 0x40 // '????G??@' 0x00 0x00 0x00 0x00 0x49 0x00 0x00 0x40 // '????I??@' 0x03 0x00 0x00 0x00 0x5C 0x00 0x00 0x40 // '????\??@' 0x00 0x00 0x00 0x00 0x5E 0x00 0x00 0x40 // '????^??@' 0x04 0x00 0x00 0x00 0x72 0x00 0x00 0x40 // '????r??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x2B 0x00 0x00 0x82 // '????+??' 0x00 0x00 0x00 0x00 0x2B 0x00 0x00 0xC0 // '????+??' 0x05 0x00 0x00 0x00 0x33 0x00 0x00 0xC0 // '????3??' 0x05 0x00 0x00 0x00 0x49 0x00 0x00 0xC0 // '????I??' 0x05 0x00 0x00 0x00 0x5E 0x00 0x00 0xC0 // '????^??' 0x05 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_49=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_49, 0x0) BYTE 0x03 0x03 0x43 0x68 0x61 0x6E 0x67 0x69 // '??Changi' 0x6E 0x67 0x20 0x74 0x68 0x65 0x20 0x77 // 'ng the w' 0x61 0x79 0x20 0x6C 0x65 0x74 0x74 0x65 // 'ay lette' 0x72 0x73 0x20 0x6C 0x6F 0x6F 0x6B 0x2D // 'rs look-' 0x2D 0x57 0x68 0x61 0x74 0x20 0x6E 0x65 // '-What ne' 0x78 0x74 0x3F 0x0D 0x0A 0x01 0x20 0x55 // 'xt???? U' 0x6E 0x64 0x6F 0x0D 0x0A 0x01 0x20 0x43 // 'ndo??? C' 0x68 0x61 0x6E 0x67 0x69 0x6E 0x67 0x20 // 'hanging ' 0x74 0x68 0x65 0x20 0x63 0x6F 0x6C 0x6F // 'the colo' 0x72 0x0D 0x0A 0x01 0x20 0x43 0x68 0x61 // 'r??? Cha' 0x6E 0x67 0x69 0x6E 0x67 0x20 0x74 0x68 // 'nging th' 0x65 0x20 0x73 0x69 0x7A 0x65 0x0D 0x0A // 'e size??' 0x01 0x20 0x43 0x68 0x61 0x6E 0x67 0x69 // '? Changi' 0x6E 0x67 0x20 0x74 0x68 0x65 0x20 0x73 // 'ng the s' 0x74 0x79 0x6C 0x65 // 'tyle' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_9= ktpcHowToWords09 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_9, __HELP_NAME("CO 1) To change style")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_9, __HELP_NAME("CO 1) To change style")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence kidTextsFontShape kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTWords09 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_9, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcHowToWords09" ITEM "kgobHowtoSequence" ITEM "kidTextsFontShape" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords09" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_9, 0x0) BYTE 0x01 0x00 0x03 0x03 0xDE 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_12=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1F, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords52 __HELP_SYMBOL( STN "ktpcHowToWords52" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_1F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x14 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x29 0x00 0x00 0x01 // '????)???' 0x03 0x00 0x00 0x00 0x2F 0x00 0x00 0x01 // '????/???' 0x05 0x00 0x00 0x00 0x31 0x00 0x00 0x01 // '????1???' 0x01 0x00 0x00 0x00 0x82 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x82 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x2F 0x00 0x00 0x03 // '???/???' 0x0F 0x00 0x00 0xFD 0x7B 0x00 0x00 0x03 // '???{???' 0x0A 0x00 0x00 0xFD 0x81 0x00 0x00 0x03 // '??????' 0x0F 0x00 0x00 0xFD 0x82 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x33 0x00 0x00 0x04 // '????3???' 0x0D 0x00 0x00 0xFE 0x42 0x00 0x00 0x04 // '???B???' 0x00 0x00 0x00 0x00 0x82 0x00 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x33 0x00 0x00 0x40 // '????3??@' 0x02 0x00 0x00 0x00 0x42 0x00 0x00 0x40 // '????B??@' 0x00 0x00 0x00 0x00 0x82 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x31 0x00 0x00 0x80 // '????1??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x73 0x00 0x00 0x82 // '????s??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1F, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x63 0x68 0x61 // '??To cha' 0x6E 0x67 0x65 0x20 0x74 0x68 0x65 0x20 // 'nge the ' 0x73 0x74 0x79 0x6C 0x65 0x2C 0x20 0x66 // 'style, f' 0x6F 0x72 0x20 0x65 0x78 0x61 0x6D 0x70 // 'or examp' 0x6C 0x65 0x20 0x62 0x6F 0x6C 0x64 0x20 // 'le bold ' 0x6F 0x72 0x20 0x69 0x74 0x61 0x6C 0x69 // 'or itali' 0x63 0x0D 0x0A 0x31 0x09 0x47 0x6F 0x20 // 'c??1?Go ' 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 0x70 // 'to the p' 0x6C 0x61 0x63 0x65 0x20 0x69 0x6E 0x20 // 'lace in ' 0x79 0x6F 0x75 0x72 0x20 0x6D 0x6F 0x76 // 'your mov' 0x69 0x65 0x20 0x77 0x68 0x65 0x72 0x65 // 'ie where' 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E // ' you wan' 0x74 0x20 0x74 0x6F 0x20 0x6D 0x61 0x6B // 't to mak' 0x65 0x20 0x61 0x20 0x63 0x68 0x61 0x6E // 'e a chan' 0x67 0x65 0x2E 0x0D 0x0A 0x32 0x09 0x43 // 'ge.??2?C' 0x6C 0x69 0x63 0x6B 0x20 0x53 0x74 0x79 // 'lick Sty' 0x6C 0x65 0x73 0x2E // 'les.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_A= ktpcHowToWords0A #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_A, __HELP_NAME("CO 2) Click the style")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_A, __HELP_NAME("CO 2) Click the style")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon8 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x19C 0x91 0x57415645 kwavHTWords0A ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_9=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_A, 0x0) GST(0) ITEM "kgobCalloutBalloon8" ITEM "ktpcHowToWords0A" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords0A" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_9=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x98 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_9=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_9, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x19 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x19 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x19 0x00 0x00 0x04 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_9=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_9, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x73 0x74 0x79 0x6C // 'the styl' 0x65 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 // 'e you wa' 0x6E 0x74 0x2E // 'nt.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_B= ktpcHowToWords0B #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_B, __HELP_NAME("CO 3) Drag the mouse over 2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_B, __HELP_NAME("CO 3) Drag the mouse over 2")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTWords0B ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_B, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToWords0B" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords0B" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_B, 0x0) BYTE 0x01 0x00 0x03 0x03 0xED 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_13=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords50 __HELP_SYMBOL( STN "ktpcHowToWords50" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x4E 0x00 0x00 0x01 // '????N???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x4E 0x00 0x00 0x03 // '???N???' 0x00 0x00 0x00 0x00 0x0F 0x00 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x13 0x00 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x4E 0x00 0x00 0x04 // '????N???' 0x00 0x00 0x00 0x00 0x0F 0x00 0x00 0x40 // '???????@' 0x02 0x00 0x00 0x00 0x13 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x4E 0x00 0x00 0x40 // '????N??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) BYTE 0x03 0x03 0x49 0x6E 0x20 0x61 0x20 0x77 // '??In a w' 0x6F 0x72 0x64 0x20 0x62 0x6F 0x78 0x2C // 'ord box,' 0x20 0x64 0x72 0x61 0x67 0x20 0x74 0x68 // ' drag th' 0x65 0x20 0x6D 0x6F 0x75 0x73 0x65 0x20 // 'e mouse ' 0x6F 0x76 0x65 0x72 0x20 0x74 0x68 0x65 // 'over the' 0x20 0x6C 0x65 0x74 0x74 0x65 0x72 0x73 // ' letters' 0x20 0x77 0x68 0x6F 0x73 0x65 0x20 0x73 // ' whose s' 0x74 0x79 0x6C 0x65 0x20 0x79 0x6F 0x75 // 'tyle you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F // ' want to' 0x20 0x63 0x68 0x61 0x6E 0x67 0x65 0x2E // ' change.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_C= ktpcHowToWords0C #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_C, __HELP_NAME("Styles--What Next?")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_C, __HELP_NAME("Styles--What Next?")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTWords0C ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_32=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_C, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToWords0C" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords0C" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_32=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_C, 0x0) BYTE 0x01 0x00 0x03 0x03 0xCD 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_7=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_32, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToWords46 __HELP_SYMBOL( STN "ktpcHowToWords46" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktpcHowToWords47 __HELP_SYMBOL( STN "ktpcHowToWords47" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktpcHowToWords49 __HELP_SYMBOL( STN "ktpcHowToWords49" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords44 __HELP_SYMBOL( STN "ktpcHowToWords44" ) ITEM LONG 0xC0000004 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_32=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_32, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x15 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1E 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x20 0x00 0x00 0x01 // '???? ???' 0x01 0x00 0x00 0x00 0x72 0x00 0x00 0x01 // '????r???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x1E 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x72 0x00 0x00 0x04 // '????r???' 0x00 0x00 0x00 0x00 0x20 0x00 0x00 0x40 // '???? ??@' 0x05 0x00 0x00 0x00 0x26 0x00 0x00 0x40 // '????&??@' 0x00 0x00 0x00 0x00 0x28 0x00 0x00 0x40 // '????(??@' 0x02 0x00 0x00 0x00 0x3C 0x00 0x00 0x40 // '??????@' 0x03 0x00 0x00 0x00 0x51 0x00 0x00 0x40 // '????Q??@' 0x00 0x00 0x00 0x00 0x53 0x00 0x00 0x40 // '????S??@' 0x04 0x00 0x00 0x00 0x72 0x00 0x00 0x40 // '????r??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x20 0x00 0x00 0x82 // '???? ??' 0x00 0x00 0x00 0x00 0x20 0x00 0x00 0xC0 // '???? ??' 0x06 0x00 0x00 0x00 0x28 0x00 0x00 0xC0 // '????(??' 0x06 0x00 0x00 0x00 0x3E 0x00 0x00 0xC0 // '????>??' 0x06 0x00 0x00 0x00 0x53 0x00 0x00 0xC0 // '????S??' 0x06 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_32=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_32, 0x0) BYTE 0x03 0x03 0x43 0x68 0x61 0x6E 0x67 0x69 // '??Changi' 0x6E 0x67 0x20 0x74 0x68 0x65 0x20 0x73 // 'ng the s' 0x74 0x79 0x6C 0x65 0x2D 0x2D 0x57 0x68 // 'tyle--Wh' 0x61 0x74 0x20 0x6E 0x65 0x78 0x74 0x3F // 'at next?' 0x0D 0x0A 0x01 0x20 0x55 0x6E 0x64 0x6F // '??? Undo' 0x0D 0x0A 0x01 0x20 0x43 0x68 0x61 0x6E // '??? Chan' 0x67 0x69 0x6E 0x67 0x20 0x74 0x68 0x65 // 'ging the' 0x20 0x63 0x6F 0x6C 0x6F 0x72 0x0D 0x0A // ' color??' 0x01 0x20 0x43 0x68 0x61 0x6E 0x67 0x69 // '? Changi' 0x6E 0x67 0x20 0x74 0x68 0x65 0x20 0x73 // 'ng the s' 0x69 0x7A 0x65 0x0D 0x0A 0x01 0x20 0x43 // 'ize??? C' 0x68 0x61 0x6E 0x67 0x69 0x6E 0x67 0x20 // 'hanging ' 0x74 0x68 0x65 0x20 0x77 0x61 0x79 0x20 // 'the way ' 0x6C 0x65 0x74 0x74 0x65 0x72 0x73 0x20 // 'letters ' 0x6C 0x6F 0x6F 0x6B // 'look' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_D= ktpcHowToWords0D #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_D, __HELP_NAME("CO 1) To change size")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_D, __HELP_NAME("CO 1) To change size")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence kidTextsFontSize kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTWords0D ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_16=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_D, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcHowToWords0D" ITEM "kgobHowtoSequence" ITEM "kidTextsFontSize" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords0D" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_16=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_D, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE1 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_D=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_16, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords52 __HELP_SYMBOL( STN "ktpcHowToWords52" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_16=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_16, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0F 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x71 0x00 0x00 0x01 // '????q???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x19 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x65 0x00 0x00 0x03 // '???e???' 0x0A 0x00 0x00 0xFD 0x70 0x00 0x00 0x03 // '???p???' 0x0F 0x00 0x00 0xFD 0x71 0x00 0x00 0x03 // '???q???' 0x00 0x00 0x00 0x00 0x1D 0x00 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x2C 0x00 0x00 0x04 // '???,???' 0x00 0x00 0x00 0x00 0x1D 0x00 0x00 0x40 // '???????@' 0x02 0x00 0x00 0x00 0x2C 0x00 0x00 0x40 // '????,??@' 0x00 0x00 0x00 0x00 0x71 0x00 0x00 0x40 // '????q??@' 0x00 0x00 0x00 0x00 0x1B 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x5D 0x00 0x00 0x82 // '????]??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_16=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_16, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x63 0x68 0x61 // '??To cha' 0x6E 0x67 0x65 0x20 0x74 0x68 0x65 0x20 // 'nge the ' 0x6C 0x65 0x74 0x74 0x65 0x72 0x20 0x73 // 'letter s' 0x69 0x7A 0x65 0x0D 0x0A 0x31 0x09 0x47 // 'ize??1?G' 0x6F 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 // 'o to the' 0x20 0x70 0x6C 0x61 0x63 0x65 0x20 0x69 // ' place i' 0x6E 0x20 0x79 0x6F 0x75 0x72 0x20 0x6D // 'n your m' 0x6F 0x76 0x69 0x65 0x20 0x77 0x68 0x65 // 'ovie whe' 0x72 0x65 0x20 0x79 0x6F 0x75 0x20 0x77 // 're you w' 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 0x6D // 'ant to m' 0x61 0x6B 0x65 0x20 0x61 0x20 0x63 0x68 // 'ake a ch' 0x61 0x6E 0x67 0x65 0x2E 0x0D 0x0A 0x32 // 'ange.??2' 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 0x4C // '?Click L' 0x65 0x74 0x74 0x65 0x72 0x20 0x53 0x69 // 'etter Si' 0x7A 0x65 0x2E // 'ze.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_E= ktpcHowToWords0E #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_E, __HELP_NAME("CO 2) Click the size")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_E, __HELP_NAME("CO 2) Click the size")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon4 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x11D 0xDB 0x57415645 kwavHTWords0E ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_E, 0x0) GST(0) ITEM "kgobCalloutBalloon4" ITEM "ktpcHowToWords0E" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords0E" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x8F 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x18 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x18 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x18 0x00 0x00 0x04 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1E, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x73 0x69 0x7A 0x65 // 'the size' 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E // ' you wan' 0x74 0x2E // 't.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_F= ktpcHowToWords0F #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_F, __HELP_NAME("CO 3) Drag the mouse over 3")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_F, __HELP_NAME("CO 3) Drag the mouse over 3")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTWords0F ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_F, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToWords0F" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords0F" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_F, 0x0) BYTE 0x01 0x00 0x03 0x03 0xF0 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_20=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords50 __HELP_SYMBOL( STN "ktpcHowToWords50" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x4D 0x00 0x00 0x01 // '????M???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x4D 0x00 0x00 0x03 // '???M???' 0x00 0x00 0x00 0x00 0x0F 0x00 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x13 0x00 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x4D 0x00 0x00 0x04 // '????M???' 0x00 0x00 0x00 0x00 0x0F 0x00 0x00 0x40 // '???????@' 0x02 0x00 0x00 0x00 0x13 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x4D 0x00 0x00 0x40 // '????M??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) BYTE 0x03 0x03 0x49 0x6E 0x20 0x61 0x20 0x77 // '??In a w' 0x6F 0x72 0x64 0x20 0x62 0x6F 0x78 0x2C // 'ord box,' 0x20 0x64 0x72 0x61 0x67 0x20 0x74 0x68 // ' drag th' 0x65 0x20 0x6D 0x6F 0x75 0x73 0x65 0x20 // 'e mouse ' 0x6F 0x76 0x65 0x72 0x20 0x74 0x68 0x65 // 'over the' 0x20 0x6C 0x65 0x74 0x74 0x65 0x72 0x73 // ' letters' 0x20 0x77 0x68 0x6F 0x73 0x65 0x20 0x73 // ' whose s' 0x69 0x7A 0x65 0x20 0x79 0x6F 0x75 0x20 // 'ize you ' 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 // 'want to ' 0x63 0x68 0x61 0x6E 0x67 0x65 0x2E // 'change.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_10= ktpcHowToWords10 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_10, __HELP_NAME("Size--What Next?")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_10, __HELP_NAME("Size--What Next?")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTWords10 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_10, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToWords10" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords10" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_10, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC5 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_21=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToWords46 __HELP_SYMBOL( STN "ktpcHowToWords46" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktpcHowToWords48 __HELP_SYMBOL( STN "ktpcHowToWords48" ) ITEM LONG 0xC0000004 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords44 __HELP_SYMBOL( STN "ktpcHowToWords44" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG ktpcHowToWords49 __HELP_SYMBOL( STN "ktpcHowToWords49" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x15 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1D 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x1F 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x72 0x00 0x00 0x01 // '????r???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x1D 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x72 0x00 0x00 0x04 // '????r???' 0x00 0x00 0x00 0x00 0x1F 0x00 0x00 0x40 // '???????@' 0x06 0x00 0x00 0x00 0x25 0x00 0x00 0x40 // '????%??@' 0x00 0x00 0x00 0x00 0x27 0x00 0x00 0x40 // '????'??@' 0x02 0x00 0x00 0x00 0x3B 0x00 0x00 0x40 // '????;??@' 0x00 0x00 0x00 0x00 0x3D 0x00 0x00 0x40 // '????=??@' 0x03 0x00 0x00 0x00 0x51 0x00 0x00 0x40 // '????Q??@' 0x00 0x00 0x00 0x00 0x53 0x00 0x00 0x40 // '????S??@' 0x07 0x00 0x00 0x00 0x72 0x00 0x00 0x40 // '????r??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x1F 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x1F 0x00 0x00 0xC0 // '???????' 0x04 0x00 0x00 0x00 0x27 0x00 0x00 0xC0 // '????'??' 0x04 0x00 0x00 0x00 0x3D 0x00 0x00 0xC0 // '????=??' 0x04 0x00 0x00 0x00 0x53 0x00 0x00 0xC0 // '????S??' 0x04 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) BYTE 0x03 0x03 0x43 0x68 0x61 0x6E 0x67 0x69 // '??Changi' 0x6E 0x67 0x20 0x74 0x68 0x65 0x20 0x73 // 'ng the s' 0x69 0x7A 0x65 0x2D 0x2D 0x57 0x68 0x61 // 'ize--Wha' 0x74 0x20 0x6E 0x65 0x78 0x74 0x3F 0x0D // 't next??' 0x0A 0x01 0x20 0x55 0x6E 0x64 0x6F 0x0D // '?? Undo?' 0x0A 0x01 0x20 0x43 0x68 0x61 0x6E 0x67 // '?? Chang' 0x69 0x6E 0x67 0x20 0x74 0x68 0x65 0x20 // 'ing the ' 0x63 0x6F 0x6C 0x6F 0x72 0x0D 0x0A 0x01 // 'color???' 0x20 0x43 0x68 0x61 0x6E 0x67 0x69 0x6E // ' Changin' 0x67 0x20 0x74 0x68 0x65 0x20 0x73 0x74 // 'g the st' 0x79 0x6C 0x65 0x0D 0x0A 0x01 0x20 0x43 // 'yle??? C' 0x68 0x61 0x6E 0x67 0x69 0x6E 0x67 0x20 // 'hanging ' 0x74 0x68 0x65 0x20 0x77 0x61 0x79 0x20 // 'the way ' 0x6C 0x65 0x74 0x74 0x65 0x72 0x73 0x20 // 'letters ' 0x6C 0x6F 0x6F 0x6B // 'look' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_11= ktpcHowToWords11 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_11, __HELP_NAME("CO 1) To change color")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_11, __HELP_NAME("CO 1) To change color")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence kidTextsFontColor kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTWords11 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_11, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcHowToWords11" ITEM "kgobHowtoSequence" ITEM "kidTextsFontColor" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords11" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_11, 0x0) BYTE 0x01 0x00 0x03 0x03 0xDE 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_5=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords52 __HELP_SYMBOL( STN "ktpcHowToWords52" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_2=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0F 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x73 0x00 0x00 0x01 // '????s???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x1A 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x66 0x00 0x00 0x03 // '???f???' 0x0A 0x00 0x00 0xFD 0x72 0x00 0x00 0x03 // '???r???' 0x0F 0x00 0x00 0xFD 0x73 0x00 0x00 0x03 // '???s???' 0x00 0x00 0x00 0x00 0x1E 0x00 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x2D 0x00 0x00 0x04 // '???-???' 0x00 0x00 0x00 0x00 0x1E 0x00 0x00 0x40 // '???????@' 0x01 0x00 0x00 0x00 0x2D 0x00 0x00 0x40 // '????-??@' 0x00 0x00 0x00 0x00 0x73 0x00 0x00 0x40 // '????s??@' 0x00 0x00 0x00 0x00 0x1C 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x5E 0x00 0x00 0x82 // '????^??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x63 0x68 0x61 // '??To cha' 0x6E 0x67 0x65 0x20 0x74 0x68 0x65 0x20 // 'nge the ' 0x6C 0x65 0x74 0x74 0x65 0x72 0x20 0x63 // 'letter c' 0x6F 0x6C 0x6F 0x72 0x0D 0x0A 0x31 0x09 // 'olor??1?' 0x47 0x6F 0x20 0x74 0x6F 0x20 0x74 0x68 // 'Go to th' 0x65 0x20 0x70 0x6C 0x61 0x63 0x65 0x20 // 'e place ' 0x69 0x6E 0x20 0x79 0x6F 0x75 0x72 0x20 // 'in your ' 0x6D 0x6F 0x76 0x69 0x65 0x20 0x77 0x68 // 'movie wh' 0x65 0x72 0x65 0x20 0x79 0x6F 0x75 0x20 // 'ere you ' 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 // 'want to ' 0x6D 0x61 0x6B 0x65 0x20 0x61 0x20 0x63 // 'make a c' 0x68 0x61 0x6E 0x67 0x65 0x2E 0x0D 0x0A // 'hange.??' 0x32 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 // '2?Click ' 0x4C 0x65 0x74 0x74 0x65 0x72 0x20 0x43 // 'Letter C' 0x6F 0x6C 0x6F 0x72 0x2E // 'olor.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_12= ktpcHowToWords12 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_12, __HELP_NAME("CO 2) Click the color")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_12, __HELP_NAME("CO 2) Click the color")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon4 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x157 0xBC 0x57415645 kwavHTWords12 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_12, 0x0) GST(0) ITEM "kgobCalloutBalloon4" ITEM "ktpcHowToWords12" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords12" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_12, 0x0) BYTE 0x01 0x00 0x03 0x03 0x91 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_4C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x19 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x19 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x19 0x00 0x00 0x04 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4C, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x63 0x6F 0x6C 0x6F // 'the colo' 0x72 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 // 'r you wa' 0x6E 0x74 0x2E // 'nt.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_13= ktpcHowToWords13 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_13, __HELP_NAME("CO 3) Drag the mouse over 4")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_13, __HELP_NAME("CO 3) Drag the mouse over 4")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTWords13 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_39=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_13, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToWords13" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords13" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_39=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_13, 0x0) BYTE 0x01 0x00 0x03 0x03 0xED 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_22=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_39, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords50 __HELP_SYMBOL( STN "ktpcHowToWords50" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_39=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_39, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x4E 0x00 0x00 0x01 // '????N???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x4E 0x00 0x00 0x03 // '???N???' 0x00 0x00 0x00 0x00 0x0F 0x00 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x13 0x00 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x4E 0x00 0x00 0x04 // '????N???' 0x00 0x00 0x00 0x00 0x0F 0x00 0x00 0x40 // '???????@' 0x02 0x00 0x00 0x00 0x13 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x4E 0x00 0x00 0x40 // '????N??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_39=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_39, 0x0) BYTE 0x03 0x03 0x49 0x6E 0x20 0x61 0x20 0x77 // '??In a w' 0x6F 0x72 0x64 0x20 0x62 0x6F 0x78 0x2C // 'ord box,' 0x20 0x64 0x72 0x61 0x67 0x20 0x74 0x68 // ' drag th' 0x65 0x20 0x6D 0x6F 0x75 0x73 0x65 0x20 // 'e mouse ' 0x6F 0x76 0x65 0x72 0x20 0x74 0x68 0x65 // 'over the' 0x20 0x6C 0x65 0x74 0x74 0x65 0x72 0x73 // ' letters' 0x20 0x77 0x68 0x6F 0x73 0x65 0x20 0x63 // ' whose c' 0x6F 0x6C 0x6F 0x72 0x20 0x79 0x6F 0x75 // 'olor you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F // ' want to' 0x20 0x63 0x68 0x61 0x6E 0x67 0x65 0x2E // ' change.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_14= ktpcHowToWords14 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_14, __HELP_NAME("Color--What Next?")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_14, __HELP_NAME("Color--What Next?")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTWords14 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_14, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToWords14" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords14" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_14, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE9 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToWords4A __HELP_SYMBOL( STN "ktpcHowToWords4A" ) ITEM LONG 0x40000001 VAR BYTE 5 LONG ktpcHowToWords49 __HELP_SYMBOL( STN "ktpcHowToWords49" ) ITEM LONG 0xC0000005 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords44 __HELP_SYMBOL( STN "ktpcHowToWords44" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG ktpcHowToWords47 __HELP_SYMBOL( STN "ktpcHowToWords47" ) FREE ITEM LONG 0x40000001 VAR BYTE 4 LONG ktpcHowToWords48 __HELP_SYMBOL( STN "ktpcHowToWords48" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x17 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x25 0x00 0x00 0x01 // '????%???' 0x00 0x00 0x00 0x00 0x27 0x00 0x00 0x01 // '????'???' 0x01 0x00 0x00 0x00 0x9A 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x25 0x00 0x00 0x03 // '???%???' 0x00 0x00 0x00 0x00 0x27 0x00 0x00 0x40 // '????'??@' 0x05 0x00 0x00 0x00 0x2D 0x00 0x00 0x40 // '????-??@' 0x00 0x00 0x00 0x00 0x2F 0x00 0x00 0x40 // '????/??@' 0x02 0x00 0x00 0x00 0x4E 0x00 0x00 0x40 // '????N??@' 0x00 0x00 0x00 0x00 0x50 0x00 0x00 0x40 // '????P??@' 0x06 0x00 0x00 0x00 0x63 0x00 0x00 0x40 // '????c??@' 0x00 0x00 0x00 0x00 0x65 0x00 0x00 0x40 // '????e??@' 0x08 0x00 0x00 0x00 0x79 0x00 0x00 0x40 // '????y??@' 0x00 0x00 0x00 0x00 0x7B 0x00 0x00 0x40 // '????{??@' 0x03 0x00 0x00 0x00 0x9A 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x27 0x00 0x00 0x82 // '????'??' 0x00 0x00 0x00 0x00 0x27 0x00 0x00 0xC0 // '????'??' 0x04 0x00 0x00 0x00 0x2F 0x00 0x00 0xC0 // '????/??' 0x04 0x00 0x00 0x00 0x50 0x00 0x00 0xC0 // '????P??' 0x04 0x00 0x00 0x00 0x65 0x00 0x00 0xC0 // '????e??' 0x04 0x00 0x00 0x00 0x7B 0x00 0x00 0xC0 // '????{??' 0x04 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) BYTE 0x03 0x03 0x43 0x68 0x61 0x6E 0x67 0x69 // '??Changi' 0x6E 0x67 0x20 0x74 0x68 0x65 0x20 0x6C // 'ng the l' 0x65 0x74 0x74 0x65 0x72 0x20 0x63 0x6F // 'etter co' 0x6C 0x6F 0x72 0x2D 0x2D 0x57 0x68 0x61 // 'lor--Wha' 0x74 0x20 0x6E 0x65 0x78 0x74 0x3F 0x0D // 't next??' 0x0A 0x01 0x20 0x55 0x6E 0x64 0x6F 0x0D // '?? Undo?' 0x0A 0x01 0x20 0x43 0x68 0x61 0x6E 0x67 // '?? Chang' 0x69 0x6E 0x67 0x20 0x74 0x68 0x65 0x20 // 'ing the ' 0x62 0x61 0x63 0x6B 0x67 0x72 0x6F 0x75 // 'backgrou' 0x6E 0x64 0x20 0x63 0x6F 0x6C 0x6F 0x72 // 'nd color' 0x0D 0x0A 0x01 0x20 0x43 0x68 0x61 0x6E // '??? Chan' 0x67 0x69 0x6E 0x67 0x20 0x74 0x68 0x65 // 'ging the' 0x20 0x73 0x69 0x7A 0x65 0x0D 0x0A 0x01 // ' size???' 0x20 0x43 0x68 0x61 0x6E 0x67 0x69 0x6E // ' Changin' 0x67 0x20 0x74 0x68 0x65 0x20 0x73 0x74 // 'g the st' 0x79 0x6C 0x65 0x0D 0x0A 0x01 0x20 0x43 // 'yle??? C' 0x68 0x61 0x6E 0x67 0x69 0x6E 0x67 0x20 // 'hanging ' 0x74 0x68 0x65 0x20 0x77 0x61 0x79 0x20 // 'the way ' 0x6C 0x65 0x74 0x74 0x65 0x72 0x73 0x20 // 'letters ' 0x6C 0x6F 0x6F 0x6B // 'look' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_15= ktpcHowToWords15 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_15, __HELP_NAME("CO 1) To change background")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_15, __HELP_NAME("CO 1) To change background")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobHowtoSequence kidTextsBkgdColor kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTWords15 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_13=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_15, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcHowToWords15" ITEM "kgobHowtoSequence" ITEM "kidTextsBkgdColor" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords15" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_13=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_15, 0x0) BYTE 0x01 0x00 0x03 0x03 0x10 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_8=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_13, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords52 __HELP_SYMBOL( STN "ktpcHowToWords52" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_13=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_13, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0F 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x89 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x2C 0x00 0x00 0x03 // '???,???' 0x0F 0x00 0x00 0xFD 0x78 0x00 0x00 0x03 // '???x???' 0x0A 0x00 0x00 0xFD 0x88 0x00 0x00 0x03 // '??????' 0x0F 0x00 0x00 0xFD 0x89 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x30 0x00 0x00 0x04 // '????0???' 0x0D 0x00 0x00 0xFE 0x3F 0x00 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x30 0x00 0x00 0x40 // '????0??@' 0x02 0x00 0x00 0x00 0x3F 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x89 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x2E 0x00 0x00 0x80 // '????.??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x70 0x00 0x00 0x82 // '????p??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_13=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_13, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x63 0x68 0x61 // '??To cha' 0x6E 0x67 0x65 0x20 0x74 0x68 0x65 0x20 // 'nge the ' 0x62 0x61 0x63 0x6B 0x67 0x72 0x6F 0x75 // 'backgrou' 0x6E 0x64 0x20 0x63 0x6F 0x6C 0x6F 0x72 // 'nd color' 0x20 0x6F 0x66 0x20 0x61 0x20 0x77 0x6F // ' of a wo' 0x72 0x64 0x20 0x62 0x6F 0x78 0x0D 0x0A // 'rd box??' 0x31 0x09 0x47 0x6F 0x20 0x74 0x6F 0x20 // '1?Go to ' 0x74 0x68 0x65 0x20 0x70 0x6C 0x61 0x63 // 'the plac' 0x65 0x20 0x69 0x6E 0x20 0x79 0x6F 0x75 // 'e in you' 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 0x20 // 'r movie ' 0x77 0x68 0x65 0x72 0x65 0x20 0x79 0x6F // 'where yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 // 'u want t' 0x6F 0x20 0x6D 0x61 0x6B 0x65 0x20 0x61 // 'o make a' 0x20 0x63 0x68 0x61 0x6E 0x67 0x65 0x2E // ' change.' 0x0D 0x0A 0x32 0x09 0x43 0x6C 0x69 0x63 // '??2?Clic' 0x6B 0x20 0x42 0x61 0x63 0x6B 0x67 0x72 // 'k Backgr' 0x6F 0x75 0x6E 0x64 0x20 0x43 0x6F 0x6C // 'ound Col' 0x6F 0x72 0x2E // 'or.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_16= ktpcHowToWords16 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_16, __HELP_NAME("CO 2) Click the color 2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_16, __HELP_NAME("CO 2) Click the color 2")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon4 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x1A2 0xBD 0x57415645 kwavHTWords16 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_15=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_16, 0x0) GST(0) ITEM "kgobCalloutBalloon4" ITEM "ktpcHowToWords16" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords16" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_15=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_16, 0x0) BYTE 0x01 0x00 0x03 0x03 0x90 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_15=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_15, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x19 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x19 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x19 0x00 0x00 0x04 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_15=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_15, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x63 0x6F 0x6C 0x6F // 'the colo' 0x72 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 // 'r you wa' 0x6E 0x74 0x2E // 'nt.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_17= ktpcHowToWords17 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_17, __HELP_NAME("CO 3) Click the word box")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_17, __HELP_NAME("CO 3) Click the word box")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTWords17 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_10=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_17, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToWords17" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords17" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_10=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_17, 0x0) BYTE 0x01 0x00 0x03 0x03 0x99 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_10=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_10, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x32 0x00 0x00 0x01 // '????2???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x32 0x00 0x00 0x03 // '???2???' 0x00 0x00 0x00 0x00 0x32 0x00 0x00 0x04 // '????2???' 0x00 0x00 0x00 0x00 0x32 0x00 0x00 0x40 // '????2??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_10=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_10, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x77 0x6F 0x72 0x64 // 'the word' 0x20 0x62 0x6F 0x78 0x20 0x77 0x68 0x6F // ' box who' 0x73 0x65 0x20 0x63 0x6F 0x6C 0x6F 0x72 // 'se color' 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E // ' you wan' 0x74 0x20 0x74 0x6F 0x20 0x63 0x68 0x61 // 't to cha' 0x6E 0x67 0x65 0x2E // 'nge.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_18= ktpcHowToWords18 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_18, __HELP_NAME("Background Color--What Next?")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_18, __HELP_NAME("Background Color--What Next?")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTWords18 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_17=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_18, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToWords18" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords18" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_17=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_18, 0x0) BYTE 0x01 0x00 0x03 0x03 0x07 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_37=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_17, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords44 __HELP_SYMBOL( STN "ktpcHowToWords44" ) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToWords46 __HELP_SYMBOL( STN "ktpcHowToWords46" ) ITEM LONG 0xC0000005 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) FREE FREE ITEM LONG 0x40000001 VAR BYTE 4 LONG ktpcHowToWords48 __HELP_SYMBOL( STN "ktpcHowToWords48" ) FREE ITEM LONG 0x40000001 VAR BYTE 3 LONG ktpcHowToWords47 __HELP_SYMBOL( STN "ktpcHowToWords47" ) ITEM LONG 0x40000001 VAR BYTE 5 LONG ktpcHowToWords49 __HELP_SYMBOL( STN "ktpcHowToWords49" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_17=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_17, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x18 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x29 0x00 0x00 0x01 // '????)???' 0x00 0x00 0x00 0x00 0x2B 0x00 0x00 0x01 // '????+???' 0x01 0x00 0x00 0x00 0x9A 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x29 0x00 0x00 0x03 // '???)???' 0x00 0x00 0x00 0x00 0x9A 0x00 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x2B 0x00 0x00 0x40 // '????+??@' 0x01 0x00 0x00 0x00 0x31 0x00 0x00 0x40 // '????1??@' 0x00 0x00 0x00 0x00 0x33 0x00 0x00 0x40 // '????3??@' 0x02 0x00 0x00 0x00 0x4E 0x00 0x00 0x40 // '????N??@' 0x00 0x00 0x00 0x00 0x50 0x00 0x00 0x40 // '????P??@' 0x08 0x00 0x00 0x00 0x63 0x00 0x00 0x40 // '????c??@' 0x00 0x00 0x00 0x00 0x65 0x00 0x00 0x40 // '????e??@' 0x06 0x00 0x00 0x00 0x79 0x00 0x00 0x40 // '????y??@' 0x00 0x00 0x00 0x00 0x7B 0x00 0x00 0x40 // '????{??@' 0x09 0x00 0x00 0x00 0x9A 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x2B 0x00 0x00 0x82 // '????+??' 0x00 0x00 0x00 0x00 0x2B 0x00 0x00 0xC0 // '????+??' 0x03 0x00 0x00 0x00 0x33 0x00 0x00 0xC0 // '????3??' 0x03 0x00 0x00 0x00 0x50 0x00 0x00 0xC0 // '????P??' 0x03 0x00 0x00 0x00 0x65 0x00 0x00 0xC0 // '????e??' 0x03 0x00 0x00 0x00 0x7B 0x00 0x00 0xC0 // '????{??' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_17=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_17, 0x0) BYTE 0x03 0x03 0x43 0x68 0x61 0x6E 0x67 0x69 // '??Changi' 0x6E 0x67 0x20 0x74 0x68 0x65 0x20 0x62 // 'ng the b' 0x61 0x63 0x6B 0x67 0x72 0x6F 0x75 0x6E // 'ackgroun' 0x64 0x20 0x63 0x6F 0x6C 0x6F 0x72 0x2D // 'd color-' 0x2D 0x57 0x68 0x61 0x74 0x20 0x6E 0x65 // '-What ne' 0x78 0x74 0x3F 0x0D 0x0A 0x01 0x20 0x55 // 'xt???? U' 0x6E 0x64 0x6F 0x0D 0x0A 0x01 0x20 0x43 // 'ndo??? C' 0x68 0x61 0x6E 0x67 0x69 0x6E 0x67 0x20 // 'hanging ' 0x74 0x68 0x65 0x20 0x6C 0x65 0x74 0x74 // 'the lett' 0x65 0x72 0x20 0x63 0x6F 0x6C 0x6F 0x72 // 'er color' 0x0D 0x0A 0x01 0x20 0x43 0x68 0x61 0x6E // '??? Chan' 0x67 0x69 0x6E 0x67 0x20 0x74 0x68 0x65 // 'ging the' 0x20 0x73 0x69 0x7A 0x65 0x0D 0x0A 0x01 // ' size???' 0x20 0x43 0x68 0x61 0x6E 0x67 0x69 0x6E // ' Changin' 0x67 0x20 0x74 0x68 0x65 0x20 0x73 0x74 // 'g the st' 0x79 0x6C 0x65 0x0D 0x0A 0x01 0x20 0x43 // 'yle??? C' 0x68 0x61 0x6E 0x67 0x69 0x6E 0x67 0x20 // 'hanging ' 0x74 0x68 0x65 0x20 0x77 0x61 0x79 0x20 // 'the way ' 0x6C 0x65 0x74 0x74 0x65 0x72 0x73 0x20 // 'letters ' 0x6C 0x6F 0x6F 0x6B // 'look' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_19= ktpcHowToWords19 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_19, __HELP_NAME("CO 1) To move a word box")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_19, __HELP_NAME("CO 1) To move a word box")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTWords19 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_18=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_19, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToWords19" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords19" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_18=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_19, 0x0) BYTE 0x01 0x00 0x03 0x03 0x1F 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_27=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_18, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords51 __HELP_SYMBOL( STN "ktpcHowToWords51" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords52 __HELP_SYMBOL( STN "ktpcHowToWords52" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_18=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_18, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x12 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xC7 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x12 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x87 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x16 0x00 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x25 0x00 0x00 0x04 // '???%???' 0x00 0x00 0x00 0x00 0xA8 0x00 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xAC 0x00 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0x16 0x00 0x00 0x40 // '???????@' 0x03 0x00 0x00 0x00 0x25 0x00 0x00 0x40 // '????%??@' 0x00 0x00 0x00 0x00 0x87 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xA8 0x00 0x00 0x40 // '??????@' 0x02 0x00 0x00 0x00 0xAC 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x14 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0xA6 0x00 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xA6 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_18=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_18, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x6D 0x6F 0x76 // '??To mov' 0x65 0x20 0x61 0x20 0x77 0x6F 0x72 0x64 // 'e a word' 0x20 0x62 0x6F 0x78 0x0D 0x0A 0x31 0x09 // ' box??1?' 0x47 0x6F 0x20 0x74 0x6F 0x20 0x74 0x68 // 'Go to th' 0x65 0x20 0x70 0x6C 0x61 0x63 0x65 0x20 // 'e place ' 0x69 0x6E 0x20 0x79 0x6F 0x75 0x72 0x20 // 'in your ' 0x6D 0x6F 0x76 0x69 0x65 0x20 0x77 0x68 // 'movie wh' 0x65 0x72 0x65 0x20 0x79 0x6F 0x75 0x20 // 'ere you ' 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 // 'want to ' 0x6D 0x6F 0x76 0x65 0x20 0x61 0x20 0x77 // 'move a w' 0x6F 0x72 0x64 0x20 0x62 0x6F 0x78 0x2E // 'ord box.' 0x0D 0x0A 0x32 0x09 0x4D 0x6F 0x76 0x65 // '??2?Move' 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 // ' the mou' 0x73 0x65 0x20 0x63 0x75 0x72 0x73 0x6F // 'se curso' 0x72 0x20 0x6F 0x76 0x65 0x72 0x20 0x61 // 'r over a' 0x20 0x77 0x6F 0x72 0x64 0x20 0x62 0x6F // ' word bo' 0x78 0x20 0x73 0x69 0x64 0x65 0x2E 0x20 // 'x side. ' 0x20 0x54 0x68 0x65 0x20 0x63 0x75 0x72 // ' The cur' 0x73 0x6F 0x72 0x20 0x63 0x68 0x61 0x6E // 'sor chan' 0x67 0x65 0x73 0x20 0x74 0x6F 0x20 0x61 // 'ges to a' 0x20 0x68 0x61 0x6E 0x64 0x2E 0x0D 0x0A // ' hand.??' 0x33 0x09 0x44 0x72 0x61 0x67 0x20 0x74 // '3?Drag t' 0x68 0x65 0x20 0x62 0x6F 0x78 0x20 0x77 // 'he box w' 0x68 0x65 0x72 0x65 0x20 0x79 0x6F 0x75 // 'here you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x69 0x74 // ' want it' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1A= ktpcHowToWords1A #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1A, __HELP_NAME("Move Box--What Next?")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1A, __HELP_NAME("Move Box--What Next?")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTWords1A ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1A, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToWords1A" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords1A" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1A, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_F=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1B, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToWords43 __HELP_SYMBOL( STN "ktpcHowToWords43" ) ITEM LONG 0xC0000002 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords44 __HELP_SYMBOL( STN "ktpcHowToWords44" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_1B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x10 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1D 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x1F 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x43 0x00 0x00 0x01 // '????C???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x1D 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x43 0x00 0x00 0x04 // '????C???' 0x00 0x00 0x00 0x00 0x1F 0x00 0x00 0x40 // '???????@' 0x03 0x00 0x00 0x00 0x25 0x00 0x00 0x40 // '????%??@' 0x00 0x00 0x00 0x00 0x27 0x00 0x00 0x40 // '????'??@' 0x01 0x00 0x00 0x00 0x43 0x00 0x00 0x40 // '????C??@' 0x00 0x00 0x00 0x00 0x1F 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x1F 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x1F 0x00 0x00 0xC0 // '???????' 0x02 0x00 0x00 0x00 0x27 0x00 0x00 0xC0 // '????'??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1B, 0x0) BYTE 0x03 0x03 0x4D 0x6F 0x76 0x69 0x6E 0x67 // '??Moving' 0x20 0x61 0x20 0x77 0x6F 0x72 0x64 0x20 // ' a word ' 0x62 0x6F 0x78 0x2D 0x2D 0x57 0x68 0x61 // 'box--Wha' 0x74 0x20 0x6E 0x65 0x78 0x74 0x3F 0x0D // 't next??' 0x0A 0x01 0x20 0x55 0x6E 0x64 0x6F 0x0D // '?? Undo?' 0x0A 0x01 0x20 0x43 0x68 0x61 0x6E 0x67 // '?? Chang' 0x69 0x6E 0x67 0x20 0x74 0x68 0x65 0x20 // 'ing the ' 0x77 0x6F 0x72 0x64 0x20 0x62 0x6F 0x78 // 'word box' 0x20 0x73 0x69 0x7A 0x65 // ' size' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1B= ktpcHowToWords1B #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1B, __HELP_NAME("CO 1) To resize a word box")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1B, __HELP_NAME("CO 1) To resize a word box")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTWords1B ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_12=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1B, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToWords1B" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords1B" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_12=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x59 0x01 0x00 0x00 // '????Y???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_28=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_12, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords51 __HELP_SYMBOL( STN "ktpcHowToWords51" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords52 __HELP_SYMBOL( STN "ktpcHowToWords52" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_12=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_12, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x14 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xF4 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x14 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x9D 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0xBD 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0xC1 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x18 0x00 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x27 0x00 0x00 0x04 // '???'???' 0x00 0x00 0x00 0x00 0xC1 0x00 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xC5 0x00 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0x18 0x00 0x00 0x40 // '???????@' 0x03 0x00 0x00 0x00 0x27 0x00 0x00 0x40 // '????'??@' 0x00 0x00 0x00 0x00 0xC1 0x00 0x00 0x40 // '??????@' 0x02 0x00 0x00 0x00 0xC5 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x16 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x5C 0x00 0x00 0x80 // '????\??' 0x00 0x00 0x03 0x00 0xBF 0x00 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xBF 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_12=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_12, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x72 0x65 0x73 // '??To res' 0x69 0x7A 0x65 0x20 0x61 0x20 0x77 0x6F // 'ize a wo' 0x72 0x64 0x20 0x62 0x6F 0x78 0x0D 0x0A // 'rd box??' 0x31 0x09 0x47 0x6F 0x20 0x74 0x6F 0x20 // '1?Go to ' 0x74 0x68 0x65 0x20 0x70 0x6C 0x61 0x63 // 'the plac' 0x65 0x20 0x69 0x6E 0x20 0x79 0x6F 0x75 // 'e in you' 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 0x20 // 'r movie ' 0x77 0x68 0x65 0x72 0x65 0x20 0x79 0x6F // 'where yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 // 'u want t' 0x6F 0x20 0x72 0x65 0x73 0x69 0x7A 0x65 // 'o resize' 0x20 0x61 0x20 0x77 0x6F 0x72 0x64 0x20 // ' a word ' 0x62 0x6F 0x78 0x2E 0x0D 0x0A 0x4D 0x6F // 'box.??Mo' 0x76 0x65 0x20 0x74 0x68 0x65 0x20 0x6D // 've the m' 0x6F 0x75 0x73 0x65 0x20 0x63 0x75 0x72 // 'ouse cur' 0x73 0x6F 0x72 0x20 0x6F 0x76 0x65 0x72 // 'sor over' 0x20 0x61 0x20 0x77 0x6F 0x72 0x64 0x20 // ' a word ' 0x62 0x6F 0x78 0x20 0x68 0x61 0x6E 0x64 // 'box hand' 0x6C 0x65 0x20 0x28 0x61 0x20 0x6C 0x69 // 'le (a li' 0x74 0x74 0x6C 0x65 0x20 0x73 0x71 0x75 // 'ttle squ' 0x61 0x72 0x65 0x29 0x2E 0x20 0x20 0x54 // 'are). T' 0x68 0x65 0x20 0x63 0x75 0x72 0x73 0x6F // 'he curso' 0x72 0x20 0x63 0x68 0x61 0x6E 0x67 0x65 // 'r change' 0x73 0x20 0x74 0x6F 0x20 0x61 0x6E 0x20 // 's to an ' 0x61 0x72 0x72 0x6F 0x77 0x2E 0x20 0x0D // 'arrow. ?' 0x0A 0x32 0x09 0x44 0x72 0x61 0x67 0x20 // '?2?Drag ' 0x74 0x68 0x65 0x20 0x68 0x61 0x6E 0x64 // 'the hand' 0x6C 0x65 0x20 0x75 0x6E 0x74 0x69 0x6C // 'le until' 0x20 0x74 0x68 0x65 0x20 0x62 0x6F 0x78 // ' the box' 0x20 0x69 0x73 0x20 0x74 0x68 0x65 0x20 // ' is the ' 0x73 0x69 0x7A 0x65 0x20 0x79 0x6F 0x75 // 'size you' 0x20 0x77 0x61 0x6E 0x74 0x2E // ' want.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1C= ktpcHowToWords1C #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1C, __HELP_NAME("Resize--What Next?")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1C, __HELP_NAME("Resize--What Next?")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTWords1C ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_11=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1C, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToWords1C" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords1C" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_11=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1C, 0x0) BYTE 0x01 0x00 0x03 0x03 0xCA 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_A=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_11, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToWords45 __HELP_SYMBOL( STN "ktpcHowToWords45" ) ITEM LONG 0xC0000002 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords44 __HELP_SYMBOL( STN "ktpcHowToWords44" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_11=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_11, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x10 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1F 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x21 0x00 0x00 0x01 // '????!???' 0x01 0x00 0x00 0x00 0x3C 0x00 0x00 0x01 // '??????@' 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0x40 // '????@??@' 0x03 0x00 0x00 0x00 0x53 0x00 0x00 0x40 // '????S??@' 0x00 0x00 0x00 0x00 0x55 0x00 0x00 0x40 // '????U??@' 0x06 0x00 0x00 0x00 0x6A 0x00 0x00 0x40 // '????j??@' 0x00 0x00 0x00 0x00 0x1A 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x1A 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x1A 0x00 0x00 0xC0 // '???????' 0x04 0x00 0x00 0x00 0x22 0x00 0x00 0xC0 // '????"??' 0x04 0x00 0x00 0x00 0x40 0x00 0x00 0xC0 // '????@??' 0x04 0x00 0x00 0x00 0x55 0x00 0x00 0xC0 // '????U??' 0x04 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B, 0x0) BYTE 0x03 0x03 0x54 0x79 0x70 0x69 0x6E 0x67 // '??Typing' 0x20 0x68 0x69 0x6E 0x74 0x73 0x2D 0x2D // ' hints--' 0x57 0x68 0x61 0x74 0x20 0x6E 0x65 0x78 // 'What nex' 0x74 0x3F 0x0D 0x0A 0x01 0x20 0x55 0x6E // 't???? Un' 0x64 0x6F 0x0D 0x0A 0x01 0x20 0x43 0x68 // 'do??? Ch' 0x61 0x6E 0x67 0x69 0x6E 0x67 0x20 0x74 // 'anging t' 0x68 0x65 0x20 0x77 0x6F 0x72 0x64 0x20 // 'he word ' 0x62 0x6F 0x78 0x20 0x73 0x69 0x7A 0x65 // 'box size' 0x0D 0x0A 0x01 0x20 0x4D 0x6F 0x76 0x69 // '??? Movi' 0x6E 0x67 0x20 0x61 0x20 0x77 0x6F 0x72 // 'ng a wor' 0x64 0x20 0x62 0x6F 0x78 0x0D 0x0A 0x01 // 'd box???' 0x20 0x52 0x65 0x6D 0x6F 0x76 0x69 0x6E // ' Removin' 0x67 0x20 0x61 0x20 0x77 0x6F 0x72 0x64 // 'g a word' 0x20 0x62 0x6F 0x78 // ' box' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_23= ktpcHowToWords23 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_23, __HELP_NAME("CO 1) To copy & paste")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_23, __HELP_NAME("CO 1) To copy & paste")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidCutCopyPaste kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTWords23 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_23, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToWords23" ITEM "kgobHowtoSequence" ITEM "kidCutCopyPaste" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords23" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_23, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_16=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1C, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords52 __HELP_SYMBOL( STN "ktpcHowToWords52" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_1C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x15 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x8B 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x25 0x00 0x00 0x03 // '???%???' 0x00 0x00 0x00 0x00 0x27 0x00 0x00 0x03 // '????'???' 0x0F 0x00 0x00 0xFD 0x64 0x00 0x00 0x03 // '???d???' 0x00 0x00 0x00 0x00 0x72 0x00 0x00 0x03 // '????r???' 0x0A 0x00 0x00 0xFD 0x8A 0x00 0x00 0x03 // '??????' 0x0F 0x00 0x00 0xFD 0x8B 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x29 0x00 0x00 0x04 // '????)???' 0x0D 0x00 0x00 0xFE 0x38 0x00 0x00 0x04 // '???8???' 0x00 0x00 0x00 0x00 0x29 0x00 0x00 0x40 // '????)??@' 0x03 0x00 0x00 0x00 0x38 0x00 0x00 0x40 // '????8??@' 0x00 0x00 0x00 0x00 0x66 0x00 0x00 0x40 // '????f??@' 0x00 0x00 0x00 0x00 0x27 0x00 0x00 0x80 // '????'??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x81 // '???????' 0x05 0x00 0x00 0x00 0x27 0x00 0x00 0x81 // '????'??' 0x00 0x00 0x00 0x00 0x27 0x00 0x00 0x82 // '????'??' 0x05 0x00 0x00 0x00 0x66 0x00 0x00 0x82 // '????f??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1C, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x63 0x6F 0x70 // '??To cop' 0x79 0x20 0x61 0x6E 0x64 0x20 0x70 0x61 // 'y and pa' 0x73 0x74 0x65 0x20 0x77 0x6F 0x72 0x64 // 'ste word' 0x73 0x20 0x69 0x6E 0x20 0x61 0x20 0x77 // 's in a w' 0x6F 0x72 0x64 0x20 0x62 0x6F 0x78 0x0D // 'ord box?' 0x0A 0x31 0x09 0x47 0x6F 0x20 0x74 0x6F // '?1?Go to' 0x20 0x74 0x68 0x65 0x20 0x70 0x6C 0x61 // ' the pla' 0x63 0x65 0x20 0x69 0x6E 0x20 0x79 0x6F // 'ce in yo' 0x75 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 // 'ur movie' 0x20 0x77 0x68 0x65 0x72 0x65 0x20 0x79 // ' where y' 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 // 'ou want ' 0x74 0x6F 0x20 0x63 0x6F 0x70 0x79 0x20 // 'to copy ' 0x77 0x6F 0x72 0x64 0x73 0x2E 0x0D 0x0A // 'words.??' 0x32 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 // '2?Click ' 0x74 0x68 0x65 0x20 0x43 0x75 0x74 0x2C // 'the Cut,' 0x20 0x43 0x6F 0x70 0x79 0x2C 0x20 0x26 // ' Copy, &' 0x20 0x50 0x61 0x73 0x74 0x65 0x20 0x54 // ' Paste T' 0x6F 0x6F 0x6C 0x73 0x2E // 'ools.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_24= ktpcHowToWords24 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_24, __HELP_NAME("CO 2) Click Copy")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_24, __HELP_NAME("CO 2) Click Copy")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidCCPCopy kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTWords24 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_24, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToWords24" ITEM "kgobHowtoSequence" ITEM "kidCCPCopy" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords24" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_24, 0x0) BYTE 0x01 0x00 0x03 0x03 0x40 0x00 0x00 0x00 // '????@???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0B 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0A 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2D, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x43 0x6F 0x70 0x79 0x2E // 'Copy.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_25= ktpcHowToWords25 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_25, __HELP_NAME("CO 3) Drag the mouse")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_25, __HELP_NAME("CO 3) Drag the mouse")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTWords25 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_19=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_25, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToWords25" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords25" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_19=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_25, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC6 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_E=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_19, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords50 __HELP_SYMBOL( STN "ktpcHowToWords50" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_19=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_19, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x3E 0x00 0x00 0x01 // '????>???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x3E 0x00 0x00 0x03 // '???>???' 0x00 0x00 0x00 0x00 0x0F 0x00 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x13 0x00 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x0F 0x00 0x00 0x40 // '???????@' 0x02 0x00 0x00 0x00 0x13 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_19=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_19, 0x0) BYTE 0x03 0x03 0x49 0x6E 0x20 0x61 0x20 0x77 // '??In a w' 0x6F 0x72 0x64 0x20 0x62 0x6F 0x78 0x2C // 'ord box,' 0x20 0x64 0x72 0x61 0x67 0x20 0x74 0x68 // ' drag th' 0x65 0x20 0x6D 0x6F 0x75 0x73 0x65 0x20 // 'e mouse ' 0x6F 0x76 0x65 0x72 0x20 0x74 0x68 0x65 // 'over the' 0x20 0x77 0x6F 0x72 0x64 0x73 0x20 0x79 // ' words y' 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 // 'ou want ' 0x74 0x6F 0x20 0x63 0x6F 0x70 0x79 0x2E // 'to copy.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_26= ktpcHowToWords26 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_26, __HELP_NAME("CO 4) To paste")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_26, __HELP_NAME("CO 4) To paste")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidCutCopyPaste kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTWords26 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_28=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_26, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToWords26" ITEM "kgobHowtoSequence" ITEM "kidCutCopyPaste" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords26" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_28=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_26, 0x0) BYTE 0x01 0x00 0x03 0x03 0xEB 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_29=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_28, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords52 __HELP_SYMBOL( STN "ktpcHowToWords52" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_28=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_28, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x10 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x73 0x00 0x00 0x01 // '????s???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x08 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x5A 0x00 0x00 0x03 // '????Z???' 0x0A 0x00 0x00 0xFD 0x72 0x00 0x00 0x03 // '???r???' 0x0F 0x00 0x00 0xFD 0x73 0x00 0x00 0x03 // '???s???' 0x00 0x00 0x00 0x00 0x1A 0x00 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x29 0x00 0x00 0x04 // '???)???' 0x00 0x00 0x00 0x00 0x1A 0x00 0x00 0x40 // '???????@' 0x03 0x00 0x00 0x00 0x29 0x00 0x00 0x40 // '????)??@' 0x00 0x00 0x00 0x00 0x0A 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x4E 0x00 0x00 0x82 // '????N??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_28=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_28, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x70 0x61 0x73 // '??To pas' 0x74 0x65 0x0D 0x0A 0x31 0x09 0x49 0x66 // 'te??1?If' 0x20 0x6E 0x65 0x63 0x65 0x73 0x73 0x61 // ' necessa' 0x72 0x79 0x2C 0x20 0x67 0x6F 0x20 0x74 // 'ry, go t' 0x6F 0x20 0x74 0x68 0x65 0x20 0x70 0x6C // 'o the pl' 0x61 0x63 0x65 0x20 0x77 0x68 0x65 0x72 // 'ace wher' 0x65 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 // 'e you wa' 0x6E 0x74 0x20 0x74 0x6F 0x20 0x70 0x61 // 'nt to pa' 0x73 0x74 0x65 0x20 0x74 0x68 0x65 0x20 // 'ste the ' 0x77 0x6F 0x72 0x64 0x73 0x2E 0x0D 0x0A // 'words.??' 0x32 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 // '2?Click ' 0x74 0x68 0x65 0x20 0x43 0x75 0x74 0x2C // 'the Cut,' 0x20 0x43 0x6F 0x70 0x79 0x2C 0x20 0x26 // ' Copy, &' 0x20 0x50 0x61 0x73 0x74 0x65 0x20 0x54 // ' Paste T' 0x6F 0x6F 0x6C 0x73 0x2E // 'ools.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_27= ktpcHowToWords27 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_27, __HELP_NAME("CO 5) Click Paste")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_27, __HELP_NAME("CO 5) Click Paste")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidCCPPaste kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTWords27 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_33=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_27, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToWords27" ITEM "kgobHowtoSequence" ITEM "kidCCPPaste" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords27" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_33=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_27, 0x0) BYTE 0x01 0x00 0x03 0x03 0x4A 0x00 0x00 0x00 // '????J???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_33=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_33, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x06 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x07 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0D 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x07 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0C 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x0D 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x0D 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_33=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_33, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x20 0x50 0x61 0x73 0x74 0x65 0x2E // ' Paste.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_28= ktpcHowToWords28 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_28, __HELP_NAME("CO 2a) Click where you ")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_28, __HELP_NAME("CO 2a) Click where you ")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTWords28 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_25=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_28, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToWords28" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords28" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_25=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_28, 0x0) BYTE 0x01 0x00 0x03 0x03 0x8A 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_25=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_25, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2B 0x00 0x00 0x01 // '????+???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_25=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_25, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x77 0x68 0x65 0x72 0x65 0x20 0x79 0x6F // 'where yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 // 'u want t' 0x6F 0x20 0x70 0x6C 0x61 0x63 0x65 0x20 // 'o place ' 0x74 0x68 0x65 0x20 0x77 0x6F 0x72 0x64 // 'the word' 0x20 0x62 0x6F 0x78 0x2E // ' box.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_29= ktpcHowToWords29 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_29, __HELP_NAME("CO 6) Click where you want")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_29, __HELP_NAME("CO 6) Click where you want")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTWords29 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_29, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToWords29" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords29" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_29, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB6 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x37 0x00 0x00 0x01 // '????7???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x37 0x00 0x00 0x03 // '???7???' 0x00 0x00 0x00 0x00 0x37 0x00 0x00 0x40 // '????7??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1A, 0x0) BYTE 0x03 0x03 0x49 0x6E 0x20 0x61 0x20 0x77 // '??In a w' 0x6F 0x72 0x64 0x20 0x62 0x6F 0x78 0x2C // 'ord box,' 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 0x77 // ' click w' 0x68 0x65 0x72 0x65 0x20 0x79 0x6F 0x75 // 'here you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F // ' want to' 0x20 0x70 0x61 0x73 0x74 0x65 0x20 0x74 // ' paste t' 0x68 0x65 0x20 0x77 0x6F 0x72 0x64 0x73 // 'he words' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2A= ktpcHowToWords2A #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2A, __HELP_NAME("Copy words--What Next?")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2A, __HELP_NAME("Copy words--What Next?")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTWords2A ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2A, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToWords2A" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords2A" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x75 0x00 0x00 0x00 // '????u???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_25=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3D, 0x0) AG(4) FREE ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords44 __HELP_SYMBOL( STN "ktpcHowToWords44" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_3D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x23 0x00 0x00 0x01 // '????#???' 0x00 0x00 0x00 0x00 0x25 0x00 0x00 0x01 // '????%???' 0x01 0x00 0x00 0x00 0x2B 0x00 0x00 0x01 // '????+???' 0x00 0x00 0x00 0x00 0x2B 0x00 0x00 0x02 // '????+???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x23 0x00 0x00 0x03 // '???#???' 0x00 0x00 0x00 0x00 0x25 0x00 0x00 0x40 // '????%??@' 0x03 0x00 0x00 0x00 0x2B 0x00 0x00 0x40 // '????+??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x25 0x00 0x00 0x82 // '????%??' 0x00 0x00 0x00 0x00 0x25 0x00 0x00 0xC0 // '????%??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3D, 0x0) BYTE 0x03 0x03 0x43 0x6F 0x70 0x79 0x69 0x6E // '??Copyin' 0x67 0x20 0x26 0x20 0x70 0x61 0x73 0x74 // 'g & past' 0x69 0x6E 0x67 0x20 0x77 0x6F 0x72 0x64 // 'ing word' 0x73 0x2D 0x2D 0x57 0x68 0x61 0x74 0x20 // 's--What ' 0x6E 0x65 0x78 0x74 0x3F 0x0D 0x0A 0x01 // 'next????' 0x20 0x55 0x6E 0x64 0x6F // ' Undo' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2B= ktpcHowToWords2B #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2B, __HELP_NAME("CO 1) To copy & paste entire")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2B, __HELP_NAME("CO 1) To copy & paste entire")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidCutCopyPaste kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTWords2B ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_43=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2B, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToWords2B" ITEM "kgobHowtoSequence" ITEM "kidCutCopyPaste" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords2B" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_43=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2B, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1F=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_43, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords52 __HELP_SYMBOL( STN "ktpcHowToWords52" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_43=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_43, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x12 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x8F 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x24 0x00 0x00 0x03 // '???$???' 0x00 0x00 0x00 0x00 0x26 0x00 0x00 0x03 // '????&???' 0x0F 0x00 0x00 0xFD 0x6D 0x00 0x00 0x03 // '???m???' 0x00 0x00 0x00 0x00 0x76 0x00 0x00 0x03 // '????v???' 0x0A 0x00 0x00 0xFD 0x8E 0x00 0x00 0x03 // '??????' 0x0F 0x00 0x00 0xFD 0x8F 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x28 0x00 0x00 0x04 // '????(???' 0x0D 0x00 0x00 0xFE 0x37 0x00 0x00 0x04 // '???7???' 0x00 0x00 0x00 0x00 0x28 0x00 0x00 0x40 // '????(??@' 0x03 0x00 0x00 0x00 0x37 0x00 0x00 0x40 // '????7??@' 0x00 0x00 0x00 0x00 0x26 0x00 0x00 0x80 // '????&??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x6A 0x00 0x00 0x82 // '????j??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_43=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_43, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x63 0x6F 0x70 // '??To cop' 0x79 0x20 0x61 0x6E 0x64 0x20 0x70 0x61 // 'y and pa' 0x73 0x74 0x65 0x20 0x61 0x6E 0x20 0x65 // 'ste an e' 0x6E 0x74 0x69 0x72 0x65 0x20 0x77 0x6F // 'ntire wo' 0x72 0x64 0x20 0x62 0x6F 0x78 0x0D 0x0A // 'rd box??' 0x31 0x09 0x47 0x6F 0x20 0x74 0x6F 0x20 // '1?Go to ' 0x74 0x68 0x65 0x20 0x70 0x6C 0x61 0x63 // 'the plac' 0x65 0x20 0x69 0x6E 0x20 0x79 0x6F 0x75 // 'e in you' 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 0x20 // 'r movie ' 0x77 0x68 0x65 0x72 0x65 0x20 0x79 0x6F // 'where yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 // 'u want t' 0x6F 0x20 0x63 0x6F 0x70 0x79 0x20 0x61 // 'o copy a' 0x20 0x77 0x6F 0x72 0x64 0x20 0x62 0x6F // ' word bo' 0x78 0x2E 0x0D 0x0A 0x32 0x09 0x43 0x6C // 'x.??2?Cl' 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 // 'ick the ' 0x43 0x75 0x74 0x2C 0x20 0x43 0x6F 0x70 // 'Cut, Cop' 0x79 0x2C 0x20 0x26 0x20 0x50 0x61 0x73 // 'y, & Pas' 0x74 0x65 0x20 0x54 0x6F 0x6F 0x6C 0x73 // 'te Tools' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2C= ktpcHowToWords2C #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2C, __HELP_NAME("CO 2) Click Copy 2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2C, __HELP_NAME("CO 2) Click Copy 2")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidCCPCopy kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTWords2C ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_30=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2C, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToWords2C" ITEM "kgobHowtoSequence" ITEM "kidCCPCopy" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords2C" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_30=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x3F 0x00 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_30=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_30, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0B 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0A 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_30=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_30, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x43 0x6F 0x70 0x79 0x2E // 'Copy.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2D= ktpcHowToWords2D #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2D, __HELP_NAME("CO 3) Click the wb you want")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2D, __HELP_NAME("CO 3) Click the wb you want")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTWords2D ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_21=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2D, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToWords2D" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords2D" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_21=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x97 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_21=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_21, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2E 0x00 0x00 0x01 // '????.???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x2E 0x00 0x00 0x03 // '???.???' 0x00 0x00 0x00 0x00 0x28 0x00 0x00 0x40 // '????(??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_21=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_21, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x61 0x20 0x73 0x69 0x64 0x65 0x20 0x6F // 'a side o' 0x66 0x20 0x74 0x68 0x65 0x20 0x77 0x6F // 'f the wo' 0x72 0x64 0x20 0x62 0x6F 0x78 0x20 0x79 // 'rd box y' 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 // 'ou want ' 0x74 0x6F 0x20 0x63 0x6F 0x70 0x79 0x2E // 'to copy.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2E= ktpcHowToWords2E #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2E, __HELP_NAME("CO 4) To paste 2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2E, __HELP_NAME("CO 4) To paste 2")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidCutCopyPaste kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTWords2E ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_45=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2E, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToWords2E" ITEM "kgobHowtoSequence" ITEM "kidCutCopyPaste" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords2E" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_45=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2E, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_30=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_45, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords52 __HELP_SYMBOL( STN "ktpcHowToWords52" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_45=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_45, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x12 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x76 0x00 0x00 0x01 // '????v???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x08 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x0A 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x53 0x00 0x00 0x03 // '???S???' 0x00 0x00 0x00 0x00 0x5D 0x00 0x00 0x03 // '????]???' 0x0A 0x00 0x00 0xFD 0x75 0x00 0x00 0x03 // '???u???' 0x0F 0x00 0x00 0xFD 0x76 0x00 0x00 0x03 // '???v???' 0x00 0x00 0x00 0x00 0x0C 0x00 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x1B 0x00 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x0C 0x00 0x00 0x40 // '???????@' 0x03 0x00 0x00 0x00 0x1B 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x0A 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x51 0x00 0x00 0x82 // '????Q??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_45=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_45, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x70 0x61 0x73 // '??To pas' 0x74 0x65 0x0D 0x0A 0x31 0x09 0x47 0x6F // 'te??1?Go' 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 // ' to the ' 0x70 0x6C 0x61 0x63 0x65 0x20 0x69 0x6E // 'place in' 0x20 0x79 0x6F 0x75 0x72 0x20 0x6D 0x6F // ' your mo' 0x76 0x69 0x65 0x20 0x77 0x68 0x65 0x72 // 'vie wher' 0x65 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 // 'e you wa' 0x6E 0x74 0x20 0x74 0x6F 0x20 0x70 0x61 // 'nt to pa' 0x73 0x74 0x65 0x20 0x74 0x68 0x65 0x20 // 'ste the ' 0x77 0x6F 0x72 0x64 0x20 0x62 0x6F 0x78 // 'word box' 0x2E 0x0D 0x0A 0x32 0x09 0x43 0x6C 0x69 // '.??2?Cli' 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 0x43 // 'ck the C' 0x75 0x74 0x2C 0x20 0x43 0x6F 0x70 0x79 // 'ut, Copy' 0x2C 0x20 0x26 0x20 0x50 0x61 0x73 0x74 // ', & Past' 0x65 0x20 0x54 0x6F 0x6F 0x6C 0x73 0x2E // 'e Tools.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2F= ktpcHowToWords2F #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2F, __HELP_NAME("CO 5) Click Paste")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2F, __HELP_NAME("CO 5) Click Paste")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidCCPPaste kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTWords2F ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_29=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2F, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToWords2F" ITEM "kgobHowtoSequence" ITEM "kidCCPPaste" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords2F" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_29=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x4A 0x00 0x00 0x00 // '????J???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_29=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_29, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0C 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0B 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x0C 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x0C 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_29=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_29, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x50 0x61 0x73 0x74 0x65 0x2E // 'Paste.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_30= ktpcHowToWords30 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_30, __HELP_NAME("Copy word box---What Next?")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_30, __HELP_NAME("Copy word box---What Next?")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTWords30 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_30, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToWords30" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords30" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_30, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA1 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_14=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3C, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToWords45 __HELP_SYMBOL( STN "ktpcHowToWords45" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords44 __HELP_SYMBOL( STN "ktpcHowToWords44" ) ITEM LONG 0xC0000002 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_3C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0E 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x30 0x00 0x00 0x01 // '????0???' 0x00 0x00 0x00 0x00 0x32 0x00 0x00 0x01 // '????2???' 0x01 0x00 0x00 0x00 0x76 0x00 0x00 0x01 // '????v???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x30 0x00 0x00 0x03 // '???0???' 0x00 0x00 0x00 0x00 0x5B 0x00 0x00 0x40 // '????[??@' 0x03 0x00 0x00 0x00 0x61 0x00 0x00 0x40 // '????a??@' 0x00 0x00 0x00 0x00 0x63 0x00 0x00 0x40 // '????c??@' 0x02 0x00 0x00 0x00 0x76 0x00 0x00 0x40 // '????v??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x5B 0x00 0x00 0x82 // '????[??' 0x00 0x00 0x00 0x00 0x5B 0x00 0x00 0xC0 // '????[??' 0x04 0x00 0x00 0x00 0x63 0x00 0x00 0xC0 // '????c??' 0x04 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3C, 0x0) BYTE 0x03 0x03 0x43 0x6F 0x70 0x79 0x69 0x6E // '??Copyin' 0x67 0x20 0x26 0x20 0x70 0x61 0x73 0x74 // 'g & past' 0x69 0x6E 0x67 0x20 0x61 0x6E 0x20 0x65 // 'ing an e' 0x6E 0x74 0x69 0x72 0x65 0x20 0x77 0x6F // 'ntire wo' 0x72 0x64 0x20 0x62 0x6F 0x78 0x2D 0x2D // 'rd box--' 0x57 0x68 0x61 0x74 0x20 0x6E 0x65 0x78 // 'What nex' 0x74 0x3F 0x0D 0x0A 0x54 0x68 0x65 0x20 // 't???The ' 0x77 0x6F 0x72 0x64 0x20 0x62 0x6F 0x78 // 'word box' 0x20 0x69 0x73 0x20 0x70 0x61 0x73 0x74 // ' is past' 0x65 0x64 0x20 0x69 0x6E 0x20 0x79 0x6F // 'ed in yo' 0x75 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 // 'ur movie' 0x2E 0x20 0x20 0x0D 0x0A 0x01 0x20 0x55 // '. ??? U' 0x6E 0x64 0x6F 0x0D 0x0A 0x01 0x20 0x4D // 'ndo??? M' 0x6F 0x76 0x69 0x6E 0x67 0x20 0x61 0x20 // 'oving a ' 0x77 0x6F 0x72 0x64 0x20 0x62 0x6F 0x78 // 'word box' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_31= ktpcHowToWords31 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_31, __HELP_NAME("CO 1) To cut & paste")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_31, __HELP_NAME("CO 1) To cut & paste")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidCutCopyPaste kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTWords31 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_24=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_31, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToWords31" ITEM "kgobHowtoSequence" ITEM "kidCutCopyPaste" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords31" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_24=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_31, 0x0) BYTE 0x01 0x00 0x03 0x03 0xDF 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_15=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_24, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords52 __HELP_SYMBOL( STN "ktpcHowToWords52" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_24=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_24, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x12 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x88 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x24 0x00 0x00 0x03 // '???$???' 0x00 0x00 0x00 0x00 0x26 0x00 0x00 0x03 // '????&???' 0x0F 0x00 0x00 0xFD 0x66 0x00 0x00 0x03 // '???f???' 0x00 0x00 0x00 0x00 0x6F 0x00 0x00 0x03 // '????o???' 0x0A 0x00 0x00 0xFD 0x87 0x00 0x00 0x03 // '??????' 0x0F 0x00 0x00 0xFD 0x88 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x28 0x00 0x00 0x04 // '????(???' 0x0D 0x00 0x00 0xFE 0x37 0x00 0x00 0x04 // '???7???' 0x00 0x00 0x00 0x00 0x28 0x00 0x00 0x40 // '????(??@' 0x03 0x00 0x00 0x00 0x37 0x00 0x00 0x40 // '????7??@' 0x00 0x00 0x00 0x00 0x26 0x00 0x00 0x80 // '????&??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x63 0x00 0x00 0x82 // '????c??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_24=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_24, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x63 0x75 0x74 // '??To cut' 0x20 0x61 0x6E 0x64 0x20 0x70 0x61 0x73 // ' and pas' 0x74 0x65 0x20 0x77 0x6F 0x72 0x64 0x73 // 'te words' 0x20 0x69 0x6E 0x20 0x61 0x20 0x77 0x6F // ' in a wo' 0x72 0x64 0x20 0x62 0x6F 0x78 0x0D 0x0A // 'rd box??' 0x31 0x09 0x47 0x6F 0x20 0x74 0x6F 0x20 // '1?Go to ' 0x74 0x68 0x65 0x20 0x70 0x6C 0x61 0x63 // 'the plac' 0x65 0x20 0x69 0x6E 0x20 0x79 0x6F 0x75 // 'e in you' 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 0x20 // 'r movie ' 0x77 0x68 0x65 0x72 0x65 0x20 0x79 0x6F // 'where yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 // 'u want t' 0x6F 0x20 0x63 0x75 0x74 0x20 0x77 0x6F // 'o cut wo' 0x72 0x64 0x73 0x0D 0x0A 0x32 0x09 0x43 // 'rds??2?C' 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 // 'lick the' 0x20 0x43 0x75 0x74 0x2C 0x20 0x43 0x6F // ' Cut, Co' 0x70 0x79 0x2C 0x20 0x26 0x20 0x50 0x61 // 'py, & Pa' 0x73 0x74 0x65 0x20 0x54 0x6F 0x6F 0x6C // 'ste Tool' 0x73 0x2E // 's.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_32= ktpcHowToWords32 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_32, __HELP_NAME("CO 2) Click Cut")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_32, __HELP_NAME("CO 2) Click Cut")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidCCPCut kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTWords32 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_31=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_32, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToWords32" ITEM "kgobHowtoSequence" ITEM "kidCCPCut" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords32" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_31=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_32, 0x0) BYTE 0x01 0x00 0x03 0x03 0x3B 0x00 0x00 0x00 // '????;???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_31=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_31, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x05 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x07 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0B 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x07 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0A 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_31=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_31, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x20 0x43 0x75 0x74 0x2E // ' Cut.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_33= ktpcHowToWords33 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_33, __HELP_NAME("CO 3) Drag the mouse 2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_33, __HELP_NAME("CO 3) Drag the mouse 2")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTWords33 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_27=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_33, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToWords33" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords33" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_27=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_33, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC1 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_11=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_27, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords50 __HELP_SYMBOL( STN "ktpcHowToWords50" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_27=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_27, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x3D 0x00 0x00 0x01 // '????=???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x3D 0x00 0x00 0x03 // '???=???' 0x00 0x00 0x00 0x00 0x0F 0x00 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x13 0x00 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x0F 0x00 0x00 0x40 // '???????@' 0x02 0x00 0x00 0x00 0x13 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_27=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_27, 0x0) BYTE 0x03 0x03 0x49 0x6E 0x20 0x61 0x20 0x77 // '??In a w' 0x6F 0x72 0x64 0x20 0x62 0x6F 0x78 0x2C // 'ord box,' 0x20 0x64 0x72 0x61 0x67 0x20 0x74 0x68 // ' drag th' 0x65 0x20 0x6D 0x6F 0x75 0x73 0x65 0x20 // 'e mouse ' 0x6F 0x76 0x65 0x72 0x20 0x74 0x68 0x65 // 'over the' 0x20 0x77 0x6F 0x72 0x64 0x73 0x20 0x79 // ' words y' 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 // 'ou want ' 0x74 0x6F 0x20 0x63 0x75 0x74 0x2E // 'to cut.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_34= ktpcHowToWords34 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_34, __HELP_NAME("CO 4) To paste")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_34, __HELP_NAME("CO 4) To paste")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidCutCopyPaste kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTWords34 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_26=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_34, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToWords34" ITEM "kgobHowtoSequence" ITEM "kidCutCopyPaste" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords34" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_26=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_34, 0x0) BYTE 0x01 0x00 0x03 0x03 0xEB 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1B=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_26, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords52 __HELP_SYMBOL( STN "ktpcHowToWords52" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_26=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_26, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x10 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x74 0x00 0x00 0x01 // '????t???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x09 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x5B 0x00 0x00 0x03 // '????[???' 0x0A 0x00 0x00 0xFD 0x73 0x00 0x00 0x03 // '???s???' 0x0F 0x00 0x00 0xFD 0x74 0x00 0x00 0x03 // '???t???' 0x00 0x00 0x00 0x00 0x1B 0x00 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x2A 0x00 0x00 0x04 // '???*???' 0x00 0x00 0x00 0x00 0x1B 0x00 0x00 0x40 // '???????@' 0x03 0x00 0x00 0x00 0x2A 0x00 0x00 0x40 // '????*??@' 0x00 0x00 0x00 0x00 0x0B 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x4F 0x00 0x00 0x82 // '????O??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_26=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_26, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x20 0x70 0x61 // '??To pa' 0x73 0x74 0x65 0x0D 0x0A 0x31 0x09 0x49 // 'ste??1?I' 0x66 0x20 0x6E 0x65 0x63 0x65 0x73 0x73 // 'f necess' 0x61 0x72 0x79 0x2C 0x20 0x67 0x6F 0x20 // 'ary, go ' 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 0x70 // 'to the p' 0x6C 0x61 0x63 0x65 0x20 0x77 0x68 0x65 // 'lace whe' 0x72 0x65 0x20 0x79 0x6F 0x75 0x20 0x77 // 're you w' 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 0x70 // 'ant to p' 0x61 0x73 0x74 0x65 0x20 0x74 0x68 0x65 // 'aste the' 0x20 0x77 0x6F 0x72 0x64 0x73 0x2E 0x0D // ' words.?' 0x0A 0x32 0x09 0x43 0x6C 0x69 0x63 0x6B // '?2?Click' 0x20 0x74 0x68 0x65 0x20 0x43 0x75 0x74 // ' the Cut' 0x2C 0x20 0x43 0x6F 0x70 0x79 0x2C 0x20 // ', Copy, ' 0x26 0x20 0x50 0x61 0x73 0x74 0x65 0x20 // '& Paste ' 0x54 0x6F 0x6F 0x6C 0x73 0x2E // 'Tools.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_35= ktpcHowToWords35 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_35, __HELP_NAME("CO 5) Click Paste 2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_35, __HELP_NAME("CO 5) Click Paste 2")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidCCPPaste kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTWords35 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_35=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_35, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToWords35" ITEM "kgobHowtoSequence" ITEM "kidCCPPaste" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords35" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_35=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_35, 0x0) BYTE 0x01 0x00 0x03 0x03 0x46 0x00 0x00 0x00 // '????F???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_35=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_35, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0C 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0B 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x0C 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x0C 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_35=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_35, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x50 0x61 0x73 0x74 0x65 0x2E // 'Paste.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_36= ktpcHowToWords36 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_36, __HELP_NAME("CO 6) Click where you want 2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_36, __HELP_NAME("CO 6) Click where you want 2")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTWords36 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_36, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToWords36" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords36" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_36, 0x0) BYTE 0x01 0x00 0x03 0x03 0xAF 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_3F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x37 0x00 0x00 0x01 // '????7???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x37 0x00 0x00 0x03 // '???7???' 0x00 0x00 0x00 0x00 0x37 0x00 0x00 0x40 // '????7??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3F, 0x0) BYTE 0x03 0x03 0x49 0x6E 0x20 0x61 0x20 0x77 // '??In a w' 0x6F 0x72 0x64 0x20 0x62 0x6F 0x78 0x2C // 'ord box,' 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 0x77 // ' click w' 0x68 0x65 0x72 0x65 0x20 0x79 0x6F 0x75 // 'here you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F // ' want to' 0x20 0x70 0x61 0x73 0x74 0x65 0x20 0x74 // ' paste t' 0x68 0x65 0x20 0x77 0x6F 0x72 0x64 0x73 // 'he words' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_37= ktpcHowToWords37 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_37, __HELP_NAME("Cut words--What Next?")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_37, __HELP_NAME("Cut words--What Next?")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTWords37 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_37, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToWords37" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords37" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_37, 0x0) BYTE 0x01 0x00 0x03 0x03 0x97 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1C=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2B, 0x0) AG(4) FREE ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords44 __HELP_SYMBOL( STN "ktpcHowToWords44" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_2B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x31 0x00 0x00 0x01 // '????1???' 0x00 0x00 0x00 0x00 0x33 0x00 0x00 0x01 // '????3???' 0x01 0x00 0x00 0x00 0x39 0x00 0x00 0x01 // '????9???' 0x00 0x00 0x00 0x00 0x39 0x00 0x00 0x02 // '????9???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x31 0x00 0x00 0x03 // '???1???' 0x00 0x00 0x00 0x00 0x33 0x00 0x00 0x40 // '????3??@' 0x03 0x00 0x00 0x00 0x39 0x00 0x00 0x40 // '????9??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x33 0x00 0x00 0x82 // '????3??' 0x00 0x00 0x00 0x00 0x33 0x00 0x00 0xC0 // '????3??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2B, 0x0) BYTE 0x03 0x03 0x43 0x75 0x74 0x74 0x69 0x6E // '??Cuttin' 0x67 0x20 0x26 0x20 0x70 0x61 0x73 0x74 // 'g & past' 0x69 0x6E 0x67 0x20 0x77 0x6F 0x72 0x64 // 'ing word' 0x73 0x20 0x69 0x6E 0x20 0x61 0x20 0x77 // 's in a w' 0x6F 0x72 0x64 0x20 0x62 0x6F 0x78 0x2D // 'ord box-' 0x2D 0x57 0x68 0x61 0x74 0x20 0x6E 0x65 // '-What ne' 0x78 0x74 0x3F 0x0D 0x0A 0x01 0x20 0x55 // 'xt???? U' 0x6E 0x64 0x6F // 'ndo' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_38= ktpcHowToWords38 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_38, __HELP_NAME("CO 1) To cut & paste entire")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_38, __HELP_NAME("CO 1) To cut & paste entire")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidCutCopyPaste kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTWords38 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_38=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_38, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToWords38" ITEM "kgobHowtoSequence" ITEM "kidCutCopyPaste" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords38" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_38=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_38, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1D=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_38, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords52 __HELP_SYMBOL( STN "ktpcHowToWords52" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_38=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_38, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x12 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x8D 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x23 0x00 0x00 0x03 // '???#???' 0x00 0x00 0x00 0x00 0x25 0x00 0x00 0x03 // '????%???' 0x0F 0x00 0x00 0xFD 0x6B 0x00 0x00 0x03 // '???k???' 0x00 0x00 0x00 0x00 0x74 0x00 0x00 0x03 // '????t???' 0x0A 0x00 0x00 0xFD 0x8C 0x00 0x00 0x03 // '??????' 0x0F 0x00 0x00 0xFD 0x8D 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x27 0x00 0x00 0x04 // '????'???' 0x0D 0x00 0x00 0xFE 0x36 0x00 0x00 0x04 // '???6???' 0x00 0x00 0x00 0x00 0x27 0x00 0x00 0x40 // '????'??@' 0x03 0x00 0x00 0x00 0x36 0x00 0x00 0x40 // '????6??@' 0x00 0x00 0x00 0x00 0x25 0x00 0x00 0x80 // '????%??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x68 0x00 0x00 0x82 // '????h??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_38=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_38, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x63 0x75 0x74 // '??To cut' 0x20 0x61 0x6E 0x64 0x20 0x70 0x61 0x73 // ' and pas' 0x74 0x65 0x20 0x61 0x6E 0x20 0x65 0x6E // 'te an en' 0x74 0x69 0x72 0x65 0x20 0x77 0x6F 0x72 // 'tire wor' 0x64 0x20 0x62 0x6F 0x78 0x0D 0x0A 0x31 // 'd box??1' 0x09 0x47 0x6F 0x20 0x74 0x6F 0x20 0x74 // '?Go to t' 0x68 0x65 0x20 0x70 0x6C 0x61 0x63 0x65 // 'he place' 0x20 0x69 0x6E 0x20 0x79 0x6F 0x75 0x72 // ' in your' 0x20 0x6D 0x6F 0x76 0x69 0x65 0x20 0x77 // ' movie w' 0x68 0x65 0x72 0x65 0x20 0x79 0x6F 0x75 // 'here you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F // ' want to' 0x20 0x63 0x75 0x74 0x20 0x61 0x20 0x77 // ' cut a w' 0x6F 0x72 0x64 0x20 0x62 0x6F 0x78 0x2E // 'ord box.' 0x0D 0x0A 0x32 0x09 0x43 0x6C 0x69 0x63 // '??2?Clic' 0x6B 0x20 0x74 0x68 0x65 0x20 0x43 0x75 // 'k the Cu' 0x74 0x2C 0x20 0x43 0x6F 0x70 0x79 0x2C // 't, Copy,' 0x20 0x26 0x20 0x50 0x61 0x73 0x74 0x65 // ' & Paste' 0x20 0x54 0x6F 0x6F 0x6C 0x73 0x2E // ' Tools.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_39= ktpcHowToWords39 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_39, __HELP_NAME("CO 2) Click Cut 2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_39, __HELP_NAME("CO 2) Click Cut 2")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidCCPCut kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTWords39 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_39, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToWords39" ITEM "kgobHowtoSequence" ITEM "kidCCPCut" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords39" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_39, 0x0) BYTE 0x01 0x00 0x03 0x03 0x38 0x00 0x00 0x00 // '????8???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0A 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x09 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2F, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x43 0x75 0x74 0x2E // 'Cut.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3A= ktpcHowToWords3A #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3A, __HELP_NAME("CO 3) Click the wb you want 2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3A, __HELP_NAME("CO 3) Click the wb you want 2")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTWords3A ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3A, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToWords3A" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords3A" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x90 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_3A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2D 0x00 0x00 0x01 // '????-???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x2D 0x00 0x00 0x03 // '???-???' 0x00 0x00 0x00 0x00 0x28 0x00 0x00 0x40 // '????(??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3A, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x61 0x20 0x73 0x69 0x64 0x65 0x20 0x6F // 'a side o' 0x66 0x20 0x74 0x68 0x65 0x20 0x77 0x6F // 'f the wo' 0x72 0x64 0x20 0x62 0x6F 0x78 0x20 0x79 // 'rd box y' 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 // 'ou want ' 0x74 0x6F 0x20 0x63 0x75 0x74 0x2E // 'to cut.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3B= ktpcHowToWords3B #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3B, __HELP_NAME("CO 4) To paste 3")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3B, __HELP_NAME("CO 4) To paste 3")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidCutCopyPaste kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTWords3B ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3B, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToWords3B" ITEM "kgobHowtoSequence" ITEM "kidCutCopyPaste" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords3B" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3B, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_23=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3B, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords52 __HELP_SYMBOL( STN "ktpcHowToWords52" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_3B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x12 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x76 0x00 0x00 0x01 // '????v???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x08 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x0A 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x54 0x00 0x00 0x03 // '???T???' 0x00 0x00 0x00 0x00 0x5D 0x00 0x00 0x03 // '????]???' 0x0A 0x00 0x00 0xFD 0x75 0x00 0x00 0x03 // '???u???' 0x0F 0x00 0x00 0xFD 0x76 0x00 0x00 0x03 // '???v???' 0x00 0x00 0x00 0x00 0x0C 0x00 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x1B 0x00 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x0C 0x00 0x00 0x40 // '???????@' 0x02 0x00 0x00 0x00 0x1B 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x0A 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x51 0x00 0x00 0x82 // '????Q??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3B, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x70 0x61 0x73 // '??To pas' 0x74 0x65 0x0D 0x0A 0x31 0x09 0x47 0x6F // 'te??1?Go' 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 // ' to the ' 0x70 0x6C 0x61 0x63 0x65 0x20 0x69 0x6E // 'place in' 0x20 0x79 0x6F 0x75 0x72 0x20 0x6D 0x6F // ' your mo' 0x76 0x69 0x65 0x20 0x77 0x68 0x65 0x72 // 'vie wher' 0x65 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 // 'e you wa' 0x6E 0x74 0x20 0x74 0x6F 0x20 0x70 0x61 // 'nt to pa' 0x73 0x74 0x65 0x20 0x74 0x68 0x65 0x20 // 'ste the ' 0x77 0x6F 0x72 0x64 0x20 0x62 0x6F 0x78 // 'word box' 0x2E 0x0D 0x0A 0x32 0x09 0x43 0x6C 0x69 // '.??2?Cli' 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 0x43 // 'ck the C' 0x75 0x74 0x2C 0x20 0x43 0x6F 0x70 0x79 // 'ut, Copy' 0x2C 0x20 0x26 0x20 0x50 0x61 0x73 0x74 // ', & Past' 0x65 0x20 0x54 0x6F 0x6F 0x6C 0x73 0x2E // 'e Tools.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3C= ktpcHowToWords3C #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3C, __HELP_NAME("CO 5) Go to the place")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3C, __HELP_NAME("CO 5) Go to the place")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidCCPPaste kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTWords3C ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3C, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToWords3C" ITEM "kgobHowtoSequence" ITEM "kidCCPPaste" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords3C" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x44 0x00 0x00 0x00 // '????D???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_4=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0C 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0B 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x0C 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x0C 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x50 0x61 0x73 0x74 0x65 0x2E // 'Paste.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3D= ktpcHowToWords3D #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3D, __HELP_NAME("Cut word box---What Next?")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3D, __HELP_NAME("Cut word box---What Next?")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTWords3D ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3D, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToWords3D" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords3D" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3D, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA1 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_10=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2E, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 2 LONG ktpcHowToWords45 __HELP_SYMBOL( STN "ktpcHowToWords45" ) ITEM LONG 0xC0000002 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords44 __HELP_SYMBOL( STN "ktpcHowToWords44" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_2E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0E 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x30 0x00 0x00 0x01 // '????0???' 0x00 0x00 0x00 0x00 0x32 0x00 0x00 0x01 // '????2???' 0x01 0x00 0x00 0x00 0x74 0x00 0x00 0x01 // '????t???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x30 0x00 0x00 0x03 // '???0???' 0x00 0x00 0x00 0x00 0x59 0x00 0x00 0x40 // '????Y??@' 0x04 0x00 0x00 0x00 0x5F 0x00 0x00 0x40 // '????_??@' 0x00 0x00 0x00 0x00 0x61 0x00 0x00 0x40 // '????a??@' 0x01 0x00 0x00 0x00 0x74 0x00 0x00 0x40 // '????t??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x59 0x00 0x00 0x82 // '????Y??' 0x00 0x00 0x00 0x00 0x59 0x00 0x00 0xC0 // '????Y??' 0x02 0x00 0x00 0x00 0x61 0x00 0x00 0xC0 // '????a??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2E, 0x0) BYTE 0x03 0x03 0x43 0x75 0x74 0x74 0x69 0x6E // '??Cuttin' 0x67 0x20 0x26 0x20 0x70 0x61 0x73 0x74 // 'g & past' 0x69 0x6E 0x67 0x20 0x61 0x6E 0x20 0x65 // 'ing an e' 0x6E 0x74 0x69 0x72 0x65 0x20 0x77 0x6F // 'ntire wo' 0x72 0x64 0x20 0x62 0x6F 0x78 0x2D 0x2D // 'rd box--' 0x57 0x68 0x61 0x74 0x20 0x6E 0x65 0x78 // 'What nex' 0x74 0x3F 0x0D 0x0A 0x54 0x68 0x65 0x20 // 't???The ' 0x77 0x6F 0x72 0x64 0x20 0x62 0x6F 0x78 // 'word box' 0x20 0x69 0x73 0x20 0x70 0x61 0x73 0x74 // ' is past' 0x65 0x64 0x20 0x69 0x6E 0x20 0x79 0x6F // 'ed in yo' 0x75 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 // 'ur movie' 0x2E 0x0D 0x0A 0x01 0x20 0x55 0x6E 0x64 // '.??? Und' 0x6F 0x0D 0x0A 0x01 0x20 0x4D 0x6F 0x76 // 'o??? Mov' 0x69 0x6E 0x67 0x20 0x61 0x20 0x77 0x6F // 'ing a wo' 0x72 0x64 0x20 0x62 0x6F 0x78 // 'rd box' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3E= ktpcHowToWords3E #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3E, __HELP_NAME("CO 1) To remove word box")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3E, __HELP_NAME("CO 1) To remove word box")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidCutCopyPaste kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTWords3E ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_0=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3E, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToWords3E" ITEM "kgobHowtoSequence" ITEM "kidCutCopyPaste" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords3E" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_0=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x3E 0x01 0x00 0x00 // '????>???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_6=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords52 __HELP_SYMBOL( STN "ktpcHowToWords52" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_0=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x12 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xA2 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x33 0x00 0x00 0x03 // '???3???' 0x00 0x00 0x00 0x00 0x35 0x00 0x00 0x03 // '????5???' 0x0F 0x00 0x00 0xFD 0x7D 0x00 0x00 0x03 // '???}???' 0x00 0x00 0x00 0x00 0x89 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xA1 0x00 0x00 0x03 // '??????' 0x0F 0x00 0x00 0xFD 0xA2 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x37 0x00 0x00 0x04 // '????7???' 0x0D 0x00 0x00 0xFE 0x46 0x00 0x00 0x04 // '???F???' 0x00 0x00 0x00 0x00 0x37 0x00 0x00 0x40 // '????7??@' 0x02 0x00 0x00 0x00 0x46 0x00 0x00 0x40 // '????F??@' 0x00 0x00 0x00 0x00 0x35 0x00 0x00 0x80 // '????5??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x7D 0x00 0x00 0x82 // '????}??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_0=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x72 0x65 0x6D // '??To rem' 0x6F 0x76 0x65 0x20 0x61 0x6E 0x20 0x65 // 'ove an e' 0x6E 0x74 0x69 0x72 0x65 0x20 0x77 0x6F // 'ntire wo' 0x72 0x64 0x20 0x62 0x6F 0x78 0x20 0x66 // 'rd box f' 0x72 0x6F 0x6D 0x20 0x74 0x68 0x65 0x20 // 'rom the ' 0x63 0x75 0x72 0x72 0x65 0x6E 0x74 0x20 // 'current ' 0x73 0x63 0x65 0x6E 0x65 0x0D 0x0A 0x31 // 'scene??1' 0x09 0x47 0x6F 0x20 0x74 0x6F 0x20 0x74 // '?Go to t' 0x68 0x65 0x20 0x70 0x6C 0x61 0x63 0x65 // 'he place' 0x20 0x69 0x6E 0x20 0x79 0x6F 0x75 0x72 // ' in your' 0x20 0x6D 0x6F 0x76 0x69 0x65 0x20 0x77 // ' movie w' 0x68 0x65 0x72 0x65 0x20 0x79 0x6F 0x75 // 'here you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F // ' want to' 0x20 0x72 0x65 0x6D 0x6F 0x76 0x65 0x20 // ' remove ' 0x74 0x68 0x65 0x20 0x77 0x6F 0x72 0x64 // 'the word' 0x20 0x62 0x6F 0x78 0x2E 0x0D 0x0A 0x32 // ' box.??2' 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 0x74 // '?Click t' 0x68 0x65 0x20 0x43 0x75 0x74 0x2C 0x20 // 'he Cut, ' 0x43 0x6F 0x70 0x79 0x2C 0x20 0x26 0x20 // 'Copy, & ' 0x50 0x61 0x73 0x74 0x65 0x20 0x54 0x6F // 'Paste To' 0x6F 0x6C 0x73 0x2E // 'ols.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3F= ktpcHowToWords3F #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3F, __HELP_NAME("CO 2) Click Remove Word ")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3F, __HELP_NAME("CO 2) Click Remove Word ")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence kidCCPActorNuke kidPlayHelpSounds 0x0 0x0 0x57415645 kwavHTWords3F ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3F, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToWords3F" ITEM "kgobHowtoSequence" ITEM "kidCCPActorNuke" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords3F" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x8E 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x16 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x15 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2C, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x52 0x65 0x6D 0x6F 0x76 0x65 0x20 0x57 // 'Remove W' 0x6F 0x72 0x64 0x20 0x42 0x6F 0x78 0x2E // 'ord Box.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_40= ktpcHowToWords40 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_40, __HELP_NAME("CO 3) Click the word box ")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_40, __HELP_NAME("CO 3) Click the word box ")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0x6E 0x57415645 kwavHTWords40 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_23=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_40, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcHowToWords40" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords40" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_23=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_40, 0x0) BYTE 0x01 0x00 0x03 0x03 0x88 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_23=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_23, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2A 0x00 0x00 0x01 // '????*???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_23=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_23, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x77 0x6F 0x72 0x64 // 'the word' 0x20 0x62 0x6F 0x78 0x20 0x79 0x6F 0x75 // ' box you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F // ' want to' 0x20 0x67 0x65 0x74 0x20 0x72 0x69 0x64 // ' get rid' 0x20 0x6F 0x66 0x2E // ' of.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_41= ktpcHowToWords41 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_41, __HELP_NAME("Remove word box---What Next?")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_41, __HELP_NAME("Remove word box---What Next?")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobHowtoSequence 0x0 kidPlayHelpSounds 0x140 0xF0 0x57415645 kwavHTWords41 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_41, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcHowToWords41" ITEM "kgobHowtoSequence" ITEM "" ITEM "kidPlayHelpSounds" ITEM "kwavHTWords41" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_41, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_C=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1D, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcHowToWords44 __HELP_SYMBOL( STN "ktpcHowToWords44" ) FREE ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_1D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x36 0x00 0x00 0x01 // '????6???' 0x00 0x00 0x00 0x00 0x38 0x00 0x00 0x01 // '????8???' 0x01 0x00 0x00 0x00 0x6F 0x00 0x00 0x01 // '????o???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x36 0x00 0x00 0x03 // '???6???' 0x00 0x00 0x00 0x00 0x67 0x00 0x00 0x40 // '????g??@' 0x00 0x00 0x00 0x00 0x69 0x00 0x00 0x40 // '????i??@' 0x01 0x00 0x00 0x00 0x6F 0x00 0x00 0x40 // '????o??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x69 0x00 0x00 0x82 // '????i??' 0x00 0x00 0x00 0x00 0x69 0x00 0x00 0xC0 // '????i??' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1D, 0x0) BYTE 0x03 0x03 0x52 0x65 0x6D 0x6F 0x76 0x69 // '??Removi' 0x6E 0x67 0x20 0x61 0x20 0x77 0x6F 0x72 // 'ng a wor' 0x64 0x20 0x62 0x6F 0x78 0x20 0x66 0x72 // 'd box fr' 0x6F 0x6D 0x20 0x74 0x68 0x65 0x20 0x63 // 'om the c' 0x75 0x72 0x72 0x65 0x6E 0x74 0x20 0x73 // 'urrent s' 0x63 0x65 0x6E 0x65 0x2D 0x2D 0x57 0x68 // 'cene--Wh' 0x61 0x74 0x20 0x6E 0x65 0x78 0x74 0x3F // 'at next?' 0x0D 0x0A 0x54 0x68 0x65 0x20 0x77 0x6F // '??The wo' 0x72 0x64 0x20 0x62 0x6F 0x78 0x20 0x69 // 'rd box i' 0x73 0x20 0x72 0x65 0x6D 0x6F 0x76 0x65 // 's remove' 0x64 0x20 0x66 0x72 0x6F 0x6D 0x20 0x74 // 'd from t' 0x68 0x65 0x20 0x63 0x75 0x72 0x72 0x65 // 'he curre' 0x6E 0x74 0x20 0x73 0x63 0x65 0x6E 0x65 // 'nt scene' 0x2E 0x0D 0x0A 0x01 0x20 0x55 0x6E 0x64 // '.??? Und' 0x6F // 'o' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_42= ktpcHowToWords42 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_42, __HELP_NAME("Key: Paste")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_42, __HELP_NAME("Key: Paste")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 kwavHTWords42 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_42, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToWords42" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTWords42" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_42, 0x0) BYTE 0x01 0x00 0x03 0x03 0x7E 0x00 0x00 0x00 // '????~???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_19=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1020_bmp __HELP_SYMBOL( STN "helppic1020_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_3=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0D 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0F 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x21 0x00 0x00 0x01 // '????!???' 0x00 0x00 0x00 0x00 0x22 0x00 0x00 0x01 // '????"???' 0x01 0x00 0x00 0x00 0x24 0x00 0x00 0x01 // '????$???' 0x00 0x00 0x00 0x00 0x1D 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x21 0x00 0x00 0x03 // '???!???' 0x00 0x00 0x00 0x00 0x22 0x00 0x00 0x03 // '????"???' 0x0A 0x00 0x00 0xFD 0x23 0x00 0x00 0x03 // '???#???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x11 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x53 0x68 0x6F // '??? Sho' 0x72 0x74 0x63 0x75 0x74 0x20 0x4B 0x65 // 'rtcut Ke' 0x79 0x0D 0x0A 0x95 0x09 0x48 0x6F 0x6C // 'y???Hol' 0x64 0x20 0x64 0x6F 0x77 0x6E 0x20 0x43 // 'd down C' 0x74 0x72 0x6C 0x2B 0x56 0x2E // 'trl+V.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_43= ktpcHowToWords43 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_43, __HELP_NAME("Tip: Change word box size")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_43, __HELP_NAME("Tip: Change word box size")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTWords43 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_5=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_43, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToWords43" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTWords43" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_5=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_43, 0x0) BYTE 0x01 0x00 0x03 0x03 0x0A 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1A=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_5=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0B 0x00 0x00 0x00 0x02 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xF9 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x1C 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x40 0x00 0x00 0x03 // '???@???' 0x0F 0x00 0x00 0xFD 0x44 0x00 0x00 0x03 // '???D???' 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0x80 // '????@??' 0x00 0x00 0x02 0x00 0x84 0x00 0x00 0x80 // '??????' 0x00 0x00 0x03 0x00 0xA5 0x00 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xA5 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_5=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x03 0x03 0x01 0x20 0x43 0x68 0x61 0x6E // '??? Chan' 0x67 0x69 0x6E 0x67 0x20 0x74 0x68 0x65 // 'ging the' 0x20 0x77 0x6F 0x72 0x64 0x20 0x62 0x6F // ' word bo' 0x78 0x20 0x73 0x69 0x7A 0x65 0x0D 0x0A // 'x size??' 0x54 0x6F 0x20 0x63 0x68 0x61 0x6E 0x67 // 'To chang' 0x65 0x20 0x74 0x68 0x65 0x20 0x73 0x69 // 'e the si' 0x7A 0x65 0x20 0x6F 0x66 0x20 0x61 0x20 // 'ze of a ' 0x77 0x6F 0x72 0x64 0x20 0x62 0x6F 0x78 // 'word box' 0x0D 0x0A 0x31 0x09 0x4D 0x6F 0x76 0x65 // '??1?Move' 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 // ' the mou' 0x73 0x65 0x20 0x63 0x75 0x72 0x73 0x6F // 'se curso' 0x72 0x20 0x6F 0x76 0x65 0x72 0x20 0x61 // 'r over a' 0x20 0x77 0x6F 0x72 0x64 0x20 0x62 0x6F // ' word bo' 0x78 0x20 0x68 0x61 0x6E 0x64 0x6C 0x65 // 'x handle' 0x20 0x28 0x61 0x20 0x6C 0x69 0x74 0x74 // ' (a litt' 0x6C 0x65 0x20 0x73 0x71 0x75 0x61 0x72 // 'le squar' 0x65 0x29 0x2E 0x20 0x0D 0x0A 0x54 0x68 // 'e). ??Th' 0x65 0x20 0x63 0x75 0x72 0x73 0x6F 0x72 // 'e cursor' 0x20 0x63 0x68 0x61 0x6E 0x67 0x65 0x73 // ' changes' 0x20 0x74 0x6F 0x20 0x61 0x6E 0x20 0x61 // ' to an a' 0x72 0x72 0x6F 0x77 0x2E 0x0D 0x0A 0x32 // 'rrow.??2' 0x09 0x48 0x6F 0x6C 0x64 0x20 0x64 0x6F // '?Hold do' 0x77 0x6E 0x20 0x74 0x68 0x65 0x20 0x6D // 'wn the m' 0x6F 0x75 0x73 0x65 0x20 0x62 0x75 0x74 // 'ouse but' 0x74 0x6F 0x6E 0x20 0x61 0x6E 0x64 0x20 // 'ton and ' 0x64 0x72 0x61 0x67 0x20 0x74 0x68 0x65 // 'drag the' 0x20 0x68 0x61 0x6E 0x64 0x6C 0x65 0x20 // ' handle ' 0x75 0x6E 0x74 0x69 0x6C 0x20 0x74 0x68 // 'until th' 0x65 0x20 0x62 0x6F 0x78 0x20 0x69 0x73 // 'e box is' 0x20 0x74 0x68 0x65 0x20 0x73 0x69 0x7A // ' the siz' 0x65 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 // 'e you wa' 0x6E 0x74 0x2E // 'nt.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_44= ktpcHowToWords44 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_44, __HELP_NAME("Tip: Undo")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_44, __HELP_NAME("Tip: Undo")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTWords44 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_37=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_44, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToWords44" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTWords44" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_37=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_44, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_24=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_37, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpUndo __HELP_SYMBOL( STN "mbmpUndo" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpRedo __HELP_SYMBOL( STN "mbmpRedo" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_37=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_37, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x12 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0C 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x0E 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2C 0x00 0x00 0x01 // '????,???' 0x00 0x00 0x00 0x00 0x2E 0x00 0x00 0x01 // '????.???' 0x01 0xF1 0x00 0x00 0x3B 0x00 0x00 0x01 // '???;???' 0x01 0x00 0x00 0x00 0x56 0x00 0x00 0x01 // '????V???' 0x01 0xF6 0x00 0x00 0x63 0x00 0x00 0x01 // '???c???' 0x01 0x00 0x00 0x00 0x64 0x00 0x00 0x01 // '????d???' 0x00 0x00 0x00 0x00 0x0E 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x2C 0x00 0x00 0x03 // '???,???' 0x00 0x00 0x00 0x00 0x3E 0x00 0x00 0x03 // '????>???' 0x0A 0x00 0x00 0xFD 0x54 0x00 0x00 0x03 // '???T???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x56 0x00 0x00 0x82 // '????V??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0x3B 0x00 0x00 0xC0 // '????;??' 0x02 0x00 0x00 0x00 0x63 0x00 0x00 0xC0 // '????c??' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_37=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_37, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x55 0x6E 0x64 // '??? Und' 0x6F 0x2F 0x52 0x65 0x64 0x6F 0x0D 0x0A // 'o/Redo??' 0x54 0x6F 0x20 0x75 0x6E 0x64 0x6F 0x20 // 'To undo ' 0x74 0x68 0x65 0x20 0x6C 0x61 0x73 0x74 // 'the last' 0x20 0x74 0x68 0x69 0x6E 0x67 0x20 0x79 // ' thing y' 0x6F 0x75 0x20 0x64 0x69 0x64 0x0D 0x0A // 'ou did??' 0x95 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 // '?Click ' 0x55 0x6E 0x64 0x6F 0x2D 0x01 0x0D 0x0A // 'Undo-???' 0x54 0x6F 0x20 0x72 0x65 0x64 0x6F 0x20 // 'To redo ' 0x77 0x68 0x61 0x74 0x20 0x79 0x6F 0x75 // 'what you' 0x20 0x75 0x6E 0x64 0x69 0x64 0x0D 0x0A // ' undid??' 0x95 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 // '?Click ' 0x52 0x65 0x64 0x6F 0x2D 0x01 // 'Redo-?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_45= ktpcHowToWords45 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_45, __HELP_NAME("Tip: Move word box")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_45, __HELP_NAME("Tip: Move word box")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTWords45 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_48=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_45, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToWords45" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTWords45" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_48=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_45, 0x0) BYTE 0x01 0x00 0x03 0x03 0x1F 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2B=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_48, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_48=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_48, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0D 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xB8 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x03 0x00 0x00 0x03 // '????????' 0x00 0x00 0x00 0x00 0x14 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x2A 0x00 0x00 0x03 // '???*???' 0x0F 0x00 0x00 0xFD 0x2C 0x00 0x00 0x03 // '???,???' 0x00 0x00 0x00 0x00 0xA1 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x2A 0x00 0x00 0x80 // '????*??' 0x00 0x00 0x02 0x00 0x59 0x00 0x00 0x80 // '????Y??' 0x00 0x00 0x03 0x00 0x78 0x00 0x00 0x80 // '????x??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x78 0x00 0x00 0x82 // '????x??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_48=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_48, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x4D 0x6F 0x76 // '??? Mov' 0x69 0x6E 0x67 0x20 0x61 0x20 0x77 0x6F // 'ing a wo' 0x72 0x64 0x20 0x62 0x6F 0x78 0x0D 0x0A // 'rd box??' 0x54 0x6F 0x20 0x6D 0x6F 0x76 0x65 0x20 // 'To move ' 0x61 0x20 0x77 0x6F 0x72 0x64 0x20 0x62 // 'a word b' 0x6F 0x78 0x0D 0x0A 0x31 0x09 0x4D 0x6F // 'ox??1?Mo' 0x76 0x65 0x20 0x74 0x68 0x65 0x20 0x6D // 've the m' 0x6F 0x75 0x73 0x65 0x20 0x63 0x75 0x72 // 'ouse cur' 0x73 0x6F 0x72 0x20 0x6F 0x76 0x65 0x72 // 'sor over' 0x20 0x61 0x20 0x77 0x6F 0x72 0x64 0x20 // ' a word ' 0x62 0x6F 0x78 0x20 0x73 0x69 0x64 0x65 // 'box side' 0x2E 0x0D 0x0A 0x54 0x68 0x65 0x20 0x63 // '.??The c' 0x75 0x72 0x73 0x6F 0x72 0x20 0x63 0x68 // 'ursor ch' 0x61 0x6E 0x67 0x65 0x73 0x20 0x74 0x6F // 'anges to' 0x20 0x61 0x20 0x68 0x61 0x6E 0x64 0x2E // ' a hand.' 0x0D 0x0A 0x32 0x09 0x48 0x6F 0x6C 0x64 // '??2?Hold' 0x20 0x64 0x6F 0x77 0x6E 0x20 0x74 0x68 // ' down th' 0x65 0x20 0x6D 0x6F 0x75 0x73 0x65 0x20 // 'e mouse ' 0x62 0x75 0x74 0x74 0x6F 0x6E 0x20 0x61 // 'button a' 0x6E 0x64 0x20 0x64 0x72 0x61 0x67 0x20 // 'nd drag ' 0x74 0x68 0x65 0x20 0x62 0x6F 0x78 0x20 // 'the box ' 0x77 0x68 0x65 0x72 0x65 0x20 0x79 0x6F // 'where yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 0x69 // 'u want i' 0x74 0x2E // 't.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_46= ktpcHowToWords46 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_46, __HELP_NAME("Tip: Change color")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_46, __HELP_NAME("Tip: Change color")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTWords46 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_46, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToWords46" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTWords46" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_46, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2C=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4D, 0x0) AG(4) FREE ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpTextsFontColor __HELP_SYMBOL( STN "mbmpTextsFontColor" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_4D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0D 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x33 0x00 0x00 0x01 // '????3???' 0x01 0xF6 0x00 0x00 0x48 0x00 0x00 0x01 // '???H???' 0x01 0x00 0x00 0x00 0xD7 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x15 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x33 0x00 0x00 0x03 // '???3???' 0x0F 0x00 0x00 0xFD 0x49 0x00 0x00 0x03 // '???I???' 0x00 0x00 0x00 0x00 0x33 0x00 0x00 0x80 // '????3??' 0x00 0x00 0x02 0x00 0x4B 0x00 0x00 0x80 // '????K??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x68 0x00 0x00 0x82 // '????h??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x03 0x00 0x00 0x00 0x48 0x00 0x00 0xC0 // '????H??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4D, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x43 0x68 0x61 // '??? Cha' 0x6E 0x67 0x69 0x6E 0x67 0x20 0x74 0x68 // 'nging th' 0x65 0x20 0x63 0x6F 0x6C 0x6F 0x72 0x0D // 'e color?' 0x0A 0x54 0x6F 0x20 0x63 0x68 0x61 0x6E // '?To chan' 0x67 0x65 0x20 0x74 0x68 0x65 0x20 0x6C // 'ge the l' 0x65 0x74 0x74 0x65 0x72 0x20 0x63 0x6F // 'etter co' 0x6C 0x6F 0x72 0x0D 0x0A 0x31 0x09 0x43 // 'lor??1?C' 0x6C 0x69 0x63 0x6B 0x20 0x4C 0x65 0x74 // 'lick Let' 0x74 0x65 0x72 0x20 0x43 0x6F 0x6C 0x6F // 'ter Colo' 0x72 0x2D 0x01 0x0D 0x0A 0x32 0x09 0x43 // 'r-???2?C' 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 // 'lick the' 0x20 0x63 0x6F 0x6C 0x6F 0x72 0x20 0x79 // ' color y' 0x6F 0x75 0x20 0x6C 0x69 0x6B 0x65 0x2E // 'ou like.' 0x0D 0x0A 0x33 0x09 0x49 0x6E 0x20 0x61 // '??3?In a' 0x20 0x77 0x6F 0x72 0x64 0x20 0x62 0x6F // ' word bo' 0x78 0x2C 0x20 0x68 0x6F 0x6C 0x64 0x20 // 'x, hold ' 0x64 0x6F 0x77 0x6E 0x20 0x74 0x68 0x65 // 'down the' 0x20 0x6D 0x6F 0x75 0x73 0x65 0x20 0x62 // ' mouse b' 0x75 0x74 0x74 0x6F 0x6E 0x20 0x61 0x6E // 'utton an' 0x64 0x20 0x64 0x72 0x61 0x67 0x20 0x74 // 'd drag t' 0x68 0x65 0x20 0x6D 0x6F 0x75 0x73 0x65 // 'he mouse' 0x20 0x6F 0x76 0x65 0x72 0x20 0x74 0x68 // ' over th' 0x65 0x20 0x6C 0x65 0x74 0x74 0x65 0x72 // 'e letter' 0x73 0x20 0x77 0x68 0x6F 0x73 0x65 0x20 // 's whose ' 0x63 0x6F 0x6C 0x6F 0x72 0x20 0x79 0x6F // 'color yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 // 'u want t' 0x6F 0x20 0x63 0x68 0x61 0x6E 0x67 0x65 // 'o change' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_47= ktpcHowToWords47 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_47, __HELP_NAME("Tip: Change size")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_47, __HELP_NAME("Tip: Change size")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTWords47 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_50=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_47, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToWords47" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTWords47" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_50=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_47, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2A=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_50, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) FREE ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpTextsFontSize __HELP_SYMBOL( STN "mbmpTextsFontSize" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_50=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_50, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0F 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x31 0x00 0x00 0x01 // '????1???' 0x01 0xF6 0x00 0x00 0x45 0x00 0x00 0x01 // '???E???' 0x01 0x00 0x00 0x00 0xD2 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x46 0x00 0x00 0x02 // '????F???' 0x00 0x00 0x00 0x00 0x14 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x31 0x00 0x00 0x03 // '???1???' 0x0F 0x00 0x00 0xFD 0x45 0x00 0x00 0x03 // '???E???' 0x00 0x00 0x00 0x00 0x46 0x00 0x00 0x03 // '????F???' 0x00 0x00 0x00 0x00 0x31 0x00 0x00 0x80 // '????1??' 0x00 0x00 0x02 0x00 0x48 0x00 0x00 0x80 // '????H??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x64 0x00 0x00 0x82 // '????d??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0x45 0x00 0x00 0xC0 // '????E??' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_50=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_50, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x43 0x68 0x61 // '??? Cha' 0x6E 0x67 0x69 0x6E 0x67 0x20 0x74 0x68 // 'nging th' 0x65 0x20 0x73 0x69 0x7A 0x65 0x0D 0x0A // 'e size??' 0x54 0x6F 0x20 0x63 0x68 0x61 0x6E 0x67 // 'To chang' 0x65 0x20 0x74 0x68 0x65 0x20 0x6C 0x65 // 'e the le' 0x74 0x74 0x65 0x72 0x20 0x73 0x69 0x7A // 'tter siz' 0x65 0x0D 0x0A 0x31 0x09 0x43 0x6C 0x69 // 'e??1?Cli' 0x63 0x6B 0x20 0x4C 0x65 0x74 0x74 0x65 // 'ck Lette' 0x72 0x20 0x53 0x69 0x7A 0x65 0x2D 0x01 // 'r Size-?' 0x0D 0x0A 0x32 0x09 0x43 0x6C 0x69 0x63 // '??2?Clic' 0x6B 0x20 0x74 0x68 0x65 0x20 0x73 0x69 // 'k the si' 0x7A 0x65 0x20 0x79 0x6F 0x75 0x20 0x77 // 'ze you w' 0x61 0x6E 0x74 0x2E 0x0D 0x0A 0x33 0x09 // 'ant.??3?' 0x49 0x6E 0x20 0x61 0x20 0x77 0x6F 0x72 // 'In a wor' 0x64 0x20 0x62 0x6F 0x78 0x2C 0x20 0x68 // 'd box, h' 0x6F 0x6C 0x64 0x20 0x64 0x6F 0x77 0x6E // 'old down' 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 // ' the mou' 0x73 0x65 0x20 0x62 0x75 0x74 0x74 0x6F // 'se butto' 0x6E 0x20 0x61 0x6E 0x64 0x20 0x64 0x72 // 'n and dr' 0x61 0x67 0x20 0x74 0x68 0x65 0x20 0x6D // 'ag the m' 0x6F 0x75 0x73 0x65 0x20 0x6F 0x76 0x65 // 'ouse ove' 0x72 0x20 0x74 0x68 0x65 0x20 0x6C 0x65 // 'r the le' 0x74 0x74 0x65 0x72 0x73 0x20 0x77 0x68 // 'tters wh' 0x6F 0x73 0x65 0x20 0x73 0x69 0x7A 0x65 // 'ose size' 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E // ' you wan' 0x74 0x20 0x74 0x6F 0x20 0x63 0x68 0x61 // 't to cha' 0x6E 0x67 0x65 0x2E // 'nge.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_48= ktpcHowToWords48 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_48, __HELP_NAME("Tip: Change style")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_48, __HELP_NAME("Tip: Change style")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTWords48 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_48, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToWords48" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTWords48" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_48, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2D=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4A, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpTextsFontShape __HELP_SYMBOL( STN "mbmpTextsFontShape" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_4A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0D 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2C 0x00 0x00 0x01 // '????,???' 0x01 0xF6 0x00 0x00 0x3B 0x00 0x00 0x01 // '???;???' 0x01 0x00 0x00 0x00 0xCA 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x15 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x2C 0x00 0x00 0x03 // '???,???' 0x0F 0x00 0x00 0xFD 0x3B 0x00 0x00 0x03 // '???;???' 0x00 0x00 0x00 0x00 0x2C 0x00 0x00 0x80 // '????,??' 0x00 0x00 0x02 0x00 0x3E 0x00 0x00 0x80 // '????>??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x5B 0x00 0x00 0x82 // '????[??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0x3B 0x00 0x00 0xC0 // '????;??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4A, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x43 0x68 0x61 // '??? Cha' 0x6E 0x67 0x69 0x6E 0x67 0x20 0x74 0x68 // 'nging th' 0x65 0x20 0x73 0x74 0x79 0x6C 0x65 0x0D // 'e style?' 0x0A 0x54 0x6F 0x20 0x63 0x68 0x61 0x6E // '?To chan' 0x67 0x65 0x20 0x74 0x68 0x65 0x20 0x73 // 'ge the s' 0x74 0x79 0x6C 0x65 0x0D 0x0A 0x31 0x09 // 'tyle??1?' 0x43 0x6C 0x69 0x63 0x6B 0x20 0x53 0x74 // 'Click St' 0x79 0x6C 0x65 0x73 0x2D 0x01 0x0D 0x0A // 'yles-???' 0x32 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 // '2?Click ' 0x74 0x68 0x65 0x20 0x73 0x74 0x79 0x6C // 'the styl' 0x65 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 // 'e you wa' 0x6E 0x74 0x2E 0x0D 0x0A 0x33 0x09 0x49 // 'nt.??3?I' 0x6E 0x20 0x61 0x20 0x77 0x6F 0x72 0x64 // 'n a word' 0x20 0x62 0x6F 0x78 0x2C 0x20 0x68 0x6F // ' box, ho' 0x6C 0x64 0x20 0x64 0x6F 0x77 0x6E 0x20 // 'ld down ' 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 0x73 // 'the mous' 0x65 0x20 0x62 0x75 0x74 0x74 0x6F 0x6E // 'e button' 0x20 0x61 0x6E 0x64 0x20 0x64 0x72 0x61 // ' and dra' 0x67 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F // 'g the mo' 0x75 0x73 0x65 0x20 0x6F 0x76 0x65 0x72 // 'use over' 0x20 0x74 0x68 0x65 0x20 0x6C 0x65 0x74 // ' the let' 0x74 0x65 0x72 0x73 0x20 0x77 0x68 0x6F // 'ters who' 0x73 0x65 0x20 0x73 0x74 0x79 0x6C 0x65 // 'se style' 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E // ' you wan' 0x74 0x20 0x74 0x6F 0x20 0x63 0x68 0x61 // 't to cha' 0x6E 0x67 0x65 0x2E // 'nge.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_49= ktpcHowToWords49 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_49, __HELP_NAME("Tip: Change letter look")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_49, __HELP_NAME("Tip: Change letter look")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTWords49 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_49, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToWords49" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTWords49" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_49, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC9 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2E=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4B, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpTextsFont __HELP_SYMBOL( STN "mbmpTextsFont" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_4B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0E 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x42 0x00 0x00 0x01 // '????B???' 0x01 0xF6 0x00 0x00 0x52 0x00 0x00 0x01 // '???R???' 0x01 0x00 0x00 0x00 0xD4 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x20 0x00 0x00 0x03 // '???? ???' 0x0A 0x00 0x00 0xFD 0x42 0x00 0x00 0x03 // '???B???' 0x0F 0x00 0x00 0xFD 0x52 0x00 0x00 0x03 // '???R???' 0x0A 0x00 0x00 0xFD 0x53 0x00 0x00 0x03 // '???S???' 0x00 0x00 0x00 0x00 0x42 0x00 0x00 0x80 // '????B??' 0x00 0x00 0x02 0x00 0x55 0x00 0x00 0x80 // '????U??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x71 0x00 0x00 0x82 // '????q??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0x52 0x00 0x00 0xC0 // '????R??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4B, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x43 0x68 0x61 // '??? Cha' 0x6E 0x67 0x69 0x6E 0x67 0x20 0x74 0x68 // 'nging th' 0x65 0x20 0x77 0x61 0x79 0x20 0x6C 0x65 // 'e way le' 0x74 0x74 0x65 0x72 0x73 0x20 0x6C 0x6F // 'tters lo' 0x6F 0x6B 0x0D 0x0A 0x54 0x6F 0x20 0x63 // 'ok??To c' 0x68 0x61 0x6E 0x67 0x65 0x20 0x74 0x68 // 'hange th' 0x65 0x20 0x77 0x61 0x79 0x20 0x6C 0x65 // 'e way le' 0x74 0x74 0x65 0x72 0x73 0x20 0x6C 0x6F // 'tters lo' 0x6F 0x6B 0x0D 0x0A 0x31 0x09 0x43 0x6C // 'ok??1?Cl' 0x69 0x63 0x6B 0x20 0x4C 0x65 0x74 0x74 // 'ick Lett' 0x65 0x72 0x73 0x2D 0x01 0x0D 0x0A 0x32 // 'ers-???2' 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 0x74 // '?Click t' 0x68 0x65 0x20 0x66 0x6F 0x6E 0x74 0x20 // 'he font ' 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 // 'you want' 0x2E 0x0D 0x0A 0x33 0x09 0x49 0x6E 0x20 // '.??3?In ' 0x61 0x20 0x77 0x6F 0x72 0x64 0x20 0x62 // 'a word b' 0x6F 0x78 0x2C 0x20 0x68 0x6F 0x6C 0x64 // 'ox, hold' 0x20 0x64 0x6F 0x77 0x6E 0x20 0x74 0x68 // ' down th' 0x65 0x20 0x6D 0x6F 0x75 0x73 0x65 0x20 // 'e mouse ' 0x62 0x75 0x74 0x74 0x6F 0x6E 0x20 0x61 // 'button a' 0x6E 0x64 0x20 0x64 0x72 0x61 0x67 0x20 // 'nd drag ' 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 0x73 // 'the mous' 0x65 0x20 0x6F 0x76 0x65 0x72 0x20 0x74 // 'e over t' 0x68 0x65 0x20 0x6C 0x65 0x74 0x74 0x65 // 'he lette' 0x72 0x73 0x20 0x79 0x6F 0x75 0x20 0x77 // 'rs you w' 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 0x63 // 'ant to c' 0x68 0x61 0x6E 0x67 0x65 0x2E // 'hange.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_4A= ktpcHowToWords4A #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4A, __HELP_NAME("Tip: Change background color")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4A, __HELP_NAME("Tip: Change background color")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTWords4A ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_46=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4A, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToWords4A" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTWords4A" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_46=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4A, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2F=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_46, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpTextsBkgdColor __HELP_SYMBOL( STN "mbmpTextsBkgdColor" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_46=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_46, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0E 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x42 0x00 0x00 0x01 // '????B???' 0x01 0xF1 0x00 0x00 0x57 0x00 0x00 0x01 // '???W???' 0x01 0xF6 0x00 0x00 0x70 0x00 0x00 0x01 // '???p???' 0x01 0x00 0x00 0x00 0xC4 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x20 0x00 0x00 0x03 // '???? ???' 0x0A 0x00 0x00 0xFD 0x42 0x00 0x00 0x03 // '???B???' 0x0F 0x00 0x00 0xFD 0x70 0x00 0x00 0x03 // '???p???' 0x00 0x00 0x00 0x00 0x42 0x00 0x00 0x80 // '????B??' 0x00 0x00 0x02 0x00 0x90 0x00 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x90 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0x70 0x00 0x00 0xC0 // '????p??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_46=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_46, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x43 0x68 0x61 // '??? Cha' 0x6E 0x67 0x69 0x6E 0x67 0x20 0x74 0x68 // 'nging th' 0x65 0x20 0x62 0x61 0x63 0x6B 0x67 0x72 // 'e backgr' 0x6F 0x75 0x6E 0x64 0x20 0x63 0x6F 0x6C // 'ound col' 0x6F 0x72 0x0D 0x0A 0x54 0x6F 0x20 0x63 // 'or??To c' 0x68 0x61 0x6E 0x67 0x65 0x20 0x74 0x68 // 'hange th' 0x65 0x20 0x62 0x61 0x63 0x6B 0x67 0x72 // 'e backgr' 0x6F 0x75 0x6E 0x64 0x20 0x63 0x6F 0x6C // 'ound col' 0x6F 0x72 0x0D 0x0A 0x31 0x09 0x43 0x6C // 'or??1?Cl' 0x69 0x63 0x6B 0x20 0x4D 0x6F 0x72 0x65 // 'ick More' 0x20 0x54 0x6F 0x6F 0x6C 0x73 0x2E 0x0D // ' Tools.?' 0x0A 0x32 0x09 0x43 0x6C 0x69 0x63 0x6B // '?2?Click' 0x20 0x42 0x61 0x63 0x6B 0x67 0x72 0x6F // ' Backgro' 0x75 0x6E 0x64 0x20 0x43 0x6F 0x6C 0x6F // 'und Colo' 0x72 0x2D 0x01 0x0D 0x0A 0x33 0x09 0x43 // 'r-???3?C' 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 // 'lick the' 0x20 0x63 0x6F 0x6C 0x6F 0x72 0x20 0x79 // ' color y' 0x6F 0x75 0x20 0x6C 0x69 0x6B 0x65 0x2E // 'ou like.' 0x0D 0x0A 0x34 0x09 0x43 0x6C 0x69 0x63 // '??4?Clic' 0x6B 0x20 0x74 0x68 0x65 0x20 0x77 0x6F // 'k the wo' 0x72 0x64 0x20 0x62 0x6F 0x78 0x20 0x77 // 'rd box w' 0x68 0x6F 0x73 0x65 0x20 0x63 0x6F 0x6C // 'hose col' 0x6F 0x72 0x20 0x79 0x6F 0x75 0x20 0x77 // 'or you w' 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 0x63 // 'ant to c' 0x68 0x61 0x6E 0x67 0x65 0x2E // 'hange.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_4B= ktpcHowToWords4B #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4B, __HELP_NAME("Tip: Making words scroll")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4B, __HELP_NAME("Tip: Making words scroll")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4B, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToWords4B" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x21 0x01 0x00 0x00 // '????!???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_31=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4E, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) FREE ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpPlay __HELP_SYMBOL( STN "mbmpPlay" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_4E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0x02 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xFC 0x00 0x00 0x01 // '???????' 0x01 0xF1 0x00 0x00 0x26 0x01 0x00 0x01 // '???&???' 0x01 0x00 0x00 0x00 0x27 0x01 0x00 0x01 // '????'???' 0x00 0x00 0x00 0x00 0x17 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x2E 0x00 0x00 0x03 // '???.???' 0x0F 0x00 0x00 0xFD 0x27 0x01 0x00 0x03 // '???'???' 0x00 0x00 0x00 0x00 0x2E 0x00 0x00 0x80 // '????.??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xFC 0x00 0x00 0x82 // '??????' 0xFB 0xFF 0x00 0x00 0x00 0x00 0x00 0xC0 // '?????' 0x01 0x00 0x00 0x00 0x26 0x01 0x00 0xC0 // '????&??' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4E, 0x0) BYTE 0x03 0x03 0x01 0x09 0x4D 0x61 0x6B 0x69 // '????Maki' 0x6E 0x67 0x20 0x63 0x72 0x65 0x64 0x69 // 'ng credi' 0x74 0x73 0x20 0x73 0x63 0x72 0x6F 0x6C // 'ts scrol' 0x6C 0x0D 0x0A 0x54 0x6F 0x20 0x73 0x65 // 'l??To se' 0x65 0x20 0x77 0x6F 0x72 0x64 0x73 0x20 // 'e words ' 0x73 0x63 0x72 0x6F 0x6C 0x6C 0x0D 0x0A // 'scroll??' 0x31 0x09 0x54 0x79 0x70 0x65 0x20 0x65 // '1?Type e' 0x6E 0x6F 0x75 0x67 0x68 0x20 0x77 0x6F // 'nough wo' 0x72 0x64 0x73 0x20 0x74 0x6F 0x20 0x66 // 'rds to f' 0x69 0x6C 0x6C 0x20 0x75 0x70 0x20 0x74 // 'ill up t' 0x68 0x65 0x20 0x63 0x72 0x65 0x64 0x69 // 'he credi' 0x74 0x73 0x20 0x62 0x6F 0x78 0x2E 0x0D // 'ts box.?' 0x0A 0x32 0x09 0x49 0x66 0x20 0x79 0x6F // '?2?If yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 // 'u want t' 0x68 0x65 0x20 0x77 0x6F 0x72 0x64 0x73 // 'he words' 0x20 0x74 0x6F 0x20 0x73 0x63 0x72 0x6F // ' to scro' 0x6C 0x6C 0x20 0x63 0x6F 0x6D 0x70 0x6C // 'll compl' 0x65 0x74 0x65 0x6C 0x79 0x20 0x6F 0x66 // 'etely of' 0x66 0x20 0x74 0x68 0x65 0x20 0x73 0x63 // 'f the sc' 0x72 0x65 0x65 0x6E 0x2C 0x20 0x61 0x64 // 'reen, ad' 0x64 0x20 0x62 0x6C 0x61 0x6E 0x6B 0x20 // 'd blank ' 0x6C 0x69 0x6E 0x65 0x73 0x20 0x74 0x6F // 'lines to' 0x20 0x74 0x68 0x65 0x20 0x63 0x72 0x65 // ' the cre' 0x64 0x69 0x74 0x73 0x20 0x62 0x6F 0x78 // 'dits box' 0x20 0x62 0x79 0x20 0x70 0x72 0x65 0x73 // ' by pres' 0x73 0x69 0x6E 0x67 0x20 0x45 0x6E 0x74 // 'sing Ent' 0x65 0x72 0x20 0x75 0x6E 0x74 0x69 0x6C // 'er until' 0x20 0x79 0x6F 0x75 0x20 0x6E 0x6F 0x20 // ' you no ' 0x6C 0x6F 0x6E 0x67 0x65 0x72 0x20 0x73 // 'longer s' 0x65 0x65 0x20 0x61 0x6E 0x79 0x20 0x6F // 'ee any o' 0x66 0x20 0x74 0x68 0x65 0x20 0x77 0x6F // 'f the wo' 0x72 0x64 0x73 0x2E 0x0D 0x0A 0x33 0x09 // 'rds.??3?' 0x57 0x68 0x65 0x6E 0x20 0x79 0x6F 0x75 // 'When you' 0x27 0x72 0x65 0x20 0x64 0x6F 0x6E 0x65 // ''re done' 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 // ', click ' 0x74 0x68 0x65 0x20 0x50 0x6C 0x61 0x79 // 'the Play' 0x20 0x62 0x75 0x74 0x74 0x6F 0x6E 0x2D // ' button-' 0x01 // '?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_50= ktpcHowToWords50 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_50, __HELP_NAME("Def: drag")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_50, __HELP_NAME("Def: drag")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTWords50 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_44=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_50, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToWords50" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTWords50" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_44=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_50, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_44=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_44, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x04 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xD0 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x79 0x00 0x00 0x03 // '????y???' 0x0A 0x00 0x00 0xFD 0x88 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x79 0x00 0x00 0x80 // '????y??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x79 0x00 0x00 0x82 // '????y??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_44=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_44, 0x0) BYTE 0x03 0x03 0x64 0x72 0x61 0x67 0x0D 0x0A // '??drag??' 0x31 0x09 0x48 0x6F 0x6C 0x64 0x20 0x64 // '1?Hold d' 0x6F 0x77 0x6E 0x20 0x74 0x68 0x65 0x20 // 'own the ' 0x6D 0x6F 0x75 0x73 0x65 0x20 0x62 0x75 // 'mouse bu' 0x74 0x74 0x6F 0x6E 0x20 0x61 0x73 0x20 // 'tton as ' 0x79 0x6F 0x75 0x20 0x6D 0x6F 0x76 0x65 // 'you move' 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 // ' the mou' 0x73 0x65 0x2E 0x0D 0x0A 0x32 0x09 0x57 // 'se.??2?W' 0x68 0x65 0x6E 0x20 0x79 0x6F 0x75 0x27 // 'hen you'' 0x76 0x65 0x20 0x66 0x69 0x6E 0x69 0x73 // 've finis' 0x68 0x65 0x64 0x20 0x64 0x72 0x61 0x67 // 'hed drag' 0x67 0x69 0x6E 0x67 0x2C 0x20 0x6C 0x65 // 'ging, le' 0x74 0x20 0x67 0x6F 0x20 0x6F 0x66 0x20 // 't go of ' 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 0x73 // 'the mous' 0x65 0x20 0x62 0x75 0x74 0x74 0x6F 0x6E // 'e button' 0x2E 0x0D 0x0A 0x54 0x69 0x70 0x20 0x66 // '.??Tip f' 0x72 0x6F 0x6D 0x20 0x4D 0x63 0x5A 0x65 // 'rom McZe' 0x65 0x3A 0x20 0x20 0x59 0x6F 0x75 0x27 // 'e: You'' 0x6C 0x6C 0x20 0x67 0x65 0x74 0x20 0x74 // 'll get t' 0x68 0x65 0x20 0x62 0x65 0x73 0x74 0x20 // 'he best ' 0x72 0x65 0x73 0x75 0x6C 0x74 0x73 0x20 // 'results ' 0x69 0x66 0x20 0x79 0x6F 0x75 0x20 0x6D // 'if you m' 0x6F 0x76 0x65 0x20 0x74 0x68 0x65 0x20 // 'ove the ' 0x6D 0x6F 0x75 0x73 0x65 0x20 0x73 0x6C // 'mouse sl' 0x6F 0x77 0x6C 0x79 0x20 0x61 0x73 0x20 // 'owly as ' 0x79 0x6F 0x75 0x20 0x64 0x72 0x61 0x67 // 'you drag' 0x2E 0x20 // '. ' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_51= ktpcHowToWords51 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_51, __HELP_NAME("Def: Drag")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_51, __HELP_NAME("Def: Drag")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTWords51 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_51=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_51, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToWords51" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTWords51" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_51=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_51, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_51=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_51, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x04 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xD0 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x79 0x00 0x00 0x03 // '????y???' 0x0A 0x00 0x00 0xFD 0x88 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x79 0x00 0x00 0x80 // '????y??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x79 0x00 0x00 0x82 // '????y??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_51=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_51, 0x0) BYTE 0x03 0x03 0x44 0x72 0x61 0x67 0x0D 0x0A // '??Drag??' 0x31 0x09 0x48 0x6F 0x6C 0x64 0x20 0x64 // '1?Hold d' 0x6F 0x77 0x6E 0x20 0x74 0x68 0x65 0x20 // 'own the ' 0x6D 0x6F 0x75 0x73 0x65 0x20 0x62 0x75 // 'mouse bu' 0x74 0x74 0x6F 0x6E 0x20 0x61 0x73 0x20 // 'tton as ' 0x79 0x6F 0x75 0x20 0x6D 0x6F 0x76 0x65 // 'you move' 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 // ' the mou' 0x73 0x65 0x2E 0x0D 0x0A 0x32 0x09 0x57 // 'se.??2?W' 0x68 0x65 0x6E 0x20 0x79 0x6F 0x75 0x27 // 'hen you'' 0x76 0x65 0x20 0x66 0x69 0x6E 0x69 0x73 // 've finis' 0x68 0x65 0x64 0x20 0x64 0x72 0x61 0x67 // 'hed drag' 0x67 0x69 0x6E 0x67 0x2C 0x20 0x6C 0x65 // 'ging, le' 0x74 0x20 0x67 0x6F 0x20 0x6F 0x66 0x20 // 't go of ' 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 0x73 // 'the mous' 0x65 0x20 0x62 0x75 0x74 0x74 0x6F 0x6E // 'e button' 0x2E 0x0D 0x0A 0x54 0x69 0x70 0x20 0x66 // '.??Tip f' 0x72 0x6F 0x6D 0x20 0x4D 0x63 0x5A 0x65 // 'rom McZe' 0x65 0x3A 0x20 0x20 0x59 0x6F 0x75 0x27 // 'e: You'' 0x6C 0x6C 0x20 0x67 0x65 0x74 0x20 0x74 // 'll get t' 0x68 0x65 0x20 0x62 0x65 0x73 0x74 0x20 // 'he best ' 0x72 0x65 0x73 0x75 0x6C 0x74 0x73 0x20 // 'results ' 0x69 0x66 0x20 0x79 0x6F 0x75 0x20 0x6D // 'if you m' 0x6F 0x76 0x65 0x20 0x74 0x68 0x65 0x20 // 'ove the ' 0x6D 0x6F 0x75 0x73 0x65 0x20 0x73 0x6C // 'mouse sl' 0x6F 0x77 0x6C 0x79 0x20 0x61 0x73 0x20 // 'owly as ' 0x79 0x6F 0x75 0x20 0x64 0x72 0x61 0x67 // 'you drag' 0x2E 0x20 // '. ' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_52= ktpcHowToWords52 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_52, __HELP_NAME("Def: Go to the place")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_52, __HELP_NAME("Def: Go to the place")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTWords52 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_52, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToWords52" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTWords52" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_52, 0x0) BYTE 0x01 0x00 0x03 0x03 0x38 0x01 0x00 0x00 // '????8???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_0=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4F, 0x0) AG(4) ITEM LONG 0x2000002 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpFrameSlider __HELP_SYMBOL( STN "mbmpFrameSlider" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSceneSlider __HELP_SYMBOL( STN "mbmpSceneSlider" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_4F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x13 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0F 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x4D 0x01 0x00 0x01 // '????M???' 0x00 0x00 0x00 0x00 0x5C 0x00 0x00 0x02 // '????\???' 0x01 0x00 0x00 0x00 0x62 0x00 0x00 0x02 // '????b???' 0x00 0x00 0x00 0x00 0xF2 0x00 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0xF8 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x3D 0x00 0x00 0x03 // '???=???' 0x00 0x00 0x00 0x00 0xB9 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xD4 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x59 0x00 0x00 0x80 // '????Y??' 0x00 0x00 0x03 0x00 0xB9 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0xEF 0x00 0x00 0x80 // '??????' 0x00 0x00 0x03 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xF2 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x59 0x00 0x00 0xC0 // '????Y??' 0x02 0x00 0x00 0x00 0xEF 0x00 0x00 0xC0 // '??????' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4F, 0x0) BYTE 0x03 0x03 0x47 0x6F 0x20 0x74 0x6F 0x20 // '??Go to ' 0x74 0x68 0x65 0x20 0x70 0x6C 0x61 0x63 // 'the plac' 0x65 0x0D 0x0A 0x54 0x6F 0x20 0x6D 0x6F // 'e??To mo' 0x76 0x65 0x20 0x66 0x6F 0x72 0x77 0x61 // 've forwa' 0x72 0x64 0x73 0x20 0x6F 0x72 0x20 0x62 // 'rds or b' 0x61 0x63 0x6B 0x77 0x61 0x72 0x64 0x73 // 'ackwards' 0x20 0x77 0x69 0x74 0x68 0x69 0x6E 0x20 // ' within ' 0x61 0x20 0x73 0x63 0x65 0x6E 0x65 0x0D // 'a scene?' 0x0A 0x95 0x09 0x55 0x73 0x65 0x20 0x74 // '??Use t' 0x68 0x65 0x20 0x46 0x72 0x61 0x6D 0x65 // 'he Frame' 0x20 0x53 0x6C 0x69 0x64 0x65 0x72 0x2E // ' Slider.' 0x20 0x0D 0x0A 0x01 0x0D 0x0A 0x43 0x6C // ' ?????Cl' 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 // 'ick the ' 0x46 0x69 0x72 0x73 0x74 0x2C 0x20 0x50 // 'First, P' 0x72 0x65 0x76 0x69 0x6F 0x75 0x73 0x2C // 'revious,' 0x20 0x4E 0x65 0x78 0x74 0x2C 0x20 0x6F // ' Next, o' 0x72 0x20 0x4C 0x61 0x73 0x74 0x20 0x41 // 'r Last A' 0x72 0x72 0x6F 0x77 0x20 0x6F 0x72 0x20 // 'rrow or ' 0x64 0x72 0x61 0x67 0x20 0x74 0x68 0x65 // 'drag the' 0x20 0x73 0x6C 0x69 0x64 0x65 0x72 0x20 // ' slider ' 0x69 0x6E 0x20 0x74 0x68 0x65 0x20 0x6D // 'in the m' 0x69 0x64 0x64 0x6C 0x65 0x20 0x6F 0x66 // 'iddle of' 0x20 0x74 0x68 0x65 0x20 0x62 0x61 0x72 // ' the bar' 0x2E 0x0D 0x0A 0x54 0x6F 0x20 0x6D 0x6F // '.??To mo' 0x76 0x65 0x20 0x66 0x72 0x6F 0x6D 0x20 // 've from ' 0x73 0x63 0x65 0x6E 0x65 0x20 0x74 0x6F // 'scene to' 0x20 0x73 0x63 0x65 0x6E 0x65 0x0D 0x0A // ' scene??' 0x95 0x09 0x55 0x73 0x65 0x20 0x74 0x68 // '?Use th' 0x65 0x20 0x53 0x63 0x65 0x6E 0x65 0x20 // 'e Scene ' 0x53 0x6C 0x69 0x64 0x65 0x72 0x2E 0x0D // 'Slider.?' 0x0A 0x01 0x0D 0x0A 0x43 0x6C 0x69 0x63 // '????Clic' 0x6B 0x20 0x74 0x68 0x65 0x20 0x46 0x69 // 'k the Fi' 0x72 0x73 0x74 0x2C 0x20 0x50 0x72 0x65 // 'rst, Pre' 0x76 0x69 0x6F 0x75 0x73 0x2C 0x20 0x4E // 'vious, N' 0x65 0x78 0x74 0x2C 0x20 0x6F 0x72 0x20 // 'ext, or ' 0x4C 0x61 0x73 0x74 0x20 0x41 0x72 0x72 // 'Last Arr' 0x6F 0x77 0x20 0x6F 0x72 0x20 0x64 0x72 // 'ow or dr' 0x61 0x67 0x20 0x74 0x68 0x65 0x20 0x73 // 'ag the s' 0x6C 0x69 0x64 0x65 0x72 0x20 0x69 0x6E // 'lider in' 0x20 0x74 0x68 0x65 0x20 0x6D 0x69 0x64 // ' the mid' 0x64 0x6C 0x65 0x20 0x6F 0x66 0x20 0x74 // 'dle of t' 0x68 0x65 0x20 0x62 0x61 0x72 0x2E // 'he bar.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_64= ktpcHowToWords64 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_64, __HELP_NAME("Cut Tip: Pause Click")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_64, __HELP_NAME("Cut Tip: Pause Click")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTWords64 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_14=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_64, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToWords64" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTWords64" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_14=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_64, 0x0) BYTE 0x01 0x00 0x03 0x03 0x58 0x01 0x00 0x00 // '????X???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_B=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_14, 0x0) AG(4) FREE FREE ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpPausesMouse __HELP_SYMBOL( STN "mbmpPausesMouse" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_14=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_14, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x12 0x00 0x00 0x00 0x05 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x39 0x00 0x00 0x01 // '????9???' 0x00 0x00 0x00 0x00 0x3B 0x00 0x00 0x01 // '????;???' 0x01 0x00 0x00 0x00 0x71 0x00 0x00 0x01 // '????q???' 0x00 0x00 0x00 0x00 0x73 0x00 0x00 0x01 // '????s???' 0x01 0x00 0x00 0x00 0xD7 0x00 0x00 0x01 // '???????' 0x01 0xF1 0x00 0x00 0xEE 0x00 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0xEF 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x05 0x00 0x00 0x03 // '????????' 0x00 0x00 0x00 0x00 0x3B 0x00 0x00 0x03 // '????;???' 0x0A 0x00 0x00 0xFD 0x71 0x00 0x00 0x03 // '???q???' 0x00 0x00 0x00 0x00 0x73 0x00 0x00 0x03 // '????s???' 0x0F 0x00 0x00 0xFD 0xEF 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x3B 0x00 0x00 0x80 // '????;??' 0x00 0x00 0x00 0x00 0x73 0x00 0x00 0x80 // '????s??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xD7 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0xEE 0x00 0x00 0xC0 // '??????' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_14=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_14, 0x0) BYTE 0x03 0x03 0x43 0x75 0x74 0x0D 0x0A 0x50 // '??Cut??P' 0x61 0x75 0x73 0x69 0x6E 0x67 0x20 0x74 // 'ausing t' 0x68 0x65 0x20 0x6D 0x6F 0x76 0x69 0x65 // 'he movie' 0x20 0x73 0x6F 0x20 0x79 0x6F 0x75 0x20 // ' so you ' 0x68 0x61 0x76 0x65 0x20 0x74 0x69 0x6D // 'have tim' 0x65 0x20 0x74 0x6F 0x20 0x72 0x65 0x61 // 'e to rea' 0x64 0x20 0x74 0x68 0x65 0x20 0x77 0x6F // 'd the wo' 0x72 0x64 0x73 0x0D 0x0A 0x54 0x6F 0x20 // 'rds??To ' 0x70 0x61 0x75 0x73 0x65 0x20 0x79 0x6F // 'pause yo' 0x75 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 // 'ur movie' 0x20 0x73 0x6F 0x20 0x79 0x6F 0x75 0x20 // ' so you ' 0x68 0x61 0x76 0x65 0x20 0x74 0x69 0x6D // 'have tim' 0x65 0x20 0x74 0x6F 0x20 0x72 0x65 0x61 // 'e to rea' 0x64 0x20 0x74 0x68 0x65 0x20 0x77 0x6F // 'd the wo' 0x72 0x64 0x73 0x0D 0x0A 0x31 0x09 0x49 // 'rds??1?I' 0x66 0x20 0x6E 0x65 0x63 0x65 0x73 0x73 // 'f necess' 0x61 0x72 0x79 0x2C 0x20 0x63 0x6C 0x69 // 'ary, cli' 0x63 0x6B 0x20 0x53 0x63 0x65 0x6E 0x65 // 'ck Scene' 0x73 0x2E 0x0D 0x0A 0x32 0x09 0x47 0x6F // 's.??2?Go' 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 // ' to the ' 0x70 0x6C 0x61 0x63 0x65 0x20 0x69 0x6E // 'place in' 0x20 0x79 0x6F 0x75 0x72 0x20 0x6D 0x6F // ' your mo' 0x76 0x69 0x65 0x20 0x77 0x68 0x65 0x72 // 'vie wher' 0x65 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 // 'e you wa' 0x6E 0x74 0x20 0x74 0x6F 0x20 0x70 0x61 // 'nt to pa' 0x75 0x73 0x65 0x20 0x74 0x68 0x65 0x20 // 'use the ' 0x61 0x63 0x74 0x69 0x6F 0x6E 0x2E 0x0D // 'action.?' 0x0A 0x33 0x09 0x43 0x6C 0x69 0x63 0x6B // '?3?Click' 0x20 0x57 0x61 0x69 0x74 0x20 0x46 0x6F // ' Wait Fo' 0x72 0x20 0x43 0x6C 0x69 0x63 0x6B 0x2D // 'r Click-' 0x01 // '?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_66= ktpcHowToWords66 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_66, __HELP_NAME("Tip: Remove word box")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_66, __HELP_NAME("Tip: Remove word box")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTWords66 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_42=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_66, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToWords66" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTWords66" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_42=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_66, 0x0) BYTE 0x01 0x00 0x03 0x03 0x00 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_32=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_42, 0x0) AG(4) FREE ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpCutCopyPaste __HELP_SYMBOL( STN "mbmpCutCopyPaste" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpCutWordBox __HELP_SYMBOL( STN "mbmpCutWordBox" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_42=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_42, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x11 0x00 0x00 0x00 0x01 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2D 0x00 0x00 0x01 // '????-???' 0x01 0xF6 0x00 0x00 0x52 0x00 0x00 0x01 // '???R???' 0x01 0x00 0x00 0x00 0x55 0x00 0x00 0x01 // '????U???' 0x01 0xF6 0x00 0x00 0x6D 0x00 0x00 0x01 // '???m???' 0x01 0x00 0x00 0x00 0xD2 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x02 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x15 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x2D 0x00 0x00 0x03 // '???-???' 0x0F 0x00 0x00 0xFD 0xD2 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x70 0x00 0x00 0x80 // '????p??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xBD 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x04 0x00 0x00 0x00 0x52 0x00 0x00 0xC0 // '????R??' 0x02 0x00 0x00 0x00 0x6D 0x00 0x00 0xC0 // '????m??' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_42=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_42, 0x0) BYTE 0x03 0x03 0x01 0x20 0x52 0x65 0x6D 0x6F // '??? Remo' 0x76 0x69 0x6E 0x67 0x20 0x61 0x20 0x77 // 'ving a w' 0x6F 0x72 0x64 0x20 0x62 0x6F 0x78 0x0D // 'ord box?' 0x0A 0x54 0x6F 0x20 0x72 0x65 0x6D 0x6F // '?To remo' 0x76 0x65 0x20 0x61 0x20 0x77 0x6F 0x72 // 've a wor' 0x64 0x20 0x62 0x6F 0x78 0x0D 0x0A 0x31 // 'd box??1' 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 0x74 // '?Click t' 0x68 0x65 0x20 0x43 0x75 0x74 0x2C 0x20 // 'he Cut, ' 0x43 0x6F 0x70 0x79 0x2C 0x20 0x26 0x20 // 'Copy, & ' 0x50 0x61 0x73 0x74 0x65 0x20 0x54 0x6F // 'Paste To' 0x6F 0x6C 0x73 0x2D 0x01 0x0D 0x0A 0x32 // 'ols-???2' 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 0x52 // '?Click R' 0x65 0x6D 0x6F 0x76 0x65 0x20 0x57 0x6F // 'emove Wo' 0x72 0x64 0x20 0x42 0x6F 0x78 0x2D 0x01 // 'rd Box-?' 0x0D 0x0A 0x33 0x09 0x4D 0x6F 0x76 0x65 // '??3?Move' 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 // ' the mou' 0x73 0x65 0x20 0x63 0x75 0x72 0x73 0x6F // 'se curso' 0x72 0x20 0x6F 0x76 0x65 0x72 0x20 0x74 // 'r over t' 0x68 0x65 0x20 0x77 0x6F 0x72 0x64 0x20 // 'he word ' 0x62 0x6F 0x78 0x20 0x65 0x64 0x67 0x65 // 'box edge' 0x20 0x75 0x6E 0x74 0x69 0x6C 0x20 0x79 // ' until y' 0x6F 0x75 0x20 0x73 0x65 0x65 0x20 0x74 // 'ou see t' 0x68 0x65 0x20 0x73 0x63 0x69 0x73 0x73 // 'he sciss' 0x6F 0x72 0x73 0x2E 0x20 0x0D 0x0A 0x34 // 'ors. ??4' 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 0x74 // '?Click t' 0x68 0x65 0x20 0x77 0x6F 0x72 0x64 0x20 // 'he word ' 0x62 0x6F 0x78 0x2E // 'box.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_67= ktpcHowToWords67 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_67, __HELP_NAME("Def: scroll")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_67, __HELP_NAME("Def: scroll")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobHowToSequenceHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwavHTWords67 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_20=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_67, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcHowToWords67" ITEM "kgobHowToSequenceHot" ITEM "" ITEM "" ITEM "kwavHTWords67" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_20=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_67, 0x0) BYTE 0x01 0x00 0x03 0x03 0xDE 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_20=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_20, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x06 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x08 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x4F 0x00 0x00 0x01 // '????O???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x08 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_20=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_20, 0x0) BYTE 0x03 0x03 0x73 0x63 0x72 0x6F 0x6C 0x6C // '??scroll' 0x0D 0x0A 0x57 0x6F 0x72 0x64 0x73 0x20 // '??Words ' 0x74 0x68 0x61 0x74 0x20 0x72 0x6F 0x6C // 'that rol' 0x6C 0x20 0x74 0x6F 0x77 0x61 0x72 0x64 // 'l toward' 0x73 0x20 0x74 0x68 0x65 0x20 0x74 0x6F // 's the to' 0x70 0x20 0x6F 0x66 0x20 0x74 0x68 0x65 // 'p of the' 0x20 0x73 0x63 0x72 0x65 0x65 0x6E 0x20 // ' screen ' 0x77 0x68 0x65 0x6E 0x20 0x79 0x6F 0x75 // 'when you' 0x20 0x70 0x6C 0x61 0x79 0x20 0x79 0x6F // ' play yo' 0x75 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 // 'ur movie' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK ================================================ FILE: src/help/logo.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ #undef __HELP_NAME #undef __HELP_SYMBOL #undef __HELP_PACK #undef __HELP_PACK2 #ifdef NO_HELP_NAMES #define __HELP_NAME(name) "" #else #define __HELP_NAME(name) name #endif #ifdef NO_HELP_SYMBOLS #define __HELP_SYMBOL(stuff) #else #define __HELP_SYMBOL(stuff) stuff #endif #ifdef PACK_HELP #define __HELP_PACK PACK #else #define __HELP_PACK #endif #ifdef HELP_SINGLE_CHUNK #define __HELP_PACK2 #else #define __HELP_PACK2 __HELP_PACK #endif SET _help_48544F50_0= ktpcLogo00 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("This project helps you")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("This project helps you")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon0 kgobProject 0x0 kidPlayLogoSounds 0x140 0xF0 0x57415645 kwavLogo00 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_0=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) GST(0) ITEM "kgobCalloutBalloon0" ITEM "ktpcLogo00" ITEM "kgobProject" ITEM "" ITEM "kidPlayLogoSounds" ITEM "kwavLogo00" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB6 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_0=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'GOKD' kgobOkButton 0xFFFFFFFF __HELP_SYMBOL( STN "kgobOkButton" ) ITEM LONG 0x40000001 VAR BYTE 0x01 0xFF 0xFF 0xFF 0xFF // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xAA 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x1E 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0x29 0x00 0x00 0x03 // '???)???' 0x0F 0x00 0x00 0xFD 0xAA 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0xAC 0x00 0x00 0x40 // '??????@' 0x02 0x00 0x00 0x00 0xAD 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xAC 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xAC 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0xAC 0x00 0x00 0xC0 // '??????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x03 0x03 0x54 0x68 0x69 0x73 0x20 0x70 // '??This p' 0x72 0x6F 0x6A 0x65 0x63 0x74 0x20 0x68 // 'roject h' 0x65 0x6C 0x70 0x73 0x20 0x79 0x6F 0x75 // 'elps you' 0x20 0x6D 0x61 0x6B 0x65 0x20 0x61 0x20 // ' make a ' 0x66 0x6C 0x79 0x69 0x6E 0x67 0x20 0x6C // 'flying l' 0x6F 0x67 0x6F 0x97 0x33 0x44 0x20 0x77 // 'ogo3D w' 0x6F 0x72 0x64 0x73 0x20 0x74 0x68 0x61 // 'ords tha' 0x74 0x20 0x66 0x6C 0x79 0x20 0x6F 0x6E // 't fly on' 0x20 0x73 0x63 0x72 0x65 0x65 0x6E 0x21 // ' screen!' 0x0D 0x0A 0x46 0x6F 0x72 0x20 0x65 0x78 // '??For ex' 0x61 0x6D 0x70 0x6C 0x65 0x2C 0x20 0x79 // 'ample, y' 0x6F 0x75 0x20 0x6D 0x61 0x79 0x20 0x77 // 'ou may w' 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 0x6D // 'ant to m' 0x61 0x6B 0x65 0x20 0x79 0x6F 0x75 0x72 // 'ake your' 0x20 0x6F 0x77 0x6E 0x20 0x6D 0x6F 0x76 // ' own mov' 0x69 0x65 0x20 0x63 0x6F 0x6D 0x70 0x61 // 'ie compa' 0x6E 0x79 0x20 0x6E 0x61 0x6D 0x65 0x20 // 'ny name ' 0x6F 0x72 0x20 0x63 0x72 0x65 0x61 0x74 // 'or creat' 0x65 0x20 0x61 0x20 0x33 0x44 0x20 0x74 // 'e a 3D t' 0x69 0x74 0x6C 0x65 0x20 0x66 0x6F 0x72 // 'itle for' 0x20 0x79 0x6F 0x75 0x72 0x20 0x6D 0x6F // ' your mo' 0x76 0x69 0x65 0x2E 0x0D 0x0A 0x01 // 'vie.???' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1= ktpcLogo01 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("Camera Angles")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("Camera Angles")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobProject kidSettingsCameras kidPlayLogoSounds 0x0 0x0 0x57415645 kwavLogo01 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcLogo01" ITEM "kgobProject" ITEM "kidSettingsCameras" ITEM "kidPlayLogoSounds" ITEM "kwavLogo01" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0x7C 0x00 0x00 0x00 // '????|???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_4=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x14 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x03 // '????????' 0x0B 0x00 0x00 0xFD 0x13 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x43 0x61 0x6D 0x65 0x72 0x61 0x20 0x41 // 'Camera A' 0x6E 0x67 0x6C 0x65 0x73 0x2E // 'ngles.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2= ktpcLogo02 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2, __HELP_NAME("CO--To see background ")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2, __HELP_NAME("CO--To see background ")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon1 kgobProject kidSettingsBrowser kidPlayLogoSounds 0x0 0x0 0x57415645 kwavLogo02 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2, 0x0) GST(0) ITEM "kgobCalloutBalloon1" ITEM "ktpcLogo02" ITEM "kgobProject" ITEM "kidSettingsBrowser" ITEM "kidPlayLogoSounds" ITEM "kwavLogo02" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2, 0x0) BYTE 0x01 0x00 0x03 0x03 0x9E 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x27 0x00 0x00 0x01 // '????'???' 0x00 0x00 0x00 0x00 0x21 0x00 0x00 0x03 // '????!???' 0x0B 0x00 0x00 0xFD 0x27 0x00 0x00 0x03 // '???'???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x73 0x65 0x65 // '??To see' 0x20 0x62 0x61 0x63 0x6B 0x67 0x72 0x6F // ' backgro' 0x75 0x6E 0x64 0x20 0x63 0x68 0x6F 0x69 // 'und choi' 0x63 0x65 0x73 0x2C 0x20 0x63 0x6C 0x69 // 'ces, cli' 0x63 0x6B 0x20 0x53 0x63 0x65 0x6E 0x65 // 'ck Scene' 0x73 0x2E // 's.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3= ktpcLogo03 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3, __HELP_NAME("CO--Click the background")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3, __HELP_NAME("CO--Click the background")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject 0x0 kidPlayLogoSounds 0xAA 0x0 0x57415645 kwavLogo03 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcLogo03" ITEM "kgobProject" ITEM "" ITEM "kidPlayLogoSounds" ITEM "kwavLogo03" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1E 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x62 0x61 0x63 0x6B // 'the back' 0x67 0x72 0x6F 0x75 0x6E 0x64 0x20 0x79 // 'ground y' 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 0x2E // 'ou want.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_4= ktpcLogo04 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4, __HELP_NAME("CO--Then click the camera")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4, __HELP_NAME("CO--Then click the camera")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject 0x0 kidPlayLogoSounds 0x140 0x6E 0x57415645 kwavLogo04 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_8=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcLogo04" ITEM "kgobProject" ITEM "" ITEM "kidPlayLogoSounds" ITEM "kwavLogo04" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_8=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4, 0x0) BYTE 0x01 0x00 0x03 0x03 0x83 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_8=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2C 0x00 0x00 0x01 // '????,???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_8=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) BYTE 0x03 0x03 0x54 0x68 0x65 0x6E 0x20 0x63 // '??Then c' 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 // 'lick the' 0x20 0x63 0x61 0x6D 0x65 0x72 0x61 0x20 // ' camera ' 0x61 0x6E 0x67 0x6C 0x65 0x20 0x79 0x6F // 'angle yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 // 'u want t' 0x6F 0x20 0x75 0x73 0x65 0x2E // 'o use.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_5= ktpcLogo05 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5, __HELP_NAME("CO--To create 3D words for")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5, __HELP_NAME("CO--To create 3D words for")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobProject kidActorsCover kidPlayLogoSounds 0x0 0x0 0x57415645 kwavLogo05 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_6=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcLogo05" ITEM "kgobProject" ITEM "kidActorsCover" ITEM "kidPlayLogoSounds" ITEM "kwavLogo05" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_6=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB1 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_6=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x27 0x00 0x00 0x01 // '????'???' 0x00 0x00 0x00 0x00 0x28 0x00 0x00 0x01 // '????(???' 0x01 0x00 0x00 0x00 0x39 0x00 0x00 0x01 // '????9???' 0x00 0x00 0x00 0x00 0x28 0x00 0x00 0x03 // '????(???' 0x0B 0x00 0x00 0xFD 0x36 0x00 0x00 0x03 // '???6???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_6=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x63 0x72 0x65 // '??To cre' 0x61 0x74 0x65 0x20 0x33 0x44 0x20 0x77 // 'ate 3D w' 0x6F 0x72 0x64 0x73 0x20 0x66 0x6F 0x72 // 'ords for' 0x20 0x79 0x6F 0x75 0x72 0x20 0x6C 0x6F // ' your lo' 0x67 0x6F 0x2C 0x20 0x63 0x6C 0x69 0x63 // 'go, clic' 0x6B 0x20 0x41 0x63 0x74 0x6F 0x72 0x73 // 'k Actors' 0x20 0x26 0x20 0x50 0x72 0x6F 0x70 0x73 // ' & Props' 0x2E 0x2E 0x2E // '...' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_6= ktpcLogo06 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6, __HELP_NAME("CO--Then click 3D Words")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6, __HELP_NAME("CO--Then click 3D Words")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobProject kidActorsSpletters kidPlayLogoSounds 0x0 0x0 0x57415645 kwavLogo06 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcLogo06" ITEM "kgobProject" ITEM "kidActorsSpletters" ITEM "kidPlayLogoSounds" ITEM "kwavLogo06" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6, 0x0) BYTE 0x01 0x00 0x03 0x03 0x8C 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0D 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x0E 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x16 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x0E 0x00 0x00 0x03 // '????????' 0x0B 0x00 0x00 0xFD 0x16 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) BYTE 0x03 0x03 0x2E 0x2E 0x2E 0x74 0x68 0x65 // '??...the' 0x6E 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 // 'n click ' 0x33 0x44 0x20 0x57 0x6F 0x72 0x64 0x73 // '3D Words' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_7= ktpcLogo07 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7, __HELP_NAME("CO--Type your words here")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7, __HELP_NAME("CO--Type your words here")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject 0x0 kidPlayLogoSounds 0x140 0x6E 0x57415645 kwavLogo07 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcLogo07" ITEM "kgobProject" ITEM "" ITEM "kidPlayLogoSounds" ITEM "kwavLogo07" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC9 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x5A 0x00 0x00 0x01 // '????Z???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) BYTE 0x03 0x03 0x54 0x79 0x70 0x65 0x20 0x79 // '??Type y' 0x6F 0x75 0x72 0x20 0x77 0x6F 0x72 0x64 // 'our word' 0x73 0x20 0x68 0x65 0x72 0x65 0x2E 0x20 // 's here. ' 0x20 0x49 0x66 0x20 0x79 0x6F 0x75 0x20 // ' If you ' 0x6D 0x61 0x6B 0x65 0x20 0x61 0x20 0x6D // 'make a m' 0x69 0x73 0x74 0x61 0x6B 0x65 0x2C 0x20 // 'istake, ' 0x70 0x72 0x65 0x73 0x73 0x20 0x42 0x61 // 'press Ba' 0x63 0x6B 0x73 0x70 0x61 0x63 0x65 0x2E // 'ckspace.' 0x20 0x57 0x68 0x65 0x6E 0x20 0x79 0x6F // ' When yo' 0x75 0x92 0x72 0x65 0x20 0x64 0x6F 0x6E // 'ure don' 0x65 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B // 'e, click' 0x20 0x4F 0x4B 0x2E // ' OK.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_8= ktpcLogo08 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8, __HELP_NAME("Alert--You need a 3D word for")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8, __HELP_NAME("Alert--You need a 3D word for")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobProject kidActorsSpletters kidPlayLogoSounds 0x0 0x0 0x57415645 kwavLogo08 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_9=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcLogo08" ITEM "kgobProject" ITEM "kidActorsSpletters" ITEM "kidPlayLogoSounds" ITEM "kwavLogo08" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_9=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA9 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_9=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_9, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2B 0x00 0x00 0x01 // '????+???' 0x00 0x00 0x00 0x00 0x2C 0x00 0x00 0x01 // '????,???' 0x01 0x00 0x00 0x00 0x34 0x00 0x00 0x01 // '????4???' 0x00 0x00 0x00 0x00 0x2C 0x00 0x00 0x03 // '????,???' 0x0B 0x00 0x00 0xFD 0x34 0x00 0x00 0x03 // '???4???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_9=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_9, 0x0) BYTE 0x03 0x03 0x59 0x6F 0x75 0x20 0x6E 0x65 // '??You ne' 0x65 0x64 0x20 0x61 0x20 0x33 0x44 0x20 // 'ed a 3D ' 0x77 0x6F 0x72 0x64 0x20 0x66 0x6F 0x72 // 'word for' 0x20 0x74 0x68 0x69 0x73 0x20 0x70 0x72 // ' this pr' 0x6F 0x6A 0x65 0x63 0x74 0x2E 0x20 0x20 // 'oject. ' 0x43 0x6C 0x69 0x63 0x6B 0x20 0x33 0x44 // 'Click 3D' 0x20 0x57 0x6F 0x72 0x64 0x73 0x2E // ' Words.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_9= ktpcLogo09 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_9, __HELP_NAME("CO--Click the place you want")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_9, __HELP_NAME("CO--Click the place you want")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject 0x0 kidPlayLogoSounds 0x140 0x6E 0x57415645 kwavLogo09 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_9, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcLogo09" ITEM "kgobProject" ITEM "" ITEM "kidPlayLogoSounds" ITEM "kwavLogo09" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_9, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC4 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x98 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x3B 0x00 0x00 0x82 // '????;??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x70 0x6C 0x61 0x63 // 'the plac' 0x65 0x20 0x77 0x68 0x65 0x72 0x65 0x20 // 'e where ' 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 // 'you want' 0x20 0x79 0x6F 0x75 0x72 0x20 0x6C 0x6F // ' your lo' 0x67 0x6F 0x20 0x74 0x6F 0x20 0x66 0x69 // 'go to fi' 0x72 0x73 0x74 0x20 0x61 0x70 0x70 0x65 // 'rst appe' 0x61 0x72 0x2E 0x0D 0x0A 0x49 0x66 0x20 // 'ar.??If ' 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 // 'you want' 0x20 0x74 0x6F 0x20 0x6D 0x6F 0x76 0x65 // ' to move' 0x20 0x74 0x68 0x65 0x20 0x6C 0x6F 0x67 // ' the log' 0x6F 0x20 0x75 0x70 0x20 0x6F 0x72 0x20 // 'o up or ' 0x64 0x6F 0x77 0x6E 0x2C 0x20 0x68 0x6F // 'down, ho' 0x6C 0x64 0x20 0x64 0x6F 0x77 0x6E 0x20 // 'ld down ' 0x74 0x68 0x65 0x20 0x55 0x70 0x20 0x6F // 'the Up o' 0x72 0x20 0x44 0x6F 0x77 0x6E 0x20 0x41 // 'r Down A' 0x72 0x72 0x6F 0x77 0x20 0x6B 0x65 0x79 // 'rrow key' 0x20 0x62 0x65 0x66 0x6F 0x72 0x65 0x20 // ' before ' 0x79 0x6F 0x75 0x20 0x63 0x6C 0x69 0x63 // 'you clic' 0x6B 0x2E // 'k.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_A= ktpcLogo0A #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_A, __HELP_NAME("CO--To make the logo move")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_A, __HELP_NAME("CO--To make the logo move")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobProject kidActorsActionBrowser kidPlayLogoSounds 0x0 0x0 0x57415645 kwavLogo0A ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_5=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_A, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpcLogo0A" ITEM "kgobProject" ITEM "kidActorsActionBrowser" ITEM "kidPlayLogoSounds" ITEM "kwavLogo0A" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_5=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x80 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_5=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1D 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x1E 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x25 0x00 0x00 0x01 // '????%???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x1E 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0x25 0x00 0x00 0x03 // '???%???' 0x0F 0x00 0x00 0xFD 0x26 0x00 0x00 0x03 // '???&???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_5=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x6D 0x61 0x6B // '??To mak' 0x65 0x20 0x79 0x6F 0x75 0x72 0x20 0x6C // 'e your l' 0x6F 0x67 0x6F 0x20 0x6D 0x6F 0x76 0x65 // 'ogo move' 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 // ', click ' 0x41 0x63 0x74 0x69 0x6F 0x6E 0x73 0x2E // 'Actions.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_B= ktpcLogo0B #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_B, __HELP_NAME("CO--Click the logo")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_B, __HELP_NAME("CO--Click the logo")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject 0x0 kidPlayLogoSounds 0x140 0x6E 0x57415645 kwavLogo0B ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_B, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcLogo0B" ITEM "kgobProject" ITEM "" ITEM "kidPlayLogoSounds" ITEM "kwavLogo0B" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x51 0x00 0x00 0x00 // '????Q???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0F 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x6C 0x6F 0x67 0x6F // 'the logo' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_C= ktpcLogo0C #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_C, __HELP_NAME("CO--Click the action you")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_C, __HELP_NAME("CO--Click the action you")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject 0x0 kidPlayLogoSounds 0x140 0x6E 0x57415645 kwavLogo0C ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_10=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_C, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcLogo0C" ITEM "kgobProject" ITEM "" ITEM "kidPlayLogoSounds" ITEM "kwavLogo0C" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_10=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_C, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_10=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_10, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x03 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x46 0x00 0x00 0x01 // '????F???' 0x01 0x00 0x00 0x00 0x50 0x00 0x00 0x01 // '????P???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_10=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_10, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x69 // 'the acti' 0x6F 0x6E 0x20 0x79 0x6F 0x75 0x20 0x77 // 'on you w' 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 0x70 // 'ant to p' 0x72 0x65 0x76 0x69 0x65 0x77 0x2E 0x20 // 'review. ' 0x20 0x57 0x68 0x65 0x6E 0x20 0x79 0x6F // ' When yo' 0x75 0x20 0x66 0x69 0x6E 0x64 0x20 0x74 // 'u find t' 0x68 0x65 0x20 0x6F 0x6E 0x65 0x20 0x79 // 'he one y' 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 0x2C // 'ou want,' 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 0x4F // ' click O' 0x4B 0x2E // 'K.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_11= ktpcLogo11 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_11, __HELP_NAME("CO--Hold down the mouse ")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_11, __HELP_NAME("CO--Hold down the mouse ")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject 0x0 kidPlayLogoSounds 0x140 0x6E 0x57415645 kwavLogo11 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_11, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpcLogo11" ITEM "kgobProject" ITEM "" ITEM "kidPlayLogoSounds" ITEM "kwavLogo11" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_11, 0x0) BYTE 0x01 0x00 0x03 0x03 0xDC 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_3=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) AG(4) FREE ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpcLogo5C __HELP_SYMBOL( STN "ktpcLogo5C" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_3=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x94 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x63 0x00 0x00 0x03 // '????c???' 0x0B 0x00 0x00 0xFD 0x67 0x00 0x00 0x03 // '???g???' 0x00 0x00 0x00 0x00 0x71 0x00 0x00 0x40 // '????q??@' 0x03 0x00 0x00 0x00 0x94 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x71 0x00 0x00 0x80 // '????q??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x71 0x00 0x00 0x82 // '????q??' 0x00 0x00 0x00 0x00 0x71 0x00 0x00 0xC0 // '????q??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) BYTE 0x03 0x03 0x48 0x6F 0x6C 0x64 0x20 0x64 // '??Hold d' 0x6F 0x77 0x6E 0x20 0x74 0x68 0x65 0x20 // 'own the ' 0x6D 0x6F 0x75 0x73 0x65 0x20 0x62 0x75 // 'mouse bu' 0x74 0x74 0x6F 0x6E 0x20 0x61 0x6E 0x64 // 'tton and' 0x20 0x64 0x72 0x61 0x67 0x20 0x74 0x68 // ' drag th' 0x65 0x20 0x6C 0x6F 0x67 0x6F 0x20 0x77 // 'e logo w' 0x68 0x65 0x72 0x65 0x20 0x79 0x6F 0x75 // 'here you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x69 0x74 // ' want it' 0x20 0x74 0x6F 0x20 0x67 0x6F 0x2E 0x0D // ' to go.?' 0x0A 0x57 0x68 0x65 0x6E 0x20 0x79 0x6F // '?When yo' 0x75 0x92 0x72 0x65 0x20 0x64 0x6F 0x6E // 'ure don' 0x65 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B // 'e, click' 0x20 0x74 0x68 0x65 0x20 0x50 0x6C 0x61 // ' the Pla' 0x79 0x20 0x62 0x75 0x74 0x74 0x6F 0x6E // 'y button' 0x2E 0x0D 0x0A 0x01 0x20 0x4D 0x6F 0x76 // '.??? Mov' 0x69 0x6E 0x67 0x20 0x75 0x70 0x20 0x6F // 'ing up o' 0x72 0x20 0x64 0x6F 0x77 0x6E 0x20 0x61 // 'r down a' 0x6E 0x64 0x20 0x6E 0x65 0x61 0x72 0x20 // 'nd near ' 0x6F 0x72 0x20 0x66 0x61 0x72 // 'or far' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_12= ktpcLogo12 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_12, __HELP_NAME("Great! You're done")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_12, __HELP_NAME("Great! You're done")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobProject 0x0 kidPlayLogoSounds 0x140 0xF0 0x57415645 kwavLogo12 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_12, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpcLogo12" ITEM "kgobProject" ITEM "" ITEM "kidPlayLogoSounds" ITEM "kwavLogo12" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_12, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) AG(4) ITEM LONG 0xC0000004 VAR LONG 'GOKD' _gobHelpSquishy 0xFFFFFFFF __HELP_SYMBOL( STN "_gobHelpSquishy" ) ITEM LONG 0x40000001 VAR BYTE 0x01 0xFF 0xFF 0xFF 0xFF // '?' ITEM LONG 0x40000001 VAR BYTE 0x02 0xFF 0xFF 0xFF 0xFF // '?' ITEM LONG 0x40000001 VAR BYTE 0x03 0xFF 0xFF 0xFF 0xFF // '?' ITEM LONG 0x40000001 VAR BYTE 0x04 0xFF 0xFF 0xFF 0xFF // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x14 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x34 0x00 0x00 0x01 // '????4???' 0x00 0x00 0x00 0x00 0x38 0x00 0x00 0x01 // '????8???' 0x01 0x00 0x00 0x00 0x98 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0B 0x00 0x00 0xFD 0x34 0x00 0x00 0x03 // '???4???' 0x00 0x00 0x00 0x00 0x36 0x00 0x00 0x40 // '????6??@' 0x02 0x00 0x00 0x00 0x49 0x00 0x00 0x40 // '????I??@' 0x00 0x00 0x00 0x00 0x4B 0x00 0x00 0x40 // '????K??@' 0x03 0x00 0x00 0x00 0x5F 0x00 0x00 0x40 // '????_??@' 0x00 0x00 0x00 0x00 0x61 0x00 0x00 0x40 // '????a??@' 0x04 0x00 0x00 0x00 0x80 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x82 0x00 0x00 0x40 // '??????@' 0x05 0x00 0x00 0x00 0x98 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x82 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x36 0x00 0x00 0xC0 // '????6??' 0x01 0x00 0x00 0x00 0x4B 0x00 0x00 0xC0 // '????K??' 0x01 0x00 0x00 0x00 0x61 0x00 0x00 0xC0 // '????a??' 0x01 0x00 0x00 0x00 0x82 0x00 0x00 0xC0 // '??????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) BYTE 0x03 0x03 0x47 0x72 0x65 0x61 0x74 0x21 // '??Great!' 0x20 0x20 0x59 0x6F 0x75 0x92 0x72 0x65 // ' Youre' 0x20 0x64 0x6F 0x6E 0x65 0x21 0x20 0x20 // ' done! ' 0x57 0x68 0x61 0x74 0x20 0x77 0x6F 0x75 // 'What wou' 0x6C 0x64 0x20 0x79 0x6F 0x75 0x20 0x6C // 'ld you l' 0x69 0x6B 0x65 0x20 0x74 0x6F 0x20 0x64 // 'ike to d' 0x6F 0x20 0x6E 0x6F 0x77 0x3F 0x0D 0x0A // 'o now???' 0x01 0x09 0x57 0x6F 0x72 0x6B 0x20 0x6F // '??Work o' 0x6E 0x20 0x79 0x6F 0x75 0x72 0x20 0x6F // 'n your o' 0x77 0x6E 0x3F 0x0D 0x0A 0x01 0x09 0x4D // 'wn?????M' 0x61 0x6B 0x65 0x20 0x61 0x6E 0x6F 0x74 // 'ake anot' 0x68 0x65 0x72 0x20 0x6C 0x6F 0x67 0x6F // 'her logo' 0x3F 0x0D 0x0A 0x01 0x09 0x47 0x6F 0x20 // '?????Go ' 0x62 0x61 0x63 0x6B 0x20 0x74 0x6F 0x20 // 'back to ' 0x74 0x68 0x65 0x20 0x50 0x72 0x6F 0x6A // 'the Proj' 0x65 0x63 0x74 0x73 0x20 0x52 0x6F 0x6F // 'ects Roo' 0x6D 0x3F 0x0D 0x0A 0x01 0x09 0x51 0x75 // 'm?????Qu' 0x69 0x74 0x20 0x33 0x44 0x20 0x4D 0x6F // 'it 3D Mo' 0x76 0x69 0x65 0x20 0x4D 0x61 0x6B 0x65 // 'vie Make' 0x72 0x3F // 'r?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_5C= ktpcLogo5C #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5C, __HELP_NAME("Tip: Move Up Down Near Far")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5C, __HELP_NAME("Tip: Move Up Down Near Far")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp kgobProjectHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5C, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "ktpcLogo5C" ITEM "kgobProjectHot" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_0=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x0A 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_4=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_0=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0E 0x00 0x00 0x00 0x04 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x25 0x00 0x00 0x01 // '????%???' 0x00 0x00 0x00 0x00 0x27 0x00 0x00 0x01 // '????'???' 0x01 0x00 0x00 0x00 0x52 0x00 0x00 0x01 // '????R???' 0x00 0x00 0x00 0x00 0x54 0x00 0x00 0x01 // '????T???' 0x01 0x00 0x00 0x00 0x79 0x00 0x00 0x01 // '????y???' 0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x03 // '????????' 0x46 0x00 0x00 0xFD 0x04 0x00 0x00 0x03 // 'F??????' 0x00 0x00 0x00 0x00 0x27 0x00 0x00 0x03 // '????'???' 0x0B 0x00 0x00 0xFD 0x52 0x00 0x00 0x03 // '???R???' 0x00 0x00 0x00 0x00 0x54 0x00 0x00 0x80 // '????T??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x54 0x00 0x00 0x82 // '????T??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_0=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x20 0x4D 0x6F // '??? Mo' 0x76 0x69 0x6E 0x67 0x20 0x75 0x70 0x20 // 'ving up ' 0x6F 0x72 0x20 0x64 0x6F 0x77 0x6E 0x20 // 'or down ' 0x61 0x6E 0x64 0x20 0x6E 0x65 0x61 0x72 // 'and near' 0x20 0x6F 0x72 0x20 0x66 0x61 0x72 0x0D // ' or far?' 0x0A 0x54 0x6F 0x20 0x6D 0x6F 0x76 0x65 // '?To move' 0x20 0x74 0x68 0x65 0x20 0x6C 0x6F 0x67 // ' the log' 0x6F 0x20 0x75 0x70 0x20 0x6F 0x72 0x20 // 'o up or ' 0x64 0x6F 0x77 0x6E 0x20 0x61 0x6E 0x64 // 'down and' 0x20 0x6E 0x65 0x61 0x72 0x20 0x6F 0x72 // ' near or' 0x20 0x66 0x61 0x72 0x0D 0x0A 0x95 0x09 // ' far???' 0x48 0x6F 0x6C 0x64 0x20 0x64 0x6F 0x77 // 'Hold dow' 0x6E 0x20 0x74 0x68 0x65 0x20 0x55 0x70 // 'n the Up' 0x20 0x6F 0x72 0x20 0x44 0x6F 0x77 0x6E // ' or Down' 0x20 0x41 0x72 0x72 0x6F 0x77 0x20 0x6B // ' Arrow k' 0x65 0x79 0x2E // 'ey.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK ================================================ FILE: src/help/makefile ================================================ #---$(SOC_ROOT)\src\help\makefile !IFNDEF MAKEFILE_HELP MAKEFILE_HELP = 1 !INCLUDE $(KAUAI_ROOT)\makefile.def #HELP SOURCE DIRECTORY HELP_SRC_DIR = $(SOC_ROOT)\src\help #SOC OBJ DIRECTORY SOC_OBJ_ROOT_DIR = $(SOC_ROOT)\obj SOC_OBJ_DIR = $(SOC_OBJ_ROOT_DIR)\$(BLD_TYPE_DIR) !IF "$(LOCAL_BUILD)" == "1" TARGET_DIR = !ELSE # LOCAL_BUILD TARGET_DIR = $(SOC_OBJ_DIR)^\ !ENDIF # !LOCAL_BUILD HELP_CHT_FILES = \ $(HELP_SRC_DIR)\help.cht\ $(HELP_SRC_DIR)\actorbio.cht\ $(HELP_SRC_DIR)\bktips.cht\ $(HELP_SRC_DIR)\bkhowto.cht\ $(HELP_SRC_DIR)\bktocbas.cht\ $(HELP_SRC_DIR)\bktools.cht\ $(HELP_SRC_DIR)\basics.cht\ $(HELP_SRC_DIR)\booktpc.cht\ $(HELP_SRC_DIR)\easelhp.cht\ $(HELP_SRC_DIR)\errors.cht\ $(HELP_SRC_DIR)\guidhelp.cht\ $(HELP_SRC_DIR)\htalerts.cht\ $(HELP_SRC_DIR)\htactors.cht\ $(HELP_SRC_DIR)\htscenes.cht\ $(HELP_SRC_DIR)\htsounds.cht\ $(HELP_SRC_DIR)\htwords.cht\ $(HELP_SRC_DIR)\logo.cht\ $(HELP_SRC_DIR)\prjalert.cht\ $(HELP_SRC_DIR)\prjtips.cht\ $(HELP_SRC_DIR)\prjintro.cht\ $(HELP_SRC_DIR)\project1.cht\ $(HELP_SRC_DIR)\project2.cht\ $(HELP_SRC_DIR)\project3.cht\ $(HELP_SRC_DIR)\project4.cht\ $(HELP_SRC_DIR)\project5.cht\ $(HELP_SRC_DIR)\project6.cht\ $(HELP_SRC_DIR)\gadget1.cht\ $(HELP_SRC_DIR)\gadget2.cht\ $(HELP_SRC_DIR)\gadget3.cht\ $(HELP_SRC_DIR)\gadget4.cht\ $(HELP_SRC_DIR)\gadget5.cht\ $(HELP_SRC_DIR)\gadget6.cht\ $(HELP_SRC_DIR)\toolhelp.cht\ $(HELP_SRC_DIR)\tooltips.cht\ $(HELP_SRC_DIR)\app.cht\ $(HELP_SRC_DIR)\topics1.cht HELP_CHUNK_TARGETS =\ $(TARGET_DIR)help.chk #-Compile rules------------------------------------------------------------- SRC_DIR = $(HELP_SRC_DIR) OBJ_DIR = $(SOC_OBJ_DIR) TGT_NAME = Help !INCLUDE $(SOC_ROOT)\makefile.rul #-Targets------------------------------------------------------------------- ALL_HELP = $(TARGET_DIR)help.chk ALL_TARGETS_ROOT = $(ALL_TARGETS_ROOT) $(ALL_HELP) CLEAN_HELP = CLEAN_HELP_CHUNKS CLEAN_TARGETS_ROOT = $(CLEAN_TARGETS_ROOT) $(CLEAN_HELP) !IF "$(LOCAL_BUILD)" != "1" !IF "$(LOCAL_BUILD)" != "0" ALL: $(SOC_OBJ_DIR) HELP_CONTENT CLEAN: CLEAN_HELP_CHUNKS ALL !ENDIF # LOCAL_BUILD != 0 $(SOC_OBJ_DIR) : @echo Making Directories $(SOC_OBJ_DIR)... if not exist $(SOC_OBJ_ROOT_DIR)/nul mkdir $(SOC_OBJ_ROOT_DIR) if not exist $(SOC_OBJ_DIR)/nul mkdir $(SOC_OBJ_DIR) !ENDIF # LOCAL_BUILD != 1 CLEAN_HELP_CHUNKS: @echo <nul^ DEL /q dummy.nul ) 2>nul <???' 0x00 0x00 0x00 0x00 0x0E 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x10 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0E 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_8=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) BYTE 0x03 0x03 0x56 0x6F 0x6C 0x75 0x6D 0x65 // '??Volume' 0x20 0x43 0x6F 0x6E 0x74 0x72 0x6F 0x6C // ' Control' 0x0D 0x0A 0x41 0x64 0x6A 0x75 0x73 0x74 // '??Adjust' 0x20 0x74 0x68 0x65 0x20 0x76 0x6F 0x6C // ' the vol' 0x75 0x6D 0x65 0x20 0x66 0x6F 0x72 0x20 // 'ume for ' 0x61 0x6C 0x6C 0x20 0x74 0x68 0x65 0x20 // 'all the ' 0x73 0x6F 0x75 0x6E 0x64 0x73 0x20 0x79 // 'sounds y' 0x6F 0x75 0x20 0x68 0x65 0x61 0x72 0x2E // 'ou hear.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1= ttNextMovie #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("ttNextMovie")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("ttNextMovie")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kidGadgetSelectorUp 0xFFFFFFFF 0xB9 0x14 0x57415645 kwavPrjTips01 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_5=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "ttNextMovie" ITEM "" ITEM "kidGadgetSelectorUp" ITEM "" ITEM "kwavPrjTips01" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_5=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0x83 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_5=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_5=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x21 0x00 0x00 0x01 // '????!???' 0x00 0x00 0x00 0x00 0x0A 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0C 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0A 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_5=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x03 0x03 0x4E 0x65 0x78 0x74 0x20 0x4D // '??Next M' 0x6F 0x76 0x69 0x65 0x0D 0x0A 0x47 0x6F // 'ovie??Go' 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 // ' to the ' 0x6E 0x65 0x78 0x74 0x20 0x6D 0x6F 0x76 // 'next mov' 0x69 0x65 0x2E // 'ie.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2= ttPreviousMovie #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2, __HELP_NAME("ttPreviousMovie")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2, __HELP_NAME("ttPreviousMovie")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kidGadgetSelectorDown 0xFFFFFFFF 0xC9 0x14 0x57415645 kwavPrjTips02 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_6=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "ttPreviousMovie" ITEM "" ITEM "kidGadgetSelectorDown" ITEM "" ITEM "kwavPrjTips02" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_6=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2, 0x0) BYTE 0x01 0x00 0x03 0x03 0x94 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_6=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_6=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x29 0x00 0x00 0x01 // '????)???' 0x00 0x00 0x00 0x00 0x0E 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x10 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0E 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_6=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) BYTE 0x03 0x03 0x50 0x72 0x65 0x76 0x69 0x6F // '??Previo' 0x75 0x73 0x20 0x4D 0x6F 0x76 0x69 0x65 // 'us Movie' 0x0D 0x0A 0x47 0x6F 0x20 0x74 0x6F 0x20 // '??Go to ' 0x74 0x68 0x65 0x20 0x70 0x72 0x65 0x76 // 'the prev' 0x69 0x6F 0x75 0x73 0x20 0x6D 0x6F 0x76 // 'ious mov' 0x69 0x65 0x2E // 'ie.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3= ttPlayButton #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3, __HELP_NAME("ttPlayButton")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3, __HELP_NAME("ttPlayButton")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidGadgetPlay 0xFFFFFFFF 0x0 0x0 0x57415645 kwavPrjTips03 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "ttPlayButton" ITEM "" ITEM "kidGadgetPlay" ITEM "" ITEM "kwavPrjTips03" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3, 0x0) BYTE 0x01 0x00 0x03 0x03 0x88 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_3=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_3=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x25 0x00 0x00 0x01 // '????%???' 0x00 0x00 0x00 0x00 0x0B 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0D 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0B 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) BYTE 0x03 0x03 0x50 0x6C 0x61 0x79 0x20 0x42 // '??Play B' 0x75 0x74 0x74 0x6F 0x6E 0x0D 0x0A 0x43 // 'utton??C' 0x6C 0x69 0x63 0x6B 0x20 0x74 0x6F 0x20 // 'lick to ' 0x70 0x6C 0x61 0x79 0x20 0x74 0x68 0x65 // 'play the' 0x20 0x6D 0x6F 0x76 0x69 0x65 0x2E // ' movie.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_4= ttHowButton #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4, __HELP_NAME("ttHowButton")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4, __HELP_NAME("ttHowButton")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidGadgetHow 0xFFFFFFFF 0x0 0x0 0x57415645 kwavPrjTips04 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_7=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "ttHowButton" ITEM "" ITEM "kidGadgetHow" ITEM "" ITEM "kwavPrjTips04" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_7=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4, 0x0) BYTE 0x01 0x00 0x03 0x03 0x87 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_7=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_7=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x23 0x00 0x00 0x01 // '????#???' 0x00 0x00 0x00 0x00 0x0A 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0C 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0A 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_7=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) BYTE 0x03 0x03 0x48 0x6F 0x77 0x20 0x42 0x75 // '??How Bu' 0x74 0x74 0x6F 0x6E 0x0D 0x0A 0x43 0x6C // 'tton??Cl' 0x69 0x63 0x6B 0x20 0x74 0x6F 0x20 0x73 // 'ick to s' 0x65 0x65 0x20 0x74 0x68 0x65 0x20 0x73 // 'ee the s' 0x74 0x65 0x70 0x73 0x2E // 'teps.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_5= ttCloseButton #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5, __HELP_NAME("ttCloseButton")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5, __HELP_NAME("ttCloseButton")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidGadgetCancel 0xFFFFFFFF 0x0 0x0 0x57415645 kwavPrjTips05 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_0=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "ttCloseButton" ITEM "" ITEM "kidGadgetCancel" ITEM "" ITEM "kwavPrjTips05" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC6 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_0=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x30 0x00 0x00 0x01 // '????0???' 0x00 0x00 0x00 0x00 0x0C 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0E 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0C 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x6F 0x73 0x65 0x20 // '??Close ' 0x42 0x75 0x74 0x74 0x6F 0x6E 0x0D 0x0A // 'Button??' 0x43 0x6C 0x69 0x63 0x6B 0x20 0x74 0x6F // 'Click to' 0x20 0x63 0x6C 0x6F 0x73 0x65 0x20 0x74 // ' close t' 0x68 0x65 0x20 0x50 0x72 0x6F 0x6A 0x65 // 'he Proje' 0x63 0x74 0x20 0x47 0x61 0x64 0x67 0x65 // 'ct Gadge' 0x74 0x2E // 't.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_6= ttMelanieOnOff #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6, __HELP_NAME("ttMelanieOnOff")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6, __HELP_NAME("ttMelanieOnOff")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidGadgetVoice 0xFFFFFFFF 0x0 0x0 0x57415645 kwavPrjTips06 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "ttMelanieOnOff" ITEM "" ITEM "kidGadgetVoice" ITEM "" ITEM "kwavPrjTips06" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB6 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x30 0x00 0x00 0x01 // '????0???' 0x00 0x00 0x00 0x00 0x0F 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x11 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0F 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) BYTE 0x03 0x03 0x4D 0x65 0x6C 0x61 0x6E 0x69 // '??Melani' 0x65 0x27 0x73 0x20 0x56 0x6F 0x69 0x63 // 'e's Voic' 0x65 0x0D 0x0A 0x54 0x75 0x72 0x6E 0x20 // 'e??Turn ' 0x4D 0x65 0x6C 0x61 0x6E 0x69 0x65 0x27 // 'Melanie'' 0x73 0x20 0x76 0x6F 0x69 0x63 0x65 0x20 // 's voice ' 0x6F 0x6E 0x20 0x6F 0x72 0x20 0x6F 0x66 // 'on or of' 0x66 0x2E // 'f.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_7= ttWhyButton #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7, __HELP_NAME("ttWhyButton")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7, __HELP_NAME("ttWhyButton")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidGadgetWhy 0xFFFFFFFF 0x0 0x0 0x57415645 kwavPrjTips07 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "ttWhyButton" ITEM "" ITEM "kidGadgetWhy" ITEM "" ITEM "kwavPrjTips07" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7, 0x0) BYTE 0x01 0x00 0x03 0x03 0x74 0x00 0x00 0x00 // '????t???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_4=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_4=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x19 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x05 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x03 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) BYTE 0x03 0x03 0x54 0x69 0x70 0x0D 0x0A 0x43 // '??Tip??C' 0x6C 0x69 0x63 0x6B 0x20 0x74 0x6F 0x20 // 'lick to ' 0x6C 0x65 0x61 0x72 0x6E 0x20 0x6D 0x6F // 'learn mo' 0x72 0x65 0x2E // 're.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK ================================================ FILE: src/help/project1.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ #undef __HELP_NAME #undef __HELP_SYMBOL #undef __HELP_PACK #undef __HELP_PACK2 #ifdef NO_HELP_NAMES #define __HELP_NAME(name) "" #else #define __HELP_NAME(name) name #endif #ifdef NO_HELP_SYMBOLS #define __HELP_SYMBOL(stuff) #else #define __HELP_SYMBOL(stuff) stuff #endif #ifdef PACK_HELP #define __HELP_PACK PACK #else #define __HELP_PACK #endif #ifdef HELP_SINGLE_CHUNK #define __HELP_PACK2 #else #define __HELP_PACK2 __HELP_PACK #endif SET _help_48544F50_0= ktpc1Project00 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("To see this movie--CUT")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("To see this movie--CUT")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon1 kgobProject kidGadgetPlay kidPlayProjectSounds 0x0 0x0 0x57415645 kwav1Project00 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_12=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) GST(0) ITEM "kgobCalloutBalloon1" ITEM "ktpc1Project00" ITEM "kgobProject" ITEM "kidGadgetPlay" ITEM "kidPlayProjectSounds" ITEM "kwav1Project00" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_12=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0x7D 0x00 0x00 0x00 // '????}???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_12=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_12, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x31 0x00 0x00 0x01 // '????1???' 0x00 0x00 0x00 0x00 0x25 0x00 0x00 0x03 // '????%???' 0x0B 0x00 0x00 0xFD 0x29 0x00 0x00 0x03 // '???)???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_12=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_12, 0x0) BYTE 0x03 0x03 0x43 0x75 0x74 0x2E 0x2E 0x2E // '??Cut...' 0x0D 0x0A 0x54 0x6F 0x20 0x73 0x65 0x65 // '??To see' 0x20 0x74 0x68 0x69 0x73 0x20 0x6D 0x6F // ' this mo' 0x76 0x69 0x65 0x2C 0x20 0x63 0x6C 0x69 // 'vie, cli' 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 0x50 // 'ck the P' 0x6C 0x61 0x79 0x20 0x62 0x75 0x74 0x74 // 'lay butt' 0x6F 0x6E 0x2E // 'on.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1= ktpc1Project01 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("To see the steps")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("To see the steps")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon7 kgobProject kidGadgetHow kidPlayProjectSounds 0x0 0x0 0x57415645 kwav1Project01 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_19=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) GST(0) ITEM "kgobCalloutBalloon7" ITEM "ktpc1Project01" ITEM "kgobProject" ITEM "kidGadgetHow" ITEM "kidPlayProjectSounds" ITEM "kwav1Project01" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_19=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0x73 0x00 0x00 0x00 // '????s???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_19, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpc1Project32 __HELP_SYMBOL( STN "ktpc1Project32" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_19=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_19, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x55 0x00 0x00 0x01 // '????U???' 0x00 0x00 0x00 0x00 0x32 0x00 0x00 0x03 // '????2???' 0x0B 0x00 0x00 0xFD 0x35 0x00 0x00 0x03 // '???5???' 0x00 0x00 0x00 0x00 0x3F 0x00 0x00 0x40 // '???????@' 0x02 0x00 0x00 0x00 0x55 0x00 0x00 0x40 // '????U??@' 0x00 0x00 0x00 0x00 0x3F 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x3F 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x3F 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_19=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_19, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x73 0x65 0x65 // '??To see' 0x20 0x74 0x68 0x65 0x20 0x73 0x74 0x65 // ' the ste' 0x70 0x73 0x20 0x66 0x6F 0x72 0x20 0x6D // 'ps for m' 0x61 0x6B 0x69 0x6E 0x67 0x20 0x74 0x68 // 'aking th' 0x69 0x73 0x20 0x6D 0x6F 0x76 0x69 0x65 // 'is movie' 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 // ', click ' 0x74 0x68 0x65 0x20 0x48 0x6F 0x77 0x20 // 'the How ' 0x62 0x75 0x74 0x74 0x6F 0x6E 0x2E 0x0D // 'button.?' 0x0A 0x01 0x20 0x4D 0x61 0x6B 0x69 0x6E // '?? Makin' 0x67 0x20 0x61 0x6E 0x20 0x61 0x63 0x74 // 'g an act' 0x6F 0x72 0x20 0x74 0x61 0x6C 0x6B // 'or talk' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2= ktpc1Project02 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2, __HELP_NAME("Why--Claudia's sentence")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2, __HELP_NAME("Why--Claudia's sentence")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobProject 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwav1Project02 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_5=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpc1Project02" ITEM "kgobProject" ITEM "" ITEM "" ITEM "kwav1Project02" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_5=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_5=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xD8 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_5=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x03 0x03 0x44 0x69 0x64 0x20 0x79 0x6F // '??Did yo' 0x75 0x20 0x65 0x76 0x65 0x72 0x20 0x77 // 'u ever w' 0x6F 0x6E 0x64 0x65 0x72 0x20 0x68 0x6F // 'onder ho' 0x77 0x20 0x74 0x6F 0x20 0x6D 0x61 0x74 // 'w to mat' 0x63 0x68 0x20 0x77 0x68 0x61 0x74 0x20 // 'ch what ' 0x61 0x63 0x74 0x6F 0x72 0x73 0x20 0x73 // 'actors s' 0x61 0x79 0x20 0x74 0x6F 0x20 0x77 0x68 // 'ay to wh' 0x61 0x74 0x20 0x74 0x68 0x65 0x79 0x20 // 'at they ' 0x64 0x6F 0x3F 0x20 0x20 0x49 0x74 0x27 // 'do? It'' 0x73 0x20 0x6E 0x6F 0x74 0x20 0x61 0x73 // 's not as' 0x20 0x65 0x61 0x73 0x79 0x20 0x61 0x73 // ' easy as' 0x20 0x69 0x74 0x20 0x6C 0x6F 0x6F 0x6B // ' it look' 0x73 0x2E 0x20 0x20 0x57 0x61 0x74 0x63 // 's. Watc' 0x68 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F // 'h the mo' 0x76 0x69 0x65 0x20 0x61 0x67 0x61 0x69 // 'vie agai' 0x6E 0x2E 0x20 0x20 0x4E 0x6F 0x74 0x69 // 'n. Noti' 0x63 0x65 0x20 0x68 0x6F 0x77 0x20 0x47 // 'ce how G' 0x72 0x65 0x67 0x6F 0x72 0x79 0x20 0x61 // 'regory a' 0x6E 0x64 0x20 0x43 0x6C 0x61 0x75 0x64 // 'nd Claud' 0x69 0x61 0x27 0x73 0x20 0x61 0x72 0x6D // 'ia's arm' 0x73 0x20 0x73 0x74 0x61 0x72 0x74 0x20 // 's start ' 0x6D 0x6F 0x76 0x69 0x6E 0x67 0x20 0x61 // 'moving a' 0x74 0x20 0x61 0x62 0x6F 0x75 0x74 0x20 // 't about ' 0x74 0x68 0x65 0x20 0x73 0x61 0x6D 0x65 // 'the same' 0x20 0x74 0x69 0x6D 0x65 0x20 0x74 0x68 // ' time th' 0x65 0x79 0x20 0x73 0x74 0x61 0x72 0x74 // 'ey start' 0x20 0x73 0x70 0x65 0x61 0x6B 0x69 0x6E // ' speakin' 0x67 0x2E // 'g.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3= ktpc1Project03 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3, __HELP_NAME("I created the first part of")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3, __HELP_NAME("I created the first part of")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon0 kgobProject 0x0 kidPlayProjectSounds 0x140 0xF0 0x57415645 kwav1Project03 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3, 0x0) GST(0) ITEM "kgobCalloutBalloon0" ITEM "ktpc1Project03" ITEM "kgobProject" ITEM "" ITEM "kidPlayProjectSounds" ITEM "kwav1Project03" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD9 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_4=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'GOKD' kgobOkButton 0xFFFFFFFF __HELP_SYMBOL( STN "kgobOkButton" ) ITEM LONG 0x40000001 VAR BYTE 0x01 0xFF 0xFF 0xFF 0xFF // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xA8 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0xAA 0x00 0x00 0x40 // '??????@' 0x02 0x00 0x00 0x00 0xAB 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xAA 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xAA 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0xAA 0x00 0x00 0xC0 // '??????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B, 0x0) BYTE 0x03 0x03 0x49 0x20 0x63 0x72 0x65 0x61 // '??I crea' 0x74 0x65 0x64 0x20 0x74 0x68 0x65 0x20 // 'ted the ' 0x66 0x69 0x72 0x73 0x74 0x20 0x70 0x61 // 'first pa' 0x72 0x74 0x20 0x6F 0x66 0x20 0x74 0x68 // 'rt of th' 0x65 0x20 0x6D 0x6F 0x76 0x69 0x65 0x20 // 'e movie ' 0x66 0x6F 0x72 0x20 0x79 0x6F 0x75 0x2E // 'for you.' 0x20 0x20 0x47 0x72 0x65 0x67 0x6F 0x72 // ' Gregor' 0x79 0x20 0x6A 0x75 0x73 0x74 0x20 0x73 // 'y just s' 0x61 0x69 0x64 0x2C 0x20 0x93 0x49 0x92 // 'aid, I' 0x6C 0x6C 0x20 0x74 0x72 0x61 0x64 0x65 // 'll trade' 0x20 0x61 0x20 0x6D 0x61 0x67 0x69 0x63 // ' a magic' 0x20 0x74 0x72 0x69 0x63 0x6B 0x20 0x66 // ' trick f' 0x6F 0x72 0x20 0x61 0x20 0x76 0x61 0x73 // 'or a vas' 0x65 0x2E 0x94 0x0D 0x0A 0x4E 0x6F 0x77 // 'e.??Now' 0x20 0x69 0x74 0x92 0x73 0x20 0x79 0x6F // ' its yo' 0x75 0x72 0x20 0x74 0x75 0x72 0x6E 0x20 // 'ur turn ' 0x74 0x6F 0x20 0x61 0x64 0x64 0x20 0x43 // 'to add C' 0x6C 0x61 0x75 0x64 0x69 0x61 0x92 0x73 // 'laudias' 0x20 0x54 0x61 0x6C 0x6B 0x20 0x61 0x63 // ' Talk ac' 0x74 0x69 0x6F 0x6E 0x20 0x61 0x6E 0x64 // 'tion and' 0x20 0x64 0x69 0x61 0x6C 0x6F 0x67 0x75 // ' dialogu' 0x65 0x2E 0x0D 0x0A 0x01 // 'e.???' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_4= ktpc1Project04 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4, __HELP_NAME("CO--To find the talk action")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4, __HELP_NAME("CO--To find the talk action")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobProject kidActorsActionBrowser kidPlayProjectSounds 0x0 0x0 0x57415645 kwav1Project04 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpc1Project04" ITEM "kgobProject" ITEM "kidActorsActionBrowser" ITEM "kidPlayProjectSounds" ITEM "kwav1Project04" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4, 0x0) BYTE 0x01 0x00 0x03 0x03 0x8B 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x27 0x00 0x00 0x01 // '????'???' 0x00 0x00 0x00 0x00 0x1F 0x00 0x00 0x03 // '????????' 0x0B 0x00 0x00 0xFD 0x26 0x00 0x00 0x03 // '???&???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2F, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x66 0x69 0x6E // '??To fin' 0x64 0x20 0x74 0x68 0x65 0x20 0x54 0x61 // 'd the Ta' 0x6C 0x6B 0x20 0x61 0x63 0x74 0x69 0x6F // 'lk actio' 0x6E 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B // 'n, click' 0x20 0x41 0x63 0x74 0x69 0x6F 0x6E 0x73 // ' Actions' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_5= ktpc1Project05 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5, __HELP_NAME("CO--Click Claudia.")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5, __HELP_NAME("CO--Click Claudia.")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject 0x0 kidPlayProjectSounds 0x140 0x6E 0x57415645 kwav1Project05 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_31=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc1Project05" ITEM "kgobProject" ITEM "" ITEM "kidPlayProjectSounds" ITEM "kwav1Project05" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_31=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5, 0x0) BYTE 0x01 0x00 0x03 0x03 0x4E 0x00 0x00 0x00 // '????N???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_31=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_31, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0E 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_31=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_31, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x43 0x6C 0x61 0x75 0x64 0x69 0x61 0x2E // 'Claudia.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_6= ktpc1Project06 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6, __HELP_NAME("CO--Click Talk")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6, __HELP_NAME("CO--Click Talk")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject kidReserveProjects kidPlayProjectSounds 0x0 0xFFFFFFF7 0x57415645 kwav1Project06 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_20=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc1Project06" ITEM "kgobProject" ITEM "kidReserveProjects" ITEM "kidPlayProjectSounds" ITEM "kwav1Project06" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_20=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6, 0x0) BYTE 0x01 0x00 0x03 0x03 0x7D 0x00 0x00 0x00 // '????}???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_20=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_20, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x16 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_20=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_20, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x54 0x61 0x6C 0x6B // 'the Talk' 0x20 0x61 0x63 0x74 0x69 0x6F 0x6E 0x2E // ' action.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_7= ktpc1Project07 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7, __HELP_NAME("CO--Click OK")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7, __HELP_NAME("CO--Click OK")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject kidBrowserOk kidPlayProjectSounds 0x17 0xFFFFFFCE 0x57415645 kwav1Project07 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_0=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc1Project07" ITEM "kgobProject" ITEM "kidBrowserOk" ITEM "kidPlayProjectSounds" ITEM "kwav1Project07" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_0=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7, 0x0) BYTE 0x01 0x00 0x03 0x03 0x37 0x00 0x00 0x00 // '????7???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_0=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x09 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_0=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x4F 0x4B 0x2E // 'OK.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_8= ktpc1Project08 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8, __HELP_NAME("CO--I don't know")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8, __HELP_NAME("CO--I don't know")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject 0x0 kidPlayProjectSounds 0x140 0x6E 0x57415645 kwav1Project08 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc1Project08" ITEM "kgobProject" ITEM "" ITEM "kidPlayProjectSounds" ITEM "kwav1Project08" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8, 0x0) BYTE 0x01 0x00 0x03 0x03 0x8F 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x78 0x00 0x00 0x01 // '????x???' 0x01 0x00 0x00 0x00 0xB3 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0xA7 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0xAB 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1E, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x43 0x6C 0x61 0x75 0x64 0x69 0x61 0x2E // 'Claudia.' 0x20 0x20 0x54 0x68 0x65 0x6E 0x20 0x68 // ' Then h' 0x6F 0x6C 0x64 0x20 0x64 0x6F 0x77 0x6E // 'old down' 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 // ' the mou' 0x73 0x65 0x20 0x62 0x75 0x74 0x74 0x6F // 'se butto' 0x6E 0x20 0x66 0x6F 0x72 0x20 0x61 0x73 // 'n for as' 0x20 0x6C 0x6F 0x6E 0x67 0x20 0x61 0x73 // ' long as' 0x20 0x69 0x74 0x20 0x74 0x61 0x6B 0x65 // ' it take' 0x73 0x20 0x43 0x6C 0x61 0x75 0x64 0x69 // 's Claudi' 0x61 0x92 0x73 0x20 0x61 0x72 0x6D 0x73 // 'as arms' 0x20 0x74 0x6F 0x20 0x6D 0x6F 0x76 0x65 // ' to move' 0x20 0x61 0x6E 0x64 0x20 0x65 0x6E 0x64 // ' and end' 0x20 0x75 0x70 0x20 0x62 0x79 0x20 0x68 // ' up by h' 0x65 0x72 0x20 0x73 0x69 0x64 0x65 0x2E // 'er side.' 0x0D 0x0A 0x57 0x68 0x65 0x6E 0x20 0x79 // '??When y' 0x6F 0x75 0x92 0x72 0x65 0x20 0x72 0x65 // 'oure re' 0x61 0x64 0x79 0x20 0x74 0x6F 0x20 0x70 // 'ady to p' 0x6C 0x61 0x79 0x20 0x74 0x68 0x65 0x20 // 'lay the ' 0x6D 0x6F 0x76 0x69 0x65 0x2C 0x20 0x63 // 'movie, c' 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 // 'lick the' 0x20 0x50 0x6C 0x61 0x79 0x20 0x62 0x75 // ' Play bu' 0x74 0x74 0x6F 0x6E 0x2E // 'tton.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_9= ktpc1Project09 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_9, __HELP_NAME("CO--Until Claudia moves hands")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_9, __HELP_NAME("CO--Until Claudia moves hands")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject kidFrameRW kidPlayProjectSounds 0x0 0x0 0x57415645 kwav1Project09 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_13=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_9, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc1Project09" ITEM "kgobProject" ITEM "kidFrameRW" ITEM "kidPlayProjectSounds" ITEM "kwav1Project09" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_13=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_9, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC2 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_B=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_13, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpRewind __HELP_SYMBOL( STN "mbmpRewind" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_13=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_13, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0xFC 0x00 0x00 0x1A 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xAC 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x9D 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0xAB 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x6E 0x00 0x00 0x82 // '????n??' 0x00 0x00 0x00 0x00 0x1A 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_13=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_13, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x50 0x72 0x65 0x76 // 'the Prev' 0x69 0x6F 0x75 0x73 0x20 0x62 0x75 0x74 // 'ious but' 0x74 0x6F 0x6E 0x2D 0x01 0x20 0x75 0x6E // 'ton-? un' 0x74 0x69 0x6C 0x20 0x79 0x6F 0x75 0x20 // 'til you ' 0x72 0x65 0x77 0x69 0x6E 0x64 0x20 0x79 // 'rewind y' 0x6F 0x75 0x72 0x20 0x6D 0x6F 0x76 0x69 // 'our movi' 0x65 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 // 'e to the' 0x20 0x66 0x72 0x61 0x6D 0x65 0x20 0x77 // ' frame w' 0x68 0x65 0x72 0x65 0x20 0x43 0x6C 0x61 // 'here Cla' 0x75 0x64 0x69 0x61 0x20 0x73 0x74 0x61 // 'udia sta' 0x72 0x74 0x73 0x20 0x74 0x6F 0x20 0x6D // 'rts to m' 0x6F 0x76 0x65 0x20 0x68 0x65 0x72 0x20 // 'ove her ' 0x68 0x61 0x6E 0x64 0x73 0x2E 0x0D 0x0A // 'hands.??' 0x57 0x68 0x65 0x6E 0x20 0x79 0x6F 0x75 // 'When you' 0x92 0x72 0x65 0x20 0x72 0x65 0x61 0x64 // 're read' 0x79 0x20 0x66 0x6F 0x72 0x20 0x74 0x68 // 'y for th' 0x65 0x20 0x6E 0x65 0x78 0x74 0x20 0x73 // 'e next s' 0x74 0x65 0x70 0x2C 0x20 0x63 0x6C 0x69 // 'tep, cli' 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 0x50 // 'ck the P' 0x72 0x6F 0x6A 0x65 0x63 0x74 0x20 0x47 // 'roject G' 0x61 0x64 0x67 0x65 0x74 0x2E // 'adget.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_A= ktpc1Project0A #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_A, __HELP_NAME("CO--Click Speech")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_A, __HELP_NAME("CO--Click Speech")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon5 kgobProject kidGadget kidPlayProjectSounds 0x0 0x0 0x57415645 kwav1Project0A ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_25=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_A, 0x0) GST(0) ITEM "kgobCalloutBalloon5" ITEM "ktpc1Project0A" ITEM "kgobProject" ITEM "kidGadget" ITEM "kidPlayProjectSounds" ITEM "kwav1Project0A" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_25=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x98 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_25=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_25, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x48 0x00 0x00 0x01 // '????H???' 0x00 0x00 0x00 0x00 0x39 0x00 0x00 0x03 // '????9???' 0x0B 0x00 0x00 0xFD 0x47 0x00 0x00 0x03 // '???G???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_25=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_25, 0x0) BYTE 0x03 0x03 0x52 0x65 0x6D 0x65 0x6D 0x62 // '??Rememb' 0x65 0x72 0x2C 0x20 0x77 0x68 0x65 0x6E // 'er, when' 0x20 0x79 0x6F 0x75 0x92 0x72 0x65 0x20 // ' youre ' 0x72 0x65 0x61 0x64 0x79 0x20 0x66 0x6F // 'ready fo' 0x72 0x20 0x74 0x68 0x65 0x20 0x6E 0x65 // 'r the ne' 0x78 0x74 0x20 0x73 0x74 0x65 0x70 0x2C // 'xt step,' 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 0x74 // ' click t' 0x68 0x65 0x20 0x50 0x72 0x6F 0x6A 0x65 // 'he Proje' 0x63 0x74 0x20 0x47 0x61 0x64 0x67 0x65 // 'ct Gadge' 0x74 0x2E // 't.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_B= ktpc1Project0B #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_B, __HELP_NAME("CO--To see steps Claudia")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_B, __HELP_NAME("CO--To see steps Claudia")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon7 kgobProject kidGadgetHow kidPlayProjectSounds 0x0 0x0 0x57415645 kwav1Project0B ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_17=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_B, 0x0) GST(0) ITEM "kgobCalloutBalloon7" ITEM "ktpc1Project0B" ITEM "kgobProject" ITEM "kidGadgetHow" ITEM "kidPlayProjectSounds" ITEM "kwav1Project0B" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_17=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x73 0x00 0x00 0x00 // '????s???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_17=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_17, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x41 0x00 0x00 0x01 // '????A???' 0x00 0x00 0x00 0x00 0x36 0x00 0x00 0x03 // '????6???' 0x0B 0x00 0x00 0xFD 0x39 0x00 0x00 0x03 // '???9???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_17=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_17, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x73 0x65 0x65 // '??To see' 0x20 0x74 0x68 0x65 0x20 0x73 0x74 0x65 // ' the ste' 0x70 0x73 0x20 0x66 0x6F 0x72 0x20 0x61 // 'ps for a' 0x64 0x64 0x69 0x6E 0x67 0x20 0x43 0x6C // 'dding Cl' 0x61 0x75 0x64 0x69 0x61 0x92 0x73 0x20 // 'audias ' 0x6C 0x69 0x6E 0x65 0x2C 0x20 0x63 0x6C // 'line, cl' 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 // 'ick the ' 0x48 0x6F 0x77 0x20 0x62 0x75 0x74 0x74 // 'How butt' 0x6F 0x6E 0x2E // 'on.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_C= ktpc1Project0C #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_C, __HELP_NAME("Why--The talk action")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_C, __HELP_NAME("Why--The talk action")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobProject 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwav1Project0C ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_7=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_C, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpc1Project0C" ITEM "kgobProject" ITEM "" ITEM "" ITEM "kwav1Project0C" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_7=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_C, 0x0) BYTE 0x01 0x00 0x03 0x03 0xBD 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_7=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x7C 0x00 0x00 0x01 // '????|???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_7=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x61 0x75 0x64 0x69 // '??Claudi' 0x61 0x27 0x73 0x20 0x54 0x61 0x6C 0x6B // 'a's Talk' 0x20 0x61 0x63 0x74 0x69 0x6F 0x6E 0x20 // ' action ' 0x70 0x75 0x6C 0x6C 0x73 0x20 0x79 0x6F // 'pulls yo' 0x75 0x20 0x69 0x6E 0x20 0x61 0x6E 0x64 // 'u in and' 0x20 0x66 0x6F 0x63 0x75 0x73 0x65 0x73 // ' focuses' 0x20 0x79 0x6F 0x75 0x72 0x20 0x61 0x74 // ' your at' 0x74 0x65 0x6E 0x74 0x69 0x6F 0x6E 0x20 // 'tention ' 0x6F 0x6E 0x20 0x43 0x6C 0x61 0x75 0x64 // 'on Claud' 0x69 0x61 0x2E 0x20 0x20 0x4E 0x6F 0x77 // 'ia. Now' 0x20 0x77 0x65 0x20 0x6E 0x65 0x65 0x64 // ' we need' 0x20 0x74 0x6F 0x20 0x61 0x64 0x64 0x20 // ' to add ' 0x74 0x68 0x65 0x20 0x6C 0x69 0x6E 0x65 // 'the line' 0x20 0x43 0x6C 0x61 0x75 0x64 0x69 0x61 // ' Claudia' 0x20 0x77 0x61 0x6E 0x74 0x73 0x20 0x74 // ' wants t' 0x6F 0x20 0x73 0x61 0x79 0x2E // 'o say.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_D= ktpc1Project0D #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_D, __HELP_NAME("CO--To find Claudia's line")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_D, __HELP_NAME("CO--To find Claudia's line")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobProject kidSoundsCover kidPlayProjectSounds 0x0 0x0 0x57415645 kwav1Project0D ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_D, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpc1Project0D" ITEM "kgobProject" ITEM "kidSoundsCover" ITEM "kidPlayProjectSounds" ITEM "kwav1Project0D" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x7E 0x00 0x00 0x00 // '????~???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x25 0x00 0x00 0x01 // '????%???' 0x00 0x00 0x00 0x00 0x1E 0x00 0x00 0x03 // '????????' 0x0B 0x00 0x00 0xFD 0x24 0x00 0x00 0x03 // '???$???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x66 0x69 0x6E // '??To fin' 0x64 0x20 0x43 0x6C 0x61 0x75 0x64 0x69 // 'd Claudi' 0x61 0x92 0x73 0x20 0x6C 0x69 0x6E 0x65 // 'as line' 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 // ', click ' 0x53 0x6F 0x75 0x6E 0x64 0x73 0x2E // 'Sounds.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_E= ktpc1Project0E #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_E, __HELP_NAME("CO--Click Speech")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_E, __HELP_NAME("CO--Click Speech")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobProject kidSoundsMicBrowser kidPlayProjectSounds 0x0 0x0 0x57415645 kwav1Project0E ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_E, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpc1Project0E" ITEM "kgobProject" ITEM "kidSoundsMicBrowser" ITEM "kidPlayProjectSounds" ITEM "kwav1Project0E" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x4C 0x00 0x00 0x00 // '????L???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x05 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0D 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x03 // '????????' 0x0B 0x00 0x00 0xFD 0x0C 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x0D 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1A, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x53 0x70 0x65 0x65 0x63 0x68 0x2E // 'Speech.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_F= ktpc1Project0F #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_F, __HELP_NAME("CO--Click Oh I don't know")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_F, __HELP_NAME("CO--Click Oh I don't know")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject kidReserveProjects kidPlayProjectSounds 0x0 0xFFFFFFF7 0x57415645 kwav1Project0F ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_F, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc1Project0F" ITEM "kgobProject" ITEM "kidReserveProjects" ITEM "kidPlayProjectSounds" ITEM "kwav1Project0F" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x94 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x29 0x00 0x00 0x01 // '????)???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x93 0x4F 0x68 0x2C 0x20 0x49 0x20 0x64 // 'Oh, I d' 0x6F 0x6E 0x92 0x74 0x20 0x6B 0x6E 0x6F // 'ont kno' 0x77 0x2E 0x94 0x20 0x20 0x54 0x68 0x65 // 'w. The' 0x6E 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 // 'n click ' 0x4F 0x4B 0x2E // 'OK.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_10= ktpc1Project10 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_10, __HELP_NAME("CO--Click Claudia.")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_10, __HELP_NAME("CO--Click Claudia.")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject 0x0 kidPlayProjectSounds 0x140 0x6E 0x57415645 kwav1Project10 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_30=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_10, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc1Project10" ITEM "kgobProject" ITEM "" ITEM "kidPlayProjectSounds" ITEM "kwav1Project10" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_30=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_10, 0x0) BYTE 0x01 0x00 0x03 0x03 0x4E 0x00 0x00 0x00 // '????N???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_30=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_30, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0E 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_30=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_30, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x43 0x6C 0x61 0x75 0x64 0x69 0x61 0x2E // 'Claudia.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_11= ktpc1Project11 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_11, __HELP_NAME("CO--To play Claudia's line")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_11, __HELP_NAME("CO--To play Claudia's line")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon5 kgobProject kidPlay kidPlayProjectSounds 0x0 0x0 0x57415645 kwav1Project11 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_11, 0x0) GST(0) ITEM "kgobCalloutBalloon5" ITEM "ktpc1Project11" ITEM "kgobProject" ITEM "kidPlay" ITEM "kidPlayProjectSounds" ITEM "kwav1Project11" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_11, 0x0) BYTE 0x01 0x00 0x03 0x03 0xBE 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x6E 0x00 0x00 0x01 // '????n???' 0x00 0x00 0x00 0x00 0x22 0x00 0x00 0x03 // '????"???' 0x0B 0x00 0x00 0xFD 0x26 0x00 0x00 0x03 // '???&???' 0x00 0x00 0x00 0x00 0x5F 0x00 0x00 0x03 // '????_???' 0x0B 0x00 0x00 0xFD 0x6D 0x00 0x00 0x03 // '???m???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x30 0x00 0x00 0x82 // '????0??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x70 0x6C 0x61 // '??To pla' 0x79 0x20 0x43 0x6C 0x61 0x75 0x64 0x69 // 'y Claudi' 0x61 0x92 0x73 0x20 0x6C 0x69 0x6E 0x65 // 'as line' 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 // ', click ' 0x74 0x68 0x65 0x20 0x50 0x6C 0x61 0x79 // 'the Play' 0x20 0x62 0x75 0x74 0x74 0x6F 0x6E 0x2E // ' button.' 0x0D 0x0A 0x57 0x68 0x65 0x6E 0x20 0x79 // '??When y' 0x6F 0x75 0x92 0x72 0x65 0x20 0x72 0x65 // 'oure re' 0x61 0x64 0x79 0x20 0x66 0x6F 0x72 0x20 // 'ady for ' 0x74 0x68 0x65 0x20 0x6E 0x65 0x78 0x74 // 'the next' 0x20 0x73 0x74 0x65 0x70 0x2C 0x20 0x63 // ' step, c' 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 // 'lick the' 0x20 0x50 0x72 0x6F 0x6A 0x65 0x63 0x74 // ' Project' 0x20 0x47 0x61 0x64 0x67 0x65 0x74 0x2E // ' Gadget.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_12= ktpc1Project12 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_12, __HELP_NAME("CO--To see the steps for")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_12, __HELP_NAME("CO--To see the steps for")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon7 kgobProject kidGadgetHow kidPlayProjectSounds 0x0 0x0 0x57415645 kwav1Project12 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_8=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_12, 0x0) GST(0) ITEM "kgobCalloutBalloon7" ITEM "ktpc1Project12" ITEM "kgobProject" ITEM "kidGadgetHow" ITEM "kidPlayProjectSounds" ITEM "kwav1Project12" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_8=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_12, 0x0) BYTE 0x01 0x00 0x03 0x03 0x73 0x00 0x00 0x00 // '????s???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_8=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x45 0x00 0x00 0x01 // '????E???' 0x00 0x00 0x00 0x00 0x3A 0x00 0x00 0x03 // '????:???' 0x0B 0x00 0x00 0xFD 0x3D 0x00 0x00 0x03 // '???=???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_8=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x73 0x65 0x65 // '??To see' 0x20 0x74 0x68 0x65 0x20 0x73 0x74 0x65 // ' the ste' 0x70 0x73 0x20 0x66 0x6F 0x72 0x20 0x63 // 'ps for c' 0x68 0x61 0x6E 0x67 0x69 0x6E 0x67 0x20 // 'hanging ' 0x74 0x68 0x65 0x20 0x63 0x61 0x6D 0x65 // 'the came' 0x72 0x61 0x20 0x61 0x6E 0x67 0x6C 0x65 // 'ra angle' 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 // ', click ' 0x74 0x68 0x65 0x20 0x48 0x6F 0x77 0x20 // 'the How ' 0x62 0x75 0x74 0x74 0x6F 0x6E 0x2E // 'button.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_13= ktpc1Project13 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_13, __HELP_NAME("Why--Conversations are ")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_13, __HELP_NAME("Why--Conversations are ")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobProject 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwav1Project13 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_13, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpc1Project13" ITEM "kgobProject" ITEM "" ITEM "" ITEM "kwav1Project13" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_13, 0x0) BYTE 0x01 0x00 0x03 0x03 0x2E 0x01 0x00 0x00 // '????.???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xE8 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) BYTE 0x03 0x03 0x43 0x6F 0x6E 0x76 0x65 0x72 // '??Conver' 0x73 0x61 0x74 0x69 0x6F 0x6E 0x73 0x20 // 'sations ' 0x61 0x72 0x65 0x20 0x66 0x69 0x6C 0x6D // 'are film' 0x65 0x64 0x20 0x77 0x69 0x74 0x68 0x20 // 'ed with ' 0x93 0x6F 0x76 0x65 0x72 0x2D 0x74 0x68 // 'over-th' 0x65 0x2D 0x73 0x68 0x6F 0x75 0x6C 0x64 // 'e-should' 0x65 0x72 0x94 0x20 0x73 0x68 0x6F 0x74 // 'er shot' 0x73 0x2E 0x20 0x20 0x50 0x6F 0x73 0x69 // 's. Posi' 0x74 0x69 0x6F 0x6E 0x20 0x61 0x63 0x74 // 'tion act' 0x6F 0x72 0x73 0x20 0x73 0x6F 0x20 0x74 // 'ors so t' 0x68 0x61 0x74 0x20 0x77 0x68 0x65 0x6E // 'hat when' 0x20 0x79 0x6F 0x75 0x20 0x63 0x68 0x61 // ' you cha' 0x6E 0x67 0x65 0x20 0x63 0x61 0x6D 0x65 // 'nge came' 0x72 0x61 0x20 0x61 0x6E 0x67 0x6C 0x65 // 'ra angle' 0x73 0x2C 0x20 0x79 0x6F 0x75 0x72 0x20 // 's, your ' 0x61 0x75 0x64 0x69 0x65 0x6E 0x63 0x65 // 'audience' 0x20 0x69 0x73 0x20 0x6C 0x6F 0x6F 0x6B // ' is look' 0x69 0x6E 0x67 0x20 0x6F 0x76 0x65 0x72 // 'ing over' 0x20 0x74 0x68 0x65 0x20 0x73 0x68 0x6F // ' the sho' 0x75 0x6C 0x64 0x65 0x72 0x20 0x6F 0x66 // 'ulder of' 0x20 0x74 0x68 0x65 0x20 0x61 0x63 0x74 // ' the act' 0x6F 0x72 0x20 0x77 0x68 0x6F 0x20 0x69 // 'or who i' 0x73 0x20 0x6C 0x69 0x73 0x74 0x65 0x6E // 's listen' 0x69 0x6E 0x67 0x20 0x61 0x6E 0x64 0x20 // 'ing and ' 0x69 0x6E 0x74 0x6F 0x20 0x74 0x68 0x65 // 'into the' 0x20 0x66 0x61 0x63 0x65 0x20 0x6F 0x66 // ' face of' 0x20 0x74 0x68 0x65 0x20 0x61 0x63 0x74 // ' the act' 0x6F 0x72 0x20 0x77 0x68 0x6F 0x20 0x69 // 'or who i' 0x73 0x20 0x74 0x61 0x6C 0x6B 0x69 0x6E // 's talkin' 0x67 0x2E // 'g.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_14= ktpc1Project14 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_14, __HELP_NAME("CO--To find camera angle")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_14, __HELP_NAME("CO--To find camera angle")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon1 kgobProject kidSettingsCover kidPlayProjectSounds 0x0 0x0 0x57415645 kwav1Project14 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_14, 0x0) GST(0) ITEM "kgobCalloutBalloon1" ITEM "ktpc1Project14" ITEM "kgobProject" ITEM "kidSettingsCover" ITEM "kidPlayProjectSounds" ITEM "kwav1Project14" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_14, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB9 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_6=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) AG(4) FREE ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpc1Project15 __HELP_SYMBOL( STN "ktpc1Project15" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x09 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x48 0x00 0x00 0x01 // '????H???' 0x00 0x00 0x00 0x00 0x24 0x00 0x00 0x03 // '????$???' 0x0B 0x00 0x00 0xFD 0x2A 0x00 0x00 0x03 // '???*???' 0x00 0x00 0x00 0x00 0x2D 0x00 0x00 0x40 // '????-??@' 0x03 0x00 0x00 0x00 0x48 0x00 0x00 0x40 // '????H??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x2D 0x00 0x00 0x82 // '????-??' 0x00 0x00 0x00 0x00 0x2D 0x00 0x00 0xC0 // '????-??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x66 0x69 0x6E // '??To fin' 0x64 0x20 0x63 0x61 0x6D 0x65 0x72 0x61 // 'd camera' 0x20 0x61 0x6E 0x67 0x6C 0x65 0x20 0x63 // ' angle c' 0x68 0x6F 0x69 0x63 0x65 0x73 0x2C 0x20 // 'hoices, ' 0x63 0x6C 0x69 0x63 0x6B 0x20 0x53 0x63 // 'click Sc' 0x65 0x6E 0x65 0x73 0x2E 0x0D 0x0A 0x01 // 'enes.???' 0x20 0x20 0x53 0x63 0x65 0x6E 0x65 0x73 // ' Scenes' 0x20 0x61 0x6E 0x64 0x20 0x63 0x61 0x6D // ' and cam' 0x65 0x72 0x61 0x20 0x61 0x6E 0x67 0x6C // 'era angl' 0x65 0x73 // 'es' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_15= ktpc1Project15 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_15, __HELP_NAME("Why--A scene is")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_15, __HELP_NAME("Why--A scene is")) __HELP_PACK2 BO OSK LONG kgobBalloonHotGadgetHelp kgobProjectHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwav1Project15 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_15, 0x0) GST(0) ITEM "kgobBalloonHotGadgetHelp" ITEM "ktpc1Project15" ITEM "kgobProjectHot" ITEM "" ITEM "" ITEM "kwav1Project15" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_15, 0x0) BYTE 0x01 0x00 0x03 0x03 0xDB 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_A=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2B, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_2B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1B 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x1D 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xA7 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x1D 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2B, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x53 0x63 0x65 // '??? Sce' 0x6E 0x65 0x73 0x20 0x61 0x6E 0x64 0x20 // 'nes and ' 0x63 0x61 0x6D 0x65 0x72 0x61 0x20 0x61 // 'camera a' 0x6E 0x67 0x6C 0x65 0x73 0x0D 0x0A 0x41 // 'ngles??A' 0x20 0x73 0x63 0x65 0x6E 0x65 0x20 0x69 // ' scene i' 0x73 0x20 0x74 0x68 0x65 0x20 0x6F 0x76 // 's the ov' 0x65 0x72 0x61 0x6C 0x6C 0x20 0x65 0x6E // 'erall en' 0x76 0x69 0x72 0x6F 0x6E 0x6D 0x65 0x6E // 'vironmen' 0x74 0x20 0x69 0x6E 0x20 0x77 0x68 0x69 // 't in whi' 0x63 0x68 0x20 0x74 0x68 0x65 0x20 0x63 // 'ch the c' 0x61 0x6D 0x65 0x72 0x61 0x20 0x61 0x6E // 'amera an' 0x67 0x6C 0x65 0x73 0x20 0x61 0x72 0x65 // 'gles are' 0x20 0x73 0x68 0x6F 0x74 0x2E 0x20 0x20 // ' shot. ' 0x54 0x68 0x65 0x20 0x76 0x61 0x73 0x65 // 'The vase' 0x20 0x62 0x6F 0x6F 0x74 0x68 0x20 0x69 // ' booth i' 0x73 0x20 0x61 0x20 0x63 0x61 0x6D 0x65 // 's a came' 0x72 0x61 0x20 0x61 0x6E 0x67 0x6C 0x65 // 'ra angle' 0x20 0x77 0x69 0x74 0x68 0x69 0x6E 0x20 // ' within ' 0x6F 0x6E 0x65 0x20 0x6F 0x66 0x20 0x74 // 'one of t' 0x68 0x65 0x20 0x6D 0x61 0x72 0x6B 0x65 // 'he marke' 0x74 0x20 0x73 0x63 0x65 0x6E 0x65 0x73 // 't scenes' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_16= ktpc1Project16 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_16, __HELP_NAME("CO--Click Camera Angles")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_16, __HELP_NAME("CO--Click Camera Angles")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobProject kidSettingsCameras kidPlayProjectSounds 0x0 0x0 0x57415645 kwav1Project16 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_14=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_16, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpc1Project16" ITEM "kgobProject" ITEM "kidSettingsCameras" ITEM "kidPlayProjectSounds" ITEM "kwav1Project16" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_14=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_16, 0x0) BYTE 0x01 0x00 0x03 0x03 0x78 0x00 0x00 0x00 // '????x???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_14=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_14, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x14 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x03 // '????????' 0x0B 0x00 0x00 0xFD 0x13 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x14 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_14=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_14, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x43 0x61 0x6D 0x65 0x72 0x61 0x20 0x41 // 'Camera A' 0x6E 0x67 0x6C 0x65 0x73 0x2E // 'ngles.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_17= ktpc1Project17 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_17, __HELP_NAME("CO--To see Gregory's face")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_17, __HELP_NAME("CO--To see Gregory's face")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject kidReserveProjects kidPlayProjectSounds 0x43 0x0 0x57415645 kwav1Project17 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_17, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc1Project17" ITEM "kgobProject" ITEM "kidReserveProjects" ITEM "kidPlayProjectSounds" ITEM "kwav1Project17" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_17, 0x0) BYTE 0x01 0x00 0x03 0x03 0x8B 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2F 0x00 0x00 0x01 // '????/???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1F, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x73 0x65 0x65 // '??To see' 0x20 0x47 0x72 0x65 0x67 0x6F 0x72 0x79 // ' Gregory' 0x92 0x73 0x20 0x66 0x61 0x63 0x65 0x2C // 's face,' 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 0x74 // ' click t' 0x68 0x69 0x73 0x20 0x63 0x61 0x6D 0x65 // 'his came' 0x72 0x61 0x20 0x61 0x6E 0x67 0x6C 0x65 // 'ra angle' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_18= ktpc1Project18 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_18, __HELP_NAME("CO--To continue Gregory's")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_18, __HELP_NAME("CO--To continue Gregory's")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobProject kidActorsCover kidPlayProjectSounds 0x0 0x0 0x57415645 kwav1Project18 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_16=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_18, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpc1Project18" ITEM "kgobProject" ITEM "kidActorsCover" ITEM "kidPlayProjectSounds" ITEM "kwav1Project18" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_16=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_18, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_16=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_16, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x28 0x00 0x00 0x01 // '????(???' 0x00 0x00 0x00 0x00 0x29 0x00 0x00 0x01 // '????)???' 0x01 0x00 0x00 0x00 0x38 0x00 0x00 0x01 // '????8???' 0x00 0x00 0x00 0x00 0x29 0x00 0x00 0x03 // '????)???' 0x0B 0x00 0x00 0xFD 0x37 0x00 0x00 0x03 // '???7???' 0x0F 0x00 0x00 0xFD 0x38 0x00 0x00 0x03 // '???8???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_16=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_16, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x63 0x6F 0x6E // '??To con' 0x74 0x69 0x6E 0x75 0x65 0x20 0x47 0x72 // 'tinue Gr' 0x65 0x67 0x6F 0x72 0x79 0x92 0x73 0x20 // 'egorys ' 0x54 0x61 0x6C 0x6B 0x20 0x61 0x63 0x74 // 'Talk act' 0x69 0x6F 0x6E 0x2C 0x20 0x63 0x6C 0x69 // 'ion, cli' 0x63 0x6B 0x20 0x41 0x63 0x74 0x6F 0x72 // 'ck Actor' 0x73 0x20 0x26 0x20 0x50 0x72 0x6F 0x70 // 's & Prop' 0x73 0x2E // 's.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_19= ktpc1Project19 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_19, __HELP_NAME("CO--Click Resume Last")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_19, __HELP_NAME("CO--Click Resume Last")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobProject kidActorsContinue kidPlayProjectSounds 0x0 0x0 0x57415645 kwav1Project19 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_23=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_19, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpc1Project19" ITEM "kgobProject" ITEM "kidActorsContinue" ITEM "kidPlayProjectSounds" ITEM "kwav1Project19" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_23=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_19, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_0=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_23, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpc1Project1A __HELP_SYMBOL( STN "ktpc1Project1A" ) ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_23=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_23, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x09 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x35 0x00 0x00 0x01 // '????5???' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x03 // '????????' 0x0B 0x00 0x00 0xFD 0x18 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x1B 0x00 0x00 0x40 // '???????@' 0x02 0x00 0x00 0x00 0x35 0x00 0x00 0x40 // '????5??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x1B 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x1B 0x00 0x00 0xC0 // '???????' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_23=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_23, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x52 0x65 0x73 0x75 0x6D 0x65 0x20 0x4C // 'Resume L' 0x61 0x73 0x74 0x20 0x41 0x63 0x74 0x69 // 'ast Acti' 0x6F 0x6E 0x2E 0x0D 0x0A 0x01 0x20 0x52 // 'on.??? R' 0x65 0x73 0x75 0x6D 0x69 0x6E 0x67 0x20 // 'esuming ' 0x74 0x68 0x65 0x20 0x6C 0x61 0x73 0x74 // 'the last' 0x20 0x61 0x63 0x74 0x69 0x6F 0x6E // ' action' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1A= ktpc1Project1A #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1A, __HELP_NAME("Why--Continue Same Action")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1A, __HELP_NAME("Why--Continue Same Action")) __HELP_PACK2 BO OSK LONG kgobBalloonHotGadgetHelp kgobProjectHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwav1Project1A ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1A, 0x0) GST(0) ITEM "kgobBalloonHotGadgetHelp" ITEM "ktpc1Project1A" ITEM "kgobProjectHot" ITEM "" ITEM "" ITEM "kwav1Project1A" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1A, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD5 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_5=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1D, 0x0) AG(4) FREE FREE ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_1D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x02 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1A 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x1C 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x90 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x1C 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1D, 0x0) BYTE 0x03 0x03 0x01 0x20 0x52 0x65 0x73 0x75 // '??? Resu' 0x6D 0x69 0x6E 0x67 0x20 0x74 0x68 0x65 // 'ming the' 0x20 0x6C 0x61 0x73 0x74 0x20 0x61 0x63 // ' last ac' 0x74 0x69 0x6F 0x6E 0x0D 0x0A 0x55 0x73 // 'tion??Us' 0x65 0x20 0x74 0x68 0x65 0x20 0x52 0x65 // 'e the Re' 0x73 0x75 0x6D 0x65 0x20 0x4C 0x61 0x73 // 'sume Las' 0x74 0x20 0x41 0x63 0x74 0x69 0x6F 0x6E // 't Action' 0x20 0x74 0x6F 0x6F 0x6C 0x20 0x77 0x68 // ' tool wh' 0x65 0x6E 0x20 0x79 0x6F 0x75 0x20 0x77 // 'en you w' 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 0x63 // 'ant to c' 0x6F 0x6E 0x74 0x69 0x6E 0x75 0x65 0x20 // 'ontinue ' 0x72 0x65 0x63 0x6F 0x72 0x64 0x69 0x6E // 'recordin' 0x67 0x20 0x74 0x68 0x65 0x20 0x6C 0x61 // 'g the la' 0x73 0x74 0x20 0x61 0x63 0x74 0x69 0x6F // 'st actio' 0x6E 0x20 0x61 0x6E 0x20 0x61 0x63 0x74 // 'n an act' 0x6F 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 // 'or, prop' 0x2C 0x20 0x6F 0x72 0x20 0x33 0x44 0x20 // ', or 3D ' 0x77 0x6F 0x72 0x64 0x20 0x75 0x73 0x65 // 'word use' 0x64 0x2E // 'd.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1B= ktpc1Project1B #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1B, __HELP_NAME("CO--I'll show you my best")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1B, __HELP_NAME("CO--I'll show you my best")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject 0x0 kidPlayProjectSounds 0x140 0x6E 0x57415645 kwav1Project1B ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_18=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1B, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc1Project1B" ITEM "kgobProject" ITEM "" ITEM "kidPlayProjectSounds" ITEM "kwav1Project1B" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_18=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1B, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC0 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_18=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_18, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xB3 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0xA7 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0xAC 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x78 0x00 0x00 0x82 // '????x??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_18=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_18, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x47 0x72 0x65 0x67 0x6F 0x72 0x79 0x2E // 'Gregory.' 0x20 0x20 0x54 0x68 0x65 0x6E 0x20 0x68 // ' Then h' 0x6F 0x6C 0x64 0x20 0x64 0x6F 0x77 0x6E // 'old down' 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 // ' the mou' 0x73 0x65 0x20 0x62 0x75 0x74 0x74 0x6F // 'se butto' 0x6E 0x20 0x66 0x6F 0x72 0x20 0x61 0x73 // 'n for as' 0x20 0x6C 0x6F 0x6E 0x67 0x20 0x61 0x73 // ' long as' 0x20 0x69 0x74 0x20 0x74 0x61 0x6B 0x65 // ' it take' 0x73 0x20 0x47 0x72 0x65 0x67 0x6F 0x72 // 's Gregor' 0x79 0x27 0x73 0x20 0x61 0x72 0x6D 0x73 // 'y's arms' 0x20 0x74 0x6F 0x20 0x6D 0x6F 0x76 0x65 // ' to move' 0x20 0x61 0x6E 0x64 0x20 0x65 0x6E 0x64 // ' and end' 0x20 0x75 0x70 0x20 0x62 0x79 0x20 0x68 // ' up by h' 0x69 0x73 0x20 0x73 0x69 0x64 0x65 0x2E // 'is side.' 0x0D 0x0A 0x57 0x68 0x65 0x6E 0x20 0x79 // '??When y' 0x6F 0x75 0x92 0x72 0x65 0x20 0x72 0x65 // 'oure re' 0x61 0x64 0x79 0x20 0x74 0x6F 0x20 0x70 // 'ady to p' 0x6C 0x61 0x79 0x20 0x74 0x68 0x65 0x20 // 'lay the ' 0x6D 0x6F 0x76 0x69 0x65 0x2C 0x20 0x63 // 'movie, c' 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 // 'lick the' 0x20 0x50 0x6C 0x61 0x79 0x20 0x62 0x75 // ' Play bu' 0x74 0x74 0x6F 0x6E 0x2E // 'tton.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1C= ktpc1Project1C #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1C, __HELP_NAME("CO--Click Gregory moves hands")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1C, __HELP_NAME("CO--Click Gregory moves hands")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject kidFrameRW kidPlayProjectSounds 0x0 0x0 0x57415645 kwav1Project1C ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_28=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1C, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc1Project1C" ITEM "kgobProject" ITEM "kidFrameRW" ITEM "kidPlayProjectSounds" ITEM "kwav1Project1C" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_28=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1C, 0x0) BYTE 0x01 0x00 0x03 0x03 0xBF 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_9=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_28, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpRewind __HELP_SYMBOL( STN "mbmpRewind" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_28=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_28, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0xFC 0x00 0x00 0x1A 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xAB 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x9C 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0xAA 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x6D 0x00 0x00 0x82 // '????m??' 0x00 0x00 0x00 0x00 0x1A 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_28=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_28, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x50 0x72 0x65 0x76 // 'the Prev' 0x69 0x6F 0x75 0x73 0x20 0x62 0x75 0x74 // 'ious but' 0x74 0x6F 0x6E 0x2D 0x01 0x20 0x75 0x6E // 'ton-? un' 0x74 0x69 0x6C 0x20 0x79 0x6F 0x75 0x20 // 'til you ' 0x72 0x65 0x77 0x69 0x6E 0x64 0x20 0x74 // 'rewind t' 0x68 0x65 0x20 0x6D 0x6F 0x76 0x69 0x65 // 'he movie' 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 // ' to the ' 0x66 0x72 0x61 0x6D 0x65 0x20 0x77 0x68 // 'frame wh' 0x65 0x72 0x65 0x20 0x47 0x72 0x65 0x67 // 'ere Greg' 0x6F 0x72 0x79 0x20 0x73 0x74 0x61 0x72 // 'ory star' 0x74 0x73 0x20 0x74 0x6F 0x20 0x6D 0x6F // 'ts to mo' 0x76 0x65 0x20 0x68 0x69 0x73 0x20 0x68 // 've his h' 0x61 0x6E 0x64 0x73 0x2E 0x0D 0x0A 0x57 // 'ands.??W' 0x68 0x65 0x6E 0x20 0x79 0x6F 0x75 0x92 // 'hen you' 0x72 0x65 0x20 0x72 0x65 0x61 0x64 0x79 // 're ready' 0x20 0x66 0x6F 0x72 0x20 0x74 0x68 0x65 // ' for the' 0x20 0x6E 0x65 0x78 0x74 0x20 0x73 0x74 // ' next st' 0x65 0x70 0x2C 0x20 0x63 0x6C 0x69 0x63 // 'ep, clic' 0x6B 0x20 0x74 0x68 0x65 0x20 0x50 0x72 // 'k the Pr' 0x6F 0x6A 0x65 0x63 0x74 0x20 0x47 0x61 // 'oject Ga' 0x64 0x67 0x65 0x74 0x2E // 'dget.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1D= ktpc1Project1D #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1D, __HELP_NAME("To see the steps for adding")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1D, __HELP_NAME("To see the steps for adding")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon7 kgobProject kidGadgetHow kidPlayProjectSounds 0x0 0x0 0x57415645 kwav1Project1D ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_9=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1D, 0x0) GST(0) ITEM "kgobCalloutBalloon7" ITEM "ktpc1Project1D" ITEM "kgobProject" ITEM "kidGadgetHow" ITEM "kidPlayProjectSounds" ITEM "kwav1Project1D" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_9=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x73 0x00 0x00 0x00 // '????s???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_9=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_9, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x41 0x00 0x00 0x01 // '????A???' 0x00 0x00 0x00 0x00 0x36 0x00 0x00 0x03 // '????6???' 0x0B 0x00 0x00 0xFD 0x39 0x00 0x00 0x03 // '???9???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_9=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_9, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x73 0x65 0x65 // '??To see' 0x20 0x74 0x68 0x65 0x20 0x73 0x74 0x65 // ' the ste' 0x70 0x73 0x20 0x66 0x6F 0x72 0x20 0x61 // 'ps for a' 0x64 0x64 0x69 0x6E 0x67 0x20 0x47 0x72 // 'dding Gr' 0x65 0x67 0x6F 0x72 0x79 0x92 0x73 0x20 // 'egorys ' 0x6C 0x69 0x6E 0x65 0x2C 0x20 0x63 0x6C // 'line, cl' 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 // 'ick the ' 0x48 0x6F 0x77 0x20 0x62 0x75 0x74 0x74 // 'How butt' 0x6F 0x6E 0x2E // 'on.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1E= ktpc1Project1E #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1E, __HELP_NAME("Why--Claudia's previous")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1E, __HELP_NAME("Why--Claudia's previous")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobProject 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwav1Project1E ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1E, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpc1Project1E" ITEM "kgobProject" ITEM "" ITEM "" ITEM "kwav1Project1E" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1E, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE9 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xB5 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x61 0x75 0x64 0x69 // '??Claudi' 0x61 0x27 0x73 0x20 0x70 0x72 0x65 0x76 // 'a's prev' 0x69 0x6F 0x75 0x73 0x20 0x73 0x65 0x6E // 'ious sen' 0x74 0x65 0x6E 0x63 0x65 0x20 0x77 0x61 // 'tence wa' 0x73 0x20 0x73 0x68 0x6F 0x72 0x74 0x20 // 's short ' 0x73 0x6F 0x20 0x77 0x65 0x20 0x6B 0x65 // 'so we ke' 0x70 0x74 0x20 0x74 0x68 0x65 0x20 0x63 // 'pt the c' 0x61 0x6D 0x65 0x72 0x61 0x20 0x6F 0x6E // 'amera on' 0x20 0x43 0x6C 0x61 0x75 0x64 0x69 0x61 // ' Claudia' 0x2E 0x20 0x20 0x42 0x75 0x74 0x20 0x77 // '. But w' 0x68 0x65 0x6E 0x20 0x61 0x20 0x73 0x65 // 'hen a se' 0x6E 0x74 0x65 0x6E 0x63 0x65 0x20 0x69 // 'ntence i' 0x73 0x20 0x6C 0x6F 0x6E 0x67 0x2C 0x20 // 's long, ' 0x6C 0x69 0x6B 0x65 0x20 0x47 0x72 0x65 // 'like Gre' 0x67 0x6F 0x72 0x79 0x27 0x73 0x20 0x6E // 'gory's n' 0x65 0x78 0x74 0x20 0x6C 0x69 0x6E 0x65 // 'ext line' 0x2C 0x20 0x63 0x68 0x61 0x6E 0x67 0x65 // ', change' 0x20 0x74 0x68 0x65 0x20 0x63 0x61 0x6D // ' the cam' 0x65 0x72 0x61 0x20 0x61 0x6E 0x67 0x6C // 'era angl' 0x65 0x20 0x6E 0x65 0x61 0x72 0x20 0x74 // 'e near t' 0x68 0x65 0x20 0x65 0x6E 0x64 0x20 0x6F // 'he end o' 0x66 0x20 0x74 0x68 0x65 0x20 0x73 0x65 // 'f the se' 0x6E 0x74 0x65 0x6E 0x63 0x65 0x2E // 'ntence.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1F= ktpc1Project1F #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1F, __HELP_NAME("CO--To find Gregory's line")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1F, __HELP_NAME("CO--To find Gregory's line")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobProject kidSoundsCover kidPlayProjectSounds 0x0 0x0 0x57415645 kwav1Project1F ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_24=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1F, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpc1Project1F" ITEM "kgobProject" ITEM "kidSoundsCover" ITEM "kidPlayProjectSounds" ITEM "kwav1Project1F" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_24=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x82 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_24=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_24, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x25 0x00 0x00 0x01 // '????%???' 0x00 0x00 0x00 0x00 0x1E 0x00 0x00 0x03 // '????????' 0x0B 0x00 0x00 0xFD 0x24 0x00 0x00 0x03 // '???$???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_24=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_24, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x66 0x69 0x6E // '??To fin' 0x64 0x20 0x47 0x72 0x65 0x67 0x6F 0x72 // 'd Gregor' 0x79 0x92 0x73 0x20 0x6C 0x69 0x6E 0x65 // 'ys line' 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 // ', click ' 0x53 0x6F 0x75 0x6E 0x64 0x73 0x2E // 'Sounds.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_20= ktpc1Project20 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_20, __HELP_NAME("Congratulations! You're done.")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_20, __HELP_NAME("Congratulations! You're done.")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobProject 0x0 kidPlayProjectSounds 0x258 0x1C2 0x57415645 kwav1Project20 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_21=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_20, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpc1Project20" ITEM "kgobProject" ITEM "" ITEM "kidPlayProjectSounds" ITEM "kwav1Project20" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_21=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_20, 0x0) BYTE 0x01 0x00 0x03 0x03 0x9B 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_8=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_21, 0x0) AG(4) ITEM LONG 0xC0000004 VAR LONG 'GOKD' _gobHelpSquishy 0xFFFFFFFF __HELP_SYMBOL( STN "_gobHelpSquishy" ) ITEM LONG 0x40000001 VAR BYTE 0x01 0xFF 0xFF 0xFF 0xFF // '?' ITEM LONG 0x40000001 VAR BYTE 0x02 0xFF 0xFF 0xFF 0xFF // '?' ITEM LONG 0x40000001 VAR BYTE 0x03 0xFF 0xFF 0xFF 0xFF // '?' ITEM LONG 0x40000001 VAR BYTE 0x04 0xFF 0xFF 0xFF 0xFF // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_21=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_21, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x12 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xA6 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0B 0x00 0x00 0xFD 0x3E 0x00 0x00 0x03 // '???>???' 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0x40 // '????@??@' 0x02 0x00 0x00 0x00 0x53 0x00 0x00 0x40 // '????S??@' 0x00 0x00 0x00 0x00 0x55 0x00 0x00 0x40 // '????U??@' 0x03 0x00 0x00 0x00 0x6F 0x00 0x00 0x40 // '????o??@' 0x04 0x00 0x00 0x00 0x8E 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x90 0x00 0x00 0x40 // '??????@' 0x05 0x00 0x00 0x00 0xA6 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0x80 // '????@??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x90 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0xC0 // '????@??' 0x01 0x00 0x00 0x00 0x55 0x00 0x00 0xC0 // '????U??' 0x01 0x00 0x00 0x00 0x6F 0x00 0x00 0xC0 // '????o??' 0x01 0x00 0x00 0x00 0x90 0x00 0x00 0xC0 // '??????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_21=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_21, 0x0) BYTE 0x03 0x03 0x43 0x6F 0x6E 0x67 0x72 0x61 // '??Congra' 0x74 0x75 0x6C 0x61 0x74 0x69 0x6F 0x6E // 'tulation' 0x73 0x21 0x20 0x20 0x59 0x6F 0x75 0x27 // 's! You'' 0x72 0x65 0x20 0x64 0x6F 0x6E 0x65 0x21 // 're done!' 0x20 0x20 0x57 0x68 0x61 0x74 0x20 0x77 // ' What w' 0x6F 0x75 0x6C 0x64 0x20 0x79 0x6F 0x75 // 'ould you' 0x20 0x6C 0x69 0x6B 0x65 0x20 0x74 0x6F // ' like to' 0x20 0x64 0x6F 0x20 0x6E 0x6F 0x77 0x3F // ' do now?' 0x0D 0x0A 0x01 0x09 0x57 0x6F 0x72 0x6B // '????Work' 0x20 0x6F 0x6E 0x20 0x79 0x6F 0x75 0x72 // ' on your' 0x20 0x6F 0x77 0x6E 0x3F 0x0D 0x0A 0x01 // ' own????' 0x09 0x53 0x74 0x61 0x72 0x74 0x20 0x61 // '?Start a' 0x6E 0x6F 0x74 0x68 0x65 0x72 0x20 0x70 // 'nother p' 0x72 0x6F 0x6A 0x65 0x63 0x74 0x3F 0x0D // 'roject??' 0x0A 0x01 0x09 0x47 0x6F 0x20 0x62 0x61 // '???Go ba' 0x63 0x6B 0x20 0x74 0x6F 0x20 0x74 0x68 // 'ck to th' 0x65 0x20 0x50 0x72 0x6F 0x6A 0x65 0x63 // 'e Projec' 0x74 0x73 0x20 0x52 0x6F 0x6F 0x6D 0x3F // 'ts Room?' 0x0D 0x0A 0x01 0x09 0x51 0x75 0x69 0x74 // '????Quit' 0x20 0x33 0x44 0x20 0x4D 0x6F 0x76 0x69 // ' 3D Movi' 0x65 0x20 0x4D 0x61 0x6B 0x65 0x72 0x3F // 'e Maker?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_21= ktpc1Project21 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_21, __HELP_NAME("Tip: Another movie")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_21, __HELP_NAME("Tip: Another movie")) __HELP_PACK2 BO OSK LONG kgobBalloonHotGadgetHelp kgobProjectHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwav1Project21 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_10=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_21, 0x0) GST(0) ITEM "kgobBalloonHotGadgetHelp" ITEM "ktpc1Project21" ITEM "kgobProjectHot" ITEM "" ITEM "" ITEM "kwav1Project21" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_10=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_21, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_3=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_10, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_10=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_10, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x13 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x15 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x6B 0x00 0x00 0x01 // '????k???' 0x00 0x00 0x00 0x00 0x15 0x00 0x00 0x03 // '????????' 0x0B 0x00 0x00 0xFD 0x2E 0x00 0x00 0x03 // '???.???' 0x0A 0x00 0x00 0xFD 0x30 0x00 0x00 0x03 // '???0???' 0x0F 0x00 0x00 0xFD 0x6B 0x00 0x00 0x03 // '???k???' 0x00 0x00 0x00 0x00 0x30 0x00 0x00 0x80 // '????0??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x30 0x00 0x00 0x82 // '????0??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_10=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_10, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x41 0x6E 0x6F // '??? Ano' 0x74 0x68 0x65 0x72 0x20 0x70 0x72 0x6F // 'ther pro' 0x6A 0x65 0x63 0x74 0x3F 0x0D 0x0A 0x54 // 'ject???T' 0x6F 0x20 0x63 0x68 0x6F 0x6F 0x73 0x65 // 'o choose' 0x20 0x61 0x6E 0x6F 0x74 0x68 0x65 0x72 // ' another' 0x20 0x70 0x72 0x6F 0x6A 0x65 0x63 0x74 // ' project' 0x0D 0x0A 0x95 0x09 0x43 0x6C 0x69 0x63 // '???Clic' 0x6B 0x20 0x74 0x68 0x65 0x20 0x61 0x72 // 'k the ar' 0x72 0x6F 0x77 0x73 0x20 0x6F 0x6E 0x20 // 'rows on ' 0x74 0x68 0x65 0x20 0x72 0x69 0x67 0x68 // 'the righ' 0x74 0x20 0x73 0x69 0x64 0x65 0x20 0x6F // 't side o' 0x66 0x20 0x74 0x68 0x65 0x20 0x50 0x72 // 'f the Pr' 0x6F 0x6A 0x65 0x63 0x74 0x20 0x47 0x61 // 'oject Ga' 0x64 0x67 0x65 0x74 0x2E // 'dget.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_22= ktpc1Project22 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_22, __HELP_NAME("CO--To see this movie 2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_22, __HELP_NAME("CO--To see this movie 2")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon1 kgobProject kidGadgetPlay kidPlayProjectSounds 0x0 0x0 0x57415645 kwav1Project22 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_22, 0x0) GST(0) ITEM "kgobCalloutBalloon1" ITEM "ktpc1Project22" ITEM "kgobProject" ITEM "kidGadgetPlay" ITEM "kidPlayProjectSounds" ITEM "kwav1Project22" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_22, 0x0) BYTE 0x01 0x00 0x03 0x03 0x78 0x00 0x00 0x00 // '????x???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2D, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpc1Project21 __HELP_SYMBOL( STN "ktpc1Project21" ) ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_2D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x09 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x58 0x00 0x00 0x01 // '????X???' 0x00 0x00 0x00 0x00 0x38 0x00 0x00 0x03 // '????8???' 0x0B 0x00 0x00 0xFD 0x3C 0x00 0x00 0x03 // '?????@' 0x02 0x00 0x00 0x00 0x56 0x00 0x00 0x40 // '????V??@' 0x00 0x00 0x00 0x00 0x3E 0x00 0x00 0x80 // '????>??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x3E 0x00 0x00 0x82 // '????>??' 0x00 0x00 0x00 0x00 0x3E 0x00 0x00 0xC0 // '????>??' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x69 0x6E 0x73 0x69 0x64 0x65 0x20 0x4D // 'inside M' 0x69 0x6D 0x69 0x27 0x73 0x20 0x79 0x65 // 'imi's ye' 0x6C 0x6C 0x6F 0x77 0x20 0x6F 0x75 0x74 // 'llow out' 0x6C 0x69 0x6E 0x65 0x20 0x74 0x6F 0x20 // 'line to ' 0x22 0x66 0x72 0x65 0x65 0x7A 0x65 0x22 // '"freeze"' 0x20 0x68 0x65 0x72 0x20 0x69 0x6E 0x20 // ' her in ' 0x70 0x6C 0x61 0x63 0x65 0x2E 0x0D 0x0A // 'place.??' 0x01 0x20 0x57 0x68 0x69 0x63 0x68 0x20 // '? Which ' 0x61 0x63 0x74 0x6F 0x72 0x20 0x74 0x6F // 'actor to' 0x20 0x66 0x72 0x65 0x65 0x7A 0x65 0x3F // ' freeze?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_9= ktpc2Project09 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_9, __HELP_NAME("Tip: Which actor to freeze")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_9, __HELP_NAME("Tip: Which actor to freeze")) __HELP_PACK2 BO OSK LONG kgobBalloonHotGadgetHelp kgobProjectHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwav2Project09 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_10=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_9, 0x0) GST(0) ITEM "kgobBalloonHotGadgetHelp" ITEM "ktpc2Project09" ITEM "kgobProjectHot" ITEM "" ITEM "" ITEM "kwav2Project09" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_10=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_9, 0x0) BYTE 0x01 0x00 0x03 0x03 0xEC 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_9=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_10, 0x0) AG(4) FREE ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_10=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_10, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x01 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x44 0x01 0x00 0x01 // '????D???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x1B 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_10=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_10, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x57 0x68 0x69 // '??? Whi' 0x63 0x68 0x20 0x61 0x63 0x74 0x6F 0x72 // 'ch actor' 0x20 0x74 0x6F 0x20 0x66 0x72 0x65 0x65 // ' to free' 0x7A 0x65 0x3F 0x0D 0x0A 0x47 0x6F 0x20 // 'ze???Go ' 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 0x66 // 'to the f' 0x72 0x61 0x6D 0x65 0x20 0x69 0x6E 0x20 // 'rame in ' 0x74 0x68 0x65 0x20 0x6D 0x6F 0x76 0x69 // 'the movi' 0x65 0x20 0x77 0x68 0x65 0x72 0x65 0x20 // 'e where ' 0x6F 0x6E 0x65 0x20 0x61 0x63 0x74 0x6F // 'one acto' 0x72 0x20 0x69 0x73 0x20 0x69 0x6E 0x20 // 'r is in ' 0x74 0x68 0x65 0x20 0x63 0x6F 0x72 0x72 // 'the corr' 0x65 0x63 0x74 0x20 0x73 0x70 0x6F 0x74 // 'ect spot' 0x2E 0x20 0x20 0x55 0x73 0x65 0x20 0x74 // '. Use t' 0x68 0x65 0x20 0x53 0x79 0x6E 0x63 0x68 // 'he Synch' 0x72 0x6F 0x6E 0x69 0x7A 0x65 0x20 0x74 // 'ronize t' 0x6F 0x6F 0x6C 0x20 0x74 0x6F 0x20 0x22 // 'ool to "' 0x66 0x72 0x65 0x65 0x7A 0x65 0x22 0x20 // 'freeze" ' 0x74 0x68 0x61 0x74 0x20 0x61 0x63 0x74 // 'that act' 0x6F 0x72 0x20 0x69 0x6E 0x20 0x70 0x6C // 'or in pl' 0x61 0x63 0x65 0x2E 0x20 0x20 0x54 0x68 // 'ace. Th' 0x65 0x6E 0x20 0x63 0x6C 0x69 0x63 0x6B // 'en click' 0x20 0x74 0x68 0x65 0x20 0x42 0x61 0x63 // ' the Bac' 0x6B 0x20 0x6F 0x72 0x20 0x46 0x6F 0x72 // 'k or For' 0x77 0x61 0x72 0x64 0x20 0x41 0x72 0x72 // 'ward Arr' 0x6F 0x77 0x73 0x20 0x74 0x6F 0x20 0x72 // 'ows to r' 0x65 0x77 0x69 0x6E 0x64 0x20 0x6F 0x72 // 'ewind or' 0x20 0x61 0x64 0x76 0x61 0x6E 0x63 0x65 // ' advance' 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F 0x76 // ' the mov' 0x69 0x65 0x2E 0x20 0x20 0x4B 0x65 0x65 // 'ie. Kee' 0x70 0x20 0x63 0x6C 0x69 0x63 0x6B 0x69 // 'p clicki' 0x6E 0x67 0x20 0x74 0x68 0x65 0x20 0x61 // 'ng the a' 0x72 0x72 0x6F 0x77 0x73 0x20 0x75 0x6E // 'rrows un' 0x74 0x69 0x6C 0x20 0x74 0x68 0x65 0x20 // 'til the ' 0x73 0x65 0x63 0x6F 0x6E 0x64 0x20 0x61 // 'second a' 0x63 0x74 0x6F 0x72 0x20 0x69 0x73 0x20 // 'ctor is ' 0x62 0x65 0x68 0x69 0x6E 0x64 0x2C 0x20 // 'behind, ' 0x61 0x68 0x65 0x61 0x64 0x20 0x6F 0x66 // 'ahead of' 0x2C 0x20 0x6F 0x72 0x20 0x6D 0x65 0x65 // ', or mee' 0x74 0x73 0x20 0x74 0x68 0x65 0x20 0x22 // 'ts the "' 0x66 0x72 0x6F 0x7A 0x65 0x6E 0x22 0x20 // 'frozen" ' 0x61 0x63 0x74 0x6F 0x72 0x2E // 'actor.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_A= ktpc2Project0A #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_A, __HELP_NAME("CO--Click the back arrow")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_A, __HELP_NAME("CO--Click the back arrow")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon4 kgobProject kidActorsSoonerButton kidPlayProjectSounds 0xFFFFFFDC 0x10 0x57415645 kwav2Project0A ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_9=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_A, 0x0) GST(0) ITEM "kgobCalloutBalloon4" ITEM "ktpc2Project0A" ITEM "kgobProject" ITEM "kidActorsSoonerButton" ITEM "kidPlayProjectSounds" ITEM "kwav2Project0A" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_9=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x95 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_9=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_9, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x5A 0x00 0x00 0x01 // '????Z???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_9=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_9, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x42 0x61 0x63 0x6B // 'the Back' 0x20 0x41 0x72 0x72 0x6F 0x77 0x20 0x31 // ' Arrow 1' 0x32 0x20 0x74 0x69 0x6D 0x65 0x73 0x20 // '2 times ' 0x75 0x6E 0x74 0x69 0x6C 0x20 0x43 0x68 // 'until Ch' 0x61 0x72 0x6C 0x69 0x65 0x20 0x61 0x70 // 'arlie ap' 0x70 0x65 0x61 0x72 0x73 0x20 0x6F 0x75 // 'pears ou' 0x74 0x73 0x69 0x64 0x65 0x20 0x6F 0x66 // 'tside of' 0x20 0x74 0x68 0x65 0x20 0x67 0x72 0x61 // ' the gra' 0x76 0x65 0x20 0x63 0x68 0x61 0x6D 0x62 // 've chamb' 0x65 0x72 0x20 0x65 0x6E 0x74 0x72 0x61 // 'er entra' 0x6E 0x63 0x65 0x2E // 'nce.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_B= ktpc2Project0B #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_B, __HELP_NAME("CO--Click the first button")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_B, __HELP_NAME("CO--Click the first button")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject kidFrameRWEnd kidPlayProjectSounds 0x0 0x0 0x57415645 kwav2Project0B ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_14=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_B, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc2Project0B" ITEM "kgobProject" ITEM "kidFrameRWEnd" ITEM "kidPlayProjectSounds" ITEM "kwav2Project0B" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_14=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_B, 0x0) BYTE 0x01 0x00 0x03 0x03 0xAC 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_3=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_14, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpRewindEnd __HELP_SYMBOL( STN "mbmpRewindEnd" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_14=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_14, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0xFD 0x00 0x00 0x45 0x00 0x00 0x01 // '???E???' 0x01 0x00 0x00 0x00 0x47 0x00 0x00 0x01 // '????G???' 0x01 0xFD 0x00 0x00 0x50 0x00 0x00 0x01 // '???P???' 0x01 0x00 0x00 0x00 0x67 0x00 0x00 0x01 // '????g???' 0x00 0x00 0x00 0x00 0x45 0x00 0x00 0xC0 // '????E??' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_14=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_14, 0x0) BYTE 0x03 0x03 0x4F 0x6E 0x63 0x65 0x20 0x43 // '??Once C' 0x68 0x61 0x72 0x6C 0x69 0x65 0x20 0x69 // 'harlie i' 0x73 0x20 0x6F 0x75 0x74 0x73 0x69 0x64 // 's outsid' 0x65 0x20 0x6F 0x66 0x20 0x74 0x68 0x65 // 'e of the' 0x20 0x67 0x72 0x61 0x76 0x65 0x20 0x63 // ' grave c' 0x68 0x61 0x6D 0x62 0x65 0x72 0x2C 0x20 // 'hamber, ' 0x63 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 // 'click th' 0x65 0x20 0x46 0x69 0x72 0x73 0x74 0x20 // 'e First ' 0x62 0x75 0x74 0x74 0x6F 0x6E 0x2D 0x01 // 'button-?' 0x20 0x74 0x6F 0x20 0x72 0x65 0x77 0x69 // ' to rewi' 0x6E 0x64 0x20 0x79 0x6F 0x75 0x72 0x20 // 'nd your ' 0x6D 0x6F 0x76 0x69 0x65 0x20 0x74 0x6F // 'movie to' 0x20 0x66 0x72 0x61 0x6D 0x65 0x20 0x31 // ' frame 1' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_C= ktpc2Project0C #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_C, __HELP_NAME("CO--To play new ending")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_C, __HELP_NAME("CO--To play new ending")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject kidPlay kidPlayProjectSounds 0x0 0x0 0x57415645 kwav2Project0C ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_C, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc2Project0C" ITEM "kgobProject" ITEM "kidPlay" ITEM "kidPlayProjectSounds" ITEM "kwav2Project0C" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x89 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2D 0x00 0x00 0x01 // '????-???' 0x00 0x00 0x00 0x00 0x21 0x00 0x00 0x03 // '????!???' 0x0B 0x00 0x00 0xFD 0x2C 0x00 0x00 0x03 // '???,???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x73 0x65 0x65 // '??To see' 0x20 0x79 0x6F 0x75 0x72 0x20 0x6E 0x65 // ' your ne' 0x77 0x20 0x6D 0x6F 0x76 0x69 0x65 0x2C // 'w movie,' 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 0x74 // ' click t' 0x68 0x65 0x20 0x50 0x6C 0x61 0x79 0x20 // 'he Play ' 0x62 0x75 0x74 0x74 0x6F 0x6E 0x2E // 'button.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_D= ktpc2Project0D #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_D, __HELP_NAME("CO Click the First again")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_D, __HELP_NAME("CO Click the First again")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject kidFrameRWEnd kidPlayProjectSounds 0x0 0x0 0x57415645 kwav2Project0D ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_16=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_D, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc2Project0D" ITEM "kgobProject" ITEM "kidFrameRWEnd" ITEM "kidPlayProjectSounds" ITEM "kwav2Project0D" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_16=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_D, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA0 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_A=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_16, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpRewindEnd __HELP_SYMBOL( STN "mbmpRewindEnd" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_16=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_16, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x03 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x3E 0x00 0x00 0x01 // '????>???' 0x00 0x00 0x00 0x00 0x17 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_16=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_16, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x46 0x69 0x72 0x73 // 'the Firs' 0x74 0x20 0x62 0x75 0x74 0x74 0x6F 0x6E // 't button' 0x2D 0x01 0x61 0x67 0x61 0x69 0x6E 0x20 // '-?again ' 0x74 0x6F 0x20 0x72 0x65 0x77 0x69 0x6E // 'to rewin' 0x64 0x20 0x79 0x6F 0x75 0x72 0x20 0x6D // 'd your m' 0x6F 0x76 0x69 0x65 0x20 0x74 0x6F 0x20 // 'ovie to ' 0x66 0x72 0x61 0x6D 0x65 0x20 0x31 0x2E // 'frame 1.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_E= ktpc2Project0E #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_E, __HELP_NAME("CO--To add Kim's action")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_E, __HELP_NAME("CO--To add Kim's action")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject kidFrameFW kidPlayProjectSounds 0x0 0x0 0x57415645 kwav2Project0E ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_5=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_E, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc2Project0E" ITEM "kgobProject" ITEM "kidFrameFW" ITEM "kidPlayProjectSounds" ITEM "kwav2Project0E" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_5=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_E, 0x0) BYTE 0x01 0x00 0x03 0x03 0xBE 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_B=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpForward __HELP_SYMBOL( STN "mbmpForward" ) ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpc2Project0F __HELP_SYMBOL( STN "ktpc2Project0F" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_5=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0xFC 0x00 0x00 0x1A 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xCC 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0xA1 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0xAF 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0xCC 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0xB2 0x00 0x00 0x40 // '??????@' 0x03 0x00 0x00 0x00 0xCC 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xB2 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x1A 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0xB2 0x00 0x00 0xC0 // '??????' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_5=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x03 0x03 0x4E 0x6F 0x77 0x20 0x63 0x6C // '??Now cl' 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 // 'ick the ' 0x4E 0x65 0x78 0x74 0x20 0x62 0x75 0x74 // 'Next but' 0x74 0x6F 0x6E 0x2D 0x01 0x20 0x75 0x6E // 'ton-? un' 0x74 0x69 0x6C 0x20 0x79 0x6F 0x75 0x20 // 'til you ' 0x61 0x64 0x76 0x61 0x6E 0x63 0x65 0x20 // 'advance ' 0x79 0x6F 0x75 0x72 0x20 0x6D 0x6F 0x76 // 'your mov' 0x69 0x65 0x20 0x74 0x6F 0x20 0x74 0x68 // 'ie to th' 0x65 0x20 0x66 0x72 0x61 0x6D 0x65 0x20 // 'e frame ' 0x77 0x68 0x65 0x72 0x65 0x20 0x74 0x68 // 'where th' 0x65 0x20 0x74 0x69 0x74 0x6C 0x65 0x2C // 'e title,' 0x20 0x93 0x53 0x75 0x72 0x70 0x72 0x69 // ' Surpri' 0x73 0x65 0x94 0x20 0x66 0x69 0x72 0x73 // 'se firs' 0x74 0x20 0x61 0x70 0x70 0x65 0x61 0x72 // 't appear' 0x73 0x2E 0x0D 0x0A 0x57 0x68 0x65 0x6E // 's.??When' 0x20 0x79 0x6F 0x75 0x92 0x72 0x65 0x20 // ' youre ' 0x72 0x65 0x61 0x64 0x79 0x20 0x66 0x6F // 'ready fo' 0x72 0x20 0x74 0x68 0x65 0x20 0x6E 0x65 // 'r the ne' 0x78 0x74 0x20 0x73 0x74 0x65 0x70 0x2C // 'xt step,' 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 0x74 // ' click t' 0x68 0x65 0x20 0x50 0x72 0x6F 0x6A 0x65 // 'he Proje' 0x63 0x74 0x20 0x47 0x61 0x64 0x67 0x65 // 'ct Gadge' 0x74 0x2E 0x0D 0x0A 0x01 0x20 0x57 0x61 // 't.??? Wa' 0x74 0x63 0x68 0x20 0x66 0x6F 0x72 0x20 // 'tch for ' 0x74 0x68 0x65 0x20 0x6D 0x75 0x73 0x69 // 'the musi' 0x63 0x20 0x6E 0x6F 0x74 0x65 // 'c note' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_F= ktpc2Project0F #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_F, __HELP_NAME("Tip: Watch for the music note")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_F, __HELP_NAME("Tip: Watch for the music note")) __HELP_PACK2 BO OSK LONG kgobBalloonHotGadgetHelp kgobProjectHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwav2Project0F ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_13=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_F, 0x0) GST(0) ITEM "kgobBalloonHotGadgetHelp" ITEM "ktpc2Project0F" ITEM "kgobProjectHot" ITEM "" ITEM "" ITEM "kwav2Project0F" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_13=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_F, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB1 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_4=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_13, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_13=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_13, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x03 0x00 0x00 0x00 0x02 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xDE 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_13=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_13, 0x0) BYTE 0x03 0x03 0x01 0x20 0x57 0x61 0x74 0x63 // '??? Watc' 0x68 0x20 0x66 0x6F 0x72 0x20 0x74 0x68 // 'h for th' 0x65 0x20 0x6D 0x75 0x73 0x69 0x63 0x20 // 'e music ' 0x6E 0x6F 0x74 0x65 0x0D 0x0A 0x54 0x68 // 'note??Th' 0x65 0x20 0x6D 0x75 0x73 0x69 0x63 0x20 // 'e music ' 0x6E 0x6F 0x74 0x65 0x20 0x6F 0x6E 0x20 // 'note on ' 0x74 0x68 0x65 0x20 0x46 0x72 0x61 0x6D // 'the Fram' 0x65 0x20 0x53 0x6C 0x69 0x64 0x65 0x72 // 'e Slider' 0x20 0x69 0x73 0x20 0x61 0x6E 0x6F 0x74 // ' is anot' 0x68 0x65 0x72 0x20 0x77 0x61 0x79 0x20 // 'her way ' 0x74 0x6F 0x20 0x6B 0x6E 0x6F 0x77 0x20 // 'to know ' 0x77 0x68 0x65 0x72 0x65 0x20 0x74 0x6F // 'where to' 0x20 0x66 0x69 0x6E 0x64 0x20 0x74 0x68 // ' find th' 0x65 0x20 0x6F 0x72 0x69 0x67 0x69 0x6E // 'e origin' 0x61 0x6C 0x20 0x66 0x69 0x72 0x73 0x74 // 'al first' 0x20 0x66 0x72 0x61 0x6D 0x65 0x20 0x6F // ' frame o' 0x66 0x20 0x79 0x6F 0x75 0x20 0x6D 0x6F // 'f you mo' 0x76 0x69 0x65 0x2E 0x20 0x20 0x49 0x6E // 'vie. In' 0x20 0x74 0x68 0x69 0x73 0x20 0x63 0x61 // ' this ca' 0x73 0x65 0x2C 0x20 0x74 0x68 0x65 0x20 // 'se, the ' 0x6D 0x75 0x73 0x69 0x63 0x20 0x6E 0x6F // 'music no' 0x74 0x65 0x20 0x69 0x6E 0x64 0x69 0x63 // 'te indic' 0x61 0x74 0x65 0x73 0x20 0x74 0x68 0x65 // 'ates the' 0x72 0x65 0x20 0x69 0x73 0x20 0x6D 0x75 // 're is mu' 0x73 0x69 0x63 0x20 0x61 0x74 0x74 0x61 // 'sic atta' 0x63 0x68 0x65 0x64 0x20 0x74 0x6F 0x20 // 'ched to ' 0x74 0x68 0x69 0x73 0x20 0x62 0x61 0x63 // 'this bac' 0x6B 0x67 0x72 0x6F 0x75 0x6E 0x64 0x2E // 'kground.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_10= ktpc2Project10 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_10, __HELP_NAME("Idle--Remember when you're")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_10, __HELP_NAME("Idle--Remember when you're")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon5 kgobProject kidGadget kidPlayProjectSounds 0x0 0x0 0x57415645 kwav2Project10 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_0=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_10, 0x0) GST(0) ITEM "kgobCalloutBalloon5" ITEM "ktpc2Project10" ITEM "kgobProject" ITEM "kidGadget" ITEM "kidPlayProjectSounds" ITEM "kwav2Project10" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_0=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_10, 0x0) BYTE 0x01 0x00 0x03 0x03 0x96 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_0=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x48 0x00 0x00 0x01 // '????H???' 0x00 0x00 0x00 0x00 0x39 0x00 0x00 0x03 // '????9???' 0x0B 0x00 0x00 0xFD 0x47 0x00 0x00 0x03 // '???G???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_0=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) BYTE 0x03 0x03 0x52 0x65 0x6D 0x65 0x6D 0x62 // '??Rememb' 0x65 0x72 0x2C 0x20 0x77 0x68 0x65 0x6E // 'er, when' 0x20 0x79 0x6F 0x75 0x92 0x72 0x65 0x20 // ' youre ' 0x72 0x65 0x61 0x64 0x79 0x20 0x66 0x6F // 'ready fo' 0x72 0x20 0x74 0x68 0x65 0x20 0x6E 0x65 // 'r the ne' 0x78 0x74 0x20 0x73 0x74 0x65 0x70 0x2C // 'xt step,' 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 0x74 // ' click t' 0x68 0x65 0x20 0x50 0x72 0x6F 0x6A 0x65 // 'he Proje' 0x63 0x74 0x20 0x47 0x61 0x64 0x67 0x65 // 'ct Gadge' 0x74 0x2E // 't.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_11= ktpc2Project11 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_11, __HELP_NAME("CO--Drag Kim to the grave")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_11, __HELP_NAME("CO--Drag Kim to the grave")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon7 kgobProject kidGadgetHow kidPlayProjectSounds 0x0 0x0 0x57415645 kwav2Project11 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_11, 0x0) GST(0) ITEM "kgobCalloutBalloon7" ITEM "ktpc2Project11" ITEM "kgobProject" ITEM "kidGadgetHow" ITEM "kidPlayProjectSounds" ITEM "kwav2Project11" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_11, 0x0) BYTE 0x01 0x00 0x03 0x03 0x73 0x00 0x00 0x00 // '????s???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x50 0x00 0x00 0x01 // '????P???' 0x00 0x00 0x00 0x00 0x44 0x00 0x00 0x03 // '????D???' 0x0B 0x00 0x00 0xFD 0x48 0x00 0x00 0x03 // '???H???' 0x00 0x00 0x00 0x00 0x50 0x00 0x00 0x03 // '????P???' 0x00 0x00 0x00 0x00 0x50 0x00 0x00 0x40 // '????P??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x73 0x65 0x65 // '??To see' 0x20 0x74 0x68 0x65 0x20 0x73 0x74 0x65 // ' the ste' 0x70 0x73 0x20 0x66 0x6F 0x72 0x20 0x72 // 'ps for r' 0x65 0x6D 0x6F 0x76 0x69 0x6E 0x67 0x20 // 'emoving ' 0x65 0x76 0x65 0x72 0x79 0x74 0x68 0x69 // 'everythi' 0x6E 0x67 0x20 0x62 0x65 0x66 0x6F 0x72 // 'ng befor' 0x65 0x20 0x74 0x68 0x65 0x20 0x74 0x69 // 'e the ti' 0x74 0x6C 0x65 0x2C 0x20 0x63 0x6C 0x69 // 'tle, cli' 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 0x48 // 'ck the H' 0x6F 0x77 0x20 0x62 0x75 0x74 0x74 0x6F // 'ow butto' 0x6E 0x2E // 'n.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_12= ktpc2Project12 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_12, __HELP_NAME("Why--Extra frames")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_12, __HELP_NAME("Why--Extra frames")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobProject 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwav2Project12 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_12, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpc2Project12" ITEM "kgobProject" ITEM "" ITEM "" ITEM "kwav2Project12" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_12, 0x0) BYTE 0x01 0x00 0x03 0x03 0xEB 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x03 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xBA 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0xBA 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) BYTE 0x03 0x03 0x45 0x78 0x74 0x72 0x61 0x20 // '??Extra ' 0x66 0x72 0x61 0x6D 0x65 0x73 0x20 0x61 // 'frames a' 0x74 0x20 0x74 0x68 0x65 0x20 0x62 0x65 // 't the be' 0x67 0x69 0x6E 0x6E 0x69 0x6E 0x67 0x20 // 'ginning ' 0x6F 0x66 0x20 0x79 0x6F 0x75 0x72 0x20 // 'of your ' 0x73 0x63 0x65 0x6E 0x65 0x20 0x63 0x61 // 'scene ca' 0x6E 0x20 0x62 0x65 0x20 0x75 0x73 0x65 // 'n be use' 0x66 0x75 0x6C 0x2C 0x20 0x69 0x66 0x20 // 'ful, if ' 0x79 0x6F 0x75 0x20 0x70 0x6C 0x61 0x6E // 'you plan' 0x20 0x66 0x6F 0x72 0x20 0x74 0x68 0x61 // ' for tha' 0x74 0x20 0x65 0x66 0x66 0x65 0x63 0x74 // 't effect' 0x2E 0x20 0x20 0x46 0x6F 0x72 0x20 0x65 // '. For e' 0x78 0x61 0x6D 0x70 0x6C 0x65 0x2C 0x20 // 'xample, ' 0x79 0x6F 0x75 0x20 0x6D 0x69 0x67 0x68 // 'you migh' 0x74 0x20 0x77 0x61 0x6E 0x74 0x20 0x61 // 't want a' 0x6E 0x20 0x61 0x63 0x74 0x69 0x6F 0x6E // 'n action' 0x20 0x74 0x6F 0x20 0x6F 0x63 0x63 0x75 // ' to occu' 0x72 0x20 0x62 0x65 0x66 0x6F 0x72 0x65 // 'r before' 0x20 0x74 0x68 0x65 0x20 0x74 0x69 0x74 // ' the tit' 0x6C 0x65 0x20 0x61 0x70 0x70 0x65 0x61 // 'le appea' 0x72 0x73 0x20 0x74 0x6F 0x20 0x63 0x72 // 'rs to cr' 0x65 0x61 0x74 0x65 0x20 0x61 0x20 0x63 // 'eate a c' 0x65 0x72 0x74 0x61 0x69 0x6E 0x20 0x6D // 'ertain m' 0x6F 0x6F 0x64 0x2E // 'ood.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_13= ktpc2Project13 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_13, __HELP_NAME("CO To remove everything")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_13, __HELP_NAME("CO To remove everything")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon1 kgobProject kidSettingsCover kidPlayProjectSounds 0x0 0x0 0x57415645 kwav2Project13 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_13, 0x0) GST(0) ITEM "kgobCalloutBalloon1" ITEM "ktpc2Project13" ITEM "kgobProject" ITEM "kidSettingsCover" ITEM "kidPlayProjectSounds" ITEM "kwav2Project13" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_13, 0x0) BYTE 0x01 0x00 0x03 0x03 0x82 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x3C 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0x40 // '????@??@' 0x02 0x00 0x00 0x00 0x53 0x00 0x00 0x40 // '????S??@' 0x00 0x00 0x00 0x00 0x55 0x00 0x00 0x40 // '????U??@' 0x03 0x00 0x00 0x00 0x6D 0x00 0x00 0x40 // '????m??@' 0x00 0x00 0x00 0x00 0x6F 0x00 0x00 0x40 // '????o??@' 0x04 0x00 0x00 0x00 0x8E 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x90 0x00 0x00 0x40 // '??????@' 0x05 0x00 0x00 0x00 0xA6 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0x80 // '????@??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x90 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0xC0 // '????@??' 0x01 0x00 0x00 0x00 0x55 0x00 0x00 0xC0 // '????U??' 0x01 0x00 0x00 0x00 0x6F 0x00 0x00 0xC0 // '????o??' 0x01 0x00 0x00 0x00 0x90 0x00 0x00 0xC0 // '??????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_15=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_15, 0x0) BYTE 0x03 0x03 0x43 0x6F 0x6E 0x67 0x72 0x61 // '??Congra' 0x74 0x75 0x6C 0x61 0x74 0x69 0x6F 0x6E // 'tulation' 0x73 0x21 0x20 0x20 0x59 0x6F 0x75 0x27 // 's! You'' 0x72 0x65 0x20 0x64 0x6F 0x6E 0x65 0x21 // 're done!' 0x20 0x20 0x57 0x68 0x61 0x74 0x20 0x77 // ' What w' 0x6F 0x75 0x6C 0x64 0x20 0x79 0x6F 0x75 // 'ould you' 0x20 0x6C 0x69 0x6B 0x65 0x20 0x74 0x6F // ' like to' 0x20 0x64 0x6F 0x20 0x6E 0x6F 0x77 0x3F // ' do now?' 0x0D 0x0A 0x01 0x09 0x57 0x6F 0x72 0x6B // '????Work' 0x20 0x6F 0x6E 0x20 0x79 0x6F 0x75 0x72 // ' on your' 0x20 0x6F 0x77 0x6E 0x3F 0x0D 0x0A 0x01 // ' own????' 0x09 0x53 0x74 0x61 0x72 0x74 0x20 0x61 // '?Start a' 0x6E 0x6F 0x74 0x68 0x65 0x72 0x20 0x70 // 'nother p' 0x72 0x6F 0x6A 0x65 0x63 0x74 0x3F 0x0D // 'roject??' 0x0A 0x01 0x09 0x47 0x6F 0x20 0x62 0x61 // '???Go ba' 0x63 0x6B 0x20 0x74 0x6F 0x20 0x74 0x68 // 'ck to th' 0x65 0x20 0x50 0x72 0x6F 0x6A 0x65 0x63 // 'e Projec' 0x74 0x73 0x20 0x52 0x6F 0x6F 0x6D 0x3F // 'ts Room?' 0x0D 0x0A 0x01 0x09 0x51 0x75 0x69 0x74 // '????Quit' 0x20 0x33 0x44 0x20 0x4D 0x6F 0x76 0x69 // ' 3D Movi' 0x65 0x20 0x4D 0x61 0x6B 0x65 0x72 0x3F // 'e Maker?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2D= ktpc2Project2D #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2D, __HELP_NAME("Tip: Another movie")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2D, __HELP_NAME("Tip: Another movie")) __HELP_PACK2 BO OSK LONG kgobBalloonHotGadgetHelp kgobProjectHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwav2Project2D ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_11=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2D, 0x0) GST(0) ITEM "kgobBalloonHotGadgetHelp" ITEM "ktpc2Project2D" ITEM "kgobProjectHot" ITEM "" ITEM "" ITEM "kwav2Project2D" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_11=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2D, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_6=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_11, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_11=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_11, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x13 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x15 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x6B 0x00 0x00 0x01 // '????k???' 0x00 0x00 0x00 0x00 0x15 0x00 0x00 0x03 // '????????' 0x0B 0x00 0x00 0xFD 0x2E 0x00 0x00 0x03 // '???.???' 0x0A 0x00 0x00 0xFD 0x30 0x00 0x00 0x03 // '???0???' 0x0F 0x00 0x00 0xFD 0x6B 0x00 0x00 0x03 // '???k???' 0x00 0x00 0x00 0x00 0x30 0x00 0x00 0x80 // '????0??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x30 0x00 0x00 0x82 // '????0??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_11=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_11, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x41 0x6E 0x6F // '??? Ano' 0x74 0x68 0x65 0x72 0x20 0x70 0x72 0x6F // 'ther pro' 0x6A 0x65 0x63 0x74 0x3F 0x0D 0x0A 0x54 // 'ject???T' 0x6F 0x20 0x63 0x68 0x6F 0x6F 0x73 0x65 // 'o choose' 0x20 0x61 0x6E 0x6F 0x74 0x68 0x65 0x72 // ' another' 0x20 0x70 0x72 0x6F 0x6A 0x65 0x63 0x74 // ' project' 0x0D 0x0A 0x95 0x09 0x43 0x6C 0x69 0x63 // '???Clic' 0x6B 0x20 0x74 0x68 0x65 0x20 0x61 0x72 // 'k the ar' 0x72 0x6F 0x77 0x73 0x20 0x6F 0x6E 0x20 // 'rows on ' 0x74 0x68 0x65 0x20 0x72 0x69 0x67 0x68 // 'the righ' 0x74 0x20 0x73 0x69 0x64 0x65 0x20 0x6F // 't side o' 0x66 0x20 0x74 0x68 0x65 0x20 0x50 0x72 // 'f the Pr' 0x6F 0x6A 0x65 0x63 0x74 0x20 0x47 0x61 // 'oject Ga' 0x64 0x67 0x65 0x74 0x2E // 'dget.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_30= ktpc2Project30 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_30, __HELP_NAME("Def: drag")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_30, __HELP_NAME("Def: drag")) __HELP_PACK2 BO OSK LONG kgobBalloonHotGadgetHelp kgobProjectHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwav2Project30 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_30, 0x0) GST(0) ITEM "kgobBalloonHotGadgetHelp" ITEM "ktpc2Project30" ITEM "kgobProjectHot" ITEM "" ITEM "" ITEM "kwav2Project30" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_30, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x04 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x77 0x00 0x00 0x01 // '????w???' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x3B 0x00 0x00 0x82 // '????;??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) BYTE 0x03 0x03 0x64 0x72 0x61 0x67 0x0D 0x0A // '??drag??' 0x31 0x09 0x48 0x6F 0x6C 0x64 0x20 0x64 // '1?Hold d' 0x6F 0x77 0x6E 0x20 0x74 0x68 0x65 0x20 // 'own the ' 0x6D 0x6F 0x75 0x73 0x65 0x20 0x62 0x75 // 'mouse bu' 0x74 0x74 0x6F 0x6E 0x20 0x61 0x73 0x20 // 'tton as ' 0x79 0x6F 0x75 0x20 0x6D 0x6F 0x76 0x65 // 'you move' 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 // ' the mou' 0x73 0x65 0x2E 0x0D 0x0A 0x32 0x09 0x57 // 'se.??2?W' 0x68 0x65 0x6E 0x20 0x79 0x6F 0x75 0x27 // 'hen you'' 0x76 0x65 0x20 0x66 0x69 0x6E 0x69 0x73 // 've finis' 0x68 0x65 0x64 0x20 0x64 0x72 0x61 0x67 // 'hed drag' 0x67 0x69 0x6E 0x67 0x2C 0x20 0x6C 0x65 // 'ging, le' 0x74 0x20 0x67 0x6F 0x20 0x6F 0x66 0x20 // 't go of ' 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 0x73 // 'the mous' 0x65 0x20 0x62 0x75 0x74 0x74 0x6F 0x6E // 'e button' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_31= ktpc2Project31 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_31, __HELP_NAME("Tip: Actor List")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_31, __HELP_NAME("Tip: Actor List")) __HELP_PACK2 BO OSK LONG kgobBalloonHotGadgetHelp kgobProjectHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_31, 0x0) GST(0) ITEM "kgobBalloonHotGadgetHelp" ITEM "ktpc2Project31" ITEM "kgobProjectHot" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_31, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_C=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1A, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_1A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xC6 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x0D 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0F 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0xC6 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x0F 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1A, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x41 0x63 0x74 // '??? Act' 0x6F 0x72 0x20 0x4C 0x69 0x73 0x74 0x0D // 'or List?' 0x0A 0x54 0x68 0x65 0x20 0x41 0x63 0x74 // '?The Act' 0x6F 0x72 0x20 0x4C 0x69 0x73 0x74 0x20 // 'or List ' 0x6B 0x65 0x65 0x70 0x73 0x20 0x74 0x72 // 'keeps tr' 0x61 0x63 0x6B 0x20 0x6F 0x66 0x20 0x61 // 'ack of a' 0x6C 0x6C 0x20 0x74 0x68 0x65 0x20 0x61 // 'll the a' 0x63 0x74 0x6F 0x72 0x73 0x20 0x69 0x6E // 'ctors in' 0x20 0x79 0x6F 0x75 0x72 0x20 0x6D 0x6F // ' your mo' 0x76 0x69 0x65 0x2E 0x20 0x20 0x49 0x66 // 'vie. If' 0x20 0x61 0x6E 0x20 0x61 0x63 0x74 0x6F // ' an acto' 0x72 0x20 0x69 0x73 0x20 0x6F 0x75 0x74 // 'r is out' 0x2D 0x6F 0x66 0x2D 0x76 0x69 0x65 0x77 // '-of-view' 0x20 0x6F 0x72 0x20 0x62 0x65 0x68 0x69 // ' or behi' 0x6E 0x64 0x20 0x61 0x6E 0x6F 0x74 0x68 // 'nd anoth' 0x65 0x72 0x20 0x6F 0x62 0x6A 0x65 0x63 // 'er objec' 0x74 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B // 't, click' 0x20 0x74 0x68 0x65 0x20 0x61 0x63 0x74 // ' the act' 0x6F 0x72 0x20 0x69 0x6E 0x20 0x74 0x68 // 'or in th' 0x65 0x20 0x41 0x63 0x74 0x6F 0x72 0x20 // 'e Actor ' 0x4C 0x69 0x73 0x74 0x2E 0x20 0x20 0x54 // 'List. T' 0x68 0x65 0x20 0x61 0x63 0x74 0x6F 0x72 // 'he actor' 0x20 0x77 0x69 0x6C 0x6C 0x20 0x72 0x65 // ' will re' 0x61 0x70 0x70 0x65 0x61 0x72 0x20 0x6F // 'appear o' 0x6E 0x2D 0x73 0x74 0x61 0x67 0x65 0x2E // 'n-stage.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK ================================================ FILE: src/help/project3.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ #undef __HELP_NAME #undef __HELP_SYMBOL #undef __HELP_PACK #undef __HELP_PACK2 #ifdef NO_HELP_NAMES #define __HELP_NAME(name) "" #else #define __HELP_NAME(name) name #endif #ifdef NO_HELP_SYMBOLS #define __HELP_SYMBOL(stuff) #else #define __HELP_SYMBOL(stuff) stuff #endif #ifdef PACK_HELP #define __HELP_PACK PACK #else #define __HELP_PACK #endif #ifdef HELP_SINGLE_CHUNK #define __HELP_PACK2 #else #define __HELP_PACK2 __HELP_PACK #endif SET _help_48544F50_0= To_play_this_movie__click #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("To play this movie, click ")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("To play this movie, click ")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon1 kgobProject kidGadgetPlay kidPlayProjectSounds 0x0 0x0 0x57415645 kwav3Project00 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_15=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) GST(0) ITEM "kgobCalloutBalloon1" ITEM "To_play_this_movie__click" ITEM "kgobProject" ITEM "kidGadgetPlay" ITEM "kidPlayProjectSounds" ITEM "kwav3Project00" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_15=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0x78 0x00 0x00 0x00 // '????x???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_8=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_15, 0x0) AG(4) FREE ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG Tip___Another_movie __HELP_SYMBOL( STN "Tip___Another_movie" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_15=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_15, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x09 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x58 0x00 0x00 0x01 // '????X???' 0x00 0x00 0x00 0x00 0x38 0x00 0x00 0x03 // '????8???' 0x0B 0x00 0x00 0xFD 0x3C 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0x40 // '????@??@' 0x02 0x00 0x00 0x00 0x53 0x00 0x00 0x40 // '????S??@' 0x00 0x00 0x00 0x00 0x55 0x00 0x00 0x40 // '????U??@' 0x03 0x00 0x00 0x00 0x6D 0x00 0x00 0x40 // '????m??@' 0x00 0x00 0x00 0x00 0x6F 0x00 0x00 0x40 // '????o??@' 0x04 0x00 0x00 0x00 0x8E 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x90 0x00 0x00 0x40 // '??????@' 0x05 0x00 0x00 0x00 0xA6 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0x80 // '????@??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x90 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0xC0 // '????@??' 0x01 0x00 0x00 0x00 0x55 0x00 0x00 0xC0 // '????U??' 0x01 0x00 0x00 0x00 0x6F 0x00 0x00 0xC0 // '????o??' 0x01 0x00 0x00 0x00 0x90 0x00 0x00 0xC0 // '??????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x03 0x03 0x43 0x6F 0x6E 0x67 0x72 0x61 // '??Congra' 0x74 0x75 0x6C 0x61 0x74 0x69 0x6F 0x6E // 'tulation' 0x73 0x21 0x20 0x20 0x59 0x6F 0x75 0x27 // 's! You'' 0x72 0x65 0x20 0x64 0x6F 0x6E 0x65 0x21 // 're done!' 0x20 0x20 0x57 0x68 0x61 0x74 0x20 0x77 // ' What w' 0x6F 0x75 0x6C 0x64 0x20 0x79 0x6F 0x75 // 'ould you' 0x20 0x6C 0x69 0x6B 0x65 0x20 0x74 0x6F // ' like to' 0x20 0x64 0x6F 0x20 0x6E 0x6F 0x77 0x3F // ' do now?' 0x0D 0x0A 0x01 0x09 0x57 0x6F 0x72 0x6B // '????Work' 0x20 0x6F 0x6E 0x20 0x79 0x6F 0x75 0x72 // ' on your' 0x20 0x6F 0x77 0x6E 0x3F 0x0D 0x0A 0x01 // ' own????' 0x09 0x53 0x74 0x61 0x72 0x74 0x20 0x61 // '?Start a' 0x6E 0x6F 0x74 0x68 0x65 0x72 0x20 0x70 // 'nother p' 0x72 0x6F 0x6A 0x65 0x63 0x74 0x3F 0x0D // 'roject??' 0x0A 0x01 0x09 0x47 0x6F 0x20 0x62 0x61 // '???Go ba' 0x63 0x6B 0x20 0x74 0x6F 0x20 0x74 0x68 // 'ck to th' 0x65 0x20 0x50 0x72 0x6F 0x6A 0x65 0x63 // 'e Projec' 0x74 0x73 0x20 0x52 0x6F 0x6F 0x6D 0x3F // 'ts Room?' 0x0D 0x0A 0x01 0x09 0x51 0x75 0x69 0x74 // '????Quit' 0x20 0x33 0x44 0x20 0x4D 0x6F 0x76 0x69 // ' 3D Movi' 0x65 0x20 0x4D 0x61 0x6B 0x65 0x72 0x3F // 'e Maker?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_20= Tip___Another_movie #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_20, __HELP_NAME("Tip: Another movie")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_20, __HELP_NAME("Tip: Another movie")) __HELP_PACK2 BO OSK LONG kgobBalloonHotGadgetHelp kgobProjectHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwav3Project20 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_20, 0x0) GST(0) ITEM "kgobBalloonHotGadgetHelp" ITEM "Tip___Another_movie" ITEM "kgobProjectHot" ITEM "" ITEM "" ITEM "kwav3Project20" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_20, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_7=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1B, 0x0) AG(4) FREE ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_1B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x01 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x6B 0x00 0x00 0x01 // '????k???' 0x00 0x00 0x00 0x00 0x15 0x00 0x00 0x03 // '????????' 0x0B 0x00 0x00 0xFD 0x2E 0x00 0x00 0x03 // '???.???' 0x0A 0x00 0x00 0xFD 0x30 0x00 0x00 0x03 // '???0???' 0x0F 0x00 0x00 0xFD 0x6B 0x00 0x00 0x03 // '???k???' 0x00 0x00 0x00 0x00 0x30 0x00 0x00 0x80 // '????0??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x30 0x00 0x00 0x82 // '????0??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1B, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x41 0x6E 0x6F // '??? Ano' 0x74 0x68 0x65 0x72 0x20 0x70 0x72 0x6F // 'ther pro' 0x6A 0x65 0x63 0x74 0x3F 0x0D 0x0A 0x54 // 'ject???T' 0x6F 0x20 0x63 0x68 0x6F 0x6F 0x73 0x65 // 'o choose' 0x20 0x61 0x6E 0x6F 0x74 0x68 0x65 0x72 // ' another' 0x20 0x70 0x72 0x6F 0x6A 0x65 0x63 0x74 // ' project' 0x0D 0x0A 0x95 0x09 0x43 0x6C 0x69 0x63 // '???Clic' 0x6B 0x20 0x74 0x68 0x65 0x20 0x61 0x72 // 'k the ar' 0x72 0x6F 0x77 0x73 0x20 0x6F 0x6E 0x20 // 'rows on ' 0x74 0x68 0x65 0x20 0x72 0x69 0x67 0x68 // 'the righ' 0x74 0x20 0x73 0x69 0x64 0x65 0x20 0x6F // 't side o' 0x66 0x20 0x74 0x68 0x65 0x20 0x50 0x72 // 'f the Pr' 0x6F 0x6A 0x65 0x63 0x74 0x20 0x47 0x61 // 'oject Ga' 0x64 0x67 0x65 0x74 0x2E // 'dget.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_21= CO__To_see_the_movie_from #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_21, __HELP_NAME("CO--To see the movie from")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_21, __HELP_NAME("CO--To see the movie from")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject kidPlay kidPlayProjectSounds 0x0 0x0 0x57415645 kwav3Project21 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_14=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_21, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "CO__To_see_the_movie_from" ITEM "kgobProject" ITEM "kidPlay" ITEM "kidPlayProjectSounds" ITEM "kwav3Project21" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_14=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_21, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD9 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_14=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_14, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x41 0x00 0x00 0x01 // '????A???' 0x00 0x00 0x00 0x00 0x2F 0x00 0x00 0x03 // '????/???' 0x0B 0x00 0x00 0xFD 0x33 0x00 0x00 0x03 // '???3???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_14=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_14, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x73 0x65 0x65 // '??To see' 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F 0x76 // ' the mov' 0x69 0x65 0x20 0x66 0x72 0x6F 0x6D 0x20 // 'ie from ' 0x74 0x68 0x65 0x20 0x62 0x65 0x67 0x69 // 'the begi' 0x6E 0x6E 0x69 0x6E 0x67 0x2C 0x20 0x63 // 'nning, c' 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 // 'lick the' 0x20 0x50 0x6C 0x61 0x79 0x20 0x62 0x75 // ' Play bu' 0x74 0x74 0x6F 0x6E 0x20 0x61 0x67 0x61 // 'tton aga' 0x69 0x6E 0x2E // 'in.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_22= IDLE__Remember_to_get #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_22, __HELP_NAME("IDLE--Remember to get ")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_22, __HELP_NAME("IDLE--Remember to get ")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon5 kgobProject kidGadget kidPlayProjectSounds 0x0 0x0 0x57415645 kwav3Project22 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_22, 0x0) GST(0) ITEM "kgobCalloutBalloon5" ITEM "IDLE__Remember_to_get" ITEM "kgobProject" ITEM "kidGadget" ITEM "kidPlayProjectSounds" ITEM "kwav3Project22" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_22, 0x0) BYTE 0x01 0x00 0x03 0x03 0x7C 0x00 0x00 0x00 // '????|???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x38 0x00 0x00 0x01 // '????8???' 0x00 0x00 0x00 0x00 0x29 0x00 0x00 0x03 // '????)???' 0x0B 0x00 0x00 0xFD 0x37 0x00 0x00 0x03 // '???7???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D, 0x0) BYTE 0x03 0x03 0x52 0x65 0x6D 0x65 0x6D 0x62 // '??Rememb' 0x65 0x72 0x2C 0x20 0x74 0x6F 0x20 0x67 // 'er, to g' 0x65 0x74 0x20 0x74 0x68 0x65 0x20 0x6E // 'et the n' 0x65 0x78 0x74 0x20 0x73 0x74 0x65 0x70 // 'ext step' 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 0x74 // ' click t' 0x68 0x65 0x20 0x50 0x72 0x6F 0x6A 0x65 // 'he Proje' 0x63 0x74 0x20 0x47 0x61 0x64 0x67 0x65 // 'ct Gadge' 0x74 0x2E // 't.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_23= CO__To_play_the_new_ending #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_23, __HELP_NAME("CO--To play the new ending")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_23, __HELP_NAME("CO--To play the new ending")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject kidPlay kidPlayProjectSounds 0x0 0x0 0x57415645 kwav3Project23 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_20=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_23, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "CO__To_play_the_new_ending" ITEM "kgobProject" ITEM "kidPlay" ITEM "kidPlayProjectSounds" ITEM "kwav3Project23" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_20=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_23, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB0 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_20=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_20, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x3B 0x00 0x00 0x01 // '????;???' 0x00 0x00 0x00 0x00 0x2F 0x00 0x00 0x03 // '????/???' 0x0B 0x00 0x00 0xFD 0x33 0x00 0x00 0x03 // '???3???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_20=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_20, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x70 0x6C 0x61 // '??To pla' 0x79 0x20 0x74 0x68 0x65 0x20 0x6E 0x65 // 'y the ne' 0x77 0x20 0x65 0x6E 0x64 0x69 0x6E 0x67 // 'w ending' 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 // ' to the ' 0x6D 0x6F 0x76 0x69 0x65 0x2C 0x20 0x63 // 'movie, c' 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 // 'lick the' 0x20 0x50 0x6C 0x61 0x79 0x20 0x62 0x75 // ' Play bu' 0x74 0x74 0x6F 0x6E 0x2E // 'tton.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_24= Tip___If_you_rewind_too_far #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_24, __HELP_NAME("Tip: If you rewind too far")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_24, __HELP_NAME("Tip: If you rewind too far")) __HELP_PACK2 BO OSK LONG kgobBalloonHotGadgetHelp kgobProjectHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_25=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_24, 0x0) GST(0) ITEM "kgobBalloonHotGadgetHelp" ITEM "Tip___If_you_rewind_too_far" ITEM "kgobProjectHot" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_25=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_24, 0x0) BYTE 0x01 0x00 0x03 0x03 0x07 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_9=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_25, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpForward __HELP_SYMBOL( STN "mbmpForward" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpRewind __HELP_SYMBOL( STN "mbmpRewind" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_25=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_25, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x12 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1B 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x1D 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x68 0x00 0x00 0x01 // '????h???' 0x01 0xFC 0x00 0x00 0x8E 0x00 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0x91 0x00 0x00 0x01 // '???????' 0x01 0xFC 0x00 0x00 0xB8 0x00 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0xB9 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x1D 0x00 0x00 0x03 // '????????' 0x0B 0x00 0x00 0xFD 0x66 0x00 0x00 0x03 // '???f???' 0x0A 0x00 0x00 0xFD 0x68 0x00 0x00 0x03 // '???h???' 0x0F 0x00 0x00 0xFD 0xB9 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x68 0x00 0x00 0x80 // '????h??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x91 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0x8E 0x00 0x00 0xC0 // '??????' 0x02 0x00 0x00 0x00 0xB8 0x00 0x00 0xC0 // '??????' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_25=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_25, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x49 0x66 0x20 // '??? If ' 0x79 0x6F 0x75 0x20 0x72 0x65 0x77 0x69 // 'you rewi' 0x6E 0x64 0x20 0x74 0x6F 0x6F 0x20 0x66 // 'nd too f' 0x61 0x72 0x2E 0x2E 0x2E 0x0D 0x0A 0x55 // 'ar...??U' 0x73 0x65 0x20 0x74 0x68 0x65 0x20 0x46 // 'se the F' 0x72 0x61 0x6D 0x65 0x20 0x53 0x6C 0x69 // 'rame Sli' 0x64 0x65 0x72 0x20 0x74 0x6F 0x20 0x6D // 'der to m' 0x6F 0x76 0x65 0x20 0x66 0x6F 0x72 0x77 // 'ove forw' 0x61 0x72 0x64 0x73 0x20 0x6F 0x72 0x20 // 'ards or ' 0x62 0x61 0x63 0x6B 0x77 0x61 0x72 0x64 // 'backward' 0x73 0x20 0x69 0x6E 0x20 0x74 0x68 0x65 // 's in the' 0x20 0x63 0x75 0x72 0x72 0x65 0x6E 0x74 // ' current' 0x20 0x73 0x63 0x65 0x6E 0x65 0x2E 0x20 // ' scene. ' 0x0D 0x0A 0x95 0x09 0x54 0x6F 0x20 0x67 // '???To g' 0x6F 0x20 0x66 0x6F 0x72 0x77 0x61 0x72 // 'o forwar' 0x64 0x20 0x6F 0x6E 0x65 0x20 0x66 0x72 // 'd one fr' 0x61 0x6D 0x65 0x2C 0x20 0x63 0x6C 0x69 // 'ame, cli' 0x63 0x6B 0x20 0x4E 0x65 0x78 0x74 0x2D // 'ck Next-' 0x01 0x0D 0x0A 0x95 0x09 0x54 0x6F 0x20 // '????To ' 0x67 0x6F 0x20 0x62 0x61 0x63 0x6B 0x20 // 'go back ' 0x6F 0x6E 0x65 0x20 0x66 0x72 0x61 0x6D // 'one fram' 0x65 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B // 'e, click' 0x20 0x50 0x72 0x65 0x76 0x69 0x6F 0x75 // ' Previou' 0x73 0x2D 0x01 // 's-?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK ================================================ FILE: src/help/project4.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ #undef __HELP_NAME #undef __HELP_SYMBOL #undef __HELP_PACK #undef __HELP_PACK2 #ifdef NO_HELP_NAMES #define __HELP_NAME(name) "" #else #define __HELP_NAME(name) name #endif #ifdef NO_HELP_SYMBOLS #define __HELP_SYMBOL(stuff) #else #define __HELP_SYMBOL(stuff) stuff #endif #ifdef PACK_HELP #define __HELP_PACK PACK #else #define __HELP_PACK #endif #ifdef HELP_SINGLE_CHUNK #define __HELP_PACK2 #else #define __HELP_PACK2 __HELP_PACK #endif SET _help_48544F50_0= ktpc4Project00 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("To see this movie, click ")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("To see this movie, click ")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon1 kgobProject kidGadgetPlay kidPlayProjectSounds 0x0 0x0 0x57415645 kwav4Project00 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_13=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) GST(0) ITEM "kgobCalloutBalloon1" ITEM "ktpc4Project00" ITEM "kgobProject" ITEM "kidGadgetPlay" ITEM "kidPlayProjectSounds" ITEM "kwav4Project00" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_13=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0x78 0x00 0x00 0x00 // '????x???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_E=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_13, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpc4Project25 __HELP_SYMBOL( STN "ktpc4Project25" ) ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_13=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_13, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x09 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x58 0x00 0x00 0x01 // '????X???' 0x00 0x00 0x00 0x00 0x38 0x00 0x00 0x03 // '????8???' 0x0B 0x00 0x00 0xFD 0x3C 0x00 0x00 0x03 // '??????' 0x0F 0x00 0x00 0xFD 0x3F 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3D, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x6D 0x6F 0x76 // '??To mov' 0x65 0x20 0x47 0x61 0x62 0x72 0x69 0x65 // 'e Gabrie' 0x6C 0x20 0x64 0x6F 0x77 0x6E 0x20 0x69 // 'l down i' 0x6E 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 // 'nto the ' 0x68 0x6F 0x74 0x2D 0x61 0x69 0x72 0x20 // 'hot-air ' 0x62 0x61 0x6C 0x6C 0x6F 0x6F 0x6E 0x2C // 'balloon,' 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 0x55 // ' click U' 0x70 0x20 0x26 0x20 0x44 0x6F 0x77 0x6E // 'p & Down' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_36= ktpc4Project36 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_36, __HELP_NAME("CO--Click Reposition")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_36, __HELP_NAME("CO--Click Reposition")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobProject kidActorsCompose kidPlayProjectSounds 0x0 0x0 0x57415645 kwav4Project36 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_36, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpc4Project36" ITEM "kgobProject" ITEM "kidActorsCompose" ITEM "kidPlayProjectSounds" ITEM "kwav4Project36" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_36, 0x0) BYTE 0x01 0x00 0x03 0x03 0x5B 0x00 0x00 0x00 // '????[???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x05 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x10 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x03 // '????????' 0x0B 0x00 0x00 0xFD 0x10 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x52 0x65 0x70 0x6F 0x73 0x69 0x74 0x69 // 'Repositi' 0x6F 0x6E 0x2E // 'on.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_37= ktpc4Project37 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_37, __HELP_NAME("CO--Drag Gabriel top head")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_37, __HELP_NAME("CO--Drag Gabriel top head")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject 0x0 kidPlayProjectSounds 0x140 0x6E 0x57415645 kwav4Project37 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_37, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc4Project37" ITEM "kgobProject" ITEM "" ITEM "kidPlayProjectSounds" ITEM "kwav4Project37" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_37, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD5 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_5=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3F, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpc4Project3A __HELP_SYMBOL( STN "ktpc4Project3A" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_3F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xB7 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0xAB 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0xAF 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x04 0x00 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x40 // '???????@' 0x02 0x00 0x00 0x00 0x04 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x75 0x00 0x00 0x82 // '????u??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3F, 0x0) BYTE 0x03 0x03 0x44 0x72 0x61 0x67 0x20 0x47 // '??Drag G' 0x61 0x62 0x72 0x69 0x65 0x6C 0x20 0x69 // 'abriel i' 0x6E 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 // 'nto the ' 0x62 0x61 0x6C 0x6C 0x6F 0x6F 0x6E 0x27 // 'balloon'' 0x73 0x20 0x62 0x61 0x73 0x6B 0x65 0x74 // 's basket' 0x2E 0x20 0x20 0x49 0x66 0x20 0x74 0x68 // '. If th' 0x65 0x20 0x62 0x61 0x6C 0x6C 0x6F 0x6F // 'e balloo' 0x6E 0x20 0x63 0x6F 0x76 0x65 0x72 0x73 // 'n covers' 0x20 0x47 0x61 0x62 0x72 0x69 0x65 0x6C // ' Gabriel' 0x2C 0x20 0x70 0x72 0x65 0x73 0x73 0x20 // ', press ' 0x74 0x68 0x65 0x20 0x55 0x70 0x20 0x6F // 'the Up o' 0x72 0x20 0x44 0x6F 0x77 0x6E 0x20 0x41 // 'r Down A' 0x72 0x72 0x6F 0x77 0x20 0x6B 0x65 0x79 // 'rrow key' 0x20 0x61 0x73 0x20 0x79 0x6F 0x75 0x20 // ' as you ' 0x64 0x72 0x61 0x67 0x2E 0x0D 0x0A 0x57 // 'drag.??W' 0x68 0x65 0x6E 0x20 0x79 0x6F 0x75 0x92 // 'hen you' 0x72 0x65 0x20 0x72 0x65 0x61 0x64 0x79 // 're ready' 0x20 0x74 0x6F 0x20 0x70 0x6C 0x61 0x79 // ' to play' 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F 0x76 // ' the mov' 0x69 0x65 0x20 0x73 0x6F 0x20 0x66 0x61 // 'ie so fa' 0x72 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B // 'r, click' 0x20 0x74 0x68 0x65 0x20 0x50 0x6C 0x61 // ' the Pla' 0x79 0x20 0x62 0x75 0x74 0x74 0x6F 0x6E // 'y button' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_38= ktpc4Project38 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_38, __HELP_NAME("CO--To play so far")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_38, __HELP_NAME("CO--To play so far")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject kidPlay kidPlayProjectSounds 0x0 0x0 0x57415645 kwav4Project38 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_35=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_38, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc4Project38" ITEM "kgobProject" ITEM "kidPlay" ITEM "kidPlayProjectSounds" ITEM "kwav4Project38" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_35=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_38, 0x0) BYTE 0x01 0x00 0x03 0x03 0x96 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_35=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_35, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x30 0x00 0x00 0x01 // '????0???' 0x00 0x00 0x00 0x00 0x24 0x00 0x00 0x03 // '????$???' 0x0B 0x00 0x00 0xFD 0x28 0x00 0x00 0x03 // '???(???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_35=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_35, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x70 0x6C 0x61 // '??To pla' 0x79 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F // 'y the mo' 0x76 0x69 0x65 0x20 0x73 0x6F 0x20 0x66 // 'vie so f' 0x61 0x72 0x2C 0x20 0x63 0x6C 0x69 0x63 // 'ar, clic' 0x6B 0x20 0x74 0x68 0x65 0x20 0x50 0x6C // 'k the Pl' 0x61 0x79 0x20 0x62 0x75 0x74 0x74 0x6F // 'ay butto' 0x6E 0x2E // 'n.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_39= ktpc4Project39 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_39, __HELP_NAME("CO--To play entire ")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_39, __HELP_NAME("CO--To play entire ")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject kidPlay kidPlayProjectSounds 0x0 0x0 0x57415645 kwav4Project39 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_26=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_39, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc4Project39" ITEM "kgobProject" ITEM "kidPlay" ITEM "kidPlayProjectSounds" ITEM "kwav4Project39" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_26=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_39, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC2 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_26=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_26, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x70 0x00 0x00 0x01 // '????p???' 0x00 0x00 0x00 0x00 0x24 0x00 0x00 0x03 // '????$???' 0x0B 0x00 0x00 0xFD 0x28 0x00 0x00 0x03 // '???(???' 0x00 0x00 0x00 0x00 0x61 0x00 0x00 0x03 // '????a???' 0x0B 0x00 0x00 0xFD 0x6F 0x00 0x00 0x03 // '???o???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x32 0x00 0x00 0x82 // '????2??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_26=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_26, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x70 0x6C 0x61 // '??To pla' 0x79 0x20 0x74 0x68 0x65 0x20 0x65 0x6E // 'y the en' 0x74 0x69 0x72 0x65 0x20 0x6D 0x6F 0x76 // 'tire mov' 0x69 0x65 0x2C 0x20 0x63 0x6C 0x69 0x63 // 'ie, clic' 0x6B 0x20 0x74 0x68 0x65 0x20 0x50 0x6C // 'k the Pl' 0x61 0x79 0x20 0x62 0x75 0x74 0x74 0x6F // 'ay butto' 0x6E 0x2E 0x0D 0x0A 0x57 0x68 0x65 0x6E // 'n.??When' 0x20 0x79 0x6F 0x75 0x27 0x72 0x65 0x20 // ' you're ' 0x72 0x65 0x61 0x64 0x79 0x20 0x66 0x6F // 'ready fo' 0x72 0x20 0x74 0x68 0x65 0x20 0x6E 0x65 // 'r the ne' 0x78 0x74 0x20 0x73 0x74 0x65 0x70 0x2C // 'xt step,' 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 0x74 // ' click t' 0x68 0x65 0x20 0x50 0x72 0x6F 0x6A 0x65 // 'he Proje' 0x63 0x74 0x20 0x47 0x61 0x64 0x67 0x65 // 'ct Gadge' 0x74 0x2E // 't.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3A= ktpc4Project3A #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3A, __HELP_NAME("Def: Drag")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3A, __HELP_NAME("Def: Drag")) __HELP_PACK2 BO OSK LONG kgobBalloonHotGadgetHelp kgobProjectHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwav4Project3A ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_37=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3A, 0x0) GST(0) ITEM "kgobBalloonHotGadgetHelp" ITEM "ktpc4Project3A" ITEM "kgobProjectHot" ITEM "" ITEM "" ITEM "kwav4Project3A" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_37=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3A, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_37=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_37, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x04 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xD0 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x79 0x00 0x00 0x03 // '????y???' 0x0A 0x00 0x00 0xFD 0x88 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x79 0x00 0x00 0x80 // '????y??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x79 0x00 0x00 0x82 // '????y??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_37=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_37, 0x0) BYTE 0x03 0x03 0x44 0x72 0x61 0x67 0x0D 0x0A // '??Drag??' 0x31 0x09 0x48 0x6F 0x6C 0x64 0x20 0x64 // '1?Hold d' 0x6F 0x77 0x6E 0x20 0x74 0x68 0x65 0x20 // 'own the ' 0x6D 0x6F 0x75 0x73 0x65 0x20 0x62 0x75 // 'mouse bu' 0x74 0x74 0x6F 0x6E 0x20 0x61 0x73 0x20 // 'tton as ' 0x79 0x6F 0x75 0x20 0x6D 0x6F 0x76 0x65 // 'you move' 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 // ' the mou' 0x73 0x65 0x2E 0x0D 0x0A 0x32 0x09 0x57 // 'se.??2?W' 0x68 0x65 0x6E 0x20 0x79 0x6F 0x75 0x27 // 'hen you'' 0x76 0x65 0x20 0x66 0x69 0x6E 0x69 0x73 // 've finis' 0x68 0x65 0x64 0x20 0x64 0x72 0x61 0x67 // 'hed drag' 0x67 0x69 0x6E 0x67 0x2C 0x20 0x6C 0x65 // 'ging, le' 0x74 0x20 0x67 0x6F 0x20 0x6F 0x66 0x20 // 't go of ' 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 0x73 // 'the mous' 0x65 0x20 0x62 0x75 0x74 0x74 0x6F 0x6E // 'e button' 0x2E 0x0D 0x0A 0x54 0x69 0x70 0x20 0x66 // '.??Tip f' 0x72 0x6F 0x6D 0x20 0x4D 0x63 0x5A 0x65 // 'rom McZe' 0x65 0x3A 0x20 0x20 0x59 0x6F 0x75 0x27 // 'e: You'' 0x6C 0x6C 0x20 0x67 0x65 0x74 0x20 0x74 // 'll get t' 0x68 0x65 0x20 0x62 0x65 0x73 0x74 0x20 // 'he best ' 0x72 0x65 0x73 0x75 0x6C 0x74 0x73 0x20 // 'results ' 0x69 0x66 0x20 0x79 0x6F 0x75 0x20 0x6D // 'if you m' 0x6F 0x76 0x65 0x20 0x74 0x68 0x65 0x20 // 'ove the ' 0x6D 0x6F 0x75 0x73 0x65 0x20 0x73 0x6C // 'mouse sl' 0x6F 0x77 0x6C 0x79 0x20 0x61 0x73 0x20 // 'owly as ' 0x79 0x6F 0x75 0x20 0x64 0x72 0x61 0x67 // 'you drag' 0x2E 0x20 // '. ' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3B= ktpc4Project3B #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3B, __HELP_NAME("Def: drag")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3B, __HELP_NAME("Def: drag")) __HELP_PACK2 BO OSK LONG kgobBalloonHotGadgetHelp kgobProjectHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwav4Project3B ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_9=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3B, 0x0) GST(0) ITEM "kgobBalloonHotGadgetHelp" ITEM "ktpc4Project3B" ITEM "kgobProjectHot" ITEM "" ITEM "" ITEM "kwav4Project3B" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_9=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3B, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_9=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_9, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x04 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xD0 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x79 0x00 0x00 0x03 // '????y???' 0x0A 0x00 0x00 0xFD 0x88 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x79 0x00 0x00 0x80 // '????y??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x79 0x00 0x00 0x82 // '????y??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_9=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_9, 0x0) BYTE 0x03 0x03 0x64 0x72 0x61 0x67 0x0D 0x0A // '??drag??' 0x31 0x09 0x48 0x6F 0x6C 0x64 0x20 0x64 // '1?Hold d' 0x6F 0x77 0x6E 0x20 0x74 0x68 0x65 0x20 // 'own the ' 0x6D 0x6F 0x75 0x73 0x65 0x20 0x62 0x75 // 'mouse bu' 0x74 0x74 0x6F 0x6E 0x20 0x61 0x73 0x20 // 'tton as ' 0x79 0x6F 0x75 0x20 0x6D 0x6F 0x76 0x65 // 'you move' 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 // ' the mou' 0x73 0x65 0x2E 0x0D 0x0A 0x32 0x09 0x57 // 'se.??2?W' 0x68 0x65 0x6E 0x20 0x79 0x6F 0x75 0x27 // 'hen you'' 0x76 0x65 0x20 0x66 0x69 0x6E 0x69 0x73 // 've finis' 0x68 0x65 0x64 0x20 0x64 0x72 0x61 0x67 // 'hed drag' 0x67 0x69 0x6E 0x67 0x2C 0x20 0x6C 0x65 // 'ging, le' 0x74 0x20 0x67 0x6F 0x20 0x6F 0x66 0x20 // 't go of ' 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 0x73 // 'the mous' 0x65 0x20 0x62 0x75 0x74 0x74 0x6F 0x6E // 'e button' 0x2E 0x0D 0x0A 0x54 0x69 0x70 0x20 0x66 // '.??Tip f' 0x72 0x6F 0x6D 0x20 0x4D 0x63 0x5A 0x65 // 'rom McZe' 0x65 0x3A 0x20 0x20 0x59 0x6F 0x75 0x27 // 'e: You'' 0x6C 0x6C 0x20 0x67 0x65 0x74 0x20 0x74 // 'll get t' 0x68 0x65 0x20 0x62 0x65 0x73 0x74 0x20 // 'he best ' 0x72 0x65 0x73 0x75 0x6C 0x74 0x73 0x20 // 'results ' 0x69 0x66 0x20 0x79 0x6F 0x75 0x20 0x6D // 'if you m' 0x6F 0x76 0x65 0x20 0x74 0x68 0x65 0x20 // 'ove the ' 0x6D 0x6F 0x75 0x73 0x65 0x20 0x73 0x6C // 'mouse sl' 0x6F 0x77 0x6C 0x79 0x20 0x61 0x73 0x20 // 'owly as ' 0x79 0x6F 0x75 0x20 0x64 0x72 0x61 0x67 // 'you drag' 0x2E 0x20 // '. ' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3C= ktpc4Project3C #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3C, __HELP_NAME("Congratulations")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3C, __HELP_NAME("Congratulations")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobProject 0x0 kidPlayProjectSounds 0x258 0x1C2 0x57415645 kwav4Project3C ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_5=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3C, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpc4Project3C" ITEM "kgobProject" ITEM "" ITEM "kidPlayProjectSounds" ITEM "kwav4Project3C" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_5=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x9D 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_C=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 0x01 0xFF 0xFF 0xFF 0xFF // '?' ITEM LONG 0x40000001 VAR BYTE 0x02 0xFF 0xFF 0xFF 0xFF // '?' ITEM LONG 0x40000001 VAR BYTE 0x03 0xFF 0xFF 0xFF 0xFF // '?' ITEM LONG 0x40000001 VAR BYTE 0x04 0xFF 0xFF 0xFF 0xFF // '?' ITEM LONG 0xC0000004 VAR LONG 'GOKD' _gobHelpSquishy 0xFFFFFFFF __HELP_SYMBOL( STN "_gobHelpSquishy" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_5=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x13 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xA6 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0B 0x00 0x00 0xFD 0x3E 0x00 0x00 0x03 // '???>???' 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0x40 // '????@??@' 0x01 0x00 0x00 0x00 0x53 0x00 0x00 0x40 // '????S??@' 0x00 0x00 0x00 0x00 0x55 0x00 0x00 0x40 // '????U??@' 0x02 0x00 0x00 0x00 0x6D 0x00 0x00 0x40 // '????m??@' 0x00 0x00 0x00 0x00 0x6F 0x00 0x00 0x40 // '????o??@' 0x03 0x00 0x00 0x00 0x8E 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x90 0x00 0x00 0x40 // '??????@' 0x04 0x00 0x00 0x00 0xA6 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0x80 // '????@??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x90 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0xC0 // '????@??' 0x05 0x00 0x00 0x00 0x55 0x00 0x00 0xC0 // '????U??' 0x05 0x00 0x00 0x00 0x6F 0x00 0x00 0xC0 // '????o??' 0x05 0x00 0x00 0x00 0x90 0x00 0x00 0xC0 // '??????' 0x05 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_5=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x03 0x03 0x43 0x6F 0x6E 0x67 0x72 0x61 // '??Congra' 0x74 0x75 0x6C 0x61 0x74 0x69 0x6F 0x6E // 'tulation' 0x73 0x21 0x20 0x20 0x59 0x6F 0x75 0x27 // 's! You'' 0x72 0x65 0x20 0x64 0x6F 0x6E 0x65 0x21 // 're done!' 0x20 0x20 0x57 0x68 0x61 0x74 0x20 0x77 // ' What w' 0x6F 0x75 0x6C 0x64 0x20 0x79 0x6F 0x75 // 'ould you' 0x20 0x6C 0x69 0x6B 0x65 0x20 0x74 0x6F // ' like to' 0x20 0x64 0x6F 0x20 0x6E 0x6F 0x77 0x3F // ' do now?' 0x0D 0x0A 0x01 0x09 0x57 0x6F 0x72 0x6B // '????Work' 0x20 0x6F 0x6E 0x20 0x79 0x6F 0x75 0x72 // ' on your' 0x20 0x6F 0x77 0x6E 0x3F 0x0D 0x0A 0x01 // ' own????' 0x09 0x53 0x74 0x61 0x72 0x74 0x20 0x61 // '?Start a' 0x6E 0x6F 0x74 0x68 0x65 0x72 0x20 0x70 // 'nother p' 0x72 0x6F 0x6A 0x65 0x63 0x74 0x3F 0x0D // 'roject??' 0x0A 0x01 0x09 0x47 0x6F 0x20 0x62 0x61 // '???Go ba' 0x63 0x6B 0x20 0x74 0x6F 0x20 0x74 0x68 // 'ck to th' 0x65 0x20 0x50 0x72 0x6F 0x6A 0x65 0x63 // 'e Projec' 0x74 0x73 0x20 0x52 0x6F 0x6F 0x6D 0x3F // 'ts Room?' 0x0D 0x0A 0x01 0x09 0x51 0x75 0x69 0x74 // '????Quit' 0x20 0x33 0x44 0x20 0x4D 0x6F 0x76 0x69 // ' 3D Movi' 0x65 0x20 0x4D 0x61 0x6B 0x65 0x72 0x3F // 'e Maker?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3D= ktpc4Project3D #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3D, __HELP_NAME("CO--Click Reposition")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3D, __HELP_NAME("CO--Click Reposition")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobProject kidActorsCompose kidPlayProjectSounds 0x0 0x0 0x57415645 kwav4Project3D ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3D, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpc4Project3D" ITEM "kgobProject" ITEM "kidActorsCompose" ITEM "kidPlayProjectSounds" ITEM "kwav4Project3D" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x5C 0x00 0x00 0x00 // '????\???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_3E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x11 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x05 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x03 // '????????' 0x0B 0x00 0x00 0xFD 0x11 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3E, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x52 0x65 0x70 0x6F 0x73 0x69 0x74 0x69 // 'Repositi' 0x6F 0x6E 0x2E // 'on.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3E= ktpc4Project3E #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3E, __HELP_NAME("CO--To select Gabriel")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3E, __HELP_NAME("CO--To select Gabriel")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon7 kgobProject kidRollCallActor kidPlayProjectSounds 0x2E 0x8B 0x57415645 kwav4Project3E ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_38=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3E, 0x0) GST(0) ITEM "kgobCalloutBalloon7" ITEM "ktpc4Project3E" ITEM "kgobProject" ITEM "kidRollCallActor" ITEM "kidPlayProjectSounds" ITEM "kwav4Project3E" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_38=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x9E 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_38=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_38, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x37 0x00 0x00 0x01 // '????7???' 0x00 0x00 0x00 0x00 0x2C 0x00 0x00 0x03 // '????,???' 0x0B 0x00 0x00 0xFD 0x36 0x00 0x00 0x03 // '???6???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_38=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_38, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x73 0x65 0x6C // '??To sel' 0x65 0x63 0x74 0x20 0x47 0x61 0x62 0x72 // 'ect Gabr' 0x69 0x65 0x6C 0x2C 0x20 0x63 0x6C 0x69 // 'iel, cli' 0x63 0x6B 0x20 0x68 0x69 0x73 0x20 0x70 // 'ck his p' 0x69 0x63 0x74 0x75 0x72 0x65 0x20 0x69 // 'icture i' 0x6E 0x20 0x74 0x68 0x65 0x20 0x41 0x63 // 'n the Ac' 0x74 0x6F 0x72 0x20 0x4C 0x69 0x73 0x74 // 'tor List' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3F= ktpc4Project3F #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3F, __HELP_NAME("CO--Now click Gabriel.")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3F, __HELP_NAME("CO--Now click Gabriel.")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject 0x0 kidPlayProjectSounds 0x140 0x6E 0x57415645 kwav4Project3F ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_14=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3F, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc4Project3F" ITEM "kgobProject" ITEM "" ITEM "kidPlayProjectSounds" ITEM "kwav4Project3F" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_14=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x70 0x00 0x00 0x00 // '????p???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_14=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_14, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x12 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_14=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_14, 0x0) BYTE 0x03 0x03 0x4E 0x6F 0x77 0x20 0x63 0x6C // '??Now cl' 0x69 0x63 0x6B 0x20 0x47 0x61 0x62 0x72 // 'ick Gabr' 0x69 0x65 0x6C 0x2E // 'iel.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK ================================================ FILE: src/help/project5.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ #undef __HELP_NAME #undef __HELP_SYMBOL #undef __HELP_PACK #undef __HELP_PACK2 #ifdef NO_HELP_NAMES #define __HELP_NAME(name) "" #else #define __HELP_NAME(name) name #endif #ifdef NO_HELP_SYMBOLS #define __HELP_SYMBOL(stuff) #else #define __HELP_SYMBOL(stuff) stuff #endif #ifdef PACK_HELP #define __HELP_PACK PACK #else #define __HELP_PACK #endif #ifdef HELP_SINGLE_CHUNK #define __HELP_PACK2 #else #define __HELP_PACK2 __HELP_PACK #endif SET _help_48544F50_0= ktpc5Project00 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("To see this movie, click --Cut")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("To see this movie, click --Cut")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobProject kidActorsBrowser kidPlayProjectSounds 0x0 0x0 0x57415645 kwav5Project00 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_31=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpc5Project00" ITEM "kgobProject" ITEM "kidActorsBrowser" ITEM "kidPlayProjectSounds" ITEM "kwav5Project00" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_31=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0x4B 0x00 0x00 0x00 // '????K???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_31=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_31, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x05 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x07 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0E 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x07 0x00 0x00 0x03 // '????????' 0x0B 0x00 0x00 0xFD 0x0D 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_31=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_31, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x20 0x41 0x63 0x74 0x6F 0x72 0x73 0x2E // ' Actors.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1= ktpc5Project01 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("To see this movie 2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("To see this movie 2")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon1 kgobProject kidGadgetPlay kidPlayProjectSounds 0x0 0x0 0x57415645 kwav5Project01 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_40=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) GST(0) ITEM "kgobCalloutBalloon1" ITEM "ktpc5Project01" ITEM "kgobProject" ITEM "kidGadgetPlay" ITEM "kidPlayProjectSounds" ITEM "kwav5Project01" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_40=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0x78 0x00 0x00 0x00 // '????x???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_40, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpc5Project03 __HELP_SYMBOL( STN "ktpc5Project03" ) ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_40=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_40, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x09 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x58 0x00 0x00 0x01 // '????X???' 0x00 0x00 0x00 0x00 0x38 0x00 0x00 0x03 // '????8???' 0x0B 0x00 0x00 0xFD 0x3C 0x00 0x00 0x03 // '??????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_8=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x09 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_8=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x4F 0x4B 0x2E // 'OK.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_B= ktpc5Project0B #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_B, __HELP_NAME("CO--Click Bongo until squashed")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_B, __HELP_NAME("CO--Click Bongo until squashed")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject 0x0 kidPlayProjectSounds 0x140 0x6E 0x57415645 kwav5Project0B ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_B, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc5Project0B" ITEM "kgobProject" ITEM "" ITEM "kidPlayProjectSounds" ITEM "kwav5Project0B" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_B, 0x0) BYTE 0x01 0x00 0x03 0x03 0xCF 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xA3 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x97 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0x9B 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x68 0x00 0x00 0x82 // '????h??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x42 0x6F 0x6E 0x67 0x6F 0x2E 0x20 0x20 // 'Bongo. ' 0x54 0x68 0x65 0x6E 0x20 0x68 0x6F 0x6C // 'Then hol' 0x64 0x20 0x64 0x6F 0x77 0x6E 0x20 0x74 // 'd down t' 0x68 0x65 0x20 0x6D 0x6F 0x75 0x73 0x65 // 'he mouse' 0x20 0x62 0x75 0x74 0x74 0x6F 0x6E 0x20 // ' button ' 0x61 0x6E 0x64 0x20 0x77 0x61 0x69 0x74 // 'and wait' 0x20 0x75 0x6E 0x74 0x69 0x6C 0x20 0x42 // ' until B' 0x6F 0x6E 0x67 0x6F 0x92 0x73 0x20 0x68 // 'ongos h' 0x65 0x61 0x64 0x20 0x69 0x73 0x20 0x73 // 'ead is s' 0x71 0x75 0x61 0x73 0x68 0x65 0x64 0x20 // 'quashed ' 0x62 0x65 0x6C 0x6F 0x77 0x20 0x74 0x68 // 'below th' 0x65 0x20 0x74 0x61 0x62 0x6C 0x65 0x2E // 'e table.' 0x0D 0x0A 0x57 0x68 0x65 0x6E 0x20 0x79 // '??When y' 0x6F 0x75 0x92 0x72 0x65 0x20 0x72 0x65 // 'oure re' 0x61 0x64 0x79 0x20 0x74 0x6F 0x20 0x70 // 'ady to p' 0x6C 0x61 0x79 0x20 0x74 0x68 0x65 0x20 // 'lay the ' 0x6D 0x6F 0x76 0x69 0x65 0x2C 0x20 0x63 // 'movie, c' 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 // 'lick the' 0x20 0x50 0x6C 0x61 0x79 0x20 0x62 0x75 // ' Play bu' 0x74 0x74 0x6F 0x6E 0x2E // 'tton.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_C= ktpc5Project0C #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_C, __HELP_NAME("CO--To add Bongo's stretch")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_C, __HELP_NAME("CO--To add Bongo's stretch")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobProject kidActorsActionBrowser kidPlayProjectSounds 0x0 0x0 0x57415645 kwav5Project0C ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_C, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpc5Project0C" ITEM "kgobProject" ITEM "kidActorsActionBrowser" ITEM "kidPlayProjectSounds" ITEM "kwav5Project0C" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_C, 0x0) BYTE 0x01 0x00 0x03 0x03 0xBA 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_3=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2D 0x00 0x00 0x01 // '????-???' 0x00 0x00 0x00 0x00 0x25 0x00 0x00 0x03 // '????%???' 0x0B 0x00 0x00 0xFD 0x2C 0x00 0x00 0x03 // '???,???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x61 0x64 0x64 // '??To add' 0x20 0x42 0x6F 0x6E 0x67 0x6F 0x92 0x73 // ' Bongos' 0x20 0x53 0x74 0x72 0x65 0x74 0x63 0x68 // ' Stretch' 0x20 0x61 0x63 0x74 0x69 0x6F 0x6E 0x2C // ' action,' 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 0x41 // ' click A' 0x63 0x74 0x69 0x6F 0x6E 0x73 0x2E // 'ctions.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_D= ktpc5Project0D #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_D, __HELP_NAME("CO--Click stretch")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_D, __HELP_NAME("CO--Click stretch")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject kidReserveProjects kidPlayProjectSounds 0x0 0xFFFFFFF7 0x57415645 kwav5Project0D ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_17=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_D, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc5Project0D" ITEM "kgobProject" ITEM "kidReserveProjects" ITEM "kidPlayProjectSounds" ITEM "kwav5Project0D" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_17=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x62 0x00 0x00 0x00 // '????b???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_17=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_17, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x10 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_17=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_17, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x93 0x53 0x74 0x72 0x65 0x74 0x63 0x68 // 'Stretch' 0x2E 0x94 // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_E= ktpc5Project0E #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_E, __HELP_NAME("CO--Click until Bongo's head")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_E, __HELP_NAME("CO--Click until Bongo's head")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject 0x0 kidPlayProjectSounds 0x140 0x6E 0x57415645 kwav5Project0E ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_E, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc5Project0E" ITEM "kgobProject" ITEM "" ITEM "kidPlayProjectSounds" ITEM "kwav5Project0E" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_E, 0x0) BYTE 0x01 0x00 0x03 0x03 0xCF 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x91 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x85 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0x89 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x5B 0x00 0x00 0x82 // '????[??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1F, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x42 0x6F 0x6E 0x67 0x6F 0x2E 0x20 0x20 // 'Bongo. ' 0x54 0x68 0x65 0x6E 0x20 0x68 0x6F 0x6C // 'Then hol' 0x64 0x20 0x64 0x6F 0x77 0x6E 0x20 0x74 // 'd down t' 0x68 0x65 0x20 0x6D 0x6F 0x75 0x73 0x65 // 'he mouse' 0x20 0x62 0x75 0x74 0x74 0x6F 0x6E 0x20 // ' button ' 0x61 0x6E 0x64 0x20 0x77 0x61 0x69 0x74 // 'and wait' 0x20 0x75 0x6E 0x74 0x69 0x6C 0x20 0x42 // ' until B' 0x6F 0x6E 0x67 0x6F 0x92 0x73 0x20 0x68 // 'ongos h' 0x65 0x61 0x64 0x20 0x69 0x73 0x20 0x6F // 'ead is o' 0x75 0x74 0x2D 0x6F 0x66 0x2D 0x76 0x69 // 'ut-of-vi' 0x65 0x77 0x2E 0x0D 0x0A 0x54 0x6F 0x20 // 'ew.??To ' 0x73 0x65 0x65 0x20 0x77 0x68 0x61 0x74 // 'see what' 0x20 0x79 0x6F 0x75 0x92 0x76 0x65 0x20 // ' youve ' 0x64 0x6F 0x6E 0x65 0x20 0x73 0x6F 0x20 // 'done so ' 0x66 0x61 0x72 0x2C 0x20 0x63 0x6C 0x69 // 'far, cli' 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 0x50 // 'ck the P' 0x6C 0x61 0x79 0x20 0x62 0x75 0x74 0x74 // 'lay butt' 0x6F 0x6E 0x2E // 'on.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_F= ktpc5Project0F #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_F, __HELP_NAME("CO--To shrink Bongo")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_F, __HELP_NAME("CO--To shrink Bongo")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobProject kidActorsActionBrowser kidPlayProjectSounds 0x0 0x0 0x57415645 kwav5Project0F ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_F, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpc5Project0F" ITEM "kgobProject" ITEM "kidActorsActionBrowser" ITEM "kidPlayProjectSounds" ITEM "kwav5Project0F" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_F, 0x0) BYTE 0x01 0x00 0x03 0x03 0xAC 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x39 0x00 0x00 0x01 // '????9???' 0x00 0x00 0x00 0x00 0x31 0x00 0x00 0x03 // '????1???' 0x0B 0x00 0x00 0xFD 0x38 0x00 0x00 0x03 // '???8???' 0x00 0x00 0x00 0x00 0x39 0x00 0x00 0x04 // '????9???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x73 0x68 0x72 // '??To shr' 0x69 0x6E 0x6B 0x20 0x42 0x6F 0x6E 0x67 // 'ink Bong' 0x6F 0x20 0x73 0x6F 0x20 0x79 0x6F 0x75 // 'o so you' 0x20 0x63 0x61 0x6E 0x20 0x68 0x61 0x72 // ' can har' 0x64 0x6C 0x79 0x20 0x73 0x65 0x65 0x20 // 'dly see ' 0x68 0x69 0x6D 0x2C 0x20 0x63 0x6C 0x69 // 'him, cli' 0x63 0x6B 0x20 0x41 0x63 0x74 0x69 0x6F // 'ck Actio' 0x6E 0x73 0x2E // 'ns.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_10= ktpc5Project10 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_10, __HELP_NAME("CO--Click shrink fast")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_10, __HELP_NAME("CO--Click shrink fast")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject kidReserveProjects kidPlayProjectSounds 0x0 0xFFFFFFF7 0x57415645 kwav5Project10 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_45=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_10, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc5Project10" ITEM "kgobProject" ITEM "kidReserveProjects" ITEM "kidPlayProjectSounds" ITEM "kwav5Project10" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_45=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_10, 0x0) BYTE 0x01 0x00 0x03 0x03 0x73 0x00 0x00 0x00 // '????s???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_45=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_45, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x14 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_45=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_45, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x93 0x53 0x68 0x72 0x69 0x6E 0x6B 0x20 // 'Shrink ' 0x46 0x61 0x73 0x74 0x2E 0x94 // 'Fast.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_11= ktpc5Project11 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_11, __HELP_NAME("CO--Click Bongo small box")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_11, __HELP_NAME("CO--Click Bongo small box")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject 0x0 kidPlayProjectSounds 0x140 0x6E 0x57415645 kwav5Project11 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_51=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_11, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc5Project11" ITEM "kgobProject" ITEM "" ITEM "kidPlayProjectSounds" ITEM "kwav5Project11" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_51=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_11, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD0 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_51=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_51, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x95 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x89 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0x8D 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x95 0x00 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x53 0x00 0x00 0x82 // '????S??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_51=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_51, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x42 0x6F 0x6E 0x67 0x6F 0x2E 0x20 0x20 // 'Bongo. ' 0x54 0x68 0x65 0x6E 0x20 0x68 0x6F 0x6C // 'Then hol' 0x64 0x20 0x64 0x6F 0x77 0x6E 0x20 0x74 // 'd down t' 0x68 0x65 0x20 0x6D 0x6F 0x75 0x73 0x65 // 'he mouse' 0x20 0x62 0x75 0x74 0x74 0x6F 0x6E 0x20 // ' button ' 0x61 0x6E 0x64 0x20 0x77 0x61 0x69 0x74 // 'and wait' 0x20 0x75 0x6E 0x74 0x69 0x6C 0x20 0x42 // ' until B' 0x6F 0x6E 0x67 0x6F 0x20 0x69 0x73 0x20 // 'ongo is ' 0x76 0x65 0x72 0x79 0x20 0x73 0x6D 0x61 // 'very sma' 0x6C 0x6C 0x2E 0x0D 0x0A 0x57 0x68 0x65 // 'll.??Whe' 0x6E 0x20 0x79 0x6F 0x75 0x92 0x72 0x65 // 'n youre' 0x20 0x72 0x65 0x61 0x64 0x79 0x20 0x74 // ' ready t' 0x6F 0x20 0x70 0x6C 0x61 0x79 0x20 0x74 // 'o play t' 0x68 0x65 0x20 0x6D 0x6F 0x76 0x69 0x65 // 'he movie' 0x20 0x73 0x6F 0x20 0x66 0x61 0x72 0x2C // ' so far,' 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 0x74 // ' click t' 0x68 0x65 0x20 0x50 0x6C 0x61 0x79 0x20 // 'he Play ' 0x62 0x75 0x74 0x74 0x6F 0x6E 0x2E // 'button.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_12= ktpc5Project12 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_12, __HELP_NAME("CO--Click until shrink")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_12, __HELP_NAME("CO--Click until shrink")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject kidFrameRW kidPlayProjectSounds 0x0 0x0 0x57415645 kwav5Project12 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_12, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc5Project12" ITEM "kgobProject" ITEM "kidFrameRW" ITEM "kidPlayProjectSounds" ITEM "kwav5Project12" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_12, 0x0) BYTE 0x01 0x00 0x03 0x03 0xBE 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_3=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4C, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpRewind __HELP_SYMBOL( STN "mbmpRewind" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_4C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0xFC 0x00 0x00 0x1A 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xAC 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x9D 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0xAB 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x6E 0x00 0x00 0x82 // '????n??' 0x00 0x00 0x00 0x00 0x1A 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4C, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x50 0x72 0x65 0x76 // 'the Prev' 0x69 0x6F 0x75 0x73 0x20 0x62 0x75 0x74 // 'ious but' 0x74 0x6F 0x6E 0x2D 0x01 0x20 0x75 0x6E // 'ton-? un' 0x74 0x69 0x6C 0x20 0x79 0x6F 0x75 0x20 // 'til you ' 0x72 0x65 0x77 0x69 0x6E 0x64 0x20 0x79 // 'rewind y' 0x6F 0x75 0x72 0x20 0x6D 0x6F 0x76 0x69 // 'our movi' 0x65 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 // 'e to the' 0x20 0x66 0x72 0x61 0x6D 0x65 0x20 0x77 // ' frame w' 0x68 0x65 0x72 0x65 0x20 0x42 0x6F 0x6E // 'here Bon' 0x67 0x6F 0x20 0x69 0x73 0x20 0x6A 0x75 // 'go is ju' 0x73 0x74 0x20 0x73 0x74 0x61 0x72 0x74 // 'st start' 0x69 0x6E 0x67 0x20 0x74 0x6F 0x20 0x73 // 'ing to s' 0x68 0x72 0x69 0x6E 0x6B 0x2E 0x0D 0x0A // 'hrink.??' 0x57 0x68 0x65 0x6E 0x20 0x79 0x6F 0x75 // 'When you' 0x92 0x72 0x65 0x20 0x72 0x65 0x61 0x64 // 're read' 0x79 0x20 0x66 0x6F 0x72 0x20 0x74 0x68 // 'y for th' 0x65 0x20 0x6E 0x65 0x78 0x74 0x20 0x73 // 'e next s' 0x74 0x65 0x70 0x2C 0x20 0x63 0x6C 0x69 // 'tep, cli' 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 0x50 // 'ck the P' 0x72 0x6F 0x6A 0x65 0x63 0x74 0x20 0x47 // 'roject G' 0x61 0x64 0x67 0x65 0x74 0x2E // 'adget.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_13= ktpc5Project13 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_13, __HELP_NAME("CO--Remember, when ")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_13, __HELP_NAME("CO--Remember, when ")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon5 kgobProject kidGadget kidPlayProjectSounds 0x0 0x0 0x57415645 kwav5Project13 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_13, 0x0) GST(0) ITEM "kgobCalloutBalloon5" ITEM "ktpc5Project13" ITEM "kgobProject" ITEM "kidGadget" ITEM "kidPlayProjectSounds" ITEM "kwav5Project13" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_13, 0x0) BYTE 0x01 0x00 0x03 0x03 0x96 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_3D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x48 0x00 0x00 0x01 // '????H???' 0x00 0x00 0x00 0x00 0x39 0x00 0x00 0x03 // '????9???' 0x0B 0x00 0x00 0xFD 0x47 0x00 0x00 0x03 // '???G???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3D, 0x0) BYTE 0x03 0x03 0x52 0x65 0x6D 0x65 0x6D 0x62 // '??Rememb' 0x65 0x72 0x2C 0x20 0x77 0x68 0x65 0x6E // 'er, when' 0x20 0x79 0x6F 0x75 0x92 0x72 0x65 0x20 // ' youre ' 0x72 0x65 0x61 0x64 0x79 0x20 0x66 0x6F // 'ready fo' 0x72 0x20 0x74 0x68 0x65 0x20 0x6E 0x65 // 'r the ne' 0x78 0x74 0x20 0x73 0x74 0x65 0x70 0x2C // 'xt step,' 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 0x74 // ' click t' 0x68 0x65 0x20 0x50 0x72 0x6F 0x6A 0x65 // 'he Proje' 0x63 0x74 0x20 0x47 0x61 0x64 0x67 0x65 // 'ct Gadge' 0x74 0x2E // 't.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_14= ktpc5Project14 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_14, __HELP_NAME("To see the steps 2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_14, __HELP_NAME("To see the steps 2")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon7 kgobProject kidGadgetHow kidPlayProjectSounds 0x0 0x0 0x57415645 kwav5Project14 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_10=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_14, 0x0) GST(0) ITEM "kgobCalloutBalloon7" ITEM "ktpc5Project14" ITEM "kgobProject" ITEM "kidGadgetHow" ITEM "kidPlayProjectSounds" ITEM "kwav5Project14" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_10=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_14, 0x0) BYTE 0x01 0x00 0x03 0x03 0x73 0x00 0x00 0x00 // '????s???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_10=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_10, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x45 0x00 0x00 0x01 // '????E???' 0x00 0x00 0x00 0x00 0x3A 0x00 0x00 0x03 // '????:???' 0x0B 0x00 0x00 0xFD 0x3D 0x00 0x00 0x03 // '???=???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_10=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_10, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x73 0x65 0x65 // '??To see' 0x20 0x74 0x68 0x65 0x20 0x73 0x74 0x65 // ' the ste' 0x70 0x73 0x20 0x66 0x6F 0x72 0x20 0x63 // 'ps for c' 0x68 0x61 0x6E 0x67 0x69 0x6E 0x67 0x20 // 'hanging ' 0x74 0x68 0x65 0x20 0x63 0x61 0x6D 0x65 // 'the came' 0x72 0x61 0x20 0x61 0x6E 0x67 0x6C 0x65 // 'ra angle' 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 // ', click ' 0x74 0x68 0x65 0x20 0x48 0x6F 0x77 0x20 // 'the How ' 0x62 0x75 0x74 0x74 0x6F 0x6E 0x2E // 'button.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_15= ktpc5Project15 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_15, __HELP_NAME("Why--Changing camera")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_15, __HELP_NAME("Why--Changing camera")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobProject 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwav5Project15 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_16=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_15, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpc5Project15" ITEM "kgobProject" ITEM "" ITEM "" ITEM "kwav5Project15" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_16=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_15, 0x0) BYTE 0x01 0x00 0x03 0x03 0x02 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_16=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_16, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xCB 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_16=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_16, 0x0) BYTE 0x03 0x03 0x43 0x68 0x61 0x6E 0x67 0x65 // '??Change' 0x20 0x63 0x61 0x6D 0x65 0x72 0x61 0x20 // ' camera ' 0x61 0x6E 0x67 0x6C 0x65 0x73 0x20 0x61 // 'angles a' 0x74 0x20 0x74 0x68 0x65 0x20 0x6C 0x65 // 't the le' 0x61 0x73 0x74 0x20 0x6E 0x6F 0x74 0x69 // 'ast noti' 0x63 0x65 0x61 0x62 0x6C 0x65 0x20 0x70 // 'ceable p' 0x6C 0x61 0x63 0x65 0x2D 0x2D 0x69 0x6E // 'lace--in' 0x20 0x74 0x68 0x69 0x73 0x20 0x63 0x61 // ' this ca' 0x73 0x65 0x2C 0x20 0x69 0x6E 0x20 0x74 // 'se, in t' 0x68 0x65 0x20 0x6D 0x69 0x64 0x64 0x6C // 'he middl' 0x65 0x20 0x6F 0x66 0x20 0x61 0x6E 0x20 // 'e of an ' 0x61 0x63 0x74 0x69 0x6F 0x6E 0x2E 0x20 // 'action. ' 0x20 0x52 0x65 0x63 0x6F 0x72 0x64 0x20 // ' Record ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x69 // 'the acti' 0x6F 0x6E 0x20 0x69 0x6E 0x20 0x66 0x75 // 'on in fu' 0x6C 0x6C 0x2C 0x20 0x72 0x65 0x77 0x69 // 'll, rewi' 0x6E 0x64 0x20 0x74 0x6F 0x20 0x74 0x68 // 'nd to th' 0x65 0x20 0x66 0x72 0x61 0x6D 0x65 0x20 // 'e frame ' 0x77 0x68 0x65 0x72 0x65 0x20 0x79 0x6F // 'where yo' 0x75 0x92 0x64 0x20 0x6C 0x69 0x6B 0x65 // 'ud like' 0x20 0x74 0x6F 0x20 0x6D 0x61 0x6B 0x65 // ' to make' 0x20 0x61 0x20 0x63 0x75 0x74 0x2C 0x20 // ' a cut, ' 0x74 0x68 0x65 0x6E 0x20 0x63 0x68 0x61 // 'then cha' 0x6E 0x67 0x65 0x20 0x74 0x68 0x65 0x20 // 'nge the ' 0x63 0x61 0x6D 0x65 0x72 0x61 0x20 0x61 // 'camera a' 0x6E 0x67 0x6C 0x65 0x2E // 'ngle.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_16= ktpc5Project16 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_16, __HELP_NAME("CO--To find camera angles")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_16, __HELP_NAME("CO--To find camera angles")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon1 kgobProject kidSettingsBrowser kidPlayProjectSounds 0x0 0x0 0x57415645 kwav5Project16 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_43=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_16, 0x0) GST(0) ITEM "kgobCalloutBalloon1" ITEM "ktpc5Project16" ITEM "kgobProject" ITEM "kidSettingsBrowser" ITEM "kidPlayProjectSounds" ITEM "kwav5Project16" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_43=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_16, 0x0) BYTE 0x01 0x00 0x03 0x03 0x9F 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_43=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_43, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x28 0x00 0x00 0x01 // '????(???' 0x00 0x00 0x00 0x00 0x21 0x00 0x00 0x03 // '????!???' 0x0B 0x00 0x00 0xFD 0x27 0x00 0x00 0x03 // '???'???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_43=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_43, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x66 0x69 0x6E // '??To fin' 0x64 0x20 0x74 0x68 0x65 0x20 0x63 0x61 // 'd the ca' 0x6D 0x65 0x72 0x61 0x20 0x61 0x6E 0x67 // 'mera ang' 0x6C 0x65 0x73 0x2C 0x20 0x63 0x6C 0x69 // 'les, cli' 0x63 0x6B 0x20 0x53 0x63 0x65 0x6E 0x65 // 'ck Scene' 0x73 0x2E // 's.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_17= ktpc5Project17 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_17, __HELP_NAME("CO--Click Scenes")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_17, __HELP_NAME("CO--Click Scenes")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobProject kidSettingsCameras kidPlayProjectSounds 0x0 0x0 0x57415645 kwav5Project17 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_34=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_17, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpc5Project17" ITEM "kgobProject" ITEM "kidSettingsCameras" ITEM "kidPlayProjectSounds" ITEM "kwav5Project17" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_34=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_17, 0x0) BYTE 0x01 0x00 0x03 0x03 0x78 0x00 0x00 0x00 // '????x???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_34=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_34, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x05 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x14 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x03 // '????????' 0x0B 0x00 0x00 0xFD 0x13 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x14 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_34=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_34, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x43 0x61 0x6D 0x65 0x72 0x61 0x20 0x41 // 'Camera A' 0x6E 0x67 0x6C 0x65 0x73 0x2E // 'ngles.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_18= ktpc5Project18 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_18, __HELP_NAME("CO--Click this camera angle")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_18, __HELP_NAME("CO--Click this camera angle")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject kidReserveProjects kidPlayProjectSounds 0x43 0x0 0x57415645 kwav5Project18 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_37=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_18, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc5Project18" ITEM "kgobProject" ITEM "kidReserveProjects" ITEM "kidPlayProjectSounds" ITEM "kwav5Project18" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_37=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_18, 0x0) BYTE 0x01 0x00 0x03 0x03 0x90 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_37=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_37, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x18 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_37=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_37, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x69 0x73 0x20 0x63 0x61 0x6D // 'this cam' 0x65 0x72 0x61 0x20 0x61 0x6E 0x67 0x6C // 'era angl' 0x65 0x2E // 'e.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_19= ktpc5Project19 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_19, __HELP_NAME("CO--To see new ending")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_19, __HELP_NAME("CO--To see new ending")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject kidPlay kidPlayProjectSounds 0x0 0x0 0x57415645 kwav5Project19 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_19, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc5Project19" ITEM "kgobProject" ITEM "kidPlay" ITEM "kidPlayProjectSounds" ITEM "kwav5Project19" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_19, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC1 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x7A 0x00 0x00 0x01 // '????z???' 0x00 0x00 0x00 0x00 0x2E 0x00 0x00 0x03 // '????.???' 0x0B 0x00 0x00 0xFD 0x32 0x00 0x00 0x03 // '???2???' 0x00 0x00 0x00 0x00 0x6B 0x00 0x00 0x03 // '????k???' 0x0B 0x00 0x00 0xFD 0x79 0x00 0x00 0x03 // '???y???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x3C 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0x40 // '????@??@' 0x01 0x00 0x00 0x00 0x53 0x00 0x00 0x40 // '????S??@' 0x00 0x00 0x00 0x00 0x55 0x00 0x00 0x40 // '????U??@' 0x02 0x00 0x00 0x00 0x6D 0x00 0x00 0x40 // '????m??@' 0x00 0x00 0x00 0x00 0x6F 0x00 0x00 0x40 // '????o??@' 0x03 0x00 0x00 0x00 0x8E 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x90 0x00 0x00 0x40 // '??????@' 0x04 0x00 0x00 0x00 0xA6 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0x80 // '????@??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x90 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0xC0 // '????@??' 0x05 0x00 0x00 0x00 0x55 0x00 0x00 0xC0 // '????U??' 0x05 0x00 0x00 0x00 0x6F 0x00 0x00 0xC0 // '????o??' 0x05 0x00 0x00 0x00 0x90 0x00 0x00 0xC0 // '??????' 0x05 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_14=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_14, 0x0) BYTE 0x03 0x03 0x43 0x6F 0x6E 0x67 0x72 0x61 // '??Congra' 0x74 0x75 0x6C 0x61 0x74 0x69 0x6F 0x6E // 'tulation' 0x73 0x21 0x20 0x20 0x59 0x6F 0x75 0x27 // 's! You'' 0x72 0x65 0x20 0x64 0x6F 0x6E 0x65 0x21 // 're done!' 0x20 0x20 0x57 0x68 0x61 0x74 0x20 0x77 // ' What w' 0x6F 0x75 0x6C 0x64 0x20 0x79 0x6F 0x75 // 'ould you' 0x20 0x6C 0x69 0x6B 0x65 0x20 0x74 0x6F // ' like to' 0x20 0x64 0x6F 0x20 0x6E 0x6F 0x77 0x3F // ' do now?' 0x0D 0x0A 0x01 0x09 0x57 0x6F 0x72 0x6B // '????Work' 0x20 0x6F 0x6E 0x20 0x79 0x6F 0x75 0x72 // ' on your' 0x20 0x6F 0x77 0x6E 0x3F 0x0D 0x0A 0x01 // ' own????' 0x09 0x53 0x74 0x61 0x72 0x74 0x20 0x61 // '?Start a' 0x6E 0x6F 0x74 0x68 0x65 0x72 0x20 0x70 // 'nother p' 0x72 0x6F 0x6A 0x65 0x63 0x74 0x3F 0x0D // 'roject??' 0x0A 0x01 0x09 0x47 0x6F 0x20 0x62 0x61 // '???Go ba' 0x63 0x6B 0x20 0x74 0x6F 0x20 0x74 0x68 // 'ck to th' 0x65 0x20 0x50 0x72 0x6F 0x6A 0x65 0x63 // 'e Projec' 0x74 0x73 0x20 0x52 0x6F 0x6F 0x6D 0x3F // 'ts Room?' 0x0D 0x0A 0x01 0x09 0x51 0x75 0x69 0x74 // '????Quit' 0x20 0x33 0x44 0x20 0x4D 0x6F 0x76 0x69 // ' 3D Movi' 0x65 0x20 0x4D 0x61 0x6B 0x65 0x72 0x3F // 'e Maker?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_51= ktpc5Project51 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_51, __HELP_NAME("CO - Click Skeleton in workspace")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_51, __HELP_NAME("CO - Click Skeleton in workspace")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject 0x0 kidPlayProjectSounds 0x140 0x6E 0x57415645 kwav5Project51 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_51, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc5Project51" ITEM "kgobProject" ITEM "" ITEM "kidPlayProjectSounds" ITEM "kwav5Project51" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_51, 0x0) BYTE 0x01 0x00 0x03 0x03 0x6C 0x00 0x00 0x00 // '????l???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_4A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x13 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4A, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x73 0x6B 0x65 0x6C // 'the skel' 0x65 0x74 0x6F 0x6E 0x2E // 'eton.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK ================================================ FILE: src/help/project6.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ #undef __HELP_NAME #undef __HELP_SYMBOL #undef __HELP_PACK #undef __HELP_PACK2 #ifdef NO_HELP_NAMES #define __HELP_NAME(name) "" #else #define __HELP_NAME(name) name #endif #ifdef NO_HELP_SYMBOLS #define __HELP_SYMBOL(stuff) #else #define __HELP_SYMBOL(stuff) stuff #endif #ifdef PACK_HELP #define __HELP_PACK PACK #else #define __HELP_PACK #endif #ifdef HELP_SINGLE_CHUNK #define __HELP_PACK2 #else #define __HELP_PACK2 __HELP_PACK #endif SET _help_48544F50_0= ktpc6Project00 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("To see this movie, click ")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("To see this movie, click ")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon1 kgobProject kidGadgetPlay kidPlayProjectSounds 0x0 0x0 0x57415645 kwav6Project00 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_15=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) GST(0) ITEM "kgobCalloutBalloon1" ITEM "ktpc6Project00" ITEM "kgobProject" ITEM "kidGadgetPlay" ITEM "kidPlayProjectSounds" ITEM "kwav6Project00" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_15=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0x82 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_15=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_15, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x31 0x00 0x00 0x01 // '????1???' 0x00 0x00 0x00 0x00 0x25 0x00 0x00 0x03 // '????%???' 0x0B 0x00 0x00 0xFD 0x29 0x00 0x00 0x03 // '???)???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_15=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_15, 0x0) BYTE 0x03 0x03 0x43 0x75 0x74 0x2E 0x2E 0x2E // '??Cut...' 0x0D 0x0A 0x54 0x6F 0x20 0x73 0x65 0x65 // '??To see' 0x20 0x74 0x68 0x69 0x73 0x20 0x6D 0x6F // ' this mo' 0x76 0x69 0x65 0x2C 0x20 0x63 0x6C 0x69 // 'vie, cli' 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 0x50 // 'ck the P' 0x6C 0x61 0x79 0x20 0x62 0x75 0x74 0x74 // 'lay butt' 0x6F 0x6E 0x2E // 'on.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1= ktpc6Project01 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("To see this movie 2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("To see this movie 2")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon1 kgobProject kidGadgetPlay kidPlayProjectSounds 0x0 0x0 0x57415645 kwav6Project01 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_29=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) GST(0) ITEM "kgobCalloutBalloon1" ITEM "ktpc6Project01" ITEM "kgobProject" ITEM "kidGadgetPlay" ITEM "kidPlayProjectSounds" ITEM "kwav6Project01" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_29=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0x78 0x00 0x00 0x00 // '????x???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_29, 0x0) AG(4) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpc6Project03 __HELP_SYMBOL( STN "ktpc6Project03" ) ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_29=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_29, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0B 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x50 0x00 0x00 0x01 // '????P???' 0x00 0x00 0x00 0x00 0x52 0x00 0x00 0x01 // '????R???' 0x01 0x00 0x00 0x00 0x62 0x00 0x00 0x01 // '????b???' 0x00 0x00 0x00 0x00 0x42 0x00 0x00 0x03 // '????B???' 0x0B 0x00 0x00 0xFD 0x46 0x00 0x00 0x03 // '???F???' 0x00 0x00 0x00 0x00 0x50 0x00 0x00 0x40 // '????P??@' 0x01 0x00 0x00 0x00 0x62 0x00 0x00 0x40 // '????b??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x50 0x00 0x00 0x82 // '????P??' 0x00 0x00 0x00 0x00 0x50 0x00 0x00 0xC0 // '????P??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_29=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_29, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x73 0x65 0x65 // '??To see' 0x20 0x74 0x68 0x65 0x20 0x77 0x61 0x79 // ' the way' 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F 0x76 // ' the mov' 0x69 0x65 0x20 0x69 0x73 0x20 0x73 0x75 // 'ie is su' 0x70 0x70 0x6F 0x73 0x65 0x64 0x20 0x74 // 'pposed t' 0x6F 0x20 0x6C 0x6F 0x6F 0x6B 0x20 0x61 // 'o look a' 0x6E 0x64 0x20 0x73 0x6F 0x75 0x6E 0x64 // 'nd sound' 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 // ', click ' 0x74 0x68 0x65 0x20 0x50 0x6C 0x61 0x79 // 'the Play' 0x20 0x62 0x75 0x74 0x74 0x6F 0x6E 0x2E // ' button.' 0x0D 0x0A 0x01 0x20 0x41 0x6E 0x6F 0x74 // '??? Anot' 0x68 0x65 0x72 0x20 0x70 0x72 0x6F 0x6A // 'her proj' 0x65 0x63 0x74 0x3F // 'ect?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2= ktpc6Project02 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2, __HELP_NAME("To see the steps")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2, __HELP_NAME("To see the steps")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon7 kgobProject kidGadgetHow kidPlayProjectSounds 0x0 0x0 0x57415645 kwav6Project02 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2, 0x0) GST(0) ITEM "kgobCalloutBalloon7" ITEM "ktpc6Project02" ITEM "kgobProject" ITEM "kidGadgetHow" ITEM "kidPlayProjectSounds" ITEM "kwav6Project02" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2, 0x0) BYTE 0x01 0x00 0x03 0x03 0x6E 0x00 0x00 0x00 // '????n???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x3D 0x00 0x00 0x01 // '????=???' 0x00 0x00 0x00 0x00 0x32 0x00 0x00 0x03 // '????2???' 0x0B 0x00 0x00 0xFD 0x35 0x00 0x00 0x03 // '???5???' 0x00 0x00 0x00 0x00 0x3D 0x00 0x00 0x40 // '????=??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1E, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x73 0x65 0x65 // '??To see' 0x20 0x74 0x68 0x65 0x20 0x73 0x74 0x65 // ' the ste' 0x70 0x73 0x20 0x66 0x6F 0x72 0x20 0x6D // 'ps for m' 0x61 0x6B 0x69 0x6E 0x67 0x20 0x74 0x68 // 'aking th' 0x69 0x73 0x20 0x6D 0x6F 0x76 0x69 0x65 // 'is movie' 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 // ', click ' 0x74 0x68 0x65 0x20 0x48 0x6F 0x77 0x20 // 'the How ' 0x62 0x75 0x74 0x74 0x6F 0x6E 0x2E // 'button.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3= ktpc6Project03 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3, __HELP_NAME("Tip: Another movie")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3, __HELP_NAME("Tip: Another movie")) __HELP_PACK2 BO OSK LONG kgobBalloonHotGadgetHelp kgobProjectHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwav6Project03 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_8=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3, 0x0) GST(0) ITEM "kgobBalloonHotGadgetHelp" ITEM "ktpc6Project03" ITEM "kgobProjectHot" ITEM "" ITEM "" ITEM "kwav6Project03" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_8=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC2 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_6=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_8=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0E 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x13 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x15 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x32 0x00 0x00 0x01 // '????2???' 0x00 0x00 0x00 0x00 0x34 0x00 0x00 0x01 // '????4???' 0x01 0x00 0x00 0x00 0x6F 0x00 0x00 0x01 // '????o???' 0x00 0x00 0x00 0x00 0x15 0x00 0x00 0x03 // '????????' 0x0B 0x00 0x00 0xFD 0x32 0x00 0x00 0x03 // '???2???' 0x00 0x00 0x00 0x00 0x34 0x00 0x00 0x03 // '????4???' 0x0F 0x00 0x00 0xFD 0x6F 0x00 0x00 0x03 // '???o???' 0x00 0x00 0x00 0x00 0x34 0x00 0x00 0x80 // '????4??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x34 0x00 0x00 0x82 // '????4??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_8=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x41 0x6E 0x6F // '??? Ano' 0x74 0x68 0x65 0x72 0x20 0x70 0x72 0x6F // 'ther pro' 0x6A 0x65 0x63 0x74 0x3F 0x0D 0x0A 0x54 // 'ject???T' 0x6F 0x20 0x63 0x68 0x6F 0x6F 0x73 0x65 // 'o choose' 0x20 0x61 0x20 0x64 0x69 0x66 0x66 0x65 // ' a diffe' 0x72 0x65 0x6E 0x74 0x20 0x70 0x72 0x6F // 'rent pro' 0x6A 0x65 0x63 0x74 0x0D 0x0A 0x95 0x09 // 'ject???' 0x43 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 // 'Click th' 0x65 0x20 0x61 0x72 0x72 0x6F 0x77 0x73 // 'e arrows' 0x20 0x6F 0x6E 0x20 0x74 0x68 0x65 0x20 // ' on the ' 0x72 0x69 0x67 0x68 0x74 0x20 0x73 0x69 // 'right si' 0x64 0x65 0x20 0x6F 0x66 0x20 0x74 0x68 // 'de of th' 0x65 0x20 0x50 0x72 0x6F 0x6A 0x65 0x63 // 'e Projec' 0x74 0x20 0x47 0x61 0x64 0x67 0x65 0x74 // 't Gadget' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_4= ktpc6Project04 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4, __HELP_NAME("Why--I chose this combo")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4, __HELP_NAME("Why--I chose this combo")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobProject 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwav6Project04 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpc6Project04" ITEM "kgobProject" ITEM "" ITEM "" ITEM "kwav6Project04" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4, 0x0) BYTE 0x01 0x00 0x03 0x03 0x07 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_3=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xCF 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0xCF 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x0A 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) BYTE 0x03 0x03 0x49 0x20 0x63 0x68 0x6F 0x73 // '??I chos' 0x65 0x20 0x74 0x68 0x69 0x73 0x20 0x63 // 'e this c' 0x6F 0x6D 0x62 0x69 0x6E 0x61 0x74 0x69 // 'ombinati' 0x6F 0x6E 0x20 0x6F 0x66 0x20 0x6D 0x75 // 'on of mu' 0x73 0x69 0x63 0x20 0x62 0x65 0x63 0x61 // 'sic beca' 0x75 0x73 0x65 0x20 0x69 0x74 0x20 0x62 // 'use it b' 0x75 0x69 0x6C 0x64 0x73 0x20 0x73 0x75 // 'uilds su' 0x73 0x70 0x65 0x6E 0x73 0x65 0x20 0x73 // 'spense s' 0x6C 0x6F 0x77 0x6C 0x79 0x2E 0x20 0x20 // 'lowly. ' 0x41 0x66 0x74 0x65 0x72 0x20 0x79 0x6F // 'After yo' 0x75 0x20 0x66 0x69 0x6E 0x69 0x73 0x68 // 'u finish' 0x20 0x74 0x68 0x69 0x73 0x20 0x70 0x72 // ' this pr' 0x6F 0x6A 0x65 0x63 0x74 0x2C 0x20 0x72 // 'oject, r' 0x65 0x6D 0x6F 0x76 0x65 0x20 0x74 0x68 // 'emove th' 0x69 0x73 0x20 0x6D 0x75 0x73 0x69 0x63 // 'is music' 0x20 0x61 0x6E 0x64 0x20 0x74 0x72 0x79 // ' and try' 0x20 0x6F 0x74 0x68 0x65 0x72 0x20 0x63 // ' other c' 0x6F 0x6D 0x62 0x69 0x6E 0x61 0x74 0x69 // 'ombinati' 0x6F 0x6E 0x73 0x2E 0x20 0x20 0x44 0x69 // 'ons. Di' 0x73 0x63 0x6F 0x76 0x65 0x72 0x20 0x68 // 'scover h' 0x6F 0x77 0x20 0x64 0x69 0x66 0x66 0x65 // 'ow diffe' 0x72 0x65 0x6E 0x74 0x20 0x6D 0x75 0x73 // 'rent mus' 0x69 0x63 0x20 0x63 0x68 0x61 0x6E 0x67 // 'ic chang' 0x65 0x73 0x20 0x74 0x68 0x65 0x20 0x6D // 'es the m' 0x6F 0x6F 0x64 0x20 0x6F 0x66 0x20 0x74 // 'ood of t' 0x68 0x65 0x20 0x6D 0x6F 0x76 0x69 0x65 // 'he movie' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_5= ktpc6Project05 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5, __HELP_NAME("I created")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5, __HELP_NAME("I created")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon0 kgobProject 0x0 kidPlayProjectSounds 0x140 0xF0 0x57415645 kwav6Project05 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_22=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5, 0x0) GST(0) ITEM "kgobCalloutBalloon0" ITEM "ktpc6Project05" ITEM "kgobProject" ITEM "" ITEM "kidPlayProjectSounds" ITEM "kwav6Project05" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_22=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5, 0x0) BYTE 0x01 0x00 0x03 0x03 0xF7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_C=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_22, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'GOKD' kgobOkButton 0xFFFFFFFF __HELP_SYMBOL( STN "kgobOkButton" ) ITEM LONG 0x40000001 VAR BYTE 0x01 0xFF 0xFF 0xFF 0xFF // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_22=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_22, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2D 0x01 0x00 0x01 // '????-???' 0x00 0x00 0x00 0x00 0x2F 0x01 0x00 0x40 // '????/??@' 0x02 0x00 0x00 0x00 0x30 0x01 0x00 0x40 // '????0??@' 0x00 0x00 0x00 0x00 0x2F 0x01 0x00 0x80 // '????/??' 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x2F 0x01 0x00 0x82 // '????/??' 0x00 0x00 0x00 0x00 0x2F 0x01 0x00 0xC0 // '????/??' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_22=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_22, 0x0) BYTE 0x03 0x03 0x49 0x20 0x63 0x72 0x65 0x61 // '??I crea' 0x74 0x65 0x64 0x20 0x74 0x68 0x65 0x20 // 'ted the ' 0x66 0x69 0x72 0x73 0x74 0x20 0x70 0x61 // 'first pa' 0x72 0x74 0x20 0x6F 0x66 0x20 0x74 0x68 // 'rt of th' 0x65 0x20 0x6D 0x6F 0x76 0x69 0x65 0x20 // 'e movie ' 0x66 0x6F 0x72 0x20 0x79 0x6F 0x75 0x2E // 'for you.' 0x20 0x20 0x42 0x65 0x6E 0x65 0x64 0x69 // ' Benedi' 0x63 0x74 0x2C 0x20 0x74 0x68 0x65 0x20 // 'ct, the ' 0x6D 0x75 0x6D 0x6D 0x79 0x2C 0x20 0x68 // 'mummy, h' 0x61 0x73 0x20 0x72 0x65 0x74 0x75 0x72 // 'as retur' 0x6E 0x65 0x64 0x20 0x66 0x72 0x6F 0x6D // 'ned from' 0x20 0x61 0x20 0x6A 0x6F 0x67 0x20 0x74 // ' a jog t' 0x6F 0x20 0x66 0x69 0x6E 0x64 0x20 0x6F // 'o find o' 0x75 0x74 0x20 0x68 0x65 0x20 0x69 0x73 // 'ut he is' 0x20 0x62 0x65 0x69 0x6E 0x67 0x20 0x73 // ' being s' 0x6F 0x6C 0x64 0x20 0x74 0x6F 0x20 0x61 // 'old to a' 0x20 0x6D 0x75 0x73 0x65 0x75 0x6D 0x2E // ' museum.' 0x20 0x20 0x48 0x65 0x20 0x6D 0x75 0x73 // ' He mus' 0x74 0x20 0x67 0x65 0x74 0x20 0x69 0x6E // 't get in' 0x74 0x6F 0x20 0x68 0x69 0x73 0x20 0x63 // 'to his c' 0x6F 0x66 0x66 0x69 0x6E 0x20 0x62 0x65 // 'offin be' 0x66 0x6F 0x72 0x65 0x20 0x74 0x68 0x65 // 'fore the' 0x79 0x20 0x66 0x69 0x6E 0x64 0x20 0x6F // 'y find o' 0x75 0x74 0x20 0x68 0x65 0x20 0x69 0x73 // 'ut he is' 0x20 0x67 0x6F 0x6E 0x65 0x2E 0x0D 0x0A // ' gone.??' 0x4E 0x6F 0x77 0x20 0x69 0x74 0x92 0x73 // 'Now its' 0x20 0x79 0x6F 0x75 0x72 0x20 0x74 0x75 // ' your tu' 0x72 0x6E 0x20 0x74 0x6F 0x20 0x61 0x64 // 'rn to ad' 0x64 0x20 0x74 0x68 0x65 0x20 0x66 0x69 // 'd the fi' 0x6E 0x69 0x73 0x68 0x69 0x6E 0x67 0x20 // 'nishing ' 0x74 0x6F 0x75 0x63 0x68 0x65 0x73 0x20 // 'touches ' 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 0x6D // 'to the m' 0x75 0x73 0x69 0x63 0x20 0x61 0x6E 0x64 // 'usic and' 0x20 0x73 0x6F 0x75 0x6E 0x64 0x73 0x20 // ' sounds ' 0x74 0x6F 0x20 0x63 0x72 0x65 0x61 0x74 // 'to creat' 0x65 0x20 0x74 0x65 0x6E 0x73 0x69 0x6F // 'e tensio' 0x6E 0x20 0x61 0x6E 0x64 0x20 0x73 0x75 // 'n and su' 0x73 0x70 0x65 0x6E 0x73 0x65 0x2E 0x0D // 'spense.?' 0x0A 0x01 // '??' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_6= ktpc6Project06 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6, __HELP_NAME("CO--Before we begin")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6, __HELP_NAME("CO--Before we begin")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject kidPlay kidPlayProjectSounds 0x0 0x0 0x57415645 kwav6Project06 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc6Project06" ITEM "kgobProject" ITEM "kidPlay" ITEM "kidPlayProjectSounds" ITEM "kwav6Project06" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_B=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2C, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpc6Project2E __HELP_SYMBOL( STN "ktpc6Project2E" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_2C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x09 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x6C 0x00 0x00 0x01 // '????l???' 0x00 0x00 0x00 0x00 0x1B 0x00 0x00 0x03 // '????????' 0x0B 0x00 0x00 0xFD 0x1F 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x5A 0x00 0x00 0x40 // '????Z??@' 0x02 0x00 0x00 0x00 0x6C 0x00 0x00 0x40 // '????l??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x5A 0x00 0x00 0x82 // '????Z??' 0x00 0x00 0x00 0x00 0x5A 0x00 0x00 0xC0 // '????Z??' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2C, 0x0) BYTE 0x03 0x03 0x42 0x65 0x66 0x6F 0x72 0x65 // '??Before' 0x20 0x77 0x65 0x20 0x62 0x65 0x67 0x69 // ' we begi' 0x6E 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B // 'n, click' 0x20 0x74 0x68 0x65 0x20 0x50 0x6C 0x61 // ' the Pla' 0x79 0x20 0x62 0x75 0x74 0x74 0x6F 0x6E // 'y button' 0x20 0x74 0x6F 0x20 0x68 0x65 0x61 0x72 // ' to hear' 0x20 0x74 0x68 0x65 0x20 0x6D 0x75 0x73 // ' the mus' 0x69 0x63 0x20 0x61 0x6E 0x64 0x20 0x73 // 'ic and s' 0x6F 0x75 0x6E 0x64 0x73 0x20 0x69 0x6E // 'ounds in' 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F 0x76 // ' the mov' 0x69 0x65 0x20 0x73 0x6F 0x20 0x66 0x61 // 'ie so fa' 0x72 0x2E 0x0D 0x0A 0x01 0x20 0x20 0x53 // 'r.??? S' 0x6F 0x75 0x6E 0x64 0x20 0x49 0x6E 0x64 // 'ound Ind' 0x69 0x63 0x61 0x74 0x6F 0x72 // 'icator' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_7= ktpc6Project07 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7, __HELP_NAME("CO--Click the button below")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7, __HELP_NAME("CO--Click the button below")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject kidFrameRWEnd kidPlayProjectSounds 0x0 0x0 0x57415645 kwav6Project07 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_16=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc6Project07" ITEM "kgobProject" ITEM "kidFrameRWEnd" ITEM "kidPlayProjectSounds" ITEM "kwav6Project07" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_16=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA0 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_8=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_16, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpRewindEnd __HELP_SYMBOL( STN "mbmpRewindEnd" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_16=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_16, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0xFB 0x00 0x00 0x17 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0x39 0x00 0x00 0x01 // '????9???' 0x00 0x00 0x00 0x00 0x17 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_16=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_16, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x46 0x69 0x72 0x73 // 'the Firs' 0x74 0x20 0x62 0x75 0x74 0x74 0x6F 0x6E // 't button' 0x2D 0x01 0x20 0x74 0x6F 0x20 0x72 0x65 // '-? to re' 0x77 0x69 0x6E 0x64 0x20 0x79 0x6F 0x75 // 'wind you' 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 0x20 // 'r movie ' 0x74 0x6F 0x20 0x66 0x72 0x61 0x6D 0x65 // 'to frame' 0x20 0x31 0x2E // ' 1.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_8= ktpc6Project08 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8, __HELP_NAME("CO--To find the ")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_8, __HELP_NAME("CO--To find the ")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobProject kidSoundsMusicBrowser kidPlayProjectSounds 0x0 0x0 0x57415645 kwav6Project08 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_30=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpc6Project08" ITEM "kgobProject" ITEM "kidSoundsMusicBrowser" ITEM "kidPlayProjectSounds" ITEM "kwav6Project08" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_30=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_8, 0x0) BYTE 0x01 0x00 0x03 0x03 0x84 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_30=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_30, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x38 0x00 0x00 0x01 // '????8???' 0x00 0x00 0x00 0x00 0x32 0x00 0x00 0x03 // '????2???' 0x0B 0x00 0x00 0xFD 0x37 0x00 0x00 0x03 // '???7???' 0x00 0x00 0x00 0x00 0x38 0x00 0x00 0x40 // '????8??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_30=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_30, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x61 0x64 0x64 // '??To add' 0x20 0x61 0x6E 0x6F 0x74 0x68 0x65 0x72 // ' another' 0x20 0x70 0x69 0x65 0x63 0x65 0x20 0x6F // ' piece o' 0x66 0x20 0x6D 0x75 0x73 0x69 0x63 0x20 // 'f music ' 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 0x63 // 'to the c' 0x68 0x61 0x69 0x6E 0x2C 0x20 0x63 0x6C // 'hain, cl' 0x69 0x63 0x6B 0x20 0x4D 0x75 0x73 0x69 // 'ick Musi' 0x63 0x2E // 'c.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_9= ktpc6Project09 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_9, __HELP_NAME("CO--Click Run Away 1")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_9, __HELP_NAME("CO--Click Run Away 1")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject kidReserveProjects kidPlayProjectSounds 0x0 0xFFFFFFF7 0x57415645 kwav6Project09 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_27=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_9, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc6Project09" ITEM "kgobProject" ITEM "kidReserveProjects" ITEM "kidPlayProjectSounds" ITEM "kwav6Project09" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_27=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_9, 0x0) BYTE 0x01 0x00 0x03 0x03 0x83 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_27=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_27, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x23 0x00 0x00 0x01 // '????#???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_27=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_27, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x22 0x72 0x75 0x6E 0x20 0x61 0x77 0x61 // '"run awa' 0x79 0x20 0x31 0x2E 0x22 0x20 0x20 0x54 // 'y 1." T' 0x68 0x65 0x6E 0x20 0x63 0x6C 0x69 0x63 // 'hen clic' 0x6B 0x20 0x4F 0x4B 0x2E // 'k OK.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_A= ktpc6Project0A #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_A, __HELP_NAME("CO--Click OK")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_A, __HELP_NAME("CO--Click OK")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject kidBrowserOk kidPlayProjectSounds 0x0 0x0 0x57415645 kwav6Project0A ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_A, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc6Project0A" ITEM "kgobProject" ITEM "kidBrowserOk" ITEM "kidPlayProjectSounds" ITEM "kwav6Project0A" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x3E 0x00 0x00 0x00 // '????>???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x11 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) BYTE 0x03 0x03 0x43 0x75 0x74 0x2E 0x2E 0x2E // '??Cut...' 0x0D 0x0A 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x4F 0x4B 0x2E // 'OK.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_B= ktpc6Project0B #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_B, __HELP_NAME("CO--To attach")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_B, __HELP_NAME("CO--To attach")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject 0x0 kidPlayProjectSounds 0x140 0x6E 0x57415645 kwav6Project0B ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_B, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc6Project0B" ITEM "kgobProject" ITEM "" ITEM "kidPlayProjectSounds" ITEM "kwav6Project0B" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_B, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC4 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_5=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) AG(4) FREE ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpc6Project0C __HELP_SYMBOL( STN "ktpc6Project0C" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_1=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x70 0x00 0x00 0x01 // '????p???' 0x00 0x00 0x00 0x00 0x61 0x00 0x00 0x40 // '????a??@' 0x03 0x00 0x00 0x00 0x70 0x00 0x00 0x40 // '????p??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x61 0x00 0x00 0x82 // '????a??' 0x00 0x00 0x00 0x00 0x61 0x00 0x00 0xC0 // '????a??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x61 0x74 0x74 // '??To att' 0x61 0x63 0x68 0x20 0x74 0x68 0x69 0x73 // 'ach this' 0x20 0x70 0x69 0x65 0x63 0x65 0x20 0x74 // ' piece t' 0x6F 0x20 0x74 0x68 0x65 0x20 0x65 0x6E // 'o the en' 0x64 0x20 0x6F 0x66 0x20 0x74 0x68 0x65 // 'd of the' 0x20 0x6D 0x75 0x73 0x69 0x63 0x20 0x73 // ' music s' 0x65 0x71 0x75 0x65 0x6E 0x63 0x65 0x2C // 'equence,' 0x20 0x68 0x6F 0x6C 0x64 0x20 0x64 0x6F // ' hold do' 0x77 0x6E 0x20 0x43 0x74 0x72 0x6C 0x20 // 'wn Ctrl ' 0x61 0x6E 0x64 0x20 0x63 0x6C 0x69 0x63 // 'and clic' 0x6B 0x20 0x74 0x68 0x65 0x20 0x62 0x61 // 'k the ba' 0x63 0x6B 0x67 0x72 0x6F 0x75 0x6E 0x64 // 'ckground' 0x2E 0x0D 0x0A 0x01 0x43 0x68 0x61 0x69 // '.???Chai' 0x6E 0x69 0x6E 0x67 0x20 0x4D 0x75 0x73 // 'ning Mus' 0x69 0x63 // 'ic' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_C= ktpc6Project0C #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_C, __HELP_NAME("Why--chaining")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_C, __HELP_NAME("Why--chaining")) __HELP_PACK2 BO OSK LONG kgobBalloonHotGadgetHelp kgobProjectHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwav6Project0C ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_C, 0x0) GST(0) ITEM "kgobBalloonHotGadgetHelp" ITEM "ktpc6Project0C" ITEM "kgobProjectHot" ITEM "" ITEM "" ITEM "kwav6Project0C" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_C, 0x0) BYTE 0x01 0x00 0x03 0x03 0xFF 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_0=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D, 0x0) AG(4) FREE ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x02 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x11 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x13 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2B 0x01 0x00 0x01 // '????+???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xB2 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_D, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x43 0x68 0x61 // '??? Cha' 0x69 0x6E 0x69 0x6E 0x67 0x20 0x6D 0x75 // 'ining mu' 0x73 0x69 0x63 0x0D 0x0A 0x57 0x68 0x65 // 'sic??Whe' 0x6E 0x20 0x79 0x6F 0x75 0x20 0x68 0x6F // 'n you ho' 0x6C 0x64 0x20 0x64 0x6F 0x77 0x6E 0x20 // 'ld down ' 0x74 0x68 0x65 0x20 0x43 0x74 0x72 0x6C // 'the Ctrl' 0x20 0x6B 0x65 0x79 0x2C 0x20 0x79 0x6F // ' key, yo' 0x75 0x20 0x61 0x72 0x65 0x20 0x63 0x68 // 'u are ch' 0x61 0x69 0x6E 0x69 0x6E 0x67 0x20 0x6F // 'aining o' 0x6E 0x65 0x20 0x73 0x6F 0x75 0x6E 0x64 // 'ne sound' 0x20 0x74 0x6F 0x20 0x61 0x6E 0x6F 0x74 // ' to anot' 0x68 0x65 0x72 0x2E 0x20 0x20 0x54 0x68 // 'her. Th' 0x65 0x20 0x6E 0x65 0x77 0x20 0x73 0x6F // 'e new so' 0x75 0x6E 0x64 0x20 0x70 0x6C 0x61 0x79 // 'und play' 0x73 0x20 0x61 0x74 0x20 0x74 0x68 0x65 // 's at the' 0x20 0x65 0x6E 0x64 0x20 0x6F 0x66 0x20 // ' end of ' 0x74 0x68 0x65 0x20 0x63 0x68 0x61 0x69 // 'the chai' 0x6E 0x2D 0x2D 0x79 0x6F 0x75 0x20 0x63 // 'n--you c' 0x61 0x6E 0x27 0x74 0x20 0x69 0x6E 0x73 // 'an't ins' 0x65 0x72 0x74 0x20 0x61 0x20 0x73 0x6F // 'ert a so' 0x75 0x6E 0x64 0x20 0x69 0x6E 0x20 0x74 // 'und in t' 0x68 0x65 0x20 0x6D 0x69 0x64 0x64 0x6C // 'he middl' 0x65 0x2E 0x0D 0x0A 0x57 0x68 0x65 0x6E // 'e.??When' 0x20 0x79 0x6F 0x75 0x20 0x63 0x68 0x61 // ' you cha' 0x69 0x6E 0x20 0x73 0x6F 0x75 0x6E 0x64 // 'in sound' 0x73 0x20 0x74 0x6F 0x67 0x65 0x74 0x68 // 's togeth' 0x65 0x72 0x2C 0x20 0x79 0x6F 0x75 0x20 // 'er, you ' 0x68 0x61 0x76 0x65 0x20 0x74 0x6F 0x20 // 'have to ' 0x64 0x6F 0x20 0x69 0x74 0x20 0x61 0x74 // 'do it at' 0x20 0x74 0x68 0x65 0x20 0x66 0x72 0x61 // ' the fra' 0x6D 0x65 0x20 0x77 0x68 0x65 0x72 0x65 // 'me where' 0x20 0x74 0x68 0x65 0x20 0x66 0x69 0x72 // ' the fir' 0x73 0x74 0x20 0x73 0x6F 0x75 0x6E 0x64 // 'st sound' 0x20 0x77 0x61 0x73 0x20 0x61 0x74 0x74 // ' was att' 0x61 0x63 0x68 0x65 0x64 0x20 0x28 0x69 // 'ached (i' 0x6E 0x20 0x74 0x68 0x69 0x73 0x20 0x63 // 'n this c' 0x61 0x73 0x65 0x20 0x66 0x72 0x61 0x6D // 'ase fram' 0x65 0x20 0x31 0x29 0x2E // 'e 1).' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_D= ktpc6Project0D #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_D, __HELP_NAME("CO--To find the next piece")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_D, __HELP_NAME("CO--To find the next piece")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobProject kidSoundsMusicBrowser kidPlayProjectSounds 0x0 0x0 0x57415645 kwav6Project0D ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_26=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_D, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpc6Project0D" ITEM "kgobProject" ITEM "kidSoundsMusicBrowser" ITEM "kidPlayProjectSounds" ITEM "kwav6Project0D" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_26=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_D, 0x0) BYTE 0x01 0x00 0x03 0x03 0xCF 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_26=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_26, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x24 0x00 0x00 0x01 // '????$???' 0x00 0x00 0x00 0x00 0x1E 0x00 0x00 0x03 // '????????' 0x0B 0x00 0x00 0xFD 0x23 0x00 0x00 0x03 // '???#???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_26=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_26, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x66 0x69 0x6E // '??To fin' 0x64 0x20 0x74 0x68 0x65 0x20 0x6E 0x65 // 'd the ne' 0x78 0x74 0x20 0x70 0x69 0x65 0x63 0x65 // 'xt piece' 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 // ', click ' 0x4D 0x75 0x73 0x69 0x63 0x2E // 'Music.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_E= ktpc6Project0E #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_E, __HELP_NAME("CO--Click \"Run Away 2\"")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_E, __HELP_NAME("CO--Click \"Run Away 2\"")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject kidReserveProjects kidPlayProjectSounds 0x0 0xFFFFFFF7 0x57415645 kwav6Project0E ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_E, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc6Project0E" ITEM "kgobProject" ITEM "kidReserveProjects" ITEM "kidPlayProjectSounds" ITEM "kwav6Project0E" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x77 0x00 0x00 0x00 // '????w???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_4=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x23 0x00 0x00 0x01 // '????#???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x22 0x72 0x75 0x6E 0x20 0x61 0x77 0x61 // '"run awa' 0x79 0x20 0x32 0x2E 0x22 0x20 0x20 0x54 // 'y 2." T' 0x68 0x65 0x6E 0x20 0x63 0x6C 0x69 0x63 // 'hen clic' 0x6B 0x20 0x4F 0x4B 0x2E // 'k OK.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_F= ktpc6Project0F #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_F, __HELP_NAME("CO--Hold down Ctrl")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_F, __HELP_NAME("CO--Hold down Ctrl")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject 0x0 kidPlayProjectSounds 0x140 0x6E 0x57415645 kwav6Project0F ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_F, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc6Project0F" ITEM "kgobProject" ITEM "" ITEM "kidPlayProjectSounds" ITEM "kwav6Project0F" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x81 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x03 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x28 0x00 0x00 0x01 // '????(???' 0x00 0x00 0x00 0x00 0x28 0x00 0x00 0x04 // '????(???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2B, 0x0) BYTE 0x03 0x03 0x48 0x6F 0x6C 0x64 0x20 0x64 // '??Hold d' 0x6F 0x77 0x6E 0x20 0x43 0x74 0x72 0x6C // 'own Ctrl' 0x20 0x61 0x6E 0x64 0x20 0x63 0x6C 0x69 // ' and cli' 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 0x62 // 'ck the b' 0x61 0x63 0x6B 0x67 0x72 0x6F 0x75 0x6E // 'ackgroun' 0x64 0x2E // 'd.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_10= ktpc6Project10 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_10, __HELP_NAME("CO--Click \"Attack\"")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_10, __HELP_NAME("CO--Click \"Attack\"")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject kidReserveProjects kidPlayProjectSounds 0x0 0xFFFFFFF7 0x57415645 kwav6Project10 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_28=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_10, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc6Project10" ITEM "kgobProject" ITEM "kidReserveProjects" ITEM "kidPlayProjectSounds" ITEM "kwav6Project10" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_28=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_10, 0x0) BYTE 0x01 0x00 0x03 0x03 0x5D 0x00 0x00 0x00 // '????]???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_28=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_28, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1F 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_28=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_28, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x22 0x61 0x74 0x74 0x61 0x63 0x6B 0x2E // '"attack.' 0x22 0x20 0x20 0x54 0x68 0x65 0x6E 0x20 // '" Then ' 0x63 0x6C 0x69 0x63 0x6B 0x20 0x4F 0x4B // 'click OK' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_11= ktpc6Project11 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_11, __HELP_NAME("CO--To find last")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_11, __HELP_NAME("CO--To find last")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobProject kidSoundsMusicBrowser kidPlayProjectSounds 0x0 0x0 0x57415645 kwav6Project11 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_11=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_11, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpc6Project11" ITEM "kgobProject" ITEM "kidSoundsMusicBrowser" ITEM "kidPlayProjectSounds" ITEM "kwav6Project11" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_11=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_11, 0x0) BYTE 0x01 0x00 0x03 0x03 0x6C 0x00 0x00 0x00 // '????l???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_11=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_11, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x24 0x00 0x00 0x01 // '????$???' 0x00 0x00 0x00 0x00 0x1E 0x00 0x00 0x03 // '????????' 0x0B 0x00 0x00 0xFD 0x23 0x00 0x00 0x03 // '???#???' 0x00 0x00 0x00 0x00 0x24 0x00 0x00 0x04 // '????$???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_11=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_11, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x66 0x69 0x6E // '??To fin' 0x64 0x20 0x74 0x68 0x65 0x20 0x6C 0x61 // 'd the la' 0x73 0x74 0x20 0x70 0x69 0x65 0x63 0x65 // 'st piece' 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 // ', click ' 0x4D 0x75 0x73 0x69 0x63 0x2E // 'Music.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_12= ktpc6Project12 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_12, __HELP_NAME("CO--Click Monster")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_12, __HELP_NAME("CO--Click Monster")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject kidReserveProjects kidPlayProjectSounds 0x0 0xFFFFFFF7 0x57415645 kwav6Project12 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_12, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc6Project12" ITEM "kgobProject" ITEM "kidReserveProjects" ITEM "kidPlayProjectSounds" ITEM "kwav6Project12" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_12, 0x0) BYTE 0x01 0x00 0x03 0x03 0x65 0x00 0x00 0x00 // '????e???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x20 0x00 0x00 0x01 // '???? ???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x22 0x6D 0x6F 0x6E 0x73 0x74 0x65 0x72 // '"monster' 0x2E 0x22 0x20 0x20 0x54 0x68 0x65 0x6E // '." Then' 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 0x4F // ' click O' 0x4B 0x2E // 'K.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_13= ktpc6Project13 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_13, __HELP_NAME("CO--To play")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_13, __HELP_NAME("CO--To play")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject kidPlay kidPlayProjectSounds 0x0 0x0 0x57415645 kwav6Project13 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_5=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_13, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc6Project13" ITEM "kgobProject" ITEM "kidPlay" ITEM "kidPlayProjectSounds" ITEM "kwav6Project13" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_5=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_13, 0x0) BYTE 0x01 0x00 0x03 0x03 0x97 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_5=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x30 0x00 0x00 0x01 // '????0???' 0x00 0x00 0x00 0x00 0x24 0x00 0x00 0x03 // '????$???' 0x0B 0x00 0x00 0xFD 0x28 0x00 0x00 0x03 // '???(???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_5=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x70 0x6C 0x61 // '??To pla' 0x79 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F // 'y the mo' 0x76 0x69 0x65 0x20 0x73 0x6F 0x20 0x66 // 'vie so f' 0x61 0x72 0x2C 0x20 0x63 0x6C 0x69 0x63 // 'ar, clic' 0x6B 0x20 0x74 0x68 0x65 0x20 0x50 0x6C // 'k the Pl' 0x61 0x79 0x20 0x62 0x75 0x74 0x74 0x6F // 'ay butto' 0x6E 0x2E // 'n.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_14= ktpc6Project14 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_14, __HELP_NAME("CO--Click until Gustave")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_14, __HELP_NAME("CO--Click until Gustave")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject kidFrameRW kidPlayProjectSounds 0x0 0x0 0x57415645 kwav6Project14 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_14, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc6Project14" ITEM "kgobProject" ITEM "kidFrameRW" ITEM "kidPlayProjectSounds" ITEM "kwav6Project14" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_14, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC6 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_4=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1F, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpRewind __HELP_SYMBOL( STN "mbmpRewind" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_1F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0xFC 0x00 0x00 0x1A 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xB8 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0xA9 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0xB7 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x7A 0x00 0x00 0x82 // '????z??' 0x00 0x00 0x00 0x00 0x1A 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1F, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x50 0x72 0x65 0x76 // 'the Prev' 0x69 0x6F 0x75 0x73 0x20 0x62 0x75 0x74 // 'ious but' 0x74 0x6F 0x6E 0x2D 0x01 0x20 0x75 0x6E // 'ton-? un' 0x74 0x69 0x6C 0x20 0x79 0x6F 0x75 0x20 // 'til you ' 0x72 0x65 0x77 0x69 0x6E 0x64 0x20 0x79 // 'rewind y' 0x6F 0x75 0x72 0x20 0x6D 0x6F 0x76 0x69 // 'our movi' 0x65 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 // 'e to the' 0x20 0x66 0x72 0x61 0x6D 0x65 0x20 0x77 // ' frame w' 0x68 0x65 0x72 0x65 0x20 0x47 0x75 0x73 // 'here Gus' 0x74 0x61 0x76 0x65 0x20 0x68 0x61 0x73 // 'tave has' 0x20 0x6A 0x75 0x73 0x74 0x20 0x63 0x6F // ' just co' 0x6D 0x65 0x20 0x6F 0x75 0x74 0x20 0x6F // 'me out o' 0x66 0x20 0x74 0x68 0x65 0x20 0x64 0x69 // 'f the di' 0x6E 0x69 0x6E 0x67 0x20 0x72 0x6F 0x6F // 'ning roo' 0x6D 0x2E 0x0D 0x0A 0x57 0x68 0x65 0x6E // 'm.??When' 0x20 0x79 0x6F 0x75 0x92 0x72 0x65 0x20 // ' youre ' 0x72 0x65 0x61 0x64 0x79 0x20 0x66 0x6F // 'ready fo' 0x72 0x20 0x74 0x68 0x65 0x20 0x6E 0x65 // 'r the ne' 0x78 0x74 0x20 0x73 0x74 0x65 0x70 0x2C // 'xt step,' 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 0x74 // ' click t' 0x68 0x65 0x20 0x50 0x72 0x6F 0x6A 0x65 // 'he Proje' 0x63 0x74 0x20 0x47 0x61 0x64 0x67 0x65 // 'ct Gadge' 0x74 0x2E // 't.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_15= ktpc6Project15 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_15, __HELP_NAME("CO--Remember click Gadget")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_15, __HELP_NAME("CO--Remember click Gadget")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon5 kgobProject kidGadget kidPlayProjectSounds 0x0 0x0 0x57415645 kwav6Project15 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_14=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_15, 0x0) GST(0) ITEM "kgobCalloutBalloon5" ITEM "ktpc6Project15" ITEM "kgobProject" ITEM "kidGadget" ITEM "kidPlayProjectSounds" ITEM "kwav6Project15" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_14=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_15, 0x0) BYTE 0x01 0x00 0x03 0x03 0x9B 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_14=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_14, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x48 0x00 0x00 0x01 // '????H???' 0x00 0x00 0x00 0x00 0x39 0x00 0x00 0x03 // '????9???' 0x0B 0x00 0x00 0xFD 0x47 0x00 0x00 0x03 // '???G???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_14=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_14, 0x0) BYTE 0x03 0x03 0x52 0x65 0x6D 0x65 0x6D 0x62 // '??Rememb' 0x65 0x72 0x2C 0x20 0x77 0x68 0x65 0x6E // 'er, when' 0x20 0x79 0x6F 0x75 0x92 0x72 0x65 0x20 // ' youre ' 0x72 0x65 0x61 0x64 0x79 0x20 0x66 0x6F // 'ready fo' 0x72 0x20 0x74 0x68 0x65 0x20 0x6E 0x65 // 'r the ne' 0x78 0x74 0x20 0x73 0x74 0x65 0x70 0x2C // 'xt step,' 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 0x74 // ' click t' 0x68 0x65 0x20 0x50 0x72 0x6F 0x6A 0x65 // 'he Proje' 0x63 0x74 0x20 0x47 0x61 0x64 0x67 0x65 // 'ct Gadge' 0x74 0x2E // 't.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_16= ktpc6Project16 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_16, __HELP_NAME("To see steps")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_16, __HELP_NAME("To see steps")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon7 kgobProject kidGadgetHow kidPlayProjectSounds 0x0 0x0 0x57415645 kwav6Project16 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_10=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_16, 0x0) GST(0) ITEM "kgobCalloutBalloon7" ITEM "ktpc6Project16" ITEM "kgobProject" ITEM "kidGadgetHow" ITEM "kidPlayProjectSounds" ITEM "kwav6Project16" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_10=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_16, 0x0) BYTE 0x01 0x00 0x03 0x03 0x73 0x00 0x00 0x00 // '????s???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_10=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_10, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x49 0x00 0x00 0x01 // '????I???' 0x00 0x00 0x00 0x00 0x3E 0x00 0x00 0x03 // '????>???' 0x0B 0x00 0x00 0xFD 0x41 0x00 0x00 0x03 // '???A???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_10=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_10, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x73 0x65 0x65 // '??To see' 0x20 0x74 0x68 0x65 0x20 0x73 0x74 0x65 // ' the ste' 0x70 0x73 0x20 0x66 0x6F 0x72 0x20 0x6D // 'ps for m' 0x61 0x74 0x63 0x68 0x69 0x6E 0x67 0x20 // 'atching ' 0x61 0x20 0x73 0x6F 0x75 0x6E 0x64 0x20 // 'a sound ' 0x74 0x6F 0x20 0x61 0x6E 0x20 0x61 0x63 // 'to an ac' 0x74 0x69 0x6F 0x6E 0x2C 0x20 0x63 0x6C // 'tion, cl' 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 // 'ick the ' 0x48 0x6F 0x77 0x20 0x62 0x75 0x74 0x74 // 'How butt' 0x6F 0x6E 0x2E // 'on.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_17= ktpc6Project17 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_17, __HELP_NAME("Why--action matcher")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_17, __HELP_NAME("Why--action matcher")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobProject 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwav6Project17 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_9=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_17, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpc6Project17" ITEM "kgobProject" ITEM "" ITEM "" ITEM "kwav6Project17" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_9=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_17, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE2 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_9=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_9, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xD4 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_9=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_9, 0x0) BYTE 0x03 0x03 0x54 0x68 0x65 0x20 0x41 0x63 // '??The Ac' 0x74 0x69 0x6F 0x6E 0x20 0x4D 0x61 0x74 // 'tion Mat' 0x63 0x68 0x65 0x72 0x20 0x69 0x73 0x20 // 'cher is ' 0x61 0x20 0x75 0x73 0x65 0x66 0x75 0x6C // 'a useful' 0x20 0x74 0x6F 0x6F 0x6C 0x20 0x77 0x68 // ' tool wh' 0x65 0x6E 0x20 0x79 0x6F 0x75 0x20 0x77 // 'en you w' 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 0x65 // 'ant to e' 0x6D 0x70 0x68 0x61 0x73 0x69 0x7A 0x65 // 'mphasize' 0x20 0x61 0x20 0x73 0x70 0x65 0x63 0x69 // ' a speci' 0x66 0x69 0x63 0x20 0x61 0x63 0x74 0x69 // 'fic acti' 0x6F 0x6E 0x2E 0x20 0x20 0x42 0x79 0x20 // 'on. By ' 0x6D 0x61 0x74 0x63 0x68 0x69 0x6E 0x67 // 'matching' 0x20 0x61 0x20 0x73 0x6F 0x75 0x6E 0x64 // ' a sound' 0x20 0x74 0x6F 0x20 0x47 0x75 0x73 0x74 // ' to Gust' 0x61 0x76 0x65 0x27 0x73 0x20 0x66 0x6F // 'ave's fo' 0x6F 0x74 0x73 0x74 0x65 0x70 0x2C 0x20 // 'otstep, ' 0x49 0x27 0x6D 0x20 0x64 0x72 0x61 0x77 // 'I'm draw' 0x69 0x6E 0x67 0x20 0x61 0x74 0x74 0x65 // 'ing atte' 0x6E 0x74 0x69 0x6F 0x6E 0x20 0x74 0x6F // 'ntion to' 0x20 0x68 0x69 0x73 0x20 0x6D 0x6F 0x76 // ' his mov' 0x65 0x6D 0x65 0x6E 0x74 0x20 0x61 0x6E // 'ement an' 0x64 0x20 0x77 0x68 0x61 0x74 0x27 0x73 // 'd what's' 0x20 0x67 0x6F 0x69 0x6E 0x67 0x20 0x74 // ' going t' 0x6F 0x20 0x68 0x61 0x70 0x70 0x65 0x6E // 'o happen' 0x20 0x77 0x68 0x65 0x6E 0x20 0x47 0x75 // ' when Gu' 0x73 0x74 0x61 0x76 0x65 0x20 0x72 0x65 // 'stave re' 0x74 0x75 0x72 0x6E 0x73 0x2E // 'turns.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_18= ktpc6Project18 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_18, __HELP_NAME("CO--To find sound effects")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_18, __HELP_NAME("CO--To find sound effects")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobProject kidSoundsEfxBrowser kidPlayProjectSounds 0x0 0x0 0x57415645 kwav6Project18 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_18, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpc6Project18" ITEM "kgobProject" ITEM "kidSoundsEfxBrowser" ITEM "kidPlayProjectSounds" ITEM "kwav6Project18" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_18, 0x0) BYTE 0x01 0x00 0x03 0x03 0x97 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2E 0x00 0x00 0x01 // '????.???' 0x00 0x00 0x00 0x00 0x20 0x00 0x00 0x03 // '???? ???' 0x0B 0x00 0x00 0xFD 0x2D 0x00 0x00 0x03 // '???-???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x66 0x69 0x6E // '??To fin' 0x64 0x20 0x61 0x20 0x66 0x6F 0x6F 0x74 // 'd a foot' 0x73 0x74 0x65 0x70 0x20 0x73 0x6F 0x75 // 'step sou' 0x6E 0x64 0x2C 0x20 0x63 0x6C 0x69 0x63 // 'nd, clic' 0x6B 0x20 0x53 0x6F 0x75 0x6E 0x64 0x20 // 'k Sound ' 0x45 0x66 0x66 0x65 0x63 0x74 0x73 0x2E // 'Effects.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_19= ktpc6Project19 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_19, __HELP_NAME("CO--Click Step Floor Right")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_19, __HELP_NAME("CO--Click Step Floor Right")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject kidReserveProjects kidPlayProjectSounds 0x0 0xFFFFFFF7 0x57415645 kwav6Project19 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_7=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_19, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc6Project19" ITEM "kgobProject" ITEM "kidReserveProjects" ITEM "kidPlayProjectSounds" ITEM "kwav6Project19" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_7=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_19, 0x0) BYTE 0x01 0x00 0x03 0x03 0x93 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_7=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x29 0x00 0x00 0x01 // '????)???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_7=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x93 0x73 0x74 0x65 0x70 0x20 0x66 0x6C // 'step fl' 0x6F 0x6F 0x72 0x20 0x72 0x69 0x67 0x68 // 'oor righ' 0x74 0x2E 0x94 0x0D 0x0A 0x54 0x68 0x65 // 't.??The' 0x6E 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 // 'n click ' 0x4F 0x4B 0x2E // 'OK.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1A= ktpc6Project1A #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1A, __HELP_NAME("CO--Click the Action Matcher")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1A, __HELP_NAME("CO--Click the Action Matcher")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobProject kidSoundsAttachToCell kidPlayProjectSounds 0x0 0x0 0x57415645 kwav6Project1A ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_13=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1A, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpc6Project1A" ITEM "kgobProject" ITEM "kidSoundsAttachToCell" ITEM "kidPlayProjectSounds" ITEM "kwav6Project1A" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_13=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x9D 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_13=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_13, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x19 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x0A 0x00 0x00 0x03 // '????????' 0x0B 0x00 0x00 0xFD 0x18 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x19 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_13=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_13, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x41 0x63 0x74 0x69 // 'the Acti' 0x6F 0x6E 0x20 0x4D 0x61 0x74 0x63 0x68 // 'on Match' 0x65 0x72 0x2E // 'er.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1B= ktpc6Project1B #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1B, __HELP_NAME("CO--Click Gustave")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1B, __HELP_NAME("CO--Click Gustave")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject 0x0 kidPlayProjectSounds 0x140 0x6E 0x57415645 kwav6Project1B ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_6=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1B, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc6Project1B" ITEM "kgobProject" ITEM "" ITEM "kidPlayProjectSounds" ITEM "kwav6Project1B" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_6=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x54 0x00 0x00 0x00 // '????T???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_6=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0E 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_6=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x47 0x75 0x73 0x74 0x61 0x76 0x65 0x2E // 'Gustave.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1C= ktpc6Project1C #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1C, __HELP_NAME("CO--Click button 2 to 3")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1C, __HELP_NAME("CO--Click button 2 to 3")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject kidFrameFW kidPlayProjectSounds 0x0 0x0 0x57415645 kwav6Project1C ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_20=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1C, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc6Project1C" ITEM "kgobProject" ITEM "kidFrameFW" ITEM "kidPlayProjectSounds" ITEM "kwav6Project1C" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_20=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x9D 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_3=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_20, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpForward __HELP_SYMBOL( STN "mbmpForward" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_20=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_20, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0xFB 0x00 0x00 0x16 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0x17 0x00 0x00 0x01 // '????????' 0x01 0xFB 0x00 0x00 0x18 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xAA 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x9B 0x00 0x00 0x03 // '???????' 0x0B 0x00 0x00 0xFD 0xA9 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x6C 0x00 0x00 0x82 // '????l??' 0x00 0x00 0x00 0x00 0x16 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_20=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_20, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x74 0x68 0x65 0x20 0x4E 0x65 0x78 0x74 // 'the Next' 0x20 0x62 0x75 0x74 0x74 0x6F 0x6E 0x2D // ' button-' 0x01 0x20 0x32 0x20 0x74 0x6F 0x20 0x33 // '? 2 to 3' 0x20 0x74 0x69 0x6D 0x65 0x73 0x20 0x75 // ' times u' 0x6E 0x74 0x69 0x6C 0x20 0x79 0x6F 0x75 // 'ntil you' 0x20 0x67 0x65 0x74 0x20 0x74 0x6F 0x20 // ' get to ' 0x74 0x68 0x65 0x20 0x66 0x72 0x61 0x6D // 'the fram' 0x65 0x20 0x77 0x68 0x65 0x72 0x65 0x20 // 'e where ' 0x47 0x75 0x73 0x74 0x61 0x76 0x65 0x27 // 'Gustave'' 0x73 0x20 0x6F 0x74 0x68 0x65 0x72 0x20 // 's other ' 0x66 0x6F 0x6F 0x74 0x20 0x68 0x69 0x74 // 'foot hit' 0x73 0x20 0x74 0x68 0x65 0x20 0x66 0x6C // 's the fl' 0x6F 0x6F 0x72 0x2E 0x0D 0x0A 0x57 0x68 // 'oor.??Wh' 0x65 0x6E 0x20 0x79 0x6F 0x75 0x27 0x72 // 'en you'r' 0x65 0x20 0x72 0x65 0x61 0x64 0x79 0x20 // 'e ready ' 0x66 0x6F 0x72 0x20 0x74 0x68 0x65 0x20 // 'for the ' 0x6E 0x65 0x78 0x74 0x20 0x73 0x74 0x65 // 'next ste' 0x70 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B // 'p, click' 0x20 0x74 0x68 0x65 0x20 0x50 0x72 0x6F // ' the Pro' 0x6A 0x65 0x63 0x74 0x20 0x47 0x61 0x64 // 'ject Gad' 0x67 0x65 0x74 0x2E // 'get.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1D= ktpc6Project1D #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1D, __HELP_NAME("CO--To see the steps 2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1D, __HELP_NAME("CO--To see the steps 2")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon7 kgobProject kidGadgetHow kidPlayProjectSounds 0x0 0x0 0x57415645 kwav6Project1D ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1D, 0x0) GST(0) ITEM "kgobCalloutBalloon7" ITEM "ktpc6Project1D" ITEM "kgobProject" ITEM "kidGadgetHow" ITEM "kidPlayProjectSounds" ITEM "kwav6Project1D" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x73 0x00 0x00 0x00 // '????s???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x49 0x00 0x00 0x01 // '????I???' 0x00 0x00 0x00 0x00 0x3E 0x00 0x00 0x03 // '????>???' 0x0B 0x00 0x00 0xFD 0x41 0x00 0x00 0x03 // '???A???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1D, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x73 0x65 0x65 // '??To see' 0x20 0x74 0x68 0x65 0x20 0x73 0x74 0x65 // ' the ste' 0x70 0x73 0x20 0x66 0x6F 0x72 0x20 0x6D // 'ps for m' 0x61 0x74 0x63 0x68 0x69 0x6E 0x67 0x20 // 'atching ' 0x61 0x20 0x73 0x6F 0x75 0x6E 0x64 0x20 // 'a sound ' 0x74 0x6F 0x20 0x61 0x6E 0x20 0x61 0x63 // 'to an ac' 0x74 0x69 0x6F 0x6E 0x2C 0x20 0x63 0x6C // 'tion, cl' 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 // 'ick the ' 0x48 0x6F 0x77 0x20 0x62 0x75 0x74 0x74 // 'How butt' 0x6F 0x6E 0x2E // 'on.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1E= ktpc6Project1E #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1E, __HELP_NAME("Why--If the sound")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1E, __HELP_NAME("Why--If the sound")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobProject 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwav6Project1E ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_12=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1E, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpc6Project1E" ITEM "kgobProject" ITEM "" ITEM "" ITEM "kwav6Project1E" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_12=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1E, 0x0) BYTE 0x01 0x00 0x03 0x03 0xF3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_12=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_12, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xD8 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_12=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_12, 0x0) BYTE 0x03 0x03 0x49 0x66 0x20 0x74 0x68 0x65 // '??If the' 0x20 0x73 0x6F 0x75 0x6E 0x64 0x20 0x6F // ' sound o' 0x66 0x20 0x47 0x75 0x73 0x74 0x61 0x76 // 'f Gustav' 0x65 0x92 0x73 0x20 0x66 0x6F 0x6F 0x74 // 'es foot' 0x73 0x74 0x65 0x70 0x73 0x20 0x61 0x72 // 'steps ar' 0x65 0x20 0x6D 0x65 0x61 0x6E 0x74 0x20 // 'e meant ' 0x74 0x6F 0x20 0x64 0x72 0x61 0x77 0x20 // 'to draw ' 0x61 0x74 0x74 0x65 0x6E 0x74 0x69 0x6F // 'attentio' 0x6E 0x20 0x74 0x6F 0x20 0x68 0x69 0x73 // 'n to his' 0x20 0x77 0x68 0x65 0x72 0x65 0x61 0x62 // ' whereab' 0x6F 0x75 0x74 0x73 0x2C 0x20 0x77 0x68 // 'outs, wh' 0x79 0x20 0x64 0x6F 0x65 0x73 0x6E 0x92 // 'y doesn' 0x74 0x20 0x42 0x65 0x6E 0x65 0x64 0x69 // 't Benedi' 0x63 0x74 0x20 0x68 0x61 0x76 0x65 0x20 // 'ct have ' 0x73 0x6F 0x75 0x6E 0x64 0x20 0x63 0x6F // 'sound co' 0x6E 0x6E 0x65 0x63 0x74 0x65 0x64 0x20 // 'nnected ' 0x74 0x6F 0x20 0x68 0x69 0x73 0x20 0x66 // 'to his f' 0x6F 0x6F 0x74 0x73 0x74 0x65 0x70 0x73 // 'ootsteps' 0x3F 0x20 0x20 0x42 0x65 0x6E 0x65 0x64 // '? Bened' 0x69 0x63 0x74 0x20 0x69 0x73 0x20 0x74 // 'ict is t' 0x72 0x79 0x69 0x6E 0x67 0x20 0x74 0x6F // 'rying to' 0x20 0x62 0x65 0x20 0x71 0x75 0x69 0x65 // ' be quie' 0x74 0x2E 0x20 0x20 0x49 0x6E 0x20 0x63 // 't. In c' 0x6F 0x6E 0x74 0x72 0x61 0x73 0x74 0x2C // 'ontrast,' 0x20 0x68 0x69 0x73 0x20 0x66 0x6F 0x6F // ' his foo' 0x74 0x73 0x74 0x65 0x70 0x73 0x20 0x61 // 'tsteps a' 0x72 0x65 0x20 0x73 0x69 0x6C 0x65 0x6E // 're silen' 0x74 0x2E // 't.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1F= ktpc6Project1F #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1F, __HELP_NAME("CO--Click Step Floor Left")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1F, __HELP_NAME("CO--Click Step Floor Left")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject kidReserveProjects kidPlayProjectSounds 0x0 0xFFFFFFF7 0x57415645 kwav6Project1F ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1F, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc6Project1F" ITEM "kgobProject" ITEM "kidReserveProjects" ITEM "kidPlayProjectSounds" ITEM "kwav6Project1F" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x8D 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x28 0x00 0x00 0x01 // '????(???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x93 0x73 0x74 0x65 0x70 0x20 0x66 0x6C // 'step fl' 0x6F 0x6F 0x72 0x20 0x6C 0x65 0x66 0x74 // 'oor left' 0x2E 0x94 0x20 0x20 0x54 0x68 0x65 0x6E // '. Then' 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 0x4F // ' click O' 0x4B 0x2E // 'K.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_20= ktpc6Project20 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_20, __HELP_NAME("CO--To play the new ending")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_20, __HELP_NAME("CO--To play the new ending")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject kidPlay kidPlayProjectSounds 0x0 0x0 0x57415645 kwav6Project20 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_20, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc6Project20" ITEM "kgobProject" ITEM "kidPlay" ITEM "kidPlayProjectSounds" ITEM "kwav6Project20" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_20, 0x0) BYTE 0x01 0x00 0x03 0x03 0xCB 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x7B 0x00 0x00 0x01 // '????{???' 0x00 0x00 0x00 0x00 0x2F 0x00 0x00 0x03 // '????/???' 0x0B 0x00 0x00 0xFD 0x33 0x00 0x00 0x03 // '???3???' 0x00 0x00 0x00 0x00 0x6C 0x00 0x00 0x03 // '????l???' 0x0B 0x00 0x00 0xFD 0x7A 0x00 0x00 0x03 // '???z???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x3D 0x00 0x00 0x82 // '????=??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1A, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x70 0x6C 0x61 // '??To pla' 0x79 0x20 0x74 0x68 0x65 0x20 0x6E 0x65 // 'y the ne' 0x77 0x20 0x65 0x6E 0x64 0x69 0x6E 0x67 // 'w ending' 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 // ' to the ' 0x6D 0x6F 0x76 0x69 0x65 0x2C 0x20 0x63 // 'movie, c' 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 // 'lick the' 0x20 0x50 0x6C 0x61 0x79 0x20 0x62 0x75 // ' Play bu' 0x74 0x74 0x6F 0x6E 0x2E 0x0D 0x0A 0x57 // 'tton.??W' 0x68 0x65 0x6E 0x20 0x79 0x6F 0x75 0x92 // 'hen you' 0x72 0x65 0x20 0x72 0x65 0x61 0x64 0x79 // 're ready' 0x20 0x66 0x6F 0x72 0x20 0x74 0x68 0x65 // ' for the' 0x20 0x6E 0x65 0x78 0x74 0x20 0x73 0x74 // ' next st' 0x65 0x70 0x2C 0x20 0x63 0x6C 0x69 0x63 // 'ep, clic' 0x6B 0x20 0x74 0x68 0x65 0x20 0x50 0x72 // 'k the Pr' 0x6F 0x6A 0x65 0x63 0x74 0x20 0x47 0x61 // 'oject Ga' 0x64 0x67 0x65 0x74 0x2E // 'dget.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_21= ktpc6Project21 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_21, __HELP_NAME("CO--To see the steps 3")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_21, __HELP_NAME("CO--To see the steps 3")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon7 kgobProject kidGadgetHow kidPlayProjectSounds 0x0 0x0 0x57415645 kwav6Project21 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_19=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_21, 0x0) GST(0) ITEM "kgobCalloutBalloon7" ITEM "ktpc6Project21" ITEM "kgobProject" ITEM "kidGadgetHow" ITEM "kidPlayProjectSounds" ITEM "kwav6Project21" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_19=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_21, 0x0) BYTE 0x01 0x00 0x03 0x03 0x73 0x00 0x00 0x00 // '????s???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_19=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_19, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x5D 0x00 0x00 0x01 // '????]???' 0x00 0x00 0x00 0x00 0x52 0x00 0x00 0x03 // '????R???' 0x0B 0x00 0x00 0xFD 0x55 0x00 0x00 0x03 // '???U???' 0x00 0x00 0x00 0x00 0x5D 0x00 0x00 0x40 // '????]??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_19=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_19, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x73 0x65 0x65 // '??To see' 0x20 0x74 0x68 0x65 0x20 0x73 0x74 0x65 // ' the ste' 0x70 0x20 0x66 0x6F 0x72 0x20 0x70 0x61 // 'p for pa' 0x75 0x73 0x69 0x6E 0x67 0x20 0x74 0x68 // 'using th' 0x65 0x20 0x6D 0x6F 0x76 0x69 0x65 0x20 // 'e movie ' 0x61 0x63 0x74 0x69 0x6F 0x6E 0x20 0x75 // 'action u' 0x6E 0x74 0x69 0x6C 0x20 0x61 0x20 0x73 // 'ntil a s' 0x6F 0x75 0x6E 0x64 0x20 0x69 0x73 0x20 // 'ound is ' 0x66 0x69 0x6E 0x69 0x73 0x68 0x65 0x64 // 'finished' 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 // ', click ' 0x74 0x68 0x65 0x20 0x48 0x6F 0x77 0x20 // 'the How ' 0x62 0x75 0x74 0x74 0x6F 0x6E 0x2E // 'button.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_22= ktpc6Project22 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_22, __HELP_NAME("Why--Wait for Sound")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_22, __HELP_NAME("Why--Wait for Sound")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloonP kgobProject 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwav6Project22 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_18=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_22, 0x0) GST(0) ITEM "kgobCalloutBalloonP" ITEM "ktpc6Project22" ITEM "kgobProject" ITEM "" ITEM "" ITEM "kwav6Project22" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_18=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_22, 0x0) BYTE 0x01 0x00 0x03 0x03 0xDE 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_18=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_18, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x03 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xAD 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_18=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_18, 0x0) BYTE 0x03 0x03 0x57 0x61 0x69 0x74 0x20 0x66 // '??Wait f' 0x6F 0x72 0x20 0x53 0x6F 0x75 0x6E 0x64 // 'or Sound' 0x20 0x74 0x6F 0x20 0x45 0x6E 0x64 0x20 // ' to End ' 0x61 0x6C 0x6C 0x6F 0x77 0x73 0x20 0x61 // 'allows a' 0x20 0x73 0x6F 0x75 0x6E 0x64 0x20 0x74 // ' sound t' 0x6F 0x20 0x70 0x6C 0x61 0x79 0x20 0x75 // 'o play u' 0x6E 0x74 0x69 0x6C 0x20 0x69 0x74 0x20 // 'ntil it ' 0x66 0x69 0x6E 0x69 0x73 0x68 0x65 0x73 // 'finishes' 0x20 0x69 0x6E 0x73 0x74 0x65 0x61 0x64 // ' instead' 0x20 0x6F 0x66 0x20 0x63 0x75 0x74 0x74 // ' of cutt' 0x69 0x6E 0x67 0x20 0x69 0x74 0x20 0x6F // 'ing it o' 0x66 0x66 0x2E 0x20 0x20 0x54 0x68 0x69 // 'ff. Thi' 0x73 0x20 0x69 0x73 0x20 0x75 0x73 0x65 // 's is use' 0x66 0x75 0x6C 0x20 0x65 0x73 0x70 0x65 // 'ful espe' 0x63 0x69 0x61 0x6C 0x6C 0x79 0x20 0x69 // 'cially i' 0x66 0x20 0x79 0x6F 0x75 0x27 0x76 0x65 // 'f you've' 0x20 0x61 0x74 0x74 0x61 0x63 0x68 0x65 // ' attache' 0x64 0x20 0x61 0x20 0x73 0x6F 0x75 0x6E // 'd a soun' 0x64 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 // 'd to the' 0x20 0x6C 0x61 0x73 0x74 0x20 0x66 0x72 // ' last fr' 0x61 0x6D 0x65 0x20 0x6F 0x66 0x20 0x61 // 'ame of a' 0x20 0x73 0x63 0x65 0x6E 0x65 0x2E // ' scene.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_23= ktpc6Project23 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_23, __HELP_NAME("CO--blank")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_23, __HELP_NAME("CO--blank")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobProject kidSettingsCover kidPlayProjectSounds 0x0 0x0 0x57415645 kwav6Project23 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_21=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_23, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpc6Project23" ITEM "kgobProject" ITEM "kidSettingsCover" ITEM "kidPlayProjectSounds" ITEM "kwav6Project23" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_21=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_23, 0x0) BYTE 0x01 0x00 0x03 0x03 0x8D 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_21=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_21, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x05 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_21=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_21, 0x0) BYTE 0x03 0x03 0x62 0x6C 0x61 0x6E 0x6B // '??blank' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_24= ktpc6Project24 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_24, __HELP_NAME("CO--Turn on Wait")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_24, __HELP_NAME("CO--Turn on Wait")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon2 kgobProject kidPausesSound kidPlayProjectSounds 0x0 0x0 0x57415645 kwav6Project24 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_25=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_24, 0x0) GST(0) ITEM "kgobCalloutBalloon2" ITEM "ktpc6Project24" ITEM "kgobProject" ITEM "kidPausesSound" ITEM "kidPlayProjectSounds" ITEM "kwav6Project24" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_25=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_24, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_9=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_25, 0x0) AG(4) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG ktpc6Project4F __HELP_SYMBOL( STN "ktpc6Project4F" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_25=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_25, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x72 0x00 0x00 0x01 // '????r???' 0x00 0x00 0x00 0x00 0x1C 0x00 0x00 0x03 // '????????' 0x0B 0x00 0x00 0xFD 0x31 0x00 0x00 0x03 // '???1???' 0x00 0x00 0x00 0x00 0x63 0x00 0x00 0x03 // '????c???' 0x0B 0x00 0x00 0xFD 0x71 0x00 0x00 0x03 // '???q???' 0x00 0x00 0x00 0x00 0x14 0x00 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x1B 0x00 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x14 0x00 0x00 0x40 // '???????@' 0x02 0x00 0x00 0x00 0x1B 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x34 0x00 0x00 0x82 // '????4??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_25=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_25, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x70 0x61 0x75 // '??To pau' 0x73 0x65 0x20 0x74 0x68 0x65 0x20 0x6D // 'se the m' 0x6F 0x76 0x69 0x65 0x2C 0x20 0x74 0x75 // 'ovie, tu' 0x72 0x6E 0x20 0x6F 0x6E 0x20 0x57 0x61 // 'rn on Wa' 0x69 0x74 0x20 0x66 0x6F 0x72 0x20 0x53 // 'it for S' 0x6F 0x75 0x6E 0x64 0x20 0x74 0x6F 0x20 // 'ound to ' 0x45 0x6E 0x64 0x2E 0x0D 0x0A 0x57 0x68 // 'End.??Wh' 0x65 0x6E 0x20 0x79 0x6F 0x75 0x27 0x72 // 'en you'r' 0x65 0x20 0x72 0x65 0x61 0x64 0x79 0x20 // 'e ready ' 0x66 0x6F 0x72 0x20 0x74 0x68 0x65 0x20 // 'for the ' 0x6E 0x65 0x78 0x74 0x20 0x73 0x74 0x65 // 'next ste' 0x70 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B // 'p, click' 0x20 0x74 0x68 0x65 0x20 0x50 0x72 0x6F // ' the Pro' 0x6A 0x65 0x63 0x74 0x20 0x47 0x61 0x64 // 'ject Gad' 0x67 0x65 0x74 0x2E // 'get.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_25= ktpc6Project25 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_25, __HELP_NAME("CO--To see if it worked")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_25, __HELP_NAME("CO--To see if it worked")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon6 kgobProject kidPlay kidPlayProjectSounds 0x0 0x0 0x57415645 kwav6Project25 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_25, 0x0) GST(0) ITEM "kgobCalloutBalloon6" ITEM "ktpc6Project25" ITEM "kgobProject" ITEM "kidPlay" ITEM "kidPlayProjectSounds" ITEM "kwav6Project25" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_25, 0x0) BYTE 0x01 0x00 0x03 0x03 0x8C 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x6B 0x00 0x00 0x01 // '????k???' 0x00 0x00 0x00 0x00 0x1F 0x00 0x00 0x03 // '????????' 0x0B 0x00 0x00 0xFD 0x23 0x00 0x00 0x03 // '???#???' 0x00 0x00 0x00 0x00 0x5C 0x00 0x00 0x03 // '????\???' 0x0B 0x00 0x00 0xFD 0x6A 0x00 0x00 0x03 // '???j???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x2D 0x00 0x00 0x82 // '????-??' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1B, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x73 0x65 0x65 // '??To see' 0x20 0x69 0x66 0x20 0x69 0x74 0x20 0x77 // ' if it w' 0x6F 0x72 0x6B 0x65 0x64 0x2C 0x20 0x63 // 'orked, c' 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 // 'lick the' 0x20 0x50 0x6C 0x61 0x79 0x20 0x62 0x75 // ' Play bu' 0x74 0x74 0x6F 0x6E 0x2E 0x0D 0x0A 0x57 // 'tton.??W' 0x68 0x65 0x6E 0x20 0x79 0x6F 0x75 0x27 // 'hen you'' 0x72 0x65 0x20 0x72 0x65 0x61 0x64 0x79 // 're ready' 0x20 0x66 0x6F 0x72 0x20 0x74 0x68 0x65 // ' for the' 0x20 0x6E 0x65 0x78 0x74 0x20 0x73 0x74 // ' next st' 0x65 0x70 0x2C 0x20 0x63 0x6C 0x69 0x63 // 'ep, clic' 0x6B 0x20 0x74 0x68 0x65 0x20 0x50 0x72 // 'k the Pr' 0x6F 0x6A 0x65 0x63 0x74 0x20 0x47 0x61 // 'oject Ga' 0x64 0x67 0x65 0x74 0x2E // 'dget.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_26= ktpc6Project26 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_26, __HELP_NAME("CO--To see the steps 4")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_26, __HELP_NAME("CO--To see the steps 4")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon7 kgobProject kidGadgetHow kidPlayProjectSounds 0x0 0x0 0x57415645 kwav6Project26 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_26, 0x0) GST(0) ITEM "kgobCalloutBalloon7" ITEM "ktpc6Project26" ITEM "kgobProject" ITEM "kidGadgetHow" ITEM "kidPlayProjectSounds" ITEM "kwav6Project26" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_26, 0x0) BYTE 0x01 0x00 0x03 0x03 0x69 0x00 0x00 0x00 // '????i???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x3C 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0x40 // '????@??@' 0x01 0x00 0x00 0x00 0x53 0x00 0x00 0x40 // '????S??@' 0x00 0x00 0x00 0x00 0x55 0x00 0x00 0x40 // '????U??@' 0x02 0x00 0x00 0x00 0x6D 0x00 0x00 0x40 // '????m??@' 0x00 0x00 0x00 0x00 0x6F 0x00 0x00 0x40 // '????o??@' 0x03 0x00 0x00 0x00 0x8E 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x90 0x00 0x00 0x40 // '??????@' 0x04 0x00 0x00 0x00 0xA6 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0x80 // '????@??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x90 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0xC0 // '????@??' 0x05 0x00 0x00 0x00 0x55 0x00 0x00 0xC0 // '????U??' 0x05 0x00 0x00 0x00 0x6F 0x00 0x00 0xC0 // '????o??' 0x05 0x00 0x00 0x00 0x90 0x00 0x00 0xC0 // '??????' 0x05 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_23=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_23, 0x0) BYTE 0x03 0x03 0x43 0x6F 0x6E 0x67 0x72 0x61 // '??Congra' 0x74 0x75 0x6C 0x61 0x74 0x69 0x6F 0x6E // 'tulation' 0x73 0x21 0x20 0x20 0x59 0x6F 0x75 0x27 // 's! You'' 0x72 0x65 0x20 0x64 0x6F 0x6E 0x65 0x21 // 're done!' 0x20 0x20 0x57 0x68 0x61 0x74 0x20 0x77 // ' What w' 0x6F 0x75 0x6C 0x64 0x20 0x79 0x6F 0x75 // 'ould you' 0x20 0x6C 0x69 0x6B 0x65 0x20 0x74 0x6F // ' like to' 0x20 0x64 0x6F 0x20 0x6E 0x6F 0x77 0x3F // ' do now?' 0x0D 0x0A 0x01 0x09 0x57 0x6F 0x72 0x6B // '????Work' 0x20 0x6F 0x6E 0x20 0x79 0x6F 0x75 0x72 // ' on your' 0x20 0x6F 0x77 0x6E 0x3F 0x0D 0x0A 0x01 // ' own????' 0x09 0x53 0x74 0x61 0x72 0x74 0x20 0x61 // '?Start a' 0x6E 0x6F 0x74 0x68 0x65 0x72 0x20 0x70 // 'nother p' 0x72 0x6F 0x6A 0x65 0x63 0x74 0x3F 0x0D // 'roject??' 0x0A 0x01 0x09 0x47 0x6F 0x20 0x62 0x61 // '???Go ba' 0x63 0x6B 0x20 0x74 0x6F 0x20 0x74 0x68 // 'ck to th' 0x65 0x20 0x50 0x72 0x6F 0x6A 0x65 0x63 // 'e Projec' 0x74 0x73 0x20 0x52 0x6F 0x6F 0x6D 0x3F // 'ts Room?' 0x0D 0x0A 0x01 0x09 0x51 0x75 0x69 0x74 // '????Quit' 0x20 0x33 0x44 0x20 0x4D 0x6F 0x76 0x69 // ' 3D Movi' 0x65 0x20 0x4D 0x61 0x6B 0x65 0x72 0x3F // 'e Maker?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2E= ktpc6Project2E #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2E, __HELP_NAME("Tip: Sound Indicator")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2E, __HELP_NAME("Tip: Sound Indicator")) __HELP_PACK2 BO OSK LONG kgobBalloonHotGadgetHelp kgobProjectHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2E, 0x0) GST(0) ITEM "kgobBalloonHotGadgetHelp" ITEM "ktpc6Project2E" ITEM "kgobProjectHot" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2E, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD0 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x09 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x12 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x14 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xCB 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x14 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x8C 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x14 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x53 0x6F 0x75 // '??? Sou' 0x6E 0x64 0x20 0x49 0x6E 0x64 0x69 0x63 // 'nd Indic' 0x61 0x74 0x6F 0x72 0x0D 0x0A 0x57 0x68 // 'ator??Wh' 0x65 0x6E 0x20 0x79 0x6F 0x75 0x27 0x72 // 'en you'r' 0x65 0x20 0x61 0x74 0x20 0x61 0x20 0x66 // 'e at a f' 0x72 0x61 0x6D 0x65 0x20 0x77 0x68 0x65 // 'rame whe' 0x72 0x65 0x20 0x79 0x6F 0x75 0x20 0x68 // 're you h' 0x61 0x76 0x65 0x20 0x61 0x74 0x74 0x61 // 'ave atta' 0x63 0x68 0x65 0x64 0x20 0x73 0x6F 0x75 // 'ched sou' 0x6E 0x64 0x2C 0x20 0x79 0x6F 0x75 0x27 // 'nd, you'' 0x6C 0x6C 0x20 0x73 0x65 0x65 0x20 0x61 // 'll see a' 0x20 0x6D 0x75 0x73 0x69 0x63 0x20 0x6E // ' music n' 0x6F 0x74 0x65 0x20 0x6F 0x6E 0x20 0x74 // 'ote on t' 0x68 0x65 0x20 0x73 0x6C 0x69 0x64 0x69 // 'he slidi' 0x6E 0x67 0x20 0x70 0x61 0x72 0x74 0x20 // 'ng part ' 0x6F 0x66 0x20 0x74 0x68 0x65 0x20 0x46 // 'of the F' 0x72 0x61 0x6D 0x65 0x20 0x53 0x6C 0x69 // 'rame Sli' 0x64 0x65 0x72 0x2E 0x20 0x20 0x59 0x6F // 'der. Yo' 0x75 0x20 0x63 0x61 0x6E 0x20 0x61 0x74 // 'u can at' 0x74 0x61 0x63 0x68 0x20 0x73 0x6F 0x75 // 'tach sou' 0x6E 0x64 0x73 0x20 0x74 0x6F 0x20 0x61 // 'nds to a' 0x20 0x62 0x61 0x63 0x6B 0x67 0x72 0x6F // ' backgro' 0x75 0x6E 0x64 0x2C 0x20 0x61 0x63 0x74 // 'und, act' 0x6F 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 // 'or, prop' 0x2C 0x20 0x6F 0x72 0x20 0x33 0x44 0x20 // ', or 3D ' 0x77 0x6F 0x72 0x64 0x2E // 'word.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_4F= ktpc6Project4F #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4F, __HELP_NAME("Def: Turn on")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4F, __HELP_NAME("Def: Turn on")) __HELP_PACK2 BO OSK LONG kgobBalloonHotGadgetHelp kgobProjectHot 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 kwav6Project4F ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_24=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4F, 0x0) GST(0) ITEM "kgobBalloonHotGadgetHelp" ITEM "ktpc6Project4F" ITEM "kgobProjectHot" ITEM "" ITEM "" ITEM "kwav6Project4F" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_24=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4F, 0x0) BYTE 0x01 0x00 0x03 0x03 0xCE 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_24=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_24, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x10 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x07 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x09 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x20 0x00 0x00 0x01 // '???? ???' 0x00 0x00 0x00 0x00 0x22 0x00 0x00 0x01 // '????"???' 0x01 0x00 0x00 0x00 0xCA 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x09 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x20 0x00 0x00 0x03 // '??? ???' 0x00 0x00 0x00 0x00 0x68 0x00 0x00 0x03 // '????h???' 0x0A 0x00 0x00 0xFD 0x80 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x09 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x2F 0x00 0x00 0x80 // '????/??' 0x00 0x00 0x03 0x00 0x68 0x00 0x00 0x80 // '????h??' 0x00 0x00 0x02 0x00 0x95 0x00 0x00 0x80 // '??????' 0x00 0x00 0x03 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x95 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_24=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_24, 0x0) BYTE 0x03 0x03 0x54 0x75 0x72 0x6E 0x20 0x6F // '??Turn o' 0x6E 0x0D 0x0A 0x54 0x6F 0x20 0x22 0x74 // 'n??To "t' 0x75 0x72 0x6E 0x20 0x6F 0x6E 0x22 0x20 // 'urn on" ' 0x74 0x68 0x65 0x20 0x62 0x75 0x74 0x74 // 'the butt' 0x6F 0x6E 0x0D 0x0A 0x95 0x09 0x43 0x6C // 'on???Cl' 0x69 0x63 0x6B 0x20 0x69 0x74 0x2E 0x0D // 'ick it.?' 0x0A 0x57 0x68 0x65 0x6E 0x20 0x22 0x6F // '?When "o' 0x6E 0x2C 0x22 0x20 0x74 0x68 0x65 0x20 // 'n," the ' 0x62 0x75 0x74 0x74 0x6F 0x6E 0x20 0x69 // 'button i' 0x73 0x20 0x70 0x75 0x73 0x68 0x65 0x64 // 's pushed' 0x20 0x69 0x6E 0x20 0x61 0x6E 0x64 0x20 // ' in and ' 0x74 0x68 0x65 0x20 0x6C 0x69 0x67 0x68 // 'the ligh' 0x74 0x20 0x69 0x73 0x20 0x6F 0x6E 0x2E // 't is on.' 0x0D 0x0A 0x54 0x6F 0x20 0x22 0x74 0x75 // '??To "tu' 0x72 0x6E 0x20 0x6F 0x66 0x66 0x22 0x20 // 'rn off" ' 0x74 0x68 0x65 0x20 0x62 0x75 0x74 0x74 // 'the butt' 0x6F 0x6E 0x0D 0x0A 0x95 0x09 0x43 0x6C // 'on???Cl' 0x69 0x63 0x6B 0x20 0x69 0x74 0x20 0x61 // 'ick it a' 0x67 0x61 0x69 0x6E 0x2E 0x0D 0x0A 0x57 // 'gain.??W' 0x68 0x65 0x6E 0x20 0x22 0x6F 0x66 0x66 // 'hen "off' 0x2C 0x22 0x20 0x74 0x68 0x65 0x20 0x62 // '," the b' 0x75 0x74 0x74 0x6F 0x6E 0x20 0x70 0x6F // 'utton po' 0x70 0x73 0x20 0x6F 0x75 0x74 0x20 0x61 // 'ps out a' 0x6E 0x64 0x20 0x74 0x68 0x65 0x20 0x6C // 'nd the l' 0x69 0x67 0x68 0x74 0x20 0x69 0x73 0x20 // 'ight is ' 0x6F 0x66 0x66 0x2E // 'off.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK ================================================ FILE: src/help/toolhelp.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ #undef __HELP_NAME #undef __HELP_SYMBOL #undef __HELP_PACK #undef __HELP_PACK2 #ifdef NO_HELP_NAMES #define __HELP_NAME(name) "" #else #define __HELP_NAME(name) name #endif #ifdef NO_HELP_SYMBOLS #define __HELP_SYMBOL(stuff) #else #define __HELP_SYMBOL(stuff) stuff #endif #ifdef PACK_HELP #define __HELP_PACK PACK #else #define __HELP_PACK #endif #ifdef HELP_SINGLE_CHUNK #define __HELP_PACK2 #else #define __HELP_PACK2 __HELP_PACK #endif SET _help_48544F50_0= thCameraAngles #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("thCameraAngles")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("thCameraAngles")) __HELP_PACK2 BO OSK LONG kgobHelpBookToolTopics 0x0 kidHelpAnchor kidPlayHelpSounds 0x0 0x0 0x57415645 kwavToolHelp00 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) GST(0) ITEM "kgobHelpBookToolTopics" ITEM "thCameraAngles" ITEM "" ITEM "kidHelpAnchor" ITEM "kidPlayHelpSounds" ITEM "kwavToolHelp00" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD2 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_4D=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4F, 0x0) AG(4) ITEM LONG 0x2000005 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSettingsCameras __HELP_SYMBOL( STN "mbmpSettingsCameras" ) ITEM LONG 0x40000001 VAR BYTE 2 LONG Tip___Undo __HELP_SYMBOL( STN "Tip___Undo" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG Def___Go_to_the_place __HELP_SYMBOL( STN "Def___Go_to_the_place" ) ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_4F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x21 0x00 0x00 0x00 0x01 0x00 0x00 0x01 // '!???????' 0x00 0xF6 0x00 0x00 0x03 0x00 0x00 0x01 // '???????' 0x01 0xF6 0x00 0x00 0x10 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x12 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x98 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x01 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x12 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0xBE 0x00 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0xDE 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0x90 0x01 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0x92 0x01 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0x94 0x01 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0x98 0x01 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0x03 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x10 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0xC0 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0xDA 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x22 0x01 0x00 0x04 // '????"???' 0x0D 0x00 0x00 0xFE 0x31 0x01 0x00 0x04 // '???1???' 0x00 0x00 0x00 0x00 0x22 0x01 0x00 0x40 // '????"??@' 0x04 0x00 0x00 0x00 0x31 0x01 0x00 0x40 // '????1??@' 0x00 0x00 0x00 0x00 0x92 0x01 0x00 0x40 // '??????@' 0x03 0x00 0x00 0x00 0x98 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xDC 0x00 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0x5E 0x01 0x00 0x80 // '????^??' 0x00 0x00 0x00 0x00 0x76 0x01 0x00 0x80 // '????v??' 0x00 0x00 0x02 0x00 0x92 0x01 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x92 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x02 0x00 0x00 0x00 0x92 0x01 0x00 0xC0 // '??????' 0x05 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4F, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x43 0x61 0x6D // '??? Cam' 0x65 0x72 0x61 0x20 0x41 0x6E 0x67 0x6C // 'era Angl' 0x65 0x73 0x0D 0x0A 0x49 0x6D 0x61 0x67 // 'es??Imag' 0x69 0x6E 0x65 0x20 0x74 0x68 0x65 0x72 // 'ine ther' 0x65 0x20 0x61 0x72 0x65 0x20 0x64 0x69 // 'e are di' 0x66 0x66 0x65 0x72 0x65 0x6E 0x74 0x20 // 'fferent ' 0x63 0x61 0x6D 0x65 0x72 0x61 0x73 0x20 // 'cameras ' 0x70 0x6F 0x73 0x69 0x74 0x69 0x6F 0x6E // 'position' 0x65 0x64 0x20 0x61 0x72 0x6F 0x75 0x6E // 'ed aroun' 0x64 0x20 0x61 0x20 0x6D 0x6F 0x76 0x69 // 'd a movi' 0x65 0x20 0x73 0x65 0x74 0x2E 0x20 0x20 // 'e set. ' 0x57 0x68 0x65 0x6E 0x20 0x79 0x6F 0x75 // 'When you' 0x20 0x63 0x68 0x61 0x6E 0x67 0x65 0x20 // ' change ' 0x63 0x61 0x6D 0x65 0x72 0x61 0x20 0x61 // 'camera a' 0x6E 0x67 0x6C 0x65 0x73 0x20 0x79 0x6F // 'ngles yo' 0x75 0x20 0x61 0x72 0x65 0x6E 0x27 0x74 // 'u aren't' 0x20 0x63 0x68 0x61 0x6E 0x67 0x69 0x6E // ' changin' 0x67 0x20 0x74 0x68 0x65 0x20 0x73 0x63 // 'g the sc' 0x65 0x6E 0x65 0x97 0x79 0x6F 0x75 0x27 // 'eneyou'' 0x72 0x65 0x20 0x6A 0x75 0x73 0x74 0x20 // 're just ' 0x63 0x68 0x61 0x6E 0x67 0x69 0x6E 0x67 // 'changing' 0x20 0x74 0x68 0x65 0x20 0x76 0x69 0x65 // ' the vie' 0x77 0x20 0x6F 0x66 0x20 0x74 0x68 0x61 // 'w of tha' 0x74 0x20 0x73 0x63 0x65 0x6E 0x65 0x2E // 't scene.' 0x0D 0x0A 0x54 0x6F 0x20 0x63 0x68 0x61 // '??To cha' 0x6E 0x67 0x65 0x20 0x74 0x68 0x65 0x20 // 'nge the ' 0x63 0x61 0x6D 0x65 0x72 0x61 0x20 0x61 // 'camera a' 0x6E 0x67 0x6C 0x65 0x0D 0x0A 0x31 0x09 // 'ngle??1?' 0x49 0x66 0x20 0x79 0x6F 0x75 0x20 0x73 // 'If you s' 0x65 0x65 0x20 0x74 0x68 0x65 0x20 0x53 // 'ee the S' 0x63 0x65 0x6E 0x65 0x73 0x20 0x62 0x75 // 'cenes bu' 0x74 0x74 0x6F 0x6E 0x20 0x61 0x74 0x20 // 'tton at ' 0x74 0x68 0x65 0x20 0x74 0x6F 0x70 0x20 // 'the top ' 0x6F 0x66 0x20 0x74 0x68 0x65 0x20 0x73 // 'of the s' 0x63 0x72 0x65 0x65 0x6E 0x2C 0x20 0x63 // 'creen, c' 0x6C 0x69 0x63 0x6B 0x20 0x69 0x74 0x2E // 'lick it.' 0x0D 0x0A 0x32 0x09 0x47 0x6F 0x20 0x74 // '??2?Go t' 0x6F 0x20 0x74 0x68 0x65 0x20 0x70 0x6C // 'o the pl' 0x61 0x63 0x65 0x20 0x77 0x68 0x65 0x72 // 'ace wher' 0x65 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 // 'e you wa' 0x6E 0x74 0x20 0x74 0x6F 0x20 0x63 0x68 // 'nt to ch' 0x61 0x6E 0x67 0x65 0x20 0x74 0x68 0x65 // 'ange the' 0x20 0x63 0x61 0x6D 0x65 0x72 0x61 0x20 // ' camera ' 0x61 0x6E 0x67 0x6C 0x65 0x2E 0x0D 0x0A // 'angle.??' 0x33 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 // '3?Click ' 0x43 0x61 0x6D 0x65 0x72 0x61 0x20 0x41 // 'Camera A' 0x6E 0x67 0x6C 0x65 0x73 0x2E 0x0D 0x0A // 'ngles.??' 0x34 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 // '4?Click ' 0x74 0x68 0x65 0x20 0x76 0x69 0x65 0x77 // 'the view' 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E // ' you wan' 0x74 0x2E 0x0D 0x0A 0x01 0x20 0x55 0x6E // 't.??? Un' 0x64 0x6F // 'do' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1= thSceneChoices #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("thSceneChoices")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("thSceneChoices")) __HELP_PACK2 BO OSK LONG kgobHelpBookToolTopics 0x0 kidHelpAnchor kidPlayHelpSounds 0x0 0x0 0x57415645 kwavToolHelp01 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) GST(0) ITEM "kgobHelpBookToolTopics" ITEM "thSceneChoices" ITEM "" ITEM "kidHelpAnchor" ITEM "kidPlayHelpSounds" ITEM "kwavToolHelp01" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_4C=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4E, 0x0) AG(4) ITEM LONG 0x2000006 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ITEM LONG 0x40000001 VAR BYTE 3 LONG Tip___Change_Camera_Angle __HELP_SYMBOL( STN "Tip___Change_Camera_Angle" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG Tip___Moving_Scene_to_Scene __HELP_SYMBOL( STN "Tip___Moving_Scene_to_Scene" ) ITEM LONG 0xC0000003 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSceneChoices __HELP_SYMBOL( STN "mbmpSceneChoices" ) ITEM LONG 0x40000001 VAR BYTE 2 LONG Tip___Undo __HELP_SYMBOL( STN "Tip___Undo" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG Def___frame __HELP_SYMBOL( STN "Def___frame" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_4E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x2C 0x00 0x00 0x00 0x01 0x00 0x00 0x01 // ',???????' 0x01 0x00 0x00 0x00 0x02 0x00 0x00 0x01 // '????????' 0x01 0xF6 0x00 0x00 0x0F 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x4A 0x01 0x00 0x01 // '????J???' 0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x11 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x33 0x00 0x00 0x02 // '????3???' 0x01 0x00 0x00 0x00 0x4A 0x00 0x00 0x02 // '????J???' 0x00 0x00 0x00 0x00 0x93 0x00 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0xB0 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0x07 0x01 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x09 0x01 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x11 0x01 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x13 0x01 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x2E 0x01 0x00 0x02 // '????.???' 0x00 0x00 0x00 0x00 0x30 0x01 0x00 0x02 // '????0???' 0x01 0x00 0x00 0x00 0x4A 0x01 0x00 0x02 // '????J???' 0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x02 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x0F 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x35 0x00 0x00 0x03 // '????5???' 0x0A 0x00 0x00 0xFD 0x46 0x00 0x00 0x03 // '???F???' 0x00 0x00 0x00 0x00 0x94 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0xA1 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0xEC 0x00 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xF1 0x00 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xEC 0x00 0x00 0x40 // '??????@' 0x07 0x00 0x00 0x00 0xF1 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x09 0x01 0x00 0x40 // '???????@' 0x06 0x00 0x00 0x00 0x0F 0x01 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x11 0x01 0x00 0x40 // '???????@' 0x02 0x00 0x00 0x00 0x2C 0x01 0x00 0x40 // '????,??@' 0x00 0x00 0x00 0x00 0x2E 0x01 0x00 0x40 // '????.??@' 0x03 0x00 0x00 0x00 0x4A 0x01 0x00 0x40 // '????J??@' 0x00 0x00 0x00 0x00 0x48 0x00 0x00 0x80 // '????H??' 0x00 0x00 0x02 0x00 0xC1 0x00 0x00 0x80 // '??????' 0x00 0x00 0x03 0x00 0x09 0x01 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x11 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x09 0x01 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x05 0x00 0x00 0x00 0x09 0x01 0x00 0xC0 // '???????' 0x04 0x00 0x00 0x00 0x11 0x01 0x00 0xC0 // '???????' 0x04 0x00 0x00 0x00 0x2E 0x01 0x00 0xC0 // '????.??' 0x04 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4E, 0x0) BYTE 0x03 0x03 0x01 0x20 0x53 0x63 0x65 0x6E // '??? Scen' 0x65 0x20 0x43 0x68 0x6F 0x69 0x63 0x65 // 'e Choice' 0x73 0x0D 0x0A 0x43 0x68 0x6F 0x6F 0x73 // 's??Choos' 0x65 0x20 0x66 0x72 0x6F 0x6D 0x20 0x6D // 'e from m' 0x61 0x6E 0x79 0x20 0x64 0x69 0x66 0x66 // 'any diff' 0x65 0x72 0x65 0x6E 0x74 0x20 0x73 0x63 // 'erent sc' 0x65 0x6E 0x65 0x73 0x21 0x0D 0x0A 0x54 // 'enes!??T' 0x6F 0x20 0x63 0x68 0x6F 0x6F 0x73 0x65 // 'o choose' 0x20 0x61 0x20 0x73 0x63 0x65 0x6E 0x65 // ' a scene' 0x0D 0x0A 0x31 0x09 0x49 0x66 0x20 0x79 // '??1?If y' 0x6F 0x75 0x20 0x73 0x65 0x65 0x20 0x74 // 'ou see t' 0x68 0x65 0x20 0x53 0x63 0x65 0x6E 0x65 // 'he Scene' 0x73 0x20 0x62 0x75 0x74 0x74 0x6F 0x6E // 's button' 0x20 0x61 0x74 0x20 0x74 0x68 0x65 0x20 // ' at the ' 0x74 0x6F 0x70 0x20 0x6F 0x66 0x20 0x74 // 'top of t' 0x68 0x65 0x20 0x73 0x63 0x72 0x65 0x65 // 'he scree' 0x6E 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B // 'n, click' 0x20 0x69 0x74 0x2E 0x0D 0x0A 0x32 0x09 // ' it.??2?' 0x43 0x6C 0x69 0x63 0x6B 0x20 0x53 0x63 // 'Click Sc' 0x65 0x6E 0x65 0x20 0x43 0x68 0x6F 0x69 // 'ene Choi' 0x63 0x65 0x73 0x2E 0x0D 0x0A 0x33 0x09 // 'ces.??3?' 0x43 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 // 'Click th' 0x65 0x20 0x73 0x63 0x65 0x6E 0x65 0x20 // 'e scene ' 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 // 'you want' 0x2E 0x0D 0x0A 0x4E 0x65 0x77 0x20 0x73 // '.??New s' 0x63 0x65 0x6E 0x65 0x73 0x20 0x61 0x72 // 'cenes ar' 0x65 0x20 0x61 0x6C 0x77 0x61 0x79 0x73 // 'e always' 0x20 0x61 0x64 0x64 0x65 0x64 0x20 0x61 // ' added a' 0x66 0x74 0x65 0x72 0x20 0x74 0x68 0x65 // 'fter the' 0x20 0x6C 0x61 0x73 0x74 0x20 0x66 0x72 // ' last fr' 0x61 0x6D 0x65 0x20 0x6F 0x66 0x20 0x74 // 'ame of t' 0x68 0x65 0x20 0x63 0x75 0x72 0x72 0x65 // 'he curre' 0x6E 0x74 0x20 0x73 0x63 0x65 0x6E 0x65 // 'nt scene' 0x2E 0x0D 0x0A 0x01 0x20 0x55 0x6E 0x64 // '.??? Und' 0x6F 0x0D 0x0A 0x01 0x20 0x43 0x68 0x61 // 'o??? Cha' 0x6E 0x67 0x69 0x6E 0x67 0x20 0x74 0x68 // 'nging th' 0x65 0x20 0x63 0x61 0x6D 0x65 0x72 0x61 // 'e camera' 0x20 0x61 0x6E 0x67 0x6C 0x65 0x0D 0x0A // ' angle??' 0x01 0x20 0x4D 0x6F 0x76 0x69 0x6E 0x67 // '? Moving' 0x20 0x66 0x72 0x6F 0x6D 0x20 0x73 0x63 // ' from sc' 0x65 0x6E 0x65 0x20 0x74 0x6F 0x20 0x73 // 'ene to s' 0x63 0x65 0x6E 0x65 // 'cene' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2= thSceneOrganizer #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2, __HELP_NAME("thSceneOrganizer")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2, __HELP_NAME("thSceneOrganizer")) __HELP_PACK2 BO OSK LONG kgobHelpBookToolTopics 0x0 kidHelpAnchor kidPlayHelpSounds 0x0 0x0 0x57415645 kwavToolHelp02 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_6B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2, 0x0) GST(0) ITEM "kgobHelpBookToolTopics" ITEM "thSceneOrganizer" ITEM "" ITEM "kidHelpAnchor" ITEM "kidPlayHelpSounds" ITEM "kwavToolHelp02" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_25=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD2 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_3C=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_25, 0x0) AG(4) ITEM LONG 0x200000B VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSceneSorter __HELP_SYMBOL( STN "mbmpSceneSorter" ) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG Def___frame __HELP_SYMBOL( STN "Def___frame" ) ITEM LONG 0x40000001 VAR BYTE 2 LONG Def___transitions __HELP_SYMBOL( STN "Def___transitions" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_25=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_25, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x2E 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '.???????' 0x01 0xF6 0x00 0x00 0x12 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x14 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x77 0x01 0x00 0x01 // '????w???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x01 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x1E 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x30 0x00 0x00 0x02 // '????0???' 0x01 0x00 0x00 0x00 0x53 0x00 0x00 0x02 // '????S???' 0x00 0x00 0x00 0x00 0x54 0x00 0x00 0x02 // '????T???' 0x01 0x00 0x00 0x00 0x56 0x00 0x00 0x02 // '????V???' 0x00 0x00 0x00 0x00 0x57 0x00 0x00 0x02 // '????W???' 0x01 0x00 0x00 0x00 0x70 0x00 0x00 0x02 // '????p???' 0x00 0x00 0x00 0x00 0x81 0x00 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0x82 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0x90 0x00 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0x92 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0x93 0x00 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0xB0 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0xB1 0x00 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0xB9 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0xBC 0x00 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0xF9 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0x39 0x01 0x00 0x02 // '????9???' 0x00 0x00 0x00 0x00 0x3C 0x01 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0x45 0x00 0x00 0x02 // '????E???' 0x00 0x00 0x00 0x00 0x47 0x00 0x00 0x02 // '????G???' 0x01 0x00 0x00 0x00 0x55 0x00 0x00 0x02 // '????U???' 0x00 0x00 0x00 0x00 0x5F 0x00 0x00 0x02 // '????_???' 0x00 0x00 0x00 0x00 0x03 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0E 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x61 0x00 0x00 0x03 // '???a???' 0x0A 0x00 0x00 0xFD 0x6F 0x00 0x00 0x03 // '???o???' 0x0F 0x00 0x00 0xFD 0xBA 0x01 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x6F 0x00 0x00 0x04 // '????o???' 0x00 0x00 0x00 0x00 0x73 0x00 0x00 0x04 // '????s???' 0x0D 0x00 0x00 0xFE 0x82 0x00 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xC8 0x00 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xE0 0x00 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xF7 0x00 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x73 0x00 0x00 0x40 // '????s??@' 0x06 0x00 0x00 0x00 0x82 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xC8 0x00 0x00 0x40 // '??????@' 0x05 0x00 0x00 0x00 0xE0 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xF7 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xB4 0x01 0x00 0x40 // '??????@' 0x03 0x00 0x00 0x00 0xBA 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x71 0x00 0x00 0x80 // '????q??' 0x00 0x00 0x02 0x00 0x39 0x01 0x00 0x80 // '????9??' 0x00 0x00 0x02 0x00 0x0E 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xB4 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x02 0x00 0x00 0x00 0xB4 0x01 0x00 0xC0 // '??????' 0x07 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_39=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_39, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x43 0x6F 0x70 // '??? Cop' 0x79 0x20 0x50 0x61 0x74 0x68 0x0D 0x0A // 'y Path??' 0x43 0x6F 0x70 0x79 0x20 0x74 0x68 0x65 // 'Copy the' 0x20 0x70 0x61 0x74 0x68 0x20 0x6F 0x66 // ' path of' 0x20 0x61 0x6E 0x20 0x61 0x63 0x74 0x6F // ' an acto' 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 0x2C // 'r, prop,' 0x20 0x6F 0x72 0x20 0x33 0x44 0x20 0x77 // ' or 3D w' 0x6F 0x72 0x64 0x20 0x61 0x6E 0x64 0x20 // 'ord and ' 0x20 0x70 0x61 0x73 0x74 0x65 0x20 0x69 // ' paste i' 0x74 0x20 0x6F 0x6E 0x74 0x6F 0x20 0x61 // 't onto a' 0x6E 0x6F 0x74 0x68 0x65 0x72 0x20 0x33 // 'nother 3' 0x44 0x20 0x6F 0x62 0x6A 0x65 0x63 0x74 // 'D object' 0x2E 0x0D 0x0A 0x54 0x6F 0x20 0x63 0x6F // '.??To co' 0x70 0x79 0x20 0x61 0x20 0x70 0x61 0x74 // 'py a pat' 0x68 0x0D 0x0A 0x31 0x09 0x47 0x6F 0x20 // 'h??1?Go ' 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 0x70 // 'to the p' 0x6C 0x61 0x63 0x65 0x20 0x69 0x6E 0x20 // 'lace in ' 0x79 0x6F 0x75 0x72 0x20 0x6D 0x6F 0x76 // 'your mov' 0x69 0x65 0x20 0x77 0x68 0x65 0x72 0x65 // 'ie where' 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E // ' you wan' 0x74 0x20 0x74 0x6F 0x20 0x62 0x65 0x67 // 't to beg' 0x69 0x6E 0x20 0x63 0x6F 0x70 0x79 0x69 // 'in copyi' 0x6E 0x67 0x20 0x74 0x68 0x65 0x20 0x70 // 'ng the p' 0x61 0x74 0x68 0x2E 0x0D 0x0A 0x32 0x09 // 'ath.??2?' 0x43 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 // 'Click th' 0x65 0x20 0x43 0x75 0x74 0x2C 0x20 0x43 // 'e Cut, C' 0x6F 0x70 0x79 0x2C 0x20 0x26 0x20 0x50 // 'opy, & P' 0x61 0x73 0x74 0x65 0x20 0x54 0x6F 0x6F // 'aste Too' 0x6C 0x73 0x2E 0x0D 0x0A 0x33 0x09 0x43 // 'ls.??3?C' 0x6C 0x69 0x63 0x6B 0x20 0x43 0x6F 0x70 // 'lick Cop' 0x79 0x20 0x50 0x61 0x74 0x68 0x2E 0x0D // 'y Path.?' 0x0A 0x34 0x09 0x43 0x6C 0x69 0x63 0x6B // '?4?Click' 0x20 0x74 0x68 0x65 0x20 0x61 0x63 0x74 // ' the act' 0x6F 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 // 'or, prop' 0x2C 0x20 0x6F 0x72 0x20 0x33 0x44 0x20 // ', or 3D ' 0x77 0x6F 0x72 0x64 0x20 0x77 0x68 0x6F // 'word who' 0x73 0x65 0x20 0x70 0x61 0x74 0x68 0x20 // 'se path ' 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 // 'you want' 0x20 0x74 0x6F 0x20 0x63 0x6F 0x70 0x79 // ' to copy' 0x2E 0x0D 0x0A 0x35 0x09 0x43 0x6C 0x69 // '.??5?Cli' 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 0x43 // 'ck the C' 0x75 0x74 0x2C 0x20 0x43 0x6F 0x70 0x79 // 'ut, Copy' 0x2C 0x20 0x26 0x20 0x50 0x61 0x73 0x74 // ', & Past' 0x65 0x20 0x54 0x6F 0x6F 0x6C 0x73 0x2E // 'e Tools.' 0x0D 0x0A 0x36 0x09 0x43 0x6C 0x69 0x63 // '??6?Clic' 0x6B 0x20 0x50 0x61 0x73 0x74 0x65 0x2E // 'k Paste.' 0x0D 0x0A 0x37 0x09 0x43 0x6C 0x69 0x63 // '??7?Clic' 0x6B 0x20 0x74 0x68 0x65 0x20 0x61 0x63 // 'k the ac' 0x74 0x6F 0x72 0x2C 0x20 0x70 0x72 0x6F // 'tor, pro' 0x70 0x2C 0x20 0x6F 0x72 0x20 0x33 0x44 // 'p, or 3D' 0x20 0x77 0x6F 0x72 0x64 0x20 0x79 0x6F // ' word yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 // 'u want t' 0x6F 0x20 0x61 0x70 0x70 0x6C 0x79 0x20 // 'o apply ' 0x74 0x68 0x65 0x20 0x70 0x61 0x74 0x68 // 'the path' 0x20 0x74 0x6F 0x2E 0x0D 0x0A 0x01 0x20 // ' to.??? ' 0x55 0x6E 0x64 0x6F // 'Undo' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3F= thPaste #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3F, __HELP_NAME("thPaste")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3F, __HELP_NAME("thPaste")) __HELP_PACK2 BO OSK LONG kgobHelpBookToolTopics 0x0 kidHelpAnchor kidPlayHelpSounds 0x0 0x0 0x57415645 kwavToolHelp3F ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3F, 0x0) GST(0) ITEM "kgobHelpBookToolTopics" ITEM "thPaste" ITEM "" ITEM "kidHelpAnchor" ITEM "kidPlayHelpSounds" ITEM "kwavToolHelp3F" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3F, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2A=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2E, 0x0) AG(4) ITEM LONG 0x2000002 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpCCPPaste __HELP_SYMBOL( STN "mbmpCCPPaste" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG Def___Go_to_the_place __HELP_SYMBOL( STN "Def___Go_to_the_place" ) FREE ITEM LONG 0x40000001 VAR BYTE 3 LONG Key___Paste __HELP_SYMBOL( STN "Key___Paste" ) ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipKey 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipKey" ) FREE FREE ITEM LONG 0x40000001 VAR BYTE 2 LONG Def___Cut_Copy_Paste __HELP_SYMBOL( STN "Def___Cut_Copy_Paste" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_2E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x1D 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0xF6 0x00 0x00 0x08 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xF0 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0F 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x38 0x00 0x00 0x02 // '????8???' 0x00 0x00 0x00 0x00 0x03 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0A 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x3B 0x00 0x00 0x03 // '???;???' 0x0A 0x00 0x00 0xFD 0x4D 0x00 0x00 0x03 // '???M???' 0x0F 0x00 0x00 0xFD 0xF0 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x4D 0x00 0x00 0x04 // '????M???' 0x00 0x00 0x00 0x00 0x51 0x00 0x00 0x04 // '????Q???' 0x0D 0x00 0x00 0xFE 0x60 0x00 0x00 0x04 // '???`???' 0x00 0x00 0x00 0x00 0x95 0x00 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xAD 0x00 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0xAE 0x00 0x00 0x04 // '???????' 0x00 0x00 0x00 0x00 0x51 0x00 0x00 0x40 // '????Q??@' 0x03 0x00 0x00 0x00 0x60 0x00 0x00 0x40 // '????`??@' 0x00 0x00 0x00 0x00 0x95 0x00 0x00 0x40 // '??????@' 0x09 0x00 0x00 0x00 0xAD 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xAE 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xE2 0x00 0x00 0x40 // '??????@' 0x05 0x00 0x00 0x00 0xF0 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x4F 0x00 0x00 0x80 // '????O??' 0x00 0x00 0x02 0x00 0x3B 0x00 0x00 0x82 // '????;??' 0x05 0x00 0x00 0x00 0xE2 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x02 0x00 0x00 0x00 0xE2 0x00 0x00 0xC0 // '??????' 0x06 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2E, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x50 0x61 0x73 // '??? Pas' 0x74 0x65 0x0D 0x0A 0x50 0x61 0x73 0x74 // 'te??Past' 0x65 0x20 0x77 0x68 0x61 0x74 0x65 0x76 // 'e whatev' 0x65 0x72 0x20 0x79 0x6F 0x75 0x20 0x6D // 'er you m' 0x6F 0x73 0x74 0x20 0x72 0x65 0x63 0x65 // 'ost rece' 0x6E 0x74 0x6C 0x79 0x20 0x63 0x75 0x74 // 'ntly cut' 0x20 0x6F 0x72 0x20 0x63 0x6F 0x70 0x69 // ' or copi' 0x65 0x64 0x2E 0x0D 0x0A 0x54 0x6F 0x20 // 'ed.??To ' 0x70 0x61 0x73 0x74 0x65 0x20 0x73 0x6F // 'paste so' 0x6D 0x65 0x74 0x68 0x69 0x6E 0x67 0x0D // 'mething?' 0x0A 0x31 0x09 0x47 0x6F 0x20 0x74 0x6F // '?1?Go to' 0x20 0x74 0x68 0x65 0x20 0x70 0x6C 0x61 // ' the pla' 0x63 0x65 0x20 0x69 0x6E 0x20 0x79 0x6F // 'ce in yo' 0x75 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 // 'ur movie' 0x20 0x77 0x68 0x65 0x72 0x65 0x20 0x79 // ' where y' 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 // 'ou want ' 0x74 0x6F 0x20 0x70 0x61 0x73 0x74 0x65 // 'to paste' 0x2E 0x0D 0x0A 0x32 0x09 0x43 0x6C 0x69 // '.??2?Cli' 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 0x43 // 'ck the C' 0x75 0x74 0x2C 0x20 0x43 0x6F 0x70 0x79 // 'ut, Copy' 0x2C 0x20 0x26 0x20 0x50 0x61 0x73 0x74 // ', & Past' 0x65 0x20 0x54 0x6F 0x6F 0x6C 0x73 0x2E // 'e Tools.' 0x0D 0x0A 0x33 0x09 0x43 0x6C 0x69 0x63 // '??3?Clic' 0x6B 0x20 0x50 0x61 0x73 0x74 0x65 0x2E // 'k Paste.' 0x0D 0x0A 0x34 0x09 0x43 0x6C 0x69 0x63 // '??4?Clic' 0x6B 0x20 0x77 0x68 0x65 0x72 0x65 0x20 // 'k where ' 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 // 'you want' 0x20 0x74 0x6F 0x20 0x70 0x61 0x73 0x74 // ' to past' 0x65 0x2E 0x0D 0x0A 0x01 0x20 0x53 0x68 // 'e.??? Sh' 0x6F 0x72 0x74 0x63 0x75 0x74 0x20 0x6B // 'ortcut k' 0x65 0x79 // 'ey' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_40= thCopy #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_40, __HELP_NAME("thCopy")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_40, __HELP_NAME("thCopy")) __HELP_PACK2 BO OSK LONG kgobHelpBookToolTopics 0x0 kidHelpAnchor kidPlayHelpSounds 0x0 0x0 0x57415645 kwavToolHelp40 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_68=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_40, 0x0) GST(0) ITEM "kgobHelpBookToolTopics" ITEM "thCopy" ITEM "" ITEM "kidHelpAnchor" ITEM "kidPlayHelpSounds" ITEM "kwavToolHelp40" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_68=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_40, 0x0) BYTE 0x01 0x00 0x03 0x03 0x55 0x01 0x00 0x00 // '????U???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2C=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_68, 0x0) AG(4) ITEM LONG 0x2000005 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpCCPCopy __HELP_SYMBOL( STN "mbmpCCPCopy" ) ITEM LONG 0x40000001 VAR BYTE 4 LONG Tip___Copy_until_end_of_scene __HELP_SYMBOL( STN "Tip___Copy_until_end_of_scene" ) FREE ITEM LONG 0x40000001 VAR BYTE 3 LONG Def___drag __HELP_SYMBOL( STN "Def___drag" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG Def___Go_to_the_place __HELP_SYMBOL( STN "Def___Go_to_the_place" ) ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) FREE ITEM LONG 0x40000001 VAR BYTE 2 LONG Def___Cut_Copy_Paste __HELP_SYMBOL( STN "Def___Cut_Copy_Paste" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_68=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_68, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x2A 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '*???????' 0x01 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0xF6 0x00 0x00 0x07 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xED 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0C 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x0D 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0E 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x23 0x00 0x00 0x02 // '????#???' 0x01 0x00 0x00 0x00 0x24 0x00 0x00 0x02 // '????$???' 0x00 0x00 0x00 0x00 0x32 0x00 0x00 0x02 // '????2???' 0x01 0x00 0x00 0x00 0x45 0x00 0x00 0x02 // '????E???' 0x00 0x00 0x00 0x00 0x47 0x00 0x00 0x02 // '????G???' 0x01 0x00 0x00 0x00 0x4C 0x00 0x00 0x02 // '????L???' 0x00 0x00 0x00 0x00 0x03 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x09 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x4E 0x00 0x00 0x03 // '???N???' 0x0A 0x00 0x00 0xFD 0x55 0x00 0x00 0x03 // '???U???' 0x0F 0x00 0x00 0xFD 0xED 0x01 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x59 0x00 0x00 0x04 // '????Y???' 0x0D 0x00 0x00 0xFE 0x68 0x00 0x00 0x04 // '???h???' 0x00 0x00 0x00 0x00 0x9C 0x00 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xB4 0x00 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0x9A 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0x9E 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0x59 0x00 0x00 0x40 // '????Y??@' 0x06 0x00 0x00 0x00 0x68 0x00 0x00 0x40 // '????h??@' 0x00 0x00 0x00 0x00 0x9C 0x00 0x00 0x40 // '??????@' 0x09 0x00 0x00 0x00 0xB4 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x9A 0x01 0x00 0x40 // '??????@' 0x05 0x00 0x00 0x00 0x9E 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xCB 0x01 0x00 0x40 // '??????@' 0x03 0x00 0x00 0x00 0xED 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x57 0x00 0x00 0x80 // '????W??' 0x00 0x00 0x02 0x00 0xFD 0x00 0x00 0x80 // '??????' 0x00 0x00 0x03 0x00 0xCB 0x01 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0x4E 0x00 0x00 0x82 // '????N??' 0x05 0x00 0x00 0x00 0xC6 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x7B 0x01 0x00 0x82 // '????{??' 0x05 0x00 0x00 0x00 0xCB 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x02 0x00 0x00 0x00 0xCB 0x01 0x00 0xC0 // '??????' 0x07 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_68=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_68, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x43 0x6F 0x70 // '??? Cop' 0x79 0x0D 0x0A 0x43 0x6F 0x70 0x79 0x20 // 'y??Copy ' 0x73 0x6F 0x6D 0x65 0x74 0x68 0x69 0x6E // 'somethin' 0x67 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 // 'g you wa' 0x6E 0x74 0x20 0x74 0x6F 0x20 0x64 0x75 // 'nt to du' 0x70 0x6C 0x69 0x63 0x61 0x74 0x65 0x20 // 'plicate ' 0x61 0x6E 0x64 0x20 0x70 0x61 0x73 0x74 // 'and past' 0x65 0x20 0x69 0x6E 0x20 0x61 0x6E 0x6F // 'e in ano' 0x74 0x68 0x65 0x72 0x20 0x6C 0x6F 0x63 // 'ther loc' 0x61 0x74 0x69 0x6F 0x6E 0x2E 0x0D 0x0A // 'ation.??' 0x54 0x6F 0x20 0x63 0x6F 0x70 0x79 0x0D // 'To copy?' 0x0A 0x31 0x09 0x47 0x6F 0x20 0x74 0x6F // '?1?Go to' 0x20 0x74 0x68 0x65 0x20 0x70 0x6C 0x61 // ' the pla' 0x63 0x65 0x20 0x69 0x6E 0x20 0x79 0x6F // 'ce in yo' 0x75 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 // 'ur movie' 0x20 0x77 0x68 0x65 0x72 0x65 0x20 0x79 // ' where y' 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 // 'ou want ' 0x74 0x6F 0x20 0x63 0x6F 0x70 0x79 0x2E // 'to copy.' 0x0D 0x0A 0x32 0x09 0x43 0x6C 0x69 0x63 // '??2?Clic' 0x6B 0x20 0x74 0x68 0x65 0x20 0x43 0x75 // 'k the Cu' 0x74 0x2C 0x20 0x43 0x6F 0x70 0x79 0x2C // 't, Copy,' 0x20 0x26 0x20 0x50 0x61 0x73 0x74 0x65 // ' & Paste' 0x20 0x54 0x6F 0x6F 0x6C 0x73 0x2E 0x0D // ' Tools.?' 0x0A 0x33 0x09 0x43 0x6C 0x69 0x63 0x6B // '?3?Click' 0x20 0x43 0x6F 0x70 0x79 0x2E 0x0D 0x0A // ' Copy.??' 0x34 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 // '4?Click ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x6F // 'the acto' 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 0x2C // 'r, prop,' 0x20 0x6F 0x72 0x20 0x33 0x44 0x20 0x77 // ' or 3D w' 0x6F 0x72 0x64 0x20 0x79 0x6F 0x75 0x20 // 'ord you ' 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 // 'want to ' 0x63 0x6F 0x70 0x79 0x2E 0x0D 0x0A 0x2D // 'copy.??-' 0x2D 0x6F 0x72 0x2D 0x2D 0x0D 0x0A 0x54 // '-or--??T' 0x6F 0x20 0x63 0x6F 0x70 0x79 0x20 0x61 // 'o copy a' 0x6E 0x20 0x65 0x6E 0x74 0x69 0x72 0x65 // 'n entire' 0x20 0x77 0x6F 0x72 0x64 0x20 0x62 0x6F // ' word bo' 0x78 0x2C 0x20 0x6D 0x6F 0x76 0x65 0x20 // 'x, move ' 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 0x73 // 'the mous' 0x65 0x20 0x63 0x75 0x72 0x73 0x6F 0x72 // 'e cursor' 0x20 0x6F 0x76 0x65 0x72 0x20 0x61 0x20 // ' over a ' 0x77 0x6F 0x72 0x64 0x20 0x62 0x6F 0x78 // 'word box' 0x20 0x65 0x64 0x67 0x65 0x20 0x75 0x6E // ' edge un' 0x74 0x69 0x6C 0x20 0x79 0x6F 0x75 0x20 // 'til you ' 0x73 0x65 0x65 0x20 0x74 0x68 0x65 0x20 // 'see the ' 0x63 0x61 0x6D 0x65 0x72 0x61 0x2C 0x20 // 'camera, ' 0x74 0x68 0x65 0x6E 0x20 0x63 0x6C 0x69 // 'then cli' 0x63 0x6B 0x2E 0x0D 0x0A 0x2D 0x2D 0x6F // 'ck.??--o' 0x72 0x2D 0x2D 0x0D 0x0A 0x54 0x6F 0x20 // 'r--??To ' 0x63 0x6F 0x70 0x79 0x20 0x6C 0x65 0x74 // 'copy let' 0x74 0x65 0x72 0x73 0x20 0x69 0x6E 0x20 // 'ters in ' 0x61 0x20 0x77 0x6F 0x72 0x64 0x20 0x62 // 'a word b' 0x6F 0x78 0x2C 0x20 0x64 0x72 0x61 0x67 // 'ox, drag' 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 // ' the mou' 0x73 0x65 0x20 0x6F 0x76 0x65 0x72 0x20 // 'se over ' 0x74 0x68 0x65 0x20 0x77 0x6F 0x72 0x64 // 'the word' 0x73 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 // 's you wa' 0x6E 0x74 0x20 0x74 0x6F 0x20 0x63 0x6F // 'nt to co' 0x70 0x79 0x2E 0x0D 0x0A 0x01 0x20 0x43 // 'py.??? C' 0x6F 0x70 0x79 0x69 0x6E 0x67 0x20 0x75 // 'opying u' 0x6E 0x74 0x69 0x6C 0x20 0x74 0x68 0x65 // 'ntil the' 0x20 0x65 0x6E 0x64 0x20 0x6F 0x66 0x20 // ' end of ' 0x61 0x20 0x73 0x63 0x65 0x6E 0x65 // 'a scene' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_41= thCut #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_41, __HELP_NAME("thCut")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_41, __HELP_NAME("thCut")) __HELP_PACK2 BO OSK LONG kgobHelpBookToolTopics 0x0 kidHelpAnchor kidPlayHelpSounds 0x0 0x0 0x57415645 kwavToolHelp41 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_5F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_41, 0x0) GST(0) ITEM "kgobHelpBookToolTopics" ITEM "thCut" ITEM "" ITEM "kidHelpAnchor" ITEM "kidPlayHelpSounds" ITEM "kwavToolHelp41" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_5F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_41, 0x0) BYTE 0x01 0x00 0x03 0x03 0x4A 0x01 0x00 0x00 // '????J???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_58=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5F, 0x0) AG(4) ITEM LONG 0x2000002 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ITEM LONG 0x40000001 VAR BYTE 4 LONG Tip___Cut_until_end_of_scene __HELP_SYMBOL( STN "Tip___Cut_until_end_of_scene" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpCCPCut __HELP_SYMBOL( STN "mbmpCCPCut" ) FREE ITEM LONG 0x40000001 VAR BYTE 2 LONG Def___Cut_Copy_Paste __HELP_SYMBOL( STN "Def___Cut_Copy_Paste" ) ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG Def___Go_to_the_place __HELP_SYMBOL( STN "Def___Go_to_the_place" ) ITEM LONG 0x40000001 VAR BYTE 3 LONG Def___drag __HELP_SYMBOL( STN "Def___drag" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_5F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x23 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '#???????' 0x01 0xF6 0x00 0x00 0x06 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xDD 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0B 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0C 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x03 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x08 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x4B 0x00 0x00 0x03 // '???K???' 0x0A 0x00 0x00 0xFD 0x51 0x00 0x00 0x03 // '???Q???' 0x0F 0x00 0x00 0xFD 0xDD 0x01 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x55 0x00 0x00 0x04 // '????U???' 0x0D 0x00 0x00 0xFE 0x64 0x00 0x00 0x04 // '???d???' 0x00 0x00 0x00 0x00 0x97 0x00 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xAF 0x00 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0x8B 0x01 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0x8F 0x01 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0x55 0x00 0x00 0x40 // '????U??@' 0x08 0x00 0x00 0x00 0x64 0x00 0x00 0x40 // '????d??@' 0x00 0x00 0x00 0x00 0x97 0x00 0x00 0x40 // '??????@' 0x05 0x00 0x00 0x00 0xAF 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x8B 0x01 0x00 0x40 // '??????@' 0x09 0x00 0x00 0x00 0x8F 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xBB 0x01 0x00 0x40 // '??????@' 0x02 0x00 0x00 0x00 0xDD 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x53 0x00 0x00 0x80 // '????S??' 0x00 0x00 0x02 0x00 0xF6 0x00 0x00 0x80 // '??????' 0x00 0x00 0x03 0x00 0xBB 0x01 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0x4B 0x00 0x00 0x82 // '????K??' 0x05 0x00 0x00 0x00 0xC0 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x6D 0x01 0x00 0x82 // '????m??' 0x05 0x00 0x00 0x00 0xBB 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x03 0x00 0x00 0x00 0xBB 0x01 0x00 0xC0 // '??????' 0x06 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_5F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5F, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x43 0x75 0x74 // '??? Cut' 0x0D 0x0A 0x43 0x75 0x74 0x20 0x73 0x6F // '??Cut so' 0x6D 0x65 0x74 0x68 0x69 0x6E 0x67 0x20 // 'mething ' 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 // 'you want' 0x20 0x74 0x6F 0x20 0x67 0x65 0x74 0x20 // ' to get ' 0x72 0x69 0x64 0x20 0x6F 0x66 0x20 0x6F // 'rid of o' 0x72 0x20 0x6D 0x6F 0x76 0x65 0x20 0x74 // 'r move t' 0x6F 0x20 0x61 0x6E 0x6F 0x74 0x68 0x65 // 'o anothe' 0x72 0x20 0x6C 0x6F 0x63 0x61 0x74 0x69 // 'r locati' 0x6F 0x6E 0x2E 0x0D 0x0A 0x54 0x6F 0x20 // 'on.??To ' 0x63 0x75 0x74 0x0D 0x0A 0x31 0x09 0x47 // 'cut??1?G' 0x6F 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 // 'o to the' 0x20 0x70 0x6C 0x61 0x63 0x65 0x20 0x69 // ' place i' 0x6E 0x20 0x79 0x6F 0x75 0x72 0x20 0x6D // 'n your m' 0x6F 0x76 0x69 0x65 0x20 0x77 0x68 0x65 // 'ovie whe' 0x72 0x65 0x20 0x79 0x6F 0x75 0x20 0x77 // 're you w' 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 0x63 // 'ant to c' 0x75 0x74 0x2E 0x0D 0x0A 0x32 0x09 0x43 // 'ut.??2?C' 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 // 'lick the' 0x20 0x43 0x75 0x74 0x2C 0x20 0x43 0x6F // ' Cut, Co' 0x70 0x79 0x2C 0x20 0x26 0x20 0x50 0x61 // 'py, & Pa' 0x73 0x74 0x65 0x20 0x54 0x6F 0x6F 0x6C // 'ste Tool' 0x73 0x2E 0x0D 0x0A 0x33 0x09 0x43 0x6C // 's.??3?Cl' 0x69 0x63 0x6B 0x20 0x43 0x75 0x74 0x2E // 'ick Cut.' 0x0D 0x0A 0x34 0x09 0x43 0x6C 0x69 0x63 // '??4?Clic' 0x6B 0x20 0x74 0x68 0x65 0x20 0x61 0x63 // 'k the ac' 0x74 0x6F 0x72 0x2C 0x20 0x70 0x72 0x6F // 'tor, pro' 0x70 0x2C 0x20 0x6F 0x72 0x20 0x33 0x44 // 'p, or 3D' 0x20 0x77 0x6F 0x72 0x64 0x20 0x79 0x6F // ' word yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 // 'u want t' 0x6F 0x20 0x63 0x75 0x74 0x2E 0x0D 0x0A // 'o cut.??' 0x54 0x6F 0x20 0x63 0x75 0x74 0x20 0x61 // 'To cut a' 0x6E 0x20 0x65 0x6E 0x74 0x69 0x72 0x65 // 'n entire' 0x20 0x77 0x6F 0x72 0x64 0x20 0x62 0x6F // ' word bo' 0x78 0x2C 0x20 0x6D 0x6F 0x76 0x65 0x20 // 'x, move ' 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 0x73 // 'the mous' 0x65 0x20 0x63 0x75 0x72 0x73 0x6F 0x72 // 'e cursor' 0x20 0x6F 0x76 0x65 0x72 0x20 0x61 0x20 // ' over a ' 0x77 0x6F 0x72 0x64 0x20 0x62 0x6F 0x78 // 'word box' 0x20 0x65 0x64 0x67 0x65 0x20 0x75 0x6E // ' edge un' 0x74 0x69 0x6C 0x20 0x79 0x6F 0x75 0x20 // 'til you ' 0x73 0x65 0x65 0x20 0x74 0x68 0x65 0x20 // 'see the ' 0x73 0x63 0x69 0x73 0x73 0x6F 0x72 0x73 // 'scissors' 0x2C 0x20 0x74 0x68 0x65 0x6E 0x20 0x63 // ', then c' 0x6C 0x69 0x63 0x6B 0x2E 0x0D 0x0A 0x2D // 'lick.??-' 0x2D 0x6F 0x72 0x2D 0x2D 0x0D 0x0A 0x54 // '-or--??T' 0x6F 0x20 0x63 0x75 0x74 0x20 0x6C 0x65 // 'o cut le' 0x74 0x74 0x65 0x72 0x73 0x20 0x69 0x6E // 'tters in' 0x20 0x61 0x20 0x77 0x6F 0x72 0x64 0x20 // ' a word ' 0x62 0x6F 0x78 0x2C 0x20 0x64 0x72 0x61 // 'box, dra' 0x67 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F // 'g the mo' 0x75 0x73 0x65 0x20 0x6F 0x76 0x65 0x72 // 'use over' 0x20 0x74 0x68 0x65 0x20 0x77 0x6F 0x72 // ' the wor' 0x64 0x73 0x20 0x79 0x6F 0x75 0x20 0x77 // 'ds you w' 0x61 0x6E 0x74 0x20 0x74 0x6F 0x20 0x63 // 'ant to c' 0x75 0x74 0x2E 0x0D 0x0A 0x01 0x20 0x43 // 'ut.??? C' 0x75 0x74 0x74 0x69 0x6E 0x67 0x20 0x75 // 'utting u' 0x6E 0x74 0x69 0x6C 0x20 0x74 0x68 0x65 // 'ntil the' 0x20 0x65 0x6E 0x64 0x20 0x6F 0x66 0x20 // ' end of ' 0x61 0x20 0x73 0x63 0x65 0x6E 0x65 // 'a scene' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_42= thPortfolio #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_42, __HELP_NAME("thPortfolio")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_42, __HELP_NAME("thPortfolio")) __HELP_PACK2 BO OSK LONG kgobHelpBookToolTopics 0x0 kidHelpAnchor kidPlayHelpSounds 0x0 0x0 0x57415645 kwavToolHelp42 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_42, 0x0) GST(0) ITEM "kgobHelpBookToolTopics" ITEM "thPortfolio" ITEM "" ITEM "kidHelpAnchor" ITEM "kidPlayHelpSounds" ITEM "kwavToolHelp42" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_42, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD0 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_39=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3D, 0x0) AG(4) ITEM LONG 0x2000004 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' FREE ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpPortfolio __HELP_SYMBOL( STN "mbmpPortfolio" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_3D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x18 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x75 0x01 0x00 0x01 // '????u???' 0x00 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x41 0x00 0x00 0x02 // '????A???' 0x00 0x00 0x00 0x00 0x46 0x00 0x00 0x02 // '????F???' 0x01 0x00 0x00 0x00 0x57 0x00 0x00 0x02 // '????W???' 0x00 0x00 0x00 0x00 0x59 0x00 0x00 0x02 // '????Y???' 0x01 0x00 0x00 0x00 0xA3 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0xC8 0x00 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0xC9 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0x03 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x0C 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x0E 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0xB0 0x00 0x00 0x03 // '??????' 0x0A 0x00 0x00 0xFD 0xC5 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0xD2 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0xD4 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x75 0x01 0x00 0x03 // '???u???' 0x00 0x00 0x00 0x00 0xC7 0x00 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0xD4 0x00 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0x10 0x01 0x00 0x80 // '???????' 0x00 0x00 0x03 0x00 0x0E 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x10 0x01 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3D, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x50 0x6F 0x72 // '??? Por' 0x74 0x66 0x6F 0x6C 0x69 0x6F 0x0D 0x0A // 'tfolio??' 0x54 0x68 0x65 0x20 0x70 0x6C 0x61 0x63 // 'The plac' 0x65 0x20 0x77 0x68 0x65 0x72 0x65 0x20 // 'e where ' 0x79 0x6F 0x75 0x20 0x6B 0x65 0x65 0x70 // 'you keep' 0x20 0x61 0x6C 0x6C 0x20 0x6F 0x66 0x20 // ' all of ' 0x79 0x6F 0x75 0x72 0x20 0x77 0x6F 0x72 // 'your wor' 0x6B 0x2E 0x20 0x59 0x6F 0x75 0x20 0x63 // 'k. You c' 0x61 0x6E 0x20 0x61 0x6C 0x73 0x6F 0x20 // 'an also ' 0x73 0x74 0x61 0x72 0x74 0x20 0x61 0x20 // 'start a ' 0x6E 0x65 0x77 0x20 0x6D 0x6F 0x76 0x69 // 'new movi' 0x65 0x2C 0x20 0x6F 0x70 0x65 0x6E 0x20 // 'e, open ' 0x61 0x6E 0x20 0x65 0x78 0x69 0x73 0x74 // 'an exist' 0x69 0x6E 0x67 0x20 0x6D 0x6F 0x76 0x69 // 'ing movi' 0x65 0x2C 0x20 0x73 0x61 0x76 0x65 0x20 // 'e, save ' 0x79 0x6F 0x75 0x72 0x20 0x77 0x6F 0x72 // 'your wor' 0x6B 0x2C 0x20 0x6F 0x72 0x20 0x73 0x61 // 'k, or sa' 0x76 0x65 0x20 0x79 0x6F 0x75 0x72 0x20 // 've your ' 0x77 0x6F 0x72 0x6B 0x20 0x75 0x6E 0x64 // 'work und' 0x65 0x72 0x20 0x61 0x20 0x6E 0x65 0x77 // 'er a new' 0x20 0x6E 0x61 0x6D 0x65 0x20 0x28 0x53 // ' name (S' 0x61 0x76 0x65 0x20 0x41 0x73 0x29 0x2E // 'ave As).' 0x0D 0x0A 0x54 0x6F 0x20 0x6F 0x70 0x65 // '??To ope' 0x6E 0x20 0x74 0x68 0x65 0x20 0x70 0x6F // 'n the po' 0x72 0x74 0x66 0x6F 0x6C 0x69 0x6F 0x0D // 'rtfolio?' 0x0A 0x31 0x09 0x43 0x6C 0x69 0x63 0x6B // '?1?Click' 0x20 0x69 0x74 0x2E 0x0D 0x0A 0x32 0x09 // ' it.??2?' 0x43 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 // 'Click th' 0x65 0x20 0x6F 0x70 0x74 0x69 0x6F 0x6E // 'e option' 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 0x6E // ' you wan' 0x74 0x3A 0x20 0x20 0x4E 0x65 0x77 0x2C // 't: New,' 0x20 0x4F 0x70 0x65 0x6E 0x2C 0x20 0x53 // ' Open, S' 0x61 0x76 0x65 0x2C 0x20 0x6F 0x72 0x20 // 'ave, or ' 0x53 0x61 0x76 0x65 0x20 0x41 0x73 0x2E // 'Save As.' 0x0D 0x0A 0x54 0x6F 0x20 0x66 0x69 0x6E // '??To fin' 0x64 0x20 0x6F 0x75 0x74 0x20 0x6D 0x6F // 'd out mo' 0x72 0x65 0x2C 0x20 0x6D 0x6F 0x76 0x65 // 're, move' 0x20 0x74 0x68 0x65 0x20 0x6D 0x6F 0x75 // ' the mou' 0x73 0x65 0x20 0x63 0x75 0x72 0x73 0x6F // 'se curso' 0x72 0x20 0x6F 0x76 0x65 0x72 0x20 0x65 // 'r over e' 0x61 0x63 0x68 0x20 0x74 0x6F 0x6F 0x6C // 'ach tool' 0x2E 0x20 0x57 0x61 0x69 0x74 0x2E 0x2E // '. Wait..' 0x2E 0x79 0x6F 0x75 0x27 0x6C 0x6C 0x20 // '.you'll ' 0x67 0x65 0x74 0x20 0x61 0x20 0x64 0x65 // 'get a de' 0x73 0x63 0x72 0x69 0x70 0x74 0x69 0x6F // 'scriptio' 0x6E 0x20 0x6F 0x66 0x20 0x65 0x61 0x63 // 'n of eac' 0x68 0x20 0x74 0x6F 0x6F 0x6C 0x2E // 'h tool.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_43= thExit #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_43, __HELP_NAME("thExit")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_43, __HELP_NAME("thExit")) __HELP_PACK2 BO OSK LONG kgobHelpBookToolTopics 0x0 kidHelpAnchor kidPlayHelpSounds 0x0 0x0 0x57415645 kwavToolHelp43 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_43, 0x0) GST(0) ITEM "kgobHelpBookToolTopics" ITEM "thExit" ITEM "" ITEM "kidHelpAnchor" ITEM "kidPlayHelpSounds" ITEM "kwavToolHelp43" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_43, 0x0) BYTE 0x01 0x00 0x03 0x03 0xF4 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_4=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpExit __HELP_SYMBOL( STN "mbmpExit" ) ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipKey 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipKey" ) FREE ITEM LONG 0x40000001 VAR BYTE 1 LONG Key___Exit __HELP_SYMBOL( STN "Key___Exit" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_2=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0E 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x83 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x03 // '????????' 0x00 0x00 0x00 0x00 0x12 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x19 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x75 0x00 0x00 0x03 // '????u???' 0x0F 0x00 0x00 0xFD 0x83 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x75 0x00 0x00 0x40 // '????u??@' 0x04 0x00 0x00 0x00 0x83 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x1B 0x00 0x00 0x80 // '???????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x75 0x00 0x00 0x82 // '????u??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0x75 0x00 0x00 0xC0 // '????u??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) BYTE 0x03 0x03 0x01 0x0D 0x0A 0x51 0x75 0x69 // '?????Qui' 0x74 0x20 0x77 0x6F 0x72 0x6B 0x69 0x6E // 't workin' 0x67 0x21 0x0D 0x0A 0x54 0x6F 0x20 0x71 // 'g!??To q' 0x75 0x69 0x74 0x0D 0x0A 0x31 0x09 0x43 // 'uit??1?C' 0x6C 0x69 0x63 0x6B 0x20 0x45 0x78 0x69 // 'lick Exi' 0x74 0x2E 0x0D 0x0A 0x32 0x09 0x59 0x6F // 't.??2?Yo' 0x75 0x20 0x63 0x61 0x6E 0x20 0x65 0x69 // 'u can ei' 0x74 0x68 0x65 0x72 0x20 0x72 0x65 0x74 // 'ther ret' 0x75 0x72 0x6E 0x20 0x74 0x6F 0x20 0x74 // 'urn to t' 0x68 0x65 0x20 0x72 0x6F 0x6F 0x6D 0x20 // 'he room ' 0x79 0x6F 0x75 0x20 0x63 0x61 0x6D 0x65 // 'you came' 0x20 0x66 0x72 0x6F 0x6D 0x20 0x6F 0x72 // ' from or' 0x20 0x71 0x75 0x69 0x74 0x20 0x33 0x44 // ' quit 3D' 0x20 0x4D 0x6F 0x76 0x69 0x65 0x20 0x4D // ' Movie M' 0x61 0x6B 0x65 0x72 0x2E 0x0D 0x0A 0x01 // 'aker.???' 0x20 0x53 0x68 0x6F 0x72 0x74 0x63 0x75 // ' Shortcu' 0x74 0x20 0x6B 0x65 0x79 // 't key' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_44= Tip___Undo #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_44, __HELP_NAME("Tip: Undo")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_44, __HELP_NAME("Tip: Undo")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp 0x0 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_34=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_44, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "Tip___Undo" ITEM "" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_34=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_44, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_30=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_34, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpUndo __HELP_SYMBOL( STN "mbmpUndo" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpRedo __HELP_SYMBOL( STN "mbmpRedo" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_34=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_34, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x12 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x14 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x16 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x34 0x00 0x00 0x01 // '????4???' 0x00 0x00 0x00 0x00 0x36 0x00 0x00 0x01 // '????6???' 0x01 0xF1 0x00 0x00 0x43 0x00 0x00 0x01 // '???C???' 0x01 0x00 0x00 0x00 0x5E 0x00 0x00 0x01 // '????^???' 0x01 0xF6 0x00 0x00 0x6B 0x00 0x00 0x01 // '???k???' 0x01 0x00 0x00 0x00 0x6C 0x00 0x00 0x01 // '????l???' 0x00 0x00 0x00 0x00 0x16 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x34 0x00 0x00 0x03 // '???4???' 0x00 0x00 0x00 0x00 0x46 0x00 0x00 0x03 // '????F???' 0x0A 0x00 0x00 0xFD 0x5C 0x00 0x00 0x03 // '???\???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x5E 0x00 0x00 0x82 // '????^??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x03 0x00 0x00 0x00 0x43 0x00 0x00 0xC0 // '????C??' 0x01 0x00 0x00 0x00 0x6B 0x00 0x00 0xC0 // '????k??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_34=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_34, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x55 0x6E 0x64 // '??? Und' 0x6F 0x69 0x6E 0x67 0x20 0x26 0x20 0x72 // 'oing & r' 0x65 0x64 0x6F 0x69 0x6E 0x67 0x0D 0x0A // 'edoing??' 0x54 0x6F 0x20 0x75 0x6E 0x64 0x6F 0x20 // 'To undo ' 0x74 0x68 0x65 0x20 0x6C 0x61 0x73 0x74 // 'the last' 0x20 0x74 0x68 0x69 0x6E 0x67 0x20 0x79 // ' thing y' 0x6F 0x75 0x20 0x64 0x69 0x64 0x0D 0x0A // 'ou did??' 0x95 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 // '?Click ' 0x55 0x6E 0x64 0x6F 0x2D 0x01 0x0D 0x0A // 'Undo-???' 0x54 0x6F 0x20 0x72 0x65 0x64 0x6F 0x20 // 'To redo ' 0x77 0x68 0x61 0x74 0x20 0x79 0x6F 0x75 // 'what you' 0x20 0x75 0x6E 0x64 0x69 0x64 0x0D 0x0A // ' undid??' 0x95 0x09 0x43 0x6C 0x69 0x63 0x6B 0x20 // '?Click ' 0x52 0x65 0x64 0x6F 0x2D 0x01 // 'Redo-?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_45= Def___frame #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_45, __HELP_NAME("Def: frame")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_45, __HELP_NAME("Def: frame")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp 0x0 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_50=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_45, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "Def___frame" ITEM "" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_50=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_45, 0x0) BYTE 0x01 0x00 0x03 0x03 0x4D 0x01 0x00 0x00 // '????M???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_19=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_50, 0x0) AG(4) ITEM LONG 0x2000002 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpFrameSlider __HELP_SYMBOL( STN "mbmpFrameSlider" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_50=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_50, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x14 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xA2 0x00 0x00 0x01 // '???????' 0x05 0x00 0x00 0x00 0xA4 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0xCE 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x73 0x00 0x00 0x02 // '????s???' 0x01 0x00 0x00 0x00 0x79 0x00 0x00 0x02 // '????y???' 0x00 0x00 0x00 0x00 0xAA 0x00 0x00 0x02 // '???????' 0x01 0x00 0x00 0x00 0xCE 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x05 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x07 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x23 0x00 0x00 0x03 // '???#???' 0x0A 0x00 0x00 0xFD 0x4E 0x00 0x00 0x03 // '???N???' 0x0F 0x00 0x00 0xFD 0x67 0x00 0x00 0x03 // '???g???' 0x0A 0x00 0x00 0xFD 0x6A 0x00 0x00 0x03 // '???j???' 0x0F 0x00 0x00 0xFD 0x73 0x00 0x00 0x03 // '???s???' 0x00 0x00 0x00 0x00 0x69 0x00 0x00 0x80 // '????i??' 0x00 0x00 0x03 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x6C 0x00 0x00 0x82 // '????l??' 0x00 0x00 0x00 0x00 0x69 0x00 0x00 0xC0 // '????i??' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_50=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_50, 0x0) BYTE 0x03 0x03 0x46 0x72 0x61 0x6D 0x65 0x0D // '??Frame?' 0x0A 0x4F 0x6E 0x65 0x20 0x73 0x63 0x72 // '?One scr' 0x65 0x65 0x6E 0x20 0x6F 0x66 0x20 0x79 // 'een of y' 0x6F 0x75 0x72 0x20 0x6D 0x6F 0x76 0x69 // 'our movi' 0x65 0x2E 0x20 0x0D 0x0A 0x54 0x6F 0x20 // 'e. ??To ' 0x6D 0x6F 0x76 0x65 0x20 0x66 0x72 0x6F // 'move fro' 0x6D 0x20 0x66 0x72 0x61 0x6D 0x65 0x20 // 'm frame ' 0x74 0x6F 0x20 0x66 0x72 0x61 0x6D 0x65 // 'to frame' 0x20 0x77 0x69 0x74 0x68 0x69 0x6E 0x20 // ' within ' 0x61 0x20 0x73 0x63 0x65 0x6E 0x65 0x2E // 'a scene.' 0x0D 0x0A 0x95 0x09 0x55 0x73 0x65 0x20 // '???Use ' 0x74 0x68 0x65 0x20 0x46 0x72 0x61 0x6D // 'the Fram' 0x65 0x20 0x53 0x6C 0x69 0x64 0x65 0x72 // 'e Slider' 0x2E 0x0D 0x0A 0x01 0x0D 0x0A 0x4E 0x6F // '.?????No' 0x74 0x65 0x3A 0x20 0x20 0x43 0x6C 0x69 // 'te: Cli' 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 0x46 // 'ck the F' 0x69 0x72 0x73 0x74 0x2C 0x20 0x50 0x72 // 'irst, Pr' 0x65 0x76 0x69 0x6F 0x75 0x73 0x2C 0x20 // 'evious, ' 0x4E 0x65 0x78 0x74 0x2C 0x20 0x6F 0x72 // 'Next, or' 0x20 0x4C 0x61 0x73 0x74 0x20 0x41 0x72 // ' Last Ar' 0x72 0x6F 0x77 0x20 0x6F 0x72 0x20 0x64 // 'row or d' 0x72 0x61 0x67 0x20 0x74 0x68 0x65 0x20 // 'rag the ' 0x73 0x6C 0x69 0x64 0x65 0x72 0x20 0x69 // 'slider i' 0x6E 0x20 0x74 0x68 0x65 0x20 0x6D 0x69 // 'n the mi' 0x64 0x64 0x6C 0x65 0x20 0x6F 0x66 0x20 // 'ddle of ' 0x74 0x68 0x65 0x20 0x62 0x61 0x72 0x2E // 'the bar.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_46= Tip___Change_Camera_Angle #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_46, __HELP_NAME("Tip: Change Camera Angle")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_46, __HELP_NAME("Tip: Change Camera Angle")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp 0x0 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_46, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "Tip___Change_Camera_Angle" ITEM "" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_46, 0x0) BYTE 0x01 0x00 0x03 0x03 0x49 0x01 0x00 0x00 // '????I???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_26=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2A, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSettingsCameras __HELP_SYMBOL( STN "mbmpSettingsCameras" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_2A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0D 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x71 0x00 0x00 0x01 // '????q???' 0x01 0xF6 0x00 0x00 0x87 0x00 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0xAC 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x03 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x55 0x00 0x00 0x03 // '???U???' 0x0A 0x00 0x00 0xFD 0x71 0x00 0x00 0x03 // '???q???' 0x0F 0x00 0x00 0xFD 0xAC 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x71 0x00 0x00 0x80 // '????q??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x8A 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0x87 0x00 0x00 0xC0 // '??????' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2A, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x43 0x68 0x61 // '??? Cha' 0x6E 0x67 0x69 0x6E 0x67 0x20 0x74 0x68 // 'nging th' 0x65 0x20 0x63 0x61 0x6D 0x65 0x72 0x61 // 'e camera' 0x20 0x61 0x6E 0x67 0x6C 0x65 0x0D 0x0A // ' angle??' 0x54 0x68 0x65 0x72 0x65 0x20 0x61 0x72 // 'There ar' 0x65 0x20 0x6D 0x61 0x6E 0x79 0x20 0x70 // 'e many p' 0x6F 0x73 0x73 0x69 0x62 0x6C 0x65 0x20 // 'ossible ' 0x63 0x61 0x6D 0x65 0x72 0x61 0x20 0x61 // 'camera a' 0x6E 0x67 0x6C 0x65 0x73 0x20 0x66 0x6F // 'ngles fo' 0x72 0x20 0x65 0x61 0x63 0x68 0x20 0x73 // 'r each s' 0x63 0x65 0x6E 0x65 0x2E 0x0D 0x0A 0x54 // 'cene.??T' 0x6F 0x20 0x63 0x68 0x61 0x6E 0x67 0x65 // 'o change' 0x20 0x74 0x68 0x65 0x20 0x63 0x61 0x6D // ' the cam' 0x65 0x72 0x61 0x20 0x61 0x6E 0x67 0x6C // 'era angl' 0x65 0x0D 0x0A 0x31 0x09 0x43 0x6C 0x69 // 'e??1?Cli' 0x63 0x6B 0x20 0x43 0x61 0x6D 0x65 0x72 // 'ck Camer' 0x61 0x20 0x41 0x6E 0x67 0x6C 0x65 0x73 // 'a Angles' 0x2D 0x01 0x0D 0x0A 0x32 0x09 0x43 0x6C // '-???2?Cl' 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 // 'ick the ' 0x63 0x61 0x6D 0x65 0x72 0x61 0x20 0x61 // 'camera a' 0x6E 0x67 0x6C 0x65 0x20 0x79 0x6F 0x75 // 'ngle you' 0x20 0x77 0x61 0x6E 0x74 0x2E // ' want.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_47= thHelp #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_47, __HELP_NAME("thHelp")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_47, __HELP_NAME("thHelp")) __HELP_PACK2 BO OSK LONG kgobHelpBookToolTopics 0x0 kidHelpAnchor kidPlayHelpSounds 0x0 0x0 0x57415645 kwavToolHelp47 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_32=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_47, 0x0) GST(0) ITEM "kgobHelpBookToolTopics" ITEM "thHelp" ITEM "" ITEM "kidHelpAnchor" ITEM "kidPlayHelpSounds" ITEM "kwavToolHelp47" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_6E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_47, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_66=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6E, 0x0) AG(4) ITEM LONG 0x2000002 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpBook __HELP_SYMBOL( STN "mbmpBook" ) ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipKey 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipKey" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG Key___Help __HELP_SYMBOL( STN "Key___Help" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_6E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x16 0x00 0x00 0x00 0x01 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x02 0x00 0x00 0x01 // '????????' 0x01 0xF6 0x00 0x00 0x0E 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0x7F 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x10 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x47 0x00 0x00 0x02 // '????G???' 0x00 0x00 0x00 0x00 0x65 0x00 0x00 0x02 // '????e???' 0x01 0x00 0x00 0x00 0x66 0x00 0x00 0x02 // '????f???' 0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x02 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x0E 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x4A 0x00 0x00 0x03 // '???J???' 0x0A 0x00 0x00 0xFD 0x62 0x00 0x00 0x03 // '???b???' 0x00 0x00 0x00 0x00 0x71 0x00 0x00 0x03 // '????q???' 0x0F 0x00 0x00 0xFD 0x7F 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x71 0x00 0x00 0x40 // '????q??@' 0x04 0x00 0x00 0x00 0x7F 0x00 0x00 0x40 // '???????@' 0x00 0x00 0x00 0x00 0x64 0x00 0x00 0x80 // '????d??' 0x00 0x00 0x02 0x00 0x10 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x71 0x00 0x00 0x82 // '????q??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x02 0x00 0x00 0x00 0x71 0x00 0x00 0xC0 // '????q??' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_6E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6E, 0x0) BYTE 0x03 0x03 0x01 0x20 0x48 0x65 0x6C 0x70 // '??? Help' 0x20 0x4D 0x61 0x63 0x68 0x69 0x6E 0x65 // ' Machine' 0x0D 0x0A 0x46 0x69 0x6E 0x64 0x20 0x61 // '??Find a' 0x6C 0x6C 0x20 0x74 0x68 0x65 0x20 0x61 // 'll the a' 0x6E 0x73 0x77 0x65 0x72 0x73 0x20 0x74 // 'nswers t' 0x6F 0x20 0x79 0x6F 0x75 0x72 0x20 0x6D // 'o your m' 0x6F 0x76 0x69 0x65 0x2D 0x6D 0x61 0x6B // 'ovie-mak' 0x69 0x6E 0x67 0x20 0x71 0x75 0x65 0x73 // 'ing ques' 0x74 0x69 0x6F 0x6E 0x73 0x21 0x20 0x20 // 'tions! ' 0x20 0x20 0x0D 0x0A 0x54 0x6F 0x20 0x6F // ' ??To o' 0x70 0x65 0x6E 0x20 0x74 0x68 0x65 0x20 // 'pen the ' 0x48 0x65 0x6C 0x70 0x20 0x4D 0x61 0x63 // 'Help Mac' 0x68 0x69 0x6E 0x65 0x0D 0x0A 0x95 0x09 // 'hine???' 0x43 0x6C 0x69 0x63 0x6B 0x20 0x69 0x74 // 'Click it' 0x2E 0x0D 0x0A 0x01 0x20 0x53 0x68 0x6F // '.??? Sho' 0x72 0x74 0x63 0x75 0x74 0x20 0x6B 0x65 // 'rtcut ke' 0x79 // 'y' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_48= thMap #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_48, __HELP_NAME("thMap")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_48, __HELP_NAME("thMap")) __HELP_PACK2 BO OSK LONG kgobHelpBookToolTopics 0x0 kidHelpAnchor kidPlayHelpSounds 0x0 0x0 0x57415645 kwavToolHelp48 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_48, 0x0) GST(0) ITEM "kgobHelpBookToolTopics" ITEM "thMap" ITEM "" ITEM "kidHelpAnchor" ITEM "kidPlayHelpSounds" ITEM "kwavToolHelp48" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_48, 0x0) BYTE 0x01 0x00 0x03 0x03 0x99 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_33=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1A, 0x0) AG(4) ITEM LONG 0x2000002 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpMap __HELP_SYMBOL( STN "mbmpMap" ) FREE ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipKey 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipKey" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG Key___Map __HELP_SYMBOL( STN "Key___Map" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_1A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x16 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0xF6 0x00 0x00 0x06 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0x8B 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x3A 0x00 0x00 0x02 // '????:???' 0x00 0x00 0x00 0x00 0x4E 0x00 0x00 0x02 // '????N???' 0x01 0x00 0x00 0x00 0x4F 0x00 0x00 0x02 // '????O???' 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x03 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x08 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x3C 0x00 0x00 0x03 // '??????' 0x0F 0x00 0x00 0xFD 0x45 0x00 0x00 0x03 // '???E???' 0x00 0x00 0x00 0x00 0x47 0x00 0x00 0x03 // '????G???' 0x0A 0x00 0x00 0xFD 0x69 0x00 0x00 0x03 // '???i???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x69 0x00 0x00 0x82 // '????i??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_17=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_17, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x53 0x68 0x6F // '??? Sho' 0x72 0x74 0x63 0x75 0x74 0x20 0x6B 0x65 // 'rtcut ke' 0x79 0x73 0x0D 0x0A 0x54 0x6F 0x20 0x75 // 'ys??To u' 0x6E 0x64 0x6F 0x20 0x74 0x68 0x65 0x20 // 'ndo the ' 0x6C 0x61 0x73 0x74 0x20 0x74 0x68 0x69 // 'last thi' 0x6E 0x67 0x20 0x79 0x6F 0x75 0x20 0x64 // 'ng you d' 0x69 0x64 0x0D 0x0A 0x95 0x09 0x48 0x6F // 'id???Ho' 0x6C 0x64 0x20 0x64 0x6F 0x77 0x6E 0x20 // 'ld down ' 0x43 0x74 0x72 0x6C 0x2B 0x5A 0x2E 0x0D // 'Ctrl+Z.?' 0x0A 0x54 0x6F 0x20 0x72 0x65 0x64 0x6F // '?To redo' 0x20 0x74 0x68 0x65 0x20 0x6C 0x61 0x73 // ' the las' 0x74 0x20 0x74 0x68 0x69 0x6E 0x67 0x20 // 't thing ' 0x79 0x6F 0x75 0x20 0x75 0x6E 0x64 0x69 // 'you undi' 0x64 0x0D 0x0A 0x95 0x09 0x48 0x6F 0x6C // 'd???Hol' 0x64 0x20 0x64 0x6F 0x77 0x6E 0x20 0x43 // 'd down C' 0x74 0x72 0x6C 0x2B 0x59 0x2E // 'trl+Y.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_6B= Def___Cut_Copy_Paste #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6B, __HELP_NAME("Def: Cut Copy Paste")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6B, __HELP_NAME("Def: Cut Copy Paste")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp 0x0 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_18=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6B, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "Def___Cut_Copy_Paste" ITEM "" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_18=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x9F 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_16=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_18, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpCutCopyPaste __HELP_SYMBOL( STN "mbmpCutCopyPaste" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_18=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_18, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1A 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x19 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x19 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_18=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_18, 0x0) BYTE 0x03 0x03 0x43 0x75 0x74 0x2C 0x20 0x43 // '??Cut, C' 0x6F 0x70 0x79 0x2C 0x26 0x20 0x50 0x61 // 'opy,& Pa' 0x73 0x74 0x65 0x20 0x54 0x6F 0x6F 0x6C // 'ste Tool' 0x73 0x0D 0x0A 0x01 // 's???' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_6C= Def___Move_to_scene #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6C, __HELP_NAME("Def: Move to scene")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6C, __HELP_NAME("Def: Move to scene")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp 0x0 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_35=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6C, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "Def___Move_to_scene" ITEM "" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_35=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x36 0x01 0x00 0x00 // '????6???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_9=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_35, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSceneSlider __HELP_SYMBOL( STN "mbmpSceneSlider" ) ITEM LONG 0x2000002 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_35=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_35, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x15 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1D 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x1F 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x3A 0x00 0x00 0x01 // '????:???' 0x00 0x00 0x00 0x00 0x3C 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0x01 // '????@???' 0x01 0x00 0x00 0x00 0xA1 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x21 0x00 0x00 0x03 // '????!???' 0x0A 0x00 0x00 0xFD 0x3E 0x00 0x00 0x03 // '???>???' 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0x80 // '????@??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x55 0x00 0x00 0x82 // '????U??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_48=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_48, 0x0) BYTE 0x03 0x03 0x01 0x20 0x52 0x65 0x70 0x6F // '??? Repo' 0x73 0x69 0x74 0x69 0x6F 0x6E 0x69 0x6E // 'sitionin' 0x67 0x20 0x74 0x68 0x65 0x20 0x65 0x6E // 'g the en' 0x74 0x69 0x72 0x65 0x20 0x70 0x61 0x74 // 'tire pat' 0x68 0x0D 0x0A 0x54 0x6F 0x20 0x72 0x65 // 'h??To re' 0x70 0x6F 0x73 0x69 0x74 0x69 0x6F 0x6E // 'position' 0x20 0x74 0x68 0x65 0x20 0x65 0x6E 0x74 // ' the ent' 0x69 0x72 0x65 0x20 0x70 0x61 0x74 0x68 // 'ire path' 0x0D 0x0A 0x31 0x09 0x43 0x6C 0x69 0x63 // '??1?Clic' 0x6B 0x20 0x52 0x65 0x70 0x6F 0x73 0x69 // 'k Reposi' 0x74 0x69 0x6F 0x6E 0x2E 0x0D 0x0A 0x32 // 'tion.??2' 0x09 0x48 0x6F 0x6C 0x64 0x20 0x64 0x6F // '?Hold do' 0x77 0x6E 0x20 0x53 0x68 0x69 0x66 0x74 // 'wn Shift' 0x20 0x61 0x73 0x20 0x79 0x6F 0x75 0x20 // ' as you ' 0x64 0x72 0x61 0x67 0x20 0x74 0x68 0x65 // 'drag the' 0x20 0x61 0x63 0x74 0x6F 0x72 0x2C 0x20 // ' actor, ' 0x70 0x72 0x6F 0x70 0x2C 0x20 0x6F 0x72 // 'prop, or' 0x20 0x33 0x44 0x20 0x77 0x6F 0x72 0x64 // ' 3D word' 0x20 0x77 0x68 0x65 0x72 0x65 0x20 0x79 // ' where y' 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 // 'ou want ' 0x69 0x74 0x2E // 'it.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_79= Def___Import #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_79, __HELP_NAME("Def: Import")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_79, __HELP_NAME("Def: Import")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp 0x0 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_63=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_79, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "Def___Import" ITEM "" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_63=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_79, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB4 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_63=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_63, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x06 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x08 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x37 0x00 0x00 0x01 // '????7???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x08 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_63=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_63, 0x0) BYTE 0x03 0x03 0x49 0x6D 0x70 0x6F 0x72 0x74 // '??Import' 0x0D 0x0A 0x54 0x6F 0x20 0x75 0x73 0x65 // '??To use' 0x20 0x61 0x20 0x66 0x69 0x6C 0x65 0x20 // ' a file ' 0x79 0x6F 0x75 0x20 0x63 0x72 0x65 0x61 // 'you crea' 0x74 0x65 0x64 0x20 0x77 0x69 0x74 0x68 // 'ted with' 0x20 0x61 0x6E 0x6F 0x74 0x68 0x65 0x72 // ' another' 0x20 0x70 0x72 0x6F 0x67 0x72 0x61 0x6D // ' program' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_7A= Def___transitions #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7A, __HELP_NAME("Def: transitions")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7A, __HELP_NAME("Def: transitions")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp 0x0 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_7E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7A, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "Def___transitions" ITEM "" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_7E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x9F 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_72=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7E, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSOTransition1 __HELP_SYMBOL( STN "mbmpSOTransition1" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSOTransition2 __HELP_SYMBOL( STN "mbmpSOTransition2" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSOTransition3 __HELP_SYMBOL( STN "mbmpSOTransition3" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpSOTransition4 __HELP_SYMBOL( STN "mbmpSOTransition4" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_7E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x10 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0B 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x0F 0x00 0x00 0x01 // '????????' 0x01 0xFD 0x00 0x00 0x1B 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0x1F 0x00 0x00 0x01 // '????????' 0x01 0xFD 0x00 0x00 0x27 0x00 0x00 0x01 // '???'???' 0x01 0x00 0x00 0x00 0x2B 0x00 0x00 0x01 // '????+???' 0x01 0xFD 0x00 0x00 0x3E 0x00 0x00 0x01 // '???>???' 0x01 0x00 0x00 0x00 0x42 0x00 0x00 0x01 // '????B???' 0x01 0xFD 0x00 0x00 0x55 0x00 0x00 0x01 // '???U???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x40 0x00 0x00 0x82 // '????@??' 0x00 0x00 0x00 0x00 0x0D 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0x1D 0x00 0x00 0xC0 // '???????' 0x02 0x00 0x00 0x00 0x29 0x00 0x00 0xC0 // '????)??' 0x03 0x00 0x00 0x00 0x40 0x00 0x00 0xC0 // '????@??' 0x04 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_7E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7E, 0x0) BYTE 0x03 0x03 0x74 0x72 0x61 0x6E 0x73 0x69 // '??transi' 0x74 0x69 0x6F 0x6E 0x73 0x0D 0x0A 0x01 // 'tions???' 0x09 0x43 0x75 0x74 0x20 0x74 0x6F 0x20 // '?Cut to ' 0x62 0x6C 0x61 0x63 0x6B 0x0D 0x0A 0x01 // 'black???' 0x09 0x44 0x69 0x73 0x73 0x6F 0x6C 0x76 // '?Dissolv' 0x65 0x0D 0x0A 0x01 0x09 0x44 0x69 0x73 // 'e????Dis' 0x73 0x6F 0x6C 0x76 0x65 0x20 0x77 0x69 // 'solve wi' 0x74 0x68 0x20 0x62 0x6C 0x61 0x63 0x6B // 'th black' 0x0D 0x0A 0x01 0x09 0x44 0x69 0x73 0x73 // '????Diss' 0x6F 0x6C 0x76 0x65 0x20 0x77 0x69 0x74 // 'olve wit' 0x68 0x20 0x77 0x68 0x69 0x74 0x65 // 'h white' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_7B= thRemoveSound #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7B, __HELP_NAME("thRemoveSound")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7B, __HELP_NAME("thRemoveSound")) __HELP_PACK2 BO OSK LONG kgobHelpBookToolTopics 0x0 kidHelpAnchor kidPlayHelpSounds 0x0 0x0 0x57415645 kwavToolHelp7B ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_5C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7B, 0x0) GST(0) ITEM "kgobHelpBookToolTopics" ITEM "thRemoveSound" ITEM "" ITEM "kidHelpAnchor" ITEM "kidPlayHelpSounds" ITEM "kwavToolHelp7B" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_5C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7B, 0x0) BYTE 0x01 0x00 0x03 0x03 0xFE 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_55=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5C, 0x0) AG(4) ITEM LONG 0x2000003 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ITEM LONG 0x40000001 VAR BYTE 3 LONG Tip___Undo __HELP_SYMBOL( STN "Tip___Undo" ) ITEM LONG 0x40000001 VAR BYTE 1 LONG Def___Go_to_the_place __HELP_SYMBOL( STN "Def___Go_to_the_place" ) ITEM LONG 0x40000001 VAR BYTE 2 LONG Def___Cut_Copy_Paste __HELP_SYMBOL( STN "Def___Cut_Copy_Paste" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpNukeSound __HELP_SYMBOL( STN "mbmpNukeSound" ) FREE ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobTipGem 0xFFFFFFFF __HELP_SYMBOL( STN "_gobTipGem" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_5C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x23 0x00 0x00 0x00 0x01 0x00 0x00 0x01 // '#???????' 0x01 0x00 0x00 0x00 0x02 0x00 0x00 0x01 // '????????' 0x01 0xF6 0x00 0x00 0x0E 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0x8B 0x01 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x0E 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x16 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x17 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x1F 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x36 0x00 0x00 0x02 // '????6???' 0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x02 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x10 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x38 0x00 0x00 0x03 // '???8???' 0x0A 0x00 0x00 0xFD 0x49 0x00 0x00 0x03 // '???I???' 0x0F 0x00 0x00 0xFD 0x8F 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x00 0x01 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x42 0x01 0x00 0x03 // '???B???' 0x00 0x00 0x00 0x00 0x83 0x01 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x8B 0x01 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x91 0x00 0x00 0x04 // '???????' 0x0D 0x00 0x00 0xFE 0xA0 0x00 0x00 0x04 // '??????' 0x00 0x00 0x00 0x00 0x0E 0x01 0x00 0x04 // '????????' 0x0D 0x00 0x00 0xFE 0x26 0x01 0x00 0x04 // '???&???' 0x00 0x00 0x00 0x00 0x91 0x00 0x00 0x40 // '??????@' 0x03 0x00 0x00 0x00 0xA0 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x0E 0x01 0x00 0x40 // '???????@' 0x04 0x00 0x00 0x00 0x26 0x01 0x00 0x40 // '????&??@' 0x00 0x00 0x00 0x00 0x85 0x01 0x00 0x40 // '??????@' 0x02 0x00 0x00 0x00 0x8B 0x01 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x4B 0x00 0x00 0x80 // '????K??' 0x00 0x00 0x02 0x00 0x85 0x01 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x85 0x01 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x05 0x00 0x00 0x00 0x85 0x01 0x00 0xC0 // '??????' 0x07 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_5C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5C, 0x0) BYTE 0x03 0x03 0x01 0x20 0x52 0x65 0x6D 0x6F // '??? Remo' 0x76 0x65 0x20 0x53 0x6F 0x75 0x6E 0x64 // 've Sound' 0x0D 0x0A 0x52 0x65 0x6D 0x6F 0x76 0x65 // '??Remove' 0x20 0x61 0x20 0x73 0x6F 0x75 0x6E 0x64 // ' a sound' 0x20 0x66 0x72 0x6F 0x6D 0x20 0x74 0x68 // ' from th' 0x65 0x20 0x63 0x75 0x72 0x72 0x65 0x6E // 'e curren' 0x74 0x20 0x73 0x63 0x65 0x6E 0x65 0x2E // 't scene.' 0x0D 0x0A 0x54 0x6F 0x20 0x72 0x65 0x6D // '??To rem' 0x6F 0x76 0x65 0x20 0x61 0x20 0x73 0x6F // 'ove a so' 0x75 0x6E 0x64 0x0D 0x0A 0x31 0x09 0x49 // 'und??1?I' 0x66 0x20 0x79 0x6F 0x75 0x20 0x73 0x65 // 'f you se' 0x65 0x20 0x74 0x68 0x65 0x20 0x53 0x6F // 'e the So' 0x75 0x6E 0x64 0x73 0x20 0x62 0x75 0x74 // 'unds but' 0x74 0x6F 0x6E 0x20 0x61 0x74 0x20 0x74 // 'ton at t' 0x68 0x65 0x20 0x74 0x6F 0x70 0x20 0x6F // 'he top o' 0x66 0x20 0x74 0x68 0x65 0x20 0x73 0x63 // 'f the sc' 0x72 0x65 0x65 0x6E 0x2C 0x20 0x63 0x6C // 'reen, cl' 0x69 0x63 0x6B 0x20 0x69 0x74 0x2E 0x0D // 'ick it.?' 0x0A 0x32 0x09 0x47 0x6F 0x20 0x74 0x6F // '?2?Go to' 0x20 0x74 0x68 0x65 0x20 0x70 0x6C 0x61 // ' the pla' 0x63 0x65 0x20 0x69 0x6E 0x20 0x79 0x6F // 'ce in yo' 0x75 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 // 'ur movie' 0x20 0x77 0x68 0x65 0x72 0x65 0x20 0x74 // ' where t' 0x68 0x65 0x20 0x73 0x6F 0x75 0x6E 0x64 // 'he sound' 0x20 0x62 0x65 0x67 0x69 0x6E 0x73 0x2E // ' begins.' 0x20 0x20 0x20 0x59 0x6F 0x75 0x27 0x6C // ' You'l' 0x6C 0x20 0x68 0x65 0x61 0x72 0x20 0x74 // 'l hear t' 0x68 0x65 0x20 0x73 0x6F 0x75 0x6E 0x64 // 'he sound' 0x73 0x20 0x61 0x73 0x20 0x79 0x6F 0x75 // 's as you' 0x20 0x6D 0x6F 0x76 0x65 0x20 0x66 0x72 // ' move fr' 0x6F 0x6D 0x20 0x66 0x72 0x61 0x6D 0x65 // 'om frame' 0x20 0x74 0x6F 0x20 0x66 0x72 0x61 0x6D // ' to fram' 0x65 0x2E 0x0D 0x0A 0x33 0x09 0x43 0x6C // 'e.??3?Cl' 0x69 0x63 0x6B 0x20 0x74 0x68 0x65 0x20 // 'ick the ' 0x43 0x75 0x74 0x2C 0x20 0x43 0x6F 0x70 // 'Cut, Cop' 0x79 0x2C 0x20 0x26 0x20 0x50 0x61 0x73 // 'y, & Pas' 0x74 0x65 0x20 0x54 0x6F 0x6F 0x6C 0x73 // 'te Tools' 0x2E 0x0D 0x0A 0x34 0x09 0x43 0x6C 0x69 // '.??4?Cli' 0x63 0x6B 0x20 0x52 0x65 0x6D 0x6F 0x76 // 'ck Remov' 0x65 0x20 0x53 0x6F 0x75 0x6E 0x64 0x2E // 'e Sound.' 0x0D 0x0A 0x35 0x09 0x43 0x6C 0x69 0x63 // '??5?Clic' 0x6B 0x20 0x74 0x68 0x65 0x20 0x33 0x44 // 'k the 3D' 0x20 0x6F 0x62 0x6A 0x65 0x63 0x74 0x20 // ' object ' 0x6F 0x72 0x20 0x62 0x61 0x63 0x6B 0x67 // 'or backg' 0x72 0x6F 0x75 0x6E 0x64 0x20 0x77 0x68 // 'round wh' 0x6F 0x73 0x65 0x20 0x73 0x6F 0x75 0x6E // 'ose soun' 0x64 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 // 'd you wa' 0x6E 0x74 0x20 0x74 0x6F 0x20 0x72 0x65 // 'nt to re' 0x6D 0x6F 0x76 0x65 0x2E 0x0D 0x0A 0x01 // 'move.???' 0x20 0x55 0x6E 0x64 0x6F // ' Undo' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_7C= Key___Map #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7C, __HELP_NAME("Key: Map")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7C, __HELP_NAME("Key: Map")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp 0x0 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_7A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7C, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "Key___Map" ITEM "" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_7A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x88 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_77=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7A, 0x0) AG(4) FREE ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1020_bmp __HELP_SYMBOL( STN "helppic1020_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_7A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0F 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0F 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x21 0x00 0x00 0x01 // '????!???' 0x00 0x00 0x00 0x00 0x22 0x00 0x00 0x01 // '????"???' 0x01 0x00 0x00 0x00 0x24 0x00 0x00 0x01 // '????$???' 0x00 0x00 0x00 0x00 0x13 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x1D 0x00 0x00 0x03 // '???????' 0x0A 0x00 0x00 0xFD 0x21 0x00 0x00 0x03 // '???!???' 0x0F 0x00 0x00 0xFD 0x22 0x00 0x00 0x03 // '???"???' 0x0A 0x00 0x00 0xFD 0x23 0x00 0x00 0x03 // '???#???' 0x0F 0x00 0x00 0xFD 0x24 0x00 0x00 0x03 // '???$???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x11 0x00 0x00 0x82 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x02 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_7A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7A, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x53 0x68 0x6F // '??? Sho' 0x72 0x74 0x63 0x75 0x74 0x20 0x6B 0x65 // 'rtcut ke' 0x79 0x0D 0x0A 0x95 0x09 0x48 0x6F 0x6C // 'y???Hol' 0x64 0x20 0x64 0x6F 0x77 0x6E 0x20 0x43 // 'd down C' 0x74 0x72 0x6C 0x2B 0x4D 0x2E // 'trl+M.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_7D= Tip___Making_words_scroll #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7D, __HELP_NAME("Tip: Making words scroll")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7D, __HELP_NAME("Tip: Making words scroll")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp 0x0 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_80=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7D, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "Tip___Making_words_scroll" ITEM "" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_80=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x21 0x01 0x00 0x00 // '????!???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_7A=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_80, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) FREE ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpPlay __HELP_SYMBOL( STN "mbmpPlay" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_80=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_80, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0x02 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0xFC 0x00 0x00 0x01 // '???????' 0x01 0xF1 0x00 0x00 0x26 0x01 0x00 0x01 // '???&???' 0x01 0x00 0x00 0x00 0x27 0x01 0x00 0x01 // '????'???' 0x00 0x00 0x00 0x00 0x17 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x2E 0x00 0x00 0x03 // '???.???' 0x0F 0x00 0x00 0xFD 0x27 0x01 0x00 0x03 // '???'???' 0x00 0x00 0x00 0x00 0x2E 0x00 0x00 0x80 // '????.??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xFC 0x00 0x00 0x82 // '??????' 0xFB 0xFF 0x00 0x00 0x00 0x00 0x00 0xC0 // '?????' 0x01 0x00 0x00 0x00 0x26 0x01 0x00 0xC0 // '????&??' 0x03 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_80=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_80, 0x0) BYTE 0x03 0x03 0x01 0x09 0x4D 0x61 0x6B 0x69 // '????Maki' 0x6E 0x67 0x20 0x63 0x72 0x65 0x64 0x69 // 'ng credi' 0x74 0x73 0x20 0x73 0x63 0x72 0x6F 0x6C // 'ts scrol' 0x6C 0x0D 0x0A 0x54 0x6F 0x20 0x73 0x65 // 'l??To se' 0x65 0x20 0x77 0x6F 0x72 0x64 0x73 0x20 // 'e words ' 0x73 0x63 0x72 0x6F 0x6C 0x6C 0x0D 0x0A // 'scroll??' 0x31 0x09 0x54 0x79 0x70 0x65 0x20 0x65 // '1?Type e' 0x6E 0x6F 0x75 0x67 0x68 0x20 0x77 0x6F // 'nough wo' 0x72 0x64 0x73 0x20 0x74 0x6F 0x20 0x66 // 'rds to f' 0x69 0x6C 0x6C 0x20 0x75 0x70 0x20 0x74 // 'ill up t' 0x68 0x65 0x20 0x63 0x72 0x65 0x64 0x69 // 'he credi' 0x74 0x73 0x20 0x62 0x6F 0x78 0x2E 0x0D // 'ts box.?' 0x0A 0x32 0x09 0x49 0x66 0x20 0x79 0x6F // '?2?If yo' 0x75 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 // 'u want t' 0x68 0x65 0x20 0x77 0x6F 0x72 0x64 0x73 // 'he words' 0x20 0x74 0x6F 0x20 0x73 0x63 0x72 0x6F // ' to scro' 0x6C 0x6C 0x20 0x63 0x6F 0x6D 0x70 0x6C // 'll compl' 0x65 0x74 0x65 0x6C 0x79 0x20 0x6F 0x66 // 'etely of' 0x66 0x20 0x74 0x68 0x65 0x20 0x73 0x63 // 'f the sc' 0x72 0x65 0x65 0x6E 0x2C 0x20 0x61 0x64 // 'reen, ad' 0x64 0x20 0x62 0x6C 0x61 0x6E 0x6B 0x20 // 'd blank ' 0x6C 0x69 0x6E 0x65 0x73 0x20 0x74 0x6F // 'lines to' 0x20 0x74 0x68 0x65 0x20 0x63 0x72 0x65 // ' the cre' 0x64 0x69 0x74 0x73 0x20 0x62 0x6F 0x78 // 'dits box' 0x20 0x62 0x79 0x20 0x70 0x72 0x65 0x73 // ' by pres' 0x73 0x69 0x6E 0x67 0x20 0x45 0x6E 0x74 // 'sing Ent' 0x65 0x72 0x20 0x75 0x6E 0x74 0x69 0x6C // 'er until' 0x20 0x79 0x6F 0x75 0x20 0x6E 0x6F 0x20 // ' you no ' 0x6C 0x6F 0x6E 0x67 0x65 0x72 0x20 0x73 // 'longer s' 0x65 0x65 0x20 0x61 0x6E 0x79 0x20 0x6F // 'ee any o' 0x66 0x20 0x74 0x68 0x65 0x20 0x77 0x6F // 'f the wo' 0x72 0x64 0x73 0x2E 0x0D 0x0A 0x33 0x09 // 'rds.??3?' 0x57 0x68 0x65 0x6E 0x20 0x79 0x6F 0x75 // 'When you' 0x27 0x72 0x65 0x20 0x64 0x6F 0x6E 0x65 // ''re done' 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 // ', click ' 0x74 0x68 0x65 0x20 0x50 0x6C 0x61 0x79 // 'the Play' 0x20 0x62 0x75 0x74 0x74 0x6F 0x6E 0x2D // ' button-' 0x01 // '?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_83= Tip___Move_Up_or_Down_3 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_83, __HELP_NAME("Tip: Move Up or Down 3")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_83, __HELP_NAME("Tip: Move Up or Down 3")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp 0x0 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_83, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "Tip___Move_Up_or_Down_3" ITEM "" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_83, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE2 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_36=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3A, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_3A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0x03 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x24 0x00 0x00 0x01 // '????$???' 0x00 0x00 0x00 0x00 0x26 0x00 0x00 0x01 // '????&???' 0x01 0x00 0x00 0x00 0x63 0x00 0x00 0x01 // '????c???' 0x00 0x00 0x00 0x00 0x65 0x00 0x00 0x01 // '????e???' 0x01 0x00 0x00 0x00 0x96 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x26 0x00 0x00 0x03 // '????&???' 0x0A 0x00 0x00 0xFD 0x63 0x00 0x00 0x03 // '???c???' 0x00 0x00 0x00 0x00 0x65 0x00 0x00 0x80 // '????e??' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x65 0x00 0x00 0x82 // '????e??' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3A, 0x0) BYTE 0x03 0x03 0x01 0x20 0x20 0x4D 0x6F 0x76 // '??? Mov' 0x69 0x6E 0x67 0x20 0x75 0x70 0x20 0x6F // 'ing up o' 0x72 0x20 0x64 0x6F 0x77 0x6E 0x20 0x61 // 'r down a' 0x6E 0x64 0x20 0x6E 0x65 0x61 0x72 0x20 // 'nd near ' 0x6F 0x72 0x20 0x66 0x61 0x72 0x0D 0x0A // 'or far??' 0x54 0x6F 0x20 0x6D 0x6F 0x76 0x65 0x20 // 'To move ' 0x61 0x6E 0x20 0x61 0x63 0x74 0x6F 0x72 // 'an actor' 0x2C 0x20 0x70 0x72 0x6F 0x70 0x2C 0x20 // ', prop, ' 0x6F 0x72 0x20 0x33 0x44 0x20 0x77 0x6F // 'or 3D wo' 0x72 0x64 0x20 0x75 0x70 0x20 0x6F 0x72 // 'rd up or' 0x20 0x64 0x6F 0x77 0x6E 0x20 0x61 0x6E // ' down an' 0x64 0x20 0x6E 0x65 0x61 0x72 0x20 0x6F // 'd near o' 0x72 0x20 0x66 0x61 0x72 0x0D 0x0A 0x95 // 'r far??' 0x09 0x48 0x6F 0x6C 0x64 0x20 0x64 0x6F // '?Hold do' 0x77 0x6E 0x20 0x74 0x68 0x65 0x20 0x55 // 'wn the U' 0x70 0x20 0x6F 0x72 0x20 0x44 0x6F 0x77 // 'p or Dow' 0x6E 0x20 0x41 0x72 0x72 0x6F 0x77 0x20 // 'n Arrow ' 0x6B 0x65 0x79 0x20 0x61 0x73 0x20 0x79 // 'key as y' 0x6F 0x75 0x20 0x64 0x72 0x61 0x67 0x2E // 'ou drag.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_92= Tip___Path_through_ground #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_92, __HELP_NAME("Tip: Path through ground")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_92, __HELP_NAME("Tip: Path through ground")) __HELP_PACK2 BO OSK LONG kgobBalloonHotHelp 0x0 0x0 0xFFFFFFFF 0x140 0xF0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_11=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_92, 0x0) GST(0) ITEM "kgobBalloonHotHelp" ITEM "Tip___Path_through_ground" ITEM "" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_11=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_92, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE0 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_74=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_11, 0x0) AG(4) ITEM LONG 0xC0000001 VAR LONG 'MBMP' mbmpActorsGround __HELP_SYMBOL( STN "mbmpActorsGround" ) ITEM LONG 0xC0000001 VAR LONG 'MBMP' helppic1016_bmp __HELP_SYMBOL( STN "helppic1016_bmp" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_11=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_11, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x12 0x00 0x00 0x00 0x02 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x23 0x00 0x00 0x01 // '????#???' 0x00 0x00 0x00 0x00 0x25 0x00 0x00 0x01 // '????%???' 0x01 0x00 0x00 0x00 0x62 0x00 0x00 0x01 // '????b???' 0x00 0x00 0x00 0x00 0x64 0x00 0x00 0x01 // '????d???' 0x01 0x00 0x00 0x00 0x87 0x00 0x00 0x01 // '???????' 0x01 0xF1 0x00 0x00 0x88 0x00 0x00 0x01 // '??????' 0x01 0xF6 0x00 0x00 0x8F 0x00 0x00 0x01 // '??????' 0x01 0x00 0x00 0x00 0x1C 0x01 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x25 0x00 0x00 0x03 // '????%???' 0x0A 0x00 0x00 0xFD 0x62 0x00 0x00 0x03 // '???b???' 0x00 0x00 0x00 0x00 0x64 0x00 0x00 0x80 // '????d??' 0x00 0x00 0x02 0x00 0x92 0x00 0x00 0x80 // '??????' 0x00 0x00 0x03 0x00 0xC8 0x00 0x00 0x80 // '??????' 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0xC8 0x00 0x00 0x82 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 // '???????' 0x02 0x00 0x00 0x00 0x8F 0x00 0x00 0xC0 // '??????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_11=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_11, 0x0) BYTE 0x03 0x03 0x01 0x20 0x4D 0x6F 0x76 0x69 // '??? Movi' 0x6E 0x67 0x20 0x74 0x68 0x72 0x6F 0x75 // 'ng throu' 0x67 0x68 0x20 0x74 0x68 0x65 0x20 0x67 // 'gh the g' 0x72 0x6F 0x75 0x6E 0x64 0x20 0x73 0x75 // 'round su' 0x72 0x66 0x61 0x63 0x65 0x0D 0x0A 0x54 // 'rface??T' 0x6F 0x20 0x6D 0x6F 0x76 0x65 0x20 0x61 // 'o move a' 0x6E 0x20 0x61 0x63 0x74 0x6F 0x72 0x2C // 'n actor,' 0x20 0x70 0x72 0x6F 0x70 0x2C 0x20 0x6F // ' prop, o' 0x72 0x20 0x33 0x44 0x20 0x77 0x6F 0x72 // 'r 3D wor' 0x64 0x20 0x74 0x68 0x72 0x6F 0x75 0x67 // 'd throug' 0x68 0x20 0x74 0x68 0x65 0x20 0x67 0x72 // 'h the gr' 0x6F 0x75 0x6E 0x64 0x20 0x73 0x75 0x72 // 'ound sur' 0x66 0x61 0x63 0x65 0x0D 0x0A 0x31 0x09 // 'face??1?' 0x22 0x54 0x75 0x72 0x6E 0x20 0x6F 0x6E // '"Turn on' 0x22 0x20 0x74 0x68 0x65 0x20 0x46 0x61 // '" the Fa' 0x6C 0x6C 0x20 0x54 0x68 0x72 0x6F 0x75 // 'll Throu' 0x67 0x68 0x20 0x47 0x72 0x6F 0x75 0x6E // 'gh Groun' 0x64 0x20 0x62 0x75 0x74 0x74 0x6F 0x6E // 'd button' 0x2D 0x01 0x0D 0x0A 0x57 0x68 0x65 0x6E // '-???When' 0x20 0x22 0x6F 0x6E 0x2C 0x22 0x20 0x74 // ' "on," t' 0x68 0x65 0x20 0x62 0x75 0x74 0x74 0x6F // 'he butto' 0x6E 0x20 0x69 0x73 0x20 0x70 0x75 0x73 // 'n is pus' 0x68 0x65 0x64 0x20 0x69 0x6E 0x20 0x61 // 'hed in a' 0x6E 0x64 0x20 0x69 0x74 0x20 0x6C 0x69 // 'nd it li' 0x67 0x68 0x74 0x73 0x20 0x75 0x70 0x2E // 'ghts up.' 0x0D 0x0A 0x32 0x09 0x48 0x6F 0x6C 0x64 // '??2?Hold' 0x20 0x64 0x6F 0x77 0x6E 0x20 0x74 0x68 // ' down th' 0x65 0x20 0x44 0x6F 0x77 0x6E 0x20 0x41 // 'e Down A' 0x72 0x72 0x6F 0x77 0x20 0x6B 0x65 0x79 // 'rrow key' 0x20 0x61 0x73 0x20 0x79 0x6F 0x75 0x20 // ' as you ' 0x64 0x72 0x61 0x67 0x20 0x74 0x68 0x65 // 'drag the' 0x20 0x33 0x44 0x20 0x6F 0x62 0x6A 0x65 // ' 3D obje' 0x63 0x74 0x20 0x74 0x68 0x72 0x6F 0x75 // 'ct throu' 0x67 0x68 0x20 0x74 0x68 0x65 0x20 0x67 // 'gh the g' 0x72 0x6F 0x75 0x6E 0x64 0x20 0x73 0x75 // 'round su' 0x72 0x66 0x61 0x63 0x65 0x2E // 'rface.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK ================================================ FILE: src/help/tooltips.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ #undef __HELP_NAME #undef __HELP_SYMBOL #undef __HELP_PACK #undef __HELP_PACK2 #ifdef NO_HELP_NAMES #define __HELP_NAME(name) "" #else #define __HELP_NAME(name) name #endif #ifdef NO_HELP_SYMBOLS #define __HELP_SYMBOL(stuff) #else #define __HELP_SYMBOL(stuff) stuff #endif #ifdef PACK_HELP #define __HELP_PACK PACK #else #define __HELP_PACK #endif #ifdef HELP_SINGLE_CHUNK #define __HELP_PACK2 #else #define __HELP_PACK2 __HELP_PACK #endif SET _help_48544F50_0= kttSettingsCover #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("ttScenes")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("ttScenes")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTipAO 0x0 kidSettingsCover kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips00 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) GST(0) ITEM "kgobBalloonToolTipAO" ITEM "kttSettingsCover" ITEM "" ITEM "kidSettingsCover" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips00" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_3B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3B, 0x0) BYTE 0x03 0x03 // '??' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1= kttSettingsBrowser #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("ttSceneChoices")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("ttSceneChoices")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidSettingsBrowser kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips01 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttSettingsBrowser" ITEM "" ITEM "kidSettingsBrowser" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips01" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD6 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_3A=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1F, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0D 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x0F 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x31 0x00 0x00 0x01 // '????1???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0F 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0D 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1F, 0x0) BYTE 0x03 0x03 0x53 0x63 0x65 0x6E 0x65 0x20 // '??Scene ' 0x43 0x68 0x6F 0x69 0x63 0x65 0x73 0x0D // 'Choices?' 0x0A 0x43 0x68 0x6F 0x6F 0x73 0x65 0x20 // '?Choose ' 0x66 0x72 0x6F 0x6D 0x20 0x6D 0x61 0x6E // 'from man' 0x79 0x20 0x64 0x69 0x66 0x66 0x65 0x72 // 'y differ' 0x65 0x6E 0x74 0x20 0x73 0x63 0x65 0x6E // 'ent scen' 0x65 0x73 0x21 // 'es!' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2= kttSettingsCameras #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2, __HELP_NAME("ttCameraAngles")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2, __HELP_NAME("ttCameraAngles")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidSettingsCameras kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips02 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_12=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttSettingsCameras" ITEM "" ITEM "kidSettingsCameras" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips02" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_12=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA5 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_40=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_12, 0x0) AG(4) ITEM LONG 0x2000003 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_12=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_12, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0B 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0D 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x0F 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x43 0x00 0x00 0x01 // '????C???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0F 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x22 0x00 0x00 0x02 // '????"???' 0x01 0x00 0x00 0x00 0x2D 0x00 0x00 0x02 // '????-???' 0x01 0x00 0x00 0x00 0x43 0x00 0x00 0x02 // '????C???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0D 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_12=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_12, 0x0) BYTE 0x03 0x03 0x43 0x61 0x6D 0x65 0x72 0x61 // '??Camera' 0x20 0x41 0x6E 0x67 0x6C 0x65 0x73 0x0D // ' Angles?' 0x0A 0x43 0x68 0x6F 0x6F 0x73 0x65 0x20 // '?Choose ' 0x61 0x20 0x64 0x69 0x66 0x66 0x65 0x72 // 'a differ' 0x65 0x6E 0x74 0x20 0x63 0x61 0x6D 0x65 // 'ent came' 0x72 0x61 0x20 0x76 0x69 0x65 0x77 0x20 // 'ra view ' 0x6F 0x66 0x20 0x74 0x68 0x65 0x20 0x63 // 'of the c' 0x75 0x72 0x72 0x65 0x6E 0x74 0x20 0x73 // 'urrent s' 0x63 0x65 0x6E 0x65 0x2E // 'cene.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3= kttSceneBackground #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3, __HELP_NAME("ttSceneSlider")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3, __HELP_NAME("ttSceneSlider")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidSceneBackground kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips03 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttSceneBackground" ITEM "" ITEM "kidSceneBackground" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips03" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA0 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_8=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x09 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0C 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x0E 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x27 0x00 0x00 0x01 // '????'???' 0x00 0x00 0x00 0x00 0x0C 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0E 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x27 0x00 0x00 0x02 // '????'???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0C 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) BYTE 0x03 0x03 0x53 0x63 0x65 0x6E 0x65 0x20 // '??Scene ' 0x53 0x6C 0x69 0x64 0x65 0x72 0x0D 0x0A // 'Slider??' 0x4D 0x6F 0x76 0x65 0x20 0x66 0x72 0x6F // 'Move fro' 0x6D 0x20 0x73 0x63 0x65 0x6E 0x65 0x20 // 'm scene ' 0x74 0x6F 0x20 0x73 0x63 0x65 0x6E 0x65 // 'to scene' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_4= kttActorsCover #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4, __HELP_NAME("ttActorsProps")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4, __HELP_NAME("ttActorsProps")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTipAO 0x0 kidActorsCover kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips04 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_5=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4, 0x0) GST(0) ITEM "kgobBalloonToolTipAO" ITEM "kttActorsCover" ITEM "" ITEM "kidActorsCover" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips04" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_5=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4, 0x0) BYTE 0x01 0x00 0x03 0x03 0xDE 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_5=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_5=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x03 0x03 // '??' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_5= kttActorsBrowser #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5, __HELP_NAME("ttActors")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5, __HELP_NAME("ttActors")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidActorsBrowser kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips05 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_34=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttActorsBrowser" ITEM "" ITEM "kidActorsBrowser" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips05" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_34=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2D=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_34, 0x0) AG(4) ITEM LONG 0x2000002 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_34=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_34, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0B 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x06 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x08 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x24 0x00 0x00 0x01 // '????$???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x08 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x19 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x23 0x00 0x00 0x02 // '????#???' 0x00 0x00 0x00 0x00 0x24 0x00 0x00 0x02 // '????$???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x06 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_34=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_34, 0x0) BYTE 0x03 0x03 0x41 0x63 0x74 0x6F 0x72 0x73 // '??Actors' 0x0D 0x0A 0x43 0x68 0x6F 0x6F 0x73 0x65 // '??Choose' 0x20 0x66 0x72 0x6F 0x6D 0x20 0x6D 0x61 // ' from ma' 0x6E 0x79 0x20 0x63 0x68 0x61 0x72 0x61 // 'ny chara' 0x63 0x74 0x65 0x72 0x73 0x21 // 'cters!' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_6= kttSceneSorter #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6, __HELP_NAME("ttSceneOrganizer")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6, __HELP_NAME("ttSceneOrganizer")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidSceneSorter kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips06 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttSceneSorter" ITEM "" ITEM "kidSceneSorter" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips06" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6, 0x0) BYTE 0x01 0x00 0x03 0x03 0x90 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_30=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x09 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0F 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x3C 0x00 0x00 0x01 // '???????' 0x01 0x00 0x00 0x00 0x44 0x00 0x00 0x02 // '????D???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0E 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x44 0x00 0x00 0x03 // '???D???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_6=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) BYTE 0x03 0x03 0x52 0x6F 0x74 0x61 0x74 0x65 // '??Rotate' 0x20 0x54 0x6F 0x6F 0x6C 0x73 0x0D 0x0A // ' Tools??' 0x43 0x68 0x61 0x6E 0x67 0x65 0x20 0x74 // 'Change t' 0x68 0x65 0x20 0x64 0x69 0x72 0x65 0x63 // 'he direc' 0x74 0x69 0x6F 0x6E 0x20 0x61 0x6E 0x20 // 'tion an ' 0x61 0x63 0x74 0x6F 0x72 0x2C 0x20 0x70 // 'actor, p' 0x72 0x6F 0x70 0x2C 0x20 0x6F 0x72 0x20 // 'rop, or ' 0x33 0x44 0x20 0x77 0x6F 0x72 0x64 0x20 // '3D word ' 0x66 0x61 0x63 0x65 0x73 0x2E // 'faces.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_F= kttActorsRotateY #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_F, __HELP_NAME("ttTurnLeftRight")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_F, __HELP_NAME("ttTurnLeftRight")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidActorsRotateY kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips0F ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_F, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttActorsRotateY" ITEM "" ITEM "kidActorsRotateY" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips0F" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x86 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_4=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x55 0x00 0x00 0x01 // '????U???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x18 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x14 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x55 0x00 0x00 0x03 // '???U???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) BYTE 0x03 0x03 0x54 0x75 0x72 0x6E 0x20 0x4C // '??Turn L' 0x65 0x66 0x74 0x20 0x6F 0x72 0x20 0x52 // 'eft or R' 0x69 0x67 0x68 0x74 0x0D 0x0A 0x54 0x75 // 'ight??Tu' 0x72 0x6E 0x20 0x6C 0x65 0x66 0x74 0x20 // 'rn left ' 0x6F 0x72 0x20 0x72 0x69 0x67 0x68 0x74 // 'or right' 0x2E 0x0D 0x0A 0x50 0x2E 0x53 0x2E 0x20 // '.??P.S. ' 0x20 0x48 0x6F 0x6C 0x64 0x20 0x64 0x6F // ' Hold do' 0x77 0x6E 0x20 0x43 0x74 0x72 0x6C 0x20 // 'wn Ctrl ' 0x74 0x6F 0x20 0x6D 0x61 0x6B 0x65 0x20 // 'to make ' 0x69 0x74 0x20 0x6C 0x61 0x73 0x74 0x20 // 'it last ' 0x6C 0x6F 0x6E 0x67 0x65 0x72 0x2E // 'longer.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_10= kttActorsRotateX #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_10, __HELP_NAME("ttTipForwardBack")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_10, __HELP_NAME("ttTipForwardBack")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidActorsRotateX kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips10 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_10, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttActorsRotateX" ITEM "" ITEM "kidActorsRotateX" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips10" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_10, 0x0) BYTE 0x01 0x00 0x03 0x03 0x89 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2F=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x57 0x00 0x00 0x01 // '????W???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x19 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x15 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x57 0x00 0x00 0x03 // '???W???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_F, 0x0) BYTE 0x03 0x03 0x54 0x69 0x70 0x20 0x46 0x6F // '??Tip Fo' 0x72 0x77 0x61 0x72 0x64 0x20 0x6F 0x72 // 'rward or' 0x20 0x42 0x61 0x63 0x6B 0x0D 0x0A 0x54 // ' Back??T' 0x69 0x70 0x20 0x66 0x6F 0x72 0x77 0x61 // 'ip forwa' 0x72 0x64 0x20 0x6F 0x72 0x20 0x62 0x61 // 'rd or ba' 0x63 0x6B 0x2E 0x0D 0x0A 0x50 0x2E 0x53 // 'ck.??P.S' 0x2E 0x20 0x20 0x48 0x6F 0x6C 0x64 0x20 // '. Hold ' 0x64 0x6F 0x77 0x6E 0x20 0x43 0x74 0x72 // 'down Ctr' 0x6C 0x20 0x74 0x6F 0x20 0x6D 0x61 0x6B // 'l to mak' 0x65 0x20 0x69 0x74 0x20 0x6C 0x61 0x73 // 'e it las' 0x74 0x20 0x6C 0x6F 0x6E 0x67 0x65 0x72 // 't longer' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_11= kttActorsRotateZ #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_11, __HELP_NAME("ttTipToOneSide")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_11, __HELP_NAME("ttTipToOneSide")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidActorsRotateZ kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips11 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_46=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_11, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttActorsRotateZ" ITEM "" ITEM "kidActorsRotateZ" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips11" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_46=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_11, 0x0) BYTE 0x01 0x00 0x03 0x03 0x84 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_38=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_46, 0x0) AG(4) ITEM LONG 0x2000002 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_46=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_46, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x50 0x00 0x00 0x01 // '????P???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x04 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x0F 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x15 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x11 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x24 0x00 0x00 0x03 // '????$???' 0x0F 0x00 0x00 0xFD 0x50 0x00 0x00 0x03 // '???P???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_46=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_46, 0x0) BYTE 0x03 0x03 0x54 0x69 0x70 0x20 0x74 0x6F // '??Tip to' 0x20 0x4F 0x6E 0x65 0x20 0x53 0x69 0x64 // ' One Sid' 0x65 0x0D 0x0A 0x54 0x69 0x70 0x20 0x73 // 'e??Tip s' 0x69 0x64 0x65 0x20 0x74 0x6F 0x20 0x73 // 'ide to s' 0x69 0x64 0x65 0x2E 0x0D 0x0A 0x50 0x2E // 'ide.??P.' 0x53 0x2E 0x20 0x20 0x48 0x6F 0x6C 0x64 // 'S. Hold' 0x20 0x64 0x6F 0x77 0x6E 0x20 0x43 0x74 // ' down Ct' 0x72 0x6C 0x20 0x74 0x6F 0x20 0x6D 0x61 // 'rl to ma' 0x6B 0x65 0x20 0x69 0x74 0x20 0x6C 0x61 // 'ke it la' 0x73 0x74 0x20 0x6C 0x6F 0x6E 0x67 0x65 // 'st longe' 0x72 0x2E // 'r.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_12= kttActorsRotateNorm #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_12, __HELP_NAME("ttChangeBackRotate")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_12, __HELP_NAME("ttChangeBackRotate")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidActorsRotateNorm kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips12 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_12, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttActorsRotateNorm" ITEM "" ITEM "kidActorsRotateNorm" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips12" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_12, 0x0) BYTE 0x01 0x00 0x03 0x03 0xF3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_39=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4A, 0x0) AG(4) ITEM LONG 0x2000002 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_4A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x09 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x5C 0x00 0x00 0x01 // '????\???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x15 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x30 0x00 0x00 0x02 // '????0???' 0x01 0x00 0x00 0x00 0x51 0x00 0x00 0x02 // '????Q???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0D 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x5C 0x00 0x00 0x03 // '???\???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4A, 0x0) BYTE 0x03 0x03 0x43 0x68 0x61 0x6E 0x67 0x65 // '??Change' 0x20 0x42 0x61 0x63 0x6B 0x0D 0x0A 0x43 // ' Back??C' 0x68 0x61 0x6E 0x67 0x65 0x20 0x61 0x6E // 'hange an' 0x20 0x61 0x63 0x74 0x6F 0x72 0x2C 0x20 // ' actor, ' 0x70 0x72 0x6F 0x70 0x2C 0x20 0x6F 0x72 // 'prop, or' 0x20 0x33 0x44 0x20 0x77 0x6F 0x72 0x64 // ' 3D word' 0x20 0x62 0x61 0x63 0x6B 0x20 0x74 0x6F // ' back to' 0x20 0x74 0x68 0x65 0x20 0x77 0x61 0x79 // ' the way' 0x20 0x69 0x74 0x20 0x77 0x61 0x73 0x20 // ' it was ' 0x62 0x65 0x66 0x6F 0x72 0x65 0x20 0x79 // 'before y' 0x6F 0x75 0x20 0x72 0x6F 0x74 0x61 0x74 // 'ou rotat' 0x65 0x64 0x20 0x69 0x74 0x2E // 'ed it.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_13= kttActorsSooner #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_13, __HELP_NAME("thSynchronize")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_13, __HELP_NAME("thSynchronize")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidActorsSooner kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips13 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_13, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttActorsSooner" ITEM "" ITEM "kidActorsSooner" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips13" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_13, 0x0) BYTE 0x01 0x00 0x03 0x03 0xCE 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_4E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x0B 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x0D 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x52 0x00 0x00 0x01 // '????R???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0B 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4E, 0x0) BYTE 0x03 0x03 0x53 0x79 0x6E 0x63 0x68 0x72 // '??Synchr' 0x6F 0x6E 0x69 0x7A 0x65 0x0D 0x0A 0x43 // 'onize??C' 0x68 0x61 0x6E 0x67 0x65 0x20 0x77 0x68 // 'hange wh' 0x65 0x6E 0x20 0x61 0x6E 0x20 0x61 0x63 // 'en an ac' 0x74 0x6F 0x72 0x2C 0x20 0x70 0x72 0x6F // 'tor, pro' 0x70 0x2C 0x20 0x6F 0x72 0x20 0x33 0x44 // 'p, or 3D' 0x20 0x77 0x6F 0x72 0x64 0x20 0x67 0x65 // ' word ge' 0x74 0x73 0x20 0x74 0x6F 0x20 0x61 0x20 // 'ts to a ' 0x70 0x61 0x72 0x74 0x69 0x63 0x75 0x6C // 'particul' 0x61 0x72 0x20 0x6C 0x6F 0x63 0x61 0x74 // 'ar locat' 0x69 0x6F 0x6E 0x2E // 'ion.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_14= kttActorsCompose #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_14, __HELP_NAME("ttReposition")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_14, __HELP_NAME("ttReposition")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidActorsCompose kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips14 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_8=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_14, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttActorsCompose" ITEM "" ITEM "kidActorsCompose" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips14" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_8=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_14, 0x0) BYTE 0x01 0x00 0x03 0x03 0xEE 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_15=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_8=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x59 0x00 0x00 0x01 // '????Y???' 0x00 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0C 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0C 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x59 0x00 0x00 0x03 // '???Y???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_8=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) BYTE 0x03 0x03 0x52 0x65 0x70 0x6F 0x73 0x69 // '??Reposi' 0x74 0x69 0x6F 0x6E 0x0D 0x0A 0x52 0x65 // 'tion??Re' 0x70 0x6F 0x73 0x69 0x74 0x69 0x6F 0x6E // 'position' 0x20 0x61 0x6E 0x20 0x61 0x63 0x74 0x6F // ' an acto' 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 0x2C // 'r, prop,' 0x20 0x6F 0x72 0x20 0x33 0x44 0x20 0x77 // ' or 3D w' 0x6F 0x72 0x64 0x20 0x61 0x6E 0x64 0x20 // 'ord and ' 0x69 0x74 0x73 0x20 0x70 0x61 0x74 0x68 // 'its path' 0x20 0x66 0x72 0x6F 0x6D 0x20 0x74 0x68 // ' from th' 0x65 0x20 0x63 0x75 0x72 0x72 0x65 0x6E // 'e curren' 0x74 0x20 0x66 0x72 0x61 0x6D 0x65 0x20 // 't frame ' 0x6F 0x6E 0x2E // 'on.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_15= kttActorsSelect #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_15, __HELP_NAME("blank")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_15, __HELP_NAME("blank")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidActorsSelect kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips15 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_15, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttActorsSelect" ITEM "" ITEM "kidActorsSelect" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips15" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_15, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2E, 0x0) BYTE 0x03 0x03 // '??' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_16= kttActorsActionBrowser #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_16, __HELP_NAME("ttActions")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_16, __HELP_NAME("ttActions")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidActorsActionBrowser kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips16 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_16, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttActorsActionBrowser" ITEM "" ITEM "kidActorsActionBrowser" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips16" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_16, 0x0) BYTE 0x01 0x00 0x03 0x03 0x97 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2A=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3F, 0x0) AG(4) ITEM LONG 0x2000002 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_3F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x09 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x39 0x00 0x00 0x01 // '????9???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x09 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x0A 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0E 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x09 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x39 0x00 0x00 0x03 // '???9???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3F, 0x0) BYTE 0x03 0x03 0x41 0x63 0x74 0x69 0x6F 0x6E // '??Action' 0x73 0x0D 0x0A 0x4D 0x61 0x6B 0x65 0x20 // 's??Make ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x6F // 'the acto' 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 0x2C // 'r, prop,' 0x20 0x6F 0x72 0x20 0x33 0x44 0x20 0x77 // ' or 3D w' 0x6F 0x72 0x64 0x20 0x79 0x6F 0x75 0x20 // 'ord you ' 0x63 0x6C 0x69 0x63 0x6B 0x20 0x6D 0x6F // 'click mo' 0x76 0x65 0x21 // 've!' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_17= kttActorsContinue #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_17, __HELP_NAME("ttResumeLastAction")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_17, __HELP_NAME("ttResumeLastAction")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidActorsContinue kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips17 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_16=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_17, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttActorsContinue" ITEM "" ITEM "kidActorsContinue" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips17" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_16=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_17, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_14=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_16, 0x0) AG(4) ITEM LONG 0x2000002 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_16=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_16, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x09 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x4D 0x00 0x00 0x01 // '????M???' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x07 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x0B 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x14 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x14 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x4D 0x00 0x00 0x03 // '???M???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_16=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_16, 0x0) BYTE 0x03 0x03 0x52 0x65 0x73 0x75 0x6D 0x65 // '??Resume' 0x20 0x4C 0x61 0x73 0x74 0x20 0x41 0x63 // ' Last Ac' 0x74 0x69 0x6F 0x6E 0x0D 0x0A 0x43 0x6F // 'tion??Co' 0x6E 0x74 0x69 0x6E 0x75 0x65 0x20 0x74 // 'ntinue t' 0x68 0x65 0x20 0x6C 0x61 0x73 0x74 0x20 // 'he last ' 0x61 0x63 0x74 0x69 0x6F 0x6E 0x20 0x61 // 'action a' 0x6E 0x20 0x61 0x63 0x74 0x6F 0x72 0x2C // 'n actor,' 0x20 0x70 0x72 0x6F 0x70 0x2C 0x20 0x6F // ' prop, o' 0x72 0x20 0x33 0x44 0x20 0x77 0x6F 0x72 // 'r 3D wor' 0x64 0x20 0x75 0x73 0x65 0x64 0x2E // 'd used.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_18= kttActorsRecordMode #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_18, __HELP_NAME("Cut")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_18, __HELP_NAME("Cut")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidActorsRecordMode kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips18 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_33=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_18, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttActorsRecordMode" ITEM "" ITEM "kidActorsRecordMode" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips18" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_33=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_18, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA9 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_33=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_33, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x03 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_33=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_33, 0x0) BYTE 0x03 0x03 // '??' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_19= kttActorsGround #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_19, __HELP_NAME("ttFallThroughGround")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_19, __HELP_NAME("ttFallThroughGround")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidActorsGround kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips19 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_19, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttActorsGround" ITEM "" ITEM "kidActorsGround" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips19" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_19, 0x0) BYTE 0x01 0x00 0x03 0x03 0xDE 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_D=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B, 0x0) AG(4) ITEM LONG 0x2000004 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0D 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x7D 0x00 0x00 0x01 // '????}???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x25 0x00 0x00 0x02 // '????%???' 0x00 0x00 0x00 0x00 0x26 0x00 0x00 0x02 // '????&???' 0x01 0x00 0x00 0x00 0x29 0x00 0x00 0x02 // '????)???' 0x00 0x00 0x00 0x00 0x42 0x00 0x00 0x02 // '????B???' 0x01 0x00 0x00 0x00 0x47 0x00 0x00 0x02 // '????G???' 0x00 0x00 0x00 0x00 0x57 0x00 0x00 0x02 // '????W???' 0x01 0x00 0x00 0x00 0x5E 0x00 0x00 0x02 // '????^???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x15 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x7D 0x00 0x00 0x03 // '???}???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B, 0x0) BYTE 0x03 0x03 0x46 0x61 0x6C 0x6C 0x20 0x54 // '??Fall T' 0x68 0x72 0x6F 0x75 0x67 0x68 0x20 0x47 // 'hrough G' 0x72 0x6F 0x75 0x6E 0x64 0x0D 0x0A 0x57 // 'round??W' 0x68 0x65 0x6E 0x20 0x74 0x68 0x69 0x73 // 'hen this' 0x20 0x69 0x73 0x20 0x22 0x6F 0x6E 0x2C // ' is "on,' 0x22 0x20 0x61 0x6E 0x20 0x61 0x63 0x74 // '" an act' 0x6F 0x72 0x2C 0x20 0x70 0x72 0x6F 0x70 // 'or, prop' 0x2C 0x20 0x6F 0x72 0x20 0x33 0x44 0x20 // ', or 3D ' 0x77 0x6F 0x72 0x64 0x20 0x63 0x61 0x6E // 'word can' 0x20 0x6D 0x6F 0x76 0x65 0x20 0x74 0x68 // ' move th' 0x72 0x6F 0x75 0x67 0x68 0x20 0x74 0x68 // 'rough th' 0x65 0x20 0x67 0x72 0x6F 0x75 0x6E 0x64 // 'e ground' 0x20 0x73 0x75 0x72 0x66 0x61 0x63 0x65 // ' surface' 0x2E 0x20 0x20 0x4F 0x74 0x68 0x65 0x72 // '. Other' 0x77 0x69 0x73 0x65 0x2C 0x20 0x69 0x74 // 'wise, it' 0x20 0x63 0x61 0x6E 0x27 0x74 0x2E // ' can't.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1A= kttActorsXY #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1A, __HELP_NAME("ttUpandDown")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1A, __HELP_NAME("ttUpandDown")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidActorsXY kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips1A ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1A, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttActorsXY" ITEM "" ITEM "kidActorsXY" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips1A" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1A, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1C=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1E, 0x0) AG(4) ITEM LONG 0x2000004 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0E 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x6C 0x00 0x00 0x01 // '????l???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x03 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x04 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x1B 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x1C 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x2C 0x00 0x00 0x02 // '????,???' 0x00 0x00 0x00 0x00 0x47 0x00 0x00 0x02 // '????G???' 0x01 0x00 0x00 0x00 0x50 0x00 0x00 0x02 // '????P???' 0x00 0x00 0x00 0x00 0x6C 0x00 0x00 0x02 // '????l???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0B 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x6C 0x00 0x00 0x03 // '???l???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1E, 0x0) BYTE 0x03 0x03 0x55 0x70 0x20 0x26 0x20 0x44 // '??Up & D' 0x6F 0x77 0x6E 0x0D 0x0A 0x57 0x68 0x65 // 'own??Whe' 0x6E 0x20 0x74 0x68 0x69 0x73 0x20 0x69 // 'n this i' 0x73 0x20 0x22 0x6F 0x6E 0x2C 0x22 0x20 // 's "on," ' 0x79 0x6F 0x75 0x20 0x63 0x61 0x6E 0x20 // 'you can ' 0x6D 0x6F 0x76 0x65 0x20 0x61 0x6E 0x20 // 'move an ' 0x61 0x63 0x74 0x6F 0x72 0x2C 0x20 0x70 // 'actor, p' 0x72 0x6F 0x70 0x2C 0x20 0x6F 0x72 0x20 // 'rop, or ' 0x33 0x44 0x20 0x77 0x6F 0x72 0x64 0x20 // '3D word ' 0x75 0x70 0x20 0x61 0x6E 0x64 0x20 0x64 // 'up and d' 0x6F 0x77 0x6E 0x20 0x28 0x69 0x6E 0x73 // 'own (ins' 0x74 0x65 0x61 0x64 0x20 0x6F 0x66 0x20 // 'tead of ' 0x6E 0x65 0x61 0x72 0x20 0x61 0x6E 0x64 // 'near and' 0x20 0x66 0x61 0x72 0x29 0x2E // ' far).' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1B= kttActorsBiography #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1B, __HELP_NAME("ttTalentBook")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1B, __HELP_NAME("ttTalentBook")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidActorsBiography kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips1B ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_45=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1B, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttActorsBiography" ITEM "" ITEM "kidActorsBiography" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips1B" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_45=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1B, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC1 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_41=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_45, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_45=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_45, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x4D 0x00 0x00 0x01 // '????M???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x4D 0x00 0x00 0x02 // '????M???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0D 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x4D 0x00 0x00 0x03 // '???M???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_45=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_45, 0x0) BYTE 0x03 0x03 0x54 0x61 0x6C 0x65 0x6E 0x74 // '??Talent' 0x20 0x42 0x6F 0x6F 0x6B 0x0D 0x0A 0x47 // ' Book??G' 0x69 0x76 0x65 0x73 0x20 0x79 0x6F 0x75 // 'ives you' 0x20 0x74 0x68 0x65 0x20 0x73 0x63 0x6F // ' the sco' 0x6F 0x70 0x20 0x6F 0x6E 0x20 0x61 0x6C // 'op on al' 0x6C 0x20 0x74 0x68 0x65 0x20 0x61 0x63 // 'l the ac' 0x74 0x6F 0x72 0x73 0x20 0x79 0x6F 0x75 // 'tors you' 0x20 0x63 0x61 0x6E 0x20 0x75 0x73 0x65 // ' can use' 0x20 0x69 0x6E 0x20 0x79 0x6F 0x75 0x72 // ' in your' 0x20 0x6D 0x6F 0x76 0x69 0x65 0x21 // ' movie!' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1C= kttRollCallActorFrame #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1C, __HELP_NAME("ttActorList")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1C, __HELP_NAME("ttActorList")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidRollCallActorFrame kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips1C ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_30=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1C, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttRollCallActorFrame" ITEM "" ITEM "kidRollCallActorFrame" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips1C" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_30=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x99 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2C=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_30, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_30=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_30, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x3B 0x00 0x00 0x01 // '????;???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x3B 0x00 0x00 0x02 // '????;???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0C 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x3B 0x00 0x00 0x03 // '???;???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_30=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_30, 0x0) BYTE 0x03 0x03 0x41 0x63 0x74 0x6F 0x72 0x20 // '??Actor ' 0x4C 0x69 0x73 0x74 0x0D 0x0A 0x53 0x68 // 'List??Sh' 0x6F 0x77 0x73 0x20 0x79 0x6F 0x75 0x20 // 'ows you ' 0x74 0x68 0x65 0x20 0x61 0x63 0x74 0x6F // 'the acto' 0x72 0x73 0x20 0x79 0x6F 0x75 0x27 0x76 // 'rs you'v' 0x65 0x20 0x75 0x73 0x65 0x64 0x20 0x69 // 'e used i' 0x6E 0x20 0x79 0x6F 0x75 0x72 0x20 0x6D // 'n your m' 0x6F 0x76 0x69 0x65 0x2E // 'ovie.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1D= kttRollCallPropFrame #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1D, __HELP_NAME("ttPropList")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1D, __HELP_NAME("ttPropList")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidRollCallPropFrame kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips1D ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_14=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1D, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttRollCallPropFrame" ITEM "" ITEM "kidRollCallPropFrame" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips1D" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_14=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1D, 0x0) BYTE 0x01 0x00 0x03 0x03 0xBF 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_12=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_14, 0x0) AG(4) ITEM LONG 0x2000003 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_14=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_14, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0B 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x46 0x00 0x00 0x01 // '????F???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x04 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x05 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x23 0x00 0x00 0x02 // '????#???' 0x00 0x00 0x00 0x00 0x2B 0x00 0x00 0x02 // '????+???' 0x01 0x00 0x00 0x00 0x46 0x00 0x00 0x02 // '????F???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0B 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x46 0x00 0x00 0x03 // '???F???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_14=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_14, 0x0) BYTE 0x03 0x03 0x50 0x72 0x6F 0x70 0x20 0x4C // '??Prop L' 0x69 0x73 0x74 0x0D 0x0A 0x53 0x68 0x6F // 'ist??Sho' 0x77 0x73 0x20 0x79 0x6F 0x75 0x20 0x74 // 'ws you t' 0x68 0x65 0x20 0x70 0x72 0x6F 0x70 0x73 // 'he props' 0x20 0x61 0x6E 0x64 0x20 0x33 0x44 0x20 // ' and 3D ' 0x77 0x6F 0x72 0x64 0x73 0x20 0x79 0x6F // 'words yo' 0x75 0x27 0x76 0x65 0x20 0x75 0x73 0x65 // 'u've use' 0x64 0x20 0x69 0x6E 0x20 0x79 0x6F 0x75 // 'd in you' 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 0x2E // 'r movie.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1E= kttSoundsCover #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1E, __HELP_NAME("ttSoundTools")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1E, __HELP_NAME("ttSoundTools")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTipAO 0x0 kidSoundsCover kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips1E ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_43=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1E, 0x0) GST(0) ITEM "kgobBalloonToolTipAO" ITEM "kttSoundsCover" ITEM "" ITEM "kidSoundsCover" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips1E" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_43=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1E, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB0 0x01 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_43=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_43, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_43=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_43, 0x0) BYTE 0x03 0x03 // '??' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1F= kttSoundsEfxBrowser #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1F, __HELP_NAME("ttSoundEffects")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1F, __HELP_NAME("ttSoundEffects")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidSoundsEfxBrowser kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips1F ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_50=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1F, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttSoundsEfxBrowser" ITEM "" ITEM "kidSoundsEfxBrowser" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips1F" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_50=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x73 0x00 0x00 0x00 // '????s???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_3=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_50, 0x0) AG(4) ITEM LONG 0x2000002 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_50=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_50, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x09 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x21 0x00 0x00 0x01 // '????!???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0F 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x12 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x20 0x00 0x00 0x02 // '???? ???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0F 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x21 0x00 0x00 0x03 // '???!???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_50=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_50, 0x0) BYTE 0x03 0x03 0x53 0x6F 0x75 0x6E 0x64 0x20 // '??Sound ' 0x45 0x66 0x66 0x65 0x63 0x74 0x73 0x0D // 'Effects?' 0x0A 0x41 0x64 0x64 0x20 0x73 0x6F 0x75 // '?Add sou' 0x6E 0x64 0x20 0x65 0x66 0x66 0x65 0x63 // 'nd effec' 0x74 0x73 0x2E // 'ts.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_20= kttSoundsMicBrowser #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_20, __HELP_NAME("ttSpeech")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_20, __HELP_NAME("ttSpeech")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kttSoundsMicBrowser kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips20 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_20, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttSoundsMicBrowser" ITEM "" ITEM "kttSoundsMicBrowser" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips20" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_20, 0x0) BYTE 0x01 0x00 0x03 0x03 0x79 0x00 0x00 0x00 // '????y???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_3C=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1D, 0x0) AG(4) ITEM LONG 0x2000002 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x09 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x1B 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0C 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x0F 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x1B 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x08 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x1B 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1D, 0x0) BYTE 0x03 0x03 0x53 0x70 0x65 0x65 0x63 0x68 // '??Speech' 0x0D 0x0A 0x4D 0x61 0x6B 0x65 0x20 0x61 // '??Make a' 0x6E 0x20 0x61 0x63 0x74 0x6F 0x72 0x20 // 'n actor ' 0x74 0x61 0x6C 0x6B 0x21 // 'talk!' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_21= kttSoundsMusicBrowser #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_21, __HELP_NAME("ttMusic")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_21, __HELP_NAME("ttMusic")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidSoundsMusicBrowser kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips21 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_18=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_21, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttSoundsMusicBrowser" ITEM "" ITEM "kidSoundsMusicBrowser" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips21" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_18=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_21, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB5 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_16=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_18, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_18=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_18, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x24 0x00 0x00 0x01 // '????$???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x23 0x00 0x00 0x02 // '????#???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x07 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x24 0x00 0x00 0x03 // '???$???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_18=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_18, 0x0) BYTE 0x03 0x03 0x4D 0x75 0x73 0x69 0x63 0x0D // '??Music?' 0x0A 0x41 0x74 0x74 0x61 0x63 0x68 0x20 // '?Attach ' 0x6D 0x75 0x73 0x69 0x63 0x20 0x74 0x6F // 'music to' 0x20 0x61 0x20 0x62 0x61 0x63 0x6B 0x67 // ' a backg' 0x72 0x6F 0x75 0x6E 0x64 0x2E // 'round.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_22= kttSoundsPlayOnce #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_22, __HELP_NAME("ttPlayOnce")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_22, __HELP_NAME("ttPlayOnce")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidSoundsPlayOnce kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips22 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_13=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_22, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttSoundsPlayOnce" ITEM "" ITEM "kidSoundsPlayOnce" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips22" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_13=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_22, 0x0) BYTE 0x01 0x00 0x03 0x03 0xAA 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_11=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_13, 0x0) AG(4) ITEM LONG 0x2000003 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_13=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_13, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0B 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x3F 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x07 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x09 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0B 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x14 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x29 0x00 0x00 0x02 // '????)???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0B 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x3F 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_13=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_13, 0x0) BYTE 0x03 0x03 0x50 0x6C 0x61 0x79 0x20 0x4F // '??Play O' 0x6E 0x63 0x65 0x0D 0x0A 0x41 0x74 0x74 // 'nce??Att' 0x61 0x63 0x68 0x65 0x73 0x20 0x74 0x68 // 'aches th' 0x65 0x20 0x73 0x6F 0x75 0x6E 0x64 0x20 // 'e sound ' 0x79 0x6F 0x75 0x20 0x63 0x68 0x6F 0x6F // 'you choo' 0x73 0x65 0x20 0x61 0x6E 0x64 0x20 0x70 // 'se and p' 0x6C 0x61 0x79 0x73 0x20 0x69 0x74 0x20 // 'lays it ' 0x6F 0x6E 0x65 0x20 0x74 0x69 0x6D 0x65 // 'one time' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_23= kttSoundsLooping #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_23, __HELP_NAME("ttLoop")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_23, __HELP_NAME("ttLoop")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidSoundsLooping kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips23 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_23, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttSoundsLooping" ITEM "" ITEM "kidSoundsLooping" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips23" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_23, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_4=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) AG(4) ITEM LONG 0x2000002 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x09 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x3E 0x00 0x00 0x01 // '????>???' 0x00 0x00 0x00 0x00 0x04 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x06 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x0E 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x24 0x00 0x00 0x02 // '????$???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x06 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x3E 0x00 0x00 0x03 // '???>???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2, 0x0) BYTE 0x03 0x03 0x4C 0x6F 0x6F 0x70 0x0D 0x0A // '??Loop??' 0x41 0x74 0x74 0x61 0x63 0x68 0x65 0x73 // 'Attaches' 0x20 0x74 0x68 0x65 0x20 0x73 0x6F 0x75 // ' the sou' 0x6E 0x64 0x20 0x79 0x6F 0x75 0x20 0x63 // 'nd you c' 0x68 0x6F 0x6F 0x73 0x65 0x20 0x61 0x6E // 'hoose an' 0x64 0x20 0x70 0x6C 0x61 0x79 0x73 0x20 // 'd plays ' 0x69 0x74 0x20 0x63 0x6F 0x6E 0x74 0x69 // 'it conti' 0x6E 0x75 0x6F 0x75 0x73 0x6C 0x79 0x2E // 'nuously.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_24= kttSoundsAttachToCell #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_24, __HELP_NAME("ttActionMatcher")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_24, __HELP_NAME("ttActionMatcher")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidSoundsAttachToCell kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips24 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_24, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttSoundsAttachToCell" ITEM "" ITEM "kidSoundsAttachToCell" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips24" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_24, 0x0) BYTE 0x01 0x00 0x03 0x03 0x95 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_6=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) AG(4) ITEM LONG 0x2000002 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x09 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x40 0x00 0x00 0x01 // '????@???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x16 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x23 0x00 0x00 0x02 // '????#???' 0x01 0x00 0x00 0x00 0x24 0x00 0x00 0x02 // '????$???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x10 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x40 0x00 0x00 0x03 // '???@???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) BYTE 0x03 0x03 0x41 0x63 0x74 0x69 0x6F 0x6E // '??Action' 0x20 0x4D 0x61 0x74 0x63 0x68 0x65 0x72 // ' Matcher' 0x0D 0x0A 0x41 0x74 0x74 0x61 0x63 0x68 // '??Attach' 0x65 0x73 0x20 0x61 0x20 0x73 0x6F 0x75 // 'es a sou' 0x6E 0x64 0x20 0x74 0x6F 0x20 0x74 0x68 // 'nd to th' 0x65 0x20 0x63 0x75 0x72 0x72 0x65 0x6E // 'e curren' 0x74 0x20 0x61 0x63 0x74 0x69 0x6F 0x6E // 't action' 0x20 0x70 0x6F 0x73 0x69 0x74 0x69 0x6F // ' positio' 0x6E 0x2E // 'n.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_25= kttSoundsListen #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_25, __HELP_NAME("ttListener")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_25, __HELP_NAME("ttListener")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidSoundsListen kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips25 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_21=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_25, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttSoundsListen" ITEM "" ITEM "kidSoundsListen" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips25" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_21=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_25, 0x0) BYTE 0x01 0x00 0x03 0x03 0xBA 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1E=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_21, 0x0) AG(4) ITEM LONG 0x2000003 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_21=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_21, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x47 0x00 0x00 0x01 // '????G???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0A 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x10 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x13 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x1D 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x24 0x00 0x00 0x02 // '????$???' 0x01 0x00 0x00 0x00 0x32 0x00 0x00 0x02 // '????2???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0A 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x47 0x00 0x00 0x03 // '???G???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_21=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_21, 0x0) BYTE 0x03 0x03 0x4C 0x69 0x73 0x74 0x65 0x6E // '??Listen' 0x65 0x72 0x0D 0x0A 0x4C 0x69 0x73 0x74 // 'er??List' 0x65 0x6E 0x20 0x74 0x6F 0x2C 0x20 0x72 // 'en to, r' 0x65 0x6D 0x6F 0x76 0x65 0x2C 0x20 0x6F // 'emove, o' 0x72 0x20 0x63 0x68 0x61 0x6E 0x67 0x65 // 'r change' 0x20 0x74 0x68 0x65 0x20 0x76 0x6F 0x6C // ' the vol' 0x75 0x6D 0x65 0x20 0x6F 0x66 0x20 0x69 // 'ume of i' 0x6E 0x64 0x69 0x76 0x69 0x64 0x75 0x61 // 'ndividua' 0x6C 0x20 0x73 0x6F 0x75 0x6E 0x64 0x73 // 'l sounds' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_26= kttTextsCover #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_26, __HELP_NAME("ttWordTools")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_26, __HELP_NAME("ttWordTools")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTipAO 0x0 kidTextsCover kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips26 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_26, 0x0) GST(0) ITEM "kgobBalloonToolTipAO" ITEM "kttTextsCover" ITEM "" ITEM "kidTextsCover" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips26" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_26, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_3E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3E, 0x0) BYTE 0x03 0x03 // '??' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_27= kttTextsCreate #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_27, __HELP_NAME("ttWordBox")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_27, __HELP_NAME("ttWordBox")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidTextsCreate kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips27 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_27, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttTextsCreate" ITEM "" ITEM "kidTextsCreate" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips27" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_27, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1B=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) AG(4) ITEM LONG 0x2000002 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x09 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x46 0x00 0x00 0x01 // '????F???' 0x00 0x00 0x00 0x00 0x04 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x2F 0x00 0x00 0x02 // '????/???' 0x00 0x00 0x00 0x00 0x35 0x00 0x00 0x02 // '????5???' 0x01 0x00 0x00 0x00 0x3A 0x00 0x00 0x02 // '????:???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0A 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x46 0x00 0x00 0x03 // '???F???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_E, 0x0) BYTE 0x03 0x03 0x57 0x6F 0x72 0x64 0x20 0x42 // '??Word B' 0x6F 0x78 0x0D 0x0A 0x43 0x72 0x65 0x61 // 'ox??Crea' 0x74 0x65 0x20 0x61 0x20 0x62 0x6F 0x78 // 'te a box' 0x20 0x77 0x68 0x65 0x72 0x65 0x20 0x79 // ' where y' 0x6F 0x75 0x20 0x63 0x61 0x6E 0x20 0x74 // 'ou can t' 0x79 0x70 0x65 0x20 0x79 0x6F 0x75 0x72 // 'ype your' 0x20 0x6D 0x6F 0x76 0x69 0x65 0x20 0x73 // ' movie s' 0x74 0x6F 0x72 0x79 0x20 0x6F 0x72 0x20 // 'tory or ' 0x63 0x72 0x65 0x64 0x69 0x74 0x73 0x2E // 'credits.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_28= kttTextsSelect #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_28, __HELP_NAME("ttInsertion Point")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_28, __HELP_NAME("ttInsertion Point")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidTextsSelect kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips28 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_25=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_28, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttTextsSelect" ITEM "" ITEM "kidTextsSelect" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips28" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_25=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_28, 0x0) BYTE 0x01 0x00 0x03 0x03 0x8D 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_C=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_25, 0x0) AG(4) ITEM LONG 0x2000004 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_25=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_25, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0D 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x3D 0x00 0x00 0x01 // '????=???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x11 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x12 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x1D 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x1E 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x34 0x00 0x00 0x02 // '????4???' 0x00 0x00 0x00 0x00 0x38 0x00 0x00 0x02 // '????8???' 0x01 0x00 0x00 0x00 0x3D 0x00 0x00 0x02 // '????=???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x11 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x3D 0x00 0x00 0x03 // '???=???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_25=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_25, 0x0) BYTE 0x03 0x03 0x49 0x6E 0x73 0x65 0x72 0x74 // '??Insert' 0x69 0x6F 0x6E 0x20 0x50 0x6F 0x69 0x6E // 'ion Poin' 0x74 0x0D 0x0A 0x4D 0x6F 0x76 0x65 0x2C // 't??Move,' 0x20 0x72 0x65 0x73 0x69 0x7A 0x65 0x2C // ' resize,' 0x20 0x6F 0x72 0x20 0x63 0x68 0x61 0x6E // ' or chan' 0x67 0x65 0x20 0x77 0x6F 0x72 0x64 0x73 // 'ge words' 0x20 0x69 0x6E 0x20 0x61 0x20 0x77 0x6F // ' in a wo' 0x72 0x64 0x20 0x62 0x6F 0x78 0x2E // 'rd box.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_29= kttTextsFont #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_29, __HELP_NAME("ttLetters")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_29, __HELP_NAME("ttLetters")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidTextsFont kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips29 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_47=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_29, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttTextsFont" ITEM "" ITEM "kidTextsFont" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips29" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_47=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_29, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_43=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_47, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_47=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_47, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2A 0x00 0x00 0x01 // '????*???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x2A 0x00 0x00 0x02 // '????*???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x09 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x2A 0x00 0x00 0x03 // '???*???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_47=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_47, 0x0) BYTE 0x03 0x03 0x4C 0x65 0x74 0x74 0x65 0x72 // '??Letter' 0x73 0x0D 0x0A 0x43 0x68 0x61 0x6E 0x67 // 's??Chang' 0x65 0x20 0x74 0x68 0x65 0x20 0x77 0x61 // 'e the wa' 0x79 0x20 0x79 0x6F 0x75 0x72 0x20 0x6C // 'y your l' 0x65 0x74 0x74 0x65 0x72 0x73 0x20 0x6C // 'etters l' 0x6F 0x6F 0x6B 0x21 // 'ook!' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2A= kttTextsFontShape #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2A, __HELP_NAME("ttStyles")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2A, __HELP_NAME("ttStyles")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidTextsFontShape kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips2A ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2A, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttTextsFontShape" ITEM "" ITEM "kidTextsFontShape" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips2A" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x9F 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1A=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1C, 0x0) AG(4) ITEM LONG 0x2000002 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x09 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x3D 0x00 0x00 0x01 // '????=???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x36 0x00 0x00 0x02 // '????6???' 0x00 0x00 0x00 0x00 0x3C 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x05 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x0C 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0E 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0E 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x3E 0x00 0x00 0x03 // '???>???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_56=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_56, 0x0) BYTE 0x03 0x03 0x46 0x72 0x61 0x6D 0x65 0x20 // '??Frame ' 0x53 0x6C 0x69 0x64 0x65 0x72 0x0D 0x0A // 'Slider??' 0x4D 0x6F 0x76 0x65 0x20 0x66 0x6F 0x72 // 'Move for' 0x77 0x61 0x72 0x64 0x73 0x20 0x6F 0x72 // 'wards or' 0x20 0x62 0x61 0x63 0x6B 0x77 0x61 0x72 // ' backwar' 0x64 0x73 0x20 0x69 0x6E 0x20 0x74 0x68 // 'ds in th' 0x65 0x20 0x63 0x75 0x72 0x72 0x65 0x6E // 'e curren' 0x74 0x20 0x73 0x63 0x65 0x6E 0x65 0x2E // 't scene.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_32= kttPausesMouse #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_32, __HELP_NAME("blank")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_32, __HELP_NAME("blank")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidPausesMouse kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips32 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_24=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_32, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttPausesMouse" ITEM "" ITEM "kidPausesMouse" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips32" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_24=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_32, 0x0) BYTE 0x01 0x00 0x03 0x03 0x96 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_24=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_24, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x03 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_24=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_24, 0x0) BYTE 0x03 0x03 // '??' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_33= kttPausesSound #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_33, __HELP_NAME("ttWaitForSoundEnd")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_33, __HELP_NAME("ttWaitForSoundEnd")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidPausesSound kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips33 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_1A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_33, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttPausesSound" ITEM "" ITEM "kidPausesSound" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips33" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_33, 0x0) BYTE 0x01 0x00 0x03 0x03 0x93 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_17=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1A, 0x0) AG(4) ITEM LONG 0x2000003 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x48 0x00 0x00 0x01 // '????H???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x04 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x15 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x47 0x00 0x00 0x02 // '????G???' 0x01 0x00 0x00 0x00 0x48 0x00 0x00 0x02 // '????H???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x17 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x48 0x00 0x00 0x03 // '???H???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1A, 0x0) BYTE 0x03 0x03 0x57 0x61 0x69 0x74 0x20 0x46 // '??Wait F' 0x6F 0x72 0x20 0x53 0x6F 0x75 0x6E 0x64 // 'or Sound' 0x20 0x74 0x6F 0x20 0x45 0x6E 0x64 0x0D // ' to End?' 0x0A 0x50 0x61 0x75 0x73 0x65 0x20 0x74 // '?Pause t' 0x68 0x65 0x20 0x6D 0x6F 0x76 0x69 0x65 // 'he movie' 0x20 0x61 0x63 0x74 0x69 0x6F 0x6E 0x20 // ' action ' 0x75 0x6E 0x74 0x69 0x6C 0x20 0x61 0x20 // 'until a ' 0x73 0x6F 0x75 0x6E 0x64 0x20 0x69 0x73 // 'sound is' 0x20 0x66 0x69 0x6E 0x69 0x73 0x68 0x65 // ' finishe' 0x64 0x2E // 'd.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_34= kttPausesClear #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_34, __HELP_NAME("blank")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_34, __HELP_NAME("blank")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidPausesClear kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips34 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_22=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_34, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttPausesClear" ITEM "" ITEM "kidPausesClear" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips34" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_22=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_34, 0x0) BYTE 0x01 0x00 0x03 0x03 0x85 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_22=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_22, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_22=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_22, 0x0) BYTE 0x03 0x03 0x62 0x6C 0x61 0x6E 0x6B // '??blank' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_35= kttPlay #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_35, __HELP_NAME("ttPlay")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_35, __HELP_NAME("ttPlay")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kidPlay kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips35 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_35, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttPlay" ITEM "" ITEM "kidPlay" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips35" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_35, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC6 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_21=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2C, 0x0) AG(4) ITEM LONG 0x2000002 VAR BYTE 0x10 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x09 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2E 0x00 0x00 0x01 // '????.???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x04 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x09 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0C 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0C 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x2E 0x00 0x00 0x03 // '???.???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2C, 0x0) BYTE 0x03 0x03 0x50 0x6C 0x61 0x79 0x2F 0x53 // '??Play/S' 0x74 0x6F 0x70 0x20 0x0D 0x0A 0x43 0x6C // 'top ??Cl' 0x69 0x63 0x6B 0x20 0x74 0x6F 0x20 0x50 // 'ick to P' 0x6C 0x61 0x79 0x20 0x61 0x6E 0x64 0x20 // 'lay and ' 0x53 0x74 0x6F 0x70 0x20 0x79 0x6F 0x75 // 'Stop you' 0x72 0x20 0x6D 0x6F 0x76 0x69 0x65 0x2E // 'r movie.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_36= kttVolumeSlider #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_36, __HELP_NAME("ttVolumeControl")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_36, __HELP_NAME("ttVolumeControl")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kidVolumeSlider kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips36 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_36, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttVolumeSlider" ITEM "" ITEM "kidVolumeSlider" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips36" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_36, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA4 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_26=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2F, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x10 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x42 0x00 0x00 0x01 // '????B???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x25 0x00 0x00 0x02 // '????%???' 0x00 0x00 0x00 0x00 0x42 0x00 0x00 0x02 // '????B???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x10 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x42 0x00 0x00 0x03 // '???B???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2F, 0x0) BYTE 0x03 0x03 0x56 0x6F 0x6C 0x75 0x6D 0x65 // '??Volume' 0x20 0x43 0x6F 0x6E 0x74 0x72 0x6F 0x6C // ' Control' 0x0D 0x0A 0x41 0x64 0x6A 0x75 0x73 0x74 // '??Adjust' 0x20 0x74 0x68 0x65 0x20 0x76 0x6F 0x6C // ' the vol' 0x75 0x6D 0x65 0x20 0x6F 0x66 0x20 0x61 // 'ume of a' 0x6C 0x6C 0x20 0x73 0x6F 0x75 0x6E 0x64 // 'll sound' 0x73 0x20 0x69 0x6E 0x20 0x33 0x44 0x20 // 's in 3D ' 0x4D 0x6F 0x76 0x69 0x65 0x20 0x4D 0x61 // 'Movie Ma' 0x6B 0x65 0x72 0x2E // 'ker.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_37= kttUndo #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_37, __HELP_NAME("ttUndoRedo")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_37, __HELP_NAME("ttUndoRedo")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kidUndo kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips37 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_37, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttUndo" ITEM "" ITEM "kidUndo" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips37" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_37, 0x0) BYTE 0x01 0x00 0x03 0x03 0x9B 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_27=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2B, 0x0) AG(4) ITEM LONG 0x2000003 VAR BYTE 0x10 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0B 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x3D 0x00 0x00 0x01 // '????=???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0B 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x0C 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x28 0x00 0x00 0x02 // '????(???' 0x00 0x00 0x00 0x00 0x2A 0x00 0x00 0x02 // '????*???' 0x01 0x00 0x00 0x00 0x3D 0x00 0x00 0x02 // '????=???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0B 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x3D 0x00 0x00 0x03 // '???=???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2B, 0x0) BYTE 0x03 0x03 0x55 0x6E 0x64 0x6F 0x2F 0x52 // '??Undo/R' 0x65 0x64 0x6F 0x0D 0x0A 0x55 0x6E 0x64 // 'edo??Und' 0x6F 0x20 0x74 0x68 0x65 0x20 0x6C 0x61 // 'o the la' 0x73 0x74 0x20 0x74 0x68 0x69 0x6E 0x67 // 'st thing' 0x20 0x79 0x6F 0x75 0x20 0x64 0x69 0x64 // ' you did' 0x21 0x20 0x20 0x52 0x65 0x64 0x6F 0x20 // '! Redo ' 0x77 0x68 0x61 0x74 0x20 0x79 0x6F 0x75 // 'what you' 0x20 0x75 0x6E 0x64 0x69 0x64 0x21 // ' undid!' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_38= kttCutCopyPaste #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_38, __HELP_NAME("ttCutCopyPaste")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_38, __HELP_NAME("ttCutCopyPaste")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kidCutCopyPaste kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips38 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_42=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_38, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttCutCopyPaste" ITEM "" ITEM "kidCutCopyPaste" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips38" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_42=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_38, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_3B=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_42, 0x0) AG(4) ITEM LONG 0x2000003 VAR BYTE 0x0B 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_42=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_42, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0B 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x5C 0x00 0x00 0x01 // '????\???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0A 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x0C 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x1A 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x1B 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x5C 0x00 0x00 0x02 // '????\???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x1A 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x5C 0x00 0x00 0x03 // '???\???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_42=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_42, 0x0) BYTE 0x03 0x03 0x43 0x75 0x74 0x2C 0x20 0x43 // '??Cut, C' 0x6F 0x70 0x79 0x2C 0x20 0x26 0x20 0x50 // 'opy, & P' 0x61 0x73 0x74 0x65 0x20 0x54 0x6F 0x6F // 'aste Too' 0x6C 0x73 0x0D 0x0A 0x47 0x65 0x74 0x20 // 'ls??Get ' 0x72 0x69 0x64 0x20 0x6F 0x66 0x2C 0x20 // 'rid of, ' 0x63 0x6F 0x70 0x79 0x2C 0x20 0x70 0x61 // 'copy, pa' 0x73 0x74 0x65 0x2C 0x20 0x6F 0x72 0x20 // 'ste, or ' 0x6D 0x6F 0x76 0x65 0x20 0x74 0x68 0x69 // 'move thi' 0x6E 0x67 0x73 0x20 0x66 0x72 0x6F 0x6D // 'ngs from' 0x20 0x6F 0x6E 0x65 0x20 0x70 0x6C 0x61 // ' one pla' 0x63 0x65 0x20 0x74 0x6F 0x20 0x61 0x6E // 'ce to an' 0x6F 0x74 0x68 0x65 0x72 0x2E // 'other.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_39= kttCCPSceneChopBack #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_39, __HELP_NAME("ttRemoveEverythingBefore")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_39, __HELP_NAME("ttRemoveEverythingBefore")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidCCPSceneChopBack kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips39 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_32=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_39, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttCCPSceneChopBack" ITEM "" ITEM "kidCCPSceneChopBack" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips39" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_32=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_39, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD4 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2E=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_32, 0x0) AG(4) ITEM LONG 0x2000003 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_32=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_32, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x5A 0x00 0x00 0x01 // '????Z???' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x20 0x00 0x00 0x02 // '???? ???' 0x01 0x00 0x00 0x00 0x4A 0x00 0x00 0x02 // '????J???' 0x00 0x00 0x00 0x00 0x53 0x00 0x00 0x02 // '????S???' 0x01 0x00 0x00 0x00 0x5A 0x00 0x00 0x02 // '????Z???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x1A 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x5A 0x00 0x00 0x03 // '???Z???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_32=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_32, 0x0) BYTE 0x03 0x03 0x52 0x65 0x6D 0x6F 0x76 0x65 // '??Remove' 0x20 0x45 0x76 0x65 0x72 0x79 0x74 0x68 // ' Everyth' 0x69 0x6E 0x67 0x20 0x42 0x65 0x66 0x6F // 'ing Befo' 0x72 0x65 0x0D 0x0A 0x52 0x65 0x6D 0x6F // 're??Remo' 0x76 0x65 0x20 0x65 0x76 0x65 0x72 0x79 // 've every' 0x74 0x68 0x69 0x6E 0x67 0x20 0x62 0x65 // 'thing be' 0x66 0x6F 0x72 0x65 0x20 0x74 0x68 0x65 // 'fore the' 0x20 0x63 0x75 0x72 0x72 0x65 0x6E 0x74 // ' current' 0x20 0x66 0x72 0x61 0x6D 0x65 0x20 0x69 // ' frame i' 0x6E 0x20 0x74 0x68 0x65 0x20 0x63 0x75 // 'n the cu' 0x72 0x72 0x65 0x6E 0x74 0x20 0x73 0x63 // 'rrent sc' 0x65 0x6E 0x65 0x2E // 'ene.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3A= kttCCPSceneChopFwd #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3A, __HELP_NAME("ttRemoveEverythingAfter")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3A, __HELP_NAME("ttRemoveEverythingAfter")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidCCPSceneChopFwd kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips3A ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_10=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3A, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttCCPSceneChopFwd" ITEM "" ITEM "kidCCPSceneChopFwd" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips3A" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_10=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3A, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD4 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_E=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_10, 0x0) AG(4) ITEM LONG 0x2000003 VAR BYTE 0x0C 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_10=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_10, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0A 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x58 0x00 0x00 0x01 // '????X???' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x1F 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x46 0x00 0x00 0x02 // '????F???' 0x00 0x00 0x00 0x00 0x51 0x00 0x00 0x02 // '????Q???' 0x01 0x00 0x00 0x00 0x58 0x00 0x00 0x02 // '????X???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x19 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x58 0x00 0x00 0x03 // '???X???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_10=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_10, 0x0) BYTE 0x03 0x03 0x52 0x65 0x6D 0x6F 0x76 0x65 // '??Remove' 0x20 0x45 0x76 0x65 0x72 0x79 0x74 0x68 // ' Everyth' 0x69 0x6E 0x67 0x20 0x41 0x66 0x74 0x65 // 'ing Afte' 0x72 0x0D 0x0A 0x52 0x65 0x6D 0x6F 0x76 // 'r??Remov' 0x65 0x20 0x65 0x76 0x65 0x72 0x79 0x74 // 'e everyt' 0x68 0x69 0x6E 0x67 0x20 0x61 0x66 0x74 // 'hing aft' 0x65 0x72 0x20 0x74 0x68 0x65 0x20 0x63 // 'er the c' 0x75 0x72 0x72 0x65 0x6E 0x74 0x20 0x66 // 'urrent f' 0x72 0x61 0x6D 0x65 0x20 0x69 0x6E 0x20 // 'rame in ' 0x74 0x68 0x65 0x20 0x63 0x75 0x72 0x72 // 'the curr' 0x65 0x6E 0x74 0x20 0x73 0x63 0x65 0x6E // 'ent scen' 0x65 0x2E // 'e.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3B= kttCCPSceneNuke #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3B, __HELP_NAME("ttRemoveEntireScene")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3B, __HELP_NAME("ttRemoveEntireScene")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kidCCPSceneNuke kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips3B ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_37=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3B, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttCCPSceneNuke" ITEM "" ITEM "kidCCPSceneNuke" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips3B" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_37=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x9F 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_28=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_37, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x10 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_37=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_37, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2E 0x00 0x00 0x01 // '????.???' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x1B 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x2E 0x00 0x00 0x02 // '????.???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x15 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x2E 0x00 0x00 0x03 // '???.???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_37=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_37, 0x0) BYTE 0x03 0x03 0x52 0x65 0x6D 0x6F 0x76 0x65 // '??Remove' 0x20 0x45 0x6E 0x74 0x69 0x72 0x65 0x20 // ' Entire ' 0x53 0x63 0x65 0x6E 0x65 0x0D 0x0A 0x52 // 'Scene??R' 0x65 0x6D 0x6F 0x76 0x65 0x20 0x74 0x68 // 'emove th' 0x65 0x20 0x63 0x75 0x72 0x72 0x65 0x6E // 'e curren' 0x74 0x20 0x73 0x63 0x65 0x6E 0x65 0x2E // 't scene.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3C= kttCCPActorNuke #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3C, __HELP_NAME("ttRemove3DObject")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3C, __HELP_NAME("ttRemove3DObject")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kidCCPActorNuke kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips3C ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_7=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3C, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttCCPActorNuke" ITEM "" ITEM "kidCCPActorNuke" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips3C" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_7=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3C, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD7 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_5=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x10 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_7=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x56 0x00 0x00 0x01 // '????V???' 0x00 0x00 0x00 0x00 0x10 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x18 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x56 0x00 0x00 0x02 // '????V???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x12 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x56 0x00 0x00 0x03 // '???V???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_7=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) BYTE 0x03 0x03 0x52 0x65 0x6D 0x6F 0x76 0x65 // '??Remove' 0x20 0x33 0x44 0x20 0x4F 0x62 0x6A 0x65 // ' 3D Obje' 0x63 0x74 0x0D 0x0A 0x52 0x65 0x6D 0x6F // 'ct??Remo' 0x76 0x65 0x20 0x74 0x68 0x65 0x20 0x61 // 've the a' 0x63 0x74 0x6F 0x72 0x2C 0x20 0x70 0x72 // 'ctor, pr' 0x6F 0x70 0x2C 0x20 0x6F 0x72 0x20 0x33 // 'op, or 3' 0x44 0x20 0x77 0x6F 0x72 0x64 0x20 0x79 // 'D word y' 0x6F 0x75 0x20 0x63 0x6C 0x69 0x63 0x6B // 'ou click' 0x20 0x66 0x72 0x6F 0x6D 0x20 0x74 0x68 // ' from th' 0x65 0x20 0x63 0x75 0x72 0x72 0x65 0x6E // 'e curren' 0x74 0x20 0x73 0x63 0x65 0x6E 0x65 0x2E // 't scene.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3D= kttCCPTboxNuke #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3D, __HELP_NAME("ttRemoveWordBox")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3D, __HELP_NAME("ttRemoveWordBox")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kidCCPActorNuke kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips3D ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_39=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3D, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttCCPTboxNuke" ITEM "" ITEM "kidCCPActorNuke" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips3D" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_39=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3D, 0x0) BYTE 0x01 0x00 0x03 0x03 0xAD 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2B=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_39, 0x0) AG(4) ITEM LONG 0x2000002 VAR BYTE 0x10 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_39=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_39, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x09 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x46 0x00 0x00 0x01 // '????F???' 0x00 0x00 0x00 0x00 0x0F 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x17 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x2F 0x00 0x00 0x02 // '????/???' 0x01 0x00 0x00 0x00 0x46 0x00 0x00 0x02 // '????F???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x11 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x46 0x00 0x00 0x03 // '???F???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_39=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_39, 0x0) BYTE 0x03 0x03 0x52 0x65 0x6D 0x6F 0x76 0x65 // '??Remove' 0x20 0x57 0x6F 0x72 0x64 0x20 0x42 0x6F // ' Word Bo' 0x78 0x0D 0x0A 0x52 0x65 0x6D 0x6F 0x76 // 'x??Remov' 0x65 0x20 0x74 0x68 0x65 0x20 0x77 0x6F // 'e the wo' 0x72 0x64 0x20 0x62 0x6F 0x78 0x20 0x79 // 'rd box y' 0x6F 0x75 0x20 0x63 0x6C 0x69 0x63 0x6B // 'ou click' 0x20 0x66 0x72 0x6F 0x6D 0x20 0x74 0x68 // ' from th' 0x65 0x20 0x63 0x75 0x72 0x72 0x65 0x6E // 'e curren' 0x74 0x20 0x73 0x63 0x65 0x6E 0x65 0x2E // 't scene.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3E= kttCCPCopyRoute #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3E, __HELP_NAME("ttCopyPath")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3E, __HELP_NAME("ttCopyPath")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kidCCPCopyRoute kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips3E ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_23=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3E, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttCCPCopyRoute" ITEM "" ITEM "kidCCPCopyRoute" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips3E" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_23=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3E, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA6 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_20=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_23, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x10 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_23=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_23, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x42 0x00 0x00 0x01 // '????B???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0B 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x42 0x00 0x00 0x02 // '????B???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0B 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x42 0x00 0x00 0x03 // '???B???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_23=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_23, 0x0) BYTE 0x03 0x03 0x43 0x6F 0x70 0x79 0x20 0x50 // '??Copy P' 0x61 0x74 0x68 0x0D 0x0A 0x43 0x6F 0x70 // 'ath??Cop' 0x79 0x20 0x74 0x68 0x65 0x20 0x70 0x61 // 'y the pa' 0x74 0x68 0x20 0x6F 0x66 0x20 0x74 0x68 // 'th of th' 0x65 0x20 0x61 0x63 0x74 0x6F 0x72 0x2C // 'e actor,' 0x20 0x70 0x72 0x6F 0x70 0x2C 0x20 0x6F // ' prop, o' 0x72 0x20 0x33 0x44 0x20 0x77 0x6F 0x72 // 'r 3D wor' 0x64 0x20 0x79 0x6F 0x75 0x20 0x63 0x6C // 'd you cl' 0x69 0x63 0x6B 0x2E // 'ick.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3F= kttCCPPaste #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3F, __HELP_NAME("ttPaste")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3F, __HELP_NAME("ttPaste")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kidCCPPaste kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips3F ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_15=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3F, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttCCPPaste" ITEM "" ITEM "kidCCPPaste" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips3F" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_15=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3F, 0x0) BYTE 0x01 0x00 0x03 0x03 0xE6 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_13=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_15, 0x0) AG(4) ITEM LONG 0x2000002 VAR BYTE 0x10 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_15=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_15, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x53 0x00 0x00 0x01 // '????S???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0C 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x35 0x00 0x00 0x02 // '????5???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x07 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x53 0x00 0x00 0x03 // '???S???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_15=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_15, 0x0) BYTE 0x03 0x03 0x50 0x61 0x73 0x74 0x65 0x0D // '??Paste?' 0x0A 0x50 0x61 0x73 0x74 0x65 0x20 0x77 // '?Paste w' 0x68 0x61 0x74 0x65 0x76 0x65 0x72 0x20 // 'hatever ' 0x79 0x6F 0x75 0x20 0x6D 0x6F 0x73 0x74 // 'you most' 0x20 0x72 0x65 0x63 0x65 0x6E 0x74 0x6C // ' recentl' 0x79 0x20 0x63 0x75 0x74 0x20 0x6F 0x72 // 'y cut or' 0x20 0x63 0x6F 0x70 0x69 0x65 0x64 0x20 // ' copied ' 0x61 0x74 0x20 0x74 0x68 0x65 0x20 0x70 // 'at the p' 0x6C 0x61 0x63 0x65 0x20 0x77 0x68 0x65 // 'lace whe' 0x72 0x65 0x20 0x79 0x6F 0x75 0x20 0x63 // 're you c' 0x6C 0x69 0x63 0x6B 0x2E // 'lick.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_40= kttCCPCopy #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_40, __HELP_NAME("ttCopy")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_40, __HELP_NAME("ttCopy")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kidCCPCopy kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips40 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_35=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_40, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttCCPCopy" ITEM "" ITEM "kidCCPCopy" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips40" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_35=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_40, 0x0) BYTE 0x01 0x00 0x03 0x03 0xBF 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_31=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_35, 0x0) AG(4) ITEM LONG 0x2000004 VAR BYTE 0x10 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_35=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_35, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0D 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x47 0x00 0x00 0x01 // '????G???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x09 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x0A 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0B 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x40 0x00 0x00 0x02 // '????@???' 0x00 0x00 0x00 0x00 0x42 0x00 0x00 0x02 // '????B???' 0x01 0x00 0x00 0x00 0x47 0x00 0x00 0x02 // '????G???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x06 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x47 0x00 0x00 0x03 // '???G???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_35=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_35, 0x0) BYTE 0x03 0x03 0x43 0x6F 0x70 0x79 0x0D 0x0A // '??Copy??' 0x43 0x6F 0x70 0x79 0x20 0x77 0x68 0x61 // 'Copy wha' 0x74 0x20 0x79 0x6F 0x75 0x20 0x63 0x6C // 't you cl' 0x69 0x63 0x6B 0x20 0x73 0x6F 0x20 0x74 // 'ick so t' 0x68 0x61 0x74 0x20 0x79 0x6F 0x75 0x20 // 'hat you ' 0x63 0x61 0x6E 0x20 0x70 0x61 0x73 0x74 // 'can past' 0x65 0x20 0x69 0x74 0x20 0x69 0x6E 0x20 // 'e it in ' 0x61 0x6E 0x6F 0x74 0x68 0x65 0x72 0x20 // 'another ' 0x6C 0x6F 0x63 0x61 0x74 0x69 0x6F 0x6E // 'location' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_41= kttCCPCut #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_41, __HELP_NAME("ttCut")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_41, __HELP_NAME("ttCut")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kidCCPCut kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips41 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_38=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_41, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttCCPCut" ITEM "" ITEM "kidCCPCut" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips41" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_38=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_41, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_32=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_38, 0x0) AG(4) ITEM LONG 0x2000005 VAR BYTE 0x10 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_38=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_38, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0E 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x4C 0x00 0x00 0x01 // '????L???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x08 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x09 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x0D 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x25 0x00 0x00 0x02 // '????%???' 0x00 0x00 0x00 0x00 0x26 0x00 0x00 0x02 // '????&???' 0x01 0x00 0x00 0x00 0x45 0x00 0x00 0x02 // '????E???' 0x00 0x00 0x00 0x00 0x47 0x00 0x00 0x02 // '????G???' 0x01 0x00 0x00 0x00 0x4C 0x00 0x00 0x02 // '????L???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x05 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x4C 0x00 0x00 0x03 // '???L???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_38=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_38, 0x0) BYTE 0x03 0x03 0x43 0x75 0x74 0x0D 0x0A 0x43 // '??Cut??C' 0x75 0x74 0x20 0x77 0x68 0x61 0x74 0x20 // 'ut what ' 0x79 0x6F 0x75 0x20 0x63 0x6C 0x69 0x63 // 'you clic' 0x6B 0x2E 0x20 0x20 0x49 0x66 0x20 0x79 // 'k. If y' 0x6F 0x75 0x20 0x77 0x61 0x6E 0x74 0x2C // 'ou want,' 0x20 0x79 0x6F 0x75 0x20 0x63 0x61 0x6E // ' you can' 0x20 0x70 0x61 0x73 0x74 0x65 0x20 0x69 // ' paste i' 0x74 0x20 0x69 0x6E 0x20 0x61 0x6E 0x6F // 't in ano' 0x74 0x68 0x65 0x72 0x20 0x6C 0x6F 0x63 // 'ther loc' 0x61 0x74 0x69 0x6F 0x6E 0x2E // 'ation.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_42= kttPortfolio #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_42, __HELP_NAME("ttPortfolio")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_42, __HELP_NAME("ttPortfolio")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kidPortfolio kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips42 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_36=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_42, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttPortfolio" ITEM "" ITEM "kidPortfolio" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips42" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_36=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_42, 0x0) BYTE 0x01 0x00 0x03 0x03 0xD2 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1F=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_36, 0x0) AG(4) ITEM LONG 0x2000004 VAR BYTE 0x10 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_36=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_36, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0D 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x49 0x00 0x00 0x01 // '????I???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0B 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x0C 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x1C 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x1E 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x22 0x00 0x00 0x02 // '????"???' 0x00 0x00 0x00 0x00 0x23 0x00 0x00 0x02 // '????#???' 0x01 0x00 0x00 0x00 0x36 0x00 0x00 0x02 // '????6???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0B 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x49 0x00 0x00 0x03 // '???I???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_36=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_36, 0x0) BYTE 0x03 0x03 0x50 0x6F 0x72 0x74 0x66 0x6F // '??Portfo' 0x6C 0x69 0x6F 0x0D 0x0A 0x53 0x74 0x61 // 'lio??Sta' 0x72 0x74 0x20 0x61 0x20 0x6E 0x65 0x77 // 'rt a new' 0x20 0x6D 0x6F 0x76 0x69 0x65 0x2C 0x20 // ' movie, ' 0x6F 0x70 0x65 0x6E 0x20 0x61 0x6E 0x20 // 'open an ' 0x65 0x78 0x69 0x73 0x74 0x69 0x6E 0x67 // 'existing' 0x20 0x6D 0x6F 0x76 0x69 0x65 0x2C 0x20 // ' movie, ' 0x61 0x6E 0x64 0x20 0x73 0x61 0x76 0x65 // 'and save' 0x20 0x79 0x6F 0x75 0x72 0x20 0x77 0x6F // ' your wo' 0x72 0x6B 0x21 // 'rk!' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_43= kttPortsNew #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_43, __HELP_NAME("ttPortfolioNew")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_43, __HELP_NAME("ttPortfolioNew")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kidPortsNew kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips43 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_43, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttPortsNew" ITEM "" ITEM "kidPortsNew" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips43" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_43, 0x0) BYTE 0x01 0x00 0x03 0x03 0xBF 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_33=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3D, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x10 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_3D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x24 0x00 0x00 0x01 // '????$???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x24 0x00 0x00 0x02 // '????$???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x05 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x24 0x00 0x00 0x03 // '???$???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3D, 0x0) BYTE 0x03 0x03 0x4E 0x65 0x77 0x0D 0x0A 0x53 // '??New??S' 0x74 0x61 0x72 0x74 0x20 0x61 0x20 0x6E // 'tart a n' 0x65 0x77 0x20 0x6D 0x6F 0x76 0x69 0x65 // 'ew movie' 0x20 0x66 0x72 0x6F 0x6D 0x20 0x73 0x63 // ' from sc' 0x72 0x61 0x74 0x63 0x68 0x21 // 'ratch!' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_44= kttPortsPortfolio #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_44, __HELP_NAME("ttPortfolioOpen")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_44, __HELP_NAME("ttPortfolioOpen")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kidPortsPortfolio kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips44 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_26=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_44, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttPortsPortfolio" ITEM "" ITEM "kidPortsPortfolio" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips44" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_26=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_44, 0x0) BYTE 0x01 0x00 0x03 0x03 0x90 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_22=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_26, 0x0) AG(4) ITEM LONG 0x2000002 VAR BYTE 0x10 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_26=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_26, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x09 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x35 0x00 0x00 0x01 // '????5???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x1E 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x23 0x00 0x00 0x02 // '????#???' 0x01 0x00 0x00 0x00 0x35 0x00 0x00 0x02 // '????5???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x06 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x35 0x00 0x00 0x03 // '???5???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_26=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_26, 0x0) BYTE 0x03 0x03 0x4F 0x70 0x65 0x6E 0x0D 0x0A // '??Open??' 0x4F 0x70 0x65 0x6E 0x20 0x61 0x20 0x6D // 'Open a m' 0x6F 0x76 0x69 0x65 0x20 0x73 0x6F 0x20 // 'ovie so ' 0x79 0x6F 0x75 0x20 0x63 0x61 0x6E 0x20 // 'you can ' 0x77 0x61 0x74 0x63 0x68 0x20 0x69 0x74 // 'watch it' 0x20 0x6F 0x72 0x20 0x77 0x6F 0x72 0x6B // ' or work' 0x20 0x6F 0x6E 0x20 0x69 0x74 0x21 // ' on it!' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_45= kttPortsSave #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_45, __HELP_NAME("ttPortfolioSave")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_45, __HELP_NAME("ttPortfolioSave")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kidPortsSave kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips45 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_45, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttPortsSave" ITEM "" ITEM "kidPortsSave" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips45" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_45, 0x0) BYTE 0x01 0x00 0x03 0x03 0x63 0x00 0x00 0x00 // '????c???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_A=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2D, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x10 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x15 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x14 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x15 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x06 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x15 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2D, 0x0) BYTE 0x03 0x03 0x53 0x61 0x76 0x65 0x0D 0x0A // '??Save??' 0x53 0x61 0x76 0x65 0x20 0x79 0x6F 0x75 // 'Save you' 0x72 0x20 0x77 0x6F 0x72 0x6B 0x2E // 'r work.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_46= kttPortsSaveAs #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_46, __HELP_NAME("ttPortfolioSaveAs")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_46, __HELP_NAME("ttPortfolioSaveAs")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kidPortsSaveAs kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips46 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_46, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttPortsSaveAs" ITEM "" ITEM "kidPortsSaveAs" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips46" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_46, 0x0) BYTE 0x01 0x00 0x03 0x03 0x89 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_34=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3A, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x10 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_3A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x33 0x00 0x00 0x01 // '????3???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x09 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x09 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x33 0x00 0x00 0x03 // '???3???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3A, 0x0) BYTE 0x03 0x03 0x53 0x61 0x76 0x65 0x20 0x41 // '??Save A' 0x73 0x0D 0x0A 0x53 0x61 0x76 0x65 0x20 // 's??Save ' 0x61 0x20 0x63 0x6F 0x70 0x79 0x20 0x6F // 'a copy o' 0x66 0x20 0x79 0x6F 0x75 0x72 0x20 0x6D // 'f your m' 0x6F 0x76 0x69 0x65 0x20 0x77 0x69 0x74 // 'ovie wit' 0x68 0x20 0x61 0x20 0x6E 0x65 0x77 0x20 // 'h a new ' 0x6E 0x61 0x6D 0x65 0x2E // 'name.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_47= kttBook #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_47, __HELP_NAME("ttHelp")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_47, __HELP_NAME("ttHelp")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kidBook kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips47 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_31=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_47, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttBook" ITEM "" ITEM "kidBook" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips47" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_31=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_47, 0x0) BYTE 0x01 0x00 0x03 0x03 0xAA 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_29=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_31, 0x0) AG(4) ITEM LONG 0x2000002 VAR BYTE 0x10 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_31=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_31, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x09 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x43 0x00 0x00 0x01 // '????C???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x04 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x0C 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x43 0x00 0x00 0x02 // '????C???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0E 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x43 0x00 0x00 0x03 // '???C???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_31=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_31, 0x0) BYTE 0x03 0x03 0x48 0x65 0x6C 0x70 0x20 0x4D // '??Help M' 0x61 0x63 0x68 0x69 0x6E 0x65 0x0D 0x0A // 'achine??' 0x46 0x69 0x6E 0x64 0x20 0x61 0x6C 0x6C // 'Find all' 0x20 0x74 0x68 0x65 0x20 0x61 0x6E 0x73 // ' the ans' 0x77 0x65 0x72 0x73 0x20 0x74 0x6F 0x20 // 'wers to ' 0x79 0x6F 0x75 0x72 0x20 0x6D 0x6F 0x76 // 'your mov' 0x69 0x65 0x2D 0x6D 0x61 0x6B 0x69 0x6E // 'ie-makin' 0x67 0x20 0x71 0x75 0x65 0x73 0x74 0x69 // 'g questi' 0x6F 0x6E 0x73 0x21 0x20 // 'ons! ' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_48= kttMap #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_48, __HELP_NAME("ttMap")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_48, __HELP_NAME("ttMap")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kidMap kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips48 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_41=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_48, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttMap" ITEM "" ITEM "kidMap" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips48" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_41=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_48, 0x0) BYTE 0x01 0x00 0x03 0x03 0x97 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_35=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_41, 0x0) AG(4) ITEM LONG 0x2000001 VAR BYTE 0x10 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_41=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_41, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x37 0x00 0x00 0x01 // '????7???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x37 0x00 0x00 0x02 // '????7???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x05 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x37 0x00 0x00 0x03 // '???7???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_41=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_41, 0x0) BYTE 0x03 0x03 0x4D 0x61 0x70 0x0D 0x0A 0x51 // '??Map??Q' 0x75 0x69 0x63 0x6B 0x6C 0x79 0x20 0x7A // 'uickly z' 0x69 0x70 0x20 0x74 0x6F 0x20 0x74 0x68 // 'ip to th' 0x65 0x20 0x72 0x6F 0x6F 0x6D 0x20 0x6F // 'e room o' 0x72 0x20 0x70 0x72 0x6F 0x6A 0x65 0x63 // 'r projec' 0x74 0x20 0x6F 0x66 0x20 0x79 0x6F 0x75 // 't of you' 0x72 0x20 0x63 0x68 0x6F 0x69 0x63 0x65 // 'r choice' 0x2E // '.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_49= kttExit #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_49, __HELP_NAME("ttExit")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_49, __HELP_NAME("ttExit")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kidExit kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips49 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_9=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_49, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttExit" ITEM "" ITEM "kidExit" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips49" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_9=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_49, 0x0) BYTE 0x01 0x00 0x03 0x03 0x4F 0x00 0x00 0x00 // '????O???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_9=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_9, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x04 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x13 0x00 0x00 0x01 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x04 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_9=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_9, 0x0) BYTE 0x03 0x03 0x45 0x78 0x69 0x74 0x0D 0x0A // '??Exit??' 0x51 0x75 0x69 0x74 0x20 0x77 0x6F 0x72 // 'Quit wor' 0x6B 0x69 0x6E 0x67 0x21 // 'king!' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_4A= kttRollCallActorFrame1 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4A, __HELP_NAME("ttRollCallActor1")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4A, __HELP_NAME("ttRollCallActor1")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidRollCallActorFrame1 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4A, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttRollCallActorFrame1" ITEM "" ITEM "kidRollCallActorFrame1" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x82 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_4D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4D, 0x0) BYTE 0x03 0x03 0x7E 0x31 0x32 0x38 0x30 // '??~1280' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_4B= kttRollCallActorFrame2 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4B, __HELP_NAME("ttRollCallActor2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4B, __HELP_NAME("ttRollCallActor2")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidRollCallActorFrame2 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_52=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4B, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttRollCallActorFrame2" ITEM "" ITEM "kidRollCallActorFrame2" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_52=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x82 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_52=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_52, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_52=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_52, 0x0) BYTE 0x03 0x03 0x7E 0x31 0x32 0x38 0x31 // '??~1281' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_4C= kttRollCallActorFrame3 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4C, __HELP_NAME("ttRollCallActor3")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4C, __HELP_NAME("ttRollCallActor3")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidRollCallActorFrame3 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4C, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttRollCallActorFrame3" ITEM "" ITEM "kidRollCallActorFrame3" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x82 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_4C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4C, 0x0) BYTE 0x03 0x03 0x7E 0x31 0x32 0x38 0x32 // '??~1282' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_4D= kttRollCallActorFrame4 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4D, __HELP_NAME("ttRollCallActor4")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4D, __HELP_NAME("ttRollCallActor4")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidRollCallActorFrame4 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4D, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttRollCallActorFrame4" ITEM "" ITEM "kidRollCallActorFrame4" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x82 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_4F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4F, 0x0) BYTE 0x03 0x03 0x7E 0x31 0x32 0x38 0x33 // '??~1283' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_4E= kttRollCallPropFrame1 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4E, __HELP_NAME("ttRollCallProp1")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4E, __HELP_NAME("ttRollCallProp1")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidRollCallPropFrame1 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_51=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4E, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttRollCallPropFrame1" ITEM "" ITEM "kidRollCallPropFrame1" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_51=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x82 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_51=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_51, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_51=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_51, 0x0) BYTE 0x03 0x03 0x7E 0x31 0x32 0x39 0x36 // '??~1296' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_4F= kttRollCallPropFrame2 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4F, __HELP_NAME("ttRollCallProp2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4F, __HELP_NAME("ttRollCallProp2")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidRollCallPropFrame2 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4F, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttRollCallPropFrame2" ITEM "" ITEM "kidRollCallPropFrame2" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x82 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_4B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4B, 0x0) BYTE 0x03 0x03 0x7E 0x31 0x32 0x39 0x37 // '??~1297' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_50= kttRollCallPropFrame3 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_50, __HELP_NAME("ttRollCallProp3")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_50, __HELP_NAME("ttRollCallProp3")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidRollCallPropFrame3 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_17=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_50, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttRollCallPropFrame3" ITEM "" ITEM "kidRollCallPropFrame3" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_17=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_50, 0x0) BYTE 0x01 0x00 0x03 0x03 0x82 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_17=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_17, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_17=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_17, 0x0) BYTE 0x03 0x03 0x7E 0x31 0x32 0x39 0x38 // '??~1298' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_51= kttRollCallPropFrame4 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_51, __HELP_NAME("ttRollCallProp4")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_51, __HELP_NAME("ttRollCallProp4")) __HELP_PACK2 BO OSK LONG gobBalloonToolTip 0x0 kidRollCallPropFrame4 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_40=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_51, 0x0) GST(0) ITEM "gobBalloonToolTip" ITEM "kttRollCallPropFrame4" ITEM "" ITEM "kidRollCallPropFrame4" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_40=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_51, 0x0) BYTE 0x01 0x00 0x03 0x03 0x82 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_40=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_40, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_40=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_40, 0x0) BYTE 0x03 0x03 0x7E 0x31 0x32 0x39 0x39 // '??~1299' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_52= kttRemoveSound #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_52, __HELP_NAME("ttRemoveSound")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_52, __HELP_NAME("ttRemoveSound")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kidSoundsClear kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips52 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_5F=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_52, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttRemoveSound" ITEM "" ITEM "kidSoundsClear" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips52" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_5F=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_52, 0x0) BYTE 0x01 0x00 0x03 0x03 0xAC 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_5F=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5F, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x5C 0x00 0x00 0x01 // '????\???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0E 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x5C 0x00 0x00 0x03 // '???\???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_5F=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5F, 0x0) BYTE 0x03 0x03 0x52 0x65 0x6D 0x6F 0x76 0x65 // '??Remove' 0x20 0x53 0x6F 0x75 0x6E 0x64 0x0D 0x0A // ' Sound??' 0x52 0x65 0x6D 0x6F 0x76 0x65 0x20 0x61 // 'Remove a' 0x20 0x73 0x6F 0x75 0x6E 0x64 0x20 0x62 // ' sound b' 0x79 0x20 0x63 0x6C 0x69 0x63 0x6B 0x69 // 'y clicki' 0x6E 0x67 0x20 0x74 0x68 0x65 0x20 0x6F // 'ng the o' 0x62 0x6A 0x65 0x63 0x74 0x20 0x6F 0x72 // 'bject or' 0x20 0x62 0x61 0x63 0x6B 0x67 0x72 0x6F // ' backgro' 0x75 0x6E 0x64 0x20 0x79 0x6F 0x75 0x20 // 'und you ' 0x61 0x74 0x74 0x61 0x63 0x68 0x65 0x64 // 'attached' 0x20 0x74 0x68 0x65 0x20 0x73 0x6F 0x75 // ' the sou' 0x6E 0x64 0x20 0x74 0x6F 0x2E // 'nd to.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_53= kttRewindEnd #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_53, __HELP_NAME("ttFirstFrame")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_53, __HELP_NAME("ttFirstFrame")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kidFrameRWEnd kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips53 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_53=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_53, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttRewindEnd" ITEM "" ITEM "kidFrameRWEnd" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips53" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_53=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_53, 0x0) BYTE 0x01 0x00 0x03 0x03 0x83 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_53=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_53, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x32 0x00 0x00 0x01 // '????2???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x07 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x32 0x00 0x00 0x03 // '???2???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_53=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_53, 0x0) BYTE 0x03 0x03 0x46 0x69 0x72 0x73 0x74 0x0D // '??First?' 0x0A 0x47 0x6F 0x20 0x74 0x6F 0x20 0x74 // '?Go to t' 0x68 0x65 0x20 0x66 0x69 0x72 0x73 0x74 // 'he first' 0x20 0x66 0x72 0x61 0x6D 0x65 0x20 0x6F // ' frame o' 0x66 0x20 0x74 0x68 0x65 0x20 0x63 0x75 // 'f the cu' 0x72 0x72 0x65 0x6E 0x74 0x20 0x73 0x63 // 'rrent sc' 0x65 0x6E 0x65 0x2E // 'ene.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_54= kttRewind #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_54, __HELP_NAME("ttPreviousFrame")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_54, __HELP_NAME("ttPreviousFrame")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kidFrameRW kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips54 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_5C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_54, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttRewind" ITEM "" ITEM "kidFrameRW" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips54" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_5C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_54, 0x0) BYTE 0x01 0x00 0x03 0x03 0x96 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_5C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x38 0x00 0x00 0x01 // '????8???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0A 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x38 0x00 0x00 0x03 // '???8???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_5C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5C, 0x0) BYTE 0x03 0x03 0x50 0x72 0x65 0x76 0x69 0x6F // '??Previo' 0x75 0x73 0x0D 0x0A 0x47 0x6F 0x20 0x74 // 'us??Go t' 0x6F 0x20 0x74 0x68 0x65 0x20 0x70 0x72 // 'o the pr' 0x65 0x76 0x69 0x6F 0x75 0x73 0x20 0x66 // 'evious f' 0x72 0x61 0x6D 0x65 0x20 0x6F 0x66 0x20 // 'rame of ' 0x74 0x68 0x65 0x20 0x63 0x75 0x72 0x72 // 'the curr' 0x65 0x6E 0x74 0x20 0x73 0x63 0x65 0x6E // 'ent scen' 0x65 0x2E // 'e.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_55= kttFForward #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_55, __HELP_NAME("ttNextFrame")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_55, __HELP_NAME("ttNextFrame")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kidFrameFW kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips55 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_55=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_55, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttFForward" ITEM "" ITEM "kidFrameFW" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips55" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_55=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_55, 0x0) BYTE 0x01 0x00 0x03 0x03 0x81 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_55=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_55, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x30 0x00 0x00 0x01 // '????0???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x06 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x30 0x00 0x00 0x03 // '???0???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_55=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_55, 0x0) BYTE 0x03 0x03 0x4E 0x65 0x78 0x74 0x0D 0x0A // '??Next??' 0x47 0x6F 0x20 0x74 0x6F 0x20 0x74 0x68 // 'Go to th' 0x65 0x20 0x6E 0x65 0x78 0x74 0x20 0x66 // 'e next f' 0x72 0x61 0x6D 0x65 0x20 0x6F 0x66 0x20 // 'rame of ' 0x74 0x68 0x65 0x20 0x63 0x75 0x72 0x72 // 'the curr' 0x65 0x6E 0x74 0x20 0x73 0x63 0x65 0x6E // 'ent scen' 0x65 0x2E // 'e.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_56= kttFForwardEnd #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_56, __HELP_NAME("ttLastFrame")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_56, __HELP_NAME("ttLastFrame")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kidFrameFWEnd kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips56 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_56, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttFForwardEnd" ITEM "" ITEM "kidFrameFWEnd" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips56" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_2A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_56, 0x0) BYTE 0x01 0x00 0x03 0x03 0x80 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x30 0x00 0x00 0x01 // '????0???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x06 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x30 0x00 0x00 0x03 // '???0???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_2A, 0x0) BYTE 0x03 0x03 0x4C 0x61 0x73 0x74 0x0D 0x0A // '??Last??' 0x47 0x6F 0x20 0x74 0x6F 0x20 0x74 0x68 // 'Go to th' 0x65 0x20 0x6C 0x61 0x73 0x74 0x20 0x66 // 'e last f' 0x72 0x61 0x6D 0x65 0x20 0x6F 0x66 0x20 // 'rame of ' 0x74 0x68 0x65 0x20 0x63 0x75 0x72 0x72 // 'the curr' 0x65 0x6E 0x74 0x20 0x73 0x63 0x65 0x6E // 'ent scen' 0x65 0x2E // 'e.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_57= kttFirstScene #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_57, __HELP_NAME("ttFirstScene")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_57, __HELP_NAME("ttFirstScene")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kidSceneRWEnd kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips57 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_54=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_57, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttFirstScene" ITEM "" ITEM "kidSceneRWEnd" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips57" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_54=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_57, 0x0) BYTE 0x01 0x00 0x03 0x03 0x83 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_54=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_54, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x23 0x00 0x00 0x01 // '????#???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0D 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x23 0x00 0x00 0x03 // '???#???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_54=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_54, 0x0) BYTE 0x03 0x03 0x46 0x69 0x72 0x73 0x74 0x20 // '??First ' 0x53 0x63 0x65 0x6E 0x65 0x0D 0x0A 0x47 // 'Scene??G' 0x6F 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 // 'o to the' 0x20 0x66 0x69 0x72 0x73 0x74 0x20 0x73 // ' first s' 0x63 0x65 0x6E 0x65 0x2E // 'cene.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_58= kttPrevScene #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_58, __HELP_NAME("ttPreviousScene")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_58, __HELP_NAME("ttPreviousScene")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kidSceneRW kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips58 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_58=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_58, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttPrevScene" ITEM "" ITEM "kidSceneRW" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips58" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_58=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_58, 0x0) BYTE 0x01 0x00 0x03 0x03 0x96 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_58=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_58, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x29 0x00 0x00 0x01 // '????)???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x10 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x29 0x00 0x00 0x03 // '???)???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_58=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_58, 0x0) BYTE 0x03 0x03 0x50 0x72 0x65 0x76 0x69 0x6F // '??Previo' 0x75 0x73 0x20 0x53 0x63 0x65 0x6E 0x65 // 'us Scene' 0x0D 0x0A 0x47 0x6F 0x20 0x74 0x6F 0x20 // '??Go to ' 0x74 0x68 0x65 0x20 0x70 0x72 0x65 0x76 // 'the prev' 0x69 0x6F 0x75 0x73 0x20 0x73 0x63 0x65 // 'ious sce' 0x6E 0x65 0x2E // 'ne.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_59= kttNextScene #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_59, __HELP_NAME("ttNextScene")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_59, __HELP_NAME("ttNextScene")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kidSceneFW kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips59 ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_59=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_59, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttNextScene" ITEM "" ITEM "kidSceneFW" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips59" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_59=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_59, 0x0) BYTE 0x01 0x00 0x03 0x03 0x81 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_59=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_59, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x21 0x00 0x00 0x01 // '????!???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0C 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x21 0x00 0x00 0x03 // '???!???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_59=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_59, 0x0) BYTE 0x03 0x03 0x4E 0x65 0x78 0x74 0x20 0x53 // '??Next S' 0x63 0x65 0x6E 0x65 0x0D 0x0A 0x47 0x6F // 'cene??Go' 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 // ' to the ' 0x6E 0x65 0x78 0x74 0x20 0x73 0x63 0x65 // 'next sce' 0x6E 0x65 0x2E // 'ne.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_5A= kttLastScene #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5A, __HELP_NAME("ttLastScene")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5A, __HELP_NAME("ttLastScene")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 0x0 kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips5A ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_5A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5A, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttLastScene" ITEM "" ITEM "" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips5A" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_5A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x80 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_5A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x21 0x00 0x00 0x01 // '????!???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0C 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x21 0x00 0x00 0x03 // '???!???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_5A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5A, 0x0) BYTE 0x03 0x03 0x4C 0x61 0x73 0x74 0x20 0x53 // '??Last S' 0x63 0x65 0x6E 0x65 0x0D 0x0A 0x47 0x6F // 'cene??Go' 0x20 0x74 0x6F 0x20 0x74 0x68 0x65 0x20 // ' to the ' 0x6C 0x61 0x73 0x74 0x20 0x73 0x63 0x65 // 'last sce' 0x6E 0x65 0x2E // 'ne.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_5B= kttActorsLaterButton #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5B, __HELP_NAME("ttForward")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5B, __HELP_NAME("ttForward")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kidActorsLaterButton kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips5B ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_5D=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5B, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttActorsLaterButton" ITEM "" ITEM "kidActorsLaterButton" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips5B" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_5D=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x61 0x00 0x00 0x00 // '????a???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_5D=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5D, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x28 0x00 0x00 0x01 // '????(???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x09 0x00 0x00 0x03 // '???????' 0x0F 0x00 0x00 0xFD 0x28 0x00 0x00 0x03 // '???(???' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_5D=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5D, 0x0) BYTE 0x03 0x03 0x46 0x6F 0x72 0x77 0x61 0x72 // '??Forwar' 0x64 0x0D 0x0A 0x4D 0x6F 0x76 0x65 0x20 // 'd??Move ' 0x74 0x68 0x65 0x20 0x6D 0x6F 0x76 0x69 // 'the movi' 0x65 0x20 0x66 0x6F 0x72 0x77 0x61 0x72 // 'e forwar' 0x64 0x20 0x69 0x6E 0x20 0x74 0x69 0x6D // 'd in tim' 0x65 0x2E // 'e.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_5C= kttActorsSoonerButton #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5C, __HELP_NAME("ttBack")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5C, __HELP_NAME("ttBack")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kidActorsSoonerButton kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips5C ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_5B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5C, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttActorsSoonerButton" ITEM "" ITEM "kidActorsSoonerButton" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips5C" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_5B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x60 0x00 0x00 0x00 // '????`???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_5B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x22 0x00 0x00 0x01 // '????"???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x06 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x22 0x00 0x00 0x04 // '????"???' 0x00 0x00 0x00 0x00 0x22 0x00 0x00 0x40 // '????"??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_5B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5B, 0x0) BYTE 0x03 0x03 0x42 0x61 0x63 0x6B 0x0D 0x0A // '??Back??' 0x4D 0x6F 0x76 0x65 0x20 0x74 0x68 0x65 // 'Move the' 0x20 0x6D 0x6F 0x76 0x69 0x65 0x20 0x62 // ' movie b' 0x61 0x63 0x6B 0x20 0x69 0x6E 0x20 0x74 // 'ack in t' 0x69 0x6D 0x65 0x2E // 'ime.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_5D= kttFrameSlider #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5D, __HELP_NAME("ttSliderFrame")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5D, __HELP_NAME("ttSliderFrame")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kidFrameScrollbar kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips5D ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_5E=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5D, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttFrameSlider" ITEM "" ITEM "kidFrameScrollbar" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips5D" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_5E=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5D, 0x0) BYTE 0x01 0x00 0x03 0x03 0xAB 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_5E=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5E, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x24 0x00 0x00 0x01 // '????$???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x08 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x24 0x00 0x00 0x40 // '????$??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_5E=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5E, 0x0) BYTE 0x03 0x03 0x53 0x6C 0x69 0x64 0x65 0x72 // '??Slider' 0x0D 0x0A 0x44 0x72 0x61 0x67 0x20 0x74 // '??Drag t' 0x6F 0x20 0x6D 0x6F 0x76 0x65 0x20 0x77 // 'o move w' 0x69 0x74 0x68 0x69 0x6E 0x20 0x61 0x20 // 'ithin a ' 0x73 0x63 0x65 0x6E 0x65 0x2E // 'scene.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_5E= kttSceneSlider #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5E, __HELP_NAME("ttSliderScene")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5E, __HELP_NAME("ttSliderScene")) __HELP_PACK2 BO OSK LONG kgobBalloonToolTip2 0x0 kidSceneScrollbar kidPlayToolTipSounds 0x0 0x0 0x57415645 kwavToolTips5E ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_57=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5E, 0x0) GST(0) ITEM "kgobBalloonToolTip2" ITEM "kttSceneSlider" ITEM "" ITEM "kidSceneScrollbar" ITEM "kidPlayToolTipSounds" ITEM "kwavToolTips5E" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_57=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5E, 0x0) BYTE 0x01 0x00 0x03 0x03 0xCF 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_57=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_57, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x29 0x00 0x00 0x01 // '????)???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x08 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x29 0x00 0x00 0x40 // '????)??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_57=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_57, 0x0) BYTE 0x03 0x03 0x53 0x6C 0x69 0x64 0x65 0x72 // '??Slider' 0x0D 0x0A 0x44 0x72 0x61 0x67 0x20 0x74 // '??Drag t' 0x6F 0x20 0x6D 0x6F 0x76 0x65 0x20 0x66 // 'o move f' 0x72 0x6F 0x6D 0x20 0x73 0x63 0x65 0x6E // 'rom scen' 0x65 0x20 0x74 0x6F 0x20 0x73 0x63 0x65 // 'e to sce' 0x6E 0x65 0x2E // 'ne.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK ================================================ FILE: src/help/topics1.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ #undef __HELP_NAME #undef __HELP_SYMBOL #undef __HELP_PACK #undef __HELP_PACK2 #ifdef NO_HELP_NAMES #define __HELP_NAME(name) "" #else #define __HELP_NAME(name) name #endif #ifdef NO_HELP_SYMBOLS #define __HELP_SYMBOL(stuff) #else #define __HELP_SYMBOL(stuff) stuff #endif #ifdef PACK_HELP #define __HELP_PACK PACK #else #define __HELP_PACK #endif #ifdef HELP_SINGLE_CHUNK #define __HELP_PACK2 #else #define __HELP_PACK2 __HELP_PACK #endif SET _help_48544F50_0= ktpcTheatre2 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("Mz movie help.")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_0, __HELP_NAME("Mz movie help.")) __HELP_PACK2 BO OSK LONG kgobBalloon1e kgobBalloon1e 0x0 ktpcTheatre2 0x17C 0xB4 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_5=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) GST(0) ITEM "kgobBalloon1e" ITEM "ktpcTheatre2" ITEM "kgobBalloon1e" ITEM "" ITEM "ktpcTheatre2" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_5=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0xAF 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_5=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) AG(4) ITEM LONG 0xC0000002 VAR BYTE 0x44 0x4B 0x4F 0x47 0x00 0x61 0x01 0x00 // 'DKOG?a??' 0xFF 0xFF 0xFF 0xFF 0x03 0x03 0x0F 0x6B // '???k' 0x67 0x6F 0x62 // 'gob' ITEM LONG 0x40000001 VAR BYTE 0x01 0xFF 0xFF 0xFF 0xFF // '?' ITEM LONG 0x40000001 VAR BYTE 0x02 0xFF 0xFF 0xFF 0xFF // '?' ITEM LONG 0xC0000003 VAR LONG 'GOKD' kgobHelpSquishy 0xFFFFFFFF __HELP_SYMBOL( STN "kgobHelpSquishy" ) ITEM LONG 0x40000001 VAR BYTE 0x03 0xFF 0xFF 0xFF 0xFF // '?' ITEM LONG 0x40000001 VAR BYTE 0x04 0xFF 0xFF 0xFF 0xFF // '?' ITEM LONG 0x40000001 VAR BYTE 0x05 0xFF 0xFF 0xFF 0xFF // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_5=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x15 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x89 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0F 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x40 // '???????@' 0x02 0x00 0x00 0x00 0x26 0x00 0x00 0x40 // '????&??@' 0x00 0x00 0x00 0x00 0x28 0x00 0x00 0x40 // '????(??@' 0x03 0x00 0x00 0x00 0x3D 0x00 0x00 0x40 // '????=??@' 0x00 0x00 0x00 0x00 0x3F 0x00 0x00 0x40 // '???????@' 0x05 0x00 0x00 0x00 0x58 0x00 0x00 0x40 // '????X??@' 0x00 0x00 0x00 0x00 0x5A 0x00 0x00 0x40 // '????Z??@' 0x06 0x00 0x00 0x00 0x70 0x00 0x00 0x40 // '????p??@' 0x00 0x00 0x00 0x00 0x72 0x00 0x00 0x40 // '????r??@' 0x07 0x00 0x00 0x00 0x89 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x72 0x00 0x00 0x82 // '????r??' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0x28 0x00 0x00 0xC0 // '????(??' 0x01 0x00 0x00 0x00 0x3F 0x00 0x00 0xC0 // '???????' 0x04 0x00 0x00 0x00 0x5A 0x00 0x00 0xC0 // '????Z??' 0x04 0x00 0x00 0x00 0x72 0x00 0x00 0xC0 // '????r??' 0x04 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_4=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_5, 0x0) BYTE 0x03 0x03 0x44 0x6F 0x20 0x79 0x6F 0x75 // '??Do you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F // ' want to' 0x3A 0x0D 0x0A 0x01 0x09 0x57 0x6F 0x72 // ':????Wor' 0x6B 0x20 0x6F 0x6E 0x20 0x74 0x68 0x69 // 'k on thi' 0x73 0x20 0x6D 0x6F 0x76 0x69 0x65 0x3F // 's movie?' 0x0D 0x0A 0x01 0x09 0x43 0x72 0x65 0x61 // '????Crea' 0x74 0x65 0x20 0x61 0x20 0x6E 0x65 0x77 // 'te a new' 0x20 0x6D 0x6F 0x76 0x69 0x65 0x3F 0x0D // ' movie??' 0x0A 0x01 0x09 0x57 0x61 0x74 0x63 0x68 // '???Watch' 0x20 0x74 0x68 0x69 0x73 0x20 0x6D 0x6F // ' this mo' 0x76 0x69 0x65 0x20 0x61 0x67 0x61 0x69 // 'vie agai' 0x6E 0x3F 0x0D 0x0A 0x01 0x09 0x57 0x61 // 'n?????Wa' 0x74 0x63 0x68 0x20 0x61 0x6E 0x6F 0x74 // 'tch anot' 0x68 0x65 0x72 0x20 0x6D 0x6F 0x76 0x69 // 'her movi' 0x65 0x3F 0x0D 0x0A 0x01 0x09 0x53 0x74 // 'e?????St' 0x6F 0x70 0x20 0x77 0x61 0x74 0x63 0x68 // 'op watch' 0x69 0x6E 0x67 0x20 0x6D 0x6F 0x76 0x69 // 'ing movi' 0x65 0x73 0x3F // 'es?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_1= ktpcTheatre1 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("Mz theater help.")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_1, __HELP_NAME("Mz theater help.")) __HELP_PACK2 BO OSK LONG kgobBalloon1e kgobBalloon1e 0x0 ktpcTheatre1 0x140 0x96 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_A=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) GST(0) ITEM "kgobBalloon1e" ITEM "ktpcTheatre1" ITEM "kgobBalloon1e" ITEM "" ITEM "ktpcTheatre1" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_A=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB6 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_1=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) AG(4) ITEM LONG 0xC0000002 VAR BYTE 0x44 0x4B 0x4F 0x47 0x00 0x61 0x01 0x00 // 'DKOG?a??' 0xFF 0xFF 0xFF 0xFF 0x03 0x03 0x0F 0x6B // '???k' 0x67 0x6F 0x62 // 'gob' ITEM LONG 0x40000001 VAR BYTE 0x01 0xFF 0xFF 0xFF 0xFF // '?' ITEM LONG 0x40000001 VAR BYTE 0x02 0xFF 0xFF 0xFF 0xFF // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_A=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x2B 0x00 0x00 0x01 // '????+???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x1E 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x20 0x00 0x00 0x40 // '???? ??@' 0x02 0x00 0x00 0x00 0x25 0x00 0x00 0x40 // '????%??@' 0x00 0x00 0x00 0x00 0x27 0x00 0x00 0x40 // '????'??@' 0x03 0x00 0x00 0x00 0x2B 0x00 0x00 0x40 // '????+??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x27 0x00 0x00 0x82 // '????'??' 0x00 0x00 0x00 0x00 0x20 0x00 0x00 0xC0 // '???? ??' 0x01 0x00 0x00 0x00 0x27 0x00 0x00 0xC0 // '????'??' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_A=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_A, 0x0) BYTE 0x03 0x03 0x57 0x6F 0x75 0x6C 0x64 0x20 // '??Would ' 0x79 0x6F 0x75 0x20 0x6C 0x69 0x6B 0x65 // 'you like' 0x20 0x74 0x6F 0x20 0x73 0x65 0x65 0x20 // ' to see ' 0x61 0x20 0x6D 0x6F 0x76 0x69 0x65 0x3F // 'a movie?' 0x0D 0x0A 0x01 0x09 0x59 0x65 0x73 0x0D // '????Yes?' 0x0A 0x01 0x09 0x4E 0x6F // '???No' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_2= ktpcSplotIdea2 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2, __HELP_NAME("Splot machine callout # 2")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_2, __HELP_NAME("Splot machine callout # 2")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon4 kgobCalloutBalloon4 0x0 ktpcSplotIdea2 0x1D7 0x1C2 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_7=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2, 0x0) GST(0) ITEM "kgobCalloutBalloon4" ITEM "ktpcSplotIdea2" ITEM "kgobCalloutBalloon4" ITEM "" ITEM "ktpcSplotIdea2" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_7=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_2, 0x0) BYTE 0x01 0x00 0x03 0x03 0xA2 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_7=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x03 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x49 0x00 0x00 0x01 // '????I???' 0x00 0x00 0x00 0x00 0x49 0x00 0x00 0x40 // '????I??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_7=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_7, 0x0) BYTE 0x03 0x03 0x43 0x6C 0x69 0x63 0x6B 0x20 // '??Click ' 0x68 0x65 0x72 0x65 0x20 0x74 0x6F 0x20 // 'here to ' 0x77 0x6F 0x72 0x6B 0x20 0x6F 0x6E 0x20 // 'work on ' 0x74 0x68 0x69 0x73 0x20 0x6D 0x6F 0x76 // 'this mov' 0x69 0x65 0x2C 0x20 0x6F 0x72 0x20 0x63 // 'ie, or c' 0x6C 0x69 0x63 0x6B 0x20 0x43 0x61 0x6E // 'lick Can' 0x63 0x65 0x6C 0x20 0x74 0x6F 0x20 0x67 // 'cel to g' 0x6F 0x20 0x62 0x61 0x63 0x6B 0x20 0x74 // 'o back t' 0x6F 0x20 0x74 0x68 0x65 0x20 0x72 0x6F // 'o the ro' 0x6F 0x6D 0x2E // 'om.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_3= ktpcBackstage #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3, __HELP_NAME("Mz backstage help.")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_3, __HELP_NAME("Mz backstage help.")) __HELP_PACK2 BO OSK LONG kgobBalloon1d kgobBalloon1d 0x0 ktpcBackstage 0x142 0x90 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_0=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3, 0x0) GST(0) ITEM "kgobBalloon1d" ITEM "ktpcBackstage" ITEM "kgobBalloon1d" ITEM "" ITEM "ktpcBackstage" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_0=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_3, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC8 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_0=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) AG(4) ITEM LONG 0xC0000002 VAR BYTE 0x44 0x4B 0x4F 0x47 0x00 0x61 0x01 0x00 // 'DKOG?a??' 0xFF 0xFF 0xFF 0xFF 0x03 0x03 0x0F 0x6B // '???k' 0x67 0x6F 0x62 // 'gob' ITEM LONG 0x40000001 VAR BYTE 0x01 0xFF 0xFF 0xFF 0xFF // '?' ITEM LONG 0x40000001 VAR BYTE 0x02 0xFF 0xFF 0xFF 0xFF // '?' ITEM LONG 0xC0000001 VAR LONG 'GOKD' kgobHelpSquishy 0xFFFFFFFF __HELP_SYMBOL( STN "kgobHelpSquishy" ) ITEM LONG 0x40000001 VAR BYTE 0x03 0xFF 0xFF 0xFF 0xFF // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_0=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0E 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x6B 0x00 0x00 0x01 // '????k???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x17 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x19 0x00 0x00 0x40 // '???????@' 0x02 0x00 0x00 0x00 0x35 0x00 0x00 0x40 // '????5??@' 0x00 0x00 0x00 0x00 0x37 0x00 0x00 0x40 // '????7??@' 0x03 0x00 0x00 0x00 0x53 0x00 0x00 0x40 // '????S??@' 0x05 0x00 0x00 0x00 0x6B 0x00 0x00 0x40 // '????k??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x53 0x00 0x00 0x82 // '????S??' 0x00 0x00 0x00 0x00 0x19 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0x37 0x00 0x00 0xC0 // '????7??' 0x01 0x00 0x00 0x00 0x53 0x00 0x00 0xC0 // '????S??' 0x04 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_0=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_0, 0x0) BYTE 0x03 0x03 0x57 0x68 0x61 0x74 0x20 0x64 // '??What d' 0x6F 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 // 'o you wa' 0x6E 0x74 0x20 0x74 0x6F 0x20 0x64 0x6F // 'nt to do' 0x3F 0x0D 0x0A 0x01 0x09 0x4D 0x61 0x6B // '?????Mak' 0x65 0x20 0x61 0x20 0x6D 0x6F 0x76 0x69 // 'e a movi' 0x65 0x20 0x77 0x69 0x74 0x68 0x20 0x4D // 'e with M' 0x65 0x6C 0x61 0x6E 0x69 0x65 0x3F 0x0D // 'elanie??' 0x0A 0x01 0x09 0x47 0x65 0x74 0x20 0x61 // '???Get a' 0x6E 0x20 0x69 0x64 0x65 0x61 0x20 0x66 // 'n idea f' 0x6F 0x72 0x20 0x61 0x20 0x6D 0x6F 0x76 // 'or a mov' 0x69 0x65 0x3F 0x0D 0x0A 0x01 0x09 0x43 // 'ie?????C' 0x72 0x65 0x61 0x74 0x65 0x20 0x79 0x6F // 'reate yo' 0x75 0x72 0x20 0x6F 0x77 0x6E 0x20 0x6D // 'ur own m' 0x6F 0x76 0x69 0x65 0x3F // 'ovie?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_4= ktpcProject1 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4, __HELP_NAME("Project help.")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_4, __HELP_NAME("Project help.")) __HELP_PACK2 BO OSK LONG kgobBalloon1d kgobBalloon1d 0x0 ktpcProject1 0x1AA 0x140 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_4=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4, 0x0) GST(0) ITEM "kgobBalloon1d" ITEM "ktpcProject1" ITEM "kgobBalloon1d" ITEM "" ITEM "ktpcProject1" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_4=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_4, 0x0) BYTE 0x01 0x00 0x03 0x03 0xCD 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_4=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) AG(4) ITEM LONG 0xC0000001 VAR BYTE 0x44 0x4B 0x4F 0x47 0x00 0x61 0x01 0x00 // 'DKOG?a??' 0xFF 0xFF 0xFF 0xFF 0x03 0x03 0x0F 0x6B // '???k' 0x67 0x6F 0x62 // 'gob' ITEM LONG 0x40000001 VAR BYTE 0x01 0xFF 0xFF 0xFF 0xFF // '?' ITEM LONG 0x40000001 VAR BYTE 0x02 0xFF 0xFF 0xFF 0xFF // '?' ITEM LONG 0xC0000001 VAR LONG 'GOKD' kgobHelpSquishy 0xFFFFFFFF __HELP_SYMBOL( STN "kgobHelpSquishy" ) ENDCHUNK SET _help_cno++ SET _help_474C4D50_3=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x59 0x00 0x00 0x01 // '????Y???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x1E 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x20 0x00 0x00 0x40 // '???? ??@' 0x02 0x00 0x00 0x00 0x37 0x00 0x00 0x40 // '????7??@' 0x00 0x00 0x00 0x00 0x39 0x00 0x00 0x40 // '????9??@' 0x03 0x00 0x00 0x00 0x59 0x00 0x00 0x40 // '????Y??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x39 0x00 0x00 0x82 // '????9??' 0x00 0x00 0x00 0x00 0x20 0x00 0x00 0xC0 // '???? ??' 0x01 0x00 0x00 0x00 0x39 0x00 0x00 0xC0 // '????9??' 0x04 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_3=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_4, 0x0) BYTE 0x03 0x03 0x57 0x68 0x61 0x74 0x20 0x77 // '??What w' 0x6F 0x75 0x6C 0x64 0x20 0x79 0x6F 0x75 // 'ould you' 0x20 0x6C 0x69 0x6B 0x65 0x20 0x74 0x6F // ' like to' 0x20 0x64 0x6F 0x20 0x6E 0x6F 0x77 0x3F // ' do now?' 0x0D 0x0A 0x01 0x09 0x43 0x72 0x65 0x61 // '????Crea' 0x74 0x65 0x20 0x61 0x20 0x66 0x6C 0x79 // 'te a fly' 0x69 0x6E 0x67 0x20 0x6C 0x6F 0x67 0x6F // 'ing logo' 0x3F 0x0D 0x0A 0x01 0x09 0x4C 0x65 0x61 // '?????Lea' 0x72 0x6E 0x20 0x6D 0x6F 0x76 0x69 0x65 // 'rn movie' 0x2D 0x6D 0x61 0x6B 0x69 0x6E 0x67 0x20 // '-making ' 0x74 0x65 0x63 0x68 0x6E 0x69 0x71 0x75 // 'techniqu' 0x65 0x73 0x3F // 'es?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_5= ktpcIdeas #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5, __HELP_NAME("Mz Ideas help")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_5, __HELP_NAME("Mz Ideas help")) __HELP_PACK2 BO OSK LONG kgobBalloon1e kgobBalloon1e 0x0 ktpcIdeas 0x168 0x50 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_C=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5, 0x0) GST(0) ITEM "kgobBalloon1e" ITEM "ktpcIdeas" ITEM "kgobBalloon1e" ITEM "" ITEM "ktpcIdeas" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_C=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_5, 0x0) BYTE 0x01 0x00 0x03 0x03 0x16 0x01 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_9=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) AG(4) ITEM LONG 0xC0000002 VAR BYTE 0x44 0x4B 0x4F 0x47 0x00 0x61 0x01 0x00 // 'DKOG?a??' 0xFF 0xFF 0xFF 0xFF 0x03 0x03 0x0F 0x6B // '???k' 0x67 0x6F 0x62 // 'gob' ITEM LONG 0x40000001 VAR BYTE 0x01 0xFF 0xFF 0xFF 0xFF // '?' ITEM LONG 0x40000001 VAR BYTE 0x02 0xFF 0xFF 0xFF 0xFF // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_C=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x62 0x00 0x00 0x01 // '????b???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0F 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x40 // '???????@' 0x02 0x00 0x00 0x00 0x36 0x00 0x00 0x40 // '????6??@' 0x00 0x00 0x00 0x00 0x38 0x00 0x00 0x40 // '????8??@' 0x03 0x00 0x00 0x00 0x62 0x00 0x00 0x40 // '????b??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x38 0x00 0x00 0x82 // '????8??' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0x38 0x00 0x00 0xC0 // '????8??' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_C=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_C, 0x0) BYTE 0x03 0x03 0x44 0x6F 0x20 0x79 0x6F 0x75 // '??Do you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F // ' want to' 0x3A 0x0D 0x0A 0x01 0x09 0x47 0x65 0x74 // ':????Get' 0x20 0x61 0x6E 0x20 0x69 0x64 0x65 0x61 // ' an idea' 0x20 0x66 0x72 0x6F 0x6D 0x20 0x74 0x68 // ' from th' 0x65 0x20 0x53 0x70 0x6C 0x6F 0x74 0x20 // 'e Splot ' 0x4D 0x61 0x63 0x68 0x69 0x6E 0x65 0x3F // 'Machine?' 0x0D 0x0A 0x01 0x09 0x52 0x65 0x61 0x64 // '????Read' 0x20 0x61 0x63 0x74 0x6F 0x72 0x20 0x72 // ' actor r' 0xE9 0x73 0x75 0x6D 0xE9 0x73 0x20 0x66 // 'sums f' 0x72 0x6F 0x6D 0x20 0x74 0x68 0x65 0x20 // 'rom the ' 0x54 0x61 0x6C 0x65 0x6E 0x74 0x20 0x42 // 'Talent B' 0x6F 0x6F 0x6B 0x3F // 'ook?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_6= ktpcStudio1 #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6, __HELP_NAME("Studio help.")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_6, __HELP_NAME("Studio help.")) __HELP_PACK2 BO OSK LONG kgobBalloon1d kgobBalloon1d 0x0 ktpcStudio1 0x1AA 0x78 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_8=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6, 0x0) GST(0) ITEM "kgobBalloon1d" ITEM "ktpcStudio1" ITEM "kgobBalloon1d" ITEM "" ITEM "ktpcStudio1" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_8=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_6, 0x0) BYTE 0x01 0x00 0x03 0x03 0xC0 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_8=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x58 0x00 0x00 0x01 // '????X???' 0x00 0x00 0x00 0x00 0x18 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x1E 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x50 0x00 0x00 0x03 // '????P???' 0x0A 0x00 0x00 0xFD 0x57 0x00 0x00 0x03 // '???W???' 0x00 0x00 0x00 0x00 0x58 0x00 0x00 0x40 // '????X??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_8=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_8, 0x0) BYTE 0x03 0x03 0x48 0x65 0x79 0x21 0x20 0x59 // '??Hey! Y' 0x6F 0x75 0x20 0x6D 0x61 0x64 0x65 0x20 // 'ou made ' 0x69 0x74 0x20 0x74 0x6F 0x20 0x74 0x68 // 'it to th' 0x65 0x20 0x53 0x74 0x75 0x64 0x69 0x6F // 'e Studio' 0x21 0x20 0x20 0x57 0x68 0x65 0x6E 0x20 // '! When ' 0x79 0x6F 0x75 0x27 0x72 0x65 0x20 0x72 // 'you're r' 0x65 0x61 0x64 0x79 0x20 0x74 0x6F 0x20 // 'eady to ' 0x63 0x72 0x65 0x61 0x74 0x65 0x20 0x61 // 'create a' 0x20 0x6D 0x6F 0x76 0x69 0x65 0x2C 0x20 // ' movie, ' 0x63 0x6C 0x69 0x63 0x6B 0x20 0x74 0x68 // 'click th' 0x65 0x20 0x54 0x6F 0x6F 0x6C 0x62 0x6F // 'e Toolbo' 0x78 0x21 // 'x!' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_7= ktpcSplotIdea #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7, __HELP_NAME("Splot machine callout.")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_7, __HELP_NAME("Splot machine callout.")) __HELP_PACK2 BO OSK LONG kgobCalloutBalloon4 kgobCalloutBalloon4 0x0 ktpcSplotIdea 0x244 0xEB 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_2=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7, 0x0) GST(0) ITEM "kgobCalloutBalloon4" ITEM "ktpcSplotIdea" ITEM "kgobCalloutBalloon4" ITEM "" ITEM "ktpcSplotIdea" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_1=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_7, 0x0) BYTE 0x01 0x00 0x03 0x03 0x5B 0x00 0x00 0x00 // '????[???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_1=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x03 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x21 0x00 0x00 0x01 // '????!???' 0x00 0x00 0x00 0x00 0x21 0x00 0x00 0x40 // '????!??@' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_1=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_1, 0x0) BYTE 0x03 0x03 0x54 0x6F 0x20 0x67 0x65 0x74 // '??To get' 0x20 0x61 0x6E 0x20 0x69 0x64 0x65 0x61 // ' an idea' 0x2C 0x20 0x63 0x6C 0x69 0x63 0x6B 0x20 // ', click ' 0x74 0x68 0x69 0x73 0x20 0x6C 0x65 0x76 // 'this lev' 0x65 0x72 0x2E // 'er.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_16042= ktpcLoginChoice #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_16042, __HELP_NAME("Login: Choices")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_16042, __HELP_NAME("Login: Choices")) __HELP_PACK2 BO OSK LONG kgobBalloonBlank kgobBalloonBlank 0x0 ktpcLoginChoice 0x28 0x8C 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_6=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_16042, 0x0) GST(0) ITEM "kgobBalloonBlank" ITEM "ktpcLoginChoice" ITEM "kgobBalloonBlank" ITEM "" ITEM "ktpcLoginChoice" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_6=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_16042, 0x0) BYTE 0x01 0x00 0x03 0x03 0xED 0x01 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_8=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) AG(4) ITEM LONG 0xC0000006 VAR BYTE 0x44 0x4B 0x4F 0x47 0x00 0x61 0x01 0x00 // 'DKOG?a??' 0xFF 0xFF 0xFF 0xFF 0x03 0x03 0x0F 0x6B // '???k' 0x67 0x6F 0x62 // 'gob' ITEM LONG 0x200000B VAR BYTE 0x10 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ITEM LONG 0x40000001 VAR BYTE 0x01 0xFF 0xFF 0xFF 0xFF // '?' ITEM LONG 0x40000001 VAR BYTE 0x02 0xFF 0xFF 0xFF 0xFF // '?' ITEM LONG 0x40000001 VAR BYTE 0x06 0xFF 0xFF 0xFF 0xFF // '?' ITEM LONG 0x40000001 VAR BYTE 0x03 0xFF 0xFF 0xFF 0xFF // '?' ITEM LONG 0x40000001 VAR BYTE 0x04 0xFF 0xFF 0xFF 0xFF // '?' ITEM LONG 0xC0000001 VAR LONG 'GOKD' _gobHelpSquishy 0xFFFFFFFF __HELP_SYMBOL( STN "_gobHelpSquishy" ) ITEM LONG 0x40000001 VAR BYTE 0x05 0xFF 0xFF 0xFF 0xFF // '?' ITEM LONG 0x40000001 VAR BYTE 0x07 0xFF 0xFF 0xFF 0xFF // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_6=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x45 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // 'E???????' 0x01 0x00 0x10 0x00 0x04 0x00 0x00 0x01 // '????????' 0x01 0x00 0x0C 0x00 0x27 0x00 0x00 0x01 // '????'???' 0x00 0x00 0x08 0x00 0x2C 0x00 0x00 0x01 // '????,???' 0x01 0x00 0x0C 0x00 0xB7 0x00 0x00 0x01 // '???????' 0x00 0x00 0x0C 0x00 0xB9 0x00 0x00 0x01 // '???????' 0x01 0x00 0x0C 0x00 0xD8 0x00 0x00 0x01 // '???????' 0x00 0x00 0x0C 0x00 0xDC 0x00 0x00 0x01 // '???????' 0x00 0x00 0x00 0x00 0x08 0x00 0x00 0x02 // '????????' 0x02 0x00 0x00 0x00 0x0A 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x0C 0x00 0x00 0x02 // '????????' 0x02 0x00 0x00 0x00 0x1C 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x1E 0x00 0x00 0x02 // '????????' 0x02 0x00 0x00 0x00 0x25 0x00 0x00 0x02 // '????%???' 0x00 0x00 0x00 0x00 0x27 0x00 0x00 0x02 // '????'???' 0x02 0x00 0x00 0x00 0x29 0x00 0x00 0x02 // '????)???' 0x00 0x00 0x00 0x00 0x2C 0x00 0x00 0x02 // '????,???' 0x02 0x00 0x00 0x00 0x2E 0x00 0x00 0x02 // '????.???' 0x00 0x00 0x00 0x00 0x62 0x00 0x00 0x02 // '????b???' 0x02 0x00 0x00 0x00 0x64 0x00 0x00 0x02 // '????d???' 0x00 0x00 0x00 0x00 0x69 0x00 0x00 0x02 // '????i???' 0x02 0x00 0x00 0x00 0x6B 0x00 0x00 0x02 // '????k???' 0x00 0x00 0x00 0x00 0x72 0x00 0x00 0x02 // '????r???' 0x02 0x00 0x00 0x00 0x92 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0x93 0x00 0x00 0x02 // '???????' 0x02 0x00 0x00 0x00 0xB1 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0xB2 0x00 0x00 0x02 // '???????' 0x02 0x00 0x00 0x00 0xCB 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0xD8 0x00 0x00 0x02 // '???????' 0x02 0x00 0x00 0x00 0xDC 0x00 0x00 0x02 // '???????' 0x00 0x00 0x00 0x00 0x08 0x00 0x00 0x03 // '????????' 0x22 0x00 0x00 0xFD 0x25 0x00 0x00 0x03 // '"??%???' 0x00 0x00 0x00 0x00 0x29 0x00 0x00 0x03 // '????)???' 0x0F 0x00 0x00 0xFD 0xDA 0x00 0x00 0x03 // '??????' 0x00 0x00 0x00 0x00 0x2C 0x00 0x00 0x05 // '????,???' 0x05 0x00 0x00 0x00 0x41 0x00 0x00 0x05 // '????A???' 0x00 0x00 0x00 0x00 0x62 0x00 0x00 0x05 // '????b???' 0x02 0x00 0x00 0x00 0x72 0x00 0x00 0x05 // '????r???' 0x00 0x00 0x00 0x00 0x74 0x00 0x00 0x05 // '????t???' 0x03 0x00 0x00 0x00 0x93 0x00 0x00 0x05 // '???????' 0x00 0x00 0x00 0x00 0x95 0x00 0x00 0x05 // '???????' 0x04 0x00 0x00 0x00 0xB2 0x00 0x00 0x05 // '???????' 0x00 0x00 0x00 0x00 0xB5 0x00 0x00 0x05 // '???????' 0x05 0x00 0x00 0x00 0xB7 0x00 0x00 0x05 // '???????' 0x01 0x00 0x00 0x00 0xD1 0x00 0x00 0x05 // '???????' 0x05 0x00 0x00 0x00 0xD8 0x00 0x00 0x05 // '???????' 0x00 0x00 0x00 0x00 0x2C 0x00 0x00 0x40 // '????,??@' 0x03 0x00 0x00 0x00 0x41 0x00 0x00 0x40 // '????A??@' 0x00 0x00 0x00 0x00 0x46 0x00 0x00 0x40 // '????F??@' 0x04 0x00 0x00 0x00 0x5D 0x00 0x00 0x40 // '????]??@' 0x00 0x00 0x00 0x00 0x62 0x00 0x00 0x40 // '????b??@' 0x06 0x00 0x00 0x00 0x72 0x00 0x00 0x40 // '????r??@' 0x00 0x00 0x00 0x00 0x77 0x00 0x00 0x40 // '????w??@' 0x07 0x00 0x00 0x00 0x93 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x98 0x00 0x00 0x40 // '??????@' 0x09 0x00 0x00 0x00 0xB2 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xB7 0x00 0x00 0x40 // '??????@' 0x05 0x00 0x00 0x00 0xCC 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0xD1 0x00 0x00 0x40 // '??????@' 0x0A 0x00 0x00 0x00 0xD8 0x00 0x00 0x40 // '??????@' 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x80 // '???????' 0x12 0x00 0x00 0x00 0xDE 0x00 0x00 0x80 // '??????' 0x00 0x00 0x00 0x00 0x2C 0x00 0x00 0xC0 // '????,??' 0x01 0x00 0x00 0x00 0x46 0x00 0x00 0xC0 // '????F??' 0x08 0x00 0x00 0x00 0x62 0x00 0x00 0xC0 // '????b??' 0x01 0x00 0x00 0x00 0x77 0x00 0x00 0xC0 // '????w??' 0x01 0x00 0x00 0x00 0x98 0x00 0x00 0xC0 // '??????' 0x01 0x00 0x00 0x00 0xB7 0x00 0x00 0xC0 // '??????' 0x01 0x00 0x00 0x00 0xD1 0x00 0x00 0xC0 // '??????' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_6=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_6, 0x0) BYTE 0x03 0x03 0x0D 0x0A 0x0D 0x0A 0x09 0x20 // '??????? ' 0x20 0x20 0x57 0x68 0x61 0x74 0x20 0x64 // ' What d' 0x6F 0x20 0x79 0x6F 0x75 0x20 0x77 0x61 // 'o you wa' 0x6E 0x74 0x20 0x74 0x6F 0x20 0x64 0x6F // 'nt to do' 0x20 0x74 0x6F 0x64 0x61 0x79 0x3F 0x0D // ' today??' 0x0A 0x0D 0x0A 0x09 0x09 0x09 0x01 0x09 // '????????' 0x43 0x72 0x65 0x61 0x74 0x65 0x20 0x61 // 'Create a' 0x20 0x6E 0x65 0x77 0x20 0x6D 0x6F 0x76 // ' new mov' 0x69 0x65 0x3F 0x0D 0x0A 0x09 0x09 0x09 // 'ie??????' 0x01 0x09 0x57 0x6F 0x72 0x6B 0x20 0x6F // '??Work o' 0x6E 0x20 0x61 0x6E 0x20 0x6F 0x6C 0x64 // 'n an old' 0x20 0x6D 0x6F 0x76 0x69 0x65 0x3F 0x0D // ' movie??' 0x0A 0x09 0x09 0x09 0x01 0x09 0x57 0x61 // '??????Wa' 0x74 0x63 0x68 0x20 0x61 0x20 0x6D 0x6F // 'tch a mo' 0x76 0x69 0x65 0x3F 0x0D 0x0A 0x09 0x09 // 'vie?????' 0x09 0x01 0x09 0x4D 0x61 0x6B 0x65 0x20 // '???Make ' 0x61 0x20 0x6D 0x6F 0x76 0x69 0x65 0x20 // 'a movie ' 0x77 0x69 0x74 0x68 0x20 0x4D 0x65 0x6C // 'with Mel' 0x61 0x6E 0x69 0x65 0x3F 0x0D 0x0A 0x09 // 'anie????' 0x09 0x09 0x01 0x09 0x47 0x65 0x74 0x20 // '????Get ' 0x61 0x6E 0x20 0x69 0x64 0x65 0x61 0x20 // 'an idea ' 0x66 0x6F 0x72 0x20 0x61 0x20 0x6D 0x6F // 'for a mo' 0x76 0x69 0x65 0x3F 0x0D 0x0A 0x09 0x09 // 'vie?????' 0x09 0x01 0x09 0x47 0x6F 0x20 0x74 0x6F // '???Go to' 0x20 0x49 0x6D 0x61 0x67 0x69 0x6E 0x6F // ' Imagino' 0x70 0x6F 0x6C 0x69 0x73 0x3F 0x0D 0x0A // 'polis???' 0x09 0x09 0x09 0x01 0x09 0x51 0x75 0x69 // '?????Qui' 0x74 0x3F 0x0D 0x0A 0x0D 0x0A 0x0D 0x0A // 't???????' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_16047= ktpcYouHere #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_16047, __HELP_NAME("Map - you are here topic")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_16047, __HELP_NAME("Map - you are here topic")) __HELP_PACK2 BO OSK LONG kgobMapHere kgobMapHere 0x0 0xFFFFFFFF 0x0 0x0 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_3=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_16047, 0x0) GST(0) ITEM "kgobMapHere" ITEM "ktpcYouHere" ITEM "kgobMapHere" ITEM "" ITEM "" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_3=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_16047, 0x0) BYTE 0x01 0x00 0x03 0x03 0x5A 0x00 0x00 0x00 // '????Z???' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_2=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) AG(4) ITEM LONG 0x2000002 VAR BYTE 0x10 0x00 0x00 0x00 0x03 0x03 0x03 0x03 // '????????' 0x0D 0x43 0x6F 0x6D 0x69 0x63 0x20 0x53 // '?Comic S' 0x61 0x6E 0x73 0x20 0x4D 0x53 0x00 // 'ans MS?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_2=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0xFF 0xFF 0x0D 0x00 0x00 0x01 // '??????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x08 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x09 0x00 0x00 0x02 // '????????' 0x01 0x00 0x00 0x00 0x0C 0x00 0x00 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0F 0x00 0x00 0xFD 0x0D 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_2=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_3, 0x0) BYTE 0x03 0x03 0x59 0x6F 0x75 0x20 0x61 0x72 // '??You ar' 0x65 0x20 0x68 0x65 0x72 0x65 0x2E // 'e here.' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_16048= ktpcTicketChoices #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_16048, __HELP_NAME("ktpcTicketChoices")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_16048, __HELP_NAME("ktpcTicketChoices")) __HELP_PACK2 BO OSK LONG kgobBalloon1d kgobBalloon1d kgobTicket2McZee ktpcTicketChoices 0x190 0x64 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_B=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_16048, 0x0) GST(0) ITEM "kgobBalloon1d" ITEM "ktpcTicketChoices" ITEM "kgobBalloon1d" ITEM "kgobTicket2McZee" ITEM "ktpcTicketChoices" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_B=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_16048, 0x0) BYTE 0x01 0x00 0x03 0x03 0x80 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_6=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B, 0x0) AG(4) ITEM LONG 0xC0000002 VAR BYTE 0x44 0x4B 0x4F 0x47 0x00 0x61 0x01 0x00 // 'DKOG?a??' 0xFF 0xFF 0xFF 0xFF 0x03 0x03 0x0F 0x6B // '???k' 0x67 0x6F 0x62 // 'gob' ITEM LONG 0x40000001 VAR BYTE 0x02 0xFF 0xFF 0xFF 0xFF // '?' ITEM LONG 0x40000001 VAR BYTE 0x01 0xFF 0xFF 0xFF 0xFF // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_B=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0D 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x34 0x00 0x00 0x01 // '????4???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x0F 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x40 // '???????@' 0x03 0x00 0x00 0x00 0x21 0x00 0x00 0x40 // '????!??@' 0x00 0x00 0x00 0x00 0x23 0x00 0x00 0x40 // '????#??@' 0x02 0x00 0x00 0x00 0x34 0x00 0x00 0x40 // '????4??@' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0x80 // '???????' 0x12 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x23 0x00 0x00 0x82 // '????#??' 0x00 0x00 0x00 0x00 0x11 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0x23 0x00 0x00 0xC0 // '????#??' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_B=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_B, 0x0) BYTE 0x03 0x03 0x44 0x6F 0x20 0x79 0x6F 0x75 // '??Do you' 0x20 0x77 0x61 0x6E 0x74 0x20 0x74 0x6F // ' want to' 0x3A 0x0D 0x0A 0x01 0x20 0x20 0x4D 0x61 // ':??? Ma' 0x6B 0x65 0x20 0x61 0x20 0x6D 0x6F 0x76 // 'ke a mov' 0x69 0x65 0x3F 0x0D 0x0A 0x01 0x20 0x20 // 'ie???? ' 0x57 0x61 0x74 0x63 0x68 0x20 0x61 0x20 // 'Watch a ' 0x6D 0x6F 0x76 0x69 0x65 0x3F // 'movie?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK SET _help_48544F50_16051= ktpcLobbyTip #ifdef HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_16051, __HELP_NAME("Lobby Mz balloon.")) __HELP_PACK SUBFILE #endif //HELP_SINGLE_CHUNK CHUNK('HTOP', _help_48544F50_16051, __HELP_NAME("Lobby Mz balloon.")) __HELP_PACK2 BO OSK LONG kgobBalloon1d kgobBalloon1d 0x0 ktpcLobbyTip 0x17C 0xB4 0x57415645 0xFFFFFFFF ENDCHUNK #ifndef NO_HELP_SYMBOLS SET _help_cno++ SET _help_47535420_9=_help_cno CHUNK('GST ', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_16051, 0x0) GST(0) ITEM "kgobBalloon1d" ITEM "ktpcLobbyTip" ITEM "kgobBalloon1d" ITEM "" ITEM "ktpcLobbyTip" ITEM "" ENDCHUNK #endif //!NO_HELP_SYMBOLS SET _help_cno++ SET _help_52545854_9=_help_cno CHUNK('RTXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('HTOP', _help_48544F50_16051, 0x0) BYTE 0x01 0x00 0x03 0x03 0xB3 0x00 0x00 0x00 // '???????' 0x0C 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF // '????' 0x03 0x03 0x0D 0x43 0x6F 0x6D 0x69 0x63 // '???Comic' 0x20 0x53 0x61 0x6E 0x73 0x20 0x4D 0x53 // ' Sans MS' 0x00 // '?' ENDCHUNK SET _help_cno++ SET _help_41475041_7=_help_cno CHUNK('AGPA', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_9, 0x0) AG(4) ITEM LONG 0xC0000002 VAR BYTE 0x44 0x4B 0x4F 0x47 0x00 0x61 0x01 0x00 // 'DKOG?a??' 0xFF 0xFF 0xFF 0xFF 0x03 0x03 0x0F 0x6B // '???k' 0x67 0x6F 0x62 // 'gob' ITEM LONG 0x40000001 VAR BYTE 0x01 0xFF 0xFF 0xFF 0xFF // '?' ITEM LONG 0x40000001 VAR BYTE 0x02 0xFF 0xFF 0xFF 0xFF // '?' ENDCHUNK SET _help_cno++ SET _help_474C4D50_9=_help_cno CHUNK('GLMP', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_9, 0x0) BYTE 0x01 0x00 0x03 0x03 0x08 0x00 0x00 0x00 // '????????' 0x0C 0x00 0x00 0x00 0x00 0x00 0x00 0x01 // '????????' 0x01 0x00 0x00 0x00 0x44 0x00 0x00 0x01 // '????D???' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 // '????????' 0x0A 0x00 0x00 0xFD 0x12 0x00 0x00 0x03 // '???????' 0x00 0x00 0x00 0x00 0x14 0x00 0x00 0x40 // '???????@' 0x02 0x00 0x00 0x00 0x28 0x00 0x00 0x40 // '????(??@' 0x00 0x00 0x00 0x00 0x2A 0x00 0x00 0x40 // '????*??@' 0x03 0x00 0x00 0x00 0x44 0x00 0x00 0x40 // '????D??@' 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x82 // '???????' 0x05 0x00 0x00 0x00 0x2A 0x00 0x00 0x82 // '????*??' 0x00 0x00 0x00 0x00 0x14 0x00 0x00 0xC0 // '???????' 0x01 0x00 0x00 0x00 0x2A 0x00 0x00 0xC0 // '????*??' 0x01 0x00 0x00 0x00 // '????' ENDCHUNK SET _help_cno++ SET _help_54455854_9=_help_cno CHUNK('TEXT', _help_cno, __HELP_NAME("")) __HELP_PACK2 PARENT('RTXT', _help_52545854_9, 0x0) BYTE 0x03 0x03 0x57 0x6F 0x75 0x6C 0x64 0x20 // '??Would ' 0x79 0x6F 0x75 0x20 0x6C 0x69 0x6B 0x65 // 'you like' 0x20 0x74 0x6F 0x3A 0x0D 0x0A 0x01 0x09 // ' to:????' 0x47 0x6F 0x20 0x74 0x6F 0x20 0x74 0x68 // 'Go to th' 0x65 0x20 0x74 0x68 0x65 0x61 0x74 0x65 // 'e theate' 0x72 0x3F 0x0D 0x0A 0x01 0x09 0x43 0x68 // 'r?????Ch' 0x65 0x63 0x6B 0x20 0x6F 0x75 0x74 0x20 // 'eck out ' 0x74 0x68 0x65 0x20 0x73 0x6E 0x61 0x63 // 'the snac' 0x6B 0x20 0x62 0x61 0x72 0x3F // 'k bar?' ENDCHUNK #ifdef HELP_SINGLE_CHUNK ENDCHUNK #endif //HELP_SINGLE_CHUNK ================================================ FILE: src/helpaud/helpaud.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // // HELP AUDIO CHUNK FILE // #include "kidgs.chh" #include "stdiodef.h" #include "helptops.h" #include "helpbook.h" #include "projmain.h" #include "helpres.h" // here are the WAVES to include #include "wctooltp.cht" #include "wcbasics.cht" #include "wctoolhp.cht" #include "wcgdelgo.cht" #include "wcproj.cht" #include "wchowto.cht" ================================================ FILE: src/helpaud/makefile ================================================ #---$(SOC_ROOT)\src\helpaud\makefile !IFNDEF MAKEFILE_HELPAUD MAKEFILE_HELPAUD = 1 !INCLUDE $(KAUAI_ROOT)\makefile.def #HELP SOURCE DIRECTORY HELPAUD_SRC_DIR = $(SOC_ROOT)\src\helpaud #SOC OBJ DIRECTORY SOC_OBJ_ROOT_DIR = $(SOC_ROOT)\obj SOC_OBJ_DIR = $(SOC_OBJ_ROOT_DIR)\$(BLD_TYPE_DIR) !IF "$(LOCAL_BUILD)" == "1" TARGET_DIR = !ELSE # LOCAL_BUILD TARGET_DIR = $(SOC_OBJ_DIR)^\ !ENDIF # !LOCAL_BUILD HELPAUD_CHT_FILES = \ $(HELPAUD_SRC_DIR)\helpaud.cht\ $(HELPAUD_SRC_DIR)\wctooltp.cht\ $(HELPAUD_SRC_DIR)\wcbasics.cht\ $(HELPAUD_SRC_DIR)\wctoolhp.cht\ $(HELPAUD_SRC_DIR)\wcgdelgo.cht\ $(HELPAUD_SRC_DIR)\wcproj.cht\ $(HELPAUD_SRC_DIR)\wchowto.cht HELPAUD_CHUNK_TARGETS =\ $(TARGET_DIR)helpaud.chk #-Compile rules------------------------------------------------------------- SRC_DIR = $(HELPAUD_SRC_DIR) OBJ_DIR = $(SOC_OBJ_DIR) TGT_NAME = HelpAud !INCLUDE $(SOC_ROOT)\makefile.rul #-Targets------------------------------------------------------------------- ALL_HELPAUD = $(TARGET_DIR)helpaud.chk ALL_TARGETS_ROOT = $(ALL_TARGETS_ROOT) $(ALL_HELPAUD) CLEAN_HELP = CLEAN_HELPAUD_CHUNKS CLEAN_TARGETS_ROOT = $(CLEAN_TARGETS_ROOT) $(CLEAN_HELP) !IF "$(LOCAL_BUILD)" != "1" !IF "$(LOCAL_BUILD)" != "0" ALL: $(SOC_OBJ_DIR) HELPAUD_CONTENT CLEAN: CLEAN_HELPAUD_CHUNKS ALL !ENDIF # LOCAL_BUILD != 0 $(SOC_OBJ_DIR) : @echo Making Directories $(SOC_OBJ_DIR)... if not exist $(SOC_OBJ_ROOT_DIR)/nul mkdir $(SOC_OBJ_ROOT_DIR) if not exist $(SOC_OBJ_DIR)/nul mkdir $(SOC_OBJ_DIR) !ENDIF # LOCAL_BUILD != 1 CLEAN_HELPAUD_CHUNKS: @echo <nul^ DEL /q dummy.nul ) 2>nul <= 0); // 0 = table of contents (valid) DEBUGCMD(PrintStr("Updating bio pages object")); If( ::nBioPage < 0 || ::nBioPage > NUM_BIOPAGES ); DEBUGCMD( AlertStr( "Invalid bio page start: default to 0 [toc]" )); ::nBioPage = 0; End; // Script to update the display of the bio page // First, map the internal ID to a page id ... id = Select( ::nBioPage, BIO_PAGE_ORDER ); // update the pictures If ( !FGobExists( kgobBioActors )); CreateChildThis( kgobBioActors, kgobBioActors ); End; SetRepGob( kgobBioActors, kcell1 + id ); NumToStr( id, kstidBioPageNum ); If ( !FGobExists( kgobBioHolder )); CreateChildThis( kgobBioHolder, kgobBioHolder ); End; If ( !FGobExists( kgobBioPageHolder )); CreateChildThis( kgobBioPageHolder, kgobBioPageHolder ); End; // and the text... CreateHelpGob( kgobBioHolder, ktpcBioPage1 + id ); // page number - not for table of contents page If ( id != 0 ); CreateHelpGob( kgobBioPageHolder, ktpcBioPageNum ); Else; DestroyGob( kgobBioPageHolder ); End; If( ::fBioCtrl ); // panel makes the page look like it's in a book If( !FGobExists( kgobBioPanel)); CreateChildThis( kgobBioPanel, kgobBioPanel ); End; // forward button If( !FGobExists( kgobBioFwd)); CreateChildThis( kgobBioFwd, kgobBioFwd ); End; // back button If( !FGobExists( kgobBioBack )); CreateChildThis( kgobBioBack, kgobBioBack ); End; End; // and make sure we've got a cancel button! If( !FGobExists( kgobBioCancel )); CreateChildThis( kgobBioCancel,kgobBioCancel ); End; // play the sound as appropriate.. If( .snd != cnoNil ); // page by itself-- play the intro audio PlaySoundThis(kctgWave, .snd, 1, 0x00010000, 1, 1, ksclBldgSound); .snd = cnoNil; End; ENDCHUNK // script to eat and throw away key clicks CHILD_SCRIPT( "help book : switch to section", kchidScript9 ) If ( _parm[2] == Select( .count, 's', 'o', 'c', 'r', 'a', 't', 'e', 's' )); ++.count; If( .count == 8 ); CreateChildThis( 7777, 7777 ); // video End; Else; .count = 0; End; Return( fTrue ); ENDCHUNK GOBCHUNK("melanie - AVI ", 7777, gokkNoHitThis ) DEFAULT_POSITION( 160, 120, 999 ) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_VIDEO( CHID1( krepDefault ), "bldgdata.chk", fTrue ) // --------------------------------------------------------------- // graphic that contains the rings, etc. OBJECT( "Bio Panel", kgobBioPanel, 10, kcrsHand1 ) REP_PPMBMP( CHID1(krepDefault ), "shared\pbm\biopanel.pbm" ) // --------------------------------------------------------------- OBJECTREG( "Bio cancel", kgobBioCancel, kxpBioCancel, kypBioCancel, 10, kcrsHand1 ) REP_PPMBMP( CHID1(krepDefault ), "shared\pbm\cancel.pbm" ) ADOPT_MBMP(LAST_MBMP, CHID1( krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID1( krepMouseDnOff)) REP_PPMBMP(CHID1(krepMouseDnOn), "shared\pbm\cancelc.pbm" ) CLICK_SCRIPT("Bio cancel clicked") // This is the only way out of the biobook -- re-enable keyboard // accelerators here. PlaySoundThis(kctgWave, kwavBioCancel, 1, 0x00010000, 1, 4, ksclBldgSound); If (FGobExists(kidActorsCompose)); EnqueueCid(cidClicked, kidActorsCompose, 0, 0, 0, 0); End; DestroyGob( kgobBioPage ); ENABLEACCEL(fFalse); ENDCHUNK // --------------------------------------------------------------- OBJECTREG( "Bio Fwd", kgobBioFwd, kxpBioFwd, kypBioFwd, 10, kcrsHand1 ) REP_PPMBMP( CHID1(krepDefault ), "shared\pbm\fwd.pbm" ) ADOPT_MBMP(LAST_MBMP, CHID1( krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID1( krepMouseDnOff)) REP_PPMBMP(CHID1(krepMouseDnOn), "shared\pbm\fwdc.pbm" ) CLICK_SCRIPT("Bio forward clicked") curr = ::nBioPage; While( 1 ); ++::nBioPage; // next page If ( ::nBioPage == NUM_BIOPAGES ); // at the end? ::nBioPage = curr; // don't advance then. Break; End; If( fBIO_AVAIL( ::nBioPage )); // do we have it? wav = Rnd(2) + kwavBio3; // play a random sound PlaySoundThis(kctgWave, wav, 1, 0x00010000, 1, 4, ksclBldgSound); Break; // yep, all done. End; End; RunScriptGob( kgobBioPage, kchidScript1 ); ENDCHUNK // --------------------------------------------------------------- OBJECTREG( "Bio Back", kgobBioBack, kxpBioBack, kypBioBack, 10, kcrsHand1 ) REP_PPMBMP( CHID1(krepDefault ), "shared\pbm\back.pbm" ) ADOPT_MBMP(LAST_MBMP, CHID1( krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID1( krepMouseDnOff)) REP_PPMBMP(CHID1(krepMouseDnOn), "shared\pbm\backc.pbm" ) CLICK_SCRIPT("Bio back clicked") curr = ::nBioPage; While( 1 ); --::nBioPage; If ( ::nBioPage < 0 ); // at the beginning ::nBioPage = curr; // don't change then. Break; End; If( fBIO_AVAIL( ::nBioPage )); // do we have it? wav = Rnd(2) + kwavBio1; // play a random sound PlaySoundThis(kctgWave, wav, 1, 0x00010000, 1, 4, ksclBldgSound); Break; // yep, all done. End; End; RunScriptGob( kgobBioPage, kchidScript1 ); ENDCHUNK // --------------------------------------------------------- // BUILDING BIO PAGE STUB WAVE_CHUNK( "shared\sound\bio\TBPAGEB1.WAV", kwavBio1 ) // back WAVE_CHUNK( "shared\sound\bio\TBPAGEB2.WAV", kwavBio2 ) // back 2 WAVE_CHUNK( "shared\sound\bio\TBPAGEF1.WAV", kwavBio3 ) WAVE_CHUNK( "shared\sound\bio\TBPAGEF2.WAV", kwavBio4 ) // ----------------------------------------------------- // transparent rectangular balloon that allows hit testing // // This'll grow to fit the text in it... // ----------------------------------------------------- GOBCHUNK( "biotopic balloon", kgobBlankBalloon, 0) DEFAULT_POSITION( 0,0,500 ) ACTION(fcustHotText, fcustHotText, fgrfstAll, kcrsHand1, chidNil, cidNil, cnoNil) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow1, chidNil, cidNil, cnoNil ) ENDCHUNK REP_RECT( CHID1( krepDefault), "page blank", 0,0, 300, 300 ) // this holds the above balloon OBJECT( "", kgobBioHolder, 3, kcrsArrow1 ) REP_RECT( CHID1( krepDefault), "page blank", kxpBioPageLeft, kypBioPageTop, kxpBioPageRight, kypBioPageBottom ) // holds the "Page # of #" balloon OBJECT( "bio page #", kgobBioPageHolder, 200, kcrsArrow1 ) REP_RECT( CHID1( krepDefault), "page blank", kxpBioPageNumLeft, kypBioPageNumTop, kxpBioPageNumRight, kypBioPageNumBottom ) // ----------------------------------------------------- // Bio tip balloon // ----------------------------------------------------- GOBCHUNK("Hot help for tools", kgobPopTip, kgokkNormal) DEFAULT_POSITION(0,0,700) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow1, CHID1(kchidClick), cidNil, cnoNil) ENDCHUNK REP_TILE( CHID1( krepDefault), "Tool topic tile", "shared\bmp\biotip.bmp", 84, 61) TILEDEF( 15, 15, 24, 120, 8, 0, 0, 0, 24 ) TILEDEF( 12, 12, 24, 74, 8, 0, 0, 0, 24 ) ENDCHUNK // filtering messages CREATE_ANIM("Filtering messages for help tools balloon") // get all mouse downs FilterCmdsThis(cidMouseDown, kidNil, kchidScript1); FilterCmdsThis(cidKey, kidNil, kchidScript1); PlaySoundThis(kctgWave, kwavBioPopup , 1, 0x00010000, 1, 1, ksclBldgSound); ENDCHUNK // Handle mouse clicks CHILD_SCRIPT("Got a click or keydown", kchidScript1) DestroyThis(); ENDCHUNK CLICK_SCRIPT("Got a click or keydown" ) DestroyThis(); ENDCHUNK // This script will be invoked if the user clicks on a tip inside the bio page. // This'll create a pop up tip --- but as a child of the biopage, *not* of the // bounding rectangle thing HELP_SCRIPT( kidBioTipScript ) // parm[0] = group # passed in If(_parm[0] != 0); // Valid group clicked _parm[4] is id of table object to run If( _parm[4] != cnoNil ); CreateHelpGob( kgobBioPage, _parm[4] ); End; Return( fTrue ); // tell KAUAI NOT to create help balloon End; ENDCHUNK ================================================ FILE: src/shared/cursors.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // ------------------------------------------------------------------------ // Shared cursor definitions... // ------------------------------------------------------------------------ CURSORCHUNK( "shared\cursors\hotspot.cur", kcrsHand1 ) CURSORCHUNK( "shared\cursors\default.cur", kcrsArrow1 ) CURSORCHUNK( "shared\cursors\actions2.cur", kcrsWand1 ) CURSORCHUNK( "shared\cursors\crs1018.cur", kcrsStar ) CURSORCHUNK( "shared\cursors\turnleft.cur", kcrsLeft ) CURSORCHUNK( "shared\cursors\turnrigt.cur", kcrsRight ) CURSORCHUNK( "shared\cursors\turnarnd.cur", kcrsDown ) CURSORCHUNK( "shared\cursors\turnarnd.cur", kcrsTurn1 ) ================================================ FILE: src/shared/makefile ================================================ #---shared.mak !IFNDEF MAKEFILE_SHARED MAKEFILE_SHARED = 1 !INCLUDE $(KAUAI_ROOT)\makefile.def #SHARED SOURCE DIRECTORY SHARED_SRC_DIR = $(SOC_ROOT)\src\shared #SOC OBJ DIRECTORY SOC_OBJ_ROOT_DIR = $(SOC_ROOT)\obj SOC_OBJ_DIR = $(SOC_OBJ_ROOT_DIR)\$(BLD_TYPE_DIR) !IF "$(LOCAL_BUILD)" == "1" TARGET_DIR = !ELSE # LOCAL_BUILD TARGET_DIR = $(SOC_OBJ_DIR)^\ !ENDIF # !LOCAL_BUILD SOC_HEADER_FILES = \ $(SOC_ROOT)\inc\kidgs.chh \ !IF "$(TYPE)" == "DEBUG" $(SOC_ROOT)\inc\assert.chh \ !ENDIF $(SOC_ROOT)\inc\kidgsdef.h \ $(KAUAI_ROOT)\src\kiddef.h \ $(KAUAI_ROOT)\src\framedef.h \ $(SOC_ROOT)\inc\buildgob.h \ $(SOC_ROOT)\inc\sharedef.h \ $(SOC_ROOT)\inc\sharutil.chh\ $(SOC_ROOT)\inc\balloons.chh SHARED_CHT_FILES = \ $(SHARED_SRC_DIR)\shared.cht\ $(SHARED_SRC_DIR)\util.cht\ $(SHARED_SRC_DIR)\cursors.cht\ $(SHARED_SRC_DIR)\map.cht\ $(SHARED_SRC_DIR)\biopage.cht\ $(SHARED_SRC_DIR)\sharhelp.cht\ $(SHARED_SRC_DIR)\sharecd.cht SHARED_CHH_FILES = $(SHARED_SRC_DIR)\map.chh SHARED_CHUNK_TARGETS =\ $(TARGET_DIR)shared.chk $(TARGET_DIR)sharecd.chk #-Compile rules------------------------------------------------------------- SRC_DIR = $(SHARED_SRC_DIR) OBJ_DIR = $(SOC_OBJ_DIR) TGT_NAME = Shared !INCLUDE $(SOC_ROOT)\makefile.rul #-Targets------------------------------------------------------------------- ALL_SHARED = $(TARGET_DIR)shared.chk $(TARGET_DIR)sharecd.chk ALL_TARGETS_ROOT = $(ALL_TARGETS_ROOT) $(ALL_SHARED) CLEAN_SHARED = CLEAN_SHARED_CHUNKS CLEAN_TARGETS_ROOT = $(CLEAN_TARGETS_ROOT) $(CLEAN_SHARED) !IF "$(LOCAL_BUILD)" != "1" !IF "$(LOCAL_BUILD)" != "0" ALL: $(SOC_OBJ_DIR) SHARED_CONTENT CLEAN: CLEAN_SHARED_CHUNKS ALL !ENDIF # LOCAL_BUILD != 0 $(SOC_OBJ_DIR) : @echo Making Directories $(SOC_OBJ_DIR)... if not exist $(SOC_OBJ_ROOT_DIR)/nul mkdir $(SOC_OBJ_ROOT_DIR) if not exist $(SOC_OBJ_DIR)/nul mkdir $(SOC_OBJ_DIR) !ENDIF # LOCAL_BUILD != 1 CLEAN_SHARED_CHUNKS: @echo <nul^ DEL /q dummy.nul ) 2>nul < tools = CANCEL DEBUGCMD(PrintStr("Studio=>Studio via Map")); ENABLEACCEL(fFalse); DestroyThis(); Exit(); End; // tools -> building DEBUGCMD(PrintStr("Studio=>Building via Map")); SetProp(kpridBuildingGob, newplace ); SetProp(kpridBuildingState, newstate); ENABLEACCEL(fFalse); SETPALETTE( cnoNil ); // invalidate our palette and force a transition - bug #1708 EnqueueCid(cidLoadBuilding, 0, 0, 0, 0, 0); DestroyThis(); Else; If (GidParThis() == newplace); // Building -> same place in building = cancel // except: when state of newplace is NOT the MAPENTRY state. DEBUGCMD(PrintStr("Building=>Same place in Building via Map")); ENABLEACCEL(fFalse); DestroyThis(); If (newstate != MAPENTRY(newplace)); DEBUGCMD(PrintStr("Changing state to ", NumToStr(newstate, ""))); SETGLOBAL(kstEntry, newstate); // Script0 contains the dispatch info for the place gob. If // there is no script0, Kauai will complain so I won't bother // with any debug code here. RunScriptGob(newplace, kchidScript0); End; Exit(); End; // Building -> building case // Building -> building / tools DEBUGCMD(PrintStr("Building=>Building or Studio via Map")); ENABLEACCEL(fFalse); DestroyThis(); NEXTPLACE1( newplace, newstate ); End; ENDCHUNK // -------------------------------------------------------------------------------- OBJECTREG( "map - cancel button", kgobMapCancel, kxpMapCancel, kypMapCancel, 60, kcrsHand1 ) REP_MBMPREG(CHID1(krepDefault), "shared\bmp\map\cancel.bmp", kxpregMapCancel, kypregMapCancel ) ADOPT_MBMP(LAST_MBMP, CHID1(krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID1(krepMouseDnOff)) REP_MBMPREG(CHID1(krepMouseDnOn), "shared\bmp\map\cancelc.bmp", kxpregMapCancel, kypregMapCancel ) REP_WAVE( CHID1(krepClicked), "shared\sound\map\cancel.wav" ) CLICK_SCRIPT( "cancel Mask clicked" ) ENABLEACCEL(fFalse); DestroyGob( kgobMapMain ); ENDCHUNK //---------------------------------------------------------------------------------- OBJECTREG( "map - exit button", kgobMapExit, kxpMapExit, kypMapExit, 60, kcrsHand1) REP_MBMPREG(CHID1(krepDefault), "shared\bmp\map\exit.bmp", kxpregMapExit, kypregMapExit ) ADOPT_MBMP(LAST_MBMP, CHID1(krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID1(krepMouseDnOff)) REP_MBMPREG(CHID1(krepMouseDnOn), "shared\bmp\map\exits.bmp", kxpregMapExit, kypregMapExit ) REP_WAVE( CHID1(krepClicked), "shared\sound\map\mapexit.wav" ) CLICK_SCRIPT( "map - exit clicked" ) ENABLEACCEL(fFalse); DestroyGob( kgobMapMain ); QUITAPP(); ENDCHUNK // -------------------------------------------------------------------------------- // balloon for "You are Here" object. Ignores the mouse. // -------------------------------------------------------------------------------- OBJECTTY( "Map - You are here", kgobMapHere, 555, kcrsArrow1, gokkNoHit ) REP_TILE( CHID1( krepDefault), "you are here Mask", "shared\bmp\map\here.bmp", 6, 22 ) TILEDEF( 30,8,32,70,4,0,0,0,6 ) TILEDEF( 13,1,22,4,2,0,0,0,4 ) ENDCHUNK CREATE_SCRIPT( "you are here create") // If we're in the studio, put the YAH sign in the room in the building // where we will end up if we leave the studio. If (::fInStudio); plc = GetProp(kpridBuildingGob); Else; plc = GET_CURRENTPLACE(); End; // get x.y to position ourselves appropriately when created x= Match( plc, -1, // -1 = invalid kgobTicket1, kxpMapYAHTicket, kgobTicket2, kxpMapYAHTicket, kgobLobby1, kxpMapYAHLobby, kgobLobby2, kxpMapYAHLobby, kgobSnackBar, kxpMapYAHLobby, kgobWaiting, kxpMapYAHLobby, kgobTheatre1, kxpMapYAHTheatre, kgobTheatre2, kxpMapYAHTheatre, kgobTheatre3, kxpMapYAHTheatre, kgobTheatre4, kxpMapYAHTheatre, kgobBackstage1, kxpMapYAHBackstage, kgobBackstage2, kxpMapYAHBackstage, kgobInspiration1, kxpMapYAHIdeas, kgobInspiration2, kxpMapYAHIdeas, kgobInspiration3, kxpMapYAHIdeas, kgobInspiration4, kxpMapYAHIdeas, kgobStudio1, kxpMapYAHStudio, kgobStudio2, kxpMapYAHStudio, kgobStudio3, kxpMapYAHStudio, kgobStudio4, kxpMapYAHStudio, kgobProjects1, kxpMapYAHProjects, kgobProjects2, kxpMapYAHProjects, kgobProjects3, kxpMapYAHProjects, kgobProjects4, kxpMapYAHProjects ); y= Match( plc, -1, // -1 = invalid kgobTicket1, kypMapYAHTicket, kgobTicket2, kypMapYAHTicket, kgobLobby1, kypMapYAHLobby, kgobLobby2, kypMapYAHLobby, kgobSnackBar, kypMapYAHLobby, kgobWaiting, kypMapYAHLobby, kgobTheatre1, kypMapYAHTheatre, kgobTheatre2, kypMapYAHTheatre, kgobTheatre3, kypMapYAHTheatre, kgobTheatre4, kypMapYAHTheatre, kgobBackstage1, kypMapYAHBackstage, kgobBackstage2, kypMapYAHBackstage, kgobInspiration1, kypMapYAHIdeas, kgobInspiration2, kypMapYAHIdeas, kgobInspiration3, kypMapYAHIdeas, kgobInspiration4, kypMapYAHIdeas, kgobStudio1, kypMapYAHStudio, kgobStudio2, kypMapYAHStudio, kgobStudio3, kypMapYAHStudio, kgobStudio4, kypMapYAHStudio, kgobProjects1, kypMapYAHProjects, kgobProjects2, kypMapYAHProjects, kgobProjects3, kypMapYAHProjects, kgobProjects4, kypMapYAHProjects ); ASSERT(x != -1 && y != -1); MoveAbsThis( x, y ); ENDCHUNK // -------------------------------------------------------------------------------- OBJECT( "map - inspiration Mask", kgobMapIdeaMask, 60, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "shared\bmp\map\ideamsk.bmp", 0, 0 ) CLICK_SCRIPT( "inspiration Mask clicked" ) RunScriptGob(kgobMapMain, kchidScript1, kgobInspiration1, MAPENTRY(kgobInspiration1), fFalse); ENDCHUNK // -------------------------------------------------------------------------------- OBJECT( "map - studio Mask", kgobMapStudioMask, 60, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "shared\bmp\map\studmsk.bmp", 0, 0 ) CLICK_SCRIPT( "studio Mask clicked" ) RunScriptGob(kgobMapMain, kchidScript1, kgobStudio1, MAPENTRY(kgobStudio1), fFalse); ENDCHUNK // -------------------------------------------------------------------------------- OBJECT( "map - projects Mask", kgobMapProjMask, 60, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "shared\bmp\map\projmsk.bmp", 0, 0 ) CLICK_SCRIPT( "Mask clicked" ) RunScriptGob(kgobMapMain, kchidScript1, kgobProjects1, MAPENTRY(kgobProjects1), fFalse); ENDCHUNK // -------------------------------------------------------------------------------- OBJECT( "map - backstage Mask", kgobMapBackMask, 60, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "shared\bmp\map\bkstgmsk.bmp", 0, 0 ) CLICK_SCRIPT( "Mask clicked" ) RunScriptGob(kgobMapMain, kchidScript1, kgobBackstage1, MAPENTRY(kgobBackstage1), fFalse); ENDCHUNK // -------------------------------------------------------------------------------- OBJECT( "map - theater Mask", kgobMapTheatreMask, 60, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "shared\bmp\map\theatmsk.bmp", 0, 0 ) CLICK_SCRIPT( "Mask clicked" ) RunScriptGob(kgobMapMain, kchidScript1, kgobTheatre1, MAPENTRY(kgobTheatre1), fFalse); ENDCHUNK // -------------------------------------------------------------------------------- OBJECT( "map - lobby Mask", kgobMapLobbyMask, 60, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "shared\bmp\map\LOBBYMSK.BMP", 0, 0 ) CLICK_SCRIPT("Mask clicked") RunScriptGob(kgobMapMain, kchidScript1, kgobLobby1, MAPENTRY(kgobLobby1), fFalse); ENDCHUNK // -------------------------------------------------------------------------------- OBJECT( "map - ticketbooth Mask", kgobMapTicketMask, 60, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "shared\bmp\map\TICKTMSK.BMP", 0, 0 ) CLICK_SCRIPT( "Mask clicked" ) RunScriptGob(kgobMapMain, kchidScript1, kgobTicket2, MAPENTRY(kgobTicket2), fFalse); ENDCHUNK // -------------------------------------------------------------------------------- OBJECT( "map - bio book Mask", kgobMapBioMask, 60, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "shared\bmp\map\biomsk.bmp", 0, 0 ) CLICK_SCRIPT( "Mask clicked" ) RunScriptGob( kgobMapMain, kchidScript1, kgobInspiration1, kst8 , fFalse ); ENDCHUNK // -------------------------------------------------------------------------------- OBJECT( "map - idea room - splot machine", kgobMapSplotMask, 60, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "shared\bmp\map\SPLOTMSK.BMP", 0, 0 ) CLICK_SCRIPT( "Mask clicked" ) RunScriptGob( kgobMapMain, kchidScript1, kgobInspiration1, kst7 , fFalse ); ENDCHUNK // -------------------------------------------------------------------------------- OBJECT( "map - tools Mask", kgobMapToolsMask, 60, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "shared\bmp\map\TBOXMSK.BMP", 0, 0 ) CLICK_SCRIPT( "Mask clicked" ) RunScriptGob(kgobMapMain, kchidScript1, kgobStudio1, kst2, fTrue); ENDCHUNK // -------------------------------------------------------------------------------- OBJECT( "map - project 1 Mask - logo", kgobMapLogoMask, 60, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "shared\bmp\map\LOGOMSK.BMP", 0, 0 ) CLICK_SCRIPT( "Mask clicked" ) RunScriptGob( kgobMapMain, kchidScript1, kgobProjects1, kst4 , fFalse ); ENDCHUNK // -------------------------------------------------------------------------------- OBJECT( "map - project 2 Mask", kgobMapSnippetMask, 60, kcrsHand1 ) REP_MASK( CHID1( krepDefault ), "shared\bmp\map\GIZMOMSK.BMP", 0, 0 ) CLICK_SCRIPT( "Mask clicked" ) RunScriptGob( kgobMapMain, kchidScript1, kgobProjects1, kst5 , fFalse ); ENDCHUNK // -------------------------------------------------------------------------------- // The thumbnail is the graphic indicator of volume level... // positioned within the slide path - not hittable // -------------------------------------------------------------------------------- OBJECTTY( "map - volume slider", kgobMapVolumeSlider, 60, kcrsArrow1, kgokkRectNoHit ) REP_MBMP( CHID1( krepDefault ), "shared\bmp\map\volthmb.bmp" ) // -------------------------------------------------------------------------------- // The slider is the rectangular path the volume slider rolls around in. // kdypMapSlider is the height of the slidable area; kdypMapSliderTotal includes // height of thumbnail to be sure it will show at the min setting // -------------------------------------------------------------------------------- OBJECTREG( "map - volume slidepath", kgobVolumePath, kxpMapSlider, kypMapSlider, 500, kcrsHand1 ) REP_RECT( CHID1( krepDefault), "map rectangle", 0, 0, kdxpMapSlider, kdypMapSliderTotal ) CREATE_SCRIPT( "create slidepath") CreateChildThis( kgobMapVolumeSlider, kgobMapVolumeSlider ); // get initial volume value, move thumbnail y = kdypMapSlider -(( GetMasterVolume() * kdypMapSlider )/ (kvlmFull*2)); MoveAbsGob( kgobMapVolumeSlider, 0, y ); ENDCHUNK REP_ANIM( CHID1( krepMouseDnOn), "slider") // repeat up to 30000 times. .siiLoop = PlaySoundThis(kctgWave, kwavDing, 2, 0x00010000, 30000, 1, ksclBldgSound); While( 1 ); y = YMouseThis(); If( y < 0 ); y=0; Elif( y > kdypMapSlider ); y =kdypMapSlider; End; // move thumb slider MoveAbsGob( kgobMapVolumeSlider, 0, y ); // track new volume newvol = ( (kvlmFull*2)* (kdypMapSlider-y) ) / kdypMapSlider; // set the volume SetMasterVolume( newvol ); // Sample at 10/60ths of a second. Cell( 0 , 0,0, 10 ); End; ENDCHUNK REP_ANIM( CHID1( kchidDownUpOn ), "release on" ) StopSound( .siiLoop ); ENDCHUNK ADOPT_ANIM( LAST_ANIM, CHID1( kchidDownUpOff )) ================================================ FILE: src/shared/portbmp.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // This is the source file for portbmp.chk. Contain the bitmap related to the portfolio. // "Portfolio open background") MBMPCHUNK ("studio\bmp\portfolo.bmp", kcnoMbmpPortBackOpen, 0,0,0 ) // "Portfolio save background") MBMPCHUNK ("studio\bmp\portfols.bmp", kcnoMbmpPortBackSave, 0,0,0 ) // "Portfolio ok button background") MBMPCHUNK ("studio\bmp\portok.bmp", kcnoMbmpPortBtnOk, 0,0,0 ) // "Portfolio ok button selected background") MBMPCHUNK ("studio\bmp\portokc.bmp", kcnoMbmpPortBtnOkSel, 0,0,0 ) // "Portfolio cancel button background") MBMPCHUNK ("studio\bmp\portcan.bmp", kcnoMbmpPortBtnCancel, 0,0,0 ) // "Portfolio cancel button selected background") MBMPCHUNK ("studio\bmp\portcanc.bmp", kcnoMbmpPortBtnCancelSel, 0,0,0 ) // "Portfolio home button background") MBMPCHUNK ("studio\bmp\porthm.bmp", kcnoMbmpPortBtnHome, 0,0,0 ) // "Portfolio home button selected background") MBMPCHUNK ("studio\bmp\porthmc.bmp", kcnoMbmpPortBtnHomeSel, 0,0,0 ) WAVE_CHUNK( "shared\sound\util\vzh1016.wav", kwavPortSaveMovie) WAVE_CHUNK( "shared\sound\util\vzh1017.wav", kwavPortOpenMovie) WAVE_CHUNK( "shared\sound\util\vzh1018.wav", kwavPortOpenSound) ================================================ FILE: src/shared/sharecd.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /***************************************************************************** * * SHARECD.CHT * * Copyright (C) Microsoft Corporation 1995. * All Rights reserved. * ****************************************************************************** * * Module Intent * * Contains objects shared between Socrates Building and Studio chunks; e.g., * Map. These are kept on the CD instead of the hard drive * ****************************************************************************** * * Revision History: Created 09/06/95 by *****. * * *****************************************************************************/ // Include and initialized chunky macros. #define PACKALL #include "kidgs.chh" STARTCHUNKY // IDs #include "stdiodef.h" #include "buildgob.h" #include "sharedef.h" #include "balloons.chh" #include "helpbook.h" #include "projmain.h" // Include shared object scripts. #include "biopage.chh" // graphics for the bio page actors (excluding the page itself ) // --------------------------------------------------------------- // representations follow - set by creator OBJECT( "Bio Actors shot", kgobBioActors, 1, kcrsArrow1 ) REP_PPMBMP( kcell1, "shared\pbm\page01.pbm" ) REP_PPMBMP( kcell2, "shared\pbm\page02.pbm" ) REP_PPMBMP( kcell3, "shared\pbm\page03.pbm" ) REP_PPMBMP( kcell4, "shared\pbm\page04.pbm" ) REP_PPMBMP( kcell5, "shared\pbm\page05.pbm" ) REP_PPMBMP( kcell6, "shared\pbm\page06.pbm" ) REP_PPMBMP( kcell7, "shared\pbm\page07.pbm" ) REP_PPMBMP( kcell8, "shared\pbm\page08.pbm" ) REP_PPMBMP( kcell9, "shared\pbm\page09.pbm" ) REP_PPMBMP( kcell10,"shared\pbm\page10.pbm" ) REP_PPMBMP( kcell11, "shared\pbm\page11.pbm" ) REP_PPMBMP( kcell12, "shared\pbm\page12.pbm" ) REP_PPMBMP( kcell13, "shared\pbm\page13.pbm" ) REP_PPMBMP( kcell14, "shared\pbm\page14.pbm" ) REP_PPMBMP( kcell15, "shared\pbm\page15.pbm" ) REP_PPMBMP( kcell16, "shared\pbm\page16.pbm" ) REP_PPMBMP( kcell17, "shared\pbm\page17.pbm" ) REP_PPMBMP( kcell18, "shared\pbm\page18.pbm" ) REP_PPMBMP( kcell19, "shared\pbm\page19.pbm" ) REP_PPMBMP( kcell20, "shared\pbm\page20.pbm" ) REP_PPMBMP( kcell21, "shared\pbm\page21.pbm" ) REP_PPMBMP( kcell22, "shared\pbm\page22.pbm" ) REP_PPMBMP( kcell23, "shared\pbm\page23.pbm" ) REP_PPMBMP( kcell24, "shared\pbm\page24.pbm" ) REP_PPMBMP( kcell25, "shared\pbm\page25.pbm" ) REP_PPMBMP( kcell26, "shared\pbm\page26.pbm" ) REP_PPMBMP( kcell27, "shared\pbm\page27.pbm" ) REP_PPMBMP( kcell28, "shared\pbm\page28.pbm" ) REP_PPMBMP( kcell29, "shared\pbm\page29.pbm" ) REP_PPMBMP( kcell30, "shared\pbm\page30.pbm" ) REP_PPMBMP( kcell31, "shared\pbm\page31.pbm" ) REP_PPMBMP( kcell32, "shared\pbm\page32.pbm" ) REP_PPMBMP( kcell33, "shared\pbm\page33.pbm" ) REP_PPMBMP( kcell34, "shared\pbm\page34.pbm" ) REP_PPMBMP( kcell35, "shared\pbm\page35.pbm" ) REP_PPMBMP( kcell36, "shared\pbm\page36.pbm" ) REP_PPMBMP( kcell37, "shared\pbm\page37.pbm" ) REP_PPMBMP( kcell38, "shared\pbm\page38.pbm" ) REP_PPMBMP( kcell39, "shared\pbm\page39.pbm" ) REP_PPMBMP( kcell40, "shared\pbm\page40.pbm" ) REP_PPMBMP( kcell41, "shared\pbm\page41.pbm" ) ================================================ FILE: src/shared/shared.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /***************************************************************************** * * SHARED.CHT * * Copyright (C) Microsoft Corporation 1995. * All Rights reserved. * ****************************************************************************** * * Module Intent * * Contains objects shared between Socrates Building and Studio chunks; e.g., * Map. * ****************************************************************************** * * Revision History: Created 06/26/95 by *****. * * 06/27/95 ***** Added Map and shared cursors. * *****************************************************************************/ // Include and initialized chunky macros. #define PACKALL #include "kidgs.chh" STARTCHUNKY // IDs #include "stdiodef.h" #include "buildgob.h" #include "sharedef.h" #include "balloons.chh" #include "helpbook.h" #include "projmain.h" // Include shared object scripts. #include "biopage.chh" #include "sharutil.chh" #include "util.cht" #include "cursors.cht" #include "map.cht" // Get the help topics that describe the actors from here -- for now only // REVIEW: Need a way to integrate these into HELP.CHK? The only ugly thing // is that the building will have to load help from the studio and vice versa. #include "sharhelp.cht" #include "biopage.cht" #include "portbmp.cht" ================================================ FILE: src/shared/sharhelp.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // // Main build chunky text file for the Socrates Shared Help // Main build chunky text file for the Socrates Studio Help // // Sean Selitrennikoff // ******* // // ----------------------------------------------------- // Help objects for Errors // ----------------------------------------------------- // ----------------------------------------------------- // Utest errors balloon // ----------------------------------------------------- GOBCHUNK("Utest Error", kgobBalloonError, kgokkNormal) DEFAULT_POSITION(0,0,700) ENDCHUNK REP_TILE( CHID1( krepDefault), "Tool page tile", "shared\bmp\alert.bmp", 115, 72 ) TILEDEF( 14,14,24,183,8,0,0,0,24 ) TILEDEF( 14,14,24,95,8,0,0,0,24 ) ENDCHUNK REP_WAVE( CHID1( krepDefault ), "shared\sound\alert2.wav" ) // scripts to run SCRIPTCHUNK("Handling error messages", ktpcErrorScript) If(_parm[0] != 0); EnqueueCid(cidEndModal, 0, _parm[0], 0, 0, 0); End; ENDCHUNK // ------------------------------------------------------- // Query CD not found // ------------------------------------------------------- HELP_SCRIPT(ktpcQueryCD) // If _parm[0] != 0 then a button has been pushed. If(_parm[0] != 0); EnqueueCid(cidEndModal, 0, _parm[0], 0, 0, 0); End; ENDCHUNK // ----------------------------------------------------- // Help objects(Balloons) // ----------------------------------------------------- // ----------------------------------------------------- // normal help balloon (mid right speech dippty) // ----------------------------------------------------- GOBCHUNK( "help balloon #1", kgobBalloon1, 0) DEFAULT_POSITION( 40,40,500 ) ENDCHUNK REP_TILE( CHID1( krepDefault), "help balloon 1 tile", "shared\bmp\balln1b.bmp", 93, 29 ) TILEDEF( 7, 24, 7, 64, 8, 0,0,0,22 ) TILEDEF( 7, 8, 7, 22, 8, 17, 8, 8, 8 ) ENDCHUNK // ----------------------------------------------------- // Tooltip balloon // ----------------------------------------------------- GOBCHUNK( "tooltip balloon", kgobBalloonToolTip, 0) DEFAULT_POSITION( 0,0,500 ) ACTION(fcustHotText, fcustHotText, fgrfstAll, kcrsHand1, chidNil, cidNil, cnoNil) ENDCHUNK REP_TILE( CHID1( krepDefault), "Tool tip tile", "shared\bmp\tooltip.bmp", 0, 0 ) TILEDEF( 4,4,4, 160,8, 0, 0, 0, 4 ) TILEDEF( 3,3,3,50,8,0,0,0,3 ) ENDCHUNK // ----------------------------------------------------- // Tooltip balloon, with reg point at bottom right // ----------------------------------------------------- GOBCHUNK( "tooltip balloon", kgobBalloonToolTip2, 0) DEFAULT_POSITION( 0,0,500 ) ACTION(fcustHotText, fcustHotText, fgrfstAll, kcrsHand1, chidNil, cidNil, cnoNil) ENDCHUNK REP_TILE( CHID1( krepDefault), "Tool tip tile", "shared\bmp\tooltip.bmp", 168, 56 ) TILEDEF( 4,4,4, 160,8, 0, 0, 0, 4 ) TILEDEF( 3,3,3,50,8,0,0,0,3 ) ENDCHUNK // ----------------------------------------------------- // Callout balloon Invisible for audio only // ----------------------------------------------------- GOBCHUNK("Audio Only balloon", kgobBalloonToolTipAO, gokkNoHit) DEFAULT_POSITION( 0,0,500 ) ENDCHUNK REP_FILL(CHID1(krepDefault), "Callout BalloonAO", 0, 0, 1, 1, Transparent, Transparent) PATTERN_0 ENDCHUNK // ----------------------------------------------------- // Tool topic balloon // ----------------------------------------------------- GOBCHUNK( "tool topic", kgobBalloonToolTopic, 0) DEFAULT_POSITION( 40,40,500 ) ACTION(fcustHotText, fcustHotText, fgrfstAll, kcrsHand1, chidNil, cidNil, cnoNil) ENDCHUNK REP_TILE( CHID1( krepDefault), "Tool page tile", "shared\bmp\toolhelp.bmp", 231, 143 ) TILEDEF( 14,14,24,183,8,0,0,0,24 ) TILEDEF( 14,14,24,95,8,0,0,0,24 ) ENDCHUNK // ----------------------------------------------------- // Query help balloon // ----------------------------------------------------- GOBCHUNK("Query help topic", kgobQueryTopics, kgokkNormal) DEFAULT_POSITION(100,100,700) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, kchidClick, cidNil, cnoNil) ENDCHUNK REP_TILE( CHID1( krepDefault), "Tool page tile", "shared\bmp\alert.bmp", 120, 72 ) TILEDEF( 14,14,24,191,8,0,0,0,24 ) TILEDEF( 14,14,24,95,8,0,0,0,24 ) ENDCHUNK // ----------------------------------------------------- // Label balloon, -- no hit testing // ----------------------------------------------------- GOBCHUNK( "blank label balloon", kgobBalloonLabel, gokkNoHit ) DEFAULT_POSITION( 0,0,899 ) ENDCHUNK REP_FILL(CHID1(krepDefault), "kgobBalloonLabel", 0, 0, 1, 1, Transparent, Transparent) PATTERN_0 ENDCHUNK // ----------------------------------------------------- // Help Book left page balloon -- no hit testing // ----------------------------------------------------- GOBCHUNK( "blank label balloon", kgobBalloonPageLeft, kgokkNormal ) DEFAULT_POSITION( 0,0,899 ) ACTION(fcustHotText, fcustHotText, fgrfstAll, kcrsHand1, chidNil, cidNil, cnoNil) ENDCHUNK REP_TILE( CHID1( krepDefault), "Invisible", "shared\bmp\balln3.bmp", 1, 1) TILEDEF( 0, 0, 0, 32, 1, 0, 0, 0,0 ) TILEDEF( 0, 0, 0, 32, 1, 0, 0, 0,0 ) ENDCHUNK // ----------------------------------------------------- // Help Book right page balloon -- no hit testing // ----------------------------------------------------- GOBCHUNK( "blank label balloon", kgobBalloonPageRight, kgokkNormal ) DEFAULT_POSITION( 0,0,899 ) ACTION(fcustHotText, fcustHotText, fgrfstAll, kcrsHand1, chidNil, cidNil, cnoNil) ENDCHUNK REP_TILE( CHID1( krepDefault), "Invisible", "shared\bmp\balln3.bmp", 1, 1) TILEDEF( 0, 0, 0, 32, 1, 0, 0, 0,0 ) TILEDEF( 0, 0, 0, 32, 1, 0, 0, 0,0 ) ENDCHUNK // ----------------------------------------------------- // transparent rectangular balloon, that allows hit testing // ----------------------------------------------------- GOBCHUNK( "blank, invisible balloon", kgobBalloonBlank, kgokkNormal ) DEFAULT_POSITION( 0,0,899 ) ACTION(fcustHotText, fcustHotText, fgrfstAll, kcrsHand1, chidNil, cidNil, cnoNil) ENDCHUNK REP_TILE( CHID1( krepDefault), "Invisible", "shared\bmp\balln3.bmp", 1, 1) TILEDEF( 0, 0, 0, 32, 1, 0, 0, 0,0 ) TILEDEF( 0, 0, 0, 32, 1, 0, 0, 0,0 ) ENDCHUNK // ----------------------------------------------------- // Centered,rectangular alert help balloon // ----------------------------------------------------- GOBCHUNK( "alert help", kgobBalloonAlert, 0) DEFAULT_POSITION( 0, 0,999 ) ENDCHUNK REP_TILE( CHID1( krepDefault), "alert tile", "shared\bmp\balln2.bmp", 40, 29 ) TILEDEF( 7, 24, 7, 64, 8, 0,0,0, 22 ) TILEDEF( 3, 8, 7, 20, 8, 17, 8, 8, 8 ) ENDCHUNK // ----------------------------------------------------- // Close caption balloon // ----------------------------------------------------- GOBCHUNK( "voice over balloon", kgobVoiceOver, gokkNoHit ) DEFAULT_POSITION( 0, 0,999 ) ENDCHUNK REP_TILE( CHID1( krepDefault), "alert tile", "shared\bmp\vo.bmp", 40, 29 ) TILEDEF( 7, 24, 7, 64, 8, 0,0,0, 22 ) TILEDEF( 3, 8, 7, 20, 8, 17, 8, 8, 8 ) ENDCHUNK // ----------------------------------------------------- // Top left arrowed bordered balloon // ----------------------------------------------------- GOBCHUNK( "alert help", kgobBalloonBorder1, 0) DEFAULT_POSITION( 0,0,999 ) ENDCHUNK REP_TILE( CHID1( krepDefault), "Bordered tile", "shared\bmp\border1.bmp", 30, 5 ) TILEDEF( 11, 20, 31, 40, 1, 0,0,0, 8 ) TILEDEF( 25, 8, 25, 32, 1, 0,0,0, 8 ) ENDCHUNK // ----------------------------------------------------- // Help book tool help balloon, does filtering // ----------------------------------------------------- GOBCHUNK("Tool help", kgobHelpBookToolTopics, kgokkNormal) DEFAULT_POSITION(100,100,700) ACTION(fcustHotText, fcustHotText, fgrfstAll, kcrsHand1, chidNil, cidNil, cnoNil) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, CHID1(kchidClick), cidNil, cnoNil) ENDCHUNK REP_TILE( CHID1( krepDefault), "Tool page tile", "shared\bmp\tooltip.bmp", 168, 56 ) TILEDEF( 4,4,4, 160,8, 0, 0, 0, 4 ) TILEDEF( 3,3,3,50,8,0,0,0,3 ) ENDCHUNK // filtering messages CREATE_ANIM("Filtering messages for help tools balloon") // get all mouse downs, keys or the F1 hotkey FilterCmdsThis(cidMouseDown, kidNil, kchidScript1); FilterCmdsThis(cidKey, kidNil, kchidScript1); // F1 key fixes bug # 678 FilterCmdsThis(cidHelpBook, kidNil, kchidScript1); FilterCmdsThis(cidToggleXY, kidNil, kchidScript1); ENDCHUNK // Handle mouse clicks CHILD_SCRIPT("Got a click or keydown", kchidScript1) If (!FIsDescendent(_parm[0], GidThis())); DestroyThis(); End; ENDCHUNK CLICK_SCRIPT("Tool help balloon got clicked") DestroyThis(); ENDCHUNK // ----------------------------------------------------- // balloon that comes up from clicks in hotspots of tool help // ----------------------------------------------------- GOBCHUNK("Hot help for tools", kgobBalloonHotHelp, kgokkNormal) DEFAULT_POSITION(100,100,700) ACTION(fcustHotText, fcustHotText, fgrfstAll, kcrsHand1, chidNil, cidNil, cnoNil) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, kchidScript1, cidNil, cnoNil) ENDCHUNK REP_TILE( CHID1( krepDefault), "Tool page tile", "shared\bmp\tooltip.bmp", 84, 28 ) TILEDEF( 4,4,4, 160,8, 0, 0, 0, 4 ) TILEDEF( 3,3,3,50,8,0,0,0,3 ) ENDCHUNK // filtering messages CREATE_ANIM("Filtering messages for help tools balloons") // get all mouse downs FilterCmdsThis(cidMouseDown, kidNil, kchidScript1); FilterCmdsThis(cidKey, kidNil, kchidScript1); ENDCHUNK // Handle mouse clicks CHILD_SCRIPT("Got a click or keydown", kchidScript1) DestroyThis(); ENDCHUNK // ----------------------------------------------------- // balloon that comes up from clicks in hotspots of gadget help // ----------------------------------------------------- GOBCHUNK("Hot help for projects", kgobBalloonHotGadgetHelp, kgokkNormal) DEFAULT_POSITION(100,100,700) ACTION(fcustHotText, fcustHotText, fgrfstAll, kcrsHand1, chidNil, cidNil, cnoNil) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, kchidScript1, cidNil, cnoNil) ENDCHUNK REP_TILE( CHID1( krepDefault), "Tool page tile", "shared\bmp\tooltip.bmp", 84, 28 ) TILEDEF( 4,4,4, 160,8, 0, 0, 0, 4 ) TILEDEF( 3,3,3,50,8,0,0,0,3 ) ENDCHUNK // filtering messages CREATE_ANIM("Filtering messages for project hot balloons") // get all mouse downs FilterCmdsThis(cidMouseDown, kidNil, kchidScript1); FilterCmdsThis(cidKey, kidNil, kchidScript1); // F1 key fixes bug # 678 FilterCmdsThis(cidHelpBook, kidNil, kchidScript1); FilterCmdsThis(cidToggleXY, kidNil, kchidScript1); ENDCHUNK // Handle mouse clicks CHILD_SCRIPT("Got a click or keydown", kchidScript1) DestroyThis(); ENDCHUNK // ----------------------------------------------------- // Callout balloon crinkly style // ----------------------------------------------------- GOBCHUNK( "Callout Balloon0", kgobCalloutBalloon0, kgokkNormal) DEFAULT_POSITION(0, 0, 500 ) ACTION(fcustHotText, fcustHotText, fgrfstAll, kcrsHand1, chidNil, cidNil, cnoNil) ENDCHUNK REP_TILE(CHID1(krepDefault), "Callout Balloon0 Tile", "shared\bmp\coblln0.bmp", 83, 61 ) TILEDEF( 5, 5, 8, 151, 8, 0, 0,0, 8 ) TILEDEF( 4, 4, 8, 106, 8, 0, 0, 0,8 ) ENDCHUNK // ----------------------------------------------------- // Callout balloon arrow to upper left // ----------------------------------------------------- GOBCHUNK( "Callout Balloon1", kgobCalloutBalloon1, kgokkNormal) DEFAULT_POSITION(0, 0, 500 ) ACTION(fcustHotText, fcustHotText, fgrfstAll, kcrsHand1, chidNil, cidNil, cnoNil) ENDCHUNK REP_TILE(CHID1(krepDefault), "Callout Balloon1 Tile", "shared\bmp\coblln1.bmp", 1, 1) TILEDEF( 29, 8, 36, 146, 8, 0, 0, 0,8 ) TILEDEF( 28, 8, 32, 103, 8, 0, 0, 0,8 ) ENDCHUNK // ----------------------------------------------------- // Callout balloon arrow to upper mid // ----------------------------------------------------- GOBCHUNK( "Callout Balloon2", kgobCalloutBalloon2, kgokkNormal) DEFAULT_POSITION(0, 0, 500 ) ACTION(fcustHotText, fcustHotText, fgrfstAll, kcrsHand1, chidNil, cidNil, cnoNil) ENDCHUNK REP_TILE(CHID1(krepDefault), "Callout Balloon2 Tile", "shared\bmp\coblln2.bmp", 83, 1) TILEDEF( 4, 8, 8, 58, 8, 35, 60, 8,8 ) TILEDEF( 41, 8, 42, 108, 8, 0, 0, 0,8 ) ENDCHUNK // ----------------------------------------------------- // Callout balloon arrow to upper right // ----------------------------------------------------- GOBCHUNK( "Callout Balloon3", kgobCalloutBalloon3, kgokkNormal) DEFAULT_POSITION(0, 0, 500 ) ACTION(fcustHotText, fcustHotText, fgrfstAll, kcrsHand1, chidNil, cidNil, cnoNil) ENDCHUNK REP_TILE(CHID1(krepDefault), "Callout Balloon3 Tile", "shared\bmp\coblln3.bmp", 189, 2 ) TILEDEF( 4, 32, 8, 147, 8, 0, 0, 0, 36 ) TILEDEF( 30, 8, 34, 103, 4, 0, 0, 0, 8 ) ENDCHUNK // ----------------------------------------------------- // Callout balloon arrow to right // ----------------------------------------------------- GOBCHUNK( "Callout Balloon4", kgobCalloutBalloon4, kgokkNormal) DEFAULT_POSITION(0, 0, 500 ) ACTION(fcustHotText, fcustHotText, fgrfstAll, kcrsHand1, chidNil, cidNil, cnoNil) ENDCHUNK REP_TILE(CHID1(krepDefault), "Callout Balloon4 Tile", "shared\bmp\coblln4.bmp", 201, 65) TILEDEF( 4, 46, 8, 148, 8, 0, 0, 0, 48 ) TILEDEF( 3, 8, 8, 40, 4, 34, 40, 4, 8 ) ENDCHUNK // ----------------------------------------------------- // Callout balloon arrow to lower right // ----------------------------------------------------- GOBCHUNK( "Callout Balloon5", kgobCalloutBalloon5, kgokkNormal) DEFAULT_POSITION(0, 0, 500 ) ACTION(fcustHotText, fcustHotText, fgrfstAll, kcrsHand1, chidNil, cidNil, cnoNil) ENDCHUNK REP_TILE(CHID1(krepDefault), "Callout Balloon5 Tile", "shared\bmp\coblln5.bmp", 189, 143 ) TILEDEF( 4, 32, 8, 148, 8, 0, 0, 0, 36 ) TILEDEF( 3, 32, 8, 102, 8, 0, 0, 0, 36 ) ENDCHUNK // ----------------------------------------------------- // Callout balloon arrow to lower mid // ----------------------------------------------------- GOBCHUNK( "Callout Balloon6", kgobCalloutBalloon6, kgokkNormal) DEFAULT_POSITION(0, 0, 500 ) ACTION(fcustHotText, fcustHotText, fgrfstAll, kcrsHand1, chidNil, cidNil, cnoNil) ENDCHUNK REP_TILE(CHID1(krepDefault), "Callout Balloon6 Tile", "shared\bmp\coblln6.bmp", 83, 155 ) TILEDEF( 4, 8, 8, 60, 8, 33, 60, 8, 8 ) TILEDEF( 3, 38, 8, 105, 8, 0, 0, 0, 44 ) ENDCHUNK // ----------------------------------------------------- // Callout balloon arrow to lower left // ----------------------------------------------------- GOBCHUNK( "Callout Balloon7", kgobCalloutBalloon7, kgokkNormal) DEFAULT_POSITION(0, 0, 500 ) ACTION(fcustHotText, fcustHotText, fgrfstAll, kcrsHand1, chidNil, cidNil, cnoNil) ENDCHUNK REP_TILE(CHID1(krepDefault), "Callout Balloon7 Tile", "shared\bmp\coblln7.bmp", 0, 147 ) TILEDEF( 30, 8, 34, 149, 8, 0, 0, 0, 8 ) TILEDEF( 3, 28, 8, 101, 8, 0, 0, 0, 38 ) ENDCHUNK // ----------------------------------------------------- // Callout balloon arrow to left // ----------------------------------------------------- GOBCHUNK( "Callout Balloon8", kgobCalloutBalloon8, kgokkNormal) DEFAULT_POSITION(0, 0, 500 ) ACTION(fcustHotText, fcustHotText, fgrfstAll, kcrsHand1, chidNil, cidNil, cnoNil) ENDCHUNK REP_TILE(CHID1(krepDefault), "Callout Balloon8 Tile", "shared\bmp\coblln8.bmp", 0, 66) TILEDEF( 32, 8, 42, 150, 8, 0, 0, 0, 8 ) TILEDEF( 3,8, 8, 40, 4, 34, 32, 4, 8 ) ENDCHUNK // ----------------------------------------------------- // Callout balloon plain // ----------------------------------------------------- GOBCHUNK( "Callout BalloonP", kgobCalloutBalloonP, kgokkNormal) DEFAULT_POSITION(0, 0, 500 ) ACTION(fcustHotText, fcustHotText, fgrfstAll, kcrsHand1, chidNil, cidNil, cnoNil) ENDCHUNK REP_TILE(CHID1(krepDefault), "Callout Balloon0 Tile", "shared\bmp\coblln0.bmp", 83, 61 ) TILEDEF( 5, 5, 8, 151, 8, 0, 0,0, 8 ) TILEDEF( 4, 4, 8, 106, 8, 0, 0, 0,8 ) ENDCHUNK // ----------------------------------------------------- // Callout balloon Invisible for audio only // ----------------------------------------------------- GOBCHUNK("Audio Only balloon", kgobCalloutBalloonAO, gokkNoHit) DEFAULT_POSITION( 0,0,500 ) ENDCHUNK REP_FILL(CHID1(krepDefault), "Callout BalloonAO", 0, 0, 1, 1, Transparent, Transparent) PATTERN_0 ENDCHUNK // ----------------------------------------------------- // Callout balloon arrow to upper mid for easel help // ----------------------------------------------------- GOBCHUNK( "Easel Callout Balloon2", kgobEaselBalloon2, kgokkNormal) DEFAULT_POSITION(0, 0, 700 ) ACTION(fcustHotText, fcustHotText, fgrfstAll, kcrsHand1, chidNil, cidNil, cnoNil) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, CHID1(kchidClick), cidNil, cnoNil) ENDCHUNK REP_TILE(CHID1(krepDefault), "Callout Balloon2 Easel Tile", "shared\bmp\coblln2.bmp", 83, 1) TILEDEF( 4, 8, 8, 58, 8, 35, 60, 8,8 ) TILEDEF( 41, 8, 42, 108, 8, 0, 0, 0,8 ) ENDCHUNK // filtering messages CREATE_ANIM("Filtering messages for easel help balloons") // get all mouse downs FilterCmdsThis(cidMouseDown, kidNil, kchidScript1); FilterCmdsThis(cidKey, kidNil, kchidScript1); ENDCHUNK // Handle mouse clicks CHILD_SCRIPT("Got a click or keydown", kchidScript1) If (!FIsDescendent(_parm[0], GidThis())); DestroyThis(); End; ENDCHUNK CLICK_SCRIPT("Easel2 balloon got clicked") DestroyThis(); ENDCHUNK // ----------------------------------------------------- // Callout balloon arrow to right for easel help // ----------------------------------------------------- GOBCHUNK( "Easel Callout Balloon4", kgobEaselBalloon4, kgokkNormal) DEFAULT_POSITION(0, 0, 700 ) ACTION(fcustHotText, fcustHotText, fgrfstAll, kcrsHand1, chidNil, cidNil, cnoNil) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, CHID1(kchidClick), cidNil, cnoNil) ENDCHUNK REP_TILE(CHID1(krepDefault), "Callout Balloon4 Easel Tile", "shared\bmp\coblln4.bmp", 201, 65) TILEDEF( 8, 46, 8, 148, 8, 0, 0, 0, 48 ) TILEDEF( 8, 8, 8, 40, 4, 34, 40, 4, 8 ) ENDCHUNK // filtering messages CREATE_ANIM("Filtering messages for easel help balloons") // get all mouse downs FilterCmdsThis(cidMouseDown, kidNil, kchidScript1); FilterCmdsThis(cidKey, kidNil, kchidScript1); ENDCHUNK // Handle mouse clicks CHILD_SCRIPT("Got a click or keydown", kchidScript1) If (!FIsDescendent(_parm[0], GidThis())); DestroyThis(); End; ENDCHUNK CLICK_SCRIPT("Easel4 balloon got clicked") DestroyThis(); ENDCHUNK // ----------------------------------------------------- // Callout balloon no arrow easel help // ----------------------------------------------------- GOBCHUNK( "Easel Callout BalloonP", kgobEaselBalloonP, kgokkNormal) DEFAULT_POSITION(0, 0, 700 ) ACTION(fcustHotText, fcustHotText, fgrfstAll, kcrsHand1, chidNil, cidNil, cnoNil) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, CHID1(kchidClick), cidNil, cnoNil) ENDCHUNK REP_TILE(CHID1(krepDefault), "Callout Balloon0 Tile", "shared\bmp\coblln0.bmp", 83, 61 ) TILEDEF( 5, 5, 8, 151, 8, 0, 0,0, 8 ) TILEDEF( 4, 4, 8, 106, 8, 0, 0, 0,8 ) ENDCHUNK // filtering messages CREATE_ANIM("Filtering messages for easel help balloons") // get all mouse downs FilterCmdsThis(cidMouseDown, kidNil, kchidScript1); FilterCmdsThis(cidKey, kidNil, kchidScript1); ENDCHUNK // Handle mouse clicks CHILD_SCRIPT("Got a click or keydown", kchidScript1) If (!FIsDescendent(_parm[0], GidThis())); DestroyThis(); End; ENDCHUNK CLICK_SCRIPT("Easel4 balloon got clicked") DestroyThis(); ENDCHUNK // ----------------------------------------------------- // Callout balloon arrow to lower mid for easel help // ----------------------------------------------------- GOBCHUNK( "Easel Callout Balloon6", kgobEaselBalloon6, kgokkNormal) DEFAULT_POSITION(0, 0, 700 ) ACTION(fcustHotText, fcustHotText, fgrfstAll, kcrsHand1, chidNil, cidNil, cnoNil) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, CHID1(kchidClick), cidNil, cnoNil) ENDCHUNK REP_TILE(CHID1(krepDefault), "Callout Balloon6 Easel Tile", "shared\bmp\coblln6.bmp", 83, 155 ) TILEDEF( 8, 8, 8, 60, 8, 33, 60, 8, 8 ) TILEDEF( 8, 38, 8, 105, 8, 0, 0, 0, 44 ) ENDCHUNK // filtering messages CREATE_ANIM("Filtering messages for easel help balloons") // get all mouse downs FilterCmdsThis(cidMouseDown, kidNil, kchidScript1); FilterCmdsThis(cidKey, kidNil, kchidScript1); ENDCHUNK // Handle mouse clicks CHILD_SCRIPT("Got a click or keydown", kchidScript1) If (!FIsDescendent(_parm[0], GidThis())); DestroyThis(); End; ENDCHUNK CLICK_SCRIPT("Easel6 help balloon got clicked") DestroyThis(); ENDCHUNK // ----------------------------------------------------- // Scripts for playing help sounds // ----------------------------------------------------- // ----------------------------------------------------- // For playing help sounds // ----------------------------------------------------- SCRIPTCHUNK("Playing help sounds", kidPlayHelpSounds) If(_parm[0] == 0); fMZAudio = GetProp( kpridMcZeeAudio ) & kflgMcZeeAudio; If (._cnoSound != cnoNil && !fMZAudio); // not suppressing audio StopSoundClass(0, sclHelpSoundClass); PlaySoundGob(GidParThis(), ._ctgSound, ._cnoSound, ksqnNone, 0x10000, 1, 0, sclHelpSoundClass); End; End; ENDCHUNK // ----------------------------------------------------- // For playing project sounds // ----------------------------------------------------- SCRIPTCHUNK("Playing project sounds", kidPlayProjectSounds) If(_parm[0] == 0); fMelAudio = GetProp( kpridMcZeeAudio ) & kflgMelAudio; If (._cnoSound != cnoNil && !fMelAudio); StopSoundClass(0, sclHelpSoundClass); PlaySoundGob(GidParThis(), ._ctgSound, ._cnoSound, ksqnNone, 0x10000, 1, 0, sclHelpSoundClass); End; End; ENDCHUNK // ----------------------------------------------------- // For playing guidehelp sounds // ----------------------------------------------------- SCRIPTCHUNK("Playing logo sounds", kidPlayLogoSounds) If(_parm[0] == 0); fMelAudio = GetProp( kpridMcZeeAudio ) & kflgMelAudio; If (._cnoSound != cnoNil && !fMelAudio); StopSoundClass(0, sclHelpSoundClass); PlaySoundGob(GidParThis(), ._ctgSound, ._cnoSound, ksqnNone, 0x10000, 1, 0, sclHelpSoundClass); End; End; ENDCHUNK // ----------------------------------------------------- // For playing guidehelp sounds // ----------------------------------------------------- SCRIPTCHUNK("Playing guide help sounds", kidPlayGuideSounds) If(_parm[0] == 0); fMZAudio = GetProp( kpridMcZeeAudio ) & kflgMcZeeAudio; If (._cnoSound != cnoNil && !fMZAudio); StopSoundClass(0, sclHelpSoundClass); PlaySoundGob(GidParThis(), ._ctgSound, ._cnoSound, ksqnNone, 0x10000, 1, 0, sclHelpSoundClass); End; End; ENDCHUNK // ----------------------------------------------------- // For playing tooltip sounds // ----------------------------------------------------- SCRIPTCHUNK("Playing other sounds", kidPlayToolTipSounds) If(_parm[0] == 0); fMZAudio = GetProp( kpridMcZeeAudio ) & kflgMcZeeAudio; If (._cnoSound != cnoNil && !fMZAudio); StopSoundClass(0, sclHelpSoundClass); PlaySoundGob(GidParThis(), ._ctgSound, ._cnoSound, ksqnNone, 0x10000, 1, 0, sclHelpSoundClass); End; End; ENDCHUNK // ----------------------------------------------------- // Main build chunky text file for the Socrates Building Help // ----------------------------------------------------- // ----------------------------------------------------- // normal help balloon // ----------------------------------------------------- GOBCHUNK( "help balloon #1a", kgobBalloon1a, 0) DEFAULT_POSITION( 40,40,800 ) ENDCHUNK REP_TILE( CHID1( krepDefault), "help balloon 1 tile", "shared\bmp\balln1a.bmp", 93, 29 ) TILEDEF( 7, 7, 7, 133, 4, 0, 0, 0, 7 ) TILEDEF( 7, 7, 7, 89, 4, 0, 0, 0, 7 ) ENDCHUNK // ----------------------------------------------------- // normal help balloon (mid right speech dippty down) // ----------------------------------------------------- GOBCHUNK( "help balloon #1e", kgobBalloon1e, 0) DEFAULT_POSITION( 40,40,800 ) ENDCHUNK REP_TILE( CHID1( krepDefault), "help balloon 1 tile", "shared\bmp\balln1e.bmp", 170, 103 ) TILEDEF( 7, 32, 7, 131, 4, 0, 0, 0, 32 ) TILEDEF( 7, 7, 7, 70, 4, 0, 0, 0, 26 ) ENDCHUNK // ----------------------------------------------------- // normal help balloon (bottom left speech dippty down) // ----------------------------------------------------- GOBCHUNK( "help balloon #1d", kgobBalloon1d, 0) DEFAULT_POSITION( 40,40,800 ) ENDCHUNK REP_TILE( CHID1( krepDefault), "help balloon 1 tile", "shared\bmp\balln1d.bmp", 0, 102 ) TILEDEF( 32, 7, 32, 131, 4, 0, 0, 0, 7 ) TILEDEF( 7, 7, 7, 68, 4, 0, 0, 0, 26 ) ENDCHUNK // ----------------------------------------------------- // Tip help balloon // ----------------------------------------------------- GOBCHUNK( "alert help", kgobBalloonTip, 0) DEFAULT_POSITION( 0, 0,999 ) ENDCHUNK REP_TILE( CHID1( krepDefault), "alert tile", "shared\bmp\balln2.bmp", 40, 29 ) TILEDEF( 7, 24, 7, 64, 8, 0,0,0, 22 ) TILEDEF( 7, 8, 7, 20, 8, 17, 8, 8, 8 ) ENDCHUNK // ----------------------------------------------------- // squishy control, with tracking // ----------------------------------------------------- GOBCHUNK( "kgobHelpSquishy", kgobHelpSquishy, 0 ) DEFAULT_POSITION( 0,0,1) ACTION( fcustNil, fcustNil, fgrfstAll, kcrsHand1, kchidClick, cidNil, cnoNil ) ENDCHUNK // normal REP_MBMP( CHID1( krepDefault), "shared\bmp\squishy1.bmp" ) // splotted REP_MBMP( CHID1( krepMouseDnOn ), "shared\bmp\squishy3.bmp" ) REP_MBMP( CHID1( krepMouseUpOn ), "shared\bmp\squishy2.bmp" ) ADOPT_MBMP( LAST_MBMP, CHID1( krepMouseDnOff )) REP_WAVE( CHID1( krepClicked ), "shared\sound\ok.wav" ) ================================================ FILE: src/shared/util.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // --------------------------------------------------------- // // Revisions: // // mm-dd-yy // ??-??-94 ****** - Created // 05-16-95 ****** - remove unimplemented hooks // 06-15-95 ****** - Added globals list // --------------------------------------------------------- // // Global Variables: // // cnoMidi Manage the midi soundtrack. Always music playing -- music // siiMidi pointed to by cnoMidi. siiMidi is the Kauai Sound Instance // ID associated with the soundtrack. // // kstEntry This indicates which entry point into a room the user // is using. // // fHelpOn Indicates whether Help is turned on in the Building. If Help // is turned on, McZee's (and Melanie's) Help bubbles appear // automatically upon entry into a room. Conversely, if the // user clicks on McZee (or Melanie) to bring up the Help bubble, // fHelpOn gets set. // // fMovie Indicates whether there is currently a movie loaded; i.e., // whether there is a movie selected in the Portfolio. // // fTrans Palette transition variables. fTrans indicates that the next // cnoPal SETPALETTE should do a palette-to-palette transition effect. // Setting it to fFalse, turns off the transition effect for the // next SETPALETTE, after which it will be reset to fTrue. // cnoPal stores the current palette so that SETPALETTE can // determine if a palette change is really necessary. // // keys keys is a bitfield describing the Set of enabled hotkeys. // keysTmp keysTmp is used to save the set of valid hotkeys between // DISABLE and ENABLE hotkeys calls. // // cDisable Number of times the keyboard accelerators have been disabled // from script via cidDisableAccel. // // #include "helptops.h" // --------------------------------------------------------- // Initialization script for shared.chk is called by app on startup. It // creates kgobUtil and runs its Script0. // --------------------------------------------------------- SCRIPTCHUNK("Init Shared", kcnoInitShared) DEBUGCMD(PrintStr("Running shared init script")); CreateChildThis(kgobUtil, kgobUtil); RunScriptGob(kgobUtil, kchidScript0); ENDCHUNK // ----------------------------------------------------- // help TOPIC definitions // ----------------------------------------------------- #include "socdefn.h" WAVE_CHUNK( "shared\sound\util\splot.wav", kwavSplot ) WAVE_CHUNK( "shared\sound\util\ding.wav", kwavDing ) // --------------------------------------------------------- // The following is the object definition for the utility // object. // --------------------------------------------------------- GOBCHUNK( "Utility object", kgobUtil, 0 ) DEFAULT_POSITION( 0,0, 0 ) ENDCHUNK // --------------------------------------------------------- // This is the first Gob to get created. Do a whole lot of // initialization stuff. // --------------------------------------------------------- CHILD_SCRIPT( "Util:start up", kchidScript0 ) SETKEYS(kflgBuildingAll); // The following are well known 'global' variables connected // to the UTIL gob... it's assumed that this list will grow // NOTE: MAKE SURE ALL GLOBALS ARE INITIALIZED HERE! SETGLOBAL(cnoMidi, cnoNil); SETGLOBAL(fHelpOn, fTrue); SETGLOBAL(fMovie, fFalse); SETGLOBAL(cnoPal, cnoNil); SetProp(kpridBuildingState, kst1); // Initializing a global variable used for tracking the voice over WAVE file // and stoping it when needed. Used in the macros VOICE(..) and ENDVOICE(); ::siiVoice = 0; // A global variable used to track if there is a scene transition occuring. ::fTransition = fFalse; // These flags are used to indicate whether or not we've visited this // room previously in this session. SETGLOBAL( fLobby1PS, fTrue ); // Flag, for Lobby1, indicates 1st time in room per session (PS) SETGLOBAL( fBackstagePS, fTrue );// Flag, for Backstage, indicates 1st time in room per session (PS) SETGLOBAL( fIdeasPS, fTrue ); // Flag, for Ideas room, indicates 1st time in room per session (PS) SETGLOBAL( fTicketPS, fTrue ); // Flag, for Ticketbooth, indicates 1st time in room per session (PS) SETGLOBAL( fStudioPS, fTrue ); // Flag, for Studio, indicates 1st time in room per session (PS) // These flags are used to indicate whether or not we've seen the // help/introduction animation for this room or not. They are fTrue // if the help has not been seen. SETGLOBAL(fLob1stHelp, fTrue); SETGLOBAL(fTic1stHelp, fTrue); SETGLOBAL(fBkstg1stHelp, fTrue); // read bio page found flag BIO_INIT(); // global flag: has the McZee in front of studio tools intro been played? ::fStdIntro = fFalse; If( GetProp( kpridMcZeeAudio ) & kflgMcZeeAudio ); // suppress the intro too -- the RonPa fix! ::fStdIntro = fTrue; End; // set according to help status in the studio, keep track of which is the Next Project ::fHelpOn = fFalse; ::NextProject = 1; // Initialize more global globals. ::volume = 50; ::kgobCurrentPlace = kidNil; ::fInStudio = fTrue; // First palette is set without a transition effect. SETGLOBAL(fTrans, fFalse); // Number of times we've called disable is 0 to start with. kgobUtil->cDisable = 0; // Set this gob up to filter for map, open, and new commands; // Redirect them to Script6. // Note: Ctrl+O and Ctrl+N are translated by the app's accelerator // table into cidOpen and cidNew. We want to filter for those cids // as well, but only when the building is loaded, so those filters // are turned on in the Building Script0 and turned off in LOADTOOLS. FilterCmdsThis( cidMap, kidNil, kchidScript6 ); ENDCHUNK // --------------------------------------------------------- // Switch from one place to another. Maintains ::kgobCurrentPlace. // // _parm[0] is the cno of the place we're to go next. // _parm[1] is the state we're to enter that place in. // --------------------------------------------------------- CHILD_SCRIPT( "Util:nextplace function", kchidScript1 ) ASSERT(_parm[0] != kidNil); ASSERT(_parm[1] >= kst1); DEBUGCMD(PrintStr("Moving to ", NumToStr(_parm[0], ""), " with state = ", NumToStr(_parm[1], ""))); If (_parm[0] != GET_CURRENTPLACE()); SETGLOBAL(kstEntry, _parm[1]); If (GET_CURRENTPLACE() != kidNil); DestroyGob(GET_CURRENTPLACE()); End; SET_CURRENTPLACE(_parm[0]); CreateChildGob(GidParThis(), _parm[0], _parm[0]); End; FlushUserEvents(kgrfevtAll); ENDCHUNK //---------------------------------------------------------- // This function is called when the user calls up the Portfolio via // CTRL+O and then closes it by pressing either Cancel or OK. The // Portfolio is opened in the Keyboard handler in Script6. // // _parm[2] is fTrue if the user pressed OK; fFalse if they // pressed Cancel. //---------------------------------------------------------- CHILD_SCRIPT("Util: Portfolio Callback", kchidScript2) // End this filter as it is no longer required. FilterCmdsThis(cidPortfolioClosed, cidNil, chidNil); If (_parm[2]); // User clicked OK LOADTOOLS(kgobStudio1, kst1, chidNil); End; ENDCHUNK //---------------------------------------------------------- // Function to lock out hot spots. // // _parm[0] is hot key state as well //---------------------------------------------------------- CHILD_SCRIPT( "Util: glass function", kchidScript3 ) If( FGobExists( kgobGlass0 ) == fFalse); // create the balloon and set hotkeys appropriately CreateChildGob(GET_CURRENTPLACE(), kgobGlass0, kgobGlass0); End; SETKEYS( _parm[0] ); ENDCHUNK //---------------------------------------------------------- // Function to manage midi music. see SETMUSIC() #define // in util.h --- _parm[0] = cno of the MIDI chunk // _parm[1] = bool : loop or not. //---------------------------------------------------------- CHILD_SCRIPT( "Util: midi function", kchidScript4 ) If( _parm[0] != .cnoMidi ); If( .cnoMidi != cnoNil ); // stop the last MIDI played. .siiMidi is always ok. // because of .cnoMidi usage StopSound( .siiMidi ); End; If( _parm[0] != cnoNil ); cnt = ( _parm[1] ) ? 0x00010000 : 1; .siiMidi = PlaySoundGob( kgobUtil, kctgMidi, _parm[0], 1, 0x00010000, cnt, 4, ksclBldgSound ); End; .cnoMidi = _parm[0]; End; ENDCHUNK // --------------------------------------------------------- // These script invokes and handle confirm exit help balloon // --------------------------------------------------------- CHILD_SCRIPT( "Util:quit app", kchidScript5 ) // Put up the glass and then a help ballooon to confirm quit CreateChildGob( SUPERPARENT(), kgobGlass1, kgobGlass1 ); CreateHelpGob( kgobGlass1, ktpcQuitAlert ); .keysTmp = KEYSTATE(); // save valid hotkeys SETKEYS( kflgKEYNONE ); // then disable all hotkeys ENDCHUNK // --------------------------------------------------------- // Script to handle Incoming cids. // --------------------------------------------------------- CHILD_SCRIPT( "Util:handle cids", kchidScript6 ) // _parm[0] = gid/hid // _parm[1] = CID (cidMap, cidOpen, cidNew or cidLoadStudioDoc) //---------------------------PORTFOLIO KEY-------------------------- If (_parm[1] == cidOpen && KEYENABLED(kflgKEYPORTFOLIO)); // Bring up the Movie Open portfolio. EnqueueCid(cidPortfolioOpen, 0, kpfPortOpenMovie, 0, 0, 0); // Look out for the cid indicating that the portfolio has been closed. FilterCmdsThis(cidPortfolioClosed, cidNil, kchidScript2); Elif (_parm[1] == cidOpen && !KEYENABLED(kflgKEYPORTFOLIO)); ModalHelp(ktpcercSocCantGoToStudio, -1); //---------------------------TOOLS KEY-------------------------- Elif (_parm[1] == cidNew && KEYENABLED(kflgKEYTOOLS)); // Open the tools with a new movie. EnqueueCid(cidPortfolioClear, 0, 0, 0, 0, 0); LOADTOOLS(kgobStudio1, kst1, chidNil); Elif (_parm[1] == cidNew && !KEYENABLED(kflgKEYTOOLS)); ModalHelp(ktpcercSocCantGoToStudio, -1); //---------------------------MAP KEY---------------------------- Elif (_parm[1] == cidMap && KEYENABLED(kflgKEYMAP)); If (::fInStudio); DEBUGCMD(PrintStr("Bringing up map from studio")); CreateChildGob(kidBackground, kgobMapMain, kgobMapMain); Else; DEBUGCMD(PrintStr("Bringing up map from building")); CreateChildGob(GET_CURRENTPLACE(), kgobMapMain, kgobMapMain); End; Exit(); Elif (_parm[1] == cidMap && !KEYENABLED(kflgKEYMAP)); ModalHelp(ktpcercSocCantGoToMap, -1); //------------------------cidLoadStudioDoc---------------------- Elif (_parm[1] == cidLoadStudioDoc && KEYENABLED(kflgLOADSTUDIO)); LOADTOOLS(kgobStudio1, kst1, chidNil); Elif (_parm[1] == cidLoadStudioDoc && !KEYENABLED(kflgLOADSTUDIO)); EnqueueCid(cidPortfolioClear, 0, 0, 0, 0, 0); ModalHelp(ktpcercSocCantGoToStudio, -1); End; ENDCHUNK //---------------------------------------------------------- // Function to switch to a new palette, doing a palette transition // if necessary. Also sets cnoPal, which always contains the current // building palette. // // _parm[0] is the palette to switch to. //---------------------------------------------------------- CHILD_SCRIPT( "Util:switch palette", kchidScript7 ) ::fTransition = fFalse; If ( (_parm[0] != GLOBAL( cnoPal)) && GLOBAL(fTrans) && (_parm[0] != cnoNil) ); // different palette than what we had + okay to transition Transition(kgftDissolve, 0, kTransitionTime, Transparent, _parm[0]); ::fTransition = fTrue; Else; // either the same palette or not allowed to transition, so just // switch the palette If( _parm[0] != cnoNil ); SetColorTable(_parm[0]); End; End; SETGLOBAL( cnoPal, _parm[0] ); SETGLOBAL(fTrans, fTrue); // Reset default state of fTrans. ENDCHUNK // -------------------------------------------------------------- // Function to load the studio tools. First, it sets up // kpridBuildingGob with the place to return to. Corresponds to // LOADTOOLS macro defined in sharutil.chh. // // _parm[0] specifies where the studio should come back to when it // returns to the Building. // _parm[1] specifies what state the return place in the Building // should enter in. // _parm[2] specifies which project the tools should be loaded with, if // any. Set to 0 to indicate no project. // -------------------------------------------------------------- // cnoForeign and kgobForeign indicates that a non-building place is the // current place and it has a potentially different palette from the return // place. #define cnoForeign cnoNil #define kgobForeign kidNil CHILD_SCRIPT("Util: Load Studio", kchidScript8) ASSERT(_parm[0] != kidNil); DEBUGCMD(PrintStr("Util: Loading Studio")); StartLongOp(); // Stop filtering for these -- let the studio filter for them now. FilterCmdsThis(cidOpen, kidNil, chidNil); FilterCmdsThis(cidNew, kidNil, chidNil); FilterCmdsThis(cidLoadStudioDoc, kidNil, chidNil); // And make sure our hotkeys are enabled -- the Studio takes care // of enabling/disabling hotkeys from here in. ENABLEHOTSPOTS(kflgBuildingAll); .kgobCurrentPlaceT = GET_CURRENTPLACE(); SetProp(kpridBuildingGob, _parm[0]); SETGLOBAL(cnoPal, cnoForeign); SETGLOBAL(kstEntry, _parm[1]); SetProp(kpridBuildingState, _parm[1]); SET_CURRENTPLACE(kgobForeign); // Deal with failure to load the studio. FilterCmdsThis(cidLoadStudioFailed, kidNil, kchidScript9); // Stop the soundtrack. PLAYMIDI(cnoNil); EnqueueCid(cidLoadStudio, 0, .kgobCurrentPlaceT, _parm[2], 0, 0); ::fInStudio = fTrue; ENDCHUNK // -------------------------------------------------------------- // This function gets called if we try to load the tools in // Script8 and fail for whatever reason. We just need to undo // everything we did in Script8 before enqueuing the LoadStudio // command. A couple things won't be restored -- cnoPal will still // be set to cnoForeign; the soundtrack will still be stopped. // -------------------------------------------------------------- CHILD_SCRIPT("Util: Load Studio Failed", kchidScript9) DEBUGCMD(PrintStr("Load Studio Failed handler")); ::fInStudio = fFalse; SET_CURRENTPLACE(.kgobCurrentPlaceT); EnqueueCid(cidPortfolioClear, 0, 0,0,0,0); FilterCmdsThis(cidLoadStudioFailed, kidNil, chidNil); FilterCmdsGob(kgobUtil, cidOpen, kidNil, kchidScript6); FilterCmdsGob(kgobUtil, cidNew, kidNil, kchidScript6); EndLongOp(fTrue); // If the studio set the wait cursor, turn it off. ENDCHUNK // --------------------------------------------------------- HELP_SCRIPT( ktpcQuitAlert ) // _parm[0] = what happenned. 0=init, 1=exit, 2=cancel If( _parm[0] == 2 ); // cancel DestroyGob( kgobGlass1 ); SETKEYS(kgobUtil->keysTmp); // restore hot key setting DestroyGob( GidParThis() ); Elif( _parm[0] == 1 ); EnqueueCid( cidQuit, 0,0,0,0,0 ); End; ENDCHUNK // --------------------------------------------------------- // This is the glass behind the help balloon // --------------------------------------------------------- OBJECT( "glass#1", kgobGlass1, 1000, kcrsArrow1 ) REP_FILL( CHID1(krepDefault),"glass1", 0,0, 640, 480, Palette( 15 ), Transparent ) PATTERN_50 ENDCHUNK CLICK_SCRIPT( "glass#1 clicked!" ) // play a honk sound here. ENDCHUNK // --------------------------------------------------------- // This object is used to lock out clicks on hot spots. // --------------------------------------------------------- OBJECT( "glass#0", kgobGlass0, 975, kcrsArrow1 ) REP_FILL( CHID1(krepDefault),"glass0", 0,0, 640, 480, Palette( 15 ), Transparent ) PATTERN_0 ENDCHUNK CLICK_SCRIPT( "glass#0 clicked!" ) PlaySoundThis( kctgWave, kwavSplot, 1, 0x00010000, 1, 0, 789 ); ENDCHUNK // ----------------------------------------------------- // script to handle 'Help, About' balloon // ----------------------------------------------------- HELP_SCRIPT( ktpcHelpAbout ) If( _parm[0] != 0 ); DestroyGob( GidParThis() ); End; ENDCHUNK ================================================ FILE: src/studio/ape.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** ape.cpp: Actor preview entity class Primary Author: ****** Review Status: REVIEWED - any changes to this file must be reviewed! The APE is used to preview a single actor. The APE doesn't actually contain an ACTR...more of an "ACTR Jr.": a _ptmpl, _pbody, _anid, and a _pbwld to display in. If fCycleCels is set to fTrue in PapeNew(), the APE will cycle through the cels of the current action. APE supports some simple editing operations, such as changing materials and TDT properties. The client must query these changes before destroying the APE to make changes to the real actor. The APE is currently used by the action browser, TDT easel, and costume changer easel. ***************************************************************************/ #include "studio.h" ASSERTNAME #define kdtimFrame (kdtimSecond / kfps) // clock ticks per frame const BRA kaFov = BR_ANGLE_DEG(60.0); // camera field of view RTCLASS(APE) BEGIN_CMD_MAP(APE, GOB) ON_CID_GEN(cidAlarm, &APE::FCmdNextCel, pvNil) END_CMD_MAP_NIL() /*************************************************************************** Create a new APE ***************************************************************************/ PAPE APE::PapeNew(PGCB pgcb, PTMPL ptmpl, PCOST pcost, long anid, bool fCycleCels, PRCA prca) { AssertVarMem(pgcb); AssertPo(ptmpl, 0); AssertNilOrPo(pcost, 0); AssertNilOrPo(prca, 0); PAPE pape; pape = NewObj APE(pgcb); if (pvNil == pape) return pvNil; if (!pape->_FInit(ptmpl, pcost, anid, fCycleCels, prca)) { ReleasePpo(&pape); return pvNil; } return pape; } /*************************************************************************** Set up the APE ***************************************************************************/ bool APE::_FInit(PTMPL ptmpl, PCOST pcost, long anid, bool fCycleCels, PRCA prca) { AssertBaseThis(0); AssertPo(ptmpl, 0); AssertNilOrPo(pcost, 0); long cbset; long ibset; RC rc; GMS gms; _fCycleCels = fCycleCels; _prca = prca; _ptmpl = ptmpl; _ptmpl->AddRef(); _pbody = _ptmpl->PbodyCreate(); // note: also sets default costume if (pvNil == _pbody) return fFalse; if (pvNil != pcost) pcost->Set(_pbody); cbset = _pbody->Cbset(); // If there is exactly one accessory body part set, set _ibsetOnlyAcc // to that ibset. Else set it to ivNil. _ibsetOnlyAcc = ivNil; for (ibset = 0; ibset < cbset; ibset++) { if (_ptmpl->FBsetIsAccessory(ibset)) { if (ivNil == _ibsetOnlyAcc) { // First one found. Remember it and keep looking _ibsetOnlyAcc = ibset; } else { // Found a second accessory ibset. Forget it. _ibsetOnlyAcc = ivNil; break; } } } _pglgms = GL::PglNew(size(GMS), cbset); if (pvNil == _pglgms) return fFalse; AssertDo(_pglgms->FSetIvMac(cbset), "PglNew should have ensured space"); TrashVar(&gms); gms.fValid = fFalse; for (ibset = 0; ibset < cbset; ibset++) _pglgms->Put(ibset, &gms); GetRc(&rc, cooLocal); _pbwld = BWLD::PbwldNew(rc.Dxp(), rc.Dyp()); if (pvNil == _pbwld) return fFalse; // Add a light source to the BWLD _blit.type = BR_LIGHT_DIRECT; _blit.colour = BR_COLOUR_RGB(0xff, 0xff, 0xff); _blit.attenuation_c = rOne; _bact.type = BR_ACTOR_LIGHT; _bact.type_data = &_blit; _bact.t.type = BR_TRANSFORM_MATRIX34; BrMatrix34Identity(&_bact.t.t.mat); BrMatrix34PostRotateX(&_bact.t.t.mat, BR_ANGLE_DEG(-40.0)); BrMatrix34PostRotateY(&_bact.t.t.mat, BR_ANGLE_DEG(-40.0)); _pbwld->AddActor(&_bact); BrLightEnable(&_bact); _pbody->SetBwld(_pbwld); _pbody->Show(); _InitView(); if (!FSetAction(anid)) return fFalse; if (fCycleCels) { _clok.Start(0); if (!_clok.FSetAlarm(0, this)) return fFalse; } return fTrue; } /*************************************************************************** Destroy the APE ***************************************************************************/ APE::~APE() { AssertBaseThis(0); // If _blit is initialized, then it was added to _pbwld and should // be removed and disabled. We check whether _blit is initialized by // seeing if _blit.type has been changed from the initial 0. Assert(BR_LIGHT_DIRECT != 0, "need a new test for whether _blit was added"); if (_blit.type == BR_LIGHT_DIRECT) { BrLightDisable(&_bact); BrActorRemove(&_bact); } ReleasePpo(&_ptmpl); ReleasePpo(&_pbody); ReleasePpo(&_pbwld); ReleasePpo(&_pglgms); } /*************************************************************************** Load the brush with ptagMtrl (for a stock material) ***************************************************************************/ void APE::SetToolMtrl(PTAG ptagMtrl) { AssertThis(0); AssertVarMem(ptagMtrl); _apet.apt = aptGms; _apet.gms.fValid = fTrue; _apet.gms.fMtrl = fTrue; _apet.gms.tagMtrl = *ptagMtrl; TrashVar(&_apet.gms.cmid); } /*************************************************************************** Load the brush with cmid (for a custom material) ***************************************************************************/ void APE::SetToolCmtl(long cmid) { AssertThis(0); _apet.apt = aptGms; _apet.gms.fValid = fTrue; _apet.gms.fMtrl = fFalse; _apet.gms.cmid = cmid; TrashVar(&_apet.gms.tagMtrl); } /*************************************************************************** Load the brush with the aptIncCmtl tool ***************************************************************************/ void APE::SetToolIncCmtl(void) { AssertThis(0); _apet.apt = aptIncCmtl; TrashVar(&_apet.gms); _apet.gms.fValid = fFalse; } /*************************************************************************** Load the brush with the aptIncAccessory tool ***************************************************************************/ void APE::SetToolIncAccessory(void) { AssertThis(0); _apet.apt = aptIncAccessory; TrashVar(&_apet.gms); _apet.gms.fValid = fFalse; } /*************************************************************************** Change the actor's action to anid ***************************************************************************/ bool APE::FSetAction(long anid) { AssertThis(0); if (!_ptmpl->FSetActnCel(_pbody, anid, 0)) return fFalse; _anid = anid; _celn = 0; _SetScale(); _UpdateView(); return fTrue; } /*************************************************************************** Time to move to the next cel of the action. Resets alarm ***************************************************************************/ bool APE::FCmdNextCel(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); if (_fCycleCels) { FDisplayCel(_celn + 1); } _clok.FSetAlarm(kdtimFrame, this); return fTrue; } /*************************************************************************** Time to move to the next cel of the action. ***************************************************************************/ bool APE::FDisplayCel(long celn) { AssertThis(0); // Someone else will push an error if this fails if (_ptmpl->FSetActnCel(_pbody, _anid, celn)) { _celn = celn; _UpdateView(); } return fTrue; } /*************************************************************************** Enable or disable cel cycling. ***************************************************************************/ void APE::SetCycleCels(bool fOn) { AssertThis(0); _fCycleCels = fOn; } /*************************************************************************** Go to the default view ***************************************************************************/ void APE::_InitView(void) { AssertThis(0); BMAT34 bmat34; BRA xa, ya, za; _iview = 0; _ptmpl->GetRestOrien(&xa, &ya, &za); BrMatrix34Identity(&bmat34); BrMatrix34PostRotateX(&bmat34, xa); BrMatrix34PostRotateY(&bmat34, ya); BrMatrix34PostRotateZ(&bmat34, za); _pbody->LocateOrient(rZero, rZero, rZero, &bmat34); _SetScale(); _UpdateView(); } /*************************************************************************** Set a custom view ***************************************************************************/ void APE::SetCustomView(BRA xa, BRA ya, BRA za) { AssertThis(0); BMAT34 bmat34; BRA xaTmpl, yaTmpl, zaTmpl; _iview = -1; _ptmpl->GetRestOrien(&xaTmpl, &yaTmpl, &zaTmpl); BrMatrix34Identity(&bmat34); BrMatrix34PostRotateX(&bmat34, xaTmpl); BrMatrix34PostRotateY(&bmat34, yaTmpl); BrMatrix34PostRotateZ(&bmat34, zaTmpl); BrMatrix34PostRotateX(&bmat34, xa); BrMatrix34PostRotateY(&bmat34, ya); BrMatrix34PostRotateZ(&bmat34, za); _pbody->LocateOrient(rZero, rZero, rZero, &bmat34); _SetScale(); _UpdateView(); } /*************************************************************************** Rotate the BODY to see a different view ***************************************************************************/ void APE::ChangeView(void) { AssertThis(0); BMAT34 bmat34; BRA xa, ya, za; _iview = (_iview + 1) % 5; _ptmpl->GetRestOrien(&xa, &ya, &za); BrMatrix34Identity(&bmat34); BrMatrix34PostRotateX(&bmat34, xa); BrMatrix34PostRotateY(&bmat34, ya); BrMatrix34PostRotateZ(&bmat34, za); switch (_iview) { case 0: _InitView(); return; case 1: BrMatrix34PostRotateY(&bmat34, BR_ANGLE_DEG(90.0)); break; case 2: BrMatrix34PostRotateY(&bmat34, BR_ANGLE_DEG(180.0)); break; case 3: BrMatrix34PostRotateY(&bmat34, BR_ANGLE_DEG(270.0)); break; case 4: BrMatrix34PostRotateX(&bmat34, BR_ANGLE_DEG(90.0)); break; } _pbody->LocateOrient(rZero, rZero, rZero, &bmat34); _SetScale(); _UpdateView(); } /*************************************************************************** Position the camera so the actor is centered and properly sized ***************************************************************************/ void APE::_SetScale(void) { AssertThis(0); RC rcView; BCB bcbBody; // 3-D bounds of BODY BRS dxrBody, dyrBody, dzrBody; BRS rDydxBody; BRS xrCam, yrCam, zrCam; BRS zrHither, zrYon; BMAT34 bmat34Camera; BRS dxrView, dyrView; BRS rDydxView; BRA aFov; BRS rAtan; _pbody->GetBcbBounds(&bcbBody, fTrue); dxrBody = bcbBody.xrMax - bcbBody.xrMin; dyrBody = bcbBody.yrMax - bcbBody.yrMin; dzrBody = bcbBody.zrMax - bcbBody.zrMin; rDydxBody = BrsDiv(dyrBody, dxrBody); // The x and y camera distances are functions of the body only xrCam = BrsHalf(bcbBody.xrMax + bcbBody.xrMin); yrCam = BrsHalf(bcbBody.yrMax + bcbBody.yrMin); GetRc(&rcView, cooLocal); dxrView = BrIntToScalar(rcView.Dxp()); dyrView = BrIntToScalar(rcView.Dyp()); rDydxView = BrsDiv(dyrView, dxrView); aFov = BrScalarToAngle(BrsHalf(BrAngleToScalar(kaFov))); rAtan = BrsDiv(BR_COS(aFov), BR_SIN(aFov)); if (rDydxBody > rDydxView) { // Tall actor : Compute z based on y zrCam = BrsMul(BrsHalf(dyrBody), rAtan); } else { // Wide actor : Compute z based on x // Fit the actor width into a narrow rc dxrBody = BrsMul(dxrBody, rDydxView); zrCam = BrsMul(BrsHalf(dxrBody), rAtan); } // Adjust for body depth zrCam += bcbBody.zrMax; // Set hither and yon. Note: there's probably a good algorithm to // compute the optimal values for zrHither and zrYon, but I // don't have time to figure it out right now. :-) The goal is // to make zrHither as large as possible and zrYon as small as // possible without intersecting the actor. -***** if (zrCam < BR_SCALAR(10.0)) zrHither = BR_SCALAR(0.1); else zrHither = rOne; zrYon = BR_SCALAR(1000.0); BrMatrix34Translate(&bmat34Camera, xrCam, yrCam, zrCam); _pbwld->SetCamera(&bmat34Camera, zrHither, zrYon, kaFov); } /*************************************************************************** Render and force redraw of the APE ***************************************************************************/ void APE::_UpdateView(void) { AssertThis(0); _pbwld->Render(); _pbwld->MarkRenderedRegn(this, 0, 0); } /*************************************************************************** Draw the contents of the APE's bwld ***************************************************************************/ void APE::Draw(PGNV pgnv, RC *prcClip) { AssertThis(0); AssertPo(pgnv, 0); AssertVarMem(prcClip); _pbwld->Draw(pgnv, prcClip, 0, 0); } /*************************************************************************** Set the cursor appropriately ***************************************************************************/ bool APE::FCmdMouseMove(PCMD_MOUSE pcmd) { AssertThis(0); AssertVarMem(pcmd); PBACT pbact; PBODY pbody; long ibset; long ibsetAcc; if (pvNil != _prca) { SetCursCno(_prca, kcrsDefault); if (_pbwld->FClickedActor(pcmd->xp, pcmd->yp, &pbact)) { pbody = BODY::PbodyFromBact(pbact, &ibset); Assert(pbody == _pbody, "what BODY is this?"); if (_apet.apt == aptIncCmtl) { if (_ptmpl->CcmidOfBset(ibset) > 1) SetCursCno(_prca, kcrsCostume); } else if (_apet.apt == aptIncAccessory) { // Change cursor if there's only one accessory // body part set or if cursor is on either an accessory // body part set or the parent of one. if (_ibsetOnlyAcc != ivNil || _ptmpl->FIbsetAccOfIbset(ibset, &ibsetAcc)) { SetCursCno(_prca, kcrsHand); } } } } return APE_PAR::FCmdMouseMove(pcmd); } /*************************************************************************** Handle mouse-down. Do the right thing depending on the current tool. ***************************************************************************/ bool APE::FCmdTrackMouse(PCMD_MOUSE pcmd) { AssertThis(0); PBACT pbact; PBODY pbody; long ibset; long ibsetAcc; GMS gms; if (pcmd->cid != cidMouseDown) { Bug("Should only get a mousedown here!"); return fTrue; } if (!_pbwld->FClickedActor(pcmd->xp, pcmd->yp, &pbact)) return fTrue; pbody = BODY::PbodyFromBact(pbact, &ibset); Assert(pbody == _pbody, "what BODY is this?"); switch (_apet.apt) { case aptNil: break; case aptGms: gms = _apet.gms; Assert(gms.fValid, 0); if (_FApplyGms(&gms, ibset)) _pglgms->Put(ibset, &gms); break; case aptIncCmtl: _pglgms->Get(ibset, &gms); if (_FIncCmtl(&gms, ibset, fFalse)) _pglgms->Put(ibset, &gms); break; case aptIncAccessory: if ((ibsetAcc = _ibsetOnlyAcc) != ivNil || _ptmpl->FIbsetAccOfIbset(ibset, &ibsetAcc)) { _pglgms->Get(ibsetAcc, &gms); if (_FIncCmtl(&gms, ibsetAcc, fTrue)) _pglgms->Put(ibsetAcc, &gms); _SetScale(); } break; default: BugVar("weird tool", &_apet.apt); break; } _UpdateView(); return fTrue; } /*************************************************************************** Apply a GMS to ibset ***************************************************************************/ bool APE::_FApplyGms(GMS *pgms, long ibset) { AssertThis(0); AssertVarMem(pgms); Assert(pgms->fValid, "bad gms"); AssertIn(ibset, 0, _pbody->Cbset()); PMTRL pmtrl; PCMTL pcmtl; if (pgms->fMtrl) { pmtrl = (PMTRL)vptagm->PbacoFetch(&pgms->tagMtrl, MTRL::FReadMtrl); if (pvNil == pmtrl) return fFalse; _pbody->SetPartSetMtrl(ibset, pmtrl); ReleasePpo(&pmtrl); } else // cmtl { pcmtl = _ptmpl->PcmtlFetch(pgms->cmid); if (pvNil == pcmtl) return fFalse; _pbody->SetPartSetCmtl(pcmtl); ReleasePpo(&pcmtl); } return fTrue; } /*************************************************************************** Fill in pgms with the next CMTL available for ibset and applies it to _pbody. ***************************************************************************/ bool APE::_FIncCmtl(GMS *pgms, long ibset, bool fNextAccessory) { AssertThis(0); AssertVarMem(pgms); AssertIn(ibset, 0, _pbody->Cbset()); long cmid; long cmidNext; long icmid; long ccmid; PCMTL pcmtl; PCMTL pcmtlOld; PMTRL pmtrlOld; bool fMtrl; // Default cmidNext is default cmid for this body part set cmidNext = _ptmpl->CmidOfBset(ibset, 0); ccmid = _ptmpl->CcmidOfBset(ibset); // Need to find out what cmid (if any) is currently attached to ibset. // If the GMS is valid, use it. Otherwise, figure out which cmid // generates the same pcmtl that is currently attached to the body. if (!pgms->fValid || pgms->fMtrl) { // GMS is useless...look at the body _pbody->GetPartSetMaterial(ibset, &fMtrl, &pmtrlOld, &pcmtlOld); if (!fMtrl) { for (icmid = 0; icmid < ccmid; icmid++) { cmid = _ptmpl->CmidOfBset(ibset, icmid); pcmtl = _ptmpl->PcmtlFetch(cmid); if (pvNil == pcmtl) return fFalse; if (pcmtl == pcmtlOld) { ReleasePpo(&pcmtl); cmidNext = _CmidNext(ibset, icmid, fNextAccessory); break; } ReleasePpo(&pcmtl); } } } else { // GMS has current cmid cmid = pgms->cmid; for (icmid = 0; icmid < ccmid; icmid++) { if (cmid == _ptmpl->CmidOfBset(ibset, icmid)) { cmidNext = _CmidNext(ibset, icmid, fNextAccessory); break; } } } pcmtl = _ptmpl->PcmtlFetch(cmidNext); if (pvNil == pcmtl) return fFalse; _pbody->SetPartSetCmtl(pcmtl); ReleasePpo(&pcmtl); pgms->cmid = cmidNext; pgms->fMtrl = fFalse; pgms->fValid = fTrue; return fTrue; } /*************************************************************************** Return the CMID that follows the given CMID. If fNextAccessory, it returns the next CMID that has a different set of models than icmidCur. Otherwise it returns the next CMID that has the same set of models as icmidCur. ***************************************************************************/ long APE::_CmidNext(long ibset, long icmidCur, bool fNextAccessory) { AssertThis(0); long cmidCur; long ccmid; long icmidNext; long cmidNext; long dicmid; cmidCur = _ptmpl->CmidOfBset(ibset, icmidCur); ccmid = _ptmpl->CcmidOfBset(ibset); for (dicmid = 1; dicmid < ccmid; dicmid++) { icmidNext = (icmidCur + dicmid) % ccmid; cmidNext = _ptmpl->CmidOfBset(ibset, icmidNext); if (fNextAccessory) { if (!_ptmpl->FSameAccCmids(cmidCur, cmidNext)) return cmidNext; } else { if (_ptmpl->FSameAccCmids(cmidCur, cmidNext)) return cmidNext; } } return cmidCur; // couldn't find anything...just use this cmid } /*************************************************************************** Change this APE's TDT properties ***************************************************************************/ bool APE::FChangeTdt(PSTN pstn, long tdts, PTAG ptagTdf) { AssertThis(0); Assert(_ptmpl->FIsTdt(), "FChangeTdt is only for TDTs"); AssertNilOrPo(pstn, 0); AssertNilOrVarMem(ptagTdf); PTDT ptdtNew = pvNil; PBODY pbodyNew = pvNil; ptdtNew = ((PTDT)_ptmpl)->PtdtDup(); if (pvNil == ptdtNew) goto LFail; pbodyNew = _pbody->PbodyDup(); if (pvNil == pbodyNew) goto LFail; if (!ptdtNew->FChange(pstn, tdts, ptagTdf)) goto LFail; if (!ptdtNew->FAdjustBody(pbodyNew)) goto LFail; if (!ptdtNew->FSetActnCel(pbodyNew, _anid, _celn)) goto LFail; ReleasePpo(&_ptmpl); _ptmpl = ptdtNew; _pbody->Restore(pbodyNew); ReleasePpo(&pbodyNew); _SetScale(); _UpdateView(); return fTrue; LFail: ReleasePpo(&ptdtNew); ReleasePpo(&pbodyNew); return fFalse; } /*************************************************************************** Set material of this TDT to ptagMtrl ***************************************************************************/ bool APE::FSetTdtMtrl(PTAG ptagMtrl) { AssertThis(0); Assert(_ptmpl->FIsTdt(), "FSetTdtMtrl is only for TDTs"); Assert(_pbody->Cbset() == 1, "TDTs should only have one body part set"); AssertVarMem(ptagMtrl); PMTRL pmtrl; GMS gms; pmtrl = (PMTRL)vptagm->PbacoFetch(ptagMtrl, MTRL::FReadMtrl); if (pvNil == pmtrl) return fFalse; _pbody->SetPartSetMtrl(0, pmtrl); ReleasePpo(&pmtrl); gms.fValid = fTrue; gms.fMtrl = fTrue; TrashVar(&gms.cmid); gms.tagMtrl = *ptagMtrl; _pglgms->Put(0, &gms); _UpdateView(); return fTrue; } /*************************************************************************** Get the CNO of the MTRL attached to this TDT. Returns fFalse if there is no MTRL attached or the MTRL didn't come from a chunk. ***************************************************************************/ bool APE::FGetTdtMtrlCno(CNO *pcno) { AssertThis(0); Assert(_ptmpl->FIsTdt(), "FGetTdtMtrlCno is only for TDTs"); AssertVarMem(pcno); PMTRL pmtrl; PCMTL pcmtl; bool fMtrl; _pbody->GetPartSetMaterial(0, &fMtrl, &pmtrl, &pcmtl); if (!fMtrl) return fFalse; if (pvNil == pmtrl->Pcrf()) return fFalse; *pcno = pmtrl->Cno(); return fTrue; } /*************************************************************************** Return info about the TDT ***************************************************************************/ void APE::GetTdtInfo(PSTN pstn, long *ptdts, PTAG ptagTdf) { AssertThis(0); Assert(_ptmpl->FIsTdt(), "GetTdtInfo is only for TDTs"); AssertNilOrVarMem(pstn); AssertNilOrVarMem(ptdts); AssertNilOrVarMem(ptagTdf); ((PTDT)_ptmpl)->GetInfo(pstn, ptdts, ptagTdf); } /*************************************************************************** Fills in pfMtrl, pcmid, and ptagMtrl with the material that was attached to ibset, if any. If nothing was done to ibset, returns fFalse. ***************************************************************************/ bool APE::FGetMaterial(long ibset, tribool *pfMtrl, long *pcmid, TAG *ptagMtrl) { AssertThis(0); AssertIn(ibset, 0, _pbody->Cbset()); AssertVarMem(pfMtrl); AssertVarMem(pcmid); AssertVarMem(ptagMtrl); GMS gms; _pglgms->Get(ibset, &gms); if (!gms.fValid) return fFalse; // nothing new for this ibset *pfMtrl = (tribool)gms.fMtrl; *pcmid = gms.cmid; *ptagMtrl = gms.tagMtrl; return fTrue; } #ifdef DEBUG /*************************************************************************** Assert the validity of the APE. ***************************************************************************/ void APE::AssertValid(ulong grf) { APE_PAR::AssertValid(fobjAllocated); AssertPo(_pbwld, 0); AssertPo(_ptmpl, 0); AssertPo(_pbody, 0); AssertPo(_pglgms, 0); Assert(_pglgms->IvMac() == _pbody->Cbset(), "_pglgms wrong size"); AssertNilOrPo(_prca, 0); } /*************************************************************************** Mark memory used by the APE ***************************************************************************/ void APE::MarkMem(void) { AssertThis(0); APE_PAR::MarkMem(); MarkMemObj(_pbwld); MarkMemObj(_ptmpl); MarkMemObj(_pbody); MarkMemObj(_pglgms); MarkMemObj(_prca); } #endif // DEBUG ================================================ FILE: src/studio/browser.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*****************************************************************************\ * * browser.cht * * All browsers that appear in the studio * * Author: Sean Selitrennikoff * * Status: REVIEWED * \*****************************************************************************/ // // // Generic objects shared by browsers // NOTE**: Generic controls need to be directed to parent of parent of control // GOBCHUNK("Generic browser page fwd", kidGenericPageFwd, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttGenericPageFwd) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault ), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault ), "studio\bmp\fwd.bmp", kxpregGenericPageFwd, kypregGenericPageFwd) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\fwdc.bmp", kxpregGenericPageFwd, kypregGenericPageFwd) REP_RECT(CHID(kstBrowserDisabled, krepDefault ), "hidden", 0, 0, 0, 0) ADOPT_WAVE(kcnoBrwzBtnWav, CHID(kstBrowserEnabled, krepClicked)) CLICK_SCRIPT("Browser page fwd clicked") EnqueueCid(cidBrowserFwd, GidParGob(GidParThis()), GidThis(), 0, 0, 0); ENDCHUNK GOBCHUNK("Generic browser page back", kidGenericPageBack, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttGenericPageBack) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault ), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault ), "studio\bmp\bback.bmp", kxpregGenericPageBack, kypregGenericPageBack) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\bbackc.bmp", kxpregGenericPageBack, kypregGenericPageBack) REP_RECT(CHID(kstBrowserDisabled, krepDefault ), "hidden", 0, 0, 0, 0) ADOPT_WAVE(kcnoBrwzBtnWav, CHID(kstBrowserEnabled, krepClicked)) CLICK_SCRIPT("Browser page back clicked") EnqueueCid(cidBrowserBack, GidParGob(GidParThis()), GidThis(), 0, 0, 0); ENDCHUNK GOBCHUNK("Generic browser cancel", kidGenericCancel, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttEaselCancel) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault ), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault ), "studio\bmp\cancel.bmp", kxpregGenericCancel, kypregGenericCancel) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\cancelc.bmp", kxpregGenericCancel, kypregGenericCancel) REP_RECT(CHID(kstBrowserDisabled, krepDefault ), "hidden", 0, 0, 0, 0) ADOPT_WAVE(kcnoCancelWav, CHID(kstBrowserEnabled, krepClicked)) CLICK_SCRIPT("Browser cancel clicked") EnqueueCid(cidBrowserCancel, GidParGob(GidParThis()), GidThis(), 0, 0, 0); ENDCHUNK GOBCHUNK("Generic browser Okay", kidGenericOk, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttEaselOk) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault ), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault ), "studio\bmp\okay.bmp", kxpregGenericOk, kypregGenericOk) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\okayc.bmp", kxpregGenericOk, kypregGenericOk) REP_RECT(CHID(kstBrowserDisabled, krepDefault ), "hidden", 0, 0, 0, 0) ADOPT_WAVE(kcnoOkWav, CHID(kstBrowserEnabled, krepClicked)) CLICK_SCRIPT("Browser Ok clicked") EnqueueCid(cidBrowserOk, GidParGob(GidParThis()), GidThis(), 0, 0, 0); ENDCHUNK GOBCHUNK("Generic browser pane of glass", kidGenericGlass, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, CHID(kstDefault, kchidClick), cidNil, cnoNil) ENDCHUNK REP_RECT(CHID(kstDefault, krepDefault ), "Max", 0, 0, kdxpBackground, kdypBackground) CHILD_SCRIPT("Glass clicked", CHID(kstDefault, kchidClick)) PlaySoundGob(kidBackground, kctgWave, kwavSplot, 0, 0x10000, 1, 0, 1); ENDCHUNK GOBCHUNK("Generic disable pane of glass", kidGenericDisableGlass, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, CHID(kstDefault, kchidClick), cidNil, cnoNil) ENDCHUNK REP_FILL( CHID(kstDefault, krepDefault ), "Max", 0,0, kdxpBackground, kdypBackground, Transparent, Palette( 73 )) PATTERN_50 ENDCHUNK CHILD_SCRIPT("Glass clicked", CHID(kstDefault, kchidClick)) PlaySoundGob(kidBackground, kctgWave, kwavSplot, 0, 0x10000, 1, 0, 1); ENDCHUNK // Transparent area for page number insertion. OBJECT("Browser page number", kidGenericPageNum, 100, kcrsArrow) REP_RECT(CHID(kstDefault, krepDefault), "Visible", 0, 0, kxpBrwsPageNumWidth, kypBrwsPageNumHeight) // // Settings browsers' very own glass // GOBCHUNK("Settings browser pane of glass", kidSettingsGlass, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, CHID(kstDefault, kchidClick), cidNil, cnoNil) ENDCHUNK REP_FILL( CHID(kstDefault, krepDefault ), "Max", 0,0, kdxpBackground, kdypBackground, Transparent, Palette( 73 )) PATTERN_50 ENDCHUNK CREATE_SCRIPT("Settings background") CreateChildThis(kidBrwsBackground, kidBrwsBackground); ENDCHUNK CHILD_SCRIPT("Glass clicked", CHID(kstDefault, kchidClick)) PlaySoundGob(kidBackground, kctgWave, kwavSplot, 0, 0x10000, 1, 0, 1); ENDCHUNK // // Background // // Create self + NxM frames + controls, all are invisable // Enqueues: cidScenesBrowserReady when ready to go. // GOBCHUNK("Scene browser background", kidBrwsBackground, kgokkRectHit) DEFAULT_POSITION(kxpBrwsBackground, kypBrwsBackground, 200) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault ), "studio\bmp\book1.bmp", kxpregBrwsBackground, kypregBrwsBackground ) ADOPT_WAVE(kcnoPBrowseWav, CHID(kstDefault, krepEnterAnimation)) CREATE_SCRIPT("Scene browser created") CreateChildThis(kidBrowserPageFwd, kidGenericPageFwd); MoveAbsGob(kidBrowserPageFwd, kxpScenePageFwd, kypScenePageFwd); CreateChildThis(kidBrowserPageBack, kidGenericPageBack); MoveAbsGob(kidBrowserPageBack, kxpScenePageBack, kypScenePageBack); CreateChildThis(kidBrowserPageNum, kidGenericPageNum); MoveAbsGob(kidBrowserPageNum, kxpScenePageNum, kypScenePageNum); CreateChildThis(kidBrowserCancel, kidGenericCancel); MoveAbsGob(kidBrowserCancel, kxpSceneCancel, kypSceneCancel); ChangeStateGob( kidBrowserCancel, kstBrowserEnabled ); yp = kdypSceneTop; nFrame = 0; While(yp <= (kdypScene - kdypSceneFrame - kdypSceneBottom)); xp = kdxpSceneLeft; While(xp <= (kdxpScene - kdxpSceneRight - kdxpSceneFrame)); // // create and position frames // CreateChildThis(kidBrowserFrame + nFrame, kidBrwsSceneFrame); MoveAbsGob(kidBrowserFrame + nFrame, xp, yp); nFrame++; xp += kdxpSceneSpacing + kdxpSceneFrame; End; yp += kdypSceneSpacing + kdypSceneFrame; End; // // This browser shuts when a selection occurs -- or when a thumb gets // clicked. // FilterCmdsThis(cidMouseDown, cidNil, kchidScript1); ENDCHUNK CHILD_SCRIPT("par / filter cids", kchidScript1) kid = _parm[0]; cid = _parm[1]; If(cid == cidMouseDown); If(((kid >= kidBrowserFrame) && (kid < kidBrowserFrameLim)) || (kid == kidBrowserCancel) || (kid == kidBrowserPageFwd) || (kid == kidBrowserPageBack)); Return(fFalse); End; End; ENDCHUNK // // A frame object for the settings browser. // GOBCHUNK("Scene browser Frame", kidBrwsSceneFrame, kgokkRectNoKids) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, cnoNil) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault), "studio\bmp\frame1.bmp", kxpregBrwsSceneFrame, kypregBrwsSceneFrame) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\frame1h.bmp", kxpregBrwsSceneFrame, kypregBrwsSceneFrame) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserSelected, krepDefault)) REP_RECT(CHID(kstBrowserDisabled, krepDefault), "hidden", 0, 0, 0, 0) CLICK_SCRIPT("Browser frame clicked") ChangeStateThis(kstBrowserSelected); EnqueueCid(cidBrowserSelect, kidSettingsGlass, GidThis(), 0, 0, 0); EnqueueCid(cidBrowserOk, kidSettingsGlass, GidThis(), 0, 0, 0); PlaySoundGob(kidBackground, kctgWave, kcnoBrwzPicWav, 0, 0x10000, 1, 0, 1); ENDCHUNK // // Camera browsers' very own glass // GOBCHUNK("Camera browser pane of glass", kidCameraGlass, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, CHID(kstDefault, kchidClick), cidNil, cnoNil) ENDCHUNK REP_FILL( CHID(kstDefault, krepDefault ), "Max", 0,0, kdxpBackground, kdypBackground, Transparent, Palette( 73 )) PATTERN_50 ENDCHUNK CREATE_SCRIPT("Camera background") CreateChildThis(kidBrwsCamera, kidBrwsCamera); ENDCHUNK CHILD_SCRIPT("Glass clicked", CHID(kstDefault, kchidClick)) PlaySoundGob(kidBackground, kctgWave, kwavSplot, 0, 0x10000, 1, 0, 1); ENDCHUNK // // Background // // Create self + NxM frames + controls, all are invisible // Enqueues: cidCamerasBrowserReady when ready to go. // GOBCHUNK("Camera browser background", kidBrwsCamera, kgokkRectHit) DEFAULT_POSITION(kxpBrwsCamera, kypBrwsCamera, 200) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault ), "studio\bmp\book2.bmp", kxpregBrwsCamera, kypregBrwsCamera ) ADOPT_WAVE(kcnoPBrowseWav, CHID(kstDefault, krepEnterAnimation)) CREATE_SCRIPT("Camera browser created") CreateChildThis(kidBrowserPageFwd, kidGenericPageFwd); MoveAbsGob(kidBrowserPageFwd, kxpCameraPageFwd, kypCameraPageFwd); CreateChildThis(kidBrowserPageBack, kidGenericPageBack); MoveAbsGob(kidBrowserPageBack, kxpCameraPageBack, kypCameraPageBack); CreateChildThis(kidBrowserPageNum, kidGenericPageNum); MoveAbsGob(kidBrowserPageNum, kxpCameraPageNum, kypCameraPageNum); CreateChildThis(kidBrowserCancel, kidGenericCancel); MoveAbsGob(kidBrowserCancel, kxpCameraCancel, kypCameraCancel); ChangeStateGob( kidBrowserCancel, kstBrowserEnabled ); yp = kdypCameraTop; nFrame = 0; While(yp <= (kdypCamera - kdypCameraFrame - kdypCameraBottom)); xp = kdxpCameraLeft; While(xp <= (kdxpCamera - kdxpCameraRight - kdxpCameraFrame)); // // create and position frames // CreateChildThis(kidBrowserFrame + nFrame, kidBrwsCameraFrame); MoveAbsGob(kidBrowserFrame + nFrame, xp, yp); nFrame++; xp += kdxpCameraSpacing + kdxpCameraFrame; End; yp += kdypCameraSpacing + kdypCameraFrame; End; // // This browser shuts when a selection ockcrs -- or when a thumb gets // clicked. // FilterCmdsThis(cidMouseDown, cidNil, kchidScript1); ENDCHUNK CHILD_SCRIPT("par / filter cids", kchidScript1) kid = _parm[0]; cid = _parm[1]; If(cid == cidMouseDown); If(((kid >= kidBrowserFrame) && (kid < kidBrowserFrameLim)) || (kid == kidBrowserCancel) || (kid == kidBrowserPageFwd) || (kid == kidBrowserPageBack)); Return(fFalse); End; End; ENDCHUNK // // A frame object for the camera view browser // GOBCHUNK("Object browser Frame", kidBrwsCameraFrame, kgokkRectNoKids) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, cnoNil) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault), "studio\bmp\frame2.bmp", kxpregBrwsCameraFrame, kypregBrwsCameraFrame) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\frame2h.bmp", kxpregBrwsCameraFrame, kypregBrwsCameraFrame) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserSelected, krepDefault)) REP_RECT(CHID(kstBrowserDisabled, krepDefault), "hidden", 0, 0, 0, 0) CLICK_SCRIPT("Browser frame clicked") ChangeStateThis(kstBrowserSelected); EnqueueCid(cidBrowserSelect, kidCameraGlass, GidThis(), 0, 0, 0); EnqueueCid(cidBrowserOk, kidCameraGlass, GidThis(), 0, 0, 0); PlaySoundGob(kidBackground, kctgWave, kcnoBrwzPicWav, 0, 0x10000, 1, 0, 1); ENDCHUNK // // Actor browsers' very own glass // GOBCHUNK("Actor browser pane of glass", kidActorGlass, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, CHID(kstDefault, kchidClick), cidNil, cnoNil) ENDCHUNK REP_FILL( CHID(kstDefault, krepDefault ), "Max", 0,0, kdxpBackground, kdypBackground, Transparent, Palette( 73 )) PATTERN_50 ENDCHUNK CREATE_SCRIPT("Actor background") CreateChildThis(kidBrwsActor, kidBrwsActor); ENDCHUNK CHILD_SCRIPT("Glass clicked", CHID(kstDefault, kchidClick)) PlaySoundGob(kidBackground, kctgWave, kwavSplot, 0, 0x10000, 1, 0, 1); ENDCHUNK // // Background // // Create self + NxM frames + controls, all are invisible // Enqueues: cidActorsBrowserReady when ready to go. // GOBCHUNK("Actor browser background", kidBrwsActor, kgokkRectHit) DEFAULT_POSITION(kxpBrwsActor, kypBrwsActor, 200) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault ), "studio\bmp\book3.bmp", kxpregBrwsActor, kypregBrwsActor ) ADOPT_WAVE(kcnoPBrowseWav, CHID(kstDefault, krepEnterAnimation)) CREATE_SCRIPT("Actor browser created") CreateChildThis(kidBrowserPageFwd, kidGenericPageFwd); MoveAbsGob(kidBrowserPageFwd, kxpActorPageFwd, kypActorPageFwd); CreateChildThis(kidBrowserPageBack, kidGenericPageBack); MoveAbsGob(kidBrowserPageBack, kxpActorPageBack, kypActorPageBack); CreateChildThis(kidBrowserPageNum, kidGenericPageNum); MoveAbsGob(kidBrowserPageNum, kxpActorPageNum, kypActorPageNum); CreateChildThis(kidBrowserCancel, kidGenericCancel); MoveAbsGob(kidBrowserCancel, kxpActorCancel, kypActorCancel); ChangeStateGob( kidBrowserCancel, kstBrowserEnabled ); yp = kdypActorTop; nFrame = 0; While(yp <= (kdypActor - kdypActorFrame - kdypActorBottom)); xp = kdxpActorLeft; While(xp <= (kdxpActor - kdxpActorRight - kdxpActorFrame)); // // create and position frames // CreateChildThis(kidBrowserFrame + nFrame, kidBrwsActorFrame); MoveAbsGob(kidBrowserFrame + nFrame, xp, yp); nFrame++; xp += kdxpActorSpacing + kdxpActorFrame; End; yp += kdypActorSpacing + kdypActorFrame; End; // // This browser shuts when a selection ockcrs -- or when a thumb gets // clicked. // FilterCmdsThis(cidMouseDown, cidNil, kchidScript1); ENDCHUNK CHILD_SCRIPT("par / filter cids", kchidScript1) kid = _parm[0]; cid = _parm[1]; If(cid == cidMouseDown); If(((kid >= kidBrowserFrame) && (kid < kidBrowserFrameLim)) || (kid == kidBrowserCancel) || (kid == kidBrowserPageFwd) || (kid == kidBrowserPageBack)); Return(fFalse); End; End; ENDCHUNK // // A frame object for the actors browser // GOBCHUNK("Actor browser Frame", kidBrwsActorFrame, kgokkRectNoKids) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, cnoNil) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault), "studio\bmp\frame3.bmp", kxpregBrwsActorFrame, kypregBrwsActorFrame) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\frame3h.bmp", kxpregBrwsActorFrame, kypregBrwsActorFrame) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserSelected, krepDefault)) REP_RECT(CHID(kstBrowserDisabled, krepDefault), "hidden", 0, 0, 0, 0) CLICK_SCRIPT("Browser frame clicked") ChangeStateThis(kstBrowserSelected); EnqueueCid(cidBrowserSelect, kidActorGlass, GidThis(), 0, 0, 0); EnqueueCid(cidBrowserOk, kidActorGlass, GidThis(), 0, 0, 0); PlaySoundGob(kidBackground, kctgWave, kcnoBrwzPicWav, 0, 0x10000, 1, 0, 1); ENDCHUNK // // Prop browsers' very own glass // GOBCHUNK("Prop browser pane of glass", kidPropGlass, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, CHID(kstDefault, kchidClick), cidNil, cnoNil) ENDCHUNK REP_FILL( CHID(kstDefault, krepDefault ), "Max", 0,0, kdxpBackground, kdypBackground, Transparent, Palette( 73 )) PATTERN_50 ENDCHUNK CREATE_SCRIPT("Prop background") CreateChildThis(kidBrwsProp, kidBrwsProp); ENDCHUNK CHILD_SCRIPT("Glass clicked", CHID(kstDefault, kchidClick)) PlaySoundGob(kidBackground, kctgWave, kwavSplot, 0, 0x10000, 1, 0, 1); ENDCHUNK // // Background // // Create self + NxM frames + controls, all are invisible // Enqueues: cidPropsBrowserReady when ready to go. // GOBCHUNK("Prop browser background", kidBrwsProp, kgokkRectHit) DEFAULT_POSITION(kxpBrwsProp, kypBrwsProp, 200) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault ), "studio\bmp\book4.bmp", kxpregBrwsProp, kypregBrwsProp ) ADOPT_WAVE(kcnoPBrowseWav, CHID(kstDefault, krepEnterAnimation)) CREATE_SCRIPT("Prop browser created") CreateChildThis(kidBrowserPageFwd, kidGenericPageFwd); MoveAbsGob(kidBrowserPageFwd, kxpPropPageFwd, kypPropPageFwd); CreateChildThis(kidBrowserPageBack, kidGenericPageBack); MoveAbsGob(kidBrowserPageBack, kxpPropPageBack, kypPropPageBack); CreateChildThis(kidBrowserPageNum, kidGenericPageNum); MoveAbsGob(kidBrowserPageNum, kxpPropPageNum, kypPropPageNum); CreateChildThis(kidBrowserCancel, kidGenericCancel); MoveAbsGob(kidBrowserCancel, kxpPropCancel, kypPropCancel); ChangeStateGob( kidBrowserCancel, kstBrowserEnabled ); yp = kdypPropTop; nFrame = 0; While(yp <= (kdypProp - kdypPropFrame - kdypPropBottom)); xp = kdxpPropLeft; While(xp <= (kdxpProp - kdxpPropRight - kdxpPropFrame)); // // create and position frames // CreateChildThis(kidBrowserFrame + nFrame, kidBrwsPropFrame); MoveAbsGob(kidBrowserFrame + nFrame, xp, yp); nFrame++; xp += kdxpPropSpacing + kdxpPropFrame; End; yp += kdypPropSpacing + kdypPropFrame; End; // // This browser shuts when a selection ockcrs -- or when a thumb gets // clicked. // FilterCmdsThis(cidMouseDown, cidNil, kchidScript1); ENDCHUNK CHILD_SCRIPT("par / filter cids", kchidScript1) kid = _parm[0]; cid = _parm[1]; If(cid == cidMouseDown); If(((kid >= kidBrowserFrame) && (kid < kidBrowserFrameLim)) || (kid == kidBrowserCancel) || (kid == kidBrowserPageFwd) || (kid == kidBrowserPageBack)); Return(fFalse); End; End; ENDCHUNK // // A frame object for the Prop browser // GOBCHUNK("Prop browser Frame", kidBrwsPropFrame, kgokkRectNoKids) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, cnoNil) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault), "studio\bmp\frame4.bmp", kxpregBrwsPropFrame, kypregBrwsPropFrame) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\frame4h.bmp", kxpregBrwsPropFrame, kypregBrwsPropFrame) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserSelected, krepDefault)) REP_RECT(CHID(kstBrowserDisabled, krepDefault), "hidden", 0, 0, 0, 0) CLICK_SCRIPT("Browser frame clicked") ChangeStateThis(kstBrowserSelected); EnqueueCid(cidBrowserSelect, kidPropGlass, GidThis(), 0, 0, 0); EnqueueCid(cidBrowserOk, kidPropGlass, GidThis(), 0, 0, 0); PlaySoundGob(kidBackground, kctgWave, kcnoBrwzPicWav, 0, 0x10000, 1, 0, 1); ENDCHUNK // // Action browsers' very own glass // GOBCHUNK("Action browser pane of glass", kidActionGlass, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, CHID(kstDefault, kchidClick), cidNil, cnoNil) ENDCHUNK REP_FILL( CHID(kstDefault, krepDefault ), "Max", 0,0, kdxpBackground, kdypBackground, Transparent, Palette( 73 )) PATTERN_50 ENDCHUNK CREATE_SCRIPT("Action background") CreateChildThis(kidBrwsAction, kidBrwsAction); // help balloon If (!::fHelpOn); CreateHelpGob(kidBackground, ktpcEaselHelp3A); End; ENDCHUNK CHILD_SCRIPT("Glass clicked", CHID(kstDefault, kchidClick)) PlaySoundGob(kidBackground, kctgWave, kwavSplot, 0, 0x10000, 1, 0, 1); ENDCHUNK // // Background // // Create self + NxM frames + controls, all are invisible // Enqueues: cidActionsBrowserReady when ready to go. // GOBCHUNK("Action browser background", kidBrwsAction, kgokkRectHit) DEFAULT_POSITION(kxpBrwsAction, kypBrwsAction, 200) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault ), "studio\bmp\book5.bmp", kxpregBrwsAction, kypregBrwsAction ) ADOPT_WAVE(kcnoPBrowseWav, CHID(kstDefault, krepEnterAnimation)) CREATE_SCRIPT("Action browser created") CreateChildThis(kidBrowserPageFwd, kidGenericPageFwd); MoveAbsGob(kidBrowserPageFwd, kxpActionPageFwd, kypActionPageFwd); CreateChildThis(kidBrowserPageBack, kidGenericPageBack); MoveAbsGob(kidBrowserPageBack, kxpActionPageBack, kypActionPageBack); CreateChildThis(kidBrowserPageNum, kidGenericPageNum); MoveAbsGob(kidBrowserPageNum, kxpActionPageNum, kypActionPageNum); CreateChildThis(kidBrowserOk, kidGenericOk); MoveAbsGob(kidBrowserOk, kxpActionOk, kypActionOk); // REVIEW: make the OK button enabled ChangeStateGob( kidBrowserOk, kstBrowserEnabled ); CreateChildThis(kidBrowserCancel, kidGenericCancel); MoveAbsGob(kidBrowserCancel, kxpActionCancel, kypActionCancel); // REVIEW: make the cancel button enabled ChangeStateGob( kidBrowserCancel, kstBrowserEnabled ); CreateChildThis(kidBrwsActionPrev, kidBrwsActionPrev); ChangeStateGob(kidBrwsActionPrev, kstBrowserEnabled); CreateChildThis(kidBrowserActionBackCel, kidBrowserActionBackCel); ChangeStateGob(kidBrowserActionBackCel, kstBrowserEnabled); CreateChildThis(kidBrowserActionFwdCel, kidBrowserActionFwdCel); ChangeStateGob(kidBrowserActionFwdCel, kstBrowserEnabled); xp = kdxpActionLeft; nFrame = 0; While(xp <= (kdxpAction - kdxpActionRight - kdxpActionFrame)); yp = kdypActionTop; While(yp <= (kdypAction - kdypActionFrame - kdypActionBottom)); // // create and position frames // CreateChildThis(kidBrowserFrame + nFrame, kidBrwsActionFrame); MoveAbsGob(kidBrowserFrame + nFrame, xp, yp); nFrame++; yp += kdypActionSpacing + kdypActionFrame; End; xp += kdxpActionSpacing + kdxpActionFrame; End; // // This browser shuts when a selection occurs -- or when a thumb gets // clicked. // FilterCmdsThis(cidMouseDown, cidNil, kchidScript1); ENDCHUNK CHILD_SCRIPT("par / filter cids", kchidScript1) kid = _parm[0]; cid = _parm[1]; If(cid == cidMouseDown); If(((kid >= kidBrowserFrame) && (kid < kidBrowserFrameLim)) || (kid == kidBrowserOk) || (kid == kidBrowserCancel) || (kid == kidBrowserPageFwd) || (kid == kidBrowserPageBack)); Return(fFalse); End; End; ENDCHUNK // // A frame object for the action browser // GOBCHUNK("Action browser Frame", kidBrwsActionFrame, kgokkRectNoKids) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, cnoNil) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault), "studio\bmp\frame5.bmp", kxpregBrwsActionFrame, kypregBrwsActionFrame) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\frame5h.bmp", kxpregBrwsActionFrame, kypregBrwsActionFrame) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserSelected, krepDefault)) REP_RECT(CHID(kstBrowserDisabled, krepDefault), "hidden", 0, 0, 0, 0) CLICK_SCRIPT("Browser frame clicked") ChangeStateThis(kstBrowserSelected); EnqueueCid(cidBrowserSelect, kidActionGlass, GidThis(), 0, 0, 0); PlaySoundGob(kidBackground, kctgWave, kcnoBrwzPicWav, 0, 0x10000, 1, 0, 1); ENDCHUNK // // The preview area for the action browser // GOBCHUNK("Action Browser preview", kidBrwsActionPrev, gokkNoHit ) DEFAULT_POSITION(0, 0, 100) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault), "hidden5", 0, 0, 0, 0) REP_RECT(CHID(kstBrowserEnabled, krepDefault), "preview window", kxpBrwsActionPrevLeft, kypBrwsActionPrevTop, kxpBrwsActionPrevRight, kypBrwsActionPrevBottom) REP_RECT(CHID(kstBrowserDisabled, krepDefault), "hidden", 0, 0, 0, 0) // // Back starting cell button // GOBCHUNK("Action browser - change cell", kidBrowserActionBackCel, kgokkRectHit) DEFAULT_POSITION(kxpBrwsActionBackCel, kypBrwsActionBackCel, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttBrwsActionBackCel) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault), "studio\bmp\b5celbk.bmp", kxpregBrwsActionBackCel, kypregBrwsActionBackCel) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\b5celbks.bmp", kxpregBrwsActionBackCel, kypregBrwsActionBackCel) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserSelected, krepDefault)) REP_RECT(CHID(kstBrowserDisabled, krepDefault), "hidden", 0, 0, 0, 0) ADOPT_WAVE(kcnoSyStepBWav, CHID(kstBrowserEnabled, krepClicked)) CLICK_SCRIPT("Browser Back cel clicked") EnqueueCid(cidBrowserChangeCel, kidActionGlass, GidThis(), 0, 0, 0); ENDCHUNK // // Fwd starting cell button // GOBCHUNK("Action browser - change cell", kidBrowserActionFwdCel, kgokkRectHit) DEFAULT_POSITION(kxpBrwsActionFwdCel, kypBrwsActionFwdCel, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttBrwsActionFwdCel) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault), "studio\bmp\b5celfw.bmp", kxpregBrwsActionFwdCel, kypregBrwsActionFwdCel) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\b5celfws.bmp", kxpregBrwsActionFwdCel, kypregBrwsActionFwdCel) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserSelected, krepDefault)) REP_RECT(CHID(kstBrowserDisabled, krepDefault), "hidden", 0, 0, 0, 0) ADOPT_WAVE(kcnoSyStepFWav, CHID(kstBrowserEnabled, krepClicked)) CLICK_SCRIPT("Browser Fwd cel clicked") EnqueueCid(cidBrowserChangeCel, kidActionGlass, GidThis(), 0, 0, 0); ENDCHUNK // // // Textbox create browser // // GOBCHUNK("Textbox create browser background", kidBrwsTextCreate, kgokkRectHit) DEFAULT_POSITION( kxpBrwsTextCreate, kypBrwsTextCreate , 200) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault ), "studio\bmp\book9.bmp", kxpregBrwsTextCreate, kypregBrwsTextCreate ) ADOPT_WAVE(kcnoPBrowseWav, CHID(kstDefault, krepEnterAnimation)) CREATE_SCRIPT("Action browser created") CreateChildGob(kidBackground, kidGenericDisableGlass, kidGenericDisableGlass); CreateChildThis(kidCTextsStory, kidCTextsStory); CreateChildThis(kidCTextsScroll, kidCTextsScroll); CreateChildThis(kidBrowserCancel, kidGenericCancel); MoveAbsGob(kidBrowserCancel, kxpCTextsCancel, kypCTextsCancel); ChangeStateGob( kidBrowserCancel, kstBrowserEnabled ); DISABLEACCEL(fFalse); // // This browser shuts when a selection occurs -- or when a thumb gets // clicked. // // enqueue for Tony's tracking (how to's and projects) EnqueueCid( cidBrowserVisible, 0,0,0,0, 0 ); FilterCmdsThis(cidMouseDown, cidNil, kchidScript1); FilterCmdsThis(cidKey, cidNil, kchidScript2); FilterCmdsThis(cidSelIdle, cidNil, kchidScript2); ENDCHUNK CHILD_SCRIPT("Trap script", kchidScript2) Return(fTrue); ENDCHUNK CHILD_SCRIPT("par / filter cids", kchidScript1) kid = _parm[0]; cid = _parm[1]; If(cid == cidMouseDown); If((kid == kidCTextsStory) || (kid == kidCTextsScroll)); Return(fFalse); Elif (kid == kidBrowserCancel); ENABLEACCEL(fFalse); EnqueueCid(cidBrowserCancel, 0, 0, 0, 0, 0); DestroyGob(kidGenericDisableGlass); DestroyThis(); Return(fTrue); End; End; ENDCHUNK GOBCHUNK("Textbox create - story", kidCTextsStory, kgokkRectHit) DEFAULT_POSITION(kxpCTextsStory, kypCTextsStory, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttCTextsStory) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\e6stor.bmp", kxpregCTextsStory, kypregCTextsStory) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\e6stors.bmp", kxpregCTextsStory, kypregCTextsStory) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CHILD_SCRIPT("Click, create story", CHID(kstDefault, kchidClick)) ENABLEACCEL(fFalse); EnqueueCid(cidCreateTbox, khidStudio, fFalse, 0, 0, 0); EnqueueCid(cidBrowserOk, 0, 0, 0, 0, 0); DestroyGob(kidGenericDisableGlass); DestroyGob(kidBrwsTextCreate); PlaySoundGob(kidBackground, kctgWave, kcnoBrwzPicWav, 0, 0x10000, 1, 0, 1); ENDCHUNK GOBCHUNK("Textbox create - scroll", kidCTextsScroll, kgokkRectHit) DEFAULT_POSITION(kxpCTextsScroll, kypCTextsScroll, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttCTextsScroll) ENDCHUNK REP_MBMPREG(kcell1, "studio\bmp\e6scr1.bmp", kxpregCTextsScroll, kypregCTextsScroll); REP_MBMPREG(kcell2, "studio\bmp\e6scr2.bmp", kxpregCTextsScroll, kypregCTextsScroll); REP_MBMPREG(kcell3, "studio\bmp\e6scr3.bmp", kxpregCTextsScroll, kypregCTextsScroll); REP_MBMPREG(kcell4, "studio\bmp\e6scr4.bmp", kxpregCTextsScroll, kypregCTextsScroll); REP_ANIM(CHID(kstDefault, krepDefault), "Scroll tbox") cell = 0; While(); Cell(kcell1 + cell, 0, 0, 60); cell = cell+1; If( cell==4 ); cell = 0; End; // cell = (cell++) % 4 End; ENDCHUNK ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\e6scr1s.bmp", kxpregCTextsScroll, kypregCTextsScroll) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CHILD_SCRIPT("Click, create Scroll", CHID(kstDefault, kchidClick)) ENABLEACCEL(fFalse); EnqueueCid(cidCreateTbox, khidStudio, fTrue, 0, 0, 0); EnqueueCid(cidBrowserOk, 0, 0, 0, 0, 0); DestroyGob(kidGenericDisableGlass); DestroyGob(kidBrwsTextCreate); PlaySoundGob(kidBackground, kctgWave, kcnoBrwzPicWav, 0, 0x10000, 1, 0, 1); ENDCHUNK // // Sound Effects browser's very own glass // GOBCHUNK("Sound FX browser pane of glass", kidFXGlass, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, CHID(kstDefault, kchidClick), cidNil, cnoNil) ENDCHUNK REP_FILL( CHID(kstDefault, krepDefault ), "Max", 0,0, kdxpBackground, kdypBackground, Transparent, Palette( 73 )) PATTERN_50 ENDCHUNK CREATE_SCRIPT("Sound FX background") CreateChildThis(kidBrwsSoundsBackground, kidBrwsSoundsBackground); // help balloon If (!::fHelpOn); CreateHelpGob(kidBackground, ktpcEaselHelp36); End; ENDCHUNK CHILD_SCRIPT("Glass clicked", CHID(kstDefault, kchidClick)) PlaySoundGob(kidBackground, kctgWave, kwavSplot, 0, 0x10000, 1, 0, 1); ENDCHUNK GOBCHUNK("Sound MIDI browser pane of glass", kidMidiGlass, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, CHID(kstDefault, kchidClick), cidNil, cnoNil) ENDCHUNK REP_FILL( CHID(kstDefault, krepDefault ), "Max", 0,0, kdxpBackground, kdypBackground, Transparent, Palette( 73 )) PATTERN_50 ENDCHUNK CREATE_SCRIPT("Sound Midi background") CreateChildThis(kidBrwsSoundsBackground, kidBrwsSoundsBackground); // help balloon If (!::fHelpOn); CreateHelpGob(kidBackground, ktpcEaselHelp39); End; ENDCHUNK CHILD_SCRIPT("Glass clicked", CHID(kstDefault, kchidClick)) PlaySoundGob(kidBackground, kctgWave, kwavSplot, 0, 0x10000, 1, 0, 1); ENDCHUNK GOBCHUNK("Sound Speech browser pane of glass", kidSpeechGlass, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, CHID(kstDefault, kchidClick), cidNil, cnoNil) ENDCHUNK REP_FILL( CHID(kstDefault, krepDefault ), "Max", 0,0, kdxpBackground, kdypBackground, Transparent, Palette( 73 )) PATTERN_50 ENDCHUNK CREATE_SCRIPT("Sound Speech background") CreateChildThis(kidBrwsSoundsBackground, kidBrwsSoundsBackground); // help balloon If (!::fHelpOn); CreateHelpGob(kidBackground, ktpcEaselHelp38); End; ENDCHUNK CHILD_SCRIPT("Glass clicked", CHID(kstDefault, kchidClick)) PlaySoundGob(kidBackground, kctgWave, kwavSplot, 0, 0x10000, 1, 0, 1); ENDCHUNK GOBCHUNK("Sound browser background", kidBrwsSoundsBackground, kgokkRectHit) DEFAULT_POSITION(kxpBrwsSoundsBackground, kypBrwsSoundsBackground, 200) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_MBMPREG(kcell1, "studio\bmp\book6.bmp", kxpregBrwsSoundsBackground, kypregBrwsSoundsBackground ) REP_MBMPREG(kcell2, "studio\bmp\book7.bmp", kxpregBrwsSoundsBackground, kypregBrwsSoundsBackground ) REP_MBMPREG(kcell3, "studio\bmp\book8.bmp", kxpregBrwsSoundsBackground, kypregBrwsSoundsBackground ) REP_RECT(CHID(kstClosed, krepDefault), "hidden", 0, 0, 0, 0) ADOPT_WAVE(kcnoPBrowseWav, CHID(kstDefault, krepEnterAnimation)) REP_ANIM(CHID(kstDefault, krepDefault), "Sound browser background") // Display a background appropriate to the type of sound browser. If (GidParThis() == kidMidiGlass); Cell(kcell1, 0, 0, 10); Elif (GidParThis() == kidFXGlass); Cell(kcell2, 0, 0, 10); Else; Cell(kcell3, 0, 0, 10); End; ENDCHUNK CREATE_SCRIPT("Sound browser created") CreateChildThis(kidBrowserPageFwd, kidGenericPageFwd); MoveAbsGob(kidBrowserPageFwd, kxpSoundPageFwd, kypSoundPageFwd); CreateChildThis(kidBrowserPageBack, kidGenericPageBack); MoveAbsGob(kidBrowserPageBack, kxpSoundPageBack, kypSoundPageBack); CreateChildThis(kidBrowserPageNum, kidGenericPageNum); MoveAbsGob(kidBrowserPageNum, kxpSoundPageNum, kypSoundPageNum); CreateChildThis(kidBrowserOk, kidGenericOk); MoveAbsGob(kidBrowserOk, kxpSoundOk, kypSoundOk); ChangeStateGob( kidBrowserOk, kstBrowserEnabled ); CreateChildThis(kidBrowserCancel, kidGenericCancel); MoveAbsGob(kidBrowserCancel, kxpSoundCancel, kypSoundCancel); ChangeStateGob( kidBrowserCancel, kstBrowserEnabled ); CreateChildThis(kidBrowserImport, kidBrowserImport); MoveAbsGob(kidBrowserImport, kxpBrowserImport, kypBrowserImport); // Change the state of the import button to use the appropriate tool tip. If (GidParThis() == kidFXGlass); ChangeStateGob(kidBrowserImport, kst1); Elif (GidParThis() == kidSpeechGlass); ChangeStateGob(kidBrowserImport, kst2); Elif (GidParThis() == kidMidiGlass); ChangeStateGob(kidBrowserImport, kst3); End; // No recording button for Midi browser. If (GidParThis() != kidMidiGlass); CreateChildThis(kidBrowserRecord, kidBrowserRecord); MoveAbsGob(kidBrowserRecord, kxpBrowserRecord, kypBrowserRecord); End; // Display sound name frames on the browser. xp = kdxpSoundLeft; nFrame = 0; // Create frames to order by column not row. While(xp <= (kdxpSound - kdxpSoundRight - kdxpSoundFrame)); yp = kdypSoundTop; While(yp <= (kdypSound - kdypSoundFrame - kdypSoundBottom)); // // create and position frames // CreateChildThis(kidBrowserFrame + nFrame, kidBrwsSoundFrame); MoveAbsGob(kidBrowserFrame + nFrame, xp, yp); nFrame++; yp += kdypSoundSpacing + kdypSoundFrame; End; xp += kdxpSoundSpacing + kdxpSoundFrame; End; // Filter out the mouse dn events, to close the browser if click outside. FilterCmdsThis(cidMouseDown, cidNil, kchidScript1); FilterCmdsThis(cidKey, cidNil, kchidScript2); ENDCHUNK CHILD_SCRIPT("Delete user snd", kchidScript2) kid = _parm[0]; cid = _parm[1]; vk = _parm[3]; // If the record easel is displayed in front of the sound browser, // then don't take any action here as the key press was intended // for the record easel. We must take this action here as the // alternatives wold be to... // 1. Disable the borwser filter when the record easel is invoked // and reinstate the filter when the easel OK/Cancel is clicked. // This doesn't work because the easel is not necessarily dismissed // when the OK button is clicked, (may get error and keep easel up). // 2. Initiate key filter for record easel. This does indeed prevent // the browser acting on the key presses, but it also means the // keys don't have the desired effect in the edit ctrl. Presumably // we must pass the key press through the easel, otherwise it never // gets to whatever actually manipulates the text. If(!FGobExists(kidRecordBackground)); If ((cid == cidKey) && ((vk == 46) || (vk == 8))); EnqueueCid(cidBrowserDel, GidParGob( kidBrwsSoundsBackground ), GidThis(), 0, 0, 0); End; End; ENDCHUNK CHILD_SCRIPT("par / filter cids", kchidScript1) kid = _parm[0]; cid = _parm[1]; // Dismiss the Sound browser if the user btns down on anything // that is not the browser or is a child of the browser. If(cid == cidMouseDown); If((kid == GidThis()) || (GidParGob(kid) == GidThis())); Return(fFalse); End; End; ENDCHUNK // // A frame object for the sound browser // GOBCHUNK("Sound browser Frame", kidBrwsSoundFrame, kgokkRectNoKids) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, cnoNil) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault), "studio\bmp\frame5.bmp", kxpregBrwsActionFrame, kypregBrwsActionFrame) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\frame5h.bmp", kxpregBrwsActionFrame, kypregBrwsActionFrame) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserSelected, krepDefault)) REP_RECT(CHID(kstBrowserDisabled, krepDefault), "hidden", 0, 0, 0, 0) CLICK_SCRIPT( "Sound frame clicked" ) ChangeStateThis(kstBrowserSelected); // send the message to the parent of this browser - the glass gob EnqueueCid(cidBrowserSelect, GidParGob( kidBrwsSoundsBackground ), GidThis(), 0, 0, 0); ENDCHUNK GOBCHUNK("Sounds Browser Record", kidBrowserRecord, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttBrowserRecord) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\mike.bmp", kxpregBrowserRecord, kypregBrowserRecord) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\mikes.bmp", kxpregBrowserRecord, kypregBrowserRecord ) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserSelected, krepDefault)) ADOPT_WAVE(kcnoMikeWav, CHID(kstDefault, krepClicked)) CHILD_SCRIPT("Sounds Browser Record", CHID(kstDefault, kchidClick)) // Need to tell whether we're recording SFX or Speech If(GidParGob( kidBrwsSoundsBackground) == kidFXGlass); EnqueueCid(cidOpenSoundRecord, 0, 0, 0, 0, 0); Elif(GidParGob( kidBrwsSoundsBackground) == kidSpeechGlass); EnqueueCid(cidOpenSoundRecord, 0, 1, 0, 0, 0); End; ENDCHUNK GOBCHUNK("Sounds Browser Import", kidBrowserImport, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfst1, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttBrowserImportFX) ACTION(fcustNil, fcustNil, fgrfst2, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttBrowserImportSpeech) ACTION(fcustNil, fcustNil, fgrfst3, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttBrowserImportMidi) ENDCHUNK REP_MBMPREG(CHID(kst1, krepDefault), "studio\bmp\sndport.bmp", kxpregBrowserImport, kypregBrowserImport) ADOPT_MBMP(LAST_MBMP, CHID(kst1, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kst1, krepMouseDnOff)) ADOPT_MBMP(LAST_MBMP, CHID(kst2, krepDefault)) ADOPT_MBMP(LAST_MBMP, CHID(kst2, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kst2, krepMouseDnOff)) ADOPT_MBMP(LAST_MBMP, CHID(kst3, krepDefault)) ADOPT_MBMP(LAST_MBMP, CHID(kst3, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kst3, krepMouseDnOff)) REP_MBMPREG(CHID(kst1, krepMouseDnOn), "studio\bmp\sndports.bmp", kxpregBrowserImport, kypregBrowserImport) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserSelected, krepDefault)) ADOPT_MBMP(LAST_MBMP, CHID(kst2, krepMouseDnOn)) ADOPT_MBMP(LAST_MBMP, CHID(kst2, kstBrowserSelected)) ADOPT_MBMP(LAST_MBMP, CHID(kst3, krepMouseDnOn)) ADOPT_MBMP(LAST_MBMP, CHID(kst3, kstBrowserSelected)) ADOPT_WAVE(kcnoBrwzBtnWav, CHID(kst1, krepClicked)) ADOPT_WAVE(kcnoBrwzBtnWav, CHID(kst2, krepClicked)) ADOPT_WAVE(kcnoBrwzBtnWav, CHID(kst3, krepClicked)) CHILD_SCRIPT("Sounds Browser Import", CHID(kstDefault, kchidClick)) // Bring up the Sound import portfolio. EnqueueCid(cidPortfolioOpen, 0, kpfPortOpenSound, GidParGob( kidBrwsSoundsBackground ), 0, 0); // Look out for the cid indicating that the portfolio has been closed. FilterCmdsThis(cidPortfolioClosed, cidNil, kchidScript1); ENDCHUNK CHILD_SCRIPT("par / filter cids", kchidScript1) // End this filter as it is no longer required. FilterCmdsThis(cidPortfolioClosed, cidNil, chidNil); // Let the sound code know a file has been selected. If(_parm[2] == fTrue); EnqueueCid(cidPortfolioFile, GidParGob(kidBrwsSoundsBackground), GidThis(), 0, 0, 0); // Now watch for the command to display the import browser. FilterCmdsThis(cidLaunchImport, cidNil, kchidScript2); End; ENDCHUNK CHILD_SCRIPT("par / filter cids", kchidScript2) // End this filter as it is no longer required. FilterCmdsThis(cidLaunchImport, cidNil, chidNil); EnqueueCid(cidBrowserReady, khidStudio, _parm[2], kidImportFrame, kidImportPageFwd, (kdxpImportFrameBorder << 16) | kdypImportFrameBorder); ENDCHUNK // // Sound import browser's very own glass // GOBCHUNK("Sound import browser pane of glass", kidSoundsImportGlass, kgokkRectHit) // Raise the z-coord of this browser above the background browser. DEFAULT_POSITION(0, 0, 200) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, CHID(kstDefault, kchidClick), cidNil, cnoNil) ENDCHUNK REP_FILL( CHID(kstDefault, krepDefault ), "Max", 0,0, kdxpBackground, kdypBackground, Transparent, Palette( 73 )) PATTERN_50 ENDCHUNK CREATE_SCRIPT("Sound import background") CreateChildThis(kidBrwsSoundsImportBackground, kidBrwsSoundsImportBackground); ENDCHUNK CHILD_SCRIPT("Glass clicked", CHID(kstDefault, kchidClick)) PlaySoundGob(kidBackground, kctgWave, kwavSplot, 0, 0x10000, 1, 0, 1); ENDCHUNK GOBCHUNK("Sound import browser background", kidBrwsSoundsImportBackground, kgokkRectHit) DEFAULT_POSITION(kxpBrwsImportBackground, kypBrwsImportBackground, 200) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_MBMPREG(kcell1, "studio\bmp\book6.bmp", kxpregBrwsImportBackground, kypregBrwsImportBackground ) REP_MBMPREG(kcell2, "studio\bmp\book7.bmp", kxpregBrwsImportBackground, kypregBrwsImportBackground ) REP_MBMPREG(kcell3, "studio\bmp\book8.bmp", kxpregBrwsImportBackground, kypregBrwsImportBackground ) REP_RECT(CHID(kstClosed, krepDefault), "hidden", 0, 0, 0, 0) ADOPT_WAVE(kcnoPBrowseWav, CHID(kstDefault, krepEnterAnimation)) REP_ANIM(CHID(kstDefault, krepDefault), "Sound import browser background") // Display a background appropriate to the type of underlying sound browser. If (GidParGob(kidBrwsSoundsBackground) == kidMidiGlass); Cell(kcell1, 0, 0, 10); Elif (GidParGob(kidBrwsSoundsBackground) == kidFXGlass); Cell(kcell2, 0, 0, 10); Else; Cell(kcell3, 0, 0, 10); End; ENDCHUNK CREATE_SCRIPT("Sound import browser created") CreateChildThis(kidImportPageFwd, kidImportPageFwd); MoveAbsGob(kidImportPageFwd, kxpImportPageFwd, kypImportPageFwd); CreateChildThis(kidImportPageBack, kidImportPageBack); MoveAbsGob(kidImportPageBack, kxpImportPageBack, kypImportPageBack); CreateChildThis(kidImportPageNum, kidImportPageNum); MoveAbsGob(kidImportPageNum, kxpImportPageNum, kypImportPageNum); CreateChildThis(kidImportOk, kidGenericOk); MoveAbsGob(kidImportOk, kxpImportOk, kypImportOk); ChangeStateGob( kidImportOk, kstBrowserEnabled ); CreateChildThis(kidImportCancel, kidGenericCancel); MoveAbsGob(kidImportCancel, kxpImportCancel, kypImportCancel); ChangeStateGob( kidImportCancel, kstBrowserEnabled ); // Display import sound name frames on the browser. // Reuse the same positions as used for the other sound browsers. xp = kdxpSoundLeft; nFrame = 0; While(xp <= (kdxpSound - kdxpSoundRight - kdxpSoundFrame)); yp = kdypSoundTop; While(yp <= (kdypSound - kdypSoundFrame - kdypSoundBottom)); // // create and position frames // CreateChildThis(kidImportFrame + nFrame, kidBrwsSoundImportFrame); MoveAbsGob(kidImportFrame + nFrame, xp, yp); nFrame++; yp += kdypSoundSpacing + kdypSoundFrame; End; xp += kdxpSoundSpacing + kdxpSoundFrame; End; // Filter out the mouse dn events, to close the browser if click outside. FilterCmdsThis(cidMouseDown, cidNil, kchidScript1); ENDCHUNK CHILD_SCRIPT("par / filter cids", kchidScript1) kid = _parm[0]; cid = _parm[1]; If(cid == cidMouseDown); If((kid == GidThis()) || (GidParGob(kid) == GidThis())); Return(fFalse); End; End; ENDCHUNK // // A frame object for the sound import browser // GOBCHUNK("Sound import browser Frame", kidBrwsSoundImportFrame, kgokkRectNoKids) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, cnoNil) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault), "studio\bmp\frame5.bmp", kxpregBrwsActionFrame, kypregBrwsActionFrame) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\frame5h.bmp", kxpregBrwsActionFrame, kypregBrwsActionFrame) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserSelected, krepDefault)) REP_RECT(CHID(kstBrowserDisabled, krepDefault), "hidden", 0, 0, 0, 0) CLICK_SCRIPT( "Sound import frame clicked" ) ChangeStateThis(kstBrowserSelected); // Send the message to the parent of this browser - the glass gob EnqueueCid(cidBrowserSelect, kidSoundsImportGlass, GidThis(), 0, 0, 0); ENDCHUNK // No generic page up/down to be used here, as sounds browser still up behind this browser. GOBCHUNK("Sound import browser page fwd", kidImportPageFwd, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttImportPageFwd) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault ), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault ), "studio\bmp\fwd.bmp", kxpregImportPageFwd, kypregImportPageFwd) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\fwdc.bmp", kxpregImportPageFwd, kypregImportPageFwd) REP_RECT(CHID(kstBrowserDisabled, krepDefault ), "hidden", 0, 0, 0, 0) ADOPT_WAVE(kcnoBrwzBtnWav, CHID(kstBrowserEnabled, krepClicked)) CLICK_SCRIPT("Import browser page fwd clicked") EnqueueCid(cidBrowserFwd, kidSoundsImportGlass, GidThis(), 0, 0, 0); ENDCHUNK GOBCHUNK("Sound import browser page back", kidImportPageBack, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttImportPageBack) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault ), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault ), "studio\bmp\bback.bmp", kxpregImportPageBack, kypregImportPageBack) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\bbackc.bmp", kxpregImportPageBack, kypregImportPageBack) REP_RECT(CHID(kstBrowserDisabled, krepDefault ), "hidden", 0, 0, 0, 0) ADOPT_WAVE(kcnoBrwzBtnWav, CHID(kstBrowserEnabled, krepClicked)) CLICK_SCRIPT("Import browser page back clicked") EnqueueCid(cidBrowserBack, kidSoundsImportGlass, GidThis(), 0, 0, 0); ENDCHUNK GOBCHUNK("Import browser cancel", kidImportCancel, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttEaselCancel) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault ), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault ), "studio\bmp\cancel.bmp", kxpregImportCancel, kypregImportCancel) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\cancelc.bmp", kxpregImportCancel, kypregImportCancel) REP_RECT(CHID(kstBrowserDisabled, krepDefault ), "hidden", 0, 0, 0, 0) ADOPT_WAVE(kcnoCancelWav, CHID(kstBrowserEnabled, krepClicked)) CLICK_SCRIPT("Import browser cancel clicked") EnqueueCid(cidBrowserCancel, kidSoundsImportGlass, GidThis(), 0, 0, 0); ENDCHUNK GOBCHUNK("Import browser Okay", kidImportOk, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttEaselOk) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault ), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault ), "studio\bmp\okay.bmp", kxpregImportOk, kypregImportOk) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\okayc.bmp", kxpregImportOk, kypregImportOk) REP_RECT(CHID(kstBrowserDisabled, krepDefault ), "hidden", 0, 0, 0, 0) ADOPT_WAVE(kcnoOkWav, CHID(kstBrowserEnabled, krepClicked)) CLICK_SCRIPT("Import browser Ok clicked") EnqueueCid(cidBrowserOk, kidSoundsImportGlass, GidThis(), 0, 0, 0); ENDCHUNK // Transparent area for page number insertion. OBJECT("Import browser page number", kidImportPageNum, 100, kcrsArrow) REP_RECT(CHID(kstDefault, krepDefault), "Visible", 0, 0, kxpImportPageNumWidth, kypImportPageNumHeight) // // // Actor RollCall browser // // GOBCHUNK("RollCall actor browser background", kidRollCallActor, kgokkRectHit) DEFAULT_POSITION( 0, 0, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_RECT( CHID1( krepDefault ), "actor rollcall", kxpRollCallActorLeft, kypRollCallActorTop, kxpRollCallActorRight, kypRollCallActorBottom ) CREATE_SCRIPT("RollCall actor browser created") // Create page up and page down btns. CreateChildThis(kidRollCallActorUpArrow, kidRollCallActorUpArrow); MoveAbsGob(kidRollCallActorUpArrow, kxpRollCallActorPageUp, kypRollCallActorPageUp); CreateChildThis(kidRollCallActorDownArrow, kidRollCallActorDownArrow); MoveAbsGob(kidRollCallActorDownArrow, kxpRollCallActorPageDown, kypRollCallActorPageDown); // Display actor thumbnail frames on the browser. yp = kdypRollCallActorBorderTop; // Create four separate frames. CreateChildThis(kidRollCallActorBorder1, kidRollCallActorBorder1); MoveAbsGob(kidRollCallActorBorder1, kdxpRollCallActorBorderLeft, yp); yp += kdypRollCallActorSpacing + kdypRollCallActorBorder; CreateChildThis(kidRollCallActorBorder2, kidRollCallActorBorder2); MoveAbsGob(kidRollCallActorBorder2, kdxpRollCallActorBorderLeft, yp); yp += kdypRollCallActorSpacing + kdypRollCallActorBorder; CreateChildThis(kidRollCallActorBorder3, kidRollCallActorBorder3); MoveAbsGob(kidRollCallActorBorder3, kdxpRollCallActorBorderLeft, yp); yp += kdypRollCallActorSpacing + kdypRollCallActorBorder; CreateChildThis(kidRollCallActorBorder4, kidRollCallActorBorder4); MoveAbsGob(kidRollCallActorBorder4, kdxpRollCallActorBorderLeft, yp); ENDCHUNK // Create four separate frames here to allow different tooltips, (and bitmaps if necessary) GOBCHUNK("RollCall Actor browser border 1", kidRollCallActorBorder1, gokkNoHitKids) DEFAULT_POSITION(0, 0, 20) ACTION(fcustNil, fcustNil, fgrfstBrowserInvisible, kcrsArrow, chidNil, cidNil, cnoNil) ACTION(fcustNil, fcustNil, fgrfstBrowserEnabled, kcrsHand, CHID(kstBrowserEnabled, kchidClick), cidNil, kttRollCallActorFrame1) ACTION(fcustNil, fcustNil, fgrfstBrowserSelected, kcrsHand, CHID(kstBrowserEnabled, kchidClick), cidNil, kttRollCallActorFrame1) ENDCHUNK REP_MBMPREG(CHID(kstBrowserInvisible, krepDefault), "studio\bmp\rcact1.bmp", kxpregRollCallActorBorder1, kypregRollCallActorBorder1) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault), "studio\bmp\rcact1e.bmp", kxpregRollCallActorBorder1, kypregRollCallActorBorder1) REP_MBMPREG(CHID(kstBrowserSelected, krepDefault), "studio\bmp\rcact1s.bmp", kxpregRollCallActorBorder1, kypregRollCallActorBorder1) CREATE_SCRIPT("Actor Rollcall border 1 create frame") // We end up here ever time the state is changed to BrowserInvisible, because the // create state and BrowserInvisible have the same value. Therefore only create // the child frame here if it doesn't already exist. If(!FGobExists(kidRollCallActorFrame1)); CreateChildThis(kidRollCallActorFrame1, kidRollCallActorFrame1); MoveAbsGob(kidRollCallActorFrame1, kdxpRollCallActorLeft, kdypRollCallActorTop); End; ENDCHUNK CHILD_SCRIPT("RollCall Actor enabled/selected border/frame 1 clicked", CHID(kstBrowserEnabled, kchidClick)) EnqueueCid(cidBrowserSelect, kidRollCallActor, kidRollCallActorFrame1, 0, 0, 0); ENDCHUNK GOBCHUNK("RollCall Actor browser Frame 1", kidRollCallActorFrame1, kgokkRectNoHit) DEFAULT_POSITION(0, 0, 30) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_RECT(CHID1(krepDefault), "thumb", 0, 0, kdxpRollCallActorRight, kdypRollCallActorBottom) REP_ANIM(CHID(kstBrowserInvisible, krepDefault), "Set state of parent border") Cell(CHID1(krepDefault), 0, 0, 10); ChangeStateGob(GidParThis(), StateThis()); ENDCHUNK ADOPT_ANIM(LAST_ANIM, CHID(kstBrowserEnabled, krepDefault)) ADOPT_ANIM(LAST_ANIM, CHID(kstBrowserSelected, krepDefault)) GOBCHUNK("RollCall Actor browser border 2", kidRollCallActorBorder2, gokkNoHitKids) DEFAULT_POSITION(0, 0, 20) ACTION(fcustNil, fcustNil, fgrfstBrowserInvisible, kcrsArrow, chidNil, cidNil, cnoNil) ACTION(fcustNil, fcustNil, fgrfstBrowserEnabled, kcrsHand, CHID(kstBrowserEnabled, kchidClick), cidNil, kttRollCallActorFrame2) ACTION(fcustNil, fcustNil, fgrfstBrowserSelected, kcrsHand, CHID(kstBrowserEnabled, kchidClick), cidNil, kttRollCallActorFrame2) ENDCHUNK REP_MBMPREG(CHID(kstBrowserInvisible, krepDefault), "studio\bmp\rcact2.bmp", kxpregRollCallActorBorder2, kypregRollCallActorBorder2) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault), "studio\bmp\rcact2e.bmp", kxpregRollCallActorBorder2, kypregRollCallActorBorder2) REP_MBMPREG(CHID(kstBrowserSelected, krepDefault), "studio\bmp\rcact2s.bmp", kxpregRollCallActorBorder2, kypregRollCallActorBorder2) CREATE_SCRIPT("Actor Rollcall border 2 create frame") If(!FGobExists(kidRollCallActorFrame2)); CreateChildThis(kidRollCallActorFrame2, kidRollCallActorFrame2); MoveAbsGob(kidRollCallActorFrame2, kdxpRollCallActorLeft, kdypRollCallActorTop); End; ENDCHUNK CHILD_SCRIPT("RollCall Actor enabled/selected border/frame 2 clicked", CHID(kstBrowserEnabled, kchidClick)) EnqueueCid(cidBrowserSelect, kidRollCallActor, kidRollCallActorFrame2, 0, 0, 0); ENDCHUNK GOBCHUNK("RollCall Actor browser Frame 2", kidRollCallActorFrame2, kgokkRectNoHit) DEFAULT_POSITION(0, 0, 30) ACTION(fcustNil, fcustNil, fgrfstBrowserInvisible, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_RECT(CHID1(krepDefault), "thumb", 0, 0, kdxpRollCallActorRight, kdypRollCallActorBottom) REP_ANIM(CHID(kstBrowserInvisible, krepDefault), "Set state of parent border") Cell(CHID1(krepDefault), 0, 0, 10); ChangeStateGob(GidParThis(), StateThis()); ENDCHUNK ADOPT_ANIM(LAST_ANIM, CHID(kstBrowserEnabled, krepDefault)) ADOPT_ANIM(LAST_ANIM, CHID(kstBrowserSelected, krepDefault)) GOBCHUNK("RollCall Actor browser border 3", kidRollCallActorBorder3, gokkNoHitKids) DEFAULT_POSITION(0, 0, 20) ACTION(fcustNil, fcustNil, fgrfstBrowserInvisible, kcrsArrow, chidNil, cidNil, cnoNil) ACTION(fcustNil, fcustNil, fgrfstBrowserEnabled, kcrsHand, CHID(kstBrowserEnabled, kchidClick), cidNil, kttRollCallActorFrame3) ACTION(fcustNil, fcustNil, fgrfstBrowserSelected, kcrsHand, CHID(kstBrowserEnabled, kchidClick), cidNil, kttRollCallActorFrame3) ENDCHUNK REP_MBMPREG(CHID(kstBrowserInvisible, krepDefault), "studio\bmp\rcact3.bmp", kxpregRollCallActorBorder3, kypregRollCallActorBorder3) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault), "studio\bmp\rcact3e.bmp", kxpregRollCallActorBorder3, kypregRollCallActorBorder3) REP_MBMPREG(CHID(kstBrowserSelected, krepDefault), "studio\bmp\rcact3s.bmp", kxpregRollCallActorBorder3, kypregRollCallActorBorder3) CREATE_SCRIPT("Actor Rollcall border 3 create frame") If(!FGobExists(kidRollCallActorFrame3)); CreateChildThis(kidRollCallActorFrame3, kidRollCallActorFrame3); MoveAbsGob(kidRollCallActorFrame3, kdxpRollCallActorLeft, kdypRollCallActorTop); End; ENDCHUNK CHILD_SCRIPT("RollCall Actor enabled/selected border/frame 3 clicked", CHID(kstBrowserEnabled, kchidClick)) EnqueueCid(cidBrowserSelect, kidRollCallActor, kidRollCallActorFrame3, 0, 0, 0); ENDCHUNK GOBCHUNK("RollCall Actor browser Frame 3", kidRollCallActorFrame3, kgokkRectNoHit) DEFAULT_POSITION(0, 0, 30) ACTION(fcustNil, fcustNil, fgrfstBrowserInvisible, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_RECT(CHID1(krepDefault), "thumb", 0, 0, kdxpRollCallActorRight, kdypRollCallActorBottom) REP_ANIM(CHID(kstBrowserInvisible, krepDefault), "Set state of parent border") Cell(CHID1(krepDefault), 0, 0, 10); ChangeStateGob(GidParThis(), StateThis()); ENDCHUNK ADOPT_ANIM(LAST_ANIM, CHID(kstBrowserEnabled, krepDefault)) ADOPT_ANIM(LAST_ANIM, CHID(kstBrowserSelected, krepDefault)) GOBCHUNK("RollCall Actor browser border 4", kidRollCallActorBorder4, gokkNoHitKids) DEFAULT_POSITION(0, 0, 20) ACTION(fcustNil, fcustNil, fgrfstBrowserInvisible, kcrsArrow, chidNil, cidNil, cnoNil) ACTION(fcustNil, fcustNil, fgrfstBrowserEnabled, kcrsHand, CHID(kstBrowserEnabled, kchidClick), cidNil, kttRollCallActorFrame4) ACTION(fcustNil, fcustNil, fgrfstBrowserSelected, kcrsHand, CHID(kstBrowserEnabled, kchidClick), cidNil, kttRollCallActorFrame4) ENDCHUNK REP_MBMPREG(CHID(kstBrowserInvisible, krepDefault), "studio\bmp\rcact4.bmp", kxpregRollCallActorBorder4, kypregRollCallActorBorder4) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault), "studio\bmp\rcact4e.bmp", kxpregRollCallActorBorder4, kypregRollCallActorBorder4) REP_MBMPREG(CHID(kstBrowserSelected, krepDefault), "studio\bmp\rcact4s.bmp", kxpregRollCallActorBorder4, kypregRollCallActorBorder4) CREATE_SCRIPT("Actor Rollcall border 4 create frame") If(!FGobExists(kidRollCallActorFrame4)); CreateChildThis(kidRollCallActorFrame4, kidRollCallActorFrame4); MoveAbsGob(kidRollCallActorFrame4, kdxpRollCallActorLeft, kdypRollCallActorTop); End; ENDCHUNK CHILD_SCRIPT("RollCall Actor enabled/selected border/frame 4 clicked", CHID(kstBrowserEnabled, kchidClick)) EnqueueCid(cidBrowserSelect, kidRollCallActor, kidRollCallActorFrame4, 0, 0, 0); ENDCHUNK GOBCHUNK("RollCall Actor browser Frame 4", kidRollCallActorFrame4, kgokkRectNoHit) DEFAULT_POSITION(0, 0, 30) ACTION(fcustNil, fcustNil, fgrfstBrowserInvisible, kcrsArrow, chidNil, cidNil, cnoNil) ACTION(fcustNil, fcustNil, fgrfstBrowserEnabled, kcrsHand, chidNil, cidNil, kttRollCallActorFrame4) ACTION(fcustNil, fcustNil, fgrfstBrowserSelected, kcrsHand, chidNil, cidNil, kttRollCallActorFrame4) ENDCHUNK REP_RECT(CHID1(krepDefault), "thumb", 0, 0, kdxpRollCallActorRight, kdypRollCallActorBottom) REP_ANIM(CHID(kstBrowserInvisible, krepDefault), "Set state of parent border") Cell(CHID1(krepDefault), 0, 0, 10); ChangeStateGob(GidParThis(), StateThis()); ENDCHUNK ADOPT_ANIM(LAST_ANIM, CHID(kstBrowserEnabled, krepDefault)) ADOPT_ANIM(LAST_ANIM, CHID(kstBrowserSelected, krepDefault)) // No generic page up/down to be used here, so must create these btns explicitly. GOBCHUNK("RollCall Actor up arrow", kidRollCallActorUpArrow, kgokkRectHit) DEFAULT_POSITION(0, 0, 10) ACTION(fcustNil, fcustNil, fgrfstBrowserInvisible, kcrsArrow, chidNil, cidNil, cnoNil) ACTION(fcustNil, fcustNil, fgrfstBrowserEnabled, kcrsHand, CHID(kstBrowserEnabled, kchidClick), cidNil, kttRollCallActorUpArrow) ENDCHUNK REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault), "studio\bmp\rcaup.bmp", kxpregRollCallActorUp, kypregRollCallActorUp) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\rcaupc.bmp", kxpregRollCallActorUp, kypregRollCallActorUp) REP_MBMPREG(CHID(kstBrowserInvisible, krepDefault), "studio\bmp\rcaupd.bmp", kxpregRollCallActorUp, kypregRollCallActorUp) ADOPT_WAVE(kcnoBrwzBtnWav, CHID(kstBrowserEnabled, krepClicked)) CHILD_SCRIPT("RollCall Actor up arrow clicked", CHID(kstBrowserEnabled, kchidClick)) EnqueueCid(cidBrowserBack, kidRollCallActor, GidThis(), 0, 0, 0); ENDCHUNK GOBCHUNK("RollCall Actor down arrow", kidRollCallActorDownArrow, kgokkRectHit) DEFAULT_POSITION(0, 0, 10) ACTION(fcustNil, fcustNil, fgrfstBrowserInvisible, kcrsArrow, chidNil, cidNil, cnoNil) ACTION(fcustNil, fcustNil, fgrfstBrowserEnabled, kcrsHand, CHID(kstBrowserEnabled, kchidClick), cidNil, kttRollCallActorDownArrow) ENDCHUNK REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault), "studio\bmp\rcadwn.bmp", kxpregRollCallActorDown, kypregRollCallActorDown) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\rcadwnc.bmp", kxpregRollCallActorDown, kypregRollCallActorDown) REP_MBMPREG(CHID(kstBrowserInvisible, krepDefault), "studio\bmp\rcadwnd.bmp", kxpregRollCallActorDown, kypregRollCallActorDown) ADOPT_WAVE(kcnoBrwzBtnWav, CHID(kstBrowserEnabled, krepClicked)) CHILD_SCRIPT("RollCall Actor down arrow clicked", CHID(kstBrowserEnabled, kchidClick)) EnqueueCid(cidBrowserFwd, kidRollCallActor, GidThis(), 0, 0, 0); ENDCHUNK // // // Prop RollCall browser // // GOBCHUNK("RollCall Prop browser background", kidRollCallProp, kgokkRectHit) DEFAULT_POSITION(0, 0, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_RECT( CHID1( krepDefault ), "actor rollcall", kxpRollCallPropLeft, kypRollCallPropTop, kxpRollCallPropRight, kypRollCallPropBottom ) CREATE_SCRIPT("RollCall Prop browser created") // Create page up and page down btns. CreateChildThis(kidRollCallPropUpArrow, kidRollCallPropUpArrow); MoveAbsGob(kidRollCallPropUpArrow, kxpRollCallPropPageUp, kypRollCallPropPageUp); CreateChildThis(kidRollCallPropDownArrow, kidRollCallPropDownArrow); MoveAbsGob(kidRollCallPropDownArrow, kxpRollCallPropPageDown, kypRollCallPropPageDown); // Display Prop thumbnail frames on the browser. yp = kdypRollCallPropBorderTop; // Create four separate frames. CreateChildThis(kidRollCallPropBorder1, kidRollCallPropBorder1); MoveAbsGob(kidRollCallPropBorder1, kdxpRollCallPropBorderLeft, yp); yp += kdypRollCallPropSpacing + kdypRollCallPropBorder; CreateChildThis(kidRollCallPropBorder2, kidRollCallPropBorder2); MoveAbsGob(kidRollCallPropBorder2, kdxpRollCallPropBorderLeft, yp); yp += kdypRollCallPropSpacing + kdypRollCallPropBorder; CreateChildThis(kidRollCallPropBorder3, kidRollCallPropBorder3); MoveAbsGob(kidRollCallPropBorder3, kdxpRollCallPropBorderLeft, yp); yp += kdypRollCallPropSpacing + kdypRollCallPropBorder; CreateChildThis(kidRollCallPropBorder4, kidRollCallPropBorder4); MoveAbsGob(kidRollCallPropBorder4, kdxpRollCallPropBorderLeft, yp); ENDCHUNK // Create four separate frames here to allow different tooltips, (and bitmaps if necessary) GOBCHUNK("RollCall Prop browser border 1", kidRollCallPropBorder1, gokkNoHitKids) DEFAULT_POSITION(0, 0, 20) ACTION(fcustNil, fcustNil, fgrfstBrowserInvisible, kcrsArrow, chidNil, cidNil, cnoNil) ACTION(fcustNil, fcustNil, fgrfstBrowserEnabled, kcrsHand, CHID(kstBrowserEnabled, kchidClick), cidNil, kttRollCallPropFrame1) ACTION(fcustNil, fcustNil, fgrfstBrowserSelected, kcrsHand, CHID(kstBrowserEnabled, kchidClick), cidNil, kttRollCallPropFrame1) ENDCHUNK REP_MBMPREG(CHID(kstBrowserInvisible, krepDefault), "studio\bmp\rcp1.bmp", kxpregRollCallPropBorder1, kypregRollCallPropBorder1) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault), "studio\bmp\rcp1e.bmp", kxpregRollCallPropBorder1, kypregRollCallPropBorder1) REP_MBMPREG(CHID(kstBrowserSelected, krepDefault), "studio\bmp\rcp1s.bmp", kxpregRollCallPropBorder1, kypregRollCallPropBorder1) CREATE_SCRIPT("Prop Rollcall border 1 create frame") If(!FGobExists(kidRollCallPropFrame1)); CreateChildThis(kidRollCallPropFrame1, kidRollCallPropFrame1); MoveAbsGob(kidRollCallPropFrame1, kdxpRollCallPropLeft, kdypRollCallPropTop); End; ENDCHUNK CHILD_SCRIPT("RollCall Prop enabled/selected border/frame 1 clicked", CHID(kstBrowserEnabled, kchidClick)) EnqueueCid(cidBrowserSelect, kidRollCallProp, kidRollCallPropFrame1, 0, 0, 0); ENDCHUNK GOBCHUNK("RollCall Prop browser Frame 1", kidRollCallPropFrame1, kgokkRectNoHit) DEFAULT_POSITION(0, 0, 30) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_RECT(CHID1(krepDefault), "thumb", 0, 0, kdxpRollCallPropRight, kdypRollCallPropBottom) REP_ANIM(CHID(kstBrowserInvisible, krepDefault), "Set state of parent border") Cell(CHID1(krepDefault), 0, 0, 10); ChangeStateGob(GidParThis(), StateThis()); ENDCHUNK ADOPT_ANIM(LAST_ANIM, CHID(kstBrowserEnabled, krepDefault)) ADOPT_ANIM(LAST_ANIM, CHID(kstBrowserSelected, krepDefault)) GOBCHUNK("RollCall Prop browser border 2", kidRollCallPropBorder2, gokkNoHitKids) DEFAULT_POSITION(0, 0, 20) ACTION(fcustNil, fcustNil, fgrfstBrowserInvisible, kcrsArrow, chidNil, cidNil, cnoNil) ACTION(fcustNil, fcustNil, fgrfstBrowserEnabled, kcrsHand, CHID(kstBrowserEnabled, kchidClick), cidNil, kttRollCallPropFrame2) ACTION(fcustNil, fcustNil, fgrfstBrowserSelected, kcrsHand, CHID(kstBrowserEnabled, kchidClick), cidNil, kttRollCallPropFrame2) ENDCHUNK REP_MBMPREG(CHID(kstBrowserInvisible, krepDefault), "studio\bmp\rcp2.bmp", kxpregRollCallPropBorder2, kypregRollCallPropBorder2) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault), "studio\bmp\rcp2e.bmp", kxpregRollCallPropBorder2, kypregRollCallPropBorder2) REP_MBMPREG(CHID(kstBrowserSelected, krepDefault), "studio\bmp\rcp2s.bmp", kxpregRollCallPropBorder2, kypregRollCallPropBorder2) CREATE_SCRIPT("Prop Rollcall border 2 create frame") If(!FGobExists(kidRollCallPropFrame2)); CreateChildThis(kidRollCallPropFrame2, kidRollCallPropFrame2); MoveAbsGob(kidRollCallPropFrame2, kdxpRollCallPropLeft, kdypRollCallPropTop); End; ENDCHUNK CHILD_SCRIPT("RollCall Prop enabled/selected border/frame 2 clicked", CHID(kstBrowserEnabled, kchidClick)) EnqueueCid(cidBrowserSelect, kidRollCallProp, kidRollCallPropFrame2, 0, 0, 0); ENDCHUNK GOBCHUNK("RollCall Prop browser Frame 2", kidRollCallPropFrame2, kgokkRectNoHit) DEFAULT_POSITION(0, 0, 30) ACTION(fcustNil, fcustNil, fgrfstBrowserInvisible, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_RECT(CHID1(krepDefault), "thumb", 0, 0, kdxpRollCallPropRight, kdypRollCallPropBottom) REP_ANIM(CHID(kstBrowserInvisible, krepDefault), "Set state of parent border") Cell(CHID1(krepDefault), 0, 0, 10); ChangeStateGob(GidParThis(), StateThis()); ENDCHUNK ADOPT_ANIM(LAST_ANIM, CHID(kstBrowserEnabled, krepDefault)) ADOPT_ANIM(LAST_ANIM, CHID(kstBrowserSelected, krepDefault)) GOBCHUNK("RollCall Prop browser border 3", kidRollCallPropBorder3, gokkNoHitKids) DEFAULT_POSITION(0, 0, 20) ACTION(fcustNil, fcustNil, fgrfstBrowserInvisible, kcrsArrow, chidNil, cidNil, cnoNil) ACTION(fcustNil, fcustNil, fgrfstBrowserEnabled, kcrsHand, CHID(kstBrowserEnabled, kchidClick), cidNil, kttRollCallPropFrame3) ACTION(fcustNil, fcustNil, fgrfstBrowserSelected, kcrsHand, CHID(kstBrowserEnabled, kchidClick), cidNil, kttRollCallPropFrame3) ENDCHUNK REP_MBMPREG(CHID(kstBrowserInvisible, krepDefault), "studio\bmp\rcp3.bmp", kxpregRollCallPropBorder3, kypregRollCallPropBorder3) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault), "studio\bmp\rcp3e.bmp", kxpregRollCallPropBorder3, kypregRollCallPropBorder3) REP_MBMPREG(CHID(kstBrowserSelected, krepDefault), "studio\bmp\rcp3s.bmp", kxpregRollCallPropBorder3, kypregRollCallPropBorder3) CREATE_SCRIPT("Prop Rollcall border 3 create frame") If(!FGobExists(kidRollCallPropFrame3)); CreateChildThis(kidRollCallPropFrame3, kidRollCallPropFrame3); MoveAbsGob(kidRollCallPropFrame3, kdxpRollCallPropLeft, kdypRollCallPropTop); End; ENDCHUNK CHILD_SCRIPT("RollCall Prop enabled/selected border/frame 3 clicked", CHID(kstBrowserEnabled, kchidClick)) EnqueueCid(cidBrowserSelect, kidRollCallProp, kidRollCallPropFrame3, 0, 0, 0); ENDCHUNK GOBCHUNK("RollCall Prop browser Frame 3", kidRollCallPropFrame3, kgokkRectNoHit) DEFAULT_POSITION(0, 0, 30) ACTION(fcustNil, fcustNil, fgrfstBrowserInvisible, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_RECT(CHID1(krepDefault), "thumb", 0, 0, kdxpRollCallPropRight, kdypRollCallPropBottom) REP_ANIM(CHID(kstBrowserInvisible, krepDefault), "Set state of parent border") Cell(CHID1(krepDefault), 0, 0, 10); ChangeStateGob(GidParThis(), StateThis()); ENDCHUNK ADOPT_ANIM(LAST_ANIM, CHID(kstBrowserEnabled, krepDefault)) ADOPT_ANIM(LAST_ANIM, CHID(kstBrowserSelected, krepDefault)) GOBCHUNK("RollCall Prop browser border 4", kidRollCallPropBorder4, gokkNoHitKids) DEFAULT_POSITION(0, 0, 20) ACTION(fcustNil, fcustNil, fgrfstBrowserInvisible, kcrsArrow, chidNil, cidNil, cnoNil) ACTION(fcustNil, fcustNil, fgrfstBrowserEnabled, kcrsHand, CHID(kstBrowserEnabled, kchidClick), cidNil, kttRollCallPropFrame4) ACTION(fcustNil, fcustNil, fgrfstBrowserSelected, kcrsHand, CHID(kstBrowserEnabled, kchidClick), cidNil, kttRollCallPropFrame4) ENDCHUNK REP_MBMPREG(CHID(kstBrowserInvisible, krepDefault), "studio\bmp\rcp4.bmp", kxpregRollCallPropBorder4, kypregRollCallPropBorder4) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault), "studio\bmp\rcp4e.bmp", kxpregRollCallPropBorder4, kypregRollCallPropBorder4) REP_MBMPREG(CHID(kstBrowserSelected, krepDefault), "studio\bmp\rcp4s.bmp", kxpregRollCallPropBorder4, kypregRollCallPropBorder4) CREATE_SCRIPT("Prop Rollcall border 4 create frame") If(!FGobExists(kidRollCallPropFrame4)); CreateChildThis(kidRollCallPropFrame4, kidRollCallPropFrame4); MoveAbsGob(kidRollCallPropFrame4, kdxpRollCallPropLeft, kdypRollCallPropTop); End; ENDCHUNK CHILD_SCRIPT("RollCall Prop enabled/selected border/frame 4 clicked", CHID(kstBrowserEnabled, kchidClick)) EnqueueCid(cidBrowserSelect, kidRollCallProp, kidRollCallPropFrame4, 0, 0, 0); ENDCHUNK GOBCHUNK("RollCall Prop browser Frame 4", kidRollCallPropFrame4, kgokkRectNoHit) DEFAULT_POSITION(0, 0, 30) ACTION(fcustNil, fcustNil, fgrfstBrowserInvisible, kcrsArrow, chidNil, cidNil, cnoNil) ACTION(fcustNil, fcustNil, fgrfstBrowserEnabled, kcrsHand, chidNil, cidNil, kttRollCallPropFrame4) ACTION(fcustNil, fcustNil, fgrfstBrowserSelected, kcrsHand, chidNil, cidNil, kttRollCallPropFrame4) ENDCHUNK REP_RECT(CHID1(krepDefault), "thumb", 0, 0, kdxpRollCallPropRight, kdypRollCallPropBottom) REP_ANIM(CHID(kstBrowserInvisible, krepDefault), "Set state of parent border") Cell(CHID1(krepDefault), 0, 0, 10); ChangeStateGob(GidParThis(), StateThis()); ENDCHUNK ADOPT_ANIM(LAST_ANIM, CHID(kstBrowserEnabled, krepDefault)) ADOPT_ANIM(LAST_ANIM, CHID(kstBrowserSelected, krepDefault)) // No generic page up/down to be used here, so must create these btns explicitly. GOBCHUNK("RollCall Prop up arrow", kidRollCallPropUpArrow, kgokkRectHit) DEFAULT_POSITION(0, 0, 10) ACTION(fcustNil, fcustNil, fgrfstBrowserInvisible, kcrsArrow, chidNil, cidNil, cnoNil) ACTION(fcustNil, fcustNil, fgrfstBrowserEnabled, kcrsHand, CHID(kstBrowserEnabled, kchidClick), cidNil, kttRollCallPropUpArrow) ENDCHUNK REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault), "studio\bmp\rcpup.bmp", kxpregRollCallPropUp, kypregRollCallPropUp) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\rcpupc.bmp", kxpregRollCallPropUp, kypregRollCallPropUp) REP_MBMPREG(CHID(kstBrowserInvisible, krepDefault), "studio\bmp\rcpupd.bmp", kxpregRollCallPropUp, kypregRollCallPropUp) ADOPT_WAVE(kcnoBrwzBtnWav, CHID(kstBrowserEnabled, krepClicked)) CHILD_SCRIPT("RollCall Prop up arrow clicked", CHID(kstBrowserEnabled, kchidClick)) EnqueueCid(cidBrowserBack, kidRollCallProp, GidThis(), 0, 0, 0); ENDCHUNK GOBCHUNK("RollCall Prop down arrow", kidRollCallPropDownArrow, kgokkRectHit) DEFAULT_POSITION(0, 0, 10) ACTION(fcustNil, fcustNil, fgrfstBrowserInvisible, kcrsArrow, chidNil, cidNil, cnoNil) ACTION(fcustNil, fcustNil, fgrfstBrowserEnabled, kcrsHand, CHID(kstBrowserEnabled, kchidClick), cidNil, kttRollCallPropDownArrow) ENDCHUNK REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault), "studio\bmp\rcpdwn.bmp", kxpregRollCallPropDown, kypregRollCallPropDown) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\rcpdwnc.bmp", kxpregRollCallPropDown, kypregRollCallPropDown) REP_MBMPREG(CHID(kstBrowserInvisible, krepDefault), "studio\bmp\rcpdwnd.bmp", kxpregRollCallPropDown, kypregRollCallPropDown) ADOPT_WAVE(kcnoBrwzBtnWav, CHID(kstBrowserEnabled, krepClicked)) CHILD_SCRIPT("RollCall Prop down arrow clicked", CHID(kstBrowserEnabled, kchidClick)) EnqueueCid(cidBrowserFwd, kidRollCallProp, GidThis(), 0, 0, 0); ENDCHUNK ================================================ FILE: src/studio/browser.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** browser.cpp Author: Sean Selitrennikoff Date: March, 1995 Review Status: Reviewed This file contains the browser display code. Browsers (abbrev Brws) include display, list and text classes. Studio Independent Browsers: BASE --> CMH --> GOK --> BRWD (Browser display class) BRWD --> BRWL (Browser list class; chunky based) BRWD --> BRWT (Browser text class) BRWD --> BRWL --> BRWN (Browser named list class) Studio Dependent Browsers: BRWD --> BRWR (Roll call class) BRWD --> BRWT --> BRWA (Browser action class) BRWD --> BRWL --> BRWP (Browser prop/actor class) BRWD --> BRWL --> BRWB (Browser background class) BRWD --> BRWL --> BRWC (Browser camera class) BRWD --> BRWL --> BRWN --> BRWM (Browser music class) BRWD --> BRWL --> BRWN --> BRWM --> BRWI (Browser import sound class) Note: An "frm" refers to the displayed frames on any page. A "thum" is a generic Browser Thumbnail, which may be a chid, cno, cnoPar, gob, stn, etc. A browser will display, over multiple pages, as many browser entities as there are thum's. This file contains the browser display code. To add additional browsers, create a derived class of the BRWD, BRWL or BRWT classes. If a browser is to be chunky file based, the BRWL class can be used. It includes GOKD chunks which are grandchildren of _ckiRoot (cnoNil implies wildcarding) and children of _ctgContent - from .thd files entered in the registry of this product. The BRWL class allows the option of displaying either all the thumbnails of a particular ctg across registry specified directories (eg, scenes, actors) -or- of filling frames from GOKD thumbnails which are children of a single given chunk. Text class browsers (BRWT) create child TGOBs for each frame. Only cidBrowserCancel and cidBrowserOk exit the browser. cidBrowserSelect is selection only, not application of the selection. On creation of a new browser, pcmd->rglw[0] = kid of Browser (type) pcmd->rglw[1] = kid first frame. Thumb kid is this + kidBrowserThumbOffset pcmd->rglw[2] = kid of first control pcmd->rglw[3] = x,y offsets Upon exiting, some browser classes retain BRCN (or derived from BRCN) context information for optimization. The kid of a single frame may be overridden (eg, for project help) using the override prids. ***************************************************************************/ #include "soc.h" #include "studio.h" ASSERTNAME RTCLASS(BRCN) RTCLASS(BRCNL) RTCLASS(BRWD) RTCLASS(BRWL) RTCLASS(BRWT) RTCLASS(BRWA) RTCLASS(BRWP) RTCLASS(BRWB) RTCLASS(BRWC) RTCLASS(BRWN) RTCLASS(BRWM) RTCLASS(BRWR) RTCLASS(BRWI) RTCLASS(BCL) RTCLASS(BCLS) RTCLASS(FNET) BEGIN_CMD_MAP(BRWD, GOK) ON_CID_GEN(cidBrowserFwd, &BRWD::FCmdFwd, pvNil) ON_CID_GEN(cidBrowserBack, &BRWD::FCmdBack, pvNil) ON_CID_GEN(cidBrowserCancel, &BRWD::FCmdCancel, pvNil) ON_CID_GEN(cidBrowserOk, &BRWD::FCmdOk, pvNil) ON_CID_GEN(cidBrowserSelect, &BRWD::FCmdSelect, pvNil) ON_CID_GEN(cidBrowserSelectThum, &BRWD::FCmdSelectThum, pvNil) ON_CID_GEN(cidPortfolioFile, &BRWD::FCmdFile, pvNil) ON_CID_GEN(cidBrowserChangeCel, &BRWD::FCmdChangeCel, pvNil) ON_CID_GEN(cidBrowserDel, &BRWD::FCmdDel, pvNil) END_CMD_MAP_NIL() /**************************************************** * * Create a browser display object * * Returns: * A pointer to the object, else pvNil. * ****************************************************/ PBRWD BRWD::PbrwdNew(PRCA prca, long kidPar, long kidGlass) { AssertPo(prca, 0); PBRWD pbrwd; GCB gcb; if (!_FBuildGcb(&gcb, kidPar, kidGlass)) return pvNil; if ((pbrwd = NewObj BRWD(&gcb)) == pvNil) return pvNil; // Initialize the gok if (!pbrwd->_FInitGok(prca, kidGlass)) { ReleasePpo(&pbrwd); return pvNil; } return pbrwd; } /**************************************************** * * Build the GOB creation block * ****************************************************/ bool BRWD::_FBuildGcb(GCB *pgcb, long kidPar, long kidGlass) { AssertVarMem(pgcb); PGOB pgobPar; RC rcRel; pgobPar = vapp.Pkwa()->PgobFromHid(kidPar); if (pvNil == pgobPar) { TrashVar(pgcb); return fFalse; } #ifdef DEBUG Assert(pgobPar->FIs(kclsGOK), "Parent isn't a GOK"); { PGOB pgob = vapp.Pkwa()->PgobFromHid(kidGlass); Assert(pgob == pvNil, "GOK already exists with given ID"); } #endif // DEBUG rcRel.Set(krelZero, krelZero, krelOne, krelOne); pgcb->Set(kidGlass, pgobPar, fgobNil, kginDefault, pvNil, &rcRel); return fTrue; } /**************************************************** * * Initialize the Gok : * Do everything PgokNew would have done but didn't * ****************************************************/ bool BRWD::_FInitGok(PRCA prca, long kid) { AssertBaseThis(0); AssertPo(prca, 0); if (!BRWD_PAR::_FInit(vapp.Pkwa(), kid, prca)) return fFalse; if (!_FEnterState(ksnoInit)) return fFalse; return fTrue; } /**************************************************** * * Initialize a new browser object * Init knows how to either initialize or reinitialize * itself on reinstantiation of a browser. * * NOTE: This does not display - see FDraw() * * On input, * ithumSelect is the thumbnail to be hilited * ithumDisplay is a thumbnail to be on the first * page displayed * pcmd->rglw[0] = kid of Browser (type) * pcmd->rglw[1] = kid first frame. Thumb kid is * this + kidBrowserThumbOffset * pcmd->rglw[2] = kid of first control * pcmd->rglw[3] = x,y offsets * ****************************************************/ void BRWD::Init(PCMD pcmd, long ithumSelect, long ithumDisplay, PSTDIO pstdio, bool fWrapScroll, long cthumScroll) { AssertThis(0); AssertVarMem(pcmd); // Split the initialization into two parts. The first part initializes the // state variables and can be done before the number of thumbnails on the // browser is known. The second part of the initialization relates to // browser display and requires the number of thumbnails to be known. _InitStateVars(pcmd, pstdio, fWrapScroll, cthumScroll); _InitFromData(pcmd, ithumSelect, ithumDisplay); } /**************************************************** * * Initialize state variables for a new browser object. * A call will be made later to InitFromData to finish * the browser initialization based on thumbnail specific * information. * * On input, * pcmd->rglw[0] = kid of Browser (type) * pcmd->rglw[1] = kid first frame. Thumb kid is * this + kidBrowserThumbOffset * pcmd->rglw[2] = kid of first control * pcmd->rglw[3] = x,y offsets * ****************************************************/ void BRWD::_InitStateVars(PCMD pcmd, PSTDIO pstdio, bool fWrapScroll, long cthumScroll) { AssertThis(0); AssertVarMem(pcmd); // Save parameters for this browser _pstdio = pstdio; _kidFrmFirst = pcmd->rglw[1]; _kidControlFirst = pcmd->rglw[2]; _dxpFrmOffset = SwHigh(pcmd->rglw[3]); _dypFrmOffset = SwLow(pcmd->rglw[3]); _cthumScroll = cthumScroll; _fWrapScroll = fWrapScroll; _fNoRepositionSel = fFalse; } /**************************************************** * * Complete the initialization of a new browser object. * The number of thumbnails for this browser has * already been determined. This call follows a * call to InitStateVars earlier. * * On input, * ithumSelect is the thumbnail to be hilited * ithumDisplay is a thumbnail to be on the first * page displayed * ****************************************************/ void BRWD::_InitFromData(PCMD pcmd, long ithumSelect, long ithumDisplay) { AssertThis(0); long cthum; // Context carryover if (_pbrcn != pvNil) { _pbrcn->brwdid = pcmd->rglw[0]; } // Initialize variables cthum = _Cthum(); AssertIn(ithumDisplay, -1, cthum); AssertIn(ithumSelect, -1, cthum); _ithumSelect = ithumSelect; _cfrmPageCur = 0; _cfrm = _CfrmCalc(); _SetScrollState(); // Set the state of the scroll arrows // Adjust the display ifrm to begin at a page boundary if (ithumDisplay != ivNil) _ithumPageFirst = ithumDisplay; _SetVarForOverride(); _CalcIthumPageFirst(); } /**************************************************** * * _SetVarForOverride : Projects may override kids * ****************************************************/ void BRWD::_SetVarForOverride(void) { AssertThis(0); long thumOverride = -1; long thumSidOverride = -1; // Projects need to be able to hard wire one of the gob id's if (vpappb->FGetProp(kpridBrwsOverrideThum, &thumOverride) && vpappb->FGetProp(kpridBrwsOverrideSidThum, &thumSidOverride) && vpappb->FGetProp(kpridBrwsOverrideKidThum, &_kidThumOverride)) { if (thumOverride >= 0) { _ithumOverride = _IthumFromThum(thumOverride, thumSidOverride); // Make sure this thum is on the displayed page _ithumPageFirst = _ithumOverride; } else { _kidThumOverride = -1; _ithumOverride = -1; } } } /**************************************************** * * _GetThumFromIthum * ****************************************************/ void BRWD::_GetThumFromIthum(long ithum, void *pThumSelect, long *psid) { AssertThis(0); AssertVarMem((long *)pThumSelect); AssertVarMem(psid); *((long *)pThumSelect) = ithum; TrashVar(psid); } /**************************************************** * * Count the number of frames possible per page * ****************************************************/ long BRWD::_CfrmCalc(void) { AssertThis(0); PGOB pgob; long ifrm; for (ifrm = 0;; ifrm++) { // // If there is no GOKD parent, there are no more thumbnail // slots on this page // pgob = vapp.Pkwa()->PgobFromHid(_kidFrmFirst + ifrm); if (pvNil == pgob) { return ifrm; } AssertPo(pgob, 0); } return 0; } /**************************************************** * * Determine the first thumbnail to display on the page * ****************************************************/ void BRWD::_CalcIthumPageFirst(void) { AssertThis(0); long cthum = _Cthum(); // Place the selection as close to the top as _cthumScroll permits if (!_fNoRepositionSel || _cthumScroll == ivNil) { if (_cthumScroll != ivNil) _ithumPageFirst = _ithumPageFirst - (_ithumPageFirst % _cthumScroll); else _ithumPageFirst = _ithumPageFirst - (_ithumPageFirst % _cfrm); } // Verify that the viewed thumbnail is within range if (_ithumPageFirst >= cthum) { if (cthum == 0) _ithumPageFirst = 0; else if (_cthumScroll != ivNil) _ithumPageFirst = (cthum - 1) - ((cthum - 1) % _cthumScroll); else _ithumPageFirst = (cthum - 1) - ((cthum - 1) % _cfrm); } // Display a full last page if not wrapping around if (!_fWrapScroll && (_ithumPageFirst + _cfrm > cthum) && _cthumScroll != ivNil) { while ((_ithumPageFirst - _cthumScroll) + _cfrm >= cthum) _ithumPageFirst -= _cthumScroll; if (_ithumPageFirst < 0) _ithumPageFirst = 0; } } /**************************************************** * * Browser Display * ****************************************************/ bool BRWD::FDraw(void) { AssertThis(0); PGOB pgobPar; GCB gcb; long ithum; long ifrm; long cthum = _Cthum(); _CalcIthumPageFirst(); // Begin a new page _cfrmPageCur = 0; for (ifrm = 0; ifrm < _cfrm; ifrm++) { ithum = _ithumPageFirst + ifrm; // Release the previouly attached thum from this frame _ReleaseThumFrame(ifrm); pgobPar = vapp.Pkwa()->PgobFromHid(_kidFrmFirst + ifrm); if (pvNil == pgobPar) goto LContinue; Assert(pgobPar->FIs(kclsGOK), "Invalid class"); if (ithum >= cthum) { // Render invisible ((PGOK)pgobPar)->FChangeState(kstBrowserInvisible); // Ignore error _FClearHelp(ifrm); // Clear rollover help continue; } // Get next gob from list if (!_FSetThumFrame(ithum, pgobPar)) goto LContinue; if (ithum == _ithumSelect) { ((PGOK)pgobPar)->FChangeState(kstBrowserSelected); } else { ((PGOK)pgobPar)->FChangeState(kstBrowserEnabled); } LContinue: if (ithum < cthum) _cfrmPageCur++; } // Update page number if (pvNil != _ptgobPage) { long pagen; long cpage; STN stn; STN stnT; pagen = (_cfrm == 0) ? 0 : (_ithumPageFirst / _cfrm); cpage = ((cthum - 1) / _cfrm) + 1; _pstdio->GetStnMisc(idsBrowserPage, &stnT); stn.FFormat(&stnT, pagen + 1, cpage); _ptgobPage->SetText(&stn); } return fTrue; } /**************************************************** * * Find a unique hid for the current frame * ****************************************************/ long BRWD::_KidThumFromIfrm(long ifrm) { AssertBaseThis(0); long kidThum; if (_ithumPageFirst + ifrm == _ithumOverride) kidThum = _kidThumOverride; else kidThum = GOB::HidUnique(); return kidThum; } /**************************************************** * * Compute the pgob of the parent for frame ifrm * ****************************************************/ PGOB BRWD::_PgobFromIfrm(long ifrm) { AssertBaseThis(0); PGOB pgob; pgob = vapp.Pkwa()->PgobFromHid(_kidFrmFirst + ifrm); if (pvNil == pgob) return pvNil; return pgob->PgobLastChild(); } /**************************************************** * * Set the state of the scroll arrows for the Display * ****************************************************/ void BRWD::_SetScrollState(void) { AssertThis(0); PGOB pgob; long st = (_Cthum() <= _cfrm) ? kstBrowserInvisible : kstBrowserEnabled; pgob = vapp.Pkwa()->PgobFromHid(_kidControlFirst); if (pvNil != pgob) { Assert(pgob->FIs(kclsGOK), "Invalid class"); if (!((PGOK)pgob)->FChangeState(st)) Warn("Failed to change state Page Fwd button"); } pgob = vapp.Pkwa()->PgobFromHid(_kidControlFirst + 1); if (pvNil != pgob) { Assert(pgob->FIs(kclsGOK), "Invalid class"); if (!((PGOK)pgob)->FChangeState(st)) Warn("Failed to change state Page Back button"); } } /**************************************************** * * Browser Command Handler : Browser Forward * ****************************************************/ bool BRWD::FCmdFwd(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); long cthumAdd; // Default _cthumScroll -> page scrolling if (ivNil == _cthumScroll) cthumAdd = _cfrm; else cthumAdd = _cthumScroll; // If either wrapping or there is more to see, increment first thumbnail index if (_fWrapScroll || (_ithumPageFirst + _cfrm < _Cthum())) _ithumPageFirst += cthumAdd; if (_ithumPageFirst >= _Cthum()) { _ithumPageFirst = 0; } FDraw(); // Ignore failure return fTrue; } /**************************************************** * * Browser Command Handler : * Set viewing page based on thumSelect == rglw[0] * and sid == rglw[1] * rglw[2] -> Hilite * rglw[3] -> Update Lists * ****************************************************/ bool BRWD::FCmdSelectThum(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); if (pcmd->rglw[3] != 0) { if (!_FUpdateLists()) return fTrue; } if (pcmd->rglw[2] > 0) _ithumSelect = _IthumFromThum(pcmd->rglw[0], pcmd->rglw[1]); else _ithumSelect = -1; _ithumPageFirst = _ithumSelect - (_ithumSelect % _cfrm); _SetScrollState(); // Set the state of the scroll arrows FDraw(); // Ignore failure return fTrue; } /**************************************************** * * Browser Command Handler : Browser Back * Scroll back one page in the browser * ****************************************************/ bool BRWD::FCmdBack(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); if (_ithumPageFirst == 0) { if (_fWrapScroll) { // Wrap back to the last page _ithumPageFirst = _Cthum() - (_Cthum() % _cfrm); } } else { // Normal non-wrap page scroll back if (ivNil == _cthumScroll) _ithumPageFirst -= _cfrmPageCur; else _ithumPageFirst -= _cthumScroll; } // FDraw updates _cfrmPageCur FDraw(); // Ignore failure return fTrue; } /**************************************************** * * Browser Command Handler : Browser Frame Selected * (Thumbnail clicked) * * The script is expected to make the BrowserOK call * FCmdSelect does not exit * * pcmd->rglw[0] is browser id of thumb * ****************************************************/ bool BRWD::FCmdSelect(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); long ifrmSelect = pcmd->rglw[0] - _kidFrmFirst; _UnhiliteCurFrm(); _ithumSelect = _ithumPageFirst + ifrmSelect; _FHiliteFrm(ifrmSelect); // Handle any derived class special actions (eg previews) _ProcessSelection(); return fTrue; } /**************************************************** * * Create Tgob's for any of the text based browsers * These will be destroyed when the browser exits * NOTE:: FCreateAllTgob() requires previous initialization * of the override parameters from BRWD::Init() * ****************************************************/ bool BRWD::FCreateAllTgob(void) { AssertThis(0); long ifrm; long hid; PTGOB ptgob; RC rcAbs; RC rcRel; for (ifrm = 0; ifrm < _cfrm; ifrm++) { if (_ithumPageFirst + ifrm == _ithumOverride) hid = _kidThumOverride; else hid = hidNil; ptgob = TGOB::PtgobCreate(_kidFrmFirst + ifrm, _idsFont, tavTop, hid); if (pvNil == ptgob) return fFalse; ptgob->SetAlign(tahLeft); ptgob->GetPos(&rcAbs, &rcRel); rcAbs.Inset(_dxpFrmOffset, _dypFrmOffset); ptgob->SetPos(&rcAbs, &rcRel); } return fTrue; } /**************************************************** * * Hilite frame * ****************************************************/ bool BRWD::_FHiliteFrm(long ifrmSelect) { AssertThis(0); AssertIn(ifrmSelect, 0, _cfrm); PGOB pgob; // Hilite currently selected frame AssertIn(ifrmSelect, 0, _cfrmPageCur); pgob = vapp.Pkwa()->PgobFromHid(_kidFrmFirst + ifrmSelect); if (pvNil == pgob) return fFalse; Assert(pgob->FIs(kclsGOK), "Invalid class"); if (!((PGOK)pgob)->FChangeState(kstBrowserSelected)) { _ithumSelect = ivNil; return fFalse; } return fTrue; } /**************************************************** * * Unhilite currently selected Frame * ****************************************************/ void BRWD::_UnhiliteCurFrm(void) { AssertThis(0); PGOB pgob; long ifrmSelectOld = _ithumSelect - _ithumPageFirst; // Unhilite currently selected frame if ((_ithumPageFirst <= _ithumSelect) && (_ithumPageFirst + _cfrmPageCur > _ithumSelect)) { pgob = vapp.Pkwa()->PgobFromHid(_kidFrmFirst + ifrmSelectOld); if (pvNil == pgob) return; Assert(pgob->FIs(kclsGOK), "Invalid class"); ((PGOK)pgob)->FChangeState(kstBrowserEnabled); // Ignore failure } } /**************************************************** * * Browser Command Handler : Browser Cancel * Exit without applying selection * ****************************************************/ bool BRWD::FCmdCancel(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); vpsndm->StopAll(); Release(); // OK/Cancel common cleanup return fTrue; } /**************************************************** * * Browser cleanup for OK & Cancel * ****************************************************/ void BRWD::Release(void) { _CacheContext(); // Minimize the cache size on low mem machines _SetCbPcrmMin(); BRWD_PAR::Release(); } /**************************************************** * * Browser Command Handler : Browser Ok * Apply selection & exit * ****************************************************/ bool BRWD::FCmdOk(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); long sid; long thumSelect; _pstdio->SetDisplayCast(fFalse); if (ivNil != _ithumSelect) { // Get Selection from virtual function _GetThumFromIthum(_ithumSelect, &thumSelect, &sid); // Apply the selection (could take awhile) vapp.BeginLongOp(); _ApplySelection(thumSelect, sid); vapp.EndLongOp(); } // Cleanup & Dismiss browser Release(); return fTrue; } /**************************************************** * * BRWD _CacheContext * ****************************************************/ void BRWD::_CacheContext(void) { if (_pbrcn != pvNil) _pbrcn->ithumPageFirst = _ithumPageFirst; } /**************************************************** Browser Lists Derived from the BRWD display class ****************************************************/ /**************************************************** * * Create a browser list object * * Returns: * A pointer to the view, else pvNil. * ****************************************************/ PBRWL BRWL::PbrwlNew(PRCA prca, long kidPar, long kidGlass) { AssertPo(prca, 0); PBRWL pbrwl; PGOK pgok; GCB gcb; if (!_FBuildGcb(&gcb, kidPar, kidGlass)) return pvNil; if ((pbrwl = NewObj BRWL(&gcb)) == pvNil) return pvNil; // Initialize the gok if (!pbrwl->_FInitGok(prca, kidGlass)) { ReleasePpo(&pbrwl); return pvNil; } // // Stop the studio action button animation while // any browser is up. // pgok = (PGOK)vapp.Pkwa()->PgobFromHid(kidActorsActionBrowser); if ((pgok != pvNil) && pgok->FIs(kclsGOK)) { Assert(pgok->FIs(kclsGOK), "Invalid class"); pgok->FChangeState(kstFreeze); } return pbrwl; } /**************************************************** * * Initialize a browser list object * * Returns: * A pointer to the view, else pvNil. * * On Input, * bws is the browser selection type * thumSelect is the thumbnail to be hilited * ****************************************************/ bool BRWL::FInit(PCMD pcmd, BWS bws, long thumSelect, long sidSelect, CKI ckiRoot, CTG ctgContent, PSTDIO pstdio, PBRCNL pbrcnl, bool fWrapScroll, long cthumScroll) { AssertThis(0); AssertVarMem(pcmd); long ithumDisplay; long ccrf = 1; long ithumSelect; bool fBuildGl; _bws = bws; _kidFrmFirst = pcmd->rglw[1]; _cfrm = _CfrmCalc(); // Initialize the state variables for the browser. This is required for // the creation of the tgobs beneath the call to _FCreateBuildThd below. // The call must be later followed by a call to BRWD::InitFromData(). _InitStateVars(pcmd, pstdio, fWrapScroll, cthumScroll); if (pvNil == pbrcnl || pbrcnl->brwdid == 0 || pbrcnl->ckiRoot.cno != ckiRoot.cno) { fBuildGl = fTrue; // Cache the GOKD's by first creating a // chunky resource manager Assert(pvNil == _pcrm, "Logic error releasing pcrm"); _pcrm = CRM::PcrmNew(ccrf); if (pvNil == _pcrm) goto LDismiss; if (!_FInitNew(pcmd, bws, thumSelect, ckiRoot, ctgContent)) { goto LDismiss; } _cthumCD = _pglthd->IvMac(); } else { // Reinitialize based on pbrcnl fBuildGl = fFalse; _cthumCD = pbrcnl->cthumCD; _pglthd = pbrcnl->pglthd; Assert(_cthumCD == _pglthd->IvMac(), "Logic error"); _pglthd->AddRef(); _pgst = pbrcnl->pgst; if (_pgst != pvNil) _pgst->AddRef(); _pcrm = pbrcnl->pcrm; _pcrm->AddRef(); for (long icrf = 0; icrf < _pcrm->Ccrf(); icrf++) _pcrm->PcrfGet(icrf)->SetCbMax(kcbMaxCrm); // First thumbnail on display page is inherited _ithumPageFirst = pbrcnl->ithumPageFirst; // This will make sure that we build any TGOBs if (!_FCreateBuildThd(ckiRoot, ctgContent, fBuildGl)) goto LDismiss; } // Context carryover Assert(_pbrcn == pvNil, "Lost BRCN"); _pbrcn = pbrcnl; if (pvNil != pbrcnl) { _pbrcn->AddRef(); pbrcnl->ckiRoot = ckiRoot; if (fBuildGl) { // Rebuilding the GL -> // Remove old context // Save new context later /* Release */ ReleasePpo(&pbrcnl->pglthd); ReleasePpo(&pbrcnl->pgst); ReleasePpo(&pbrcnl->pcrm); } } // Virtual function - used, eg., by sound browser to include user sounds _FUpdateLists(); ithumSelect = _IthumFromThum(thumSelect, sidSelect); if (fBuildGl) { // Display the selection if one exists if (ithumSelect != ivNil) ithumDisplay = ithumSelect; else ithumDisplay = _IthumFromThum(_thumDefault, _sidDefault); } else { // Display last page shown ithumDisplay = ivNil; } // Now initialize the display part of the browser. _InitFromData(pcmd, ithumSelect, ithumDisplay); vapp.DisableAccel(); _fEnableAccel = fTrue; return fTrue; LDismiss: return fFalse; } /**************************************************** * * Initialization specific to the first time a list * browser is invoked * ****************************************************/ bool BRWL::_FInitNew(PCMD pcmd, BWS bws, long thumSelect, CKI ckiRoot, CTG ctgContent) { AssertThis(0); // Selection type _bws = bws; // Set the display default _sidDefault = ((APP *)vpappb)->SidProduct(); if (!vpappb->FGetProp(kpridBrwsDefaultThum, &_thumDefault)) { Warn("couldn't get property kpridBrwsDefaultThum"); _thumDefault = 0; } // Build the Thd if (!_FCreateBuildThd(ckiRoot, ctgContent)) { return fFalse; } return fTrue; } /**************************************************** * * Initialization * Called each time a browser is either first * instantiated or reinvoked. * * Each browser will have its own cache of gokd's. * The cache will vanish when the browser goes * away. * ****************************************************/ bool BRWL::_FCreateBuildThd(CKI ckiRoot, CTG ctgContent, bool fBuildGl) { AssertThis(0); _fSinglePar = (ckiRoot.cno != cnoNil); _ckiRoot = ckiRoot; _ctgContent = ctgContent; if (fBuildGl) { // // Create the gl's // if (pvNil == (_pglthd = GL::PglNew(size(THD), kglthdGrow))) return fFalse; _pglthd->SetMinGrow(kglthdGrow); } if (!_FGetContent(_pcrm, &ckiRoot, ctgContent, fBuildGl)) goto LFail; if (_Cthum() == 0) { PushErc(ercSocNoThumbnails); return fFalse; } if (fBuildGl) _SortThd(); return fTrue; LFail: return fFalse; } /**************************************************** * * BRWL _FGetContent : Enum files & build the THD * ****************************************************/ bool BRWL::_FGetContent(PCRM pcrm, CKI *pcki, CTG ctg, bool fBuildGl) { AssertThis(0); bool fRet = fFalse; PBCL pbcl = pvNil; if (!fBuildGl) return fTrue; // // Enumerate the files & build the THD // Assert(ctg != cnoNil || pcki->ctg == ctgNil, "Invalid browser call"); pbcl = BCL::PbclNew(pcrm, pcki, ctg, _pglthd); if (pbcl == pvNil) goto LFail; /* We passed the pglthd and pgst in, so no need to get them back before releasing the BCLS */ Assert(_pglthd->CactRef() > 1, "GL of THDs will be lost!"); fRet = fTrue; LFail: ReleasePpo(&pbcl); return fRet; } /**************************************************** * * Get list selection from the ithum * Virtual function * ****************************************************/ void BRWL::_GetThumFromIthum(long ithum, void *pvthumSelect, long *psid) { AssertThis(0); AssertIn(ithum, 0, _Cthum()); AssertVarMem(psid); THD thd{}; if (_bws == kbwsIndex) { *psid = thd.tag.sid; *((long *)pvthumSelect) = ithum; return; } _pglthd->Get(ithum, &thd); *psid = thd.tag.sid; switch (_bws) { case kbwsChid: Assert(thd.chid != chidNil, "Bogus sort order for THD list"); *((CHID *)pvthumSelect) = thd.chid; break; case kbwsCnoRoot: *((CNO *)pvthumSelect) = thd.tag.cno; break; default: Bug("Unhandled bws case"); } return; } /**************************************************** * * BRWL _CacheContext for reentry into the browser * ****************************************************/ void BRWL::_CacheContext(void) { if (_pbrcn != pvNil) { PBRCNL pbrcnl = (PBRCNL)_pbrcn; Assert(pbrcnl->FIs(kclsBRCNL), "Bad context buffer"); BRWL_PAR::_CacheContext(); if (pbrcnl->pglthd == pvNil) { Assert(pbrcnl->pgst == pvNil, "Inconsistent state"); Assert(pbrcnl->pcrm == pvNil, "Inconsistent state"); /* Copy */ pbrcnl->pglthd = _pglthd; pbrcnl->pgst = _pgst; pbrcnl->pcrm = _pcrm; /* AddRef */ pbrcnl->pglthd->AddRef(); if (pbrcnl->pgst != pvNil) pbrcnl->pgst->AddRef(); pbrcnl->pcrm->AddRef(); } else { Assert(pbrcnl->pglthd == _pglthd, "Inconsistent state"); Assert(pbrcnl->pgst == _pgst, "Inconsistent state"); Assert(pbrcnl->pcrm == _pcrm, "Inconsistent state"); } /* Munge */ /* Should never fail, since we should never be growing */ AssertDo(pbrcnl->pglthd->FSetIvMac(_cthumCD), "Tried to grow pglthd (bad) and failed (also bad)"); if (pbrcnl->pgst != pvNil) { long istn; istn = pbrcnl->pgst->IstnMac(); while (istn > _cthumCD) pbrcnl->pgst->Delete(--istn); } for (long icrf = 0; icrf < _pcrm->Ccrf(); icrf++) _pcrm->PcrfGet(icrf)->SetCbMax(kcbMaxCrm); pbrcnl->cthumCD = _cthumCD; } } /**************************************************** * * Sort the Thd gl by _bws * Uses bubble sort * ****************************************************/ void BRWL::_SortThd(void) { AssertThis(0); long ithd; long jthd; long *plwJ, *plwI; THD thdi; THD thdj; long sid; long jthdMin = 0; bool fSortBySid; if (_bws == kbwsIndex) return; switch (_bws) { case kbwsChid: Assert(size(thdj.chidThum) == size(long), "Bad pointer cast"); plwJ = (long *)&thdj.chidThum; plwI = (long *)&thdi.chidThum; fSortBySid = fFalse; break; case kbwsCnoRoot: Assert(size(thdj.tag.cno) == size(long), "Bad pointer cast"); plwJ = (long *)&thdj.tag.cno; plwI = (long *)&thdi.tag.cno; fSortBySid = fTrue; break; default: Bug("Illegal _bws value"); } if (fSortBySid && _pglthd->IvMac() > 0) { _pglthd->Get(0, &thdi); sid = thdi.tag.sid; } for (ithd = 1; ithd < _pglthd->IvMac(); ithd++) { _pglthd->Get(ithd, &thdi); if (fSortBySid && thdi.tag.sid != sid) { sid = thdi.tag.sid; jthdMin = ithd; } for (jthd = jthdMin; jthd < ithd; jthd++) { _pglthd->Get(jthd, &thdj); if (*plwJ < *plwI) continue; // Allow products to share identical content // but only view it once if (*plwJ == *plwI) { long ithdT; THD thdT; if (pvNil != _pgst && thdi.ithd < _pgst->IvMac()) { Assert(thdi.ithd == ithd, "Logic error cleaning pgst"); _pgst->Delete(thdi.ithd); } for (ithdT = ithd + 1; ithdT < _pglthd->IvMac(); ithdT++) { _pglthd->Get(ithdT, &thdT); thdT.ithd--; _pglthd->Put(ithdT, &thdT); } #ifdef DEBUG // Note: Files for the current product was enumerated first. // This determines precedence. if (thdj.tag.sid == _sidDefault || thdi.tag.sid == _sidDefault) Assert(thdj.tag.sid == _sidDefault, "Browser deleting the wrong duplicate"); #endif // DEBUG _pglthd->Delete(ithd); ithd--; break; } // Switch places _pglthd->Put(ithd, &thdj); _pglthd->Put(jthd, &thdi); _pglthd->Get(ithd, &thdi); } } } /**************************************************** * * Get the index to the Thi for the given selection * Note: The selection thumSelect is a cno, chid, etc, * not an index into either pgl. * ****************************************************/ long BRWL::_IthumFromThum(long thumSelect, long sidSelect) { AssertThis(0); long *plw; THD thd; if (thumSelect == ivNil) return ivNil; switch (_bws) { case kbwsIndex: return thumSelect; case kbwsChid: Assert(size(thd.chid) == size(long), "Bad pointer cast"); plw = (long *)&thd.chid; break; case kbwsCnoRoot: Assert(size(thd.tag.cno) == size(long), "Bad pointer cast"); plw = (long *)&thd.tag.cno; break; default: Assert(0, "Invalid _bws"); } for (long ithd = 0; ithd < _pglthd->IvMac(); ithd++) { _pglthd->Get(ithd, &thd); if ((*plw == thumSelect) && (sidSelect == ksidInvalid || thd.tag.sid == sidSelect)) { return ithd; } } Warn("Selection not available"); return ivNil; } /**************************************************** * * Sets the ith Gob as a child of the current frame * Advance the gob (thumbnail) index * ****************************************************/ bool BRWL::_FSetThumFrame(long ithd, PGOB pgobPar) { AssertThis(0); AssertPo(pgobPar, 0); THD thd; PGOK pgok; RC rcAbs; RC rcRel; long kidThum; // Associate the gob with the current frame _pglthd->Get(ithd, &thd); kidThum = _KidThumFromIfrm(_cfrmPageCur); pgok = vapp.Pkwa()->PgokNew(pgobPar, kidThum, thd.cno, _pcrm); if (pvNil == pgok) return fFalse; ((PGOB)pgok)->GetPos(&rcAbs, &rcRel); rcAbs.Offset(_dxpFrmOffset, _dypFrmOffset); ((PGOB)pgok)->SetPos(&rcAbs, &rcRel); return fTrue; } /**************************************************** * * Release previous thum from frame ifrm * Assumes gob based. * ****************************************************/ void BRWL::_ReleaseThumFrame(long ifrm) { AssertThis(0); PGOB pgob; // Release previous gob associated with the current frame pgob = _PgobFromIfrm(ifrm); if (pvNil != pgob) { ReleasePpo(&pgob); } } /**************************************************** * * BCL class routines * ****************************************************/ PBCL BCL::PbclNew(PCRM pcrm, CKI *pckiRoot, CTG ctgContent, PGL pglthd, bool fOnlineOnly) { PBCL pbcl; pbcl = NewObj BCL; if (pbcl == pvNil) return pvNil; if (!pbcl->_FInit(pcrm, pckiRoot, ctgContent, pglthd)) ReleasePpo(&pbcl); return pbcl; } bool BCLS::_FInit(PCRM pcrm, CKI *pckiRoot, CTG ctgContent, PGST pgst, PGL pglthd) { AssertNilOrPo(pgst, 0); if (pgst == pvNil) { if ((pgst = GST::PgstNew()) == pvNil) goto LFail; } else pgst->AddRef(); _pgst = pgst; if (!BCLS_PAR::_FInit(pcrm, pckiRoot, ctgContent, pglthd)) goto LFail; return fTrue; LFail: return fFalse; } bool BCL::_FInit(PCRM pcrm, CKI *pckiRoot, CTG ctgContent, PGL pglthd) { AssertNilOrPo(pcrm, 0); Assert(pckiRoot->ctg != ctgNil, "Bad CKI"); AssertNilOrPo(pglthd, 0); if (pglthd == pvNil) { if ((pglthd = GL::PglNew(size(THD))) == pvNil) goto LFail; } else pglthd->AddRef(); _pglthd = pglthd; _ctgRoot = pckiRoot->ctg; _cnoRoot = pckiRoot->cno; _ctgContent = ctgContent; _fDescend = _cnoRoot != cnoNil; Assert(!_fDescend || _ctgContent != ctgNil, "Bad initialization"); if (!_FBuildThd(pcrm)) goto LFail; return fTrue; LFail: return fFalse; } PBCLS BCLS::PbclsNew(PCRM pcrm, CKI *pckiRoot, CTG ctgContent, PGL pglthd, PGST pgst, bool fOnlineOnly) { PBCLS pbcls; pbcls = NewObj BCLS; if (pbcls == pvNil) goto LFail; if (!pbcls->_FInit(pcrm, pckiRoot, ctgContent, pgst, pglthd)) ReleasePpo(&pbcls); LFail: return pbcls; } /**************************************************** * * Enumerate thumbnail files & create the THD * (Thumbnail descriptor gl) * * Note: In the case of actions & views, this is one * entry. * Input: fBuildGl is false if only the pcrm requires * initialization; otherwise the _pglthd is built. * * Sort based on _bws (browser selection flag) * ****************************************************/ bool BCL::_FBuildThd(PCRM pcrm) { AssertThis(0); AssertNilOrPo(pcrm, 0); bool fRet = fTrue; PCFL pcfl; long sid; FNET fnet; FNI fniThd; if (!fnet.FInit()) return fFalse; while (fnet.FNext(&fniThd, &sid) && fRet) { if (fniThd.Ftg() != kftgThumbDesc) continue; pcfl = CFL::PcflOpen(&fniThd, fcflNil); if (pvNil == pcfl) { // Error reported elsewhere continue; } /* Don't use this file if it doesn't have what we're looking for */ if (_fDescend ? !pcfl->FFind(_ctgRoot, _cnoRoot) : pcfl->CckiCtg(_ctgRoot) == 0) { goto LContinue; } // Add the file to the crm if (pcrm != pvNil && !pcrm->FAddCfl(pcfl, kcbMaxCrm)) { // fatal error fRet = fFalse; goto LContinue; } if (!_FAddFileToThd(pcfl, sid)) { // Error issued elsewhere fRet = fFalse; goto LContinue; } LContinue: ReleasePpo(&pcfl); } return fRet; } /**************************************************** * * Add the chunks of file pcfl to the THD * * Requires pre-definition of _ckiRoot, _ctgContent * * Filtering is based on ctg, cno, but not chid * A value of cnoNil => wild card search * ****************************************************/ bool BCL::_FAddFileToThd(PCFL pcfl, long sid) { AssertThis(0); AssertPo(pcfl, 0); long ickiRoot; long cckiRoot; CKI ckiRoot; KID kidPar; long ikidPar; long ckidPar; Assert(ctgNil != _ctgRoot, "Illegal call"); if (!_fDescend) cckiRoot = pcfl->CckiCtg(_ctgRoot); else { ckiRoot.ctg = _ctgRoot; ckiRoot.cno = _cnoRoot; cckiRoot = 1; } // For each grandparent, define ckiRoot for (ickiRoot = 0; ickiRoot < cckiRoot; ickiRoot++) { if (!_fDescend) { // Get the cki of the grandparent if (!pcfl->FGetCkiCtg(_ctgRoot, ickiRoot, &ckiRoot)) return fFalse; // // If only one level of parent specified in the search // then add the gokd from this parent and continue // if (!_FAddGokdToThd(pcfl, sid, &ckiRoot)) return fFalse; continue; } // // Drop down one more level // if (!pcfl->FFind(ckiRoot.ctg, ckiRoot.cno)) continue; ckidPar = pcfl->Ckid(ckiRoot.ctg, ckiRoot.cno); for (ikidPar = 0; ikidPar < ckidPar; ikidPar++) { if (!pcfl->FGetKid(ckiRoot.ctg, ckiRoot.cno, ikidPar, &kidPar)) return fFalse; if (kidPar.cki.ctg != _ctgContent) continue; // On failure, continue to add other files // Error reported elsewhere _FAddGokdToThd(pcfl, sid, &kidPar); } } return fTrue; } bool BCL::_FAddGokdToThd(PCFL pcfl, long sid, CKI *pcki) { KID kid; kid.cki = *pcki; kid.chid = chidNil; return _FAddGokdToThd(pcfl, sid, &kid); } /**************************************************** * * Add a single GOKD to the THD * The GOKD is a child of ckiPar. * cnoPar is read from the ckiPar chunk * ****************************************************/ bool BCL::_FAddGokdToThd(PCFL pcfl, long sid, KID *pkid) { AssertThis(0); AssertPo(pcfl, 0); AssertVarMem(pkid); CKI cki = pkid->cki; KID kid; THD thd; BLCK blck; TFC tfc; // Read the Par chunk to find the cno of the CD content if (!pcfl->FFind(cki.ctg, cki.cno, &blck) || !blck.FUnpackData()) { goto LFail; } if (blck.Cb() != size(TFC)) goto LFail; if (!blck.FReadRgb(&tfc, size(TFC), 0)) goto LFail; if (kboCur != tfc.bo) SwapBytesBom(&tfc, kbomTfc); Assert(kboCur == tfc.bo, "bad TFC"); if (!_fDescend) { thd.tag.cno = tfc.cno; thd.tag.ctg = tfc.ctg; } else { thd.tag.ctg = tfc.ctg; thd.chid = tfc.chid; } Assert(thd.grfontMask == tfc.grfontMask, "Font style browser broken"); Assert(thd.grfont == tfc.grfont, "Font style browser broken"); thd.tag.sid = sid; thd.chidThum = pkid->chid; if (pcfl->FGetKidChidCtg(cki.ctg, cki.cno, 0, kctgGokd, &kid)) thd.cno = kid.cki.cno; else { // If there are no GOKD children, enter the reference to the named // parent chunk thd.cno = tfc.cno; } thd.ithd = _pglthd->IvMac(); if (!_pglthd->FInsert(thd.ithd, &thd)) goto LFail; return fTrue; LFail: return fFalse; } bool BCLS::_FAddGokdToThd(PCFL pcfl, long sid, KID *pkid) { AssertThis(0); AssertPo(pcfl, 0); AssertVarMem(pkid); if (!_FSetNameGst(pcfl, pkid->cki.ctg, pkid->cki.cno)) goto LFail; if (!BCLS_PAR::_FAddGokdToThd(pcfl, sid, pkid)) goto LFail; return fTrue; LFail: return fFalse; } /**************************************************** * * Save the name of the Par chunk in the Gst * ****************************************************/ bool BCLS::_FSetNameGst(PCFL pcfl, CTG ctg, CNO cno) { AssertThis(0); AssertPo(pcfl, 0); STN stn; if (!pcfl->FGetName(ctg, cno, &stn)) return fFalse; if (!_pgst->FAddStn(&stn)) return fFalse; return fTrue; } /**************************************************** * * Enumerate thumbnail files * * Initialization * ****************************************************/ bool FNET::FInit(void) { AssertThis(0); FTG ftgThd = kftgThumbDesc; vapp.GetFniProduct(&_fniDirProduct); // look for THD files in the product FIRST _fniDir = _fniDirProduct; _fniDirMSK = _fniDirProduct; _fInitMSKDir = fTrue; if (!_fniDirMSK.FUpDir(pvNil, ffniMoveToDir)) return fFalse; if (!_fne.FInit(&_fniDir, &ftgThd, 1)) return fFalse; _fInited = fTrue; return fTrue; } /**************************************************** * * Enumerate thumbnail files * * Return the fni & (optionally) the sid * Note: _idir == 0 -> current product * ****************************************************/ bool FNET::FNext(FNI *pfni, long *psid) { AssertThis(0); AssertPo(pfni, 0); AssertNilOrVarMem(psid); FTG ftgThd = kftgThumbDesc; FTG ftgDir = kftgDir; STN stnProduct; if (!_fInited) return fFalse; // Return files from currently enumerated directory // Note: This returns files from current product before // initializing _fneDir if (_FNextFni(pfni, psid)) return fTrue; if (_fInitMSKDir) { if (!_fneDir.FInit(&_fniDirMSK, &ftgDir, 1)) return fFalse; _fInitMSKDir = fFalse; } while (_fneDir.FNextFni(&_fniDir)) { if (_fniDir.FSameDir(&_fniDirProduct)) // already enumerated continue; if (!_fne.FInit(&_fniDir, &ftgThd, 1)) // Initialize the file enumeration return fFalse; if (_FNextFni(pfni, psid)) return fTrue; } return fFalse; // all done } /**************************************************** * * Gets the file from the current FNET enumeration * This uses the current fne. * ****************************************************/ bool FNET::_FNextFni(FNI *pfni, long *psid) { AssertThis(0); STN stnProduct; Assert(_fniDir.Ftg() == kftgDir, "Logic error"); if (pvNil != psid) { if (!_fniDir.FUpDir(&stnProduct, ffniNil)) return fFalse; if (!vptagm->FGetSid(&stnProduct, psid)) return fFalse; } return (_fne.FNextFni(pfni)); } /**************************************************** * * BRWN Initialization * -> BRWL Initialization plus tgob creation * ****************************************************/ bool BRWN::FInit(PCMD pcmd, BWS bws, long thumSelect, long sidSelect, CKI ckiRoot, CTG ctgContent, PSTDIO pstdio, PBRCNL pbrcnl, bool fWrapScroll, long cthumScroll) { AssertThis(0); AssertVarMem(pcmd); if (!BRWN_PAR::FInit(pcmd, bws, thumSelect, sidSelect, ckiRoot, ctgContent, pstdio, pbrcnl, fWrapScroll, cthumScroll)) { return fFalse; } if (!FCreateAllTgob()) return fFalse; return fTrue; } /**************************************************** * * Build the thd * ****************************************************/ bool BRWN::_FGetContent(PCRM pcrm, CKI *pcki, CTG ctg, bool fBuildGl) { AssertThis(0); bool fRet = fFalse; PBCLS pbcls = pvNil; if (!fBuildGl) { return fTrue; } if (pvNil == (_pgst = GST::PgstNew(0))) goto LFail; // // Enumerate the files & build the THD // Assert(ctg != cnoNil || pcki->ctg == ctgNil, "Invalid browser call"); pbcls = BCLS::PbclsNew(pcrm, pcki, ctg, _pglthd, _pgst); if (pbcls == pvNil) goto LFail; /* We passed the pglthd and pgst in, so no need to get them back before releasing the BCLS */ Assert(_pglthd->CactRef() > 1, "GL of THDs will be lost!"); Assert(_pgst->CactRef() > 1, "GST will be lost!"); fRet = fTrue; LFail: ReleasePpo(&pbcls); return fRet; } /**************************************************** * * Removes the text from the unused tgob * ****************************************************/ void BRWN::_ReleaseThumFrame(long ifrm) { AssertThis(0); AssertIn(ifrm, 0, _cfrm); STN stn; PGOB pgob; pgob = _PgobFromIfrm(ifrm); if (pvNil != pgob) { stn.SetNil(); ((PTGOB)pgob)->SetText(&stn); } // The BRWN class retains the tgob while the browser is up } /**************************************************** * * Sets the ith text item in the child of the * current frame * ****************************************************/ bool BRWN::_FSetThumFrame(long ithd, PGOB pgobPar) { AssertThis(0); AssertIn(ithd, 0, _pglthd->IvMac()); AssertPo(pgobPar, 0); PTGOB ptgob; STN stnLabel; THD thd; _pglthd->Get(ithd, &thd); _pgst->GetStn(thd.ithd, &stnLabel); ptgob = (PTGOB)(pgobPar->PgobFirstChild()); Assert(pvNil != ptgob, "No TGOB for the text"); if (pvNil != ptgob) ptgob->SetText(&stnLabel); return fTrue; } /**************************************************** * * Browser Command Handler : Browser Ok * Apply selection & exit * ****************************************************/ bool BRWN::FCmdOk(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); if (ivNil == _ithumSelect) { TAG tag; PMVU pmvu; pmvu = (PMVU)(_pstdio->Pmvie()->PddgGet(0)); tag.sid = ksidInvalid; tag.pcrf = pvNil; pmvu->SetTagTool(&tag); // No need to close tag with ksidInvalid } if (BRWD::FCmdOk(pcmd)) { // // Stop any playing sounds in a sound browser. We do // not stop playing sounds in non-sound browsers, // because the selection sound may be playing. // vpsndm->StopAll(); return fTrue; } return fFalse; } /**************************************************** * * Create a BRoWser Music Sound object * ****************************************************/ PBRWM BRWM::PbrwmNew(PRCA prca, long kidGlass, long sty, PSTDIO pstdio) { AssertPo(prca, 0); AssertPo(pstdio, 0); PBRWM pbrwm; GCB gcb; if (!_FBuildGcb(&gcb, kidBackground, kidGlass)) return pvNil; if ((pbrwm = NewObj BRWM(&gcb)) == pvNil) return pvNil; // Initialize the gok if (!pbrwm->_FInitGok(prca, kidGlass)) { ReleasePpo(&pbrwm); return pvNil; } pbrwm->_sty = sty; pbrwm->_pstdio = pstdio; if (!pstdio->Pmvie()->FEnsureAutosave(&pbrwm->_pcrf)) { ReleasePpo(&pbrwm); return pvNil; } pbrwm->_ptgobPage = TGOB::PtgobCreate(kidBrowserPageNum, idsBrwsPageFont, tavCenter); return pbrwm; } /**************************************************** * * Add all of the sounds of the movie from _pcrf * to the current BRWL lists: * pglthd, pgst * * Used at initialization time by both the BRWI and * the BRWM classes. * * It is assumed that initialization has created * (if empty) lists at this point. * ****************************************************/ bool BRWM::_FUpdateLists(void) { AssertThis(0); STN stn; THD thd; long ithd; long ithdOld; long ccki; long icki; CKI cki; TAG tag; PMSND pmsnd = pvNil; PCFL pcfl = _pcrf->Pcfl(); // Enum through current movie for user sounds // For each one, extend the lists to include the new sound ccki = pcfl->CckiCtg(kctgMsnd); for (icki = 0; icki < ccki; icki++) { if (!pcfl->FGetCkiCtg(kctgMsnd, icki, &cki)) goto LNext; tag.sid = ksidUseCrf; // Non-CD-loaded content tag.pcrf = _pcrf; tag.ctg = kctgMsnd; tag.cno = cki.cno; // Read the msnd chunk and continue if sty's do not match pmsnd = (PMSND)vptagm->PbacoFetch(&tag, MSND::FReadMsnd); if (pvNil == pmsnd) goto LNext; // Don't add user sounds multiple times on mult reinstantiations if (_FSndListed(cki.cno, &ithdOld)) { if (pmsnd->FValid()) goto LNext; // Remove invalid snds from the lists _pglthd->Delete(ithdOld); _pgst->Delete(ithdOld); for (ithd = ithdOld; ithd < _pglthd->IvMac(); ithd++) { _pglthd->Get(ithd, &thd); thd.ithd--; _pglthd->Put(ithd, &thd); } goto LNext; } if (_sty != pmsnd->Sty()) goto LNext; if (!pmsnd->FValid()) goto LNext; if (!pcfl->FGetName(kctgMsnd, cki.cno, &stn)) goto LNext; if (!_FAddThd(&stn, &cki)) goto LNext; LNext: ReleasePpo(&pmsnd); } return fTrue; } /**************************************************** * * Test to see if a sound is already in the lists * ****************************************************/ bool BRWM::_FSndListed(CNO cno, long *pithd) { AssertBaseThis(0); long ithd; THD *pthd; for (ithd = _cthumCD; ithd < _pglthd->IvMac(); ithd++) { pthd = (THD *)_pglthd->QvGet(ithd); if (pthd->tag.cno == cno) { if (pvNil != pithd) *pithd = ithd; return fTrue; } } return fFalse; } /**************************************************** * * Extend the BRWL lists * ****************************************************/ bool BRWM::_FAddThd(STN *pstn, CKI *pcki) { AssertBaseThis(0); THD thd; if (!_pgst->FAddStn(pstn)) return fFalse; ; thd.tag.sid = ksidUseCrf; thd.tag.pcrf = _pcrf; thd.tag.ctg = pcki->ctg; thd.tag.cno = pcki->cno; thd.cno = cnoNil; // unused thd.chidThum = chidNil; // unused thd.ithd = _pglthd->IvMac(); if (!_pglthd->FAdd(&thd)) goto LFail1; return fTrue; LFail1: _pgst->Delete(_pgst->IstnMac() - 1); return fFalse; } /**************************************************** * * Process Browser Music Selection * Process selection from either main sound browser or * Import sound browser * ****************************************************/ void BRWM::_ProcessSelection(void) { AssertThis(0); PMSND pmsnd; TAG tag; long thumSelect; long sid; // Get Selection from virtual function _GetThumFromIthum(_ithumSelect, &thumSelect, &sid); tag.sid = sid; tag.pcrf = (ksidUseCrf == sid) ? _pcrf : pvNil; tag.ctg = kctgMsnd; tag.cno = (CNO)thumSelect; if (!vptagm->FCacheTagToHD(&tag)) { Warn("cache tag failed"); return; } pmsnd = (PMSND)vptagm->PbacoFetch(&tag, MSND::FReadMsnd); if (pvNil == pmsnd) return; pmsnd->Play(0, fFalse, fFalse, pmsnd->Vlm(), fTrue); ReleasePpo(&pmsnd); return; } /**************************************************** * * Browser Command Handler : (For importing sounds) * This command will be generated following portfolio * execution * ****************************************************/ bool BRWM::FCmdFile(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); FNI fni; long kidBrws; PFIL pfil = pvNil; // Wave or midi file PCFL pcfl = pvNil; // Movie file long icki; long ccki; STN stn; CKI cki; CMD cmd; vapp.GetPortfolioDoc(&fni); vpappb->BeginLongOp(); switch (fni.Ftg()) { case kftgMidi: // The non-score browsers only import wav files Assert(_sty == styMidi, "Portfolio should filter out Wave for this browser"); if (_sty != styMidi) goto LEnd; cki.ctg = kctgMidi; break; case kftgWave: Assert(_sty != styMidi, "Portfolio should filter out Midi for this browser"); // The score browser does not import wave files if (_sty == styMidi) goto LEnd; cki.ctg = kctgWave; break; case kftg3mm: default: // Import sounds from a movie // Verify version numbers before accepting this file pcfl = CFL::PcflOpen(&fni, fcflNil); if (pvNil == pcfl) goto LEnd; if (!_pstdio->Pmvie()->FVerifyVersion(pcfl)) { goto LEnd; // Erc already pushed } ccki = pcfl->CckiCtg(kctgMsnd); if (ccki == 0) { // There may be sounds in the new movie, but no user sounds PushErc(ercSocNoKidSndsInMovie); goto LEnd; } // Are the user sounds valid? for (icki = 0; icki < ccki; icki++) { bool fInvalid; long sty; if (!pcfl->FGetCkiCtg(kctgMsnd, icki, &cki)) goto LEnd; if (!MSND::FGetMsndInfo(pcfl, kctgMsnd, cki.cno, &fInvalid, &sty)) goto LEnd; if (!fInvalid && sty == _sty) goto LValidSnds; // There are valid user snds } PushErc(ercSocNoKidSndsInMovie); goto LEnd; LValidSnds: // Bring up a new import browser on top of this one // Launch the script switch (_sty) { case stySfx: kidBrws = kidBrwsImportFX; break; case stySpeech: kidBrws = kidBrwsImportSpeech; break; case styMidi: kidBrws = kidBrwsImportMidi; break; default: Assert(0, "Invalid _sty in browser"); break; } // Tell the script to launch the import browser & send a // cidBrowserReady to kidBrws when ready vpcex->EnqueueCid(cidLaunchImport, pvNil, pvNil, kidBrws); goto LEnd; break; } // Import sound from a wave or midi file pfil = FIL::PfilOpen(&fni); if (pvNil == pfil) goto LEnd; // Error will have been reported // Read the file & store as a chunk in the current movie if (!_pstdio->Pmvie()->FCopySndFileToMvie(pfil, _sty, &cki.cno)) goto LEnd; // Error will have been reported // Add (eg) the movie sounds from &fni to the current // browser lists, which are BRWL derived. cki.ctg = kctgMsnd; fni.GetLeaf(&stn); // name of sound if (!_FAddThd(&stn, &cki)) goto LEnd; // Select the item, extend lists, hilite it & redraw cmd.rglw[0] = cki.cno; cmd.rglw[1] = ksidUseCrf; cmd.rglw[2] = 1; // Hilite cmd.rglw[3] = 0; // Lists already updated if (!FCmdSelectThum(&cmd)) goto LEnd; LEnd: vpappb->EndLongOp(); ReleasePpo(&pcfl); ReleasePpo(&pfil); return fTrue; } /**************************************************** * * Browser Command Handler : (For deleting user snds) * ****************************************************/ bool BRWM::FCmdDel(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); long sid; TAG tag; PTAG ptag; PMSND pmsnd; STN stnErr; STN stnSnd; PMVU pmvu; if (_ithumSelect < _cthumCD) return fTrue; // CD Sounds cannot be deleted pmvu = (PMVU)(_pstdio->Pmvie()->PddgGet(0)); AssertPo(pmvu, 0); _pgst->GetStn(_ithumSelect, &stnSnd); // Display the sound name in the help topic. AssertDo(vapp.FGetStnApp(idsDeleteSound, &stnErr), "String not present"); if (vapp.TModal(vapp.PcrmAll(), ktpcQuerySoundDelete, &stnErr, bkYesNo, kstidQuerySoundDelete, &stnSnd) != tYes) { return fTrue; } // Delete the midi or wave child chunk from the msnd // Invalidate the sound tag.sid = ksidUseCrf; // Non-CD-loaded content tag.pcrf = _pcrf; tag.ctg = kctgMsnd; _GetThumFromIthum(_ithumSelect, &tag.cno, &sid); pmsnd = (PMSND)vptagm->PbacoFetch(&tag, MSND::FReadMsnd); if (pvNil == pmsnd) return fTrue; if (!pmsnd->FInvalidate()) Warn("Error invalidating sound"); ReleasePpo(&pmsnd); if (!_FUpdateLists()) { Release(); // Release browser; labels might be wrong return fTrue; } if (_ithumPageFirst >= _pglthd->IvMac()) _ithumPageFirst--; if (_ithumPageFirst < 0) _ithumPageFirst = 0; _ithumSelect = ivNil; // Clear the selection if deleted tag.sid = ksidInvalid; ptag = pmvu->PtagTool(); if (ptag->sid == ksidUseCrf && ptag->cno == tag.cno) { pmvu->SetTagTool(&tag); // No need to close tag with ksidInvalid } else if (ptag->sid != ksidInvalid) { // Show current cursor selection _ithumSelect = _IthumFromThum(ptag->cno, ptag->sid); } _SetScrollState(); // Set the state of the scroll arrows _pstdio->Pmvie()->Pmsq()->StopAll(); FDraw(); return fTrue; } /**************************************************** * * Create a browser text object * * Returns: * A pointer to the object, else pvNil. * ****************************************************/ PBRWT BRWT::PbrwtNew(PRCA prca, long kidPar, long kidGlass) { AssertPo(prca, 0); PBRWT pbrwt; GCB gcb; if (!_FBuildGcb(&gcb, kidPar, kidGlass)) return pvNil; if ((pbrwt = NewObj BRWT(&gcb)) == pvNil) return pvNil; // Initialize the gok if (!pbrwt->_FInitGok(prca, kidGlass)) { ReleasePpo(&pbrwt); return pvNil; } pbrwt->_pgst = pvNil; return pbrwt; } /**************************************************** * * Set the Gst for BRWT text * ****************************************************/ void BRWT::SetGst(PGST pgst) { AssertThis(0); AssertPo(pgst, 0); ReleasePpo(&_pgst); _pgst = pgst; _pgst->AddRef(); } /**************************************************** * * Initialize BRWT TGOB & text * ****************************************************/ bool BRWT::FInit(PCMD pcmd, long thumSelect, long thumDisplay, PSTDIO pstdio, bool fWrapScroll, long cthumScroll) { AssertThis(0); AssertVarMem(pcmd); BRWD::Init(pcmd, thumSelect, thumDisplay, pstdio, fWrapScroll, cthumScroll); // // Create the tgob's for each frame on the page // if (!FCreateAllTgob()) return fFalse; vapp.DisableAccel(); _fEnableAccel = fTrue; return fTrue; } /**************************************************** * * Sets the ith text item in the child of the * current frame * ****************************************************/ bool BRWT::_FSetThumFrame(long istn, PGOB pgobPar) { AssertThis(0); AssertIn(istn, 0, _pgst->IvMac()); AssertPo(pgobPar, 0); PTGOB ptgob; STN stnLabel; _pgst->GetStn(istn, &stnLabel); ptgob = (PTGOB)(pgobPar->PgobFirstChild()); Assert(pvNil != ptgob, "No TGOB for the text"); if (pvNil != ptgob) { Assert(ptgob->FIs(kclsTGOB), "GOB isn't a TGOB"); if (ptgob->FIs(kclsTGOB)) { ptgob->SetText(&stnLabel); return fTrue; } } return fFalse; } /**************************************************** * * Create a BRoWser ActioN object * * Returns: * A pointer to the view, else pvNil. * ****************************************************/ PBRWA BRWA::PbrwaNew(PRCA prca) { AssertPo(prca, 0); PBRWA pbrwa; PGOK pgok; GCB gcb; if (!_FBuildGcb(&gcb, kidBackground, kidActionGlass)) return pvNil; if ((pbrwa = NewObj BRWA(&gcb)) == pvNil) return pvNil; // Initialize the gok if (!pbrwa->_FInitGok(prca, kidActionGlass)) { ReleasePpo(&pbrwa); return pvNil; } // // Stop the action browser animation while the browser is up. // pgok = (PGOK)vapp.Pkwa()->PgobFromHid(kidActorsActionBrowser); if ((pgok != pvNil) && pgok->FIs(kclsGOK)) { Assert(pgok->FIs(kclsGOK), "Invalid class"); pgok->FChangeState(kstSelected); } pbrwa->_ptgobPage = TGOB::PtgobCreate(kidBrowserPageNum, idsBrwsPageFont, tavCenter); return pbrwa; } /**************************************************** * * Build the ape * ****************************************************/ bool BRWA::FBuildApe(PACTR pactr) { AssertThis(0); AssertPo(pactr, 0); COST cost; PGOK pgokFrame; RC rcRel; GCB gcb; if (!cost.FGet(pactr->Pbody())) return fFalse; pgokFrame = (PGOK)vapp.Pkwa()->PgobFromHid(kidBrwsActionPrev); Assert(pgokFrame->FIs(kclsGOK), "Invalid class"); rcRel.Set(krelZero, krelZero, krelOne, krelOne); gcb.Set(kidBrwsActionPrev, pgokFrame, fgobNil, kginDefault, pvNil, &rcRel); _pape = APE::PapeNew(&gcb, pactr->Ptmpl(), &cost, pactr->AnidCur(), fTrue); if (pvNil == _pape) return fFalse; return fTrue; } /*************************************************************************** * * Build the string table for actions prior to action initialization * Transfer the string table to BRWA * * NOTE: The string table is built from the template as the code already * has action names cached on the hard drive for selected actors. The * string table is built for fast scrolling. * **************************************************************************/ bool BRWA::FBuildGst(PSCEN pscen) { AssertThis(0); STN stn; PTMPL ptmpl; long cactn; long iactn; PGST pgst; Assert(pvNil != pscen && pvNil != pscen->PactrSelected(), "kidBrwsAction: Invalid actor"); ptmpl = pscen->PactrSelected()->Ptmpl(); Assert(pvNil != ptmpl, "Actor has no template"); if (pvNil == (pgst = GST::PgstNew(0))) return fFalse; cactn = ptmpl->Cactn(); for (iactn = 0; iactn < cactn; iactn++) { if (!ptmpl->FGetActnName(iactn, &stn)) goto LFail; if (!pgst->FAddStn(&stn)) goto LFail; } SetGst(pgst); ReleasePpo(&pgst); if (!FBuildApe(pscen->PactrSelected())) goto LFail; if (!ptmpl->FIsTdt()) _pape->SetCustomView(BR_ANGLE_DEG(0.0), BR_ANGLE_DEG(-30.0), BR_ANGLE_DEG(0.0)); return fTrue; LFail: ReleasePpo(&pgst); return fFalse; } /**************************************************** * * Process Browser Action Selection * ****************************************************/ void BRWA::_ProcessSelection(void) { AssertThis(0); _pape->FSetAction(_ithumSelect); _pape->SetCycleCels(fTrue); _pape->FDisplayCel(_celnStart); // Restart cycling at current display _celnStart = 0; // When applying action, apply celn == 0 } /**************************************************** * * Browser Command Handler : Change cel (action brws) * pcmd->rglw[0] = kid of Change, Fwd, Back * pcmd->rglw[1] = bool reflection start/stop change cel * * Make button(s) invisible on single cel actions * ****************************************************/ bool BRWA::FCmdChangeCel(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); long st; long ccel; PACTR pactr = _pstdio->Pmvie()->Pscen()->PactrSelected(); if (!pactr->Ptmpl()->FGetCcelActn(_pape->Anid(), &ccel)) return fTrue; if (1 == ccel) st = kstBrowserInvisible; else st = kstBrowserSelected; if (_pape->FIsCycleCels()) { _pape->SetCycleCels(fFalse); _celnStart = _pape->Celn(); } if (1 == ccel) return fTrue; switch (pcmd->rglw[0]) { case kidBrowserActionFwdCel: _celnStart++; _pape->FDisplayCel(_celnStart); break; case kidBrowserActionBackCel: _celnStart--; _pape->FDisplayCel(_celnStart); break; default: Bug("Unimplemented Change Cel kid"); break; } return fTrue; } /**************************************************** * * Create a BRoWser Import object * (A browser on top of a sound browser) * Returns: * A pointer to the view, else pvNil. * ****************************************************/ PBRWI BRWI::PbrwiNew(PRCA prca, long kidGlass, long sty) { AssertPo(prca, 0); PBRWI pbrwi; GCB gcb; if (!_FBuildGcb(&gcb, kidBackground, kidGlass)) return pvNil; if ((pbrwi = NewObj BRWI(&gcb)) == pvNil) return pvNil; // Initialize the gok if (!pbrwi->_FInitGok(prca, kidGlass)) { ReleasePpo(&pbrwi); return pvNil; } pbrwi->_sty = sty; pbrwi->_ptgobPage = TGOB::PtgobCreate(kidImportPageNum, idsBrwsPageFont, tavCenter); return pbrwi; } /*************************************************************************** * * Initialize the BRWI (Import Browser) * **************************************************************************/ bool BRWI::FInit(PCMD pcmd, CKI ckiRoot, PSTDIO pstdio) { AssertBaseThis(0); PCFL pcfl; FNI fni; STN stn; _pstdio = pstdio; // // Create the gl's // if (pvNil == (_pglthd = GL::PglNew(size(THD), kglthdGrow))) return fFalse; _pglthd->SetMinGrow(kglthdGrow); if (pvNil == (_pgst = GST::PgstNew(0))) return fFalse; _ckiRoot = ckiRoot; _bws = kbwsCnoRoot; // Fill the lists with sounds from the portfolio movie vapp.GetPortfolioDoc(&fni); pcfl = CFL::PcflOpen(&fni, fcflNil); if (pvNil == pcfl) goto LFail; // Error already reported _pcrf = CRF::PcrfNew(pcfl, 0); ReleasePpo(&pcfl); if (pvNil == _pcrf) goto LFail; if (!_FUpdateLists()) // to include sounds from the selected movie goto LFail; BRWD::Init(pcmd, ivNil, ivNil, pstdio, fTrue); if (!FCreateAllTgob()) goto LFail; return fTrue; LFail: return fFalse; } /**************************************************** * * Create a BRoWser Prop/Actor object * * Returns: * A pointer to the view, else pvNil. * ****************************************************/ PBRWP BRWP::PbrwpNew(PRCA prca, long kidGlass) { AssertPo(prca, 0); PBRWP pbrwp; GCB gcb; if (!_FBuildGcb(&gcb, kidBackground, kidGlass)) return pvNil; if ((pbrwp = NewObj BRWP(&gcb)) == pvNil) return pvNil; // Initialize the gok if (!pbrwp->_FInitGok(prca, kidGlass)) { ReleasePpo(&pbrwp); return pvNil; } pbrwp->_ptgobPage = TGOB::PtgobCreate(kidBrowserPageNum, idsBrwsPageFont, tavCenter); return pbrwp; } /**************************************************** * * Create a BRoWser Background object * * Returns: * A pointer to the view, else pvNil. * ****************************************************/ PBRWB BRWB::PbrwbNew(PRCA prca) { AssertPo(prca, 0); PBRWB pbrwb; GCB gcb; if (!_FBuildGcb(&gcb, kidBackground, kidSettingsGlass)) return pvNil; if ((pbrwb = NewObj BRWB(&gcb)) == pvNil) return pvNil; // Initialize the gok if (!pbrwb->_FInitGok(prca, kidSettingsGlass)) { ReleasePpo(&pbrwb); return pvNil; } pbrwb->_ptgobPage = TGOB::PtgobCreate(kidBrowserPageNum, idsBrwsPageFont, tavCenter); return pbrwb; } /**************************************************** * * Background's virtual FCmdCancel * ****************************************************/ bool BRWB::FCmdCancel(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); AssertVarMem(_pstdio); PMVU pmvu; // Update the tool pmvu = (PMVU)(_pstdio->Pmvie()->PddgActive()); AssertPo(pmvu, 0); pmvu->SetTool(toolDefault); // Update the UI _pstdio->Pmvie()->Pmcc()->ChangeTool(toolDefault); if ((vpappb->GrfcustCur() & fcustCmd) && (_pstdio->Pmvie()->Cscen() == 0)) _pstdio->SetDisplayCast(fTrue); else _pstdio->SetDisplayCast(fFalse); return BRWB_PAR::FCmdCancel(pcmd); } /**************************************************** * * Set the size of the pcrm * ****************************************************/ void BRWL::_SetCbPcrmMin(void) { AssertThis(0); long dwTotalPhys; long dwAvailPhys; // If short on memory, pull in the cache ((APP *)vpappb)->MemStat(&dwTotalPhys, &dwAvailPhys); if (dwTotalPhys > kdwTotalPhysLim && dwAvailPhys > kdwAvailPhysLim) return; if (pvNil != _pcrm) { for (long icrf = 0; icrf < _pcrm->Ccrf(); icrf++) { _pcrm->PcrfGet(icrf)->SetCbMax(0); } } } /**************************************************** * * Create a BRoWser Camera object * * Returns: * A pointer to the view, else pvNil. * ****************************************************/ PBRWC BRWC::PbrwcNew(PRCA prca) { AssertPo(prca, 0); PBRWC pbrwc; GCB gcb; if (!_FBuildGcb(&gcb, kidBackground, kidCameraGlass)) return pvNil; if ((pbrwc = NewObj BRWC(&gcb)) == pvNil) return pvNil; // Initialize the gok if (!pbrwc->_FInitGok(prca, kidCameraGlass)) { ReleasePpo(&pbrwc); return pvNil; } pbrwc->_ptgobPage = TGOB::PtgobCreate(kidBrowserPageNum, idsBrwsPageFont, tavCenter); return pbrwc; } /**************************************************** * * Camera's virtual FCmdCancel * ****************************************************/ bool BRWC::FCmdCancel(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); AssertVarMem(_pstdio); PMVU pmvu; // Update the tool pmvu = (PMVU)(_pstdio->Pmvie()->PddgActive()); AssertPo(pmvu, 0); pmvu->SetTool(toolDefault); // Update the UI _pstdio->Pmvie()->Pmcc()->ChangeTool(toolDefault); return BRWC_PAR::FCmdCancel(pcmd); } /**************************************************** * * Create a BRoWser Roll Call object * ****************************************************/ PBRWR BRWR::PbrwrNew(PRCA prca, long kid) { AssertPo(prca, 0); PBRWR pbrwr; GCB gcb; if (!_FBuildGcb(&gcb, kidBackground, kid)) return pvNil; if ((pbrwr = NewObj BRWR(&gcb)) == pvNil) return pvNil; // Initialize the gok if (!pbrwr->_FInitGok(prca, kid)) { ReleasePpo(&pbrwr); return pvNil; } return pbrwr; } /**************************************************** * * Initialize a BRoWser Roll Call object * ****************************************************/ bool BRWR::FInit(PCMD pcmd, CTG ctgTmplThum, long ithumDisplay, PSTDIO pstdio) { AssertThis(0); long ccrf = 1; PCFL pcfl; BLCK blck; long ccki; long icki; CKI cki; TFC tfc; KID kid; FNET fnet; FNI fniThd; if (!fnet.FInit()) return fFalse; _ctg = ctgTmplThum; BRWD::Init(pcmd, ivNil, ithumDisplay, pstdio, fFalse, 1); _pcrm = CRM::PcrmNew(ccrf); if (pvNil == _pcrm) goto LFail; // Error already reported while (fnet.FNext(&fniThd)) { if (fniThd.Ftg() != kftgThumbDesc) continue; pcfl = CFL::PcflOpen(&fniThd, fcflNil); if (pvNil == pcfl) { goto LFail; // Error already reported } // Add the file to the crm if (!_pcrm->FAddCfl(pcfl, kcbMaxCrm)) goto LFail; // Error already reported // Create the cno map from tmpl->gokd if (ctgTmplThum == kctgTmth) ccki = pcfl->CckiCtg(kctgTmth); else ccki = pcfl->CckiCtg(kctgPrth); for (icki = 0; icki < ccki; icki++) { if (!pcfl->FGetCkiCtg(ctgTmplThum, icki, &cki)) continue; // Read the chunk to map the cno of the CD content if (!pcfl->FFind(cki.ctg, cki.cno, &blck) || !blck.FUnpackData()) { goto LFail; } if (blck.Cb() != size(TFC)) goto LFail; if (!blck.FReadRgb(&tfc, size(TFC), 0)) goto LFail; if (kboCur != tfc.bo) SwapBytesBom(&tfc, kbomTfc); Assert(kboCur == tfc.bo, "bad TFC"); if (!pcfl->FGetKidChidCtg(ctgTmplThum, cki.cno, 0, kctgGokd, &kid)) { Warn("Actor content missing gokd"); continue; } if (!_pstdio->FAddCmg(tfc.cno, kid.cki.cno)) goto LFail; } } _fNoRepositionSel = fTrue; return fTrue; LFail: Warn("Failed to initialize RollCall"); return fFalse; } /**************************************************** * * Update the RollCall : Select actor arid * ****************************************************/ bool BRWR::FUpdate(long arid, PSTDIO pstdio) { AssertThis(0); long ithumDisplay; _pstdio = pstdio; _ithumSelect = ithumDisplay = _IthumFromArid(arid); // Define the index of the first thum on the page if (ithumDisplay != ivNil) { if (!_fNoRepositionSel || ithumDisplay < _ithumPageFirst || ithumDisplay >= _ithumPageFirst + _cfrm) { _ithumPageFirst = ithumDisplay; } } // Define the number of frames on the previous page and // account for wrap-around _SetScrollState(); // Set the state of the scroll arrows return FDraw(); } /**************************************************** * * Process Browser Roll Call Selection * As the RollCall Browsers do not have OK buttons, * the selection is applied now. * * NOTE: The RollCall scripts cannot generate FCmdOk * as that would abort the browser script out from * underneath the code. * ****************************************************/ void BRWR::_ProcessSelection(void) { AssertThis(0); long thumSelect; long sid; // Get Selection from virtual function _GetThumFromIthum(_ithumSelect, &thumSelect, &sid); // Apply the selection _ApplySelection(thumSelect, sid); } /**************************************************** * * Browser Roll Call Cthum * ****************************************************/ long BRWR::_Cthum(void) { AssertThis(0); STN stn; long iarid; long arid; long cactRef; long cthum = 0; bool fProp; Assert(_ctg == kctgPrth || _ctg == kctgTmth, "Invalid BRWR initialization"); if (_pstdio->Pmvie() == pvNil) return 0; for (iarid = 0; _pstdio->Pmvie()->FGetArid(iarid, &arid, &stn, &cactRef); iarid++) { // Verify actor in correct browser fProp = _pstdio->Pmvie()->FIsPropBrwsIarid(iarid); if (_ctg == kctgPrth && !fProp) continue; if (_ctg == kctgTmth && fProp) continue; if (!cactRef) continue; cthum++; } return cthum; } /**************************************************** * * Iarid from Ithum * ****************************************************/ long BRWR::_IaridFromIthum(long ithum, long iaridFirst) { AssertThis(0); STN stn; long iarid; long arid; long cactRef; bool fProp; long cthum = 0; if (_pstdio->Pmvie() == pvNil) return ivNil; for (iarid = iaridFirst; _pstdio->Pmvie()->FGetArid(iarid, &arid, &stn, &cactRef); iarid++) { // Verify actor in correct browser fProp = _pstdio->Pmvie()->FIsPropBrwsIarid(iarid); if (_ctg == kctgPrth && !fProp) continue; if (_ctg == kctgTmth && fProp) continue; if (!cactRef) continue; if (cthum == ithum) return iarid; cthum++; } return iarid; } /**************************************************** * * Ithum from AridSelect * (eg, find the thumbnail corresponding to the correct * copy of Billy) * ****************************************************/ long BRWR::_IthumFromArid(long aridSelect) { AssertThis(0); STN stn; long iarid; long arid; long cactRef; bool fProp; long ithum = 0; if (_pstdio->Pmvie() == pvNil) return ivNil; for (iarid = 0; _pstdio->Pmvie()->FGetArid(iarid, &arid, &stn, &cactRef); iarid++) { AssertDo(_pstdio->Pmvie()->FGetArid(iarid, &arid, &stn, &cactRef), "Arid should exist"); // Verify actor in correct browser fProp = _pstdio->Pmvie()->FIsPropBrwsIarid(iarid); if (arid == aridSelect) { if ((_ctg == kctgPrth) && !fProp) return ivNil; if ((_ctg == kctgTmth) && fProp) return ivNil; return ithum; } if (_ctg == kctgPrth && !fProp) continue; if (_ctg == kctgTmth && fProp) continue; if (!cactRef) continue; ithum++; } return ivNil; } /**************************************************** * * Sets the ith Gob as a child of the current frame * Advance the gob (thumbnail) index * ****************************************************/ bool BRWR::_FSetThumFrame(long ithum, PGOB pgobPar) { AssertThis(0); AssertIn(ithum, 0, _pstdio->Pmvie()->CmactrMac()); AssertPo(pgobPar, 0); RC rcAbsPar; RC rcAbs; RC rcRel; STN stnLabel; long stid; long cactRef; long arid; long iarid; TAG tag; STN stn; long dxp; long dyp; // Associate the gob with the current frame iarid = _IaridFromIthum(ithum); if (!_pstdio->Pmvie()->FGetArid(iarid, &arid, &stn, &cactRef, &tag)) return fFalse; _pstdio->Pmvie()->FGetName(arid, &stnLabel); if (!_pstdio->Pmvie()->FIsIaridTdt(iarid)) { PGOK pgok; CNO cno = _pstdio->CnoGokdFromCnoTmpl(tag.cno); long kidThum = _KidThumFromIfrm(_cfrmPageCur); pgok = vapp.Pkwa()->PgokNew(pgobPar, kidThum, cno, _pcrm); if (pvNil == pgok) return fFalse; // Note: The graphic is not the correct size ((PGOB)pgok)->GetPos(&rcAbs, &rcRel); pgobPar->GetPos(&rcAbsPar, pvNil); dxp = (rcAbs.Dxp() - rcAbsPar.Dxp()) / 2; dyp = (rcAbs.Dyp() - rcAbsPar.Dyp()) / 2; rcAbs.xpLeft += (_dxpFrmOffset - dxp); rcAbs.ypTop += (_dypFrmOffset - dyp); rcAbs.xpRight += (dxp - _dxpFrmOffset); rcAbs.ypBottom += (dyp - _dypFrmOffset); ((PGOB)pgok)->SetPos(&rcAbs, &rcRel); } else { PTGOB ptgob; STN stn = stnLabel; long cch = stn.Cch(); long hidThum; // Display the text as the thumbnail hidThum = _KidThumFromIfrm(_cfrmPageCur); ptgob = TGOB::PtgobCreate(_kidFrmFirst + _cfrmPageCur, _idsFont, tavCenter, hidThum); if (pvNil != ptgob) { ptgob->SetText(&stn); } } // Put the name in the global string registry for rollover help stid = (_ctg == kctgPrth) ? kstidProp : kstidActor; stid += _cfrmPageCur; return vapp.Pkwa()->Pstrg()->FPut(stid, &stnLabel); } /**************************************************** * * Clear rollover help * ****************************************************/ bool BRWR::_FClearHelp(long ifrm) { AssertThis(0); AssertIn(ifrm, 0, _cfrm); STN stn; stn.SetNil(); long stid = (_ctg == kctgPrth) ? kstidProp : kstidActor; stid += ifrm; return vapp.Pkwa()->Pstrg()->FPut(stid, &stn); } /**************************************************** * * Release previous thum from frame ifrm * Assumes gob based. * ****************************************************/ void BRWR::_ReleaseThumFrame(long ifrm) { AssertThis(0); AssertIn(ifrm, 0, _cfrm); PGOB pgob; // Release previous gob associated with the current frame pgob = _PgobFromIfrm(ifrm); if (pvNil != pgob) { ReleasePpo(&pgob); } } /**************************************************** * * Browser Destructor * ****************************************************/ BRWD::~BRWD(void) { AssertBaseThis(0); ReleasePpo(&_pbrcn); vpappb->FSetProp(kpridBrwsOverrideThum, -1); vpappb->FSetProp(kpridBrwsOverrideKidThum, -1); } /**************************************************** * * Browser List Destructor * ****************************************************/ BRWL::~BRWL(void) { AssertBaseThis(0); ReleasePpo(&_pglthd); ReleasePpo(&_pcrm); ReleasePpo(&_pgst); if (_fEnableAccel) vapp.EnableAccel(); } /**************************************************** * * Browser Text Destructor * ****************************************************/ BRWT::~BRWT(void) { AssertBaseThis(0); ReleasePpo(&_pgst); if (_fEnableAccel) vapp.EnableAccel(); } /**************************************************** * * Browser RollCall Destructor * ****************************************************/ BRWR::~BRWR(void) { AssertBaseThis(0); ReleasePpo(&_pcrm); } /**************************************************** * * Browser Music Import Destructor * ****************************************************/ BRWI::~BRWI(void) { AssertBaseThis(0); ReleasePpo(&_pcrf); } /**************************************************** * * Browser Context Destructor * ****************************************************/ BRCNL::~BRCNL(void) { AssertBaseThis(0); ReleasePpo(&pglthd); ReleasePpo(&pgst); ReleasePpo(&pcrm); } #ifdef DEBUG /**************************************************** Mark memory used by the BRCN ****************************************************/ void BRCN::MarkMem(void) { AssertThis(0); BRCN_PAR::MarkMem(); } /**************************************************** Mark memory used by the BRCNL ****************************************************/ void BRCNL::MarkMem(void) { AssertThis(0); MarkMemObj(pglthd); MarkMemObj(pgst); MarkMemObj(pcrm); BRCNL_PAR::MarkMem(); } /**************************************************** Mark memory used by the BRWR ****************************************************/ void BRWR::MarkMem(void) { AssertThis(0); MarkMemObj(_pcrm); BRWR_PAR::MarkMem(); } /**************************************************** Mark memory used by the BRWI ****************************************************/ void BRWI::MarkMem(void) { AssertThis(0); MarkMemObj(_pcrf); BRWI_PAR::MarkMem(); } /**************************************************** Mark memory used by the BRWD ****************************************************/ void BRWD::MarkMem(void) { AssertThis(0); BRWD_PAR::MarkMem(); MarkMemObj(_pbrcn); } /**************************************************** Mark memory used by the BRWL ****************************************************/ void BRWL::MarkMem(void) { AssertThis(0); BRWL_PAR::MarkMem(); MarkMemObj(_pglthd); MarkMemObj(_pcrm); MarkMemObj(_pgst); } /**************************************************** Mark memory used by the BRWT ****************************************************/ void BRWT::MarkMem(void) { AssertThis(0); MarkMemObj(_pgst); BRWT_PAR::MarkMem(); } /**************************************************** Mark memory used by the BRWA ****************************************************/ void BRWA::MarkMem(void) { AssertThis(0); MarkMemObj(_pape); BRWA_PAR::MarkMem(); } /**************************************************** BCL Markmem ****************************************************/ void BCL::MarkMem(void) { BCL_PAR::MarkMem(); MarkMemObj(_pglthd); } void BCLS::MarkMem(void) { BCLS_PAR::MarkMem(); MarkMemObj(_pgst); } /**************************************************** Assert the validity of the BRCN ****************************************************/ void BRCN::AssertValid(ulong grfobj) { BRCN_PAR::AssertValid(fobjAllocated); } /**************************************************** Assert the validity of the BRCNL ****************************************************/ void BRCNL::AssertValid(ulong grfobj) { BRCNL_PAR::AssertValid(fobjAllocated); } /**************************************************** BCL AssertValid ****************************************************/ void BCLS::AssertValid(ulong grf) { BCLS_PAR::AssertValid(grf); AssertPo(_pgst, 0); } void BCL::AssertValid(ulong grf) { BCL_PAR::AssertValid(grf); AssertPo(_pglthd, 0); } /**************************************************** Assert the validity of the BRWD ****************************************************/ void BRWD::AssertValid(ulong grfobj) { BRWD_PAR::AssertValid(fobjAllocated); AssertNilOrPo(_pbrcn, 0); } /**************************************************** Assert the validity of the BRWL ****************************************************/ void BRWL::AssertValid(ulong grfobj) { BRWL_PAR::AssertValid(fobjAllocated); AssertNilOrPo(_pgst, 0); AssertNilOrPo(_pglthd, 0); AssertNilOrPo(_pcrm, 0); } /**************************************************** Assert the validity of the BRWR ****************************************************/ void BRWR::AssertValid(ulong grfobj) { BRWR_PAR::AssertValid(fobjAllocated); AssertNilOrPo(_pcrm, 0); } /**************************************************** Assert the validity of the BRWI ****************************************************/ void BRWI::AssertValid(ulong grfobj) { BRWI_PAR::AssertValid(fobjAllocated); AssertNilOrPo(_pcrf, 0); } /**************************************************** Assert the validity of the BRWT ****************************************************/ void BRWT::AssertValid(ulong grfobj) { BRWT_PAR::AssertValid(fobjAllocated); AssertNilOrPo(_pgst, 0); } /**************************************************** Assert the validity of the BRWA ****************************************************/ void BRWA::AssertValid(ulong grfobj) { BRWA_PAR::AssertValid(fobjAllocated); AssertNilOrPo(_pape, 0); } #endif // DEBUG ================================================ FILE: src/studio/cur/cursors.rc ================================================ //Microsoft Visual C++ generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "afxres.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Cursor // IDC_TURNRIGHT2 CURSOR DISCARDABLE "turnrigt.cur" IDC_TURNLEFT2 CURSOR DISCARDABLE "turnleft.cur" IDC_TURNAROUND CURSOR DISCARDABLE "turnarnd.cur" IDC_DEFAULT CURSOR DISCARDABLE "default.cur" IDC_HTSPOT3 CURSOR DISCARDABLE "hotspot.cur" IDC_OBJECTINMAP CURSOR DISCARDABLE "hotspot2.cur" IDC_WAIT CURSOR DISCARDABLE "wait.cur" IDC_CUTACTOR CURSOR DISCARDABLE "cutactor.cur" IDC_COPY CURSOR DISCARDABLE "copy.cur" IDC_PASTE CURSOR DISCARDABLE "paste.cur" IDC_NUKACTOR2 CURSOR DISCARDABLE "nukeactr.cur" IDC_NUKTEXT CURSOR DISCARDABLE "nuktext.cur" IDC_NUKSCEN CURSOR DISCARDABLE "nukscen.cur" IDC_REMOVBEF CURSOR DISCARDABLE "removbef.cur" IDC_REMOVAFTER CURSOR DISCARDABLE "removaft.cur" IDC_CUTEXT CURSOR DISCARDABLE "cutext.cur" IDC_COPYTEXT CURSOR DISCARDABLE "copytext.cur" IDC_PASTEPATH2 CURSOR DISCARDABLE "pastepth.cur" IDC_PASTETEXT2 CURSOR DISCARDABLE "pastetex.cur" IDC_COPYPATH CURSOR DISCARDABLE "copypath.cur" IDC_ACTION2 CURSOR DISCARDABLE "action2.cur" IDC_REPOSITION CURSOR DISCARDABLE "repositi.cur" SELECTEDSCENE CURSOR DISCARDABLE "selected.cur" IDC_COSTUMECHANGER CURSOR DISCARDABLE "costume.cur" IDC_SIZEVENLY CURSOR DISCARDABLE "sizevenl.cur" IDC_SQUASHSTRETCH CURSOR DISCARDABLE "squashst.cur" IDC_ROTATEX CURSOR DISCARDABLE "rotatex.cur" IDC_ROTATEY CURSOR DISCARDABLE "rotatey.cur" IDC_ROTATEZ CURSOR DISCARDABLE "rotatez.cur" IDC_ATTACHSOUND CURSOR DISCARDABLE "attachso.cur" IDC_LISTEN CURSOR DISCARDABLE "listen.cur" IDC_CREATEXTBOX CURSOR DISCARDABLE "creatbox.cur" RESIZETEXTBOX CURSOR DISCARDABLE "tboxfall.cur" IDC_RESIZETEXTBOX CURSOR DISCARDABLE "tboxrise.cur" IDC_RESIZETEXTBOXVERT CURSOR DISCARDABLE "tboxvert.cur" RESIZETEXTBOXHOR CURSOR DISCARDABLE "tboxhor.cur" IDC_IBEAM CURSOR DISCARDABLE "ibeam.cur" IDC_FONTEXTCOLOR CURSOR DISCARDABLE "fontextc.cur" IDC_TEXTBACKGROUNDCOL CURSOR DISCARDABLE "textback.cur" IDC_ACTIONS2 CURSOR DISCARDABLE "actions2.cur" IDC_NUKACTOR3 CURSOR DISCARDABLE "nukeactr.cur" IDC_NORMALIZE CURSOR DISCARDABLE "normaliz.cur" IDC_CURSOR1 CURSOR DISCARDABLE "cur00001.cur" IDC_CURSOR2 CURSOR DISCARDABLE "cur00002.cur" IDC_CURSOR3 CURSOR DISCARDABLE "cur00003.cur" #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE DISCARDABLE BEGIN "resource.h\0" END 2 TEXTINCLUDE DISCARDABLE BEGIN "#include ""afxres.h""\r\n" "\0" END 3 TEXTINCLUDE DISCARDABLE BEGIN "\r\n" "\0" END ///////////////////////////////////////////////////////////////////////////// #endif // APSTUDIO_INVOKED #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED ================================================ FILE: src/studio/cur/resource.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ //{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by cursors.rc // #define IDC_MOTION_MATCH_SOUND 101 #define IDC_LOOPER_SOUND 102 #define IDC_PASTE_SOUND 103 #define IDC_CURSOR1 104 #define IDC_CURSOR2 105 #define IDC_CURSOR3 106 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 107 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif ================================================ FILE: src/studio/cursors.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // // Studio cur // CURSORCHUNK( "studio\cur\repositi.cur", kcrsCompose ) // "Compose cursor" CURSORCHUNK( "studio\cur\squashst.cur", kcrsSquashStretch ) // "squashstretch" CURSORCHUNK( "studio\cur\sizevenl.cur", kcrsResize ) // "resize" CURSORCHUNK( "studio\cur\rotatex.cur", kcrsRotateX ) // "rotateX" CURSORCHUNK( "studio\cur\rotatey.cur", kcrsRotateY ) // "rotateY" CURSORCHUNK( "studio\cur\rotatez.cur", kcrsRotateZ ) // "rotateZ" CURSORCHUNK( "studio\cur\costume.cur", kcrsCostume ) // "costume" CURSORCHUNK( "studio\cur\repositi.cur", kcrsRecord ) // "motionfill" CURSORCHUNK( "studio\cur\hotspot.cur", kcrsTweak ) // "tweak" CURSORCHUNK( "studio\cur\normaliz.cur", kcrsNormalizeRot ) // "normalize" CURSORCHUNK( "studio\cur\default.cur", kcrsDefault ) // "Default" CURSORCHUNK( "studio\cur\repositi.cur", kcrsTboxMove ) // "TboxMove" CURSORCHUNK( "studio\cur\tboxvert.cur", kcrsTboxUpDown ) // "TboxUpDown" CURSORCHUNK( "studio\cur\tboxhor.cur", kcrsTboxLeftRight ) // "TboxLeftRight" CURSORCHUNK( "studio\cur\tboxfall.cur", kcrsTboxFalling ) // "TboxFalling" CURSORCHUNK( "studio\cur\tboxrise.cur", kcrsTboxRising ) // "TboxRising" CURSORCHUNK( "studio\cur\nukscen.cur", kcrsNuke ) // "Nuke" CURSORCHUNK( "studio\cur\creatbox.cur", kcrsTboxCreate ) // "TboxCreate" CURSORCHUNK( "studio\cur\ibeam.cur", kcrsIBeam ) // "IBeam" CURSORCHUNK( "studio\cur\cutactor.cur", kcrsCutObject ) // "CutObject" CURSORCHUNK( "studio\cur\copy.cur", kcrsCopyObject ) // "CopyObject" CURSORCHUNK( "studio\cur\copypath.cur", kcrsCopyRte ) // "CopyRte" CURSORCHUNK( "studio\cur\paste.cur", kcrsPasteObject ) // "PasteObject" CURSORCHUNK( "studio\cur\removaft.cur", kcrsSceneChop ) // "SceneChop" CURSORCHUNK( "studio\cur\cutext.cur", kcrsCutText ) // "CutText" CURSORCHUNK( "studio\cur\copytext.cur", kcrsCopyText ) // "CopyText" CURSORCHUNK( "studio\cur\pastetex.cur", kcrsPasteText ) // "PasteText" CURSORCHUNK( "studio\cur\pastepth.cur", kcrsPasteRte ) // "PasteRte" CURSORCHUNK( "studio\cur\fontextc.cur", kcrsPaintText ) // "Paint Text" CURSORCHUNK( "studio\cur\textback.cur", kcrsFillBkgd ) // "Fill Text" CURSORCHUNK( "studio\cur\cur00001.cur", kcrsMatcher ) // kcrsMatcher CURSORCHUNK( "studio\cur\cur00002.cur", kcrsLooper ) // kcrsLooper CURSORCHUNK( "studio\cur\cur00003.cur", kcrsSounder ) // kcrsSounder CURSORCHUNK( "studio\cur\listen.cur", kcrsListener ) // kcrsListener CURSORCHUNK( "studio\cur\squashst.cur", kcrsSoonerLater ) // kcrsSoonerLater CURSORCHUNK( "studio\cur\repositi.cur", kcrsComposeAll ) // "Compose All cursor" CURSORCHUNK( "studio\cur\normaliz.cur", kcrsNormalizeSize ) // "Normalize size" CURSORCHUNK( "studio\cur\textback.cur", kcrsTboxStory ) // "Make a tbox into a story tbox" CURSORCHUNK( "studio\cur\textback.cur", kcrsTboxCredit ) // "Make a tbox into a credit tbox" CURSORCHUNK( "studio\cur\fontextc.cur", kcrsTboxFont ) // "Set font of a tbox" CURSORCHUNK( "studio\cur\fontextc.cur", kcrsTboxFontSize ) // "Set font size of a tbox" CURSORCHUNK( "studio\cur\fontextc.cur", kcrsTboxFontStyle ) // "Set font style of a tbox" CURSORCHUNK( "studio\cur\removbef.cur", kcrsSceneChopBack ) // "SceneChopBack" ================================================ FILE: src/studio/easels.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*****************************************************************************\ * * easels.cht * * All easels that appear in the studio * * Author: Sean Selitrennikoff * * Status: REVIEWED * \*****************************************************************************/ // // // Spletters easel // // // // Spletter easels very own glass // GOBCHUNK("Spletter Easel pane of glass", kidSpltGlass, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, CHID(kstDefault, kchidClick), cidNil, cnoNil) ENDCHUNK REP_FILL( CHID(kstDefault, krepDefault ), "Max", 0,0, kdxpBackground, kdypBackground, Transparent, Palette( 73 )) PATTERN_50 ENDCHUNK CREATE_SCRIPT("Costume changer") CreateChildThis(kidSpltBackground, kidSpltBackground); ENDCHUNK CHILD_SCRIPT("Glass clicked", CHID(kstDefault, kchidClick)) PlaySoundGob(kidBackground, kctgWave, kwavSplot, 0, 0x10000, 1, 0, 1); ENDCHUNK // // Background // GOBCHUNK("Spletters easel background", kidSpltBackground, kgokkRectHit) DEFAULT_POSITION( kxpSpltBackground, kypSpltBackground, 200) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault ), "studio\bmp\e1par.bmp", kxpregSpltBackground, kypregSpltBackground ) ADOPT_WAVE(kcnoEzlOpenWav, CHID(kstDefault, krepEnterAnimation)) CREATE_SCRIPT("Spletters easel created") CreateChildThis(kidSpltPreviewFrame, kidSpltPreviewFrame); CreateChildThis(kidSpltTransmogrify, kidSpltTransmogrify); CreateChildThis(kidSpltTextures, kidSpltTextures); CreateChildThis(kidSpltFont, kidSpltFont); CreateChildThis(kidSpltShape, kidSpltShape); CreateChildThis(kidSpltRotate, kidSpltRotate); CreateChildThis(kidSpltCancel, kidSpltCancel); CreateChildThis(kidSpltOk, kidSpltOk); CreateChildThis(kidSpltEditBox, kidSpltEditBox); // help balloon If (!::fHelpOn); CreateHelpGob(kidBackground, ktpcEaselHelp33); End; ENDCHUNK // // Preview area -- parent area for creating a brender world for viewing // the spletter. // OBJECT("Spletter easel preview Frame", kidSpltPreviewFrame, 100, kcrsArrow) REP_RECT(CHID(kstDefault, krepDefault), "Visible", kxpSpltPreviewFrameLeft, kypSpltPreviewFrameTop, kxpSpltPreviewFrameRight, kypSpltPreviewFrameBottom) // // Parent rectangle for the edit box. // OBJECT("Spletter easel edit box", kidSpltEditBox, 100, kcrsArrow) REP_RECT(CHID(kstDefault, krepDefault), "Visible", kxpSpltEditBoxLeft, kypSpltEditBoxTop, kxpSpltEditBoxRight, kypSpltEditBoxBottom) // // Transmogrify button // GOBCHUNK("Spletters easel Transmogrify", kidSpltTransmogrify, kgokkRectHit) DEFAULT_POSITION(kxpSpltTransmogrify, kypSpltTransmogrify, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttSpltTransmogrify) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\e1tran.bmp", kxpregSpltTransmogrify, kypregSpltTransmogrify) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\e1trans.bmp", kxpregSpltTransmogrify, kypregSpltTransmogrify) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) ADOPT_WAVE(kcnoRandomWav, CHID(kstDefault, krepClicked)) CLICK_SCRIPT("Transmogrify clicked") EnqueueCid(cidEaselTransmogrify, kidSpltGlass, 0, 0, 0, 0); ENDCHUNK // // Texture popdown. Starts the popdown. // GOBCHUNK("Spletters easel Textures", kidSpltTextures, kgokkRectHit) DEFAULT_POSITION( kxpSpltTextures, kypSpltTextures, 10) ACTION(fcustNil, fcustNil, fgrfstDefault, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttSpltTextures) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\e1text.bmp", kxpregSpltTextures, kypregSpltTextures) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\e1texts.bmp", kxpregSpltTextures, kypregSpltTextures) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CLICK_SCRIPT("Texture clicked") EnqueueCid(cidEaselTexture, kidSpltGlass, kidSpltGlass, kidSpltsColorFrame, kidSpltsColorPageDown, (kdxpSpltsColorFrameBorder << 16) | kdypSpltsColorFrameBorder); ENDCHUNK // // Font popdown. Starts the popdown. // GOBCHUNK("Spletters easel Font", kidSpltFont, kgokkRectHit) DEFAULT_POSITION(kxpSpltFont, kypSpltFont, 10) ACTION(fcustNil, fcustNil, fgrfstDefault, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttSpltFont) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\e1font.bmp", kxpregSpltFont, kypregSpltFont) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\e1fonts.bmp", kxpregSpltFont, kypregSpltFont) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CLICK_SCRIPT("Font clicked") EnqueueCid(cidEaselFont, kidSpltGlass, kidSpltGlass, kidSpltsFontFrame, kidSpltsFontPageDown, (kdxpSpltsFontFrameBorder << 16) | kdypSpltsFontFrameBorder); ENDCHUNK // // Shape popdown. Starts the popdown. // GOBCHUNK("Spletters easel Shape", kidSpltShape, kgokkRectHit) DEFAULT_POSITION(kxpSpltShape, kypSpltShape, 10) ACTION(fcustNil, fcustNil, fgrfstDefault, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttSpltShape) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\e1shap.bmp", kxpregSpltShape, kypregSpltShape) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\e1shaps.bmp", kxpregSpltShape, kypregSpltShape) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CLICK_SCRIPT("Shape clicked") EnqueueCid(cidEaselShape, kidSpltGlass, kidSpltsShape, kidSpltsShapeFrame, kidSpltsShapePageDown, (kdxpSpltsShapeFrameBorder << 16) | kdypSpltsShapeFrameBorder); ENDCHUNK // // Rotate button. // GOBCHUNK("Spletters easel Rotate", kidSpltRotate, kgokkRectHit) DEFAULT_POSITION(kxpSpltRotate, kypSpltRotate, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttSpltRotate) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\e1rot.bmp", kxpregSpltRotate, kypregSpltRotate) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\e1rots.bmp", kxpregSpltRotate, kypregSpltRotate) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) ADOPT_WAVE(kcnoSpinWav, CHID(kstDefault, krepClicked)) CLICK_SCRIPT("Rotate clicked") EnqueueCid(cidEaselRotate, kidSpltGlass, 0, 0, 0, 0); ENDCHUNK // // Cancel button // GOBCHUNK("Spletters easel cancel", kidSpltCancel, kgokkRectHit) DEFAULT_POSITION(kxpSpltCancel, kypSpltCancel, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttEaselCancel) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\e1can.bmp", kxpregSpltCancel, kypregSpltCancel) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\e1canc.bmp", kxpregSpltCancel, kypregSpltCancel) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) ADOPT_WAVE(kcnoCancelWav, CHID(kstDefault, krepClicked)) CLICK_SCRIPT("Cancel clicked") EnqueueCid(cidEaselCancel, kidSpltGlass, 0, 0, 0, 0); ENDCHUNK // // OK button // GOBCHUNK("Spletters easel ok", kidSpltOk, kgokkRectHit) DEFAULT_POSITION(kxpSpltOk, kypSpltOk, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttEaselOk) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\e1okay.bmp", kxpregSpltOk, kypregSpltOk) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\e1okayc.bmp", kxpregSpltOk, kypregSpltOk) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) ADOPT_WAVE(kcnoOkWav, CHID(kstDefault, krepClicked)) CLICK_SCRIPT("Ok clicked") EnqueueCid(cidEaselOk, kidSpltGlass, 0, 0, 0, 0); ENDCHUNK // // Costumes easels very own glass // GOBCHUNK("Costume changer easel pane of glass", kidCostGlass, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, CHID(kstDefault, kchidClick), cidNil, cnoNil) ENDCHUNK REP_FILL(CHID(kstDefault, krepDefault ), "Max", 0, 0, kdxpBackground, kdypBackground, Transparent, Palette( 73 )) PATTERN_50 ENDCHUNK CREATE_SCRIPT("Costume changer") CreateChildThis(kidCostBackground, kidCostBackground); ENDCHUNK CHILD_SCRIPT("Glass clicked", CHID(kstDefault, kchidClick)) PlaySoundGob(kidBackground, kctgWave, kwavSplot, 0, 0x10000, 1, 0, 1); ENDCHUNK // // Background // GOBCHUNK("Costume changer easel background", kidCostBackground, kgokkRectHit) DEFAULT_POSITION( kxpCostBackground, kypCostBackground, 200) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault ), "studio\bmp\e2par.bmp", kxpregCostBackground, kypregCostBackground ) ADOPT_WAVE(kcnoEzlOpenWav, CHID(kstDefault, krepEnterAnimation)) CREATE_SCRIPT("Costume changer easel created") CreateChildThis(kidCostPreviewFrame, kidCostPreviewFrame); CreateChildThis(kidCostCostumes, kidCostCostumes); CreateChildThis(kidCostRotate, kidCostRotate); CreateChildThis(kidCostAccessories, kidCostAccessories); CreateChildThis(kidCostCancel, kidCostCancel); CreateChildThis(kidCostOk, kidCostOk); CreateChildThis(kidCostEditBox, kidCostEditBox); ChangeStateGob(kidCostCostumes, kstSelected); // help balloon If (!::fHelpOn); CreateHelpGob(kidBackground, ktpcEaselHelp35); End; ENDCHUNK // // Preview area -- parent area for creating a brender world for viewing // the actor. // OBJECT("Costume changer easel preview Frame", kidCostPreviewFrame, 100, kcrsHand) REP_RECT(CHID(kstDefault, krepDefault), "Visible", kxpCostPreviewFrameLeft, kypCostPreviewFrameTop, kxpCostPreviewFrameRight, kypCostPreviewFrameBottom) // // Parent rectangle for the edit box. // OBJECT("Costume changer edit box", kidCostEditBox, 100, kcrsArrow) REP_RECT(CHID(kstDefault, krepDefault), "Visible", kxpCostEditBoxLeft, kypCostEditBoxTop, kxpCostEditBoxRight, kypCostEditBoxBottom) // // Costumes. // GOBCHUNK("Costume changer easel ", kidCostCostumes, kgokkRectHit) DEFAULT_POSITION(kxpCostCostumes, kypCostCostumes, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttCostCostumes) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\e2cost.bmp", kxpregCostCostumes, kypregCostCostumes) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\e2costs.bmp", kxpregCostCostumes, kypregCostCostumes) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) ADOPT_WAVE(kcnoCostumeWav, CHID(kstDefault, krepClicked)) CLICK_SCRIPT("Costumes clicked") EnqueueCid(cidEaselCostumes, kidCostGlass, 0, 0, 0, 0); ChangeStateThis(kstSelected); ChangeStateGob(kidCostAccessories, kstDefault); ENDCHUNK // // Rotate button. // GOBCHUNK("Costume changer easel Rotate", kidCostRotate, kgokkRectHit) DEFAULT_POSITION(kxpCostRotate, kypCostRotate, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttCostRotate) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\e2rot.bmp", kxpregCostRotate, kypregCostRotate) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\e2rots.bmp", kxpregCostRotate, kypregCostRotate) ADOPT_WAVE(kcnoSpinWav, CHID(kstDefault, krepClicked)) CLICK_SCRIPT("Rotate clicked") EnqueueCid(cidEaselRotate, kidCostGlass, 0, 0, 0, 0); ENDCHUNK // // Accessories button // GOBCHUNK("Costume changer easel accessories", kidCostAccessories, kgokkRectHit) DEFAULT_POSITION(kxpCostAccessories, kypCostAccessories, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttCostAccessories) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\e2acc.bmp", kxpregCostAccessories, kypregCostAccessories) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\e2accs.bmp", kxpregCostAccessories, kypregCostAccessories) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) ADOPT_WAVE(kcnoAcesoryWav, CHID(kstDefault, krepClicked)) CLICK_SCRIPT("Accessories clicked") EnqueueCid(cidEaselAccessories, kidCostGlass, 0, 0, 0, 0); ChangeStateThis(kstSelected); ChangeStateGob(kidCostCostumes, kstDefault); ENDCHUNK // // Cancel button. // GOBCHUNK("Costume changer easel cancel", kidCostCancel, kgokkRectHit) DEFAULT_POSITION(kxpCostCancel, kypCostCancel, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttEaselCancel) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\e2can.bmp", kxpregCostCancel, kypregCostCancel) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\e2canc.bmp", kxpregCostCancel, kypregCostCancel) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) ADOPT_WAVE(kcnoCancelWav, CHID(kstDefault, krepClicked)) CLICK_SCRIPT("Cancel clicked") EnqueueCid(cidEaselCancel, kidCostGlass, 0, 0, 0, 0); ENDCHUNK // // Ok button. // GOBCHUNK("Costume changer easel ok", kidCostOk, kgokkRectHit) DEFAULT_POSITION(kxpCostOk, kypCostOk, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttEaselOk) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\e2okay.bmp", kxpregCostOk, kypregCostOk) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\e2okayc.bmp", kxpregCostOk, kypregCostOk) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) ADOPT_WAVE(kcnoOkWav, CHID(kstDefault, krepClicked)) CLICK_SCRIPT("Ok clicked") EnqueueCid(cidEaselOk, kidCostGlass, 0, 0, 0, 0); ENDCHUNK // // // Scene sorter easel // // #ifdef DEBUG #define klwSSorterDelayMax 90 #define klwSSorterDelayMin 60 #define kdlwSSorterDelay 6 #else /* DEBUG */ #define klwSSorterDelayMax 30 #define klwSSorterDelayMin 5 #define kdlwSSorterDelay 5 #endif /* !DEBUG */ #define kcgokFrame 7 #define kdtimDragScroll 60 #define kdtimDrag 10 /****************************************************************************** Scene Sorter This outlines the cids available to script from code. It's basically a cut-and-paste from the comments in the code. Last update was 5/11/95. cidSceneSortInit: Initializes the Scene Sorter with the information about the easel in kidspace. rglw[0] -- kid of the first thumbnail frame GOK rglw[1] -- kid of the first scrollbar GOK button (scroll up) rglw[2] -- number of GOKs in a single frame cidSceneSortSelect: Selects the scene corresponding to the given thumbnail frame. rglw[0] -- the kid of the thumbnail frame cidSceneSortInsert: Inserts the currently selected scene before the scene that corresponds to the given thumbnail frame. If the given thumbnail frame is larger than the last visible thumbnail frame, the scene is inserted after the last scene visible on the easel. rglw[0] -- the kid of the frame to insert the scene before cidSceneSortScroll: Scrolls the thumbnails by the given number of frames. The sign of the number of frames indicates whether to scroll forward (positive) or backward (negative). Sets the selected frame to kstBrowserSelected if we're not drag & drop, or to kstBrowserScrollingSel if we are. rglw[0] -- the number of frames to scroll rglw[1] -- non-zero if we're scrolling during drag & drop cidSceneSortNuke: Deletes the currently selected scene from the movie. Makes the following scene the currently selected scene, unless there is no such scene, in which case the scene immediately before the deleted scene is the new currently selected scene. cidSceneSortOk: cidSceneSortCancel: Alerts the Scene Sorter that the easel is about to go away. If the easel was not cancelled, the changes made in the easel are applied to the movie. cidSceneSortPortfolio: Brings up the portfolio so that the user can append movies from file. cidSceneSortTransition: Sets the transition for the scene corresponding to the given frame. rglw[0] -- GOK id of the frame rglw[1] -- which transition to use ************************************************************ PETED ***********/ // // Scene sorter easel. This is a hybrid easel, so it uses a few // browser-like conventions. // // Create self + NxM frames + controls, all are invisable // Enqueues: cidSSortersBrowserReady when ready to go. // GOBCHUNK("Scene sorter background", kidSSorterBackground, kgokkRectHit) DEFAULT_POSITION( kxpSSorterBackground, kypSSorterBackground, 200) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault ), "studio\bmp\e3par.bmp", kxpregSSorterBackground, kypregSSorterBackground ) ADOPT_WAVE(kcnoEzlOpenWav, CHID(kstDefault, krepEnterAnimation)) CREATE_SCRIPT("Scene Sorter created") CreateChildGob(kidBackground, kidGenericDisableGlass, kidGenericDisableGlass ); CreateChildThis(kidSSorterScrollUp, kidSSorterScrollUp); CreateChildThis(kidSSorterScrollDn, kidSSorterScrollDn); CreateChildThis(kidSSorterOpen, kidSSorterOpen); CreateChildThis(kidSSorterNuke, kidSSorterNuke); CreateChildThis(kidSSorterHand, kidSSorterHand); CreateChildThis(kidSSorterOk, kidSSorterOk); CreateChildThis(kidSSorterCancel, kidSSorterCancel); CreateChildThis(kidSSorterBar, kidSSorterBar); // help balloon If (!::fHelpOn); CreateHelpGob(kidBackground, ktpcEaselHelp32); End; .idSelected = kidStudio; yp = kdypSSorterTop; .nFrame = 0; .dxpFrame = kdxpSSorterSpacing + kdxpSSorterFrame; .dypFrame = kdypSSorterSpacing + kdypSSorterFrame; .dxpSSorter = kdxpSSorter - kdxpSSorterRight + kdxpSSorterSpacing - kdxpSSorterLeft; .dypSSorter = kdypSSorter - kdypSSorterBottom - kdypSSorterTop; .nxFrame = .dxpSSorter / .dxpFrame; While(yp <= (kdypSSorter - kdypSSorterFrame - kdypSSorterBottom)); xp = kdxpSSorterLeft; While(xp <= (kdxpSSorter - kdxpSSorterRight - kdxpSSorterFrame)); // // create and position frames // CreateChildThis(kidSSorterFrame + (.nFrame * kcgokFrame), kidSSorterFrame); MoveAbsGob(kidSSorterFrame + (.nFrame * kcgokFrame), xp, yp); .nFrame++; xp += kdxpSSorterSpacing + kdxpSSorterFrame; End; yp += kdypSSorterSpacing + kdypSSorterFrame; End; /* .nxFrame == number of frames in a full row */ // create frame used during drag & drop .idSelFrame = kidSSorterFrame + (.nFrame * kcgokFrame); CreateChildThis(.idSelFrame, kidSSorterFrame); ChangeStateGob(.idSelFrame, kstBrowserDisabled); // don't bother moving it or showing it, since that will only happen // when the user actually wants to drag a frame EnqueueCid(cidSceneSortInit, kidSSorterBackground, kidSSorterFrame, kidSSorterScrollUp, kcgokFrame, 0); ChangeModifierState(fcustHand, 0); ChangeStateGob(kidSSorterHand, kstSelected); ChangeStateThis(kstBrowserEnabled); ENDCHUNK /* Handles the mouse tracking */ REP_ANIM(CHID(kstBrowserDragging, kchidUpOff), "Scene sorter, d&d mouse tracking") idSelFrame = .idSelFrame; If(GetModifierState() & fcustHand); // During dragging, allow the user to drag to right edge of scene sorter.. xpFrameMax = .dxpSSorter - .dxpFrame + kdxpSSorterRight; ypFrameMax = .dypSSorter - .dypFrame; dxpFrames = kdxpSSorterSpacing + kdxpSSorterFrame; dypFrames = kdypSSorterSpacing + kdypSSorterFrame; dtimCur = 0; PlaySoundThis(kctgWave, kcnoGrabSnWav, 0, 0x10000, 1, 0, 1); While(GetModifierState() & fcustMouse); Cell(chidNil, 0, 0, kdtimDrag); dtimCur += kdtimDrag; xpMouse = XMouseThis(); ypMouse = YMouseThis(); xpNew = xpMouse - .dxpTrack; ypNew = ypMouse - .dypTrack; If(xpNew < 0); xpNew = 0; Elif(xpNew > xpFrameMax); xpNew = xpFrameMax; End; If(ypNew < 0); ypNew = 0; Elif(ypNew > ypFrameMax); ypNew = ypFrameMax; End; If(dtimCur >= kdtimDragScroll); dtimCur = 0; If(ypMouse < 0); EnqueueCid(cidSceneSortScroll, kidSSorterBackground, -1 * .nxFrame, 1, 0, 0); Elif(ypMouse > .dypSSorter); EnqueueCid(cidSceneSortScroll, kidSSorterBackground, .nxFrame, 1, 0, 0); End; End; MoveAbsGob(idSelFrame, xpNew, ypNew); If(xpNew < kdxpSSorterLeft); xpBar = kdxpSSorterSpacing / 2; Else; xpBar = (kdxpSSorterSpacing / 2) + (dxpFrames * (1 + ((xpNew - kdxpSSorterLeft - 1) / dxpFrames))); End; ypBar = (kdypSSorterSpacing / 2) + (dypFrames * ((ypNew + (dypFrames / 2)) / dypFrames)); MoveAbsGob(kidSSorterBar, xpBar, ypBar); // Do not show the indicator bar until we have positioned it in the correct place. If(StateGob(kidSSorterBar) == kstDefault); ChangeStateGob(kidSSorterBar, kstSelected); End; End; ChangeStateGob(kidSSorterBar, kstDefault); PlaySoundThis(kctgWave, kcnoDropSnWav, 0, 0x10000, 1, 0, 1); /* Find the target frame */ xpNew = XGob(idSelFrame); ypNew = YGob(idSelFrame); If(xpNew < kdxpSSorterLeft); xFrame = 0; Else; xFrame = 1 + ((xpNew - kdxpSSorterLeft - 1) / dxpFrames); End; yFrame = (ypNew + (dypFrames / 2)) / dypFrames; gidFrame = yFrame * .nxFrame + xFrame; gidFrame = (gidFrame * kcgokFrame) + kidSSorterFrame; /* Insert the frame */ EnqueueCid(cidSceneSortInsert, kidSSorterBackground, gidFrame, 0, 0, 0); /* Hide the dragging gob */ EnqueueCid(cidSceneSortScroll, kidSSorterBackground, 0, 0, 0, 0); ChangeStateGob(.idSelFrame, kstBrowserDisabled); ChangeStateThis(kstBrowserEnabled); Else; DEBUGCMD( AlertStr("Bogus state for scene sorter");) End; ENDCHUNK // // Scroll up button // GOBCHUNK("Scene sorter - scroll up", kidSSorterScrollUp, kgokkRectHit) DEFAULT_POSITION(kxpSSorterScrollUp, kypSSorterScrollUp, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstBrowserEnabled, krepMouseDnOn), cidNil, kttSSorterScrollUp) ENDCHUNK REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault), "studio\bmp\e3up.bmp", kxpregSSorterScrollUp, kypregSSorterScrollUp) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\e3upc.bmp", kxpregSSorterScrollUp, kypregSSorterScrollUp) REP_ANIM(CHID(kstBrowserEnabled, krepMouseDnOn), "Pressed") /* Init */ lwDelay = klwSSorterDelayMax; cgokScroll = GidParThis()->nxFrame * -1; /* Send first scroll command */ PlaySoundThis(kctgWave, kcnoPageUpWav, 0, 0x10000, 1, 0, 1); EnqueueCid(cidSceneSortScroll, kidSSorterBackground, cgokScroll, 0, 0, 0); Cell(CHID(kstBrowserEnabled, krepMouseDnOn), 0, 0, lwDelay); /* Loop until we exit this state */ While(); ASSERT(GetModifierState() & fcustMouse); If(lwDelay > lwSSorterDelayMin); lwDelay -= kdlwSSorterDelay; End; PlaySoundThis(kctgWave, kcnoPageUpWav, 0, 0x10000, 1, 0, 1); EnqueueCid(cidSceneSortScroll, kidSSorterBackground, cgokScroll, 0, 0, 0); Cell(chidNil, 0, 0, lwDelay); End; ENDCHUNK REP_RECT(CHID(kstBrowserDisabled, krepDefault), "hidden", 0, 0, 0, 0) // // Scroll down button // GOBCHUNK("Scene sorter - scroll down", kidSSorterScrollDn, kgokkRectHit) DEFAULT_POSITION(kxpSSorterScrollDn, kypSSorterScrollDn, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstBrowserEnabled, krepMouseDnOn), cidNil, kttSSorterScrollDn) ENDCHUNK REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault), "studio\bmp\e3down.bmp", kxpregSSorterScrollDn, kypregSSorterScrollDn) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\e3downc.bmp", kxpregSSorterScrollDn, kypregSSorterScrollDn) REP_ANIM(CHID(kstBrowserEnabled, krepMouseDnOn), "Pressed") /* Init */ lwDelay = klwSSorterDelayMax; cgokScroll = GidParThis()->nxFrame; /* Send first scroll command */ PlaySoundThis(kctgWave, kcnoPageDnWav, 0, 0x10000, 1, 0, 1); EnqueueCid(cidSceneSortScroll, kidSSorterBackground, cgokScroll, 0, 0, 0); Cell(CHID(kstBrowserEnabled, krepMouseDnOn), 0, 0, lwDelay); /* Loop until we exit this state */ While(); ASSERT(GetModifierState() & fcustMouse); If(lwDelay > lwSSorterDelayMin); lwDelay -= kdlwSSorterDelay; End; PlaySoundThis(kctgWave, kcnoPageDnWav, 0, 0x10000, 1, 0, 1); EnqueueCid(cidSceneSortScroll, kidSSorterBackground, cgokScroll, 0, 0, 0); Cell(chidNil, 0, 0, lwDelay); End; ENDCHUNK REP_RECT(CHID(kstBrowserDisabled, krepDefault), "hidden", 0, 0, 0, 0) // // Bar indicating where scene will be dropped. // GOBCHUNK("Scene sorter - Bar", kidSSorterBar, kgokkRectHit) DEFAULT_POSITION( 0, 0, 10 ) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, chidNil, cidNil, cnoNil ) ENDCHUNK REP_RECT(CHID(kstDefault, krepDefault ), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstSelected, krepDefault ), "studio\bmp\ssbar.bmp", 0, 0) // // Open file button. Starts the dialog. // GOBCHUNK("Scene sorter - Open", kidSSorterOpen, kgokkRectHit) DEFAULT_POSITION( kxpSSorterOpen, kypSSorterOpen, 10 ) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttSSorterOpen ) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault ), "studio\bmp\e3port.bmp", kxpregSSorterOpen, kypregSSorterOpen) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\e3portc.bmp", kxpregSSorterOpen, kypregSSorterOpen) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CLICK_SCRIPT("Scene sorter, portfolio clicked") EnqueueCid(cidSceneSortPortfolio, kidSSorterBackground, 0, 0, 0, 0); ENDCHUNK // // Ok button. // GOBCHUNK("Scene sorter - Ok", kidSSorterOk, kgokkRectHit) DEFAULT_POSITION(kxpSSorterOk, kypSSorterOk, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidSceneSortOk, kttEaselOk) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\e3okay.bmp", kxpregSSorterOk, kypregSSorterOk) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\e3okayc.bmp", kxpregSSorterOk, kypregSSorterOk) ADOPT_WAVE(kcnoOkWav, CHID(kstDefault, krepClicked)) CLICK_SCRIPT("Scene sorter, ok, clicked") EnqueueCid(cidSceneSortOk, kidSSorterBackground, 0, 0, 0, 0); OldState = GetModifierState(); OldState &= (fcustHand | fcustNuke); ChangeModifierState(0, OldState); ENDCHUNK // // Cancel button. // GOBCHUNK("Scene sorter - Cancel", kidSSorterCancel, kgokkRectHit) DEFAULT_POSITION(kxpSSorterCancel, kypSSorterCancel, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidSceneSortCancel, kttEaselCancel) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\e3can.bmp", kxpregSSorterCancel, kypregSSorterCancel) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\e3canc.bmp", kxpregSSorterCancel, kypregSSorterCancel) ADOPT_WAVE(kcnoCancelWav, CHID(kstDefault, krepClicked)) CLICK_SCRIPT("Scene sorter, cancel, clicked") EnqueueCid(cidSceneSortCancel, kidSSorterBackground, 0, 0, 0, 0); OldState = GetModifierState(); OldState &= (fcustHand | fcustNuke); ChangeModifierState(0, OldState); ENDCHUNK // // Nuke scene button. // GOBCHUNK("Scene sorter - Nuke", kidSSorterNuke, kgokkRectHit) DEFAULT_POSITION(kxpSSorterNuke, kypSSorterNuke, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttSSorterNuke) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault ), "studio\bmp\e3rmsn.bmp", kxpregSSorterNuke, kypregSSorterNuke) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\e3rmsnc.bmp", kxpregSSorterNuke, kypregSSorterNuke) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CLICK_SCRIPT("Scene sorter, Nuke, clicked") OldState = GetModifierState(); OldState &= fcustHand; // // Use the modifier state to tell if the Hand was selected. // If so, deselect it. // If(OldState & fcustHand); ChangeStateGob(kidSSorterHand, kstDefault); End; ChangeModifierState(fcustNuke, OldState); ChangeStateThis(kstSelected); ENDCHUNK // // Hand button. // GOBCHUNK("Scene sorter - Nuke", kidSSorterHand, kgokkRectHit) DEFAULT_POSITION(kxpSSorterHand, kypSSorterHand, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttSSorterHand) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault ), "studio\bmp\e3hand.bmp", kxpregSSorterHand, kypregSSorterHand) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\e3handc.bmp", kxpregSSorterHand, kypregSSorterHand) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CLICK_SCRIPT("Scene sorter, Nuke, clicked") OldState = GetModifierState(); OldState &= fcustNuke; // // Use the modifier state to tell if the Nuke was selected. // If so, deselect it. // If(OldState & fcustNuke); ChangeStateGob(kidSSorterNuke, kstDefault); End; ChangeModifierState(fcustHand, OldState); ChangeStateThis(kstSelected); ENDCHUNK // // Frame object for the scene sorter. // GOBCHUNK("Scene sorter - Frame", kidSSorterFrame, kgokkRectHit) DEFAULT_POSITION(kxpSSorterFrame, kypSSorterFrame, 10) ACTION(fcustHand, fcustHand, fgrfstAll, kcrsHand, chidNil, cidNil, kttSSorterFrame) ACTION(fcustNuke, fcustNuke, fgrfstAll, kcrsNuke, chidNil, cidNil, kttSSorterFrame) ENDCHUNK /* Define the default representations */ REP_RECT(CHID(kstBrowserInvisible, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault), "studio\bmp\e3frm.bmp", kxpregSSorterFrameBorder, kypregSSorterFrameBorder) REP_MBMPREG(CHID(kstBrowserSelected, krepDefault), "studio\bmp\e3frms.bmp", kxpregSSorterFrameBorder, kypregSSorterFrameBorder) REP_MBMPREG(CHID(kstBrowserDragging, krepDefault), "studio\bmp\e3frms.bmp", kxpregSSorterFrameBorder, kypregSSorterFrameBorder) REP_RECT(CHID(kstBrowserDisabled, krepDefault), "hidden", 0, 0, 0, 0) REP_RECT(CHID(kstBrowserScrollingSel, krepDefault), "hidden", 0, 0, 0, 0) CREATE_SCRIPT("Scene Sorter frame created") CreateChildThis(GidThis() + 1, kidTransition1); CreateChildThis(GidThis() + 2, kidTransition2); CreateChildThis(GidThis() + 3, kidTransition3); CreateChildThis(GidThis() + 4, kidTransition4); CreateChildThis(GidThis() + 5, kidSSorterThumbFrame); ChangeStateThis(kstBrowserDisabled); ENDCHUNK /* Handles mouse down in a frame */ REP_ANIM(CHID(kstBrowserEnabled, krepMouseDn), "Scene sorter, frame, mouse down hand") If(StateGob(GidParThis()->idSelFrame) == kstBrowserDisabled); EnqueueCid(cidSceneSortSelect, kidSSorterBackground, GidThis(), 0, 0, 0); End; ENDCHUNK REP_ANIM(CHID(kstBrowserSelected, krepMouseDn), "Scene sorter, frame, start track") If(GetModifierState() & fcustHand); idSelFrame = GidParThis()->idSelFrame; If(StateGob(idSelFrame) == kstBrowserDisabled); EnqueueCid(cidSceneSortScroll, kidSSorterBackground, 0, 1, 0, 0); End; End; ENDCHUNK REP_ANIM(CHID(kstBrowserScrollingSel, kchidDownOn), "Scene sorter, frame, start track") gidParent = GidParThis(); idSelFrame = gidParent->idSelFrame; If(StateGob(idSelFrame) == kstBrowserDisabled); xpThis = XThis(); ypThis = YThis(); If(StateGob(idSelFrame) != kstBrowserDragging); MoveAbsGob(idSelFrame, xpThis, ypThis); ChangeStateGob(idSelFrame, kstBrowserDragging); End; gidParent->dxpTrack = XMouseGob(gidParent) - xpThis; gidParent->dypTrack = YMouseGob(gidParent) - ypThis; ChangeStateGob(gidParent, kstBrowserDragging); End; ENDCHUNK /* Handles mouse up after tracking, "no insert" or "nuke" */ REP_ANIM(CHID(kstBrowserSelected, kchidDownUpOn), "Scene sorter, frame, mouse up on") If(GetModifierState() & fcustNuke); PlaySoundGob(kidSSorterBackground, kctgWave, kcnoNukeSnWav, 0, 0x10000, 1, 0, 1); EnqueueCid(cidSceneSortNuke, kidSSorterBackground, 0, 0, 0, 0); End; ENDCHUNK // // Scene thumbnail frame // GOBCHUNK("Scene sorter - thumbnail frame", kidSSorterThumbFrame, kgokkRectNoHit) DEFAULT_POSITION( 0, 0, 10) ENDCHUNK REP_RECT( CHID(kstDefault, krepDefault), "scene holder", kxpSSorterThumbLeft, kypSSorterThumbTop, kxpSSorterThumbRight, kypSSorterThumbBottom ) // // Transition 1 // GOBCHUNK("Scene sorter - Transition button", kidTransition1, kgokkRectHit) DEFAULT_POSITION(kxpTransition1, kypTransition1, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttTransition1) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\e3trn1.bmp", kxpregTransition1, kypregTransition1) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\e3trn1s.bmp", kxpregTransition1, kypregTransition1) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CHILD_SCRIPT("Transition 1", CHID(kstDefault, kchidClick)) EnqueueCid(cidSceneSortTransition, kidSSorterBackground, GidParThis(), 1, 0, 0); ENDCHUNK // // Transition 2 // GOBCHUNK("Scene sorter - Transition button", kidTransition2, kgokkRectHit) DEFAULT_POSITION(kxpTransition2, kypTransition2, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttTransition2) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\e3trn2.bmp", kxpregTransition2, kypregTransition2) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\e3trn2s.bmp", kxpregTransition2, kypregTransition2) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CHILD_SCRIPT("Transition 2", CHID(kstDefault, kchidClick)) EnqueueCid(cidSceneSortTransition, kidSSorterBackground, GidParThis(), 2, 0, 0); ENDCHUNK // // Transition 3 // GOBCHUNK("Scene sorter - Transition button", kidTransition3, kgokkRectHit) DEFAULT_POSITION(kxpTransition3, kypTransition3, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttTransition3) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\e3trn3.bmp", kxpregTransition3, kypregTransition3) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\e3trn3s.bmp", kxpregTransition3, kypregTransition3) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CHILD_SCRIPT("Transition 3", CHID(kstDefault, kchidClick)) EnqueueCid(cidSceneSortTransition, kidSSorterBackground, GidParThis(), 3, 0, 0); ENDCHUNK // // Transition 4 // GOBCHUNK("Scene sorter - Transition button", kidTransition4, kgokkRectHit) DEFAULT_POSITION(kxpTransition4, kypTransition4, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttTransition4) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\e3trn4.bmp", kxpregTransition4, kypregTransition4) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\e3trn4s.bmp", kxpregTransition4, kypregTransition4) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CHILD_SCRIPT("Transition 4", CHID(kstDefault, kchidClick)) EnqueueCid(cidSceneSortTransition, kidSSorterBackground, GidParThis(), 4, 0, 0); ENDCHUNK // // // Sound Listener easel // // // Listener easel for actor's very own glass // GOBCHUNK("Listen easel for actors pane of glass", kidListenGlassActor, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, CHID(kstDefault, kchidClick), cidNil, cnoNil) ENDCHUNK REP_FILL( CHID(kstDefault, krepDefault ), "Max", 0,0, kdxpBackground, kdypBackground, Transparent, Palette( 73 )) PATTERN_50 ENDCHUNK CREATE_SCRIPT("Listener easel for actor - create") CreateChildThis(kidListenBackgroundActor, kidListenBackgroundActor); ENDCHUNK CHILD_SCRIPT("Glass clicked", CHID(kstDefault, kchidClick)) PlaySoundGob(kidBackground, kctgWave, kwavSplot, 0, 0x10000, 1, 0, 1); ENDCHUNK // // Listener easel for background's very own glass // GOBCHUNK("Listen easel for background pane of glass", kidListenGlassBkgd, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, CHID(kstDefault, kchidClick), cidNil, cnoNil) ENDCHUNK REP_FILL( CHID(kstDefault, krepDefault ), "Max", 0,0, kdxpBackground, kdypBackground, Transparent, Palette( 73 )) PATTERN_50 ENDCHUNK CREATE_SCRIPT("Listener easel for background - create") CreateChildThis(kidListenBackgroundBkgd, kidListenBackgroundBkgd); ENDCHUNK CHILD_SCRIPT("Glass clicked", CHID(kstDefault, kchidClick)) PlaySoundGob(kidBackground, kctgWave, kwavSplot, 0, 0x10000, 1, 0, 1); ENDCHUNK // // Listener easel for actor Background // GOBCHUNK("Listener easel for actor background", kidListenBackgroundActor, kgokkRectHit) DEFAULT_POSITION( kxpListenBackgroundActor, kypListenBackgroundActor, 200) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault ), "studio\bmp\e4parmm.bmp", kxpregListenBackgroundActor, kypregListenBackgroundActor ) ADOPT_WAVE(kcnoEzlOpenWav, CHID(kstDefault, krepEnterAnimation)) CREATE_SCRIPT("Listener easel for actor background created") // Create the volume sliders. CreateChildThis(kidListenVolSpeech, kidListenVolSpeech); CreateChildThis(kidListenVolFX, kidListenVolFX); CreateChildThis(kidListenVolSpeechMM, kidListenVolSpeechMM); CreateChildThis(kidListenVolFXMM, kidListenVolFXMM); // Create the four nuke btns. CreateChildThis(kidListenNukeSpeech, kidListenNukeSpeech); MoveAbsGob(kidListenNukeSpeech, kxpActorListenNukeSpeech, kypActorListenNukeSpeech); CreateChildThis(kidListenNukeFX, kidListenNukeFX); MoveAbsGob(kidListenNukeFX, kxpActorListenNukeFX, kypActorListenNukeFX); CreateChildThis(kidListenNukeSpeechMM, kidListenNukeSpeechMM); MoveAbsGob(kidListenNukeSpeechMM, kxpActorListenNukeSpeechMM, kypActorListenNukeSpeechMM); CreateChildThis(kidListenNukeFXMM, kidListenNukeFXMM); MoveAbsGob(kidListenNukeFXMM, kxpActorListenNukeFXMM, kypActorListenNukeFXMM); // Create the sound name controls that exist beneath the volume sliders. CreateChildThis(kidListenEditBoxSpeech, kidListenEditBoxSpeech); MoveAbsGob(kidListenEditBoxSpeech, kxpListenActorEditBoxSpeech, kypListenActorEditBoxSpeech ); CreateChildThis(kidListenEditBoxFX, kidListenEditBoxFX); MoveAbsGob(kidListenEditBoxFX, kxpListenActorEditBoxFX, kypListenActorEditBoxFX ); CreateChildThis(kidListenEditBoxSpeechMM, kidListenEditBoxSpeechMM); MoveAbsGob(kidListenEditBoxSpeechMM, kxpListenActorEditBoxSpeechMM, kypListenActorEditBoxSpeechMM ); CreateChildThis(kidListenEditBoxFXMM, kidListenEditBoxFXMM); MoveAbsGob(kidListenEditBoxFXMM, kxpListenActorEditBoxFXMM, kypListenActorEditBoxFXMM ); // Create the Icons CreateChildThis(kidListenSpeechIcon, kidListenSpeechIcon); MoveAbsGob(kidListenSpeechIcon, kxpActorListenSpeechIcon, kypActorListenSpeechIcon); CreateChildThis(kidListenSpeechMMIcon, kidListenSpeechMMIcon); MoveAbsGob(kidListenSpeechMMIcon, kxpListenSpeechMMIcon, kypListenSpeechMMIcon); CreateChildThis(kidListenFXIcon, kidListenFXIcon); MoveAbsGob(kidListenFXIcon, kxpListenFXIcon, kypListenFXIcon); CreateChildThis(kidListenFXMMIcon, kidListenFXMMIcon); MoveAbsGob(kidListenFXMMIcon, kxpListenFXMMIcon, kypListenFXMMIcon); // reposition OK + CANCEL for the actor listener browser CreateChildThis(kidListenCancel, kidListenCancel); MoveAbsGob(kidListenCancel, kxpListenActorCancel, kypListenActorCancel ); CreateChildThis(kidListenOk, kidListenOk); MoveAbsGob(kidListenOk, kxpListenActorOk, kypListenActorOk ); // help balloon If (!::fHelpOn); CreateHelpGob(kidBackground, ktpcEaselHelp34); End; ENDCHUNK // // Listener easel for bkgd Background // GOBCHUNK("Listener easel for bkgd background", kidListenBackgroundBkgd, kgokkRectHit) DEFAULT_POSITION( kxpListenBackgroundBkgd, kypListenBackgroundBkgd, 200) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault ), "studio\bmp\e4par.bmp", kxpregListenBackgroundBkgd, kypregListenBackgroundBkgd ) ADOPT_WAVE(kcnoEzlOpenWav, CHID(kstDefault, krepEnterAnimation)) CREATE_SCRIPT("Listener easel for bkgd background created") // Create the volume sliders. CreateChildThis(kidListenVolSpeech, kidListenVolSpeech); CreateChildThis(kidListenVolFX, kidListenVolFX); CreateChildThis(kidListenVolMidi, kidListenVolMidi); // Create the three nuke btns. CreateChildThis(kidListenNukeSpeech, kidListenNukeSpeech); MoveAbsGob(kidListenNukeSpeech, kxpListenNukeSpeech, kypListenNukeSpeech); CreateChildThis(kidListenNukeFX, kidListenNukeFX); MoveAbsGob(kidListenNukeFX, kxpListenNukeFX, kypListenNukeFX); CreateChildThis(kidListenNukeMidi, kidListenNukeMidi); MoveAbsGob(kidListenNukeMidi, kxpListenNukeMidi, kypListenNukeMidi); // Create the sound name controls that exist beneath the volume sliders. CreateChildThis(kidListenEditBoxSpeech, kidListenEditBoxSpeech); CreateChildThis(kidListenEditBoxFX, kidListenEditBoxFX); CreateChildThis(kidListenEditBoxMidi, kidListenEditBoxMidi); // Create the Icons CreateChildThis(kidListenSpeechIcon, kidListenSpeechIcon); MoveAbsGob(kidListenSpeechIcon, kxpListenSpeechIcon, kypListenSpeechIcon); CreateChildThis(kidListenFXIcon, kidListenFXIcon); MoveAbsGob(kidListenFXIcon, kxpListenFXIcon, kypListenFXIcon); CreateChildThis(kidListenMidiIcon, kidListenMidiIcon); MoveAbsGob(kidListenMidiIcon, kxpListenMidiIcon, kypListenMidiIcon); CreateChildThis(kidListenCancel, kidListenCancel); CreateChildThis(kidListenOk, kidListenOk); // help balloon If (!::fHelpOn); CreateHelpGob(kidBackground, ktpcEaselHelp34); End; ENDCHUNK // // Volume sliders // // For limiting slider thumb to legal range. #define GetYPos(yPos, min, max) yPos = YMouseThis(); \ If(yPos > max); \ yPos = max; \ Elif(yPos < min); \ yPos = min; \ End; GOBCHUNK("Listener easel speech volume slider", kidListenVolSpeech, kgokkRectHit) DEFAULT_POSITION(0, 0, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, krepMouseDnOn), cidNil, cnoNil) ENDCHUNK REP_RECT(CHID(kstSliderInvisible, krepDefault), "hidden", 0, 0, 0, 0) REP_RECT(CHID(kstSliderEnabled, krepDefault), "Visible", kxpVolSpeechLeft, kypVolSpeechTop, kxpVolSpeechRight, kypVolSpeechBottom) CREATE_SCRIPT("Speech slider - create") ChangeStateThis(kstSliderInvisible); // Watch for the volume setting command sent from code. FilterCmdsThis(cidListenVolSet, cidNil, kchidScript1); ENDCHUNK CHILD_SCRIPT("par / filter cids", kchidScript1) // Convert the volume in the range 0 -> kvlmFull to the display range. // _parm[0] is the gok id // _parm[2] is the required volume setting. kid = _parm[0]; If(kid == kidListenVolSpeech); yMax = kypListenVolSpeechMax; yMin = kypListenVolSpeechMin; yNuke = kypSliderNukeSpeech; kidThumb = kidListenVolSpeechThumb; kidAudition = kidListenEditBoxSpeech; kidNuke = kidListenNukeSpeech; Elif(kid == kidListenVolFX); yMax = kypListenVolFXMax; yMin = kypListenVolFXMin; yNuke = kypSliderNukeFX; kidThumb = kidListenVolFXThumb; kidAudition = kidListenEditBoxFX; kidNuke = kidListenNukeFX; Elif(kid == kidListenVolMidi); yMax = kypListenVolMidiMax; yMin = kypListenVolMidiMin; yNuke = kypSliderNukeMidi; kidThumb = kidListenVolMidiThumb; kidAudition = kidListenEditBoxMidi; kidNuke = kidListenNukeMidi; Elif(kid == kidListenVolSpeechMM); yMax = kypListenVolSpeechMMMax; yMin = kypListenVolSpeechMMMin; yNuke = kypSliderNukeSpeechMM; kidThumb = kidListenVolSpeechMMThumb; kidAudition = kidListenEditBoxSpeechMM; kidNuke = kidListenNukeSpeechMM; Elif(kid == kidListenVolFXMM); yMax = kypListenVolFXMMMax; yMin = kypListenVolFXMMMin; yNuke = kypSliderNukeFXMM; kidThumb = kidListenVolFXMMThumb; kidAudition = kidListenEditBoxFXMM; kidNuke = kidListenNukeFXMM; End; ChangeStateGob(kid, kstSliderEnabled); ChangeStateGob(kidAudition, kstSliderEnabled); ChangeStateGob(kidNuke, kstSliderEnabled); // Only create the thumb gok if it doesn't exist yet. If(!FGobExists(kidThumb)); CreateChildGob(kid, kidThumb, kidThumb); End; FullDisplay = yNuke - yMin; NewDisplay = (_parm[2] * FullDisplay) / kvlmFull; yPos = yNuke - NewDisplay; MoveAbsGob(kidThumb, kxpSliderThumb, yPos); ENDCHUNK REP_ANIM(CHID(kstSliderEnabled, kchidDownOn), "Speech slider - Pressed") While(GetModifierState() & fcustMouse); Cell(chidNil, 0, 0, 4); GetYPos(yPos, kypListenVolSpeechMin, kypListenVolSpeechMax); MoveAbsGob(kidListenVolSpeechThumb, kxpSliderThumb, yPos); End; ENDCHUNK REP_ANIM(CHID(kstSliderEnabled, kchidDownUpOn), "Up on") GetYPos(yPos, kypListenVolSpeechMin, kypListenVolSpeechMax); FullDisplay = kypSliderNukeSpeech - kypListenVolSpeechMin + 1; NewDisplay = kypSliderNukeSpeech - yPos + 1; If(NewDisplay < 0); NewVolume = -1; Else; NewVolume = (kvlmFull * NewDisplay) / FullDisplay; End; EnqueueCid(cidEaselVol, GidParGob(GidParThis()), kidListenVolSpeech, NewVolume, 0, 0); EnqueueCid(cidEaselPlay, GidParGob(GidParThis()), kidListenEditBoxSpeech, 1, 0, 0); ENDCHUNK ADOPT_ANIM(LAST_ANIM, CHID(kstSliderEnabled, kchidDownUpOff)) GOBCHUNK("Listener easel Speech volume slider thumb", kidListenVolSpeechThumb, kgokkRectNoHit) DEFAULT_POSITION( 0, 0, 10) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\e4vol1.bmp", kxpregListenerNuke, kypregListenerNuke ) GOBCHUNK("Listener easel FX volume slider", kidListenVolFX, kgokkRectHit) DEFAULT_POSITION(0, 0, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, krepMouseDnOn), cidNil, cnoNil) ENDCHUNK REP_RECT(CHID(kstSliderInvisible, krepDefault), "hidden", 0, 0, 0, 0) REP_RECT(CHID(kstSliderEnabled, krepDefault), "Visible", kxpVolFXLeft, kypVolFXTop, kxpVolFXRight, kypVolFXBottom) REP_ANIM(CHID(kstSliderEnabled, kchidDownOn), "Down on") While(GetModifierState() & fcustMouse); Cell(chidNil, 0, 0, 4); GetYPos(yPos, kypListenVolFXMin, kypListenVolFXMax); MoveAbsGob(kidListenVolFXThumb, kxpSliderThumb, yPos); End; ENDCHUNK REP_ANIM(CHID(kstSliderEnabled, kchidDownUpOn), "Up on") GetYPos(yPos, kypListenVolFXMin, kypListenVolFXMax); FullDisplay = kypSliderNukeFX - kypListenVolSpeechMin + 1; NewDisplay = kypSliderNukeFX - yPos + 1; If(NewDisplay < 0); NewVolume = -1; Else; NewVolume = (kvlmFull * NewDisplay) / FullDisplay; End; EnqueueCid(cidEaselVol, GidParGob(GidParThis()), kidListenVolFX, NewVolume, 0, 0); EnqueueCid(cidEaselPlay, GidParGob(GidParThis()), kidListenEditBoxFX, 1, 0, 0); ENDCHUNK ADOPT_ANIM(LAST_ANIM, CHID(kstSliderEnabled, kchidDownUpOff)) CREATE_SCRIPT("Speech slider - create") ChangeStateThis(kstSliderInvisible); ENDCHUNK GOBCHUNK("Listener easel FX volume slider thumb", kidListenVolFXThumb, kgokkRectNoHit) DEFAULT_POSITION( 0, 0, 10) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\e4vol1.bmp", kxpregListenerNuke, kypregListenerNuke ) GOBCHUNK("Listener easel Midi volume slider", kidListenVolMidi, kgokkRectHit) DEFAULT_POSITION(0, 0, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, krepMouseDnOn), cidNil, cnoNil) ENDCHUNK REP_RECT(CHID(kstSliderInvisible, krepDefault), "hidden", 0, 0, 0, 0) REP_RECT(CHID(kstSliderEnabled, krepDefault), "Visible", kxpVolMidiLeft, kypVolMidiTop, kxpVolMidiRight, kypVolMidiBottom) REP_ANIM(CHID(kstSliderEnabled, kchidDownOn), "Down on") While(GetModifierState() & fcustMouse); Cell(chidNil, 0, 0, 4); GetYPos(yPos, kypListenVolMidiMin, kypListenVolMidiMax); MoveAbsGob(kidListenVolMidiThumb, kxpSliderThumb, yPos); End; ENDCHUNK REP_ANIM(CHID(kstSliderEnabled, kchidDownUpOn), "Up on") GetYPos(yPos, kypListenVolMidiMin, kypListenVolMidiMax); FullDisplay = kypSliderNukeMidi - kypListenVolSpeechMin + 1; NewDisplay = kypSliderNukeMidi - yPos + 1; If(NewDisplay < 0); NewVolume = -1; Else; NewVolume = (kvlmFull * NewDisplay) / FullDisplay; End; EnqueueCid(cidEaselVol, GidParGob(GidParThis()), kidListenVolMidi, NewVolume, 0, 0); EnqueueCid(cidEaselPlay, GidParGob(GidParThis()), kidListenEditBoxMidi, 1, 0, 0); ENDCHUNK ADOPT_ANIM(LAST_ANIM, CHID(kstSliderEnabled, kchidDownUpOff)) CREATE_SCRIPT("Speech slider - create") ChangeStateThis(kstSliderInvisible); ENDCHUNK GOBCHUNK("Listener easel Midi volume slider thumb", kidListenVolMidiThumb, kgokkRectNoHit) DEFAULT_POSITION( 0, 0, 10) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\e4vol1.bmp", kxpregListenerNuke, kypregListenerNuke ) GOBCHUNK("Listener easel speech motion matcher volume slider", kidListenVolSpeechMM, kgokkRectHit) DEFAULT_POSITION(0, 0, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, krepMouseDnOn), cidNil, cnoNil) ENDCHUNK REP_RECT(CHID(kstSliderInvisible, krepDefault), "hidden", 0, 0, 0, 0) REP_RECT(CHID(kstSliderEnabled, krepDefault), "Visible", kxpVolSpeechMMLeft, kypVolSpeechMMTop, kxpVolSpeechMMRight, kypVolSpeechMMBottom) REP_ANIM(CHID(kstSliderEnabled, kchidDownOn), "Down on") While(GetModifierState() & fcustMouse); Cell(chidNil, 0, 0, 4); GetYPos(yPos, kypListenVolSpeechMMMin, kypListenVolSpeechMMMax); MoveAbsGob(kidListenVolSpeechMMThumb, kxpSliderThumb, yPos); End; ENDCHUNK REP_ANIM(CHID(kstSliderEnabled, kchidDownUpOn), "Up on") GetYPos(yPos, kypListenVolSpeechMMMin, kypListenVolSpeechMMMax); FullDisplay = kypSliderNukeSpeechMM - kypListenVolSpeechMin + 1; NewDisplay = kypSliderNukeSpeechMM - yPos + 1; If(NewDisplay < 0); NewVolume = -1; Else; NewVolume = (kvlmFull * NewDisplay) / FullDisplay; End; EnqueueCid(cidEaselVol, GidParGob(GidParThis()), kidListenVolSpeechMM, NewVolume, 0, 0); EnqueueCid(cidEaselPlay, GidParGob(GidParThis()), kidListenEditBoxSpeechMM, 1, 0, 0); ENDCHUNK ADOPT_ANIM(LAST_ANIM, CHID(kstSliderEnabled, kchidDownUpOff)) CREATE_SCRIPT("Speech slider - create") ChangeStateThis(kstSliderInvisible); ENDCHUNK GOBCHUNK("Listener easel SpeechMM volume slider thumb", kidListenVolSpeechMMThumb, kgokkRectNoHit) DEFAULT_POSITION( 0, 0, 10) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\e4vol1.bmp", kxpregListenerNuke, kypregListenerNuke ) GOBCHUNK("Listener easel FX motion matcher volume slider", kidListenVolFXMM, kgokkRectHit) DEFAULT_POSITION(0, 0, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, krepMouseDnOn), cidNil, cnoNil) ENDCHUNK REP_RECT(CHID(kstSliderInvisible, krepDefault), "hidden", 0, 0, 0, 0) REP_RECT(CHID(kstSliderEnabled, krepDefault), "Visible", kxpVolFXMMLeft, kypVolFXMMTop, kxpVolFXMMRight, kypVolFXMMBottom) REP_ANIM(CHID(kstSliderEnabled, kchidDownOn), "Down on") While(GetModifierState() & fcustMouse); Cell(chidNil, 0, 0, 4); GetYPos(yPos, kypListenVolFXMMMin, kypListenVolFXMMMax); MoveAbsGob(kidListenVolFXMMThumb, kxpSliderThumb, yPos); End; ENDCHUNK REP_ANIM(CHID(kstSliderEnabled, kchidDownUpOn), "Up on") GetYPos(yPos, kypListenVolFXMMMin, kypListenVolFXMMMax); FullDisplay = kypSliderNukeFXMM - kypListenVolSpeechMin + 1; NewDisplay = kypSliderNukeFXMM - yPos + 1; If(NewDisplay < 0); NewVolume = -1; Else; NewVolume = (kvlmFull * NewDisplay) / FullDisplay; End; EnqueueCid(cidEaselVol, GidParGob(GidParThis()), kidListenVolFXMM, NewVolume, 0, 0); EnqueueCid(cidEaselPlay, GidParGob(GidParThis()), kidListenEditBoxFXMM, 1, 0, 0); ENDCHUNK ADOPT_ANIM(LAST_ANIM, CHID(kstSliderEnabled, kchidDownUpOff)) CREATE_SCRIPT("Speech slider - create") ChangeStateThis(kstSliderInvisible); ENDCHUNK GOBCHUNK("Listener easel FXMM volume slider thumb", kidListenVolFXMMThumb, kgokkRectNoHit) DEFAULT_POSITION( 0, 0, 10) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\e4vol1.bmp", kxpregListenerNuke, kypregListenerNuke ) // // Nuke speech button // GOBCHUNK("Listener easel nuke speech", kidListenNukeSpeech, kgokkRectHit) DEFAULT_POSITION( kxpListenNukeSpeech, kypListenNukeSpeech, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstSliderEnabled, kchidClick), cidNil, kttListenNukeSpeech) ENDCHUNK REP_RECT(CHID(kstSliderInvisible, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstSliderEnabled, krepDefault), "studio\bmp\e4nuke.bmp", kxpregListenNukeSpeech, kypregListenNukeSpeech ) ADOPT_MBMP(LAST_MBMP, CHID(kstSliderEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstSliderEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstSliderEnabled, krepMouseDnOn), "studio\bmp\e4nukec.bmp", kxpregListenNukeSpeech, kypregListenNukeSpeech ) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CHILD_SCRIPT("Listener easel nuke speech - click", CHID(kstSliderEnabled, kchidClick)) MoveAbsGob(kidListenVolSpeechThumb, kxpSliderThumb, kypListenVolSpeechMax); EnqueueCid(cidEaselVol, GidParGob(GidParThis()), kidListenVolSpeech, -1, 0, 0); ENDCHUNK // // Nuke FX button // GOBCHUNK("Listener easel nuke FX", kidListenNukeFX, kgokkRectHit) DEFAULT_POSITION( kxpListenNukeFX, kypListenNukeFX, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstSliderEnabled, kchidClick), cidNil, kttListenNukeSpeech) ENDCHUNK REP_RECT(CHID(kstSliderInvisible, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstSliderEnabled, krepDefault), "studio\bmp\e4nuke.bmp", kxpregListenNukeFX, kypregListenNukeFX ) ADOPT_MBMP(LAST_MBMP, CHID(kstSliderEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstSliderEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstSliderEnabled, krepMouseDnOn), "studio\bmp\e4nukec.bmp", kxpregListenNukeFX, kypregListenNukeFX ) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CHILD_SCRIPT("Listener easel nuke FX - click", CHID(kstSliderEnabled, kchidClick)) MoveAbsGob(kidListenVolFXThumb, kxpSliderThumb, kypListenVolFXMax); EnqueueCid(cidEaselVol, GidParGob(GidParThis()), kidListenVolFX, -1, 0, 0); ENDCHUNK // // Nuke Midi button // GOBCHUNK("Listener easel nuke Midi", kidListenNukeMidi, kgokkRectHit) DEFAULT_POSITION( kxpListenNukeMidi, kypListenNukeMidi, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstSliderEnabled, kchidClick), cidNil, kttListenNukeSpeech) ENDCHUNK REP_RECT(CHID(kstSliderInvisible, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstSliderEnabled, krepDefault), "studio\bmp\e4nuke.bmp", kxpregListenNukeMidi, kypregListenNukeMidi ) ADOPT_MBMP(LAST_MBMP, CHID(kstSliderEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstSliderEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstSliderEnabled, krepMouseDnOn), "studio\bmp\e4nukec.bmp", kxpregListenNukeMidi, kypregListenNukeMidi ) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CHILD_SCRIPT("Listener easel nuke Midi - click", CHID(kstSliderEnabled, kchidClick)) MoveAbsGob(kidListenVolMidiThumb, kxpSliderThumb, kypListenVolMidiMax); EnqueueCid(cidEaselVol, GidParGob(GidParThis()), kidListenVolMidi, -1, 0, 0); ENDCHUNK // // Nuke speech motion matcher button // GOBCHUNK("Listener easel nuke speech motion matcher", kidListenNukeSpeechMM, kgokkRectHit) DEFAULT_POSITION( kxpListenNukeSpeechMM, kypListenNukeSpeechMM, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstSliderEnabled, kchidClick), cidNil, kttListenNukeSpeech) ENDCHUNK REP_RECT(CHID(kstSliderInvisible, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstSliderEnabled, krepDefault), "studio\bmp\e4nuke.bmp", kxpregListenNukeSpeechMM, kypregListenNukeSpeechMM ) ADOPT_MBMP(LAST_MBMP, CHID(kstSliderEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstSliderEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstSliderEnabled, krepMouseDnOn), "studio\bmp\e4nukec.bmp", kxpregListenNukeSpeechMM, kypregListenNukeSpeechMM ) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CHILD_SCRIPT("Listener easel nuke speech motion matcher - click", CHID(kstSliderEnabled, kchidClick)) MoveAbsGob(kidListenVolSpeechMMThumb, kxpSliderThumb, kypListenVolSpeechMMMax); EnqueueCid(cidEaselVol, GidParGob(GidParThis()), kidListenVolSpeechMM, -1, 0, 0); ENDCHUNK // // Nuke FX motion matcher button // GOBCHUNK("Listener easel nuke FX motion matcher", kidListenNukeFXMM, kgokkRectHit) DEFAULT_POSITION( kxpListenNukeFXMM, kypListenNukeFXMM, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstSliderEnabled, kchidClick), cidNil, kttListenNukeSpeech) ENDCHUNK REP_RECT(CHID(kstSliderInvisible, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstSliderEnabled, krepDefault), "studio\bmp\e4nuke.bmp", kxpregListenNukeFXMM, kypregListenNukeFXMM ) ADOPT_MBMP(LAST_MBMP, CHID(kstSliderEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstSliderEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstSliderEnabled, krepMouseDnOn), "studio\bmp\e4nukec.bmp", kxpregListenNukeFXMM, kypregListenNukeFXMM ) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CHILD_SCRIPT("Listener easel nuke FX motion matcher - click", CHID(kstSliderEnabled, kchidClick)) MoveAbsGob(kidListenVolFXMMThumb, kxpSliderThumb, kypListenVolFXMMMax); EnqueueCid(cidEaselVol, GidParGob(GidParThis()), kidListenVolFXMM, -1, 0, 0); ENDCHUNK // // Audition areas. // GOBCHUNK("Listener easel audition speech", kidListenEditBoxSpeech, gokkNoHitKids) DEFAULT_POSITION(kxpListenEditBoxSpeech, kypListenEditBoxSpeech, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, cidNil, cidNil, kttListenEditBoxSpeech) ENDCHUNK REP_RECT(CHID(kstSliderInvisible, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstSliderEnabled, krepDefault), "studio\bmp\e4audit.bmp", kxpregListenEditBoxSpeech, kypregListenEditBoxSpeech) ADOPT_MBMP(LAST_MBMP, CHID(kstSliderEnabled, krepMouseDnOff)) REP_MBMPREG(kcell1, "studio\bmp\e4auditc.bmp", kxpregListenEditBoxSpeech, kypregListenEditBoxSpeech) REP_MBMPREG(kcell2, "studio\bmp\e4audit.bmp", kxpregListenEditBoxSpeech, kypregListenEditBoxSpeech) // Ignore any btn down event in the audition area. REP_ANIM(CHID(kstSliderEnabled, krepMouseUpOn), "Begin Rollover") // User wants an audition of this sound. EnqueueCid(cidEaselPlay, GidParGob(GidParThis()), kidListenEditBoxSpeech, 1, 0, 0); Cell(kcell1, 0, 0, 0); ENDCHUNK REP_ANIM(CHID(kstSliderEnabled, krepMouseUpOff), "End Rollover while btn up") // End the audition of this sound. EnqueueCid(cidEaselPlay, GidParGob(GidParThis()), kidListenEditBoxSpeech, 0, 0, 0); Cell(kcell2, 0, 0, 0); ENDCHUNK GOBCHUNK("Listener easel audition FX", kidListenEditBoxFX, gokkNoHitKids) DEFAULT_POSITION(kxpListenEditBoxFX, kypListenEditBoxFX, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, cidNil, cidNil, kttListenEditBoxFX) ENDCHUNK REP_RECT(CHID(kstSliderInvisible, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstSliderEnabled, krepDefault), "studio\bmp\e4audit.bmp", kxpregListenEditBoxFX, kypregListenEditBoxFX) ADOPT_MBMP(LAST_MBMP, CHID(kstSliderEnabled, krepMouseDnOff)) REP_MBMPREG(kcell1, "studio\bmp\e4auditc.bmp", kxpregListenEditBoxFX, kypregListenEditBoxFX ) REP_MBMPREG(kcell2, "studio\bmp\e4audit.bmp", kxpregListenEditBoxFX, kypregListenEditBoxFX ) REP_ANIM(CHID(kstSliderEnabled, krepMouseUpOn), "Begin Rollover") EnqueueCid(cidEaselPlay, GidParGob(GidParThis()), kidListenEditBoxFX, 1, 0, 0); Cell(kcell1, 0, 0, 0); ENDCHUNK REP_ANIM(CHID(kstSliderEnabled, krepMouseUpOff), "End Rollover") EnqueueCid(cidEaselPlay, GidParGob(GidParThis()), kidListenEditBoxFX, 0, 0, 0); Cell(kcell2, 0, 0, 0); ENDCHUNK GOBCHUNK("Listener easel audition Midi", kidListenEditBoxMidi, gokkNoHitKids) DEFAULT_POSITION(kxpListenEditBoxMidi, kypListenEditBoxMidi, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, cidNil, cidNil, kttListenEditBoxMidi) ENDCHUNK REP_RECT(CHID(kstSliderInvisible, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstSliderEnabled, krepDefault), "studio\bmp\e4audit.bmp", kxpregListenEditBoxMidi, kypregListenEditBoxMidi) ADOPT_MBMP(LAST_MBMP, CHID(kstSliderEnabled, krepMouseDnOff)) REP_MBMPREG(kcell1, "studio\bmp\e4auditc.bmp", 0, 0) REP_MBMPREG(kcell2, "studio\bmp\e4audit.bmp", 0, 0) REP_ANIM(CHID(kstSliderEnabled, krepMouseUpOn), "Begin Rollover") EnqueueCid(cidEaselPlay, GidParGob(GidParThis()), kidListenEditBoxMidi, 1, 0, 0); Cell(kcell1, 0, 0, 0); ENDCHUNK REP_ANIM(CHID(kstSliderEnabled, krepMouseUpOff), "End Rollover") EnqueueCid(cidEaselPlay, GidParGob(GidParThis()), kidListenEditBoxMidi, 0, 0, 0); Cell(kcell2, 0, 0, 0); ENDCHUNK GOBCHUNK("Listener easel audition speech motion matcher", kidListenEditBoxSpeechMM, gokkNoHitKids) DEFAULT_POSITION(kxpListenEditBoxSpeechMM, kypListenEditBoxSpeechMM, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, cidNil, cidNil, kttListenEditBoxSpeechMM) ENDCHUNK REP_RECT(CHID(kstSliderInvisible, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstSliderEnabled, krepDefault), "studio\bmp\e4audit.bmp", kxpregListenEditBoxSpeechMM, kypregListenEditBoxSpeechMM) ADOPT_MBMP(LAST_MBMP, CHID(kstSliderEnabled, krepMouseDnOff)) REP_MBMPREG(kcell1, "studio\bmp\e4auditc.bmp", 0, 0) REP_MBMPREG(kcell2, "studio\bmp\e4audit.bmp", 0, 0) REP_ANIM(CHID(kstSliderEnabled, krepMouseUpOn), "Begin Rollover") EnqueueCid(cidEaselPlay, GidParGob(GidParThis()), kidListenEditBoxSpeechMM, 1, 0, 0); Cell(kcell1, 0, 0, 0); ENDCHUNK REP_ANIM(CHID(kstSliderEnabled, krepMouseUpOff), "End Rollover while btn up") EnqueueCid(cidEaselPlay, GidParGob(GidParThis()), kidListenEditBoxSpeechMM, 0, 0, 0); Cell(kcell2, 0, 0, 0); ENDCHUNK GOBCHUNK("Listener easel audition FX motion matcher", kidListenEditBoxFXMM, gokkNoHitKids) DEFAULT_POSITION(kxpListenEditBoxFXMM, kypListenEditBoxFXMM, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, cidNil, cidNil, kttListenEditBoxFXMM) ENDCHUNK REP_RECT(CHID(kstSliderInvisible, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstSliderEnabled, krepDefault), "studio\bmp\e4audit.bmp", kxpregListenEditBoxFXMM, kypregListenEditBoxFXMM) ADOPT_MBMP(LAST_MBMP, CHID(kstSliderEnabled, krepMouseDnOff)) REP_MBMPREG(kcell1, "studio\bmp\e4auditc.bmp", 0, 0) REP_MBMPREG(kcell2, "studio\bmp\e4audit.bmp", 0, 0) REP_ANIM(CHID(kstSliderEnabled, krepMouseUpOn), "Begin Rollover") EnqueueCid(cidEaselPlay, GidParGob(GidParThis()), kidListenEditBoxFXMM, 1, 0, 0); Cell(kcell1, 0, 0, 0); ENDCHUNK REP_ANIM(CHID(kstSliderEnabled, krepMouseUpOff), "End Rollover") EnqueueCid(cidEaselPlay, GidParGob(GidParThis()), kidListenEditBoxFXMM, 0, 0, 0); Cell(kcell2, 0, 0, 0); ENDCHUNK // // Cancel button. // GOBCHUNK("Listener easel cancel", kidListenCancel, kgokkRectHit) DEFAULT_POSITION(kxpListenCancel, kypListenCancel, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttEaselCancel) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\e4can.bmp", kxpregListenCancel, kypregListenCancel) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\e4canc.bmp", kxpregListenCancel, kypregListenCancel) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) ADOPT_WAVE(kcnoCancelWav, CHID(kstDefault, krepClicked)) CHILD_SCRIPT("Listener easel cancel", CHID(kstDefault, kchidClick)) EnqueueCid(cidEaselCancel, GidParGob(GidParThis()), 0, 0, 0, 0); ENDCHUNK // // Ok button. // GOBCHUNK("Listener easel ok", kidListenOk, kgokkRectHit) DEFAULT_POSITION(kxpListenOk, kypListenOk, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttEaselOk) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\e4okay.bmp", kxpregListenOk, kypregListenOk) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\e4okayc.bmp", kxpregListenOk, kypregListenOk) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) ADOPT_WAVE(kcnoOkWav, CHID(kstDefault, krepClicked)) CHILD_SCRIPT("Listener easel ok", CHID(kstDefault, kchidClick)) EnqueueCid(cidEaselOk, GidParGob(GidParThis()), 0, 0, 0, 0); ENDCHUNK // // Tool indicators. // // Indicator Icon for Midi GOBCHUNK("Listener icon for Midi icon", kidListenMidiIcon, kgokkRectHit) DEFAULT_POSITION(0, 0, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cidNil) ENDCHUNK REP_RECT(CHID(kstDisabled, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG( CHID( kstListenLooper, krepDefault ), "studio\bmp\e4loop.bmp",0,0 ) REP_MBMPREG( CHID( kstListenSounderChain, krepDefault ), "studio\bmp\e4queue.bmp", 0,0 ) REP_MBMPREG( CHID( kstListenMatcher, krepDefault ), "studio\bmp\e4mm.bmp", 0,0 ) REP_MBMPREG( CHID( kstListenSounder, krepDefault ), "studio\bmp\e4snd.bmp", 0,0 ) // Indicator Icon for speech GOBCHUNK("Listener icon for speech icon", kidListenSpeechIcon, kgokkRectHit) DEFAULT_POSITION(0, 0, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cidNil) ENDCHUNK REP_RECT(CHID(kstDisabled, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG( CHID( kstListenLooper, krepDefault ), "studio\bmp\e4loop.bmp",0,0 ) REP_MBMPREG( CHID( kstListenSounderChain, krepDefault ), "studio\bmp\e4queue.bmp", 0,0 ) REP_MBMPREG( CHID( kstListenMatcher, krepDefault ), "studio\bmp\e4mm.bmp", 0,0 ) REP_MBMPREG( CHID( kstListenSounder, krepDefault ), "studio\bmp\e4snd.bmp", 0,0 ) // Indicator Icon for FX GOBCHUNK("Listener easel FX icon", kidListenFXIcon, kgokkRectHit) DEFAULT_POSITION(0, 0, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cidNil) ENDCHUNK REP_RECT(CHID(kstDisabled, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG( CHID( kstListenLooper, krepDefault ), "studio\bmp\e4loop.bmp",0,0 ) REP_MBMPREG( CHID( kstListenSounderChain, krepDefault ), "studio\bmp\e4queue.bmp", 0,0 ) REP_MBMPREG( CHID( kstListenMatcher, krepDefault ), "studio\bmp\e4mm.bmp", 0,0 ) REP_MBMPREG( CHID( kstListenSounder, krepDefault ), "studio\bmp\e4snd.bmp", 0,0 ) // Indicator Icon for speech MM GOBCHUNK("Listener easel Speech MM Icon", kidListenSpeechMMIcon, kgokkRectHit) DEFAULT_POSITION(0, 0, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cidNil) ENDCHUNK REP_RECT(CHID(kstDisabled, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG( CHID( kstListenLooper, krepDefault ), "studio\bmp\e4loop.bmp",0,0 ) REP_MBMPREG( CHID( kstListenSounderChain, krepDefault ), "studio\bmp\e4queue.bmp", 0,0 ) REP_MBMPREG( CHID( kstListenMatcher, krepDefault ), "studio\bmp\e4mm.bmp", 0,0 ) REP_MBMPREG( CHID( kstListenSounder, krepDefault ), "studio\bmp\e4snd.bmp", 0,0 ) // Indicator Icon for FX motion matcher GOBCHUNK("Listener easel FX MM Icon", kidListenFXMMIcon, kgokkRectHit) DEFAULT_POSITION(0, 0, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cidNil) ENDCHUNK REP_RECT(CHID(kstDisabled, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG( CHID( kstListenLooper, krepDefault ), "studio\bmp\e4loop.bmp",0,0 ) REP_MBMPREG( CHID( kstListenSounderChain, krepDefault ), "studio\bmp\e4queue.bmp", 0,0 ) REP_MBMPREG( CHID( kstListenMatcher, krepDefault ), "studio\bmp\e4mm.bmp", 0,0 ) REP_MBMPREG( CHID( kstListenSounder, krepDefault ), "studio\bmp\e4snd.bmp", 0,0 ) // // // Sound Recorder easel // // // Recorder easel's very own glass // GOBCHUNK("Recorder easel pane of glass", kidRecordGlass, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, CHID(kstDefault, kchidClick), cidNil, cnoNil) ENDCHUNK REP_FILL( CHID(kstDefault, krepDefault ), "Max", 0,0, kdxpBackground, kdypBackground, Transparent, Palette( 73 )) PATTERN_50 ENDCHUNK CREATE_SCRIPT("Recorder easel - create") CreateChildThis(kidRecordBackground, kidRecordBackground); ENDCHUNK CHILD_SCRIPT("Glass clicked", CHID(kstDefault, kchidClick)) PlaySoundGob(kidBackground, kctgWave, kwavSplot, 0, 0x10000, 1, 0, 1); ENDCHUNK // // Recorder easel background // GOBCHUNK("Record easel background", kidRecordBackground, kgokkRectHit) DEFAULT_POSITION(kxpRecordBackground, kypRecordBackground, 200) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault ), "studio\bmp\e5par.bmp", 0, 0) ADOPT_WAVE(kcnoEzlOpenWav, CHID(kstDefault, krepEnterAnimation)) CREATE_SCRIPT("Recorder easel background created") // Create the sound length indicator controls. CreateChildThis(kidRecordSoundLength, kidRecordSoundLength); // Create the sound name control. CreateChildThis(kidRecordSoundName, kidRecordSoundName); // Create the four buttons that lie across the bottom of the easel. CreateChildThis(kidRecordRecord, kidRecordRecord); CreateChildThis(kidRecordPlay, kidRecordPlay); CreateChildThis(kidRecordCancel, kidRecordCancel); CreateChildThis(kidRecordOk, kidRecordOk); // help balloon If (!::fHelpOn); CreateHelpGob(kidBackground, ktpcEaselHelp37); End; ENDCHUNK // // Sound length area. // GOBCHUNK("Recorder easel sound length", kidRecordSoundLength, gokkNoHitKids) DEFAULT_POSITION(0, 0, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, cidNil, cidNil, kttRecordSoundLength) ENDCHUNK REP_FILL( CHID(kstDefault, krepDefault ), "default", kxpRecordSoundLengthLeft, kypRecordSoundLengthTop, kxpRecordSoundLengthRight, kypRecordSoundLengthBottom, Palette( 11 ), Transparent) PATTERN_100 ENDCHUNK CREATE_SCRIPT("Create recorder length") // Filter for length setting command. FilterCmdsThis(cidRecordSetLength, cidNil, kchidScript1); ENDCHUNK CHILD_SCRIPT("par / filter cids", kchidScript1) // Fill the length thermometer as required. MaxWidth = kxpRecordSoundLengthRight - kxpRecordSoundLengthLeft + 1; NewWidth = (MaxWidth * _parm[2]) / 100; ResizeThis( NewWidth, kypRecordSoundLengthBottom - kypRecordSoundLengthTop + 1 ); ENDCHUNK // // Parent rectangle for the sound name edit box. // OBJECT("Recorder easel sound name", kidRecordSoundName, 100, kcrsArrow) REP_RECT(CHID(kstDefault, krepDefault), "Visible", kxpRecordSoundNameLeft, kypRecordSoundNameTop, kxpRecordSoundNameRight, kypRecordSoundNameBottom) // // Record button. // GOBCHUNK("Recorder easel record", kidRecordRecord, kgokkRectHit) DEFAULT_POSITION(kxpRecordRecord, kypRecordRecord, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttRecordRecord) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\e5mike.bmp", kxpregRecordRecord, kypregRecordRecord) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\e5mikes.bmp", kxpregRecordRecord, kypregRecordRecord) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CHILD_SCRIPT("Recorder easel Record", CHID(kstDefault, kchidClick)) EnqueueCid(cidEaselRecord, kidRecordGlass, 0, 0, 0, 0); // Set the state of both the record and play buttons here, // to prevent the two buttons being momentarily down simultaneously. ChangeStateGob(kidRecordPlay, kstDefault); ChangeStateGob(kidRecordRecord, kstSelected); ENDCHUNK // // Play button. // GOBCHUNK("Recorder easel play", kidRecordPlay, kgokkRectHit) DEFAULT_POSITION(kxpRecordPlay, kypRecordPlay, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttRecordPlay) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\e5play.bmp", kxpregRecordPlay, kypregRecordPlay) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\e5plays.bmp", kxpregRecordPlay, kypregRecordPlay) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) ADOPT_WAVE(kcnoRPlayWav, CHID(kstDefault, krepClicked)) ADOPT_WAVE(kcnoRPlayWav, CHID(kstSelected, krepClicked)) CHILD_SCRIPT("Recorder easel Play", CHID(kstDefault, kchidClick)) EnqueueCid(cidEaselPlay, kidRecordGlass, 0, 0, 0, 0); // Set the state of both the record and play buttons here, // to prevent the two buttons being momentarily down simultaneously. ChangeStateGob(kidRecordRecord, kstDefault); ChangeStateGob(kidRecordPlay, kstSelected); ENDCHUNK // // Cancel button. // GOBCHUNK("Recorder easel cancel", kidRecordCancel, kgokkRectHit) DEFAULT_POSITION(kxpRecordCancel, kypRecordCancel, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttRecordEaselCancel) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\e5can.bmp", kxpregRecordCancel, kypregRecordCancel) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\e5canc.bmp", kxpregRecordCancel, kypregRecordCancel) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) ADOPT_WAVE(kcnoCancelWav, CHID(kstDefault, krepClicked)) CLICK_SCRIPT("Recorder easel cancel") EnqueueCid(cidEaselCancel, kidRecordGlass, 0, 0, 0, 0); ENDCHUNK // // Ok button. // GOBCHUNK("Recorder easel ok", kidRecordOk, kgokkRectHit) DEFAULT_POSITION(kxpRecordOk, kypRecordOk, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttRecordEaselOk) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\e5okay.bmp", kxpregRecordOk, kypregRecordOk) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\e5okayc.bmp", kxpregRecordOk, kypregRecordOk) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) ADOPT_WAVE(kcnoOkWav, CHID(kstDefault, krepClicked)) CLICK_SCRIPT("Recorder easel ok") EnqueueCid(cidEaselOk, kidRecordGlass, 0, 0, 0, 0); ENDCHUNK ================================================ FILE: src/studio/esl.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** esl.cpp: Easel classes Primary Author: ****** Listener Easel: ***** Review Status: REVIEWED - any changes to this file must be reviewed! ESL is the base class for all easels. It handles cidEaselOk and cidEaselCancel commands, and calls the virtual _FAcceptChanges() function for cidEaselOk. Custom easels have their own command maps to handle specific messages, and implement _FAcceptChanges() to do the right thing. ***************************************************************************/ #include "studio.h" ASSERTNAME const long kcchMaxTdt = 50; // max length of a spletter const long kdtsMaxRecord = 10 * kdtsSecond; // max time to record a sound const long kdtimMeterUpdate = kdtimSecond / 10; // interval to update meter const long kcsampSec = 11025; // sampling rate for recorder easel long csampSec; // sampling rate for recorder easel RTCLASS(ESL) RTCLASS(ESLT) RTCLASS(ESLA) RTCLASS(SNE) RTCLASS(ESLL) RTCLASS(LSND) RTCLASS(ESLR) /*************************************************************************** Function to build a GCB for creating a child GOB ***************************************************************************/ bool FBuildGcb(PGCB pgcb, long kidParent, long kidChild) { AssertVarMem(pgcb); PGOK pgokPar; RC rcRel; pgokPar = (PGOK)vpapp->Pkwa()->PgobFromHid(kidParent); if (pvNil == pgokPar) { TrashVar(pgcb); return fFalse; } rcRel.Set(krelZero, krelZero, krelOne, krelOne); pgcb->Set(kidChild, pgokPar, fgobNil, kginDefault, pvNil, &rcRel); return fTrue; } /*************************************************************************** Sets the given gok to the given state ***************************************************************************/ void SetGokState(long kid, long st) { PGOK pgok; pgok = (PGOK)vpapp->Pkwa()->PgobFromHid(kid); if (pvNil != pgok && pgok->FIs(kclsGOK) && pgok->Sno() != st) pgok->FChangeState(st); // ignore failure } // // // // ESL (generic easel) stuff begins here // // // BEGIN_CMD_MAP(ESL, GOK) ON_CID_GEN(cidEaselOk, &ESL::FCmdDismiss, pvNil) ON_CID_GEN(cidEaselCancel, &ESL::FCmdDismiss, pvNil) END_CMD_MAP_NIL() /*************************************************************************** Create a new easel ***************************************************************************/ PESL ESL::PeslNew(PRCA prca, long kidParent, long kidEasel) { AssertPo(prca, 0); GCB gcb; PESL pesl; if (!FBuildGcb(&gcb, kidParent, kidEasel)) return pvNil; pesl = NewObj ESL(&gcb); if (pvNil == pesl) return pvNil; if (!pesl->_FInit(prca, kidEasel)) { ReleasePpo(&pesl); return pvNil; } AssertPo(pesl, 0); vpcex->EnqueueCid(cidEaselVisible); return pesl; } /*************************************************************************** Initialize the easel and make it visible ***************************************************************************/ bool ESL::_FInit(PRCA prca, long kidEasel) { AssertBaseThis(0); AssertPo(prca, 0); if (!ESL_PAR::_FInit(vpapp->Pkwa(), kidEasel, prca)) return fFalse; if (!_FEnterState(ksnoInit)) return fFalse; vpapp->DisableAccel(); STDIO::PauseActionButton(); return fTrue; } /*************************************************************************** Clean up and delete this easel ***************************************************************************/ ESL::~ESL(void) { AssertBaseThis(0); vpapp->EnableAccel(); STDIO::ResumeActionButton(); } /*************************************************************************** Dismiss and delete this easel ***************************************************************************/ bool ESL::FCmdDismiss(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); if (pcmd->cid == cidEaselOk) { bool fDismissEasel = fTrue; // Could return fTrue here if _FAcceptChanges fails to abort // dismissal of easel, but instead we release anyway to be // consistent with browsers. _FAcceptChanges(&fDismissEasel); // If we did not accept the changes, (but nothing failed), // then we will not dismiss the easel. if (!fDismissEasel) return fTrue; } Release(); // destroys entire gob tree return fTrue; } #ifdef DEBUG /*************************************************************************** Assert the validity of the ESL. ***************************************************************************/ void ESL::AssertValid(ulong grf) { ESL_PAR::AssertValid(fobjAllocated); } /*************************************************************************** Mark memory used by the ESL ***************************************************************************/ void ESL::MarkMem(void) { AssertThis(0); ESL_PAR::MarkMem(); } #endif // DEBUG // // // // ESLT (text easel) stuff begins here // // // BEGIN_CMD_MAP(ESLT, ESL) ON_CID_GEN(cidEaselRotate, &ESLT::FCmdRotate, pvNil) ON_CID_GEN(cidEaselTransmogrify, &ESLT::FCmdTransmogrify, pvNil) ON_CID_GEN(cidEaselFont, &ESLT::FCmdStartPopup, pvNil) ON_CID_GEN(cidEaselShape, &ESLT::FCmdStartPopup, pvNil) ON_CID_GEN(cidEaselTexture, &ESLT::FCmdStartPopup, pvNil) ON_CID_GEN(cidEaselSetFont, &ESLT::FCmdSetFont, pvNil) ON_CID_GEN(cidEaselSetShape, &ESLT::FCmdSetShape, pvNil) ON_CID_GEN(cidEaselSetColor, &ESLT::FCmdSetColor, pvNil) END_CMD_MAP_NIL() /*************************************************************************** Create a new text easel. If pactr is pvNil, this is for a new TDT and pstnNew, tdtsNew, and ptagTdfNew will be used as initial values. ***************************************************************************/ PESLT ESLT::PesltNew(PRCA prca, PMVIE pmvie, PACTR pactr, PSTN pstnNew, long tdtsNew, PTAG ptagTdfNew) { AssertPo(prca, 0); AssertPo(pmvie, 0); AssertNilOrPo(pactr, 0); AssertNilOrPo(pstnNew, 0); if (tdtsNew != tdtsNil) AssertIn(tdtsNew, 0, tdtsLim); AssertNilOrVarMem(ptagTdfNew); PESLT peslt; GCB gcb; if (!FBuildGcb(&gcb, kidBackground, kidSpltGlass)) return pvNil; peslt = NewObj ESLT(&gcb); if (pvNil == peslt) return pvNil; if (!peslt->_FInit(prca, kidSpltGlass, pmvie, pactr, pstnNew, tdtsNew, ptagTdfNew)) { ReleasePpo(&peslt); return pvNil; } AssertPo(peslt, 0); vpcex->EnqueueCid(cidEaselVisible); return peslt; } /*************************************************************************** Set up this easel ***************************************************************************/ bool ESLT::_FInit(PRCA prca, long kidEasel, PMVIE pmvie, PACTR pactr, PSTN pstnNew, long tdtsNew, PTAG ptagTdfNew) { AssertBaseThis(0); AssertPo(prca, 0); AssertPo(pmvie, 0); AssertNilOrPo(pactr, 0); Assert(pvNil == pactr || pactr->Ptmpl()->FIsTdt(), "only use ESLT for TDTs"); AssertNilOrPo(pstnNew, 0); if (tdtsNew != tdtsNil) AssertIn(tdtsNew, 0, tdtsLim); AssertNilOrVarMem(ptagTdfNew); GCB gcb; COST cost; STN stn; bool fNewTdt = (pactr == pvNil); PTDT ptdt; _prca = prca; _pactr = pactr; _pmvie = pmvie; if (!ESLT_PAR::_FInit(prca, kidEasel)) return fFalse; if (!FBuildGcb(&gcb, kidSpltPreviewFrame, CMH::HidUnique())) return fFalse; _psflTdts = NewObj SFL; if (pvNil == _psflTdts) return fFalse; _psflTdf = NewObj SFL; if (pvNil == _psflTdf) return fFalse; _psflMtrl = NewObj SFL; if (pvNil == _psflMtrl) return fFalse; if (fNewTdt) { AssertPo(pstnNew, 0); AssertIn(tdtsNew, 0, tdtsLim); AssertVarMem(ptagTdfNew); ptdt = TDT::PtdtNew(pstnNew, tdtsNew, ptagTdfNew); if (pvNil == ptdt) return fFalse; _pape = APE::PapeNew(&gcb, ptdt, pvNil, 0, fFalse, _prca); ReleasePpo(&ptdt); if (pvNil == _pape) return fFalse; stn = *pstnNew; } else { // We have to make a duplicate TDT rather than use the existing one // because the user may experimentally change the TDT, then hit Cancel. if (!cost.FGet(pactr->Pbody())) return fFalse; ptdt = ((PTDT)pactr->Ptmpl())->PtdtDup(); if (pvNil == ptdt) return fFalse; _pape = APE::PapeNew(&gcb, ptdt, &cost, 0, fFalse, _prca); ReleasePpo(&ptdt); if (pvNil == _pape) return fFalse; pactr->Ptmpl()->GetName(&stn); } // Set up the edit box if (!FBuildGcb(&gcb, kidSpltEditBox, CMH::HidUnique())) return fFalse; EDPAR edpar(gcb._hid, gcb._pgob, gcb._grfgob, gcb._gin, &gcb._rcAbs, &gcb._rcRel, vpappb->OnnDefVariable(), 0, vpappb->DypTextDef(), tahLeft, tavCenter); _psne = SNE::PsneNew(&edpar, this, &stn); if (pvNil == _psne) return fFalse; _psne->Activate(fTrue); _psne->SetSel(0, _psne->IchMac(), fFalse); // select all of the text _psne->SetCursCno(_prca, kcrsIBeam); return fTrue; } /*************************************************************************** Clean up and delete this easel. Note that I don't need to delete _psne or _pape because they're GOBs and are automatically destroyed with the gob tree. ***************************************************************************/ ESLT::~ESLT(void) { AssertBaseThis(0); ReleasePpo(&_psflTdts); ReleasePpo(&_psflTdf); ReleasePpo(&_psflMtrl); ReleasePpo(&_pbclTdf); ReleasePpo(&_pbclMtrl); } /*************************************************************************** Handle a rotate command ***************************************************************************/ bool ESLT::FCmdRotate(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); _pape->ChangeView(); return fTrue; } /*************************************************************************** Handle a transmogrify command (pick a random shape, font, and material) ***************************************************************************/ bool ESLT::FCmdTransmogrify(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); long tdts; CKI cki; long ithd; THD thd; TAG tagTdf; TAG tagMtrl; vpappb->BeginLongOp(); // Pick a random shape tdts = _psflTdts->LwNext(tdtsLim); // Pick a random font if (pvNil == _pbclTdf) { cki.ctg = kctgTfth; cki.cno = cnoNil; _pbclTdf = BCL::PbclNew(pvNil, &cki, ctgNil, pvNil, fTrue); } if (_pbclTdf != pvNil && _pbclTdf->IthdMac() != 0) { ithd = _psflTdf->LwNext(_pbclTdf->IthdMac()); _pbclTdf->GetThd(ithd, &thd); tagTdf = thd.tag; if (vptagm->FCacheTagToHD(&tagTdf)) { // Failure here is harmless _pape->FChangeTdt(pvNil, tdts, &tagTdf); } } // Pick a random material if (pvNil == _pbclMtrl) { cki.ctg = kctgMtth; cki.cno = cnoNil; _pbclMtrl = BCL::PbclNew(pvNil, &cki, ctgNil, pvNil, fTrue); } if (_pbclMtrl != pvNil && _pbclMtrl->IthdMac() != 0) { ithd = _psflMtrl->LwNext(_pbclMtrl->IthdMac()); _pbclMtrl->GetThd(ithd, &thd); tagMtrl = thd.tag; if (vptagm->FCacheTagToHD(&tagMtrl)) { // Failure here is harmless _pape->FSetTdtMtrl(&tagMtrl); } } vpappb->EndLongOp(); return fTrue; } /*************************************************************************** Start a popup ***************************************************************************/ bool ESLT::FCmdStartPopup(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); CKI ckiGPar; long kid; long ithumSelect = ivNil; long sidSelect = vpapp->SidProduct(); long cidSelect; TAG tagTdf; long tdts; CNO cnoSelect; ckiGPar.cno = cnoNil; switch (pcmd->cid) { case cidEaselFont: ckiGPar.ctg = kctgTfth; kid = kidSpltsFont; _pape->GetTdtInfo(pvNil, pvNil, &tagTdf); ithumSelect = tagTdf.cno; sidSelect = tagTdf.sid; cidSelect = cidEaselSetFont; break; case cidEaselShape: ckiGPar.ctg = kctgTsth; kid = kidSpltsShape; _pape->GetTdtInfo(pvNil, &tdts, pvNil); ithumSelect = tdts; cidSelect = cidEaselSetShape; break; case cidEaselTexture: ckiGPar.ctg = kctgMtth; if (_pape->FGetTdtMtrlCno(&cnoSelect)) ithumSelect = cnoSelect; else ithumSelect = ivNil; kid = kidSpltsColor; cidSelect = cidEaselSetColor; break; default: Bug("Invalid cid for ESLT::FCmdStartPopup"); break; } MP::PmpNew(kidSpltBackground, kid, _prca, pcmd, kbwsCnoRoot, ithumSelect, sidSelect, ckiGPar, ctgNil, this, cidSelect, fTrue); return fTrue; } /*************************************************************************** Handle a command to change the font ***************************************************************************/ bool ESLT::FCmdSetFont(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); TAG tagTdfOld; TAG tagTdfNew; tagTdfNew.sid = pcmd->rglw[1]; tagTdfNew.pcrf = pvNil; tagTdfNew.ctg = kctgTdf; tagTdfNew.cno = pcmd->rglw[0]; _pape->GetTdtInfo(pvNil, pvNil, &tagTdfOld); if (fcmpEq == vptagm->FcmpCompareTags(&tagTdfOld, &tagTdfNew)) return fTrue; // nothing to do // If FChangeTdt fails, someone will report the error if (vptagm->FCacheTagToHD(&tagTdfNew)) _pape->FChangeTdt(pvNil, tdtsNil, &tagTdfNew); return fTrue; } /*************************************************************************** Handle a command to change the shape ***************************************************************************/ bool ESLT::FCmdSetShape(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); long tdtsOld; long tdtsNew = pcmd->rglw[0]; _pape->GetTdtInfo(pvNil, &tdtsOld, pvNil); // If FChangeTdt fails, someone will report the error if (tdtsOld != tdtsNew) _pape->FChangeTdt(pvNil, tdtsNew, pvNil); return fTrue; } /*************************************************************************** Handle a command to change the color ***************************************************************************/ bool ESLT::FCmdSetColor(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); TAG tagTdfNew; tagTdfNew.sid = pcmd->rglw[1]; tagTdfNew.pcrf = pvNil; tagTdfNew.ctg = kctgMtrl; tagTdfNew.cno = pcmd->rglw[0]; // If FSetTdtMtrl fails, someone will report the error if (vptagm->FCacheTagToHD(&tagTdfNew)) _pape->FSetTdtMtrl(&tagTdfNew); return fTrue; } /*************************************************************************** Update the APE when the text of the SNE changed ***************************************************************************/ bool ESLT::FTextChanged(PSTN pstnNew) { AssertBaseThis(0); // we may still be setting up the ESLT AssertPo(pstnNew, 0); return _pape->FChangeTdt(pstnNew, tdtsNil, pvNil); } /*************************************************************************** Make the changes to pactr ***************************************************************************/ bool ESLT::_FAcceptChanges(bool *pfDismissEasel) { AssertThis(0); AssertVarMem(pfDismissEasel); long ich; bool fNonSpaceFound = fFalse; PACTR pactrDup = pvNil; bool fChangesMade = fFalse; PTDT ptdtOld; STN stnOld; long tdtsOld; TAG tagTdfOld; STN stnNew; long tdtsNew; TAG tagTdfNew; long cbset; long ibset; tribool fMtrl; long cmid; TAG tagMtrl; if (pvNil == _pactr) // new TDT { _pape->GetTdtInfo(&stnNew, &tdtsNew, &tagTdfNew); for (ich = 0; ich < stnNew.Cch(); ich++) { if (stnNew.Psz()[ich] != ChLit(' ')) { fNonSpaceFound = fTrue; break; } } if (!fNonSpaceFound) { // user deleted all text, so treat like a cancel vpcex->EnqueueCid(cidEaselClosing, pvNil, pvNil, fFalse); return fTrue; } if (!_pmvie->FInsTdt(&stnNew, tdtsNew, &tagTdfNew)) goto LFail; _pactr = _pmvie->Pscen()->PactrSelected(); cbset = _pape->Cbset(); // Now apply costume changes for (ibset = 0; ibset < cbset; ibset++) { if (_pape->FGetMaterial(ibset, &fMtrl, &cmid, &tagMtrl)) { if (!_pactr->FSetCostumeCore(ibset, &tagMtrl, cmid, (tribool)!fMtrl)) goto LFail; fChangesMade = fTrue; } } _pmvie->PmvuCur()->StartPlaceActor(); } else { ptdtOld = (PTDT)_pactr->Ptmpl(); if (!_pactr->FDup(&pactrDup)) goto LFail; // first apply TDT changes ptdtOld->GetInfo(&stnOld, &tdtsOld, &tagTdfOld); _pape->GetTdtInfo(&stnNew, &tdtsNew, &tagTdfNew); if (!stnOld.FEqual(&stnNew) || tdtsOld != tdtsNew || fcmpEq != TAGM::FcmpCompareTags(&tagTdfOld, &tagTdfNew)) { if (!_pmvie->FChangeActrTdt(_pactr, &stnNew, tdtsNew, &tagTdfNew)) goto LFail; fChangesMade = fTrue; } // Now apply costume changes cbset = _pape->Cbset(); for (ibset = 0; ibset < cbset; ibset++) { if (_pape->FGetMaterial(ibset, &fMtrl, &cmid, &tagMtrl)) { if (!_pactr->FSetCostumeCore(ibset, &tagMtrl, cmid, (tribool)!fMtrl)) goto LFail; fChangesMade = fTrue; } } if (fChangesMade) { if (!_pactr->FCreateUndo(pactrDup)) goto LFail; } ReleasePpo(&pactrDup); } vpcex->EnqueueCid(cidEaselClosing, pvNil, pvNil, fTrue); _pmvie->Pscen()->SelectActr(_pactr); return fTrue; LFail: if (_pactr != pvNil) { if (pvNil != pactrDup) { _pactr->Restore(pactrDup); ReleasePpo(&pactrDup); } PushErc(ercSoc3DWordChange); } else PushErc(ercSoc3DWordCreate); return fFalse; } #ifdef DEBUG /*************************************************************************** Assert the validity of the ESLT. ***************************************************************************/ void ESLT::AssertValid(ulong grf) { ESLT_PAR::AssertValid(fobjAllocated); AssertPo(_pmvie, 0); AssertNilOrPo(_pactr, 0); AssertPo(_pape, 0); AssertPo(_psne, 0); AssertPo(_prca, 0); AssertPo(_psflTdts, 0); AssertPo(_psflTdf, 0); AssertPo(_psflMtrl, 0); AssertNilOrPo(_pbclTdf, 0); AssertNilOrPo(_pbclMtrl, 0); } /*************************************************************************** Mark memory used by the ESLT. The _pape and _psne are marked automatically with the GOB tree. ***************************************************************************/ void ESLT::MarkMem(void) { AssertThis(0); ESLT_PAR::MarkMem(); MarkMemObj(_psflTdts); MarkMemObj(_psflTdf); MarkMemObj(_psflMtrl); MarkMemObj(_pbclTdf); MarkMemObj(_pbclMtrl); } #endif // DEBUG // // // // SNE (spletter name editor) stuff begins here // // // /*************************************************************************** Create a new spletter name editor with initial string pstnInit. Text change notifications will be sent to peslt. ***************************************************************************/ PSNE SNE::PsneNew(PEDPAR pedpar, PESLT peslt, PSTN pstnInit) { AssertVarMem(pedpar); AssertBasePo(peslt, 0); AssertPo(pstnInit, 0); PSNE psne; psne = NewObj SNE(pedpar); if (pvNil == psne) return pvNil; if (!psne->_FInit()) { ReleasePpo(&psne); return pvNil; } psne->_peslt = peslt; psne->SetStn(pstnInit, fFalse); return psne; } /*************************************************************************** Trap the default FReplace to prevent illegal strings and to notify the ESLT that the text has changed. ***************************************************************************/ bool SNE::FReplace(achar *prgch, long cchIns, long ich1, long ich2, long gin) { AssertThis(0); STN stnOld; STN stnNew; GetStn(&stnOld); // Note that gin is forced to ginNil here so there's no flicker if // the resulting text is illegal if (!SNE_PAR::FReplace(prgch, cchIns, ich1, ich2, ginNil)) return fFalse; // Look for illegal strings: GetStn(&stnNew); if (stnNew.Cch() > kcchMaxTdt) { SetStn(&stnOld, fFalse); GetStn(&stnNew); } #ifdef DEBUG else if (stnNew.Cch() == 5 && stnNew.Psz()[0] == ChLit(')') && stnNew.Psz()[4] == ChLit('(')) { // Hack for testing: ")xxx(" changes the TDT to // all ASCII values from xxx to xxx + kcchMaxTdt (or up to chNil). STN stnT; achar rgch[kcchMaxTdt]; long ichStart; long ich; long cch = 0; stnT.SetRgch(&stnNew.Psz()[1], 3); if (stnT.FGetLw(&ichStart, 10)) { for (ich = 0; ich < kcchMaxTdt; ich++) { rgch[ich] = (achar)ichStart + (achar)ich; if (rgch[ich] == chNil) break; cch++; } SNE_PAR::FReplace(rgch, cch, 0, IchMac(), fFalse); GetStn(&stnNew); } } #endif // DEBUG // Notify the easel so the TDT can be updated if (!_peslt->FTextChanged(&stnNew)) SetStn(&stnOld, fFalse); // Now do the actual update _UpdateLn(0, 1, 1, _dypLine, gin); return fTrue; } #ifdef DEBUG /*************************************************************************** Assert the validity of the SNE. ***************************************************************************/ void SNE::AssertValid(ulong grf) { SNE_PAR::AssertValid(fobjAllocated); AssertBasePo(_peslt, 0); } /*************************************************************************** Mark memory used by the SNE ***************************************************************************/ void SNE::MarkMem(void) { AssertThis(0); SNE_PAR::MarkMem(); } #endif // DEBUG // // // // ESLA (actor easel) stuff begins here // // // BEGIN_CMD_MAP(ESLA, ESL) ON_CID_GEN(cidEaselRotate, &ESLA::FCmdRotate, pvNil) ON_CID_GEN(cidEaselCostumes, &ESLA::FCmdTool, pvNil) ON_CID_GEN(cidEaselAccessories, &ESLA::FCmdTool, pvNil) END_CMD_MAP_NIL() /*************************************************************************** Create a new actor easel ***************************************************************************/ PESLA ESLA::PeslaNew(PRCA prca, PMVIE pmvie, PACTR pactr) { AssertPo(prca, 0); AssertPo(pmvie, 0); AssertPo(pactr, 0); PESLA pesla; GCB gcb; if (!FBuildGcb(&gcb, kidBackground, kidCostGlass)) return pvNil; pesla = NewObj ESLA(&gcb); if (pvNil == pesla) return pvNil; if (!pesla->_FInit(prca, kidCostGlass, pmvie, pactr)) { ReleasePpo(&pesla); return pvNil; } AssertPo(pesla, 0); vpcex->EnqueueCid(cidEaselVisible); return pesla; } /*************************************************************************** Set up this easel ***************************************************************************/ bool ESLA::_FInit(PRCA prca, long kidEasel, PMVIE pmvie, PACTR pactr) { AssertBaseThis(0); AssertPo(prca, 0); AssertPo(pmvie, 0); AssertPo(pactr, 0); GCB gcb; COST cost; STN stn; EDPAR edpar; if (!ESLA_PAR::_FInit(prca, kidEasel)) return fFalse; if (!cost.FGet(pactr->Pbody())) return fFalse; if (!FBuildGcb(&gcb, kidCostPreviewFrame, CMH::HidUnique())) return fFalse; _pape = APE::PapeNew(&gcb, pactr->Ptmpl(), &cost, pactr->AnidCur(), fFalse, prca); if (pvNil == _pape) return fFalse; _pape->SetToolIncCmtl(); if (!FBuildGcb(&gcb, kidCostEditBox, CMH::HidUnique())) return fFalse; edpar.Set(gcb._hid, gcb._pgob, gcb._grfgob, gcb._gin, &gcb._rcAbs, &gcb._rcRel, vpappb->OnnDefVariable(), 0, vpappb->DypTextDef(), tahLeft, tavCenter); _pmvie = pmvie; _pactr = pactr; _pactr->GetName(&stn); _pedsl = EDSL::PedslNew(&edpar); if (pvNil == _pedsl) return fFalse; _pedsl->SetStn(&stn); _pedsl->SetSel(0, _pedsl->IchMac()); // select all of the text _pedsl->Activate(fTrue); _pedsl->SetCursCno(prca, kcrsIBeam); return fTrue; } /*************************************************************************** Clean up and delete this easel. Note that I don't need to delete _pedsl or _pape because they're GOBs and are automatically destroyed with the gob tree. ***************************************************************************/ ESLA::~ESLA(void) { AssertBaseThis(0); } /*************************************************************************** Handle a rotate command ***************************************************************************/ bool ESLA::FCmdRotate(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); _pape->ChangeView(); return fTrue; } /*************************************************************************** Handle a tool change command ***************************************************************************/ bool ESLA::FCmdTool(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); switch (pcmd->cid) { case cidEaselAccessories: _pape->SetToolIncAccessory(); break; case cidEaselCostumes: _pape->SetToolIncCmtl(); break; default: Bug("unexpected cid"); break; } return fTrue; } /*************************************************************************** Make the changes to _pactr ***************************************************************************/ bool ESLA::_FAcceptChanges(bool *pfDismissEasel) { AssertThis(0); AssertVarMem(pfDismissEasel); PACTR pactrDup; bool fNonSpaceFound; long ich; bool fChangesMade = fFalse; STN stnOld; STN stnNew; long cbset; long ibset; tribool fMtrl; long cmid; TAG tagMtrl; if (!_pactr->FDup(&pactrDup)) return fFalse; _pactr->GetName(&stnOld); _pedsl->GetStn(&stnNew); if (!stnOld.FEqual(&stnNew)) { // Check for empty or "spaces only" string fNonSpaceFound = fFalse; for (ich = 0; ich < stnNew.Cch(); ich++) { if (stnNew.Psz()[ich] != ChLit(' ')) { fNonSpaceFound = fTrue; break; } } if (fNonSpaceFound) { if (!_pmvie->FNameActr(_pactr->Arid(), &stnNew)) goto LFail; fChangesMade = fTrue; } } // Now apply costume changes cbset = _pape->Cbset(); for (ibset = 0; ibset < cbset; ibset++) { if (_pape->FGetMaterial(ibset, &fMtrl, &cmid, &tagMtrl)) { if (!_pactr->FSetCostumeCore(ibset, &tagMtrl, cmid, (tribool)!fMtrl)) goto LFail; fChangesMade = fTrue; } } if (fChangesMade) { if (!_pactr->FCreateUndo(pactrDup, fFalse, &stnOld)) goto LFail; } ReleasePpo(&pactrDup); return fTrue; LFail: _pactr->Restore(pactrDup); ReleasePpo(&pactrDup); return fFalse; } #ifdef DEBUG /*************************************************************************** Assert the validity of the ESLA. ***************************************************************************/ void ESLA::AssertValid(ulong grf) { ESLA_PAR::AssertValid(fobjAllocated); AssertPo(_pmvie, 0); AssertPo(_pactr, 0); AssertPo(_pape, 0); AssertPo(_pedsl, 0); } /*************************************************************************** Mark memory used by the ESLA. The _pape and _pedsl are marked automatically with the GOB tree. ***************************************************************************/ void ESLA::MarkMem(void) { AssertThis(0); ESLA_PAR::MarkMem(); } #endif // DEBUG // // // ESLL (EaSeL Listener) // The Listener displays either all background sounds or the // actor Sound Effects and the actor Speech sounds of highest precedence. // Note: A sounder speech sound takes precedence over a motion match // speech sound // BEGIN_CMD_MAP(ESLL, ESL) ON_CID_GEN(cidEaselVol, &ESLL::FCmdVlm, pvNil) ON_CID_GEN(cidEaselPlay, &ESLL::FCmdPlay, pvNil) END_CMD_MAP_NIL() /*************************************************************************** Create a new listener easel ***************************************************************************/ PESLL ESLL::PesllNew(PRCA prca, PMVIE pmvie, PACTR pactr) { AssertPo(prca, 0); AssertPo(pmvie, 0); AssertNilOrPo(pactr, 0); PESLL pesll; GCB gcb; long kidGlass; if (pvNil == pactr) kidGlass = kidListenGlassBkgd; else kidGlass = kidListenGlassActor; if (!FBuildGcb(&gcb, kidBackground, kidGlass)) return pvNil; pesll = NewObj ESLL(&gcb); if (pvNil == pesll) return pvNil; if (!pesll->_FInit(prca, kidGlass, pmvie, pactr)) { ReleasePpo(&pesll); return pvNil; } AssertPo(pesll, 0); vpcex->EnqueueCid(cidEaselVisible); return pesll; } /*************************************************************************** Set up this easel ***************************************************************************/ bool ESLL::_FInit(PRCA prca, long kidEasel, PMVIE pmvie, PACTR pactr) { AssertBaseThis(0); AssertPo(prca, 0); AssertPo(pmvie, 0); AssertNilOrPo(pactr, 0); PGL pgltag; long vlm; bool fLoop; if (!ESLL_PAR::_FInit(prca, kidEasel)) return fFalse; _pmvie = pmvie; _pscen = pmvie->Pscen(); _pactr = pactr; if (pvNil == pactr) { // Scene sounds // Speech if (!_pscen->FQuerySnd(stySpeech, &pgltag, &vlm, &fLoop)) return fFalse; if (!_lsndSpeech.FInit(stySpeech, kidListenVolSpeech, kidListenSpeechIcon, kidListenEditBoxSpeech, &pgltag, vlm, fLoop, 0, fFalse)) { return fFalse; } // SFX if (!_pscen->FQuerySnd(stySfx, &pgltag, &vlm, &fLoop)) return fFalse; if (!_lsndSfx.FInit(stySfx, kidListenVolFX, kidListenFXIcon, kidListenEditBoxFX, &pgltag, vlm, fLoop, 0, fFalse)) { return fFalse; } // Midi if (!_pscen->FQuerySnd(styMidi, &pgltag, &vlm, &fLoop)) return fFalse; if (!_lsndMidi.FInit(styMidi, kidListenVolMidi, kidListenMidiIcon, kidListenEditBoxMidi, &pgltag, vlm, fLoop, 0, fFalse)) { return fFalse; } } else { // Actor sounds // Speech if (!_pactr->FQuerySnd(stySpeech, fFalse, &pgltag, &vlm, &fLoop)) return fFalse; if (!_lsndSpeech.FInit(stySpeech, kidListenVolSpeech, kidListenSpeechIcon, kidListenEditBoxSpeech, &pgltag, vlm, fLoop, _pactr->Arid(), fFalse)) { return fFalse; } // SFX if (!_pactr->FQuerySnd(stySfx, fFalse, &pgltag, &vlm, &fLoop)) return fFalse; if (!_lsndSfx.FInit(stySfx, kidListenVolFX, kidListenFXIcon, kidListenEditBoxFX, &pgltag, vlm, fLoop, _pactr->Arid(), fFalse)) { return fFalse; } // Motion-match speech // If no non-motion match speech sounds take precedence, display // motion match speech sounds if (!_lsndSpeech.FValidSnd()) { if (!_pactr->FQuerySnd(stySpeech, fTrue, &pgltag, &vlm, &fLoop)) return fFalse; if (!_lsndSpeechMM.FInit(stySpeech, kidListenVolSpeechMM, kidListenSpeechMMIcon, kidListenEditBoxSpeechMM, &pgltag, vlm, fLoop, _pactr->Arid(), fTrue)) { return fFalse; } } // Motion-match SFX // If no non-motion match sound effects sounds take precedence, display // motion match sound effects sounds if (!_lsndSfx.FValidSnd()) { if (!_pactr->FQuerySnd(stySfx, fTrue, &pgltag, &vlm, &fLoop)) return fFalse; if (!_lsndSfxMM.FInit(stySfx, kidListenVolFXMM, kidListenFXMMIcon, kidListenEditBoxFXMM, &pgltag, vlm, fLoop, _pactr->Arid(), fTrue)) { return fFalse; } } } return fTrue; } /*************************************************************************** Are there valid sounds in this Lsnd? ***************************************************************************/ bool LSND::FValidSnd(void) { AssertThis(0); PMSND pmsnd; long itag; TAG tag; if (pvNil == _pgltag) return fFalse; for (itag = 0; itag < _pgltag->IvMac(); itag++) { _pgltag->Get(itag, &tag); pmsnd = (PMSND)vptagm->PbacoFetch(&tag, MSND::FReadMsnd); if (pvNil == pmsnd) continue; if (!pmsnd->FValid()) { ReleasePpo(&pmsnd); continue; } ReleasePpo(&pmsnd); return fTrue; } return fFalse; } /*************************************************************************** Clean up and delete this easel ***************************************************************************/ ESLL::~ESLL(void) { AssertBaseThis(0); } /*************************************************************************** Handle a Listener volume change command ***************************************************************************/ bool ESLL::FCmdVlm(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); long kid = pcmd->rglw[0]; long vlm = pcmd->rglw[1]; switch (kid) { case kidListenVolSpeech: _lsndSpeech.SetVlmNew(vlm); break; case kidListenVolFX: _lsndSfx.SetVlmNew(vlm); break; case kidListenVolSpeechMM: _lsndSpeechMM.SetVlmNew(vlm); break; case kidListenVolFXMM: _lsndSfxMM.SetVlmNew(vlm); break; case kidListenVolMidi: _lsndMidi.SetVlmNew(vlm); break; default: Bug("Invalid kid"); break; } return fTrue; } /*************************************************************************** Handle a Listener play command ***************************************************************************/ bool ESLL::FCmdPlay(PCMD pcmd) { AssertVarMem(pcmd); AssertNilOrPo(_pactr, 0); long kid = pcmd->rglw[0]; bool fPlay = FPure(pcmd->rglw[1]); if (!fPlay) { StopAllMovieSounds(); return fTrue; } // Actor Sounds switch (kid) { case kidListenEditBoxSpeech: _lsndSpeech.Play(); break; case kidListenEditBoxFX: _lsndSfx.Play(); break; case kidListenEditBoxSpeechMM: _lsndSpeechMM.Play(); break; case kidListenEditBoxFXMM: _lsndSfxMM.Play(); break; case kidListenEditBoxMidi: _lsndMidi.Play(); break; default: Bug("Invalid Vlm type"); break; } return fTrue; } /*************************************************************************** Make the changes to _pscen or _pactr. For actor sounds, we could create an undo object here, but we currently don't. Scene sounds would require a new type of undo object so that's definitely not supported. ***************************************************************************/ bool ESLL::_FAcceptChanges(bool *pfDismissEasel) { AssertThis(0); AssertVarMem(pfDismissEasel); long vlmNew; bool fNuked; if (pvNil == _pactr) { // Scene sounds if (_lsndSpeech.FChanged(&vlmNew, &fNuked)) { if (fNuked) _pscen->RemSndCore(stySpeech); else _pscen->SetSndVlmCore(stySpeech, vlmNew); } if (_lsndSfx.FChanged(&vlmNew, &fNuked)) { if (fNuked) _pscen->RemSndCore(stySfx); else _pscen->SetSndVlmCore(stySfx, vlmNew); } if (_lsndMidi.FChanged(&vlmNew, &fNuked)) { if (fNuked) _pscen->RemSndCore(styMidi); else _pscen->SetSndVlmCore(styMidi, vlmNew); } } else { // Actor sounds if (_lsndSpeech.FChanged(&vlmNew, &fNuked)) { if (fNuked) { if (!_pactr->FDeleteSndCore(stySpeech, fFalse)) return fFalse; } else { if (!_pactr->FSetVlmSnd(stySpeech, fFalse, vlmNew)) return fFalse; } } if (_lsndSfx.FChanged(&vlmNew, &fNuked)) { if (fNuked) { if (!_pactr->FDeleteSndCore(stySfx, fFalse)) return fFalse; } else { if (!_pactr->FSetVlmSnd(stySfx, fFalse, vlmNew)) return fFalse; } } if (_lsndSpeechMM.FChanged(&vlmNew, &fNuked)) { if (fNuked) { if (!_pactr->FDeleteSndCore(stySpeech, fTrue)) return fFalse; } else { if (!_pactr->FSetVlmSnd(stySpeech, fTrue, vlmNew)) return fFalse; } } if (_lsndSfxMM.FChanged(&vlmNew, &fNuked)) { if (fNuked) { if (!_pactr->FDeleteSndCore(stySfx, fTrue)) return fFalse; } else { if (!_pactr->FSetVlmSnd(stySfx, fTrue, vlmNew)) return fFalse; } } } _pmvie->ClearUndo(); return fTrue; } #ifdef DEBUG /*************************************************************************** Assert the validity of the ESLL. ***************************************************************************/ void ESLL::AssertValid(ulong grf) { ESLL_PAR::AssertValid(fobjAllocated); } /*************************************************************************** Mark memory used by the ESLL ***************************************************************************/ void ESLL::MarkMem(void) { AssertThis(0); ESLL_PAR::MarkMem(); MarkMemObj(&_lsndSpeech); MarkMemObj(&_lsndSfx); MarkMemObj(&_lsndSpeechMM); MarkMemObj(&_lsndSfxMM); MarkMemObj(&_lsndMidi); } #endif // DEBUG // // // LSND (Listener Sound) stuff begins here // // /*************************************************************************** Initialize a LSND. Note that the LSND takes over the reference to *ppgltag. ***************************************************************************/ bool LSND::FInit(long sty, long kidVol, long kidIcon, long kidEditBox, PGL *ppgltag, long vlm, bool fLoop, long objID, bool fMatcher) { AssertBaseThis(0); AssertIn(sty, 0, styLim); AssertNilOrPo(*ppgltag, 0); long st; PGOK pgok; PTGOB ptgob; PMSND pmsnd; long itag; TAG tag; _sty = sty; _kidVol = kidVol; _kidIcon = kidIcon; _kidEditBox = kidEditBox; _pgltag = *ppgltag; *ppgltag = pvNil; _vlm = vlm; _vlmNew = vlm; _fLoop = fLoop; _objID = objID; _fMatcher = fMatcher; if (pvNil == _pgltag || 0 == _pgltag->IvMac()) return fTrue; // Set button state based on the tool if (_pgltag == pvNil || _pgltag->IvMac() == 0) st = kstListenDisabled; else if (_fMatcher) st = kstListenMatcher; else if (_pgltag->IvMac() > 1) st = kstListenSounderChain; else if (_fLoop) st = kstListenLooper; else st = kstListenSounder; // Create the TGOB to display the sound name // Search until a valid (not deleted) msnd is found for (itag = 0; itag < _pgltag->IvMac(); itag++) { _pgltag->Get(itag, &tag); pmsnd = (PMSND)vptagm->PbacoFetch(&tag, MSND::FReadMsnd); if (pvNil == pmsnd) return fFalse; if (!pmsnd->FValid()) { ReleasePpo(&pmsnd); continue; } ptgob = TGOB::PtgobCreate(kidEditBox, idsListenFont, tavCenter); if (pvNil == ptgob) { Warn("missing edit box"); ReleasePpo(&pmsnd); return fFalse; } ptgob->SetText(pmsnd->Pstn()); ReleasePpo(&pmsnd); goto LFound; } // No valid msnd -> no UI change required return fTrue; LFound: // Update the slider volume vpcex->EnqueueCid(cidListenVolSet, vpapp->Pkwa()->PgobFromHid(kidVol), pvNil, _vlm); pgok = (PGOK)vpapp->Pkwa()->PgobFromHid(kidIcon); if ((pgok != pvNil) && pgok->FIs(kclsGOK)) pgok->FChangeState(st); return fTrue; } /*************************************************************************** Play the LSND's sound ***************************************************************************/ void LSND::Play(void) { AssertThis(0); long itag; TAG tag; PMSND pmsnd; if (pvNil == _pgltag || _pgltag->IvMac() == 0) return; // nothing to play if (_vlmNew < 0) return; // don't play nuked sounds // Stop sounds that are already playing. This handles, among other // things, a problem that would otherwise occur when changing the // volume of a MIDI sound. Normally, MSND doesn't restart a MIDI // sound that's currently playing, but we want to force it to // restart here. StopAllMovieSounds(); for (itag = 0; itag < _pgltag->IvMac(); itag++) { _pgltag->Get(itag, &tag); // Verify sound before including in the event list pmsnd = (PMSND)vptagm->PbacoFetch(&tag, MSND::FReadMsnd); if (pvNil == pmsnd) continue; // ignore failure Assert(pmsnd->Sty() == _sty, 0); pmsnd->Play(_objID, _fLoop, (itag > 0), _vlmNew, 1, fTrue); ReleasePpo(&pmsnd); } } /*************************************************************************** Return whether the LSND has changed. Specifies new volume and whether the sound was nuked. ***************************************************************************/ bool LSND::FChanged(long *pvlmNew, bool *pfNuked) { AssertThis(0); AssertVarMem(pvlmNew); AssertVarMem(pfNuked); *pfNuked = (_vlmNew < 0); *pvlmNew = _vlmNew; return (_pgltag != pvNil && _pgltag->IvMac() > 0 && _vlm != _vlmNew); } /*************************************************************************** Destroy a LSND ***************************************************************************/ LSND::~LSND(void) { AssertBaseThis(0); ReleasePpo(&_pgltag); } #ifdef DEBUG /*************************************************************************** Assert the validity of the LSND. ***************************************************************************/ void LSND::AssertValid(ulong grf) { LSND_PAR::AssertValid(0); AssertNilOrPo(_pgltag, 0); } /*************************************************************************** Mark memory used by the LSND ***************************************************************************/ void LSND::MarkMem(void) { AssertThis(0); LSND_PAR::MarkMem(); MarkMemObj(_pgltag); } #endif // DEBUG // // // ESLR (Sound recording easel) stuff begins here // // BEGIN_CMD_MAP(ESLR, ESL) ON_CID_GEN(cidEaselRecord, &ESLR::FCmdRecord, pvNil) ON_CID_GEN(cidEaselPlay, &ESLR::FCmdPlay, pvNil) ON_CID_GEN(cidAlarm, &ESLR::FCmdUpdateMeter, pvNil) END_CMD_MAP_NIL() /*************************************************************************** Create a new sound recording easel ***************************************************************************/ PESLR ESLR::PeslrNew(PRCA prca, PMVIE pmvie, bool fSpeech, PSTN pstnNew) { AssertPo(prca, 0); AssertPo(pmvie, 0); AssertPo(pstnNew, 0); PESLR peslr; GCB gcb; if (!FBuildGcb(&gcb, kidBackground, kidRecordGlass)) return pvNil; peslr = NewObj ESLR(&gcb); if (pvNil == peslr) return pvNil; if (!peslr->_FInit(prca, kidRecordGlass, pmvie, fSpeech, pstnNew)) { ReleasePpo(&peslr); return pvNil; } AssertPo(peslr, 0); vpcex->EnqueueCid(cidEaselVisible); return peslr; } /*************************************************************************** Set up this easel ***************************************************************************/ bool ESLR::_FInit(PRCA prca, long kidEasel, PMVIE pmvie, bool fSpeech, PSTN pstnNew) { AssertBaseThis(0); AssertPo(prca, 0); AssertPo(pmvie, 0); AssertPo(pstnNew, 0); GCB gcb; EDPAR edpar; _pmvie = pmvie; _fSpeech = fSpeech; if (!ESLR_PAR::_FInit(prca, kidEasel)) return fFalse; if (!FBuildGcb(&gcb, kidRecordSoundName, CMH::HidUnique())) return fFalse; edpar.Set(gcb._hid, gcb._pgob, gcb._grfgob, gcb._gin, &gcb._rcAbs, &gcb._rcRel, vpappb->OnnDefVariable(), 0, vpappb->DypTextDef(), tahLeft, tavCenter); _pedsl = EDSL::PedslNew(&edpar); if (pvNil == _pedsl) return fFalse; _pedsl->SetStn(pstnNew, fFalse); _pedsl->SetSel(0, _pedsl->IchMac(), fFalse); // select all of the text _pedsl->Activate(fTrue); _pedsl->SetCursCno(prca, kcrsIBeam); // added loop around psrecNew to drop sample rate until it worked // to work around Win95 SB16 bug. (Tom Laird-McConnell) csampSec = kcsampSec; do { _psrec = SREC::PsrecNew(csampSec, 1, 1, kdtsMaxRecord); // if we failed, then the pointer is nil if (pvNil == _psrec) { // then downgrade the samples per second to next level csampSec >>= 1; } // until it succeeds, or the sample rate drops below 11025. } while ((pvNil == _psrec) && (csampSec >= 11025)); // if we still failed if (pvNil == _psrec) { PushErc(ercSndamWaveDeviceBusy); return fFalse; } _clok.Start(0); // Set sound meter to 0 PGOK pgok = (PGOK)vpapp->Pkwa()->PgobFromHid(kidRecordSoundLength); if (pvNil != pgok) vpcex->EnqueueCid(cidRecordSetLength, pgok, 0, 0, 0, 0, 0); return fTrue; } /*************************************************************************** Clean up and delete this easel ***************************************************************************/ ESLR::~ESLR(void) { AssertBaseThis(0); ReleasePpo(&_psrec); } /*************************************************************************** Update the meter that shows how long we've been recording. ***************************************************************************/ void ESLR::_UpdateMeter(void) { AssertThis(0); PGOK pgok; long dtsRec; long percentDone; // no good hungarian for a percent if (_fRecording) { dtsRec = TsCurrent() - _tsStartRec; percentDone = LwMulDiv(dtsRec, 100, kdtsMaxRecord); percentDone = LwBound(percentDone, 0, 100); pgok = (PGOK)vpapp->Pkwa()->PgobFromHid(kidRecordSoundLength); if (pvNil != pgok) vpcex->EnqueueCid(cidRecordSetLength, pgok, 0, percentDone, 0, 0, 0); else Bug("where's the sound length gok?"); } } /*************************************************************************** Start or stop recording ***************************************************************************/ bool ESLR::FCmdRecord(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); if (!_fRecording) { if (_psrec->FStart()) { _tsStartRec = TsCurrent(); _fRecording = fTrue; if (!_clok.FSetAlarm(0, this)) return fFalse; } else { SetGokState(kidRecordRecord, kstDefault); // pop out rec button _fRecording = fFalse; _UpdateMeter(); PushErc(ercSndamWaveDeviceBusy); return fFalse; } } else { if (_psrec->FStop()) { SetGokState(kidRecordRecord, kstDefault); // pop out rec button _fRecording = fFalse; _UpdateMeter(); } } return fTrue; } /*************************************************************************** Time to update the meter that shows how long we've been recording. ***************************************************************************/ bool ESLR::FCmdUpdateMeter(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); bool fRecordingOld = _fRecording; bool fPlayingOld = _fPlaying; _UpdateMeter(); _fRecording = _psrec->FRecording(); _fPlaying = _psrec->FPlaying(); if (fRecordingOld && !_fRecording) { SetGokState(kidRecordRecord, kstDefault); // pop out rec button _UpdateMeter(); } if (fPlayingOld && !_fPlaying) SetGokState(kidRecordPlay, kstDefault); // pop out play button if (_fRecording || _fPlaying) _clok.FSetAlarm(kdtimMeterUpdate, this); return fTrue; } /*************************************************************************** Play the sound that was recorded ***************************************************************************/ bool ESLR::FCmdPlay(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); if (_fRecording) { // try to stop recording if (_psrec->FStop()) { SetGokState(kidRecordRecord, kstDefault); // pop out rec button _fRecording = fFalse; _UpdateMeter(); } else { // We can't stop the recording, so set the record btn to its // selected state. (Script had popped the record btn out as // soon as the play button was selected). SetGokState(kidRecordRecord, kstSelected); // pop in rec button } } if (!_fRecording && _psrec->FHaveSound()) { if (!_fPlaying) { if (_psrec->FPlay()) { _fPlaying = fTrue; if (!_clok.FSetAlarm(0, this)) return fFalse; } } else { if (_psrec->FStop()) { _fPlaying = fFalse; SetGokState(kidRecordPlay, kstDefault); // pop out play button } } } else { SetGokState(kidRecordPlay, kstDefault); // pop out play button } return fTrue; } /*************************************************************************** Save the new sound ***************************************************************************/ bool ESLR::_FAcceptChanges(bool *pfDismissEasel) { AssertThis(0); AssertVarMem(pfDismissEasel); FNI fni; STN stn; PFIL pfil = pvNil; CNO cno; long sty = _fSpeech ? stySpeech : stySfx; long kid = _fSpeech ? kidSpeechGlass : kidFXGlass; if (_psrec->FRecording()) { if (_psrec->FStop()) { SetGokState(kidRecordRecord, kstDefault); // pop out rec button _fRecording = fFalse; _UpdateMeter(); } } if (_psrec->FPlaying()) { if (_psrec->FStop()) { _fPlaying = fFalse; SetGokState(kidRecordPlay, kstDefault); // pop out play button } } if (!_psrec->FHaveSound()) return fTrue; // user didn't record anything, so don't do anything _pedsl->GetStn(&stn); // If the user did not specify a name for the recorded sound, then // display an error and keep the recording easel displayed. if (stn.Cch() == 0) { PushErc(ercSocNoSoundName); *pfDismissEasel = fFalse; return fTrue; } if (!fni.FGetTemp()) return fFalse; if (!_psrec->FSave(&fni)) return fFalse; pfil = FIL::PfilOpen(&fni, ffilNil); if (pvNil == pfil) goto LFail; if (!_pmvie->FCopySndFileToMvie(pfil, sty, &cno, &stn)) goto LFail; // Select the item, extend lists and hilite it vpcex->EnqueueCid(cidBrowserSelectThum, vpappb->PcmhFromHid(kid), pvNil, cno, ksidUseCrf, 1, 1); ReleasePpo(&pfil); if (!fni.FDelete()) Warn("Couldn't delete temp sound file"); return fTrue; LFail: ReleasePpo(&pfil); if (!fni.FDelete()) Warn("Couldn't delete temp sound file"); return fFalse; } #ifdef DEBUG /*************************************************************************** Assert the validity of the ESLR. ***************************************************************************/ void ESLR::AssertValid(ulong grf) { ESLL_PAR::AssertValid(fobjAllocated); AssertPo(_psrec, 0); } /*************************************************************************** Mark memory used by the ESLR ***************************************************************************/ void ESLR::MarkMem(void) { AssertThis(0); ESLL_PAR::MarkMem(); MarkMemObj(_psrec); } #endif // DEBUG ================================================ FILE: src/studio/gadget.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // ----------------------------------------------------- // get our labels and gadget help // ----------------------------------------------------- // ----------------------------------------------------- // and our gadget topics // ----------------------------------------------------- ////////////////////////////////// // Gadget Start Up Ok balloon ////////////////////////////////// GOBCHUNK("Gadget Start up", kidGadgetStartUp, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow1, chidNil, cidNil, cnoNil) ENDCHUNK // grey out bkgrd REP_FILL( kcell1, "kidGadgetStartUp", 0, 0, 640, 480, Palette(73), Transparent) PATTERN_50 ENDCHUNK CREATE_SCRIPT("gadget startup created") Cell( kcell1, 0,0, 0); // draw ourselves CreateHelpThis(ktpcPrjIntro03); // then do the help balloon ENDCHUNK // ---------------------------------------------------------------- // Gadget Start Up script to run when the ok button is hit // ---------------------------------------------------------------- HELP_SCRIPT(kidGadgetStartOk) // parm[0] = group # passed in If(_parm[0] != 0); // create the gadget parent and sequencer CreateChildGob(kidBackground, kidGadgetPersistent, kidGadgetPersistent); CreateChildGob(kidBackground, kidSequenceParent, kidSequenceParent); CreateChildGob(kidBackground, kidGadgetParent, kidGadgetParent); // disable why button ChangeStateGob(kidGadgetWhy, kst2); DestroyGob(kidGadgetStartUp); Return(fTrue); Else; fMelAudio = GetProp( kpridMcZeeAudio ) & kflgMelAudio; If (._cnoSound != cnoNil && !fMelAudio); StopSoundClass(0, sclHelpSoundClass); PlaySoundGob(GidParThis(), ._ctgSound, ._cnoSound, ksqnNone, 0x10000, 1, 0, sclHelpSoundClass); End; End; ENDCHUNK ////////////////////////////////// // Gadget parent object ////////////////////////////////// GOBCHUNK("Gadget Parent", kidGadgetParent, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow1, CHID1(kchidClick), cidNil, cnoNil) ENDCHUNK REP_RECT( CHID1(krepDefault), "kidGadgetParent", 0, 0, 640, 480 ) CREATE_SCRIPT("gadget parent created") // Create the gadget body CreateChildThis(kidGadgetBody, kidGadgetBody); CreateChildThis(kidGadgetSelectorUp, kidGadgetSelectorUp); CreateChildThis(kidGadgetSelectorDown, kidGadgetSelectorDown); CreateChildThis(kidGadgetSelectorNum, kidGadgetSelectorNum); CreateChildThis(kidGadgetAviFrame, kidGadgetAviFrame); CreateChildThis(kidGadgetPlay, kidGadgetPlay); CreateChildThis(kidGadgetHow, kidGadgetHow); CreateChildThis(kidGadgetCancel, kidGadgetCancel); CreateChildThis(kidGadgetWhy, kidGadgetWhy); CreateChildThis(kidGadgetVoice, kidGadgetVoice); CreateChildThis(kidGadgetWord, kidGadgetWord); CreateChildThis(kidGadgetLockerFill, kidGadgetLockerFill); // change the gadget button to a black button ChangeStateGob(kidGadget, kst2); // start up the next sequence RunScriptThis(kchidScript1); // turn tooltips on for the gadget SetProp(kpridToolTipDelay, kdtimToolTipDelay); ENDCHUNK // create a new sequence to run CHILD_SCRIPT("Start up next project sequence", kchidScript1) // Start the current sequence(should never be past end, but...) If (::gdCurrStep <= ::gdSeqSteps[::gdCurrProj]); // reinitialize the sequence generator RunScriptGob(kidSequenceParent, kchidScript7); tbSeq = ::gdSeqNum[::gdProjEnd[::gdCurrProj - 1] + ::gdCurrStep]; CreateChildGob(kidBackground, tbSeq, tbSeq); ChangeStateGob(kidGadgetSelectorNum, (kst1 + ::gdCurrProj - 1)); // Change locker picts, pressing play handles gdcurrstep one If (::gdCurrStep > 1); CreateHelpGob(kidGadgetTextBox, ktpcGadgetTextStart + ::gdProjEnd[::gdCurrProj - 1] + ::gdCurrProj + ::gdCurrStep - 1); ChangeStateGob(kidGadgetLockerPict, kst2); Else; CreateHelpGob(kidGadgetTextBox, ktpcGadgetTextStart + ::gdProjEnd[::gdCurrProj - 1] + (::gdCurrProj - 1) + ::gdCurrStep - 1); End; End; ENDCHUNK // for handling modal dialog option on selector up and down CHILD_SCRIPT("Handle modal save options", kchidScript3) // if they choose save do nothing let next portfolio results handle it, otherwise handle it If (_parm[2] != 1); // kill all filters FilterCmdsThis(cidNil, kidNil, chidNil); // figure out what to do, 2 go on, 3 drop back to where we were If (_parm[2] == 0); DestroyGob(kidGadgetAlertGlass); If (::gdUpSelected == fTrue); RunScriptGob(kidGadgetSelectorUp, kchidScript1); Else; RunScriptGob(kidGadgetSelectorDown, kchidScript1); End; Else; CreateHelpGob(kidGadgetAlertGlass, ktpcNewMovie); End; End; ENDCHUNK // for handling portfolio ok and cancel in selectors CHILD_SCRIPT("Handle modal save options", kchidScript4) // kill all filters FilterCmdsThis(cidNil, kidNil, chidNil); // Make sure we have something to go on If(_parm[2] == fTrue); DestroyGob(kidGadgetAlertGlass); If (::gdUpSelected == fTrue); RunScriptGob(kidGadgetSelectorUp, kchidScript1); Else; RunScriptGob(kidGadgetSelectorDown, kchidScript1); End; // cancel from portfolio, put choices back up Else; CreateHelpGob(kidGadgetAlertGlass, ktpcNewMovie); End; ENDCHUNK // for handling modal dialog option on cancel CHILD_SCRIPT("Handle modal save options", kchidScript5) // if they choose save do nothing let next portfolio results handle it, otherwise handle it If (_parm[2] != 1); // kill all filters FilterCmdsThis(cidNil, kidNil, chidNil); // figure out what to do, 2 go on, 3 drop back to where we were If (_parm[2] == 0); DestroyGob(kidGadgetAlertGlass); Else; CreateHelpGob(kidGadgetAlertGlass, ktpcProjectCancel); End; End; ENDCHUNK // for handling portfolio ok and cancel on cancel CHILD_SCRIPT("Handle modal save options", kchidScript6) // kill all filters FilterCmdsThis(cidNil, kidNil, chidNil); // Make sure we have something to go on If(_parm[2] == fTrue); DestroyGob(kidGadgetAlertGlass); Else; CreateHelpGob(kidGadgetAlertGlass, ktpcProjectCancel); End; ENDCHUNK /////////////////////////////////// // gadget object /////////////////////////////////// // ----------------------------------------------------- // gadget body image that masks stuff underneath it // ----------------------------------------------------- GOBCHUNK("Body of gadget object", kidGadgetBody, kgokkRectHit) DEFAULT_POSITION(0, 0, 150) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow1, chidNil, cidNil, cnoNil) ENDCHUNK REP_MBMP( CHID1(krepDefault), "studio\bmp\gdbody.bmp") CREATE_ANIM( "gadget created" ) CreateChildThis( kidGadgetVolumePath, kidGadgetVolumePath ); ENDCHUNK // ----------------------------------------------------- // Gadget Play button // ----------------------------------------------------- GOBCHUNK("Gadget play button", kidGadgetPlay, kgokkRectHit) DEFAULT_POSITION(kxpGdPlay, kypGdPlay, 200) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand1, CHID1(kchidClick), cidNil, ttPlayButton) ENDCHUNK REP_MBMPREG(kcell1, "studio\bmp\gdplay.bmp", kxpregGdPlay, kypregGdPlay) REP_MBMPREG(kcell2, "studio\bmp\gdstop.bmp", kxpregGdPlay, kypregGdPlay) REP_ANIM(CHID(kst1, krepDefault), "play button, movie stopped") // Got the play button showing -- make sure the movie isn't playing // reset the video to the static cell ChangeStateGob(kidGadgetAvi, (kst1 + ::gdCurrProj - 1)); Cell(kcell1, 0, 0, 1); ENDCHUNK REP_ANIM(CHID(kst2, krepDefault), "play...poll movie") // tell the movie gob to play by switching state ChangeStateGob(kidGadgetAvi, (kst6 + ::gdCurrProj)); // draw our representation Cell( kcell2, 0, 0, 1 ); // now poll the movie ... if it finishes, switch button back to state 1 (stopped) While(PlayingGob(kidGadgetAvi)); Cell(chidNil, 0, 0, 10); // poll at 1/6ths of a second End; ChangeStateThis(kst1); EnqueueCid(cidGadgetAviStop, kidSequenceParent, 0, 0, 0, 0); CreateHelpGob(kidGadgetTextBox, ktpcGadgetTextStart + ::gdProjEnd[::gdCurrProj - 1] + ::gdCurrProj + ::gdCurrStep - 1); If (StateGob(kidGadgetLockerPict) == kst1); ChangeStateGob(kidGadgetLockerPict, kst2); End; // enable why button ChangeStateGob(kidGadgetWhy, kst1); ENDCHUNK CLICK_SCRIPT( "button clicked" ); If (StateThis() == kst1); ChangeStateThis(kst2); // we are play button, switch to stop button and play movie Else; ChangeStateThis(kst1); EnqueueCid(cidGadgetAviStop, kidSequenceParent, 0, 0, 0, 0); CreateHelpGob(kidGadgetTextBox, ktpcGadgetTextStart + ::gdProjEnd[::gdCurrProj - 1] + ::gdCurrProj + ::gdCurrStep - 1); If (StateGob(kidGadgetLockerPict) == kst1); ChangeStateGob(kidGadgetLockerPict, kst2); End; // enable why button ChangeStateGob(kidGadgetWhy, kst1); End; ENDCHUNK // ----------------------------------------------------- // Gadget volume thumb // ----------------------------------------------------- GOBCHUNK("Gadget Volume Thumb", kidGadgetVolumeThumb, kgokkRectNoHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow1, chidNil, cidNil, cnoNil) ENDCHUNK REP_MBMP(CHID1(krepDefault), "studio\bmp\gdvolthm.bmp") // -------------------------------------------------------------------------------- // The slider is the rectangular path the volume slider rolls around in. // kdypGadgetSlider is the height of the slidable area; kdypGadgetSliderTotal includes // height of thumbnail to be sure it will show at the min setting // -------------------------------------------------------------------------------- GOBCHUNK("Gadget Volume SliderPath", kidGadgetVolumePath, kgokkRectHit) DEFAULT_POSITION(kxpGadgetSlider, kypGadgetSlider, 210) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand1, CHID1(kchidClick), cidNil, ttVolumeControl ) ENDCHUNK REP_RECT(CHID1(krepDefault), "Gadget rectangle", 0, 0, kdxpGadgetSlider, kdypGadgetSliderTotal) CREATE_SCRIPT("Create sliderpath") CreateChildThis(kidGadgetVolumeThumb, kidGadgetVolumeThumb); // get initial volume value, move thumbnail y = kdypGadgetSlider -((GetMasterVolume() * kdypGadgetSlider) / (kvlmFull*2)); MoveAbsGob(kidGadgetVolumeThumb, 0, y); ENDCHUNK REP_ANIM(CHID1(krepMouseDnOn), "slider") // repeat up to 30000 times. .siiLoop = PlaySoundThis( kctgWave, kwavDing, 2, 0x00010000, 30000, 1, 4 ); While(1); y = YMouseThis(); If( y < 0 ); y=0; Elif(y > kdypGadgetSlider); y =kdypGadgetSlider; End; // move thumb slider MoveAbsGob(kidGadgetVolumeThumb, 0, y); // track new volume newvol = ((kvlmFull*2)* (kdypGadgetSlider-y)) / kdypGadgetSlider; // set the volume SetMasterVolume(newvol); // Sample at 10/60ths of a second. Cell(0, 0, 0, 10); End; ENDCHUNK REP_ANIM(CHID1(kchidDownUpOn), "release on") StopSound(.siiLoop); ENDCHUNK ADOPT_ANIM( LAST_ANIM, CHID1(kchidDownUpOff)) // ----------------------------------------------------- // Gadget voice toggle control // ----------------------------------------------------- GOBCHUNK("Gadget Voice Toggle", kidGadgetVoice, kgokkRectHit) DEFAULT_POSITION(kxpGdMelVoice, kypGdMelVoice, 200) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand1, CHID1(kchidClick), cidNil, ttMelanieOnOff) ENDCHUNK REP_MBMPREG(CHID1(krepDefault), "studio\bmp\gdmelon.bmp", kxpregGdMelVoice, kypregGdMelVoice) ADOPT_MBMP(LAST_MBMP, CHID1(krepMouseDnOn)) REP_MBMPREG(CHID(kst2, krepDefault), "studio\bmp\gdmeloff.bmp", kxpregGdMelVoice, kypregGdMelVoice) CREATE_ANIM("Mel Voice control") // see if voice should be on or off fMelAudio = GetProp( kpridMcZeeAudio ) & kflgMelAudio; If ( fMelAudio ); // audio suppressed = state 2 ChangeStateThis(kst2); End; ENDCHUNK CLICK_SCRIPT("voice toggle clicked") flg = GetProp( kpridMcZeeAudio ); If (StateThis() == kst1); // audio on (suppress = FALSE) flg |= kflgMelAudio; // switch to audio off (suppress = TRUE) SetProp( kpridMcZeeAudio, flg ); ChangeStateThis(kst2); StopSoundClass(0, sclHelpSoundClass); // shut her up immediately (heh heh) Else; flg &= ~kflgMelAudio; // opposite of above SetProp( kpridMcZeeAudio, flg ); ChangeStateThis(kst1); // toggle audio on / off state End; ENDCHUNK // ----------------------------------------------------- // Gadget cancel control // ----------------------------------------------------- GOBCHUNK("Gadget Cancel", kidGadgetCancel, kgokkRectHit) DEFAULT_POSITION(kxpGdClose, kypGdClose, 200) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand1, CHID1(kchidClick), cidNil, ttCloseButton) ENDCHUNK REP_MBMPREG(CHID1(krepDefault), "studio\bmp\gdclose.bmp", kxpregGdClose, kypregGdClose) ADOPT_MBMP(LAST_MBMP, CHID1(krepMouseDnOff)) REP_MBMPREG(CHID1(krepMouseDnOn), "studio\bmp\gdcloses.bmp", kxpregGdClose, kypregGdClose) CLICK_SCRIPT("Cancel clicked") // stop playing video from playing if playing If (StateGob(kidGadgetPlay) == kst2); ChangeStateGob(kidGadgetPlay, kst1); End; CreateChildGob(kidBackground, kidGadgetAlertGlass, kidGadgetAlertGlass); CreateHelpGob(kidGadgetAlertGlass, ktpcProjectCancel); ENDCHUNK CHILD_SCRIPT("Exit the gadget", kchidScript1) DestroyGob(kidSequenceParent->lastHelp); DestroyGob(kidSequenceParent); DestroyGob(kidGadget); DestroyGob(kidGadgetParent); // flag for easel help ::fHelpOn = fFalse; CreateHelpGob(kidBackground, ktpcUserQuitsHelp); ENABLEACCEL(fFalse); ENDCHUNK // ----------------------------------------------------- // Gadget alert glass for protecting against illegal click // ----------------------------------------------------- GOBCHUNK("Gadget alert glass", kidGadgetAlertGlass, kgokkRectHit) DEFAULT_POSITION(0, 0, 600) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow1, chidNil, cidNil, cnoNil) ENDCHUNK REP_FILL(CHID1(krepDefault), "Gadget alert glass", 0, 0, 640, 480, Palette(73), Transparent ) PATTERN_50X ENDCHUNK // ----------------------------------------------------- // How button // ----------------------------------------------------- GOBCHUNK("Gadget How button", kidGadgetHow, kgokkRectHit) DEFAULT_POSITION(kxpGdHow, kypGdHow, 200) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand1, CHID1(kchidClick), cidNil, ttHowButton) ENDCHUNK REP_MBMPREG(CHID1(krepDefault), "studio\bmp\gdhow.bmp", kxpregGdHow, kypregGdHow) ADOPT_MBMP(LAST_MBMP, CHID1(krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID1(krepMouseDnOff)) REP_MBMPREG(CHID1(krepMouseDnOn), "studio\bmp\gdhows.bmp", kxpregGdHow, kypregGdHow) CLICK_SCRIPT("button up clicked") ::gdCurrStep++; // turn tooltips back off SetProp(kpridToolTipDelay, 999999); DestroyGob(kidGadgetParent); // change the gadget button to normal ChangeStateGob(kidGadget, kst1); ENDCHUNK // ----------------------------------------------------- // Why button // ----------------------------------------------------- GOBCHUNK("Gadget Why button", kidGadgetWhy, kgokkRectHit) DEFAULT_POSITION(kxpGdWhy, kypGdWhy, 200) ACTION(fcustNil, fcustNil, fgrfst1, kcrsHand1, CHID1(kchidClick), cidNil, ttWhyButton) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow1, chidNil, cidNil, ttWhyButton) ENDCHUNK REP_MBMPREG(CHID(kst1, krepDefault), "studio\bmp\gdwhy.bmp", kxpregGdWhy, kypregGdWhy) ADOPT_MBMP(LAST_MBMP, CHID(kst1, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kst1, krepMouseDnOff)) REP_MBMPREG(CHID(kst1, krepMouseDnOn), "studio\bmp\gdwhys.bmp", kxpregGdWhy, kypregGdWhy) REP_MBMPREG(CHID(kst2, krepDefault), "studio\bmp\gdwhyd.bmp", kxpregGdWhy, kypregGdWhy) CLICK_SCRIPT("button clicked") // ChangeStateGob( kidGadgetPlay, kst1 ); ENDCHUNK REP_WAVE( CHID1( krepClicked ), "studio\sound\gemtip.wav" ) // ----------------------------------------------------- // Selector up button // ----------------------------------------------------- GOBCHUNK("Gadget up button", kidGadgetSelectorUp, kgokkRectHit) DEFAULT_POSITION(kxpGdSelUp, kypGdSelUp, 200) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand1, CHID1(kchidClick), cidNil, ttNextMovie) ENDCHUNK REP_MBMPREG(CHID(kst1, krepDefault), "studio\bmp\gdselup.bmp", kxpregGdSelUp, kypregGdSelUp) ADOPT_MBMP(LAST_MBMP, CHID(kst1, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kst1, krepMouseDnOff)) REP_MBMPREG(CHID(kst1, krepMouseDnOn), "studio\bmp\gdselups.bmp", kxpregGdSelUp, kypregGdSelUp) ADOPT_WAVE( kcnoPageUpWav, CHID1( krepClicked )) CLICK_SCRIPT("button up clicked") ::gdUpSelected = fTrue; // stop playing video from playing if playing If (StateGob(kidGadgetPlay) == kst2); ChangeStateGob(kidGadgetPlay, kst1); End; // if already working on project#x then prompt If (::gdCurrStep > 1); CreateChildGob(kidBackground, kidGadgetAlertGlass, kidGadgetAlertGlass); CreateHelpGob(kidGadgetAlertGlass, ktpcNewMovie); Else; RunScriptThis(kchidScript1); End; ENDCHUNK CHILD_SCRIPT("Up button selected", kchidScript1) // if last project then wrap around to first If (::gdCurrProj > 5); ::gdCurrProj = 1; Else; ::gdCurrProj++; End; ::gdCurrStep = 1; ChangeStateGob(kidGadgetSelectorNum, (kst1 + ::gdCurrProj - 1)); If (StateGob(kidGadgetPlay) == kst2); ChangeStateGob(kidGadgetPlay, kst1); Else; ChangeStateGob(kidGadgetAvi, (kst1 + ::gdCurrProj - 1)); End; If (StateGob(kidGadgetLockerPict) == kst2); ChangeStateGob(kidGadgetLockerPict, kst1); End; // disable why button ChangeStateGob(kidGadgetWhy, kst2); RunScriptGob(kidGadgetParent, kchidScript1); ENDCHUNK // ----------------------------------------------------- // Selector number // ----------------------------------------------------- GOBCHUNK("Gadget selector number", kidGadgetSelectorNum, gokkNoHit) DEFAULT_POSITION(kxpGdMovieNum, kypGdMovieNum, 200) // ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow1, CHID1(kchidClick), cidNil, cnoNil) ENDCHUNK REP_MBMPREG(CHID(kst1, krepDefault), "studio\bmp\gdmovie1.bmp", kxpregGdMovieNum, kypregGdMovieNum) REP_MBMPREG(CHID(kst2, krepDefault), "studio\bmp\gdmovie2.bmp", kxpregGdMovieNum, kypregGdMovieNum) REP_MBMPREG(CHID(kst3, krepDefault), "studio\bmp\gdmovie3.bmp", kxpregGdMovieNum, kypregGdMovieNum) REP_MBMPREG(CHID(kst4, krepDefault), "studio\bmp\gdmovie4.bmp", kxpregGdMovieNum, kypregGdMovieNum) REP_MBMPREG(CHID(kst5, krepDefault), "studio\bmp\gdmovie5.bmp", kxpregGdMovieNum, kypregGdMovieNum) REP_MBMPREG(CHID(kst6, krepDefault), "studio\bmp\gdmovie6.bmp", kxpregGdMovieNum, kypregGdMovieNum) // ----------------------------------------------------- // Selector down button // ----------------------------------------------------- GOBCHUNK("Gadget down button", kidGadgetSelectorDown, kgokkRectHit) DEFAULT_POSITION(kxpGdSelDn, kypGdSelDn, 200) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand1, CHID1(kchidClick), cidNil, ttPreviousMovie) ENDCHUNK REP_MBMPREG(CHID(kst1, krepDefault), "studio\bmp\gdseldn.bmp", kxpregGdSelDn, kypregGdSelDn) ADOPT_MBMP(LAST_MBMP, CHID(kst1, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kst1, krepMouseDnOff)) REP_MBMPREG(CHID(kst1, krepMouseDnOn), "studio\bmp\gdseldns.bmp", kxpregGdSelDn, kypregGdSelDn) ADOPT_WAVE( kcnoPageDnWav, CHID1( krepClicked )) CLICK_SCRIPT("button down clicked") ::gdUpSelected = fFalse; // stop playing video from playing if playing If (StateGob(kidGadgetPlay) == kst2); ChangeStateGob(kidGadgetPlay, kst1); End; // if already working on project#x then prompt If (::gdCurrStep > 1); CreateChildGob(kidBackground, kidGadgetAlertGlass, kidGadgetAlertGlass); CreateHelpGob(kidGadgetAlertGlass, ktpcNewMovie); Else; RunScriptThis(kchidScript1); End; ENDCHUNK CHILD_SCRIPT("Down button selected", kchidScript1) // if first project then wrap around to last If (::gdCurrProj < 2); ::gdCurrProj = 6; Else; ::gdCurrProj--; End; ::gdCurrStep = 1; ChangeStateGob(kidGadgetSelectorNum, (kst1 + ::gdCurrProj - 1)); If (StateGob(kidGadgetPlay) == kst2); ChangeStateGob(kidGadgetPlay, kst1); Else; ChangeStateGob(kidGadgetAvi, (kst1 + ::gdCurrProj - 1)); End; If (StateGob(kidGadgetLockerPict) == kst2); ChangeStateGob(kidGadgetLockerPict, kst1); End; // disable why button ChangeStateGob(kidGadgetWhy, kst2); RunScriptGob(kidGadgetParent, kchidScript1); ENDCHUNK // ----------------------------------------------------- // The frame around the movie, movies parent // ----------------------------------------------------- GOBCHUNK("Gadget movie avi frame", kidGadgetAviFrame, gokkNoHit) DEFAULT_POSITION( 241, 84, 200) // ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow1, CHID1(kchidClick), cidNil, cnoNil) ENDCHUNK REP_RECT(CHID1(krepDefault), "avi", 0, 0, 160, 90 ) CREATE_ANIM("") CreateChildThis(kidGadgetAvi, kidGadgetAvi); ENDCHUNK // ----------------------------------------------------- // The area inside the movie frame // ----------------------------------------------------- GOBCHUNK("Gadget movie avi", kidGadgetAvi, gokkNoHit) DEFAULT_POSITION( 0, 0, 100) // ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow1, CHID1(kchidClick), cidNil, cnoNil) ENDCHUNK REP_MBMP(CHID(kst1, krepDefault), "studio\bmp\gdavi1.bmp") REP_MBMP(CHID(kst2, krepDefault), "studio\bmp\gdavi3.bmp") REP_MBMP(CHID(kst3, krepDefault), "studio\bmp\gdavi2.bmp") REP_MBMP(CHID(kst4, krepDefault), "studio\bmp\gdavi6.bmp") REP_MBMP(CHID(kst5, krepDefault), "studio\bmp\gdavi5.bmp") REP_MBMP(CHID(kst6, krepDefault), "studio\bmp\gdavi4.bmp") REP_VIDEO(CHID(kst7, krepDefault), "proj1.avi", fTrue) REP_VIDEO(CHID(kst8, krepDefault), "proj2.avi", fTrue) REP_VIDEO(CHID(kst9, krepDefault), "proj3.avi", fTrue) REP_VIDEO(CHID(kst10, krepDefault), "proj4.avi", fTrue) REP_VIDEO(CHID(kst11, krepDefault), "proj5.avi", fTrue) REP_VIDEO(CHID(kst12, krepDefault), "proj6.avi", fTrue) CREATE_ANIM("") ChangeStateThis(kst1 + (::gdCurrProj - 1)); ENDCHUNK // ----------------------------------------------------- // The frame behind the text // ----------------------------------------------------- GOBCHUNK("Gadget text area", kidGadgetWord, gokkNoHit) DEFAULT_POSITION(0, 0, 200) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow1, chidNil, cidNil, cnoNil) ENDCHUNK REP_MBMP(CHID(kst1, krepDefault), "studio\bmp\gdword.bmp") CREATE_ANIM("Text box created") CreateChildThis(kidGadgetTextBox, kidGadgetTextBox); ENDCHUNK // ----------------------------------------------------- // The "fill" is the area that is writable on the word bitmap // ----------------------------------------------------- GOBCHUNK("Gadget text box fill", kidGadgetTextBox, gokkNoHit) DEFAULT_POSITION(0, 0, 200) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow1, chidNil, cidNil, cnoNil) ENDCHUNK REP_FILL(CHID(kst1, krepDefault), "Text Box Fill", kTextBoxFillLeft, kTextBoxFillTop, kTextBoxFillRight, kTextBoxFillBottom, Transparent, Transparent) PATTERN_0 ENDCHUNK // ----------------------------------------------------- // The "fill" is behind the locker bmps, lockers parent // ----------------------------------------------------- GOBCHUNK("Gadget locker fill", kidGadgetLockerFill, gokkNoHit) DEFAULT_POSITION(0, 0, 200) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow1, chidNil, cidNil, cnoNil) ENDCHUNK REP_FILL(CHID(kst1, krepDefault), "Locker Fill", kLockerFillLeft, kLockerFillTop, kLockerFillRight, kLockerFillBottom, Palette(20), Transparent) PATTERN_50X ENDCHUNK CREATE_ANIM("gadget created") CreateChildThis(kidGadgetLockerPict, kidGadgetLockerPict); ENDCHUNK // ----------------------------------------------------- // The picture in the gadgets locker area // ----------------------------------------------------- GOBCHUNK("Gadget locker picture", kidGadgetLockerPict, gokkNoHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow1, chidNil, cidNil, cnoNil) ENDCHUNK REP_MBMP(kcell1, "studio\bmp\pnshot7.bmp") REP_MBMP(kcell2, "studio\bmp\pnshot7a.bmp") REP_MBMP(kcell3, "studio\bmp\pnshot7b.bmp") REP_MBMP(kcell4, "studio\bmp\pnshot7c.bmp") REP_MBMP(kcell5, "studio\bmp\pnshot7d.bmp") REP_MBMP(kcell6, "studio\bmp\pnshot7e.bmp") REP_MBMP(kcell7, "studio\bmp\pnshot7f.bmp") REP_MBMP(kcell8, "studio\bmp\pnshot5.bmp") REP_MBMP(kcell9, "studio\bmp\pnshot5a.bmp") REP_MBMP(kcell10, "studio\bmp\pnshot5b.bmp") REP_MBMP(kcell11, "studio\bmp\pnshot5c.bmp") REP_MBMP(kcell12, "studio\bmp\pnshot5d.bmp") REP_MBMP(kcell13, "studio\bmp\pnshot9a.bmp") REP_MBMP(kcell14, "studio\bmp\pnshot9b.bmp") REP_MBMP(kcell15, "studio\bmp\pnshot9c.bmp") // Review::temps - need bitmaps for project 6 REP_MBMP(kcell16, "studio\bmp\pnshot4.bmp") REP_MBMP(kcell17, "studio\bmp\pnshot4a.bmp") REP_MBMP(kcell18, "studio\bmp\pnshot4b.bmp") REP_MBMP(kcell19, "studio\bmp\pnshot4c.bmp") REP_MBMP(kcell20, "studio\bmp\pnshot4d.bmp") REP_MBMP(kcell21, "studio\bmp\pnshot4e.bmp") REP_MBMP(kcell22, "studio\bmp\pnshot6.bmp") REP_MBMP(kcell23, "studio\bmp\pnshot6a.bmp") REP_MBMP(kcell24, "studio\bmp\pnshot6b.bmp") REP_MBMP(kcell25, "studio\bmp\pnshot6c.bmp") REP_MBMP(kcell26, "studio\bmp\pnshot6d.bmp") REP_MBMP(kcell27, "studio\bmp\pnshot6e.bmp") REP_MBMP(kcell28, "studio\bmp\pnshot6f.bmp") REP_MBMP(kcell29, "studio\bmp\pnshot6g.bmp") REP_MBMP(kcell30, "studio\bmp\pnshot6h.bmp") REP_MBMP(kcell31, "studio\bmp\pnshot6i.bmp") REP_MBMP(kcell32, "studio\bmp\pnshot8.bmp") REP_MBMP(kcell33, "studio\bmp\pnshot8a.bmp") REP_MBMP(kcell34, "studio\bmp\pnshot8b.bmp") REP_MBMP(kcell35, "studio\bmp\pnshot8c.bmp") REP_MBMP(kcell36, "studio\bmp\pnshot8d.bmp") REP_MBMP(kcell37, "studio\bmp\pnclosed.bmp") REP_ANIM(CHID(kst1, krepDefault), "Show closed locker") Cell(kcell37, 0, 0, 1); ENDCHUNK REP_ANIM(CHID(kst2, krepDefault), "Show first step of current project") Cell((kcell1 + ::gdProjEnd[::gdCurrProj - 1] + ::gdCurrStep - 1) , 0, 0, 1); ENDCHUNK // ------------------------------------------------------- // Up and down selector arrows function // ------------------------------------------------------- HELP_SCRIPT(ktpcNewMovie) // 0 means play sound, else see what button was hit If (_parm[0] != 0); // try another movie If (_parm[0] == 1); // clear existing moving in studio EnqueueCid(cidNew, khidStudio, 0, 0, 0, 0); // if we are past step 1 save stuff will come up, need to handle it If (::gdCurrStep > 1); FilterCmdsGob(kidGadgetParent, cidQuerySaveDocResult, kidNil, kchidScript3); FilterCmdsGob(kidGadgetParent, cidPortfolioResult, kidNil, kchidScript4); DestroyGob(kgobProjectHot); Else; If (::gdUpSelected == fTrue); RunScriptGob(kidGadgetSelectorUp, kchidScript1); Else; RunScriptGob(kidGadgetSelectorDown, kchidScript1); End; DestroyGob(kidGadgetAlertGlass); End; // continue with current project Else; DestroyGob(kidGadgetAlertGlass); End; Return(fTrue); Else; // If (._cnoSound != cnoNil && ::fMelAudio); StopSoundClass(0, sclHelpSoundClass); // PlaySoundGob(GidParThis(), ._ctgSound, ._cnoSound, ksqnNone, 0x10000, 1, 0, sclHelpSoundClass); // End; End; ENDCHUNK // ------------------------------------------------------- // Cancel button function // ------------------------------------------------------- HELP_SCRIPT(ktpcProjectCancel) // 0 means play sound, else see what button was hit If(_parm[0] != 0); // work on your own If (_parm[0] == 1); // work on my own case RunScriptGob(kidGadgetCancel, kchidScript1); DestroyGob(kidGadgetAlertGlass); // go to projects room Elif (_parm[0] == 2); If (::gdCurrStep > 1); FilterCmdsGob(kidGadgetParent, cidQuerySaveDocResult, kidNil, kchidScript5); FilterCmdsGob(kidGadgetParent, cidPortfolioResult, kidNil, kchidScript6); DestroyGob(kgobProjectHot); End; // go back to the projects room case ENABLEACCEL(fFalse); EnqueueCid(cidLoadBuilding, 0, 0, 0, 0, 0); // continue project Else; DestroyGob(kidGadgetAlertGlass); End; Return(fTrue); Else; fMelAudio = GetProp( kpridMcZeeAudio ) & kflgMelAudio; If (._cnoSound != cnoNil && !fMelAudio); StopSoundClass(0, sclHelpSoundClass); PlaySoundGob(GidParThis(), ._ctgSound, ._cnoSound, ksqnNone, 0x10000, 1, 0, sclHelpSoundClass); End; End; ENDCHUNK ================================================ FILE: src/studio/gadgpers.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ //------------------------------------------------------- // gadgpers.cht - Persistent object for the gadget //------------------------------------------------------- // // Store an array that keeps track ofthe current topic for // each object in the gadget. If not already created // everything will default to the first topic // // Review::This will probably be replace by globals later //------------------------------------------------------- GOBCHUNK("Persisent Gadget", kidGadgetPersistent, gokkNoHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow1, chidNil, cidNil, cnoNil) ENDCHUNK REP_ANIM(CHID1(krepDefault), "Gadget Persistent") // current project and step for that project ::gdCurrProj = ::NextProject; ::gdCurrStep = 1; // which selector button was last hit ::gdUpSelected = fTrue; // number of steps in each sequence ::gdSeqSteps[1] = 7; ::gdSeqSteps[2] = 5; ::gdSeqSteps[3] = 3; ::gdSeqSteps[4] = 6; ::gdSeqSteps[5] = 10; ::gdSeqSteps[6] = 5; // Last step in each sequence, all are kept as one big sequence ::gdProjEnd[0] = 0; ::gdProjEnd[1] = 7; ::gdProjEnd[2] = 12; ::gdProjEnd[3] = 15; ::gdProjEnd[4] = 21; ::gdProjEnd[5] = 31; ::gdProjEnd[6] = 36; // Sequence ids for each step // Review::make sequential and just use first one ::gdSeqNum[1] = kid1Project01; ::gdSeqNum[2] = kid1Project02; ::gdSeqNum[3] = kid1Project03; ::gdSeqNum[4] = kid1Project04; ::gdSeqNum[5] = kid1Project05; ::gdSeqNum[6] = kid1Project06; ::gdSeqNum[7] = kid1Project07; ::gdSeqNum[8] = kid3Project01; ::gdSeqNum[9] = kid3Project02; ::gdSeqNum[10] = kid3Project03; ::gdSeqNum[11] = kid3Project04; ::gdSeqNum[12] = kid3Project05; ::gdSeqNum[13] = kid2Project01; ::gdSeqNum[14] = kid2Project02; ::gdSeqNum[15] = kid2Project03; ::gdSeqNum[16] = kid6Project01; ::gdSeqNum[17] = kid6Project02; ::gdSeqNum[18] = kid6Project03; ::gdSeqNum[19] = kid6Project04; ::gdSeqNum[20] = kid6Project05; ::gdSeqNum[21] = kid6Project06; ::gdSeqNum[22] = kid5Project01; ::gdSeqNum[23] = kid5Project02; ::gdSeqNum[24] = kid5Project03; ::gdSeqNum[25] = kid5Project04; ::gdSeqNum[26] = kid5Project05; ::gdSeqNum[27] = kid5Project06; ::gdSeqNum[28] = kid5Project07; ::gdSeqNum[29] = kid5Project08; ::gdSeqNum[30] = kid5Project09; ::gdSeqNum[31] = kid5Project10; ::gdSeqNum[32] = kid4Project01; ::gdSeqNum[33] = kid4Project02; ::gdSeqNum[34] = kid4Project03; ::gdSeqNum[35] = kid4Project04; ::gdSeqNum[36] = kid4Project05; ENDCHUNK ================================================ FILE: src/studio/helpbook.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // ----------------------------------------------------- // CHT file that defines the interaction with the // Help Book. // // Modified / Reviewed: // 5.29.95 ***** -- made to use ::globals // ----------------------------------------------------- // WAVE FILES for the help book //WAVE_CHUNK("studio\sound\hmbtn.wav", kcnoHelpMainWav ) WAVE_CHUNK("studio\sound\next.wav", kcnoHelpMainWav ) WAVE_CHUNK("studio\sound\next.wav", kcnoHelpNextWav ) WAVE_CHUNK("studio\sound\back.wav", kcnoHelpBackWav ) // WAVE_CHUNK ("studio\sound\bingo.wav", wavBingo) //------------------------------------------------------------------ // Help book parent object //------------------------------------------------------------------ OBJECT("Help Book Parent", kgobHelpBookParent, 100, kcrsArrow) REP_RECT(CHID1(krepDefault), "kgobHelpBookParent", 0,0, 640, 480 ) CREATE_ANIM("help book parent created") .last = kidNil; // .last = kid of last primary button hilited .lasthow = kidNil; // .lasthow = kid of last how to button hilited .hsshow = 0; // flag: is how to sub section showing? DISABLEACCEL(fFalse); // Note: the above disable hotkeys while the book is up. // Note that since enables have to match with disables, any way the book is killed // *must* reenable the keys. So far, the two book deconstructors are : // hit cancel (easy) choose a tool topic or how to. // eat all keys while the book is up FilterCmdsThis(cidKey, kidNil, kchidScript9); // Create the help gizmo and the fill CreateChildThis( kgobHelpBookGizmo, kgobHelpBookGizmo ); CreateChildThis( kgobHelpBookFillPar, kgobHelpBookFillPar ); CreateChildThis( kgobHelpBookHowSub, kgobHelpBookHowSub ); // Switch to the current section + topic RunScriptThis(kchidScript4, ::HBSection, ::HBtpcCur[::HBSection ] ); ENDCHUNK //------------------------------------------------------------------ // Script to switch to a particular section (first page of) // //------------------------------------------------------------------ CHILD_SCRIPT( "help book : switch to section", kchidScript1 ) If( _parm[0] != 1 ); tpc = ::HBtpcEnd[ _parm[0]-1 ] +1; Else; tpc = ktpcBook1TOC; End; // display! RunScriptThis( kchidScript4, _parm[0], tpc ); ENDCHUNK //------------------------------------------------------------------ // Script to switch to the previous page. // -- no parameters -- //------------------------------------------------------------------ CHILD_SCRIPT("help book : prev page", kchidScript2) // find current section # and topic sec = ::HBSection; top = ::HBtpcCur[sec]; If (top == ktpcBookStart); // Can't go previous at first page TOC Exit(); End; top--; // Check to see if we underflow the current section If (sec > 1); If (top <= ::HBtpcEnd[sec - 1]); // Did underflow. Decrement section # (topic # is ok) sec--; End; End; // Then tell the book to switch to that page RunScriptThis(kchidScript4, sec, top); ENDCHUNK //------------------------------------------------------------------ // Script to switch to the next page. // -- no parameters -- //------------------------------------------------------------------ CHILD_SCRIPT( "help book : next page", kchidScript3 ) // find current section # and topic sec = ::HBSection; top = ::HBtpcCur[ sec ]; If (top == ktpcBookEnd); // Can't go next at last page Exit(); End; top++; If (sec < 10); // Check to see if we overflow the current section If (top > ::HBtpcEnd[sec]); // Did overflow. Decrement section # (topic # is ok) sec++; End; End; // tell the book to switch to that page RunScriptThis(kchidScript4, sec, top ); ENDCHUNK // ------------------------------------------------------------- // Switch book display to section passed as _parm0, topic = _parm1 // // This is the core of the help book display; all other scripts // fall through here for update. // // Parameters: _parm[0] = section # // _parm[1] = topic id // ------------------------------------------------------------- CHILD_SCRIPT( "help book : switch to section", kchidScript4 ) sec = _parm[0]; tpc = _parm[1]; ::HBSection = sec; // update global section variable ::HBtpcCur[sec] = tpc; // and MRU page in that section (for book re-open) // deselect last main section button If (.last != kidNil); ChangeStateGob(.last, kst1); // - deselect the last End; // select new one gob = Select(sec, kidNil, kgobHelpBookPrimary1, kgobHelpBookPrimary2, kgobHelpBookPrimary3, kgobHelpBookPrimary3, kgobHelpBookPrimary3, kgobHelpBookPrimary3, kgobHelpBookPrimary3, kgobHelpBookPrimary3, kgobHelpBookPrimary4, kgobHelpBookPrimary5); If( gob != kidNil ); ChangeStateGob(gob, kst2); .last = gob; End; // If it's a HOW TO section -- select the second piece too If ( sec >= 3 && sec <= 8); // set our lastsub section value ::HBLastsub = sec; // send out how sub bar If (.hsshow == 0); ChangeStateGob(kgobHelpBookHowSub, kst2); .hsshow = 1; End; // deselect the last "how to" subtopic If (.lasthow != kidNil); ChangeStateGob(.lasthow, kst1); End; // Select current how to gob = Select( sec - 2, 0, kgobHelpHowButton1, kgobHelpHowButton2, kgobHelpHowButton3, kgobHelpHowButton4, kgobHelpHowButton5, kgobHelpHowButton6); // Select & keep track of the last how to subtopic selected ChangeStateGob(gob, kst2); .lasthow = gob; // wasn't a how sub section, get rid of How To subsection Else; If (.hsshow == 1); ChangeStateGob(kgobHelpBookHowSub, kst3); .hsshow = 0; End; End; // Check and set state of page forward button (kst2 = disabled) ChangeStateGob( kgobHelpBookPageFwd, ((tpc) >= ktpcBookEnd ) ? kst2 : kst1 ); // Check and set state of page back button (kst2 = disabled) ChangeStateGob( kgobHelpBookPageBack, (tpc <= ktpcBookStart ) ? kst2 : kst1 ); // Calculate the page # ... section one is a special case start = (sec == 1 ) ? (ktpcBookStart - 1) : (::HBtpcEnd[sec - 1]); // Now put values into the stringtable so help can show em. NumToStr((::HBtpcEnd[sec] - start), stidMaxPage); NumToStr((tpc - start), stidCurrPage); // destroy previous gobs If (FGobExists(kgobHelpBookBkgd)); DestroyGob(kgobHelpBookBkgd); DestroyGob(kgobHelpBookPageNum); DestroyGob(kgobHelpBookPageLeft); End; // create the title for this topic CreateHelpGob(kgobHelpTitlePar, tpcTitle1 + sec - 1); // and then the page itself CreateHelpGob(kgobHelpBookGizmo, tpcPageNumber); // set the rectangle which holds the topics up st = (sec > 2 && sec < 9) ? kst2 : kst1; ChangeStateGob( kgobHelpBookFillPar, st ); // and create the help topic CreateHelpGob(kgobHelpBookFillPar, tpc); ENDCHUNK // ------------------------------------------------------------- // script to eat and throw away key clicks CHILD_SCRIPT( "help book : switch to section", kchidScript9 ) Return( fTrue ); ENDCHUNK /////////////////////////////////// // Help book gizmo object /////////////////////////////////// // ----------------------------------------------------- // Gizmo body image that masks stuff underneath it // ----------------------------------------------------- OBJECTTY("Help Book Gizmo", kgobHelpBookGizmo, 180, kcrsArrow, kgokkRectHit ) REP_MBMP(CHID1(krepDefault), "studio\bmp\gizmo.bmp") CREATE_ANIM("help gizmo created") // Spot for the Help topic title CreateChildGob( GidParThis(), kgobHelpTitlePar, kgobHelpTitlePar ); // And controls / buttons on top... CreateChildThis(kgobHelpBookVolume, kgobHelpBookVolume); CreateChildThis( kgobHelpBookVolumePath, kgobHelpBookVolumePath ); CreateChildThis(kgobHelpBookVoice, kgobHelpBookVoice); CreateChildThis(kgobHelpBookPageBack, kgobHelpBookPageBack); CreateChildThis(kgobHelpBookPageFwd, kgobHelpBookPageFwd); CreateChildThis(kgobHelpBookCancel, kgobHelpBookCancel); CreateChildThis(kgobHelpBookPrimary1, kgobHelpBookPrimary1); CreateChildThis(kgobHelpBookPrimary2, kgobHelpBookPrimary2); CreateChildThis(kgobHelpBookPrimary3, kgobHelpBookPrimary3); CreateChildThis(kgobHelpBookPrimary4, kgobHelpBookPrimary4); CreateChildThis(kgobHelpBookPrimary5, kgobHelpBookPrimary5); ENDCHUNK // ----------------------------------------------------- // The "fill" is the background page color - it changes // for each major book section // ----------------------------------------------------- OBJECT("Help Book Fill parent", kgobHelpBookFillPar, 200, kcrsArrow) REP_RECT(CHID(kst1, krepDefault), "state1:normal", kLeftPageL, kTopPage, kLeftPageR, kBottomPage ) REP_RECT(CHID(kst2, krepDefault), "state2:howto", kLeftPageL2, kTopPage, kLeftPageR, kBottomPage ) // this object is the balloon itself OBJECT("Help Book Fill", kgobHelpBookFill, 200, kcrsArrow) REP_FILL(CHID(kst1, krepDefault), "fill", kLeftPageL, kTopPage, kLeftPageR, kBottomPage, Transparent, Transparent) PATTERN_0 ENDCHUNK // ----------------------------------------------------- // Help book primary button #1 // ----------------------------------------------------- OBJECT("Help Table of Contents", kgobHelpBookPrimary1, 350, kcrsHand1) REP_MBMP(CHID1(krepDefault), "studio\bmp\prim1.bmp") ADOPT_MBMP(LAST_MBMP, CHID1( krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID1( krepMouseDnOff)) REP_MBMP(CHID(kst2, krepDefault), "studio\bmp\prim1s.bmp") ADOPT_MBMP(LAST_MBMP, CHID(kst2, krepDefault)) CLICK_SCRIPT("button1 clicked") // set section 1 RunScriptGob( kgobHelpBookParent, kchidScript1, 1 ); ENDCHUNK ADOPT_WAVE( kcnoHelpMainWav, CHID1(krepClicked)) // ----------------------------------------------------- // Help book primary button #2 // ----------------------------------------------------- OBJECT("Help Basics", kgobHelpBookPrimary2, 350, kcrsHand1) REP_MBMP(CHID1(krepDefault), "studio\bmp\prim2.bmp") ADOPT_MBMP(LAST_MBMP, CHID1( krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID1( krepMouseDnOff)) REP_MBMP(CHID(kst2, krepDefault), "studio\bmp\prim2s.bmp") ADOPT_MBMP(LAST_MBMP, CHID(kst2, krepDefault)) CLICK_SCRIPT("button2 clicked") // set section 1 RunScriptGob( kgobHelpBookParent, kchidScript1, 2 ); ENDCHUNK ADOPT_WAVE( kcnoHelpMainWav, CHID1(krepClicked)) // ----------------------------------------------------- // Help book primary button #3 // ----------------------------------------------------- OBJECT("Help How To", kgobHelpBookPrimary3, 350, kcrsHand1) REP_MBMP(CHID1(krepDefault), "studio\bmp\prim3.bmp") ADOPT_MBMP(LAST_MBMP, CHID1( krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID1( krepMouseDnOff)) REP_MBMP(CHID(kst2, krepDefault), "studio\bmp\prim3s.bmp") ADOPT_MBMP(LAST_MBMP, CHID(kst2, krepDefault)) CLICK_SCRIPT("button3 clicked") // Set book to last section within "How To" section RunScriptGob( kgobHelpBookParent, kchidScript1, ::HBLastsub ); ENDCHUNK ADOPT_WAVE( kcnoHelpMainWav, CHID1(krepClicked)) // ----------------------------------------------------- // Help book primary button #4 // ----------------------------------------------------- OBJECT("Help Tools", kgobHelpBookPrimary4, 350, kcrsHand1) REP_MBMP(CHID1(krepDefault), "studio\bmp\prim4.bmp") ADOPT_MBMP(LAST_MBMP, CHID1( krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID1( krepMouseDnOff)) REP_MBMP(CHID(kst2, krepDefault), "studio\bmp\prim4s.bmp") ADOPT_MBMP(LAST_MBMP, CHID(kst2, krepDefault)) CLICK_SCRIPT("button4 clicked") // set section 1 RunScriptGob( kgobHelpBookParent, kchidScript1, 9 ); ENDCHUNK ADOPT_WAVE( kcnoHelpMainWav, CHID1(krepClicked)) // ----------------------------------------------------- // Help book primary button #5 // ----------------------------------------------------- OBJECT("Help Tips", kgobHelpBookPrimary5, 350, kcrsHand1) REP_MBMP(CHID1(krepDefault), "studio\bmp\prim5.bmp") ADOPT_MBMP(LAST_MBMP, CHID1( krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID1( krepMouseDnOff)) REP_MBMP(CHID(kst2, krepDefault), "studio\bmp\prim5s.bmp") ADOPT_MBMP(LAST_MBMP, CHID(kst2, krepDefault)) CLICK_SCRIPT("button5 clicked") // set section 1 RunScriptGob( kgobHelpBookParent, kchidScript1, 10 ); ENDCHUNK ADOPT_WAVE( kcnoHelpMainWav, CHID1(krepClicked)) // ----------------------------------------------------- // Gizmo volume control // ----------------------------------------------------- OBJECTTTREG("Help Book Volume", kgobHelpBookVolume, 350, kcrsHand1, ttBookVolume, 39, 168) REP_MBMPREG(CHID1(krepDefault), "studio\bmp\volume.bmp", 39, 168) // -------------------------------------------------------------------------------- // The thumbnail is the graphic indicator of volume level... // positioned within the slide path - not hittable // -------------------------------------------------------------------------------- OBJECTTY( "HelpBook - volume slider", kgobHelpBookVolumeSlider, 60, kcrsArrow1, kgokkRectNoHit ) REP_MBMP( CHID1( krepDefault ), "studio\bmp\volthmb.bmp" ) // -------------------------------------------------------------------------------- // The slider is the rectangular path the volume slider rolls around in. // kdypHelpBookSlider is the height of the slidable area; kdypHelpBookSliderTotal includes // height of thumbnail to be sure it will show at the min setting // -------------------------------------------------------------------------------- OBJECTREG( "map - volume slidepath", kgobHelpBookVolumePath, kxpHelpBookSlider, kypHelpBookSlider, 500, kcrsHand1) REP_RECT( CHID1( krepDefault), "HelpBook rectangle", 0, 0, kdxpHelpBookSlider, kdypHelpBookSliderTotal ) CREATE_SCRIPT( "create slidepath") CreateChildThis( kgobHelpBookVolumeSlider, kgobHelpBookVolumeSlider ); // get initial volume value, move thumbnail y = kdypHelpBookSlider -(( GetMasterVolume() * kdypHelpBookSlider )/ (2*kvlmFull)); MoveAbsGob( kgobHelpBookVolumeSlider, 0, y ); ENDCHUNK REP_ANIM( CHID1( krepMouseDnOn), "slider") // repeat up to 30000 times. .siiLoop = PlaySoundThis( kctgWave, kwavDing, 2, 0x00010000, 30000, 1, 4 ); While( 1 ); y = YMouseThis(); If( y < 0 ); y=0; Elif( y > kdypHelpBookSlider ); y =kdypHelpBookSlider; End; // move thumb slider MoveAbsGob( kgobHelpBookVolumeSlider, 0, y ); // track new volume newvol = ( (2*kvlmFull) * (kdypHelpBookSlider-y) ) / kdypHelpBookSlider; // set the volume SetMasterVolume( newvol ); // Sample at 10/60ths of a second. Cell( 0 , 0,0, 10 ); End; ENDCHUNK REP_ANIM( CHID1( kchidDownUpOn ), "release on" ) StopSound( .siiLoop ); ENDCHUNK ADOPT_ANIM( LAST_ANIM, CHID1( kchidDownUpOff )) // ----------------------------------------------------- // Gizmo voice toggle control // ----------------------------------------------------- OBJECTTTREG("Help Book Voice Toggle", kgobHelpBookVoice, 350, kcrsHand1, ttBookVoice, kxpHelpBookVoice, kypHelpBookVoice) REP_MBMPREG(CHID1(krepDefault), "studio\bmp\vocon.bmp", kxpregHelpBookVoice, kypregHelpBookVoice ) ADOPT_MBMP(LAST_MBMP, CHID1(krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID1(krepMouseDnOff)) ADOPT_MBMP( LAST_MBMP, CHID( kst2, krepMouseDnOn )) REP_MBMPREG(CHID1( krepMouseDnOn ), "studio\bmp\vocoff.bmp", kxpregHelpBookVoice, kypregHelpBookVoice ) ADOPT_MBMP(LAST_MBMP, CHID(kst2, krepDefault)) CREATE_ANIM("MZ Voice control") // see if voice should be on or off fMZAudio = GetProp( kpridMcZeeAudio ) & kflgMcZeeAudio; If ( fMZAudio ); // audio suppressed = state 2 ChangeStateThis(kst2); End; ENDCHUNK CLICK_SCRIPT("voice toggle clicked") flg = GetProp( kpridMcZeeAudio ); If (StateThis() == kst1); // audio on (suppress = FALSE) flg |= kflgMcZeeAudio; // switch to audio off (suppress = TRUE) SetProp( kpridMcZeeAudio, flg ); ChangeStateThis(kst2); Else; flg &= ~kflgMcZeeAudio; // opposite of above SetProp( kpridMcZeeAudio, flg ); ChangeStateThis(kst1); // toggle audio on / off state End; ENDCHUNK // ----------------------------------------------------- // Page forward control // ----------------------------------------------------- GOBCHUNK("Help Book Page Forward", kgobHelpBookPageFwd, kgokkNormal) DEFAULT_POSITION( kxpHelpBookPageFwd, kypHelpBookPageFwd, 350) ACTION(fcustNil, fcustNil, fgrfst1, kcrsHand1, CHID(kst1, kchidClick), cidNil, ttBookPageFwd) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK CHILD_SCRIPT("page Fwd clicked", CHID(kst1, kchidClick)) RunScriptGob( kgobHelpBookParent, kchidScript3 ); ENDCHUNK REP_MBMPREG(CHID1(krepDefault), "studio\bmp\pgfwd.bmp" , kxpregHelpBookPageFwd, kypregHelpBookPageFwd ) ADOPT_MBMP(LAST_MBMP, CHID1( krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID1( krepMouseDnOff)) REP_MBMPREG(CHID1( krepMouseDnOn), "studio\bmp\pgfwdds.bmp", kxpregHelpBookPageFwd, kypregHelpBookPageFwd ) REP_RECT( CHID(kst2, krepDefault), "hidden",0,0,0,0 ) ADOPT_MBMP(LAST_MBMP, CHID(kst2, krepDefault)) ADOPT_WAVE( kcnoHelpNextWav , CHID1(krepClicked)) // ----------------------------------------------------- // Page back control // ----------------------------------------------------- GOBCHUNK("Help Book Page Back", kgobHelpBookPageBack, kgokkNormal) DEFAULT_POSITION( kxpHelpBookPageBack, kypHelpBookPageBack, 350) ACTION(fcustNil, fcustNil, fgrfst1, kcrsHand1, CHID(kst1, kchidClick), cidNil, ttBookPageBack) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK CHILD_SCRIPT("page back clicked", CHID(kst1, kchidClick)) RunScriptGob( kgobHelpBookParent, kchidScript2 ); ENDCHUNK REP_MBMPREG(CHID1(krepDefault), "studio\bmp\pgback.bmp" , kxpregHelpBookPageBack, kypregHelpBookPageBack) ADOPT_MBMP(LAST_MBMP, CHID1( krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID1( krepMouseDnOff)) REP_MBMPREG(CHID1(krepMouseDnOn), "studio\bmp\pgbackds.bmp", kxpregHelpBookPageBack, kypregHelpBookPageBack) REP_RECT( CHID(kst2, krepDefault), "hidden",0,0,0,0 ) ADOPT_WAVE( kcnoHelpBackWav , CHID1(krepClicked)) // ----------------------------------------------------- // Help book cancel control -- ttBookCancel // ----------------------------------------------------- OBJECTTTREG("Help Book Cancel", kgobHelpBookCancel, 350, kcrsHand1, ttBookCancel, kxpHelpBookCancel, kypHelpBookCancel) REP_MBMPREG(CHID1(krepDefault), "studio\bmp\hcancel.bmp", kxpregHelpBookCancel, kypregHelpBookCancel) ADOPT_MBMP(LAST_MBMP, CHID1(krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID1(krepMouseDnOff)) REP_MBMPREG(CHID1(krepMouseDnOn), "studio\bmp\hcancelc.bmp", kxpregHelpBookCancel, kypregHelpBookCancel) ADOPT_MBMP(LAST_MBMP, CHID(kst2, krepDefault)) CLICK_SCRIPT("Cancel clicked") ENABLEACCEL(fFalse); DestroyGob(kgobHelpBookParent); ENDCHUNK ADOPT_WAVE(kcnoCancelWav, CHID1(krepClicked)) // ----------------------------------------------------- // How To Section subsection // ----------------------------------------------------- OBJECT("Help Book How To Sub", kgobHelpBookHowSub, 250, kcrsArrow) CREATE_ANIM("help book howsub-create") // create all of our children and set appropriate states CreateChildThis(kgobHelpHowButton1, kgobHelpHowButton1); CreateChildThis(kgobHelpHowButton2, kgobHelpHowButton2); CreateChildThis(kgobHelpHowButton3, kgobHelpHowButton3); CreateChildThis(kgobHelpHowButton4, kgobHelpHowButton4); CreateChildThis(kgobHelpHowButton5, kgobHelpHowButton5); CreateChildThis(kgobHelpHowButton6, kgobHelpHowButton6); ENDCHUNK REP_RECT( CHID1( krepDefault ), "blank", 0, 0, 0, 0 ) REP_MASK( CHID( kst2, krepDefault ), "studio\bmp\howmsk.bmp", 0, 0 ); REP_RECT( CHID( kst3, krepDefault ), "blank", 0, 0, 0, 0 ) // ----------------------------------------------------- // First "how to" subsection button // ----------------------------------------------------- OBJECT("Help Book How button1", kgobHelpHowButton1, 275, kcrsHand1) REP_MBMP(CHID(kst1, krepDefault), "studio\bmp\hbut1.bmp") ADOPT_MBMP(LAST_MBMP, CHID1( krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID1( krepMouseDnOff)) REP_MBMP(CHID(kst2, krepDefault), "studio\bmp\hbut1s.bmp") ADOPT_MBMP(LAST_MBMP, CHID(kst2, krepDefault)) CLICK_SCRIPT("button1 clicked") // set book to section 3 RunScriptGob( kgobHelpBookParent, kchidScript1, 3 ); ENDCHUNK // ----------------------------------------------------- // Second "how to" subsection button // ----------------------------------------------------- OBJECT("Help Book How button2", kgobHelpHowButton2, 275, kcrsHand1) REP_MBMP(CHID(kst1, krepDefault), "studio\bmp\hbut2.bmp") ADOPT_MBMP(LAST_MBMP, CHID1( krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID1( krepMouseDnOff)) REP_MBMP(CHID(kst2, krepDefault), "studio\bmp\hbut2s.bmp") ADOPT_MBMP(LAST_MBMP, CHID(kst2, krepDefault)) CLICK_SCRIPT("button1 clicked") RunScriptGob( kgobHelpBookParent, kchidScript1, 4 ); ENDCHUNK // ----------------------------------------------------- // Third "how to" subsection button // ----------------------------------------------------- OBJECT("help book How button3", kgobHelpHowButton3, 275, kcrsHand1) REP_MBMP(CHID(kst1, krepDefault), "studio\bmp\hbut3.bmp") ADOPT_MBMP(LAST_MBMP, CHID1( krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID1( krepMouseDnOff)) REP_MBMP(CHID(kst2, krepDefault), "studio\bmp\hbut3s.bmp") ADOPT_MBMP(LAST_MBMP, CHID(kst2, krepDefault)) CLICK_SCRIPT("button1 clicked") RunScriptGob( kgobHelpBookParent, kchidScript1, 5 ); ENDCHUNK // ----------------------------------------------------- // Fourth "how to" subsection button // ----------------------------------------------------- OBJECT("Help Book How button4", kgobHelpHowButton4, 275, kcrsHand1) REP_MBMP(CHID(kst1, krepDefault), "studio\bmp\hbut4.bmp") ADOPT_MBMP(LAST_MBMP, CHID1( krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID1( krepMouseDnOff)) REP_MBMP(CHID(kst2, krepDefault), "studio\bmp\hbut4s.bmp") ADOPT_MBMP(LAST_MBMP, CHID(kst2, krepDefault)) CLICK_SCRIPT("button1 clicked") RunScriptGob( kgobHelpBookParent, kchidScript1, 6 ); ENDCHUNK // ----------------------------------------------------- // Fifth "how to" subsection button // ----------------------------------------------------- OBJECT("Help Book How button5", kgobHelpHowButton5, 275, kcrsHand1) REP_MBMP(CHID(kst1, krepDefault), "studio\bmp\hbut5.bmp") ADOPT_MBMP(LAST_MBMP, CHID1( krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID1( krepMouseDnOff)) REP_MBMP(CHID(kst2, krepDefault), "studio\bmp\hbut5s.bmp") ADOPT_MBMP(LAST_MBMP, CHID(kst2, krepDefault)) CLICK_SCRIPT("button1 clicked") RunScriptGob( kgobHelpBookParent, kchidScript1, 7 ); ENDCHUNK // ----------------------------------------------------- // Sixth "how to" subsection button // ----------------------------------------------------- OBJECT("Help Book How button6", kgobHelpHowButton6, 275, kcrsHand1) REP_MBMP(CHID(kst1, krepDefault), "studio\bmp\hbut6.bmp") ADOPT_MBMP(LAST_MBMP, CHID1( krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID1( krepMouseDnOff)) REP_MBMP(CHID(kst2, krepDefault), "studio\bmp\hbut6s.bmp") ADOPT_MBMP(LAST_MBMP, CHID(kst2, krepDefault)) CLICK_SCRIPT("button1 clicked") RunScriptGob( kgobHelpBookParent, kchidScript1, 8 ); ENDCHUNK // ----------------------------------------------------- // Book Bkgd = rectangle to hold Title // size=nil; help will resize this puppy // ----------------------------------------------------- OBJECTTY("Help Book Bkgd", kgobHelpBookBkgd, 225, kcrsArrow, gokkNoHitThis ) REP_FILL(CHID(kst1, krepDefault), "title spot", 0,0,0,0, Palette(44), Transparent ) PATTERN_0 ENDCHUNK // this space is the parent of the help title balloon -- its // reg point is at 0,0 (size of the rect is -240,0 to +240, 80 // so the position must be 320, 80 GOBCHUNK( "Title space", kgobHelpTitlePar, gokkNoHitThis ) DEFAULT_POSITION(kxpHelpTitle, kypHelpTitle, kzpHelpTitle) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow1, chidNil, cidNil, cnoNil ) ENDCHUNK REP_FILL(CHID(kst1, krepDefault), "title spot", kTitleLeft, kTitleTop, kTitleRight, kTitleBottom, Palette(21), Transparent ) PATTERN_0 ENDCHUNK // ----------------------------------------------------- // Book Bkgd = rectangle to hold page # help // ----------------------------------------------------- OBJECT("Help Book Page Number", kgobHelpBookPageNum, 350, kcrsArrow) REP_RECT(CHID(kst1, krepDefault), "kgobHelpBookPageNum", kxpPageNumLeft, kypPageNumTop, kxpPageNumRight, kypPageNumBot ) // ---------------------------------------------------------------- // Left Book Page - holds help topics // auto-resized to hold the help topic // ---------------------------------------------------------------- GOBCHUNK("Help Book Page", kgobHelpBookPageLeft, kgokkNormal) DEFAULT_POSITION( 0,0,225 ) ACTION(fcustHotText, fcustHotText, fgrfstAll, kcrsHand1, chidNil, cidNil, cnoNil) ENDCHUNK REP_RECT(CHID(kst1, krepDefault), "kgobHelpBookPageLeft", 0, 0, 0, 0 ) // ---------------------------------------------------------------- // Mouse click in the tools section of the help book // *** All tool topics have this listed as the script to run // ---------------------------------------------------------------- HELP_SCRIPT( ktpcBookToolTopics ) // parm[0] = group # passed in. 0 indicates creation only. If(_parm[0] != 0); // Valid group clicked! _parm[4] is balloon to automatically // create! If( _parm[4] == cnoNil ); // no balloon? Error! DEBUGCMD( AlertStr("Not linked to a topic!") ); Else; // create the balloon and destroy the book CreateHelpGob(kidBackground, _parm[4]); // reenable the help book's hot keys ENABLEACCEL(fFalse); DestroyGob(kgobHelpBookParent); End; Return( fTrue ); // tell code NOT to create balloon End; ENDCHUNK // ------------------------------------------------------- // choice button clicked in TOC #1 balloon // ------------------------------------------------------- HELP_SCRIPT(ktpcBook1TOC) // _parm[0] : 0 = initialization, 1 ==BASICS, 2 = HOWTO, 3 = TOOLS, 4 = TIPS If(_parm[0] != 0); // Switch to appropriate section. If (_parm[0] < 3); RunScriptGob(kgobHelpBookParent, kchidScript1, _parm[0]+1 ); Else; RunScriptGob(kgobHelpBookParent, kchidScript1, _parm[0]+6 ); End; End; ENDCHUNK // ---------------------------------------------------------------- // Mouse click in basics in the help book // All how to objects have this listed as the script to run // ---------------------------------------------------------------- HELP_SCRIPT(kidHelpBookBasics) // parm[0] = group # passed in If(_parm[0] != 0); // Valid group clicked _parm[4] is id of table object to run If( _parm[4] == cnoNil ); // no table? Error, display alert then get out DEBUGCMD( AlertStr("Not linked to basics");) Else; // create the balloon and destroy the book CreateChildGob(kidBackground, kidSequenceParent, kidSequenceParent); CreateChildGob(kidBackground, _parm[4], _parm[4]); // re-enable the hotkeys for the book ENABLEACCEL(fFalse); DestroyGob(kgobHelpBookParent); End; Return( fTrue ); // tell code NOT to create help sequence End; ENDCHUNK // ---------------------------------------------------------------- // Mouse click in howto in the help book // All how to objects have this listed as the script to run // ---------------------------------------------------------------- HELP_SCRIPT(kidHelpBookHowTo) // parm[0] = group # passed in If(_parm[0] != 0); // Valid group clicked _parm[4] is id of table object to run If( _parm[4] == cnoNil ); // no table? Error, display alert then get out DEBUGCMD( AlertStr("Not linked to a howto!"); ) Else; // create the balloon and destroy the book CreateChildGob(kidBackground, kidSequenceParent, kidSequenceParent); CreateChildGob(kidBackground, _parm[4], _parm[4]); // re-enable the hotkeys for the book ENABLEACCEL(fFalse); DestroyGob(kgobHelpBookParent); End; Return( fTrue ); // tell code NOT to create help sequence End; ENDCHUNK // // Click scripts for query help topics. // // ------------------------------------------------------- // Query quit // ------------------------------------------------------- HELP_SCRIPT(ktpcQueryQuit) // If _parm[0] != 0 then a button has been pushed. If(_parm[0] != 0); EnqueueCid(cidEndModal, 0, _parm[0], 0, 0, 0); End; ENDCHUNK // ------------------------------------------------------- // Query document save // ------------------------------------------------------- HELP_SCRIPT(ktpcQuerySave) // If _parm[0] != 0 then a button has been pushed. If(_parm[0] != 0); EnqueueCid(cidEndModal, 0, _parm[0], 0, 0, 0); End; ENDCHUNK // ------------------------------------------------------- // Query sound delete // ------------------------------------------------------- HELP_SCRIPT(ktpcQuerySoundDelete) // If _parm[0] != 0 then a button has been pushed. If(_parm[0] != 0); EnqueueCid(cidEndModal, 0, _parm[0], 0, 0, 0); End; ENDCHUNK // ------------------------------------------------------- // Query overwrite existing file // ------------------------------------------------------- HELP_SCRIPT(ktpcQueryOverwrite) // If _parm[0] != 0 then a button has been pushed. If(_parm[0] != 0); EnqueueCid(cidEndModal, 0, _parm[0], 0, 0, 0); End; ENDCHUNK // ------------------------------------------------------- // Query exit studio to where // ------------------------------------------------------- HELP_SCRIPT(ktpcQueryExitStudio) // If _parm[0] != 0 then a button has been pushed. If(_parm[0] != 0); EnqueueCid(cidEndModal, 0, _parm[0], 0, 0, 0); End; ENDCHUNK ================================================ FILE: src/studio/helpctrl.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ PALETTECHUNK("Palette", kidResPal, "studio\bmp\socpal2.bmp") // ----------------------------------------------------- // squishy control, with tracking // ----------------------------------------------------- GOBCHUNK("_gobHelpSquishy", _gobHelpSquishy, 0) DEFAULT_POSITION(0,0,1) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand1, kchidClick, cidNil, cnoNil) ENDCHUNK // normal REP_MBMP( CHID1( krepDefault), "studio\bmp\squishy1.bmp" ) // splotted REP_MBMP( CHID1( krepMouseDnOn ), "studio\bmp\squishy2.bmp" ) REP_MBMP( CHID1( krepMouseUpOn ), "studio\bmp\squishy3.bmp" ) ADOPT_MBMP( LAST_MBMP, CHID1( krepMouseDnOff )) REP_WAVE( CHID1( krepClicked ), "studio\sound\sqshbtn.wav" ) // ok button in help topics GOBCHUNK("kgobOkButton", kgobOkButton, 0) DEFAULT_POSITION( 0,0,1) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand1, kchidClick, cidNil, cnoNil) ENDCHUNK // normal REP_MBMPREG(CHID1( krepDefault), "studio\bmp\okbtn1.bmp", 10,10) ADOPT_MBMP(LAST_MBMP, CHID1(krepMouseDnOff)) // ring REP_MBMPREG(CHID1(krepMouseDnOn), "studio\bmp\okbtn3.bmp", 10, 10) // splotted REP_MBMPREG(CHID1(krepMouseUpOn), "studio\bmp\okbtn2.bmp", 10, 10) REP_WAVE( CHID1( krepClicked ), "studio\sound\ok.wav" ) // question mark in help topics // changed to gem - ***** GOBCHUNK("kgobQuestionButton", kgobQuestionButton, 0) DEFAULT_POSITION( 0,0,1) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand1, kchidClick, cidNil, cnoNil) ENDCHUNK // normal REP_MBMP( CHID1( krepDefault), "studio\bmp\pic1016.bmp" ) // splotted REP_MBMP( CHID1( krepMouseDnOn ), "studio\bmp\pic1016d.bmp" ) REP_MBMP( CHID1( krepMouseUpOn ), "studio\bmp\pic1016r.bmp" ) ADOPT_MBMP( LAST_MBMP, CHID1( krepMouseDnOff )) REP_WAVE( CHID1( krepClicked ), "studio\sound\gemtip.wav" ) // Tip gem - pic1016 GOBCHUNK("_gobTipGem", _gobTipGem, 0) DEFAULT_POSITION( 0,0,1) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand1, kchidClick, cidNil, cnoNil) ENDCHUNK // normal REP_MBMP( CHID1( krepDefault), "studio\bmp\pic1016.bmp" ) // splotted REP_MBMP( CHID1( krepMouseDnOn ), "studio\bmp\pic1016d.bmp" ) REP_MBMP( CHID1( krepMouseUpOn ), "studio\bmp\pic1016r.bmp" ) ADOPT_MBMP( LAST_MBMP, CHID1( krepMouseDnOff )) REP_WAVE( CHID1( krepClicked ), "studio\sound\gemtip.wav" ) // Key tip - pic1020 GOBCHUNK("_gobTipKey", _gobTipKey, 0) DEFAULT_POSITION( 0,0,1) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand1, kchidClick, cidNil, cnoNil) ENDCHUNK // normal REP_MBMP( CHID1( krepDefault), "studio\bmp\pic1020.bmp" ) // splotted REP_MBMP( CHID1( krepMouseDnOn ), "studio\bmp\pic1020d.bmp" ) REP_MBMP( CHID1( krepMouseUpOn ), "studio\bmp\pic1020r.bmp" ) ADOPT_MBMP( LAST_MBMP, CHID1( krepMouseDnOff )) REP_WAVE( CHID1( krepClicked ), "studio\sound\ok.wav" ) // Cancel Button in help topics GOBCHUNK("kgobCancelButton", kgobCancelButton, 0) DEFAULT_POSITION( 0,0,1) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand1, kchidClick, cidNil, cnoNil) ENDCHUNK // normal REP_MBMPREG(CHID1(krepDefault), "studio\bmp\cancbtn1.bmp", 10,10) ADOPT_MBMP(LAST_MBMP, CHID1(krepMouseDnOff)) REP_MBMPREG(CHID1(krepMouseDnOn), "studio\bmp\cancbtn3.bmp", 10, 10) ================================================ FILE: src/studio/helpres.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // Help resource Chunky Text build file #define PACK PACK #include "kidgs.chh" #include "helpres.h" //STARTCHUNKY HELP_MBMP(helppic1016_bmp, "studio\bmp\pic1016.bmp") HELP_MBMP(helppic1016d_bmp, "studio\bmp\pic1016d.bmp") HELP_MBMP(helppic1016r_bmp, "studio\bmp\pic1016r.bmp") HELP_MBMP(helppic1020_bmp, "studio\bmp\pic1020.bmp") HELP_MBMP(helppic1020d_bmp, "studio\bmp\pic1020d.bmp") HELP_MBMP(helppic1020r_bmp, "studio\bmp\pic1020r.bmp") HELP_MBMP(mbmpOkButton_bmp, "studio\bmp\okbtn1.bmp") HELP_MBMP(mbmpOkButtond_bmp, "studio\bmp\okbtn2.bmp") HELP_MBMP(mbmpOkButtonr_bmp, "studio\bmp\okbtn3.bmp") HELP_MBMP(mbmpQstButton_bmp, "studio\bmp\pic1016.bmp") HELP_MBMP(mbmpQstButtond_bmp, "studio\bmp\pic1016d.bmp") HELP_MBMP(mbmpQstButtonr_bmp, "studio\bmp\pic1016r.bmp") ////////// //HELP_MBMP(mbmpSettingsCover, "covr1d.bmp") //HELP_MBMP(mbmpActorsCover , "covr2d.bmp") //HELP_MBMP(mbmpSoundsCover , "covr3d.bmp") //HELP_MBMP(mbmpTextsCover , "covr4d.bmp") //HELP_MBMP(mbmpScrollbarsCover, "covr5d.bmp") //HELP_MBMP(mbmpPlaysCover , "covr6d.bmp") //HELP_MBMP(mbmpUndosCover , "covr7d.bmp") //HELP_MBMP(mbmpBooksCover , "covr8d.bmp") //HELP_MBMP(mbmpDoors , "door0.bmp") //HELP_MBMP(mbmpSettingsBackground, "1par.bmp") //HELP_MBMP(mbmpActorsBackground, "2par.bmp") //HELP_MBMP(mbmpSoundsBackground, "3par.bmp") //HELP_MBMP(mbmpTextsBackground, "4par.bmp") HELP_MBMP(mbmpCutWordBox, "studio\bmp\hpcutwbx.bmp") HELP_MBMP(mbmpHandCursor, "studio\bmp\hphndcur.bmp") HELP_MBMP(mbmpWordBoxCursor, "studio\bmp\hpwbcur.bmp") HELP_MBMP(mbmpLeannCancel, "studio\bmp\hplcanc.bmp") HELP_MBMP(mbmpLeannOk, "studio\bmp\hplok.bmp") HELP_MBMP(mbmpFOScrolling, "studio\bmp\hpscrl.bmp") HELP_MBMP(mbmpFONonScrolling, "studio\bmp\hpnscrl.bmp") HELP_MBMP(mbmpVolumeControl, "studio\bmp\hpvolctl.bmp") HELP_MBMP(mbmpForward, "studio\bmp\hpffw.bmp") HELP_MBMP(mbmpForwardEnd, "studio\bmp\hpffwe.bmp") HELP_MBMP(mbmpRewind, "studio\bmp\hpfrw.bmp") HELP_MBMP(mbmpRewindEnd, "studio\bmp\hpfrwe.bmp") HELP_MBMP(mbmpNukeIcon, "studio\bmp\hpnuke.bmp") HELP_MBMP(mbmpSoundRecord, "studio\bmp\hpsndrec.bmp") HELP_MBMP(mbmpSoundPlay, "studio\bmp\hpsndply.bmp") HELP_MBMP(mbmpCostChangeIcon, "studio\bmp\hpcstchg.bmp") HELP_MBMP(mbmpSceneSlider, "studio\bmp\hpscnsld.bmp") HELP_MBMP(mbmpFrameSlider, "studio\bmp\hpfrmsld.bmp") HELP_MBMP(mbmpSOTransition1, "studio\bmp\hpe3trn1.bmp") HELP_MBMP(mbmpSOTransition2, "studio\bmp\hpe3trn2.bmp") HELP_MBMP(mbmpSOTransition3, "studio\bmp\hpe3trn3.bmp") HELP_MBMP(mbmpSOTransition4, "studio\bmp\hpe3trn4.bmp") HELP_MBMP(mbmpRecordMic, "studio\bmp\hpsndmic.bmp") HELP_MBMP(mbmpPortfolioOpen, "studio\bmp\hpptopen.bmp") HELP_MBMP(mbmpPortfolioSaveAs, "studio\bmp\hpptsvas.bmp") HELP_MBMP(mbmpCCPRemoveBefore, "studio\bmp\hpccpreb.bmp") HELP_MBMP(mbmpCCPRemoveAfter, "studio\bmp\hpccprea.bmp") HELP_MBMP(mbmpCCPRemoveScene, "studio\bmp\hpccpres.bmp") HELP_MBMP(mbmpCCPRemoveObject, "studio\bmp\hpccprob.bmp") HELP_MBMP(mbmpActorActions, "studio\bmp\hpaction.bmp") HELP_MBMP( mbmpSceneChoices, "studio\bmp\hp1back.bmp" ) HELP_MBMP( mbmpSettingsCameras, "studio\bmp\hp1view.bmp" ) HELP_MBMP( mbmpActorsSelect, "studio\bmp\hp2arrw.bmp" ) HELP_MBMP( mbmpActorsBiography, "studio\bmp\hp2bio.bmp" ) HELP_MBMP( mbmpActorsCompose, "studio\bmp\hp2comp.bmp" ) HELP_MBMP( mbmpActorsCostume, "studio\bmp\hp2cost.bmp" ) HELP_MBMP( mbmpActorsNormalizeRot, "studio\bmp\hpp5norm.bmp" ) // REVIEW THIS PLEASE! //#define mbmpBrwsAction 0x2001A //REP_MBMPREG(CHID(kstDefault, krepDefault), "2act01.bmp", HELP_MBMP( mbmpActorsRecordMode, "studio\bmp\hp2recd.bmp" ) HELP_MBMP( mbmpActorsRotateX, "studio\bmp\hpp5rotx.bmp" ) HELP_MBMP( mbmpActorsRotateY, "studio\bmp\hpp5roty.bmp" ) HELP_MBMP( mbmpActorsRotateZ, "studio\bmp\hpp5rotz.bmp" ) HELP_MBMP( mbmpActorsSooner , "studio\bmp\hp2soon.bmp" ) HELP_MBMP( mbmpActorsSquash , "studio\bmp\hpp4sqsh.bmp" ) HELP_MBMP( mbmpActorsShrink , "studio\bmp\hpp4shrk.bmp" ) HELP_MBMP( mbmpActorsXY , "studio\bmp\hp2xy.bmp" ) HELP_MBMP( mbmpActorsXZ , "studio\bmp\hp2xys.bmp" ) HELP_MBMP( mbmpActorsGround , "studio\bmp\hp2zero.bmp" ) // #define mbmpSoundsMixer 0x20025 HELP_MBMP( mbmpSoundsPlayOnce, "studio\bmp\hp3sing.bmp" ) HELP_MBMP( mbmpSoundsListen , "studio\bmp\hp3ear.bmp" ) // #define mbmpSoundsRecord 0x20028 HELP_MBMP( mbmpSoundsLooping, "studio\bmp\hp3loop.bmp" ) HELP_MBMP( mbmpSoundsAttachToCell, "studio\bmp\hp3rpt.bmp" ) // #define mbmpSoundsClear 0x2002B HELP_MBMP( mbmpTextsBkgdColor, "studio\bmp\hp4back.bmp" ) HELP_MBMP( mbmpTextsFontShape, "studio\bmp\hp4bold.bmp" ) HELP_MBMP( mbmpTextsFontColor, "studio\bmp\hp4colr.bmp" ) HELP_MBMP( mbmpTextsFont , "studio\bmp\hp4font.bmp" ) HELP_MBMP( mbmpTextsSelect , "studio\bmp\hp4ins.bmp" ) HELP_MBMP( mbmpTextsScroll , "studio\bmp\hpp7scrl.bmp" ) HELP_MBMP( mbmpTextsFontSize, "studio\bmp\hp4size.bmp" ) HELP_MBMP( mbmpTextsStory , "studio\bmp\hpp7nscr.bmp" ) HELP_MBMP( mbmpBook , "studio\bmp\hpbook.bmp" ) HELP_MBMP( mbmpMap , "studio\bmp\hpmap.bmp" ) HELP_MBMP( mbmpCutCopyPaste , "studio\bmp\hpccp.bmp" ) HELP_MBMP( mbmpUndo , "studio\bmp\hpundo.bmp" ) //HELP_MBMP( mbmpVolumeSlider , "studio\bmp\hpvol.bmp" ) HELP_MBMP( mbmpPlay , "studio\bmp\hpplay.bmp" ) HELP_MBMP( mbmpPlayStop , "studio\bmp\hpplays.bmp" ) HELP_MBMP( mbmpSceneSorter , "studio\bmp\hp1scen.bmp" ) HELP_MBMP( mbmpPortfolio , "studio\bmp\hpport.bmp" ) HELP_MBMP( mbmpExit , "studio\bmp\hpexit.bmp" ) //HELP_MBMP( mbmpBrwsBackground, "studio\bmp\hpbook1.bmp" ) // HELP_MBMP( mbmpBrwsActor , "studio\bmp\hpbook3.bmp" ) //#define mbmpBrwsProp 0x20040 //#define mbmpBrwsThreeD 0x20041 //#define mbmpSettingsBrowser 0x20042 //#define mbmpBrwsBkSound 0x20043 //#define mbmpBrwsFXSound 0x20044 //#define mbmpBrwsMusSound 0x20045 HELP_MBMP( mbmpTextsCreate , "studio\bmp\hp4new.bmp" ) //HELP_MBMP( mbmpPortsBackground, "studio\bmp\hpp1par.bmp" ) //HELP_MBMP( mbmpPortsPortfolio, "studio\bmp\hpp1port.bmp" ) HELP_MBMP( mbmpPortsNew , "studio\bmp\hpp1new.bmp" ) HELP_MBMP( mbmpPortsSave , "studio\bmp\hpp1save.bmp" ) HELP_MBMP( mbmpPausesMouse , "studio\bmp\hp1mous.bmp" ) HELP_MBMP( mbmpPausesClear , "studio\bmp\hp1nops.bmp" ) HELP_MBMP( mbmpPausesSound , "studio\bmp\hp1note.bmp" ) //HELP_MBMP( mbmpCCPBackground, "studio\bmp\hpp3par.bmp" ) //HELP_MBMP( mbmpCCPSceneChopFwd, "studio\bmp\hpp3rmfw.bmp" ) //HELP_MBMP( mbmpCCPSceneNuke , "studio\bmp\hpp3rmsn.bmp" ) //HELP_MBMP( mbmpCCPActorNuke , "studio\bmp\hpp3rmac.bmp" ) HELP_MBMP( mbmpCCPCopyRoute , "studio\bmp\hpp3cppt.bmp" ) HELP_MBMP( mbmpCCPPaste , "studio\bmp\hpp3past.bmp" ) HELP_MBMP( mbmpCCPCopy , "studio\bmp\hpp3copy.bmp" ) HELP_MBMP( mbmpCCPCut , "studio\bmp\hpp3cut.bmp" ) HELP_MBMP( mbmpGenericCancel, "studio\bmp\hpcancel.bmp" ) HELP_MBMP( mbmpGenericOk , "studio\bmp\hpokay.bmp" ) HELP_MBMP( mbmpGenericPageFwd, "studio\bmp\hpfwd.bmp" ) HELP_MBMP( mbmpGenericPageBack, "studio\bmp\hpbback.bmp" ) //#define mbmpBrowserCancel 0x2005C //#define mbmpBrowserOk 0x2005D //#define mbmpBrowserPageFwd 0x2005E //#define mbmpBrowserPageBack 0x2005F //#define mbmpBrowserFrame 0x20060 //Next 0x100 are reserved //#define mbmpBrowserFrameLim 0x2015F //HELP_MBMP( mbmpCameraFrame , "studio\bmp\hpframe2.bmp", 8 ,8 ) //#define mbmpWorkspace 0x20161 //#define mbmpBackground1 0x20162 //#define mbmpBackground2 0x20163 //#define mbmpBackground3 0x20164 //#define mbmpBackground4 0x20165 //HELP_MBMP( mbmpCCPSceneChopBack, "studio\bmp\hpp3rmbk.bmp" ) HELP_MBMP( mbmpActorsContinue, "studio\bmp\hp2cont.bmp" ) HELP_MBMP( mbmpActorsRotate , "studio\bmp\hp2rot.bmp" ) HELP_MBMP( mbmpActorsTransform, "studio\bmp\hp2tran.bmp" ) // HELP_MBMP( mbmpRotateBackground, "studio\bmp\hpp5par.bmp" ) // HELP_MBMP( mbmpTransformBackground, "studio\bmp\hpp4par.bmp" ) // HELP_MBMP( mbmpScrollBackground, "studio\bmp\hpp7par.bmp" ) HELP_MBMP( mbmpTextsScrollType, "studio\bmp\hp4scrl.bmp" ) //#define mbmpBrowserObj 0x2016E //#define mbmpBrowserThumb 0x20170 //Next 0x100 are reserved //#define mbmpBrowserThumbLim 0X2026F HELP_MBMP( mbmpActorsRotateNorm, "studio\bmp\hpp5norm.bmp" ) HELP_MBMP( mbmpActorsTransformNorm, "studio\bmp\hpp4norm.bmp" ) //HELP_MBMP( mbmpBrwsSceneFrame, "studio\bmp\hpframe1.bmp", 8 ,8 ) //#define mbmpBrwsActorFrame 0x20275 // CNO for Actor browser frame //#define mbmpBrwsMaterial 0x20276 //#define mbmpBrwsCMaterial 0x20277 //#define mbmpBrwsThreeD 0x20278 //#define mbmpBrwsFonts 0x20279 //#define mbmpBrwsForeColor 0x2027A //#define mbmpBrwsBackColor 0x2027B //#define mbmpBrwsTextSize 0x2027C HELP_MBMP( mbmpActorsBrowser, "studio\bmp\hp2actr.bmp" ) HELP_MBMP( mbmpActorsPropBrowser, "studio\bmp\hp2prop.bmp" ) HELP_MBMP( mbmpActorsSpletters, "studio\bmp\hp2splt.bmp" ) HELP_MBMP( mbmpSoundsEfxBrowser, "studio\bmp\hp3horn.bmp" ) HELP_MBMP( mbmpSoundsMicBrowser , "studio\bmp\hp3mike.bmp" ) HELP_MBMP( mbmpSoundsMusicBrowser, "studio\bmp\hp3note.bmp" ) HELP_MBMP( mbmpRedo, "studio\bmp\hpredo.bmp" ) HELP_MBMP( mbmpNukeSound, "studio\bmp\hpp3rmsd.bmp" ) ================================================ FILE: src/studio/hlpbkper.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ //------------------------------------------------------- // Helppers.cht - Persistent object for the help book //------------------------------------------------------- // // Store an array that keeps track ofthe current topic for // each object in the help book. If not already created // everything will default to the first topic // // REVIEW: 5.29.95 ***** // Use Global variables (::) Make this object go away. // Take script below and wrap into Studio - it should // initialize these once per studio session. //------------------------------------------------------- OBJECT("Persisent Help", kgobHelpBookPersistent, 0, kcrsArrow) REP_ANIM(CHID1(krepDefault), "Help Book Persistent") // Set current section, howto subs are 3-8 ::HBSection = 1; // set lastsub section, for remembering which section of // the "How To" section we were on. ::HBLastsub = 3; // is first // Set current topic index -> is an absolute value ::HBtpcCur[1] = ktpcBook1TOC; ::HBtpcCur[2] = ktpcBook2Basics; ::HBtpcCur[3] = ktpcBook3HowTo1; ::HBtpcCur[4] = ktpcBook4HowTo1; ::HBtpcCur[5] = ktpcBook5HowTo1; ::HBtpcCur[6] = ktpcBook6HowTo1; ::HBtpcCur[7] = ktpcBook7HowTo1; ::HBtpcCur[8] = ktpcBook8HowTo1; ::HBtpcCur[9] = ktpcBookSceneTools1; ::HBtpcCur[10] = ktpcBook10Tips; // Set end point for topics -> is an absolute value ::HBtpcEnd[1] = ktpcBook1TOC; ::HBtpcEnd[2] = ktpcBook2Basics2; ::HBtpcEnd[3] = ktpcBook3HowTo2; ::HBtpcEnd[4] = ktpcBook4HowTo4; ::HBtpcEnd[5] = ktpcBook5HowTo1; ::HBtpcEnd[6] = ktpcBook6HowTo3; ::HBtpcEnd[7] = ktpcBook7HowTo3; ::HBtpcEnd[8] = ktpcBook8HowTo4; ::HBtpcEnd[9] = ktpcBookMasterTools6; ::HBtpcEnd[10] = ktpcBook10Tips18; ENDCHUNK ================================================ FILE: src/studio/makefile ================================================ #---studio.mak !IFNDEF MAKEFILE_STUDIO MAKEFILE_STUDIO = 1 !INCLUDE $(KAUAI_ROOT)\makefile.def #STUDIO SOURCE DIRECTORY STUDIO_SRC_DIR = $(SOC_ROOT)\src\studio #SOC OBJ DIRECTORY SOC_OBJ_ROOT_DIR = $(SOC_ROOT)\obj SOC_OBJ_DIR = $(SOC_OBJ_ROOT_DIR)\$(BLD_TYPE_DIR) !IF "$(LOCAL_BUILD)" == "1" TARGET_DIR = CHT_BUILD_INC = -I. !ELSE # LOCAL_BUILD TARGET_DIR = $(SOC_OBJ_DIR)^\ CHT_BUILD_INC = -I$(SOC_OBJ_DIR) !ENDIF # !LOCAL_BUILD BREN_LIB = $(SOC_ROOT)\elib\$(BLD_TYPE_DIR)\bren.lib\ $(SOC_ROOT)\elib\$(BLD_TYPE_DIR)\brfmmxr.lib\ $(SOC_ROOT)\elib\$(BLD_TYPE_DIR)\brfwmxr.lib\ $(SOC_ROOT)\elib\$(BLD_TYPE_DIR)\brzbmxr.lib UTEST_TARGETS =\ $(TARGET_DIR)splot.obj\ $(TARGET_DIR)scnsort.obj\ $(TARGET_DIR)browser.obj\ $(TARGET_DIR)utest.obj\ $(TARGET_DIR)stdioscb.obj\ $(TARGET_DIR)stdiobrw.obj\ $(TARGET_DIR)studio.obj\ $(TARGET_DIR)tgob.obj\ $(TARGET_DIR)esl.obj\ $(TARGET_DIR)ape.obj\ $(TARGET_DIR)popup.obj\ $(TARGET_DIR)tatr.obj\ $(TARGET_DIR)portf.obj\ $(TARGET_DIR)mminstal.obj\ $(TARGET_DIR)utest.res UTEST_DEPS =\ $(WNET_LIB) \ $(VFW32_LIB) \ $(AUDIO_LIB) \ $(BREN_LIB) \ $(TARGET_DIR)engine.lib UTEST_CHT_FILES = \ $(STUDIO_SRC_DIR)\utestgst.cht\ $(STUDIO_SRC_DIR)\utest.cht STUDIO_CHT_FILES = \ $(STUDIO_SRC_DIR)\browser.cht\ $(STUDIO_SRC_DIR)\cursors.cht\ $(STUDIO_SRC_DIR)\easels.cht\ $(STUDIO_SRC_DIR)\helpbook.cht\ $(STUDIO_SRC_DIR)\hlpbkper.cht\ $(STUDIO_SRC_DIR)\gadget.cht\ $(STUDIO_SRC_DIR)\gadgpers.cht\ $(STUDIO_SRC_DIR)\helpres.cht\ $(STUDIO_SRC_DIR)\helpctrl.cht\ $(STUDIO_SRC_DIR)\projmain.cht\ $(STUDIO_SRC_DIR)\popups.cht\ $(STUDIO_SRC_DIR)\popdn.cht\ $(STUDIO_SRC_DIR)\sectools.cht\ $(STUDIO_SRC_DIR)\stdioscb.cht\ $(STUDIO_SRC_DIR)\stdiosnd.cht\ $(STUDIO_SRC_DIR)\tbguidhp.cht\ $(STUDIO_SRC_DIR)\tbhtscen.cht\ $(STUDIO_SRC_DIR)\tbhtactr.cht\ $(STUDIO_SRC_DIR)\tbhtsoun.cht\ $(STUDIO_SRC_DIR)\tbhtword.cht\ $(STUDIO_SRC_DIR)\tblogowz.cht\ $(STUDIO_SRC_DIR)\tbbasics.cht\ $(STUDIO_SRC_DIR)\tbproj1.cht\ $(STUDIO_SRC_DIR)\tbproj2.cht\ $(STUDIO_SRC_DIR)\tbproj3.cht\ $(STUDIO_SRC_DIR)\tbproj4.cht\ $(STUDIO_SRC_DIR)\tbproj5.cht\ $(STUDIO_SRC_DIR)\tbproj6.cht\ $(STUDIO_SRC_DIR)\studio.cht STUDIO_CHUNK_TARGETS =\ $(TARGET_DIR)studio.chk KAUAI_OBJ_GROUPS_FOR_UTEST =\ $(BASE_OBJS)\ $(GUI_OBJS)\ $(GROUP_OBJS)\ $(FILE_OBJS)\ $(MBMPIO_OBJS)\ $(SOUND_OBJS)\ $(VIDEO_OBJS)\ $(SCREXE_OBJS)\ $(DOC_OBJS)\ $(RICHTEXT_OBJS)\ $(CTL_OBJS)\ $(STREAM_OBJS)\ $(DLG_OBJS)\ $(TEXTEDIT_OBJS)\ $(KID_OBJS)\ $(SCRCOM_OBJS)\ $(LEXER_OBJS) TBOXTHD_DEPS = \ $(STUDIO_SRC_DIR)\tboxclr.cht \ $(STUDIO_SRC_DIR)\tboxsize.cht #-Compile rules------------------------------------------------------------- PROGRAM_DATABASE = $(TARGET_DIR)soc.pdb PRECOMPILED_HEADER = $(TARGET_DIR)soc.pch CPPEXTRA = /Zi /Fd$(PROGRAM_DATABASE) /Fp$(PRECOMPILED_HEADER) SRC_DIR=$(STUDIO_SRC_DIR) OBJ_DIR=$(SOC_OBJ_DIR) TGT_NAME=Studio !INCLUDE $(SOC_ROOT)\makefile.rul #-Targets------------------------------------------------------------------- ALL_STUDIO = $(TARGET_DIR)3dmovie.exe $(TARGET_DIR)3dmovie.chk STUDIO_CONTENT ALL_TARGETS_ROOT = $(ALL_TARGETS_ROOT) $(ALL_STUDIO) CLEAN_STUDIO = CLEAN_UTEST CLEAN_STUDIO_CHUNKS CLEAN_STUDIO_CHTS CLEAN_TARGETS_ROOT=$(CLEAN_TARGETS_ROOT) $(CLEAN_STUDIO) !IF "$(LOCAL_BUILD)" != "1" !IF "$(LOCAL_BUILD)" != "0" ALL: $(SOC_OBJ_DIR) $(ALL_STUDIO) 3dmovie.exe : ALL CLEAN: $(CLEAN_STUDIO) ALL !ENDIF # LOCAL_BUILD != 0 $(SOC_OBJ_DIR) : @echo Making Directories $(SOC_OBJ_DIR)... if not exist $(SOC_OBJ_ROOT_DIR)/nul mkdir $(SOC_OBJ_ROOT_DIR) if not exist $(SOC_OBJ_DIR)/nul mkdir $(SOC_OBJ_DIR) !ENDIF # !LOCAL_BUILD # Why, you may ask, do I specify "KEEP" and then just go off and delete # the batch file anyway? It's because if I'm building nmake commands but # not actually executing them right away, I need the batch file to stick # around. It really is temporary though, so I go ahead and include an explicit # "del" so that it goes away after we've used it for real. CLEAN_UTEST: @echo <nul^ DEL /q dummy.nul ) 2>nul DEL /q dummy.nul $(TARGET_DIR)3dmovie.chk 2>nul <nul^ DEL /q dummy.nul ) 2>nul <nul^ DEL /q dummy.nul ) 2>nul < $*.i $(CHKERR) $(CHOMP) $*.i $@ $(CHKERR) $(TARGET_DIR)3dmovie.exe : $(KAUAI_OBJ_GROUPS_FOR_UTEST) $(TARGET_DIR)3dmovie.exe : $(UTEST_DEPS) $(UTEST_TARGETS) $(TARGET_DIR)utest.lnk @echo Linking Utest Objects... $(LINK) -link $(LFLAGS_GUI) \ $(UTEST_DEPS) \ $(UTEST_TARGETS) \ -out:$(TARGET_DIR)3dmovie.exe @$(TARGET_DIR)utest.lnk $(CHKERR) !ENDIF # !MAKEFILE_STUDIO ================================================ FILE: src/studio/mminstal.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /****************************************************************************** @doc MMINSTAL @mod MMINSTAL.CPP | Copyright 1995 Microsoft Corporation - All rights reserved ******************************************************************************* Description: Ensures appropriate drivers and codecs are installed for audio and video playback. Current Owner: ***** ******************************************************************************* Known bugs: None ******************************************************************************* How it could be Improved: ******************************************************************************* Revision History: 07/31/95 ***** Created ******************************************************************************* @comm Under Windows95 we can automatically install the appropriate sections. Under NT 3.51 we can not. Link this module with MSACM32.LIB, VFW32.LIB and WINMM.LIB (from the Win95 SDK). ******************************************************************************/ #include "studio.h" #include // winmm.lib #include // required by msacm.h #include // msacm32.lib #include // vfw32.lib #include "mminstal.h" #include "utestres.h" /****************************************************************************** @func WORD | wHaveWaveDevice | Do we have a wave device capable of playing the passed PCM format(s). @parm DWORD | dwFormats | WAVE formats needed to be supported. These can be a bitwise combination of WAVE_FORMAT_???? flags which are defined in mmsystem.h. If you don't care what formats are supported you can pass zero. @rdesc HWD_SUCCESS we have a functioning wave device that supports the format HWD_NODEVICE there are no wave devices HWD_NODRIVER the wave device doesn't have a driver installed HWD_ERROR some undefined error occured HWD_NOFORMAT we have a device but the requested format(s) is not supported ******************************************************************************/ WORD wHaveWaveDevice(DWORD dwReqFormats) { WORD wNumWavDev; WAVEOUTCAPS WOC; WORD wDevID; WORD wErr; // Determine how many WAVE devices are in the user's system wNumWavDev = waveOutGetNumDevs(); // If there are none, return indicating that if (0 == wNumWavDev) { #ifdef _DEBUG MessageBox(NULL, "No WAVE devices on your machine.", NULL, MB_ICONINFORMATION); #endif return (HWD_NODEVICE); } // Cycle through the WAVE devices to determine if any support // the desired format. for (wDevID = 0; wDevID < wNumWavDev; wDevID++) { wErr = waveOutGetDevCaps(wDevID, &WOC, sizeof(WAVEOUTCAPS)); // If we obtain a WAVE device's capabilities OK if ((0 == wErr) && // and it supports the desired format ((WOC.dwFormats & dwReqFormats) == dwReqFormats)) // then return success - we have a device that supports what we want return (HWD_SUCCESS); } // for(wDevID // If we didn't find a device that supported what we wanted, why didn't we... switch (wErr) { // We got the capabilities OK but the formats didn't match case 0: #ifdef _DEBUG MessageBox(NULL, "Found 1 or more WAVE devices, but none support the desired PCM format.", NULL, MB_ICONSTOP); #endif return (HWD_NOFORMAT); // There wasn't an installed driver for the WAVE device case MMSYSERR_NODRIVER: #ifdef _DEBUG MessageBox(NULL, "Found 1 or more WAVE devices, but there was no driver installed for it.", NULL, MB_ICONSTOP); #endif return (HWD_NODRIVER); } // Some other error occured. #ifdef _DEBUG MessageBox(NULL, "Found 1 or more WAVE devices, but an error occured getting the device capabilities.", NULL, MB_ICONSTOP); #endif return (HWD_ERROR); } /****************************************************************************** @func WORD | wHaveACM | Do we have the audio compression manager installed? Sound Mapper is another term for the "audio compression manager". Under NT the drivers control pannel applet lists it as "Microsoft Audio Compression Manager". Under Win95 there does not appear to be a way to remove just the manager. @rdesc 0 ACM is installed 1 ACM is not installed or is an old version ******************************************************************************/ WORD wHaveACM() { /* The following taken from MSDN ACMAPP sample exe. Select options - wave device - output menu item. Select the Microsoft Sound Mapper device. Microsoft Audio Compression Manager driver installed: [Wave Output Device Capabilities] Device Id: -1 Manufacturer Id: 1 Product Id: 2 Driver Version: 3.51 Device Name: 'Microsoft Sound Mapper' Channels: 2 Standard Formats: 00000FFFh 8M11, 8S11, 16M11, 16S11 8M22, 8S22, 16M22, 16S22 8M44, 8S44, 16M44, 16S44 Standard Support: 0000000Ch Volume, L/R Volume Microsoft Audio Compression Manager driver NOT installed: [Wave Output Device Capabilities] Device Id: -1 Manufacturer Id: 0 Product Id: 0 Driver Version: 0.00 Device Name: 'Default Wave Output Mapper' Channels: 0 Standard Formats: 00000000h Standard Support: 00000000h */ WAVEOUTCAPS WOC; WORD wErr; wErr = waveOutGetDevCaps(WAVE_MAPPER, &WOC, sizeof(WAVEOUTCAPS)); if ((MMSYSERR_NOERROR != wErr) || // If the driver wasn't installed or (WOC.vDriverVersion < 0x0332)) // ACM ver is less than 3.50 (for Win32) HIBYTE=Major LOBYTE=Minor ver num { #ifdef _DEBUG MessageBox(NULL, "ACM not installed or it is an old version.", NULL, MB_ICONSTOP); #endif return (1); } #ifdef _DEBUG OutputDebugString( TEXT("Microsoft Audio Compression Manager (Sound Mapper) is properly installed on your system\n")); #endif return (0); } /****************************************************************************** @func WORD | wHaveACMCodec | Do we have the audio compression manager codecs we need installed? @parm DWORD | dwReqCodec | Audio codec we want to check for. This value is one of the WAVE_FORMAT_* defines in mmreg.h. @rdesc HAC_SUCCESS ACM is installed, we've got a codec for the desired format HAC_NOACM Audio compression manager is not installed or is an old version HAC_NOCODEC The requested codec is not active or installed HAC_NOCONVERT Codec is installed but won't convert wav data. ******************************************************************************/ WORD wHaveACMCodec(DWORD dwReqCodec) { MMRESULT mmRet; ACMFORMATTAGDETAILS acmFTD; acmFTD.cbStruct = sizeof(ACMFORMATTAGDETAILS); acmFTD.dwFormatTagIndex = 0; acmFTD.dwFormatTag = dwReqCodec; acmFTD.cbFormatSize = 0; // These must be initialized or the retail build breaks under NT acmFTD.fdwSupport = 0; mmRet = acmFormatTagDetails(NULL, &acmFTD, ACM_FORMATTAGDETAILSF_FORMATTAG); if (MMSYSERR_NOERROR != mmRet) { #ifdef _DEBUG MessageBox(NULL, "Requested audio codec is not installed or is not active.", NULL, MB_ICONSTOP); #endif return (HAC_NOCODEC); } if (acmFTD.fdwSupport & ACMDRIVERDETAILS_SUPPORTF_CODEC) { #ifdef _DEBUG OutputDebugString(acmFTD.szFormatTag); OutputDebugString(TEXT("... is properly installed on your machine.\n")); #endif return (HAC_SUCCESS); } #ifdef _DEBUG MessageBox(NULL, "codec is installed but won't convert to PCM.", acmFTD.szFormatTag, MB_ICONSTOP); #endif return (HAC_NOCONVERT); } /****************************************************************************** @func WORD | wHaveICMCodec | Do we have the installable (video) compression manager codecs we need installed? @parm DWORD | dwReqCodec | Video codec we want to check for. This value is one of the WAVE_FORMAT_* defines in mmreg.h. @rdesc HIC_SUCCESS ICM is installed, we've got a codec for the desired format HIC_NOICM Installable compression manager is not installed or is an old version HIC_NOCODEC The requested codec is not active or installed HIC_NOCONVERT Codec is installed but won't convert wav data. ******************************************************************************/ WORD wHaveICMCodec(DWORD dwReqCodec) { ICINFO icInfo; if (FALSE == ICInfo(ICTYPE_VIDEO, dwReqCodec, &icInfo)) { #ifdef _DEBUG MessageBox(NULL, "No ICM or no codec installed.", NULL, MB_ICONSTOP); #endif return (HIC_NOCODEC); } #ifdef _DEBUG OutputDebugStringW(icInfo.szDriver); OutputDebugString(TEXT("... is properly installed on your machine.")); #endif return (HIC_SUCCESS); } /****************************************************************************** @func WORD | wHaveMCI | Do we have the media control interface (MCI) for the desired device type? @parm DWORD | dwDeviceType | MCI device type that we want supported. It is one of the MCI_DEVTYPE_* constants defined in mmsystem.h. @rdesc MMSYSERR_NOERROR MCI for device type is installed MCIERR_CANNOT_LOAD_DRIVER ******************************************************************************/ WORD wHaveMCI(LPSTR dwDeviceType) { MCI_OPEN_PARMS mciOpen; MCIERROR mciErr; mciOpen.dwCallback = NULL; mciOpen.lpstrDeviceType = (LPSTR)dwDeviceType; mciOpen.lpstrElementName = NULL; mciOpen.lpstrAlias = NULL; // mciErr = mciSendCommand(0, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID, (DWORD)(LPMCI_OPEN_PARMS)&mciOpen); mciErr = mciSendCommand(0, MCI_OPEN, MCI_OPEN_TYPE, (DWORD)(LPMCI_OPEN_PARMS)&mciOpen); if (MMSYSERR_NOERROR == mciErr) { mciSendCommand(mciOpen.wDeviceID, MCI_CLOSE, 0, (DWORD)(LPMCI_OPEN_PARMS)&mciOpen); } #ifdef _DEBUG else { char szErrBuf[128] = "Memory Error"; mciGetErrorString(mciErr, szErrBuf, 128); MessageBox(NULL, szErrBuf, "MCI not installed", MB_ICONSTOP); } #endif return ((WORD)mciErr); } /****************************************************************************** @func BOOL | FRunningChicagoUI | Are we running on Win95? @rdesc TRUE if running Win95 ******************************************************************************/ BOOL fRunningWin95(void) { DWORD dwVersion = GetVersion(); if ((LOBYTE(LOWORD(dwVersion)) >= 4) && // If windows version is >= 4.0 we're on Win95 or WinNT w/ new shell (dwVersion & 0x80000000L)) // If high bit is set we're on Win95 or Win32s (not WinNT) return (TRUE); else return (FALSE); } /****************************************************************************** @func WORD | wInstallComp | Install the section under Win95 or ask user to do it under WinNT @parm WORD | wComp | Component ID to install @rdesc 0 - success 1 - couldn't launch setup app (under Win95 only) ******************************************************************************/ #define HOW_NEVER_REBOOT "0" // Whatever happens the machine will not be rebooted. #define MMINF "MOTOWN.INF" // The following 2 arrays must parallel each other between Win95 setup sections & NT driver names WORD wInstallComp(WORD wComp) { TCHAR szText[512]; TCHAR szDriverName[128]; bool fWin95 = fRunningWin95(); if (!LoadString(vwig.hinst, (fWin95) ? stidInstallDriverWin95 : stidInstallDriverNT, szText, sizeof(szText))) return (1); // fail if (!LoadString(vwig.hinst, stidDriverName + wComp, szDriverName, sizeof(szDriverName))) return (1); // fail MessageBox(NULL, szText, szDriverName, MB_ICONSTOP); if (fWin95) // Running Win95 NOT NT 3.51 with or without new shell { STARTUPINFO si; PROCESS_INFORMATION pi; TCHAR szCommandLine[512]; TCHAR szSectionName[255]; if (!LoadString(vwig.hinst, stidInstallCmdLine, szCommandLine, sizeof(szCommandLine))) return (1); // fail if (!LoadString(vwig.hinst, stidSectionName + wComp, szSectionName, sizeof(szSectionName))) return (1); // fail // Command line should look like this: // RunDll.exe setupx.dll,InstallHinfSection
// Add
lstrcat(szCommandLine, szSectionName); // Add lstrcat(szCommandLine, " " HOW_NEVER_REBOOT " " MMINF); #ifdef _DEBUG MessageBox(NULL, szCommandLine, "Win95 setup command", MB_ICONINFORMATION); #endif // Now execute the command line to cause the actual install si.cb = sizeof(STARTUPINFO); si.lpReserved = NULL; si.lpDesktop = NULL; si.lpTitle = NULL; si.dwFlags = 0; si.cbReserved2 = 0; si.lpReserved2 = NULL; if (CreateProcess(NULL, // address of module name szCommandLine, // address of command line NULL, // process security NULL, // thread security FALSE, // inherit handles? DETACHED_PROCESS, // creation flags NULL, // address of new environment NULL, // address of current directory &si, // STARTUPINFO &pi)) // PROCESS_INFORMATION { // Wait until process is finished WaitForSingleObject(pi.hProcess, INFINITE); // Close the process down CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return (0); } #ifdef _DEBUG MessageBox(NULL, szCommandLine, "Error launching command line", MB_ICONINFORMATION); #endif return (1); } return (1); } /****************************************************************************** @func int WINAPI | WinMain | Entry point for a MS Windows app @rdesc exit code ******************************************************************************/ /* Uncomment this WinMain function to make this module into a stand alone Win32 app that will verify audio support with the MS-ADPCM codec and video support with MS Video1 and Intel Indeo 3.2 codecs. int WINAPI WinMain( HINSTANCE hInstance, // handle of current instance HINSTANCE hPrevInstance, // handle of previous instance LPSTR lpszCmdLine, // address of command line int nCmdShow // show state of window ) { if(HWD_SUCCESS == wHaveWaveDevice(WAVE_FORMAT_2M08)) // 22kHz, Mono, 8bit { if(wHaveMCI("WAVEAUDIO")) // MCI for audio is not installed wInstallComp(IC_MCI_SOUND); if(wHaveACM()) // audio compression manager (sound mapper) not installed wInstallComp(IC_ACM); if(wHaveACMCodec(WAVE_FORMAT_ADPCM)) // audio codecs not installed wInstallComp(IC_ACM_ADPCM); } // have wave device if(wHaveMCI("AVIVIDEO")) // MCI for video is not installed wInstallComp(IC_MCI_VFW); if(HIC_SUCCESS != wHaveICMCodec(MS_VIDEO1)) // video 1 codec not installed wInstallComp(IC_ICM_VIDEO1); if(HIC_SUCCESS != wHaveICMCodec(INTEL_INDEO32)) // indeo 3.2 codec not installed wInstallComp(IC_ICM_INDEO32); return(0); } */ ================================================ FILE: src/studio/mminstal.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ #include // has WAVE_FORMAT_* defines for wHaveACMCodec() // return codes for wHaveWaveDevice() #define HWD_SUCCESS 0 #define HWD_NODEVICE 1 #define HWD_NODRIVER 2 #define HWD_ERROR 3 #define HWD_NOFORMAT 4 // return codes for wHaveACMCodec() #define HAC_SUCCESS 0 // ACM is installed, we've got a codec for the desired format #define HAC_NOACM 1 // Audio compression manager is not installed or is an old version #define HAC_NOCODEC 2 // ACM is installed, The requested codec is not active or installed #define HAC_NOCONVERT 3 // ACM is installed, Codec is installed but won't convert wav data. // video codec types #define MS_VIDEO1 mmioFOURCC('m', 's', 'v', 'c') #define INTEL_INDEO32 mmioFOURCC('i', 'v', '3', '2') // return codes for wHaveICMCodec() #define HIC_SUCCESS 0 // ICM is installed, we've got a codec for the desired format #define HIC_NOICM 1 // Installable compression manager is not installed or is an old version #define HIC_NOCODEC 2 // The requested codec is not active or installed #define HIC_NOCONVERT 3 // Codec is installed but won't convert wav data. // Installable components #define IC_MCI_SOUND 0 // MCI wave audio driver #define IC_MCI_VFW 1 // MCI video driver #define IC_ACM 2 // audio compression manager (wave mapper) driver #define IC_ACM_ADPCM 3 // ACM Microsoft ADPCM codec driver #define IC_ICM_VIDEO1 4 // Microsoft Video 1 codec driver #define IC_ICM_INDEO32 5 // Intel Indeo 3.2 codec driver #ifdef __cplusplus extern "C" { #endif WORD wInstallComp(WORD wComp); WORD wHaveWaveDevice(DWORD dwReqFormats); WORD wHaveACM(); WORD wHaveACMCodec(DWORD dwReqCodec); WORD wHaveICMCodec(DWORD dwReqCodec); WORD wHaveMCI(LPSTR dwDeviceType); #ifdef __cplusplus } #endif ================================================ FILE: src/studio/popdn.cht ================================================ /*****************************************************************************\ * * popdn.cht * * All pop-downs that appear in the studio. "Popdowns" are browser type of * popups. * * Author: Sean Selitrennikoff * * Status: Not Reviewed * \*****************************************************************************/ // // Press and hold button constants // #define klwPressDelayMax 45 #define klwPressDelayMin 10 #define kdlwPressDelay 7 ANIMATION(kidPressPageFwd, "Page Fwd Pressed") lwDelay = klwPressDelayMax; EnqueueCid(cidBrowserFwd, GidParGob(GidParThis()), GidThis(), 0, 0, 0); Cell(CHID(kstBrowserEnabled, krepMouseDnOn), 0, 0, lwDelay); While(); If(lwDelay > klwPressDelayMin); lwDelay -= kdlwPressDelay; End; EnqueueCid(cidBrowserFwd, GidParGob(GidParThis()), GidThis(), 0, 0, 0); Cell(chidNil, 0, 0, lwDelay); End; ENDCHUNK ANIMATION(kidPressPageBack, "Page Back Pressed") lwDelay = klwPressDelayMax; EnqueueCid(cidBrowserBack, GidParGob(GidParThis()), GidThis(), 0, 0, 0); Cell(CHID(kstBrowserEnabled, krepMouseDnOn), 0, 0, lwDelay); While(); If(lwDelay > klwPressDelayMin); lwDelay -= kdlwPressDelay; End; EnqueueCid(cidBrowserBack, GidParGob(GidParThis()), GidThis(), 0, 0, 0); Cell(chidNil, 0, 0, lwDelay); End; ENDCHUNK // // // Spletter Easel, Color Popdown // // // // Parent // GOBCHUNK("Spletter Easel, Color Popdown", kidSpltsColor, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ENDCHUNK REP_RECT(CHID(kstDefault, krepDefault), "Sizer", kxpSpltsColorLeft, kypSpltsColorTop, kxpSpltsColorRight, kypSpltsColorBottom ) CREATE_SCRIPT("Spletter color parent") CreateChildThis(kidSpltsColorBackground, kidSpltsColorBackground); ENDCHUNK // // Background // GOBCHUNK("Spletter Easel, Color Popdown", kidSpltsColorBackground, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_FILL(CHID(kstDefault, krepDefault), "Sizer", 0, 0,kdxpSpltsColor, kdypSpltsColor, Palette( 21 ), Palette( 21 ) ) PATTERN_100 ENDCHUNK ADOPT_WAVE(kcnoDropDnWav, CHID(kstDefault, krepEnterAnimation)) CREATE_SCRIPT("Spletter color created") CreateChildThis(kidSpltsColorPageDown, kidSpltsColorPageDown); ChangeStateGob(kidSpltsColorPageDown, kstBrowserEnabled); CreateChildThis(kidSpltsColorPageUp, kidSpltsColorPageUp); ChangeStateGob(kidSpltsColorPageUp, kstBrowserEnabled); yp = kdypSpltsColorTop; nFrame = 0; While(yp <= (kdypSpltsColor - kdypSpltsColorFrame - kdypSpltsColorBottom)); xp = kdxpSpltsColorLeft; While(xp <= (kdxpSpltsColor - kdxpSpltsColorRight - kdxpSpltsColorFrame)); // // create and position frames // CreateChildThis(kidSpltsColorFrame + nFrame, kidSpltsColorFrame); MoveAbsGob(kidSpltsColorFrame + nFrame, xp, yp); nFrame++; xp += kdxpSpltsColorSpacing + kdxpSpltsColorFrame; End; yp += kdypSpltsColorSpacing + kdypSpltsColorFrame; End; // // This shuts when a mouse down occurs. // FilterCmdsThis(cidMouseDown, cidNil, kchidScript1); FilterCmdsThis(cidKey, cidNil, kchidScript2); ENDCHUNK CHILD_SCRIPT("Spletter Color, track mouse", kchidScript1) kid = _parm[0]; If(((kid >= kidSpltsColorFrame) && (kid < kidSpltsColorFrameLim)) || (kid == kidSpltsColorPageDown) || (kid == kidSpltsColorPageUp)); Return(fFalse); End; // // Tell the parent to cancel the popup and pass the click thru. // EnqueueCid(cidBrowserCancel, kidSpltsColor, 0, 0, 0, 0); Return(fFalse); ENDCHUNK CHILD_SCRIPT("Spletter Color, disable keys", kchidScript2) Return(fTrue); ENDCHUNK // // Spletters color frame // GOBCHUNK("Spletters Color Frame", kidSpltsColorFrame, kgokkRectNoKids) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, cnoNil) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault), "studio\bmp\d1frm.bmp", kxpregSpltsColorFrame, kypregSpltsColorFrame) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\d1frmh.bmp", kxpregSpltsColorFrame, kypregSpltsColorFrame) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserSelected, krepDefault)) REP_RECT(CHID(kstBrowserDisabled, krepDefault), "hidden", 0, 0, 0, 0) CLICK_SCRIPT("Frame clicked") PlaySoundGob(kidBackground, kctgWave, kcnoPSelectWav, 0, 0x10000, 1, 0, 1); EnqueueCid(cidBrowserSelect, kidSpltsColor, GidThis(), 0, 0, 0); EnqueueCid(cidBrowserOk, kidSpltsColor, 0, 0, 0, 0); ENDCHUNK // // Spletters color page down // GOBCHUNK("Spletters Color page down", kidSpltsColorPageDown, kgokkNormal) DEFAULT_POSITION(kxpSpltsColorPageDown, kypSpltsColorPageDown, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, chidNil, cidNil, kttGenericPageFwd) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault ), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault ), "studio\bmp\d1dn.bmp", kxpregSpltsColorPageDown, kypregSpltsColorPageDown) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\d1dns.bmp", kxpregSpltsColorPageDown, kypregSpltsColorPageDown) REP_RECT(CHID(kstBrowserDisabled, krepDefault ), "hidden", 0, 0, 0, 0) ADOPT_WAVE(kcnoPageDnWav, CHID(kstBrowserEnabled, krepClicked)) ADOPT_ANIM(kidPressPageFwd, CHID(kstBrowserEnabled, krepMouseDnOn)) // // Spletters color page up // GOBCHUNK("Spletters Color page up", kidSpltsColorPageUp, kgokkNormal) DEFAULT_POSITION(kxpSpltsColorPageUp, kypSpltsColorPageUp, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, chidNil, cidNil, kttGenericPageBack) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault ), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault ), "studio\bmp\d1up.bmp", kxpregSpltsColorPageUp, kypregSpltsColorPageUp) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\d1ups.bmp", kxpregSpltsColorPageUp, kypregSpltsColorPageUp) REP_RECT(CHID(kstBrowserDisabled, krepDefault ), "hidden", 0, 0, 0, 0) ADOPT_WAVE(kcnoPageUpWav, CHID(kstBrowserEnabled, krepClicked)) ADOPT_ANIM(kidPressPageBack, CHID(kstBrowserEnabled, krepMouseDnOn)) // // // Spletter Easel, Shape Popdown // // // // Parent // GOBCHUNK("Spletter Easel, Shape Popdown", kidSpltsShape, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ENDCHUNK REP_RECT(CHID(kstDefault, krepDefault), "Sizer", kxpSpltsShapeLeft, kypSpltsShapeTop, kxpSpltsShapeRight, kypSpltsShapeBottom ) CREATE_SCRIPT("Spletter Shape parent") CreateChildThis(kidSpltsShapeBackground, kidSpltsShapeBackground); ENDCHUNK // // Background // GOBCHUNK("Spletter Easel, Shape Popdown", kidSpltsShapeBackground, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_FILL(CHID(kstDefault, krepDefault), "Sizer", 0, 0,kdxpSpltsShape, kdypSpltsShape, Palette( 21 ), Palette( 21 ) ) PATTERN_100 ENDCHUNK ADOPT_WAVE(kcnoDropDnWav, CHID(kstDefault, krepEnterAnimation)) CREATE_SCRIPT("Spletter Shape created") CreateChildThis(kidSpltsShapePageDown, kidSpltsShapePageDown); ChangeStateGob(kidSpltsShapePageDown, kstBrowserEnabled); CreateChildThis(kidSpltsShapePageUp, kidSpltsShapePageUp); ChangeStateGob(kidSpltsShapePageUp, kstBrowserEnabled); yp = kdypSpltsShapeTop; nFrame = 0; While(yp <= (kdypSpltsShape - kdypSpltsShapeFrame - kdypSpltsShapeBottom)); xp = kdxpSpltsShapeLeft; While(xp <= (kdxpSpltsShape - kdxpSpltsShapeRight - kdxpSpltsShapeFrame)); // // create and position frames // CreateChildThis(kidSpltsShapeFrame + nFrame, kidSpltsShapeFrame); MoveAbsGob(kidSpltsShapeFrame + nFrame, xp, yp); ChangeStateGob(kidSpltsShapeFrame + nFrame, kstBrowserEnabled); nFrame++; xp += kdxpSpltsShapeSpacing + kdxpSpltsShapeFrame; End; yp += kdypSpltsShapeSpacing + kdypSpltsShapeFrame; End; // // This shuts when a mouse down occurs. // FilterCmdsThis(cidMouseDown, cidNil, kchidScript1); FilterCmdsThis(cidKey, cidNil, kchidScript2); ENDCHUNK CHILD_SCRIPT("Spletter Shape, track mouse", kchidScript1) kid = _parm[0]; If(((kid >= kidSpltsShapeFrame) && (kid < kidSpltsShapeFrameLim)) || (kid == kidSpltsShapePageDown) || (kid == kidSpltsShapePageUp)); Return(fFalse); End; // // Tell the parent to cancel the popup and pass the click thru. // EnqueueCid(cidBrowserCancel, kidSpltsShape, 0, 0, 0, 0); Return(fFalse); ENDCHUNK CHILD_SCRIPT("Spletter Shape, disable keys", kchidScript2) Return(fTrue); ENDCHUNK // // Spletters Shape frame // GOBCHUNK("Spletters Shape Frame", kidSpltsShapeFrame, kgokkRectNoKids) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, cnoNil) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault), "studio\bmp\d2frm.bmp", kxpregSpltsShapeFrame, kypregSpltsShapeFrame) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\d2frmh.bmp", kxpregSpltsShapeFrame, kypregSpltsShapeFrame) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserSelected, krepDefault)) REP_RECT(CHID(kstBrowserDisabled, krepDefault), "hidden", 0, 0, 0, 0) CLICK_SCRIPT("Frame clicked") PlaySoundGob(kidBackground, kctgWave, kcnoPSelectWav, 0, 0x10000, 1, 0, 1); EnqueueCid(cidBrowserSelect,kidSpltsShape, GidThis(), 0, 0, 0); EnqueueCid(cidBrowserOk, kidSpltsShape, 0, 0, 0, 0); ENDCHUNK // // Spletters Shape page down // GOBCHUNK("Spletters Shape page down", kidSpltsShapePageDown, kgokkNormal) DEFAULT_POSITION(kxpSpltsShapePageDown, kypSpltsShapePageDown, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, chidNil, cidNil, kttGenericPageFwd) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault ), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault ), "studio\bmp\d2dn.bmp", kxpregSpltsShapePageDown, kypregSpltsShapePageDown) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\d2dns.bmp", kxpregSpltsShapePageDown, kypregSpltsShapePageDown) REP_RECT(CHID(kstBrowserDisabled, krepDefault ), "hidden", 0, 0, 0, 0) ADOPT_WAVE(kcnoPageDnWav, CHID(kstBrowserEnabled, krepClicked)) ADOPT_ANIM(kidPressPageFwd, CHID(kstBrowserEnabled, krepMouseDnOn)) // // Spletters Shape page up // GOBCHUNK("Spletters Shape page up", kidSpltsShapePageUp, kgokkNormal) DEFAULT_POSITION(kxpSpltsShapePageUp, kypSpltsShapePageUp, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, chidNil, cidNil, kttGenericPageBack) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault ), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault ), "studio\bmp\d2up.bmp", kxpregSpltsShapePageUp, kypregSpltsShapePageUp) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\d2ups.bmp", kxpregSpltsShapePageUp, kypregSpltsShapePageUp) REP_RECT(CHID(kstBrowserDisabled, krepDefault ), "hidden", 0, 0, 0, 0) ADOPT_WAVE(kcnoPageUpWav, CHID(kstBrowserEnabled, krepClicked)) ADOPT_ANIM(kidPressPageBack, CHID(kstBrowserEnabled, krepMouseDnOn)) // // // Spletter Easel, Font Popdown // // // // Parent // GOBCHUNK("Spletter Easel, Font Popdown", kidSpltsFont, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ENDCHUNK REP_RECT(CHID(kstDefault, krepDefault), "Sizer", kxpSpltsFontLeft, kypSpltsFontTop, kxpSpltsFontRight, kypSpltsFontBottom ) CREATE_SCRIPT("Spletter Font parent") CreateChildThis(kidSpltsFontBackground, kidSpltsFontBackground); ENDCHUNK // // Background // GOBCHUNK("Spletter Easel, Font Popdown", kidSpltsFontBackground, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_FILL(CHID(kstDefault, krepDefault), "Sizer", 0, 0,kdxpSpltsFont, kdypSpltsFont, Palette( 21 ), Palette( 21 ) ) PATTERN_100 ENDCHUNK ADOPT_WAVE(kcnoDropDnWav, CHID(kstDefault, krepEnterAnimation)) CREATE_SCRIPT("Spletter Font created") CreateChildThis(kidSpltsFontPageDown, kidSpltsFontPageDown); ChangeStateGob(kidSpltsFontPageDown, kstBrowserEnabled); CreateChildThis(kidSpltsFontPageUp, kidSpltsFontPageUp); ChangeStateGob(kidSpltsFontPageUp, kstBrowserEnabled); yp = kdypSpltsFontTop; nFrame = 0; While(yp <= (kdypSpltsFont - kdypSpltsFontFrame - kdypSpltsFontBottom)); xp = kdxpSpltsFontLeft; While(xp <= (kdxpSpltsFont - kdxpSpltsFontRight - kdxpSpltsFontFrame)); // // create and position frames // CreateChildThis(kidSpltsFontFrame + nFrame, kidSpltsFontFrame); MoveAbsGob(kidSpltsFontFrame + nFrame, xp, yp); ChangeStateGob(kidSpltsFontFrame + nFrame, kstBrowserEnabled); nFrame++; xp += kdxpSpltsFontSpacing + kdxpSpltsFontFrame; End; yp += kdypSpltsFontSpacing + kdypSpltsFontFrame; End; // // This shuts when a mouse down occurs. // FilterCmdsThis(cidMouseDown, cidNil, kchidScript1); FilterCmdsThis(cidKey, cidNil, kchidScript2); ENDCHUNK CHILD_SCRIPT("Spletter Font, track mouse", kchidScript1) kid = _parm[0]; If(((kid >= kidSpltsFontFrame) && (kid < kidSpltsFontFrameLim)) || (kid == kidSpltsFontPageDown) || (kid == kidSpltsFontPageUp)); Return(fFalse); End; // // Tell the parent to cancel the popup and pass the click thru. // EnqueueCid(cidBrowserCancel, kidSpltsFont, 0, 0, 0, 0); Return(fFalse); ENDCHUNK CHILD_SCRIPT("Spletter Font, disable keys", kchidScript2) Return(fTrue); ENDCHUNK // // Spletters Font frame // GOBCHUNK("Spletters Font Frame", kidSpltsFontFrame, kgokkRectNoKids) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, cnoNil) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault), "studio\bmp\d3frm.bmp", kxpregSpltsFontFrame, kypregSpltsFontFrame) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\d3frmh.bmp", kxpregSpltsFontFrame, kypregSpltsFontFrame) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserSelected, krepDefault)) REP_RECT(CHID(kstBrowserDisabled, krepDefault), "hidden", 0, 0, 0, 0) CLICK_SCRIPT("Frame clicked") PlaySoundGob(kidBackground, kctgWave, kcnoPSelectWav, 0, 0x10000, 1, 0, 1); EnqueueCid(cidBrowserSelect, kidSpltsFont, GidThis(), 0, 0, 0); EnqueueCid(cidBrowserOk, kidSpltsFont, 0, 0, 0, 0); ENDCHUNK // // Spletters Font page down // GOBCHUNK("Spletters Font page down", kidSpltsFontPageDown, kgokkNormal) DEFAULT_POSITION(kxpSpltsFontPageDown, kypSpltsFontPageDown, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, chidNil, cidNil, kttGenericPageFwd) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault ), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault ), "studio\bmp\d3dn.bmp", kxpregSpltsFontPageDown, kypregSpltsFontPageDown) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\d3dns.bmp", kxpregSpltsFontPageDown, kypregSpltsFontPageDown) REP_RECT(CHID(kstBrowserDisabled, krepDefault ), "hidden", 0, 0, 0, 0) ADOPT_WAVE(kcnoPageDnWav, CHID(kstBrowserEnabled, krepClicked)) ADOPT_ANIM(kidPressPageFwd, CHID(kstBrowserEnabled, krepMouseDnOn)) // // Spletters Font page up // GOBCHUNK("Spletters Font page up", kidSpltsFontPageUp, kgokkNormal) DEFAULT_POSITION(kxpSpltsFontPageUp, kypSpltsFontPageUp, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, chidNil, cidNil, kttGenericPageBack) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault ), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault ), "studio\bmp\d3up.bmp", kxpregSpltsFontPageUp, kypregSpltsFontPageUp) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\d3ups.bmp", kxpregSpltsFontPageUp, kypregSpltsFontPageUp) REP_RECT(CHID(kstBrowserDisabled, krepDefault ), "hidden", 0, 0, 0, 0) ADOPT_WAVE(kcnoPageUpWav, CHID(kstBrowserEnabled, krepClicked)) ADOPT_ANIM(kidPressPageBack, CHID(kstBrowserEnabled, krepMouseDnOn)) // // // Text Font Popdown // // // // Parent // GOBCHUNK("Text Font Popdown", kidTextFont, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ENDCHUNK REP_RECT(CHID(kstDefault, krepDefault), "Sizer", kxpTextFontLeft, kypTextFontTop, kxpTextFontRight, kypTextFontBottom ) CREATE_SCRIPT("Text Font parent") CreateChildThis(kidTextFontBackground, kidTextFontBackground); ENDCHUNK // // Background // GOBCHUNK("Text Font Popdown", kidTextFontBackground, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_MBMP(CHID(kstDefault, krepDefault), "studio\bmp\d5par.bmp") ADOPT_WAVE(kcnoDropDnWav, CHID(kstDefault, krepEnterAnimation)) CREATE_SCRIPT("Text Font created") CreateChildThis(kidTextFontPageDown, kidTextFontPageDown); ChangeStateGob(kidTextFontPageDown, kstBrowserEnabled); CreateChildThis(kidTextFontPageUp, kidTextFontPageUp); ChangeStateGob(kidTextFontPageUp, kstBrowserEnabled); yp = kdypTextFontTop; .kidThumb = kidTextFontFrame; While(yp <= (kdypTextFont - kdypTextFontFrame - kdypTextFontBottom)); xp = kdxpTextFontLeft; While(xp <= (kdxpTextFont - kdxpTextFontRight - kdxpTextFontFrame)); // // create and position frames // ASSERT(.kidThumb <= kidTextFontFrameLim); kidFrame = GidUnique(); CreateChildThis(kidFrame, kidTextFontFrame); MoveAbsGob(kidFrame, xp, yp); .kidThumb++; xp += kdxpTextFontSpacing + kdxpTextFontFrame; End; yp += kdypTextFontSpacing + kdypTextFontFrame; End; // // This shuts when a mouse down occurs. // FilterCmdsThis(cidMouseDown, hidNil, kchidScript1); FilterCmdsThis(cidKey, hidNil, kchidScript2); ENDCHUNK CHILD_SCRIPT("Text Font, track mouse", kchidScript1) kid = _parm[0]; If(kid == kidTextsFont); Return(fTrue); End; If(GidParGob(kid) == kidTextFontBackground); Return(fFalse); End; If(((kid >= kidTextFontFrame) && (kid < kidTextFontFrameLim)) || (kid == kidTextFontPageDown) || (kid == kidTextFontPageUp)); DEBUGCMD( AlertStr("Handling kid the old way");) Return(fFalse); End; // // Tell the parent to cancel the popup and pass the click thru. // EnqueueCid(cidBrowserCancel, kidTextFont, 0, 0, 0, 0); ChangeStateGob(kidTextsFont, kstDefault); Return(fFalse); ENDCHUNK CHILD_SCRIPT("Text Font, disable keys", kchidScript2) Return(fTrue); ENDCHUNK // // Text Font frame // GOBCHUNK("Text Font Frame", kidTextFontFrame, kgokkRectNoKids) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID1(kchidClick), cidNil, cnoNil) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault), "studio\bmp\d5frm.bmp", kxpregTextFontFrame, kypregTextFontFrame) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\d5frmh.bmp", kxpregTextFontFrame, kypregTextFontFrame) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserSelected, krepDefault)) REP_RECT(CHID(kstBrowserDisabled, krepDefault), "hidden", 0, 0, 0, 0) ADOPT_WAVE(kcnoSecToolWav, CHID(kstBrowserEnabled, krepClicked)) CREATE_SCRIPT("Frame created") CreateChildThis(GidParThis()->kidThumb, kidTextFontThumb); ENDCHUNK CLICK_SCRIPT("Frame clicked") If(kidBackground->idtbxDown != kidTextsFont); ChangeStateGob(kidBackground->idtbxDown, kstDefault); kidBackground->idtbxDown = kidTextsFont; kidBackground->chttTbox = chttTboxSelect; End; EnqueueCid(cidBrowserSelect, kidTextFont, GidChild(GidThis()), 0, 0, 0); EnqueueCid(cidBrowserOk, kidTextFont, 0, 0, 0, 0); ENDCHUNK GOBCHUNK("Text Font Thumb Frame", kidTextFontThumb, kgokkRectNoHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, chidNil, cidNil, cnoNil) ENDCHUNK REP_RECT(CHID(kstDefault, krepDefault), "default", 16, 4, 156, 17) REP_ANIM(CHID(kstBrowserEnabled, krepEnterAnimation), "Font frame state change") ChangeStateGob(GidParThis(), StateThis()); ENDCHUNK ADOPT_ANIM(LAST_ANIM, CHID(kstBrowserDisabled, krepEnterAnimation)) ADOPT_ANIM(LAST_ANIM, CHID(kstBrowserSelected, krepEnterAnimation)) // // Text Font page down // GOBCHUNK("Text Font page down", kidTextFontPageDown, kgokkNormal) DEFAULT_POSITION(kxpTextFontPageDown, kypTextFontPageDown, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, chidNil, cidNil, kttGenericPageFwd) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault ), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault ), "studio\bmp\d5dn.bmp", kxpregTextFontPageDown, kypregTextFontPageDown) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\d5dns.bmp", kxpregTextFontPageDown, kypregTextFontPageDown) REP_RECT(CHID(kstBrowserDisabled, krepDefault ), "hidden", 0, 0, 0, 0) ADOPT_WAVE(kcnoPageDnWav, CHID(kstBrowserEnabled, krepClicked)) ADOPT_ANIM(kidPressPageFwd, CHID(kstBrowserEnabled, krepMouseDnOn)) // // Text Font page up // GOBCHUNK("Text Font page up", kidTextFontPageUp, kgokkNormal) DEFAULT_POSITION(kxpTextFontPageUp, kypTextFontPageUp, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, chidNil, cidNil, kttGenericPageBack) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault ), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault ), "studio\bmp\d5up.bmp", kxpregTextFontPageUp, kypregTextFontPageUp) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\d5ups.bmp", kxpregTextFontPageUp, kypregTextFontPageUp) REP_RECT(CHID(kstBrowserDisabled, krepDefault ), "hidden", 0, 0, 0, 0) ADOPT_WAVE(kcnoPageUpWav, CHID(kstBrowserEnabled, krepClicked)) ADOPT_ANIM(kidPressPageBack, CHID(kstBrowserEnabled, krepMouseDnOn)) // // // Text Style Popdown // // // // Parent // GOBCHUNK("Text Style Popdown", kidTextStyle, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ENDCHUNK REP_RECT(CHID(kstDefault, krepDefault), "Sizer", kxpTextStyleLeft, kypTextStyleTop, kxpTextStyleRight, kypTextStyleBottom ) CREATE_SCRIPT("Text Style parent") CreateChildThis(kidTextStyleBackground, kidTextStyleBackground); ENDCHUNK // // Background // GOBCHUNK("Text Style Popdown", kidTextStyleBackground, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_MBMP(CHID(kstDefault, krepDefault), "studio\bmp\d6par.bmp") ADOPT_WAVE(kcnoDropDnWav, CHID(kstDefault, krepEnterAnimation)) CREATE_SCRIPT("Text Style created") CreateChildThis(kidTextStylePageDown, kidTextStylePageDown); ChangeStateGob(kidTextStylePageDown, kstBrowserEnabled); CreateChildThis(kidTextStylePageUp, kidTextStylePageUp); ChangeStateGob(kidTextStylePageUp, kstBrowserEnabled); yp = kdypTextStyleTop; nFrame = 0; While(yp <= (kdypTextStyle - kdypTextStyleFrame - kdypTextStyleBottom)); xp = kdxpTextStyleLeft; While(xp <= (kdxpTextStyle - kdxpTextStyleRight - kdxpTextStyleFrame)); // // create and position frames // CreateChildThis(kidTextStyleFrame + nFrame, kidTextStyleFrame); MoveAbsGob(kidTextStyleFrame + nFrame, xp, yp); nFrame++; xp += kdxpTextStyleSpacing + kdxpTextStyleFrame; End; yp += kdypTextStyleSpacing + kdypTextStyleFrame; End; ASSERT(!FGobExists(kidTextStyleFrame + nFrame)); // // This shuts when a mouse down occurs. // FilterCmdsThis(cidMouseDown, cidNil, kchidScript1); FilterCmdsThis(cidKey, cidNil, kchidScript2); ENDCHUNK CHILD_SCRIPT("Text Style, track mouse", kchidScript1) kid = _parm[0]; If(kid == kidTextsFontShape); Return(fTrue); End; If(((kid >= kidTextStyleFrame) && (kid < kidTextStyleFrameLim)) || (kid == kidTextStylePageDown) || (kid == kidTextStylePageUp)); Return(fFalse); End; // // Tell the parent to cancel the popup and pass the click thru. // EnqueueCid(cidBrowserCancel, kidTextStyle, 0, 0, 0, 0); ChangeStateGob(kidTextsFontShape, kstDefault); Return(fFalse); ENDCHUNK CHILD_SCRIPT("Text Style, disable keys", kchidScript2) Return(fTrue); ENDCHUNK // // Text Style frame // GOBCHUNK("Text Style Frame", kidTextStyleFrame, kgokkRectNoKids) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, cnoNil) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault), "studio\bmp\d6frm.bmp", kxpregTextStyleFrame, kypregTextStyleFrame) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\d6frmh.bmp", kxpregTextStyleFrame, kypregTextStyleFrame) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserSelected, krepDefault)) REP_RECT(CHID(kstBrowserDisabled, krepDefault), "hidden", 0, 0, 0, 0) ADOPT_WAVE(kcnoSecToolWav, CHID(kstBrowserEnabled, krepClicked)) CLICK_SCRIPT("Frame clicked") If(kidBackground->idtbxDown != kidTextsFontShape); ChangeStateGob(kidBackground->idtbxDown, kstDefault); kidBackground->idtbxDown = kidTextsFontShape; kidBackground->chttTbox = chttTboxSelect; End; EnqueueCid(cidBrowserSelect, kidTextStyle, GidThis(), 0, 0, 0); EnqueueCid(cidBrowserOk, kidTextStyle, 0, 0, 0, 0); ENDCHUNK // // Text Style page down // GOBCHUNK("Text Style page down", kidTextStylePageDown, kgokkNormal) DEFAULT_POSITION(kxpTextStylePageDown, kypTextStylePageDown, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, chidNil, cidNil, kttGenericPageFwd) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault ), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault ), "studio\bmp\d6dn.bmp", kxpregTextStylePageDown, kypregTextStylePageDown) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\d6dns.bmp", kxpregTextStylePageDown, kypregTextStylePageDown) REP_RECT(CHID(kstBrowserDisabled, krepDefault ), "hidden", 0, 0, 0, 0) ADOPT_WAVE(kcnoPageDnWav, CHID(kstBrowserEnabled, krepClicked)) ADOPT_ANIM(kidPressPageFwd, CHID(kstBrowserEnabled, krepMouseDnOn)) // // Text Style page up // GOBCHUNK("Text Style page up", kidTextStylePageUp, kgokkNormal) DEFAULT_POSITION(kxpTextStylePageUp, kypTextStylePageUp, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, chidNil, cidNil, kttGenericPageBack) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault ), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault ), "studio\bmp\d6up.bmp", kxpregTextStylePageUp, kypregTextStylePageUp) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\d6ups.bmp", kxpregTextStylePageUp, kypregTextStylePageUp) REP_RECT(CHID(kstBrowserDisabled, krepDefault ), "hidden", 0, 0, 0, 0) ADOPT_WAVE(kcnoPageUpWav, CHID(kstBrowserEnabled, krepClicked)) ADOPT_ANIM(kidPressPageBack, CHID(kstBrowserEnabled, krepMouseDnOn)) // // // Text Size Popdown // // // // Parent // GOBCHUNK("Text Size Popdown", kidTextSize, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ENDCHUNK REP_RECT(CHID(kstDefault, krepDefault), "Sizer", kxpTextSizeLeft, kypTextSizeTop, kxpTextSizeRight, kypTextSizeBottom ) CREATE_SCRIPT("Text Size parent") CreateChildThis(kidTextSizeBackground, kidTextSizeBackground); ENDCHUNK // // Background // GOBCHUNK("Text Size Popdown", kidTextSizeBackground, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_MBMP(CHID(kstDefault, krepDefault), "studio\bmp\d7par.bmp") ADOPT_WAVE(kcnoDropDnWav, CHID(kstDefault, krepEnterAnimation)) CREATE_SCRIPT("Text Size created") CreateChildThis(kidTextSizePageDown, kidTextSizePageDown); ChangeStateGob(kidTextSizePageDown, kstBrowserEnabled); CreateChildThis(kidTextSizePageUp, kidTextSizePageUp); ChangeStateGob(kidTextSizePageUp, kstBrowserEnabled); yp = kdypTextSizeTop; nFrame = 0; While(yp <= (kdypTextSize - kdypTextSizeFrame - kdypTextSizeBottom)); xp = kdxpTextSizeLeft; While(xp <= (kdxpTextSize - kdxpTextSizeRight - kdxpTextSizeFrame)); // // create and position frames // CreateChildThis(kidTextSizeFrame + nFrame, kidTextSizeFrame); MoveAbsGob(kidTextSizeFrame + nFrame, xp, yp); nFrame++; xp += kdxpTextSizeSpacing + kdxpTextSizeFrame; End; yp += kdypTextSizeSpacing + kdypTextSizeFrame; End; // // This shuts when a mouse down occurs. // FilterCmdsThis(cidMouseDown, cidNil, kchidScript1); FilterCmdsThis(cidKey, cidNil, kchidScript2); ENDCHUNK CHILD_SCRIPT("Text Size, track mouse", kchidScript1) kid = _parm[0]; If(kid == kidTextsFontSize); Return(fTrue); End; If(((kid >= kidTextSizeFrame) && (kid < kidTextSizeFrameLim)) || (kid == kidTextSizePageDown) || (kid == kidTextSizePageUp)); Return(fFalse); End; // // Tell the parent to cancel the popup and pass the click thru. // EnqueueCid(cidBrowserCancel, kidTextSize, 0, 0, 0, 0); ChangeStateGob(kidTextsFontSize, kstDefault); Return(fFalse); ENDCHUNK CHILD_SCRIPT("Text Size, disable keys", kchidScript2) Return(fTrue); ENDCHUNK // // Text Size frame // GOBCHUNK("Text Size Frame", kidTextSizeFrame, kgokkRectNoKids) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, cnoNil) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault), "studio\bmp\d7frm.bmp", kxpregTextSizeFrame, kypregTextSizeFrame) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\d7frmh.bmp", kxpregTextSizeFrame, kypregTextSizeFrame) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserSelected, krepDefault)) REP_RECT(CHID(kstBrowserDisabled, krepDefault), "hidden", 0, 0, 0, 0) ADOPT_WAVE(kcnoSecToolWav, CHID(kstBrowserEnabled, krepClicked)) CLICK_SCRIPT("Frame clicked") If(kidBackground->idtbxDown != kidTextsFontSize); ChangeStateGob(kidBackground->idtbxDown, kstDefault); kidBackground->idtbxDown = kidTextsFontSize; kidBackground->chttTbox = chttTboxSelect; End; EnqueueCid(cidBrowserSelect, kidTextSize, GidThis(), 0, 0, 0); EnqueueCid(cidBrowserOk, kidTextSize, 0, 0, 0, 0); ENDCHUNK // // Text Size page down // GOBCHUNK("Text Size page down", kidTextSizePageDown, kgokkNormal) DEFAULT_POSITION(kxpTextSizePageDown, kypTextSizePageDown, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, chidNil, cidNil, kttGenericPageFwd) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault ), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault ), "studio\bmp\d7dn.bmp", kxpregTextSizePageDown, kypregTextSizePageDown) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\d7dns.bmp", kxpregTextSizePageDown, kypregTextSizePageDown) REP_RECT(CHID(kstBrowserDisabled, krepDefault ), "hidden", 0, 0, 0, 0) ADOPT_WAVE(kcnoPageDnWav, CHID(kstBrowserEnabled, krepClicked)) ADOPT_ANIM(kidPressPageFwd, CHID(kstBrowserEnabled, krepMouseDnOn)) // // Text Size page up // GOBCHUNK("Text Size page up", kidTextSizePageUp, kgokkNormal) DEFAULT_POSITION(kxpTextSizePageUp, kypTextSizePageUp, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, chidNil, cidNil, kttGenericPageBack) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault ), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault ), "studio\bmp\d7up.bmp", kxpregTextSizePageUp, kypregTextSizePageUp) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\d7ups.bmp", kxpregTextSizePageUp, kypregTextSizePageUp) REP_RECT(CHID(kstBrowserDisabled, krepDefault ), "hidden", 0, 0, 0, 0) ADOPT_WAVE(kcnoPageUpWav, CHID(kstBrowserEnabled, krepClicked)) ADOPT_ANIM(kidPressPageBack, CHID(kstBrowserEnabled, krepMouseDnOn)) // // // Text Color Popdown // // // // Parent // GOBCHUNK("Text Color Popdown", kidTextColor, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ENDCHUNK REP_RECT(CHID(kstDefault, krepDefault), "Sizer", kxpTextColorLeft, kypTextColorTop, kxpTextColorRight, kypTextColorBottom ) CREATE_SCRIPT("Text Color parent") CreateChildThis(kidTextColorBackground, kidTextColorBackground); ENDCHUNK // // Background // GOBCHUNK("Text Color Popdown", kidTextColorBackground, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_FILL(CHID(kstDefault, krepDefault), "Color", 0, 0, kdxpTextColor, kdypTextColor, Palette( 21 ), Palette( 21 ) ) PATTERN_100 ENDCHUNK ADOPT_WAVE(kcnoDropDnWav, CHID(kstDefault, krepEnterAnimation)) CREATE_SCRIPT("Text Color created") CreateChildThis(kidTextColorPageDown, kidTextColorPageDown); ChangeStateGob(kidTextColorPageDown, kstBrowserEnabled); CreateChildThis(kidTextColorPageUp, kidTextColorPageUp); ChangeStateGob(kidTextColorPageUp, kstBrowserEnabled); yp = kdypTextColorTop; nFrame = 0; While(yp <= (kdypTextColor - kdypTextColorFrame - kdypTextColorBottom)); xp = kdxpTextColorLeft; While(xp <= (kdxpTextColor - kdxpTextColorRight - kdxpTextColorFrame)); // // create and position frames // CreateChildThis(kidTextColorFrame + nFrame, kidTextColorFrame); MoveAbsGob(kidTextColorFrame + nFrame, xp, yp); nFrame++; xp += kdxpTextColorSpacing + kdxpTextColorFrame; End; yp += kdypTextColorSpacing + kdypTextColorFrame; End; // // This shuts when a mouse down occurs. // FilterCmdsThis(cidMouseDown, cidNil, kchidScript1); FilterCmdsThis(cidKey, cidNil, kchidScript2); ENDCHUNK CHILD_SCRIPT("Text Color, track mouse", kchidScript1) kid = _parm[0]; If(kid == kidTextsFontColor); Return(fTrue); End; If(((kid >= kidTextColorFrame) && (kid < kidTextColorFrameLim)) || (kid == kidTextColorPageDown) || (kid == kidTextColorPageUp)); Return(fFalse); End; If (kid == kidTextsFontColor); Return(fTrue); End; // // Tell the parent to cancel the popup and pass the click thru. // EnqueueCid(cidBrowserCancel, kidTextColor, 0, 0, 0, 0); ChangeStateGob(kidTextsFontColor, kstDefault); Return(fFalse); ENDCHUNK CHILD_SCRIPT("Text Color, disable keys", kchidScript2) Return(fTrue); ENDCHUNK // // Text Color frame // GOBCHUNK("Text Color Frame", kidTextColorFrame, kgokkRectNoKids) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, cnoNil) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault), "studio\bmp\d8frm.bmp", kxpregTextColorFrame, kypregTextColorFrame) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\d8frmh.bmp", kxpregTextColorFrame, kypregTextColorFrame) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserSelected, krepDefault)) REP_RECT(CHID(kstBrowserDisabled, krepDefault), "hidden", 0, 0, 0, 0) ADOPT_WAVE(kcnoSecToolWav, CHID(kstBrowserEnabled, krepClicked)) CLICK_SCRIPT("Frame clicked") If(kidBackground->idtbxDown != kidTextsFontColor); ChangeStateGob(kidBackground->idtbxDown, kstDefault); kidBackground->idtbxDown = kidTextsFontColor; kidBackground->chttTbox = chttTboxSelect; End; EnqueueCid(cidBrowserSelect, kidTextColor, GidThis(), 0, 0, 0); EnqueueCid(cidBrowserOk, kidTextColor, 0, 0, 0, 0); ENDCHUNK // // Text Color page down // GOBCHUNK("Text Color page down", kidTextColorPageDown, kgokkNormal) DEFAULT_POSITION(kxpTextColorPageDown, kypTextColorPageDown, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, chidNil, cidNil, kttGenericPageFwd) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault ), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault ), "studio\bmp\d8dn.bmp", kxpregTextColorPageDown, kypregTextColorPageDown) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\d8dns.bmp", kxpregTextColorPageDown, kypregTextColorPageDown) REP_RECT(CHID(kstBrowserDisabled, krepDefault ), "hidden", 0, 0, 0, 0) ADOPT_WAVE(kcnoPageDnWav, CHID(kstBrowserEnabled, krepClicked)) ADOPT_ANIM(kidPressPageFwd, CHID(kstBrowserEnabled, krepMouseDnOn)) // // Text Color page up // GOBCHUNK("Text Color page up", kidTextColorPageUp, kgokkNormal) DEFAULT_POSITION(kxpTextColorPageUp, kypTextColorPageUp, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, chidNil, cidNil, kttGenericPageBack) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault ), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault ), "studio\bmp\d8up.bmp", kxpregTextColorPageUp, kypregTextColorPageUp) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\d8ups.bmp", kxpregTextColorPageUp, kypregTextColorPageUp) REP_RECT(CHID(kstBrowserDisabled, krepDefault ), "hidden", 0, 0, 0, 0) ADOPT_WAVE(kcnoPageUpWav, CHID(kstBrowserEnabled, krepClicked)) ADOPT_ANIM(kidPressPageBack, CHID(kstBrowserEnabled, krepMouseDnOn)) // // // Text BkgdColor Popdown // // // // Parent // GOBCHUNK("Text BkgdColor Popdown", kidTextBkgdColor, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ENDCHUNK REP_RECT(CHID(kstDefault, krepDefault), "Sizer", kxpTextBkgdColorLeft, kypTextBkgdColorTop, kxpTextBkgdColorRight, kypTextBkgdColorBottom ) CREATE_SCRIPT("Text BkgdColor parent") CreateChildThis(kidTextBkgdColorBackground, kidTextBkgdColorBackground); ENDCHUNK // // Background // GOBCHUNK("Text BkgdColor Popdown", kidTextBkgdColorBackground, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_MBMP(CHID(kstDefault, krepDefault), "studio\bmp\d9par.bmp") ADOPT_WAVE(kcnoDropDnWav, CHID(kstDefault, krepEnterAnimation)) CREATE_SCRIPT("Text BkgdColor created") CreateChildThis(kidTextBkgdColorPageDown, kidTextBkgdColorPageDown); ChangeStateGob(kidTextBkgdColorPageDown, kstBrowserEnabled); CreateChildThis(kidTextBkgdColorPageUp, kidTextBkgdColorPageUp); ChangeStateGob(kidTextBkgdColorPageUp, kstBrowserEnabled); yp = kdypTextBkgdColorTop; nFrame = 0; While(yp <= (kdypTextBkgdColor - kdypTextBkgdColorFrame - kdypTextBkgdColorBottom)); xp = kdxpTextBkgdColorLeft; While(xp <= (kdxpTextBkgdColor - kdxpTextBkgdColorRight - kdxpTextBkgdColorFrame)); // // create and position frames // CreateChildThis(kidTextBkgdColorFrame + nFrame, kidTextBkgdColorFrame); MoveAbsGob(kidTextBkgdColorFrame + nFrame, xp, yp); nFrame++; xp += kdxpTextBkgdColorSpacing + kdxpTextBkgdColorFrame; End; yp += kdypTextBkgdColorSpacing + kdypTextBkgdColorFrame; End; // // This shuts when a mouse down occurs. // FilterCmdsThis(cidMouseDown, cidNil, kchidScript1); FilterCmdsThis(cidKey, cidNil, kchidScript2); ENDCHUNK CHILD_SCRIPT("Text BkgdColor, track mouse", kchidScript1) kid = _parm[0]; If(kid == kidTextsBkgdColor); Return(fTrue); End; If(((kid >= kidTextBkgdColorFrame) && (kid < kidTextBkgdColorFrameLim)) || (kid == kidTextBkgdColorPageDown) || (kid == kidTextBkgdColorPageUp)); Return(fFalse); End; If (kid == kidTextsBkgdColor); Return(fTrue); End; // // Tell the parent to cancel the popup and pass the click thru. // ASSERT(FGobExists(kidTextBkgdColor)); EnqueueCid(cidBrowserCancel, kidTextBkgdColor, 0, 0, 0, 0); ChangeStateGob(kidTextsBkgdColor, kstDefault); Return(fFalse); ENDCHUNK CHILD_SCRIPT("Text BkgdColor, disable keys", kchidScript2) Return(fTrue); ENDCHUNK // // Text BkgdColor frame // GOBCHUNK("Text BkgdColor Frame", kidTextBkgdColorFrame, kgokkRectNoKids) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, cnoNil) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault), "studio\bmp\d9frm.bmp", kxpregTextBkgdColorFrame, kypregTextBkgdColorFrame) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\d9frmh.bmp", kxpregTextBkgdColorFrame, kypregTextBkgdColorFrame) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserSelected, krepDefault)) REP_RECT(CHID(kstBrowserDisabled, krepDefault), "hidden", 0, 0, 0, 0) ADOPT_WAVE(kcnoSecToolWav, CHID(kstBrowserEnabled, krepClicked)) CLICK_SCRIPT("Frame clicked") If(kidBackground->idtbxDown != kidTextsBkgdColor); ChangeStateGob(kidBackground->idtbxDown, kstDefault); kidBackground->idtbxDown = kidTextsBkgdColor; kidBackground->chttTbox = chttTboxSelect; End; EnqueueCid(cidBrowserSelect, kidTextBkgdColor, GidThis(), 0, 0, 0); EnqueueCid(cidBrowserOk, kidTextBkgdColor, 0, 0, 0, 0); ENDCHUNK // // Text BkgdColor page down // GOBCHUNK("Text BkgdColor page down", kidTextBkgdColorPageDown, kgokkNormal) DEFAULT_POSITION(kxpTextBkgdColorPageDown, kypTextBkgdColorPageDown, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, chidNil, cidNil, kttGenericPageFwd) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault ), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault ), "studio\bmp\d9dn.bmp", kxpregTextBkgdColorPageDown, kypregTextBkgdColorPageDown) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\d9dns.bmp", kxpregTextBkgdColorPageDown, kypregTextBkgdColorPageDown) REP_RECT(CHID(kstBrowserDisabled, krepDefault ), "hidden", 0, 0, 0, 0) ADOPT_WAVE(kcnoPageDnWav, CHID(kstBrowserEnabled, krepClicked)) ADOPT_ANIM(kidPressPageFwd, CHID(kstBrowserEnabled, krepMouseDnOn)) // // Text BkgdColor page up // GOBCHUNK("Text BkgdColor page up", kidTextBkgdColorPageUp, kgokkNormal) DEFAULT_POSITION(kxpTextBkgdColorPageUp, kypTextBkgdColorPageUp, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, chidNil, cidNil, kttGenericPageBack) ENDCHUNK REP_RECT(CHID(kstBrowserInvisible, krepDefault ), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstBrowserEnabled, krepDefault ), "studio\bmp\d9up.bmp", kxpregTextBkgdColorPageUp, kypregTextBkgdColorPageUp) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstBrowserEnabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstBrowserEnabled, krepMouseDnOn), "studio\bmp\d9ups.bmp", kxpregTextBkgdColorPageUp, kypregTextBkgdColorPageUp) REP_RECT(CHID(kstBrowserDisabled, krepDefault ), "hidden", 0, 0, 0, 0) ADOPT_WAVE(kcnoPageUpWav, CHID(kstBrowserEnabled, krepClicked)) ADOPT_ANIM(kidPressPageBack, CHID(kstBrowserEnabled, krepMouseDnOn)) ================================================ FILE: src/studio/popup.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** popup.cpp: Popup menu classes Primary Author: ****** MPFNT: ****** Review Status: REVIEWED - any changes to this file must be reviewed! ***************************************************************************/ #include "studio.h" ASSERTNAME RTCLASS(MP) RTCLASS(MPFNT) BEGIN_CMD_MAP(MP, BRWD) ON_CID_GEN(cidSelIdle, &MP::FCmdSelIdle, pvNil) END_CMD_MAP_NIL() /*************************************************************************** Create a new popup menu ***************************************************************************/ PMP MP::PmpNew(long kidParent, long kidMenu, PRCA prca, PCMD pcmd, BWS bws, long ithumSelect, long sidSelect, CKI ckiRoot, CTG ctg, PCMH pcmh, long cid, bool fMoveTop) { AssertPo(prca, 0); AssertVarMem(pcmd); AssertPo(pcmh, 0); PMP pmp; GCB gcb; PSTDIO pstdio; long cthum; long cfrm; pstdio = vpapp->Pstdio(); if (pvNil == pstdio) { Bug("pstdio is nil"); return pvNil; } if (!_FBuildGcb(&gcb, kidParent, kidMenu)) return pvNil; pmp = NewObj MP(&gcb); if (pvNil == pmp) goto LFail; if (!pmp->_FInitGok(prca, kidMenu)) goto LFail; if (!pmp->FInit(pcmd, bws, ithumSelect, sidSelect, ckiRoot, ctg, pstdio, pvNil, fFalse, 1)) { goto LFail; } // // Add ourselves as a CMH with a high priority so that we can // filter out SelIdle messages // if (!vpcex->FAddCmh(pmp, -1000)) { goto LFail; } if (!pmp->FDraw()) goto LFail; pmp->_cid = cid; pmp->_pcmh = pcmh; // Need to adjust the size if cthum <= cfrm // New height should be dypTop + cthum * dypFrm + dypTop cthum = pmp->_Cthum(); cfrm = pmp->_cfrm; if (cthum <= cfrm) { PGOB pgob; long dypFrm; long dypTop; RC rc; RC rcAbs; RC rcRel; pgob = vpapp->Pkwa()->PgobFromHid(pmp->_kidFrmFirst); AssertPo(pgob, 0); pgob->GetRc(&rc, cooParent); dypFrm = rc.Dyp(); dypTop = rc.ypTop; pmp->GetPos(&rcAbs, &rcRel); if (fMoveTop) rcAbs.ypTop = rcAbs.ypBottom - (dypTop + LwMul(cthum, dypFrm) + dypTop); else rcAbs.ypBottom = rcAbs.ypTop + (dypTop + LwMul(cthum, dypFrm) + dypTop); pmp->SetPos(&rcAbs, &rcRel); } AssertPo(pmp, 0); return pmp; LFail: ReleasePpo(&pmp); return pvNil; } /*************************************************************************** Enqueue a cid saying what was selected ***************************************************************************/ void MP::_ApplySelection(long ithumSelect, long sid) { AssertThis(0); if (_ckiRoot.ctg == kctgTyth) { THD thd; _pglthd->Get(ithumSelect, &thd); vpcex->EnqueueCid(_cid, _pcmh, pvNil, thd.grfontMask, thd.grfont); return; } vpcex->EnqueueCid(_cid, _pcmh, pvNil, ithumSelect, sid); } /****************************************************************************** _IthumFromThum Override the default BWRL routine so that we can map a font bitfield to the proper ithum. Arguments: long thumSelect long sidSelect Returns: Keywords: ************************************************************ PETED ***********/ long MP::_IthumFromThum(long thumSelect, long sidSelect) { AssertBaseThis(0); long ithum; if (_ckiRoot.ctg == kctgTyth) { THD thd; ithum = _pglthd->IvMac(); while (ithum-- > 0) { _pglthd->Get(ithum, &thd); if (thd.grfont == (thumSelect & thd.grfontMask)) break; } Assert(ithum >= 0 || ithum == ivNil, "Returning invalid ithum"); } else ithum = MP_PAR::_IthumFromThum(thumSelect, sidSelect); return ithum; } /*************************************************************************** Do selection idle processing. Make sure not to change any selection states. ***************************************************************************/ bool MP::FCmdSelIdle(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); MP_PAR::FCmdSelIdle(pcmd); return fTrue; } #ifdef DEBUG /*************************************************************************** Assert the validity of the MP. ***************************************************************************/ void MP::AssertValid(ulong grf) { MP_PAR::AssertValid(fobjAllocated); AssertBasePo(_pcmh, 0); } /*************************************************************************** Mark memory used by the MP ***************************************************************************/ void MP::MarkMem(void) { AssertThis(0); MP_PAR::MarkMem(); MarkMemObj(_pcmh); } #endif // DEBUG // // // // MPFNT (font menu) stuff begins here // // // BEGIN_CMD_MAP(MPFNT, BRWD) ON_CID_GEN(cidSelIdle, &MPFNT::FCmdSelIdle, pvNil) END_CMD_MAP_NIL() /*************************************************************************** Create a new font menu ***************************************************************************/ PMPFNT MPFNT::PmpfntNew(PRCA prca, long kidParent, long kidMenu, PCMD pcmd, long ithumSelect, PGST pgst) { AssertPo(prca, 0); AssertVarMem(pcmd); AssertPo(pgst, 0); PMPFNT pmpfnt; GCB gcb; PSTDIO pstdio = vpapp->Pstdio(); if (pstdio == pvNil) { Bug("pstdio is nil"); return pvNil; } if (pgst->CbExtra() != size(long)) { Bug("GST CbExtra isn't the right size for an onn"); return pvNil; } if (!_FBuildGcb(&gcb, kidParent, kidMenu)) return pvNil; pmpfnt = NewObj MPFNT(&gcb); if (pmpfnt == pvNil) return pvNil; pmpfnt->_pgst = pgst; pmpfnt->_pgst->AddRef(); if (!pmpfnt->_FInitGok(prca, kidMenu)) goto LFail; if (!pmpfnt->FInit(pcmd, ithumSelect, ithumSelect, pstdio, fFalse, 1)) goto LFail; // // Add ourselves as a CMH with a high priority so that we can // filter out SelIdle messages // if (!vpcex->FAddCmh(pmpfnt, -1000)) { goto LFail; } if (!pmpfnt->FDraw()) goto LFail; pmpfnt->_AdjustRc(pmpfnt->_Cthum(), pmpfnt->_cfrm); AssertPo(pmpfnt, 0); return pmpfnt; LFail: ReleasePpo(&pmpfnt); return pvNil; } /*************************************************************************** Set the font of the TGOB to the font listed in the menu item ***************************************************************************/ bool MPFNT::_FSetThumFrame(long istn, PGOB pgobPar) { if (MPFNT_PAR::_FSetThumFrame(istn, pgobPar)) { PTGOB ptgob = (PTGOB)pgobPar->PgobFirstChild(); long onn; /* By the time we get this far, MPFNT_PAR should have already checked these */ Assert(ptgob != pvNil, "No TGOB for the text"); Assert(ptgob->FIs(kclsTGOB), "GOB isn't a TGOB"); _pgst->GetExtra(istn, &onn); ptgob->SetFont(onn); ptgob->SetAlign(tahLeft, tavCenter); return fTrue; } return fFalse; } /*************************************************************************** Tell the studio that the font was selected ***************************************************************************/ void MPFNT::_ApplySelection(long ithumSelect, long sid) { AssertThis(0); long onn; _pgst->GetExtra(ithumSelect, &onn); vpcex->EnqueueCid(cidTextSetFont, _pstdio, pvNil, onn); } /*************************************************************************** Hide the scroll arrows if necessary ***************************************************************************/ void MPFNT::_AdjustRc(long cthum, long cfrm) { PGOB pgob; long dypFrm; long dypTop; RC rc; RC rcAbs; RC rcRel; /* Still need to adjust if cthum == cfrm to hide scroll arrows */ if (cthum > cfrm) return; /* For the font popup, the GOBs that are interesting for adjusting the entire browser are actually the parents of the thumbnail frames */ pgob = vapp.Pkwa()->PgobFromHid(_kidFrmFirst); AssertPo(pgob, 0); pgob = pgob->PgobPar(); AssertPo(pgob, 0); pgob->GetRc(&rc, cooParent); dypFrm = rc.Dyp(); dypTop = rc.ypTop; GetPos(&rcAbs, &rcRel); rcAbs.ypBottom = rcAbs.ypTop + (dypTop + LwMul(cthum, dypFrm) + dypTop); SetPos(&rcAbs, &rcRel); } /*************************************************************************** Do selection idle processing. Make sure not to change any selection states. ***************************************************************************/ bool MPFNT::FCmdSelIdle(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); MPFNT_PAR::FCmdSelIdle(pcmd); return fTrue; } #ifdef DEBUG /*************************************************************************** Assert the validity of the MPFNT. ***************************************************************************/ void MPFNT::AssertValid(ulong grf) { MPFNT_PAR::AssertValid(0); } /*************************************************************************** Mark memory used by the MPFNT ***************************************************************************/ void MPFNT::MarkMem(void) { AssertThis(0); MPFNT_PAR::MarkMem(); } #endif // DEBUG ================================================ FILE: src/studio/popups.cht ================================================ /*****************************************************************************\ * * popups.cht * * All popups that appear in the studio * * Author: Sean Selitrennikoff * * Status: REVIEWED * \*****************************************************************************/ // // // Portfolio Popup // // // // Background // GOBCHUNK("Portfolio Popup", kidPortsBackground, kgokkRectHit) DEFAULT_POSITION(0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_RECT(CHID(kstDefault, krepDefault), "hidden", 0, 0, 0, 0) REP_RECT(CHID(kstClosed, krepDefault), "hidden", 0, 0, 0, 0) REP_RECT(CHID(kstOpen, krepDefault), "open", kxpPortsBackgroundLeft, kypPortsBackgroundTop, kxpPortsBackgroundRight, kypPortsBackgroundBottom ) ADOPT_WAVE(kcnoDropDnWav, CHID(kstOpen, krepEnterAnimation)) CREATE_SCRIPT("Portfolio") CreateChildThis(kidPortsPortfolio, kidPortsPortfolio); CreateChildThis(kidPortsNew, kidPortsNew); CreateChildThis(kidPortsSave, kidPortsSave); CreateChildThis(kidPortsSaveAs, kidPortsSaveAs); ENDCHUNK CREATE_ANIMST("Portfolio", kstOpen) FilterCmdsThis(cidMouseDown, hidNil, kchidClick); FilterCmdsThis(cidKey, hidNil, kchidScript2); FilterCmdsThis(cidSelIdle, hidNil, kchidScript2); ChangeStateGob(kidPortfolio, kstSelected); DISABLEACCEL(fFalse); ENDCHUNK CREATE_ANIMST("Portfolio", kstClosed) FilterCmdsThis(cidMouseDown, hidNil, chidNil); FilterCmdsThis(cidKey, hidNil, chidNil); FilterCmdsThis(cidSelIdle, hidNil, chidNil); ChangeStateGob(kidPortfolio, kstDefault); ENABLEACCEL(fFalse); ENDCHUNK CHILD_SCRIPT("Portfolio, track mouse", kchidClick) kid = _parm[0]; // // Pass clicks to the portfolio button // If(kid == kidPortfolio); Return(fFalse); End; If((kid != kidPortsPortfolio) && (kid != kidPortsNew) && (kid != kidPortsSave) && (kid != kidPortsSaveAs) && (kid != kidPortsBackground)); // // Hide this pop-up and pass click through // ChangeStateThis(kstClosed); End; // // Pass clicks thru. // Return(fFalse); ENDCHUNK CHILD_SCRIPT("Portfolio, disable", kchidScript2) Return(fTrue); ENDCHUNK // // File Open // GOBCHUNK("Portfolio Popup - Portfolio", kidPortsPortfolio, kgokkRectHit) DEFAULT_POSITION(kxpPortsPortfolio, kypPortsPortfolio, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttPortsPortfolio) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\p1open.bmp", kxpregPortsPortfolio, kypregPortsPortfolio) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\p1openc.bmp", kxpregPortsPortfolio, kypregPortsPortfolio) ADOPT_WAVE(kcnoPFOpenWav, CHID(kstDefault, krepClicked)) CHILD_SCRIPT("Portfolio Popup - Portfolio", CHID(kstDefault, kchidClick)) ChangeStateGob(kidPortsBackground, kstClosed); // We could enqueue the cidPortfolioOpen here, as we do in other places // for displaying the portfolio. However, since code exists to handle // the ctrl-o accelerator, just use that. EnqueueCid(cidOpen, 0, 0, 0, 0, 0); ENDCHUNK // // File New // GOBCHUNK("New Popup - New", kidPortsNew, kgokkRectHit) DEFAULT_POSITION(kxpPortsNew, kypPortsNew, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttPortsNew) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\p1new.bmp", kxpregPortsNew, kypregPortsNew) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\p1news.bmp", kxpregPortsNew, kypregPortsNew) ADOPT_WAVE(kcnoFNewWav, CHID(kstDefault, krepClicked)) CHILD_SCRIPT("Portfolio Popup - New", CHID(kstDefault, kchidClick)) ChangeStateGob(kidPortsBackground, kstClosed); EnqueueCid(cidNew, khidStudio, 0, 0, 0, 0); ENDCHUNK // // File Save // GOBCHUNK("Save Popup - Save", kidPortsSave, kgokkRectHit) DEFAULT_POSITION(kxpPortsSave, kypPortsSave, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttPortsSave) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\p1save.bmp", kxpregPortsSave, kypregPortsSave) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\p1saves.bmp", kxpregPortsSave, kypregPortsSave) ADOPT_WAVE(kcnoFSaveWav, CHID(kstDefault, krepClicked)) CHILD_SCRIPT("Portfolio Popup - Save", CHID(kstDefault, kchidClick)) ChangeStateGob(kidPortsBackground, kstClosed); EnqueueCid(cidSave, 0, 0, 0, 0, 0); ENDCHUNK // // File Save As // GOBCHUNK("Save As Popup - Save As", kidPortsSaveAs, kgokkRectHit) DEFAULT_POSITION(kxpPortsSaveAs, kypPortsSaveAs, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttPortsSaveAs) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\p1svas.bmp", kxpregPortsSaveAs, kypregPortsSaveAs) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\p1svass.bmp", kxpregPortsSaveAs, kypregPortsSaveAs) ADOPT_WAVE(kcnoFSaveAsWav, CHID(kstDefault, krepClicked)) CHILD_SCRIPT("Portfolio Popup - Save As", CHID(kstDefault, kchidClick)) ChangeStateGob(kidPortsBackground, kstClosed); EnqueueCid(cidSaveAs, 0, 0, 0, 0, 0); ENDCHUNK // // // Cut, Copy, Paste popup // // // // Background // GOBCHUNK("CCP Popup", kidCCPBackground, kgokkRectHit) DEFAULT_POSITION(0,0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_RECT(CHID(kstDefault, krepDefault), "hidden", 0, 0, 0, 0) REP_RECT(CHID(kstClosed, krepDefault), "hidden", 0, 0, 0, 0) REP_RECT(CHID(kstOpen, krepDefault), "open", kxpCCPBackgroundLeft, kypCCPBackgroundTop, kxpCCPBackgroundRight, kypCCPBackgroundBottom) ADOPT_WAVE(kcnoDropDnWav, CHID(kstOpen, krepEnterAnimation)) CREATE_SCRIPT("CCP") CreateChildThis(kidCCPActorNuke, kidCCPActorNuke); CreateChildThis(kidCCPCopyRoute, kidCCPCopyRoute); CreateChildThis(kidCCPPaste, kidCCPPaste); CreateChildThis(kidCCPCopy, kidCCPCopy); CreateChildThis(kidCCPCut, kidCCPCut); ENDCHUNK CREATE_ANIMST("CCP", kstOpen) FilterCmdsThis(cidMouseDown, hidNil, kchidClick); FilterCmdsThis(cidKey, hidNil, kchidScript2); FilterCmdsThis(cidSelIdle, hidNil, kchidScript2); ChangeStateGob(kidCutCopyPaste, kstSelected); DISABLEACCEL(fFalse); ENDCHUNK CREATE_ANIMST("CCP", kstClosed) If(kidCutCopyPaste->idDown == kidStudio); ChangeStateGob(kidCutCopyPaste, kstDefault); End; FilterCmdsThis(cidMouseDown, hidNil, chidNil); FilterCmdsThis(cidKey, hidNil, chidNil); FilterCmdsThis(cidSelIdle, hidNil, chidNil); ENABLEACCEL(fFalse); ENDCHUNK CHILD_SCRIPT("CCP, track mouse", kchidClick) kid = _parm[0]; If(kid == kidCutCopyPaste); Return(fTrue); End; If((kid != kidCCPActorNuke) && (kid != kidCCPCopyRoute) && (kid != kidCCPPaste) && (kid != kidCCPCopy) && (kid != kidCCPCut) && (kid != kidCCPBackground)); // // Hide this pop-up and pass click through // ChangeStateThis(kstClosed); End; // // Pass clicks thru. // Return(fFalse); ENDCHUNK CHILD_SCRIPT("CCP, disable", kchidScript2) Return(fTrue); ENDCHUNK CHILD_SCRIPT("CCP, Pops out nuker", kchidScript3) If (StateGob(kidCCPActorNuke) == kst2); ChangeStateGob(kidCutCopyPaste->idDown, kst1); Elif (StateGob(kidCCPActorNuke) == kst4); ChangeStateGob(kidCutCopyPaste->idDown, kst3); Elif (StateGob(kidCCPActorNuke) == kst6); ChangeStateGob(kidCutCopyPaste->idDown, kst5); Elif (StateGob(kidCCPActorNuke) == kst8); ChangeStateGob(kidCutCopyPaste->idDown, kst7); End; ENDCHUNK // // Nuke a scene, actor, scene, or tbox // GOBCHUNK("CCP Popup - Scene nuke actor", kidCCPActorNuke, kgokkRectHit) DEFAULT_POSITION(kxpCCPActorNuke, kypCCPActorNuke, 100) ACTION(fcustNil, fcustNil, fgrfst1, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttCCPSceneNuke) ACTION(fcustNil, fcustNil, fgrfst2, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttCCPSceneNuke) ACTION(fcustNil, fcustNil, fgrfst3, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttCCPActorNuke) ACTION(fcustNil, fcustNil, fgrfst4, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttCCPActorNuke) ACTION(fcustNil, fcustNil, fgrfst5, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttRemoveSound) ACTION(fcustNil, fcustNil, fgrfst6, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttRemoveSound) ACTION(fcustNil, fcustNil, fgrfst7, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttCCPTboxNuke) ACTION(fcustNil, fcustNil, fgrfst8, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttCCPTboxNuke) ENDCHUNK REP_MBMPREG(CHID(kst1, krepDefault), "studio\bmp\p3rmsn.bmp", kxpregCCPActorNuke, kypregCCPActorNuke) ADOPT_MBMP(LAST_MBMP, CHID(kst1, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kst1, krepMouseDnOff)) REP_MBMPREG(CHID(kst1, krepMouseDnOn), "studio\bmp\p3rmsnc.bmp", kxpregCCPActorNuke, kypregCCPActorNuke) ADOPT_MBMP(LAST_MBMP, CHID(kst2, krepDefault)) REP_MBMPREG(CHID(kst3, krepDefault), "studio\bmp\p3rmac.bmp", kxpregCCPActorNuke, kypregCCPActorNuke) ADOPT_MBMP(LAST_MBMP, CHID(kst3, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kst3, krepMouseDnOff)) REP_MBMPREG(CHID(kst3, krepMouseDnOn), "studio\bmp\p3rmacc.bmp", kxpregCCPActorNuke, kypregCCPActorNuke) ADOPT_MBMP(LAST_MBMP, CHID(kst4, krepDefault)) REP_MBMPREG(CHID(kst5, krepDefault), "studio\bmp\p3rmsd.bmp", kxpregCCPActorNuke, kypregCCPActorNuke) ADOPT_MBMP(LAST_MBMP, CHID(kst5, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kst5, krepMouseDnOff)) REP_MBMPREG(CHID(kst5, krepMouseDnOn), "studio\bmp\p3rmsdc.bmp", kxpregCCPActorNuke, kypregCCPActorNuke) ADOPT_MBMP(LAST_MBMP, CHID(kst6, krepDefault)) REP_MBMPREG(CHID(kst7, krepDefault), "studio\bmp\p3rmtb.bmp", kxpregCCPActorNuke, kypregCCPActorNuke) ADOPT_MBMP(LAST_MBMP, CHID(kst7, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kst7, krepMouseDnOff)) REP_MBMPREG(CHID(kst7, krepMouseDnOn), "studio\bmp\p3rmtbc.bmp", kxpregCCPActorNuke, kypregCCPActorNuke) ADOPT_MBMP(LAST_MBMP, CHID(kst8, krepDefault)) ADOPT_WAVE(kcnoSecToolWav, CHID(kst1, krepClicked)) ADOPT_WAVE(kcnoSecToolWav, CHID(kst2, krepClicked)) ADOPT_WAVE(kcnoSecToolWav, CHID(kst3, krepClicked)) ADOPT_WAVE(kcnoSecToolWav, CHID(kst4, krepClicked)) ADOPT_WAVE(kcnoSecToolWav, CHID(kst5, krepClicked)) ADOPT_WAVE(kcnoSecToolWav, CHID(kst6, krepClicked)) ADOPT_WAVE(kcnoSecToolWav, CHID(kst7, krepClicked)) ADOPT_WAVE(kcnoSecToolWav, CHID(kst8, krepClicked)) CHILD_SCRIPT("CCP Popup - Mouse", CHID(kstDefault, kchidClick)) If (kidBackground->idactDown != kidCutCopyPaste); ChangeStateGob(kidBackground->idactDown, kstDefault); kidBackground->chttActor = chttNone; kidBackground->idactDown = kidCutCopyPaste; End; If (kidBackground->idtbxDown != kidCutCopyPaste); ChangeStateGob(kidBackground->idtbxDown, kstDefault); kidBackground->idtbxDown = kidCutCopyPaste; kidBackground->chttTbox = chttNone; End; If (kidBackground->idsndDown != kidCutCopyPaste); ChangeStateGob(kidBackground->idsndDown, kstDefault); kidBackground->idsndDown = kidCutCopyPaste; End; If (kidBackground->idscnDown != kidCutCopyPaste); ChangeStateGob(kidBackground->idscnDown, kstDefault); kidBackground->idscnDown = kidCutCopyPaste; End; If (StateThis() == kst1); ChangeStateThis(kst2); EnqueueCid(cidSetTool, khidStudio, chttSceneNuke, 0, 0, 0); Elif (StateThis() == kst3); ChangeStateThis(kst4); EnqueueCid(cidSetTool, khidStudio, chttActorNuke, 0, 0, 0); Elif (StateThis() == kst5); ChangeStateThis(kst6); EnqueueCid(cidSetTool, khidStudio, chttListener, 0, 0, 0); Elif (StateThis() == kst7); ChangeStateThis(kst8); EnqueueCid(cidSetTool, khidStudio, chttActorNuke, 0, 0, 0); End; If (FGobExists(kidCutCopyPaste->idDown) && (kidCutCopyPaste->idDown != GidThis()) && (kidCutCopyPaste->idDown != kidStudio)); ChangeStateGob(kidCutCopyPaste->idDown, kstDefault); End; kidCutCopyPaste->idDown = GidThis(); ChangeStateGob(kidCCPBackground, kstClosed); ENDCHUNK // // Copy a route // GOBCHUNK("CCP Popup - Copy route", kidCCPCopyRoute, kgokkRectHit) DEFAULT_POSITION(kxpCCPCopyRoute, kypCCPCopyRoute, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttCCPCopyRoute) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\p3cppt.bmp", kxpregCCPCopyRoute, kypregCCPCopyRoute) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\p3cpptc.bmp", kxpregCCPCopyRoute, kypregCCPCopyRoute) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)); ADOPT_WAVE(kcnoSecToolWav, CHID(kstDefault, krepClicked)) ADOPT_WAVE(kcnoSecToolWav, CHID(kstSelected, krepClicked)) CHILD_SCRIPT("CCP Popup - Mouse", CHID(kstDefault, kchidClick)) If (kidBackground->idactDown != kidCutCopyPaste); ChangeStateGob(kidBackground->idactDown, kstDefault); kidBackground->chttActor = chttNone; kidBackground->idactDown = kidCutCopyPaste; End; If (kidBackground->idtbxDown != kidCutCopyPaste); ChangeStateGob(kidBackground->idtbxDown, kstDefault); kidBackground->idtbxDown = kidCutCopyPaste; kidBackground->chttTbox = chttNone; End; If (kidBackground->idsndDown != kidCutCopyPaste); ChangeStateGob(kidBackground->idsndDown, kstDefault); kidBackground->idsndDown = kidCutCopyPaste; End; If (kidBackground->idscnDown != kidCutCopyPaste); ChangeStateGob(kidBackground->idscnDown, kstDefault); kidBackground->idscnDown = kidCutCopyPaste; End; ChangeStateThis(kstSelected); If (FGobExists(kidCutCopyPaste->idDown) && (kidCutCopyPaste->idDown != GidThis()) && (kidCutCopyPaste->idDown != kidStudio)); If (kidCutCopyPaste->idDown == kidCCPActorNuke); RunScriptGob(kidCCPBackground, kchidScript3); Else; ChangeStateGob(kidCutCopyPaste->idDown, kstDefault); End; End; kidCutCopyPaste->idDown = GidThis(); ChangeStateGob(kidCCPBackground, kstClosed); // // Do not use SetTool, because the DDG for the movie gets this command // directly. // EnqueueCid(cidCopyRoute, 0, 0, 0, 0, 0); ENDCHUNK // // Paste // GOBCHUNK("CCP Popup - Paste", kidCCPPaste, kgokkRectHit) DEFAULT_POSITION(kxpCCPPaste, kypCCPPaste, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttCCPPaste) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\p3past.bmp", kxpregCCPPaste, kypregCCPPaste) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\p3pastc.bmp", kxpregCCPPaste, kypregCCPPaste) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)); ADOPT_WAVE(kcnoSecToolWav, CHID(kstDefault, krepClicked)) ADOPT_WAVE(kcnoSecToolWav, CHID(kstSelected, krepClicked)) CHILD_SCRIPT("CCP Popup - Mouse", CHID(kstDefault, kchidClick)) If (kidBackground->idactDown != kidCutCopyPaste); ChangeStateGob(kidBackground->idactDown, kstDefault); kidBackground->chttActor = chttNone; kidBackground->idactDown = kidCutCopyPaste; End; If (kidBackground->idtbxDown != kidCutCopyPaste); ChangeStateGob(kidBackground->idtbxDown, kstDefault); kidBackground->idtbxDown = kidCutCopyPaste; kidBackground->chttTbox = chttNone; End; If (kidBackground->idsndDown != kidCutCopyPaste); ChangeStateGob(kidBackground->idsndDown, kstDefault); kidBackground->idsndDown = kidCutCopyPaste; End; If (kidBackground->idscnDown != kidCutCopyPaste); ChangeStateGob(kidBackground->idscnDown, kstDefault); kidBackground->idscnDown = kidCutCopyPaste; End; ChangeStateThis(kstSelected); If (FGobExists(kidCutCopyPaste->idDown) && (kidCutCopyPaste->idDown != GidThis()) && (kidCutCopyPaste->idDown != kidStudio)); If (kidCutCopyPaste->idDown == kidCCPActorNuke); RunScriptGob(kidCCPBackground, kchidScript3); Else; ChangeStateGob(kidCutCopyPaste->idDown, kstDefault); End; End; kidCutCopyPaste->idDown = GidThis(); ChangeStateGob(kidCCPBackground, kstClosed); // // Do not use SetTool, because the DDG for the movie gets this command // directly. // EnqueueCid(cidPasteTool, 0, 0, 0, 0, 0); ENDCHUNK // // Copy // GOBCHUNK("CCP Popup - Copy", kidCCPCopy, kgokkRectHit) DEFAULT_POSITION(kxpCCPCopy, kypCCPCopy, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttCCPCopy) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\p3copy.bmp", kxpregCCPCopy, kypregCCPCopy) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\p3copyc.bmp", kxpregCCPCopy, kypregCCPCopy) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)); ADOPT_WAVE(kcnoSecToolWav, CHID(kstDefault, krepClicked)) ADOPT_WAVE(kcnoSecToolWav, CHID(kstSelected, krepClicked)) CHILD_SCRIPT("CCP Popup - Mouse", CHID(kstDefault, kchidClick)) If (kidBackground->idactDown != kidCutCopyPaste); ChangeStateGob(kidBackground->idactDown, kstDefault); kidBackground->chttActor = chttNone; kidBackground->idactDown = kidCutCopyPaste; End; If (kidBackground->idtbxDown != kidCutCopyPaste); ChangeStateGob(kidBackground->idtbxDown, kstDefault); kidBackground->idtbxDown = kidCutCopyPaste; kidBackground->chttTbox = chttNone; End; If (kidBackground->idsndDown != kidCutCopyPaste); ChangeStateGob(kidBackground->idsndDown, kstDefault); kidBackground->idsndDown = kidCutCopyPaste; End; If (kidBackground->idscnDown != kidCutCopyPaste); ChangeStateGob(kidBackground->idscnDown, kstDefault); kidBackground->idscnDown = kidCutCopyPaste; End; ChangeStateThis(kstSelected); If (FGobExists(kidCutCopyPaste->idDown) && (kidCutCopyPaste->idDown != GidThis()) && (kidCutCopyPaste->idDown != kidStudio)); If (kidCutCopyPaste->idDown == kidCCPActorNuke); RunScriptGob(kidCCPBackground, kchidScript3); Else; ChangeStateGob(kidCutCopyPaste->idDown, kstDefault); End; End; kidCutCopyPaste->idDown = GidThis(); ChangeStateGob(kidCCPBackground, kstClosed); // // Do not use SetTool, because the DDG for the movie gets this command // directly. // EnqueueCid(cidCopyTool, 0, 0, 0, 0, 0); ENDCHUNK // // Cut // GOBCHUNK("CCP Popup - Cut", kidCCPCut, kgokkRectHit) DEFAULT_POSITION(kxpCCPCut, kypCCPCut, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttCCPCut) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\p3cut.bmp", kxpregCCPCut, kypregCCPCut) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\p3cutc.bmp", kxpregCCPCut, kypregCCPCut) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)); ADOPT_WAVE(kcnoSecToolWav, CHID(kstDefault, krepClicked)) ADOPT_WAVE(kcnoSecToolWav, CHID(kstSelected, krepClicked)) CHILD_SCRIPT("CCP Popup - Mouse", CHID(kstDefault, kchidClick)) If (kidBackground->idactDown != kidCutCopyPaste); ChangeStateGob(kidBackground->idactDown, kstDefault); kidBackground->chttActor = chttNone; kidBackground->idactDown = kidCutCopyPaste; End; If (kidBackground->idtbxDown != kidCutCopyPaste); ChangeStateGob(kidBackground->idtbxDown, kstDefault); kidBackground->idtbxDown = kidCutCopyPaste; kidBackground->chttTbox = chttNone; End; If (kidBackground->idsndDown != kidCutCopyPaste); ChangeStateGob(kidBackground->idsndDown, kstDefault); kidBackground->idsndDown = kidCutCopyPaste; End; If (kidBackground->idscnDown != kidCutCopyPaste); ChangeStateGob(kidBackground->idscnDown, kstDefault); kidBackground->idscnDown = kidCutCopyPaste; End; ChangeStateThis(kstSelected); If (FGobExists(kidCutCopyPaste->idDown) && (kidCutCopyPaste->idDown != GidThis()) && (kidCutCopyPaste->idDown != kidStudio)); If (kidCutCopyPaste->idDown == kidCCPActorNuke); RunScriptGob(kidCCPBackground, kchidScript3); Else; ChangeStateGob(kidCutCopyPaste->idDown, kstDefault); End; End; kidCutCopyPaste->idDown = GidThis(); ChangeStateGob(kidCCPBackground, kstClosed); // // Do not use SetTool, because the DDG for the movie gets this command // directly. // EnqueueCid(cidCutTool, 0, 0, 0, 0, 0); ENDCHUNK // // // Actor rotate popup // // // // Background // GOBCHUNK("Rotate Popup", kidRotateBackground, kgokkRectHit) DEFAULT_POSITION(kxpRotateBackground, kypRotateBackground, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_RECT(CHID(kstDefault, krepDefault), "hidden", 0, 0, 0, 0) REP_RECT(CHID(kstClosed, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstOpen, krepDefault), "studio\bmp\p5par.bmp", kxpregRotateBackground, kypregRotateBackground) ADOPT_WAVE(kcnoDropDnWav, CHID(kstOpen, krepEnterAnimation)) CREATE_SCRIPT("Rotate") CreateChildThis(kidActorsRotateX, kidActorsRotateX); CreateChildThis(kidActorsRotateY, kidActorsRotateY); CreateChildThis(kidActorsRotateZ, kidActorsRotateZ); CreateChildThis(kidActorsRotateNorm, kidActorsRotateNorm); ENDCHUNK CREATE_ANIMST("Rotate", kstOpen) FilterCmdsThis(cidMouseDown, hidNil, kchidClick); FilterCmdsThis(cidKey, hidNil, kchidScript2); DISABLEACCEL(fFalse); ENDCHUNK CREATE_ANIMST("Rotate", kstClosed) FilterCmdsThis(cidMouseDown, hidNil, chidNil); FilterCmdsThis(cidKey, hidNil, chidNil); ENABLEACCEL(fFalse); ENDCHUNK CHILD_SCRIPT("Rotate, track mouse", kchidClick) kid = _parm[0]; If(kid == kidActorsRotate); Return(fFalse); End; If((kid != kidActorsRotateX) && (kid != kidActorsRotateY) && (kid != kidActorsRotateZ) && (kid != kidActorsRotateNorm)); // // Hide this pop-up and pass click through // ChangeStateThis(kstClosed); If ((kidBackground->chttActor != chttRotateX) && (kidBackground->chttActor != chttRotateY) && (kidBackground->chttActor != chttRotateZ) && (kidBackground->chttActor != chttRotateNorm)); ChangeStateGob(kidActorsRotate, kstDefault); End; End; // // Pass clicks thru. // Return(fFalse); ENDCHUNK CHILD_SCRIPT("Actor Rotate, disable keys", kchidScript2) Return(fTrue); ENDCHUNK // // Rotate around X axis // GOBCHUNK("Secondary tools - Actor, RotateX", kidActorsRotateX, kgokkRectHit) DEFAULT_POSITION(kxpActorsRotateX, kypActorsRotateX, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttActorsRotateX) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\p5rotx.bmp", kxpregActorsRotateX, kypregActorsRotateX) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\p5rotxs.bmp", kxpregActorsRotateX, kypregActorsRotateX) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) ADOPT_WAVE(kcnoSecToolWav, CHID(kstDefault, krepClicked)) CHILD_SCRIPT("RotateX", CHID(kstDefault, kchidClick)) EnqueueCid(cidSetTool, khidStudio, chttRotateX, 0, 0, 0); ChangeStateGob(kidBackground->idactDown, kstDefault); ChangeStateGob(kidRotateBackground, kstClosed); kidBackground->idactDown = kidActorsRotate; kidBackground->chttActor = chttRotateX; ChangeStateGob(kidActorsRotate, kstSelected); ENDCHUNK // // Rotate around Y axis // GOBCHUNK("Secondary tools - Actor, RotateY", kidActorsRotateY, kgokkRectHit) DEFAULT_POSITION(kxpActorsRotateY, kypActorsRotateY, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttActorsRotateY) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\p5roty.bmp", kxpregActorsRotateY, kypregActorsRotateY) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\p5rotys.bmp", kxpregActorsRotateY, kypregActorsRotateY) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) ADOPT_WAVE(kcnoSecToolWav, CHID(kstDefault, krepClicked)) CHILD_SCRIPT("RotateY", CHID(kstDefault, kchidClick)) EnqueueCid(cidSetTool, khidStudio, chttRotateY, 0, 0, 0); ChangeStateGob(kidBackground->idactDown, kstDefault); ChangeStateGob(kidRotateBackground, kstClosed); kidBackground->idactDown = kidActorsRotate; kidBackground->chttActor = chttRotateY; ChangeStateGob(kidActorsRotate, kstSelected); ENDCHUNK // // Rotate around Z axis // GOBCHUNK("Secondary tools - Actor, RotateZ", kidActorsRotateZ, kgokkRectHit) DEFAULT_POSITION(kxpActorsRotateZ, kypActorsRotateZ, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttActorsRotateZ) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\p5rotz.bmp", kxpregActorsRotateZ, kypregActorsRotateZ) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\p5rotzs.bmp", kxpregActorsRotateZ, kypregActorsRotateZ) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) ADOPT_WAVE(kcnoSecToolWav, CHID(kstDefault, krepClicked)) CHILD_SCRIPT("RotateZ", CHID(kstDefault, kchidClick)) EnqueueCid(cidSetTool, khidStudio, chttRotateZ, 0, 0, 0); ChangeStateGob(kidBackground->idactDown, kstDefault); ChangeStateGob(kidRotateBackground, kstClosed); kidBackground->idactDown = kidActorsRotate; kidBackground->chttActor = chttRotateZ; ChangeStateGob(kidActorsRotate, kstSelected); ENDCHUNK // // Normalize wrt to rotation // GOBCHUNK("Secondary tools - Actor, RotateNorm", kidActorsRotateNorm, kgokkRectHit) DEFAULT_POSITION(kxpActorsRotateNorm, kypActorsRotateNorm, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttActorsRotateNorm) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\p5norm.bmp", kxpregActorsRotateNorm, kypregActorsRotateNorm) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\p5norms.bmp", kxpregActorsRotateNorm, kypregActorsRotateNorm) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) ADOPT_WAVE(kcnoSecToolWav, CHID(kstDefault, krepClicked)) CHILD_SCRIPT("RotateNorm", CHID(kstDefault, kchidClick)) EnqueueCid(cidSetTool, khidStudio, chttRotateNorm, 0, 0, 0); ChangeStateGob(kidBackground->idactDown, kstDefault); ChangeStateGob(kidRotateBackground, kstClosed); kidBackground->idactDown = kidActorsRotate; kidBackground->chttActor = chttRotateNorm; ChangeStateGob(kidActorsRotate, kstSelected); ENDCHUNK // // // Actor transform popup (squash/stretch) // // // // Background // GOBCHUNK("Transform Popup", kidTransformBackground, kgokkRectHit) DEFAULT_POSITION(kxpTransformBackground, kypTransformBackground, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_RECT(CHID(kstDefault, krepDefault), "hidden", 0, 0, 0, 0) REP_RECT(CHID(kstClosed, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstOpen, krepDefault), "studio\bmp\p4par.bmp", kxpregTransformBackground, kypregTransformBackground ) ADOPT_WAVE(kcnoDropDnWav, CHID(kstOpen, krepEnterAnimation)) CREATE_SCRIPT("Transform") CreateChildThis(kidActorsSquash, kidActorsSquash); CreateChildThis(kidActorsShrink, kidActorsShrink); CreateChildThis(kidActorsTransformNorm, kidActorsTransformNorm); ENDCHUNK CREATE_ANIMST("Transform", kstOpen) FilterCmdsThis(cidMouseDown, hidNil, kchidClick); FilterCmdsThis(cidKey, hidNil, kchidScript2); DISABLEACCEL(fFalse); ENDCHUNK CREATE_ANIMST("Transform", kstClosed) FilterCmdsThis(cidMouseDown, hidNil, chidNil); FilterCmdsThis(cidKey, hidNil, chidNil); ENABLEACCEL(fFalse); ENDCHUNK CHILD_SCRIPT("Transform, track mouse", kchidClick) kid = _parm[0]; If(kid == kidActorsTransform); Return(fFalse); End; If((kid != kidActorsSquash) && (kid != kidActorsShrink) && (kid != kidActorsTransformNorm)); // // Hide this pop-up and pass click through // ChangeStateThis(kstClosed); If ((kidBackground->chttActor != chttSquash) && (kidBackground->chttActor != chttShrink) && (kidBackground->chttActor != chttTransformNorm)); ChangeStateGob(kidActorsTransform, kstDefault); End; End; ENDCHUNK CHILD_SCRIPT("Actor Transform, disable keys", kchidScript2) Return(fTrue); ENDCHUNK // // Squash // GOBCHUNK("Secondary tools - Actor, Squash", kidActorsSquash, kgokkRectHit) DEFAULT_POSITION(kxpActorsSquash, kypActorsSquash, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttActorsSquash) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\p4sqsh.bmp", kxpregActorsSquash, kypregActorsSquash) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\p4sqshs.bmp", kxpregActorsSquash, kypregActorsSquash) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) ADOPT_WAVE(kcnoSecToolWav, CHID(kstDefault, krepClicked)) CHILD_SCRIPT("Squash/Stretch", CHID(kstDefault, kchidClick)) EnqueueCid(cidSetTool, khidStudio, chttSquash, 0, 0, 0); ChangeStateGob(kidBackground->idactDown, kstDefault); ChangeStateGob(kidTransformBackground, kstClosed); kidBackground->idactDown = kidActorsTransform; kidBackground->chttActor = chttSquash; ChangeStateGob(kidActorsTransform, kstSelected); ENDCHUNK // // Stretch // GOBCHUNK("Secondary tools - Actor, Shrink", kidActorsShrink, kgokkRectHit) DEFAULT_POSITION(kxpActorsShrink, kypActorsShrink, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttActorsShrink) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\p4shrk.bmp", kxpregActorsShrink, kypregActorsShrink) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\p4shrks.bmp", kxpregActorsShrink, kypregActorsShrink) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) ADOPT_WAVE(kcnoSecToolWav, CHID(kstDefault, krepClicked)) CHILD_SCRIPT("Shrink/Grow", CHID(kstDefault, kchidClick)) EnqueueCid(cidSetTool, khidStudio, chttShrink, 0, 0, 0); ChangeStateGob(kidBackground->idactDown, kstDefault); ChangeStateGob(kidTransformBackground, kstClosed); kidBackground->idactDown = kidActorsTransform; kidBackground->chttActor = chttShrink; ChangeStateGob(kidActorsTransform, kstSelected); ENDCHUNK // // Normalize wrt to squash/stretch // GOBCHUNK("Secondary tools - Actor, TransformNorm", kidActorsTransformNorm, kgokkRectHit) DEFAULT_POSITION(kxpActorsTransformNorm, kypActorsTransformNorm, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttActorsTransformNorm) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\p4norm.bmp", kxpregActorsTransformNorm, kypregActorsTransformNorm) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\p4norms.bmp", kxpregActorsTransformNorm, kypregActorsTransformNorm) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) ADOPT_WAVE(kcnoSecToolWav, CHID(kstDefault, krepClicked)) CHILD_SCRIPT("TransformNorm", CHID(kstDefault, kchidClick)) EnqueueCid(cidSetTool, khidStudio, chttTransformNorm, 0, 0, 0); ChangeStateGob(kidBackground->idactDown, kstDefault); ChangeStateGob(kidTransformBackground, kstClosed); kidBackground->idactDown = kidActorsTransform; kidBackground->chttActor = chttTransformNorm; ChangeStateGob(kidActorsTransform, kstSelected); ENDCHUNK // // // Text box popup for type // // // // Scroll (Credit) textbox // GOBCHUNK("Scroll Popup", kidScrollBackground, kgokkRectHit) DEFAULT_POSITION( 0, 0, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_RECT(CHID(kstDefault, krepDefault), "hidden", 0, 0, 0, 0) REP_RECT(CHID(kstClosed, krepDefault), "hidden", 0, 0, 0, 0) REP_RECT(CHID(kstOpen, krepDefault), "open", kxpScrollBackgroundLeft, kypScrollBackgroundTop, kxpScrollBackgroundRight, kxpScrollBackgroundBottom ) ADOPT_WAVE(kcnoDropDnWav, CHID(kstOpen, krepEnterAnimation)) CREATE_SCRIPT("Scroll") CreateChildThis(kidTextsScroll, kidTextsScroll); CreateChildThis(kidTextsStory, kidTextsStory); ENDCHUNK CREATE_ANIMST("Scroll", kstOpen) FilterCmdsThis(cidMouseDown, hidNil, kchidClick); FilterCmdsThis(cidKey, hidNil, kchidScript2); FilterCmdsThis(cidSelIdle, hidNil, kchidScript2); DISABLEACCEL(fFalse); ChangeStateGob(kidTextsScrollType, kstSelected); ENDCHUNK CREATE_ANIMST("Scroll", kstClosed) FilterCmdsThis(cidMouseDown, hidNil, chidNil); FilterCmdsThis(cidKey, hidNil, chidNil); FilterCmdsThis(cidSelIdle, hidNil, chidNil); ENABLEACCEL(fFalse); ENDCHUNK CHILD_SCRIPT("Scroll, track mouse", kchidClick) kid = _parm[0]; If(kid == kidTextsScrollType); Return(fFalse); End; If((kid != kidTextsScroll) && (kid != kidTextsStory)); // // Hide this pop-up and pass click through // ChangeStateThis(kstClosed); If ((kidBackground->chttTbox != chttTboxStory) && (kidBackground->chttTbox != chttTboxScroll)); ChangeStateGob(kidTextsScrollType, kstDefault); End; End; ENDCHUNK CHILD_SCRIPT("Scroll popup, disable", kchidScript2) Return(fTrue); ENDCHUNK // // Scroll text box // GOBCHUNK("Secondary tools - Text, Scroll", kidTextsScroll, kgokkRectHit) DEFAULT_POSITION(kxpTextsScroll, kypTextsScroll, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttTextsScroll) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\p7scrl.bmp", kxpregTextsScroll, kypregTextsScroll) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\p7scrls.bmp", kxpregTextsScroll, kypregTextsScroll) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) ADOPT_WAVE(kcnoSecToolWav, CHID(kstDefault, krepClicked)) CHILD_SCRIPT("Scroll Textbox", CHID(kstDefault, kchidClick)) EnqueueCid(cidSetTool, khidStudio, chttTboxScroll, 0, 0, 0); ChangeStateGob(kidBackground->idtbxDown, kstDefault); ChangeStateGob(kidScrollBackground, kstClosed); kidBackground->idtbxDown = kidTextsScrollType; kidBackground->chttTbox = chttTboxScroll; ChangeStateGob(kidTextsScrollType, kstSelected); ENDCHUNK // // Story text box // GOBCHUNK("Secondary tools - Text, Story", kidTextsStory, kgokkRectHit) DEFAULT_POSITION(kxpTextsStory, kypTextsStory, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttTextsStory) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\p7nscr.bmp", kxpregTextsStory, kypregTextsStory) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\p7nscrs.bmp", kxpregTextsStory, kypregTextsStory) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) ADOPT_WAVE(kcnoSecToolWav, CHID(kstDefault, krepClicked)) CHILD_SCRIPT("Story Textbox", CHID(kstDefault, kchidClick)) EnqueueCid(cidSetTool, khidStudio, chttTboxStory, 0, 0, 0); ChangeStateGob(kidBackground->idtbxDown, kstDefault); ChangeStateGob(kidScrollBackground, kstClosed); kidBackground->idtbxDown = kidTextsScrollType; kidBackground->chttTbox = chttTboxStory; ChangeStateGob(kidTextsScrollType, kstSelected); ENDCHUNK ================================================ FILE: src/studio/portf.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** portf.cpp: Portfolio handler Primary Author: ****** Review Status: peted has reviewed. Final version not yet approved. ***************************************************************************/ #include "studio.h" #include "commctrl.h" ASSERTNAME /*************************************************************************** FPortDisplayWithIds: Display the portfolio to open or save a file. Portfolio title and filters generated using supplied string ids. Arguments: fni - Output FNI for file selected fOpen - fTrue if open portfolio, else save portfolio. lFilterLabel - id of portfolio filter label lFilterExt - id of portfolio filter extension lTitle - id of portfolio title lpstrDefExt - Ptr to string for default file extension for save if required. pstnDefFileName - Ptr to default extension stn if required. pfniInitialDir - Ptr to initial directory fni if required. grfPrevType - Bits for types of preview required, (eg movie, sound etc) == 0 if no preview cnoWave - Wave cno for audio when portfolio is invoked Returns: TRUE - File selected FALSE - User canceled portfolio. ***************************************************************************/ bool FPortDisplayWithIds(FNI *pfni, bool fOpen, long lFilterLabel, long lFilterExt, long lTitle, LPTSTR lpstrDefExt, PSTN pstnDefFileName, FNI *pfniInitialDir, ulong grfPrevType, CNO cnoWave) { STN stnTitle; STN stnFilterLabel; STN stnFilterExt; int cChLabel, cChExt; SZ szFilter; bool fRet; AssertVarMem(pfni); AssertNilOrPo(pfniInitialDir, 0); AssertNilOrPo(pstnDefFileName, 0); if (!vapp.FGetStnApp(lTitle, &stnTitle)) return fFalse; // Filter string contain non-terminating null characters, so must // build up string from separate label and file extension strings. if (!vapp.FGetStnApp(lFilterLabel, &stnFilterLabel)) return fFalse; if (!vapp.FGetStnApp(lFilterExt, &stnFilterExt)) return fFalse; // Kauai does not like internal null chars in an STN. So build // up the final final string as an SZ. cChLabel = stnFilterLabel.Cch(); cChExt = stnFilterExt.Cch(); stnFilterLabel.GetSz(szFilter); stnFilterExt.GetSz(&szFilter[cChLabel + 1]); szFilter[cChLabel + cChExt + 2] = chNil; // Now display the open or save portfolio as required StopAllMovieSounds(); vapp.EnsureInteractive(); vapp.SetFInPortfolio(fTrue); if (fOpen) { fRet = FPortGetFniOpen(pfni, szFilter, stnTitle.Prgch(), pfniInitialDir, grfPrevType, cnoWave); } else { fRet = FPortGetFniSave(pfni, szFilter, stnTitle.Prgch(), lpstrDefExt, pstnDefFileName, grfPrevType, cnoWave); } // Make sure no portfolio related audio is still playing. vpsndm->StopAll(sqnNil, sclNil); vapp.SetFInPortfolio(fFalse); // Let the script know what the outcome is. vpcex->EnqueueCid(cidPortfolioClosed, 0, 0, fRet); // We must also enqueue a message for the help system here. // Help doesn't get the above cidPortfolioClosed as it has // already been filtered. vpcex->EnqueueCid(cidPortfolioResult, 0, 0, fRet); return fRet; } /*************************************************************************** FPortGetFniOpen: Display the portfolio to open a file. Arguments: pfni - Output FNI for file selected lpstrFilter - String containing files types to filter on lpstrTitle - String containing title of portfolio pfniInitialDir - Ptr to initial directory fni if required. grfPrevType - Bits for types of preview required, (eg movie, sound etc) == 0 if no preview cnoWave - Wave cno for audio when portfolio is invoked Returns: TRUE - File selected FALSE - User canceled portfolio. ***************************************************************************/ bool FPortGetFniOpen(FNI *pfni, LPTSTR lpstrFilter, LPTSTR lpstrTitle, FNI *pfniInitialDir, ulong grfPrevType, CNO cnoWave) { SZ szFile; DLGINFO diPortfolio; OPENFILENAME ofn; STN stn; bool fOKed; STN stnInitialDir; SZ szInitialDir; AssertPo(pfni, 0); AssertNilOrPo(pfniInitialDir, 0); ClearPb(&ofn, size(OPENFILENAME)); ClearPb(&diPortfolio, size(DLGINFO)); szFile[0] = 0; ofn.lStructSize = size(OPENFILENAME); ofn.hwndOwner = vwig.hwndApp; ofn.hInstance = vwig.hinst; ofn.nFilterIndex = 1L; ofn.lpstrCustomFilter = NULL; ofn.lpstrFile = szFile; ofn.nMaxFile = kcchMaxSz; ofn.lpstrFileTitle = NULL; ofn.lpfnHook = OpenHookProc; ofn.lpTemplateName = MAKEINTRESOURCE(dlidPortfolio); ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_EXPLORER | OFN_ENABLEHOOK | OFN_ENABLETEMPLATE; ofn.FlagsEx = OFN_EX_NOPLACESBAR; // lpstrDefExt is used for appended to the user typed filename is // one is entered without an extension. As the user cannot type // anything during a portfolio open, we don't use the lpstrDefExt here. ofn.lpstrDefExt = NULL; // Initialize internal data for accessing from inside dlg hook proc. diPortfolio.fIsOpen = fTrue; diPortfolio.fDrawnBkgnd = fFalse; diPortfolio.grfPrevType = grfPrevType; diPortfolio.cnoWave = cnoWave; ofn.lCustData = (DWORD)&diPortfolio; ofn.lpstrFilter = lpstrFilter; ofn.lpstrTitle = lpstrTitle; // Get the string for the initial directory if required. if (pfniInitialDir != pvNil) { pfniInitialDir->GetStnPath(&stnInitialDir); stnInitialDir.GetSz(szInitialDir); ofn.lpstrInitialDir = szInitialDir; } else { // Initial directory will be current directory. ofn.lpstrInitialDir = pvNil; } // Now display the portfolio. fOKed = (GetOpenFileName(&ofn) == FALSE ? fFalse : fTrue); if (!fOKed) { // Check if custom common dlg failed to initialize. Don't rely on the returned // error being CDERR_INITIALIZATION, as who knows what error will be returned // in future versions. if (CommDlgExtendedError() != NOERROR) { // User never saw portfolio. Therefore attempt to display // common dlg with no customization. ofn.Flags &= ~(OFN_EXPLORER | OFN_ENABLEHOOK | OFN_ENABLETEMPLATE); fOKed = (GetOpenFileName(&ofn) == FALSE ? fFalse : fTrue); } } // If the user selected a file, build up the associated fni. if (fOKed) { stn.SetSz(ofn.lpstrFile); pfni->FBuildFromPath(&stn, 0); } // Update the app window to make sure no parts of the portfolio // window are left on the screen while the file is being opened. // Calling UpdateMarked() does not have the desired effect here. UpdateWindow(vwig.hwndApp); // Report error to user if never displayed the portfolio. if (CommDlgExtendedError() != NOERROR) { PushErc(ercSocPortfolioFailed); } // Only return TRUE if the user selected a file. return (fOKed); } /*************************************************************************** pfGetFniSave: Display the save portfolio. Arguments: pfni - Output FNI for file selected lpstrFilter - String containing files types to filter on lpstrTitle - String containing title of portfolio lpstrDefExt - String containing default extension for filenames typed by user without an extension. pstnDefFileName - Ptr to default extension stn if required. grfPrevType - Bits for types of preview required, (eg movie, sound etc) == 0 if no preview cnoWave - Wave cno for audio when portfolio is invoked Returns: TRUE - File selected FALSE - User canceled portfolio, (or other error). ***************************************************************************/ bool FPortGetFniSave(FNI *pfni, LPTSTR lpstrFilter, LPTSTR lpstrTitle, LPTSTR lpstrDefExt, PSTN pstnDefFileName, ulong grfPrevType, CNO cnoWave) { DLGINFO diPortfolio; OPENFILENAME ofn; bool fOKed; bool tRet; bool fRedisplayPortfolio = fFalse; bool fExplorer = fTrue; STN stnFile, stnErr; FNI fniUserDir; STN stnUserDir; SZ szUserDir; SZ szDefFileName; SZ szFileTitle; AssertPo(pfni, 0); AssertNilOrPo(pstnDefFileName, 0); ClearPb(&ofn, size(OPENFILENAME)); ClearPb(&diPortfolio, size(DLGINFO)); szFileTitle[0] = chNil; ofn.lStructSize = size(OPENFILENAME); ofn.hwndOwner = vwig.hwndApp; ofn.hInstance = vwig.hinst; ofn.nFilterIndex = 1L; ofn.lpstrCustomFilter = NULL; ofn.nMaxFile = kcchMaxSz; ofn.lpstrFileTitle = szFileTitle; ofn.nMaxFileTitle = kcchMaxSz; ofn.lpfnHook = OpenHookProc; ofn.lpTemplateName = MAKEINTRESOURCE(dlidPortfolio); // Don't use OFN_OVERWRITEPROMPT here, otherwise we can't intercept // the btn press on the Save btn to display our own message. Note, // we don't do that either, because the help topic display mechanism // was not designed for use within a modal dlg box such as the portfolio. // Instead query overwrite after the portfolio has closed. ofn.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_EXPLORER | OFN_ENABLEHOOK | OFN_ENABLETEMPLATE; ofn.FlagsEx = OFN_EX_NOPLACESBAR; // Do not allow the save portfolio to change the current directory. ofn.Flags |= OFN_NOCHANGEDIR; // Let the initial dir be the user's dir. vapp.GetFniUser(&fniUserDir); fniUserDir.GetStnPath(&stnUserDir); stnUserDir.GetSz(szUserDir); ofn.lpstrInitialDir = szUserDir; // Initialize internal data for accessing from inside dlg hook proc. diPortfolio.fIsOpen = fFalse; diPortfolio.fDrawnBkgnd = fFalse; diPortfolio.grfPrevType = grfPrevType; diPortfolio.cnoWave = cnoWave; ofn.lCustData = (DWORD)&diPortfolio; ofn.lpstrFilter = lpstrFilter; ofn.lpstrTitle = lpstrTitle; ofn.lpstrDefExt = lpstrDefExt; // Set the the portfolio default save file name if required. if (pstnDefFileName != pvNil) { pstnDefFileName->GetSz(szDefFileName); } else { szDefFileName[0] = chNil; } ofn.lpstrFile = szDefFileName; // We may need to display the portfolio multiple times if the user // selects an existing file, and then says they don't want to overwrite it. do // Display portfolio { fRedisplayPortfolio = fFalse; // Now display the portfolio. fOKed = (GetSaveFileName(&ofn) == FALSE ? fFalse : fTrue); if (!fOKed) { DWORD dwRet; // Check if custom common dlg failed to initialize. Don't rely on the returned // error being CDERR_INITIALIZATION, as who knows what error will be returned // in future versions. if ((dwRet = CommDlgExtendedError()) != NOERROR) { if (dwRet == FNERR_INVALIDFILENAME || dwRet == FNERR_BUFFERTOOSMALL) { // Set the the portfolio default save file name if required. if (pstnDefFileName != pvNil) { pstnDefFileName->GetSz(szDefFileName); } else { szDefFileName[0] = chNil; } ofn.lpstrFile = szDefFileName; PushErc(ercSocInvalidFilename); fRedisplayPortfolio = fTrue; } else if (dwRet == CDERR_INITIALIZATION && fExplorer) { // User never saw portfolio. Therefore attempt to display // common dlg with no customization. ofn.Flags &= ~(OFN_EXPLORER | OFN_ENABLEHOOK | OFN_ENABLETEMPLATE); fRedisplayPortfolio = fTrue; fExplorer = fFalse; } else PushErc(ercSocPortfolioFailed); vapp.DisplayErrors(); continue; } } else { // Build stn if user selected a file. stnFile.SetSz(ofn.lpstrFile); // Query any attempt to overwrite an existing file now. if (CchSz(ofn.lpstrFile) != 0) { bool tExists; // We always save the file with the default extension. If the // user used a different extension, add the default on the end. if (ofn.Flags & OFN_EXTENSIONDIFFERENT) { stnFile.FAppendCh('.'); stnFile.FAppendSz(lpstrDefExt); } // Make sure the pfni is built from the appended file name if applicable. pfni->FBuildFromPath(&stnFile, 0); if ((tExists = pfni->TExists()) != tNo) { long cch; achar *pch; // File already exists. Query user for overwrite. // The default name supplied to the user will only // be the file name without the path. stnFile.SetSz(ofn.lpstrFileTitle); /* Remove the extension */ cch = stnFile.Cch(); pch = stnFile.Psz() + cch; while (cch--) { pch--; if (*pch == ChLit('.')) { stnFile.Delete(cch); break; } } stnFile.GetSz(ofn.lpstrFile); // Only query if we know for sure the file's there. If // it's not known for sure the file's there, just make the // user pick a new name. if (tExists == tYes) { AssertDo(vapp.FGetStnApp(idsReplaceFile, &stnErr), "String not present"); tRet = vapp.TModal(vapp.PcrmAll(), ktpcQueryOverwrite, &stnErr, bkYesNo, kstidQueryOverwrite, &stnFile); } else { vapp.DisplayErrors(); tRet = tNo; } // Redisplay the portfolio if no overwrite. if (tRet == tNo) { fRedisplayPortfolio = fTrue; // Make sure the app window is updated, otherwise the help topic // may still be displayed while the portfolio is redisplayed. InvalidateRect(vwig.hwndApp, NULL, TRUE); UpdateWindow(vwig.hwndApp); } } } else { // The user OKed the selection, and yet with have a zero length file name. // Something must have gone wrong with the common dialog. Treat this as a // cancel of the portfolio. (Remember we have not set up pfni in this case.) Bug("Portfolio selection of a file with no name"); fOKed = fFalse; } } } while (fRedisplayPortfolio); // If the user selected a file, build up the associated fni. if (!fOKed) { pfni->SetNil(); } // Update the app window to make sure no parts of the portfolio // window are left on the screen while the file is being saved. // Calling UpdateMarked() does not have the desired effect here. UpdateWindow(vwig.hwndApp); // Report error to user if never displayed the portfolio. if (CommDlgExtendedError() != NOERROR) { PushErc(ercSocPortfolioFailed); } // Only return fTrue if the user selected a file. return (fOKed); } /*************************************************************************** OpenHookProc: Hook proc for get open/save common dlg. Arguments: standard dialog proc args. Returns: TRUE - Common dlg will ignore message FALSE - Common dlg will process this message after custom dlg. Note - on win95, hwndCustom is the handle to the custom dlg created as a child of the common dlg. ***************************************************************************/ UINT CALLBACK OpenHookProc(HWND hwndCustom, UINT msg, UINT wParam, LONG lParam) { switch (msg) { case WM_INITDIALOG: { PDLGINFO pdiPortfolio; LONG lwStyle, lwExstyle; OPENFILENAME *lpOfn; HWND hwndDlg; RC rc; WNDPROC lpOtherBtnProc; lpOfn = (OPENFILENAME *)lParam; pdiPortfolio = (PDLGINFO)(lpOfn->lCustData); SetWindowLong(hwndCustom, GWL_USERDATA, (LONG)pdiPortfolio); hwndDlg = GetParent(hwndCustom); // Give ourselves a way to access the custom dlg hwnd // from the common dlg subclass wndproc. SetWindowLong(hwndDlg, GWL_USERDATA, (LONG)hwndCustom); // Hide common dlg controls that we're not interested in here. Use the Common Dialog // Message for hiding the control. The documentation on CDM_HIDECONTROL doesn't really // describe what the command actually does, so explictly disable the OK/Cancel btns here. SendMessage(hwndDlg, CDM_HIDECONTROL, stc2, 0L); // File type label EnableWindow(GetDlgItem(hwndDlg, stc2), FALSE); SendMessage(hwndDlg, CDM_HIDECONTROL, cmb1, 0L); // File type combo box EnableWindow(GetDlgItem(hwndDlg, cmb1), FALSE); SendMessage(hwndDlg, CDM_HIDECONTROL, cmb13, 0L); // Filename entry box EnableWindow(GetDlgItem(hwndDlg, cmb13), FALSE); SendMessage(hwndDlg, CDM_HIDECONTROL, chx1, 0L); // Open as Read-only check box EnableWindow(GetDlgItem(hwndDlg, chx1), FALSE); // Even though we are hiding the OK/Cancel buttons, do not disable them. // By doing this, we retain some default common dialog behavior. When the // user hits the Enter key the highlighted file will be selected, and when // the user hits the Escape key the portfolio is dismissed. SendMessage(hwndDlg, CDM_HIDECONTROL, IDOK, 0L); // OK btn. SendMessage(hwndDlg, CDM_HIDECONTROL, IDCANCEL, 0L); // Cancel btn. SendMessage(hwndDlg, CDM_HIDECONTROL, stc3, 0L); // 'File Name' EnableWindow(GetDlgItem(hwndDlg, stc3), FALSE); if (pdiPortfolio->fIsOpen) { SendMessage(hwndDlg, CDM_HIDECONTROL, edt1, 0L); // File name edit ctrl EnableWindow(GetDlgItem(hwndDlg, edt1), FALSE); } // If no preview required then hide the preview window. if (pdiPortfolio->grfPrevType == 0) { SendMessage(hwndCustom, CDM_HIDECONTROL, IDC_PREVIEW, 0L); EnableWindow(GetDlgItem(hwndCustom, IDC_PREVIEW), FALSE); } // Give the main common dlg the required style for custom display. // This means remove the caption bar, the system menu and the thick border. // Note, We do not need a frame round the window, as we customize its // background entirely. Therefore we should remove WS_CAPTION, (which is // WS_BORDER | WS_DLGFRAME), and WS_EX_DLGMODALFRAME. However, if we do // this, then when the user navigates around the list box in the dialog, // the app window gets repainted. Presumably this is due to win95 // invalidating an area slightly larger than the dlg without any border. // Therefore maintain the thin border. lwStyle = GetWindowLong(hwndDlg, GWL_STYLE); lwStyle &= ~(WS_DLGFRAME | WS_SYSMENU); SetWindowLong(hwndDlg, GWL_STYLE, lwStyle); lwExstyle = GetWindowLong(hwndDlg, GWL_EXSTYLE); lwExstyle &= ~WS_EX_DLGMODALFRAME; SetWindowLong(hwndDlg, GWL_EXSTYLE, lwExstyle); // IMPORTANT NOTE. Cannot move or size the portfolio here. Otherwise this // confuses win95 when it calculates whether all the controls fit in the // common dlg or not. Instead we must wait for the INITDONE notification. // Note, since the portfolio is full screen now, we don't need to move // the window anyway.. // Subclass the push btns to prevent the background flashing in the default color. lpBtnProc = (WNDPROC)SetWindowLong(GetDlgItem(hwndCustom, IDC_BUTTON1), GWL_WNDPROC, (LONG)SubClassBtnProc); lpOtherBtnProc = (WNDPROC)SetWindowLong(GetDlgItem(hwndCustom, IDC_BUTTON2), GWL_WNDPROC, (LONG)SubClassBtnProc); Assert(lpBtnProc == lpOtherBtnProc, "Custom portfolio buttons (ok/cancel) have different window procs"); lpOtherBtnProc = (WNDPROC)SetWindowLong(GetDlgItem(hwndCustom, IDC_BUTTON3), GWL_WNDPROC, (LONG)SubClassBtnProc); Assert(lpBtnProc == lpOtherBtnProc, "Custom portfolio buttons (ok/home) have different window procs"); // Subclass the preview window to allow custom draw. lpPreviewProc = (WNDPROC)SetWindowLong(GetDlgItem(hwndCustom, IDC_PREVIEW), GWL_WNDPROC, (LONG)SubClassPreviewProc); // Subclass the main common dlg window to stop static control backgrounds being // fill with the current system color. Instead use a color that matches our // custom background bitmap. lpDlgProc = (WNDPROC)SetWindowLong(hwndDlg, GWL_WNDPROC, (LONG)SubClassDlgProc); // For the save portfolio we want the file name control to have focus when displayed. if (!pdiPortfolio->fIsOpen) { SetFocus(GetDlgItem(hwndDlg, edt1)); // Select all the text in the file name edit control. SendMessage(GetDlgItem(hwndDlg, edt1), EM_SETSEL, 0, -1); return (1); } // Allow Windows to set the focus wherever it wants to. return (0); } case WM_COMMAND: { // If the user has clicked on one of our custom buttons, then // simulate a click on one of the hidden common dlg buttons. if (HIWORD(wParam) == BN_CLICKED) { switch (LOWORD(wParam)) { case IDC_BUTTON1: PostMessage(GetParent(hwndCustom), WM_COMMAND, IDOK, 0); return (1); case IDC_BUTTON2: PostMessage(GetParent(hwndCustom), WM_COMMAND, IDCANCEL, 0); return (1); case IDC_BUTTON3: { FNI fniUserDir; STN stnUserDir; SZ szUserDir; SZ szCurFile; HWND hwndDlg = GetParent(hwndCustom); // The user has pressed the Go To User's Home Folder btn. So get a SZ // for the user's home folder. vapp.GetFniUser(&fniUserDir); fniUserDir.GetStnPath(&stnUserDir); stnUserDir.GetSz(szUserDir); // Ideally there would be some CDM_ message here to tell the common dialog // that the current folder is to be changed. Unfortunately there is no such // message. There is also no recommended way of doing this. Note that if we // call SetCurrentDirectory here, then the common dialog is oblivious of the // folder change. // SO, we shall simulate a folder change by the user. Do this by filling // the file name edit control with the target folder, and then sending an // OK message to the common dlg. // This would be enough to change the folder, but we would lose the current // contents of the file name control. Therefore store the control contents // before we overwrite it, and reset it afterwards. Ideally there would be // some message to retrieve the contents of a control, (eg CDM_GETCONTROLTEXT), // but there isn't, so use a regular Windows call for this. // Get the current text for the control. GetDlgItemText(hwndDlg, edt1, szCurFile, sizeof(szCurFile)); // Now change folder! SendMessage(hwndDlg, CDM_SETCONTROLTEXT, edt1, (LPARAM)szUserDir); SendMessage(hwndDlg, WM_COMMAND, IDOK, 0); // Restore the edit control text. SendMessage(hwndDlg, CDM_SETCONTROLTEXT, edt1, (LPARAM)szCurFile); return (1); } default: break; } } break; } case WM_DRAWITEM: { int iDlgId = (int)wParam; DRAWITEMSTRUCT *pDrawItem = (DRAWITEMSTRUCT *)lParam; CNO cnoDisplay = cnoNil; PMBMP pmbmp; // Custom draw the our push btns here. switch (iDlgId) { case IDC_BUTTON1: if (pDrawItem->itemState & ODS_SELECTED) { cnoDisplay = kcnoMbmpPortBtnOkSel; } else { cnoDisplay = kcnoMbmpPortBtnOk; } break; case IDC_BUTTON2: if (pDrawItem->itemState & ODS_SELECTED) { cnoDisplay = kcnoMbmpPortBtnCancelSel; } else { cnoDisplay = kcnoMbmpPortBtnCancel; } break; case IDC_BUTTON3: if (pDrawItem->itemState & ODS_SELECTED) { cnoDisplay = kcnoMbmpPortBtnHomeSel; } else { cnoDisplay = kcnoMbmpPortBtnHome; } break; default: break; } if (cnoDisplay != cnoNil) { // Select the appropriate bitmap to display. if ((pmbmp = (PMBMP)vpapp->PcrmAll()->PbacoFetch(kctgMbmp, cnoDisplay, MBMP::FReadMbmp))) { PGPT pgpt; HPEN hpen, hpenold; HBRUSH hbr, hbrold; HFONT hfnt, hfntold; // To ensure that we don't return from here with different objects // selected in the supplied hdc, save them here and restore later. // (Note that Kauai will attempt to delete things it finds selected // in the hdc passed to PgptNew). hpen = (HPEN)GetStockObject(NULL_PEN); Assert(hpen != hNil, "Portfolio - draw items GetStockObject(NULL_PEN) failed"); hpenold = (HPEN)SelectObject(pDrawItem->hDC, hpen); hbr = (HBRUSH)GetStockObject(WHITE_BRUSH); Assert(hbr != hNil, "Portfolio - draw items GetStockObject(WHITE_BRUSH) failed"); hbrold = (HBRUSH)SelectObject(pDrawItem->hDC, hbr); hfnt = (HFONT)GetStockObject(SYSTEM_FONT); Assert(hfnt != hNil, "Portfolio - draw items GetStockObject(SYSTEM_FONT) failed"); hfntold = (HFONT)SelectObject(pDrawItem->hDC, hfnt); if ((pgpt = GPT::PgptNew(pDrawItem->hDC)) != pvNil) { GNV gnv(pgpt); PGNV pgnvOff; PGPT pgptOff; RC rcItem(pDrawItem->rcItem); // Must create offscreen dc and blit into that. Then blit that // to dlg on screen. If we blit straight from mbmp to screen, // then screen flashes. (Due to white fillrect). if ((pgptOff = GPT::PgptNewOffscreen(&rcItem, 8)) != pvNil) { if ((pgnvOff = NewObj GNV(pgptOff)) != pvNil) { pgnvOff->DrawMbmp(pmbmp, rcItem.xpLeft, rcItem.ypTop); gnv.CopyPixels(pgnvOff, &rcItem, &rcItem); GPT::Flush(); ReleasePpo(&pgnvOff); } ReleasePpo(&pgptOff); } ReleasePpo(&pgpt); } // Restore the currently secleted objects back into he supplied hdc. SelectObject(pDrawItem->hDC, hpenold); SelectObject(pDrawItem->hDC, hbrold); SelectObject(pDrawItem->hDC, hfntold); ReleasePpo(&pmbmp); } return (1); } break; } case WM_NOTIFY: { LPOFNOTIFY lpofNotify = (LPOFNOTIFY)lParam; switch (lpofNotify->hdr.code) { case CDN_INITDONE: { // Win95 has finished doing any resizing of the custom dlg and the controls. // So take any special action now to ensure the portfolio still looks good. PDLGINFO pdiPortfolio = (PDLGINFO)GetWindowLong(hwndCustom, GWL_USERDATA); RCS rcsApp; POINT ptBtn; int ypBtn; PMBMP pmbmpBtn; RC rcBmp; RCS rcsAppScreen, rcsPreview; int xOff = 0; int yOff = 0; LONG lStyle; PCRF pcrf; HWND hwndDlg = GetParent(hwndCustom); HWND hwndApp = GetParent(hwndDlg); HWND hwndPreview = GetDlgItem(hwndCustom, IDC_PREVIEW); // Store the current size of the portfolio. We need this later when we stretch // the background bitmap to match how win95 may have stretched the dlg controls. GetClientRect(hwndDlg, &(pdiPortfolio->rcsDlg)); // Get the client area size of the app window. GetClientRect(hwndApp, &rcsApp); // Now move the custom buttons to always be to the right of the preview window. // Make sure we keep the buttons above the bottom of the screen. GetClientRect(hwndPreview, &rcsPreview); ptBtn.x = rcsPreview.right; ptBtn.y = (rcsPreview.top + rcsPreview.bottom) / 2; MapWindowPoints(hwndPreview, hwndCustom, (POINT *)&ptBtn, 1); // First the home button. if ((pmbmpBtn = (PMBMP)vpapp->PcrmAll()->PbacoFetch(kctgMbmp, kcnoMbmpPortBtnHome, MBMP::FReadMbmp))) { pmbmpBtn->GetRc(&rcBmp); ptBtn.x += (3 * rcBmp.Dxp()) / 4; ypBtn = min(ptBtn.y - (rcBmp.Dyp() / 2), rcsApp.bottom - (2 * rcBmp.Dyp())); SetWindowPos(GetDlgItem(hwndCustom, IDC_BUTTON3), 0, ptBtn.x, ypBtn, rcBmp.Dxp(), rcBmp.Dyp(), SWP_NOZORDER); ReleasePpo(&pmbmpBtn); } // Now the cancel button. if ((pmbmpBtn = (PMBMP)vpapp->PcrmAll()->PbacoFetch(kctgMbmp, kcnoMbmpPortBtnCancel, MBMP::FReadMbmp))) { pmbmpBtn->GetRc(&rcBmp); ptBtn.x += (5 * rcBmp.Dxp()) / 4; ypBtn = min(ptBtn.y - (rcBmp.Dyp() / 2), rcsApp.bottom - (2 * rcBmp.Dyp())); SetWindowPos(GetDlgItem(hwndCustom, IDC_BUTTON2), 0, ptBtn.x, ypBtn, rcBmp.Dxp(), rcBmp.Dyp(), SWP_NOZORDER); ReleasePpo(&pmbmpBtn); } // Now the ok button. if ((pmbmpBtn = (PMBMP)vpapp->PcrmAll()->PbacoFetch(kctgMbmp, kcnoMbmpPortBtnOk, MBMP::FReadMbmp))) { pmbmpBtn->GetRc(&rcBmp); ptBtn.x += (5 * rcBmp.Dxp()) / 4; ypBtn = min(ptBtn.y - (rcBmp.Dyp() / 2), rcsApp.bottom - (2 * rcBmp.Dyp())); SetWindowPos(GetDlgItem(hwndCustom, IDC_BUTTON1), 0, ptBtn.x, ypBtn, rcBmp.Dxp(), rcBmp.Dyp(), SWP_NOZORDER); ReleasePpo(&pmbmpBtn); } // Note, win95 may have pushed the portfolio around depending on where the task bar is. // Ensure that the top left corner of the portfolio is in the top left of the client // area of the app window. Note that the common dlg is owned by the app window, but // it is not a child window itself. // Note, if we MapWindowPoints on (0,0) here, then the returned coords are shifted by // the task bar which is just what we don't want. So GetWindowRect instead. GetWindowRect(hwndApp, &rcsAppScreen); // If running in a window, then we must find the offset from the top left of the app // window's corner to its client area. lStyle = GetWindowLong(hwndApp, GWL_STYLE); if (lStyle & WS_CAPTION) { xOff = GetSystemMetrics(SM_CXDLGFRAME); yOff = GetSystemMetrics(SM_CYDLGFRAME); yOff += GetSystemMetrics(SM_CYCAPTION); } // Now move the common dialog itself. Resize the dialog too, to be the same size // as the app window. SetWindowPos(hwndDlg, 0, rcsAppScreen.left + xOff, rcsAppScreen.top + yOff, rcsApp.right, rcsApp.bottom, SWP_NOZORDER); // Custom dialog is a child of the common dlg, so (0, 0) wil position it it the common // dialog's client area. SetWindowPos(hwndCustom, 0, 0, 0, rcsApp.right, rcsApp.bottom, SWP_NOZORDER); // Now play the sound associated with this portfolio is there is one. // Note that we are not currently queueing this sound or terminating // any currently playing sound. if (pdiPortfolio->cnoWave != cnoNil) { // There is a sound for the portfolio, so find it. if ((pcrf = ((APP *)vpappb)->PcrmAll()->PcrfFindChunk(kctgWave, pdiPortfolio->cnoWave)) != pvNil) { vpsndm->SiiPlay(pcrf, kctgWave, pdiPortfolio->cnoWave); } } break; } case CDN_SELCHANGE: { HWND hwndPreview = GetDlgItem(hwndCustom, IDC_PREVIEW); // User has changed the file selected, so update the preview window. InvalidateRect(hwndPreview, NULL, FALSE); UpdateWindow(hwndPreview); break; } #ifdef QUERYINPORTFOLIO // Do this if we ever have a way of querying the user with a help topic // from inside the portfolio. case CDN_FILEOK: { PDLGINFO pdiPortfolio = (PDLGINFO)GetWindowLong(hwndCustom, GWL_USERDATA); // User has hit OK or Save. Is the user trying to save over an existing file? if (pdiPortfolio->fIsOpen != fTrue) { // Neither CommDlg_OpenSave_GetFilePath nor CommDlg_OpenSave_GetSpec // always return the string with the default extension already added // if applicable. Therefore get the file name from the returned OFN // structure, as this stores the complete file name. if (CchSz(lpofNotify->lpOFN->lpstrFile) != 0) { FNI fni; STN stnFile, stnErr; bool fHelp, tRet; long lSelect; // Now does the specified file already exist? stnFile.SetSz(lpofNotify->lpOFN->lpstrFile); fni.FBuildFromPath(&stnFile, 0); if (fni.TExists() != tNo) { if (vpappb->TGiveAlertSz("The selected file already exists.\n\nDo you want to overwrite it?", bkYesNo, cokQuestion) != tYes) { // Move the focus back to the file name edit ctrl. SetFocus(GetDlgItem(GetParent(hwndCustom), edt1)); // Let win95 know that the portfolio is to stay up. SetWindowLong(hwndCustom, DWL_MSGRESULT, 1); return (1); } } } } break; } #endif // QUERYINPORTFOLIO default: { break; } } break; } case WM_ERASEBKGND: // We never want the background painted in the system colors. return (1); case WM_PAINT: { PDLGINFO pdiPortfolio; pdiPortfolio = (PDLGINFO)GetWindowLong(hwndCustom, GWL_USERDATA); // Repaint the entire portfolio. RepaintPortfolio(hwndCustom); // Now the background is drawn, disallow erasing of the background in the // system color before each future repaint. pdiPortfolio->fDrawnBkgnd = fTrue; return (1); } default: break; } return (0); } /*************************************************************************** RepaintPortfolio: Repaint the entire portfolio. Arguments: hwndCustom - Handle to our custom dialog, ie child of the main common dlg. Returns: nothing ***************************************************************************/ void RepaintPortfolio(HWND hwndCustom) { PAINTSTRUCT ps; TEXTMETRIC tmCaption; SZ szCaption; PDLGINFO pdiPortfolio = (PDLGINFO)GetWindowLong(hwndCustom, GWL_USERDATA); PMBMP pmbmp, pmbmpBtn; int iBtn; CNO cnoBack; // Draw the custom background for the common dlg. BeginPaint(hwndCustom, &ps); // Display the open or save portfolio background bitmap as appropriate. if (pdiPortfolio->fIsOpen) { cnoBack = kcnoMbmpPortBackOpen; } else { cnoBack = kcnoMbmpPortBackSave; } // Get the background bitmap first. if ((pmbmp = (PMBMP)vpapp->PcrmAll()->PbacoFetch(kctgMbmp, cnoBack, MBMP::FReadMbmp))) { PGPT pgpt; HPEN hpen, hpenold; HBRUSH hbr, hbrold; HFONT hfnt, hfntold; // To ensure that we don't return from here with different objects // selected in the supplied hdc, save them here and restore later. // (Note that Kauai will attempt to delete things it finds selected // in the hdc passed to PgptNew). hpen = (HPEN)GetStockObject(NULL_PEN); Assert(hpen != hNil, "Portfolio - draw background GetStockObject(NULL_PEN) failed"); hpenold = (HPEN)SelectObject(ps.hdc, hpen); hbr = (HBRUSH)GetStockObject(WHITE_BRUSH); Assert(hbr != hNil, "Portfolio - draw background GetStockObject(WHITE_BRUSH) failed"); hbrold = (HBRUSH)SelectObject(ps.hdc, hbr); hfnt = (HFONT)GetStockObject(SYSTEM_FONT); Assert(hfnt != hNil, "Portfolio - draw background GetStockObject(SYSTEM_FONT) failed"); hfntold = (HFONT)SelectObject(ps.hdc, hfnt); if ((pgpt = GPT::PgptNew(ps.hdc)) != pvNil) { RC rcDisplay; RCS rcsPort, rcsPreview; GNV gnv(pgpt); PGNV pgnvOff; PGPT pgptOff; HWND hwndPreview; CNO cnoBtn; int iBtnId; // Get the current size of the Portfolio window. GetClientRect(hwndCustom, &rcsPort); rcDisplay = rcsPort; // Must create offscreen dc and blit into that. Then blit that to dlg on screen. // If we blit straight from mbmp to screen, then screen flashes. (Due to white FILLRECT). if ((pgptOff = GPT::PgptNewOffscreen(&rcDisplay, 8)) != pvNil) { if ((pgnvOff = NewObj GNV(pgptOff)) != pvNil) { RC rcOrgPort(pdiPortfolio->rcsDlg); RC rcClip(ps.rcPaint); // Win95 may initially have streched the portfolio due to font sizing. // All the portfolio controls will also have been stretched. So we must // now stretch the portfolio background bitmap into the size win95 // originally made it, to make the background fit the current size // of the controls. // Note, if the user has scaled down the font then the portfolio bitmap // will not fill the entire portfolio area now. The area outside the portfolio // will be black. While this is not ideal, it will be rare and everything will // still work. pgnvOff->DrawMbmp(pmbmp, &rcOrgPort); // While we have this offscreen dc, paint all our custom display into it now. // First the caption text. Position the text using its size. GetWindowText(GetParent(hwndCustom), szCaption, sizeof(szCaption)); GetTextMetrics(ps.hdc, &tmCaption); pgnvOff->DrawRgch(szCaption, CchSz(szCaption), (tmCaption.tmAveCharWidth * 2), tmCaption.tmHeight / 4, kacrBlack, kacrClear); // If we were to blit the current offscreen dc to the screen, then the // display of the preview window and custom buttons will be overwritten. // Those windows would immediately be repainted to make the portfolio // whole again. However, the windows would flash between blitting the // background bitmap and repainting them. Therefore add the preview // and custom buttons to the offscreen dc now, so that when the dc // is blitted to the screen, these controls are good. // Note, that the preview window alone is repainted when the user selection // changes. Also the custom buttons are redrawn when we get the notification // to redraw them in the dlg hook proc. // Update the preview window now. hwndPreview = GetDlgItem(hwndCustom, IDC_PREVIEW); GetClientRect(hwndPreview, &rcsPreview); MapWindowPoints(hwndPreview, hwndCustom, (POINT *)&rcsPreview, 2); OpenPreview(hwndCustom, pgnvOff, &rcsPreview); // Now the custom buttons. for (iBtn = 0; iBtn < 3; ++iBtn) { switch (iBtn) { case 0: cnoBtn = kcnoMbmpPortBtnOk; iBtnId = IDC_BUTTON1; break; case 1: cnoBtn = kcnoMbmpPortBtnCancel; iBtnId = IDC_BUTTON2; break; case 2: cnoBtn = kcnoMbmpPortBtnHome; iBtnId = IDC_BUTTON3; break; default: continue; } if ((pmbmpBtn = (PMBMP)vpapp->PcrmAll()->PbacoFetch(kctgMbmp, cnoBtn, MBMP::FReadMbmp))) { HWND hwndBtn = GetDlgItem(hwndCustom, iBtnId); RCS rcsBtn; RC rcItem; GetClientRect(hwndBtn, &rcsBtn); MapWindowPoints(hwndBtn, hwndCustom, (POINT *)&rcsBtn, 2); rcItem = rcsBtn; pgnvOff->DrawMbmp(pmbmpBtn, rcItem.xpLeft, rcItem.ypTop); ReleasePpo(&pmbmpBtn); } } // Clip the final blit, to the area which actually needs repainting. gnv.ClipRc(&rcClip); // Now finally blit our portfolio image to the screen. gnv.CopyPixels(pgnvOff, &rcDisplay, &rcDisplay); GPT::Flush(); ReleasePpo(&pgnvOff); } ReleasePpo(&pgptOff); } ReleasePpo(&pgpt); } // Restore the currently secleted objects back into he supplied hdc. SelectObject(ps.hdc, hpenold); SelectObject(ps.hdc, hbrold); SelectObject(ps.hdc, hfntold); ReleasePpo(&pmbmp); } EndPaint(hwndCustom, &ps); return; } /*************************************************************************** OpenPreview: Generate display for the preview of a movie. Arguments: hwndCustom - Handle to custom dlg window pgnvOff - Offscreen dc for displaying preview in. prcsPreview - RCS for displaying preview. Returns: nothing. ***************************************************************************/ void OpenPreview(HWND hwndCustom, PGNV pgnvOff, RCS *prcsPreview) { STN stn; PCFL pcfl; PMBMP pmbmp; FNI fni; SZ szFile; ERS ersT; ERS *pers; PDLGINFO pdiPortfolio = (PDLGINFO)GetWindowLong(hwndCustom, GWL_USERDATA); bool fPreviewed = fFalse; RC rcPreview(*prcsPreview); // If no preview is required, then do nothing here. if (pdiPortfolio->grfPrevType == 0) return; // Do not allow default error reporting to take place. This is due // to the fact that currently any queued errors do not appear // until the portfolio has been dismissed. pers = vpers; vpers = &ersT; // Clear the current contents of the preview window. pgnvOff->FillRc(&rcPreview, kacrBlack); // Get the currently selected file name. CommDlg_OpenSave_GetSpec(GetParent(hwndCustom), szFile, sizeof(szFile)); // Note the above call returns the name of the last selected file, even if the // user has since selected a folder! If the user hits the OK btn in this case, // win95 opens the last selected file anyway, so we are consistent here. if (CchSz(szFile) != 0) { // Get an fni for the selected file. stn.SetSz(szFile); fni.FBuildFromPath(&stn, 0); // If the user specified a directory, then don't preview it. if (!fni.FDir()) { // The name specifies a file. How should we preview it? if (pdiPortfolio->grfPrevType & fpfPortPrevMovie) { // Preview it as a movie if we can. if ((pcfl = CFL::PcflOpen(&fni, fcflNil)) != pvNil) { CKI ckiMovie; KID kidScene, kidThumb; BLCK blck; // Get the movie chunk from the open file. if (pcfl->FGetCkiCtg(kctgMvie, 0, &ckiMovie)) { // Now get the scene chunk and details. if (pcfl->FGetKidChidCtg(kctgMvie, ckiMovie.cno, 0, kctgScen, &kidScene)) { // Get the mbmp for the movie thumbnail. if (pcfl->FGetKidChidCtg(kctgScen, kidScene.cki.cno, 0, kctgThumbMbmp, &kidThumb) && pcfl->FFind(kidThumb.cki.ctg, kidThumb.cki.cno, &blck)) { if ((pmbmp = MBMP::PmbmpRead(&blck)) != pvNil) { // Stretch the preview into the preview window. pgnvOff->DrawMbmp(pmbmp, &rcPreview); ReleasePpo(&pmbmp); fPreviewed = fTrue; } } } } ReleasePpo(&pcfl); } } if (!fPreviewed && (pdiPortfolio->grfPrevType & fpfPortPrevTexture)) { // Preview the file as a .bmp file if we can. if ((pmbmp = MBMP::PmbmpReadNative(&fni, 0, 0, 0, fmbmpNil)) != pvNil) { // Stretch the bitmap in the preview window. pgnvOff->DrawMbmp(pmbmp, &rcPreview); ReleasePpo(&pmbmp); fPreviewed = fTrue; } } // Currently portfolio is not required to preview sound files. } } // Restore the default error reporting. vpers = pers; return; } /*************************************************************************** SubClassBtnProc: Subclass proc for custom btn ctrls.. Arguments: standard dialog proc args. Returns: TRUE/FALSE ***************************************************************************/ LRESULT CALLBACK SubClassBtnProc(HWND hwndBtn, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_ERASEBKGND: // We draw the button entirely later, so don't change the screen // at all here, This prevents any flashing while dlg repainted. return (1); default: break; } return (CallWindowProc(lpBtnProc, hwndBtn, msg, wParam, lParam)); } /*************************************************************************** SubClassPreviewProc: Subclass proc for preview window. Arguments: standard dialog proc args. Returns: TRUE/FALSE ***************************************************************************/ LRESULT CALLBACK SubClassPreviewProc(HWND hwndPreview, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_PAINT: { PAINTSTRUCT ps; RCS rcsPreview; RC rcPreview; PGNV pgnvOff; PGPT pgpt, pgptOff; HPEN hpen, hpenold; HBRUSH hbr, hbrold; HFONT hfnt, hfntold; // Subclass this window so that when the user selects a file, we can only // invalidate and repaint this window, rather than repainting the entire dlg. BeginPaint(hwndPreview, &ps); // To ensure that we don't return from here with different objects // selected in the supplied hdc, save them here and restore later. // (Note that Kauai will attempt to delete things it finds selected // in the hdc passed to PgptNew). hpen = (HPEN)GetStockObject(NULL_PEN); Assert(hpen != hNil, "Portfolio - draw Preview GetStockObject(NULL_PEN) failed"); hpenold = (HPEN)SelectObject(ps.hdc, hpen); hbr = (HBRUSH)GetStockObject(WHITE_BRUSH); Assert(hbr != hNil, "Portfolio - draw Preview GetStockObject(WHITE_BRUSH) failed"); hbrold = (HBRUSH)SelectObject(ps.hdc, hbr); hfnt = (HFONT)GetStockObject(SYSTEM_FONT); Assert(hfnt != hNil, "Portfolio - draw Preview GetStockObject(SYSTEM_FONT) failed"); hfntold = (HFONT)SelectObject(ps.hdc, hfnt); if ((pgpt = GPT::PgptNew(ps.hdc)) != pvNil) { GNV gnv(pgpt); GetClientRect(hwndPreview, &rcsPreview); rcPreview = rcsPreview; if ((pgptOff = GPT::PgptNewOffscreen(&rcPreview, 8)) != pvNil) { if ((pgnvOff = NewObj GNV(pgptOff)) != pvNil) { // Get the preview image into our offscreen dc. OpenPreview(GetParent(hwndPreview), pgnvOff, &rcsPreview); // Now update the screen. gnv.CopyPixels(pgnvOff, &rcPreview, &rcPreview); GPT::Flush(); ReleasePpo(&pgnvOff); } ReleasePpo(&pgptOff); } ReleasePpo(&pgpt); } // Restore the currently secleted objects back into he supplied hdc. SelectObject(ps.hdc, hpenold); SelectObject(ps.hdc, hbrold); SelectObject(ps.hdc, hfntold); EndPaint(hwndPreview, &ps); return (0); } default: break; } return (CallWindowProc(lpPreviewProc, hwndPreview, msg, wParam, lParam)); } /*************************************************************************** SubClassDlgProc: Subclass proc for common dlg window.. Arguments: standard dialog proc args. Returns: TRUE/FALSE ***************************************************************************/ LRESULT CALLBACK SubClassDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_HELP: { // Do not invoke any help while the portfolio is displayed. return TRUE; } case WM_CTLCOLORSTATIC: { HDC hdc = (HDC)wParam; // Process this to ensure the common dlg static controls look as good // as possible on our custom portfolio background. We could explictly // do this only for the two static ctrl currently used, // (ie stc3 = File Name, stc4 = Look In), but by taking this general // approach, if any new static ctrls are added in future versions of // win95, they will also look ok. (Except for the fact they won't be // known to the current custom portfolio background). This assumes // that we never want any common dlg static controls to be drawn using // the default system colors, but that's ok due the extent of our // portfolio customization. // Do not overwrite the background when writing the static control text. SetBkMode(hdc, TRANSPARENT); // Note, on win95 that static text always appears black, regardless of // the current system color settings. However, rather than relying on // this always being true, set the text color explicitly here. SetTextColor(hdc, RGB(0, 0, 0)); // Draw the control background in the light gray that matched the custom // background bitmap. Otherwise the background is drawn in the current // system color, which may not match the background at all. return ((LONG)GetStockObject(LTGRAY_BRUSH)); } case WM_SYSCOMMAND: { // Is a screen saver trying to start? if (wParam == SC_SCREENSAVE) { // Disable the screen saver if we don't allow them to run. if (!vpapp->FAllowScreenSaver()) return fTrue; } break; } case WM_ERASEBKGND: { // Since the user never sees the common dialog background, ensure that // it can never be erased in the system color. Force a repaint of the // custom dlg now, to prevent the common dlg controls appearing before // the portfolio background. Note that GetDlgItem(hwndDlg, ) // returns zero here, as the Menu part of the custom dlg is zero. HWND hwndCustom = (HWND)GetWindowLong(hwndDlg, GWL_USERDATA); if (hwndCustom != 0) UpdateWindow(hwndCustom); return (1); } default: break; } return (CallWindowProc(lpDlgProc, hwndDlg, msg, wParam, lParam)); } ================================================ FILE: src/studio/projmain.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ ////////////////////////////////// // Help Sequence reader main file ////////////////////////////////// #define INITIALIZE_TABLE() \ SET _indx = 0; // initializing the arrays with the project table #define PROJECT_TABLE(_inst, _return, _ID0, _next, _ID1, _ID2) \ kidSequenceParent->word1[_indx] = _inst; \ kidSequenceParent->word2[_indx] = _return; \ kidSequenceParent->word3[_indx] = _ID0; \ kidSequenceParent->word4[_indx] = _next; \ kidSequenceParent->word6[_indx] = _ID1; \ kidSequenceParent->word7[_indx] = _ID2; \ SET _indx++; // takes us to the next state, unless is previous state #define NEXTSTATE(_next) \ DEBUGCMD(PrintStr("Project Interpreter: Going to state ", NumToStr(_next, "")));\ If (_next != PrevState); \ kidSequenceParent->prev2State = kidSequenceParent->prevState; \ kidSequenceParent->prevState = kidSequenceParent->currState; \ kidSequenceParent->currState = _next; \ kidSequenceParent->currLine = kidSequenceParent->nsjTable[_next]; \ kidSequenceParent->stateLine = kidSequenceParent->currLine; \ Else; \ kidSequenceParent->currState = kidSequenceParent->prevState; \ kidSequenceParent->prevState = kidSequenceParent->prev2State; \ kidSequenceParent->currLine = kidSequenceParent->nsjTable[kidSequenceParent->currState]; \ kidSequenceParent->stateLine = kidSequenceParent->currLine; \ End; //////////////////////////////////////////////////////////// // Sequence parent object - this object is responsible for reading // and executing the help state machine(more or less) code. // Create this from other object, read in table from other object, // then start kchidScript1 from other object //////////////////////////////////////////////////////////// GOBCHUNK("Sequence Parent", kidSequenceParent, kgokkRectHit) DEFAULT_POSITION(0,0,350) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK // grey out bkgrd in state one, also inits vars REP_FILL(CHID(kst1, krepDefault), "kidSequenceParent", 0, 0, 0, 0, Transparent, Transparent) PATTERN_0 ENDCHUNK // background is transparent in state two, tiny object REP_FILL(CHID(kst2, krepDefault), "kidSequenceParent", 0, 0, 0, 0, Transparent, Transparent) PATTERN_0 ENDCHUNK // grey out bkgrd in state three REP_FILL(CHID(kst3, krepDefault), "kidSequenceParent", 0, 0, 640, 480, Palette( 73 ), Transparent) PATTERN_50X ENDCHUNK CREATE_ANIM("Sequence parent created") // Turn off hotkeys. They get restored in the various exit // commands interpreted below. DISABLEACCEL(fFalse); // turn off tool tips, gadget will turn them on for itself SetProp(kpridToolTipDelay, 999999); // flag for easel help ::fHelpOn = fTrue; RunScriptThis(kchidScript6); ENDCHUNK // init the vars, child so it can be run for each new sequence CHILD_SCRIPT("Instruction Parser", kchidScript6) // logo vars .lastHelp = 0; .prevState = 1; // stores previous state in case jump back is required .prev2State = 1; // stores second previous state .currState = 1; // stores current state .stateLine = 0; // stores place of first non-initializing instruction in a state .currLine = 0; // stores current line .tbInst = 0; .tbReturn = fFalse; .tbID0 = 0; .tbNext = 1; .tbState = 1; .tbID1 = 0; .tbID2 = 0; // vars from tables ENDCHUNK CHILD_SCRIPT("Previous help destroyer", kchidScript7) If (.lastHelp != 0); DestroyGob(.lastHelp); End; RunScriptThis(kchidScript6); ENDCHUNK // --------------------------------------------------------- // Parses the current instruction then sends it to the proper handler // // _parm[0] -- _parm[3] are optional parameters passed to the // interpreter when it is called via an Enqueued event. When // the interpreter is called from other places in the code, these // parameters may or may not be set. The meaning of these // parameters depends on the cid. // --------------------------------------------------------- CHILD_SCRIPT("Instruction Parser", kchidScript1) // script will loop back to here until it hits a waitevent or a return ParseLoop@ // get the table line to parse RunScriptThis(kchidScript4, .currLine); // branch to the instruction Goto(Match(.tbInst, NotFound$, InitState, _InitState$, MatchGoto, _MatchGoto$, MatchDescGoto, _MatchDescGoto$, MatchChildrenGoto, _MatchChildrenGoto$, MatchParentGoto, _MatchParentGoto$, MatchAllGoto, _MatchAllGoto$, IgnoreMatch, _IgnoreMatch$, IgnoreChildren, _IgnoreChildren$, IgnoreParentMatch, _IgnoreParentMatch$,IgnoreAll, _IgnoreAll$, BoolCondGoto, _BoolCondGoto$, StateCondGoto, _StateCondGoto$, SpecialInstr, _SpecialInstr$, WaitEvent, _WaitEvent$, JumpToState, _JumpToState$, EndState, _EndState$)); // initialize the state, put up help, set filters _InitState@ // Set the state of the parent If (StateThis() != (kst2 + .tbID0)); ChangeStateThis(kst2 + .tbID0); End; // create the help topic, if there is one(do last for filtering balloons) If (.tbID2 != 0); .lastHelp = CreateHelpGob(kidBackground, .tbID2); Else; .lastHelp = 0; End; // set up the filters RunScriptThis(kchidScript3, .tbID1); // move down a line .stateLine++; .currLine++; // loop back Goto(ParseLoop$); // on match of both IDs goto next state _MatchGoto@ // if both ids match move to the next state If ((_parm[1] == .tbID1) && (_parm[.tbID0] == .tbID2)); NEXTSTATE(.tbNext) // destroy the last help, if there was one If (.lastHelp != 0); DestroyGob(.lastHelp); End; // need to come back and init next state, so send message to recall this script EnqueueCid(cidParse, kidSequenceParent, 0, 0, 0, 0); Return(.tbReturn); Else; .currLine++; End; Goto(ParseLoop$); // on a match of the item or its descendents goto the next state _MatchDescGoto@ // if both ids match move to the next state If ((_parm[1] == .tbID1) && (FIsDescendent(_parm[0], .tbID2))); NEXTSTATE(.tbNext) // destroy the last help, if there was one If (.lastHelp != 0); DestroyGob(.lastHelp); End; // need to come back and init next state, so send message to recall this script EnqueueCid(cidParse, kidSequenceParent, 0, 0, 0, 0); Return(.tbReturn); Else; .currLine++; End; Goto(ParseLoop$); // on a match children(of a balloon) goto the next state _MatchChildrenGoto@ // if both ids match move to the next state If ((_parm[1] == .tbID1) && (_parm[0] == (.tbID2->_gidBase + .tbID0))); NEXTSTATE(.tbNext) // destroy the last help, if there was one If (.lastHelp != 0); DestroyGob(.lastHelp); End; // need to come back and init next state, so send message to recall this script EnqueueCid(cidParse, kidSequenceParent, 0, 0, 0, 0); Return(.tbReturn); Else; .currLine++; End; Goto(ParseLoop$); // on a match of ID1 goto the next state _MatchAllGoto@ // if both ids match move to the next state If (_parm[1] == .tbID1); NEXTSTATE(.tbNext) // destroy the last help, if there was one If (.lastHelp != 0); DestroyGob(.lastHelp); End; // need to come back and init next state, so send message to recall this script EnqueueCid(cidParse, kidSequenceParent, 0, 0, 0, 0); Return(.tbReturn); Else; .currLine++; End; Goto(ParseLoop$); // on a match of the items parent goto the next state _MatchParentGoto@ // if both ids match move to the next state If ((_parm[1] == .tbID1) && (_parm[0] == GidParGob(.tbID2))); NEXTSTATE(.tbNext) // destroy the last help, if there was one If (.lastHelp != 0); DestroyGob(.lastHelp); End; // need to come back and init next state, so send message to recall this script EnqueueCid(cidParse, kidSequenceParent, 0, 0, 0, 0); Return(.tbReturn); Else; .currLine++; End; Goto(ParseLoop$); // on a match ignore the event _IgnoreMatch@ // if both ids match move to the next state If ((_parm[1] == .tbID1) && (_parm[.tbID0] == .tbID2)); .currLine = .stateLine; Return(.tbReturn); Else; .currLine++; End; Goto(ParseLoop$); // on a match on the object or it's children ignore the event _IgnoreChildren@ // if both ids match move to the next state If ((_parm[1] == .tbID1) && (FIsDescendent(_parm[0], .tbID2))); .currLine = .stateLine; Return(.tbReturn); Else; .currLine++; End; Goto(ParseLoop$); // on a match on the object or it's children ignore the event _IgnoreParentMatch@ // if both ids match move to the next state If ((_parm[1] == .tbID1) && (_parm[0] == GidParGob(.tbID2))); .currLine = .stateLine; Return(.tbReturn); Else; .currLine++; End; Goto(ParseLoop$); // ignore any event that comes in _IgnoreAll@ If (_parm[1] == .tbID1); .currLine = .stateLine; Return(.tbReturn); Else; .currLine++; End; Goto(ParseLoop$); // conditional, checks a flag to see if a state should be skipped _BoolCondGoto@ // see if the flag is set to same as tbID2 If (.tbID1 == .tbID2); NEXTSTATE(.tbNext) // flags didn't match, do nothing and move to the next instruction Else; .currLine++; End; Goto(ParseLoop$); // conditional, see's what state an object is in to see if a state should be skipped _StateCondGoto@ // see if the object is in the desired state If (StateGob(.tbID1) == .tbID2); NEXTSTATE(.tbNext) // wrong state, do nothing and move to the next instruction Else; .currLine++; End; Goto(ParseLoop$); // stops the processing and returns to waiting for an event _WaitEvent@ .currLine++; .stateLine = .currLine; Return(fTrue); _JumpToState@ NEXTSTATE(.tbNext) EnqueueCid(cidParse, kidSequenceParent, 0, 0, 0, 0); Return(.tbReturn); // signifies the last operation in a state _EndState@ .currLine = .stateLine; Return(fTrue); // handles all weirdities that can happen(hopefully) _SpecialInstr@ // find the special case that was in id1 Goto(Match(.tbID1, NoSpecial$, QuitMM, _QuitMM$, QuitHelp, _QuitHelp$, QuitGadgetHelp, _QuitGadgetHelp$, SetHelpAlarm, _SetHelpAlarm$, ProjectsRoom, _ProjectsRoom$, ResetTipDelay, _ResetTipDelay$, ClearStudio, _ClearStudio$, LoadProjectMovie, _LoadProjectMovie$, OpenDoorCovers, _OpenDoorCovers$, SimulateClick, _SimulateClick$, SetSceneAndFrame, _SetSceneAndFrame$, SetBlinkingGadget, _SetBlinkingGadget$, OpenAllDoors, _OpenAllDoors$, ChangeToNextMovie, _ChangeToNextMovie$, SetBrowserItem, _SetBrowserItem$, SetNextProject, _SetNextProject$)); // special functions _QuitMM@ EnqueueCid(cidQuit, 0, 0, 0, 0, 0); EnqueueCid(cidParse, kidSequenceParent, 0, 0, 0, 0); .currLine++; Return(.tbReturn); _QuitHelp@ If (.lastHelp != 0); DestroyGob(.lastHelp); End; SetProp(kpridToolTipDelay, kdtimToolTipDelay); ENABLEACCEL(fFalse); // flag for easel help ::fHelpOn = fFalse; SetProp(kpridBrwsOverrideThum, -1); SetProp(kpridBrwsOverrideKidThum, -1); ret = .tbReturn; DestroyThis(); Return(ret); _QuitGadgetHelp@ If (.lastHelp != 0); DestroyGob(.lastHelp); End; If (FGobExists(kidGadget)); DestroyGob(kidGadget); End; If (FGobExists(kidGadgetParent)); DestroyGob(kidGadgetParent); End; SetProp(kpridToolTipDelay, kdtimToolTipDelay); ENABLEACCEL(fFalse); // flag for easel help ::fHelpOn = fFalse; SetProp(kpridBrwsOverrideThum, -1); SetProp(kpridBrwsOverrideKidThum, -1); // create transition help CreateHelpGob(kidBackground, ktpcUserQuitsHelp); ret = .tbReturn; //Tmp var because of DestroyThis. DestroyThis(); Return(ret); _SetHelpAlarm@ // ID2 is in 60ths of a second SetAlarmThis(khidClokGokReset, .tbID2, chidNil); .currLine++; Goto(ParseLoop$); _SetBlinkingGadget@ // make gadget blink ChangeStateGob(kidGadget, kst3); .currLine++; Goto(ParseLoop$); _OpenAllDoors@ // open all the doors RunScriptGob(kidBackground, CHID1(kchidOpenDoorsAll)); .currLine++; Goto(ParseLoop$); _ChangeToNextMovie@ // Change to the next movie RunScriptGob(kidGadgetSelectorUp, kchidScript1); Return(.tbReturn); _ProjectsRoom@ EnqueueCid(cidLoadBuilding, 0, 0, 0, 0, 0); EnqueueCid(cidParse, kidSequenceParent, 0, 0, 0, 0); .currLine++; Return(.tbReturn); _ResetTipDelay@ SetProp(kpridToolTipDelay, .tbID2); .currLine++; Goto(ParseLoop$); _ClearStudio@ EnqueueCid(cidNew, khidStudio, 0, 0, 0, 0); EnqueueCid(cidParse, kidSequenceParent, 0, 0, 0, 0); .currLine++; Return(.tbReturn); _LoadProjectMovie@ EnqueueCid(cidLoadProjectMovie, 0, .tbID2, 0, 0, 0); EnqueueCid(cidParse, kidSequenceParent, 0, 0, 0, 0); .currLine++; Return(.tbReturn); _OpenDoorCovers@ RunScriptGob(.tbID2, CHID(kstClosed, kchidClick)); .currLine++; Goto(ParseLoop$); _SetSceneAndFrame@ EnqueueCid(cidMovieGoto, 0, .tbID0, .tbID2, 0, 0); EnqueueCid(cidParse, kidSequenceParent, 0, 0, 0, 0); .currLine++; Return(.tbReturn); _SimulateClick@ RunScriptGob(.tbID2, CHID(kstDefault, kchidClick)); .currLine++; Goto(ParseLoop$); _SetBrowserItem@ SetProp(kpridBrwsOverrideThum, .tbID2); SetProp(kpridBrwsOverrideSidThum,2); SetProp(kpridBrwsOverrideKidThum, kidReserveProjects); .currLine++; Goto(ParseLoop$); _SetNextProject@ ::NextProject = .tbID2; .currLine++; Goto(ParseLoop$); NoSpecial@ Return(fTrue); NotFound@ .currLine++; Goto(ParseLoop$); ENDCHUNK /////////////////////////////////////////////////////////////// // Builds the state table in word five /////////////////////////////////////////////////////////////// CHILD_SCRIPT("Building state table", kchidScript5) iLine = 0; iState = 1; // go until we hit the end of the table While (.word1[iLine] != EndTable); .word5[iLine] = iState; // if its the EndState increment the state If (.word1[iLine] == EndState); iState++; End; iLine++; End; .word5[iLine] = 0; // End state ENDCHUNK /////////////////////////////////////////////////////////////// // Builds a next state jump right after the arrays are initialized /////////////////////////////////////////////////////////////// CHILD_SCRIPT("Building next state jump table", kchidScript2) iLine = 0; iState = 0; // go through the list setting the array elements to the // line numbers of the first line in the state While(.word5[iLine] > 0); If (.word5[iLine] != iState); iState++; .nsjTable[iState] = iLine; End; iLine++; End; ENDCHUNK //////////////////////////////////////////////////////////// // reset filters according to what state we're in //////////////////////////////////////////////////////////// CHILD_SCRIPT("Change filtering", kchidScript3) // reset all filters FilterCmdsThis(cidNil, kidNil, chidNil); FilterCmdsThis(cidParse, kidNil, kchidScript1); // now set the current states filters If ((_parm[0] & kFltrMouse) == kFltrMouse); FilterCmdsThis(cidMouseDown, kidNil, kchidScript1); End; If ((_parm[0] & kFltrKey) == kFltrKey); FilterCmdsThis(cidKey, kidNil, kchidScript1); End; If ((_parm[0] & kFltrBrwOk) == kFltrBrwOk); FilterCmdsThis(cidBrowserOk, kidNil, kchidScript1); End; If ((_parm[0] & kFltrBrwCancel) == kFltrBrwCancel); FilterCmdsThis(cidBrowserCancel, kidNil, kchidScript1); End; If ((_parm[0] & kFltrBrwSelect) == kFltrBrwSelect); FilterCmdsThis(cidBrowserSelect, kidNil, kchidScript1); End; If ((_parm[0] & kFltrClicked) == kFltrClicked); FilterCmdsThis(cidClicked, kidNil, kchidScript1); End; If ((_parm[0] & kFltrEslOk) == kFltrEslOk); FilterCmdsThis(cidEaselOk, kidNil, kchidScript1); End; If ((_parm[0] & kFltrEslClosing) == kFltrEslClosing); FilterCmdsThis(cidEaselClosing, kidNil, kchidScript1); End; If ((_parm[0] & kFltrEslCancel) == kFltrEslCancel); FilterCmdsThis(cidEaselCancel, kidNil, kchidScript1); End; If ((_parm[0] & kFltrActorIn) == kFltrActorIn); FilterCmdsThis(cidActorPlaced, kidNil, kchidScript1); End; If ((_parm[0] & kFltrActorOut) == kFltrActorOut); FilterCmdsThis(cidActorPlacedOutOfView, kidNil, kchidScript1); End; If ((_parm[0] & kFltrActorClicked) == kFltrActorClicked); FilterCmdsThis(cidActorClicked, kidNil, kchidScript1); End; If ((_parm[0] & kFltrActorClickedDown) == kFltrActorClickedDown); FilterCmdsThis(cidActorClickedDown, kidNil, kchidScript1); End; If ((_parm[0] & kFltrScnSortOk) == kFltrScnSortOk); FilterCmdsThis(cidSceneSortOk, kidNil, kchidScript1); End; If ((_parm[0] & kFltrScnSortCancel) == kFltrScnSortCancel); FilterCmdsThis(cidSceneSortCancel, kidNil, kchidScript1); End; If ((_parm[0] & kFltrAlarmOff) == kFltrAlarmOff); FilterCmdsThis(cidHelpAlarmOff, kidNil, kchidScript1); End; If ((_parm[0] & kFltrMoviePlaying) == kFltrMoviePlaying); FilterCmdsThis(cidMviePlaying, kidNil, kchidScript1); End; If ((_parm[0] & kFltrTBoxClicked) == kFltrTBoxClicked); FilterCmdsThis(cidTboxClicked, kidNil, kchidScript1); End; If ((_parm[0] & kFltrBrwVisible) == kFltrBrwVisible); FilterCmdsThis(cidBrowserVisible, kidNil, kchidScript1); End; If ((_parm[0] & kFltrEslVisible) == kFltrEslVisible); FilterCmdsThis(cidEaselVisible, kidNil, kchidScript1); End; If ((_parm[0] & kFltrScnSortVisible) == kFltrScnSortVisible); FilterCmdsThis(cidSceneSortInit, kidNil, kchidScript1); End; If ((_parm[0] & kFltrGadgetAviStop) == kFltrGadgetAviStop); FilterCmdsThis(cidGadgetAviStop, kidNil, kchidScript1); End; If ((_parm[0] & kFltrScnSortSelect) == kFltrScnSortSelect); FilterCmdsThis(cidSceneSortSelect, kidNil, kchidScript1); End; If ((_parm[0] & kFltrMovieLoaded) == kFltrMovieLoaded); FilterCmdsThis(cidProjectMovieLoaded, kidNil, kchidScript1); End; If ((_parm[0] & kFltrModalClosed) == kFltrModalClosed); FilterCmdsThis(cidQuerySaveDocResult, kidNil, kchidScript1); End; If ((_parm[0] & kFltrSceneLoaded) == kFltrSceneLoaded); FilterCmdsThis(cidSceneLoaded, kidNil, kchidScript1); End; If ((_parm[0] & kFltrPortfolioResult) == kFltrPortfolioResult); FilterCmdsThis(cidPortfolioResult, kidNil, kchidScript1); End; ENDCHUNK /////////////////////////////////////////////////////////////// // Get the current line in the table /////////////////////////////////////////////////////////////// CHILD_SCRIPT("Get current line", kchidScript4) // get all vars for the line .tbInst = .word1[_parm[0]]; .tbReturn = .word2[_parm[0]]; .tbID0 = .word3[_parm[0]]; .tbNext = .word4[_parm[0]]; .tbState = .word5[_parm[0]]; .tbID1 = .word6[_parm[0]]; .tbID2 = .word7[_parm[0]]; ENDCHUNK /////////////////////////////////////////////////////////////// // The alarm went off /////////////////////////////////////////////////////////////// CHILD_SCRIPT("Alarm went off", CHID(kst2, kchidAlarm)) EnqueueCid(cidHelpAlarmOff, kidSequenceParent, 0, 0, 0, 0); ENDCHUNK ================================================ FILE: src/studio/scnsort.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /****************************************************************************** Author: ****** Project: Socrates Review Status: Reviewed Main module for the scene sorter class. ************************************************************ PETED ***********/ #include "studio.h" ASSERTNAME BEGIN_CMD_MAP(SCRT, GOK) ON_CID_ME(cidSceneSortInit, &SCRT::FCmdInit, pvNil) ON_CID_ME(cidSceneSortSelect, &SCRT::FCmdSelect, pvNil) ON_CID_ME(cidSceneSortInsert, &SCRT::FCmdInsert, pvNil) ON_CID_ME(cidSceneSortScroll, &SCRT::FCmdScroll, pvNil) ON_CID_ME(cidSceneSortNuke, &SCRT::FCmdNuke, pvNil) ON_CID_ME(cidSceneSortOk, &SCRT::FCmdDismiss, pvNil) ON_CID_ME(cidSceneSortCancel, &SCRT::FCmdDismiss, pvNil) ON_CID_ME(cidSceneSortPortfolio, &SCRT::FCmdPortfolio, pvNil) ON_CID_ME(cidSceneSortTransition, &SCRT::FCmdTransition, pvNil) END_CMD_MAP_NIL() RTCLASS(SCRT) #ifdef DEBUG void SCRT::AssertValid(ulong grf) { SCRT_PAR::AssertValid(0); if (_iscenMac > 0) AssertIn(_iscenCur, 0, _iscenMac); else Assert(_iscenCur == 0, "Non-zero _iscenCur for empty movie"); AssertIn(_iscenTop, 0, _iscenMac + 1); /* The CMVI has loose rules about the format of its data structures, but it's important to the SCRT that we keep things in the right order. */ if (_cmvi.pglscend != pvNil) { long imviedMac; AssertPo(_cmvi.pglscend, 0); AssertPo(_cmvi.pglmvied, 0); imviedMac = _cmvi.pglmvied->IvMac(); for (long iscend = 0; iscend < _cmvi.pglscend->IvMac(); iscend++) { SCEND scend; _cmvi.pglscend->Get(iscend, &scend); Assert(iscend < _iscenMac ? !scend.fNuked : scend.fNuked, "Bad GL of SCENDs"); Assert(scend.imvied < imviedMac, "Bogus scene entry in pglscend"); } } } void SCRT::MarkMem(void) { AssertThis(0); SCRT_PAR::MarkMem(); MarkMemObj(_pmvie); _cmvi.MarkMem(); } #endif /* DEBUG */ SCRT::SCRT(PGCB pgcb) : SCRT_PAR(pgcb) { Assert(_pmvie == pvNil, "SCRT block not cleared"); Assert(_pstdio == pvNil, "SCRT block not cleared"); Assert(_cmvi.pglscend == pvNil, "SCRT block not cleared"); Assert(_cmvi.pglmvied == pvNil, "SCRT block not cleared"); Assert(_fError == fFalse, "SCRT block not cleared"); Assert(_fInited == fFalse, "SCRT block not cleared"); Assert(_iscenMac == 0, "SCRT block not cleared"); } SCRT::~SCRT(void) { PGOB pgob; /* We might get released on Quit without exiting the Scene Sorter. */ if (_cmvi.pglscend != pvNil || _cmvi.pglmvied != pvNil) _cmvi.Empty(); if (_pmvie != pvNil) ReleasePpo(&_pmvie); /* Kill the glass GOB (it's not a child of me) */ pgob = vpapp->Pkwa()->PgobFromHid(kidGenericDisableGlass); ReleasePpo(&pgob); if (_fInited) vpapp->EnableAccel(); /* Report generic error */ if (_fError) PushErc(ercSocSceneSortError); } /****************************************************************************** PscrtNew Allocates and initializes a brand new SCRT. If any necessary initialization fails, cleans up and returns a nil pointer. Arguments: long hid -- the command hander ID for the SCRT Returns: the pointer to the new SCRT, pvNil if the routine fails ************************************************************ PETED ***********/ PSCRT SCRT::PscrtNew(long hid, PMVIE pmvie, PSTDIO pstdio, PRCA prca) { AssertPo(pmvie, 0); AssertPo(pstdio, 0); PSCRT pscrt = pvNil; PGOB pgobPar; RC rcRel; GCB gcb; if ((pgobPar = vapp.Pkwa()->PgobFromHid(kidBackground)) == pvNil) { Bug("Couldn't find background GOB"); goto LFail; } rcRel.Set(krelZero, krelZero, krelOne, krelOne); gcb.Set(hid, pgobPar, fgobNil, kginDefault, pvNil, &rcRel); if ((pscrt = NewObj SCRT(&gcb)) == pvNil) goto LFail; if (!pscrt->_FInit(vpapp->Pkwa(), hid, prca)) goto LOom; if (!pscrt->_FEnterState(ksnoInit)) { Warn("GOK immediately destroyed!"); pscrt = pvNil; goto LFail; } if (!pmvie->FAddToCmvi(&pscrt->_cmvi, &pscrt->_iscenMac)) { LOom: ReleasePpo(&pscrt); goto LFail; } pscrt->_pmvie = pmvie; pscrt->_pmvie->AddRef(); pscrt->_iscenCur = LwMax(0, pscrt->_pmvie->Iscen()); pscrt->_iscenMac = pscrt->_pmvie->Cscen(); pscrt->_pstdio = pstdio; LFail: return pscrt; } /****************************************************************************** _ErrorExit Handle an error. Destroys the easel and enqueues our cancel cid. ************************************************************ PETED ***********/ void SCRT::_ErrorExit(void) { /* If someone's already reported an error, don't do any more work */ if (_fError) return; _fError = fTrue; /* Notify myself that we're exiting */ vpcex->EnqueueCid(cidSceneSortCancel, this); } /****************************************************************************** FCmdInit Initializes the Scene Sorter with the information about the easel in kidspace. Arguments: PCMD pcmd -- pointer to the CMD data. Extra params are as follows: rglw[0] -- kid of the first thumbnail frame GOK rglw[1] -- kid of the first scrollbar GOK button (scroll up) rglw[2] -- number of GOKs in a single frame Returns: fTrue if the command was handled by this routine. ************************************************************ PETED ***********/ bool SCRT::FCmdInit(PCMD pcmd) { AssertThis(0); bool fSuccess = fFalse; long kidCur, kidThumb; PGOK pgokFrame; /* If I'm already inited, this must be for some other scene sorter */ if (_fInited) return fFalse; _fInited = fTrue; vpapp->DisableAccel(); _kidFrameMin = pcmd->rglw[0]; _kidScbtnsMin = pcmd->rglw[1]; _cgokFrame = pcmd->rglw[2]; _cfrmPage = 0; kidThumb = _kidFrameMin - 1; kidCur = _kidFrameMin; while ((pgokFrame = (PGOK)vpapp->Pkwa()->PgobFromHid(kidCur)) != pvNil) { PGOMP pgomp; PGOB pgobThumb; Assert(pgokFrame->FIs(kclsGOK), "Frame GOB isn't a GOK"); pgobThumb = (PGOK)pgokFrame->PgobFirstChild(); Assert(pgobThumb != pvNil, "Frame has no children"); pgomp = GOMP::PgompNew(pgobThumb, kidThumb--); if (pgomp == pvNil) goto LFail; _cfrmPage++; kidCur += _cgokFrame; } _cfrmPage--; _iscenTop = (_iscenCur / _cfrmPage) * _cfrmPage; fSuccess = _FResetThumbnails(fFalse); LFail: if (!fSuccess) _ErrorExit(); return fTrue; } /****************************************************************************** FCmdSelect Selects the scene corresponding to the given thumbnail frame. Arguments: PCMD pcmd -- pointer to the CMD data. Extra params are as follows: rglw[0] -- the kid of the thumbnail frame Returns: fTrue if the command was handled by this routine. ************************************************************ PETED ***********/ bool SCRT::FCmdSelect(PCMD pcmd) { AssertThis(0); Assert(pcmd->rglw[0] - _kidFrameMin < _cfrmPage * _cgokFrame, "Bogus kid for select"); Assert(_iscenMac > 0, "Can't select scene in an empty movie"); long iscen; iscen = _IscenFromKid(pcmd->rglw[0]); if (iscen < _iscenMac) { _iscenCur = iscen; /* Fill in thumbnail for selection GOB */ if (_FResetThumbnails(fFalse)) _SetSelectionVis(fTrue); else _ErrorExit(); } return fTrue; } /****************************************************************************** FCmdInsert Inserts the currently selected scene before the scene that corresponds to the given thumbnail frame. If the given thumbnail frame is larger than the last visible thumbnail frame, the scene is inserted after the last scene visible on the easel. Arguments: PCMD pcmd -- pointer to the CMD data. Extra params are as follows: rglw[0] -- the kid of the frame to insert the scene before Returns: fTrue if the command was handled by this routine. ************************************************************ PETED ***********/ bool SCRT::FCmdInsert(PCMD pcmd) { AssertThis(0); Assert(pcmd->rglw[0] - _kidFrameMin <= _cfrmPage * _cgokFrame, "Bogus kid for insert"); long iscenTo = _IscenFromKid(pcmd->rglw[0]); if (iscenTo != _iscenCur) { AssertIn(iscenTo, 0, _iscenMac + 1); _cmvi.pglscend->Move(_iscenCur, iscenTo); if (iscenTo > _iscenCur) iscenTo--; _iscenCur = iscenTo; } /* Refill the thumbnails */ if (!_FResetThumbnails(fFalse)) _ErrorExit(); return fTrue; } /****************************************************************************** FCmdScroll Scrolls the thumbnails by the given number of frames. The sign of the number of frames indicates whether to scroll forward (positive) or backward (negative). Sets the selected frame to kstBrowserSelected if we're not drag & drop, or to kstBrowserScrollingSel if we are. Arguments: PCMD pcmd -- pointer to the CMD data. Extra params are as follows: rglw[0] -- the number of frames to scroll rglw[1] -- non-zero if we're scrolling during drag & drop Returns: fTrue if the command was handled by this routine. ************************************************************ PETED ***********/ bool SCRT::FCmdScroll(PCMD pcmd) { AssertThis(0); bool fHideSel = pcmd->rglw[1] != 0; long iscenT; iscenT = _iscenTop + pcmd->rglw[0]; if (FIn(iscenT, 0, _iscenMac) && _iscenTop != iscenT) { _SetSelectionVis(fFalse, fHideSel); _iscenTop = iscenT; } /* Refill the thumbnails */ if (!_FResetThumbnails(fHideSel)) _ErrorExit(); _SetSelectionVis(fTrue, fHideSel); return fTrue; } /****************************************************************************** _EnableScroll Enables or disables the scrolling buttons, as appropriate. ************************************************************ PETED ***********/ void SCRT::_EnableScroll(void) { PGOK pgok; /* Enable or disable scroll up */ pgok = (PGOK)vapp.Pkwa()->PgobFromHid(_kidScbtnsMin); if (pgok != pvNil) { long lwState; lwState = (_iscenTop > 0) ? kstBrowserEnabled : kstBrowserDisabled; Assert(pgok->FIs(kclsGOK), "Scroll up button is not a GOK"); if (pgok->Sno() != lwState) pgok->FChangeState(lwState); } else Bug("Can't find scroll up button"); /* Enable or disable scroll down */ pgok = (PGOK)vapp.Pkwa()->PgobFromHid(_kidScbtnsMin + 1); if (pgok != pvNil) { long lwState; lwState = (_iscenTop + _cfrmPage < _iscenMac) ? kstBrowserEnabled : kstBrowserDisabled; Assert(pgok->FIs(kclsGOK), "Scroll down button is not a GOK"); if (pgok->Sno() != lwState) pgok->FChangeState(lwState); } else Bug("Can't find scroll down button"); } /****************************************************************************** FCmdNuke Deletes the currently selected scene from the movie. Makes the following scene the currently selected scene, unless there is no such scene, in which case the scene immediately before the deleted scene is the new currently selected scene. Arguments: PCMD pcmd -- pointer to the CMD data. No additional parameters. Returns: fTrue if the command was handled by this routine. ************************************************************ PETED ***********/ bool SCRT::FCmdNuke(PCMD pcmd) { AssertThis(0); Assert(_iscenMac > 0, "Can't nuke a scene from an empty movie"); SCEND scend; _cmvi.pglscend->Get(_iscenCur, &scend); Assert(!scend.fNuked, "Nuking an already nuked scene"); scend.fNuked = fTrue; _cmvi.pglscend->Put(_iscenCur, &scend); _cmvi.pglscend->Move(_iscenCur, _cmvi.pglscend->IvMac()); _iscenMac--; if (_iscenMac > 0 && _iscenMac == _iscenCur) _iscenCur--; /* Refill the thumbnails */ if (!_FResetThumbnails(fFalse)) _ErrorExit(); return fTrue; } /****************************************************************************** FCmdDismiss Alerts the Scene Sorter that the easel is about to go away. If the easel was not cancelled, the changes made in the easel are applied to the movie. Arguments: PCMD pcmd -- pointer to the CMD data. Checks cid to determine ok/cancel Returns: fTrue if the command was handled by this routine. ************************************************************ PETED ***********/ bool SCRT::FCmdDismiss(PCMD pcmd) { AssertThis(0); PMVU pmvu; if (pcmd->cid == cidSceneSortOk) { vapp.BeginLongOp(); if (_pmvie->FSetCmvi(&_cmvi)) { if (_pmvie->Cscen() > 0 && _pmvie->Iscen() != _iscenCur) _pmvie->FSwitchScen(_iscenCur); } else _fError = fTrue; _pmvie->ClearUndo(); vapp.EndLongOp(); } /* Change to the tool for scenes */ pmvu = (PMVU)(_pmvie->PddgActive()); AssertPo(pmvu, 0); pmvu->SetTool(toolDefault); _pstdio->ChangeTool(toolDefault); /* Clean up the internal data structures */ _cmvi.Empty(); ReleasePpo(&_pmvie); Release(); return fTrue; } /****************************************************************************** FCmdPortfolio Brings up the portfolio so that the user can append movies from file. Arguments: PCMD pcmd -- pointer to the CMD data. No additional parameters. Returns: fTrue if the command was handled by this routine. ************************************************************ PETED ***********/ bool SCRT::FCmdPortfolio(PCMD pcmd) { AssertThis(0); FNI fni; MCC mcc(2, 2, 0); PMVIE pmvie = pvNil; if (!_pstdio->FGetFniMovieOpen(&fni)) goto LFail; /* Specific reasons for failures are reported by lower-level routines. There should be no reason to display an error here. */ pmvie = MVIE::PmvieNew(vpapp->FSlowCPU(), &mcc, &fni, cnoNil); if (pmvie == pvNil) goto LFail; if (!pmvie->FAddToCmvi(&_cmvi, &_iscenMac)) goto LFail; /* Refill the thumbnails */ if (!_FResetThumbnails(fFalse)) _ErrorExit(); LFail: ReleasePpo(&pmvie); return fTrue; } /****************************************************************************** FCmdTransition Sets the transition for the scene corresponding to the given frame. Arguments: PCMD pcmd -- pointer to command data. Extra parms are as follows: rglw[0] -- GOK id of the frame rglw[1] -- which transition to use Returns: fTrue if the command was handled by this routine ************************************************************ PETED ***********/ bool SCRT::FCmdTransition(PCMD pcmd) { AssertThis(0); Assert(_iscenMac > 0, "Can't set transition when movie is empty"); long iscen = _IscenFromKid(pcmd->rglw[0]); SCEND scend; PGOK pgokFrame = (PGOK)vapp.Pkwa()->PgobFromHid(pcmd->rglw[0]); if (pgokFrame == pvNil) { Bug("kid doesn't exist"); return fTrue; } Assert(pgokFrame->FIs(kclsGOK), "kid isn't a GOK"); AssertIn(iscen, 0, _iscenMac); _cmvi.pglscend->Get(iscen, &scend); scend.trans = _TransFromLw(pcmd->rglw[1] - 1); _cmvi.pglscend->Put(iscen, &scend); if (_FResetTransition(pgokFrame, scend.trans)) pgokFrame->InvalRc(pvNil); return fTrue; } /****************************************************************************** _SetSelectionVis Shows or hides the current selection. Arguments: bool fShow -- fTrue if we're to make the selection different from the other frames bool fHideSel -- fTrue if the selection state is hidden (actually, whatever "dragging" state the script defines) instead of the usual hilite. ************************************************************ PETED ***********/ void SCRT::_SetSelectionVis(bool fShow, bool fHideSel) { if (_iscenCur < _iscenMac && FIn(_iscenCur - _iscenTop, 0, _cfrmPage)) { PGOK pgok = (PGOK)vapp.Pkwa()->PgobFromHid(_KidFromIscen(_iscenCur)); if (pgok != pvNil) { long lwState; Assert(pgok->FIs(kclsGOK), "Didn't get a GOK GOB"); lwState = fShow ? (fHideSel ? kstBrowserScrollingSel : kstBrowserSelected) : kstBrowserEnabled; if (pgok->Sno() != lwState) pgok->FChangeState(lwState); } else Bug("Where's my frame to select?"); } } /****************************************************************************** _FResetThumbnails Refills the thumbnails for the scenes frames. If the thumbnail actually changed, force a redraw. Arguments: bool fHideSel -- fTrue if the current selection should be hidden rather than highlighted Returns: fTrue if it was successful in refilling the thumbnails ************************************************************ PETED ***********/ bool SCRT::_FResetThumbnails(bool fHideSel) { bool fSuccess = fFalse; long kidCur = _kidFrameMin - 1, kidFrameCur = _kidFrameMin; long iscen = _iscenTop, cFrame = _cfrmPage; long lwSelState = fHideSel ? kstBrowserScrollingSel : kstBrowserSelected; PGOK pgokFrame; PGOMP pgomp; SCEND scend; while (cFrame--) { bool fNewTransition; PMBMP pmbmp; RC rc; pgokFrame = (PGOK)vapp.Pkwa()->PgobFromHid(kidFrameCur); pgomp = GOMP::PgompFromHidScr(kidCur); if (pgokFrame == pvNil || pgomp == pvNil) { Bug("Couldn't find thumbnail or its frame"); goto LFail; } Assert(pgomp->FIs(kclsGOMP), "Thumbnail GOB isn't a GOMP"); Assert(pgokFrame->FIs(kclsGOK), "Frame GOB isn't a GOK"); if (iscen < _iscenMac) { long lwStateNew; _cmvi.pglscend->Get(iscen, &scend); pmbmp = scend.pmbmp; lwStateNew = (iscen == _iscenCur) ? lwSelState : kstBrowserEnabled; if (pgokFrame->Sno() != lwStateNew && !pgokFrame->FChangeState(lwStateNew)) { goto LFail; } fNewTransition = _FResetTransition(pgokFrame, scend.trans); iscen++; } else { pmbmp = pvNil; if (pgokFrame->Sno() != kstBrowserDisabled && !pgokFrame->FChangeState(kstBrowserDisabled)) { goto LFail; } fNewTransition = fFalse; } if (pgomp->FSetMbmp(pmbmp) || fNewTransition) pgokFrame->InvalRc(pvNil); kidCur--; kidFrameCur += _cgokFrame; } /* Fill in selection frame; do this outside of the above loop, since the selection is not always actually within the range of displayed scene frames. */ if (_iscenMac > 0) { _cmvi.pglscend->Get(_iscenCur, &scend); pgokFrame = (PGOK)vapp.Pkwa()->PgobFromHid(kidFrameCur); Assert(pgokFrame != pvNil, "Selection GOK is missing"); Assert(pgokFrame->FIs(kclsGOK), "Frame GOB isn't a GOK"); pgomp = GOMP::PgompFromHidScr(kidCur); Assert(pgomp != pvNil, "Selection GOMP is missing"); _FResetTransition(pgokFrame, scend.trans); pgomp->FSetMbmp(scend.pmbmp); } _EnableScroll(); fSuccess = fTrue; LFail: return fSuccess; } const TRANS SCRT::_mplwtrans[] = { transCut, transDissolve, transFadeToBlack, transFadeToWhite, }; #define kctrans (size(_mplwtrans) / size(_mplwtrans[0])) /****************************************************************************** _FResetTransition Updates the transition buttons for a given scene frame. Arguments: PGOK pgokPar -- the parent scene frame GOK TRANS trans -- the transition state for this scene Returns: fTrue if the scene has a new transition and the frame needs to be updated ************************************************************ PETED ***********/ bool SCRT::_FResetTransition(PGOK pgokPar, TRANS trans) { bool fRedrawTrans = fFalse; PGOK pgokTrans, pgokThumb; long lwTrans = kctrans, lwThis = _LwFromTrans(trans); long lwStateCur, lwStateNew; pgokThumb = (PGOK)pgokPar->PgobFirstChild(); Assert(pgokThumb->FIs(kclsGOK), "First child wasn't a GOK"); pgokTrans = (PGOK)pgokThumb->PgobNextSib(); Assert(pgokTrans->FIs(kclsGOK), "Transition GOB isn't a GOK"); while (lwTrans--) { lwStateCur = pgokTrans->Sno(); lwStateNew = (lwTrans != lwThis) ? kstDefault : kstSelected; if (lwStateCur != lwStateNew) { fRedrawTrans = fTrue; pgokTrans->FChangeState(lwStateNew); } pgokTrans = (PGOK)pgokTrans->PgobNextSib(); Assert(pgokTrans == pvNil || pgokTrans->FIs(kclsGOK), "Transition GOB isn't a GOK"); } return fRedrawTrans; } /****************************************************************************** _TransFromLw Map a long word to a transition Arguments: long lwTrans -- the scene sorter index of the transition Returns: the actual transition ************************************************************ PETED ***********/ TRANS SCRT::_TransFromLw(long lwTrans) { AssertIn(lwTrans, 0, kctrans); return _mplwtrans[lwTrans]; } /****************************************************************************** _LwFromTrans Map a transition to the scene sorter long word Arguments: TRANS trans -- the transition Returns: the scene sorter long ************************************************************ PETED ***********/ long SCRT::_LwFromTrans(TRANS trans) { long lw; for (lw = 0; lw < kctrans; lw++) if (_mplwtrans[lw] == trans) break; #ifdef DEBUG if (lw == kctrans) { Bug("Invalid trans"); lw = 0; } #endif /* DEBUG */ return lw; } RTCLASS(GOMP) #ifdef DEBUG void GOMP::AssertValid(ulong grf) { GOMP_PAR::AssertValid(0); AssertNilOrPo(_pmbmp, 0); } void GOMP::MarkMem(void) { AssertThis(0); GOMP_PAR::MarkMem(); MarkMemObj(_pmbmp); } #endif /* DEBUG */ /****************************************************************************** GOMP Constructor for the GOMP class. Arguments: PGCB pgcb -- Gob Creation Block to be passed to the parent class PMBMP pmbmp -- the MBMP to use when drawing this GOMP ************************************************************ PETED ***********/ GOMP::GOMP(PGCB pgcb) : GOB(pgcb) { _pmbmp = pvNil; AssertThis(0); } /****************************************************************************** PgompNew Creates a GOMP as a child of the given parent. The new GOMP will be exactly the same size as the parent, and will have the given hid. Arguments: PMBMP pmbmp -- the MBMP to draw as this GOMP PGOB pgobPar -- the parent of this GOMP long hid -- the hid (kid) of this GOMP Returns: pointer to the GOMP if it succeeds, pvNil otherwise ************************************************************ PETED ***********/ PGOMP GOMP::PgompNew(PGOB pgobPar, long hid) { AssertPo(pgobPar, 0); PGOMP pgomp = pvNil; GCB gcb; RC rcRel(0, 0, krelOne, krelOne); gcb.Set(hid, pgobPar, fgobNil, kginDefault, pvNil, &rcRel); pgomp = NewObj GOMP(&gcb); if (pgomp != pvNil && pgobPar->FIs(kclsGOK)) { PT pt; RC rcAbs; ((GOK *)pgobPar)->GetPtReg(&pt); pgomp->GetPos(&rcAbs, &rcRel); rcAbs.Offset(-pt.xp, -pt.yp); pgomp->SetPos(&rcAbs, &rcRel); } return pgomp; } /****************************************************************************** Draw Draws the given GOMP Arguments: PGNV pgnv -- the graphics environment in which to draw RC *prcClip -- the clipping rect; this is ignored ************************************************************ PETED ***********/ void GOMP::Draw(PGNV pgnv, RC *prcClip) { AssertThis(0); AssertPo(pgnv, 0); AssertVarMem(prcClip); RC rc; if (_pmbmp == pvNil) return; _pmbmp->GetRc(&rc); rc.OffsetToOrigin(); pgnv->DrawMbmp(_pmbmp, &rc); } /****************************************************************************** FSetMbmp Replaces the MBMP for this GOMP with the given MBMP. Arguments: PMBMP pmbmp -- pointer to the MBMP Returns: fTrue if the new MBMP is different from the old one ************************************************************ PETED ***********/ bool GOMP::FSetMbmp(PMBMP pmbmp) { AssertNilOrPo(pmbmp, 0); bool fRedraw = (_pmbmp != pmbmp); ReleasePpo(&_pmbmp); if (pmbmp != pvNil) pmbmp->AddRef(); _pmbmp = pmbmp; return fRedraw; } /****************************************************************************** PgompFromHidScr Given an HID, return the GOMP with that hid Arguments: long hid -- the hid of the GOMP to find Returns: pointer to the GOMP ************************************************************ PETED ***********/ PGOMP GOMP::PgompFromHidScr(long hid) { PGOMP pgomp; pgomp = (PGOMP)vapp.Pkwa()->PgobFromHid(hid); if (pgomp != pvNil) Assert(pgomp->FIs(kclsGOMP), "GOB isn't a GOMP"); return pgomp; } ================================================ FILE: src/studio/sectools.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*****************************************************************************\ * * sectools.cht * * All secondary tools that appear in the studio (i.e. behind the doors). * * Author: Sean Selitrennikoff * * Status: REVIEWED * \*****************************************************************************/ // // // The secondary tools bar doors. // // GOBCHUNK("Secondary tools - Closed", kidDoors, kgokkNormal) DEFAULT_POSITION(kxpDoors, kypDoors, 20) ACTION(fcustNil, fcustNil, fgrfstSceneDoorsOpen, kcrsHand, CHID(kstSceneDoorsOpen, kchidClick), cidNil, cnoNil) ACTION(fcustNil, fcustNil, fgrfstActorDoorsOpen, kcrsHand, CHID(kstActorDoorsOpen, kchidClick), cidNil, cnoNil) ACTION(fcustNil, fcustNil, fgrfstSoundDoorsOpen, kcrsHand, CHID(kstSoundDoorsOpen, kchidClick), cidNil, cnoNil) ACTION(fcustNil, fcustNil, fgrfstTextDoorsOpen, kcrsHand, CHID(kstTextDoorsOpen, kchidClick), cidNil, cnoNil) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\door0.bmp", kxpregDoors, kypregDoors) REP_MBMPREG(CHID(kstSceneDoorsAllOpen, krepDefault), "studio\bmp\door1.bmp", kxpregDoors, kypregDoors) REP_MBMPREG(CHID(kstActorDoorsAllOpen, krepDefault), "studio\bmp\door2.bmp", kxpregDoors, kypregDoors) REP_MBMPREG(CHID(kstSoundDoorsAllOpen, krepDefault), "studio\bmp\door3.bmp", kxpregDoors, kypregDoors) REP_MBMPREG(CHID(kstTextDoorsAllOpen, krepDefault), "studio\bmp\door4.bmp", kxpregDoors, kypregDoors) REP_MBMPREG(CHID(kstSceneDoorsOpen, krepDefault), "studio\bmp\door5.bmp", kxpregDoors, kypregDoors) REP_MBMPREG(CHID(kstActorDoorsOpen, krepDefault), "studio\bmp\door6.bmp", kxpregDoors, kypregDoors) REP_MBMPREG(CHID(kstSoundDoorsOpen, krepDefault), "studio\bmp\door7.bmp", kxpregDoors, kypregDoors) REP_MBMPREG(CHID(kstTextDoorsOpen, krepDefault), "studio\bmp\door8.bmp", kxpregDoors, kypregDoors) CREATE_ANIMST("Scene doors created", kstSceneDoorsOpen) If(kidBackground->fAllSceneDoors); ChangeStateThis(kstSceneDoorsAllOpen); End; ENDCHUNK CHILD_SCRIPT("Scene doors clicked", CHID(kstSceneDoorsOpen, kchidClick)) kidBackground->fAllSceneDoors = fTrue; ChangeStateThis(kstSceneDoorsAllOpen); ENDCHUNK CREATE_ANIMST("Actor doors created", kstActorDoorsOpen) If(kidBackground->fAllActorDoors); ChangeStateThis(kstActorDoorsAllOpen); End; ENDCHUNK CHILD_SCRIPT("Actor doors clicked", CHID(kstActorDoorsOpen, kchidClick)) kidBackground->fAllActorDoors = fTrue; ChangeStateThis(kstActorDoorsAllOpen); ENDCHUNK CREATE_ANIMST("Sound doors created", kstSoundDoorsOpen) If(kidBackground->fAllSoundDoors); ChangeStateThis(kstSoundDoorsAllOpen); End; ENDCHUNK CHILD_SCRIPT("Sound doors clicked", CHID(kstSoundDoorsOpen, kchidClick)) kidBackground->fAllSoundDoors = fTrue; ChangeStateThis(kstSoundDoorsAllOpen); ENDCHUNK CREATE_ANIMST("Text doors created", kstTextDoorsOpen) If(kidBackground->fAllTextDoors); ChangeStateThis(kstTextDoorsAllOpen); End; ENDCHUNK CHILD_SCRIPT("Text doors clicked", CHID(kstTextDoorsOpen, kchidClick)) kidBackground->fAllTextDoors = fTrue; ChangeStateThis(kstTextDoorsAllOpen); ENDCHUNK // // // Settings' secondary tools. // // GOBCHUNK("Secondary tools - Settings", kidSettingsBackground, kgokkRectHit) DEFAULT_POSITION(kxpSettingsBackground, kypSettingsBackground, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_MBMPREG(CHID(kst1, krepDefault), "studio\bmp\1par.bmp", kxpregSettingsBackground, kypregSettingsBackground) CREATE_SCRIPT("Secondary tools, Settings -- create") CreateChildThis(kidSettingsCameras, kidSettingsCameras); CreateChildThis(kidSceneSorter, kidSceneSorter); CreateChildThis(kidCCPSceneChopFwd, kidCCPSceneChopFwd); CreateChildThis(kidCCPSceneChopBack, kidCCPSceneChopBack); // // Initialize state variables and UI // If (kidBackground->idscnDown == kidCutCopyPaste); ChangeStateGob(kidCutCopyPaste, kstDefault); End; kidBackground->idscnDown = kidStudio; ENDCHUNK CHILD_SCRIPT("Reset tools", CHID1(kchidResetTools)) If (kidBackground->idscnDown != kidStudio); ChangeStateGob(kidBackground->idscnDown, kstDefault); kidBackground->idscnDown = kidStudio; End; ENDCHUNK // // Camera views button. Starts up the browser. // GOBCHUNK("Secondary tools - Cameras", kidSettingsCameras, kgokkRectHit) DEFAULT_POSITION(kxpSettingsCameras, kypSettingsCameras, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttSettingsCameras) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\1view.bmp", kxpregSettingsCameras, kypregSettingsCameras) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\1views.bmp", kxpregSettingsCameras, kypregSettingsCameras) CHILD_SCRIPT("Secondary tools - Cameras", CHID(kstDefault, kchidClick)) EnqueueCid(cidBrowserReady, khidStudio, kidBrwsCamera, kidBrowserFrame, kidBrowserPageFwd, (kdxpCameraFrameBorder << 16) | kdypCameraFrameBorder); ENDCHUNK // // Scene sorter. Starts up the easel. // GOBCHUNK("SceneSorter", kidSceneSorter, kgokkRectHit) DEFAULT_POSITION(kxpSceneSorter, kypSceneSorter, 0) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttSceneSorter) ENDCHUNK REP_MBMPREG(CHID1(krepDefault), "studio\bmp\1scen.bmp", kxpregSceneSorter, kypregSceneSorter) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\1scens.bmp", kxpregSceneSorter, kypregSceneSorter) CHILD_SCRIPT("Scene Sorter", CHID(kstDefault, kchidClick)) EnqueueCid(cidBrowserReady, khidStudio, kidSSorterBackground, 0, 0, (kdxpSSorterFrameBorder << 16) | kdypSSorterFrameBorder); ENDCHUNK // // Chop Forward // GOBCHUNK("Scene chop fwd", kidCCPSceneChopFwd, kgokkRectHit) DEFAULT_POSITION(kxpCCPSceneChopFwd, kypCCPSceneChopFwd, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttCCPSceneChopFwd) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\p3rmfw.bmp", kxpregCCPSceneChopFwd, kypregCCPSceneChopFwd) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\p3rmfwc.bmp", kxpregCCPSceneChopFwd, kypregCCPSceneChopFwd) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)); ADOPT_WAVE(kcnoSecToolWav, CHID(kstDefault, krepClicked)) ADOPT_WAVE(kcnoSecToolWav, CHID(kstSelected, krepClicked)) CHILD_SCRIPT("Chop Fwd - Mouse", CHID(kstDefault, kchidClick)) If (kidBackground->idscnDown != GidThis()); ChangeStateGob(kidBackground->idscnDown, kstDefault); kidBackground->idscnDown = GidThis(); End; ChangeStateThis(kstSelected); EnqueueCid(cidSetTool, khidStudio, chttSceneChopFwd, 0, 0, 0); ENDCHUNK // // Chop backwards // GOBCHUNK("Scene chop back", kidCCPSceneChopBack, kgokkRectHit) DEFAULT_POSITION(kxpCCPSceneChopBack, kypCCPSceneChopBack, 100) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttCCPSceneChopBack) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\p3rmbk.bmp", kxpregCCPSceneChopBack, kypregCCPSceneChopBack) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\p3rmbkc.bmp", kxpregCCPSceneChopBack, kypregCCPSceneChopBack) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)); ADOPT_WAVE(kcnoSecToolWav, CHID(kstDefault, krepClicked)) ADOPT_WAVE(kcnoSecToolWav, CHID(kstSelected, krepClicked)) CHILD_SCRIPT("Chop back - Mouse", CHID(kstDefault, kchidClick)) If (kidBackground->idscnDown != GidThis()); ChangeStateGob(kidBackground->idscnDown, kstDefault); kidBackground->idscnDown = GidThis(); End; ChangeStateThis(kstSelected); EnqueueCid(cidSetTool, khidStudio, chttSceneChopBack, 0, 0, 0); ENDCHUNK // // // Actors' secondary tools // // // // Background for all actor tools. kidBackground->idDown is used to // to create a radio group within the tools. See studio.cht for how // radio groups are done. // // kidBackground->fXYAxis holds state of XY vs XZ axis. // // kidBackground->fRGround holds state of Respect ground or not. // GOBCHUNK("Secondary tools - Actors", kidActorsBackground, kgokkRectHit) DEFAULT_POSITION(kxpActorsBackground, kypActorsBackground, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_MBMPREG(CHID(kst1, krepDefault), "studio\bmp\2par.bmp", kxpregActorsBackground, kypregActorsBackground) CREATE_SCRIPT("Secondary tools, Actors -- create") CreateChildThis(kidActorsCompose, kidActorsCompose); CreateChildThis(kidActorsCostume, kidActorsCostume); CreateChildThis(kidActorsActionBrowser, kidActorsActionBrowser); CreateChildThis(kidActorsContinue, kidActorsContinue); CreateChildThis(kidActorsRotate, kidActorsRotate); CreateChildThis(kidActorsSooner, kidActorsSooner); CreateChildThis(kidActorsTransform, kidActorsTransform); CreateChildThis(kidActorsXY, kidActorsXY); CreateChildThis(kidActorsGround, kidActorsGround); If( fBIO_FOUNDALL()); // create the bio page button if all bio's found. CreateChildThis(kidActorsBiography, kidActorsBiography); End; // // Initialize state variables and UI // If (kidBackground->idactDown == kidCutCopyPaste); ChangeStateGob(kidCutCopyPaste, kstDefault); End; kidBackground->idactDown = kidStudio; kidBackground->chttActor = chttNone; ChangeStateGob(kidActorsCompose, kstSelected); ENDCHUNK // // Biography button // GOBCHUNK("Secondary tools - Actor, Biography", kidActorsBiography, kgokkRectHit) DEFAULT_POSITION(kxpActorsBiography, kypActorsBiography, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttActorsBiography) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\2bio.bmp", kxpregActorsBiography, kypregActorsBiography) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\2bios.bmp", kxpregActorsBiography, kypregActorsBiography) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) ADOPT_WAVE(kcnoTBkOpenWav, CHID(kstDefault, krepClicked)) CHILD_SCRIPT("clicked bio page tool", CHID(kstDefault, kchidClick)) BIO_CREATEBOOK( BIO_GETPAGE(), fTrue, kidBackground ); ENDCHUNK // // Compose tool // GOBCHUNK("Secondary tools - Actor, Compose", kidActorsCompose, kgokkRectHit) DEFAULT_POSITION(kxpActorsCompose, kypActorsCompose, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttActorsCompose) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\2comp.bmp", kxpregActorsCompose, kypregActorsCompose) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\2comps.bmp", kxpregActorsCompose, kypregActorsCompose) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) ADOPT_WAVE(kcnoSecToolWav, CHID(kstDefault, krepMouseDnOn)) CHILD_SCRIPT("Compose", CHID(kstDefault, kchidClick)) If(kidBackground->idactDown != GidThis()); ChangeStateThis(kstSelected); End; ENDCHUNK CREATE_ANIMST("Compose", kstSelected) If(kidBackground->idactDown != GidThis()); EnqueueCid(cidSetTool, khidStudio, chttCompose, 0, 0, 0); ChangeStateGob(kidBackground->idactDown, kstDefault); kidBackground->idactDown = GidThis(); kidBackground->chttActor = chttCompose; End; ENDCHUNK // // Costume easel button. Loads kcrsor only. // GOBCHUNK("Secondary tools - Actor, Costume", kidActorsCostume, kgokkRectHit) DEFAULT_POSITION(kxpActorsCostume, kypActorsCostume, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttActorsCostume) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\2cost.bmp", kxpregActorsCostume, kypregActorsCostume) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\2costc.bmp", kxpregActorsCostume, kypregActorsCostume) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) ADOPT_WAVE(kcnoSecToolWav, CHID(kstDefault, krepMouseDnOn)) CHILD_SCRIPT("Secondary tools - Actor, Costume", CHID(kstDefault, kchidClick)) If(kidBackground->idactDown != GidThis()); EnqueueCid(cidSetTool, khidStudio, chttActorEasel, 0, 0, 0); ChangeStateGob(kidBackground->idactDown, kstDefault); ChangeStateThis(kstSelected); kidBackground->idactDown = GidThis(); kidBackground->chttActor = chttActorEasel; End; ENDCHUNK // // Button to load action tool. // GOBCHUNK("Secondary tools - Actor, Action", kidActorsActionBrowser, kgokkRectHit) DEFAULT_POSITION(kxpActorsActionBrowser, kypActorsActionBrowser, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttActorsActionBrowser) ENDCHUNK REP_MBMPREG(kcell1, "studio\bmp\2act01.bmp", kxpregActorsActionBrowser, kypregActorsActionBrowser) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) ADOPT_MBMP(LAST_MBMP, CHID(kstFreeze, krepDefault)) REP_MBMPREG(kcell2, "studio\bmp\2act02.bmp", kxpregActorsActionBrowser, kypregActorsActionBrowser) REP_MBMPREG(kcell3, "studio\bmp\2act03.bmp", kxpregActorsActionBrowser, kypregActorsActionBrowser) REP_MBMPREG(kcell4, "studio\bmp\2act04.bmp", kxpregActorsActionBrowser, kypregActorsActionBrowser) REP_MBMPREG(kcell5, "studio\bmp\2act05.bmp", kxpregActorsActionBrowser, kypregActorsActionBrowser) REP_MBMPREG(kcell6, "studio\bmp\2act06.bmp", kxpregActorsActionBrowser, kypregActorsActionBrowser) REP_ANIM(CHID(kstDefault, krepDefault), "Actors, Action browser - Unselected state") cell = 0; While(); Cell(kcell1 + cell, 0, 0, 10 ); cell++; cell = cell % 6; End; ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\2acts.bmp", kxpregActorsActionBrowser, kypregActorsActionBrowser) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) ADOPT_WAVE(kcnoSecToolWav, CHID(kstDefault, krepMouseDnOn)) CREATE_SCRIPTST("Action tool", kstSelected) If(kidBackground->idactDown != GidThis()); ChangeStateGob(kidBackground->idactDown, kstDefault); kidBackground->idactDown = GidThis(); End; ENDCHUNK CHILD_SCRIPT("Secondary tools - Action tool", CHID(kstDefault, kchidClick)) kidBackground->chttActor = chttAction; EnqueueCid(cidSetTool, khidStudio, chttAction, kidBrowserFrame, kidBrowserPageFwd, (kdxpActionFrameBorder << 16) | kdypActionFrameBorder); If(kidBackground->idactDown != GidThis()); ChangeStateThis(kstSelected); End; ENDCHUNK // // Action record same action button. // GOBCHUNK("Secondary tools - Actor, Continue", kidActorsContinue, kgokkRectHit) DEFAULT_POSITION(kxpActorsContinue, kypActorsContinue, 10) ACTION(fcustNil, fcustNil, fgrfstDefault, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttActorsContinue) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, chidNil, cidNil, kttActorsContinue) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\2cont.bmp", kxpregActorsContinue, kypregActorsContinue) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\2conts.bmp", kxpregActorsContinue, kypregActorsContinue) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) ADOPT_WAVE(kcnoSecToolWav, CHID(kstDefault, krepMouseDnOn)) CREATE_SCRIPTST("Continue, Selected", kstSelected) If(kidBackground->idactDown != GidThis()); ChangeStateGob(kidBackground->idactDown, kstDefault); kidBackground->idactDown = GidThis(); End; ENDCHUNK CHILD_SCRIPT("Continue", CHID(kstDefault, kchidClick)) If(kidBackground->idactDown != GidThis()); kidBackground->chttActor = chttRecordSameAction; EnqueueCid(cidSetTool, khidStudio, chttRecordSameAction, 0, 0, 0); ChangeStateThis(kstSelected); End; ENDCHUNK // // Sooner/later button // GOBCHUNK("Secondary tools - Actor, Sooner", kidActorsSooner, kgokkRectHit) DEFAULT_POSITION(kxpActorsSooner, kypActorsSooner, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttActorsSooner) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\2soon.bmp", kxpregActorsSooner, kypregActorsSooner) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\2soons.bmp", kxpregActorsSooner, kypregActorsSooner) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) ADOPT_WAVE(kcnoSecToolWav, CHID(kstDefault, krepMouseDnOn)) CHILD_SCRIPT("Sooner/Later", CHID(kstDefault, kchidClick)) If(kidBackground->idactDown != GidThis()); EnqueueCid(cidSetTool, khidStudio, chttSooner, 0, 0, 0); ChangeStateGob(kidBackground->idactDown, kstDefault); ChangeStateThis(kstSelected); kidBackground->idactDown = GidThis(); kidBackground->chttActor = chttSooner; End; ENDCHUNK // // Rotate button. Starts popup. // GOBCHUNK("Rotate", kidActorsRotate, kgokkRectHit) DEFAULT_POSITION(kxpActorsRotate, kypActorsRotate, 0) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttActorsRotate) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\2rot.bmp", kxpregActorsRotate, kypregActorsRotate) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\2rots.bmp", kxpregActorsRotate, kypregActorsRotate) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CHILD_SCRIPT("Rotate", CHID(kstDefault, kchidClick)) ChangeStateThis(kstSelected); ChangeStateGob(kidRotateBackground, kstOpen); ENDCHUNK CREATE_ANIMST("Rotate - deselecting", kstDefault) ChangeStateGob(kidActorsRotateX, kstDefault); ChangeStateGob(kidActorsRotateY, kstDefault); ChangeStateGob(kidActorsRotateZ, kstDefault); ChangeStateGob(kidActorsRotateNorm, kstDefault); ENDCHUNK CREATE_ANIMST("Rotate - selecting", kstSelected) If (kidBackground->chttActor == chttRotateX); ChangeStateGob(kidActorsRotateX, kstSelected); Elif (kidBackground->chttActor == chttRotateY); ChangeStateGob(kidActorsRotateY, kstSelected); Elif (kidBackground->chttActor == chttRotateZ); ChangeStateGob(kidActorsRotateZ, kstSelected); Elif (kidBackground->chttActor == chttRotateNorm); ChangeStateGob(kidActorsRotateNorm, kstSelected); End; ENDCHUNK // // Transform (squash/stretch). Starts popup. // GOBCHUNK("Transform", kidActorsTransform, kgokkRectHit) DEFAULT_POSITION(kxpActorsTransform, kypActorsTransform, 0) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttActorsTransform) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\2tran.bmp", kxpregActorsTransform, kypregActorsTransform) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\2trans.bmp", kxpregActorsTransform, kypregActorsTransform) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CHILD_SCRIPT("Transform", CHID(kstDefault, kchidClick)) ChangeStateThis(kstSelected); If (StateGob(kidTransformBackground) != kstOpen); ChangeStateGob(kidTransformBackground, kstOpen); End; ENDCHUNK CREATE_ANIMST("Transform - deselecting", kstDefault) ChangeStateGob(kidActorsSquash, kstDefault); ChangeStateGob(kidActorsShrink, kstDefault); ChangeStateGob(kidActorsTransformNorm, kstDefault); ENDCHUNK CREATE_ANIMST("Rotate - selecting", kstSelected) If (kidBackground->chttActor == chttSquash); ChangeStateGob(kidActorsSquash, kstSelected); Elif (kidBackground->chttActor == chttShrink); ChangeStateGob(kidActorsShrink, kstSelected); Elif (kidBackground->chttActor == chttTransformNorm); ChangeStateGob(kidActorsTransformNorm, kstSelected); End; ENDCHUNK // // XY/XZ toggle button // GOBCHUNK("Secondary tools - Actor, XY", kidActorsXY, kgokkRectHit) DEFAULT_POSITION(kxpActorsXY, kypActorsXY, 10) ACTION(fcustNil, fcustNil, fgrfstClosed, kcrsHand, CHID(kstClosed, kchidClick), cidNil, kttActorsXY) ACTION(fcustNil, fcustNil, fgrfstOpen, kcrsHand, CHID(kstOpen, kchidClick), cidNil, kttActorsXY) ENDCHUNK REP_RECT(CHID(kstDefault, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstClosed, krepDefault), "studio\bmp\2xy.bmp", kxpregActorsXY, kypregActorsXY) ADOPT_MBMP(LAST_MBMP, CHID(kstClosed, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstClosed, krepMouseDnOff)) ADOPT_MBMP(LAST_MBMP, CHID(kstOpen, krepMouseDnOn)) REP_MBMPREG(CHID(kstClosed, krepMouseDnOn), "studio\bmp\2xys.bmp", kxpregActorsXY, kypregActorsXY) ADOPT_MBMP(LAST_MBMP, CHID(kstOpen, krepDefault)) ADOPT_MBMP(LAST_MBMP, CHID(kstOpen, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstOpen, krepMouseDnOff)) CREATE_SCRIPT("XY -- Create") If(kidBackground->fXYAxis); ChangeStateThis(kstOpen); Else; ChangeStateThis(kstClosed); End; ENDCHUNK CREATE_ANIMST("XZ", kstClosed) EnqueueCid(cidXZAxis, khidStudio, 0, 0, 0, 0); kidBackground->fXYAxis = fFalse; ENDCHUNK CHILD_SCRIPT("XZ", CHID(kstClosed, kchidClick)) ChangeStateThis(kstOpen); PlaySoundThis(kctgWave, kcnoStateOnWav, 0, 0x10000, 1, 0, 1); ENDCHUNK CREATE_ANIMST("XY", kstOpen) EnqueueCid(cidXYAxis, khidStudio, 0, 0, 0, 0); kidBackground->fXYAxis = fTrue; ENDCHUNK CHILD_SCRIPT("XY", CHID(kstOpen, kchidClick)) ChangeStateThis(kstClosed); PlaySoundThis(kctgWave, kcnoStateOffWav, 0, 0x10000, 1, 0, 1); ENDCHUNK // // Respect ground toggle button. // GOBCHUNK("Secondary tools - Actor, Ground", kidActorsGround, kgokkRectHit) DEFAULT_POSITION(kxpActorsGround, kypActorsGround, 10) ACTION(fcustNil, fcustNil, fgrfstClosed, kcrsHand, CHID(kstClosed, kchidClick), cidNil, kttActorsGround) ACTION(fcustNil, fcustNil, fgrfstOpen, kcrsHand, CHID(kstOpen, kchidClick), cidNil, kttActorsGround) ENDCHUNK REP_RECT(CHID(kstDefault, krepDefault ), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstClosed, krepDefault), "studio\bmp\2zero.bmp", kxpregActorsGround, kypregActorsGround) ADOPT_MBMP(LAST_MBMP, CHID(kstClosed, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstClosed, krepMouseDnOff)) ADOPT_MBMP(LAST_MBMP, CHID(kstOpen, krepMouseDnOn)) REP_MBMPREG(CHID(kstClosed, krepMouseDnOn), "studio\bmp\2zeros.bmp", kxpregActorsGround, kypregActorsGround) ADOPT_MBMP(LAST_MBMP, CHID(kstOpen, krepDefault)) ADOPT_MBMP(LAST_MBMP, CHID(kstOpen, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstOpen, krepMouseDnOff)) ADOPT_WAVE(kcnoStateOnWav, CHID(kstClosed, krepClicked)) ADOPT_WAVE(kcnoStateOffWav, CHID(kstOpen, krepClicked)) CREATE_SCRIPT("Ground -- Create") If(kidBackground->fRGround); ChangeStateThis(kstClosed); Else; ChangeStateThis(kstOpen); End; ENDCHUNK CREATE_ANIMST("Ground", kstClosed) EnqueueCid(cidRespectGround, khidStudio, fTrue, 0, 0, 0); kidBackground->fRGround = fTrue; ENDCHUNK CHILD_SCRIPT("Ground", CHID(kstClosed, kchidClick)) ChangeStateThis(kstOpen); ENDCHUNK CREATE_ANIMST("Ground", kstOpen) EnqueueCid(cidRespectGround, khidStudio, fFalse, 0, 0, 0); kidBackground->fRGround = fFalse; ENDCHUNK CHILD_SCRIPT("Ground", CHID(kstOpen, kchidClick)) ChangeStateThis(kstClosed); ENDCHUNK // // Sooner/later buttons. These get created after the sooner/later // tool has been applied to an actor. // #define klwSLDelayMax 24 #define klwSLDelayMin 12 #define kdlwSLDelay 3 // // Sooner button. // GOBCHUNK("Secondary tools - Sooner/Later", kidActorsSoonerButton, kgokkRectHit) DEFAULT_POSITION(kxpActorsSoonerButton, kypActorsSoonerButton, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstOpen, krepMouseDnOn), cidNil, kttActorsSoonerButton) ENDCHUNK REP_RECT(CHID(kstDefault, krepDefault), "hidden", 0, 0, 0, 0) REP_RECT(CHID(kstClosed, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstOpen, krepDefault), "studio\bmp\2sbtn.bmp", kxpregActorsSoonerButton, kypregActorsSoonerButton) ADOPT_MBMP(LAST_MBMP, CHID(kstOpen, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstOpen, krepMouseDnOff)) REP_MBMPREG(CHID(kstOpen, krepMouseDnOn), "studio\bmp\2sbtns.bmp", kxpregActorsSoonerButton, kypregActorsSoonerButton) REP_ANIM(CHID(kstOpen, krepMouseDnOn), "Pressed") // // While pressed, keep soonering the actor -- speeds up longer it is held // lwDelay = klwSLDelayMax; While(); PlaySoundThis(kctgWave, kcnoSyStepFWav, 0, 0x10000, 1, 0, 1); EnqueueCid(cidSooner, 0, 0, 0, 0, 0); Cell(CHID(kstOpen, krepMouseDnOn), 0, 0, lwDelay); If(lwDelay > lwSLDelayMin); lwDelay -= kdlwSLDelay; End; End; ENDCHUNK CREATE_ANIMST("Secondary tools - Actors, Sooner button", kstOpen) FilterCmdsThis(cidMouseDown, hidNil, kchidClick); ENDCHUNK CREATE_ANIMST("Secondary tools - Actors, Sooner button", kstClosed) FilterCmdsThis(cidMouseDown, hidNil, chidNil); ENDCHUNK CHILD_SCRIPT("Secondary tools - Actors, Sooner button, track mouse", kchidClick) kid = _parm[0]; // // We cannot filter on ourselves, so don't check that one. // If(kid != kidActorsLaterButton); // // Change to the select tool -- this must be the same sequence as // above in the select tool's click script. Note: we eat this // mouse down and insert our own so that the setTool happens before // the mouse down. // ChangeStateGob(kidActorsSooner, kstDefault); ChangeStateGob(kidActorsCompose, kstSelected); kidBackground->idactDown = kidActorsCompose; kidBackground->chttActor = chttCompose; EnqueueCid(cidSetTool, khidStudio, chttCompose, 0, 0, 0); EnqueueCid(cidMouseDown, kid, _parm[2], _parm[3], _parm[4], _parm[5]); Return(fTrue); End; ENDCHUNK // // Later button // GOBCHUNK("Secondary tools - Sooner/Later", kidActorsLaterButton, kgokkRectHit) DEFAULT_POSITION(kxpActorsLaterButton, kypActorsLaterButton, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstOpen, kchidClick), cidNil, kttActorsLaterButton) ENDCHUNK REP_RECT(CHID(kstDefault, krepDefault), "hidden", 0, 0, 0, 0) REP_RECT(CHID(kstClosed, krepDefault), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstOpen, krepDefault), "studio\bmp\2lbtn.bmp", kxpregActorsLaterButton, kypregActorsLaterButton) ADOPT_MBMP(LAST_MBMP, CHID(kstOpen, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstOpen, krepMouseDnOff)) REP_MBMPREG(CHID(kstOpen, krepMouseDnOn), "studio\bmp\2lbtns.bmp", kxpregActorsLaterButton, kypregActorsLaterButton) REP_ANIM(CHID(kstOpen, krepMouseDnOn), "Pressed") // // While pressed, later the actor // lwDelay = klwSLDelayMax; While(); PlaySoundThis(kctgWave, kcnoSyStepFWav, 0, 0x10000, 1, 0, 1); EnqueueCid(cidLater, 0, 0, 0, 0, 0); Cell(CHID(kstOpen, krepMouseDnOn), 0, 0, lwDelay); If(lwDelay > lwSLDelayMin); lwDelay -= kdlwSLDelay; End; End; ENDCHUNK // // // Sounds' secondary tools // // // // Background // GOBCHUNK("Secondary tools - Sounds", kidSoundsBackground, kgokkRectHit) DEFAULT_POSITION(kxpSoundsBackground, kypSoundsBackground, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_MBMPREG(CHID(kst1, krepDefault), "studio\bmp\3par.bmp", kxpregSoundsBackground, kypregSoundsBackground) CREATE_SCRIPT("Secondary tools, Sounds -- create") CreateChildThis(kidSoundsPlayOnce, kidSoundsPlayOnce); CreateChildThis(kidSoundsListen, kidSoundsListen); CreateChildThis(kidSoundsRecord, kidSoundsRecord); CreateChildThis(kidSoundsLooping, kidSoundsLooping); CreateChildThis(kidSoundsAttachToCell, kidSoundsAttachToCell); CreateChildThis(kidPausesSound, kidPausesSound); // // Initialize state variables, current sound tool and UI // If (kidBackground->idsndDown == kidCutCopyPaste); ChangeStateGob(kidCutCopyPaste, kstDefault); End; kidBackground->idsndDown = kidSoundsListen; EnqueueCid(cidSetTool, khidStudio, chttListener, 0, 0, 0); ChangeStateGob(kidSoundsListen, kstSelected); ENDCHUNK // // Play once button // GOBCHUNK("Secondary tools - Sound, PlayOnce", kidSoundsPlayOnce, kgokkRectHit) DEFAULT_POSITION(kxpSoundsPlayOnce, kypSoundsPlayOnce, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttSoundsPlayOnce) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\3sing.bmp", kxpregSoundsPlayOnce, kypregSoundsPlayOnce) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\3sings.bmp", kxpregSoundsPlayOnce, kypregSoundsPlayOnce) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) ADOPT_WAVE(kcnoSecToolWav, CHID(kstDefault, krepMouseDnOn)) CHILD_SCRIPT("Sound, PlayOnce clicked", CHID(kstDefault, kchidClick)) If(kidBackground->idsndDown != GidThis()); ChangeStateThis(kstSelected); End; ENDCHUNK CREATE_ANIMST("Sound, PlayOnce selected", kstSelected) If(kidBackground->idsndDown != GidThis()); ChangeStateGob(kidBackground->idsndDown, kstDefault); kidBackground->idsndDown = GidThis(); EnqueueCid(cidSetTool, khidStudio, chttSounder, 0, 0, 0); End; ENDCHUNK // // Listen button // GOBCHUNK("Secondary tools - Sound, Listen", kidSoundsListen, kgokkRectHit) DEFAULT_POSITION(kxpSoundsListen, kypSoundsListen, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttSoundsListen) ENDCHUNK REP_MBMPREG(CHID(kst1, krepDefault), "studio\bmp\3ear.bmp", kxpregSoundsListen, kypregSoundsListen) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\3ears.bmp", kxpregSoundsListen, kypregSoundsListen) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) ADOPT_WAVE(kcnoSecToolWav, CHID(kstDefault, krepMouseDnOn)) CHILD_SCRIPT("Sounds Listener - click", CHID(kstDefault, kchidClick)) If(kidBackground->idsndDown != GidThis()); ChangeStateThis(kstSelected); End; ENDCHUNK CREATE_ANIMST("Sounds Listener - selected", kstSelected) If(kidBackground->idsndDown != GidThis()); ChangeStateGob(kidBackground->idsndDown, kstDefault); kidBackground->idsndDown = GidThis(); EnqueueCid(cidSetTool, khidStudio, chttListener, 0, 0, 0); End; ENDCHUNK // // Looping button // GOBCHUNK("Secondary tools - Sound, Looping", kidSoundsLooping, kgokkRectHit) DEFAULT_POSITION(kxpSoundsLooping, kypSoundsLooping, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttSoundsLooping) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\3loop.bmp", kxpregSoundsLooping, kypregSoundsLooping) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\3loops.bmp", kxpregSoundsLooping, kypregSoundsLooping) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) ADOPT_WAVE(kcnoSecToolWav, CHID(kstDefault, krepMouseDnOn)) CHILD_SCRIPT("Sound, Looping clicked", CHID(kstDefault, kchidClick)) If(kidBackground->idsndDown != GidThis()); ChangeStateThis(kstSelected); End; ENDCHUNK CREATE_ANIMST("Sound, Looping selected", kstSelected) If(kidBackground->idsndDown != GidThis()); ChangeStateGob(kidBackground->idsndDown, kstDefault); kidBackground->idsndDown = GidThis(); EnqueueCid(cidSetTool, khidStudio, chttLooper, 0, 0, 0); End; ENDCHUNK // // Attach a sound to a specific cell button // GOBCHUNK("Secondary tools - Sound, AttachToCell", kidSoundsAttachToCell, kgokkRectHit) DEFAULT_POSITION(kxpSoundsAttachToCell, kypSoundsAttachToCell, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttSoundsAttachToCell) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\3rpt.bmp", kxpregSoundsAttachToCell, kypregSoundsAttachToCell) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\3rpts.bmp", kxpregSoundsAttachToCell, kypregSoundsAttachToCell) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) ADOPT_WAVE(kcnoSecToolWav, CHID(kstDefault, krepMouseDnOn)) CHILD_SCRIPT("Sound, AttachToCell clicked", CHID(kstDefault, kchidClick)) If(kidBackground->idsndDown != GidThis()); ChangeStateThis(kstSelected); End; ENDCHUNK CREATE_ANIMST("Sound, AttachToCell selected", kstSelected) If(kidBackground->idsndDown != GidThis()); ChangeStateGob(kidBackground->idsndDown, kstDefault); kidBackground->idsndDown = GidThis(); EnqueueCid(cidSetTool, khidStudio, chttMatcher, 0, 0, 0); End; ENDCHUNK // // Pause until sounds end button // GOBCHUNK("Pauses - Sound", kidPausesSound, kgokkRectHit) DEFAULT_POSITION(kxpPausesSound, kypPausesSound, 100) ACTION(fcustNil, fcustNil, fgrfstClosed, kcrsHand, CHID(kstClosed, kchidClick), cidNil, kttPausesSound) ACTION(fcustNil, fcustNil, fgrfstOpen, kcrsHand, CHID(kstOpen, kchidClick), cidNil, kttPausesSound) ENDCHUNK REP_RECT(CHID(kstDefault, krepDefault ), "hidden", 0, 0, 0, 0) REP_MBMPREG(CHID(kstClosed, krepDefault), "studio\bmp\1note.bmp", kxpregPausesSound, kypregPausesSound) ADOPT_MBMP(LAST_MBMP, CHID(kstClosed, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstClosed, krepMouseDnOff)) ADOPT_MBMP(LAST_MBMP, CHID(kstOpen, krepMouseDnOn)) REP_MBMPREG(CHID(kstClosed, krepMouseDnOn), "studio\bmp\1notes.bmp", kxpregPausesSound, kypregPausesSound) ADOPT_MBMP(LAST_MBMP, CHID(kstOpen, krepDefault)) ADOPT_MBMP(LAST_MBMP, CHID(kstOpen, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstOpen, krepMouseDnOff)) ADOPT_WAVE(kcnoRSwitchWav, CHID(kstClosed, krepClicked)) ADOPT_WAVE(kcnoRSwitchWav, CHID(kstOpen, krepClicked)) CREATE_ANIMST("Pause, sound", kstDefault) If(kidBackground->fpseDown); ChangeStateThis(kstOpen); Else; ChangeStateThis(kstClosed); End; ENDCHUNK CHILD_SCRIPT("Pauses - Sound", CHID(kstClosed, kchidClick)) EnqueueCid(cidPauseForSound, khidStudio, 0, 0, 0, 0); ChangeStateThis(kstOpen); ENDCHUNK CREATE_ANIMST("Pause, sound", kstClosed) kidBackground->fpseDown = fFalse; ENDCHUNK CHILD_SCRIPT("Pauses - Sound", CHID(kstOpen, kchidClick)) EnqueueCid(cidClearPause, khidStudio, 0, 0, 0, 0); ChangeStateThis(kstClosed); ENDCHUNK CREATE_ANIMST("Pause, sound", kstOpen) kidBackground->fpseDown = fTrue; ENDCHUNK // // // Texts' secondary tools // // // // Background. kidTextsBackground->tbxt stores the type of text box // that is currently selected. // GOBCHUNK("Secondary tools - Texts", kidTextsBackground, kgokkRectHit) DEFAULT_POSITION(kxpTextsBackground, kypTextsBackground, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_MBMPREG(CHID(kst1, krepDefault), "studio\bmp\4par.bmp", kxpregTextsBackground, kypregTextsBackground) CREATE_SCRIPT("Secondary tools, Texts -- create") CreateChildThis(kidTextsBkgdColor, kidTextsBkgdColor); CreateChildThis(kidTextsFontShape, kidTextsFontShape); CreateChildThis(kidTextsFontColor, kidTextsFontColor); CreateChildThis(kidTextsFont, kidTextsFont); CreateChildThis(kidTextsSelect, kidTextsSelect); CreateChildThis(kidTextsFontSize, kidTextsFontSize); CreateChildThis(kidTextsScrollType, kidTextsScrollType); .tbxt = ktbxtStory; ChangeStateGob(kidTextsSelect, kstSelected); ENDCHUNK // // Background color popup. Starts the popup. // GOBCHUNK("Secondary tools - Text, Bkgd Color", kidTextsBkgdColor, kgokkRectHit) DEFAULT_POSITION(kxpTextsBkgdColor, kypTextsBkgdColor, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttTextsBkgdColor) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\4back.bmp", kxpregTextsBkgdColor, kypregTextsBkgdColor) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\4backs.bmp", kxpregTextsBkgdColor, kypregTextsBkgdColor) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CLICK_SCRIPT("Background color clicked") If(kidBackground->idtbxDown != GidThis()); ChangeStateThis(kstSelected); End; EnqueueCid(cidTextBkgdColor, 0, 0, kidTextBkgdColorFrame, kidTextBkgdColorPageDown, (kdxpTextBkgdColorFrameBorder << 16) | kdypTextBkgdColorFrameBorder); ENDCHUNK // // Font shaper popup. Starts the popup. // GOBCHUNK("Secondary tools - Text, Font shape", kidTextsFontShape, kgokkRectHit) DEFAULT_POSITION(kxpTextsFontShape, kypTextsFontShape, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttTextsFontShape) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\4bold.bmp", kxpregTextsFontShape, kypregTextsFontShape) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\4bolds.bmp", kxpregTextsFontShape, kypregTextsFontShape) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CLICK_SCRIPT("Font shape clicked") If(kidBackground->idtbxDown != GidThis()); ChangeStateThis(kstSelected); End; EnqueueCid(cidTextStyle, 0, 0, kidTextStyleFrame, kidTextStylePageDown, (kdxpTextStyleFrameBorder << 16) | kdypTextStyleFrameBorder); ENDCHUNK // // Font color popup. Starts the popup. // GOBCHUNK("Secondary tools - Text, Font Color", kidTextsFontColor, kgokkRectHit) DEFAULT_POSITION(kxpTextsFontColor, kypTextsFontColor, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttTextsFontColor) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\4colr.bmp", kxpregTextsFontColor, kypregTextsFontColor) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\4colrs.bmp", kxpregTextsFontColor, kypregTextsFontColor) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CLICK_SCRIPT("Font color clicked") If(kidBackground->idtbxDown != GidThis()); ChangeStateThis(kstSelected); End; EnqueueCid(cidTextColor, 0, 0, kidTextColorFrame, kidTextColorPageDown, (kdxpTextColorFrameBorder << 16) | kdypTextColorFrameBorder); ENDCHUNK // // Font popup. Starts the popup. // GOBCHUNK("Secondary tools - Text, Font", kidTextsFont, kgokkRectHit) DEFAULT_POSITION(kxpTextsFont, kypTextsFont, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttTextsFont) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\4font.bmp", kxpregTextsFont, kypregTextsFont) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\4fonts.bmp", kxpregTextsFont, kypregTextsFont) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CLICK_SCRIPT("Font clicked") If(kidBackground->idtbxDown != GidThis()); ChangeStateThis(kstSelected); End; EnqueueCid(cidTextFont, 0, 0, kidTextFontFrame, kidTextFontPageDown, (kdxpTextFontFrameBorder << 16) | kdypTextFontFrameBorder); ENDCHUNK // // Font size popup. Starts the popup. // GOBCHUNK("Secondary tools - Text, FontSize", kidTextsFontSize, kgokkRectHit) DEFAULT_POSITION(kxpTextsFontSize, kypTextsFontSize, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttTextsFontSize) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\4size.bmp", kxpregTextsFontSize, kypregTextsFontSize) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\4sizes.bmp", kxpregTextsFontSize, kypregTextsFontSize) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CLICK_SCRIPT("Size clicked") If(kidBackground->idtbxDown != GidThis()); ChangeStateThis(kstSelected); End; EnqueueCid(cidTextSize, 0, 0, kidTextSizeFrame, kidTextSizePageDown, (kdxpTextSizeFrameBorder << 16) | kdypTextSizeFrameBorder); ENDCHUNK // // Select/Edit tool. // GOBCHUNK("Secondary tools - Text, Select", kidTextsSelect, kgokkRectHit) DEFAULT_POSITION(kxpTextsSelect, kypTextsSelect, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttTextsSelect) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\4ins.bmp", kxpregTextsSelect, kypregTextsSelect) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\4inss.bmp", kxpregTextsSelect, kypregTextsSelect) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) ADOPT_WAVE(kcnoSecToolWav, CHID(kstDefault, krepMouseDnOn)) CREATE_ANIMST("Select Textbox, Selected", kstSelected) If(kidBackground->idtbxDown != GidThis()); ChangeStateGob(kidBackground->idtbxDown, kstDefault); kidBackground->chttTbox = chttTboxSelect; kidBackground->idtbxDown = GidThis(); EnqueueCid(cidSetTool, khidStudio, chttTboxSelect, 0, 0, 0); End; ENDCHUNK CHILD_SCRIPT("Select Textbox", CHID(kstDefault, kchidClick)) If(kidBackground->idtbxDown != GidThis()); ChangeStateThis(kstSelected); End; ENDCHUNK // // Text box type popup. Starts the popup. // GOBCHUNK("Scroll Type", kidTextsScrollType, kgokkRectHit) DEFAULT_POSITION(kxpTextsScrollType, kypTextsScrollType, 0) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttTextsScrollType) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\4scrl.bmp", kxpregTextsScrollType, kypregTextsScrollType) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\4scrls.bmp", kxpregTextsScrollType, kypregTextsScrollType) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CHILD_SCRIPT("Scroll Type", CHID(kstDefault, kchidClick)) ChangeStateGob(kidScrollBackground, kstOpen); ENDCHUNK CREATE_ANIMST("Scroll Type - deselecting", kstDefault) If (kidBackground->chttTbox == chttTboxScroll); ChangeStateGob(kidTextsScroll, kstDefault); Elif (kidBackground->chttTbox == chttTboxStory); ChangeStateGob(kidTextsStory, kstDefault); End; ENDCHUNK CREATE_ANIMST("Scroll type - selecting", kstSelected) If (kidBackground->chttTbox == chttTboxScroll); ChangeStateGob(kidTextsScroll, kstSelected); Elif (kidBackground->chttTbox == chttTboxStory); ChangeStateGob(kidTextsStory, kstSelected); End; ENDCHUNK ================================================ FILE: src/studio/splot.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** splot.cpp: Splot machine class Primary Author: ****** Review Status: Reviewed ***************************************************************************/ #include "studio.h" ASSERTNAME RTCLASS(SPLOT) BEGIN_CMD_MAP(SPLOT, GOK) ON_CID_GEN(cidSplotInit, &SPLOT::FCmdInit, pvNil) ON_CID_GEN(cidSplotDo, &SPLOT::FCmdSplot, pvNil) ON_CID_GEN(cidSplotUpdate, &SPLOT::FCmdUpdate, pvNil) ON_CID_GEN(cidSplotOk, &SPLOT::FCmdDismiss, pvNil) ON_CID_GEN(cidSplotCancel, &SPLOT::FCmdDismiss, pvNil) END_CMD_MAP_NIL() /****************************************************************************** PsplotNew Creates a new SPLOT instance. Returns: pvNil on failure, pointer to SPLOT on success ************************************************************ PETED ***********/ PSPLOT SPLOT::PsplotNew(long hidPar, long hid, PRCA prca) { PSPLOT psplot = pvNil; PGL pglclr = pvNil; PGOB pgobPar; RC rcRel; GCB gcb; CLOK clok(CMH::HidUnique()); if ((pgobPar = vapp.Pkwa()->PgobFromHid(hidPar)) == pvNil) { Bug("Couldn't find background GOB"); goto LFail; } pglclr = GPT::PglclrGetPalette(); if (pglclr == pvNil) goto LFail; rcRel.Set(krelZero, krelZero, krelOne, krelOne); gcb.Set(hid, pgobPar, fgobNil, kginDefault, pvNil, &rcRel); if ((psplot = NewObj SPLOT(&gcb)) == pvNil) goto LFail; if (!psplot->_FInit(vpapp->Pkwa(), hid, prca)) { ReleasePpo(&psplot); goto LFail; } if (!psplot->_FEnterState(ksnoInit)) { Warn("GOK immediately destroyed!"); goto LFail; } /* Copy random number generator and palette */ psplot->_pglclrSav = pglclr; psplot->_pglclrSav->AddRef(); LFail: ReleasePpo(&pglclr); return psplot; } /****************************************************************************** FCmdInit Initializes the splot machine; right now, just sets up the movie and MVU for the splot machine, inside the given GOK parent. In the future, perhaps the content data structures can be inited here, and only updated if we fail loading something (which would indicate that the user removed a CD or something during the splot machine). Arguments: PCMD pcmd rglw[0] -- the kid of the parent frame to show the movie in Returns: fTrue, always handles the cid ************************************************************ PETED ***********/ bool SPLOT::FCmdInit(PCMD pcmd) { AssertThis(0); Assert(_pmvie == pvNil, "Already Inited the Splot Machine"); PMCC pmcc = pvNil; PGOB pgobParent; RC rcRel; GCB gcb; if ((pgobParent = vpapp->Pkwa()->PgobFromHid(pcmd->rglw[0])) == pvNil) { Bug("Parent GOB for view doesn't exist"); goto LFail; } pmcc = NewObj MCC(kdxpWorkspace, kdypWorkspace, kcbStudioCache); if (pmcc == pvNil) goto LFail; if ((_pmvie = MVIE::PmvieNew(vpapp->FSlowCPU(), pmcc)) == pvNil) goto LFail; _pmvie->SetFSoundsEnabled(fTrue); rcRel.Set(krelZero, krelZero, krelOne, krelOne); gcb.Set(khidDdg, pgobParent, fgobNil, kginDefault, pvNil, &rcRel); if (_pmvie->PddgNew(&gcb) == pvNil) { ReleasePpo(&_pmvie); goto LFail; } _pmvie->InvalViews(); LFail: ReleasePpo(&pmcc); return fTrue; } /****************************************************************************** FCmdSplot Actually generates some random content for the splot machine. Grab content here, since sometimes we'll have to retrieve content here anyway, so it's cleaner to just always do it here. Arguments: PCMD pcmd rglw[0] -- 1 if the background should be randomized rglw[1] -- 1 if the camera should be rglw[2] -- 1 if the actors/props should be rglw[3] -- 1 if the music should be Returns: fTrue, always handles the cid ************************************************************ PETED ***********/ bool SPLOT::FCmdSplot(PCMD pcmd) { AssertThis(0); bool fDirty = fFalse; CKI cki; THD thd; vapp.BeginLongOp(); /* On failure, pretend that we didn't change anything */ _fDirty = fFalse; /* Background. New background implies new camera view */ if (_pbclBkgd == pvNil) { cki.ctg = kctgBkth; cki.cno = cnoNil; _pbclBkgd = BCL::PbclNew(pvNil, &cki, ctgNil, pvNil, fTrue); if (_pbclBkgd == pvNil || _pbclBkgd->IthdMac() == 0) { ReleasePpo(&_pbclBkgd); goto LFail; } pcmd->rglw[0] = 1; } if (pcmd->rglw[0] != 0) { long ithdBkgd; ithdBkgd = _sflBkgd.LwNext(_pbclBkgd->IthdMac()); if (ithdBkgd != _ithdBkgd) ReleasePpo(&_pbclCam); _ithdBkgd = ithdBkgd; pcmd->rglw[1] = 1; fDirty = fTrue; } /* Camera */ if (_pbclCam == pvNil) { _pbclBkgd->GetThd(_ithdBkgd, &thd); cki.ctg = kctgBkth; cki.cno = thd.tag.cno; _pbclCam = BCL::PbclNew(pvNil, &cki, kctgCath, pvNil, fTrue); if (_pbclCam == pvNil || _pbclCam->IthdMac() == 0) { ReleasePpo(&_pbclCam); goto LFail; } pcmd->rglw[1] = 1; } if (pcmd->rglw[1] != 0) { _ithdCam = _sflCam.LwNext(_pbclCam->IthdMac()); fDirty = fTrue; } /* Actor & Props */ if (_pbclActr == pvNil) { cki.ctg = kctgTmth; cki.cno = cnoNil; _pbclActr = BCL::PbclNew(pvNil, &cki, ctgNil, pvNil, fTrue); if (_pbclActr == pvNil || _pbclActr->IthdMac() == 0) { ReleasePpo(&_pbclActr); goto LFail; } pcmd->rglw[2] = 1; } if (_pbclProp == pvNil) { cki.ctg = kctgPrth; cki.cno = cnoNil; _pbclProp = BCL::PbclNew(pvNil, &cki, ctgNil, pvNil, fTrue); if (_pbclProp == pvNil || _pbclProp->IthdMac() == 0) { ReleasePpo(&_pbclProp); goto LFail; } pcmd->rglw[2] = 1; } if (pcmd->rglw[2] != 0) { _ithdActr = _sflActr.LwNext(_pbclActr->IthdMac()); _ithdProp = _sflProp.LwNext(_pbclProp->IthdMac()); fDirty = fTrue; } /* Background music */ if (_pbclSound == pvNil) { cki.ctg = kctgSmth; cki.cno = cnoNil; _pbclSound = BCL::PbclNew(pvNil, &cki, ctgNil, pvNil, fTrue); if (_pbclSound == pvNil || _pbclSound->IthdMac() == 0) { ReleasePpo(&_pbclSound); goto LFail; } pcmd->rglw[3] = 1; } if (pcmd->rglw[3] != 0) { _ithdSound = _sflSound.LwNext(_pbclSound->IthdMac()); fDirty = fTrue; } Assert(fDirty, "Why bother calling this with no random elements?"); _fDirty = fDirty; LFail: vapp.EndLongOp(); return fTrue; } /****************************************************************************** FCmdUpdate Show the new movie on the screen. Arguments: PCMD pcmd -- no additional parameters Returns: fTrue, always handles the cid ************************************************************ PETED ***********/ bool SPLOT::FCmdUpdate(PCMD pcmd) { AssertThis(0); if (_fDirty) { THD thd; TAG tagCam, tagBkgd; vapp.BeginLongOp(); if (_pmvie->Cscen() > 0 && !_pmvie->FRemScen(0)) goto LFail; _pmvie->Pmsq()->SndOff(); #ifdef BUG1907 // We will run out of disk space eventually if the HD cache is not // periodically cleared. We don't want to do it on every pull of the // lever, because there's a significant time hit (especially if you're // only pulling a "small lever", which only has to cache one new thing // unless you clear the cache). Ideally, this algorithm would only // purge the cache if disk space is getting low on the volume that // tagman is caching to, but there's currently no way to do that, so // just purge every five pulls. static long _cactPullTilClearCache = 5; _pmvie->Pmsq()->StopAll(); // Make sure no sounds are streaming from HD cache if (--_cactPullTilClearCache == 0) { vptagm->ClearCache(sidNil, ftagmFile); // Clear content out of HD cache _cactPullTilClearCache = 5; } #endif // BUG1907 /* No tags need to be opened, because all are from installed content */ /* Still need to ensure on HD though */ _pbclBkgd->GetThd(_ithdBkgd, &thd); Assert(thd.tag.sid != ksidUseCrf, "Need to open tag before using it"); if (!BKGD::FCacheToHD(&thd.tag)) goto LFail; if (!_pmvie->FAddScen(&thd.tag)) goto LFail; tagBkgd = thd.tag; AssertPo(_pmvie->Pscen(), 0); _pmvie->Pmsq()->SndOnLong(); _pbclCam->GetThd(_ithdCam, &thd); if (!vptagm->FBuildChildTag(&tagBkgd, thd.chid, kctgCam, &tagCam)) goto LFail; if (!vptagm->FCacheTagToHD(&tagCam)) goto LFail; if (!_pmvie->Pscen()->FChangeCam(thd.chid)) goto LFail; _pbclActr->GetThd(_ithdActr, &thd); Assert(thd.tag.sid != ksidUseCrf, "Need to open tag before using it"); if (!vptagm->FCacheTagToHD(&thd.tag)) goto LFail; if (!_pmvie->FInsActr(&thd.tag)) goto LFail; _pbclProp->GetThd(_ithdProp, &thd); Assert(thd.tag.sid != ksidUseCrf, "Need to open tag before using it"); if (!vptagm->FCacheTagToHD(&thd.tag)) goto LFail; if (!_pmvie->FInsActr(&thd.tag)) goto LFail; _pmvie->Pscen()->SelectActr(pvNil); _pmvie->PmvuCur()->SetTool(toolDefault); _pbclSound->GetThd(_ithdSound, &thd); Assert(thd.tag.sid != ksidUseCrf, "Need to open tag before using it"); if (!vptagm->FCacheTagToHD(&thd.tag)) goto LFail; if (!_pmvie->FAddBkgdSnd(&thd.tag, tribool::tYes, tribool::tNo)) goto LFail; _pmvie->Pmsq()->PlayMsq(); vapp.EndLongOp(); } LFail: return fTrue; } /****************************************************************************** FCmdDismiss Okays or Cancels the Splot Machine. Arguments: PCMD pcmd -- no additional parameters Returns: fTrue, always handles the cid ************************************************************ PETED ***********/ bool SPLOT::FCmdDismiss(PCMD pcmd) { AssertThis(0); if (pcmd->cid == cidSplotOk) { /* Attempt to release the current scene so that we'll force a palette update when we come back into the studio. Don't sweat a failure */ _pmvie->FSwitchScen(ivNil); _pmvie->ClearUndo(); vapp.HandoffMovie(_pmvie); } #ifdef BUG1907 else { _pmvie->Pmsq()->StopAll(); // Make sure no sounds are streaming from HD cache vptagm->ClearCache(sidNil, ftagmFile); // Clear content out of HD cache // Note: could clear out the RAM cache too, but I'm keeping this change // as small as possible. } #endif // BUG1907 Release(); return fTrue; } SPLOT::~SPLOT(void) { if (_pmvie != pvNil) { /* This should be freed when its parent, the Splot Machine View gob, is freed */ Assert(_pmvie->PddgGet(0) == pvNil, "MVU wasn't freed"); _pmvie->Pmsq()->StopAll(); _pmvie->Pmsq()->SndOnShort(); } if (_pglclrSav != pvNil) { vapp.UpdateMarked(); GPT::SetActiveColors(_pglclrSav, fpalIdentity); ReleasePpo(&_pglclrSav); } ReleasePpo(&_pmvie); ReleasePpo(&_pbclBkgd); ReleasePpo(&_pbclCam); ReleasePpo(&_pbclActr); ReleasePpo(&_pbclProp); ReleasePpo(&_pbclSound); } #ifdef DEBUG void SPLOT::AssertValid(ulong grf) { SPLOT_PAR::AssertValid(grf); AssertPo(_pglclrSav, 0); AssertNilOrPo(_pmvie, 0); AssertNilOrPo(_pbclBkgd, 0); AssertNilOrPo(_pbclCam, 0); AssertNilOrPo(_pbclActr, 0); AssertNilOrPo(_pbclProp, 0); AssertNilOrPo(_pbclSound, 0); } void SPLOT::MarkMem(void) { SPLOT_PAR::MarkMem(); MarkMemObj(_pglclrSav); MarkMemObj(_pmvie); MarkMemObj(_pbclBkgd); MarkMemObj(_pbclCam); MarkMemObj(_pbclActr); MarkMemObj(_pbclProp); MarkMemObj(_pbclSound); _sflBkgd.MarkMem(); _sflCam.MarkMem(); _sflActr.MarkMem(); _sflProp.MarkMem(); _sflSound.MarkMem(); } #endif // DEBUG ================================================ FILE: src/studio/stdiobrw.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** stdiobrw.cpp Author: ****** Date: April, 1995 Review Status: Reviewed This file contains the code which invokes browsers and applies browser selections. Studio Independent Browsers: BASE --> CMH --> GOK --> BRWD (Browser display class) BRWD --> BRWL (Browser list class; chunky based) BRWD --> BRWT (Browser text class) BRWD --> BRWL --> BRWN (Browser named list class) Studio Dependent Browsers: BRWD --> BRWT --> BRWA (Browser action class) BRWD --> BRWL --> BRWP (Browser prop/actor class) BRWD --> BRWL --> BRWB (Browser background class) BRWD --> BRWL --> BRWC (Browser camera class) BRWD --> BRWL --> BRWN --> BRWM (Browser music class) BRWD --> BRWL --> BRWN --> BRWM --> BRWI (Browser import sound class) NOTE: In this implementation, browsers are considered to be studio related. If for any reason one wanted to decouple them from the studio, then it would be easy for browser.cpp to enqueue cids for 1) SetTagTool and 2) ApplySelection (which would take a browser identifying argument). The studio (or anyone else) could then apply all browser based selections. The chunky based browsers come in two categories: 1) Content spanning potentially multiple products (eg, bkgds, actors) 2) Content which is a child of an existing selection. Browsers of type 1) are cno based. They sort on the basis of the cno of the thumbnail chunk. The contents of the thumbnail chunk then point to the cno of the CD content. Browsers of type 2) are chid based. They sort on the basis of the chid of the thumbnail chunk. The contents of the thumbnail chunk then point to the chid of the CD content. ***************************************************************************/ #include "soc.h" #include "studio.h" ASSERTNAME /*************************************************************************** * * Handle Browser Ready command * A Browser Ready command signals the invocation of an empty browser * * Parameters: * pcmd - Pointer to the command to process. * pcmd[0] = kid of Browser (type) * pcmd[1] = kid first frame. Thumb kid is this + kidBrowserThumbOffset * pcmd[2] = kid of first control * pcmd[3] = x,y offsets * * Returns: * fTrue if it handled the command, else fFalse. * **************************************************************************/ const long kglpbrcnGrow = 5; bool STDIO::FCmdBrowserReady(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); bool fSuccess = fFalse; PBRCN pbrcn = pvNil; // Browser context carryover PBRWD pbrwd = pvNil; CKI ckiRoot; TAG tag; PTAG ptag; PMVU pmvu; long thumSelect; long sid = ((APP *)vpappb)->SidProduct(); long brwdid = pcmd->rglw[0]; vapp.BeginLongOp(); if (pvNil == _pmvie) goto LFail; AssertPo(_pmvie, 0); // Optionally Save/Retrieve Browser Context if (_pglpbrcn == pvNil) { if (pvNil == (_pglpbrcn = GL::PglNew(size(PBRCN), kglpbrcnGrow))) goto LFail; } // Include optional argument pbrcn if you want context carryover pbrcn = _PbrcnFromBrwdid(brwdid); AssertNilOrPo(pbrcn, 0); switch (brwdid) { case kidBrwsBackground: // Search for background thumbs of any cno ckiRoot.cno = cnoNil; ckiRoot.ctg = kctgBkth; if (pvNil == _pmvie->Pscen()) { thumSelect = (long)cnoNil; TrashVar(&sid); } else { Assert(pvNil != _pmvie->Pscen()->Pbkgd(), "Pbkgd() Nil"); thumSelect = _pmvie->Pscen()->Pbkgd()->Cno(); AssertDo(_pmvie->Pscen()->FGetTagBkgd(&tag), "Missing background event"); sid = tag.sid; } pbrwd = (PBRWD)(BRWB::PbrwbNew(_pcrm)); if (pvNil == pbrwd) goto LFail; // Create BRCNL for context carryover (optional choice) if (pbrcn == pvNil) pbrcn = NewObj BRCNL; // Selection is cno based if (!((PBRWB)pbrwd)->FInit(pcmd, kbwsCnoRoot, thumSelect, sid, ckiRoot, ctgNil, this, (PBRCNL)pbrcn)) { goto LFail; } break; case kidBrwsCamera: if (pvNil == _pmvie->Pscen()) goto LFail; AssertPo(_pmvie->Pscen(), 0); Assert(pvNil != _pmvie->Pscen()->Pbkgd(), "Pbkgd() Nil"); // Search for camera views, children of the current bkgd ckiRoot.ctg = kctgBkth; ckiRoot.cno = _pmvie->Pscen()->Pbkgd()->Cno(); thumSelect = _pmvie->Pscen()->Pbkgd()->Icam(); pbrwd = (PBRWD)(BRWC::PbrwcNew(_pcrm)); if (pvNil == pbrwd) goto LFail; // Create BRCNL for context carryover (optional choice) if (pbrcn == pvNil) pbrcn = NewObj BRCNL; AssertDo(_pmvie->Pscen()->FGetTagBkgd(&tag), "Missing background event"); if (!((PBRWC)pbrwd)->FInit(pcmd, kbwsChid, thumSelect, tag.sid, ckiRoot, kctgCath, this, (PBRCNL)pbrcn)) { goto LFail; } break; case kidBrwsProp: ckiRoot.ctg = kctgPrth; pbrwd = (PBRWD)(BRWP::PbrwpNew(_pcrm, kidPropGlass)); goto LActor; case kidBrwsActor: ckiRoot.ctg = kctgTmth; pbrwd = (PBRWD)(BRWP::PbrwpNew(_pcrm, kidActorGlass)); LActor: ckiRoot.cno = cnoNil; Assert(pvNil != _pmvie->Pscen(), "Actor browser requires scene"); thumSelect = ivNil; if (pvNil == pbrwd) goto LFail; // Create BRCNL for context carryover (optional choice) if (pbrcn == pvNil) pbrcn = NewObj BRCNL; if (!((PBRWP)pbrwd)->FInit(pcmd, kbwsCnoRoot, thumSelect, 0, ckiRoot, ctgNil, this, (PBRCNL)pbrcn)) { goto LFail; } break; case kidBrwsAction: if ((pvNil == _pmvie->Pscen()) || (pvNil == _pmvie->Pscen()->PactrSelected())) { Bug("No actor selected in action browser"); goto LFail; } thumSelect = _pmvie->Pscen()->PactrSelected()->AnidCur(); pbrwd = (PBRWD)BRWA::PbrwaNew(_pcrm); if (pvNil == pbrwd) goto LFail; // Build the string table before initializing if (!((PBRWA)pbrwd)->FBuildGst(_pmvie->Pscen())) goto LFail; if (!((PBRWT)pbrwd)->FInit(pcmd, thumSelect, thumSelect, this)) goto LFail; break; case kidSSorterBackground: if (SCRT::PscrtNew(brwdid, _pmvie, this, _pcrm) == pvNil) PushErc(ercSocCantInitSceneSort); vapp.EndLongOp(); return fTrue; case kidBrwsFX: ckiRoot.ctg = kctgSfth; pbrwd = (PBRWD)(BRWM::PbrwmNew(_pcrm, kidFXGlass, stySfx, this)); goto LMusic; case kidBrwsSpeech: ckiRoot.ctg = kctgSvth; pbrwd = (PBRWD)(BRWM::PbrwmNew(_pcrm, kidSpeechGlass, stySpeech, this)); goto LMusic; case kidBrwsMidi: ckiRoot.ctg = kctgSmth; pbrwd = (PBRWD)(BRWM::PbrwmNew(_pcrm, kidMidiGlass, styMidi, this)); LMusic: if (pvNil == pbrwd) goto LFail; // Search for background thumbs of any cno ckiRoot.cno = cnoNil; thumSelect = (long)cnoNil; // Create BRCNL for context carryover (optional choice) if (pbrcn == pvNil) pbrcn = NewObj BRCNL; pmvu = (PMVU)(Pmvie()->PddgGet(0)); ptag = pmvu->PtagTool(); if (ptag->sid != ksidInvalid) { thumSelect = ptag->cno; sid = ptag->sid; } // Selection is cno based if (!((PBRWM)pbrwd)->FInit(pcmd, kbwsCnoRoot, thumSelect, sid, ckiRoot, ctgNil, this, (PBRCNL)pbrcn)) { goto LFail; } break; // // The import browser is set up on top of the normal sound browser // rglw[1] = pfniMovie of movie to be scanned. // case kidBrwsImportFX: ckiRoot.ctg = kctgSfth; pbrwd = (PBRWD)(BRWI::PbrwiNew(_pcrm, kidSoundsImportGlass, stySfx)); goto LImport; case kidBrwsImportSpeech: ckiRoot.ctg = kctgSvth; pbrwd = (PBRWD)(BRWI::PbrwiNew(_pcrm, kidSoundsImportGlass, stySpeech)); goto LImport; case kidBrwsImportMidi: ckiRoot.ctg = kctgSmth; pbrwd = (PBRWD)(BRWI::PbrwiNew(_pcrm, kidSoundsImportGlass, styMidi)); LImport: if (pvNil == pbrwd) goto LFail; // Build the string table before initializing the BRWD if (!((PBRWI)pbrwd)->FInit(pcmd, ckiRoot, this)) { goto LFail; } break; case kidRollCallProp: Assert(pvNil == _pbrwrProp, "Roll Call browser already up"); _pbrwrProp = BRWR::PbrwrNew(_pcrm, kidRollCallProp); pbrwd = (PBRWD)_pbrwrProp; if (pvNil == pbrwd) goto LFail; // Create the cno map from tmpl-->gokd if (_pglcmg == pvNil) { if (pvNil == (_pglcmg = GL::PglNew(size(CMG), kglcmgGrow))) goto LFail; _pglcmg->SetMinGrow(kglcmgGrow); } if (!_pbrwrProp->FInit(pcmd, kctgPrth, ivNil, this)) goto LFail; break; case kidRollCallActor: Assert(pvNil == _pbrwrActr, "Roll Call browser already up"); _pbrwrActr = BRWR::PbrwrNew(_pcrm, kidRollCallActor); pbrwd = (PBRWD)_pbrwrActr; if (pvNil == pbrwd) goto LFail; // Create the cno map from tmpl-->gokd if (_pglcmg == pvNil) { if (pvNil == (_pglcmg = GL::PglNew(size(CMG), kglcmgGrow))) goto LFail; _pglcmg->SetMinGrow(kglcmgGrow); } if (!_pbrwrActr->FInit(pcmd, kctgTmth, ivNil, this)) goto LFail; break; default: RawRtn(); break; } Assert(pvNil != pbrwd, "Logic error"); pbrwd->FDraw(); // Ignore failure : reported elsewhere // // Optionally Add new browser to the gl for context // carryover between browser instantiations // if (pvNil != pbrcn && pvNil == _PbrcnFromBrwdid(brwdid)) { if (!_pglpbrcn->FAdd(&pbrcn)) { goto LFail; } } fSuccess = fTrue; LFail: if (!fSuccess) { ReleasePpo(&pbrcn); ReleasePpo(&pbrwd); } vpcex->EnqueueCid(cidBrowserVisible, pvNil, pvNil, fSuccess ? 1 : 0); // For projects vapp.EndLongOp(); return fTrue; } /*************************************************************************** * * Destroy browser context (when Studio destructs) * **************************************************************************/ void STDIO::ReleaseBrcn(void) { long ipbrcn; PBRCN pbrcn; if (pvNil == _pglpbrcn) return; for (ipbrcn = 0; ipbrcn < _pglpbrcn->IvMac(); ipbrcn++) { _pglpbrcn->Get(ipbrcn, &pbrcn); ReleasePpo(&pbrcn); } ReleasePpo(&_pglpbrcn); } /*************************************************************************** * * Locate a browser pbrwd * **************************************************************************/ PBRCN STDIO::_PbrcnFromBrwdid(long brwdid) { AssertThis(0); long ipbrcn; PBRCN pbrcn; for (ipbrcn = 0; ipbrcn < _pglpbrcn->IvMac(); ipbrcn++) { _pglpbrcn->Get(ipbrcn, &pbrcn); if (pbrcn->brwdid == brwdid) { return pbrcn; } } return pvNil; } /*************************************************************************** * * Apply a Camera Selection. (Browser callback) * thumSelect is an index and a chid * **************************************************************************/ void BRWC::_ApplySelection(long thumSelect, long sid) { AssertThis(0); PMVU pmvu; _pstdio->Pmvie()->Pscen()->FChangeCam(thumSelect); // Update the tool pmvu = (PMVU)(_pstdio->Pmvie()->PddgActive()); AssertPo(pmvu, 0); pmvu->SetTool(toolDefault); // Update the UI _pstdio->Pmvie()->Pmcc()->ChangeTool(toolDefault); } /*************************************************************************** * * Apply a Background Selection. (Browser callback) * thumSelect is a cno * **************************************************************************/ void BRWB::_ApplySelection(long thumSelect, long sid) { AssertThis(0); TAG tag; CMD cmd; PMVU pmvu; tag.sid = sid; tag.pcrf = pvNil; tag.ctg = kctgBkgd; tag.cno = (CNO)thumSelect; ClearPb(&cmd, size(cmd)); cmd.cid = cidNewScene; cmd.pcmh = _pstdio; Assert(size(TAG) <= size(cmd.rglw), "Insufficient space in rglw"); *((PTAG)&cmd.rglw) = tag; vpcex->EnqueueCmd(&cmd); // Update the tool pmvu = (PMVU)(_pstdio->Pmvie()->PddgActive()); AssertPo(pmvu, 0); pmvu->SetTool(toolDefault); // Update the UI _pstdio->Pmvie()->Pmcc()->ChangeTool(toolDefault); return; } /*************************************************************************** * * Apply an Actor Selection. * * thumSelect is a cno * * **************************************************************************/ void BRWP::_ApplySelection(long thumSelect, long sid) { AssertThis(0); TAG tag; PMVU pmvu; pmvu = (PMVU)(_pstdio->Pmvie()->PddgGet(0)); if (pmvu == pvNil) { Warn("No pmvu"); return; } AssertPo(pmvu, 0); tag.sid = sid; tag.pcrf = pvNil; tag.ctg = kctgTmpl; tag.cno = (CNO)thumSelect; if (!_pstdio->Pmvie()->FInsActr(&tag)) goto LFail; pmvu->StartPlaceActor(fTrue); LFail: return; } /*************************************************************************** * * Apply an Action Selection. * * thumSelect is a chid * **************************************************************************/ void BRWA::_ApplySelection(long thumSelect, long sid) { AssertThis(0); AssertPo(_pstdio->Pmvie(), 0); PACTR pactr; PMVU pmvu; PGOK pgok; // Apply the action to the actor pactr = _pstdio->Pmvie()->Pscen()->PactrSelected(); if (!pactr->FSetAction(thumSelect, _celnStart, fFalse)) return; // Error reported earlier // Update the tool pmvu = (PMVU)(_pstdio->Pmvie()->PddgActive()); AssertPo(pmvu, 0); pmvu->SetTool(toolRecordSameAction); // Update the UI _pstdio->Pmvie()->Pmcc()->ChangeTool(toolRecordSameAction); // Reset the studio action button state (record will be depressed) pgok = (PGOK)vapp.Pkwa()->PgobFromHid(kidActorsActionBrowser); if ((pgok != pvNil) && pgok->FIs(kclsGOK)) { Assert(pgok->FIs(kclsGOK), "Invalid class"); pgok->FChangeState(kstDefault); } return; } /*************************************************************************** * * Apply a Music Selection. * * thumSelect is a cnoContent * **************************************************************************/ void BRWM::_ApplySelection(long thumSelect, long sid) { AssertThis(0); AssertPo(_pstdio->Pmvie(), 0); PGOK pgok; PMVU pmvu; TAG tag; BOOL fClick = fTrue; pmvu = (PMVU)(_pstdio->Pmvie()->PddgGet(0)); AssertPo(pmvu, 0); tag.ctg = kctgMsnd; tag.cno = (CNO)thumSelect; tag.sid = sid; if (ksidUseCrf != sid) tag.pcrf = pvNil; else { if (!_pstdio->Pmvie()->FEnsureAutosave(&_pcrf)) return; AssertDo(vptagm->FOpenTag(&tag, _pcrf), "Should never fail when not copying the tag"); } // Set the tool to "play once", if necessary pgok = (PGOK)vpapp->Pkwa()->PgobFromHid(kidSoundsLooping); if (pgok != pvNil && pgok->FIs(kclsGOK) && (pgok->Sno() == kstSelected)) { fClick = fFalse; } pgok = (PGOK)vpapp->Pkwa()->PgobFromHid(kidSoundsAttachToCell); if (pgok != pvNil && pgok->FIs(kclsGOK) && (pgok->Sno() == kstSelected) && (_sty != styMidi)) { fClick = fFalse; } if (fClick) { pgok = (PGOK)vpapp->Pkwa()->PgobFromHid(kidSoundsPlayOnce); if (pgok != pvNil && pgok->FIs(kclsGOK) && (pgok->Sno() != kstSelected)) { AssertPo(pgok, 0); vpcex->EnqueueCid(cidClicked, pgok, pvNil, pvNil); } } pmvu->SetTagTool(&tag); TAGM::CloseTag(&tag); return; } /*************************************************************************** * * Apply an Import Music Selection. * Copy the msnd chunk from the open BRWI movie to the current movie * Then notify the underlying sound browser to update * * thumSelect is a cnoContent * **************************************************************************/ void BRWI::_ApplySelection(long thumSelect, long sid) { AssertThis(0); AssertPo(_pstdio->Pmvie(), 0); CNO cnoDest; long kidBrws; switch (_sty) { case styMidi: kidBrws = kidMidiGlass; break; case stySfx: kidBrws = kidFXGlass; break; case stySpeech: kidBrws = kidSpeechGlass; break; default: Bug("Invalid _sty"); break; } if (pvNil == _pcrf || pvNil == _pcrf->Pcfl()) return; // Copy sound from _pcrf->Pcfl() to current movie vpappb->BeginLongOp(); if (!_pstdio->Pmvie()->FCopyMsndFromPcfl(_pcrf->Pcfl(), (CNO)thumSelect, &cnoDest)) { vpappb->EndLongOp(); return; } vpappb->EndLongOp(); // Select the item, extend lists and hilite it vpcex->EnqueueCid(cidBrowserSelectThum, vpappb->PcmhFromHid(kidBrws), pvNil, cnoDest, sid, 1, 1); return; } /*************************************************************************** * * Apply a Roll Call Selection. * thumSelect equals ithum * **************************************************************************/ void BRWR::_ApplySelection(long thumSelect, long sid) { AssertThis(0); PMVU pmvu; PMVIE pmvie = _pstdio->Pmvie(); long arid; STN stn; long cactRef; long iarid = _IaridFromIthum(thumSelect); if (!pmvie->FGetArid(iarid, &arid, &stn, &cactRef)) return; _fApplyingSel = fTrue; pmvu = (PMVU)pmvie->PddgActive(); pmvie->FChooseArid(arid); if (!pmvu->FActrMode()) { pmvu->SetTool(toolCompose); _pstdio->ChangeTool(toolCompose); } _fApplyingSel = fFalse; } ================================================ FILE: src/studio/stdiocrs.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /***************************************************************************** * * STDIOCRS.H * * Copyright (C) Microsoft Corporation 1995. * All Rights reserved. * ****************************************************************************** * * Module Intent * * Contains all of the cnos for cursors used only in the studio. Note that * cursors shared between the Studio and the Building are defined in * inc\buildgob.h and the chunks for them are in src\shared\cursors.cht. * ****************************************************************************** * * Revision History: Taken from inc\stdiodef.h on 06/20/95 by *****. * *****************************************************************************/ #ifndef STDIOCRS_H #define STDIOCRS_H // Note, shared cursors have ids reserved from 0 through 100. #define kcrsCompose 101 #define kcrsSquashStretch 102 #define kcrsResize 103 #define kcrsRotateX 104 #define kcrsRotateY 105 #define kcrsRotateZ 106 #define kcrsCostume 107 #define kcrsRecord 108 #define kcrsTweak 109 #define kcrsNormalizeRot 110 #define kcrsDefault 111 #define kcrsTboxMove 112 #define kcrsTboxUpDown 113 #define kcrsTboxLeftRight 114 #define kcrsTboxFalling 115 #define kcrsTboxRising 116 #define kcrsNuke 117 #define kcrsTboxCreate 118 #define kcrsIBeam 119 #define kcrsCutObject 120 #define kcrsCopyObject 121 #define kcrsCopyRte 122 #define kcrsPasteObject 123 #define kcrsSceneChop 124 #define kcrsCutText 125 #define kcrsCopyText 126 #define kcrsPasteText 127 #define kcrsPasteRte 128 #define kcrsPaintText 129 #define kcrsFillBkgd 130 #define kcrsMatcher 131 #define kcrsLooper 132 #define kcrsSounder 133 #define kcrsListener 134 #define kcrsSoonerLater 135 #define kcrsComposeAll 136 #define kcrsNormalizeSize 137 #define kcrsTboxStory 138 #define kcrsTboxCredit 139 #define kcrsTboxFont 140 #define kcrsTboxFontSize 141 #define kcrsTboxFontStyle 142 #define kcrsSceneChopBack 143 #endif // !STDIOCRS_H ================================================ FILE: src/studio/stdioscb.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*****************************************************************************\ * * stdioscb.cht * * Scrollbars and Buttons (Frame and Scene) for Socrates * * Author: ****** (*****) * Date: 95/03/28 * \*****************************************************************************/ // kXXXDelayXXX - // // pick these delay numbers so that // // klwDelayMin + (n * kdlwDelay) = klwDelayMax // // for some integral n to guarantee that delay in Cell() call is always // positive // // also we never want to go faster than 7 fps in ship build so klwDelayMin // should be >= 9 for non-DEBUG // // kfUpdateDrag - update the counters while dragging the thumb tab #ifdef DEBUG #define klwDelayMax 60 #define klwDelayMin 24 #define kdlwDelay 6 #define kfUpdateDrag 0 #else #define klwDelayMax 60 #define klwDelayMin 10 #define kdlwDelay 25 #define kfUpdateDrag 1 #endif #define kdxpSnap 32 #define kdypSnap 32 /*****************************************************************************\ * * NORMALGOB * a generic ordinary normal gob * * Description: * boooooring! * * Parameters: * __szTitle name for the gob * __kid kid for the gob * __xp, __yp default x and y position for the gob * __xpreg, __ypreg x and y registration points for the button gob * __szPath path to the default mbmp representation * \*****************************************************************************/ #define NORMALGOB(__szTitle, __kid, __xp, __yp,__xpreg, __ypreg, __szPath) \ GOBCHUNK(__szTitle, __kid, gokkNoHitKids) \ DEFAULT_POSITION(__xp, __yp, 10) \ ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) \ ENDCHUNK \ REP_MBMPREG(CHID1(krepDefault), __szPath, __xpreg, __ypreg) /*****************************************************************************\ * * BUTTONONCEGOB * a generic push-once button * * Description: * holding the button does nothing special * cid is enqueued when button is pressed (mouse down on the button) * * cid format: * param0 = tool type (chtt) * * Parameters: * __szTitle name for the button gob * __kid kid for the button gob * __xp, __yp default x and y position for the button gob * __xpreg, __ypreg x and y registration points for the button gob * __szPathDefault path to the default mbmp representation * __szPathSelected path to the selected mbmp representation * __cid command id to enqueue * __chtt current tool id * \*****************************************************************************/ #define BUTTONONCEGOB(__szTitle, __kid, __xp, __yp, __xpreg, __ypreg, __szPathDefault, __szPathSelected, __cid, __chtt, __cno) \ GOBCHUNK(__szTitle, __kid, kgokkRectHit) \ DEFAULT_POSITION(__xp, __yp, 10) \ ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID1(krepMouseDnOn), cidNil, __cno) \ ENDCHUNK \ REP_MBMPREG(CHID1(krepDefault), __szPathDefault, __xpreg, __ypreg) \ ADOPT_MBMP(LAST_MBMP, CHID1(krepMouseUpOn)) \ ADOPT_MBMP(LAST_MBMP, CHID1(krepMouseDnOff)) \ REP_MBMPREG(CHID1(krepMouseDnOn), __szPathSelected, __xpreg, __ypreg) \ CHILD_SCRIPT("Pressed", CHID1(krepMouseDnOn)) \ EnqueueCid(__cid, 0, __chtt, GetModifierState(), 0, 0); \ ENDCHUNK /*****************************************************************************\ * * BUTTONHOLDGOB * a generic accelerating-rate push-and-hold button * * Description: * holding the button enqueues cids at a rate which increases over time * * cid format: * param0 = tool type (chtt) * * Parameters: * __szTitle name for the button gob * __kid kid for the button gob * __xp, __yp default x and y position for the button gob * __xpreg, __ypreg x and y registration points for the button gob * __szPathDefault path to the default mbmp representation * __szPathSelected path to the selected mbmp representation * __cid command id to enqueue * __chtt current tool id * \*****************************************************************************/ #define BUTTONHOLDGOB(__szTitle, __kid, __xp, __yp, __xpreg, __ypreg, __szPathDefault, __szPathSelected, __cid, __chtt, __cno) \ GOBCHUNK(__szTitle, __kid, kgokkRectHit) \ DEFAULT_POSITION(__xp, __yp, 10) \ ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID1(krepMouseDnOn), cidNil, __cno) \ ENDCHUNK \ REP_MBMPREG(CHID1(krepDefault), __szPathDefault, __xpreg, __ypreg) \ ADOPT_MBMP(LAST_MBMP, CHID1(krepMouseUpOn)) \ ADOPT_MBMP(LAST_MBMP, CHID1(krepMouseDnOff)) \ REP_MBMPREG( kcell1, __szPathSelected, __xpreg, __ypreg) \ REP_ANIM(CHID1(krepMouseDnOn), "Pressed") \ EnqueueCid(cidStartScroll, 0, __chtt, GetModifierState(), 0, 0); \ lwDelay = klwDelayMax; \ CellNoPause(kcell1, 0, 0, 0); \ While(); \ EnqueueCid(__cid, 0, __chtt, 0, 0, 0); \ Cell(chidNil, 0, 0, lwDelay); \ SetNoSlipThis(fTrue); \ If(lwDelay > klwDelayMin); \ lwDelay -= kdlwDelay; \ End; \ End; \ ENDCHUNK /*****************************************************************************\ * * SCROLLBARGOB * a generic scrollbar * * Description: * clicking on the scrollbar brings the thumb control to that position * * cid format: * param0 = tool type (chtt) * param1 = mouse position * param2 = 0 : just update counters * 1 : update all scrollbar views * * Parameters: * __szTitle name for the scrollbar gob * __kid kid for the scrollbar gob * __kidThumb kid for the corresponding thumbtab gob * __xp, __yp default x and y position for the scrollbar gob * __xpreg, __ypreg x and y registration points for the scrollbar gob * __szPath path to the default mbmp representation * __cid command id to enqueue * \*****************************************************************************/ #define SCROLLBARGOB(__szTitle, __kid, __kidThumb, __xp, __yp, __xpreg, __ypreg , __szPath, __cid, __cno) \ GOBCHUNK(__szTitle, __kid, kgokkRectHit) \ DEFAULT_POSITION(__xp, __yp, 10) \ ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID1(krepMouseDnOn), cidNil, __cno) \ ENDCHUNK \ REP_MBMPREG(CHID1(krepDefault), __szPath, __xpreg, __ypreg ) \ CHILD_SCRIPT("Pressed", CHID1(krepMouseDnOn)) \ cxThumbTab = WidthGob(__kidThumb); \ If((XMouseThis() - cxThumbTab) < 0);\ EnqueueCid(__cid, 0, chttScrollbar, 0, 1, 0); \ Else;\ EnqueueCid(__cid, 0, chttScrollbar, XMouseThis() - cxThumbTab, 1, 0); \ End;\ ENDCHUNK /*****************************************************************************\ * * THUMBGOB * a generic thumb tab for a scroll bar * * Description: * clicking and dragging the thumbtab moves the control * * cid format: * param0 = tool type (chtt) * param1 = mouse position * param2 = 0 : just update counters * 1 : update all scrollbar views * * Parameters: * __szTitle name for the thumb tab gob * __kid kid for the thumb tab gob * __kidScroll the id for the corresponding scrollbar * __xp, __yp default x and y position for the thumb tab gob * __szPath path to the default mbmp representation * __cid command id to enqueue * __fVert is this a vertical scrollbar? * \*****************************************************************************/ #define THUMBGOB(__szTitle, __kid, __kidScroll, __xp, __yp, __szPath, __szPathSnd, __cid, __fVert) \ GOBCHUNK(__szTitle, __kid, kgokkRectHit) \ DEFAULT_POSITION(__xp, __yp, 11) \ ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID1(krepMouseDnOn), cidNil, cnoNil) \ ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID1(krepClicked), cidNil, cnoNil) \ ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID1(krepDrop), cidNil, cnoNil) \ ENDCHUNK \ REP_MBMP(CHID1(krepDefault), __szPath) \ REP_MBMP(CHID(kst2, krepDefault), __szPathSnd) \ REP_ANIM(CHID1(krepMouseDnOn), "Pressed") \ xpSav = XThis(); \ ypSav = YThis(); \ If(__fVert); \ .click = ypSav; \ cyScrollbar = HeightGob(__kidScroll); \ cyThumbTab = HeightThis(); \ ypMax = cyScrollbar - cyThumbTab; \ Else; \ .click = xpSav; \ cxScrollbar = WidthGob(__kidScroll); \ cxThumbTab = WidthThis(); \ xpMax = cxScrollbar - cxThumbTab; \ End; \ .fSnap = 0; \ While(); \ If(__fVert); \ dxp = XMouseThis(); \ dyp = YMouseThis() - (cyThumbTab / 2); \ yp = YThis(); \ If(Abs(dxp - xpSav) > kdxpSnap || yp + dyp < -kdypSnap || yp + dyp > ypMax + kdypSnap); \ .fSnap = 1; \ dyp = ypSav - yp; \ Else; \ .fSnap = 0; \ If(yp + dyp < 0); \ dyp = -yp; \ End; \ If(yp + dyp > ypMax); \ dyp = ypMax - yp; \ End; \ End; \ Cell(chidNil, 0, dyp, 0); \ Cell(chidNil, 0, 0, 0); \ .click = yp + dyp; \ Else; \ dxp = XMouseThis() - (cxThumbTab / 2); \ dyp = YMouseThis(); \ xp = XThis(); \ If(Abs(dyp - ypSav) > kdypSnap || xp + dxp < -kdxpSnap || xp + dxp > xpMax + kdxpSnap); \ .fSnap = 1; \ dxp = xpSav - xp; \ Else; \ .fSnap = 0; \ If(xp + dxp < 0); \ dxp = -xp; \ End; \ If(xp + dxp > xpMax); \ dxp = xpMax - xp; \ End; \ End; \ Cell(chidNil, dxp, 0, 0); \ Cell(chidNil, 0, 0, 0); \ .click = xp + dxp; \ End; \ If(kfUpdateDrag); \ EnqueueCid(__cid, 0, chttThumb, .click, 0, 0); \ End; \ End; \ ENDCHUNK \ ADOPT_ANIM(LAST_ANIM, CHID(kst2, krepMouseDnOn)) \ REP_ANIM(CHID1(krepClicked), "Released") \ If(.fSnap == 0); \ EnqueueCid(__cid, 0, chttThumb, .click, 1, 0); \ End; \ ENDCHUNK \ ADOPT_ANIM(LAST_ANIM, CHID1(krepDrop)) \ ADOPT_ANIM(LAST_ANIM, CHID(kst2, krepClicked)) \ ADOPT_ANIM(LAST_ANIM, CHID(kst2, krepDrop)) /*****************************************************************************\ * * Frame buttons, scrollbar and thumb tab * \*****************************************************************************/ NORMALGOB("Frame Title", kidFrameTitle, kxpFrameTitle, kypFrameTitle, kxpregFrameTitle, kypregFrameTitle, "studio\bmp\fttl.bmp") NORMALGOB("Frame Text Box", kidFrameText, kxpFrameText, kypFrameText, kxpregFrameText, kypregFrameText, "studio\bmp\ftxt.bmp") BUTTONHOLDGOB("Frame Button FW", kidFrameFW, kxpFrameFW, kypFrameFW, kxpregFrameFW, kypregFrameFW, "studio\bmp\ffw.bmp", "studio\bmp\ffws.bmp", cidFrameScrollbar, chttFButtonFW, kttFForward) REP_ANIM(CHID1(krepDragOff), "Pressed") SetNoSlipThis(fFalse); SetRepThis(CHID1(krepDefault)); ENDCHUNK REP_ANIM(CHID1(krepClicked), "Pressed") SetNoSlipThis(fFalse); SetRepThis(CHID1(krepDefault)); ENDCHUNK BUTTONONCEGOB("Frame Button FW End", kidFrameFWEnd, kxpFrameFWEnd, kypFrameFWEnd, kxpregFrameFWEnd, kypregFrameFWEnd, "studio\bmp\ffwe.bmp", "studio\bmp\ffwes.bmp", cidFrameScrollbar, chttButtonFWEnd, kttFForwardEnd) ADOPT_WAVE(kcnoGoLastFWav, CHID(kstDefault, krepClicked)) BUTTONHOLDGOB("Frame Button RW", kidFrameRW, kxpFrameRW, kypFrameRW, kxpregFrameRW, kypregFrameRW, "studio\bmp\frw.bmp", "studio\bmp\frws.bmp", cidFrameScrollbar, chttFButtonRW, kttRewind) REP_ANIM(CHID1(krepDragOff), "Pressed") SetNoSlipThis(fFalse); SetRepThis(CHID1(krepDefault)); ENDCHUNK REP_ANIM(CHID1(krepClicked), "Pressed") SetNoSlipThis(fFalse); SetRepThis(CHID1(krepDefault)); ENDCHUNK BUTTONONCEGOB("Frame Button RW End", kidFrameRWEnd, kxpFrameRWEnd, kypFrameRWEnd, kxpregFrameRWEnd, kypregFrameRWEnd, "studio\bmp\frwe.bmp", "studio\bmp\frwes.bmp", cidFrameScrollbar, chttButtonRWEnd, kttRewindEnd) ADOPT_WAVE(kcnoGoFrstFWav, CHID(kstDefault, krepClicked)) SCROLLBARGOB("Frame Scrollbar", kidFrameScrollbar, kidFrameThumb, kxpFrameScrollbar, kypFrameScrollbar, kypregFrameScrollbar, kypregFrameScrollbar, "studio\bmp\fscl.bmp", cidFrameScrollbar, kttFrameSlider) THUMBGOB("Frame Thumb Tab", kidFrameThumb, kidFrameScrollbar, kxpFrameThumb, kypFrameThumb, "studio\bmp\fthm.bmp", "studio\bmp\fthms.bmp", cidFrameThumb, 0) /*****************************************************************************\ * * Scene buttons, scrollbar and thumb tab * \*****************************************************************************/ NORMALGOB("Scene Title", kidSceneTitle, kxpSceneTitle, kypSceneTitle, kxpregSceneTitle, kypregSceneTitle, "studio\bmp\sttl.bmp") NORMALGOB("Scene Text Box", kidSceneText, kxpSceneText, kypSceneText, kxpregSceneText, kypregSceneText, "studio\bmp\stxt.bmp") BUTTONONCEGOB("Scene Button FW", kidSceneFW, kxpSceneFW, kypSceneFW, kxpregSceneFW, kypregSceneFW, "studio\bmp\sfw.bmp", "studio\bmp\sfws.bmp", cidSceneScrollbar, chttSButtonFW, kttNextScene) BUTTONONCEGOB("Scene Button FW End", kidSceneFWEnd, kxpSceneFWEnd, kypSceneFWEnd, kxpregSceneFWEnd, kypregSceneFWEnd, "studio\bmp\sfwe.bmp", "studio\bmp\sfwes.bmp", cidSceneScrollbar, chttButtonFWEnd, kttLastScene) ADOPT_WAVE(kcnoGoLastSWav, CHID(kstDefault, krepClicked)) BUTTONONCEGOB("Scene Button RW", kidSceneRW, kxpSceneRW, kypSceneRW, kxpregSceneRW, kypregSceneRW, "studio\bmp\srw.bmp", "studio\bmp\srws.bmp", cidSceneScrollbar, chttSButtonRW, kttPrevScene) BUTTONONCEGOB("Scene Button RW End", kidSceneRWEnd, kxpSceneRWEnd, kypSceneRWEnd, kxpregSceneRWEnd, kypregSceneRWEnd, "studio\bmp\srwe.bmp", "studio\bmp\srwes.bmp", cidSceneScrollbar, chttButtonRWEnd, kttFirstScene) ADOPT_WAVE(kcnoGoFrstSWav, CHID(kstDefault, krepClicked)) SCROLLBARGOB("Scene Scrollbar", kidSceneScrollbar, kidSceneThumb, kxpSceneScrollbar, kypSceneScrollbar, kxpregSceneScrollbar, kypregSceneScrollbar, "studio\bmp\sscl.bmp", cidSceneScrollbar, kttSceneSlider) THUMBGOB("Scene Thumb Tab", kidSceneThumb, kidSceneScrollbar, kxpSceneThumb, kypSceneThumb, "studio\bmp\stmb.bmp", "studio\bmp\stmb.bmp", cidSceneThumb, 0) ================================================ FILE: src/studio/stdioscb.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*****************************************************************************\ * stdioscb.cpp * * Author: ****** * Date: March, 1995 * * This file contains the studio scrollbars class SSCB. These are the frame * and scene scrollbar master controls. * \*****************************************************************************/ #include "soc.h" #include "studio.h" ASSERTNAME /*****************************************************************************\ * * The studio scrollbars class. * \*****************************************************************************/ RTCLASS(SSCB) /*****************************************************************************\ * * Constructor for the studio scrollbars. This function is private; use * PsscbNew() for public construction. * \*****************************************************************************/ SSCB::SSCB(PMVIE pmvie) { _pmvie = pmvie; #ifdef SHOW_FPS _itsNext = 1; for (long its = 0; its < kctsFps; its++) _rgfdsc[its].ts = 0; #endif // SHOW_FPS } /*****************************************************************************\ * * Public constructor for the studio scrollbars. * * Parameters: * pmvie -- the owner movie * * Returns: * A pointer to the scrollbars object, pvNil if failed. * \*****************************************************************************/ PSSCB SSCB::PsscbNew(PMVIE pmvie) { AssertNilOrPo(pmvie, 0); PSSCB psscb; PGOB pgob; STN stn; GCB gcb; RC rcRel, rcAbs; long hid; // // Create the view // if (pvNil == (psscb = NewObj SSCB(pmvie))) return pvNil; rcRel.xpLeft = rcRel.ypTop = 0; rcRel.xpRight = rcRel.ypBottom = krelOne; rcAbs.Set(0, 0, 0, 0); pgob = ((APP *)vpappb)->Pkwa()->PgobFromHid(kidFrameText); if (pgob == pvNil) { ReleasePpo(&psscb); return (pvNil); } hid = GOB::HidUnique(); gcb.Set(hid, pgob, fgobNil, kginDefault, &rcAbs, &rcRel); if (pvNil == (psscb->_ptgobFrame = NewObj TGOB(&gcb))) { ReleasePpo(&psscb); return (pvNil); } pgob = ((APP *)vpappb)->Pkwa()->PgobFromHid(kidSceneText); if (pgob == pvNil) { ReleasePpo(&psscb); return (pvNil); } hid = GOB::HidUnique(); gcb.Set(hid, pgob, fgobNil, kginDefault, &rcAbs, &rcRel); if (pvNil == (psscb->_ptgobScene = NewObj TGOB(&gcb))) { ReleasePpo(&psscb); return (pvNil); } #ifdef SHOW_FPS pgob = ((APP *)vpappb)->Pkwa()->PgobFromHid(kidFps); if (pgob == pvNil) { ReleasePpo(&psscb); return (pvNil); } hid = GOB::HidUnique(); gcb.Set(hid, pgob, fgobNil, kginDefault, &rcAbs, &rcRel); if (pvNil == (psscb->_ptgobFps = NewObj TGOB(&gcb))) { ReleasePpo(&psscb); return (pvNil); } #endif // SHOW_FPS AssertPo(psscb, 0); return psscb; } /**************************************************** * * Destructor for studio scroll bars. * ****************************************************/ SSCB::~SSCB(void) { AssertBaseThis(0); // Don't need to Release these tgobs, since they get destroyed with // the gob tree. _ptgobFrame = pvNil; _ptgobScene = pvNil; #ifdef SHOW_FPS _ptgobFps = pvNil; #endif // SHOW_FPS } /*****************************************************************************\ * * FCmdScroll * Handles scrollbar commands. Cids to the SSCB are enqueued * in the following format: * * EnqueueCid(cid, khidSscb, chtt, param1, param2, param3); * * where: cid = cidFrameScrollbar or cidSceneScrollbar * chtt = the tool type * * Parameters: * pcmd -- pointer to command info * * Returns: * fTrue if the command was handled * \*****************************************************************************/ bool SSCB::FCmdScroll(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); bool fScene; bool fThumbDrag = fFalse; long lwDest, cxScrollbar, lwDestOld, xp; long cRangeDest, iRangeDestFirst; long tool = -1; RC rc; PSCEN pscen = pvNil; // verify that the command is for the studio scrollbars if ((pcmd->cid != cidSceneScrollbar) && (pcmd->cid != cidFrameScrollbar) && (pcmd->cid != cidSceneThumb) && (pcmd->cid != cidFrameThumb) && (pcmd->cid != cidStartScroll)) return fFalse; fScene = ((pcmd->cid == cidSceneScrollbar) || (pcmd->cid == cidSceneThumb)); if (pcmd->cid == cidFrameScrollbar) { vpcex->FlushCid(cidFrameScrollbar); } // need a valid movie ptr, also a ptr to the current scene // when dealing with frame scrollbar if ((pvNil == _pmvie) || (!fScene && (pvNil == (pscen = _pmvie->Pscen())))) return fTrue; if (pcmd->cid == cidStartScroll) { if ((pcmd->rglw[0] == chttFButtonFW) || (pcmd->rglw[0] == chttFButtonRW)) { _fBtnAddsFrames = ((pcmd->rglw[1] & fcustCmd) && (((pscen->NfrmLast() == pscen->Nfrm()) && (pcmd->rglw[0] == chttFButtonFW)) || ((pscen->NfrmFirst() == pscen->Nfrm()) && (pcmd->rglw[0] == chttFButtonRW)))); StartNoAutoadjust(); } if (!_fBtnAddsFrames) { return fTrue; } } else { EndNoAutoadjust(); } // what's the tool we are handling? (chtt is param0) switch (pcmd->rglw[0]) { case chttFButtonFW: case chttSButtonFW: // forward one frame / scene if (fScene) { lwDest = _pmvie->Iscen() + 1; tool = toolFWAScene; } else { lwDest = pscen->Nfrm() + 1; if ((pscen->Nfrm() == pscen->NfrmLast()) && _fBtnAddsFrames) { _fBtnAddsFrames = fFalse; tool = toolAddAFrame; goto LExecuteCmd; } tool = toolFWAFrame; } break; case chttButtonFWEnd: // forward to end of scene / movie lwDest = klwMax; break; case chttFButtonRW: case chttSButtonRW: // back one frame / scene if (fScene) { lwDest = _pmvie->Iscen() - 1; tool = toolRWAScene; } else { lwDest = pscen->Nfrm() - 1; if ((pscen->Nfrm() == pscen->NfrmFirst()) && _fBtnAddsFrames) { _fBtnAddsFrames = fFalse; tool = toolAddAFrame; goto LExecuteCmd; } tool = toolRWAFrame; } break; case chttButtonRWEnd: // back to beginning of scene / movie lwDest = klwMin; break; case chttThumb: // released thumb tab - simulate a hit on scrollbar at this point // fall through case chttScrollbar: // hit scrollbar directly // calculate the source range of the mapping: mouse range along scrollbar cxScrollbar = _CxScrollbar(fScene ? kidSceneScrollbar : kidFrameScrollbar, fScene ? kidSceneThumb : kidFrameThumb); // param1 is the source value: the mouse click position // it should be within the source range (closed on the upper bound) xp = LwBound(pcmd->rglw[1], 0, cxScrollbar + 1); // calculate the destination range if (fScene) { // scenes: [0, ..., number_of_scenes - 1] cRangeDest = _pmvie->Cscen(); iRangeDestFirst = 0; } else { // frames: [first_frame, ..., last_frame] cRangeDest = pscen->NfrmLast() - pscen->NfrmFirst() + 1; iRangeDestFirst = pscen->NfrmFirst(); } // map the source value from the source range to the destination range lwDest = LwMulDiv(xp, cRangeDest, cxScrollbar) + iRangeDestFirst; // if param2 is 0, we are dragging the thumb tab, just need to update // the counters if (pcmd->rglw[2] == 0) fThumbDrag = fTrue; break; default: Assert(fFalse, "invalid chtt from studio scroll"); break; } // restrict to valid range lwDestOld = lwDest; lwDest = LwMin(fScene ? _pmvie->Cscen() - 1 : pscen->NfrmLast(), LwMax(fScene ? 0 : pscen->NfrmFirst(), lwDest)); if (lwDestOld != lwDest) { tool = -1; } LExecuteCmd: if (!_pmvie->FPlaying()) { STN stn; if (fScene) { if (fThumbDrag) { // update scene counter stn.FFormatSz(PszLit("%4d"), lwDest + 1); _ptgobScene->SetText(&stn); return fTrue; } else { if (tool != -1) { _pmvie->Pmcc()->PlayUISound(tool); } // scene change if (!_pmvie->FSwitchScen(lwDest)) { return fFalse; } if (_pmvie->FSoundsEnabled()) { _pmvie->Pmsq()->PlayMsq(); } else { _pmvie->Pmsq()->FlushMsq(); } Update(); } } else { if (fThumbDrag) { // update frame counter stn.FFormatSz(PszLit("%4d"), lwDest - pscen->NfrmFirst() + 1); _ptgobFrame->SetText(&stn); return fTrue; } else { // frame change if (tool != -1) { _pmvie->Pmcc()->PlayUISound(tool); } if (!pscen->FGotoFrm(lwDest)) { return fFalse; } if (_pmvie->FSoundsEnabled()) { _pmvie->Pmsq()->PlayMsq(); } else { _pmvie->Pmsq()->FlushMsq(); } Update(); } } } return fTrue; } /*****************************************************************************\ * * _CxScrollbar * Calculates the slidable length of a scrollbar based on a non-zero * width thumb tab which has its position associated with its leftmost * pixel. * * Parameters: * kidScrollbar - id for the scrollbar gob * kidThumb - id for the thumb tab gob * * Returns: * Length of the slidable region of the scrollbar * \*****************************************************************************/ long SSCB::_CxScrollbar(long kidScrollbar, long kidThumb) { AssertThis(0); long cxThumb, cxScrollbar; PGOB pgob; RC rc; // rightmost pos we can slide the thumb tab is the pos where it has // its right edge at the max pos of the scrollbar, or in other words, it // is its own width away from the max pos of the scrollbar // calculate the thumb tab width if (pvNil == (pgob = ((APP *)vpappb)->Pkwa()->PgobFromHid(kidThumb))) return 0; pgob->GetRc(&rc, cooLocal); cxThumb = rc.xpRight - rc.xpLeft + 1; // calculate the scrollbar width if (pvNil == (pgob = ((APP *)vpappb)->Pkwa()->PgobFromHid(kidScrollbar))) return 0; pgob->GetRc(&rc, cooLocal); cxScrollbar = rc.xpRight - rc.xpLeft + 1 - cxThumb; return cxScrollbar; } /*****************************************************************************\ * * Update * Update the studio scrollbars. * * Parameters: * None. * * Returns: * Nothing. * \*****************************************************************************/ void SSCB::Update(void) { AssertThis(0); PSCEN pscen; STN stn; PGOB pgob; RC rc; long xp, dxp; long cxScrollbar; // need a valid movie ptr, also a ptr to the current scene if ((pvNil == _pmvie) || (pvNil == (pscen = _pmvie->Pscen()))) return; // update the frame scrollbar if (pvNil != (pgob = ((APP *)vpappb)->Pkwa()->PgobFromHid(kidFrameScrollbar))) { // source range: [first_frame, ..., last_frame] long cfrm = pscen->NfrmLast() - pscen->NfrmFirst() + 1; // source value: index of the current frame long ifrm = pscen->Nfrm() - pscen->NfrmFirst(); pgob->GetRc(&rc, cooParent); if (cfrm < 2) { // special case to avoid divide by zero in scaling // we use cfrm - 1 as the size of the destination range so // the highest value will get mapped to the right endpoint xp = 0; } else { // source value should be in source range AssertIn(ifrm, 0, cfrm); // calculate destination range: mouse positions on scrollbar cxScrollbar = _CxScrollbar(kidFrameScrollbar, kidFrameThumb); // map the source value from the source range to the destination range xp = LwMulDiv(ifrm, cxScrollbar, cfrm - 1); } // move the frame thumb tab to the appropriate position if (pvNil != (pgob = ((APP *)vpappb)->Pkwa()->PgobFromHid(kidFrameThumb))) { pgob->GetPos(&rc, pvNil); dxp = xp - rc.xpLeft; ((PGOK)pgob)->FSetRep(chidNil, fgokNoAnim, ctgNil, dxp, 0, 0); } } // update the scene scrollbar if (pvNil != (pgob = ((APP *)vpappb)->Pkwa()->PgobFromHid(kidSceneScrollbar))) { // source range: [0, ..., num_scenes - 1] long cscen = _pmvie->Cscen(); // source value: index of current scene long iscen = _pmvie->Iscen(); pgob->GetRc(&rc, cooParent); if (cscen < 2) { // special case to avoid divide by zero in scaling // we use cscen - 1 as the size of the destination range so // the highest value will get mapped to the right endpoint xp = 0; } else { // source value should be in source range AssertIn(iscen, 0, cscen); // calculate destination range: mouse positions on scrollbar cxScrollbar = _CxScrollbar(kidSceneScrollbar, kidSceneThumb); // map the source value from the source range to the destination range xp = LwMulDiv(iscen, cxScrollbar, cscen - 1); } // move the scene thumb tab to the appropriate position if (pvNil != (pgob = ((APP *)vpappb)->Pkwa()->PgobFromHid(kidSceneThumb))) { pgob->GetPos(&rc, pvNil); dxp = xp - rc.xpLeft; ((PGOK)pgob)->FSetRep(chidNil, fgokNoAnim, ctgNil, dxp, 0, 0); } } // update the other stuff, frame and scene counters, fps // update frame counter if (_fNoAutoadjust) { stn.FFormatSz(PszLit("%4d"), pscen->Nfrm() - _nfrmFirstOld + 1); } else { stn.FFormatSz(PszLit("%4d"), pscen->Nfrm() - pscen->NfrmFirst() + 1); } _ptgobFrame->SetText(&stn); // update scene counter stn.FFormatSz(PszLit("%4d"), _pmvie->Iscen() + 1); _ptgobScene->SetText(&stn); #ifdef SHOW_FPS { long cfrmTail, cfrmCur; ulong tsTail, tsCur; float fps; /* Get current info */ tsCur = TsCurrent(); cfrmCur = _pmvie->Cnfrm(); /* Get least recent frame registered */ tsTail = _rgfdsc[_itsNext].ts; cfrmTail = _rgfdsc[_itsNext].cfrm; /* Register current frame */ _rgfdsc[_itsNext].ts = tsCur; _rgfdsc[_itsNext++].cfrm = cfrmCur; if (tsTail < _pmvie->TsStart()) { tsTail = _pmvie->TsStart(); cfrmTail = 0; } Assert(_itsNext <= kctsFps, "Bogus fps next state"); if (_itsNext == kctsFps) _itsNext = 0; fps = ((float)((cfrmCur - cfrmTail) * kdtsSecond)) / ((float)(tsCur - tsTail)); stn.FFormatSz(PszLit("%2d.%02d fps"), (int)fps, (int)((fps - (int)fps) * 100)); _ptgobFps->SetText(&stn); } #endif // SHOW_FPS } /*****************************************************************************\ * * Change the owner movie for these scroll bars * * Parameters: * pmvie - new movie * * Returns: * Nothing. * \*****************************************************************************/ void SSCB::SetMvie(PMVIE pmvie) { _pmvie = pmvie; Update(); } /*****************************************************************************\ * * Start a period of no autoadjusting on the scroll bars * * Parameters: * Nothing. * * Returns: * Nothing. * \*****************************************************************************/ void SSCB::StartNoAutoadjust(void) { AssertThis(0); _fNoAutoadjust = fTrue; Assert(_pmvie->Pscen() != pvNil, "Bad scene"); _nfrmFirstOld = _pmvie->Pscen()->NfrmFirst(); Update(); } void SSCB::SetSndFrame(bool fSoundInFrame) { long snoNew = fSoundInFrame ? kst2 : kst1; PGOK pgokThumb = (PGOK)vapp.Pkwa()->PgobFromHid(kidFrameThumb); if (pgokThumb != pvNil && pgokThumb->FIs(kclsGOK)) { if (pgokThumb->Sno() != snoNew) pgokThumb->FChangeState(snoNew); } else Bug("Missing or invalid thumb GOB"); } #ifdef DEBUG /*****************************************************************************\ * * Mark memory used by the SSCB * * Parameters: * None. * * Returns: * Nothing. * \*****************************************************************************/ void SSCB::MarkMem(void) { AssertThis(0); SSCB_PAR::MarkMem(); } /*****************************************************************************\ * * Assert the validity of the SSCB * * Parameters: * grf - bit array of options. * * Returns: * Nothing. * \*****************************************************************************/ void SSCB::AssertValid(ulong grf) { SSCB_PAR::AssertValid(fobjAllocated); } #endif // DEBUG ================================================ FILE: src/studio/stdiosnd.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*****************************************************************************\ * * sound.cht * * All sounds that appear in the studio. * * Author: Sean Selitrennikoff * * Status: NOT REVIEWED * \*****************************************************************************/ WAVE_CHUNK("studio\sound\cover.wav", kcnoCoverWav) WAVE_CHUNK("studio\sound\pbrowse.wav", kcnoPBrowseWav) WAVE_CHUNK("studio\sound\dropdn.wav", kcnoDropDnWav) WAVE_CHUNK("studio\sound\sbrowse.wav", kcnoSBrowseWav) WAVE_CHUNK("studio\sound\brwzpic.wav", kcnoBrwzPicWav) WAVE_CHUNK("studio\sound\brwzbtn.wav", kcnoBrwzBtnWav) WAVE_CHUNK("studio\sound\ezlopen.wav", kcnoEzlOpenWav) WAVE_CHUNK("studio\sound\stateon.wav", kcnoStateOnWav) WAVE_CHUNK("studio\sound\stateoff.wav", kcnoStateOffWav) WAVE_CHUNK("studio\sound\grabsn.wav", kcnoGrabSnWav) WAVE_CHUNK("studio\sound\dropsn.wav", kcnoDropSnWav) WAVE_CHUNK("studio\sound\select.wav", kcnoSelectWav) WAVE_CHUNK("studio\sound\squash.wav", kcnoSquashWav) WAVE_CHUNK("studio\sound\stretch.wav", kcnoStretchWav) WAVE_CHUNK("studio\sound\grow.wav", kcnoGrowWav) WAVE_CHUNK("studio\sound\shrink.wav", kcnoShrinkWav) WAVE_CHUNK("studio\sound\cbacks.wav", kcnoCBackSWav) WAVE_CHUNK("studio\sound\rotate.wav", kcnoRotateWav) WAVE_CHUNK("studio\sound\cbackr.wav", kcnoCBackRWav) WAVE_CHUNK("studio\sound\sfreeze.wav", kcnoSFreezeWav) WAVE_CHUNK("studio\sound\systepf.wav", kcnoSyStepFWav) WAVE_CHUNK("studio\sound\systepb.wav", kcnoSyStepBWav) WAVE_CHUNK("studio\sound\move.wav", kcnoMoveWav) WAVE_CHUNK("studio\sound\move1.wav", kcnoMove1Wav) WAVE_CHUNK("studio\sound\moveall.wav", kcnoMoveAllWav) WAVE_CHUNK("studio\sound\actstepf.wav", kcnoActStepFWav) WAVE_CHUNK("studio\sound\actstepb.wav", kcnoActStepBWav) WAVE_CHUNK("studio\sound\tbkopen.wav", kcnoTBkOpenWav) WAVE_CHUNK("studio\sound\splay.wav", kcnoSPlayWav) WAVE_CHUNK("studio\sound\sloop.wav", kcnoSLoopWav) WAVE_CHUNK("studio\sound\sact.wav", kcnoSActWav) WAVE_CHUNK("studio\sound\wfont.wav", kcnoWFontWav) WAVE_CHUNK("studio\sound\wsize.wav", kcnoWSizeWav) WAVE_CHUNK("studio\sound\wcolor.wav", kcnoWColorWav) WAVE_CHUNK("studio\sound\wstyle.wav", kcnoWStyleWav) WAVE_CHUNK("studio\sound\wbgclr.wav", kcnoWBgClrWav) WAVE_CHUNK("studio\sound\wscron.wav", kcnoWScrOnWav) WAVE_CHUNK("studio\sound\wscroff.wav", kcnoWScrOffWav) WAVE_CHUNK("studio\sound\gofrstf.wav", kcnoGoFrstFWav) WAVE_CHUNK("studio\sound\goprevf.wav", kcnoGoPrevFWav) WAVE_CHUNK("studio\sound\gonextf.wav", kcnoGoNextFWav) WAVE_CHUNK("studio\sound\addframe.wav", kcnoAddFrameWav) WAVE_CHUNK("studio\sound\golastf.wav", kcnoGoLastFWav) WAVE_CHUNK("studio\sound\gofrsts.wav", kcnoGoFrstSWav) WAVE_CHUNK("studio\sound\goprevs.wav", kcnoGoPrevSWav) WAVE_CHUNK("studio\sound\gonexts.wav", kcnoGoNextSWav) WAVE_CHUNK("studio\sound\golasts.wav", kcnoGoLastSWav) WAVE_CHUNK("studio\sound\play.wav", kcnoPlayWav) WAVE_CHUNK("studio\sound\stop.wav", kcnoStopWav) WAVE_CHUNK("studio\sound\undo.wav", kcnoUndoWav) WAVE_CHUNK("studio\sound\redo.wav", kcnoRedoWav) WAVE_CHUNK("studio\sound\rembfr.wav", kcnoRemBfrWav) WAVE_CHUNK("studio\sound\remaftr.wav", kcnoRemAftrWav) WAVE_CHUNK("studio\sound\remscn.wav", kcnoRemScnWav) WAVE_CHUNK("studio\sound\remactr.wav", kcnoRemActrWav) WAVE_CHUNK("studio\sound\remwbox.wav", kcnoRemWBoxWav) WAVE_CHUNK("studio\sound\paste.wav", kcnoPasteWav) WAVE_CHUNK("studio\sound\copyp.wav", kcnoCopyPWav) WAVE_CHUNK("studio\sound\copy.wav", kcnoCopyWav) WAVE_CHUNK("studio\sound\cut.wav", kcnoCutWav) WAVE_CHUNK("studio\sound\sectool.wav", kcnoSecToolWav) WAVE_CHUNK("studio\sound\ok.wav", kcnoOkWav) WAVE_CHUNK("studio\sound\cancel.wav", kcnoCancelWav) WAVE_CHUNK("studio\sound\fnew.wav", kcnoFNewWav) WAVE_CHUNK("studio\sound\fsave.wav", kcnoFSaveWav) WAVE_CHUNK("studio\sound\fsaveas.wav", kcnoFSaveAsWav) WAVE_CHUNK("studio\sound\pfopen.wav", kcnoPFOpenWav) WAVE_CHUNK("studio\sound\exit.wav", kcnoExitWav) WAVE_CHUNK("studio\sound\pageup.wav", kcnoPageUpWav) WAVE_CHUNK("studio\sound\pagedn.wav", kcnoPageDnWav) WAVE_CHUNK("studio\sound\rswitch.wav", kcnoRSwitchWav) WAVE_CHUNK("studio\sound\lselect.wav", kcnoLSelectWav) WAVE_CHUNK("studio\sound\nukesn.wav", kcnoNukeSnWav) WAVE_CHUNK("studio\sound\costume.wav", kcnoCostumeWav) WAVE_CHUNK("studio\sound\acesory.wav", kcnoAcesoryWav) WAVE_CHUNK("studio\sound\spin.wav", kcnoSpinWav) WAVE_CHUNK("studio\sound\mike.wav", kcnoMikeWav) WAVE_CHUNK("studio\sound\rplay.wav", kcnoRPlayWav) WAVE_CHUNK("studio\sound\pselect.wav", kcnoPSelectWav) WAVE_CHUNK("studio\sound\random.wav", kcnoRandomWav) WAVE_CHUNK("studio\sound\mapopen.wav", kcnoMapOpenWav) WAVE_CHUNK("studio\sound\recframe.wav", kcnoRecordWav) ================================================ FILE: src/studio/studio.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*****************************************************************************\ * * studio.cht * * Mail build input file for the entire Socrates studio. It includes * all component .cht files. * * Author: Sean Selitrennikoff * * Status: REVIEWED * * Notes: * - kidStudio is used as a "nil" type value for initializing values * that will store a kid that may be state changed at will. * * - kidBackground->fEnableXxxx is used to store whether the secondary * tool bar doors for Xxxx are open (enabled) or closed. * * - kidBackground->idPriOpen stores the kid of the cover that is * currently open in the primary toolbar. * * - kidBackground->idtbxDown stores the kid of the textbox tools that * is currently selected. * * - kidBackground->idactDown stores the kid of the actor tools that * is currently selected. * * - kidBackground->chttXxx stores the current tool in use for secondary * toolbar Xxx. * * - ZPlanes: Background is at 0. Tools are at 10. Covers and doors * are at 20. Popups at 100. Browsers and easels at 200. * * - For radio groups, e.g. the primary tool covers, the algorithm is * to store (globally) the id of the cover that is open, and then if * any other cover wishes to open, it first closes the other cover, opens * itself and then updates the state variable. * \*****************************************************************************/ // // Useful macros // // Uncomment the following line to pack the studio chunks #define PACKALL #include "kidgs.chh" // // Definitions for the studio // #include "stdiopos.chh" #include "stdiodef.h" #include "helptops.h" #include "helpbook.h" #include "projmain.h" #include "balloons.chh" #include "helpres.h" // Shared stuff between building and studio (cursors, map). #include "sharedef.h" #include "sharutil.chh" // bio pages #include "biopage.chh" // // Get the cursors // #include "stdiocrs.h" #include "cursors.cht" // // Include other chunky input files // #include "stdiosnd.cht" #include "sectools.cht" #include "popups.cht" #include "popdn.cht" #include "browser.cht" #include "easels.cht" #include "stdioscb.cht" #include "helpres.cht" #include "helpctrl.cht" #include "helpbook.cht" #include "hlpbkper.cht" #include "gadget.cht" #include "gadgpers.cht" #include "projmain.cht" #include "tblogowz.cht" #include "tbhtscen.cht" #include "tbhtsoun.cht" #include "tbhtactr.cht" #include "tbhtword.cht" #include "tbguidhp.cht" #include "tbbasics.cht" #include "tbproj1.cht" #include "tbproj2.cht" #include "tbproj3.cht" #include "tbproj4.cht" #include "tbproj5.cht" #include "tbproj6.cht" // // // Start up chunk/script // // SCRIPTCHUNK("Studio", kidStudio) If(_parm[0] == 0); Transition(kgftDissolve, 0, kTransitionTime, Transparent, kidPalette); End; CreateChildThis(kidBackground, kidBackground); ENDCHUNK // // Extract the palette from a bitmap // PALETTECHUNK("Palette", kidPalette, "studio\bmp\socpal.bmp") // // This is the main studio background. Everything in the studio is // a descendent of this. // GOBCHUNK("Background", kidBackground, kgokkRectHit) DEFAULT_POSITION(kxpBackground, kypBackground, 0) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, CHID1(kchidClick), cidNil, cnoNil) ENDCHUNK REP_RECT(CHID(kstDefault, krepDefault), "hidden", kxpBackground, kypBackground, kdxpBackground, kdypBackground) CREATE_SCRIPT("Background -- create") DEBUGCMD(PrintStr("Creating the Tools background gob.")); // Make sure keyboard accelerators are enabled. ASSERT(kgobUtil->cDisable == 0); ENABLEACCEL(fTrue); // // Create all the children // CreateChildThis(kidBackground1, kidBackground1); CreateChildThis(kidBackground2, kidBackground2); CreateChildThis(kidBackground3, kidBackground3); CreateChildThis(kidBackground4, kidBackground4); CreateChildThis(kidFrameBackground, kidFrameBackground); CreateChildThis(kidSceneBackground, kidSceneBackground); CreateChildThis(kidWorkspace, kidWorkspace); CreateChildThis(kidSettingsCover, kidSettingsCover); CreateChildThis(kidActorsCover, kidActorsCover); CreateChildThis(kidSoundsCover, kidSoundsCover); CreateChildThis(kidTextsCover, kidTextsCover); CreateChildThis(kidScrollbarsCover, kidScrollbarsCover); CreateChildThis(kidUndosCover, kidUndosCover); CreateChildThis(kidBooksCover, kidBooksCover); CreateChildThis(kidDoors, kidDoors); CreateChildThis(kidBook, kidBook); CreateChildThis(kidMap, kidMap); CreateChildThis(kidCutCopyPaste, kidCutCopyPaste); CreateChildThis(kidCCPBackground, kidCCPBackground); CreateChildThis(kidUndo, kidUndo); CreateChildThis(kidVolumeSlider, kidVolumeSlider); CreateChildThis(kidPlay, kidPlay); CreateChildThis(kidPortfolio, kidPortfolio); CreateChildThis(kidPortsBackground, kidPortsBackground); CreateChildThis(kidName, kidName); CreateHelpGob(kidName, klabName); #ifdef SHOW_FPS CreateChildThis(kidFps, kidFps); #endif // SHOW_FPS CreateChildThis(kidExit, kidExit); CreateChildThis(kidSettingsBrowser, kidSettingsBrowser); CreateChildThis(kidActorsBrowser, kidActorsBrowser); CreateChildThis(kidActorsPropBrowser, kidActorsPropBrowser); CreateChildThis(kidActorsSpletters, kidActorsSpletters); CreateChildThis(kidSoundsEfxBrowser, kidSoundsEfxBrowser); CreateChildThis(kidSoundsMicBrowser, kidSoundsMicBrowser); CreateChildThis(kidSoundsMusicBrowser, kidSoundsMusicBrowser); CreateChildThis(kidTextsCreate, kidTextsCreate); CreateChildThis(kidRotateBackground, kidRotateBackground); CreateChildThis(kidTransformBackground, kidTransformBackground); CreateChildThis(kidScrollBackground, kidScrollBackground); CreateChildThis(kidActorsSoonerButton, kidActorsSoonerButton); CreateChildThis(kidActorsLaterButton, kidActorsLaterButton); CreateChildThis(kidHelpAnchor, kidHelpAnchor); // // Create help book static information // CreateChildThis(kgobHelpBookPersistent, kgobHelpBookPersistent); // // Set tooltip delay // SetProp(kpridToolTipDelay, kdtimToolTipDelay); // REVIEW: ***** : REMOVE THIS! SetProp(kpridToolTipDelay, 90 ); // flag for easel help ::fHelpOn = fFalse; // Remember the place we're supposed to return to the building at // because kpridBuildingGob can get messed up. (Bug #1010) SetProp(kpridBuildingGobT, GetProp(kpridBuildingGob)); SetProp(kpridBuildingStateT, GetProp(kpridBuildingState)); // // Initialize all globally accessible state information // .fAllSceneDoors = fFalse; .fAllActorDoors = fFalse; .fAllSoundDoors = fFalse; .fAllTextDoors = fFalse; .fEnableActorTools = fFalse; .fEnableSceneTools = fFalse; .fEnableTboxTools = fFalse; .idPriOpen = kidStudio; .idtbxDown = kidStudio; .idactDown = kidStudio; .idscnDown = kidStudio; .fpseDown = fFalse; .chttTbox = chttTboxSelect; .chttActor = chttCompose; .fXYAxis = fFalse; .fRGround = fFalse; ENDCHUNK //////////////////////////////////////////////////////////////////////// CHILD_SCRIPT("Reset tools", CHID1(kchidResetTools)) // // Unclick cut/copy/paste button, if down // If (.idscnDown != kidStudio); ChangeStateGob(.idscnDown, kstDefault); .idscnDown = kidStudio; End; // // Reset all leveling state variables // .fEnableActorTools = fFalse; .fEnableSceneTools = fFalse; .fEnableTboxTools = fFalse; .idtbxDown = kidStudio; .idscnDown = kidStudio; .fpseDown = fFalse; .chttTbox = chttTboxSelect; .chttActor = chttCompose; .fXYAxis = fFalse; .fRGround = fFalse; EnqueueCid(cidSetTool, khidStudio, chttNone, 0, 0, 0); // change to Nil tool // // Resets the leveling in the studio // If (StateGob(kidDoors) != kstDefault); ChangeStateGob(kidDoors, kstDefault); End; If (StateGob(kidSettingsCover) != kstOpen); ChangeStateGob(kidSettingsCover, kstOpen); End; If (StateGob(kidActorsCover) != kstDisabled); ChangeStateGob(kidActorsCover, kstDisabled); End; If (StateGob(kidSoundsCover) != kstDisabled); ChangeStateGob(kidSoundsCover, kstDisabled); End; If (StateGob(kidTextsCover) != kstDisabled); ChangeStateGob(kidTextsCover, kstDisabled); End; If (StateGob(kidScrollbarsCover) != kstClosed); ChangeStateGob(kidScrollbarsCover, kstClosed); End; If (StateGob(kidUndosCover) != kstClosed); ChangeStateGob(kidUndosCover, kstClosed); End; If (StateGob(kidBooksCover) != kstOpen); ChangeStateGob(kidBooksCover, kstOpen); End; If ((GetProp(kpridStudioFlags) & 1) != 0); CreateChildThis(kidSequenceParent, kidSequenceParent); CreateChildThis(kidGuideHelp, kidGuideHelp); SetProp(kpridStudioFlags, GetProp(kpridStudioFlags) & 0xfffffffe); End; ENDCHUNK CHILD_SCRIPT("Set pause type", CHID1(kchidSetPauseType)) .fpseDown = _parm[0]; ENDCHUNK CHILD_SCRIPT("Enable scene tools", CHID1(kchidEnableSceneTools)) kidBackground->fEnableSceneTools = fTrue; If(kidBackground->idPriOpen == kidSettingsCover); ChangeStateGob(kidDoors, kstSceneDoorsOpen); End; ENDCHUNK CHILD_SCRIPT("Enable actor tools", CHID1(kchidEnableActorTools)) kidBackground->fEnableActorTools = fTrue; If(kidBackground->idPriOpen == kidActorsCover); ChangeStateGob(kidDoors, kstActorDoorsOpen); End; ENDCHUNK CHILD_SCRIPT("Enable tbox tools", CHID1(kchidEnableTboxTools)) kidBackground->fEnableTboxTools = fTrue; If(kidBackground->idPriOpen == kidTextsCover); ChangeStateGob(kidDoors, kstTextDoorsOpen); End; ENDCHUNK CHILD_SCRIPT("Invoke Project Gadget", CHID1(kchidMovieTechniques)) DEBUGCMD(PrintStr("Running kchidMovieTechniques")); // change help button to gadget button CreateChildThis(kidGadget, kidGadget); CreateChildThis(kidGadgetStartUp, kidGadgetStartUp); // set up the movie names so code can read them // NOTE: These are #define'd in projmain.h CopyStr(PROJECT1_MOVIENAME, stidMovie1) ; CopyStr(PROJECT2_MOVIENAME, stidMovie2) ; CopyStr(PROJECT3_MOVIENAME, stidMovie3) ; CopyStr(PROJECT4_MOVIENAME, stidMovie4) ; CopyStr(PROJECT5_MOVIENAME, stidMovie5) ; CopyStr(PROJECT6_MOVIENAME, stidMovie6) ; ENDCHUNK CHILD_SCRIPT("Invoke Flying Logo", CHID1(kchidFlyingLogo)) DEBUGCMD(PrintStr("Running kchidFlyingLogo")); CreateChildThis(kidSequenceParent, kidSequenceParent); CreateChildThis(kidLogoWizard, kidLogoWizard); ENDCHUNK CHILD_SCRIPT("Reset XZ/XY axis to XZ and respect ground", CHID1(kchidResetXZAxisAndGround)) .fXYAxis = fFalse; .fRGround = fFalse; ENDCHUNK CHILD_SCRIPT("Open doors all the way", CHID1(kchidOpenDoorsAll)) .fAllSceneDoors = fTrue; .fAllActorDoors = fTrue; .fAllSoundDoors = fTrue; .fAllTextDoors = fTrue; If(StateGob(kidDoors) == kstSceneDoorsOpen); ChangeStateGob(kidDoors, kstSceneDoorsAllOpen); Elif(StateGob(kidDoors) == kstActorDoorsOpen); ChangeStateGob(kidDoors, kstActorDoorsAllOpen); Elif(StateGob(kidDoors) == kstSoundDoorsOpen); ChangeStateGob(kidDoors, kstSoundDoorsAllOpen); Elif(StateGob(kidDoors) == kstTextDoorsOpen); ChangeStateGob(kidDoors, kstTextDoorsAllOpen); End; ENDCHUNK CHILD_SCRIPT("Popout scene tools", CHID1(kchidPopoutSceneTools)) // // Unclick any tool that is down. // If (.idscnDown != kidStudio); ChangeStateGob(.idscnDown, kstDefault); .idscnDown = kidStudio; End; ENDCHUNK // // The background is divided into four bitmaps surrounding the // workspace, to save redraws. // GOBCHUNK("Background 1", kidBackground1, kgokkRectHit) DEFAULT_POSITION(kxpBackground1, kypBackground1, 0) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_MBMPREG(CHID1(krepDefault), "studio\bmp\back1.bmp", kxpregBackground1, kypregBackground1) // Background 2 only serves to create the rollcall actor browser. GOBCHUNK("Background 2", kidBackground2, kgokkRectHit) DEFAULT_POSITION(kxpBackground2, kypBackground2, 0) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK CREATE_SCRIPT("Background 2 - create") EnqueueCid(cidBrowserReady, khidStudio, kidRollCallActor, kidRollCallActorFrame, kidRollCallActorDownArrow, (kdxpRollCallActorFrameBorder << 16) | kdypRollCallActorFrameBorder); ENDCHUNK REP_MBMPREG(CHID1(krepDefault), "studio\bmp\back2.bmp", kxpregBackground2, kypregBackground2 ) // Background 3 only serves to create the rollcall prop browser. GOBCHUNK("Background 3", kidBackground3, kgokkRectHit) DEFAULT_POSITION(kxpBackground3, kypBackground3, 0) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK CREATE_SCRIPT("Background 3 - create") EnqueueCid(cidBrowserReady, khidStudio, kidRollCallProp, kidRollCallPropFrame, kidRollCallPropDownArrow, (kdxpRollCallPropFrameBorder << 16) | kdypRollCallPropFrameBorder); ENDCHUNK REP_MBMPREG(CHID1(krepDefault), "studio\bmp\back3.bmp", kxpregBackground3, kypregBackground3) GOBCHUNK("Background 4", kidBackground4, kgokkRectHit) DEFAULT_POSITION(kxpBackground4, kypBackground4, 0) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_MBMPREG(CHID1(krepDefault), "studio\bmp\back4.bmp", kxpregBackground4, kypregBackground4) // // // Create the background for the scroll bars // // GOBCHUNK("Background - Frame Scrollbar", kidFrameBackground, kgokkRectHit) DEFAULT_POSITION(kxpFrameBackground, kypFrameBackground, 0) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_MBMPREG(CHID1(krepDefault), "studio\bmp\fpar1.bmp", kxpregFrameBackground, kypregFrameBackground ) CREATE_SCRIPT("Background - Frame Scrollbar -- create") CreateChildThis(kidFrameTitle, kidFrameTitle); CreateChildThis(kidFrameText, kidFrameText); CreateChildThis(kidFrameFW, kidFrameFW); CreateChildThis(kidFrameFWEnd, kidFrameFWEnd); CreateChildThis(kidFrameRW, kidFrameRW); CreateChildThis(kidFrameRWEnd, kidFrameRWEnd); CreateChildThis(kidFrameScrollbar, kidFrameScrollbar); CreateChildGob(kidFrameScrollbar, kidFrameThumb, kidFrameThumb); ENDCHUNK GOBCHUNK("Background - Scene Scrollbar", kidSceneBackground, kgokkRectHit) DEFAULT_POSITION(kxpSceneBackground, kypSceneBackground, 0) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_MBMPREG(CHID1(krepDefault), "studio\bmp\spar1.bmp", kxpregSceneBackground, kypregSceneBackground) CREATE_SCRIPT("Background - Scene Scrollbar -- create") CreateChildThis(kidSceneTitle, kidSceneTitle); CreateChildThis(kidSceneText, kidSceneText); CreateChildThis(kidSceneFW, kidSceneFW); CreateChildThis(kidSceneFWEnd, kidSceneFWEnd); CreateChildThis(kidSceneRW, kidSceneRW); CreateChildThis(kidSceneRWEnd, kidSceneRWEnd); CreateChildThis(kidSceneScrollbar, kidSceneScrollbar); CreateChildGob(kidSceneScrollbar, kidSceneThumb, kidSceneThumb); ENDCHUNK // // Create the workspace // GOBCHUNK("Workspace", kidWorkspace, kgokkRectHit) DEFAULT_POSITION(kxpWorkspace, kypWorkspace, 0) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_RECT(CHID(kstDefault, krepDefault), "hidden", 0, 0, kdxpWorkspace, kdypWorkspace) // // Create the Help Anchor, use to anchor help balloons to the bottom right corner // GOBCHUNK("Help Anchor", kidHelpAnchor, kgokkRectNoHit ) DEFAULT_POSITION(kxpHelpAnchor, kypHelpAnchor, 20) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK //REP_MASK(CHID(kstDefault, krepDefault), "studio\bmp\helpanch.bmp", kxpregHelpAnchor, kypregHelpAnchor) REP_RECT( CHID( kstDefault, krepDefault), "anchor for help", 0, 0, 1, 1 ) // // // Primary Covers // // // // Scene cover // GOBCHUNK("Settings", kidSettingsCover, kgokkRectHit) DEFAULT_POSITION(kxpSettingsCover, kypSettingsCover, 20) ACTION(fcustNil, fcustNil, fgrfstClosed, kcrsHand, CHID(kstClosed, kchidClick), cidNil, kttSettingsCover) ENDCHUNK REP_MBMPREG(CHID(kstDisabled, krepDefault), "studio\bmp\covr1d.bmp", kxpregSettingsCover, kypregSettingsCover) REP_MBMPREG(CHID(kstClosed, krepDefault), "studio\bmp\covr1c.bmp", kxpregSettingsCover, kypregSettingsCover) REP_MBMPREG(CHID(kstOpen, krepDefault), "studio\bmp\covr1o.bmp", kxpregSettingsCover, kypregSettingsCover) ADOPT_WAVE(kcnoCoverWav, CHID(kstClosed, krepClicked)) CREATE_ANIMST("Settings -- Covered -> Open", kstOpen) If(kidBackground->idPriOpen != GidThis()); CreateChildGob(kidBackground, kidSettingsBackground, kidSettingsBackground); EnqueueCid(cidSetTool, khidStudio, chttNone, 0, 0, 0); // change to Nil tool ChangeStateGob(kidBackground->idPriOpen, kstClosed); kidBackground->idPriOpen = GidThis(); ChangeStateGob(kidDoors, kstDefault); If(kidBackground->fEnableSceneTools); ChangeStateGob(kidDoors, kstSceneDoorsOpen); Else; ChangeStateGob(kidDoors, kstDefault); End; ChangeStateGob(kidCCPActorNuke, kst1); // Use Scene nuke bmp End; ENDCHUNK CREATE_ANIMST("Settings -- Open -> Closed", kstClosed) If(FGobExists(kidSettingsBackground)); DestroyGob(kidSettingsBackground); If(kidBackground->idPriOpen == GidThis()); kidBackground->idPriOpen = kidStudio; End; End; ENDCHUNK CHILD_SCRIPT("Settings -- Covered", CHID(kstClosed, kchidClick)) If(kidBackground->idPriOpen != GidThis()); ChangeStateThis(kstOpen); End; ENDCHUNK // // Actor cover // GOBCHUNK("Actors", kidActorsCover, kgokkRectHit) DEFAULT_POSITION(kxpActorsCover, kypActorsCover, 20) ACTION(fcustNil, fcustNil, fgrfstClosed, kcrsHand, CHID(kstClosed, kchidClick), cidNil, kttActorsCover) ENDCHUNK REP_MBMPREG(CHID(kstDisabled, krepDefault), "studio\bmp\covr2d.bmp", kxpregActorsCover, kypregActorsCover) REP_MBMPREG(CHID(kstClosed, krepDefault), "studio\bmp\covr2c.bmp", kxpregActorsCover, kypregActorsCover) ADOPT_WAVE(kcnoCoverWav, CHID(kstClosed, krepClicked)) CREATE_ANIMST("Actors -- Closed -> Open", kstOpen) If(kidBackground->idPriOpen != GidThis()); CreateChildGob(kidBackground, kidActorsBackground, kidActorsBackground); ChangeStateGob(kidBackground->idPriOpen, kstClosed); kidBackground->idPriOpen = GidThis(); ChangeStateGob(kidDoors, kstDefault); If(kidBackground->fEnableActorTools); ChangeStateGob(kidDoors, kstActorDoorsOpen); Else; ChangeStateGob(kidDoors, kstDefault); End; ChangeStateGob(kidCCPActorNuke, kst3); // Use Actor nuke bmp End; ENDCHUNK CREATE_ANIMST("Actors -- Open -> Closed", kstClosed) If(FGobExists(kidActorsBackground)); DestroyGob(kidActorsBackground); If(kidBackground->idPriOpen == GidThis()); kidBackground->idPriOpen = kidStudio; End; End; ENDCHUNK CHILD_SCRIPT("Actors -- Covered", CHID(kstClosed, kchidClick)) If(kidBackground->idPriOpen != GidThis()); ChangeStateThis(kstOpen); End; ENDCHUNK REP_MBMPREG(CHID(kstOpen, krepDefault), "studio\bmp\covr2o.bmp", kxpregActorsCover, kypregActorsCover) // // Sounds cover // GOBCHUNK("Sounds", kidSoundsCover, kgokkRectHit) DEFAULT_POSITION(kxpSoundsCover, kypSoundsCover, 20) ACTION(fcustNil, fcustNil, fgrfstClosed, kcrsHand, CHID(kstClosed, kchidClick), cidNil, kttSoundsCover) ENDCHUNK REP_MBMPREG(CHID(kstDisabled, krepDefault), "studio\bmp\covr3d.bmp", kxpregSoundsCover, kypregSoundsCover) REP_MBMPREG(CHID(kstClosed, krepDefault), "studio\bmp\covr3c.bmp", kxpregSoundsCover, kypregSoundsCover) ADOPT_WAVE(kcnoCoverWav, CHID(kstClosed, krepClicked)) CREATE_ANIMST("Sounds -- Covered -> Open", kstOpen) CreateChildGob(kidBackground, kidSoundsBackground, kidSoundsBackground); EnqueueCid(cidSoundsEnabled, khidStudio, fTrue, 0, 0, 0); ENDCHUNK CREATE_ANIMST("Sounds -- Open -> Closed", kstClosed) If(FGobExists(kidSoundsBackground)); DestroyGob(kidSoundsBackground); If(kidBackground->idPriOpen == GidThis()); kidBackground->idPriOpen = kidStudio; EnqueueCid(cidSoundsEnabled, khidStudio, fFalse, 0, 0, 0); End; End; ENDCHUNK CHILD_SCRIPT("Sounds -- Covered", CHID(kstClosed, kchidClick)) If(kidBackground->idPriOpen != GidThis()); ChangeStateGob(kidBackground->idPriOpen, kstClosed); kidBackground->idPriOpen = GidThis(); ChangeStateGob(kidDoors, kstDefault); ChangeStateThis(kstOpen); ChangeStateGob(kidDoors, kstSoundDoorsOpen); ChangeStateGob(kidCCPActorNuke, kst5); EnqueueCid(cidSetTool, khidStudio, chttListener, 0, 0, 0); End; ENDCHUNK REP_MBMPREG(CHID(kstOpen, krepDefault), "studio\bmp\covr3o.bmp", kxpregSoundsCover, kypregSoundsCover) // // Texts cover // GOBCHUNK("Text", kidTextsCover, kgokkRectHit) DEFAULT_POSITION(kxpTextsCover, kypTextsCover, 20) ACTION(fcustNil, fcustNil, fgrfstClosed, kcrsHand, CHID(kstClosed, kchidClick), cidNil, kttTextsCover) ENDCHUNK REP_MBMPREG(CHID(kstDisabled, krepDefault), "studio\bmp\covr4d.bmp", kxpregTextsCover, kypregTextsCover) REP_MBMPREG(CHID(kstClosed, krepDefault), "studio\bmp\covr4c.bmp", kxpregTextsCover, kypregTextsCover) ADOPT_WAVE(kcnoCoverWav, CHID(kstClosed, krepClicked)) CREATE_ANIMST("Text -- Covered -> Open", kstOpen) If(kidBackground->idPriOpen != GidThis()); CreateChildGob(kidBackground, kidTextsBackground, kidTextsBackground); ChangeStateGob(kidBackground->idPriOpen, kstClosed); kidBackground->idPriOpen = GidThis(); ChangeStateGob(kidDoors, kstDefault); If(kidBackground->fEnableTboxTools); ChangeStateGob(kidDoors, kstTextDoorsOpen); Else; ChangeStateGob(kidDoors, kstDefault); End; ChangeStateGob(kidCCPActorNuke, kst7); // Use tbox nuker bmp End; ENDCHUNK CREATE_ANIMST("Text -- Open -> Closed", kstClosed) If(FGobExists(kidTextsBackground)); DestroyGob(kidTextsBackground); If(kidBackground->idPriOpen == GidThis()); kidBackground->idPriOpen = kidStudio; End; End; ENDCHUNK CHILD_SCRIPT("Text -- Covered", CHID(kstClosed, kchidClick)) If(kidBackground->idPriOpen != GidThis()); ChangeStateThis(kstOpen); EnqueueCid(cidSetTool, khidStudio, chttTboxSelect, 0, 0, 0); End; ENDCHUNK REP_MBMPREG(CHID(kstOpen, krepDefault), "studio\bmp\covr4o.bmp", kxpregTextsCover, kypregTextsCover) // // Scroll bar area cover // GOBCHUNK("Scrollbars", kidScrollbarsCover, kgokkRectHit) DEFAULT_POSITION(kxpScrollbarsCover, kypScrollbarsCover, 20) ENDCHUNK REP_MBMPREG(CHID(kstDisabled, krepDefault), "studio\bmp\covr5d.bmp", kxpregScrollbarsCover, kypregScrollbarsCover) REP_MBMPREG(CHID(kstClosed, krepDefault), "studio\bmp\covr5c.bmp", kxpregScrollbarsCover, kypregScrollbarsCover) REP_MBMPREG(CHID(kstOpen, krepDefault), "studio\bmp\covr5o.bmp", kxpregScrollbarsCover, kypregScrollbarsCover) // // Undo and Cut/Copy/Paste cover // GOBCHUNK("Undo and C/C/P", kidUndosCover, kgokkRectHit) DEFAULT_POSITION(kxpUndosCover, kypUndosCover, 20) ENDCHUNK REP_MBMPREG(CHID(kstDisabled, krepDefault), "studio\bmp\covr7d.bmp", kxpregUndosCover, kypregUndosCover) REP_MBMPREG(CHID(kstClosed, krepDefault), "studio\bmp\covr7c.bmp", kxpregUndosCover, kypregUndosCover) REP_MBMPREG(CHID(kstOpen, krepDefault), "studio\bmp\covr7o.bmp", kxpregUndosCover, kypregUndosCover) // // Book, map and portfolio cover // GOBCHUNK("Book, Map and Portfolio", kidBooksCover, kgokkRectHit) DEFAULT_POSITION(kxpBooksCover, kypBooksCover, 20) ENDCHUNK REP_MBMPREG(CHID(kstDisabled, krepDefault), "studio\bmp\covr8d.bmp", kxpregBooksCover, kypregBooksCover) REP_MBMPREG(CHID(kstClosed, krepDefault), "studio\bmp\covr8c.bmp", kxpregBooksCover, kypregBooksCover) REP_MBMPREG(CHID(kstOpen, krepDefault), "studio\bmp\covr8o.bmp", kxpregBooksCover, kypregBooksCover) // // // Tools that are primary tools, not in a popup. // // // // The book //REVIEW tony(seanse): Why are there two entries here? GOBCHUNK("Book", kidBook, kgokkRectHit) DEFAULT_POSITION(kxpBook, kypBook, 0) ACTION(fcustNil, fcustNil, fgrfstDefault, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttBook) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_MBMPREG(CHID1(krepDefault), "studio\bmp\book.bmp", kxpregBook, kypregBook) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\bookc.bmp", kxpregBook, kypregBook) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) ADOPT_WAVE(kcnoEzlOpenWav, CHID(kstDefault, krepClicked)) CHILD_SCRIPT("Help Book", CHID(kstDefault, kchidClick)) CreateChildGob(kidBackground, kgobHelpBookParent, kgobHelpBookParent); ENDCHUNK // // The gadget // GOBCHUNK("Project Gadget", kidGadget, kgokkRectHit) DEFAULT_POSITION(kxpBook, kypBook, 10) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, kchidClick, cidNil, cnoNil) ENDCHUNK REP_MBMPREG(kcell1, "studio\bmp\gadg.bmp", kxpregBook, kypregBook) ADOPT_MBMP(LAST_MBMP, CHID(kst1, krepDefault)) ADOPT_MBMP(LAST_MBMP, CHID(kst1, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kst1, krepMouseDnOff)) REP_MBMPREG(kcell2, "studio\bmp\gadgblck.bmp", kxpregBook, kypregBook) ADOPT_MBMP(LAST_MBMP, CHID(kst2, krepDefault)) REP_MBMPREG(kcell3, "studio\bmp\gadgc.bmp", kxpregBook, kypregBook) ADOPT_MBMP(LAST_MBMP, CHID(kst1, krepMouseDnOn)) REP_ANIM(CHID(kst3, krepDefault), "Gadget blinking state") cell = 0; While(); Cell(kcell1 + cell, 0, 0, 30); cell++; cell = cell % 2; End; ENDCHUNK CHILD_SCRIPT("Project gadget", kchidClick) // create the gadget CreateChildGob(kidBackground, kidGadgetParent, kidGadgetParent); ENDCHUNK // // The Map // GOBCHUNK("Map", kidMap, kgokkRectHit) DEFAULT_POSITION(kxpMap, kypMap, 0) ACTION(fcustNil, fcustNil, fgrfstDefault, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttMap) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_MBMPREG(CHID1(krepDefault), "studio\bmp\map.bmp", kxpregMap, kypregMap) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\mapc.bmp", kxpregMap, kypregMap) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) //ADOPT_WAVE(kcnoMapOpenWav, CHID(kstDefault, krepClicked)) CHILD_SCRIPT("Map Click Script", CHID(kstDefault, kchidClick)) CreateChildGob( kidBackground, kgobMapMain, kgobMapMain ); ENDCHUNK // // The C/C/P button. Starts up the popup // GOBCHUNK("CutCopyPaste", kidCutCopyPaste, kgokkRectHit) DEFAULT_POSITION(kxpCutCopyPaste, kypCutCopyPaste, 0) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttCutCopyPaste) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\ccp.bmp", kxpregCutCopyPaste, kypregCutCopyPaste) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\ccps.bmp", kxpregCutCopyPaste, kypregCutCopyPaste) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CREATE_ANIMST("CutCopyPaste --> Default", kstDefault) If (FGobExists(.idDown) && (.idDown != kidStudio)); If (.idDown == kidCCPActorNuke); If (StateGob(kidCCPActorNuke) == kst2); ChangeStateGob(.idDown, kst1); Elif (StateGob(kidCCPActorNuke) == kst4); ChangeStateGob(.idDown, kst3); Elif (StateGob(kidCCPActorNuke) == kst6); ChangeStateGob(.idDown, kst5); Else; ChangeStateGob(.idDown, kst7); End; Else; ChangeStateGob(.idDown, kstDefault); End; End; .idDown = kidStudio; ENDCHUNK CHILD_SCRIPT("CutCopyPaste", CHID(kstDefault, kchidClick)) If (StateGob(kidCCPBackground) != kstOpen); ChangeStateGob(kidCCPBackground, kstOpen); End; ENDCHUNK // // Undo/Redo button // GOBCHUNK("Undo", kidUndo, kgokkRectHit) DEFAULT_POSITION(kxpUndo, kypUndo, 0) ACTION(fcustNil, fcustNil, fgrfstOpen, kcrsHand, CHID(kstOpen, kchidClick), cidNil, kttUndo) ACTION(fcustNil, fcustNil, fgrfstClosed, kcrsHand, CHID(kstClosed, kchidClick), cidNil, kttUndo) ENDCHUNK REP_MBMPREG(CHID(kstDisabled, krepDefault), "studio\bmp\undod.bmp", kxpregUndo, kypregUndo) REP_MBMPREG(CHID(kstOpen, krepDefault), "studio\bmp\undo.bmp", kxpregUndo, kypregUndo) ADOPT_MBMP(LAST_MBMP, CHID(kstDisabled, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDisabled, krepMouseDnOff)) REP_MBMPREG(CHID(kstDisabled, krepMouseDnOn), "studio\bmp\undos.bmp", kxpregUndo, kypregUndo) ADOPT_MBMP(LAST_MBMP, CHID(kstClosed, krepDefault)) CHILD_SCRIPT("Undo", CHID(kstOpen, kchidClick)) EnqueueCid(cidUndo, 0, 0, 0, 0, 0); ChangeStateThis(kstClosed); ENDCHUNK CHILD_SCRIPT("Redo", CHID(kstClosed, kchidClick)) EnqueueCid(cidRedo, 0, 0, 0, 0, 0); ChangeStateThis(kstOpen); ENDCHUNK // // Volume controls // // -------------------------------------------------------------------------- // The thumbnail is the graphic indicator of volume level... // positioned within the slide path - not hittable // -------------------------------------------------------------------------- // Note, this code is copied from the Volume Control code in shared\map.cht. // OBJECTTY( "volume thumb", kidVolumeThumb, 1, kcrsArrow1, kgokkRectNoHit ) REP_MBMPREG(CHID1(krepDefault), "studio\bmp\volthmb.bmp", -4, -2) OBJECTTTREG("VolumeSlider", kidVolumeSlider, 0, kcrsHand1, kttVolumeSlider, kxpVolumeSlider, kypVolumeSlider) REP_MBMPREG(kcell1, "studio\bmp\vsld.bmp", kxpregVolumeSlider, kypregVolumeSlider) CREATE_SCRIPT( "Create VolumeSlider") CreateChildThis(kidVolumeThumb, kidVolumeThumb); // get initial volume value, move thumbnail //y = kdypVolumeSlider - ((GetMasterVolume() * kdypVolumeSlider) / (2*kvlmFull)); y = kdypVolumeSlider - MulDiv( GetMasterVolume(), kdypVolumeSlider, (2*kvlmFull)); MoveAbsGob(kidVolumeThumb, 0, y); ENDCHUNK REP_ANIM(CHID1(krepDefault), "Default Rep VolumeSlider") // REVIEW *****: Polling master volume every second -- affects perf? While (fTrue); // y = kdypVolumeSlider - ((GetMasterVolume() * kdypVolumeSlider) / (2*kvlmFull)); y = kdypVolumeSlider - MulDiv( GetMasterVolume(), kdypVolumeSlider, (2*kvlmFull) ); MoveAbsGob(kidVolumeThumb, 0, y); Cell(kcell1, 0, 0, 60); End; ENDCHUNK REP_ANIM(CHID1(krepMouseDnOn), "MouseDnOn VolumeSlider") // repeat up to 30000 times. .siiLoop = PlaySoundThis(kctgWave, kwavDing, 2, 0x00010000, 30000, 1, 4); While (fTrue); y = YMouseThis(); If (y < 0); y = 0; Elif (y > kdypVolumeSlider); y = kdypVolumeSlider; End; // move thumb slider MoveAbsGob(kidVolumeThumb, 0, y); // track new volume newvol = MulDiv( (2*kvlmFull), (kdypVolumeSlider-y), kdypVolumeSlider ); // set the volume SetMasterVolume(newvol); // Sample at 10/60ths of a second. Cell(0, 0, 0, 10); End; ENDCHUNK REP_ANIM(CHID1(kchidDownUpOn), "Release VolumeSlider" ) StopSound(.siiLoop); ENDCHUNK ADOPT_ANIM(LAST_ANIM, CHID1(kchidDownUpOff)) // // Play button // GOBCHUNK("Play", kidPlay, kgokkRectHit) DEFAULT_POSITION(kxpPlay, kypPlay, 0) ACTION(fcustNil, fcustNil, fgrfstDefault, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttPlay) ACTION(fcustNil, fcustNil, fgrfstSelected, kcrsHand, CHID(kstSelected, kchidClick), cidNil, kttPlay) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\play.bmp", kxpregPlay, kypregPlay) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\playc1.bmp", kxpregPlay, kypregPlay) REP_MBMPREG(CHID(kstSelected, krepDefault), "studio\bmp\plays.bmp", kxpregPlay, kypregPlay) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepMouseDnOff)) REP_MBMPREG(CHID(kstSelected, krepMouseDnOn), "studio\bmp\playc2.bmp", kxpregPlay, kypregPlay) REP_MBMPREG(CHID(kstRecording, kcell1), "studio\bmp\playm1.bmp", kxpregPlay, kypregPlay) REP_MBMPREG(CHID(kstRecording, kcell2), "studio\bmp\playm2.bmp", kxpregPlay, kypregPlay) REP_ANIM(CHID(kstRecording, krepDefault), "Flashing") chidcell = CHID(kstRecording, kcell1); While(); Cell(chidcell, 0, 0, 20); chidcell = (chidcell == CHID(kstRecording, kcell1) ? CHID(kstRecording, kcell2) : CHID(kstRecording, kcell1)); End; ENDCHUNK ADOPT_WAVE(kcnoPlayWav, CHID(kstDefault, krepClicked)) ADOPT_WAVE(kcnoStopWav, CHID(kstSelected, krepClicked)) CREATE_ANIMST("Play", kstDefault) // // Destroy any glass that my exist // DestroyGob(kidGenericGlass); SetZThis(0); ENDCHUNK CHILD_SCRIPT("Play", CHID(kstDefault, kchidClick)) EnqueueCid(cidPlay, khidStudio, 0, 0, 0, 0); ChangeStateThis(kstSelected); // Select the appropriate default tool for when playing has finished. If (StateGob(kidSettingsCover) == kstOpen); // Scenes: Nil tool is default. ChangeStateGob(kidBackground->idscnDown, kstDefault); EnqueueCid(cidSetTool, khidStudio, chttNone, 0, 0, 0); Elif (StateGob(kidActorsCover) == kstOpen); // Actors: Selection tool is default. ChangeStateGob(kidActorsCompose, kstSelected); Elif (StateGob(kidSoundsCover) == kstOpen); // Sounds: Sounder tool is default. ChangeStateGob(kidSoundsPlayOnce, kstSelected); Elif (StateGob(kidTextsCover) == kstOpen); // Text: Insertion tool is default. ChangeStateGob(kidTextsSelect, kstSelected); EnqueueCid(cidSetTool, khidStudio, chttTboxSelect, 0, 0, 0); End; ENDCHUNK CREATE_ANIMST("Play", kstSelected) // // Create glass to absorb clicks // CreateChildGob(kidBackground, kidGenericGlass, kidGenericGlass); SetZThis(200); ENDCHUNK CHILD_SCRIPT("Play, stop", CHID(kstSelected, kchidClick)) EnqueueCid(cidPlay, khidStudio, 0, 0, 0, 0); ChangeStateThis(kstDefault); ENDCHUNK // // Portfolio button. Starts up the popup. // GOBCHUNK("Portfolio", kidPortfolio, kgokkRectHit) DEFAULT_POSITION(kxpPortfolio, kypPortfolio, 0) ACTION(fcustNil, fcustNil, fgrfstDefault, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttPortfolio) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsArrow, chidNil, cidNil, cnoNil) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\port.bmp", kxpregPortfolio, kypregPortfolio) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\ports.bmp", kxpregPortfolio, kypregPortfolio) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CHILD_SCRIPT("Portfolio", CHID(kstDefault, kchidClick)) ChangeStateGob(kidPortsBackground, kstOpen); ENDCHUNK // // Name of the movie // GOBCHUNK("Name", kidName, gokkNoHit) DEFAULT_POSITION(kxpName, kypName, 0) ENDCHUNK REP_MBMPREG(CHID1(krepDefault), "studio\bmp\name.bmp", kxpregName, kypregName) #ifdef SHOW_FPS // REVIEW(*****): this will not be present in final product GOBCHUNK("Fps", kidFps, kgokkRectHit) DEFAULT_POSITION(kxpFps, kypFps, 0) ENDCHUNK REP_MBMP(CHID1(krepDefault), "studio\bmp\fps.bmp") #endif // SHOW_FPS // // Exit button // GOBCHUNK("Exit", kidExit, kgokkRectHit) DEFAULT_POSITION(kxpExit, kypExit, 0) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID1(kchidClick), cidNil, kttExit) ENDCHUNK REP_MBMPREG(CHID1(krepDefault), "studio\bmp\exit.bmp", kxpregExit, kypregExit) ADOPT_MBMP(LAST_MBMP, CHID1(krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID1(krepMouseDnOff)) REP_MBMPREG(CHID1(krepMouseDnOn), "studio\bmp\exitc.bmp", kxpregExit, kypregExit) ADOPT_WAVE(kcnoExitWav, CHID1(krepClicked)) CHILD_SCRIPT("Exit", CHID1(kchidClick)) EnqueueCid(cidExitStudio, 0, 0, 0, 0, 0); ENDCHUNK // // // Primary tools under the top set of covers. // // // // Settings browser. Starts up the browser. // GOBCHUNK("SettingsBrowser", kidSettingsBrowser, kgokkRectHit) DEFAULT_POSITION(kxpSettingsBrowser, kypSettingsBrowser, 0) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttSettingsBrowser) ENDCHUNK REP_MBMPREG(CHID1(krepDefault), "studio\bmp\1back.bmp", kxpregSettingsBrowser, kypregSettingsBrowser) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\1backs.bmp", kxpregSettingsBrowser, kypregSettingsBrowser) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CHILD_SCRIPT("SettingsBrowser", CHID(kstDefault, kchidClick)) EnqueueCid(cidBrowserReady, khidStudio, kidBrwsBackground, kidBrowserFrame, kidBrowserPageFwd, (kdxpSceneFrameBorder << 16) | kdypSceneFrameBorder); ENDCHUNK // // Actors browser. Starts up the browser. // GOBCHUNK("ActorsBrowser", kidActorsBrowser, kgokkRectHit) DEFAULT_POSITION(kxpActorsBrowser, kypActorsBrowser, 0) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID1(kchidClick), cidNil, kttActorsBrowser) ENDCHUNK REP_MBMPREG(CHID1(krepDefault), "studio\bmp\2actr.bmp", kxpregActorsBrowser, kypregActorsBrowser) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\2actrs.bmp", kxpregActorsBrowser, kypregActorsBrowser) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CHILD_SCRIPT("ActorsBrowser", CHID(kstDefault, kchidClick)) EnqueueCid(cidBrowserReady, khidStudio, kidBrwsActor, kidBrowserFrame, kidBrowserPageFwd, (kdxpActorFrameBorder << 16) | kdypActorFrameBorder); ENDCHUNK // // Props browser. Starts up the browser. // GOBCHUNK("ActorsPropBrowser", kidActorsPropBrowser, kgokkRectHit) DEFAULT_POSITION(kxpActorsPropBrowser, kypActorsPropBrowser, 0) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID1(kchidClick), cidNil, kttActorsPropBrowser) ENDCHUNK REP_MBMPREG(CHID1(krepDefault), "studio\bmp\2prop.bmp", kxpregActorsPropBrowser, kypregActorsPropBrowser) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\2props.bmp", kxpregActorsPropBrowser, kypregActorsPropBrowser) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CHILD_SCRIPT("ActorsPropBrowser", CHID(kstDefault, kchidClick)) EnqueueCid(cidBrowserReady, khidStudio, kidBrwsProp, kidBrowserFrame, kidBrowserPageFwd, (kdxpPropFrameBorder << 16) | kdypPropFrameBorder); ENDCHUNK // // Spletters button. Starts up the easel. // GOBCHUNK("ActorsSpletters", kidActorsSpletters, kgokkRectHit) DEFAULT_POSITION(kxpActorsSpletters, kypActorsSpletters, 0) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttActorsSpletters) ENDCHUNK REP_MBMPREG(CHID1(krepDefault), "studio\bmp\2splt.bmp", kxpregActorsSpletters, kypregActorsSpletters) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\2splts.bmp", kxpregActorsSpletters, kypregActorsSpletters) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CHILD_SCRIPT("SplettersBrowser", CHID(kstDefault, kchidClick)) EnqueueCid(cidNewSpletter, kidStudio, 0, 0, 0, 0); ENDCHUNK // // Sound effects browser. Starts up the browser. // GOBCHUNK("SoundsEfxBrowser", kidSoundsEfxBrowser, kgokkRectHit) DEFAULT_POSITION(kxpSoundsEfxBrowser, kypSoundsEfxBrowser, 0) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID1(kchidClick), cidNil, kttSoundsEfxBrowser) ENDCHUNK REP_MBMPREG(CHID1(krepDefault), "studio\bmp\3horn.bmp", kxpregSoundsEfxBrowser, kypregSoundsEfxBrowser) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\3horns.bmp", kxpregSoundsEfxBrowser, kypregSoundsEfxBrowser) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CHILD_SCRIPT("SoundsMicBrowser", CHID(kstDefault, kchidClick)) EnqueueCid(cidBrowserReady, khidStudio, kidBrwsFX, kidBrowserFrame, kidBrowserPageFwd, (kdxpSoundFrameBorder << 16) | kdypSoundFrameBorder); ENDCHUNK // // Sound recordings browser. Starts up the browser. // GOBCHUNK("SoundsMicBrowser", kidSoundsMicBrowser, kgokkRectHit) DEFAULT_POSITION(kxpSoundsMicBrowser, kypSoundsMicBrowser, 0) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttSoundsMicBrowser) ENDCHUNK REP_MBMPREG(CHID1(krepDefault), "studio\bmp\3mike.bmp", kxpregSoundsMicBrowser, kypregSoundsMicBrowser) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\3mikes.bmp", kxpregSoundsMicBrowser, kypregSoundsMicBrowser) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CHILD_SCRIPT("SoundsMicBrowser", CHID(kstDefault, kchidClick)) EnqueueCid(cidBrowserReady, khidStudio, kidBrwsSpeech, kidBrowserFrame, kidBrowserPageFwd, (kdxpSoundFrameBorder << 16) | kdypSoundFrameBorder); ENDCHUNK // // MIDI sounds browser. Starts up the browser. // GOBCHUNK("SoundsMusicBrowser", kidSoundsMusicBrowser, kgokkRectHit) DEFAULT_POSITION(kxpSoundsMusicBrowser, kypSoundsMusicBrowser, 0) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttSoundsMusicBrowser) ENDCHUNK REP_MBMPREG(CHID1(krepDefault), "studio\bmp\3note.bmp", kxpregSoundsMusicBrowser, kypregSoundsMusicBrowser) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\3notes.bmp", kxpregSoundsMusicBrowser, kypregSoundsMusicBrowser) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CHILD_SCRIPT("SoundsMusicBrowser", CHID(kstDefault, kchidClick)) EnqueueCid(cidBrowserReady, khidStudio, kidBrwsMidi, kidBrowserFrame, kidBrowserPageFwd, (kdxpSoundFrameBorder << 16) | kdypSoundFrameBorder); ENDCHUNK // // Textbox creation browser. Starts up the browser. // GOBCHUNK("TextsCreate", kidTextsCreate, kgokkRectHit) DEFAULT_POSITION(kxpTextsCreate, kypTextsCreate, 0) ACTION(fcustNil, fcustNil, fgrfstAll, kcrsHand, CHID(kstDefault, kchidClick), cidNil, kttTextsCreate) ENDCHUNK REP_MBMPREG(CHID(kstDefault, krepDefault), "studio\bmp\4new.bmp", kxpregTextsCreate, kypregTextsCreate) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseUpOn)) ADOPT_MBMP(LAST_MBMP, CHID(kstDefault, krepMouseDnOff)) REP_MBMPREG(CHID(kstDefault, krepMouseDnOn), "studio\bmp\4news.bmp", kxpregTextsCreate, kypregTextsCreate) ADOPT_MBMP(LAST_MBMP, CHID(kstSelected, krepDefault)) CHILD_SCRIPT("Create Textbox", CHID(kstDefault, kchidClick)) CreateChildGob(kidBackground, kidBrwsTextCreate, kidBrwsTextCreate); ENDCHUNK // // Miscellaneous studio strings // CHUNK (kctgGst kcnoGstMisc "Miscellaneous strings") LONG GST(4) ITEM "%d / %d" idsBrowserPage ITEM "Comic Sans MS" idsSoundFont ITEM "Comic Sans MS" idsActionFont ITEM "Comic Sans MS" idsListenFont ITEM "Comic Sans MS" idsRollCallFont ITEM "Comic Sans MS" idsBrwsPageFont ITEM "Comic Sans MS" idsStudioFont ITEM "14" idsTboxDypFont ITEM "10" idsMovieNameDypFont ENDCHUNK  ================================================ FILE: src/studio/studio.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // // // // Studio control code // // Created: Jan, 10, 1995 // // // #include "studio.h" ASSERTNAME RTCLASS(STDIO) RTCLASS(SMCC) BEGIN_CMD_MAP(STDIO, CMH) ON_CID_GEN(cidNew, &STDIO::FCmdOpen, pvNil) ON_CID_GEN(cidOpen, &STDIO::FCmdOpen, pvNil) ON_CID_GEN(cidXYAxis, &STDIO::FCmdXYAxis, pvNil) ON_CID_GEN(cidXZAxis, &STDIO::FCmdXZAxis, pvNil) ON_CID_GEN(cidSetTool, &STDIO::FCmdSetTool, pvNil) ON_CID_GEN(cidPlay, &STDIO::FCmdPlay, pvNil) ON_CID_GEN(cidNewScene, &STDIO::FCmdNewScene, pvNil) ON_CID_GEN(cidRespectGround, &STDIO::FCmdRespectGround, pvNil) ON_CID_GEN(cidPauseUntilClick, &STDIO::FCmdPause, pvNil) ON_CID_GEN(cidPauseForSound, &STDIO::FCmdPause, pvNil) ON_CID_GEN(cidClearPause, &STDIO::FCmdPause, pvNil) ON_CID_GEN(cidBrowserReady, &STDIO::FCmdBrowserReady, pvNil) ON_CID_GEN(cidFrameScrollbar, &STDIO::FCmdScroll, pvNil) ON_CID_GEN(cidFrameThumb, &STDIO::FCmdScroll, pvNil) ON_CID_GEN(cidSceneScrollbar, &STDIO::FCmdScroll, pvNil) ON_CID_GEN(cidSceneThumb, &STDIO::FCmdScroll, pvNil) ON_CID_GEN(cidStartScroll, &STDIO::FCmdScroll, pvNil) ON_CID_GEN(cidEndScroll, &STDIO::FCmdScroll, pvNil) ON_CID_GEN(cidSooner, &STDIO::FCmdSooner, pvNil) ON_CID_GEN(cidLater, &STDIO::FCmdLater, pvNil) ON_CID_GEN(cidNewSpletter, &STDIO::FCmdNewSpletter, pvNil) ON_CID_GEN(cidTextBkgdColor, &STDIO::FCmdCreatePopup, pvNil) ON_CID_GEN(cidTextColor, &STDIO::FCmdCreatePopup, pvNil) ON_CID_GEN(cidTextFont, &STDIO::FCmdCreatePopup, pvNil) ON_CID_GEN(cidTextSize, &STDIO::FCmdCreatePopup, pvNil) ON_CID_GEN(cidTextStyle, &STDIO::FCmdCreatePopup, pvNil) ON_CID_GEN(cidTextSetColor, &STDIO::FCmdTextSetColor, pvNil) ON_CID_GEN(cidTextSetBkgdColor, &STDIO::FCmdTextSetBkgdColor, pvNil) ON_CID_GEN(cidTextSetFont, &STDIO::FCmdTextSetFont, pvNil) ON_CID_GEN(cidTextSetSize, &STDIO::FCmdTextSetSize, pvNil) ON_CID_GEN(cidTextSetStyle, &STDIO::FCmdTextSetStyle, pvNil) ON_CID_GEN(cidOpenSoundRecord, &STDIO::FCmdOpenSoundRecord, pvNil) ON_CID_GEN(cidToggleXY, &STDIO::FCmdToggleXY, pvNil) ON_CID_GEN(cidHelpBook, &STDIO::FCmdHelpBook, pvNil) ON_CID_GEN(cidMovieGoto, &STDIO::FCmdMovieGoto, pvNil) ON_CID_GEN(cidLoadProjectMovie, &STDIO::FCmdLoadProjectMovie, pvNil) ON_CID_GEN(cidSoundsEnabled, &STDIO::FCmdSoundsEnabled, pvNil) ON_CID_GEN(cidCreateTbox, &STDIO::FCmdCreateTbox, pvNil) ON_CID_GEN(cidActorEaselOpen, &STDIO::FCmdActorEaselOpen, pvNil) ON_CID_GEN(cidListenerEaselOpen, &STDIO::FCmdListenerEaselOpen, pvNil) #ifdef DEBUG ON_CID_GEN(cidWriteBmps, &STDIO::FCmdWriteBmps, pvNil) #endif // DEBUG END_CMD_MAP_NIL() const long kcbCursorCache = 1024; /*************************************************************************** * * Create the studio and get it running. * * Parameters: * hid - The hid to use for the studio * pcrmStudio - CRM to read script chunks from * pfniUserDoc - movie file to open, or pvNil * fFailIfDocOpenFailed - if fTrue, this function fails if pfniUserDoc * cannot be opened. If fFalse, this function creates a blank document * and does not fail if pfniUserDoc cannot be opened. * * Returns: * Pointer to the studio if successful, else pvNil. * **************************************************************************/ PSTDIO STDIO::PstdioNew(long hid, PCRM pcrmStudio, PFNI pfniUserDoc, bool fFailIfDocOpenFailed) { AssertPo(pcrmStudio, 0); AssertNilOrPo(pfniUserDoc, ffniFile); AssertPo(((APP *)vpappb)->Pkwa(), 0); bool fSuccess = fFalse; PSTDIO pstdio; PMVIE pmvie = pvNil; GCB gcb; BLCK blck; gcb.Set(hid, ((APP *)vpappb)->Pkwa()); pstdio = NewObj STDIO(&gcb); if (pstdio == pvNil) { return (pvNil); } pstdio->_pcrm = pcrmStudio; pstdio->_pcrm->AddRef(); pstdio->_psmcc = NewObj SMCC(kdxpWorkspace, kdypWorkspace, kcbStudioCache, pvNil, pstdio); if (pstdio->_psmcc == pvNil) { goto LFail; } pmvie = vapp.PmvieRetrieve(); // _FOpenStudio() depends on _psmcc being initialized if (!pstdio->_FOpenStudio((pfniUserDoc == pvNil) && (pmvie == pvNil))) { goto LFail; } if (pmvie != pvNil) { pmvie->SetMcc(pstdio->_psmcc); if (!pstdio->FSetMovie(pmvie)) goto LFail; pmvie->ResetTitle(); } else if (!pstdio->FLoadMovie(pfniUserDoc)) { if (fFailIfDocOpenFailed) goto LFail; else if (!pstdio->FLoadMovie()) // try blank doc goto LFail; } AssertPo(pstdio, 0); fSuccess = fTrue; LFail: ReleasePpo(&pmvie); if (!fSuccess) ReleasePpo(&pstdio); return (pstdio); } /*************************************************************************** * * Destroy the studio. * * Parameters: * None. * * Returns: * None. * **************************************************************************/ STDIO::~STDIO(void) { ReleasePpo(&_pmvie); ReleasePpo(&_psmcc); ReleasePpo(&_pcrm); ReleasePpo(&_pgstMisc); ReleasePpo(&_pbrwrActr); ReleasePpo(&_pbrwrProp); ReleasePpo(&_pglcmg); ReleasePpo(&_pglclr); ReleaseBrcn(); PGOB pgobStudio = ((APP *)vpappb)->Pkwa()->PgobFromHid(kidBackground); ReleasePpo(&pgobStudio); } /*************************************************************************** * * Open studio.chk and start the studio script * * Parameters: * fPaletteFade - fTrue if we should do a palette fade. * * Returns: * fTrue if successful, else fFalse. * **************************************************************************/ bool STDIO::_FOpenStudio(bool fPaletteFade) { AssertBaseThis(0); PSCPT pscpt = pvNil; PSSCB psscb = pvNil; PSCEG psceg = pvNil; STN stn; RC rcAbs, rcRel; BLCK blck; bool fRet = fFalse; long icrf; PCRF pcrf; long lwParm; vapp.BeginLongOp(); // read miscellaneous message strings for (icrf = 0; icrf < _pcrm->Ccrf(); icrf++) { pcrf = _pcrm->PcrfGet(icrf); if (pcrf->Pcfl()->FFind(kctgGst, kcnoGstMisc, &blck)) { _pgstMisc = GST::PgstRead(&blck); break; } } if (pvNil == _pgstMisc) // if not found or read error goto LFail; if (pvNil == (psceg = ((APP *)vpappb)->Pkwa()->PscegNew(_pcrm, ((APP *)vpappb)->Pkwa()))) { goto LFail; } // // Read in common palette // for (icrf = 0; icrf < _pcrm->Ccrf(); icrf++) { pcrf = _pcrm->PcrfGet(icrf); if (pcrf->Pcfl()->FFind(kctgColorTable, kidPalette, &blck)) { _pglclr = GL::PglRead(&blck); if (_pglclr != pvNil) { break; } } } // kidStudio should be kcnoStudio according to Hungarian, but the "kid" // prefix is entrenched into the script/help stuff and can't be easily // all changed to kcno. if (pvNil == (pscpt = (PSCPT)_pcrm->PbacoFetch(kctgScript, kidStudio, SCPT::FReadScript))) { goto LFail; } lwParm = !fPaletteFade; if (!psceg->FRunScript(pscpt, &lwParm, 1)) { vpappb->TGiveAlertSz("Running script failed", bkOk, cokExclamation); goto LFail; } // Create the scroll bars if (pvNil == (psscb = SSCB::PsscbNew(_pmvie))) { goto LFail; } AssertVarMem(_psmcc); _psmcc->SetSscb(psscb); if (!vpcex->FAddCmh(this, kcmhlStudio)) goto LFail; fRet = fTrue; LFail: Assert(fRet, "Warning: Failed to open studio file..." "do you have studio.chk in the working directory?"); ReleasePpo(&psscb); ReleasePpo(&pscpt); ReleasePpo(&psceg); ReleasePpo(&_pbrwrActr); ReleasePpo(&_pbrwrProp); ReleasePpo(&_pglcmg); vapp.EndLongOp(); return fRet; } /*************************************************************************** Set the portfolio doc from one of Melanie's project documents ***************************************************************************/ bool STDIO::FCmdLoadProjectMovie(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); long stid = pcmd->rglw[0]; STN stn; STN stnLeaf; FNI fni; bool fLoaded = fFalse; if (!vpapp->Pkwa()->Pstrg()->FGet(stid, &stnLeaf)) { Bug("Missing string in FCmdLoadProjectMovie"); goto LEnd; } vpapp->GetFniMelanie(&fni); // Get Melanie's directory if (!fni.FSetLeaf(&stnLeaf)) goto LEnd; if (tYes != fni.TExists()) { PushErc(ercSocMissingMelanieDoc); goto LEnd; } if (!FLoadMovie(&fni)) { PushErc(ercSocCantLoadMelanieDoc); goto LEnd; } Assert(_pmvie != pvNil, "FLoadMovie lied to us"); /* Make sure the autosave file's been switched to a temp file */ if (!_pmvie->FEnsureAutosave()) goto LEnd; /* Tell the movie to forget about the original file */ _pmvie->ForceSaveAs(); fLoaded = fTrue; LEnd: vpcex->EnqueueCid(cidProjectMovieLoaded, pvNil, pvNil, fLoaded); return fTrue; } /*************************************************************************** * * Change the current movie -- close any currently open movie. * * Parameters: * pfni - File to read from. * cno - Cno within the file. * * Returns: * fTrue if it handled the command, else fFalse. * **************************************************************************/ bool STDIO::FLoadMovie(PFNI pfni, CNO cno) #ifdef BUG1959 { bool fRet, fClosedOld; /* If loading a specific movie, attempt to load a blank movie first */ if (pfni != pvNil) { if (!(fRet = _FLoadMovie(pvNil, cnoNil, &fClosedOld)) || !fClosedOld) goto LDone; } /* Now do what the user asked us to do */ fRet = _FLoadMovie(pfni, cno, &fClosedOld); LDone: return fRet; } bool STDIO::_FLoadMovie(PFNI pfni, CNO cno, bool *pfClosedOld) #endif // BUG1959 { AssertBaseThis(0); AssertNilOrPo(pfni, 0); bool fRet = fFalse; PMVU pmvu; PMVIE pmvie = pvNil, pmvieOld = pvNil; PBKGD pbkgd = pvNil; #ifdef BUG1959 *pfClosedOld = fTrue; #endif // BUG1959 if (_pmvie != pvNil) { PSCEN pscen; pmvu = (PMVU)_pmvie->PddgActive(); AssertPo(pmvu, 0); if (!pmvu->FCloseDoc(fFalse, fTrue)) { fRet = fTrue; #ifdef BUG1959 *pfClosedOld = fFalse; #endif // BUG1959 goto LFail; } _pmvie->Flush(); pmvieOld = _pmvie; pmvieOld->AddRef(); if ((pscen = pmvieOld->Pscen()) != pvNil) { if ((pbkgd = pscen->Pbkgd()) != pvNil) pbkgd->SetFLeaveLitesOn(fTrue); } } pmvie = MVIE::PmvieNew(vpapp->FSlowCPU(), _psmcc, pfni, cno); if (pmvie == pvNil) { ReleasePpo(&pmvieOld); goto LFail; } fRet = FSetMovie(pmvie); if (fRet) { PGOK pgok; pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidBackground); if ((pgok != pvNil) && pgok->FIs(kclsGOK) && (_pmvie->Pscen() != pvNil)) { AssertPo(pgok, 0); pgok->FRunScript((kstDefault << 16) | kchidOpenDoorsAll); pgok->FRunScript((kstDefault << 16) | kchidPopoutSceneTools); } } LFail: ReleasePpo(&pmvie); if (pbkgd != pvNil) pbkgd->SetFLeaveLitesOn(fFalse); /* Restore old movie if loading new one failed */ if (_pmvie == pvNil) { Assert(!fRet, "Bogus state for studio"); _pmvie = pmvieOld; Psmcc()->UpdateRollCall(); } else if (pmvieOld != pvNil && fRet) { bool fResetLites = (_pmvie->Pscen() != pvNil && _pmvie->Pscen()->Pbkgd() == pbkgd); Assert(!fResetLites || pbkgd->CactRef() > 1, "Not enough refs for BKGD"); pmvieOld->CloseAllDdg(); ReleasePpo(&pmvieOld); /* Turn lights back on, in new BWLD (they got turned off when releasing the old movie) */ if (fResetLites) pbkgd->TurnOnLights(_pmvie->Pbwld()); } #ifdef BUG1959 if (pfni == pvNil && fRet && *pfClosedOld) vptagm->ClearCache(sidNil, ftagmFile); #endif // BUG1959 return fRet; } /*************************************************************************** * * Set the current movie -- close any currently open movie. * * Parameters: * pmvie - The new movie. * * Returns: * fTrue if it was succesful, else fFalse. * **************************************************************************/ bool STDIO::FSetMovie(PMVIE pmvie) { AssertPo(pmvie, 0); bool fRet = fFalse; PMVU pmvu = pvNil; RC rcRel, rcAbs; PGOK pgok; GCB gcb; vapp.BeginLongOp(); ReleasePpo(&_pmvie); _psmcc->Psscb()->SetMvie(pvNil); _pmvie = pmvie; _pmvie->AddRef(); // // Position the view // rcRel.Set(krelZero, krelZero, krelOne, krelOne); rcAbs.Set(0, 0, 0, 0); pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidWorkspace); AssertPo(pgok, 0); if (pvNil == _psmcc->Psscb()) goto LFail; // // Create the view // gcb.Set(khidDdg, pgok, fgobNil, kginDefault, &rcAbs, &rcRel); pmvu = (PMVU)_pmvie->PddgNew(&gcb); if (pmvu == pvNil) goto LFail; AssertPo(pmvu, 0); // Set the movie title UpdateTitle(_pmvie->PstnTitle()); _pmvie->SetThumbPalette(_pglclr); if (_pmvie->Cscen() > 0) { if (!_pmvie->FSwitchScen(0)) { goto LFail; } EnableActorTools(); EnableTboxTools(); } _psmcc->Psscb()->SetMvie(_pmvie); pmvu->SetTool(toolDefault); _psmcc->UpdateRollCall(); pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidSettingsCover); if ((pgok != pvNil) && pgok->FIs(kclsGOK)) { pgok->FChangeState(kstOpen); } _SetToolStates(); fRet = fTrue; LFail: if (!fRet) { ReleasePpo(&_ptgobTitle); ReleasePpo(&pmvu); ReleasePpo(&_pmvie); } vapp.EndLongOp(); return fRet; } /*************************************************************************** * * Handle XYAxis command * * Parameters: * pcmd - Pointer to the command to process. * * Returns: * fTrue if it handled the command, else fFalse. * **************************************************************************/ bool STDIO::FCmdXYAxis(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); PMVU pmvu; BRS rgr[3][3] = {{rOne, rZero, rZero}, {rZero, rOne, rZero}, {rZero, rZero, -rOne}}; if (pvNil != _pmvie) { AssertPo(_pmvie, 0); pmvu = (PMVU)_pmvie->PddgActive(); pmvu->SetAxis(rgr); if ((pmvu->Tool() != toolCompose) && (pmvu->Tool() != toolRecordSameAction) && (pmvu->Tool() != toolAction) && (pmvu->Tool() != toolPlace) && !pmvu->FTextMode()) { pmvu->SetTool(toolCompose); ChangeTool(toolCompose); } } return fTrue; } /*************************************************************************** * * Handle XZAxis command * * Parameters: * pcmd - Pointer to the command to process. * * Returns: * fTrue if it handled the command, else fFalse. * **************************************************************************/ bool STDIO::FCmdXZAxis(PCMD pcmd) { AssertThis(0); PMVU pmvu; BRS rgr[3][3] = {{rOne, rZero, rZero}, {rZero, rZero, rOne}, {rZero, -rOne, rZero}}; if (pvNil != _pmvie) { AssertPo(_pmvie, 0); pmvu = (PMVU)_pmvie->PddgActive(); pmvu->SetAxis(rgr); if ((pmvu->Tool() != toolCompose) && (pmvu->Tool() != toolRecordSameAction) && (pmvu->Tool() != toolAction) && (pmvu->Tool() != toolPlace) && !pmvu->FTextMode()) { pmvu->SetTool(toolCompose); ChangeTool(toolCompose); } } return fTrue; } /*************************************************************************** * * Handle changing the current tool. * * Parameters: * pcmd - Pointer to the command to process. * * Returns: * fTrue if it handled the command, else fFalse. * **************************************************************************/ bool STDIO::FCmdSetTool(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); PMVU pmvu; if (pvNil != _pmvie) { AssertPo(_pmvie, 0); pmvu = (PMVU)_pmvie->PddgActive(); switch (pcmd->rglw[0]) { case chttCompose: if (pmvu->Tool() != toolPlace) { pmvu->SetTool(toolCompose); } break; case chttNormalizeRot: pmvu->SetTool(toolNormalizeRot); break; case chttNormalizeSize: pmvu->SetTool(toolNormalizeSize); break; case chttSooner: pmvu->SetTool(toolSoonerLater); break; case chttRotateX: pmvu->SetTool(toolRotateX); break; case chttRotateY: pmvu->SetTool(toolRotateY); break; case chttRotateZ: pmvu->SetTool(toolRotateZ); break; case chttRotateNorm: pmvu->SetTool(toolNormalizeRot); break; case chttSquash: pmvu->SetTool(toolSquashStretch); break; case chttShrink: pmvu->SetTool(toolResize); break; case chttTransformNorm: pmvu->SetTool(toolNormalizeSize); break; case chttRecordSameAction: pmvu->SetTool(toolRecordSameAction); break; case chttAction: _cmd = *pcmd; pmvu->SetTool(toolAction); break; case chttTboxSelect: pmvu->SetTool(toolTboxMove); break; case chttTboxStory: pmvu->SetTool(toolTboxStory); break; case chttTboxScroll: pmvu->SetTool(toolTboxCredit); break; case chttSceneChopFwd: pmvu->SetTool(toolSceneChop); break; case chttSceneChopBack: pmvu->SetTool(toolSceneChopBack); break; case chttSceneNuke: pmvu->SetTool(toolSceneNuke); break; case chttActorNuke: pmvu->SetTool(toolActorNuke); break; case chttActorEasel: pmvu->SetTool(toolActorEasel); break; case chttMatcher: pmvu->SetTool(toolMatcher); break; case chttSounder: pmvu->SetTool(toolSounder); break; case chttLooper: pmvu->SetTool(toolLooper); break; case chttListener: pmvu->SetTool(toolListener); break; case chttNone: pmvu->SetTool(toolDefault); break; default: Bug("You forgot to put this tool in SetTool."); break; } } return fTrue; } /*************************************************************************** * * Handle Play command * * Parameters: * pcmd - Pointer to the command to process. * * Returns: * fTrue if it handled the command, else fFalse. * **************************************************************************/ bool STDIO::FCmdPlay(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); PGOK pgok; if (pvNil != _pmvie) { AssertPo(_pmvie, 0); pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidActorsActionBrowser); if (_pmvie->FPlaying()) { vpappb->FSetProp(kpridToolTipDelay, _dtimToolTipDelay); if ((pgok != pvNil) && pgok->FIs(kclsGOK)) { AssertPo(pgok, 0); pgok->FChangeState(kstDefault); } pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidWorkspace); if ((pgok != pvNil) && pgok->FIs(kclsGOK)) { AssertPo(pgok, 0); pgok->SetZPlane(0); } } else { if (!vpappb->FGetProp(kpridToolTipDelay, &_dtimToolTipDelay)) { _dtimToolTipDelay = 3 * kdtimSecond; } vpappb->FSetProp(kpridToolTipDelay, 0x0FFFFFFF); if ((pgok != pvNil) && pgok->FIs(kclsGOK)) { AssertPo(pgok, 0); pgok->FChangeState(kstFreeze); } } if (_pmvie->Pscen() != pvNil) { _pmvie->Play(); } } return fTrue; } /*************************************************************************** * * Handle New Scene command * * Parameters: * pcmd - Pointer to the command to process. * * Returns: * fTrue if it handled the command, else fFalse. * **************************************************************************/ bool STDIO::FCmdNewScene(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); TAG tag; bool fEnable; vapp.BeginLongOp(); tag = *((PTAG)(pcmd->rglw)); if (pvNil != _pmvie) { AssertPo(_pmvie, 0); fEnable = (_pmvie->Pscen() == pvNil); if (_pmvie->FAddScen(&tag) && fEnable) { _SetToolStates(); } } vapp.EndLongOp(); return fTrue; } /*************************************************************************** * * Handle changing the respecting of ground. * * Parameters: * pcmd - Pointer to the command to process. * * Returns: * fTrue if it handled the command, else fFalse. * **************************************************************************/ bool STDIO::FCmdRespectGround(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); PMVU pmvu = (PMVU)_pmvie->PddgGet(0); AssertPo(pmvu, 0); pmvu->SetFRespectGround(pcmd->rglw[0]); if ((pmvu->Tool() != toolCompose) && (pmvu->Tool() != toolRecordSameAction) && (pmvu->Tool() != toolAction) && (pmvu->Tool() != toolPlace) && !pmvu->FTextMode()) { pmvu->SetTool(toolCompose); ChangeTool(toolCompose); } return (fTrue); } /*************************************************************************** * * Handle setting the pause. * * Parameters: * pcmd - Pointer to the command to process. * * Returns: * fTrue if it handled the command, else fFalse. * **************************************************************************/ bool STDIO::FCmdPause(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); if (_pmvie->Pscen() == pvNil) { return (fTrue); } switch (pcmd->cid) { case cidPauseUntilClick: _pmvie->FPause(witUntilClick, 0); break; case cidPauseForSound: _pmvie->FPause(witUntilSnd, 0); break; case cidClearPause: _pmvie->FPause(witNil, 0); break; default: Bug("Unknown cid"); } return (fTrue); } /*************************************************************************** Open an existing or new chunky file for editing. Handles cidNew and cidOpen. ***************************************************************************/ bool STDIO::FCmdOpen(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); switch (pcmd->cid) { default: Bug("why are we here?"); return fFalse; case cidNew: if (_fDisplayCast && vpappb->GrfcustCur() & fcustShift) { FNI fni; STN stn; _fDisplayCast = fFalse; stn = PszLit("3dmovie.ms"); if (vptagm->FFindFile(vapp.SidProduct(), &stn, &fni, fFalse)) { if (FLoadMovie(&fni)) vpcex->EnqueueCid(cidPlay, this); } } else FLoadMovie(); break; case cidOpen: { FNI fni; _fDisplayCast = fFalse; if (FGetFniMovieOpen(&fni)) { // User selected a file, so open it. FLoadMovie(&fni, cnoNil); } break; } } return (fTrue); } /****************************************************************************** FCmdScroll Handles scrollbar commands. Author: ****** Returns: nothing ******************************************************************************/ bool STDIO::FCmdScroll(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); AssertVarMem(_psmcc); if (pvNil == _psmcc->Psscb()) { // absorb the cmd since there is no scrollbar return fTrue; } return _psmcc->Psscb()->FCmdScroll(pcmd); } /****************************************************************************** FCmdSooner Handles the soonering an actor returns fTrue. ******************************************************************************/ bool STDIO::FCmdSooner(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); if (!Pmvie()->FSoonerLaterActr(Pmvie()->Pscen()->Nfrm() - 1)) { PMVU pmvu; PGOK pgok; pmvu = (PMVU)Pmvie()->PddgActive(); pmvu->SetTool(toolCompose); pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidActorsSoonerButton); if ((pgok != pvNil) && pgok->FIs(kclsGOK)) { AssertPo(pgok, 0); pgok->FChangeState(kstClosed); } } return fTrue; } /****************************************************************************** FCmdSooner Handles the soonering an actor returns fTrue. ******************************************************************************/ bool STDIO::FCmdLater(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); if (!Pmvie()->FSoonerLaterActr(Pmvie()->Pscen()->Nfrm() + 1)) { PMVU pmvu; PGOK pgok; pmvu = (PMVU)Pmvie()->PddgActive(); pmvu->SetTool(toolCompose); pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidActorsSoonerButton); if ((pgok != pvNil) && pgok->FIs(kclsGOK)) { AssertPo(pgok, 0); pgok->FChangeState(kstClosed); } } return fTrue; } /****************************************************************************** FCmdNewSpletter Handles creating new spletters. returns fTrue. ******************************************************************************/ bool STDIO::FCmdNewSpletter(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); STN stn; TAG tagTdf; CKI cki; PBCL pbcl; THD thd; vapp.BeginLongOp(); vapp.GetStnProduct(&stn); // Default string for TDT easel is product name // Find the first font available for this source, cache it, and use it // as the default font for the TDT easel. cki.ctg = kctgTfth; cki.cno = cnoNil; pbcl = BCL::PbclNew(pvNil, &cki, ctgNil, pvNil, fTrue); if (pvNil == pbcl) return fTrue; if (pbcl->IthdMac() == 0) { ReleasePpo(&pbcl); return fTrue; } pbcl->GetThd(0, &thd); tagTdf = thd.tag; ReleasePpo(&pbcl); if (!vptagm->FCacheTagToHD(&tagTdf)) return fTrue; // Note: easels are self-managing, so we don't need to keep the PESLT ESLT::PesltNew(_pcrm, _pmvie, pvNil, &stn, tdtsNormal, &tagTdf); vapp.EndLongOp(); return fTrue; } /****************************************************************************** Start the sound recording easel ******************************************************************************/ bool STDIO::FCmdOpenSoundRecord(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); bool fSpeech = FPure(pcmd->rglw[0]); // Speech or SFX browser? // If default sound name is required then set it in stn here. // Currently no default sound name required, so initialize it empty. STN stn; vapp.BeginLongOp(); // Note: easels are self-managing, so we don't need to keep the PESLR ESLR::PeslrNew(_pcrm, _pmvie, fSpeech, &stn); vapp.EndLongOp(); return fTrue; } /****************************************************************************** SceneChange Callback to handle a change of scene. Returns: nothing ************************************************************ PETED ***********/ void STDIO::SceneChange(void) { } /*************************************************************************** * * Create a popup menu * * Parameters: * pcmd - Pointer to the command to process. * * Returns: * fTrue if it handled the command, else fFalse. * **************************************************************************/ bool STDIO::FCmdCreatePopup(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); CKI ckiRoot; long cid, kid, thumSel = ivNil; ulong grfchp; BWS bws = kbwsCnoRoot; CHP chp; PTBOX ptbox; ckiRoot.cno = cnoNil; Assert(_pmvie != pvNil, "No current MVIE"); Assert(_pmvie->Pscen() != pvNil, "No current SCEN"); if ((ptbox = _pmvie->Pscen()->PtboxSelected()) != pvNil) ptbox->FetchChpSel(&chp, &grfchp); else { grfchp = grfchpNil; } switch (pcmd->cid) { case cidTextColor: ckiRoot.ctg = kctgTcth; cid = cidTextSetColor; kid = kidTextColor; goto LCreate; case cidTextBkgdColor: ckiRoot.ctg = kctgTbth; cid = cidTextSetBkgdColor; kid = kidTextBkgdColor; goto LCreate; case cidTextSize: ckiRoot.ctg = kctgTzth; cid = cidTextSetSize; kid = kidTextSize; if (grfchp & kfchpDypFont) thumSel = chp.dypFont; goto LCreate; case cidTextStyle: ckiRoot.ctg = kctgTyth; cid = cidTextSetStyle; kid = kidTextStyle; if (grfchp & kfchpBold && grfchp & kfchpItalic) thumSel = chp.grfont; bws = kbwsIndex; LCreate: MP::PmpNew(kidBackground, kid, _pcrm, pcmd, bws, thumSel, ksidInvalid, ckiRoot, ctgNil, this, cid, fFalse); break; case cidTextFont: { PGST pgst; long onnCur, onnSystem = vntl.OnnSystem(); if ((pgst = GST::PgstNew(size(onnCur))) == pvNil) break; for (onnCur = 0; onnCur < vntl.OnnMac(); onnCur++) { STN stn; if (onnCur != onnSystem) { vntl.GetStn(onnCur, &stn); if (!pgst->FAddStn(&stn, &onnCur)) { ReleasePpo(&pgst); break; } } } if (pgst != pvNil) { MPFNT::PmpfntNew(_pcrm, kidBackground, kidTextFont, pcmd, (grfchp & kfchpOnn) ? chp.onn : ivNil, pgst); ReleasePpo(&pgst); } break; } default: BugVar("unexpected cid", &pcmd->cid); break; } return fTrue; } /*************************************************************************** * * Sets the text box background color * * Parameters: * pcmd - Pointer to the command to process. * * Returns: * fTrue if it handled the command, else fFalse. * **************************************************************************/ bool STDIO::FCmdTextSetBkgdColor(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); AssertIn(pcmd->rglw[0], 0, kbMax); byte iscr = (byte)pcmd->rglw[0]; ACR acr(iscr); PMVU pmvu = (PMVU)_pmvie->PddgActive(); if (iscr == 0) acr.SetToClear(); _pmvie->SetPaintAcr(acr); pmvu->SetTool(toolTboxFillBkgd); SetCurs(toolTboxFillBkgd); return fTrue; } /*************************************************************************** * * Sets the text box text color * * Parameters: * pcmd - Pointer to the command to process. * * Returns: * fTrue if it handled the command, else fFalse. * **************************************************************************/ bool STDIO::FCmdTextSetColor(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); AssertIn(pcmd->rglw[0], 0, kbMax); byte iscr = (byte)pcmd->rglw[0]; ACR acr(iscr); PMVU pmvu = (PMVU)_pmvie->PddgActive(); if (iscr == 0) acr.SetToClear(); _pmvie->SetPaintAcr(acr); pmvu->SetTool(toolTboxPaintText); SetCurs(toolTboxPaintText); return fTrue; } /****************************************************************************** FCmdTextSetSize Command handler to set the font size for the active textbox Arguments: PCMD pcmd -- rglw[0] holds the new size Returns: fTrue; always handles the command ************************************************************ PETED ***********/ bool STDIO::FCmdTextSetSize(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); PMVU pmvu = _pmvie->PmvuCur(); _pmvie->SetDypFontTextCur(pcmd->rglw[0]); pmvu->SetTool(toolTboxSize); SetCurs(toolTboxSize); return fTrue; } /****************************************************************************** FCmdTextSetStyle Command handler to set the font Style for the active textbox Arguments: PCMD pcmd -- rglw[0] holds the mask for the new style bits rglw[1] holds the new style bits Returns: fTrue; always handles the command ************************************************************ PETED ***********/ bool STDIO::FCmdTextSetStyle(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); ulong grfont; PMVU pmvu = _pmvie->PmvuCur(); grfont = pmvu->GrfontStyleTextCur(); grfont &= ~((ulong)pcmd->rglw[0]); grfont |= (ulong)pcmd->rglw[1]; _pmvie->SetStyleTextCur(grfont); pmvu->SetTool(toolTboxStyle); SetCurs(toolTboxStyle); return fTrue; } /****************************************************************************** FCmdTextSetFont Command handler to set the font face for the active textbox Arguments: PCMD pcmd -- rglw[0] holds the new face Returns: fTrue; always handles the command ************************************************************ PETED ***********/ bool STDIO::FCmdTextSetFont(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); PMVU pmvu = _pmvie->PmvuCur(); _pmvie->SetOnnTextCur(pcmd->rglw[0]); pmvu->SetTool(toolTboxFont); SetCurs(toolTboxFont); return fTrue; } /*************************************************************************** Load a cursor only. Do not set the tool permanently. Used for roll over cursors. ***************************************************************************/ void STDIO::SetCurs(long tool) { PCURS pcurs; long cursID; switch (tool) { case toolListener: cursID = kcrsListener; break; case toolSounder: cursID = kcrsSounder; break; case toolLooper: cursID = kcrsLooper; break; case toolMatcher: cursID = kcrsMatcher; break; case toolActorSelect: cursID = kcrsHand; break; case toolCompose: cursID = kcrsCompose; break; case toolComposeAll: cursID = kcrsComposeAll; break; case toolSquashStretch: cursID = kcrsSquashStretch; break; case toolSoonerLater: cursID = kcrsSoonerLater; break; case toolResize: cursID = kcrsResize; break; case toolRotateX: cursID = kcrsRotateX; break; case toolRotateY: cursID = kcrsRotateY; break; case toolRotateZ: cursID = kcrsRotateZ; break; case toolCostumeCmid: case toolActorEasel: cursID = kcrsCostume; break; case toolAction: cursID = kcrsActionBrowser; break; case toolRecordSameAction: cursID = kcrsRecord; break; case toolTweak: cursID = kcrsTweak; break; case toolNormalizeRot: cursID = kcrsNormalizeRot; break; case toolNormalizeSize: cursID = kcrsNormalizeSize; break; case toolDefault: cursID = kcrsDefault; break; case toolTboxMove: cursID = kcrsTboxMove; break; case toolTboxUpDown: cursID = kcrsTboxUpDown; break; case toolTboxLeftRight: cursID = kcrsTboxLeftRight; break; case toolTboxFalling: cursID = kcrsTboxFalling; break; case toolTboxRising: cursID = kcrsTboxRising; break; case toolSceneNuke: case toolActorNuke: cursID = kcrsNuke; break; case toolIBeam: cursID = kcrsIBeam; break; case toolCutObject: cursID = kcrsCutObject; break; case toolCopyObject: cursID = kcrsCopyObject; break; case toolCopyRte: cursID = kcrsCopyRte; break; case toolSceneChop: cursID = kcrsSceneChop; break; case toolSceneChopBack: cursID = kcrsSceneChopBack; break; case toolCutText: cursID = kcrsCutText; break; case toolCopyText: cursID = kcrsCopyText; break; case toolPasteText: cursID = kcrsPasteText; break; case toolPasteRte: cursID = kcrsPasteRte; break; case toolPasteObject: cursID = kcrsDefault; break; case toolTboxPaintText: cursID = kcrsPaintText; break; case toolTboxFillBkgd: cursID = kcrsFillBkgd; break; case toolTboxStory: cursID = kcrsTboxStory; break; case toolTboxCredit: cursID = kcrsTboxCredit; break; case toolTboxFont: cursID = kcrsTboxFont; break; case toolTboxSize: cursID = kcrsTboxFontSize; break; case toolTboxStyle: cursID = kcrsTboxFontStyle; break; default: Bug("Unknown tool type"); } pcurs = (PCURS)_pcrm->PbacoFetch('GGCR', cursID, CURS::FReadCurs); if (pvNil != pcurs) { vpappb->SetCurs(pcurs); ReleasePpo(&pcurs); } } /*************************************************************************** Tell the play button to go back to Play ***************************************************************************/ void STDIO::PlayStopped(void) { AssertThis(0); PGOK pgok; pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidPlay); if ((pgok != pvNil) && pgok->FIs(kclsGOK) && (pgok->Sno() != kstDefault)) { AssertPo(pgok, 0); pgok->FChangeState(kstDefault); } pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidActorsActionBrowser); if ((pgok != pvNil) && pgok->FIs(kclsGOK)) { AssertPo(pgok, 0); pgok->FChangeState(kstDefault); } vpappb->FSetProp(kpridToolTipDelay, _dtimToolTipDelay); } /*************************************************************************** The movie engine changed the tool, now change the UI ***************************************************************************/ void STDIO::ChangeTool(long tool) { AssertThis(0); PGOK pgok; if (tool == toolTboxMove) { pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidTextsCover); } else if (tool == toolDefault) { pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidSettingsCover); } else { pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidActorsCover); } if ((pgok != pvNil) && pgok->FIs(kclsGOK) && (pgok->Sno() != kstOpen)) { AssertPo(pgok, 0); pgok->FChangeState(kstOpen); } pgok = pvNil; switch (tool) { case toolCompose: pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidActorsCompose); break; case toolRecordSameAction: pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidActorsContinue); break; case toolTboxMove: pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidTextsSelect); break; case toolDefault: pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidSettingsBackground); pgok->FRunScript((kstDefault << 16) | kchidResetTools); return; default: break; } if ((pgok != pvNil) && pgok->FIs(kclsGOK) && (pgok->Sno() != kstSelected)) { AssertPo(pgok, 0); pgok->FChangeState(kstSelected); } } /*************************************************************************** The movie engine deleted the scene. ***************************************************************************/ void STDIO::SceneNuked(void) { AssertThis(0); PGOK pgok; if (_pmvie->Pscen() == pvNil) { _SetToolStates(); _psmcc->UpdateRollCall(); pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidUndosCover); if ((pgok != pvNil) && pgok->FIs(kclsGOK)) { AssertPo(pgok, 0); pgok->FChangeState(kstOpen); } } } /*************************************************************************** The movie engine Undeleted a scene. ***************************************************************************/ void STDIO::SceneUnnuked(void) { AssertThis(0); if (_pmvie->Cscen() != 1) { return; } _SetToolStates(); _psmcc->UpdateRollCall(); if (_pmvie->Pscen()->Cactr() > 0) { EnableActorTools(); } if (_pmvie->Pscen()->Ctbox() > 0) { EnableTboxTools(); } } /*************************************************************************** The movie engine deleted an actor. ***************************************************************************/ void STDIO::ActorNuked(void) { AssertThis(0); if (_pmvie->Pscen() == pvNil) { _SetToolStates(); } } /*************************************************************************** Enables/Disables the tools ***************************************************************************/ void STDIO::_SetToolStates(void) { AssertThis(0); PGOK pgok; pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidBackground); if ((pgok != pvNil) && pgok->FIs(kclsGOK) && (_pmvie->Pscen() == pvNil)) { AssertPo(pgok, 0); pgok->FRunScript((kstDefault << 16) | kchidResetTools); return; } // // Enable everything, since we now have a scene. // if ((pgok != pvNil) && pgok->FIs(kclsGOK)) { AssertPo(pgok, 0); pgok->FRunScript((kstDefault << 16) | kchidEnableSceneTools); } pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidActorsCover); if ((pgok != pvNil) && pgok->FIs(kclsGOK)) { AssertPo(pgok, 0); pgok->FChangeState(kstClosed); } pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidSoundsCover); if ((pgok != pvNil) && pgok->FIs(kclsGOK)) { AssertPo(pgok, 0); pgok->FChangeState(kstClosed); } pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidTextsCover); if ((pgok != pvNil) && pgok->FIs(kclsGOK)) { AssertPo(pgok, 0); pgok->FChangeState(kstClosed); } pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidScrollbarsCover); if ((pgok != pvNil) && pgok->FIs(kclsGOK)) { AssertPo(pgok, 0); pgok->FChangeState(kstOpen); } pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidUndosCover); if ((pgok != pvNil) && pgok->FIs(kclsGOK)) { AssertPo(pgok, 0); pgok->FChangeState(kstOpen); } SetUndo(_pmvie->CundbUndo() != 0 ? undoUndo : _pmvie->CundbRedo() != 0 ? undoRedo : undoDisabled); pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidBooksCover); if ((pgok != pvNil) && pgok->FIs(kclsGOK)) { AssertPo(pgok, 0); pgok->FChangeState(kstOpen); } } /*************************************************************************** The movie engine inserted the first actor into the movie. ***************************************************************************/ void STDIO::EnableActorTools(void) { AssertThis(0); PGOK pgok; pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidBackground); if ((pgok != pvNil) && pgok->FIs(kclsGOK)) { AssertPo(pgok, 0); pgok->FRunScript((kstDefault << 16) | kchidEnableActorTools); } } /*************************************************************************** The movie engine inserted the first actor into the movie. ***************************************************************************/ void STDIO::EnableTboxTools(void) { AssertThis(0); PGOK pgok; pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidBackground); if ((pgok != pvNil) && pgok->FIs(kclsGOK)) { AssertPo(pgok, 0); pgok->FRunScript((kstDefault << 16) | kchidEnableTboxTools); } } /*************************************************************************** The movie engine has a new selected textbox. ***************************************************************************/ void STDIO::TboxSelected(void) { AssertThis(0); } /*************************************************************************** The movie engine has a new undo buffer state ***************************************************************************/ void STDIO::SetUndo(long undo) { AssertThis(0); PGOK pgok; pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidUndo); if ((pgok != pvNil) && pgok->FIs(kclsGOK)) { AssertPo(pgok, 0); pgok->FChangeState(undo == undoUndo ? kstOpen : (undo == undoRedo ? kstClosed : kstDisabled)); } } /*************************************************************************** Put up the costume changer / 3-D Text easel. Returns fTrue if user made changes, else fFalse. ***************************************************************************/ void STDIO::ActorEasel(bool *pfActrChanged) { AssertThis(0); AssertVarMem(pfActrChanged); vpcex->EnqueueCid(cidActorEaselOpen); *pfActrChanged = fFalse; } /*************************************************************************** Put up the costume changer / 3-D Text easel. Returns fTrue if user made changes, else fFalse. ***************************************************************************/ bool STDIO::FCmdActorEaselOpen(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); PACTR pactr = _pmvie->Pscen()->PactrSelected(); AssertPo(pactr, 0); vapp.BeginLongOp(); // // Start the easel. // Note: easels are self-managing, so we don't need to keep the PESL // if (pactr->Ptmpl()->FIsTdt()) { ESLT::PesltNew(_pcrm, _pmvie, pactr); } else { ESLA::PeslaNew(_pcrm, _pmvie, pactr); } vapp.EndLongOp(); return fTrue; } /*************************************************************************** This frame has a pause type. ***************************************************************************/ void STDIO::PauseType(WIT wit) { AssertThis(0); PGOK pgok; long fFlag; fFlag = FPure(wit == witUntilSnd); pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidPausesSound); AssertNilOrPo(pgok, 0); if ((pgok != pvNil) && pgok->FIs(kclsGOK)) { if (fFlag) { pgok->FChangeState(kstOpen); } else { pgok->FChangeState(kstClosed); } } else { pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidBackground); if (pgok != pvNil) { pgok->FRunScript((kstDefault << 16) | kchidSetPauseType, &fFlag, 1); } } if (!_pmvie->FPlaying()) { return; } } /*************************************************************************** The movie engine is recording ***************************************************************************/ void STDIO::Recording(bool fRecording, bool fRecord) { AssertThis(0); PGOK pgok; pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidPlay); AssertNilOrPo(pgok, 0); if (pgok == pvNil) { return; } if (fRecording) { if (pgok->Sno() != kstRecording) { pgok->FChangeState(kstRecording); } } else { if (pgok->Sno() != kstDefault) { pgok->FChangeState(kstDefault); } } } /*************************************************************************** The movie engine has an actor ready to be sooner/latered ***************************************************************************/ void STDIO::StartSoonerLater(void) { AssertThis(0); PGOK pgok; pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidActorsSoonerButton); AssertNilOrPo(pgok, 0); if (pgok == pvNil) { return; } pgok->FChangeState(kstOpen); pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidActorsLaterButton); AssertNilOrPo(pgok, 0); if (pgok == pvNil) { pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidActorsSoonerButton); AssertPo(pgok, 0); pgok->FChangeState(kstClosed); return; } pgok->FChangeState(kstOpen); vpapp->DisableAccel(); _psmcc->Psscb()->StartNoAutoadjust(); _fStartedSoonerLater = fTrue; } /*************************************************************************** The movie engine has completed a sooner/later ***************************************************************************/ void STDIO::EndSoonerLater(void) { AssertThis(0); PGOK pgok; if (!_fStartedSoonerLater) return; _psmcc->Psscb()->EndNoAutoadjust(); pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidActorsSoonerButton); AssertNilOrPo(pgok, 0); if (pgok != pvNil) { pgok->FChangeState(kstClosed); } pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidActorsLaterButton); AssertNilOrPo(pgok, 0); if (pgok != pvNil) { pgok->FChangeState(kstClosed); } vpapp->EnableAccel(); _fStartedSoonerLater = fFalse; } /*************************************************************************** The movie engine has placed an actor. ***************************************************************************/ void STDIO::NewActor(void) { AssertThis(0); PGOK pgok; PMVU pmvu; pmvu = (PMVU)_pmvie->PddgGet(0); AssertPo(pmvu, 0); pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidActorsXY); AssertNilOrPo(pgok, 0); if ((pgok != pvNil) && pgok->FIs(kclsGOK)) { if (pgok->Sno() == kstOpen) { pgok->FChangeState(kstClosed); } } else { BRS rgr[3][3] = {{rOne, rZero, rZero}, {rZero, rZero, rOne}, {rZero, -rOne, rZero}}; pmvu->SetAxis(rgr); pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidBackground); if ((pgok != pvNil) && pgok->FIs(kclsGOK)) { AssertPo(pgok, 0); pgok->FRunScript((kstDefault << 16) | kchidResetXZAxisAndGround); } } pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidActorsGround); AssertNilOrPo(pgok, 0); if ((pgok != pvNil) && pgok->FIs(kclsGOK)) { if (pgok->Sno() == kstClosed) { pgok->FChangeState(kstOpen); } } else { pmvu->SetFRespectGround(fFalse); pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidBackground); if ((pgok != pvNil) && pgok->FIs(kclsGOK)) { AssertPo(pgok, 0); pgok->FRunScript((kstDefault << 16) | kchidResetXZAxisAndGround); } } pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidActorsCompose); AssertNilOrPo(pgok, 0); if ((pgok != pvNil) && pgok->FIs(kclsGOK)) { pgok->FChangeState(kstSelected); } } /*************************************************************************** The RollCall needs a mapping from Tmpl CNO's to the GOKD thumb cno ***************************************************************************/ bool STDIO::FAddCmg(CNO cnoTmpl, CNO cnoGokd) { AssertThis(0); CMG cmg; #ifdef DEBUG long icmg; for (icmg = 0; icmg < _pglcmg->IvMac(); icmg++) { _pglcmg->Get(icmg, &cmg); if (cmg.cnoTmpl == cnoTmpl) { Warn("Duplicate actor cno in content"); return fTrue; } } #endif // DEBUG cmg.cnoTmpl = cnoTmpl; cmg.cnoGokd = cnoGokd; return _pglcmg->FAdd(&cmg); } /*************************************************************************** Return the cnoGokd corres to the cnoTmpl ***************************************************************************/ CNO STDIO::CnoGokdFromCnoTmpl(CNO cnoTmpl) { AssertThis(0); long icmg; CMG cmg; for (icmg = 0; icmg < _pglcmg->IvMac(); icmg++) { _pglcmg->Get(icmg, &cmg); if (cmg.cnoTmpl == cnoTmpl) return cmg.cnoGokd; } return cnoNil; } /*************************************************************************** The movie engine needs the action browser for the currently selected actor ***************************************************************************/ void STDIO::StartActionBrowser(void) { AssertThis(0); AssertPo(_pmvie->Pscen(), 0); AssertPo(_pmvie->Pscen()->PactrSelected(), 0); PGOK pgok; CMD cmd; pgok = (PGOK)((APP *)vpappb)->Pkwa()->PgobFromHid(kidBackground); if (pgok != pvNil) { cmd = _cmd; cmd.cid = cidBrowserReady; cmd.pcmh = this; cmd.rglw[0] = kidBrwsAction; vpcex->EnqueueCmd(&cmd); } } /*************************************************************************** Start the listener easel ***************************************************************************/ void STDIO::StartListenerEasel(void) { AssertThis(0); vpcex->EnqueueCid(cidListenerEaselOpen); } /*************************************************************************** Start the listener easel ***************************************************************************/ bool STDIO::FCmdListenerEaselOpen(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); // Note: easels are self-managing, so we don't need to keep the PESLL ESLL::PesllNew(_pcrm, _pmvie, _pmvie->Pscen()->PactrSelected()); return fTrue; } /*************************************************************************** Try to exit the studio. The fClearCache flag is fTrue by default, but should bet set to fFalse if the app is about to quit so we don't bother clearing the caches (since it's slow and requires the CD(s) to be in.) ***************************************************************************/ bool STDIO::FShutdown(bool fClearCache) { AssertThis(0); bool fRet = fTrue; PMVU pmvu; if (_pmvie != pvNil) { pmvu = (PMVU)_pmvie->PddgActive(); AssertPo(pmvu, 0); fRet = pmvu->FCloseDoc(fFalse); } if (fRet && fClearCache) vptagm->ClearCache(); return fRet; } /*************************************************************************** Static function to stop the action button animation ***************************************************************************/ void STDIO::PauseActionButton(void) { PGOK pgok; pgok = (PGOK)vpapp->Pkwa()->PgobFromHid(kidActorsActionBrowser); if (pgok != pvNil && pgok->FIs(kclsGOK)) { AssertPo(pgok, 0); pgok->FChangeState(kstFreeze); } } /*************************************************************************** Static function to resume the action button animation ***************************************************************************/ void STDIO::ResumeActionButton(void) { PGOK pgok; pgok = (PGOK)vpapp->Pkwa()->PgobFromHid(kidActorsActionBrowser); if (pgok != pvNil && pgok->FIs(kclsGOK)) { AssertPo(pgok, 0); pgok->FChangeState(kstDefault); } } /*************************************************************************** The movie engine is using the tool, now play the sound ***************************************************************************/ void STDIO::PlayUISound(long tool, long grfcust) { AssertThis(0); PCRF pcrf; long cactRepeat = 1; long cno; _fStopUISound = fFalse; switch (tool) { case toolUndo: cno = kcnoUndoWav; break; case toolRedo: cno = kcnoRedoWav; break; case toolTboxMove: return; case toolCompose: if (grfcust & fcustCmd) { cno = kcnoMove1Wav; } else if (grfcust & fcustShift) { cno = kcnoMoveAllWav; } else { cno = kcnoMoveWav; } break; case toolActorSelect: cno = kcnoSelectWav; break; case toolSounder: cno = kcnoSPlayWav; break; case toolLooper: cno = kcnoSLoopWav; break; case toolMatcher: cno = kcnoSActWav; break; case toolSceneNuke: cno = kcnoRemScnWav; break; case toolActorNuke: if (grfcust & fcustShift) { cno = kcnoRemWBoxWav; } else { cno = kcnoRemActrWav; } break; case toolSceneChop: cno = kcnoRemAftrWav; break; case toolSceneChopBack: cno = kcnoRemBfrWav; break; case toolTboxStory: cno = kcnoWScrOffWav; break; case toolTboxCredit: cno = kcnoWScrOnWav; break; case toolTboxPaintText: cno = kcnoWColorWav; break; case toolTboxFillBkgd: cno = kcnoWBgClrWav; break; case toolTboxFont: cno = kcnoWFontWav; break; case toolTboxSize: cno = kcnoWSizeWav; break; case toolTboxStyle: cno = kcnoWStyleWav; break; case toolSoonerLater: cno = kcnoSFreezeWav; break; case toolRotateX: case toolRotateY: case toolRotateZ: cno = kcnoRotateWav; cactRepeat = -1; _fStopUISound = fTrue; break; case toolResize: _fStopUISound = fTrue; if (grfcust & fcustShift) { cno = kcnoShrinkWav; } else { cno = kcnoGrowWav; } break; case toolSquashStretch: _fStopUISound = fTrue; if (grfcust & fcustShift) { cno = kcnoSquashWav; } else { cno = kcnoStretchWav; } break; case toolNormalizeRot: cno = kcnoCBackRWav; break; case toolNormalizeSize: cno = kcnoCBackSWav; break; case toolRecordSameAction: cno = kcnoRecordWav; break; case toolAddAFrame: cno = kcnoAddFrameWav; break; case toolFWAFrame: cno = kcnoGoNextFWav; break; case toolRWAFrame: cno = kcnoGoPrevFWav; break; case toolFWAScene: cno = kcnoGoNextSWav; break; case toolRWAScene: cno = kcnoGoPrevSWav; break; case toolPasteObject: case toolPasteText: cno = kcnoPasteWav; break; case toolCutObject: case toolCutText: cno = kcnoCutWav; break; case toolCopyObject: case toolCopyText: cno = kcnoCopyWav; break; case toolCopyRte: cno = kcnoCopyPWav; break; case toolDefault: return; default: Bug("No Sound for this tool"); return; } // // Find the sound and play it // if ((pcrf = _pcrm->PcrfFindChunk(kctgWave, cno)) != pvNil) { vpsndm->SiiPlay(pcrf, kctgWave, cno, ksqnNone, kvlmFull, cactRepeat, 0, 0, ksclUISound); } } /*************************************************************************** The movie engine is done using the tool, now stop the sound ***************************************************************************/ void STDIO::StopUISound(void) { AssertThis(0); if (_fStopUISound) { vpsndm->StopAll(sqnNil, ksclUISound); } } /*************************************************************************** Read a Misc Studio stn ***************************************************************************/ void STDIO::GetStnMisc(long ids, PSTN pstn) { AssertBaseThis(0); AssertDo(_pgstMisc->FFindExtra(&ids, pstn), "Invalid studio.cht or ids"); } /****************************************************************************** FCmdToggleXY Command handler to toggle the XY button setting in the studio Arguments: PCMD pcmd -- the command to process Returns: fTrue; always handles the command ************************************************************ SEANSE ***********/ bool STDIO::FCmdToggleXY(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); PGOK pgok; pgok = (PGOK)vpapp->Pkwa()->PgobFromHid(kidActorsXY); if (pgok != pvNil && pgok->FIs(kclsGOK)) { AssertPo(pgok, 0); vpcex->EnqueueCid(cidClicked, pgok, pvNil, pvNil); } return fTrue; } /****************************************************************************** FCmdHelpBook Command handler to bring up the help book Arguments: PCMD pcmd -- the command to process Returns: fTrue; always handles the command ************************************************************ SEANSE ***********/ bool STDIO::FCmdHelpBook(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); PGOK pgok; pgok = (PGOK)vpapp->Pkwa()->PgobFromHid(kidBook); if (pgok != pvNil && pgok->FIs(kclsGOK)) { AssertPo(pgok, 0); vpcex->EnqueueCid(cidClicked, pgok, pvNil, pvNil); } return fTrue; } /****************************************************************************** FCmdMovieGoto Command handler to force the movie to a specific scene and frame number Arguments: PCMD pcmd -- the command to process Returns: fTrue; always handles the command ************************************************************ SEANSE ***********/ bool STDIO::FCmdMovieGoto(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); /* REVIEW seanse (peted): not good! This allows script to pump whatever number it feels like into our code, with no range checking. */ _pmvie->LwSetMoviePos(pcmd->rglw[0], pcmd->rglw[1]); return fTrue; } /****************************************************************************** FCmdSoundsEnabled Command handler to enabled/disable movie sounds. Arguments: PCMD pcmd -- the command to process Returns: fTrue; always handles the command ************************************************************ SEANSE ***********/ bool STDIO::FCmdSoundsEnabled(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); _pmvie->SetFSoundsEnabled(FPure(pcmd->rglw[0])); return fTrue; } /****************************************************************************** FCmdCreateTbox Command handler to create a textbox. Arguments: PCMD pcmd -- the command to process Returns: fTrue; always handles the command ************************************************************ SEANSE ***********/ bool STDIO::FCmdCreateTbox(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); RC rc; rc.Set(kxpDefaultTbox, kypDefaultTbox, kxpDefaultTbox + kdxpDefaultTbox, kypDefaultTbox + kdypDefaultTbox); if (_pmvie->FInsTbox(&rc, !FPure(pcmd->rglw[0]))) { EnableTboxTools(); } return fTrue; } /**************************************************** * Updates the title display * * Parameters: * pstnTitle - The new title to display. * * Returns: * None. * ****************************************************/ void STDIO::UpdateTitle(PSTN pstnTitle) { AssertThis(0); AssertPo(pstnTitle, 0); STN stnFontSize; long dypFontSize; // Set the movie title if (_ptgobTitle == pvNil) { _ptgobTitle = TGOB::PtgobCreate(kidName, idsStudioFont, tavCenter); GetStnMisc(idsMovieNameDypFont, &stnFontSize); if (stnFontSize.FGetLw(&dypFontSize) && dypFontSize > 0) { _ptgobTitle->SetFontSize(dypFontSize); } else { Warn("Update Movie Name font size failed"); } } if (_ptgobTitle != pvNil) { _ptgobTitle->SetText(pstnTitle); } } #ifdef DEBUG /****************************************************************************** Tells the movie to write bitmaps as it plays, and plays the movie. ************************************************************ PETED ***********/ bool STDIO::FCmdWriteBmps(PCMD pcmd) { if (_pmvie != pvNil) { AssertPo(_pmvie, 0); _pmvie->SetFWriteBmps(fTrue); vpcex->EnqueueCid(cidPlay, this); } return fTrue; } #endif // DEBUG #ifdef DEBUG /**************************************************** * Mark memory used by the STDIO * * Parameters: * None. * * Returns: * None. * ****************************************************/ void STDIO::MarkMem(void) { AssertThis(0); STDIO_PAR::MarkMem(); MarkMemObj(_pmvie); MarkMemObj(_psmcc); MarkMemObj(_pcrm); MarkMemObj(_pgstMisc); MarkMemObj(_pglpbrcn); MarkMemObj(_pbrwrActr); MarkMemObj(_pbrwrProp); MarkMemObj(_pglcmg); MarkMemObj(_pglclr); MarkMemObj(_ptgobTitle); TDT::MarkActionNames(); // // Mark browser objects // long ipbrcn; PBRCN pbrcn; if (_pglpbrcn != pvNil) { for (ipbrcn = 0; ipbrcn < _pglpbrcn->IvMac(); ipbrcn++) { _pglpbrcn->Get(ipbrcn, &pbrcn); MarkMemObj(pbrcn); } } } /*************************************************************************** * * Assert the validity of the STDIO. * * Parameters: * grf - Bit field of options * * Returns: * None. * **************************************************************************/ void STDIO::AssertValid(ulong grf) { STDIO_PAR::AssertValid(fobjAllocated); AssertNilOrPo(_pmvie, 0); AssertPo(_pcrm, 0); AssertPo(_pgstMisc, 0); AssertNilOrPo(_pbrwrActr, 0); AssertNilOrPo(_pbrwrProp, 0); AssertNilOrPo(_pglcmg, 0); AssertNilOrPo(_pglclr, 0); AssertNilOrPo(_pglpbrcn, 0); AssertNilOrPo(_ptgobTitle, 0); } #endif // DEBUG /*************************************************************************** Constructor for SMCC. ***************************************************************************/ SMCC::SMCC(long dxp, long dyp, long cbCache, PSSCB psscb, PSTDIO pstdio) : MCC(dxp, dyp, cbCache) { AssertNilOrPo(psscb, 0); // Note: Would like to do an AssertPo here but can't // the studio isn't necessarily set up yet. AssertBasePo(pstdio, 0); _psscb = psscb; if (pvNil != _psscb) _psscb->AddRef(); _pstdio = pstdio; _dypTextTbox = 0; } /*************************************************************************** * * Update RollCall * **************************************************************************/ void SMCC::UpdateRollCall(void) { AssertThis(0); bool fUpdateActr, fUpdateProp; long aridSel; aridSel = _pstdio->AridSelected(); if (_pstdio->PbrwrActr() != pvNil) { fUpdateActr = !_pstdio->PbrwrActr()->FApplyingSel(); if (!fUpdateActr) aridSel = aridNil; } else fUpdateActr = fFalse; if (_pstdio->PbrwrProp() != pvNil) { fUpdateProp = !_pstdio->PbrwrProp()->FApplyingSel(); if (!fUpdateProp) aridSel = aridNil; } else fUpdateProp = fFalse; if (fUpdateActr) _pstdio->PbrwrActr()->FUpdate(aridSel, _pstdio); if (fUpdateProp) _pstdio->PbrwrProp()->FUpdate(aridSel, _pstdio); } /****************************************************************************** DypTextDef Retrieve a default text size for a textbox in a movie. ************************************************************ PETED ***********/ long SMCC::DypTboxDef(void) { if (_dypTextTbox == 0) { STN stn; _pstdio->GetStnMisc(idsTboxDypFont, &stn); if (!stn.FGetLw(&_dypTextTbox) || _dypTextTbox <= 0) _dypTextTbox = vapp.DypTextDef(); } return _dypTextTbox; } /****************************************************************************** FQueryPurgeSounds Displays a query to the user, asking whether to purge unused imported sounds in the file. Returns: fTrue if the user wants the sounds purged ************************************************************ PETED ***********/ bool SMCC::FQueryPurgeSounds(void) { AssertThis(0); STN stnMsg; AssertDo(vapp.FGetStnApp(idsPurgeSounds, &stnMsg), "String not present"); return vapp.TModal(vapp.PcrmAll(), ktpcQueryPurgeSounds, &stnMsg, bkYesNo) == tYes; } #ifdef DEBUG /*************************************************************************** Assert the validity of the SMCC ***************************************************************************/ void SMCC::AssertValid(ulong grf) { SMCC_PAR::AssertValid(0); AssertPo(_psscb, 0); } /*************************************************************************** Mark memory used by the SMCC ***************************************************************************/ void SMCC::MarkMem(void) { AssertThis(0); SMCC_PAR::MarkMem(); MarkMemObj(_psscb); } #endif // DEBUG ================================================ FILE: src/studio/tatr.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** tatr.cpp: Theater class Primary Author: ****** Review Status: REVIEWED - any changes to this file must be reviewed! A TATR (theater) is similar to a STDIO, but has no UI and is used for playback only. ***************************************************************************/ #include "studio.h" ASSERTNAME RTCLASS(TATR) const long kcmhlTheater = 0x10000; BEGIN_CMD_MAP(TATR, CMH) ON_CID_GEN(cidTheaterLoad, &TATR::FCmdLoad, pvNil) ON_CID_GEN(cidTheaterPlay, &TATR::FCmdPlay, pvNil) ON_CID_GEN(cidTheaterStop, &TATR::FCmdStop, pvNil) ON_CID_GEN(cidTheaterRewind, &TATR::FCmdRewind, pvNil) END_CMD_MAP_NIL() /*************************************************************************** Create a new TATR ***************************************************************************/ PTATR TATR::PtatrNew(long kidParent) { PTATR ptatr; ptatr = NewObj TATR(HidUnique()); if (pvNil == ptatr) return pvNil; if (!ptatr->_FInit(kidParent)) { ReleasePpo(&ptatr); return pvNil; } AssertPo(ptatr, 0); return ptatr; } /*************************************************************************** Initialize the TATR ***************************************************************************/ bool TATR::_FInit(long kidParent) { AssertBaseThis(0); _kidParent = kidParent; if (!vpcex->FAddCmh(this, kcmhlTheater)) return fFalse; return fTrue; } /*************************************************************************** Clean up and delete this theater ***************************************************************************/ TATR::~TATR(void) { AssertBaseThis(0); ReleasePpo(&_pmvie); #ifdef BUG1907 vptagm->ClearCache(sidNil, ftagmFile); // Clear content out of HD cache // Note: could clear out the RAM cache too, but I'm keeping this change // as small as possible. #endif // BUG1907 } /*************************************************************************** Load a new movie into the theater ***************************************************************************/ bool TATR::FCmdLoad(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); PMCC pmcc; FNI fni; PMVIE pmvie = pvNil; PGOB pgob; GCB gcb; pmcc = NewObj MCC(kdxpWorkspace, kdypWorkspace, kcbStudioCache); if (pvNil == pmcc) goto LFail; vpapp->GetPortfolioDoc(&fni); if (fni.Ftg() != kftg3mm) { Bug("Portfolio's FNI has bad FTG in theater"); goto LFail; } vpappb->BeginLongOp(); #ifdef BUG1907 // Close up the previous movie, if any if (_pmvie != pvNil) { if (!_pmvie->PmvuCur()->FCloseDoc(fFalse)) goto LFail; ReleasePpo(&_pmvie); } vptagm->ClearCache(sidNil, ftagmFile); // Clear content out of HD cache // Note: could clear out the RAM cache too, but I'm keeping this change // as small as possible. #endif // BUG1907 pmvie = MVIE::PmvieNew(vpapp->FSlowCPU(), pmcc, &fni, cnoNil); if (pmvie == pvNil) goto LFail; ReleasePpo(&pmcc); // Create a new MVU (with PddgNew()) as a child GOB of _kidParent. // Make it invisible until we get a play command pgob = vpapp->Pkwa()->PgobFromHid(_kidParent); if (pvNil == pgob) { Bug("Couldn't find gob for TATR's kidParent"); goto LFail; } gcb.Set(HidUnique(), pgob); if (pmvie->PddgNew(&gcb) == pvNil) goto LFail; if (pmvie->Cscen() > 0) { if (!pmvie->FSwitchScen(0)) goto LFail; } #ifndef BUG1907 // Close up the previous movie, if any if (_pmvie != pvNil) { if (!_pmvie->PmvuCur()->FCloseDoc(fFalse)) goto LFail; ReleasePpo(&_pmvie); } #endif //! BUG1907 _pmvie = pmvie; vpcex->EnqueueCid(cidTheaterLoadCompleted, pvNil, pvNil, fTrue); return fTrue; LFail: ReleasePpo(&pmcc); ReleasePpo(&pmvie); vpcex->EnqueueCid(cidTheaterLoadCompleted, pvNil, pvNil, fFalse); return fTrue; } /*************************************************************************** Play the current movie. Also makes the MVU visible, if it was hidden. ***************************************************************************/ bool TATR::FCmdPlay(PCMD pcmd) { AssertThis(ftatrMvie); // make sure we have a movie AssertVarMem(pcmd); PMVU pmvu; RC rcAbs; RC rcRel; if (pvNil == _pmvie) // Prevent crash if _pmvie is pvNil (although it return fTrue; // shouldn't ever be if this function is called) pmvu = _pmvie->PmvuCur(); pmvu->GetPos(&rcAbs, &rcRel); rcRel.Set(0, 0, krelOne, krelOne); pmvu->SetPos(&rcAbs, &rcRel); if (!_pmvie->FPlaying()) _pmvie->Play(); return fTrue; } /*************************************************************************** Stop the current movie ***************************************************************************/ bool TATR::FCmdStop(PCMD pcmd) { AssertThis(ftatrMvie); // make sure we have a movie AssertVarMem(pcmd); if (pvNil == _pmvie) // Prevent crash if _pmvie is pvNil (although it return fTrue; // shouldn't ever be if this function is called) if (_pmvie->FPlaying()) _pmvie->Play(); // Play() stops the movie if it's currently playing return fTrue; } /*************************************************************************** Rewind the current movie ***************************************************************************/ bool TATR::FCmdRewind(PCMD pcmd) { AssertThis(ftatrMvie); // make sure we have a movie AssertVarMem(pcmd); if (pvNil == _pmvie) // Prevent crash if _pmvie is pvNil (although it return fTrue; // shouldn't ever be if this function is called) if (_pmvie->Cscen() > 0) { StopAllMovieSounds(); if (_pmvie->FSwitchScen(0)) _pmvie->Pscen()->FGotoFrm(_pmvie->Pscen()->NfrmFirst()); } return fTrue; } #ifdef DEBUG /*************************************************************************** Assert the validity of the TATR. ***************************************************************************/ void TATR::AssertValid(ulong grf) { TATR_PAR::AssertValid(fobjAllocated); if (grf & ftatrMvie) AssertPo(_pmvie, 0); } /*************************************************************************** Mark memory used by the TATR ***************************************************************************/ void TATR::MarkMem(void) { AssertThis(0); TATR_PAR::MarkMem(); MarkMemObj(_pmvie); } #endif // DEBUG ================================================ FILE: src/studio/tbbasics.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /////////////////////////////////////////////////////////// // Basics tables, all sound tables are help dir /////////////////////////////////////////////////////////// ///////////////////////////////////// // Basics callout sequence 1 ///////////////////////////////////// GOBCHUNK("Basics01 initializer", kidBasics01, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Basics01 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcBasics00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidPortfolio) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPortfolio) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 3, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcBasics01) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidPortsNew) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPortsNew) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 3, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //3 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // basics callout sequence 2 ///////////////////////////////////// GOBCHUNK("Basics02 initializer", kidBasics02, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Basics02 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcBasics02) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidPortfolio) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPortfolio) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 3, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcBasics03) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidPortsPortfolio) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPortsPortfolio) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 3, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //3 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // basics callout sequence 3 ///////////////////////////////////// GOBCHUNK("Basics03 initializer", kidBasics03, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Basics03 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 4, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcBasics04) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidPortfolio) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPortfolio) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 4, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcBasics05) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidPortsSave) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPortsSave) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 4, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //4 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // basics callout sequence 4 ///////////////////////////////////// GOBCHUNK("Basics04 initializer", kidBasics04, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Basics04 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 4, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcBasics06) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidPortfolio) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPortfolio) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 4, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcBasics07) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidPortsSaveAs) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPortsSaveAs) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 4, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //4 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // basics callout sequence 5 ///////////////////////////////////// GOBCHUNK("Basics05 initializer", kidBasics05, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Basics05 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrKey, ktpcBasics08) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 2, cidMouseDown, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 2, cidKey, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //2 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // basics callout sequence 6 ///////////////////////////////////// GOBCHUNK("Basics06 initializer", kidBasics06, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Basics06 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcBasics0A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 2, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //2 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // basics callout sequence 7 ///////////////////////////////////// GOBCHUNK("Basics07 initializer", kidBasics07, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Basics07 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcBasics0C) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidBook) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidBook) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 4, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcBasics0D) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kgobHelpBookVoice) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kgobHelpBookVoice) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 4, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcBasics10) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kgobHelpBookCancel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kgobHelpBookCancel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kgobHelpBookVoice) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kgobHelpBookVoice) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 4, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //4 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // basics callout sequence 8 ///////////////////////////////////// GOBCHUNK("Basics08 initializer", kidBasics08, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Basics08 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcBasics0E) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidMap) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidMap) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 2, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //2 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // basics callout sequence 9 ///////////////////////////////////// GOBCHUNK("Basics09 initializer", kidBasics09, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Basics09 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcBasics0F) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 2, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //2 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ================================================ FILE: src/studio/tbguidhp.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /////////////////////////////////////////////////////////////// // Guide help table information /////////////////////////////////////////////////////////////// //WAVE_CHUNK ("studio\sound\VOLW18.WAV", kwavLogo12) GOBCHUNK("Guide Help initializer", kidGuideHelp, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Guide Help setup") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 //PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, OpenAllDoors, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrKey, CO__To_see_the_scenes) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidSettingsBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSettingsBrowser) PROJECT_TABLE(MatchGoto, fFalse, 0, 21, cidMouseDown, kgobGuideHelp) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 21, cidClicked, kgobGuideHelp) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobGuideHelp) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidMouseDown, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidKey, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible|kFltrKey, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 3, cidBrowserVisible, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidMouseDown, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidKey, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk|kFltrBrwCancel|kFltrKey, CO__Click_the_scene_you_want) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 4, cidBrowserOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidBrowserCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 21, cidMouseDown, kgobGuideHelp) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobGuideHelp) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidKey, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrKey|kFltrSceneLoaded, NoHelpHere) // PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 5, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidSceneLoaded, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidMouseDown, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidKey, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrKey, ktpcGuideHelp10) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidClicked, kidSettingsCameras) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSettingsCameras) PROJECT_TABLE(MatchGoto, fFalse, 0, 21, cidMouseDown, kgobGuideHelp) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobGuideHelp) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidMouseDown, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidKey, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible|kFltrKey, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidBrowserVisible, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidMouseDown, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidKey, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk|kFltrBrwCancel|kFltrKey, CO___then_click_the_camera) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidBrowserOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidBrowserCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 21, cidMouseDown, kgobGuideHelp) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobGuideHelp) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidKey, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrKey, CO__When_you_re_ready) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidClicked, kidActorsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 21, cidMouseDown, kgobGuideHelp) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobGuideHelp) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidMouseDown, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidKey, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrKey, CO__Click_Actors) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidClicked, kidActorsBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsBrowser) PROJECT_TABLE(MatchGoto, fFalse, 0, 21, cidMouseDown, kgobGuideHelp) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobGuideHelp) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidMouseDown, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidKey, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible|kFltrKey, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidBrowserVisible, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidMouseDown, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidKey, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //11 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk|kFltrBrwCancel|kFltrKey, CO__Click_the_actor_you_want) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 12, cidBrowserOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidBrowserCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 21, cidMouseDown, kgobGuideHelp) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobGuideHelp) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidKey, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //12 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrActorIn|kFltrActorOut|kFltrKey, CO__Click_where_you_want_to) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidActorPlaced, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidActorPlacedOutOfView, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 21, cidMouseDown, kgobGuideHelp) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobGuideHelp) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidKey, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //13 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrKey, CO__To_make_an_actor_move) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 14, cidClicked, kidActorsActionBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsActionBrowser) PROJECT_TABLE(MatchGoto, fFalse, 0, 21, cidMouseDown, kgobGuideHelp) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobGuideHelp) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidMouseDown, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidKey, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //14 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorClicked|kFltrKey, CO__Click_the_actor) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 15, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 21, cidMouseDown, kgobGuideHelp) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobGuideHelp) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidMouseDown, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidKey, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //15 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrBrwVisible|kFltrKey, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 16, cidBrowserVisible, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidMouseDown, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidKey, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //16 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk|kFltrBrwCancel|kFltrKey, CO__Click_the_action_you) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 17, cidBrowserOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidBrowserCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 21, cidMouseDown, kgobGuideHelp) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobGuideHelp) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidKey, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //17 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorClicked|kFltrKey, CO__Drag_the_actor) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 18, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 21, cidMouseDown, kgobGuideHelp) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobGuideHelp) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidMouseDown, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidKey, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //18 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrKey, CO__To_see_what_your) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 19, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 21, cidMouseDown, kgobGuideHelp) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobGuideHelp) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidMouseDown, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidKey, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //19 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrMoviePlaying|kFltrKey, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 20, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fFalse, 0, 21, cidMouseDown, kgobGuideHelp) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobGuideHelp) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 21, cidMouseDown, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidKey, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //20 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrKey, CO__If_you_want_to_save) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 21, cidMouseDown, kgobGuideHelp) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobGuideHelp) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidMouseDown, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidKey, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //21 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate our states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ================================================ FILE: src/studio/tbhtactr.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /////////////////////////////////////////////////////////// // How to actors tables, all sound tables are help dir /////////////////////////////////////////////////////////// ///////////////////////////////////// // how to actors callout sequence 1 ///////////////////////////////////// GOBCHUNK("HowTo Actors01 initializer", kidHowToActors01, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Actors01 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 3, kidActorsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidActorsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors01) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsBrowser) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidBrowserVisible, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk|kFltrBrwCancel, ktpcHowToActors02) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidBrowserOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidBrowserCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrActorIn|kFltrActorOut, ktpcHowToActors03) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidActorPlaced, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 3, cidActorPlacedOutOfView, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToActors04) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //8 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to actors callout sequence 2 ///////////////////////////////////// GOBCHUNK("HowTo Actors02 initializer", kidHowToActors02, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Actors02 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 3, kidActorsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidActorsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors05) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsPropBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsPropBrowser) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidBrowserVisible, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk|kFltrBrwCancel, ktpcHowToActors06) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidBrowserOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidBrowserCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrActorIn|kFltrActorOut, ktpcHowToActors07) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidActorPlaced, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 3, cidActorPlacedOutOfView, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToActors08) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //8 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to actors callout sequence 3 ///////////////////////////////////// GOBCHUNK("HowTo Actors03 initializer", kidHowToActors03, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Actors03 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 3, kidActorsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidActorsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors09) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsSpletters) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsSpletters) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrEslVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidEaselVisible, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrEslClosing|kFltrEslCancel, ktpcEaselHelp0B) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 6, cidEaselClosing, fTrue) PROJECT_TABLE(MatchGoto, fFalse, 2, 8, cidEaselClosing, fFalse) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidEaselCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrActorIn|kFltrActorOut, ktpcHowToActors0B) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidActorPlaced, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 3, cidActorPlacedOutOfView, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToActors0C) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //8 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to actors callout sequence 4 ///////////////////////////////////// GOBCHUNK("HowTo Actors04 initializer", kidHowToActors04, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Actors04 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 3, kidRollCallActorBorder1, kstBrowserEnabled) PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 3, kidRollCallActorBorder1, kstBrowserSelected) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Actor) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidActorsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors12) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchDescGoto, fFalse, 0, 5, cidClicked, kidRollCallActorBorder1) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidRollCallActorBorder1) PROJECT_TABLE(MatchDescGoto, fFalse, 0, 6, cidClicked, kidRollCallActorBorder2) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidRollCallActorBorder2) PROJECT_TABLE(MatchDescGoto, fFalse, 0, 7, cidClicked, kidRollCallActorBorder3) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidRollCallActorBorder3) PROJECT_TABLE(MatchDescGoto, fFalse, 0, 8, cidClicked, kidRollCallActorBorder4) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidRollCallActorBorder4) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidRollCallActorDownArrow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidRollCallActorDownArrow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidRollCallActorUpArrow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidRollCallActorUpArrow) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 11, kidRollCallActorBorder1, kstBrowserInvisible) PROJECT_TABLE(JumpToState, fTrue, NotRel, 9, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 11, kidRollCallActorBorder2, kstBrowserInvisible) PROJECT_TABLE(JumpToState, fTrue, NotRel, 9, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 11, kidRollCallActorBorder3, kstBrowserInvisible) PROJECT_TABLE(JumpToState, fTrue, NotRel, 9, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 11, kidRollCallActorBorder4, kstBrowserInvisible) PROJECT_TABLE(JumpToState, fTrue, NotRel, 9, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, SimulateClick, kidActorsCompose) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorIn|kFltrActorOut|kFltrActorClicked, ktpcHowToActors13) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidActorPlaced, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidActorPlacedOutOfView, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidActorClicked, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToActors14) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //11 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to actors callout sequence 5 ///////////////////////////////////// GOBCHUNK("HowTo Actors05 initializer", kidHowToActors05, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Actors05 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 3, kidRollCallPropBorder1, kstBrowserEnabled) PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 3, kidRollCallPropBorder1, kstBrowserSelected) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Actor) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidActorsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors15) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchDescGoto, fFalse, 0, 5, cidClicked, kidRollCallPropBorder1) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidRollCallPropBorder1) PROJECT_TABLE(MatchDescGoto, fFalse, 0, 6, cidClicked, kidRollCallPropBorder2) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidRollCallPropBorder2) PROJECT_TABLE(MatchDescGoto, fFalse, 0, 7, cidClicked, kidRollCallPropBorder3) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidRollCallPropBorder3) PROJECT_TABLE(MatchDescGoto, fFalse, 0, 8, cidClicked, kidRollCallPropBorder4) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidRollCallPropBorder4) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidRollCallPropDownArrow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidRollCallPropDownArrow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidRollCallPropUpArrow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidRollCallPropUpArrow) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 11, kidRollCallPropBorder1, kstBrowserInvisible) PROJECT_TABLE(JumpToState, fTrue, NotRel, 9, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 11, kidRollCallPropBorder2, kstBrowserInvisible) PROJECT_TABLE(JumpToState, fTrue, NotRel, 9, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 11, kidRollCallPropBorder3, kstBrowserInvisible) PROJECT_TABLE(JumpToState, fTrue, NotRel, 9, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 11, kidRollCallPropBorder4, kstBrowserInvisible) PROJECT_TABLE(JumpToState, fTrue, NotRel, 9, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, SimulateClick, kidActorsCompose) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorIn|kFltrActorOut|kFltrActorClicked, ktpcHowToActors16) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidActorPlaced, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidActorPlacedOutOfView, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidActorClicked, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToActors17) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //11 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to actors callout sequence 6 ///////////////////////////////////// GOBCHUNK("HowTo Actors06 initializer", kidHowToActors06, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Actors06 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableActorTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Actor) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidActorsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors18) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidActorsActionBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsActionBrowser) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorClicked, ktpcHowToActors19) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidBrowserVisible, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk|kFltrBrwCancel, ktpcEaselHelp2D) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidBrowserOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidBrowserCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorClicked, ktpcHowToActors1B) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToActors1C) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //10 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to actors callout sequence 7 ///////////////////////////////////// GOBCHUNK("HowTo Actors07 initializer", kidHowToActors07, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Actors07 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableActorTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Actor) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidActorsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors1D) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidActorsActionBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsActionBrowser) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorClicked, ktpcHowToActors1E) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidBrowserVisible, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk|kFltrBrwCancel, ktpcEaselHelp2D) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidBrowserOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidBrowserCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToActors1F) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //9 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to actors callout sequence 8 ///////////////////////////////////// GOBCHUNK("HowTo Actors08 initializer", kidHowToActors08, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Actors08 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableActorTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Actor) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidActorsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors20) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidActorsCompose) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCompose) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorClicked, ktpcHowToActors21) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToActors22) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //7 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to actors callout sequence 9 ///////////////////////////////////// GOBCHUNK("HowTo Actors09 initializer", kidHowToActors09, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Actors09 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableActorTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Actor) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidActorsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 5, kidActorsContinue, kstSelected) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors23) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidClicked, kidActorsContinue) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsContinue) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors23) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidMouseDown, kidActorsContinue) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorClicked, ktpcHowToActors24) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToActors25) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //8 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to actors callout sequence 10 ///////////////////////////////////// GOBCHUNK("HowTo Actors10 initializer", kidHowToActors10, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Actors10 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableActorTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Actor) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidActorsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors2A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidActorsRecordMode) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsRecordMode) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors91) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidClicked, kidActorsContinue) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsContinue) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorClicked, ktpcHowToActors2B) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToActors2C) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //8 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to actors callout sequence 11 ///////////////////////////////////// GOBCHUNK("HowTo Actors11 initializer", kidHowToActors11, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Actors11 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableActorTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Actor) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidActorsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, OpenAllDoors, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors30) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidActorsSooner) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsSooner) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorClicked, ktpcHowToActors31) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors32) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidActorsSoonerButton) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsSoonerButton) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidActorsLaterButton) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsLaterButton) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 8, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToActors33) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //9 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to actors callout sequence 12 ///////////////////////////////////// GOBCHUNK("HowTo Actors12 initializer", kidHowToActors12, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Actors12 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableActorTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Actor) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidActorsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, OpenAllDoors, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors34) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidActorsSooner) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsSooner) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorClicked, ktpcHowToActors35) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors36) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidActorsSoonerButton) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsSoonerButton) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidActorsLaterButton) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsLaterButton) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 8, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToActors37) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //9 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to actors callout sequence 13 ///////////////////////////////////// GOBCHUNK("HowTo Actors13 initializer", kidHowToActors13, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Actors13 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableActorTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Actor) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidActorsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors38) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidCutCopyPaste) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCutCopyPaste) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors39) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidClicked, kidCCPCopyRoute) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCCPCopyRoute) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorClicked, ktpcHowToActors3A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors3B) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidClicked, kidCutCopyPaste) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCutCopyPaste) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors3C) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidClicked, kidCCPPaste) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCCPPaste) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorClicked, ktpcHowToActors3D) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToActors3E) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //11 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to actors callout sequence 14 ///////////////////////////////////// GOBCHUNK("HowTo Actors14 initializer", kidHowToActors14, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Actors14 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableActorTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Actor) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidActorsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors3F) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidCutCopyPaste) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCutCopyPaste) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors40) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidClicked, kidCCPCopy) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCCPCopy) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorClickedDown, ktpcHowToActors41) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidActorClickedDown, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors42) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidClicked, kidCutCopyPaste) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCutCopyPaste) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors43) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidClicked, kidCCPPaste) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCCPPaste) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrActorIn|kFltrActorOut, ktpcHowToActors44) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidActorPlaced, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidActorPlacedOutOfView, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToActors45) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //11 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to actors callout sequence 15 ///////////////////////////////////// GOBCHUNK("HowTo Actors15 initializer", kidHowToActors15, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Actors15 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableActorTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Actor) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidActorsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors46) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidCutCopyPaste) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCutCopyPaste) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors47) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidClicked, kidCCPCut) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCCPCut) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorClickedDown, ktpcHowToActors48) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidActorClickedDown, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors49) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidClicked, kidCutCopyPaste) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCutCopyPaste) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors4A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidClicked, kidCCPPaste) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCCPPaste) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrActorIn|kFltrActorOut, ktpcHowToActors4B) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidActorPlaced, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidActorPlacedOutOfView, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToActors4C) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //11 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to actors callout sequence 16 ///////////////////////////////////// GOBCHUNK("HowTo Actors16 initializer", kidHowToActors16, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Actors16 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableActorTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Actor) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidActorsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors4D) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidCutCopyPaste) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCutCopyPaste) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors4E) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidClicked, kidCCPActorNuke) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCCPActorNuke) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorClickedDown, ktpcHowToActors4F) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidActorClickedDown, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToActors50) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //8 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to actors callout sequence 17 ///////////////////////////////////// GOBCHUNK("HowTo Actors17 initializer", kidHowToActors17, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Actors17 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableActorTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Actor) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidActorsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors51) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidActorsRotate) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsRotate) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors52) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidClicked, kidActorsRotateX) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsRotateX) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorClicked, ktpcHowToActors53) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToActors54) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //8 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to actors callout sequence 18 ///////////////////////////////////// GOBCHUNK("HowTo Actors18 initializer", kidHowToActors18, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Actors18 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableActorTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Actor) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidActorsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors55) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidActorsRotate) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsRotate) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors56) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidClicked, kidActorsRotateY) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsRotateY) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorClicked, ktpcHowToActors57) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToActors58) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //8 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to actors callout sequence 19 ///////////////////////////////////// GOBCHUNK("HowTo Actors19 initializer", kidHowToActors19, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Actors19 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableActorTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Actor) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidActorsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors59) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidActorsRotate) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsRotate) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors5A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidClicked, kidActorsRotateZ) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsRotateZ) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorClicked, ktpcHowToActors5B) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToActors5C) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //8 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to actors callout sequence 20 ///////////////////////////////////// GOBCHUNK("HowTo Actors20 initializer", kidHowToActors20, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Actors20 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableActorTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Actor) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidActorsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors5D) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidActorsRotate) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsRotate) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors5E) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidClicked, kidActorsRotateNorm) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsRotateNorm) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorClicked, ktpcHowToActors5F) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToActors60) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //8 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to actors callout sequence 21 ///////////////////////////////////// GOBCHUNK("HowTo Actors21 initializer", kidHowToActors21, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Actors21 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableActorTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Actor) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidActorsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors61) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidActorsSelect) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsSelect) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorClicked, ktpcHowToActors62) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToActors63) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //7 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to actors callout sequence 22 ///////////////////////////////////// GOBCHUNK("HowTo Actors22 initializer", kidHowToActors22, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Actors22 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 3, kidRollCallActorBorder1, kstBrowserEnabled) PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 3, kidRollCallActorBorder1, kstBrowserSelected) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Actor) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidActorsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors64) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchDescGoto, fFalse, 0, 5, cidClicked, kidRollCallActorBorder1) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidRollCallActorBorder1) PROJECT_TABLE(MatchDescGoto, fFalse, 0, 6, cidClicked, kidRollCallActorBorder2) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidRollCallActorBorder2) PROJECT_TABLE(MatchDescGoto, fFalse, 0, 7, cidClicked, kidRollCallActorBorder3) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidRollCallActorBorder3) PROJECT_TABLE(MatchDescGoto, fFalse, 0, 8, cidClicked, kidRollCallActorBorder4) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidRollCallActorBorder4) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidRollCallActorDownArrow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidRollCallActorDownArrow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidRollCallActorUpArrow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidRollCallActorUpArrow) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 11, kidRollCallActorBorder1, kstBrowserInvisible) PROJECT_TABLE(JumpToState, fTrue, NotRel, 9, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 11, kidRollCallActorBorder2, kstBrowserInvisible) PROJECT_TABLE(JumpToState, fTrue, NotRel, 9, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 11, kidRollCallActorBorder3, kstBrowserInvisible) PROJECT_TABLE(JumpToState, fTrue, NotRel, 9, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 11, kidRollCallActorBorder4, kstBrowserInvisible) PROJECT_TABLE(JumpToState, fTrue, NotRel, 9, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, SimulateClick, kidActorsCompose) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorIn|kFltrActorOut|kFltrActorClicked, ktpcHowToActors13) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidActorPlaced, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidActorPlacedOutOfView, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidActorClicked, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToActors65) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //11 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to actors callout sequence 23 ///////////////////////////////////// GOBCHUNK("HowTo Actors23 initializer", kidHowToActors23, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Actors23 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 3, kidRollCallPropBorder1, kstBrowserEnabled) PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 3, kidRollCallPropBorder1, kstBrowserSelected) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Actor) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidActorsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors66) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchDescGoto, fFalse, 0, 5, cidClicked, kidRollCallPropBorder1) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidRollCallPropBorder1) PROJECT_TABLE(MatchDescGoto, fFalse, 0, 6, cidClicked, kidRollCallPropBorder2) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidRollCallPropBorder2) PROJECT_TABLE(MatchDescGoto, fFalse, 0, 7, cidClicked, kidRollCallPropBorder3) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidRollCallPropBorder3) PROJECT_TABLE(MatchDescGoto, fFalse, 0, 8, cidClicked, kidRollCallPropBorder4) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidRollCallPropBorder4) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidRollCallPropDownArrow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidRollCallPropDownArrow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidRollCallPropUpArrow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidRollCallPropUpArrow) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 11, kidRollCallPropBorder1, kstBrowserInvisible) PROJECT_TABLE(JumpToState, fTrue, NotRel, 9, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 11, kidRollCallPropBorder2, kstBrowserInvisible) PROJECT_TABLE(JumpToState, fTrue, NotRel, 9, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 11, kidRollCallPropBorder3, kstBrowserInvisible) PROJECT_TABLE(JumpToState, fTrue, NotRel, 9, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 11, kidRollCallPropBorder4, kstBrowserInvisible) PROJECT_TABLE(JumpToState, fTrue, NotRel, 9, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, SimulateClick, kidActorsCompose) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorIn|kFltrActorOut|kFltrActorClicked, ktpcHowToActors16) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidActorPlaced, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidActorPlacedOutOfView, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidActorClicked, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToActors67) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //11 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to actors callout sequence 24 ///////////////////////////////////// GOBCHUNK("HowTo Actors24 initializer", kidHowToActors24, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Actors24 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableActorTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Actor) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidActorsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, OpenAllDoors, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors68) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidActorsTransform) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsTransform) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors69) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidClicked, kidActorsShrink) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsShrink) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorClicked, ktpcHowToActors6A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToActors6B) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //8 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to actors callout sequence 25 ///////////////////////////////////// GOBCHUNK("HowTo Actors25 initializer", kidHowToActors25, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Actors25 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableActorTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Actor) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidActorsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, OpenAllDoors, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors6C) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidActorsTransform) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsTransform) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors6D) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidClicked, kidActorsSquash) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsSquash) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorClicked, ktpcHowToActors6E) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToActors6F) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //8 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to actors callout sequence 26 ///////////////////////////////////// GOBCHUNK("HowTo Actors26 initializer", kidHowToActors26, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Actors26 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableActorTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Actor) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidActorsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, OpenAllDoors, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors70) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidActorsTransform) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsTransform) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors71) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidClicked, kidActorsTransformNorm) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsTransformNorm) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorClicked, ktpcHowToActors72) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToActors73) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //8 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to actors callout sequence 27 ///////////////////////////////////// GOBCHUNK("HowTo Actors27 initializer", kidHowToActors27, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Actors27 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableActorTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Actor) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidActorsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToActors74) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidActorsCostume) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCostume) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorClicked, ktpcHowToActors75) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 4, 8, cidActorClicked, 2) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrEslVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidEaselVisible, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrEslOk|kFltrEslCancel, ktpcEaselHelp15) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidEaselOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidEaselCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrEslVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidEaselVisible, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrEslOk|kFltrEslCancel, ktpcEaselHelp0B) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidEaselOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidEaselCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToActors77) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //11 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ================================================ FILE: src/studio/tbhtscen.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /////////////////////////////////////////////////////////// // How to scenes tables, all scene tables are in this file /////////////////////////////////////////////////////////// ///////////////////////////////////// // how to scenes callout sequence 1 ///////////////////////////////////// GOBCHUNK("HowTo Scene01 initializer", kidHowToScenes01, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Scene01 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 2, kidSettingsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToScenes00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidSettingsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSettingsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToScenes01) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidSettingsBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSettingsBrowser) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 4, cidBrowserVisible, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk|kFltrBrwCancel, ktpcHowToScenes02) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidBrowserOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidBrowserCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrSceneLoaded, NoHelpHere) // PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 6, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidSceneLoaded, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToScenes32) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidClicked, kidSettingsCameras) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSettingsCameras) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidBrowserVisible, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk|kFltrBrwCancel, ktpcHowToScenes03) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidBrowserOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidBrowserCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToScenes04) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //10 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to scenes callout sequence 2 ///////////////////////////////////// GOBCHUNK("HowTo Scene02 initializer", kidHowToScenes02, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Scene02 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 2, kidSettingsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToScenes00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidSettingsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSettingsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToScenes05) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidSettingsCameras) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSettingsCameras) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidBrowserVisible, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk|kFltrBrwCancel, ktpcHowToScenes06) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidBrowserOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidBrowserCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToScenes07) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //7 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to scenes callout sequence 3 ///////////////////////////////////// GOBCHUNK("HowTo Scene03 initializer", kidHowToScenes03, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Scene03 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 2, kidSettingsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToScenes00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidSettingsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSettingsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToScenes08) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidPausesMouse) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPausesMouse) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToScenes09) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //5 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to scenes callout sequence 4 ///////////////////////////////////// GOBCHUNK("HowTo Scene04 initializer", kidHowToScenes04, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Scene04 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 3, kidSoundsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToSounds00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidSoundsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, OpenAllDoors, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToScenes0A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidPausesSound) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPausesSound) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToScenes0B) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //5 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to scenes callout sequence 5 ///////////////////////////////////// GOBCHUNK("HowTo Scene05 initializer", kidHowToScenes05, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Scene05 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 2, kidSettingsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToScenes00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidSettingsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSettingsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToScenes0C) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidPausesClear) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPausesClear) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToScenes28) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //5 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to scenes callout sequence 6 ///////////////////////////////////// GOBCHUNK("HowTo Scene06 initializer", kidHowToScenes06, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Scene06 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 2, kidSettingsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToScenes00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidSettingsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSettingsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, OpenAllDoors, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToScenes0D) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidSceneSorter) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSceneSorter) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrScnSortVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidSceneSortInit, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrScnSortOk|kFltrScnSortCancel, ktpcHowToScenes0E) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidSceneSortOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidSceneSortCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidMouseDown, kidSSorterOpen) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidMouseDown, kidSSorterNuke) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidMouseDown, kidSSorterHand) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToScenes0F) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //7 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to scenes callout sequence 7 ///////////////////////////////////// GOBCHUNK("HowTo Scene07 initializer", kidHowToScenes07, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Scene07 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 2, kidSettingsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToScenes00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidSettingsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSettingsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, OpenAllDoors, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToScenes10) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidSceneSorter) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSceneSorter) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrScnSortVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidSceneSortInit, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrScnSortOk|kFltrScnSortCancel, ktpcHowToScenes11) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, 2, 6, cidSceneSortOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidSceneSortCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidMouseDown, kidSSorterOpen) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidMouseDown, kidSSorterNuke) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidMouseDown, kidSSorterHand) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToScenes12) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //7 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to scenes callout sequence 8 ///////////////////////////////////// GOBCHUNK("HowTo Scene08 initializer", kidHowToScenes08, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Scene08 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 2, kidScrollbarsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 4, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToScenes13) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, 0, 3, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 4, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToScenes14) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 4, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //4 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to scenes callout sequence 9 ///////////////////////////////////// GOBCHUNK("HowTo Scene09 initializer", kidHowToScenes09, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Scene09 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 2, kidScrollbarsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 4, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToScenes15) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, 0, 3, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 4, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToScenes16) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 4, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //4 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to scenes callout sequence 10 ///////////////////////////////////// GOBCHUNK("HowTo Scene10 initializer", kidHowToScenes10, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Scene10 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 2, kidSettingsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToScenes00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidSettingsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSettingsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToScenes17) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidCutCopyPaste) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCutCopyPaste) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToScenes18) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidCCPActorNuke) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCCPActorNuke) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToScenes3B) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, NotRel, 6, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToScenes19) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //7 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to scenes callout sequence 11 ///////////////////////////////////// GOBCHUNK("HowTo Scene11 initializer", kidHowToScenes11, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Scene11 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 2, kidSettingsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToScenes00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidSettingsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSettingsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToScenes1A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidCCPSceneChopBack) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCCPSceneChopBack) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToScenes1C) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, NotRel, 5, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToScenes1D) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //6 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to scenes callout sequence 12 ///////////////////////////////////// GOBCHUNK("HowTo Scene12 initializer", kidHowToScenes12, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Scene12 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 2, kidSettingsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToScenes00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidSettingsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSettingsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToScenes1E) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidCCPSceneChopFwd) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCCPSceneChopFwd) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToScenes20) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, NotRel, 5, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToScenes21) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //6 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to scenes callout sequence 13 ///////////////////////////////////// GOBCHUNK("HowTo Scene13 initializer", kidHowToScenes13, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Scene13 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 2, kidSettingsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToScenes00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidSettingsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSettingsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, OpenAllDoors, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToScenes22) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidSceneSorter) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSceneSorter) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrScnSortVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidSceneSortInit, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToScenes23) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidClicked, kidSSorterOpen) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSSorterOpen) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrPortfolioResult, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 7, cidPortfolioResult, fTrue) PROJECT_TABLE(MatchAllGoto, fFalse, 2, 9, cidPortfolioResult, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrScnSortOk|kFltrScnSortCancel, ktpcHowToScenes25) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, 2, 8, cidSceneSortOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidSceneSortCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidMouseDown, kidSSorterOpen) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidMouseDown, kidSSorterNuke) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidMouseDown, kidSSorterHand) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToScenes29) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //9 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to scenes callout sequence 14 ///////////////////////////////////// GOBCHUNK("HowTo Scene14 initializer", kidHowToScenes14, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Scene14 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 2, kidUndosCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Undo) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 3, kidUndo, kstOpen) PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 3, kidUndo, kstClosed) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Undo) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToScenes26) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidUndo) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidUndo) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToScenes2A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //5 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to scenes callout sequence 15 ///////////////////////////////////// GOBCHUNK("HowTo Scene15 initializer", kidHowToScenes15, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Scene15 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 2, kidSettingsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToScenes00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidSettingsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSettingsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, OpenAllDoors, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToScenes34) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidSettingsBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSettingsBrowser) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidBrowserVisible, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk|kFltrBrwCancel, ktpcHowToScenes35) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidBrowserOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidBrowserCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToScenes36) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidClicked, kidSceneSorter) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSceneSorter) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrScnSortVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidSceneSortInit, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrScnSortOk|kFltrScnSortCancel, ktpcHowToScenes37) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 9, cidSceneSortOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidSceneSortCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidMouseDown, kidSSorterOpen) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidMouseDown, kidSSorterNuke) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidMouseDown, kidSSorterHand) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToScenes3A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //10 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ================================================ FILE: src/studio/tbhtsoun.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /////////////////////////////////////////////////////////// // How to sounds tables, all sound tables are in this file /////////////////////////////////////////////////////////// ///////////////////////////////////// // how to sounds callout sequence 1 ///////////////////////////////////// GOBCHUNK("HowTo Sounds01 initializer", kidHowToSounds01, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Sounds01 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 3, kidSoundsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToSounds00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidSoundsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToSounds01) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidSoundsEfxBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsEfxBrowser) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidBrowserVisible, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk|kFltrBrwCancel, ktpcEaselHelp19) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidBrowserOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidBrowserCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorClicked, ktpcHowToSounds03) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidActorClicked, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, NotRel, 7, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToSounds04) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //8 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to sounds callout sequence 2 ///////////////////////////////////// GOBCHUNK("HowTo Sounds02 initializer", kidHowToSounds02, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Sounds02 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 3, kidSoundsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToSounds00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidSoundsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToSounds05) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidSoundsMicBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsMicBrowser) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidBrowserVisible, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk|kFltrBrwCancel, ktpcEaselHelp24) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidBrowserOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidBrowserCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorClicked, ktpcHowToSounds07) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToSounds08) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //8 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to sounds callout sequence 3 ///////////////////////////////////// GOBCHUNK("HowTo Sounds03 initializer", kidHowToSounds03, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Sounds03 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 3, kidSoundsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToSounds00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidSoundsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToSounds09) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidSoundsMusicBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsMusicBrowser) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidBrowserVisible, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk|kFltrBrwCancel, ktpcEaselHelp29) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidBrowserOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidBrowserCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorClicked, ktpcHowToSounds0B) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidActorClicked, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, NotRel, 7, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToSounds0C) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //8 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to sounds callout sequence 4 ///////////////////////////////////// GOBCHUNK("HowTo Sounds04 initializer", kidHowToSounds04, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Sounds04 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 3, kidSoundsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToSounds00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidSoundsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToSounds0D) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidSoundsEfxBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsEfxBrowser) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidClicked, kidSoundsMicBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsMicBrowser) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidClicked, kidSoundsMusicBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsMusicBrowser) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidBrowserVisible, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk|kFltrBrwCancel, ktpcEaselHelp19) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidBrowserOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidBrowserCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidBrowserVisible, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk|kFltrBrwCancel, ktpcEaselHelp24) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidBrowserOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidBrowserCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidBrowserVisible, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk|kFltrBrwCancel, ktpcEaselHelp29) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidBrowserOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidBrowserCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToSounds21) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidClicked, kidSoundsPlayOnce) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsPlayOnce) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //11 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorClicked, ktpcHowToSounds0E) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 12, cidActorClicked, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, NotRel, 12, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //12 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToSounds0F) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //13 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to sounds callout sequence 5 ///////////////////////////////////// GOBCHUNK("HowTo Sounds05 initializer", kidHowToSounds05, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Sounds05 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 3, kidSoundsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToSounds00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidSoundsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToSounds10) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidSoundsEfxBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsEfxBrowser) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidClicked, kidSoundsMicBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsMicBrowser) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidClicked, kidSoundsMusicBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsMusicBrowser) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidBrowserVisible, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk|kFltrBrwCancel, ktpcEaselHelp19) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidBrowserOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidBrowserCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidBrowserVisible, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk|kFltrBrwCancel, ktpcEaselHelp24) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidBrowserOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidBrowserCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidBrowserVisible, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk|kFltrBrwCancel, ktpcEaselHelp29) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidBrowserOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidBrowserCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToSounds2C) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidClicked, kidSoundsLooping) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsLooping) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //11 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorClicked, ktpcHowToSounds11) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 12, cidActorClicked, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, NotRel, 12, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //12 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToSounds12) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //13 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to sounds callout sequence 6 ///////////////////////////////////// GOBCHUNK("HowTo Sounds06 initializer", kidHowToSounds06, kgokkNormal) DEFAULT_POSITION(0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Sounds06 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 3, kidSoundsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToSounds00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidSoundsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, OpenAllDoors, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToSounds13) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidSoundsEfxBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsEfxBrowser) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidClicked, kidSoundsMicBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsMicBrowser) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidClicked, kidSoundsMusicBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsMusicBrowser) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidBrowserVisible, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk|kFltrBrwCancel, ktpcEaselHelp19) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidBrowserOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidBrowserCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidBrowserVisible, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk|kFltrBrwCancel, ktpcEaselHelp24) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidBrowserOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidBrowserCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidBrowserVisible, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk|kFltrBrwCancel, ktpcEaselHelp29) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidBrowserOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidBrowserCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToSounds2D) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidClicked, kidSoundsAttachToCell) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsAttachToCell) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //11 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorClicked, ktpcHowToSounds14) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 12, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //12 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToSounds15) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //13 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to sounds callout sequence 7 ///////////////////////////////////// GOBCHUNK("HowTo Sounds07 initializer", kidHowToSounds07, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Sounds07 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 2, kidSettingsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToSounds16) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, NotRel, 4, cidMouseDown, kidVolumeSlider) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 3, kidDoors, kstSceneDoorsOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToSounds16) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, NotRel, 4, cidMouseDown, kidVolumeSlider) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToSounds17) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, NotRel, 5, cidClicked, kidVolumeSlider) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidVolumeSlider) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToSounds18) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //6 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to sounds callout sequence 8 ///////////////////////////////////// GOBCHUNK("HowTo Sounds08 initializer", kidHowToSounds08, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Sounds08 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 3, kidSoundsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToSounds00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidSoundsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToSounds19) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidSoundsListen) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsListen) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorClicked, ktpcHowToSounds1A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidActorClicked, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, NotRel, 5, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrEslVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidEaselVisible, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrEslOk|kFltrEslCancel, ktpcEaselHelp13) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidEaselOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidEaselCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToSounds1C) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //8 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to sounds callout sequence 9 ///////////////////////////////////// GOBCHUNK("HowTo Sounds09 initializer", kidHowToSounds09, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Sounds09 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 3, kidSoundsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToSounds00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidSoundsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToSounds1D) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidBook) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidBook) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToSounds1E) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kgobHelpBookVoice) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kgobHelpBookVoice) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToSounds1F) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidClicked, kgobHelpBookCancel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kgobHelpBookCancel) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //6 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to sounds callout sequence 10 ///////////////////////////////////// GOBCHUNK("HowTo Sounds10 initializer", kidHowToSounds10, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Sounds10 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 3, kidSoundsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToSounds00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidSoundsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToSounds20) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidSoundsEfxBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsEfxBrowser) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidClicked, kidSoundsMicBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsMicBrowser) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidClicked, kidSoundsMusicBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsMusicBrowser) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidBrowserVisible, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk|kFltrBrwCancel, ktpcEaselHelp19) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidBrowserOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidBrowserCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidBrowserVisible, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk|kFltrBrwCancel, ktpcEaselHelp24) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidBrowserOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidBrowserCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidBrowserVisible, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk|kFltrBrwCancel, ktpcEaselHelp29) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidBrowserOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidBrowserCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToSounds21) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidClicked, kidSoundsPlayOnce) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsPlayOnce) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //11 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorClicked, ktpcHowToSounds22) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 12, cidActorClicked, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, NotRel, 12, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //12 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToSounds26) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //13 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to sounds callout sequence 11 ///////////////////////////////////// GOBCHUNK("HowTo Sounds11 initializer", kidHowToSounds11, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Sounds11 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 3, kidSoundsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToSounds00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidSoundsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToSounds23) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidSoundsEfxBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsEfxBrowser) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidSoundsMicBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsMicBrowser) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidSoundsMusicBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsMusicBrowser) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidBrowserVisible, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk|kFltrBrwCancel, ktpcHowToSounds24) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidBrowserOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidBrowserCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToSounds25) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //7 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to sounds callout sequence 12 ///////////////////////////////////// GOBCHUNK("HowTo Sounds12 initializer", kidHowToSounds12, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Sounds12 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 3, kidSoundsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToSounds00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidSoundsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToSounds27) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidCutCopyPaste) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCutCopyPaste) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToSounds28) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, NotRel, 5, cidClicked, kidCCPActorNuke) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidCCPActorNuke) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrActorClicked, ktpcHowToSounds29) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidActorClicked, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, NotRel, 6, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrEslVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidEaselVisible, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrEslOk|kFltrEslCancel, ktpcEaselHelp13) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidEaselOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidEaselCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToSounds2A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //9 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ================================================ FILE: src/studio/tbhtword.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /////////////////////////////////////////////////////////// // How to word tables, all sound tables are in help dir /////////////////////////////////////////////////////////// ///////////////////////////////////// // how to words callout sequence 1 ///////////////////////////////////// GOBCHUNK("HowTo Words01 initializer", kidHowToWords01, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Words01 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 3, kidTextsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidTextsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidTextsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords01) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidTextsCreate) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidTextsCreate) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidBrowserVisible, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk|kFltrBrwCancel, ktpcHowToWords02) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidBrowserOk, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidBrowserCancel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrTBoxClicked, ktpcHowToWords28) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidTboxClicked, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrKey,ktpcHowToWords03) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidKey, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, ktpcHowToWords04) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //9 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to Words callout sequence 2 ///////////////////////////////////// GOBCHUNK("HowTo Word02 initializer", kidHowToWords02, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Word02 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableTboxTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Word_Box) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidTextsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidTextsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidTextsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords05) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidTextsFont) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidTextsFont) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords06) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidTextFontPageDown) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidTextFontPageDown) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidTextFontPageUp) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidTextFontPageUp) PROJECT_TABLE(MatchDescGoto, fFalse, NotRel, 6, cidClicked, kidTextFont) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidTextFont) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrTBoxClicked, ktpcHowToWords07) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 3, 7, cidTboxClicked, fFalse) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrKey, ktpcHowToWords08) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidKey, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //8 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to Words callout sequence 3 ///////////////////////////////////// GOBCHUNK("HowTo Word03 initializer", kidHowToWords03, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Word03 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableTboxTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Word_Box) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidTextsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidTextsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidTextsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords09) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidTextsFontShape) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidTextsFontShape) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords0A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, NotRel, 6, cidClicked, kidTextStyle) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidTextStyle) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrTBoxClicked, ktpcHowToWords0B) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 3, 7, cidTboxClicked, fFalse) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrKey, ktpcHowToWords0C) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidKey, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //8 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to Words callout sequence 4 ///////////////////////////////////// GOBCHUNK("HowTo Word04 initializer", kidHowToWords04, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Word04 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableTboxTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Word_Box) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidTextsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidTextsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidTextsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords0D) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidTextsFontSize) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidTextsFontSize) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords0E) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, NotRel, 6, cidClicked, kidTextSize) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidTextSize) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrTBoxClicked, ktpcHowToWords0F) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 3, 7, cidTboxClicked, fFalse) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrKey, ktpcHowToWords10) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidKey, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //8 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to Words callout sequence 5 ///////////////////////////////////// GOBCHUNK("HowTo Word05 initializer", kidHowToWords05, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Word05 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableTboxTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Word_Box) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidTextsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidTextsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidTextsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords11) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidTextsFontColor) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidTextsFontColor) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords12) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidTextColorPageDown) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidTextColorPageDown) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidTextColorPageUp) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidTextColorPageUp) PROJECT_TABLE(MatchDescGoto, fFalse, NotRel, 6, cidClicked, kidTextColor) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidTextColor) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrTBoxClicked, ktpcHowToWords13) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 3, 7, cidTboxClicked, fFalse) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrKey, ktpcHowToWords14) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidKey, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //8 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to Words callout sequence 6 ///////////////////////////////////// GOBCHUNK("HowTo Word06 initializer", kidHowToWords06, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Word06 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableTboxTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Word_Box) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidTextsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidTextsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidTextsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, OpenAllDoors, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords15) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidTextsBkgdColor) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidTextsBkgdColor) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords16) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidTextBkgdColorPageDown) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidTextBkgdColorPageDown) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidTextBkgdColorPageUp) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidTextBkgdColorPageUp) PROJECT_TABLE(MatchDescGoto, fFalse, NotRel, 6, cidClicked, kidTextBkgdColor) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidTextBkgdColor) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrTBoxClicked, ktpcHowToWords17) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) // PROJECT_TABLE(MatchGoto, fFalse, 3, 7, cidTboxClicked, fFalse) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidTboxClicked, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrKey, ktpcHowToWords18) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidKey, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //8 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to Words callout sequence 7 ///////////////////////////////////// GOBCHUNK("HowTo Word07 initializer", kidHowToWords07, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Word07 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableTboxTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Word_Box) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidTextsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidTextsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidTextsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrTBoxClicked, ktpcHowToWords19) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 3, 5, cidTboxClicked, fFalse) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrKey, ktpcHowToWords1A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidKey, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //6 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to Words callout sequence 8 ///////////////////////////////////// GOBCHUNK("HowTo Word08 initializer", kidHowToWords08, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Word08 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableTboxTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Word_Box) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidTextsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidTextsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidTextsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrTBoxClicked, ktpcHowToWords1B) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 3, 5, cidTboxClicked, fFalse) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrKey, ktpcHowToWords1C) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidKey, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //6 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to Words callout sequence 9 ///////////////////////////////////// GOBCHUNK("HowTo Word09 initializer", kidHowToWords09, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Word09 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableTboxTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Word_Box) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidTextsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidTextsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidTextsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, OpenAllDoors, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords1D) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidTextsScrollType) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidTextsScrollType) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgo2bHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords1E) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, NotRel, 6, cidClicked, kidScrollBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidScrollBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrTBoxClicked, ktpcHowToWords1F) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidTboxClicked, NotRel) // PROJECT_TABLE(MatchGoto, fFalse, 3, 7, cidTboxClicked, fFalse) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrKey, ktpcHowToWords20) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidKey, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //8 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to Words callout sequence 10 ///////////////////////////////////// GOBCHUNK("HowTo Word10 initializer", kidHowToWords10, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Word10 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableTboxTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Word_Box) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidTextsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidTextsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidTextsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrTBoxClicked, ktpcHowToWords21) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 3, 5, cidTboxClicked, fFalse) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrKey, ktpcHowToWords22) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidKey, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //6 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to Words callout sequence 11 ///////////////////////////////////// GOBCHUNK("HowTo Word11 initializer", kidHowToWords11, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Word11 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableTboxTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Word_Box) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidTextsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidTextsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidTextsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords23) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidCutCopyPaste) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCutCopyPaste) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords24) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, NotRel, 6, cidClicked, kidCCPCopy) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidCCPCopy) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrTBoxClicked, ktpcHowToWords25) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 3, 7, cidTboxClicked, fFalse) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords26) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidClicked, kidCutCopyPaste) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCutCopyPaste) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords27) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, NotRel, 9, cidClicked, kidCCPPaste) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidCCPPaste) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrTBoxClicked, ktpcHowToWords29) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidTboxClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrKey, ktpcHowToWords2A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidKey, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //11 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to Words callout sequence 12 ///////////////////////////////////// GOBCHUNK("HowTo Word12 initializer", kidHowToWords12, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Word12 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableTboxTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Word_Box) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidTextsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidTextsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidTextsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords2B) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidCutCopyPaste) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCutCopyPaste) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords2C) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, NotRel, 6, cidClicked, kidCCPCopy) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidCCPCopy) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrTBoxClicked, ktpcHowToWords2D) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 3, 7, cidTboxClicked, fFalse) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords2E) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidClicked, kidCutCopyPaste) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCutCopyPaste) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords2F) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, NotRel, 9, cidClicked, kidCCPPaste) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidCCPPaste) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrTBoxClicked, ktpcHowToWords28) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidTboxClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrKey, ktpcHowToWords30) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidKey, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //11 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to Words callout sequence 13 ///////////////////////////////////// GOBCHUNK("HowTo Word13 initializer", kidHowToWords13, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Word13 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableTboxTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Word_Box) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidTextsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidTextsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidTextsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords31) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidCutCopyPaste) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCutCopyPaste) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords32) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, NotRel, 6, cidClicked, kidCCPCut) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidCCPCut) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrTBoxClicked, ktpcHowToWords33) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 3, 7, cidTboxClicked, fFalse) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords34) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidClicked, kidCutCopyPaste) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCutCopyPaste) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords35) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, NotRel, 9, cidClicked, kidCCPPaste) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidCCPPaste) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrTBoxClicked, ktpcHowToWords36) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidTboxClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrKey, ktpcHowToWords37) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidKey, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //11 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to Words callout sequence 14 ///////////////////////////////////// GOBCHUNK("HowTo Word14 initializer", kidHowToWords14, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Word14 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableTboxTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Word_Box) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidTextsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidTextsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidTextsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords38) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidCutCopyPaste) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCutCopyPaste) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords39) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, NotRel, 6, cidClicked, kidCCPCut) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidCCPCut) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrTBoxClicked, ktpcHowToWords3A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 3, 7, cidTboxClicked, fFalse) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords3B) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidClicked, kidCutCopyPaste) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCutCopyPaste) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords3C) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, NotRel, 9, cidClicked, kidCCPPaste) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidCCPPaste) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrTBoxClicked, ktpcHowToWords28) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidTboxClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrKey, ktpcHowToWords3D) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidKey, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //11 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ///////////////////////////////////// // how to Words callout sequence 15 ///////////////////////////////////// GOBCHUNK("HowTo Word15 initializer", kidHowToWords15, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("HowTo Word15 Table") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 2, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Scene) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 3, kidBackground->fEnableTboxTools, fTrue) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse, No_Word_Box) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 4, kidTextsCover, kstOpen) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidTextsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidTextsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords3E) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kidSceneBackground) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidSceneBackground) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidCutCopyPaste) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCutCopyPaste) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcHowToWords3F) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, NotRel, 6, cidClicked, kidCCPActorNuke) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidCCPActorNuke) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrTBoxClicked, ktpcHowToWords40) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidTboxClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrKey, ktpcHowToWords41) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobHowtoSequence) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidKey, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //8 PROJECT_TABLE(SpecialInstr, fFalse, NotRel, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ================================================ FILE: src/studio/tblogowz.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /////////////////////////////////////////////////////////////// // Logo wizard table information /////////////////////////////////////////////////////////////// GOBCHUNK("Logo wizard initializer", kidLogoWizard, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Logo wizard setup") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, OpenAllDoors, NotRel) PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcLogo00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 2, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcLogo02) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidSettingsBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSettingsBrowser) PROJECT_TABLE(MatchGoto, fTrue, 0, 23, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 24, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 4, cidBrowserVisible, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk|kFltrBrwCancel, ktpcLogo03) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidBrowserOk, NotRel) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 24, cidBrowserCancel, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrSceneLoaded, NoHelpHere) // PROJECT_TABLE(BoolCondGoto, NotRel, NotRel, 6, kidBackground->fEnableSceneTools, fTrue) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidSceneLoaded, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcLogo01) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidClicked, kidSettingsCameras) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSettingsCameras) PROJECT_TABLE(MatchGoto, fTrue, 0, 23, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 24, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidBrowserVisible, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk|kFltrBrwCancel, ktpcLogo04) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidBrowserOk, NotRel) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 24, cidBrowserCancel, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcLogo05) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidClicked, kidActorsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCover) PROJECT_TABLE(MatchGoto, fTrue, 0, 23, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 24, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcLogo06) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidClicked, kidActorsSpletters) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsSpletters) PROJECT_TABLE(MatchGoto, fTrue, 0, 23, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 24, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //11 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrEslVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 12, cidEaselVisible, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //12 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrEslClosing|kFltrEslCancel, ktpcLogo07) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 14, cidEaselClosing, fTrue) PROJECT_TABLE(MatchGoto, fFalse, 2, 13, cidEaselClosing, fFalse) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidEaselCancel, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //13 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcLogo08) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidClicked, kidActorsSpletters) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsSpletters) PROJECT_TABLE(MatchGoto, fTrue, 0, 23, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 24, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //14 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrActorIn|kFltrActorOut, ktpcLogo09) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 15, cidActorPlaced, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidActorPlacedOutOfView, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //15 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcLogo0A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 16, cidClicked, kidActorsActionBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsActionBrowser) PROJECT_TABLE(MatchGoto, fTrue, 0, 23, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 24, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //16 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpcLogo0B) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 17, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 23, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 24, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //17 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 18, cidBrowserVisible, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //18 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk|kFltrBrwCancel, ktpcLogo0C) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 19, cidBrowserOk, NotRel) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 24, cidBrowserCancel, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //19 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpcLogo11) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 20, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 23, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 24, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //20 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 21, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 23, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 24, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //21 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 22, kidPlay, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 22, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 23, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 24, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //22 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpcLogo12) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 26, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 28, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 27, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, 25, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 24, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Exit //23 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcExitHelp) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 27, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 25, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Deviate //24 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcDeviation) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 26, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 27, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 25, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //25 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitGadgetHelp)// used instead of quit help because it brings up the mczee message after exit //3 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitGadgetHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //27 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Make another project //28 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ClearStudio, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrModalClosed|kFltrPortfolioResult, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidQuerySaveDocResult, 1) PROJECT_TABLE(MatchGoto, fFalse, 2, 1, cidQuerySaveDocResult, 0) PROJECT_TABLE(MatchGoto, fFalse, 2, 22, cidQuerySaveDocResult, 2) PROJECT_TABLE(MatchGoto, fFalse, 2, 1, cidPortfolioResult, fTrue) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 22, cidPortfolioResult, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ================================================ FILE: src/studio/tbproj1.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /////////////////////////////////////////////////////////////// // Project1 table information /////////////////////////////////////////////////////////////// //WAVE_CHUNK ("studio\sound\xxx.WAV", kwav1Project00) GOBCHUNK("Project1 01 initializer", kid1Project01, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project1 01 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, OpenAllDoors, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project22) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidGadgetPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetPlay) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrGadgetAviStop, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 3, cidGadgetAviStop, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project01) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidGadgetWhy) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project02) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 3, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMovieLoaded, NoHelpHere) PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, LoadProjectMovie, stidMovie1) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 6, cidProjectMovieLoaded, fTrue) PROJECT_TABLE(MatchGoto, fFalse, 2, 21, cidProjectMovieLoaded, fFalse) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, OpenDoorCovers, kidActorsCover) PROJECT_TABLE(SpecialInstr, fTrue, Proj1Scene, NotRel, SetSceneAndFrame, Proj1Frame) PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpc1Project03) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 7, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, SetBrowserItem, Prj1Action1) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project04) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidClicked, kidActorsActionBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsActionBrowser) PROJECT_TABLE(MatchGoto, fTrue, 0, 18, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 19, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc1Project05) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 18, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 19, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidBrowserVisible, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwSelect, ktpc1Project06) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, 0, 11, cidBrowserSelect, NotRel) PROJECT_TABLE(IgnoreParentMatch, fFalse, 0, NotRel, cidMouseDown, kidReserveProjects) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 19, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //11 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk, ktpc1Project07) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidBrowserOk) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 12, cidBrowserOk, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 19, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //12 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc1Project08) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 18, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 19, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //13 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 14, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 18, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 19, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //14 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 15, kidPlay, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 15, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 18, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 19, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //15 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project09) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 16, cidClicked, kidFrameRW) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidFrameRW) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(MatchGoto, fTrue, 0, 18, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 19, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //16 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, SetHelpAlarm, 90) PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, SetBlinkingGadget, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrAlarmOff, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 17, cidHelpAlarmOff, NotRel) PROJECT_TABLE(MatchGoto, fTrue, 0, 18, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 19, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //17 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project0A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchGoto, fTrue, 0, 18, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 19, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Exit //18 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcExitHelp) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 22, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 20, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Deviate //19 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcDeviation) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 21, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 22, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 20, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //20 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, fTrue, NotRel, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitGadgetHelp) //21 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, QuitGadgetHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //22 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, fTrue, NotRel, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK // Second sequence for project 1 GOBCHUNK("Project1 02 initializer", kid1Project02, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project1 02 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() //1 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project0B) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidGadgetWhy) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project0C) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 1, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project0D) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidSoundsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsCover) PROJECT_TABLE(MatchGoto, fTrue, 0, 13, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, SetBrowserItem, Prj1SoundsMic1) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project0E) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidSoundsMicBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsMicBrowser) PROJECT_TABLE(MatchGoto, fTrue, 0, 13, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidBrowserVisible, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwSelect, ktpc1Project0F) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, 0, 7, cidBrowserSelect, NotRel) PROJECT_TABLE(IgnoreParentMatch, fFalse, 0, NotRel, cidMouseDown, kidReserveProjects) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidBrowserOk) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidBrowserOk, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc1Project10) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidSoundsPlayOnce) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsPlayOnce) PROJECT_TABLE(MatchGoto, fTrue, 0, 13, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project11) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(MatchGoto, fTrue, 0, 13, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 11, kidPlay, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 11, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 13, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //11 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, SetHelpAlarm, 90) PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, SetBlinkingGadget, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrAlarmOff, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 12, cidHelpAlarmOff, NotRel) PROJECT_TABLE(MatchGoto, fTrue, 0, 13, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //12 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project0A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchGoto, fTrue, 0, 13, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Exit //13 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcExitHelp) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 17, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 15, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Deviate //14 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcDeviation) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 16, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 17, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 15, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //15 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, fTrue, NotRel, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitGadgetHelp) //16 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, QuitGadgetHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //17 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, fTrue, NotRel, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK // Third sequence for project 1 GOBCHUNK("Project1 03 initializer", kid1Project03, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project1 03 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() //1 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project12) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidGadgetWhy) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project13) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 1, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project14) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidSettingsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSettingsCover) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, SetBrowserItem, Prj1Camera1) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project16) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidSettingsCameras) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSettingsCameras) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidBrowserVisible, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk, ktpc1Project17) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreParentMatch, fFalse, 0, NotRel, cidMouseDown, kidReserveProjects) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidBrowserOk, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project18) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidClicked, kidActorsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCover) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project19) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidClicked, kidActorsContinue) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsContinue) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc1Project1B) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //11 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 12, kidPlay, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 12, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //12 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project1C) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidClicked, kidFrameRW) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidFrameRW) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //13 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, SetHelpAlarm, 90) PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, SetBlinkingGadget, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrAlarmOff, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 14, cidHelpAlarmOff, NotRel) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //14 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project0A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Exit //15 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcExitHelp) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 19, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 17, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Deviate //16 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcDeviation) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 18, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 19, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 17, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //17 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, fTrue, NotRel, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitGadgetHelp) //18 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, QuitGadgetHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //19 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, fTrue, NotRel, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK // Fourth sequence for project 1 GOBCHUNK("Project1 04 initializer", kid1Project04, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project1 04 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() //1 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project1D) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidGadgetWhy) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project1E) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 1, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project1F) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidSoundsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsCover) PROJECT_TABLE(MatchGoto, fTrue, 0, 14, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, SetBrowserItem, Prj1SoundsMic2) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project0E) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidSoundsMicBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsMicBrowser) PROJECT_TABLE(MatchGoto, fTrue, 0, 14, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidBrowserVisible, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwSelect, ktpc1Project23) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, 0, 7, cidBrowserSelect, NotRel) PROJECT_TABLE(IgnoreParentMatch, fFalse, 0, NotRel, cidMouseDown, kidReserveProjects) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidBrowserOk) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidBrowserOk, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc1Project24) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidSoundsPlayOnce) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsPlayOnce) PROJECT_TABLE(MatchGoto, fTrue, 0, 14, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project25) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(MatchGoto, fTrue, 0, 14, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 11, kidPlay, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 11, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 14, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //11 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project26) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 12, cidClicked, kidFrameRW) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidFrameRW) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(MatchGoto, fTrue, 0, 14, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //12 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, SetHelpAlarm, 90) PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, SetBlinkingGadget, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrAlarmOff, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidHelpAlarmOff, NotRel) PROJECT_TABLE(MatchGoto, fTrue, 0, 14, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //13 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project0A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchGoto, fTrue, 0, 14, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Exit //14 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcExitHelp) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 18, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 16, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Deviate //15 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcDeviation) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 17, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 18, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 16, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //16 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, fTrue, NotRel, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitGadgetHelp) //17 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, QuitGadgetHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //18 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, fTrue, NotRel, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK // Fifth sequence for project 1 GOBCHUNK("Project1 05 initializer", kid1Project05, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project1 05 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() //1 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project27) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidGadgetWhy) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project28) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 1, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project14) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidSettingsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSettingsCover) PROJECT_TABLE(MatchGoto, fTrue, 0, 17, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 18, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, SetBrowserItem, Prj1Camera2) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project16) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidSettingsCameras) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSettingsCameras) PROJECT_TABLE(MatchGoto, fTrue, 0, 17, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 18, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidBrowserVisible, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk, ktpc1Project29) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreParentMatch, fFalse, 0, NotRel, cidMouseDown, kidReserveProjects) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidBrowserOk, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 18, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project2A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(MatchGoto, fTrue, 0, 17, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 18, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 9, kidPlay, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 9, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 17, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 18, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project2B) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidClicked, kidActorsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCover) PROJECT_TABLE(MatchGoto, fTrue, 0, 17, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 18, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project19) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidClicked, kidActorsContinue) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsContinue) PROJECT_TABLE(MatchGoto, fTrue, 0, 17, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 18, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //11 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc1Project2C) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 12, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 17, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 18, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //12 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 17, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 18, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //13 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 14, kidPlay, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 14, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 17, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 18, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //14 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project09) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 15, cidClicked, kidFrameRW) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidFrameRW) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(MatchGoto, fTrue, 0, 17, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 18, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //15 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, SetHelpAlarm, 90) PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, SetBlinkingGadget, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrAlarmOff, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 16, cidHelpAlarmOff, NotRel) PROJECT_TABLE(MatchGoto, fTrue, 0, 17, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 18, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //16 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project0A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchGoto, fTrue, 0, 17, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 18, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Exit //17 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcExitHelp) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 21, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 19, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Deviate //18 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcDeviation) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 20, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 21, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 19, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //19 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, fTrue, NotRel, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitGadgetHelp) //20 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, QuitGadgetHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //21 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, fTrue, NotRel, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK // Sixth sequence for project 1 GOBCHUNK("Project1 06 initializer", kid1Project06, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project1 06 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() //1 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project2D) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidGadgetWhy) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project2E) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 1, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project0D) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidSoundsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsCover) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, SetBrowserItem, Prj1SoundsMic3) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project0E) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidSoundsMicBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsMicBrowser) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidBrowserVisible, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwSelect, ktpc1Project2F) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, 0, 7, cidBrowserSelect, NotRel) PROJECT_TABLE(IgnoreParentMatch, fFalse, 0, NotRel, cidMouseDown, kidReserveProjects) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidBrowserOk) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidBrowserOk, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc1Project10) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidSoundsPlayOnce) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsPlayOnce) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project30) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 11, kidPlay, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 11, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //11 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project31) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 12, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //12 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 13, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //13 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, SetHelpAlarm, 90) PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, SetBlinkingGadget, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrAlarmOff, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 14, cidHelpAlarmOff, NotRel) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //14 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc1Project0A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Exit //15 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcExitHelp) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 19, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 17, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Deviate //16 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcDeviation) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 18, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 19, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 17, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //17 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, fTrue, NotRel, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitGadgetHelp) //18 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, QuitGadgetHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //19 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, fTrue, NotRel, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK // Seventh sequence for project 1 GOBCHUNK("Project1 07 initializer", kid1Project07, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project1 07 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() //1 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, SetNextProject, 2) PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpc1Project20) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 3, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 5, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 4, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, 2, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //2 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, fTrue, NotRel, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitGadgetHelp) //3 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, QuitGadgetHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //4 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, fTrue, NotRel, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(NextClip) //5 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ClearStudio, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrModalClosed|kFltrPortfolioResult, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidQuerySaveDocResult, 1) PROJECT_TABLE(MatchGoto, fFalse, 2, 6, cidQuerySaveDocResult, 0) PROJECT_TABLE(MatchGoto, fFalse, 2, 1, cidQuerySaveDocResult, 2) PROJECT_TABLE(MatchGoto, fFalse, 2, 6, cidPortfolioResult, fTrue) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 1, cidPortfolioResult, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Change movies //6 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, ChangeToNextMovie, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ================================================ FILE: src/studio/tbproj2.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /////////////////////////////////////////////////////////////// // Project2 table information /////////////////////////////////////////////////////////////// //WAVE_CHUNK ("studio\sound\xxx.WAV", kwav2Project00) GOBCHUNK("Project2 initializer", kid2Project01, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project2 01 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, OpenAllDoors, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc2Project00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidGadgetPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetPlay) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrGadgetAviStop, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 3, cidGadgetAviStop, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc2Project01) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidGadgetWhy) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc2Project02) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 3, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMovieLoaded, NoHelpHere) PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, LoadProjectMovie, stidMovie3) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 6, cidProjectMovieLoaded, fTrue) PROJECT_TABLE(MatchGoto, fFalse, 2, 23, cidProjectMovieLoaded, fFalse) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, OpenDoorCovers, kidActorsCover) PROJECT_TABLE(SpecialInstr, fTrue, Proj3Scene, NotRel, SetSceneAndFrame, Proj3Frame) PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpc2Project03) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 7, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc2Project04) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(MatchGoto, fTrue, 0, 20, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 21, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 9, kidPlay, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 9, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 20, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 21, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc2Project05) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, 0, 10, cidClicked, kidRollCallActorBorder1) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidRollCallActorBorder1) PROJECT_TABLE(MatchGoto, fTrue, 0, 20, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 21, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc2Project06) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidClicked, kidActorsSooner) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsSooner) PROJECT_TABLE(MatchGoto, fTrue, 0, 10, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 21, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //11 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc2Project08) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 12, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 20, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 21, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //12 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 10, kidActorsSooner, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc2Project0A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidClicked, kidActorsSoonerButton) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsSoonerButton) PROJECT_TABLE(MatchGoto, fTrue, 0, 20, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 21, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //13 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc2Project0B) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidActorsSoonerButton) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsSoonerButton) PROJECT_TABLE(MatchGoto, fFalse, 0, 14, cidClicked, kidFrameRWEnd) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidFrameRWEnd) PROJECT_TABLE(MatchGoto, fTrue, 0, 20, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 21, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //14 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc2Project0C) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 15, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(MatchGoto, fTrue, 0, 20, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 21, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //15 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 16, kidPlay, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 16, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 20, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 21, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //16 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc2Project0D) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 17, cidClicked, kidFrameRWEnd) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidFrameRWEnd) PROJECT_TABLE(MatchGoto, fTrue, 0, 20, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 21, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //17 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc2Project0E) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 18, cidClicked, kidFrameFW) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidFrameFW) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(MatchGoto, fTrue, 0, 20, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 21, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //18 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetHelpAlarm, 90) PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBlinkingGadget, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrAlarmOff, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 19, cidHelpAlarmOff, NotRel) PROJECT_TABLE(MatchGoto, fTrue, 0, 20, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 21, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //19 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc2Project10) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchGoto, fTrue, 0, 20, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 21, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Exit //20 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcExitHelp) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 24, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 22, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Deviate //21 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcDeviation) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 23, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 24, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 22, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //22 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitGadgetHelp) //23 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitGadgetHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //24 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK // Second sequence for project 2 GOBCHUNK("Project2 02 initializer", kid2Project02, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project2 02 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() //1 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc2Project11) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidGadgetWhy) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc2Project12) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 1, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc2Project13) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidSettingsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSettingsCover) PROJECT_TABLE(MatchGoto, fTrue, 0, 10, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc2Project14) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidCCPSceneChopBack) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCCPSceneChopBack) PROJECT_TABLE(MatchGoto, fTrue, 0, 10, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc2Project15) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, 0, 6, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 10, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc2Project16) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(MatchGoto, fTrue, 0, 10, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 8, kidPlay, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 8, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 10, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetHelpAlarm, 90) PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBlinkingGadget, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrAlarmOff, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidHelpAlarmOff, NotRel) PROJECT_TABLE(MatchGoto, fTrue, 0, 10, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc2Project10) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchGoto, fTrue, 0, 10, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 11, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Exit //10 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcExitHelp) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 14, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 12, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Deviate //11 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcDeviation) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 13, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 14, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 12, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //12 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitGadgetHelp) //13 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitGadgetHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //14 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK // Third sequence for project 2 GOBCHUNK("Project2 03 initializer", kid2Project03, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project2 03 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() //1 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, SetNextProject, 4) PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpc2Project2B) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 3, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 5, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 4, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, 2, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //2 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitGadgetHelp) //3 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitGadgetHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //4 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(NextClip) //5 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ClearStudio, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrModalClosed|kFltrPortfolioResult, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidQuerySaveDocResult, 1) PROJECT_TABLE(MatchGoto, fFalse, 2, 6, cidQuerySaveDocResult, 0) PROJECT_TABLE(MatchGoto, fFalse, 2, 1, cidQuerySaveDocResult, 2) PROJECT_TABLE(MatchGoto, fFalse, 2, 6, cidPortfolioResult, fTrue) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 1, cidPortfolioResult, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Change movies //6 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ChangeToNextMovie, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ================================================ FILE: src/studio/tbproj3.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /////////////////////////////////////////////////////////////// // Project3 table information /////////////////////////////////////////////////////////////// //WAVE_CHUNK ("studio\sound\xxx.WAV", kwav3Project00) GOBCHUNK("Project3 01 initializer", kid3Project01, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project3 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, OpenAllDoors, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, To_play_this_movie__click) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidGadgetPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetPlay) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrGadgetAviStop, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 3, cidGadgetAviStop, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, To_see_the_steps_for_changing) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidGadgetWhy) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, Why__Actions__when_viewed) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 3, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMovieLoaded, NoHelpHere) PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, LoadProjectMovie, stidMovie2) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 6, cidProjectMovieLoaded, fTrue) PROJECT_TABLE(MatchGoto, fFalse, 2, 22, cidProjectMovieLoaded, fFalse) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, OpenDoorCovers, kidActorsCover) PROJECT_TABLE(SpecialInstr, fTrue, Proj2Scene, NotRel, SetSceneAndFrame, Proj2Frame) PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, I_created_the_first_part) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 7, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBrowserItem, Prj3Action1) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, CO__To_change_Nakita_s_act) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidClicked, kidActorsActionBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsActionBrowser) PROJECT_TABLE(MatchGoto, fTrue, 0, 19, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 20, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, CO__Click_Nakita) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 19, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 20, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidBrowserVisible, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwSelect, CO__Click_Run_Scared) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, 0, 11, cidBrowserSelect, NotRel) PROJECT_TABLE(IgnoreParentMatch, fFalse, 0, NotRel, cidMouseDown, kidReserveProjects) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 20, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //11 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk, CO__Then_click_OK) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidBrowserOk) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 12, cidBrowserOk, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 20, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //12 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, CO__Presto___The_new_action) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(MatchGoto, fTrue, 0, 19, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 20, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //13 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 14, kidPlay, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 14, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 19, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 20, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //14 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, CO__To_see_the_movie_from) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 15, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(MatchGoto, fTrue, 0, 19, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 20, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //15 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 16, kidPlay, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 16, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 19, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 20, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //16 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, CO__Click_the_button_below) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 17, cidClicked, kidFrameRW) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidFrameRW) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(MatchGoto, fTrue, 0, 19, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 20, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //17 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetHelpAlarm, 90) PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBlinkingGadget, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrAlarmOff, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 18, cidHelpAlarmOff, NotRel) PROJECT_TABLE(MatchGoto, fTrue, 0, 19, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 20, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //18 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, IDLE__Remember_to_get) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchGoto, fTrue, 0, 19, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 20, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Exit //19 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcExitHelp) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 23, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 21, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Deviate //20 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcDeviation) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 22, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 23, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 21, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //21 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitGadgetHelp) //22 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitGadgetHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //23 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK // Second sequence for project 3 GOBCHUNK("Project3 02 initializer", kid3Project02, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project3 02 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() //1 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, To_see_the_steps_for_adding) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidGadgetWhy) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, Why__There_are_two_ways_to) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 1, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, CO__To_find_Nakita_s_line) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidSoundsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsCover) PROJECT_TABLE(MatchGoto, fTrue, 0, 13, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBrowserItem, Prj3SoundsMic1) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, CO__Click_Speech) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidSoundsMicBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsMicBrowser) PROJECT_TABLE(MatchGoto, fTrue, 0, 13, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidBrowserVisible, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwSelect, CO__Click__A_rat) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, 0, 7, cidBrowserSelect, NotRel) PROJECT_TABLE(IgnoreParentMatch, fFalse, 0, NotRel, cidMouseDown, kidReserveProjects) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidBrowserOk) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidBrowserOk, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, CO__Now_click_Nakita) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidSoundsPlayOnce) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsPlayOnce) PROJECT_TABLE(MatchGoto, fTrue, 0, 13, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, CO__To_play_the_movie_so) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(MatchGoto, fTrue, 0, 13, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 11, kidPlay, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 11, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 13, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //11 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetHelpAlarm, 90) PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBlinkingGadget, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrAlarmOff, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 12, cidHelpAlarmOff, NotRel) PROJECT_TABLE(MatchGoto, fTrue, 0, 13, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //12 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, IDLE__Remember_to_get) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchGoto, fTrue, 0, 13, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Exit //13 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcExitHelp) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 17, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 15, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Deviate //14 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcDeviation) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 16, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 17, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 15, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //15 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitGadgetHelp) //16 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitGadgetHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //17 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK // Third sequence for project 3 GOBCHUNK("Project3 03 initializer", kid3Project03, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project3 03 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() //1 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, CO__To_see_the_steps_for) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidGadgetWhy) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, Why_Each_action_moves) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 1, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, CO__To_add_an_action) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCover) PROJECT_TABLE(MatchGoto, fFalse, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fTrue, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBrowserItem, Prj3Action2) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, CO__Click_Actions) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidActorsActionBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsActionBrowser) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, CO__Click_Nakita) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidBrowserVisible, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwSelect, CO__Click_yell) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, 0, 8, cidBrowserSelect, NotRel) PROJECT_TABLE(IgnoreParentMatch, fFalse, 0, NotRel, cidMouseDown, kidReserveProjects) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk, CO__Then_click_OK) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidBrowserOk) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidBrowserOk, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, CO__Click_Nakita_Then_hold) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //11 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 12, kidPlay, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 12, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //12 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, CO__Click_the_button_below_to) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidClicked, kidFrameRW) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidFrameRW) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //13 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetHelpAlarm, 90) PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBlinkingGadget, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrAlarmOff, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 14, cidHelpAlarmOff, NotRel) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //14 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, IDLE__Remember_to_get) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Exit //15 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcExitHelp) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 19, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 17, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Deviate //16 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcDeviation) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 18, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 19, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 17, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //17 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitGadgetHelp) //18 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitGadgetHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //19 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK // Fourth sequence for project 3 GOBCHUNK("Project3 04 initializer", kid3Project04, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project3 04 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() //1 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, CO__To_see_the_steps) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidGadgetWhy) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, Why__Some_actions_need) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 1, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, CO__To_find_Nakita_s_line) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidSoundsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsCover) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBrowserItem, Prj3SoundsMic2) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, CO__Click_Speech) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidSoundsMicBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsMicBrowser) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidBrowserVisible, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwSelect, CO__Click__Wait_up__Wanda) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, 0, 7, cidBrowserSelect, NotRel) PROJECT_TABLE(IgnoreParentMatch, fFalse, 0, NotRel, cidMouseDown, kidReserveProjects) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidBrowserOk) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidBrowserOk, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, CO__Now_click_Nakita) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidSoundsPlayOnce) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsPlayOnce) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, CO__To_play_the_new_ending) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 11, kidPlay, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 11, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //11 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, CO__To_see_the_movie_from) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 12, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //12 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 13, kidPlay, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 13, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //13 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetHelpAlarm, 90) PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBlinkingGadget, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrAlarmOff, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 14, cidHelpAlarmOff, NotRel) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //14 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, IDLE__Remember_to_get) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchGoto, fTrue, 0, 15, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 16, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Exit //15 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcExitHelp) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 19, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 17, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Deviate //16 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcDeviation) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 18, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 19, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 17, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //17 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //18 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //19 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calulate the states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK // Fifth sequence for project 3 GOBCHUNK("Project3 05 initializer", kid3Project05, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project3 05 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() //1 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, SetNextProject, 3) PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, Congratulations) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 3, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 5, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 4, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, 2, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //2 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitGadgetHelp) //3 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitGadgetHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //4 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(NextClip) //5 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ClearStudio, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrModalClosed|kFltrPortfolioResult, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidQuerySaveDocResult, 1) PROJECT_TABLE(MatchGoto, fFalse, 2, 6, cidQuerySaveDocResult, 0) PROJECT_TABLE(MatchGoto, fFalse, 2, 1, cidQuerySaveDocResult, 2) PROJECT_TABLE(MatchGoto, fFalse, 2, 6, cidPortfolioResult, fTrue) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 1, cidPortfolioResult, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Change movies //6 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ChangeToNextMovie, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ================================================ FILE: src/studio/tbproj4.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /////////////////////////////////////////////////////////////// // Project4 table information /////////////////////////////////////////////////////////////// //WAVE_CHUNK ("studio\sound\xxx.WAV", kwav4Project00) GOBCHUNK("Project4 01 initializer", kid4Project01, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project4 01 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, OpenAllDoors, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc4Project00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidGadgetPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetPlay) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrGadgetAviStop, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 3, cidGadgetAviStop, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc4Project01) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidGadgetWhy) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc4Project09) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 3, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMovieLoaded, NoHelpHere) PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, LoadProjectMovie, stidMovie6) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 6, cidProjectMovieLoaded, fTrue) PROJECT_TABLE(MatchGoto, fFalse, 2, 22, cidProjectMovieLoaded, fFalse) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, OpenDoorCovers, kidActorsCover) PROJECT_TABLE(SpecialInstr, fTrue, Proj6Scene, NotRel, SetSceneAndFrame, Proj6Frame) PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpc4Project03) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 7, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBrowserItem, Prj4Action1) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc4Project0A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidClicked, kidActorsActionBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsActionBrowser) PROJECT_TABLE(MatchGoto, fTrue, 0, 19, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 20, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc4Project0B) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 19, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 20, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidBrowserVisible, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwSelect, ktpc4Project0C) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, 0, 11, cidBrowserSelect, NotRel) PROJECT_TABLE(IgnoreParentMatch, fFalse, 0, NotRel, cidMouseDown, kidReserveProjects) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 20, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //11 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk, ktpc4Project20) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidBrowserOk) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 12, cidBrowserOk, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 20, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //12 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc4Project0F) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidClicked, kidActorsXY) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsXY) PROJECT_TABLE(MatchGoto, fTrue, 0, 19, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 20, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //13 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc4Project11) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 14, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 19, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 20, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //14 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 15, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 19, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 20, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //15 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 16, kidPlay, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 16, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 19, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 20, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //16 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc4Project12) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 17, cidClicked, kidFrameFW) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidFrameFW) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(MatchGoto, fTrue, 0, 19, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 20, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //17 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetHelpAlarm, 90) PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBlinkingGadget, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrAlarmOff, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 18, cidHelpAlarmOff, NotRel) PROJECT_TABLE(MatchGoto, fTrue, 0, 19, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 20, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //18 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc4Project07) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchGoto, fTrue, 0, 19, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 20, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Exit //19 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcExitHelp) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 23, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 21, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Deviate //20 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcDeviation) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 22, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 23, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 21, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //21 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitGadgetHelp) //22 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitGadgetHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //23 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK // Second sequence for project 4 GOBCHUNK("Project4 02 initializer", kid4Project02, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project4 02 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() //1 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc4Project14) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidGadgetWhy) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc4Project15) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 1, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBrowserItem, Prj4Prop1) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc4Project16) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsPropBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsPropBrowser) PROJECT_TABLE(MatchGoto, fTrue, 0, 11, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 12, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidBrowserVisible, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk, ktpc4Project17) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreParentMatch, fFalse, 0, NotRel, cidMouseDown, kidReserveProjects) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidBrowserOk, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 12, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrActorIn|kFltrActorOut, ktpc4Project18) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidActorPlaced, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 3, cidActorPlacedOutOfView, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc4Project19) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidClicked, kidActorsXY) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsXY) PROJECT_TABLE(MatchGoto, fTrue, 0, 11, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 12, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc4Project1A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 11, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 12, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetHelpAlarm, 90) PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBlinkingGadget, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrAlarmOff, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidHelpAlarmOff, NotRel) PROJECT_TABLE(MatchGoto, fTrue, 0, 11, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 12, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc4Project07) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchGoto, fTrue, 0, 11, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 12, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Exit //11 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcExitHelp) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 15, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 13, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Deviate //12 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcDeviation) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 14, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 15, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 13, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //13 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitGadgetHelp) //14 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitGadgetHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //15 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK // Third sequence for project 4 GOBCHUNK("Project4 03 initializer", kid4Project03, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project4 03 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() //1 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc4Project1B) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidGadgetWhy) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc4Project1C) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 1, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBrowserItem, Prj4Action2) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc4Project1D) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsActionBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsActionBrowser) PROJECT_TABLE(MatchGoto, fTrue, 0, 14, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc4Project1E) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 14, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidBrowserVisible, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwSelect, ktpc4Project1F) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, 0, 7, cidBrowserSelect, NotRel) PROJECT_TABLE(IgnoreParentMatch, fFalse, 0, NotRel, cidMouseDown, kidReserveProjects) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk, ktpc4Project20) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidBrowserOk) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidBrowserOk, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc4Project21) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 14, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 14, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 11, kidPlay, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 11, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 14, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //11 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc4Project22) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 12, cidClicked, kidFrameRW) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidFrameRW) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(MatchGoto, fTrue, 0, 14, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //12 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetHelpAlarm, 90) PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBlinkingGadget, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrAlarmOff, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidHelpAlarmOff, NotRel) PROJECT_TABLE(MatchGoto, fTrue, 0, 14, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //13 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc4Project07) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchGoto, fTrue, 0, 14, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Exit //14 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcExitHelp) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 18, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 16, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Deviate //15 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcDeviation) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 17, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 18, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 16, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //16 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitGadgetHelp) //17 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitGadgetHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //18 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK // Fourth sequence for project 4 GOBCHUNK("Project4 04 initializer", kid4Project04, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project4 04 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() //1 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc4Project2C) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidGadgetWhy) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc4Project2D) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 1, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc4Project27) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, 0, 4, cidClicked, kidRollCallActorBorder1) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidRollCallActorBorder1) PROJECT_TABLE(MatchGoto, fTrue, 0, 25, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 26, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorIn|kFltrActorOut|kFltrActorClicked, ktpc4Project29) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidActorPlaced, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 3, cidActorPlacedOutOfView, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidActorClicked, NotRel) PROJECT_TABLE(MatchGoto, fTrue, 0, 25, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 26, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBrowserItem, Prj4Action3) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc4Project2E) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 6, cidClicked, kidActorsActionBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsActionBrowser) PROJECT_TABLE(MatchGoto, fTrue, 0, 25, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 26, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc4Project0B) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 25, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 26, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidBrowserVisible, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwSelect, ktpc4Project30) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, 0, 9, cidBrowserSelect, NotRel) PROJECT_TABLE(IgnoreParentMatch, fFalse, 0, NotRel, cidMouseDown, kidReserveProjects) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 26, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk, ktpc4Project20) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidBrowserOk) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidBrowserOk, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 26, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc4Project31) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidClicked, kidCutCopyPaste) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCutCopyPaste) PROJECT_TABLE(MatchGoto, fTrue, 0, 25, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 26, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //11 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, SimulateClick, kidCutCopyPaste) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc4Project32) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 12, cidClicked, kidCCPCopyRoute) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCCPCopyRoute) PROJECT_TABLE(MatchGoto, fTrue, 0, 25, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 26, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //12 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc4Project1E) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 25, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 26, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //13 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc4Project33) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 14, cidClicked, kidCutCopyPaste) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCutCopyPaste) PROJECT_TABLE(MatchGoto, fTrue, 0, 25, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 26, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //14 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, SimulateClick, kidCutCopyPaste) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc4Project34) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 15, cidClicked, kidCCPPaste) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCCPPaste) PROJECT_TABLE(MatchGoto, fTrue, 0, 25, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 26, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //15 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc4Project3E) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, 0, 16, cidClicked, kidRollCallActorBorder1) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidRollCallActorBorder1) PROJECT_TABLE(MatchGoto, fTrue, 0, 25, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 26, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //16 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc4Project3F) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 17, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 25, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 26, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //17 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc4Project35) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 18, cidClicked, kidActorsXY) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsXY) PROJECT_TABLE(MatchGoto, fTrue, 0, 25, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 26, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //18 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc4Project37) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 19, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 25, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 26, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //19 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 20, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 25, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 26, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //20 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 21, kidPlay, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 21, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 25, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 26, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //21 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc4Project39) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 22, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(MatchGoto, fTrue, 0, 25, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 26, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //22 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 23, kidPlay, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 23, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 25, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 26, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //23 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetHelpAlarm, 90) PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBlinkingGadget, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrAlarmOff, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 24, cidHelpAlarmOff, NotRel) PROJECT_TABLE(MatchGoto, fTrue, 0, 25, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 26, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //24 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc4Project07) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchGoto, fTrue, 0, 25, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 26, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Exit //25 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcExitHelp) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 29, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 27, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Deviate //26 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcDeviation) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 28, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 29, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 27, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //27 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitGadgetHelp) //28 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitGadgetHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //29 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK // Fifth sequence for project 4 GOBCHUNK("Project4 05 initializer", kid4Project05, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project4 05 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() //1 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, SetNextProject, 1) PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpc4Project3C) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 3, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 5, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 4, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, 2, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //2 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitGadgetHelp) //3 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitGadgetHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //4 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(NextClip) //5 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ClearStudio, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrModalClosed|kFltrPortfolioResult, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidQuerySaveDocResult, 1) PROJECT_TABLE(MatchGoto, fFalse, 2, 6, cidQuerySaveDocResult, 0) PROJECT_TABLE(MatchGoto, fFalse, 2, 1, cidQuerySaveDocResult, 2) PROJECT_TABLE(MatchGoto, fFalse, 2, 6, cidPortfolioResult, fTrue) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 1, cidPortfolioResult, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Change movies //6 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ChangeToNextMovie, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ================================================ FILE: src/studio/tbproj5.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /////////////////////////////////////////////////////////////// // Project5 table information /////////////////////////////////////////////////////////////// //WAVE_CHUNK ("studio\sound\xxx.WAV", kwav5Project00) GOBCHUNK("Project5 01 initializer", kid5Project01, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project5 01 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, OpenAllDoors, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project01) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidGadgetPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetPlay) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrGadgetAviStop, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 3, cidGadgetAviStop, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project02) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidGadgetWhy) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project04) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 3, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMovieLoaded, NoHelpHere) PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, LoadProjectMovie, stidMovie5) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 6, cidProjectMovieLoaded, fTrue) PROJECT_TABLE(MatchGoto, fFalse, 2, 34, cidProjectMovieLoaded, fFalse) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, OpenDoorCovers, kidActorsCover) PROJECT_TABLE(SpecialInstr, fTrue, Proj5Scene, NotRel, SetSceneAndFrame, Proj5Frame) PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpc5Project05) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 7, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBrowserItem, Prj5Action1) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project06) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidClicked, kidActorsActionBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsActionBrowser) PROJECT_TABLE(MatchGoto, fTrue, 0, 34, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 35, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc5Project07) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 34, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 35, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidBrowserVisible, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwSelect, ktpc5Project09) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, 0, 11, cidBrowserSelect, NotRel) PROJECT_TABLE(IgnoreParentMatch, fFalse, 0, NotRel, cidMouseDown, kidReserveProjects) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 35, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //11 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk, ktpc5Project0A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidBrowserOk) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 12, cidBrowserOk, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 35, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //12 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc5Project0B) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 34, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 35, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //13 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 14, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 34, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 35, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //14 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 15, kidPlay, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 15, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 34, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 35, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //15 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBrowserItem, Prj5Action2) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project0C) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 16, cidClicked, kidActorsActionBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsActionBrowser) PROJECT_TABLE(MatchGoto, fTrue, 0, 34, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 35, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //16 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc5Project07) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 17, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 34, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 35, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //17 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 18, cidBrowserVisible, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //18 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwSelect, ktpc5Project0D) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, 0, 19, cidBrowserSelect, NotRel) PROJECT_TABLE(IgnoreParentMatch, fFalse, 0, NotRel, cidMouseDown, kidReserveProjects) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 35, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //19 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk, ktpc5Project0A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidBrowserOk) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 20, cidBrowserOk, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 35, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //20 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc5Project0E) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 21, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 34, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 35, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //21 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 22, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 34, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 35, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //22 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 23, kidPlay, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 23, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 34, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 35, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //23 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBrowserItem, Prj5Action3) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project0F) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 24, cidClicked, kidActorsActionBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsActionBrowser) PROJECT_TABLE(MatchGoto, fTrue, 0, 34, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 35, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //24 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc5Project07) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 25, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 34, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 35, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //25 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 26, cidBrowserVisible, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //26 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwSelect, ktpc5Project10) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, 0, 27, cidBrowserSelect, NotRel) PROJECT_TABLE(IgnoreParentMatch, fFalse, 0, NotRel, cidMouseDown, kidReserveProjects) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 35, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //27 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk, ktpc5Project0A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidBrowserOk) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 28, cidBrowserOk, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 35, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //28 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc5Project11) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 29, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 34, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 35, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //29 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 30, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 34, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 35, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //30 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 31, kidPlay, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 31, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 34, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 35, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //31 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project12) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 32, cidClicked, kidFrameRW) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidFrameRW) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(MatchGoto, fTrue, 0, 34, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 35, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //32 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetHelpAlarm, 90) PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBlinkingGadget, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrAlarmOff, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 33, cidHelpAlarmOff, NotRel) PROJECT_TABLE(MatchGoto, fTrue, 0, 34, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 35, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //33 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project13) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchGoto, fTrue, 0, 34, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 35, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Exit //34 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcExitHelp) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 38, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 36, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Deviate //35 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcDeviation) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 37, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 38, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 36, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //36 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitGadgetHelp) //37 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitGadgetHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //38 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK // Second sequence for project 5 GOBCHUNK("Project5 02 initializer", kid5Project02, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project5 02 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() //1 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project14) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidGadgetWhy) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project15) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 1, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project16) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidSettingsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSettingsCover) PROJECT_TABLE(MatchGoto, fTrue, 0, 11, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 12, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBrowserItem, Prj5Camera1) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project17) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidSettingsCameras) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSettingsCameras) PROJECT_TABLE(MatchGoto, fTrue, 0, 11, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 12, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidBrowserVisible, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk, ktpc5Project18) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreParentMatch, fFalse, 0, NotRel, cidMouseDown, kidReserveProjects) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidBrowserOk, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 12, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project19) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(MatchGoto, fTrue, 0, 11, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 12, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 9, kidPlay, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 9, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 11, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 12, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetHelpAlarm, 90) PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBlinkingGadget, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrAlarmOff, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 10, cidHelpAlarmOff, NotRel) PROJECT_TABLE(MatchGoto, fTrue, 0, 11, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 12, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project13) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchGoto, fTrue, 0, 11, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 12, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Exit //11 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcExitHelp) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 15, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 13, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Deviate //12 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcDeviation) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 14, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 15, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 13, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //13 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitGadgetHelp) //14 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitGadgetHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //15 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK // Third sequence for project 5 GOBCHUNK("Project5 03 initializer", kid5Project03, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project5 03 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() //1 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project1A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidGadgetWhy) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project1B) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 1, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project1C) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCover) PROJECT_TABLE(MatchGoto, fTrue, 0, 13, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBrowserItem, Prj5Prop1) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project1D) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidActorsPropBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsPropBrowser) PROJECT_TABLE(MatchGoto, fTrue, 0, 13, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidBrowserVisible, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk, ktpc5Project1E) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreParentMatch, fFalse, 0, NotRel, cidMouseDown, kidReserveProjects) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidBrowserOk, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrActorIn|kFltrActorOut, ktpc5Project1F) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidActorPlaced, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 4, cidActorPlacedOutOfView, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project20) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidClicked, kidActorsTransform) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsTransform) PROJECT_TABLE(MatchGoto, fTrue, 0, 13, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, SimulateClick, kidActorsTransform) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project21) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidClicked, kidActorsShrink) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsShrink) PROJECT_TABLE(MatchGoto, fTrue, 0, 13, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc5Project22) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 13, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //11 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetHelpAlarm, 90) PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBlinkingGadget, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrAlarmOff, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 12, cidHelpAlarmOff, NotRel) PROJECT_TABLE(MatchGoto, fTrue, 0, 13, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //12 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project13) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchGoto, fTrue, 0, 13, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Exit //13 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcExitHelp) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 17, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 15, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Deviate //14 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcDeviation) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 16, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 17, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 15, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //15 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitGadgetHelp) //16 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitGadgetHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //17 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK // Fourth sequence for project 5 GOBCHUNK("Project5 04 initializer", kid5Project04, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project5 04 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() //1 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project24) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidGadgetWhy) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project25) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 1, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBrowserItem, Prj5Action4) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project26) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsActionBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsActionBrowser) PROJECT_TABLE(MatchGoto, fTrue, 0, 14, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc5Project27) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 14, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidBrowserVisible, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwSelect, ktpc5Project28) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, 0, 7, cidBrowserSelect, NotRel) PROJECT_TABLE(IgnoreParentMatch, fFalse, 0, NotRel, cidMouseDown, kidReserveProjects) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk, ktpc5Project0A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidBrowserOk) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidBrowserOk, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc5Project29) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 14, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 14, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 11, kidPlay, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 11, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 14, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //11 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project2A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 12, cidClicked, kidFrameRW) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidFrameRW) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(MatchGoto, fTrue, 0, 14, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //12 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetHelpAlarm, 90) PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBlinkingGadget, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrAlarmOff, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidHelpAlarmOff, NotRel) PROJECT_TABLE(MatchGoto, fTrue, 0, 14, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //13 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project13) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchGoto, fTrue, 0, 14, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Exit //14 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcExitHelp) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 18, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 16, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Deviate //15 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcDeviation) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 17, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 18, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 16, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //16 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitGadgetHelp) //17 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitGadgetHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //18 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK // Fifth sequence for project 5 GOBCHUNK("Project5 05 initializer", kid5Project05, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project5 05 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() //1 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project2B) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidGadgetWhy) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project2C) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 1, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project2D) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidSoundsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsCover) PROJECT_TABLE(MatchGoto, fTrue, 0, 17, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 18, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBrowserItem, Prj5SoundsEfx1) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project2E) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidSoundsEfxBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsEfxBrowser) PROJECT_TABLE(MatchGoto, fTrue, 0, 17, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 18, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidBrowserVisible, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwSelect, ktpc5Project2F) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, 0, 7, cidBrowserSelect, NotRel) PROJECT_TABLE(IgnoreParentMatch, fFalse, 0, NotRel, cidMouseDown, kidReserveProjects) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 18, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidBrowserOk) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidBrowserOk, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 18, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc5Project27) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidSoundsPlayOnce) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsPlayOnce) PROJECT_TABLE(MatchGoto, fTrue, 0, 17, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 18, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project30) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(MatchGoto, fTrue, 0, 17, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 18, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 11, kidPlay, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 11, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 17, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 18, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //11 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project31) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 12, cidClicked, kidCutCopyPaste) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCutCopyPaste) PROJECT_TABLE(MatchGoto, fTrue, 0, 17, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 18, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //12 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, SimulateClick, kidCutCopyPaste) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project32) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 13, cidClicked, kidCCPCut) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCCPCut) PROJECT_TABLE(MatchGoto, fTrue, 0, 17, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 18, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //13 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc5Project27) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 14, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 17, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 18, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //14 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc5Project33) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 15, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 17, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 18, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //15 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetHelpAlarm, 90) PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBlinkingGadget, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrAlarmOff, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 16, cidHelpAlarmOff, NotRel) PROJECT_TABLE(MatchGoto, fTrue, 0, 17, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 18, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //16 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project13) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchGoto, fTrue, 0, 17, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 18, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Exit //17 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcExitHelp) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 21, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 19, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Deviate //18 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcDeviation) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 20, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 21, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 19, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //19 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitGadgetHelp) //20 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitGadgetHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //21 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK // Sixth sequence for project 5 GOBCHUNK("Project5 06 initializer", kid5Project06, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project5 06 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() //1 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project34) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidGadgetWhy) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project35) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 1, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project36) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsCover) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsCover) PROJECT_TABLE(MatchGoto, fTrue, 0, 13, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBrowserItem, Prj5Actor1) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project00) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidActorsBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsBrowser) PROJECT_TABLE(MatchGoto, fTrue, 0, 13, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidBrowserVisible, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk, ktpc5Project37) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreParentMatch, fFalse, 0, NotRel, cidMouseDown, kidReserveProjects) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidBrowserOk, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrActorIn|kFltrActorOut, ktpc5Project38) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidActorPlaced, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 4, cidActorPlacedOutOfView, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project39) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidClicked, kidActorsTransform) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsTransform) PROJECT_TABLE(MatchGoto, fTrue, 0, 13, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, SimulateClick, kidActorsTransform) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project3C) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidClicked, kidActorsShrink) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsShrink) PROJECT_TABLE(MatchGoto, fTrue, 0, 13, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc5Project3D) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 13, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //11 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetHelpAlarm, 90) PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBlinkingGadget, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrAlarmOff, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 12, cidHelpAlarmOff, NotRel) PROJECT_TABLE(MatchGoto, fTrue, 0, 13, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //12 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project13) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchGoto, fTrue, 0, 13, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Exit //13 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcExitHelp) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 17, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 15, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Deviate //14 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcDeviation) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 16, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 17, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 15, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //15 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitGadgetHelp) //16 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitGadgetHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //17 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK // Seventh sequence for project 5 GOBCHUNK("Project5 07 initializer", kid5Project07, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project5 07 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() //1 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project3E) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidGadgetWhy) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project3F) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 1, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBrowserItem, Prj5Action5) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project40) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsActionBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsActionBrowser) PROJECT_TABLE(MatchGoto, fTrue, 0, 13, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc5Project51) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 13, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidBrowserVisible, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwSelect, ktpc5Project41) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, 0, 7, cidBrowserSelect, NotRel) PROJECT_TABLE(IgnoreParentMatch, fFalse, 0, NotRel, cidMouseDown, kidReserveProjects) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk, ktpc5Project0A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidBrowserOk) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidBrowserOk, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc5Project42) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 13, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 13, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 11, kidPlay, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 11, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 13, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //11 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetHelpAlarm, 90) PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBlinkingGadget, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrAlarmOff, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 12, cidHelpAlarmOff, NotRel) PROJECT_TABLE(MatchGoto, fTrue, 0, 13, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //12 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project13) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchGoto, fTrue, 0, 13, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 14, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Exit //13 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcExitHelp) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 17, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 15, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Deviate //14 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcDeviation) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 16, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 17, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 15, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //15 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitGadgetHelp) //16 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitGadgetHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //17 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK // Eigth sequence for project 5 GOBCHUNK("Project5 08 initializer", kid5Project08, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project5 08 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() //1 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project43) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidGadgetWhy) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project44) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 1, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBrowserItem, Prj5Action6) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project45) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsActionBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsActionBrowser) PROJECT_TABLE(MatchGoto, fTrue, 0, 14, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc5Project51) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 14, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidBrowserVisible, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwSelect, ktpc5Project46) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, 0, 7, cidBrowserSelect, NotRel) PROJECT_TABLE(IgnoreParentMatch, fFalse, 0, NotRel, cidMouseDown, kidReserveProjects) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk, ktpc5Project0A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidBrowserOk) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidBrowserOk, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc5Project47) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 14, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 14, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 11, kidPlay, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 11, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 14, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //11 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project48) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 12, cidClicked, kidFrameRW) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidFrameRW) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(MatchGoto, fTrue, 0, 14, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //12 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetHelpAlarm, 90) PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBlinkingGadget, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrAlarmOff, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 13, cidHelpAlarmOff, NotRel) PROJECT_TABLE(MatchGoto, fTrue, 0, 14, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //13 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project13) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchGoto, fTrue, 0, 14, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 15, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Exit //14 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcExitHelp) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 18, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 16, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Deviate //15 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcDeviation) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 17, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 18, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 16, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //16 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitGadgetHelp) //17 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitGadgetHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //18 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK // Ninth sequence for project 5 GOBCHUNK("Project5 09 initializer", kid5Project09, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project5 09 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() //1 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project49) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidGadgetWhy) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project4A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 1, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project4B) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidActorsTransform) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsTransform) PROJECT_TABLE(MatchGoto, fTrue, 0, 12, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project4C) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidActorsShrink) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidActorsShrink) PROJECT_TABLE(MatchGoto, fTrue, 0, 12, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc5Project4D) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 12, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 7, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 12, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 8, kidPlay, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 8, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 12, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project4F) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(MatchGoto, fTrue, 0, 12, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 10, kidPlay, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 10, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 12, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetHelpAlarm, 90) PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBlinkingGadget, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrAlarmOff, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidHelpAlarmOff, NotRel) PROJECT_TABLE(MatchGoto, fTrue, 0, 12, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //11 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc5Project13) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchGoto, fTrue, 0, 12, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Exit //12 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcExitHelp) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 16, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 14, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Deviate //13 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcDeviation) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 15, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 16, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 14, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //14 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitHelp) //15 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //16 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK // Tenth sequence for project 5 GOBCHUNK("Project5 10 initializer", kid5Project10, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project5 10 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() //1 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, SetNextProject, 6) PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpc5Project50) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 3, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 5, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 4, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, 2, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //2 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitGadgetHelp) //3 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitGadgetHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //4 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(NextClip) //5 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ClearStudio, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrModalClosed|kFltrPortfolioResult, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidQuerySaveDocResult, 1) PROJECT_TABLE(MatchGoto, fFalse, 2, 6, cidQuerySaveDocResult, 0) PROJECT_TABLE(MatchGoto, fFalse, 2, 1, cidQuerySaveDocResult, 2) PROJECT_TABLE(MatchGoto, fFalse, 2, 6, cidPortfolioResult, fTrue) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 1, cidPortfolioResult, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Change movies //6 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ChangeToNextMovie, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ================================================ FILE: src/studio/tbproj6.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /////////////////////////////////////////////////////////////// // Project6 table information /////////////////////////////////////////////////////////////// //WAVE_CHUNK ("studio\sound\xxx.WAV", kwav1Project00) GOBCHUNK("Project6 01 initializer", kid6Project01, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project6 01 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() // inst return ID0 next st ID1 ID2 // ---- ------ --- ---- -- --- --- //1 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, OpenAllDoors, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project01) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidGadgetPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetPlay) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrGadgetAviStop, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 3, cidGadgetAviStop, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project02) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidGadgetWhy) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project04) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 3, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMovieLoaded, NoHelpHere) PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, LoadProjectMovie, stidMovie4) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 6, cidProjectMovieLoaded, fTrue) PROJECT_TABLE(MatchGoto, fFalse, 2, 38, cidProjectMovieLoaded, fFalse) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, OpenDoorCovers, kidSoundsCover) PROJECT_TABLE(SpecialInstr, fTrue, Proj4Scene, NotRel, SetSceneAndFrame, Proj4Frame) PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpc6Project05) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 7, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project06) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(MatchGoto, fTrue, 0, 35, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 36, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 9, kidPlay, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 9, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 35, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 36, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project07) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidClicked, kidFrameRWEnd) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidFrameRWEnd) PROJECT_TABLE(MatchGoto, fTrue, 0, 35, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 36, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBrowserItem, Prj6SoundsMus1) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project08) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 11, cidClicked, kidSoundsMusicBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsMusicBrowser) PROJECT_TABLE(MatchGoto, fTrue, 0, 35, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 36, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //11 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 12, cidBrowserVisible, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //12 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwSelect, ktpc6Project09) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, 0, 13, cidBrowserSelect, NotRel) PROJECT_TABLE(IgnoreParentMatch, fFalse, 0, NotRel, cidMouseDown, kidReserveProjects) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 36, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //13 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidBrowserOk) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 14, cidBrowserOk, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 36, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //14 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project0B) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, NotRel, 15, cidMouseDown, kidWorkspace) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidSoundsPlayOnce) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsPlayOnce) PROJECT_TABLE(MatchGoto, fTrue, 0, 35, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 36, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //15 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBrowserItem, Prj6SoundsMus2) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project0D) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 16, cidClicked, kidSoundsMusicBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsMusicBrowser) PROJECT_TABLE(MatchGoto, fTrue, 0, 35, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 36, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //16 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 17, cidBrowserVisible, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //17 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwSelect, ktpc6Project0E) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, 0, 18, cidBrowserSelect, NotRel) PROJECT_TABLE(IgnoreParentMatch, fFalse, 0, NotRel, cidMouseDown, kidReserveProjects) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 36, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //18 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidBrowserOk) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 19, cidBrowserOk, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 36, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //19 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project0F) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, NotRel, 20, cidMouseDown, kidWorkspace) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidSoundsPlayOnce) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsPlayOnce) PROJECT_TABLE(MatchGoto, fTrue, 0, 35, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 36, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //20 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBrowserItem, Prj6SoundsMus3) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project0D) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 21, cidClicked, kidSoundsMusicBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsMusicBrowser) PROJECT_TABLE(MatchGoto, fTrue, 0, 35, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 36, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //21 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 22, cidBrowserVisible, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //22 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwSelect, ktpc6Project10) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, 0, 23, cidBrowserSelect, NotRel) PROJECT_TABLE(IgnoreParentMatch, fFalse, 0, NotRel, cidMouseDown, kidReserveProjects) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 36, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //23 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidBrowserOk) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 24, cidBrowserOk, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 36, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //24 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project0F) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, NotRel, 25, cidMouseDown, kidWorkspace) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidSoundsPlayOnce) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsPlayOnce) PROJECT_TABLE(MatchGoto, fTrue, 0, 35, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 36, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //25 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBrowserItem, Prj6SoundsMus4) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project11) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 26, cidClicked, kidSoundsMusicBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsMusicBrowser) PROJECT_TABLE(MatchGoto, fTrue, 0, 24, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 36, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //26 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 27, cidBrowserVisible, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //27 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwSelect, ktpc6Project12) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, 0, 28, cidBrowserSelect, NotRel) PROJECT_TABLE(IgnoreParentMatch, fFalse, 0, NotRel, cidMouseDown, kidReserveProjects) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 36, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //28 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidBrowserOk) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 29, cidBrowserOk, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 36, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //29 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project0F) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchDescGoto, fFalse, NotRel, 30, cidMouseDown, kidWorkspace) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidSoundsPlayOnce) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsPlayOnce) PROJECT_TABLE(MatchGoto, fTrue, 0, 35, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 36, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //30 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project13) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 31, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(MatchGoto, fTrue, 0, 35, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 36, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //31 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 32, kidPlay, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 32, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 35, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 36, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //32 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project14) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 33, cidClicked, kidFrameRW) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidFrameRW) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(MatchGoto, fTrue, 0, 35, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 36, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //33 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetHelpAlarm, 90) PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBlinkingGadget, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrAlarmOff, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 34, cidHelpAlarmOff, NotRel) PROJECT_TABLE(MatchGoto, fTrue, 0, 35, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 36, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //34 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project15) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchGoto, fTrue, 0, 35, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 36, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Exit //35 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcExitHelp) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 39, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 37, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Deviate //36 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcDeviation) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 38, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 39, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 37, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //37 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitGadgetHelp) //38 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitGadgetHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //39 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK // Second sequence for project 6 GOBCHUNK("Project6 02 initializer", kid6Project02, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project6 02 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() //1 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project16) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidGadgetWhy) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project17) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 1, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBrowserItem, Prj6SoundsEfx1) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project18) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidSoundsEfxBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsEfxBrowser) PROJECT_TABLE(MatchGoto, fTrue, 0, 12, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidBrowserVisible, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwSelect, ktpc6Project19) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, 0, 6, cidBrowserSelect, NotRel) PROJECT_TABLE(IgnoreParentMatch, fFalse, 0, NotRel, cidMouseDown, kidReserveProjects) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidBrowserOk) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidBrowserOk, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project1A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 8, cidClicked, kidSoundsAttachToCell) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsAttachToCell) PROJECT_TABLE(MatchGoto, fTrue, 0, 12, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc6Project1B) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 9, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 12, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project1C) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 10, cidClicked, kidFrameFW) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidFrameFW) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(MatchGoto, fTrue, 0, 12, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetHelpAlarm, 90) PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBlinkingGadget, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrAlarmOff, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidHelpAlarmOff, NotRel) PROJECT_TABLE(MatchGoto, fTrue, 0, 12, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //11 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project15) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchGoto, fTrue, 0, 12, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Exit //12 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcExitHelp) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 16, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 14, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Deviate //13 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcDeviation) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 15, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 16, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 14, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //14 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitGadgetHelp) //15 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitGadgetHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //16 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK // Third sequence for project 6 GOBCHUNK("Project6 03 initializer", kid6Project03, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project6 03 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() //1 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project1D) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidGadgetWhy) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project1E) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 1, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBrowserItem, Prj6SoundsEfx2) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project18) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidSoundsEfxBrowser) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsEfxBrowser) PROJECT_TABLE(MatchGoto, fTrue, 0, 12, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidBrowserVisible, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwSelect, ktpc6Project1F) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, 0, 6, cidBrowserSelect, NotRel) PROJECT_TABLE(IgnoreParentMatch, fFalse, 0, NotRel, cidMouseDown, kidReserveProjects) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrBrwOk, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidBrowserOk) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidBrowserOk, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc6Project1B) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 12, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project20) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(MatchGoto, fTrue, 0, 12, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 10, kidPlay, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 10, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 12, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetHelpAlarm, 90) PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBlinkingGadget, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrAlarmOff, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidHelpAlarmOff, NotRel) PROJECT_TABLE(MatchGoto, fTrue, 0, 12, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //11 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project15) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchGoto, fTrue, 0, 12, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Exit //12 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcExitHelp) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 16, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 14, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Deviate //13 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcDeviation) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 15, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 16, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 14, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //14 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitGadgetHelp) //15 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitGadgetHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //16 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK // Fourth sequence for project 6 GOBCHUNK("Project6 04 initializer", kid6Project04, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project6 04 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() //1 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project21) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidGadgetWhy) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project22) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 1, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project24) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidPausesSound) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPausesSound) PROJECT_TABLE(MatchGoto, fTrue, 0, 6, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetHelpAlarm, 90) PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBlinkingGadget, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrAlarmOff, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 5, cidHelpAlarmOff, NotRel) PROJECT_TABLE(MatchGoto, fTrue, 0, 6, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project15) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchGoto, fTrue, 0, 6, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 7, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Exit //6 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcExitHelp) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 10, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 8, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Deviate //7 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcDeviation) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 9, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 10, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 8, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //8 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitGadgetHelp) //9 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitGadgetHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //10 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK // Fifth sequence for project 6 GOBCHUNK("Project6 05 initializer", kid6Project05, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project6 05 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() //1 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project26) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 3, cidClicked, kidGadgetHow) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetHow) PROJECT_TABLE(MatchGoto, fFalse, 0, 2, cidClicked, kidGadgetWhy) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidClicked, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //2 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project27) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadgetWhy) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 1, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //3 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project28) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 4, cidClicked, kidCutCopyPaste) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCutCopyPaste) PROJECT_TABLE(MatchGoto, fTrue, 0, 12, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //4 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, SimulateClick, kidCutCopyPaste) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project29) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 5, cidClicked, kidCCPActorNuke) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidCCPActorNuke) PROJECT_TABLE(MatchGoto, fTrue, 0, 12, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //5 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrActorClicked, ktpc6Project2A) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 6, cidActorClicked, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, NotRel, NotRel, cidMouseDown, kidWorkspace) PROJECT_TABLE(MatchGoto, fTrue, 0, 12, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //6 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrEslVisible, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 7, cidEaselVisible, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //7 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrEslOk|kFltrEslCancel, ktpc6Project2B) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 8, cidEaselOk, NotRel) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 13, cidEaselCancel, NotRel) PROJECT_TABLE(IgnoreAll, fFalse, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //8 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project2C) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 0, 9, cidClicked, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidPlay) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidSoundsPlayOnce) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidSoundsPlayOnce) PROJECT_TABLE(MatchGoto, fTrue, 0, 12, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //9 PROJECT_TABLE(StateCondGoto, NotRel, NotRel, 10, kidPlay, kstDefault) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrMoviePlaying, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchGoto, fFalse, 2, 10, cidMviePlaying, fFalse) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidMviePlaying, fTrue) PROJECT_TABLE(MatchGoto, fTrue, 0, 12, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //10 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetHelpAlarm, 90) PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, SetBlinkingGadget, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth|kFltrAlarmOff, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 11, cidHelpAlarmOff, NotRel) PROJECT_TABLE(MatchGoto, fTrue, 0, 12, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) //11 PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouseBoth, ktpc6Project15) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kidFrameBackground) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidClicked, kidGadget) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidGadget) PROJECT_TABLE(MatchGoto, fTrue, 0, 12, cidClicked, kidExit) PROJECT_TABLE(IgnoreMatch, fFalse, 0, NotRel, cidMouseDown, kidExit) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(MatchAllGoto, fTrue, NotRel, 13, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Exit //12 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcExitHelp) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 16, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 14, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Deviate //13 PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpcDeviation) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 15, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 16, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 14, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, PrevState, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //14 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitGadgetHelp) //15 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitGadgetHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //16 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK // Sixth sequence for project 6 GOBCHUNK("Project6 06 initializer", kid6Project06, kgokkNormal) DEFAULT_POSITION( 0, 0, 0) ENDCHUNK CREATE_ANIM("Project6 06 setup") // Init the table, then fill it up the project INITIALIZE_TABLE() //1 PROJECT_TABLE(SpecialInstr, fTrue, NotRel, NotRel, SetNextProject, 5) PROJECT_TABLE(InitState, NotRel, ParState3, NotRel, kFltrMouseBoth, ktpc6Project2D) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(MatchChildrenGoto, fFalse, 1, 3, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 2, 5, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 3, 4, cidClicked, kgobProject) PROJECT_TABLE(MatchChildrenGoto, fFalse, 4, 2, cidClicked, kgobProject) PROJECT_TABLE(IgnoreChildren, fFalse, 0, NotRel, cidMouseDown, kgobProject) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitMM) //2 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitMM, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(QuitGadgetHelp) //3 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, QuitGadgetHelp, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(Projects Room) //4 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ProjectsRoom, NotRel) PROJECT_TABLE(JumpToState, NotRel, fTrue, PrevState, NotRel, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Special(NextClip) //5 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ClearStudio, NotRel) PROJECT_TABLE(InitState, NotRel, ParState2, NotRel, kFltrMouse|kFltrModalClosed|kFltrPortfolioResult, NoHelpHere) PROJECT_TABLE(WaitEvent, NotRel, NotRel, NotRel, NotRel, NotRel) PROJECT_TABLE(IgnoreMatch, fFalse, 2, NotRel, cidQuerySaveDocResult, 1) PROJECT_TABLE(MatchGoto, fFalse, 2, 6, cidQuerySaveDocResult, 0) PROJECT_TABLE(MatchGoto, fFalse, 2, 1, cidQuerySaveDocResult, 2) PROJECT_TABLE(MatchGoto, fFalse, 2, 6, cidPortfolioResult, fTrue) PROJECT_TABLE(MatchAllGoto, fFalse, NotRel, 1, cidPortfolioResult, NotRel) PROJECT_TABLE(IgnoreAll, fTrue, NotRel, NotRel, cidMouseDown, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // Change movies //6 PROJECT_TABLE(SpecialInstr, NotRel, fTrue, NotRel, ChangeToNextMovie, NotRel) PROJECT_TABLE(EndState, NotRel, NotRel, NotRel, NotRel, NotRel) // *End of the table* PROJECT_TABLE(EndTable,0,0,0,0,0) // End of File // Calculate states, build our NextState jump table, then run this thingy RunScriptGob(kidSequenceParent, kchidScript5); RunScriptGob(kidSequenceParent, kchidScript2); RunScriptGob(kidSequenceParent, kchidScript1); DestroyThis(); ENDCHUNK ================================================ FILE: src/studio/tgob.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** tgob.cpp Author: Sean Selitrennikoff Date: June, 1995 This file contains all functionality for a whole lite text-gob. ***************************************************************************/ #include "studio.h" ASSERTNAME RTCLASS(TGOB) /**************************************************** * * Constructor for text gobs. * ****************************************************/ TGOB::TGOB(GCB *pgcb) : GOB(pgcb) { _acrFore = kacrBlack; _acrBack = kacrClear; _tav = tavTop; _tah = tahCenter; _onn = vapp.OnnDefVariable(); _dypFont = vapp.DypTextDef(); } /**************************************************** * * Constructor for text gobs. * ****************************************************/ TGOB::TGOB(long hid) : GOB(hid) { _acrFore = kacrBlack; _acrBack = kacrClear; } /*************************************************************************** * * Draw this text. * * Parameters: * pgnv - The environment to write to. * prcClip - The clipping rectangle. * * Returns: * None. * ***************************************************************************/ void TGOB::Draw(PGNV pgnv, RC *prcClip) { AssertThis(0); AssertPo(pgnv, 0); AssertVarMem(prcClip); RC rc, rcText; long xp, yp; STN stnDraw(_stn); // Use a temporary stn here for the displayed text. For example, the tgob // text may be 'hello', but the dispayed text may be 'hel..'. This means // any dots will be added to the displayed string if required every time // we pass through here. If we don't do this then the following would // happen. On the first pass through here can find that we need to add // the dots and left justify the text, (Eg 'hello' becomes 'hel..'). On // the next pass however, we would find that 'hel..' does indeed fit in the // tgob ok and we would centre justify it. The user would see the text shift. GetRc(&rc, cooLocal); /* REVIEW peted: what happens for right-justify? Why do we have to do this at all? Why doesn't Kauai just take an RC, and then left-, right-, or center-align as appropriate, depending on the "SetFontAlign" setting? */ xp = (_tah != tahCenter) ? 0 : rc.Dxp() / 2; yp = (_tav != tavCenter) ? 0 : rc.Dyp() / 2; pgnv->SetOnn(_onn); pgnv->SetFontSize(_dypFont); // Center justify the text if it fits in the gob. Otherwise left justify it. pgnv->GetRcFromStn(&rcText, &stnDraw, 0, 0); if (rcText.Dxp() < rc.Dxp()) { pgnv->SetFontAlign(_tah, _tav); pgnv->DrawStn(&stnDraw, xp, yp, _acrFore, _acrBack); } else { STN stnDots; RC rcDots; int iCh; stnDots.SetSz(PszLit("..")); pgnv->GetRcFromStn(&rcDots, &stnDots, 0, 0); for (iCh = stnDraw.Cch() - 1; iCh >= 0; --iCh) { stnDraw.Delete(iCh); stnDraw.FAppendStn(&stnDots); pgnv->GetRcFromStn(&rcText, &stnDraw, 0, 0); if (rcText.Dxp() < rc.Dxp()) { pgnv->SetFontAlign(tahLeft, _tav); pgnv->DrawStn(&stnDraw, 0, yp, _acrFore, _acrBack); break; } } } } /**************************************************** * * Create Tgob's for any of the text based browsers * using the font specified by idsFont * Static routine * Parameters * kidFrm = kid of text frame * idsFont = string registry id * tav = text align vertical * ****************************************************/ PTGOB TGOB::PtgobCreate(long kidFrm, long idsFont, long tav, long hid) { RC rcRel; RC rcAbs; PGOB pgob; STN stn; GCB gcb; long onn; PTGOB ptgob; rcRel.xpLeft = rcRel.ypTop = krelZero; rcRel.xpRight = rcRel.ypBottom = krelOne; rcAbs.Set(0, 0, 0, 0); pgob = ((APP *)vpappb)->Pkwa()->PgobFromHid(kidFrm); if (pgob == pvNil) return pvNil; if (hidNil == hid) hid = GOB::HidUnique(); gcb.Set(hid, pgob, fgobNil, kginDefault, &rcAbs, &rcRel); if (pvNil == (ptgob = NewObj TGOB(&gcb))) return pvNil; if (idsFont != idsNil) { PSTDIO pstdio; pstdio = (PSTDIO)vapp.Pkwa()->PgobFromCls(kclsSTDIO); Assert(pstdio != pvNil, "Creating a TGOB with no STDIO present"); pstdio->GetStnMisc(idsFont, &stn); vapp.FGetOnn(&stn, &onn); // Ignore failure if (onn != onnNil) ptgob->SetFont(onn); } else Assert(ptgob->_onn == vapp.OnnDefVariable(), "Someone else set the _onn?"); ptgob->_tav = tav; return ptgob; } /****************************************************************************** SetAlign set the text alignment for this TGOB Arguments: long tah -- the horizontal alignment long tav -- the vertical alignment ************************************************************ PETED ***********/ void TGOB::SetAlign(long tah, long tav) { if (tah != tahLim) _tah = tah; if (tav != tavLim) _tav = tav; } /****************************************************************************** GetAlign Gets the text alignment for this TGOB Arguments: long *ptah -- pointer to take the horizontal alignment long *ptav -- pointer to take the vertical alignment ************************************************************ PETED ***********/ void TGOB::GetAlign(long *ptah, long *ptav) { if (ptah != pvNil) *ptah = _tah; if (ptav != pvNil) *ptav = _tav; } #ifdef DEBUG /***************************************************************************** * * Mark memory used by the TGOB * * Parameters: * None. * * Returns: * Nothing. * *****************************************************************************/ void TGOB::MarkMem(void) { AssertThis(0); TGOB_PAR::MarkMem(); } /*****************************************************************************\ * * Assert the validity of the TGOB * * Parameters: * grf - bit array of options. * * Returns: * Nothing. * \*****************************************************************************/ void TGOB::AssertValid(ulong grf) { TGOB_PAR::AssertValid(fobjAllocated); } #endif // DEBUG ================================================ FILE: src/studio/tooltips.h ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ #define gobBalloonToolTip 0x00016006 #define wavVO200a 0 #define wavVO201a 1 #define wavVO202a 2 #define wavVO204b 3 #define wavVO205a 4 #define wavVO206a 5 #define wavVO203a 6 #define wavVO207a 7 #define wavVO208a 8 #define wavVO216a 9 #define wavVO217b 10 #define wavVO218a 11 #define wavVO208a 12 #define wavVO220a 13 #define wavVO221b 14 #define wavVO223a 15 #define wavVO224a 16 #define wavVO220a 17 #define wavVO225b 18 #define wavVO226a 19 #define wavVO227a 20 #define wavVO228a 21 #define wavVO229a 22 #define wavVO232a 23 #define wavVO234a 24 #define wavVO236a 25 #define wavVO237a 26 #define wavVO238a 27 #define wavVO239b 28 #define wavVO240a 29 #define wavVO241a 30 #define wavVO242a 31 #define wavVO243a 32 #define wavVO244b 33 #define wavVO246a 34 #define wavVO274b 35 #define wavVO248a 36 #define wavVO249a 37 #define wavVO250a 38 #define wavVO251a 39 #define wavVO252a 40 #define wavVO253a 41 #define wavVO255a 42 #define wavVO256a 43 #define wavVO257a 44 #define wavVO260a 45 #define wavVO260a 46 #define wavVO261a 47 #define wavVO262a 48 #define wavVO264a 49 #define wavVO265a 50 #define wavVO266b 51 #define wavVO267a 52 #define wavVO268a 53 #define wavVO269b 54 #define wavVO272a 55 #define wavVO273a 56 #define wavVO274a 57 #define wavVO275a 58 #define wavVO276a 59 #define wavVO280C 60 #define wavVO281a 61 ================================================ FILE: src/studio/utest.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // This is the source file for 3dmovie.chk (was utest.chk) #include "framedef.h" #include "socdef.h" #include "kidgs.chh" // Localized strings #include "studio\utestgst.cht" // // Initial Palette // PALETTECHUNK ("Initial Palette", kcnoGlcrInit, "studio\bmp\homelogo.bmp") // // Home Logo // CHUNK (kctgMbmp kcnoMbmpHomeLogo "Home Logo") PACK BITMAP (0 0 0) "studio\bmp\homelogo.bmp" ENDCHUNK // // Splash Screen // CHUNK (kctgMbmp kcnoMbmpSplash "Splash Screen") PACK BITMAP (0 0 0) "studio\bmp\splash.bmp" ENDCHUNK // // Splash Sound // CHUNK (kctgMidi kcnoMidiSplash "Splash Sound") MIDI "studio\bmp\splash.mid" ENDCHUNK // // Studio filenames // CHUNK (kctgGst kcnoGstStudioFiles "Studio Filenames") LONG GST(4) ITEM "studio" 1048576 // 1MB cache ENDCHUNK // // Building filenames // CHUNK (kctgGst kcnoGstBuildingFiles "Building Filenames") LONG GST(4) ITEM "building" 1572864 // 1.5MB cache ITEM "bldghd" 1048576 // 1 MB cache ENDCHUNK // // Shared filenames // CHUNK (kctgGst kcnoGstSharedFiles "Shared Filenames") LONG GST(4) ITEM "shared" 524288 // 512K cache ITEM "sharecd" 98304 // 96K cache ITEM "help" 524288 // 512K cache ITEM "helpaud" 0 ENDCHUNK // // Shade table...256x16 shade table generated by Nvarma 9/16/95 // CHUNK('TMAP', 0, "") PACK BYTE 0x01 0x00 0x03 0x03 0x00 0x01 0x03 0x02 // '????????' 0x00 0x00 0x00 0x00 0x00 0x01 0x10 0x00 // '????????' 0x00 0x00 0x00 0x00 0x00 0x01 0x02 0x03 // '????????' 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B // '????????' 0x0C 0x0D 0x0E 0x0F 0x10 0x11 0x12 0x13 // '????????' 0x14 0x15 0x16 0x17 0x18 0x19 0x1A 0x1B // '????????' 0x1C 0x1D 0x1E 0x1F 0x20 0x21 0x22 0x23 // '???? !"#' 0x24 0x25 0x26 0x27 0x28 0x29 0x2A 0x2B // '$%&'()*+' 0x2C 0x2D 0x2E 0x2F 0x30 0x31 0x32 0x33 // ',-./0123' 0x34 0x35 0x36 0x37 0x38 0x39 0x3A 0x3B // '456789:;' 0x3C 0x3D 0x3E 0x3F 0x40 0x41 0x42 0x43 // '<=>?@ABC' 0x44 0x45 0x46 0x47 0x48 0x49 0x4A 0x4B // 'DEFGHIJK' 0x4C 0x4D 0x4E 0x4F 0x50 0x51 0x52 0x53 // 'LMNOPQRS' 0x54 0x55 0x56 0x57 0x58 0x59 0x5A 0x5B // 'TUVWXYZ[' 0x5C 0x5D 0x5E 0x5F 0x60 0x61 0x62 0x63 // '\]^_`abc' 0x64 0x65 0x66 0x67 0x68 0x69 0x6A 0x6B // 'defghijk' 0x6C 0x6D 0x6E 0x6F 0x70 0x71 0x72 0x73 // 'lmnopqrs' 0x74 0x75 0x76 0x77 0x78 0x79 0x7A 0x7B // 'tuvwxyz{' 0x7C 0x7D 0x7E 0x7F 0x80 0x81 0x82 0x83 // '|}~?����' 0x84 0x85 0x86 0x87 0x88 0x89 0x8A 0x8B // '��������' 0x8C 0x8D 0x8E 0x8F 0x90 0x91 0x92 0x93 // '��������' 0x94 0x95 0x96 0x97 0x98 0x99 0x9A 0x9B // '��������' 0x9C 0x9D 0x9E 0x9F 0xA0 0xA1 0xA2 0xA3 // '��������' 0xA4 0xA5 0xA6 0xA7 0xA8 0xA9 0xAA 0xAB // '��������' 0xAC 0xAD 0xAE 0xAF 0xB0 0xB1 0xB2 0xB3 // '��������' 0xB4 0xB5 0xB6 0xB7 0xB8 0xB9 0xBA 0xBB // '��������' 0xBC 0xBD 0xBE 0xBF 0xC0 0xC1 0xC2 0xC3 // '��������' 0xC4 0xC5 0xC6 0xC7 0xC8 0xC9 0xCA 0xCB // '��������' 0xCC 0xCD 0xCE 0xCF 0xD0 0xD1 0xD2 0xD3 // '��������' 0xD4 0xD5 0xD6 0xD7 0xD8 0xD9 0xDA 0xDB // '��������' 0xDC 0xDD 0xDE 0xDF 0xE0 0xE1 0xE2 0xE3 // '��������' 0xE4 0xE5 0xE6 0xE7 0xE8 0xE9 0xEA 0xEB // '��������' 0xEC 0xED 0xEE 0xEF 0xF0 0xF1 0xF2 0xF3 // '��������' 0xF4 0xF5 0xF6 0xF7 0xF8 0xF9 0xFA 0xFB // '��������' 0xFC 0xFD 0xFE 0xFF 0x00 0x01 0x02 0x03 // '����????' 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B // '????????' 0x0C 0x0D 0x0E 0x0F 0x10 0x11 0x12 0x13 // '????????' 0x14 0x15 0x16 0x17 0x18 0x19 0x1A 0x1B // '????????' 0x1C 0x1D 0x1E 0x1F 0x20 0x21 0x22 0x23 // '???? !"#' 0x24 0x25 0x26 0x27 0x28 0x29 0x2A 0x2B // '$%&'()*+' 0x2C 0x2D 0x2E 0x2F 0x30 0x31 0x32 0x33 // ',-./0123' 0x34 0x35 0x36 0x37 0x38 0x39 0x3A 0x3B // '456789:;' 0x3C 0x3D 0x3E 0x3F 0x40 0x41 0x42 0x43 // '<=>?@ABC' 0x44 0x45 0x46 0x47 0x48 0x49 0x4A 0x4B // 'DEFGHIJK' 0x4C 0x4D 0x4E 0x4F 0x50 0x51 0x52 0x53 // 'LMNOPQRS' 0x54 0x55 0x56 0x57 0x58 0x59 0x5A 0x5B // 'TUVWXYZ[' 0x5C 0x5D 0x5E 0x5F 0x60 0x61 0x62 0x63 // '\]^_`abc' 0x64 0x65 0x66 0x67 0x68 0x69 0x6A 0x6B // 'defghijk' 0x6C 0x6D 0x6E 0x6F 0x70 0x71 0x72 0x73 // 'lmnopqrs' 0x74 0x75 0x76 0x77 0x78 0x79 0x7A 0x7B // 'tuvwxyz{' 0x7C 0x7D 0x7E 0x7F 0x80 0x81 0x82 0x83 // '|}~?����' 0x84 0x85 0x86 0x87 0x88 0x89 0x8A 0x8B // '��������' 0x8C 0x8D 0x8E 0x8F 0x90 0x91 0x92 0x93 // '��������' 0x94 0x95 0x96 0x97 0x98 0x99 0x9A 0x9B // '��������' 0x9C 0x9D 0x9E 0x9F 0xA0 0xA1 0xA2 0xA3 // '��������' 0xA4 0xA5 0xA6 0xA7 0xA8 0xA9 0xAA 0xAB // '��������' 0xAC 0xAD 0xAE 0xAF 0xB0 0xB1 0xB2 0xB3 // '��������' 0xB4 0xB5 0xB6 0xB7 0xB8 0xB9 0xBA 0xBB // '��������' 0xBC 0xBD 0xBE 0xBF 0xC0 0xC1 0xC2 0xC3 // '��������' 0xC4 0xC5 0xC6 0xC7 0xC8 0xC9 0xCA 0xCB // '��������' 0xCC 0xCD 0xCE 0xCF 0xD0 0xD1 0xD2 0xD3 // '��������' 0xD4 0xD5 0xD6 0xD7 0xD8 0xD9 0xDA 0xDB // '��������' 0xDC 0xDD 0xDE 0xDF 0xE0 0xE1 0xE2 0xE3 // '��������' 0xE4 0xE5 0xE6 0xE7 0xE8 0xE9 0xEA 0xEB // '��������' 0xEC 0xED 0xEE 0xEF 0xF0 0xF1 0xF2 0xF3 // '��������' 0xF4 0xF5 0xF6 0xF7 0xF8 0xF9 0xFA 0xFB // '��������' 0xFC 0xFD 0xFE 0xFF 0x00 0x01 0x02 0x03 // '����????' 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B // '????????' 0x0C 0x0D 0x0E 0x0F 0x10 0x11 0x12 0x13 // '????????' 0x14 0x15 0x16 0x17 0x18 0x19 0x1A 0x1B // '????????' 0x1C 0x1D 0x1E 0x1F 0x20 0x21 0x22 0x23 // '???? !"#' 0x24 0x25 0x26 0x27 0x28 0x29 0x2A 0x2B // '$%&'()*+' 0x2C 0x2D 0x2E 0x2F 0x30 0x31 0x32 0x33 // ',-./0123' 0x34 0x35 0x36 0x37 0x38 0x39 0x3A 0x3B // '456789:;' 0x3C 0x3D 0x3E 0x3F 0x40 0x41 0x42 0x43 // '<=>?@ABC' 0x44 0x45 0x46 0x47 0x48 0x49 0x4A 0x4B // 'DEFGHIJK' 0x4C 0x4D 0x4E 0x4F 0x50 0x51 0x52 0x53 // 'LMNOPQRS' 0x54 0x55 0x56 0x57 0x58 0x59 0x5A 0x5B // 'TUVWXYZ[' 0x5C 0x5D 0x5E 0x5F 0x60 0x61 0x62 0x63 // '\]^_`abc' 0x64 0x65 0x66 0x67 0x68 0x69 0x6A 0x6B // 'defghijk' 0x6C 0x6D 0x6E 0x6F 0x70 0x71 0x72 0x73 // 'lmnopqrs' 0x74 0x75 0x76 0x77 0x78 0x79 0x7A 0x7B // 'tuvwxyz{' 0x7C 0x7D 0x7E 0x7F 0x80 0x81 0x82 0x83 // '|}~?����' 0x84 0x85 0x86 0x87 0x88 0x89 0x8A 0x8B // '��������' 0x8C 0x8D 0x8E 0x8F 0x90 0x91 0x92 0x93 // '��������' 0x94 0x95 0x96 0x97 0x98 0x99 0x9A 0x9B // '��������' 0x9C 0x9D 0x9E 0x9F 0xA0 0xA1 0xA2 0xA3 // '��������' 0xA4 0xA5 0xA6 0xA7 0xA8 0xA9 0xAA 0xAB // '��������' 0xAC 0xAD 0xAE 0xAF 0xB0 0xB1 0xB2 0xB3 // '��������' 0xB4 0xB5 0xB6 0xB7 0xB8 0xB9 0xBA 0xBB // '��������' 0xBC 0xBD 0xBE 0xBF 0xC0 0xC1 0xC2 0xC3 // '��������' 0xC4 0xC5 0xC6 0xC7 0xC8 0xC9 0xCA 0xCB // '��������' 0xCC 0xCD 0xCE 0xCF 0xD0 0xD1 0xD2 0xD3 // '��������' 0xD4 0xD5 0xD6 0xD7 0xD8 0xD9 0xDA 0xDB // '��������' 0xDC 0xDD 0xDE 0xDF 0xE0 0xE1 0xE2 0xE3 // '��������' 0xE4 0xE5 0xE6 0xE7 0xE8 0xE9 0xEA 0xEB // '��������' 0xEC 0xED 0xEE 0xEF 0xF0 0xF1 0xF2 0xF3 // '��������' 0xF4 0xF5 0xF6 0xF7 0xF8 0xF9 0xFA 0xFB // '��������' 0xFC 0xFD 0xFE 0xFF 0x00 0x01 0x02 0x03 // '����????' 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B // '????????' 0x0C 0x0D 0x0E 0x0F 0x10 0x11 0x12 0x13 // '????????' 0x14 0x15 0x16 0x17 0x18 0x19 0x1A 0x1B // '????????' 0x1C 0x1D 0x1E 0x1F 0x20 0x21 0x22 0x23 // '???? !"#' 0x24 0x25 0x26 0x27 0x28 0x29 0x2A 0x2B // '$%&'()*+' 0x2C 0x2D 0x2E 0x2F 0x30 0x31 0x32 0x33 // ',-./0123' 0x34 0x35 0x36 0x37 0x38 0x39 0x3A 0x3B // '456789:;' 0x3C 0x3D 0x3E 0x3F 0x40 0x41 0x42 0x43 // '<=>?@ABC' 0x44 0x45 0x46 0x47 0x48 0x49 0x4A 0x4B // 'DEFGHIJK' 0x4C 0x4D 0x4E 0x4F 0x50 0x51 0x52 0x53 // 'LMNOPQRS' 0x54 0x55 0x56 0x57 0x58 0x59 0x5A 0x5B // 'TUVWXYZ[' 0x5C 0x5D 0x5E 0x5F 0x60 0x61 0x62 0x63 // '\]^_`abc' 0x64 0x65 0x66 0x67 0x68 0x69 0x6A 0x6B // 'defghijk' 0x6C 0x6D 0x6E 0x6F 0x70 0x71 0x72 0x73 // 'lmnopqrs' 0x74 0x75 0x76 0x77 0x78 0x79 0x7A 0x7B // 'tuvwxyz{' 0x7C 0x7D 0x7E 0x7F 0x80 0x81 0x82 0x83 // '|}~?����' 0x84 0x85 0x86 0x87 0x88 0x89 0x8A 0x8B // '��������' 0x8C 0x8D 0x8E 0x8F 0x90 0x91 0x92 0x93 // '��������' 0x94 0x95 0x96 0x97 0x98 0x99 0x9A 0x9B // '��������' 0x9C 0x9D 0x9E 0x9F 0xA0 0xA1 0xA2 0xA3 // '��������' 0xA4 0xA5 0xA6 0xA7 0xA8 0xA9 0xAA 0xAB // '��������' 0xAC 0xAD 0xAE 0xAF 0xB0 0xB1 0xB2 0xB3 // '��������' 0xB4 0xB5 0xB6 0xB7 0xB8 0xB9 0xBA 0xBB // '��������' 0xBC 0xBD 0xBE 0xBF 0xC0 0xC1 0xC2 0xC3 // '��������' 0xC4 0xC5 0xC6 0xC7 0xC8 0xC9 0xCA 0xCB // '��������' 0xCC 0xCD 0xCE 0xCF 0xD0 0xD1 0xD2 0xD3 // '��������' 0xD4 0xD5 0xD6 0xD7 0xD8 0xD9 0xDA 0xDB // '��������' 0xDC 0xDD 0xDE 0xDF 0xE0 0xE1 0xE2 0xE3 // '��������' 0xE4 0xE5 0xE6 0xE7 0xE8 0xE9 0xEA 0xEB // '��������' 0xEC 0xED 0xEE 0xEF 0xF0 0xF1 0xF2 0xF3 // '��������' 0xF4 0xF5 0xF6 0xF7 0xF8 0xF9 0xFA 0xFB // '��������' 0xFC 0xFD 0xFE 0xFF 0x00 0x01 0x02 0x03 // '����????' 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B // '????????' 0x0C 0x0D 0x0E 0x0F 0x10 0x11 0x12 0x13 // '????????' 0x14 0x15 0x16 0x17 0x18 0x19 0x1A 0x1B // '????????' 0x1C 0x1D 0x1E 0x1F 0x20 0x21 0x22 0x23 // '???? !"#' 0x24 0x25 0x26 0x27 0x28 0x29 0x2A 0x2B // '$%&'()*+' 0x2C 0x2D 0x2E 0x2F 0x30 0x31 0x32 0x33 // ',-./0123' 0x34 0x35 0x36 0x37 0x38 0x39 0x3A 0x3B // '456789:;' 0x3C 0x3D 0x3E 0x3F 0x40 0x41 0x42 0x43 // '<=>?@ABC' 0x44 0x45 0x46 0x47 0x48 0x49 0x4A 0x4B // 'DEFGHIJK' 0x4C 0x4D 0x4E 0x4F 0x50 0x51 0x52 0x53 // 'LMNOPQRS' 0x54 0x55 0x56 0x57 0x58 0x59 0x5A 0x5B // 'TUVWXYZ[' 0x5C 0x5D 0x5E 0x5F 0x60 0x61 0x62 0x63 // '\]^_`abc' 0x64 0x65 0x66 0x67 0x68 0x69 0x6A 0x6B // 'defghijk' 0x6C 0x6D 0x6E 0x6F 0x70 0x71 0x72 0x73 // 'lmnopqrs' 0x74 0x75 0x76 0x77 0x78 0x79 0x7A 0x7B // 'tuvwxyz{' 0x7C 0x7D 0x7E 0x7F 0x80 0x81 0x82 0x83 // '|}~?����' 0x84 0x85 0x86 0x87 0x88 0x89 0x8A 0x8B // '��������' 0x8C 0x8D 0x8E 0x8F 0x90 0x91 0x92 0x93 // '��������' 0x94 0x95 0x96 0x97 0x98 0x99 0x9A 0x9B // '��������' 0x9C 0x9D 0x9E 0x9F 0xA0 0xA1 0xA2 0xA3 // '��������' 0xA4 0xA5 0xA6 0xA7 0xA8 0xA9 0xAA 0xAB // '��������' 0xAC 0xAD 0xAE 0xAF 0xB0 0xB1 0xB2 0xB3 // '��������' 0xB4 0xB5 0xB6 0xB7 0xB8 0xB9 0xBA 0xBB // '��������' 0xBC 0xBD 0xBE 0xBF 0xC0 0xC1 0xC2 0xC3 // '��������' 0xC4 0xC5 0xC6 0xC7 0xC8 0xC9 0xCA 0xCB // '��������' 0xCC 0xCD 0xCE 0xCF 0xD0 0xD1 0xD2 0xD3 // '��������' 0xD4 0xD5 0xD6 0xD7 0xD8 0xD9 0xDA 0xDB // '��������' 0xDC 0xDD 0xDE 0xDF 0xE0 0xE1 0xE2 0xE3 // '��������' 0xE4 0xE5 0xE6 0xE7 0xE8 0xE9 0xEA 0xEB // '��������' 0xEC 0xED 0xEE 0xEF 0xF0 0xF1 0xF2 0xF3 // '��������' 0xF4 0xF5 0xF6 0xF7 0xF8 0xF9 0xFA 0xFB // '��������' 0xFC 0xFD 0xFE 0xFF 0x00 0x01 0x02 0x03 // '����????' 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B // '????????' 0x0C 0x0D 0x0E 0x0F 0x10 0x11 0x12 0x13 // '????????' 0x14 0x15 0x16 0x17 0x18 0x19 0x1A 0x1B // '????????' 0x1C 0x1D 0x1E 0x1F 0x20 0x21 0x22 0x23 // '???? !"#' 0x24 0x25 0x26 0x27 0x28 0x29 0x2A 0x2B // '$%&'()*+' 0x2C 0x2D 0x2E 0x2F 0x30 0x31 0x32 0x33 // ',-./0123' 0x34 0x35 0x36 0x37 0x38 0x39 0x3A 0x3B // '456789:;' 0x3C 0x3D 0x3E 0x3F 0x40 0x41 0x42 0x43 // '<=>?@ABC' 0x44 0x45 0x46 0x47 0x48 0x49 0x4A 0x4B // 'DEFGHIJK' 0x4C 0x4D 0x4E 0x4F 0x50 0x51 0x52 0x53 // 'LMNOPQRS' 0x54 0x55 0x56 0x57 0x58 0x59 0x5A 0x5B // 'TUVWXYZ[' 0x5C 0x5D 0x5E 0x5F 0x60 0x61 0x62 0x63 // '\]^_`abc' 0x64 0x65 0x66 0x67 0x68 0x69 0x6A 0x6B // 'defghijk' 0x6C 0x6D 0x6E 0x6F 0x70 0x71 0x72 0x73 // 'lmnopqrs' 0x74 0x75 0x76 0x77 0x78 0x79 0x7A 0x7B // 'tuvwxyz{' 0x7C 0x7D 0x7E 0x7F 0x80 0x81 0x82 0x83 // '|}~?����' 0x84 0x85 0x86 0x87 0x88 0x89 0x8A 0x8B // '��������' 0x8C 0x8D 0x8E 0x8F 0x90 0x91 0x92 0x93 // '��������' 0x94 0x95 0x96 0x97 0x98 0x99 0x9A 0x9B // '��������' 0x9C 0x9D 0x9E 0x9F 0xA0 0xA1 0xA2 0xA3 // '��������' 0xA4 0xA5 0xA6 0xA7 0xA8 0xA9 0xAA 0xAB // '��������' 0xAC 0xAD 0xAE 0xAF 0xB0 0xB1 0xB2 0xB3 // '��������' 0xB4 0xB5 0xB6 0xB7 0xB8 0xB9 0xBA 0xBB // '��������' 0xBC 0xBD 0xBE 0xBF 0xC0 0xC1 0xC2 0xC3 // '��������' 0xC4 0xC5 0xC6 0xC7 0xC8 0xC9 0xCA 0xCB // '��������' 0xCC 0xCD 0xCE 0xCF 0xD0 0xD1 0xD2 0xD3 // '��������' 0xD4 0xD5 0xD6 0xD7 0xD8 0xD9 0xDA 0xDB // '��������' 0xDC 0xDD 0xDE 0xDF 0xE0 0xE1 0xE2 0xE3 // '��������' 0xE4 0xE5 0xE6 0xE7 0xE8 0xE9 0xEA 0xEB // '��������' 0xEC 0xED 0xEE 0xEF 0xF0 0xF1 0xF2 0xF3 // '��������' 0xF4 0xF5 0xF6 0xF7 0xF8 0xF9 0xFA 0xFB // '��������' 0xFC 0xFD 0xFE 0xFF 0x00 0x01 0x02 0x03 // '����????' 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B // '????????' 0x0C 0x0D 0x0E 0x0F 0x10 0x11 0x12 0x13 // '????????' 0x14 0x15 0x16 0x17 0x18 0x19 0x1A 0x1B // '????????' 0x1C 0x1D 0x1E 0x1F 0x20 0x21 0x22 0x23 // '???? !"#' 0x24 0x25 0x26 0x27 0x28 0x29 0x2A 0x2B // '$%&'()*+' 0x2C 0x2D 0x2E 0x2F 0x30 0x31 0x32 0x33 // ',-./0123' 0x34 0x35 0x36 0x37 0x38 0x39 0x3A 0x3B // '456789:;' 0x3C 0x3D 0x3E 0x3F 0x40 0x41 0x42 0x43 // '<=>?@ABC' 0x44 0x45 0x46 0x47 0x48 0x49 0x4A 0x4B // 'DEFGHIJK' 0x4C 0x4D 0x4E 0x4F 0x50 0x51 0x52 0x53 // 'LMNOPQRS' 0x54 0x55 0x56 0x57 0x58 0x59 0x5A 0x5B // 'TUVWXYZ[' 0x5C 0x5D 0x5E 0x5F 0x60 0x61 0x62 0x63 // '\]^_`abc' 0x64 0x65 0x66 0x67 0x68 0x69 0x6A 0x6B // 'defghijk' 0x6C 0x6D 0x6E 0x6F 0x70 0x71 0x72 0x73 // 'lmnopqrs' 0x74 0x75 0x76 0x77 0x78 0x79 0x7A 0x7B // 'tuvwxyz{' 0x7C 0x7D 0x7E 0x7F 0x80 0x81 0x82 0x83 // '|}~?����' 0x84 0x85 0x86 0x87 0x88 0x89 0x8A 0x8B // '��������' 0x8C 0x8D 0x8E 0x8F 0x90 0x91 0x92 0x93 // '��������' 0x94 0x95 0x96 0x97 0x98 0x99 0x9A 0x9B // '��������' 0x9C 0x9D 0x9E 0x9F 0xA0 0xA1 0xA2 0xA3 // '��������' 0xA4 0xA5 0xA6 0xA7 0xA8 0xA9 0xAA 0xAB // '��������' 0xAC 0xAD 0xAE 0xAF 0xB0 0xB1 0xB2 0xB3 // '��������' 0xB4 0xB5 0xB6 0xB7 0xB8 0xB9 0xBA 0xBB // '��������' 0xBC 0xBD 0xBE 0xBF 0xC0 0xC1 0xC2 0xC3 // '��������' 0xC4 0xC5 0xC6 0xC7 0xC8 0xC9 0xCA 0xCB // '��������' 0xCC 0xCD 0xCE 0xCF 0xD0 0xD1 0xD2 0xD3 // '��������' 0xD4 0xD5 0xD6 0xD7 0xD8 0xD9 0xDA 0xDB // '��������' 0xDC 0xDD 0xDE 0xDF 0xE0 0xE1 0xE2 0xE3 // '��������' 0xE4 0xE5 0xE6 0xE7 0xE8 0xE9 0xEA 0xEB // '��������' 0xEC 0xED 0xEE 0xEF 0xF0 0xF1 0xF2 0xF3 // '��������' 0xF4 0xF5 0xF6 0xF7 0xF8 0xF9 0xFA 0xFB // '��������' 0xFC 0xFD 0xFE 0xFF 0x00 0x01 0x02 0x03 // '����????' 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B // '????????' 0x0C 0x0D 0x0E 0x0F 0x10 0x11 0x12 0x13 // '????????' 0x14 0x15 0x16 0x17 0x18 0x19 0x1A 0x1B // '????????' 0x1C 0x1D 0x1E 0x1F 0x20 0x21 0x22 0x23 // '???? !"#' 0x24 0x25 0x26 0x27 0x28 0x29 0x2A 0x2B // '$%&'()*+' 0x2C 0x2D 0x2E 0x2F 0x30 0x31 0x32 0x33 // ',-./0123' 0x34 0x35 0x36 0x37 0x38 0x39 0x3A 0x3B // '456789:;' 0x3C 0x3D 0x3E 0x3F 0x40 0x41 0x42 0x43 // '<=>?@ABC' 0x44 0x45 0x46 0x47 0x48 0x49 0x4A 0x4B // 'DEFGHIJK' 0x4C 0x4D 0x4E 0x4F 0x50 0x51 0x52 0x53 // 'LMNOPQRS' 0x54 0x55 0x56 0x57 0x58 0x59 0x5A 0x5B // 'TUVWXYZ[' 0x5C 0x5D 0x5E 0x5F 0x60 0x61 0x62 0x63 // '\]^_`abc' 0x64 0x65 0x66 0x67 0x68 0x69 0x6A 0x6B // 'defghijk' 0x6C 0x6D 0x6E 0x6F 0x70 0x71 0x72 0x73 // 'lmnopqrs' 0x74 0x75 0x76 0x77 0x78 0x79 0x7A 0x7B // 'tuvwxyz{' 0x7C 0x7D 0x7E 0x7F 0x80 0x81 0x82 0x83 // '|}~?����' 0x84 0x85 0x86 0x87 0x88 0x89 0x8A 0x8B // '��������' 0x8C 0x8D 0x8E 0x8F 0x90 0x91 0x92 0x93 // '��������' 0x94 0x95 0x96 0x97 0x98 0x99 0x9A 0x9B // '��������' 0x9C 0x9D 0x9E 0x9F 0xA0 0xA1 0xA2 0xA3 // '��������' 0xA4 0xA5 0xA6 0xA7 0xA8 0xA9 0xAA 0xAB // '��������' 0xAC 0xAD 0xAE 0xAF 0xB0 0xB1 0xB2 0xB3 // '��������' 0xB4 0xB5 0xB6 0xB7 0xB8 0xB9 0xBA 0xBB // '��������' 0xBC 0xBD 0xBE 0xBF 0xC0 0xC1 0xC2 0xC3 // '��������' 0xC4 0xC5 0xC6 0xC7 0xC8 0xC9 0xCA 0xCB // '��������' 0xCC 0xCD 0xCE 0xCF 0xD0 0xD1 0xD2 0xD3 // '��������' 0xD4 0xD5 0xD6 0xD7 0xD8 0xD9 0xDA 0xDB // '��������' 0xDC 0xDD 0xDE 0xDF 0xE0 0xE1 0xE2 0xE3 // '��������' 0xE4 0xE5 0xE6 0xE7 0xE8 0xE9 0xEA 0xEB // '��������' 0xEC 0xED 0xEE 0xEF 0xF0 0xF1 0xF2 0xF3 // '��������' 0xF4 0xF5 0xF6 0xF7 0xF8 0xF9 0xFA 0xFB // '��������' 0xFC 0xFD 0xFE 0xFF 0x00 0x01 0x02 0x03 // '����????' 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B // '????????' 0x0C 0x0D 0x0E 0x0F 0x10 0x11 0x12 0x13 // '????????' 0x14 0x15 0x16 0x17 0x18 0x19 0x1A 0x1B // '????????' 0x1C 0x1D 0x1E 0x1F 0x20 0x21 0x22 0x23 // '???? !"#' 0x24 0x25 0x26 0x27 0x28 0x29 0x2A 0x2B // '$%&'()*+' 0x2C 0x2D 0x2E 0x2F 0x30 0x31 0x32 0x33 // ',-./0123' 0x34 0x35 0x36 0x37 0x38 0x39 0x3A 0x3B // '456789:;' 0x3C 0x3D 0x3E 0x3F 0x40 0x41 0x42 0x43 // '<=>?@ABC' 0x44 0x45 0x46 0x47 0x48 0x49 0x4A 0x4B // 'DEFGHIJK' 0x4C 0x4D 0x4E 0x4F 0x50 0x51 0x52 0x53 // 'LMNOPQRS' 0x54 0x55 0x56 0x57 0x58 0x59 0x5A 0x5B // 'TUVWXYZ[' 0x5C 0x5D 0x5E 0x5F 0x60 0x61 0x62 0x63 // '\]^_`abc' 0x64 0x65 0x66 0x67 0x68 0x69 0x6A 0x6B // 'defghijk' 0x6C 0x6D 0x6E 0x6F 0x70 0x71 0x72 0x73 // 'lmnopqrs' 0x74 0x75 0x76 0x77 0x78 0x79 0x7A 0x7B // 'tuvwxyz{' 0x7C 0x7D 0x7E 0x7F 0x80 0x81 0x82 0x83 // '|}~?����' 0x84 0x85 0x86 0x87 0x88 0x89 0x8A 0x8B // '��������' 0x8C 0x8D 0x8E 0x8F 0x90 0x91 0x92 0x93 // '��������' 0x94 0x95 0x96 0x97 0x98 0x99 0x9A 0x9B // '��������' 0x9C 0x9D 0x9E 0x9F 0xA0 0xA1 0xA2 0xA3 // '��������' 0xA4 0xA5 0xA6 0xA7 0xA8 0xA9 0xAA 0xAB // '��������' 0xAC 0xAD 0xAE 0xAF 0xB0 0xB1 0xB2 0xB3 // '��������' 0xB4 0xB5 0xB6 0xB7 0xB8 0xB9 0xBA 0xBB // '��������' 0xBC 0xBD 0xBE 0xBF 0xC0 0xC1 0xC2 0xC3 // '��������' 0xC4 0xC5 0xC6 0xC7 0xC8 0xC9 0xCA 0xCB // '��������' 0xCC 0xCD 0xCE 0xCF 0xD0 0xD1 0xD2 0xD3 // '��������' 0xD4 0xD5 0xD6 0xD7 0xD8 0xD9 0xDA 0xDB // '��������' 0xDC 0xDD 0xDE 0xDF 0xE0 0xE1 0xE2 0xE3 // '��������' 0xE4 0xE5 0xE6 0xE7 0xE8 0xE9 0xEA 0xEB // '��������' 0xEC 0xED 0xEE 0xEF 0xF0 0xF1 0xF2 0xF3 // '��������' 0xF4 0xF5 0xF6 0xF7 0xF8 0xF9 0xFA 0xFB // '��������' 0xFC 0xFD 0xFE 0xFF 0x00 0x01 0x02 0x03 // '����????' 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B // '????????' 0x0C 0x0D 0x0E 0x0F 0x10 0x11 0x12 0x13 // '????????' 0x14 0x15 0x16 0x17 0x18 0x19 0x1A 0x1B // '????????' 0x1C 0x1D 0x1E 0x1F 0x20 0x21 0x22 0x23 // '???? !"#' 0x24 0x25 0x26 0x27 0x28 0x29 0x2A 0x2B // '$%&'()*+' 0x2C 0x2D 0x2E 0x2F 0x30 0x31 0x32 0x33 // ',-./0123' 0x34 0x35 0x36 0x37 0x38 0x39 0x3A 0x3B // '456789:;' 0x3C 0x3D 0x3E 0x3F 0x40 0x41 0x42 0x43 // '<=>?@ABC' 0x44 0x45 0x46 0x47 0x48 0x49 0x4A 0x4B // 'DEFGHIJK' 0x4C 0x4D 0x4E 0x4F 0x50 0x51 0x52 0x53 // 'LMNOPQRS' 0x54 0x55 0x56 0x57 0x58 0x59 0x5A 0x5B // 'TUVWXYZ[' 0x5C 0x5D 0x5E 0x5F 0x60 0x61 0x62 0x63 // '\]^_`abc' 0x64 0x65 0x66 0x67 0x68 0x69 0x6A 0x6B // 'defghijk' 0x6C 0x6D 0x6E 0x6F 0x70 0x71 0x72 0x73 // 'lmnopqrs' 0x74 0x75 0x76 0x77 0x78 0x79 0x7A 0x7B // 'tuvwxyz{' 0x7C 0x7D 0x7E 0x7F 0x80 0x81 0x82 0x83 // '|}~?����' 0x84 0x85 0x86 0x87 0x88 0x89 0x8A 0x8B // '��������' 0x8C 0x8D 0x8E 0x8F 0x90 0x91 0x92 0x93 // '��������' 0x94 0x95 0x96 0x97 0x98 0x99 0x9A 0x9B // '��������' 0x9C 0x9D 0x9E 0x9F 0xA0 0xA1 0xA2 0xA3 // '��������' 0xA4 0xA5 0xA6 0xA7 0xA8 0xA9 0xAA 0xAB // '��������' 0xAC 0xAD 0xAE 0xAF 0xB0 0xB1 0xB2 0xB3 // '��������' 0xB4 0xB5 0xB6 0xB7 0xB8 0xB9 0xBA 0xBB // '��������' 0xBC 0xBD 0xBE 0xBF 0xC0 0xC1 0xC2 0xC3 // '��������' 0xC4 0xC5 0xC6 0xC7 0xC8 0xC9 0xCA 0xCB // '��������' 0xCC 0xCD 0xCE 0xCF 0xD0 0xD1 0xD2 0xD3 // '��������' 0xD4 0xD5 0xD6 0xD7 0xD8 0xD9 0xDA 0xDB // '��������' 0xDC 0xDD 0xDE 0xDF 0xE0 0xE1 0xE2 0xE3 // '��������' 0xE4 0xE5 0xE6 0xE7 0xE8 0xE9 0xEA 0xEB // '��������' 0xEC 0xED 0xEE 0xEF 0xF0 0xF1 0xF2 0xF3 // '��������' 0xF4 0xF5 0xF6 0xF7 0xF8 0xF9 0xFA 0xFB // '��������' 0xFC 0xFD 0xFE 0xFF 0x00 0x01 0x02 0x03 // '����????' 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B // '????????' 0x0C 0x0D 0x0E 0x0F 0x10 0x11 0x12 0x13 // '????????' 0x14 0x15 0x16 0x17 0x18 0x19 0x1A 0x1B // '????????' 0x1C 0x1D 0x1E 0x1F 0x20 0x21 0x22 0x23 // '???? !"#' 0x24 0x25 0x26 0x27 0x28 0x29 0x2A 0x2B // '$%&'()*+' 0x2C 0x2D 0x2E 0x2F 0x30 0x31 0x32 0x33 // ',-./0123' 0x34 0x35 0x36 0x37 0x38 0x39 0x3A 0x3B // '456789:;' 0x3C 0x3D 0x3E 0x3F 0x40 0x41 0x42 0x43 // '<=>?@ABC' 0x44 0x45 0x46 0x47 0x48 0x49 0x4A 0x4B // 'DEFGHIJK' 0x4C 0x4D 0x4E 0x4F 0x50 0x51 0x52 0x53 // 'LMNOPQRS' 0x54 0x55 0x56 0x57 0x58 0x59 0x5A 0x5B // 'TUVWXYZ[' 0x5C 0x5D 0x5E 0x5F 0x60 0x61 0x62 0x63 // '\]^_`abc' 0x64 0x65 0x66 0x67 0x68 0x69 0x6A 0x6B // 'defghijk' 0x6C 0x6D 0x6E 0x6F 0x70 0x71 0x72 0x73 // 'lmnopqrs' 0x74 0x75 0x76 0x77 0x78 0x79 0x7A 0x7B // 'tuvwxyz{' 0x7C 0x7D 0x7E 0x7F 0x80 0x81 0x82 0x83 // '|}~?����' 0x84 0x85 0x86 0x87 0x88 0x89 0x8A 0x8B // '��������' 0x8C 0x8D 0x8E 0x8F 0x90 0x91 0x92 0x93 // '��������' 0x94 0x95 0x96 0x97 0x98 0x99 0x9A 0x9B // '��������' 0x9C 0x9D 0x9E 0x9F 0xA0 0xA1 0xA2 0xA3 // '��������' 0xA4 0xA5 0xA6 0xA7 0xA8 0xA9 0xAA 0xAB // '��������' 0xAC 0xAD 0xAE 0xAF 0xB0 0xB1 0xB2 0xB3 // '��������' 0xB4 0xB5 0xB6 0xB7 0xB8 0xB9 0xBA 0xBB // '��������' 0xBC 0xBD 0xBE 0xBF 0xC0 0xC1 0xC2 0xC3 // '��������' 0xC4 0xC5 0xC6 0xC7 0xC8 0xC9 0xCA 0xCB // '��������' 0xCC 0xCD 0xCE 0xCF 0xD0 0xD1 0xD2 0xD3 // '��������' 0xD4 0xD5 0xD6 0xD7 0xD8 0xD9 0xDA 0xDB // '��������' 0xDC 0xDD 0xDE 0xDF 0xE0 0xE1 0xE2 0xE3 // '��������' 0xE4 0xE5 0xE6 0xE7 0xE8 0xE9 0xEA 0xEB // '��������' 0xEC 0xED 0xEE 0xEF 0xF0 0xF1 0xF2 0xF3 // '��������' 0xF4 0xF5 0xF6 0xF7 0xF8 0xF9 0xFA 0xFB // '��������' 0xFC 0xFD 0xFE 0xFF 0x00 0x01 0x02 0x03 // '����????' 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B // '????????' 0x0C 0x0D 0x0E 0x0F 0x10 0x11 0x12 0x13 // '????????' 0x14 0x15 0x16 0x17 0x18 0x19 0x1A 0x1B // '????????' 0x1C 0x1D 0x1E 0x1F 0x20 0x21 0x22 0x23 // '???? !"#' 0x24 0x25 0x26 0x27 0x28 0x29 0x2A 0x2B // '$%&'()*+' 0x2C 0x2D 0x2E 0x2F 0x30 0x31 0x32 0x33 // ',-./0123' 0x34 0x35 0x36 0x37 0x38 0x39 0x3A 0x3B // '456789:;' 0x3C 0x3D 0x3E 0x3F 0x40 0x41 0x42 0x43 // '<=>?@ABC' 0x44 0x45 0x46 0x47 0x48 0x49 0x4A 0x4B // 'DEFGHIJK' 0x4C 0x4D 0x4E 0x4F 0x50 0x51 0x52 0x53 // 'LMNOPQRS' 0x54 0x55 0x56 0x57 0x58 0x59 0x5A 0x5B // 'TUVWXYZ[' 0x5C 0x5D 0x5E 0x5F 0x60 0x61 0x62 0x63 // '\]^_`abc' 0x64 0x65 0x66 0x67 0x68 0x69 0x6A 0x6B // 'defghijk' 0x6C 0x6D 0x6E 0x6F 0x70 0x71 0x72 0x73 // 'lmnopqrs' 0x74 0x75 0x76 0x77 0x78 0x79 0x7A 0x7B // 'tuvwxyz{' 0x7C 0x7D 0x7E 0x7F 0x80 0x81 0x82 0x83 // '|}~?����' 0x84 0x85 0x86 0x87 0x88 0x89 0x8A 0x8B // '��������' 0x8C 0x8D 0x8E 0x8F 0x90 0x91 0x92 0x93 // '��������' 0x94 0x95 0x96 0x97 0x98 0x99 0x9A 0x9B // '��������' 0x9C 0x9D 0x9E 0x9F 0xA0 0xA1 0xA2 0xA3 // '��������' 0xA4 0xA5 0xA6 0xA7 0xA8 0xA9 0xAA 0xAB // '��������' 0xAC 0xAD 0xAE 0xAF 0xB0 0xB1 0xB2 0xB3 // '��������' 0xB4 0xB5 0xB6 0xB7 0xB8 0xB9 0xBA 0xBB // '��������' 0xBC 0xBD 0xBE 0xBF 0xC0 0xC1 0xC2 0xC3 // '��������' 0xC4 0xC5 0xC6 0xC7 0xC8 0xC9 0xCA 0xCB // '��������' 0xCC 0xCD 0xCE 0xCF 0xD0 0xD1 0xD2 0xD3 // '��������' 0xD4 0xD5 0xD6 0xD7 0xD8 0xD9 0xDA 0xDB // '��������' 0xDC 0xDD 0xDE 0xDF 0xE0 0xE1 0xE2 0xE3 // '��������' 0xE4 0xE5 0xE6 0xE7 0xE8 0xE9 0xEA 0xEB // '��������' 0xEC 0xED 0xEE 0xEF 0xF0 0xF1 0xF2 0xF3 // '��������' 0xF4 0xF5 0xF6 0xF7 0xF8 0xF9 0xFA 0xFB // '��������' 0xFC 0xFD 0xFE 0xFF 0x00 0x01 0x02 0x03 // '����????' 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B // '????????' 0x0C 0x0D 0x0E 0x0F 0x10 0x11 0x12 0x13 // '????????' 0x14 0x15 0x16 0x17 0x18 0x19 0x1A 0x1B // '????????' 0x1C 0x1D 0x1E 0x1F 0x20 0x21 0x22 0x23 // '???? !"#' 0x24 0x25 0x26 0x27 0x28 0x29 0x2A 0x2B // '$%&'()*+' 0x2C 0x2D 0x2E 0x2F 0x30 0x31 0x32 0x33 // ',-./0123' 0x34 0x35 0x36 0x37 0x38 0x39 0x3A 0x3B // '456789:;' 0x3C 0x3D 0x3E 0x3F 0x40 0x41 0x42 0x43 // '<=>?@ABC' 0x44 0x45 0x46 0x47 0x48 0x49 0x4A 0x4B // 'DEFGHIJK' 0x4C 0x4D 0x4E 0x4F 0x50 0x51 0x52 0x53 // 'LMNOPQRS' 0x54 0x55 0x56 0x57 0x58 0x59 0x5A 0x5B // 'TUVWXYZ[' 0x5C 0x5D 0x5E 0x5F 0x60 0x61 0x62 0x63 // '\]^_`abc' 0x64 0x65 0x66 0x67 0x68 0x69 0x6A 0x6B // 'defghijk' 0x6C 0x6D 0x6E 0x6F 0x70 0x71 0x72 0x73 // 'lmnopqrs' 0x74 0x75 0x76 0x77 0x78 0x79 0x7A 0x7B // 'tuvwxyz{' 0x7C 0x7D 0x7E 0x7F 0x80 0x81 0x82 0x83 // '|}~?����' 0x84 0x85 0x86 0x87 0x88 0x89 0x8A 0x8B // '��������' 0x8C 0x8D 0x8E 0x8F 0x90 0x91 0x92 0x93 // '��������' 0x94 0x95 0x96 0x97 0x98 0x99 0x9A 0x9B // '��������' 0x9C 0x9D 0x9E 0x9F 0xA0 0xA1 0xA2 0xA3 // '��������' 0xA4 0xA5 0xA6 0xA7 0xA8 0xA9 0xAA 0xAB // '��������' 0xAC 0xAD 0xAE 0xAF 0xB0 0xB1 0xB2 0xB3 // '��������' 0xB4 0xB5 0xB6 0xB7 0xB8 0xB9 0xBA 0xBB // '��������' 0xBC 0xBD 0xBE 0xBF 0xC0 0xC1 0xC2 0xC3 // '��������' 0xC4 0xC5 0xC6 0xC7 0xC8 0xC9 0xCA 0xCB // '��������' 0xCC 0xCD 0xCE 0xCF 0xD0 0xD1 0xD2 0xD3 // '��������' 0xD4 0xD5 0xD6 0xD7 0xD8 0xD9 0xDA 0xDB // '��������' 0xDC 0xDD 0xDE 0xDF 0xE0 0xE1 0xE2 0xE3 // '��������' 0xE4 0xE5 0xE6 0xE7 0xE8 0xE9 0xEA 0xEB // '��������' 0xEC 0xED 0xEE 0xEF 0xF0 0xF1 0xF2 0xF3 // '��������' 0xF4 0xF5 0xF6 0xF7 0xF8 0xF9 0xFA 0xFB // '��������' 0xFC 0xFD 0xFE 0xFF 0x00 0x01 0x02 0x03 // '����????' 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B // '????????' 0x0C 0x0D 0x0E 0x0F 0x10 0x11 0x12 0x13 // '????????' 0x14 0x15 0x16 0x17 0x18 0x19 0x1A 0x1B // '????????' 0x1C 0x1D 0x1E 0x1F 0x20 0x21 0x22 0x23 // '???? !"#' 0x24 0x25 0x26 0x27 0x28 0x29 0x2A 0x2B // '$%&'()*+' 0x2C 0x2D 0x2E 0x2F 0x30 0x31 0x32 0x33 // ',-./0123' 0x34 0x35 0x36 0x37 0x38 0x39 0x3A 0x3B // '456789:;' 0x3C 0x3D 0x3E 0x3F 0x40 0x41 0x42 0x43 // '<=>?@ABC' 0x44 0x45 0x46 0x47 0x48 0x49 0x4A 0x4B // 'DEFGHIJK' 0x4C 0x4D 0x4E 0x4F 0x50 0x51 0x52 0x53 // 'LMNOPQRS' 0x54 0x55 0x56 0x57 0x58 0x59 0x5A 0x5B // 'TUVWXYZ[' 0x5C 0x5D 0x5E 0x5F 0x60 0x61 0x62 0x63 // '\]^_`abc' 0x64 0x65 0x66 0x67 0x68 0x69 0x6A 0x6B // 'defghijk' 0x6C 0x6D 0x6E 0x6F 0x70 0x71 0x72 0x73 // 'lmnopqrs' 0x74 0x75 0x76 0x77 0x78 0x79 0x7A 0x7B // 'tuvwxyz{' 0x7C 0x7D 0x7E 0x7F 0x80 0x81 0x82 0x83 // '|}~?����' 0x84 0x85 0x86 0x87 0x88 0x89 0x8A 0x8B // '��������' 0x8C 0x8D 0x8E 0x8F 0x90 0x91 0x92 0x93 // '��������' 0x94 0x95 0x96 0x97 0x98 0x99 0x9A 0x9B // '��������' 0x9C 0x9D 0x9E 0x9F 0xA0 0xA1 0xA2 0xA3 // '��������' 0xA4 0xA5 0xA6 0xA7 0xA8 0xA9 0xAA 0xAB // '��������' 0xAC 0xAD 0xAE 0xAF 0xB0 0xB1 0xB2 0xB3 // '��������' 0xB4 0xB5 0xB6 0xB7 0xB8 0xB9 0xBA 0xBB // '��������' 0xBC 0xBD 0xBE 0xBF 0xC0 0xC1 0xC2 0xC3 // '��������' 0xC4 0xC5 0xC6 0xC7 0xC8 0xC9 0xCA 0xCB // '��������' 0xCC 0xCD 0xCE 0xCF 0xD0 0xD1 0xD2 0xD3 // '��������' 0xD4 0xD5 0xD6 0xD7 0xD8 0xD9 0xDA 0xDB // '��������' 0xDC 0xDD 0xDE 0xDF 0xE0 0xE1 0xE2 0xE3 // '��������' 0xE4 0xE5 0xE6 0xE7 0xE8 0xE9 0xEA 0xEB // '��������' 0xEC 0xED 0xEE 0xEF 0xF0 0xF1 0xF2 0xF3 // '��������' 0xF4 0xF5 0xF6 0xF7 0xF8 0xF9 0xFA 0xFB // '��������' 0xFC 0xFD 0xFE 0xFF 0x00 0x01 0x02 0x03 // '����????' 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B // '????????' 0x0C 0x0D 0x0E 0x0F 0x10 0x11 0x12 0x13 // '????????' 0x14 0x15 0x16 0x17 0x18 0x19 0x1A 0x1B // '????????' 0x1C 0x1D 0x1E 0x1F 0x20 0x21 0x22 0x23 // '???? !"#' 0x24 0x25 0x26 0x27 0x28 0x29 0x2A 0x2B // '$%&'()*+' 0x2C 0x2D 0x2E 0x2F 0x30 0x31 0x32 0x33 // ',-./0123' 0x34 0x35 0x36 0x37 0x38 0x39 0x3A 0x3B // '456789:;' 0x3C 0x3D 0x3E 0x3F 0x40 0x41 0x42 0x43 // '<=>?@ABC' 0x44 0x45 0x46 0x47 0x48 0x49 0x4A 0x4B // 'DEFGHIJK' 0x4C 0x4D 0x4E 0x4F 0x50 0x51 0x52 0x53 // 'LMNOPQRS' 0x54 0x55 0x56 0x57 0x58 0x59 0x5A 0x5B // 'TUVWXYZ[' 0x5C 0x5D 0x5E 0x5F 0x60 0x61 0x62 0x63 // '\]^_`abc' 0x64 0x65 0x66 0x67 0x68 0x69 0x6A 0x6B // 'defghijk' 0x6C 0x6D 0x6E 0x6F 0x70 0x71 0x72 0x73 // 'lmnopqrs' 0x74 0x75 0x76 0x77 0x78 0x79 0x7A 0x7B // 'tuvwxyz{' 0x7C 0x7D 0x7E 0x7F 0x80 0x81 0x82 0x83 // '|}~?����' 0x84 0x85 0x86 0x87 0x88 0x89 0x8A 0x8B // '��������' 0x8C 0x8D 0x8E 0x8F 0x90 0x91 0x92 0x93 // '��������' 0x94 0x95 0x96 0x97 0x98 0x99 0x9A 0x9B // '��������' 0x9C 0x9D 0x9E 0x9F 0xA0 0xA1 0xA2 0xA3 // '��������' 0xA4 0xA5 0xA6 0xA7 0xA8 0xA9 0xAA 0xAB // '��������' 0xAC 0xAD 0xAE 0xAF 0xB0 0xB1 0xB2 0xB3 // '��������' 0xB4 0xB5 0xB6 0xB7 0xB8 0xB9 0xBA 0xBB // '��������' 0xBC 0xBD 0xBE 0xBF 0xC0 0xC1 0xC2 0xC3 // '��������' 0xC4 0xC5 0xC6 0xC7 0xC8 0xC9 0xCA 0xCB // '��������' 0xCC 0xCD 0xCE 0xCF 0xD0 0xD1 0xD2 0xD3 // '��������' 0xD4 0xD5 0xD6 0xD7 0xD8 0xD9 0xDA 0xDB // '��������' 0xDC 0xDD 0xDE 0xDF 0xE0 0xE1 0xE2 0xE3 // '��������' 0xE4 0xE5 0xE6 0xE7 0xE8 0xE9 0xEA 0xEB // '��������' 0xEC 0xED 0xEE 0xEF 0xF0 0xF1 0xF2 0xF3 // '��������' 0xF4 0xF5 0xF6 0xF7 0xF8 0xF9 0xFA 0xFB // '��������' 0xFC 0xFD 0xFE 0xFF 0x00 0x01 0x02 0x03 // '����????' 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B // '????????' 0x0C 0x0D 0x0E 0x0F 0x10 0x11 0x12 0x13 // '????????' 0x14 0x15 0x16 0x17 0x18 0x19 0x1A 0x1B // '????????' 0x1C 0x1D 0x1E 0x1F 0x20 0x21 0x22 0x23 // '???? !"#' 0x24 0x25 0x26 0x27 0x28 0x29 0x2A 0x2B // '$%&'()*+' 0x2C 0x2D 0x2E 0x2F 0x30 0x31 0x32 0x33 // ',-./0123' 0x34 0x35 0x36 0x37 0x38 0x39 0x3A 0x3B // '456789:;' 0x3C 0x3D 0x3E 0x3F 0x40 0x41 0x42 0x43 // '<=>?@ABC' 0x44 0x45 0x46 0x47 0x48 0x49 0x4A 0x4B // 'DEFGHIJK' 0x4C 0x4D 0x4E 0x4F 0x50 0x51 0x52 0x53 // 'LMNOPQRS' 0x54 0x55 0x56 0x57 0x58 0x59 0x5A 0x5B // 'TUVWXYZ[' 0x5C 0x5D 0x5E 0x5F 0x60 0x61 0x62 0x63 // '\]^_`abc' 0x64 0x65 0x66 0x67 0x68 0x69 0x6A 0x6B // 'defghijk' 0x6C 0x6D 0x6E 0x6F 0x70 0x71 0x72 0x73 // 'lmnopqrs' 0x74 0x75 0x76 0x77 0x78 0x79 0x7A 0x7B // 'tuvwxyz{' 0x7C 0x7D 0x7E 0x7F 0x80 0x81 0x82 0x83 // '|}~?����' 0x84 0x85 0x86 0x87 0x88 0x89 0x8A 0x8B // '��������' 0x8C 0x8D 0x8E 0x8F 0x90 0x91 0x92 0x93 // '��������' 0x94 0x95 0x96 0x97 0x98 0x99 0x9A 0x9B // '��������' 0x9C 0x9D 0x9E 0x9F 0xA0 0xA1 0xA2 0xA3 // '��������' 0xA4 0xA5 0xA6 0xA7 0xA8 0xA9 0xAA 0xAB // '��������' 0xAC 0xAD 0xAE 0xAF 0xB0 0xB1 0xB2 0xB3 // '��������' 0xB4 0xB5 0xB6 0xB7 0xB8 0xB9 0xBA 0xBB // '��������' 0xBC 0xBD 0xBE 0xBF 0xC0 0xC1 0xC2 0xC3 // '��������' 0xC4 0xC5 0xC6 0xC7 0xC8 0xC9 0xCA 0xCB // '��������' 0xCC 0xCD 0xCE 0xCF 0xD0 0xD1 0xD2 0xD3 // '��������' 0xD4 0xD5 0xD6 0xD7 0xD8 0xD9 0xDA 0xDB // '��������' 0xDC 0xDD 0xDE 0xDF 0xE0 0xE1 0xE2 0xE3 // '��������' 0xE4 0xE5 0xE6 0xE7 0xE8 0xE9 0xEA 0xEB // '��������' 0xEC 0xED 0xEE 0xEF 0xF0 0xF1 0xF2 0xF3 // '��������' 0xF4 0xF5 0xF6 0xF7 0xF8 0xF9 0xFA 0xFB // '��������' 0xFC 0xFD 0xFE 0xFF // '����' ENDCHUNK ================================================ FILE: src/studio/utest.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** utest.cpp: Socrates main app class Primary Author: ****** Review Status: REVIEWED - any changes to this file must be reviewed! The APP class handles initialization of the product, and global actions such as resolution-switching, switching between the building and the studio, and quitting. The KWA (App KidWorld) is the parent of the gob tree in the product. It also is used to display a splash screen, and to find AVIs on the CD. ***************************************************************************/ #include "studio.h" #include "socres.h" #include "mminstal.h" ASSERTNAME // If the following value is defined, 3DMM displays the dlidDesktopResizing // and dlidDesktopResized dialogs before and immediately after res-switching. // The current thought is that these dialogs are unnecessary since we only // res-switch to 640x480, which should always be safe. We still display a // dialog if the res-switch failed (dlidDesktopWontResize). // #define RES_SWITCH_DIALOGS // If the following value is defined, 3DMM does a run-time performance test // of the graphics, fixed-point math, and copying speed at startup and sets // _fSlowCPU to fTrue if it thinks 3DMM is running on a slow computer. // The current feeling is that we don't have the resources to tweak the // thresholds and verify that this gives us the result we want on all // computers. //#define PERF_TEST // Duration to display homelogo const ulong kdtsHomeLogo = 4 * kdtsSecond; // Duration to display splash screen const ulong kdtsSplashScreen = 4 * kdtsSecond; // Duration before res-switch dialog cancels itself const ulong kdtsMaxResSwitchDlg = 15 * kdtsSecond; // 2MB cache per source for TAGM const ulong kcbCacheTagm = 2048 * 1024; static PSZ kpszAppWndCls = PszLit("3DMOVIE"); const PSZ kpszOpenFile = PszLit("3DMMOpen.tmp"); const long klwOpenDoc = 0x12123434; // arbitrary wParam for WM_USER BEGIN_CMD_MAP(APP, APPB) ON_CID_GEN(cidInfo, &APP::FCmdInfo, pvNil) ON_CID_GEN(cidLoadStudio, &APP::FCmdLoadStudio, pvNil) ON_CID_GEN(cidLoadBuilding, &APP::FCmdLoadBuilding, pvNil) ON_CID_GEN(cidTheaterOpen, &APP::FCmdTheaterOpen, pvNil) ON_CID_GEN(cidTheaterClose, &APP::FCmdTheaterClose, pvNil) ON_CID_GEN(cidPortfolioOpen, &APP::FCmdPortfolioOpen, pvNil) ON_CID_GEN(cidPortfolioClear, &APP::FCmdPortfolioClear, pvNil) ON_CID_GEN(cidDisableAccel, &APP::FCmdDisableAccel, pvNil) ON_CID_GEN(cidEnableAccel, &APP::FCmdEnableAccel, pvNil) ON_CID_GEN(cidInvokeSplot, &APP::FCmdInvokeSplot, pvNil) ON_CID_GEN(cidExitStudio, &APP::FCmdExitStudio, pvNil) ON_CID_GEN(cidDeactivate, &APP::FCmdDeactivate, pvNil) END_CMD_MAP_NIL() APP vapp; PTAGM vptagm; RTCLASS(APP) RTCLASS(KWA) /*************************************************************************** Entry point for a Kauai-based app. ***************************************************************************/ void FrameMain(void) { Debug(vcactAV = 2;) // Speeds up the debug build vapp.Run(fappOffscreen, fgobNil, kginMark); } /****************************************************************************** Run Overridden APPB::Run method, so that we can attempt to recover gracefully from a crash. Arguments: ulong grfapp -- app flags ulong grfgob -- GOB flags long ginDef -- default GOB invalidation ************************************************************ PETED ***********/ void APP::Run(ulong grfapp, ulong grfgob, long ginDef) { /* Don't bother w/ AssertThis; we'd have to use AssertBaseThis, or possibly the parent's AssertValid, which gets done almost right away anyway */ _CleanupTemp(); __try { APP_PAR::Run(grfapp, grfgob, ginDef); } __except (UnhandledExceptionFilter(GetExceptionInformation())) { PDLG pdlg; pdlg = DLG::PdlgNew(dlidAbnormalExit, pvNil, pvNil); if (pdlg != pvNil) { pdlg->IditDo(); ReleasePpo(&pdlg); } _fQuit = fTrue; MVU::RestoreKeyboardRepeat(); #ifdef WIN ClipCursor(NULL); #endif // WIN _CleanUp(); } } /*************************************************************************** Get the name for the app. Note that the string comes from a resource in the exe rather than a chunky file since the app name is needed before any chunky files are opened. The app name should not change even for different products, i.e., Socrates and Playdo will have different _stnProduct, but the same _stnAppName. ***************************************************************************/ void APP::GetStnAppName(PSTN pstn) { AssertBaseThis(0); AssertPo(pstn, 0); if (_stnAppName.Cch() == 0) { #ifdef WIN SZ sz; if (0 != LoadString(vwig.hinst, stidAppName, sz, kcchMaxSz)) _stnAppName = sz; else Warn("Couldn't read app name"); #else // MAC RawRtn(); #endif // MAC } *pstn = _stnAppName; } #ifdef DEBUG struct DBINFO { long cactAV; }; #endif // DEBUG /*************************************************************************** Init the APP ***************************************************************************/ bool APP::_FInit(ulong grfapp, ulong grfgob, long ginDef) { AssertBaseThis(0); ulong tsHomeLogo; ulong tsSplashScreen; FNI fniUserDoc; long fFirstTimeUser; // Only allow one copy of 3DMM to run at a time: if (_FAppAlreadyRunning()) { _TryToActivateWindow(); _fDontReportInitFailure = fTrue; goto LFail; } #ifdef DEBUG { DBINFO dbinfo; dbinfo.cactAV = vcactAV; if (FGetSetRegKey(PszLit("DebugSettings"), &dbinfo, size(DBINFO), fregSetDefault | fregBinary)) { vcactAV = dbinfo.cactAV; } } #endif // DEBUG if (!_FEnsureOS()) { _FGenericError(PszLit("_FEnsureOS")); _fDontReportInitFailure = fTrue; goto LFail; } if (!_FEnsureAudio()) { _FGenericError(PszLit("_FEnsureAudio")); _fDontReportInitFailure = fTrue; goto LFail; } if (!_FEnsureVideo()) { _FGenericError(PszLit("_FEnsureVideo")); _fDontReportInitFailure = fTrue; goto LFail; } _ParseCommandLine(); // If _ParseCommandLine doesn't set _stnProduct, set to 3dMovieMaker if (!_FEnsureProductNames()) { _FGenericError(PszLit("_FEnsureProductNames")); _fDontReportInitFailure = fTrue; goto LFail; } if (!_FFindMsKidsDir()) { _FGenericError(PszLit("_FFindMsKidsDir")); _fDontReportInitFailure = fTrue; goto LFail; } // Init product names for tagman & _fniProductDir & potentially _stnProduct if (!_FInitProductNames()) { // _FInitProductNames prints its own errors _fDontReportInitFailure = fTrue; goto LFail; } if (!_FOpenResourceFile()) { _FGenericError(PszLit("_FOpenResourceFile")); _fDontReportInitFailure = fTrue; goto LFail; } if (!_FReadStringTables()) { _FGenericError(PszLit("_FReadStringTables")); _fDontReportInitFailure = fTrue; goto LFail; } if (!_FEnsureDisplayResolution()) { // may call _FInitOS _FGenericError(PszLit("_FEnsureDisplayResolution")); _fDontReportInitFailure = fTrue; goto LFail; } if (!_FEnsureColorDepth()) { _FGenericError(PszLit("_FEnsureColorDepth")); _fDontReportInitFailure = fTrue; goto LFail; } if (!APP_PAR::_FInit(grfapp, grfgob, ginDef)) { // calls _FInitOS _FGenericError(PszLit("APP_PAR::_FInit")); _fDontReportInitFailure = fTrue; goto LFail; } /* Ensure default font. Do it here just so we get the error reported early. */ OnnDefVariable(); if (!_FInitKidworld()) { _FGenericError(PszLit("_FInitKidworld")); _fDontReportInitFailure = fTrue; goto LFail; } if (!_FDisplayHomeLogo()) { _FGenericError(PszLit("_FDisplayHomeLogo")); _fDontReportInitFailure = fTrue; goto LFail; } tsHomeLogo = TsCurrent(); if (!_FDetermineIfSlowCPU()) { _FGenericError(PszLit("_FDetermineIfSlowCPU")); _fDontReportInitFailure = fTrue; goto LFail; } if (!_FInitTdt()) { _FGenericError(PszLit("_FInitTdt")); _fDontReportInitFailure = fTrue; goto LFail; } if (!MTRL::FSetShadeTable(_pcfl, kctgTmap, 0)) { _FGenericError(PszLit("FSetShadeTable")); _fDontReportInitFailure = fTrue; goto LFail; } while (TsCurrent() - tsHomeLogo < kdtsHomeLogo) ; // spin until home logo has been up long enough if (!_FShowSplashScreen()) { _FGenericError(PszLit("_FShowSplashScreen")); _fDontReportInitFailure = fTrue; goto LFail; } tsSplashScreen = TsCurrent(); if (!_FPlaySplashSound()) { _FGenericError(PszLit("_FPlaySplashSound")); _fDontReportInitFailure = fTrue; goto LFail; } if (!_FGetUserName()) { _FGenericError(PszLit("_FGetUserName")); _fDontReportInitFailure = fTrue; goto LFail; } if (!_FGetUserDirectories()) { _FGenericError(PszLit("_FGetUserDirectories")); _fDontReportInitFailure = fTrue; goto LFail; } if (!_FReadUserData()) { _FGenericError(PszLit("_FReadUserData")); _fDontReportInitFailure = fTrue; goto LFail; } if (!_FInitCrm()) { _FGenericError(PszLit("_FInitCrm")); _fDontReportInitFailure = fTrue; goto LFail; } while (TsCurrent() - tsSplashScreen < kdtsSplashScreen) ; // spin until splash screen has been up long enough Pkwa()->SetMbmp(pvNil); // bring down splash screen // If the user specified a doc on the command line, go straight // to the studio. Otherwise, start the building. GetPortfolioDoc(&fniUserDoc); if (fniUserDoc.Ftg() == ftgNil) { // Startup place depends on whether this is the user's first time in. if (!FGetProp(kpridFirstTimeUser, &fFirstTimeUser)) { _FGenericError(PszLit("FGetProp: kpridFirstTimeUser")); _fDontReportInitFailure = fTrue; goto LFail; } if (!FSetProp(kpridBuildingGob, (fFirstTimeUser ? kgobCloset : kgobLogin))) { _FGenericError(PszLit("FSetProp: kpridBuildingGob")); _fDontReportInitFailure = fTrue; goto LFail; } if (!_FInitBuilding()) { _FGenericError(PszLit("_FInitBuilding")); _fDontReportInitFailure = fTrue; goto LFail; } } else { if (!FSetProp(kpridBuildingGob, kgobStudio1)) { _FGenericError(PszLit("FSetProp: kpridBuildingGob")); _fDontReportInitFailure = fTrue; goto LFail; } if (!_FInitStudio(&fniUserDoc, fFalse)) { _FGenericError(PszLit("_FInitStudio")); _fDontReportInitFailure = fTrue; goto LFail; } } EnsureInteractive(); return fTrue; LFail: _fQuit = fTrue; if (_fSwitchedResolution) { if (_FSwitch640480(fFalse)) // try to restore desktop _fSwitchedResolution = fFalse; } // _fDontReportInitFailure will be true if one of the above functions // has already posted an alert explaining why the app is shutting down. // If it's false, we put up a OOM or generic error dialog. if (!_fDontReportInitFailure) { PDLG pdlg; if (vpers->FIn(ercOomHq) || vpers->FIn(ercOomPv) || vpers->FIn(ercOomNew)) pdlg = DLG::PdlgNew(dlidInitFailedOOM, pvNil, pvNil); else pdlg = DLG::PdlgNew(dlidInitFailed, pvNil, pvNil); if (pvNil != pdlg) pdlg->IditDo(); ReleasePpo(&pdlg); } return fFalse; } /****************************************************************************** _CleanupTemp Removes any temp files leftover from a previous execution. ************************************************************ PETED ***********/ void APP::_CleanupTemp(void) { FNI fni; /* Attempt to cleanup any leftovers from a previous bad exit */ vftgTemp = kftgSocTemp; if (fni.FGetTemp()) { FTG ftgTmp = vftgTemp; FNE fne; if (fne.FInit(&fni, &ftgTmp, 1)) { bool fFlushErs = fFalse; while (fne.FNextFni(&fni)) { if (!fni.FDelete()) fFlushErs = fTrue; } if (fFlushErs) vpers->Flush(ercFniDelete); } } } /*************************************************************************** Determine if another copy of 3DMM is already running by trying to create a named semaphore. ***************************************************************************/ bool APP::_FAppAlreadyRunning(void) { AssertBaseThis(0); #ifdef WIN HANDLE hsem; STN stn; GetStnAppName(&stn); hsem = CreateSemaphore(NULL, 0, 1, stn.Psz()); if (hsem != NULL && GetLastError() == ERROR_ALREADY_EXISTS) { CloseHandle(hsem); return fTrue; } #endif // WIN #ifdef MAC RawRtn(); #endif // MAC return fFalse; } /*************************************************************************** Try to find another instance of 3DMM and bring its window to front Also, if a document was on the command line, notify the other instance ***************************************************************************/ void APP::_TryToActivateWindow(void) { AssertBaseThis(0); #ifdef WIN HWND hwnd; STN stn; FNI fniUserDoc; GetStnAppName(&stn); hwnd = FindWindow(kpszAppWndCls, stn.Psz()); if (NULL != hwnd) { SetForegroundWindow(hwnd); ShowWindow(hwnd, SW_RESTORE); // in case it was minimized _ParseCommandLine(); GetPortfolioDoc(&fniUserDoc); if (fniUserDoc.Ftg() != ftgNil) _FSendOpenDocCmd(hwnd, &fniUserDoc); // ignore failure } #endif // WIN #ifdef MAC RawRtn(); #endif // MAC } /*************************************************************************** If we're not running on at least Win95 or NT 3.51, complain and return fFalse. ***************************************************************************/ bool APP::_FEnsureOS(void) { AssertBaseThis(0); #ifdef WIN DWORD dwVersion; byte bVersionMajor; byte bVersionMinor; PDLG pdlg; dwVersion = GetVersion(); bVersionMinor = (byte)((dwVersion & 0x0000ff00) >> 8); bVersionMajor = (byte)(dwVersion & 0x000000ff); if (bVersionMajor >= 4 || (bVersionMajor == 3 && bVersionMinor >= 51)) return fTrue; // Put up an alert: OS too old pdlg = DLG::PdlgNew(dlidBadOS, pvNil, pvNil); if (pvNil == pdlg) return fFalse; pdlg->IditDo(); ReleasePpo(&pdlg); _fDontReportInitFailure = fTrue; #endif // WIN #ifdef MAC RawRtn(); #endif // MAC return fFalse; // Bad OS } /*************************************************************************** Notifies the user if there is no suitable wave-out and/or midi-out hardware. ***************************************************************************/ bool APP::_FEnsureAudio(void) { AssertBaseThis(0); #ifdef WIN long cwod; // count of wave-out devices long cmod; // count of midi-out devices bool fShowMessage; PDLG pdlg; cwod = waveOutGetNumDevs(); if (cwod <= 0) { fShowMessage = fTrue; if (!FGetSetRegKey(kszWaveOutMsgValue, &fShowMessage, size(fShowMessage), fregSetDefault | fregMachine)) { Warn("Registry query failed"); } if (fShowMessage) { // Put up an alert: no waveout pdlg = DLG::PdlgNew(dlidNoWaveOut, pvNil, pvNil); if (pvNil == pdlg) return fFalse; pdlg->IditDo(); fShowMessage = !pdlg->FGetCheck(1); // 1 is ID of checkbox ReleasePpo(&pdlg); if (!fShowMessage) { // ignore failure FGetSetRegKey(kszWaveOutMsgValue, &fShowMessage, size(fShowMessage), fregSetKey | fregMachine); } } } if (HWD_SUCCESS == wHaveWaveDevice(WAVE_FORMAT_2M08)) // 22kHz, Mono, 8bit is our minimum { if (wHaveACM()) { // audio compression manager (sound mapper) not installed wInstallComp(IC_ACM); _fDontReportInitFailure = fTrue; return fFalse; } if (wHaveACMCodec(WAVE_FORMAT_ADPCM)) { // audio codecs not installed wInstallComp(IC_ACM_ADPCM); _fDontReportInitFailure = fTrue; return fFalse; } } // have wave device cmod = midiOutGetNumDevs(); if (cmod <= 0) { fShowMessage = fTrue; if (!FGetSetRegKey(kszMidiOutMsgValue, &fShowMessage, size(fShowMessage), fregSetDefault | fregMachine)) { Warn("Registry query failed"); } if (fShowMessage) { // Put up an alert: no midiout pdlg = DLG::PdlgNew(dlidNoMidiOut, pvNil, pvNil); if (pvNil == pdlg) return fFalse; pdlg->IditDo(); fShowMessage = !pdlg->FGetCheck(1); // 1 is ID of checkbox ReleasePpo(&pdlg); if (!fShowMessage) { // ignore failure FGetSetRegKey(kszMidiOutMsgValue, &fShowMessage, size(fShowMessage), fregSetKey | fregMachine); } } } #endif // WIN #ifdef MAC RawRtn(); #endif // MAC return fTrue; } /*************************************************************************** Notifies the user if there is no suitable video playback devices ***************************************************************************/ bool APP::_FEnsureVideo(void) { if (wHaveMCI("AVIVIDEO")) { // MCI for video is not installed wInstallComp(IC_MCI_VFW); _fDontReportInitFailure = fTrue; return fFalse; } if (HIC_SUCCESS != wHaveICMCodec(MS_VIDEO1)) { // video 1 codec not installed wInstallComp(IC_ICM_VIDEO1); _fDontReportInitFailure = fTrue; return fFalse; } return fTrue; } /*************************************************************************** Returns fTrue if color depth is >= 8 bits per pixel. User is alerted if depth is less than 8, and function fails. User is warned if depth is greater than 8, unless he has clicked the "don't show this messsage again" in the dialog before. ***************************************************************************/ bool APP::_FEnsureColorDepth(void) { AssertBaseThis(0); #ifdef WIN HDC hdc; long cbitPixel; PDLG pdlg; bool fShowMessage; bool fDontShowAgain = fFalse; hdc = GetDC(NULL); if (NULL == hdc) return fFalse; cbitPixel = GetDeviceCaps(hdc, BITSPIXEL); ReleaseDC(NULL, hdc); if (cbitPixel < 8) { // Put up an alert: Not enough colors pdlg = DLG::PdlgNew(dlidNotEnoughColors, pvNil, pvNil); if (pvNil == pdlg) return fFalse; pdlg->IditDo(); ReleasePpo(&pdlg); _fDontReportInitFailure = fTrue; return fFalse; } /* FOONE: It's the future, we don't need to worry about running in true-color mode. if (cbitPixel > 8) { // warn user fShowMessage = fTrue; if (!FGetSetRegKey(kszGreaterThan8bppMsgValue, &fShowMessage, size(fShowMessage), fregSetDefault)) { Warn("Registry query failed"); } if (fShowMessage) { pdlg = DLG::PdlgNew(dlidTooManyColors, pvNil, pvNil); if (pvNil != pdlg) { pdlg->IditDo(); fDontShowAgain = pdlg->FGetCheck(1); // 1 is ID of checkbox } ReleasePpo(&pdlg); if (fDontShowAgain) { fShowMessage = fFalse; FGetSetRegKey(kszGreaterThan8bppMsgValue, &fShowMessage, size(fShowMessage), fregSetKey); // ignore failure } } } */ #endif // WIN #ifdef MAC RawRtn(); #endif // MAC return fTrue; } /*************************************************************************** Dialog proc for Resolution Switch dialog. Return fTrue (bring down the dialog) if kdtsMaxResSwitchDlg has passed since the dialog was created. ***************************************************************************/ bool _FDlgResSwitch(PDLG pdlg, long *pidit, void *pv) { AssertPo(pdlg, 0); AssertVarMem(pidit); AssertPvCb(pv, size(long)); long tsResize = *(long *)pv; long tsCur; if (*pidit != ivNil) { return fTrue; // Cancel or OK pressed } else { tsCur = TsCurrent(); if (tsCur - tsResize >= kdtsMaxResSwitchDlg) return fTrue; } return fFalse; } /*************************************************************************** Ensure that the screen is at the user's preferred resolution for 3DMM. If user has no registry preference, we offer to switch, try to switch, and save user's preference. Registry failures are non-fatal, but failing to create the main window causes this function to fail. When this function returns, _fRunInWindow is set correctly and the main app window *might* be created. ***************************************************************************/ bool APP::_FEnsureDisplayResolution(void) { AssertBaseThis(0); PDLG pdlg; long idit; bool fSwitchRes; bool fNoValue; long tsResize; if (_FDisplayIs640480()) { // System is already 640x480, so ignore registry and run fullscreen _fRunInWindow = fFalse; return fTrue; } if (!_FDisplaySwitchSupported()) { // System can't switch res, so ignore registry and run in a window _fRunInWindow = fTrue; return fTrue; } // See if there's a res switch preference in the registry if (!FGetSetRegKey(kszSwitchResolutionValue, &fSwitchRes, size(fSwitchRes), fregNil, &fNoValue)) { // Registry error...just run in a window _fRunInWindow = fTrue; return fTrue; } if (!fNoValue) { // User has a preference if (!fSwitchRes) { _fRunInWindow = fTrue; return fTrue; } else // try to switch res { _fRunInWindow = fFalse; if (!_FInitOS()) { // we're screwed return fFalse; } if (!_FSwitch640480(fTrue)) { _fRunInWindow = fTrue; _RebuildMainWindow(); goto LSwitchFailed; } return fTrue; } } // User doesn't have a preference yet. Do the interactive thing. #ifdef RES_SWITCH_DIALOGS pdlg = DLG::PdlgNew(dlidDesktopResizing, pvNil, pvNil); if (pvNil == pdlg) return fFalse; idit = pdlg->IditDo(); ReleasePpo(&pdlg); #else //! RES_SWITCH_DIALOGS idit = 2; // OK #endif //! RES_SWITCH_DIALOGS if (idit == 1) // cancel { _fRunInWindow = fTrue; // try to set pref to fFalse fSwitchRes = fFalse; goto LWriteReg; } _fRunInWindow = fFalse; if (!_FInitOS()) return fFalse; if (!_FSwitch640480(fTrue)) { _fRunInWindow = fTrue; _RebuildMainWindow(); goto LSwitchFailed; } tsResize = TsCurrent(); #ifdef RES_SWITCH_DIALOGS pdlg = DLG::PdlgNew(dlidDesktopResized, _FDlgResSwitch, &tsResize); idit = ivNil; // if dialog fails to come up, treat like a cancel if (pvNil != pdlg) idit = pdlg->IditDo(); ReleasePpo(&pdlg); #else //! RES_SWITCH_DIALOGS idit = 2; // OK #endif //! RES_SWITCH_DIALOGS if (idit == 1 || idit == ivNil) // cancel or timeout or dialog failure { _fSwitchedResolution = fFalse; _fRunInWindow = fTrue; _RebuildMainWindow(); if (!_FSwitch640480(fFalse)) // restore desktop resolution return fFalse; goto LSwitchFailed; } // try to set pref to fTrue fSwitchRes = fTrue; goto LWriteReg; LSwitchFailed: pdlg = DLG::PdlgNew(dlidDesktopWontResize, pvNil, pvNil); if (pvNil != pdlg) pdlg->IditDo(); ReleasePpo(&pdlg); // try to set pref to fFalse fSwitchRes = fFalse; LWriteReg: FGetSetRegKey(kszSwitchResolutionValue, &fSwitchRes, size(fSwitchRes), fregSetKey); return fTrue; } /*************************************************************************** Return whether display is currently 640x480 ***************************************************************************/ bool APP::_FDisplayIs640480(void) { #ifdef WIN return (GetSystemMetrics(SM_CXSCREEN) == 640 && GetSystemMetrics(SM_CYSCREEN) == 480); #endif // WIN #ifdef MAC RawRtn(); return fFalse; #endif // MAC } /*************************************************************************** Do OS specific initialization. ***************************************************************************/ bool APP::_FInitOS(void) { AssertBaseThis(0); #ifdef WIN long dxpWindow; long dypWindow; long xpWindow; long ypWindow; DWORD dwStyle = 0; STN stnWindowTitle; if (_fMainWindowCreated) // If someone else called _FInitOS already, return fTrue; // we can leave if (!FGetStnApp(idsWindowTitle, &stnWindowTitle)) return fFalse; // register the window classes if (vwig.hinstPrev == hNil) { WNDCLASS wcs; wcs.style = CS_BYTEALIGNCLIENT | CS_OWNDC; wcs.lpfnWndProc = _LuWndProc; wcs.cbClsExtra = 0; wcs.cbWndExtra = 0; wcs.hInstance = vwig.hinst; wcs.hIcon = LoadIcon(vwig.hinst, MAKEINTRESOURCE(IDI_APP)); wcs.hCursor = LoadCursor(NULL, IDC_ARROW); wcs.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); wcs.lpszMenuName = 0; wcs.lpszClassName = kpszAppWndCls; if (!RegisterClass(&wcs)) return fFalse; wcs.lpfnWndProc = _LuMdiWndProc; wcs.lpszClassName = PszLit("MDI"); if (!RegisterClass(&wcs)) return fFalse; } _GetWindowProps(&xpWindow, &ypWindow, &dxpWindow, &dypWindow, &dwStyle); if ((vwig.hwndApp = CreateWindow(kpszAppWndCls, stnWindowTitle.Psz(), dwStyle, xpWindow, ypWindow, dxpWindow, dypWindow, hNil, hNil, vwig.hinst, pvNil)) == hNil) { return fFalse; } if (hNil == (vwig.hdcApp = GetDC(vwig.hwndApp))) return fFalse; // set a timer, so we can idle regularly. if (SetTimer(vwig.hwndApp, 0, 1, pvNil) == 0) return fFalse; _haccel = LoadAccelerators(vwig.hinst, MIR(acidMain)); _haccelGlobal = LoadAccelerators(vwig.hinst, MIR(acidGlobal)); vwig.haccel = _haccel; ShowWindow(vwig.hwndApp, vwig.wShow); _fMainWindowCreated = fTrue; #endif // WIN #ifdef MAC RawRtn(); #endif // MAC return fTrue; } /*************************************************************************** Determine window size, position, and window style. Note that you should pass in the current dwStyle if the window already exists. If the window does not already exist, pass in 0. ***************************************************************************/ void APP::_GetWindowProps(long *pxp, long *pyp, long *pdxp, long *pdyp, DWORD *pdwStyle) { AssertBaseThis(0); AssertVarMem(pxp); AssertVarMem(pyp); AssertVarMem(pdxp); AssertVarMem(pdyp); AssertVarMem(pdwStyle); if (!_fRunInWindow) { *pdwStyle |= (WS_POPUP | WS_CLIPCHILDREN); *pdwStyle &= ~(WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX); *pxp = 0; *pyp = 0; *pdxp = GetSystemMetrics(SM_CXSCREEN); *pdyp = GetSystemMetrics(SM_CYSCREEN); } else { RCS rcs; *pdwStyle |= (WS_OVERLAPPED | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX); *pdwStyle &= ~WS_POPUP; rcs.left = 0; rcs.top = 0; rcs.right = 640; rcs.bottom = 480; AdjustWindowRect(&rcs, *pdwStyle, fFalse); *pdxp = rcs.right - rcs.left; *pdyp = rcs.bottom - rcs.top; // Center window on screen // REVIEW *****: how do you adjust window appropriately for taskbar? *pxp = LwMax((GetSystemMetrics(SM_CXSCREEN) - *pdxp) / 2, 0); *pyp = LwMax((GetSystemMetrics(SM_CYSCREEN) - *pdyp) / 2, 0); } } /*************************************************************************** Change main window properties based on whether we're running in a window or fullscreen. ***************************************************************************/ void APP::_RebuildMainWindow(void) { AssertBaseThis(0); Assert(_fMainWindowCreated, 0); #ifdef WIN long dxpWindow; long dypWindow; long xpWindow; long ypWindow; DWORD dwStyle; dwStyle = GetWindowLong(vwig.hwndApp, GWL_STYLE); _GetWindowProps(&xpWindow, &ypWindow, &dxpWindow, &dypWindow, &dwStyle); SetWindowLong(vwig.hwndApp, GWL_STYLE, dwStyle); SetWindowPos(vwig.hwndApp, HWND_TOP, xpWindow, ypWindow, dxpWindow, dypWindow, 0); #endif // WIN #ifdef MAC RawRtn(); #endif // MAC } /*************************************************************************** Open "3D Movie Maker.chk" or "3DMovie.chk" ***************************************************************************/ bool APP::_FOpenResourceFile(void) { AssertBaseThis(0); AssertPo(&_fniProductDir, ffniDir); FNI fni; STN stn; fni = _fniProductDir; if (!fni.FSetLeaf(&_stnProductLong, kftgChunky) || tYes != fni.TExists()) { fni = _fniProductDir; if (!fni.FSetLeaf(&_stnProductShort, kftgChunky) || tYes != fni.TExists()) { fni.GetStnPath(&stn); _FCantFindFileDialog(&stn); // ignore failure return fFalse; } } _pcfl = CFL::PcflOpen(&fni, fcflNil); if (pvNil == _pcfl) return fFalse; return fTrue; } /*************************************************************************** Report that 3DMM can't find a file named pstnFile ***************************************************************************/ bool APP::_FCantFindFileDialog(PSTN pstnFile) { AssertBaseThis(0); AssertPo(pstnFile, 0); PDLG pdlg; pdlg = DLG::PdlgNew(dlidCantFindFile, pvNil, pvNil); if (pvNil == pdlg) return fFalse; if (!pdlg->FPutStn(1, pstnFile)) { ReleasePpo(&pdlg); return fFalse; } pdlg->IditDo(); ReleasePpo(&pdlg); _fDontReportInitFailure = fTrue; return fTrue; } /*************************************************************************** Report that 3DMM ran into a generic error ***************************************************************************/ bool APP::_FGenericError(FNI *path) { STN stn; path->GetStnPath(&stn); return _FGenericError(&stn); } /*************************************************************************** Report that 3DMM ran into a generic error ***************************************************************************/ bool APP::_FGenericError(PSTZ message) { STN stn = message; return _FGenericError(&stn); } /*************************************************************************** Report that 3DMM ran into a generic error ***************************************************************************/ bool APP::_FGenericError(PSTN message) { AssertBaseThis(0); PDLG pdlg; pdlg = DLG::PdlgNew(dlidGenericErrorBox, pvNil, pvNil); if (pvNil == pdlg) return fFalse; if (!pdlg->FPutStn(1, message)) { ReleasePpo(&pdlg); return fFalse; } pdlg->IditDo(); ReleasePpo(&pdlg); _fDontReportInitFailure = fTrue; return fTrue; } /****************************************************************************** Finds _fniUsersDir, _fniMelanieDir, and _fniUserDir. _fniUserDir is set from the registry. This function also determines if this is a first time user. ************************************************************ PETED ***********/ bool APP::_FGetUserDirectories(void) { AssertBaseThis(0); AssertPo(&_fniMsKidsDir, ffniDir); Assert(_stnUser.Cch() > 0, "need valid stnUser!"); SZ szDir; STN stn; STN stnT; STN stnUsers; bool fFirstTimeUser; // First, find the Users directory _fniUsersDir = _fniMsKidsDir; if (!FGetStnApp(idsUsersDir, &stnUsers)) return fFalse; if (!_fniUsersDir.FDownDir(&stnUsers, ffniMoveToDir)) { _fniUsersDir.GetStnPath(&stn); if (!stn.FAppendStn(&stnUsers)) return fFalse; _FCantFindFileDialog(&stn); // ignore failure return fFalse; } AssertPo(&_fniUsersDir, ffniDir); // Find Melanie's dir _fniMelanieDir = _fniUsersDir; if (!FGetStnApp(idsMelanie, &stn)) return fFalse; if (!_fniMelanieDir.FDownDir(&stn, ffniMoveToDir)) { _fniMelanieDir.GetStnPath(&stnT); if (!stnT.FAppendStn(&stn)) return fFalse; _FCantFindFileDialog(&stnT); // ignore failure return fFalse; } AssertPo(&_fniMelanieDir, ffniDir); fFirstTimeUser = fFalse; szDir[0] = chNil; if (!FGetSetRegKey(kszHomeDirValue, szDir, size(szDir), fregSetDefault | fregString)) { return fFalse; } stn.SetSz(szDir); if (stn.Cch() == 0 || !_fniUserDir.FBuildFromPath(&stn, kftgDir) || tYes != _fniUserDir.TExists()) { // Need to (find or create) and go to user's directory fFirstTimeUser = fTrue; _fniUserDir = _fniUsersDir; // Ensure that user's root directory exists if (!_fniUserDir.FDownDir(&_stnUser, ffniMoveToDir)) { if (!_fniUserDir.FDownDir(&_stnUser, ffniCreateDir | ffniMoveToDir)) return fFalse; } // Try to write path to user dir to the registry _fniUserDir.GetStnPath(&stn); stn.GetSz(szDir); FGetSetRegKey(kszHomeDirValue, szDir, CchSz(szDir) + kcchExtraSz, fregSetKey | fregString); // ignore failure } #ifdef WIN if (SetCurrentDirectory(szDir) == FALSE) return fFalse; #else //! WIN RawRtn(); #endif //! WIN AssertPo(&_fniUserDir, ffniDir); if (!FSetProp(kpridFirstTimeUser, fFirstTimeUser)) return fFalse; return fTrue; } /****************************************************************************** _FGetUserName Attempts to get the current user name. May return a default value if we get a "non-serious" error (as defined in the spec). Arguments: None Returns: fTrue if _stnUser has something usable in it on return ************************************************************ PETED ***********/ bool APP::_FGetUserName(void) { AssertBaseThis(0); #ifdef WIN bool fRet = fTrue; DWORD dwCbUser = size(SZ); SZ szT; switch (WNetGetUser(NULL, szT, &dwCbUser)) { case ERROR_EXTENDED_ERROR: { DWORD dwError; SZ szProvider; STN stnMessage; if (WNetGetLastError(&dwError, szT, size(SZ), szProvider, size(SZ)) == NO_ERROR) { STN stnFormat; if (FGetStnApp(idsWNetError, &stnFormat)) { stnMessage.FFormat(&stnFormat, szProvider, dwError, szT); TGiveAlertSz(stnMessage.Psz(), bkOk, cokExclamation); } } else Bug("Call to WNetGetLastError failed; this should never happen"); _stnUser.SetNil(); fRet = fFalse; break; } case NO_ERROR: _stnUser = szT; if (_stnUser.Cch() > 0) break; // else fall through... case ERROR_MORE_DATA: case ERROR_NO_NETWORK: case ERROR_NO_NET_OR_BAD_PATH: default: if (!FGetStnApp(idsDefaultUser, &_stnUser)) fRet = fFalse; break; } Assert(!fRet || _stnUser.Cch() > 0, "Bug in _FGetUserName"); return fRet; #else // WIN RawRtn(); return fFalse; #endif // !WIN } /****************************** The user-data structure *******************************/ struct UDAT { long rglw[kcpridUserData]; }; /*************************************************************************** Reads the "user data" from the registry and SetProp's the data onto the app ***************************************************************************/ bool APP::_FReadUserData(void) { AssertBaseThis(0); UDAT udat; long iprid; ClearPb(&udat, size(UDAT)); if (!FGetSetRegKey(kszUserDataValue, &udat, size(UDAT), fregSetDefault | fregBinary)) { return fFalse; } for (iprid = 0; iprid < kcpridUserData; iprid++) { if (!FSetProp(kpridUserDataBase + iprid, udat.rglw[iprid])) return fFalse; } return fTrue; } /*************************************************************************** Writes the "user data" from the app props to the registry ***************************************************************************/ bool APP::_FWriteUserData(void) { AssertBaseThis(0); UDAT udat; long iprid; for (iprid = 0; iprid < kcpridUserData; iprid++) { if (!FGetProp(kpridUserDataBase + iprid, &udat.rglw[iprid])) return fFalse; } if (!FGetSetRegKey(kszUserDataValue, &udat, size(UDAT), fregSetKey | fregBinary)) { return fFalse; } return fTrue; } /****************************************************************************** FGetSetRegKey Given a reg key (and option sub-key), attempts to either get or set the current value of the key. If the reg key is created on a Get (fSetKey == fFalse), the data in pvData will be used to set the default value for the key. Arguments: PSZ pszValueName -- The value name void *pvData -- pointer to buffer to read or write key into or from long cbData -- size of the buffer ulong grfreg -- flags describing what we should do bool *pfNoValue -- optional parameter, takes whether a real registry error occurred or not Returns: fTrue if all actions necessary could be performed ************************************************************ PETED ***********/ bool APP::FGetSetRegKey(PSZ pszValueName, void *pvData, long cbData, ulong grfreg, bool *pfNoValue) { AssertBaseThis(0); AssertSz(pszValueName); AssertPvCb(pvData, cbData); AssertNilOrVarMem(pfNoValue); bool fRet = fFalse; bool fSetKey, fSetDefault, fString, fBinary; fSetKey = grfreg & fregSetKey; fSetDefault = grfreg & fregSetDefault; fString = grfreg & fregString; fBinary = grfreg & fregBinary; #ifdef WIN DWORD dwDisposition; DWORD dwCbData = cbData; DWORD dwType; HKEY hkey = 0; if (RegCreateKeyEx((grfreg & fregMachine) ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER, kszSocratesKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwDisposition) != ERROR_SUCCESS) { goto LFail; } if ((dwDisposition == REG_CREATED_NEW_KEY && fSetDefault) || fSetKey) { LWriteValue: if (fBinary) { dwType = REG_BINARY; } else if (fString) { if (!fSetKey) dwCbData = CchSz((PSZ)pvData) + kcchExtraSz; else Assert(CchSz((PSZ)pvData) < cbData, "Invalid string for reg key"); dwType = REG_SZ; } else { Assert(cbData == size(DWORD), "Unknown reg key type"); dwType = REG_DWORD; } if (RegSetValueEx(hkey, pszValueName, NULL, dwType, (byte *)pvData, dwCbData) != ERROR_SUCCESS) { goto LFail; } } else { long lwRet; if ((lwRet = RegQueryValueEx(hkey, pszValueName, NULL, &dwType, (byte *)pvData, &dwCbData)) != ERROR_SUCCESS) { if (lwRet == ERROR_FILE_NOT_FOUND && fSetDefault) goto LWriteValue; /* If the caller gave us a way to differentiate a genuine registry failure from simply not having set the value yet, do so */ if (pfNoValue != pvNil) fRet = *pfNoValue = (lwRet == ERROR_FILE_NOT_FOUND); goto LFail; } Assert(dwType == (DWORD)(fString ? REG_SZ : (fBinary ? REG_BINARY : REG_DWORD)), "Invalid key type"); } if (pfNoValue != pvNil) *pfNoValue = fFalse; fRet = fTrue; LFail: if (hkey != 0) RegCloseKey(hkey); #else // WIN RawRtn(); #endif // !WIN return fRet; } /*************************************************************************** Set the palette and bring up the Microsoft Home Logo ***************************************************************************/ bool APP::_FDisplayHomeLogo(void) { AssertBaseThis(0); AssertPo(_pcfl, 0); BLCK blck; PGL pglclr; PMBMP pmbmp; short bo; short osk; if (!_pcfl->FFind(kctgColorTable, kcnoGlcrInit, &blck)) return fFalse; pglclr = GL::PglRead(&blck, &bo, &osk); if (pvNil == pglclr) return fFalse; GPT::SetActiveColors(pglclr, fpalIdentity); ReleasePpo(&pglclr); if (!_pcfl->FFind(kctgMbmp, kcnoMbmpHomeLogo, &blck)) return fFalse; pmbmp = MBMP::PmbmpRead(&blck); if (pvNil == pmbmp) return fFalse; _pkwa->SetMbmp(pmbmp); ReleasePpo(&pmbmp); UpdateMarked(); return fTrue; } /*************************************************************************** Initialize tag manager ***************************************************************************/ bool APP::_FInitProductNames(void) { AssertBaseThis(0); PGST pgst; BLCK blck; // Use kcbCacheTagm of cache per source, don't cache on CD vptagm = TAGM::PtagmNew(&_fniMsKidsDir, APP::FInsertCD, kcbCacheTagm); if (vptagm == pvNil) { _FGenericError(PszLit("_FInitProductNames: TAGM::PtagmNew")); return fFalse; } if (!_FReadTitlesFromReg(&pgst)) { _FGenericError(PszLit("_FInitProductNames: _FReadTitlesFromReg")); goto LFail; } if (!vptagm->FMergeGstSource(pgst, kboCur, koskCur)) { _FGenericError(PszLit("_FInitProductNames: FMergeGstSource")); goto LFail; } if (!_FFindProductDir(pgst)) { _FGenericError(PszLit("_FInitProductNames: _FFindProductDir")); goto LFail; } if (!vptagm->FGetSid(&_stnProductLong, &_sidProduct)) { _FGenericError(PszLit("_FInitProductNames: FGetSid")); goto LFail; } ReleasePpo(&pgst); return fTrue; LFail: ReleasePpo(&pgst); return fFalse; } /*************************************************************************** Read the sids and titles of installed 3DMovie products from the registry ***************************************************************************/ bool APP::_FReadTitlesFromReg(PGST *ppgst) { AssertBaseThis(0); AssertVarMem(ppgst); #ifdef WIN HKEY hkey = 0; DWORD dwDisposition; DWORD iValue; SZ szSid; STN stnSid; DWORD cchSid = kcchMaxSz; SZ szTitle; STN stnTitle; DWORD cchTitle = kcchMaxSz; PGST pgst; long sid; if ((pgst = GST::PgstNew(size(long))) == pvNil) goto LFail; if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, kszProductsKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwDisposition) != ERROR_SUCCESS) { Warn("Missing InstallDirectory registry entry or registry error"); _FGenericError("Missing InstallDirectory registry entry or registry error"); goto LFail; } for (iValue = 0; RegEnumValue(hkey, iValue, szSid, &cchSid, NULL, NULL, (unsigned char *)szTitle, &cchTitle) != ERROR_NO_MORE_ITEMS; iValue++) { stnSid.SetSz(szSid); if (!stnSid.FGetLw(&sid)) { Warn("Invalid registry name for Products key value"); continue; } stnTitle.SetSz(&szTitle[0]); if (!pgst->FAddStn(&stnTitle, &sid)) goto LFail; cchTitle = kcchMaxSz; cchSid = kcchMaxSz; } if (pgst->IvMac() == 0) { stnTitle.SetSz(PszLit("3D Movie Maker/3DMovie")); sid = 1; if (!pgst->FAddStn(&stnTitle, &sid)) { Warn("Failed to add fallback Title!"); goto LFail; } } #else //! WIN RawRtn(); #endif //! WIN *ppgst = pgst; return fTrue; LFail: ReleasePpo(&pgst); *ppgst = pvNil; return fFalse; } /*************************************************************************** Initialize 3-D Text ***************************************************************************/ bool APP::_FInitTdt(void) { AssertBaseThis(0); AssertPo(_pcfl, 0); PGST pgst; // set TDT action names pgst = _PgstRead(kcnoGstAction); if (pvNil == pgst) return fFalse; Assert(pgst->CbExtra() == size(long), "bad Action string table"); if (!TDT::FSetActionNames(pgst)) { ReleasePpo(&pgst); return fFalse; } ReleasePpo(&pgst); return fTrue; } /*************************************************************************** Read and byte-swap a GST from _pcfl. Assumes that extra data, if any, is a long. ***************************************************************************/ PGST APP::_PgstRead(CNO cno) { AssertBaseThis(0); AssertPo(_pcfl, 0); PGST pgst; BLCK blck; short bo; short osk; long istn; long lwExtra; if (!_pcfl->FFind(kctgGst, cno, &blck)) return pvNil; pgst = GST::PgstRead(&blck, &bo, &osk); if (pvNil == pgst) return pvNil; Assert(pgst->CbExtra() == 0 || pgst->CbExtra() == size(long), "unexpected extra size"); if (kboCur != bo && 0 != pgst->CbExtra()) { for (istn = 0; istn < pgst->IvMac(); istn++) { pgst->GetExtra(istn, &lwExtra); SwapBytesRglw(&lwExtra, 1); pgst->PutExtra(istn, &lwExtra); } } return pgst; } /*************************************************************************** Read various string tables from _pcfl ***************************************************************************/ bool APP::_FReadStringTables(void) { AssertBaseThis(0); AssertPo(_pcfl, 0); // read studio filename list _pgstStudioFiles = _PgstRead(kcnoGstStudioFiles); if (pvNil == _pgstStudioFiles) return fFalse; // read building filename list _pgstBuildingFiles = _PgstRead(kcnoGstBuildingFiles); if (pvNil == _pgstBuildingFiles) return fFalse; // read shared filename list _pgstSharedFiles = _PgstRead(kcnoGstSharedFiles); if (pvNil == _pgstSharedFiles) return fFalse; // read misc app strings _pgstApp = _PgstRead(kcnoGstApp); if (pvNil == _pgstApp) return fFalse; return fTrue; } /*************************************************************************** Initialize KWA (app kidworld) ***************************************************************************/ bool APP::_FInitKidworld(void) { AssertBaseThis(0); RC rcRel(0, 0, krelOne, krelOne); GCB gcb(CMH::HidUnique(), GOB::PgobScreen(), fgobNil, kginMark, pvNil, &rcRel); _pkwa = NewObj KWA(&gcb); if (pvNil == _pkwa) return fFalse; return fTrue; } /*************************************************************************** Show the app splash screen ***************************************************************************/ bool APP::_FShowSplashScreen(void) { AssertBaseThis(0); BLCK blck; PMBMP pmbmp; if (!_pcfl->FFind(kctgMbmp, kcnoMbmpSplash, &blck)) return fFalse; pmbmp = MBMP::PmbmpRead(&blck); if (pvNil == pmbmp) return fFalse; _pkwa->SetMbmp(pmbmp); ReleasePpo(&pmbmp); UpdateMarked(); return fTrue; } /*************************************************************************** Play the app splash sound ***************************************************************************/ bool APP::_FPlaySplashSound(void) { AssertBaseThis(0); PCRF pcrf; pcrf = CRF::PcrfNew(_pcfl, 0); if (pvNil == pcrf) return fFalse; vpsndm->SiiPlay(pcrf, kctgMidi, kcnoMidiSplash); ReleasePpo(&pcrf); return fTrue; } /*************************************************************************** Read the chunky files specified by _pgstSharedFiles, _pgstBuildingFiles and _pgstStudioFiles and create the global CRM; indices to the Building and Studio CRFs are stored in _pglicrfBuilding and _pglicrfStudio. ***************************************************************************/ bool APP::_FInitCrm(void) { AssertBaseThis(0); AssertPo(_pkwa, 0); AssertPo(_pgstSharedFiles, 0); AssertPo(_pgstBuildingFiles, 0); AssertPo(_pgstStudioFiles, 0); PSCEG psceg = pvNil; PSCPT pscpt = pvNil; _pcrmAll = CRM::PcrmNew(_pgstSharedFiles->IvMac() + _pgstBuildingFiles->IvMac() + _pgstStudioFiles->IvMac()); if (pvNil == _pcrmAll) goto LFail; _pglicrfBuilding = GL::PglNew(size(long), _pgstBuildingFiles->IvMac()); if (pvNil == _pglicrfBuilding) goto LFail; _pglicrfStudio = GL::PglNew(size(long), _pgstStudioFiles->IvMac()); if (pvNil == _pglicrfStudio) goto LFail; if (!_FAddToCrm(_pgstSharedFiles, _pcrmAll, pvNil)) goto LFail; if (!_FAddToCrm(_pgstBuildingFiles, _pcrmAll, _pglicrfBuilding)) goto LFail; if (!_FAddToCrm(_pgstStudioFiles, _pcrmAll, _pglicrfStudio)) goto LFail; // Initialize the shared util gob. psceg = _pkwa->PscegNew(_pcrmAll, _pkwa); if (pvNil == psceg) goto LFail; pscpt = (PSCPT)_pcrmAll->PbacoFetch(kctgScript, kcnoInitShared, SCPT::FReadScript); if (pvNil == pscpt) goto LFail; if (!psceg->FRunScript(pscpt)) goto LFail; ReleasePpo(&psceg); ReleasePpo(&pscpt); return fTrue; LFail: ReleasePpo(&psceg); ReleasePpo(&pscpt); return fFalse; } /*************************************************************************** Helper function for _FInitCrm. Adds the list of chunky files specified in pgstFiles to the CRM pointed to by pcrm. If pglFiles is not pvNil, it is filled in with the positions in the CRM of each of the loaded crfs. ***************************************************************************/ bool APP::_FAddToCrm(PGST pgstFiles, PCRM pcrm, PGL pglFiles) { AssertBaseThis(0); AssertPo(&_fniProductDir, ffniDir); AssertPo(pgstFiles, 0); AssertPo(pcrm, 0); AssertNilOrPo(pglFiles, 0); bool fRet = fFalse; FNI fni; STN stn; long istn; long cbCache; PCFL pcfl = pvNil; long icfl; for (istn = 0; istn < pgstFiles->IvMac(); istn++) { pgstFiles->GetStn(istn, &stn); pgstFiles->GetExtra(istn, &cbCache); #ifdef DEBUG { bool fAskForCDSav = Pkwa()->FAskForCD(); bool fFoundFile; // In debug, we look for "buildingd.chk", "sharedd.chk", etc. and // use them instead of the normal files if they exist. If they // don't exist, just use the normal files. STN stnT = stn; stnT.FAppendCh(ChLit('d')); stnT.FAppendSz(PszLit(".chk")); // REVIEW ***** Pkwa()->SetCDPrompt(fFalse); fFoundFile = Pkwa()->FFindFile(&stnT, &fni); Pkwa()->SetCDPrompt(fAskForCDSav); if (fFoundFile) { pcfl = CFL::PcflOpen(&fni, fcflNil); } else { #endif // DEBUG stn.FAppendSz(PszLit(".chk")); // REVIEW ***** if (Pkwa()->FFindFile(&stn, &fni)) pcfl = CFL::PcflOpen(&fni, fcflNil); #ifdef DEBUG } } #endif // DEBUG if (pvNil == pcfl) { if (fni.Ftg() != ftgNil) fni.GetStnPath(&stn); if (!_fDontReportInitFailure) _FCantFindFileDialog(&stn); // ignore failure goto LFail; } if (!pcrm->FAddCfl(pcfl, cbCache, &icfl)) goto LFail; ReleasePpo(&pcfl); if (pglFiles != pvNil && !pglFiles->FAdd(&icfl)) goto LFail; } fRet = fTrue; LFail: if (!fRet) ReleasePpo(&pcfl); return fRet; } /*************************************************************************** Initialize and start the building script ***************************************************************************/ bool APP::_FInitBuilding(void) { AssertBaseThis(0); bool fRet = fFalse; long i; long cbCache; long iv; PCRF pcrfT; PSCEG psceg = pvNil; PSCPT pscpt = pvNil; BeginLongOp(); psceg = _pkwa->PscegNew(_pcrmAll, _pkwa); if (pvNil == psceg) goto LFail; pscpt = (PSCPT)_pcrmAll->PbacoFetch(kctgScript, kcnoStartApp, SCPT::FReadScript); if (pvNil == pscpt) goto LFail; if (!psceg->FRunScript(pscpt)) goto LFail; // Up the cache limits of the building crfs in the global crm. // Assumption: since the files were added to the crm in the order they // appear in _pgstBuilding, I can get the cache amounts from there. for (i = 0; i < _pglicrfBuilding->IvMac(); i++) { _pgstBuildingFiles->GetExtra(i, &cbCache); _pglicrfBuilding->Get(i, &iv); pcrfT = _pcrmAll->PcrfGet(iv); Assert(pcrfT != pvNil, "Main CRM is corrupt."); pcrfT->SetCbMax(cbCache); } // Zero the cache for the studio crfs in the global crm. for (i = 0; i < _pglicrfStudio->IvMac(); i++) { _pglicrfStudio->Get(i, &iv); pcrfT = _pcrmAll->PcrfGet(iv); Assert(pcrfT != pvNil, "Main CRM is corrupt."); pcrfT->SetCbMax(0); } fRet = fTrue; LFail: if (!fRet) EndLongOp(); ReleasePpo(&psceg); ReleasePpo(&pscpt); return fRet; } /*************************************************************************** Initialize and start the studio script ***************************************************************************/ bool APP::_FInitStudio(PFNI pfniUserDoc, bool fFailIfDocOpenFailed) { AssertBaseThis(0); long i; long cbCache; long iv; PCRF pcrfT; bool fRet = fFalse; _pstdio = STDIO::PstdioNew(khidStudio, _pcrmAll, (pfniUserDoc->Ftg() == ftgNil ? pvNil : pfniUserDoc), fFailIfDocOpenFailed); if (_pstdio == pvNil) { goto LFail; } // Up the cache limits of the studio crfs in the global crm. for (i = 0; i < _pglicrfStudio->IvMac(); i++) { _pgstStudioFiles->GetExtra(i, &cbCache); _pglicrfStudio->Get(i, &iv); pcrfT = _pcrmAll->PcrfGet(iv); Assert(pcrfT != pvNil, "Main CRM is corrupt."); pcrfT->SetCbMax(cbCache); } // Zero the cache for the building crfs in the global crm. for (i = 0; i < _pglicrfBuilding->IvMac(); i++) { _pglicrfBuilding->Get(i, &iv); pcrfT = _pcrmAll->PcrfGet(iv); Assert(pcrfT != pvNil, "Main CRM is corrupt."); pcrfT->SetCbMax(0); } fRet = fTrue; LFail: if (!fRet) PushErc(ercSocCantInitStudio); return fRet; } /*************************************************************************** Sets _fSlowCPU if this is a slow CPU. It tests the graphics, fixed-point math, and memory copying speed, and if any of them are slower than a threshold, _fSlowCPU is set. ***************************************************************************/ bool APP::_FDetermineIfSlowCPU(void) { AssertBaseThis(0); bool fSlowCPU; // If user has a saved preference, read and use that if (FGetSetRegKey(kszBetterSpeedValue, &fSlowCPU, size(bool), fregNil)) { _fSlowCPU = fSlowCPU; return fTrue; } _fSlowCPU = fFalse; #ifndef PERF_TEST return fTrue; #else // PERF_TEST PGPT pgptWnd = pvNil; PGPT pgptOff = pvNil; RC rc1; RC rc2; ulong ts; ulong dts1; ulong dts2; ulong dts3; long i; char *pch1 = pvNil; char *pch2 = pvNil; BRS r1; BRS r2; BRS r3; // Test 1: Graphics. Copy some graphics to an offscreen buffer, // then blit it back to the window 100 times. rc1.Set(0, 0, 300, 300); rc2.Set(0, 0, 300, 300); pgptWnd = GPT::PgptNewHwnd(vwig.hwndApp); if (pvNil == pgptWnd) goto LFail; pgptOff = GPT::PgptNewOffscreen(&rc1, 8); // BWLD RGB buffer is 8-bit if (pvNil == pgptOff) { goto LFail; } // BLOCK { GNV gnvWnd(pgptWnd); GNV gnvOff(pgptOff); gnvOff.CopyPixels(&gnvWnd, &rc1, &rc1); ts = TsCurrent(); for (i = 0; i < 100; i++) gnvWnd.CopyPixels(&gnvOff, &rc1, &rc2); dts1 = TsCurrent() - ts; } ReleasePpo(&pgptWnd); ReleasePpo(&pgptOff); // Test 2: Math. Do 200,000 fixed-point adds and multiplies r1 = BR_SCALAR(1.12); // arbitrary number r2 = BR_SCALAR(3.14159); // arbitrary number r3 = rZero; ts = TsCurrent(); for (i = 0; i < 200000; i++) { r2 = BrsMul(r1, r2); r3 = BrsAdd(r2, r3); } dts2 = TsCurrent() - ts; // Test 3: Copying. Copy a 50,000 byte block 200 times. if (!FAllocPv((void **)&pch1, 50000, mprNormal, fmemClear)) goto LFail; if (!FAllocPv((void **)&pch2, 50000, mprNormal, fmemClear)) goto LFail; ts = TsCurrent(); for (i = 0; i < 200; i++) CopyPb(pch1, pch2, 50000); dts3 = TsCurrent() - ts; FreePpv((void **)&pch1); FreePpv((void **)&pch2); if (dts1 > 700 || dts2 > 200 || dts3 > 500) _fSlowCPU = fTrue; return fTrue; LFail: ReleasePpo(&pgptWnd); ReleasePpo(&pgptOff); FreePpv((void **)&pch1); FreePpv((void **)&pch2); return fFalse; #endif // PERF_TEST } /*************************************************************************** Reads command line. Also sets _fniExe to path to this executable and _fniPortfolioDoc to file specified on command line (if any). Also initializes _stnProductLong and _stnProductShort. -f: fast mode -s: slow mode -p"longname": long productname -t"shortname": short productname -m: don't minimize window on deactivate ***************************************************************************/ void APP::_ParseCommandLine(void) { AssertBaseThis(0); #ifdef WIN SZ sz; STN stn; achar *pch; achar *pchT; FNI fniT; // Get path to current directory GetCurrentDirectory(kcchMaxSz, sz); stn.SetSz(sz); if (!_fniCurrentDir.FBuildFromPath(&stn, kftgDir)) Bug("Bad current directory?"); // Get path to exe GetModuleFileName(NULL, sz, kcchMaxSz); stn.SetSz(sz); if (!_fniExe.FBuildFromPath(&stn)) Bug("Bad module filename?"); pch = vwig.pszCmdLine; // first argument (app name) is useless...skip it _SkipToSpace(&pch); _SkipSpace(&pch); while (*pch != chNil) { // Look for /options or -options if (*pch == ChLit('/') || *pch == ChLit('-')) { switch (ChUpper(*(pch + 1))) { case ChLit('M'): _fDontMinimize = fTrue; break; case ChLit('S'): _fSlowCPU = fTrue; break; case ChLit('F'): _fSlowCPU = fFalse; break; case ChLit('P'): { pch += 2; // skip "-p" pchT = pch; _SkipToSpace(&pchT); // skip quotes if (*pch == ChLit('"')) _stnProductLong.SetRgch(pch + 1, pchT - pch - 2); else _stnProductLong.SetRgch(pch, pchT - pch); } break; case ChLit('T'): { pch += 2; // skip "-t" pchT = pch; _SkipToSpace(&pchT); // skip quotes if (*pch == ChLit('"')) _stnProductShort.SetRgch(pch + 1, pchT - pch - 2); else _stnProductShort.SetRgch(pch, pchT - pch); } break; default: Warn("Bad command-line switch"); break; } _SkipToSpace(&pch); _SkipSpace(&pch); } else // try to parse as fni string { // get to end of string pchT = pch + CchSz(pch); // skip quotes since FBuildFromPath can't deal if (*pch == ChLit('"')) pch++; // move pchT to begginning of file name itself while ((*pchT != '\\') && (pchT != pch)) pchT--; // pchT now points to last'\', move it forward one (only if not pch) if (*pchT == '\\') pchT++; // set STN to the path, which is the string up to the last '\' stn.SetRgch(pch, pchT - pch); // try to map to long file name if we can HANDLE hFile = pvNil; WIN32_FIND_DATA W32FindData; hFile = FindFirstFile(pch, &W32FindData); if (INVALID_HANDLE_VALUE != hFile) { // append the longfile name returned... stn.FAppendSz(W32FindData.cFileName); FindClose(hFile); } else // just use what was passed orginally... stn.SetSz(pch); // remove ending quotes since FBuildFromPath can't deal if (stn.Psz()[stn.Cch() - 1] == ChLit('\"')) stn.Delete(stn.Cch() - 1, 1); if (fniT.FBuildFromPath(&stn)) { SetPortfolioDoc(&fniT); } // move to end of string, we now assume that everything past options is the document name pch += CchSz(pch); } } #endif // WIN #ifdef MAC RawRtn(); #endif // MAC } /*************************************************************************** Make sure that _stnProductLong and _stnProductShort are initialized to non-empty strings. If _stnProductLong wasn't initialized from the command line, it and _stnProductShort are read from the app resource file. If _stnProductLong is valid and _stnProductShort is not, _stnProductShort is just set to _stnProductLong. ***************************************************************************/ bool APP::_FEnsureProductNames(void) { AssertBaseThis(0); if (_stnProductLong.Cch() == 0) { #ifdef WIN SZ sz; if (0 == LoadString(vwig.hinst, stid3DMovieNameLong, sz, kcchMaxSz)) return fFalse; _stnProductLong.SetSz(sz); if (0 == LoadString(vwig.hinst, stid3DMovieNameShort, sz, kcchMaxSz)) return fFalse; _stnProductShort.SetSz(sz); #else // MAC RawRtn(); #endif // MAC } if (_stnProductShort.Cch() == 0) _stnProductShort = _stnProductLong; return fTrue; } /*************************************************************************** Find _fniMsKidsDir ***************************************************************************/ bool APP::_FFindMsKidsDir(void) { AssertBaseThis(0); Assert(_stnProductLong.Cch() > 0 && _stnProductShort.Cch() > 0, "_stnProductLong and _stnProductShort must exist"); FNI fni; SZ szMsKidsDir; STN stn; STN stnUsers; szMsKidsDir[0] = chNil; if (!FGetSetRegKey(kszInstallDirValue, szMsKidsDir, size(SZ), fregMachine | fregString)) { Warn("Missing InstallDirectory registry entry or registry error"); } stn = szMsKidsDir; if (stn.Cch() == 0 || !_fniMsKidsDir.FBuildFromPath(&stn, kftgDir) || tYes != _fniMsKidsDir.TExists()) { // REVIEW *****: this artificial search is temp until we have a // real setup program and users have a InstallDirectory registry entry _fniMsKidsDir = _fniExe; if (!_fniMsKidsDir.FSetLeaf(pvNil, kftgDir)) return fFalse; /* FOONE: hack out search to top of DIR while (_fniMsKidsDir.FUpDir(pvNil, ffniMoveToDir)) ; */ if (!_FFindMsKidsDirAt(&_fniMsKidsDir)) { _fniMsKidsDir = _fniCurrentDir; if (!_fniMsKidsDir.FSetLeaf(pvNil, kftgDir)) return fFalse; if (!_FFindMsKidsDirAt(&_fniMsKidsDir)) { Warn("Can't find Microsoft Kids or MSKIDS."); stn = PszLit("Microsoft Kids"); _FCantFindFileDialog(&stn); // ignore failure return fFalse; } } } AssertPo(&_fniMsKidsDir, ffniDir); return fTrue; } /*************************************************************************** Finds Microsoft Kids directory at a given path. Modifies the path to descend into the directory. Returns true if successful. ***************************************************************************/ bool APP::_FFindMsKidsDirAt(FNI *path) { STN stn; /* REVIEW ***** (peted): if you check for the MSKIDS dir first, then you don't have to reset the dir string before presenting the error to the user */ stn = PszLit("Microsoft Kids"); // REVIEW ***** if (!path->FDownDir(&stn, ffniMoveToDir)) { stn = PszLit("MSKIDS"); // REVIEW ***** if (!path->FDownDir(&stn, ffniMoveToDir)) { return fFalse; } } AssertPo(path, ffniDir); return fTrue; } /*************************************************************************** Find _fniProductDir At this point, _stnProduct* is either the command line parameter or 3D Movie Maker (in the absence of a command line parameter) _FFindProductDir() locates the .chk files by checking: first, _stnProduct* directories, or second, the registry of installed products. This routine updates _stnProductLong and _stnProductShort on return. ***************************************************************************/ bool APP::_FFindProductDir(PGST pgst) { AssertBaseThis(0); AssertVarMem(pgst); STN stnLong; STN stnShort; STN stn; FNI fni; long istn; if (_FQueryProductExists(&_stnProductLong, &_stnProductShort, &_fniProductDir)) return fTrue; for (istn = 0; istn < pgst->IstnMac(); istn++) { pgst->GetStn(istn, &stn); vptagm->SplitString(&stn, &stnLong, &stnShort); if (_FQueryProductExists(&stnLong, &stnShort, &fni)) { _stnProductLong = stnLong; _stnProductShort = stnShort; _fniProductDir = fni; return fTrue; } } return fFalse; } /*************************************************************************** See if the product exists. Method: See if the directory and chunk file exist. ***************************************************************************/ bool APP::_FQueryProductExists(STN *pstnLong, STN *pstnShort, FNI *pfni) { AssertBaseThis(0); AssertVarMem(pfni); AssertPo(pstnLong, 0); AssertPo(pstnShort, 0); FNI fni; STN stn; *pfni = _fniMsKidsDir; if (!pfni->FDownDir(pstnLong, ffniMoveToDir) && !pfni->FDownDir(pstnShort, ffniMoveToDir)) { pfni->GetStnPath(&stn); if (!stn.FAppendStn(&_stnProductLong)) goto LFail; _FCantFindFileDialog(&stn); // ignore failure goto LFail; } fni = *pfni; if (fni.FSetLeaf(pstnLong, kftgChunky) && (tYes == fni.TExists())) return fTrue; fni = *pfni; if (fni.FSetLeaf(pstnShort, kftgChunky) && (tYes == fni.TExists())) return fTrue; LFail: TrashVar(pfni); return fFalse; } /*************************************************************************** Advances *ppch until it points to either the next space character or the end of the string. Exception: if the space character is surrounded by double quotes, this function skips by it. ***************************************************************************/ void APP::_SkipToSpace(char **ppch) { AssertBaseThis(0); AssertVarMem(ppch); bool fQuote = fFalse; while (**ppch != chNil && (fQuote || **ppch != kchSpace)) { if (**ppch == ChLit('"')) fQuote = !fQuote; (*ppch)++; } } /*************************************************************************** Advances *ppch to the next non-space character. ***************************************************************************/ void APP::_SkipSpace(char **ppch) { AssertBaseThis(0); AssertVarMem(ppch); while (**ppch == kchSpace) (*ppch)++; } /*************************************************************************** Socrates window was activated or deactivated. ***************************************************************************/ void APP::_Activate(bool fActive) { AssertBaseThis(0); #ifdef WIN bool fIsIconic; APP_PAR::_Activate(fActive); fIsIconic = IsIconic(vwig.hwndApp); if (!fActive) // app was just deactivated { if (_FDisplayIs640480() && !_fDontMinimize && !fIsIconic) { // Note: using SW_MINIMIZE causes a bug where alt-tabbing // from this app to a fullscreen DOS window reactivates // this app. So use SW_SHOWMINNOACTIVE instead. ShowWindow(vwig.hwndApp, SW_SHOWMINNOACTIVE); // minimize app _fMinimized = fTrue; // Note that we examine _fMinimized during the WM_DISPLAYCHANGE message // received as a result of the following res change call. Therefore the // minimize operation MUST precede the res switch. if (_fSwitchedResolution) _FSwitch640480(fFalse); // When the portfolio is displayed, the main app is automatically disabled. // This means all keyboard/mouse input directed at the main app window will // be ignored until the portfolio is finished with. If the app is minimized // here while the portfolio is displayed, then we will be left with a disabled // app window on the win95 task bar. As a result, the app will not appear // only the task window invoked by an Alt-tab, nor is it resized when // the user clicks on it in the taskbar, (even though win95 tries to // activate it). We could do the following... // (1) Do not auto-minimize the app window while the portfolio is displayed. // This is what happens on NT. // (2) Drop the portfolio here, so the app window is enabled on the taskbar. // (3) Make sure the app window is enabled now, by doing this... EnableWindow(vwig.hwndApp, TRUE); // The concern with doing this, is that when the app is later restored, // it is then enabled when it shouldn't be, as the portfolio is still // up in front of it. As it happens, this doesn't matter because the // portfolio is full screen. This means that the user can't direct any // mouse input to the main app window, and the portfolio will eat up any // keyboard input. } } #endif // WIN #ifdef MAC RawRtn(); #endif // MAC /* Don't do this stuff unless we've got the CEX set up */ if (vpcex != pvNil) { if (!fActive) { if (!vpcex->FCidIn(cidDeactivate)) { vpcex->EnqueueCid(cidDeactivate); _fDown = fTrue; _cactToggle = 0; } } else if (_pcex != pvNil) { // // End the modal wait // Assert(CactModal() > 0, "AAAAAAAAAhhhhh! - P.Floyd (Encore performance)"); // If there is no cidEndModal currently waiting to be processed, // enqueue one now. This ensures we don't get multiple cidEndModal's // processed. Note that we don't want to set _pcex null here as it // is later examined in the wndproc before we ultimately return // from FModalTopic. if (!_pcex->FCidIn(cidEndModal)) _pcex->EnqueueCid(cidEndModal); } else { vpcex->FlushCid(cidDeactivate); } } } /*************************************************************************** Deactivate the app ***************************************************************************/ bool APP::FCmdDeactivate(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); GCB gcb; PWOKS pwoksModal; GTE gte; PGOB pgob; ulong grfgte; long lwRet; CMD_MOUSE cmd; PT pt; bool fDoQuit; if (_pcex != pvNil) { Assert(CactModal() > 0, "AAAAAAAAAhhhhh! - P.Floyd"); return (fTrue); } pgob = vpcex->PgobTracking(); if ((pgob != pvNil) && (_cactToggle < 500)) { // // Toggle the mouse button // TrackMouse(pgob, &pt); ClearPb(&cmd, size(CMD_MOUSE)); cmd.pcmh = pgob; cmd.cid = cidTrackMouse; cmd.xp = pt.xp; cmd.yp = pt.yp; cmd.grfcust = GrfcustCur(); if (_fDown) { cmd.grfcust |= fcustMouse; } else { cmd.grfcust &= ~fcustMouse; } vpcex->EnqueueCmd((PCMD)&cmd); vpcex->EnqueueCid(cidDeactivate); _fDown = !_fDown; _cactToggle++; return fTrue; } gte.Init(Pkwa(), fgteNil); while (gte.FNextGob(&pgob, &grfgte, fgteNil)) { if (!(grfgte & fgtePre) || !pgob->FIs(kclsGOK)) continue; ((PGOK)pgob)->Suspend(); } if (FPushModal()) { gcb.Set(CMH::HidUnique(), Pkwa(), fgobNil, kginMark); gcb._rcRel.Set(0, 0, krelOne, krelOne); _pcex = vpcex; if (pvNil != (pwoksModal = NewObj WOKS(&gcb, Pkwa()->Pstrg()))) { vpcex->SetModalGob(pwoksModal); FModalLoop(&lwRet); // If we cannot enter modal mode, then we just won't suspend. vpcex->SetModalGob(pvNil); } ReleasePpo(&pwoksModal); _pcex = pvNil; // The user may have selected Close the app system menu while the // app was minimized on the taskbar. Depending on how Windows sent // the messages to us, (ie the processing order of activate and // close messages are not predictable it seems), we may or may not // have a cidQuit message queued for the app. If PopModal destroys // queued messages, then we would loose any Waiting cidQuit. // Therefore check if we have a queued cidQuit, and if so, requeue // it after the call to PopModal. fDoQuit = vpcex->FCidIn(cidQuit); PopModal(); if (fDoQuit) vpcex->EnqueueCid(cidQuit); } gte.Init(Pkwa(), fgteNil); while (gte.FNextGob(&pgob, &grfgte, fgteNil)) { if (!(grfgte & fgtePre) || !pgob->FIs(kclsGOK)) continue; ((PGOK)pgob)->Resume(); } return (fTrue); } /*************************************************************************** Copy pixels from an offscreen buffer (pgnvSrc, prcSrc) to the screen (pgnvDst, prcDst). This is called to move bits from an offscreen buffer to the screen during a _FastUpdate cycle. This gives us a chance to do a transition. ***************************************************************************/ void APP::_CopyPixels(PGNV pgnvSrc, RC *prcSrc, PGNV pgnvDst, RC *prcDst) { AssertBaseThis(0); AssertPo(pgnvSrc, 0); AssertVarMem(prcSrc); AssertPo(pgnvDst, 0); AssertVarMem(prcDst); PMVIE pmvie = _Pmvie(); // Get the current movie, if any PGOB pgob; RC rcDst, rcSrc, rcWorkspace; if (pmvie == pvNil || pmvie->Trans() == transNil) { APP_PAR::_CopyPixels(pgnvSrc, prcSrc, pgnvDst, prcDst); return; } Assert(prcSrc->Dyp() == prcDst->Dyp() && prcSrc->Dxp() == prcDst->Dxp(), "rc's are scaled"); // Need to do a transition, but if it's a slow transition (not a cut), // we want to do a regular copy on all the areas around the workspace, // then the slow transition on just the workspace. pgob = Pkwa()->PgobFromHid(kidWorkspace); if (pgob == pvNil || pmvie->Trans() == transCut) { pmvie->DoTrans(pgnvDst, pgnvSrc, prcDst, prcSrc); return; } // NOTE: This code assumes that the following will base rcWorkspace // in the same coordinate system as prcDst, which is always true // according to ShonK. pgob->GetRc(&rcWorkspace, cooHwnd); // Do the areas around the workspace without the transition if (prcDst->ypTop < rcWorkspace.ypTop) { rcSrc = *prcSrc; rcSrc.ypBottom = rcWorkspace.ypTop + (rcSrc.ypTop - prcDst->ypTop); rcDst = *prcDst; rcDst.ypBottom = rcWorkspace.ypTop; APP_PAR::_CopyPixels(pgnvSrc, &rcSrc, pgnvDst, &rcDst); } if (prcDst->ypBottom > rcWorkspace.ypBottom) { rcSrc = *prcSrc; rcSrc.ypTop = rcWorkspace.ypBottom + (rcSrc.ypTop - prcDst->ypTop); rcDst = *prcDst; rcDst.ypTop = rcWorkspace.ypBottom; APP_PAR::_CopyPixels(pgnvSrc, &rcSrc, pgnvDst, &rcDst); } if (prcDst->xpLeft < rcWorkspace.xpLeft) { rcSrc.ypTop = rcWorkspace.ypTop + (prcSrc->ypTop - prcDst->ypTop); rcSrc.ypBottom = rcWorkspace.ypBottom + (prcSrc->ypTop - prcDst->ypTop); rcSrc.xpLeft = prcSrc->xpLeft; rcSrc.xpRight = rcWorkspace.xpLeft + (prcSrc->xpLeft - prcDst->xpLeft); rcDst = *prcDst; rcDst.xpRight = rcWorkspace.xpLeft; rcDst.ypTop = rcWorkspace.ypTop; rcDst.ypBottom = rcWorkspace.ypBottom; APP_PAR::_CopyPixels(pgnvSrc, &rcSrc, pgnvDst, &rcDst); } if (prcDst->xpRight > rcWorkspace.xpRight) { rcSrc.ypTop = rcWorkspace.ypTop + (prcSrc->ypTop - prcDst->ypTop); rcSrc.ypBottom = rcWorkspace.ypBottom + (prcSrc->ypTop - prcDst->ypTop); rcSrc.xpLeft = rcWorkspace.xpRight + (prcSrc->xpLeft - prcDst->xpLeft); rcSrc.xpRight = prcSrc->xpRight; rcDst = *prcDst; rcDst.xpLeft = rcWorkspace.xpRight; rcDst.ypTop = rcWorkspace.ypTop; rcDst.ypBottom = rcWorkspace.ypBottom; APP_PAR::_CopyPixels(pgnvSrc, &rcSrc, pgnvDst, &rcDst); } // // Now do the workspace copy, with the transition // if (rcWorkspace.FIntersect(prcDst)) { rcSrc = rcWorkspace; rcSrc.Offset(prcSrc->xpLeft - prcDst->xpLeft, prcSrc->ypTop - prcDst->ypTop); pmvie->DoTrans(pgnvDst, pgnvSrc, &rcWorkspace, &rcSrc); } } /*************************************************************************** Load the Studio ***************************************************************************/ bool APP::FCmdLoadStudio(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); FNI fniUserDoc; CHID chidProject; long kidBuilding; PGOB pgob; PGOK pgokBackground; kidBuilding = pcmd->rglw[0]; chidProject = pcmd->rglw[1]; GetPortfolioDoc(&fniUserDoc); // might be ftgNil if (_FInitStudio(&fniUserDoc)) { // Nuke the building gob pgob = Pkwa()->PgobFromHid(kidBuilding); if (pvNil != pgob) pgob->Release(); // Start a project, if requested if (chidProject != chidNil) { pgokBackground = (PGOK)Pkwa()->PgobFromHid(kidBackground); if ((pgokBackground != pvNil) && pgokBackground->FIs(kclsGOK)) { AssertPo(pgokBackground, 0); // REVIEW *****: if this fails, what happens? pgokBackground->FRunScript((kstDefault << 16) | chidProject); } } } else { Assert(_pstdio == pvNil, "_FInitStudio didn't clean up"); vpcex->EnqueueCid(cidLoadStudioFailed); } return fTrue; } /*************************************************************************** Load the Building ***************************************************************************/ bool APP::FCmdLoadBuilding(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); if ((_pstdio != pvNil) && !_pstdio->FShutdown()) { long kgobReturn; // This attempt may have destroyed the contents of kpridBuildingGob; // Try to reset it from kpridBuildingGobT. if (FGetProp(kpridBuildingGobT, &kgobReturn)) FSetProp(kpridBuildingGob, kgobReturn); if (FGetProp(kpridBuildingStateT, &kgobReturn)) FSetProp(kpridBuildingState, kgobReturn); Warn("Shutting down Studio failed"); return fTrue; } if (_FInitBuilding()) ReleasePpo(&_pstdio); return fTrue; } /*************************************************************************** Exit the studio ***************************************************************************/ bool APP::FCmdExitStudio(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); tribool tRet; STN stnBackup; // Now query the user to find whether they want to go to the // building or to exit the app completely. if (!FGetStnApp(idsExitStudio, &stnBackup)) return fTrue; tRet = TModal(vpapp->PcrmAll(), ktpcQueryExitStudio, &stnBackup, bkYesNoCancel); // Take more action if the user did not hit cancel. if (tRet != tMaybe) { // Save the current movie if necessary. if ((_pstdio != pvNil) && !_pstdio->FShutdown(tRet == tYes)) return fTrue; // Either go to the building, or leave the app. if (tRet == tYes) { // Go to the building. if (_FInitBuilding()) ReleasePpo(&_pstdio); } else if (tRet == tNo) { // User wants to quit. We have have any dirty doc already by now. // Note that APP::Quit() doesn't release _pstdio when we quit so // we don't need to do it here either. _fQuit = fTrue; } } return fTrue; } /*************************************************************************** Load the Theater ***************************************************************************/ bool APP::FCmdTheaterOpen(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); long kidParent; kidParent = pcmd->rglw[0]; if (pvNil != _ptatr) { Bug("You forgot to close the last TATR!"); AssertPo(_ptatr, 0); return fTrue; } _ptatr = TATR::PtatrNew(kidParent); // Let the script know whether the open succeeded or failed vpcex->EnqueueCid(cidTheaterOpenCompleted, pvNil, pvNil, (pvNil != _ptatr)); return fTrue; } /*************************************************************************** Close the Theater ***************************************************************************/ bool APP::FCmdTheaterClose(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); AssertPo(_ptatr, 0); ReleasePpo(&_ptatr); return fTrue; } /*************************************************************************** Clear the portfolio doc ***************************************************************************/ bool APP::FCmdPortfolioClear(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); _fniPortfolioDoc.SetNil(); return fTrue; } /*************************************************************************** Display the customized open file common dlg. ***************************************************************************/ bool APP::FCmdPortfolioOpen(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); FNI fni; bool fOKed; long idsTitle, idsFilterLabel, idsFilterExt; FNI fniUsersDir; PFNI pfni; ulong grfPrevType; CNO cnoWave = cnoNil; // Set up strings specific to this use of the portfolio. switch (pcmd->rglw[0]) { case kpfPortOpenMovie: idsTitle = idsPortfOpenMovieTitle; idsFilterLabel = idsPortfMovieFilterLabel; idsFilterExt = idsPortfMovieFilterExt; grfPrevType = fpfPortPrevMovie; cnoWave = kwavPortOpenMovie; break; case kpfPortOpenSound: // Only display extensions appropriate to the type of sound being imported. idsTitle = idsPortfOpenSoundTitle; idsFilterLabel = idsPortfSoundFilterLabel; if (pcmd->rglw[1] == kidMidiGlass) idsFilterExt = idsPortfSoundMidiFilterExt; else idsFilterExt = idsPortfSoundWaveFilterExt; grfPrevType = fpfPortPrevMovie | fpfPortPrevSound; cnoWave = kwavPortOpenSound; break; case kpfPortOpenTexture: idsTitle = idsPortfOpenTextureTitle; idsFilterLabel = idsPortfTextureFilterLabel; idsFilterExt = idsPortfTextureFilterExt; grfPrevType = fpfPortPrevTexture; // Currently no audio for open texture, because we don't open texture yet. break; default: Bug("Unrecognized portfolio open type."); return fFalse; } // Prepare to set the initial directory for the portfolio if necessary. switch (pcmd->rglw[2]) { case kpfPortDirUsers: // Initial directory will be the 'Users' directory. vapp.GetFniUsers(&fniUsersDir); pfni = &fniUsersDir; break; default: // Initial directory will be current directory. pfni = pvNil; break; } // Now display the open dlg. Script is informed of the outcome // of the portfolio from beneath FPortDisplayWithIds. fOKed = FPortDisplayWithIds(&fni, fTrue, idsFilterLabel, idsFilterExt, idsTitle, pvNil, pvNil, pfni, grfPrevType, cnoWave); if (fOKed) { // User selected a file, so store fni for later use. SetPortfolioDoc(&fni); } return fTrue; } /****************************************************************************** OnnDefVariable Retrieves the default onn for this app. Gets the name from the app's string table. ************************************************************ PETED ***********/ long APP::OnnDefVariable(void) { AssertBaseThis(0); if (_onnDefVariable == onnNil) { STN stn; if (!FGetStnApp(idsDefaultFont, &stn) || !FGetOnn(&stn, &_onnDefVariable)) { _onnDefVariable = APP_PAR::OnnDefVariable(); } } return _onnDefVariable; } /****************************************************************************** FGetOnn APP version of FGetOnn. Mainly used so that we can easily report failure to the user if the font isn't around. And no, I don't care that we'll call FGetOnn twice on failure...it's a failure case, and can stand to be slow. :) Maps the font on failure so that there's still a usable onn if the user doesn't want to mess with alternate solutions. Arguments: PSTN pstn -- The font name long *ponn -- takes the result Returns: fTrue if the original font could be found. ************************************************************ PETED ***********/ bool APP::FGetOnn(PSTN pstn, long *ponn) { AssertBaseThis(0); if (!vntl.FGetOnn(pstn, ponn)) { if (!_fFontError) { PushErc(ercSocNoDefaultFont); _fFontError = fTrue; } *ponn = vntl.OnnMapStn(pstn); return fFalse; } return fTrue; } /*************************************************************************** Return the size of memory ***************************************************************************/ void APP::MemStat(long *pdwTotalPhys, long *pdwAvailPhys) { #ifdef WIN MEMORYSTATUS ms; ms.dwLength = size(MEMORYSTATUS); GlobalMemoryStatus(&ms); if (pvNil != pdwTotalPhys) *pdwTotalPhys = ms.dwTotalPhys; if (pvNil != pdwAvailPhys) *pdwAvailPhys = ms.dwAvailPhys; #else RawRtn(); #endif //! WIN } /****************************************************************************** DypTextDef Retrieves the default dypFont for this app. Gets the font size as a string from the app's string table, then converts it to the number value. ************************************************************ PETED ***********/ long APP::DypTextDef(void) { AssertBaseThis(0); if (_dypTextDef == 0) { STN stn; if (pvNil == _pgstApp || !FGetStnApp(idsDefaultDypFont, &stn) || !stn.FGetLw(&_dypTextDef) || _dypTextDef <= 0) { Warn("DypTextDef failed"); _dypTextDef = APP_PAR::DypTextDef(); } } return _dypTextDef; } /*************************************************************************** Ask the user if they want to save changes to the given doc. ***************************************************************************/ tribool APP::TQuerySaveDoc(PDOCB pdocb, bool fForce) { AssertThis(0); AssertPo(pdocb, 0); STN stnName; long tpc; STN stnBackup; long bk; tribool tResult; pdocb->GetName(&stnName); tpc = fForce ? ktpcQuerySave : ktpcQuerySaveWithCancel; if (!FGetStnApp(idsSaveChangesBkp, &stnBackup)) stnBackup.SetNil(); bk = fForce ? bkYesNo : bkYesNoCancel; tResult = TModal(vpapp->PcrmAll(), tpc, &stnBackup, bk, kstidQuerySave, &stnName); vpcex->EnqueueCid(cidQuerySaveDocResult, pvNil, pvNil, tResult); return tResult; } /*************************************************************************** Quit routine. May or may not initiate the quit sequence (depending on user input). ***************************************************************************/ void APP::Quit(bool fForce) { AssertThis(0); bool tRet; STN stnBackup; // If we already know we have to quit, or a modal topic is already // being displayed, then do not query the user to quit here. if (_fQuit || vpappb->CactModal() > (_pcex != pvNil ? 1 : 0) || FInPortfolio()) { // Make sure the app is visible to the user. Otherwise if this // return is preventing a system shutdown and we're minimized // on the taskbar, then the user won't know why the shutdown failed. if (!_fQuit) EnsureInteractive(); return; } if (fForce) { // Force quit, don't ask the user if they want to quit. But // do ask if they want to save their documents. DOCB::FQueryCloseAll(fdocForceClose); _fQuit = fTrue; return; } // If we're minimized, user is closing app from the taskbar. Quit // without confirmation (we'll still confirm movie save if user has // a dirty doc) if (_fMinimized) { tRet = tYes; } else { if (!FGetStnApp(idsConfirmExitBkp, &stnBackup)) stnBackup.SetNil(); tRet = TModal(vpapp->PcrmAll(), ktpcQueryQuit, &stnBackup, bkYesNo); } if (tRet == tYes) { // User wants to quit, so shut down studio if necessary if (_pstdio == pvNil || _pstdio->FShutdown(fFalse)) _fQuit = fTrue; } } /*************************************************************************** Return a pointer to the current movie, if any. The movie could be in the studio, theater, or splot machine. ***************************************************************************/ PMVIE APP::_Pmvie(void) { AssertBaseThis(0); PMVIE pmvie = pvNil; PSPLOT psplot; if (_pstdio != pvNil && _pstdio->Pmvie() != pvNil) pmvie = _pstdio->Pmvie(); else if (_ptatr != pvNil && _ptatr->Pmvie() != pvNil) pmvie = _ptatr->Pmvie(); else if (Pkwa() != pvNil) { psplot = (PSPLOT)Pkwa()->PgobFromCls(kclsSPLOT); if (psplot != pvNil) pmvie = psplot->Pmvie(); } return pmvie; } /**************************************** Info dialog items (idits) ****************************************/ enum { iditOkInfo, iditProductId, iditWindowModeInfo, #ifdef DEBUG iditCactAV, #endif // DEBUG iditProductNameInfo, iditSaveChanges, iditRenderModeInfo, iditLimInfo }; #ifdef WIN /*************************************************************************** Useful function ***************************************************************************/ char *LoadGenResource(HINSTANCE hInst, LPCSTR lpResource, LPCSTR lpType) { HRSRC hResource; HGLOBAL hGbl; hResource = FindResource(hInst, lpResource, lpType); if (hResource == NULL) return (NULL); hGbl = LoadResource(hInst, hResource); return (char *)LockResource(hGbl); } #endif /*************************************************************************** Put up info dialog ***************************************************************************/ bool APP::FCmdInfo(PCMD pcmd) { AssertThis(0); PMVIE pmvie = pvNil; PDLG pdlg; long idit; bool fRunInWindowNew; STN stn; STN stnT; bool fSaveChanges; pmvie = _Pmvie(); pdlg = DLG::PdlgNew(dlidInfo, pvNil, pvNil); if (pvNil == pdlg) return fTrue; pdlg->PutRadio(iditRenderModeInfo, _fSlowCPU ? 1 : 0); GetStnAppName(&stn); #ifdef DEBUG stn.FAppendSz(PszLit(" (Debug)")); #endif // DEBUG stnT.FFormatSz(PszLit(" %d.%d.%04d"), rmj, rmm, rup); stn.FAppendStn(&stnT); pdlg->FPutStn(iditProductNameInfo, &stn); #ifdef WIN LPSTR lpszPid; char rgchPid[kcchMaxStn + 1]; lpszPid = (LPSTR)LoadGenResource(vwig.hinst, MAKEINTRESOURCE(RC_PID_NUMBER), RT_RCDATA); if (lpszPid != pvNil) { #define PID_RPC 128 #define PID_SITE (PID_RPC + 5) #define PID_SERIAL (PID_SITE + 3) #define PID_RANDOM (PID_SERIAL + 7) wsprintf(rgchPid, "%5.5s-%3.3s-%7.7s-%5.5s", lpszPid + PID_RPC, lpszPid + PID_SITE, lpszPid + PID_SERIAL, lpszPid + PID_RANDOM); stn.SetSz(rgchPid); pdlg->FPutStn(iditProductId, &stn); } #endif #ifdef DEBUG pdlg->FPutLwInEdit(iditCactAV, vcactAV); #endif // DEBUG pdlg->PutRadio(iditWindowModeInfo, _fRunInWindow ? 1 : 0); idit = pdlg->IditDo(); fSaveChanges = pdlg->FGetCheck(iditSaveChanges); if (FPure(_fSlowCPU) != FPure(pdlg->LwGetRadio(iditRenderModeInfo))) { PMVIE pmvie; _fSlowCPU = !_fSlowCPU; pmvie = _Pmvie(); if (pvNil != pmvie) { pmvie->Pbwld()->FSetHalfMode(fFalse, _fSlowCPU); pmvie->InvalViews(); } } if (fSaveChanges) { bool fSlowCPU = _fSlowCPU; FGetSetRegKey(kszBetterSpeedValue, &fSlowCPU, size(bool), fregSetKey); } fRunInWindowNew = pdlg->LwGetRadio(iditWindowModeInfo); if (FPure(_fRunInWindow) != FPure(fRunInWindowNew)) { if (!fRunInWindowNew) { // user wants to be fullscreen if (_FDisplaySwitchSupported()) { _fRunInWindow = fFalse; _RebuildMainWindow(); if (!_FSwitch640480(fTrue)) { _fRunInWindow = fTrue; _RebuildMainWindow(); } } } else { // user wants to run in a window. // Don't allow user to run in a window at 640x480 resolution. if (!_FDisplayIs640480() || _fSwitchedResolution) { _fRunInWindow = fTrue; _RebuildMainWindow(); if (_FSwitch640480(fFalse)) { _fSwitchedResolution = fFalse; } else { // back to fullscreen _fRunInWindow = fFalse; _RebuildMainWindow(); } } } } if (fSaveChanges) { bool fSwitchRes = !_fRunInWindow; FGetSetRegKey(kszSwitchResolutionValue, &fSwitchRes, size(fSwitchRes), fregSetKey); } #ifdef DEBUG { bool fEmpty; long lwT; if (pdlg->FGetLwFromEdit(iditCactAV, &lwT, &fEmpty) && !fEmpty) { if (lwT < 0) { Debugger(); } else { vcactAV = lwT; if (fSaveChanges) { DBINFO dbinfo; dbinfo.cactAV = vcactAV; AssertDo(FGetSetRegKey(PszLit("DebugSettings"), &dbinfo, size(DBINFO), fregSetKey | fregBinary), "Couldn't save current debug settings in registry"); } } } } #endif // DEBUG ReleasePpo(&pdlg); return fTrue; } #ifdef WIN #ifdef UNICODE typedef LONG(WINAPI *PFNCHDS)(LPDEVMODEW lpDevMode, DWORD dwFlags); const PSZ kpszChds = PszLit("ChangeDisplaySettingsW"); #else typedef LONG(WINAPI *PFNCHDS)(LPDEVMODEA lpDevMode, DWORD dwFlags); const PSZ kpszChds = PszLit("ChangeDisplaySettingsA"); #endif // !UNICODE #ifdef BUG1920 #ifdef UNICODE typedef BOOL(WINAPI *PFNENUM)(LPCWSTR lpszDeviceName, DWORD iModeNum, LPDEVMODEW lpDevMode); const PSZ kpszEnum = PszLit("EnumDisplaySettingsW"); #else typedef BOOL(WINAPI *PFNENUM)(LPCSTR lpszDeviceName, DWORD iModeNum, LPDEVMODEA lpDevMode); const PSZ kpszEnum = PszLit("EnumDisplaySettingsA"); #endif // !UNICODE #endif // BUG1920 #endif // WIN #ifndef DM_BITSPERPEL #define DM_BITSPERPEL 0x00040000L // from wingdi.h #define DM_PELSWIDTH 0x00080000L #define DM_PELSHEIGHT 0x00100000L #endif //! DM_BITSPERPEL #ifndef CDS_FULLSCREEN #define CDS_FULLSCREEN 4 #endif //! CDS_FULLSCREEN #ifndef DISP_CHANGE_SUCCESSFUL #define DISP_CHANGE_SUCCESSFUL 0 #endif //! DISP_CHANGE_SUCCESSFUL /*************************************************************************** Determine if display resolution switching is supported ***************************************************************************/ bool APP::_FDisplaySwitchSupported(void) { AssertBaseThis(0); #ifdef WIN DWORD dwVersion; byte bVersionMajor; dwVersion = GetVersion(); bVersionMajor = (byte)(dwVersion & 0x000000ff); // FOONE: We don't care if it's NT or not, major version 4.0 means win95 and up or NT4.0 and up. if (bVersionMajor >= 4) return fTrue; #endif // WIN #ifdef MAC RawRtn(); #endif // MAC return fFalse; // OS doesn't support res-switching } /*************************************************************************** Switch to/from 640x480x8bit video mode. It uses GetProcAddress so it can fail gracefully on systems that don't support ChangeDisplaySettings(). ***************************************************************************/ bool APP::_FSwitch640480(bool fTo640480) { AssertBaseThis(0); #ifdef WIN #ifdef BUG1920 bool fSetMode = fFalse, fSetBbp = fTrue; DWORD iModeNum; PFNENUM pfnEnum; #endif // BUG1920 HINSTANCE hLibrary; PFNCHDS pfnChds; DEVMODE devmode; long lwResult; hLibrary = LoadLibrary(PszLit("USER32.DLL")); if (0 == hLibrary) goto LFail; pfnChds = (PFNCHDS)GetProcAddress(hLibrary, kpszChds); if (pvNil == pfnChds) goto LFail; #ifdef BUG1920 pfnEnum = (PFNENUM)GetProcAddress(hLibrary, kpszEnum); if (pvNil == pfnEnum) goto LFail; #endif // BUG1920 if (fTo640480) { // Try to switch to 640x480 #ifdef BUG1920 LRetry: for (iModeNum = 0; pfnEnum(NULL, iModeNum, &devmode); iModeNum++) { if ((fSetBbp ? devmode.dmBitsPerPel != 8 : devmode.dmBitsPerPel < 8) || devmode.dmPelsWidth != 640 || devmode.dmPelsHeight != 480) { continue; } lwResult = pfnChds(&devmode, CDS_FULLSCREEN); if (lwResult == DISP_CHANGE_SUCCESSFUL) { fSetMode = fTrue; break; } } if (!fSetMode && fSetBbp) { fSetBbp = fFalse; goto LRetry; } if (fSetMode && _FDisplayIs640480()) #else // BUG1920 devmode.dmSize = size(DEVMODE); devmode.dmBitsPerPel = 8; devmode.dmPelsWidth = 640; devmode.dmPelsHeight = 480; devmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; lwResult = pfnChds(&devmode, CDS_FULLSCREEN); if (DISP_CHANGE_SUCCESSFUL != lwResult) { // try without setting the bpp devmode.dmFields &= ~DM_BITSPERPEL; lwResult = pfnChds(&devmode, CDS_FULLSCREEN); } if (DISP_CHANGE_SUCCESSFUL == lwResult && _FDisplayIs640480()) #endif // !BUG1920 { _fSwitchedResolution = fTrue; SetWindowPos(vwig.hwndApp, HWND_TOP, 0, 0, 640, 480, 0); } else { goto LFail; } } else { // Try to restore user's previous resolution lwResult = pfnChds(NULL, CDS_FULLSCREEN); if (DISP_CHANGE_SUCCESSFUL != lwResult) goto LFail; } FreeLibrary(hLibrary); return fTrue; LFail: if (0 != hLibrary) FreeLibrary(hLibrary); #endif // WIN #ifdef MAC RawRtn(); #endif // MAC return fFalse; } /*************************************************************************** Clean up routine - app is shutting down ***************************************************************************/ void APP::_CleanUp(void) { _FWriteUserData(); ReleasePpo(&_pstdio); ReleasePpo(&_ptatr); ReleasePpo(&_pcfl); ReleasePpo(&_pmvieHandoff); ReleasePpo(&_pcrmAll); ReleasePpo(&_pglicrfBuilding); ReleasePpo(&_pglicrfStudio); ReleasePpo(&_pgstBuildingFiles); ReleasePpo(&_pgstStudioFiles); ReleasePpo(&_pgstSharedFiles); ReleasePpo(&_pgstApp); ReleasePpo(&_pkwa); BWLD::CloseBRender(); APP_PAR::_CleanUp(); if (_fSwitchedResolution) _FSwitch640480(fFalse); // try to restore desktop } /*************************************************************************** Put up a modal help balloon ***************************************************************************/ tribool APP::TModal(PRCA prca, long tpc, PSTN pstnBackup, long bkBackup, long stidSubst, PSTN pstnSubst) { AssertThis(0); AssertNilOrPo(prca, 0); long lwSelect; tribool tRet; STN stn; // If app is minimized, restore it so user can see the dialog EnsureInteractive(); if (ivNil != stidSubst) { AssertPo(pstnSubst, 0); if (!Pkwa()->Pstrg()->FPut(stidSubst, pstnSubst)) return tMaybe; } if (pvNil == prca || !Pkwa()->FModalTopic(prca, tpc, &lwSelect)) { // Backup plan: use old TGiveAlertSz. if (pvNil != pstnSubst) stn.FFormat(pstnBackup, pstnSubst); else stn = *pstnBackup; tRet = TGiveAlertSz(stn.Psz(), bkBackup, cokExclamation); } else { // Help balloon appeared ok, so translate returned value into // something we can use here. lwSelect is returned as the // (1 based) index of the btn clicked, out of Yes/No/Cancel. switch (lwSelect) { case 1: tRet = tYes; break; case 2: tRet = tNo; break; case 3: tRet = tMaybe; break; default: Bug("TModal() balloon returned unrecognized selection"); tRet = tMaybe; } } if (ivNil != stidSubst) Pkwa()->Pstrg()->Delete(stidSubst); UpdateMarked(); // make sure alert is drawn over return tRet; } /*************************************************************************** Static function to prompt the user to insert the CD named pstnTitle ***************************************************************************/ bool APP::FInsertCD(PSTN pstnTitle) { AssertPo(pstnTitle, 0); STN stnBackup; bool tRet; stnBackup = PszLit("I can't find the CD '%s' Please insert it. Should I look again?"); tRet = vpapp->TModal(vpapp->PcrmAll(), ktpcQueryCD, &stnBackup, bkYesNo, kstidQueryCD, pstnTitle); /* Don't tell the user that they told us not to try again; they know that already */ if (tRet == tNo) vapp._fDontReportInitFailure = fTrue; return (tYes == tRet); } /****************************************************************************** DisplayErrors Displays any errors that happen to be on the error stack. Call this when you don't want to wait until idle time to show errors. ************************************************************ PETED ***********/ void APP::DisplayErrors(void) { AssertThis(0); long erc; STN stnMessage; if (vpers->FPop(&erc)) { STN stnErr; vpers->Clear(); // // Convert to help topic number // switch (erc) { case ercOomHq: erc = ktpcercOomHq; break; case ercOomPv: erc = ktpcercOomPv; break; case ercOomNew: erc = ktpcercOomNew; break; /* We don't have any real specific information to present the user in these cases, plus they generally shouldn't come up anyway (a more informational error should have been pushed farther up the chain of error reporters) */ case ercFilePerm: case ercFileOpen: case ercFileCreate: case ercFileSwapNames: case ercFileRename: case ercFniGeneral: case ercFniDelete: case ercFniRename: case ercFniMismatch: case ercFniDirCreate: case ercFneGeneral: case ercCflCreate: case ercCflSaveCopy: case ercSndmCantInit: case ercSndmPartialInit: case ercGfxCantDraw: case ercGfxCantSetFont: case ercGfxNoFontList: case ercGfxCantSetPalette: case ercDlgCantGetArgs: case ercDlgCantFind: case ercRtxdTooMuchText: case ercRtxdReadFailed: case ercRtxdSaveFailed: case ercCantOpenVideo: case ercMbmpCantOpenBitmap: /* In theory, these are obsolete. */ case ercSocTdtTooLong: case ercSocWaveInProblems: case ercSocCreatedUserDir: /* Display a generic error message, with the error code in it */ stnErr.FFormatSz(PszLit("%d"), erc); if (!vapp.Pkwa()->Pstrg()->FPut(kstidGenericError, &stnErr)) stnErr.SetNil(); erc = ktpcercSocGenericError; break; case ercFileGeneral: erc = ktpcercFileGeneral; break; case ercCflOpen: erc = ktpcercCflOpen; break; case ercCflSave: erc = ktpcercCflSave; break; case ercCrfCantLoad: erc = ktpcercCrfCantLoad; break; case ercFniHidden: erc = ktpcercFniHidden; break; case ercOomGdi: erc = ktpcercOomGdi; break; case ercDlgOom: erc = ktpcercDlgOom; break; case ercCantSave: erc = ktpcercCantSave; break; case ercSocSaveFailure: erc = ktpcercSocSaveFailure; break; case ercSocSceneSwitch: erc = ktpcercSocSceneSwitch; break; case ercSocSceneChop: erc = ktpcercSocSceneChop; break; case ercSocBadFile: erc = ktpcercSocBadFile; break; case ercSocNoTboxSelected: erc = ktpcercSocNoTboxSelected; break; case ercSocNoActrSelected: erc = ktpcercSocNoActrSelected; break; case ercSocNotUndoable: erc = ktpcercSocNotUndoable; break; case ercSocNoScene: erc = ktpcercSocNoScene; break; case ercSocBadVersion: erc = ktpcercSocBadVersion; break; case ercSocNothingToPaste: erc = ktpcercSocNothingToPaste; break; case ercSocBadFrameSlider: erc = ktpcercSocBadFrameSlider; break; case ercSocGotoFrameFailure: erc = ktpcercSocGotoFrameFailure; break; case ercSocDeleteBackFailure: erc = ktpcercSocDeleteBackFailure; break; case ercSocActionNotApplicable: erc = ktpcercSocActionNotApplicable; break; case ercSocCannotPasteThatHere: erc = ktpcercSocCannotPasteThatHere; break; case ercSocNoModlForChar: erc = ktpcercSocNoModlForChar; break; case ercSocNameTooLong: erc = ktpcercSocNameTooLong; break; case ercSocTboxTooSmall: erc = ktpcercSocTboxTooSmall; break; case ercSocNoThumbnails: erc = ktpcercSocNoThumbnails; break; case ercSocBadTdf: erc = ktpcercSocBadTdf; break; case ercSocNoActrMidi: erc = ktpcercSocNoActrMidi; break; case ercSocNoImportRollCall: erc = ktpcercSocNoImportRollCall; break; case ercSocNoNukeRollCall: erc = ktpcercSocNoNukeRollCall; break; case ercSocSceneSortError: erc = ktpcercSocSceneSortError; break; case ercSocCantInitSceneSort: erc = ktpcercSocCantInitSceneSort; break; case ercSocCantInitSplot: erc = ktpcercSocCantInitSplot; break; case ercSocNoWaveIn: erc = ktpcercSocNoWaveIn; break; case ercSocPortfolioFailed: erc = ktpcercSocPortfolioFailed; break; case ercSocCantInitStudio: erc = ktpcercSocCantInitStudio; break; case ercSoc3DWordCreate: erc = ktpcercSoc3DWordCreate; break; case ercSoc3DWordChange: erc = ktpcercSoc3DWordChange; break; case ercSocWaveSaveFailure: erc = ktpcercSocWaveSaveFailure; break; case ercSocNoSoundName: erc = ktpcercSocNoSoundName; break; case ercSndamWaveDeviceBusy: erc = ktpcercSndamWaveDeviceBusy; break; case ercSocNoKidSndsInMovie: erc = ktpcercSocNoKidSndsInMovie; break; case ercSocMissingMelanieDoc: erc = ktpcercSocMissingMelanieDoc; break; case ercSocCantLoadMelanieDoc: erc = ktpcercSocCantLoadMelanieDoc; break; case ercSocBadSoundFile: erc = ktpcercSocBadSoundFile; break; case ercSocBadSceneSound: erc = ktpcercSocBadSceneSound; break; case ercSocNoDefaultFont: erc = ktpcercSocNoDefaultFont; break; case ercSocCantCacheTag: erc = ktpcercSocCantCacheTag; break; case ercSocInvalidFilename: erc = ktpcercSocInvalidFilename; break; case ercSndMidiDeviceBusy: erc = ktpcercSndMidiDeviceBusy; break; case ercSocCantCopyMsnd: erc = ktpcercSocCantCopyMsnd; break; default: return; } FGetStnApp(idsOOM, &stnMessage); TModal(PcrmAll(), erc, &stnMessage, bkOk); if (stnErr.Cch() != 0) vapp.Pkwa()->Pstrg()->Delete(kstidGenericError); } } /*************************************************************************** Idle routine. Do APPB idle stuff, then report any runtime errors. ***************************************************************************/ bool APP::FCmdIdle(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); bool fFileError = fFalse; PCFL pcfl; APP_PAR::FCmdIdle(pcmd); /* Check all open chunky files for errors */ for (pcfl = CFL::PcflFirst(); pcfl != pvNil; pcfl = (PCFL)pcfl->PbllNext()) { if (pcfl->ElError() != elNil) { fFileError = fTrue; pcfl->ResetEl(); } } /* Ensure that we report *something* if there was a file error */ if (fFileError && vpers->Cerc() == 0) PushErc(ercFileGeneral); DisplayErrors(); return fTrue; } #ifdef WIN /*************************************************************************** Tell another instance of the app to open a document. ***************************************************************************/ bool APP::_FSendOpenDocCmd(HWND hwnd, PFNI pfniUserDoc) { AssertBaseThis(0); Assert(pvNil != hwnd, "bad hwnd"); AssertPo(pfniUserDoc, ffniFile); STN stnUserDoc; STN stn; FNI fniTemp; PFIL pfil = pvNil; BLCK blck; DWORD dwProcId; // Write filename to 3DMMOpen.tmp in the temp dir pfniUserDoc->GetStnPath(&stnUserDoc); if (!fniTemp.FGetTemp()) goto LFail; stn = kpszOpenFile; if (!fniTemp.FSetLeaf(&stn, kftgTemp)) goto LFail; if (tYes == fniTemp.TExists()) { // replace any existing open-doc request if (!fniTemp.FDelete()) goto LFail; } pfil = FIL::PfilCreate(&fniTemp); if (pvNil == pfil) goto LFail; if (!pfil->FSetFpMac(stnUserDoc.CbData())) goto LFail; blck.Set(pfil, 0, stnUserDoc.CbData()); if (!stnUserDoc.FWrite(&blck, 0)) goto LFail; blck.Free(); // so it doesn't reference pfil anymore ReleasePpo(&pfil); #ifdef WIN dwProcId = GetWindowThreadProcessId(hwnd, NULL); PostThreadMessage(dwProcId, WM_USER, klwOpenDoc, 0); #else RawRtn(); #endif //! WIN return fTrue; LFail: blck.Free(); // so it doesn't reference pfil anymore ReleasePpo(&pfil); return fFalse; } #endif // WIN #ifdef WIN /*************************************************************************** Process a request (from another instance of the app) to open a document ***************************************************************************/ bool APP::_FProcessOpenDocCmd(void) { AssertBaseThis(0); STN stnUserDoc; STN stn; FNI fniTemp; PFIL pfil = pvNil; FNI fniUserDoc; BLCK blck; // Find the temp file if (!fniTemp.FGetTemp()) return fFalse; stn = kpszOpenFile; if (!fniTemp.FSetLeaf(&stn, kftgTemp)) return fFalse; if (tYes != fniTemp.TExists()) { Bug("Got a ProcessOpenDocCmd but there's no temp file!"); return fFalse; } // See if we can accept open document commands now: If accelerators // are enabled, then ctrl-o is enabled, so open-document commands are // acceptable. if (_cactDisable > 0 || CactModal() > 0) goto LFail; // Read the document filename from temp file pfil = FIL::PfilOpen(&fniTemp); if (pvNil == pfil) goto LFail; blck.Set(pfil, 0, pfil->FpMac()); if (!stnUserDoc.FRead(&blck, 0)) goto LFail; blck.Free(); // so it doesn't reference pfil anymore ReleasePpo(&pfil); if (!fniUserDoc.FBuildFromPath(&stnUserDoc)) goto LFail; if (pvNil == _pstdio) { SetPortfolioDoc(&fniUserDoc); vpcex->EnqueueCid(cidLoadStudioDoc); // this will load the portfolio doc } else { // ignore failure _pstdio->FLoadMovie(&fniUserDoc); } fniTemp.FDelete(); // ignore failure return fTrue; LFail: blck.Free(); // so it doesn't reference pfil anymore ReleasePpo(&pfil); fniTemp.FDelete(); // ignore failure return fFalse; } #endif // WIN #ifdef WIN /*************************************************************************** Override standard _FGetNextEvt to catch WM_USER event. Otherwise the event will get thrown away, because the event's hwnd is nil. ***************************************************************************/ bool APP::_FGetNextEvt(PEVT pevt) { AssertThis(0); AssertVarMem(pevt); if (!APP_PAR::_FGetNextEvt(pevt)) return fFalse; if (pevt->message != WM_USER || pevt->wParam != klwOpenDoc) return fTrue; _FProcessOpenDocCmd(); // ignore failure return fFalse; // we've handled the WM_USER event } #endif // WIN /*************************************************************************** Override default _FastUpdate to optionally skip offscreen buffer ***************************************************************************/ void APP::_FastUpdate(PGOB pgob, PREGN pregnClip, ulong grfapp, PGPT pgpt) { AssertBaseThis(0); PMVIE pmvie; pmvie = _Pmvie(); if (_fOnscreenDrawing && pvNil != pmvie && pmvie->FPlaying() && pmvie->Pscen()->Nfrm() != pmvie->Pscen()->NfrmFirst()) { APP_PAR::_FastUpdate(pgob, pregnClip, grfapp | fappOnscreen, pgpt); } else { APP_PAR::_FastUpdate(pgob, pregnClip, grfapp, pgpt); } } #ifdef WIN /*************************************************************************** Override default UpdateHwnd to optionally skip offscreen buffer ***************************************************************************/ void APP::UpdateHwnd(HWND hwnd, RC *prc, ulong grfapp) { AssertBaseThis(0); // APP may not be completely valid PMVIE pmvie; pmvie = _Pmvie(); if (_fOnscreenDrawing && pvNil != pmvie && pmvie->FPlaying() && pmvie->Pscen()->Nfrm() != pmvie->Pscen()->NfrmFirst()) { APP_PAR::UpdateHwnd(hwnd, prc, grfapp | fappOnscreen); } else { APP_PAR::UpdateHwnd(hwnd, prc, grfapp); } } #endif // WIN #ifdef WIN #ifndef WM_DISPLAYCHANGE #define WM_DISPLAYCHANGE 0x007E // from winuser.h #endif // !WM_DISPLAYCHANGE /*************************************************************************** Handle Windows messages for the main app window. Return true iff the default window proc should _NOT_ be called. ***************************************************************************/ bool APP::_FFrameWndProc(HWND hwnd, uint wm, WPARAM wParam, LPARAM lw, long *plwRet) { AssertBaseThis(0); AssertVarMem(plwRet); switch (wm) { case WM_ERASEBKGND: // Tell windows that we handled the Erase so it doesn't do one. // In general we don't want to erase our background ahead of time. // This prevents AVIs from flashing. *plwRet = fTrue; return fTrue; case WM_SIZE: { bool fRet; long lwStyle; fRet = APP_PAR::_FFrameWndProc(hwnd, wm, wParam, lw, plwRet); lwStyle = GetWindowLong(hwnd, GWL_STYLE); lwStyle &= ~WS_MAXIMIZEBOX; if (wParam == SIZE_MINIMIZED) { _fMinimized = fTrue; if (vpcex != pvNil) lwStyle |= WS_SYSMENU; else lwStyle &= ~WS_SYSMENU; } else if (!_fRunInWindow) lwStyle &= ~WS_SYSMENU; SetWindowLong(hwnd, GWL_STYLE, lwStyle); if (wParam == SIZE_RESTORED) { if (_fMainWindowCreated) _RebuildMainWindow(); if (_fSwitchedResolution && _fMinimized) { if (!_FDisplayIs640480()) _FSwitch640480(fTrue); } ShowWindow(vwig.hwndApp, SW_RESTORE); // restore app window _fMinimized = fFalse; } return fRet; } case WM_DISPLAYCHANGE: // Note that we don't need to do any of this if we're closing down if (_fQuit) break; if (_FDisplayIs640480()) { _fRunInWindow = fFalse; _RebuildMainWindow(); } else { // We're not running at 640x480 resolution now. Current design is that // if we switch from 640x480 to higher while the app is minimized, the // app it to still be full screen when restored. Therefore we don't // need to change _fRunInWindow here, as that we remain the same as // before the res switch, (as will the Windows properties for the app). // All we need to is make a note that we're no longer running in the // current windows settings resolution if we're running in full screen. if (!_fRunInWindow) { _fSwitchedResolution = fTrue; // If we're not minimized then we must switch to 640x480 resolution. // Don't switch res unless we're the active app window if (!_fMinimized && GetForegroundWindow() == vwig.hwndApp) { if (!_FSwitch640480(fTrue)) _fSwitchedResolution = fFalse; } } // Call rebuild now to make sure the app window gets positioned // at the centre of the screen. Note that none of the other // window attributes will change beneath _RebuildMainWindow. if (!_fMinimized) _RebuildMainWindow(); } return fTrue; case WM_INITMENUPOPUP: { // Disable the Close menu item if we are displaying a modal topic. // The user can't exit until a modal topic is dismissed. bool fDisableClose = (vpappb->CactModal() > (_pcex != pvNil ? 1 : 0)); EnableMenuItem((HMENU)wParam, SC_CLOSE, MF_BYCOMMAND | (fDisableClose ? (MF_DISABLED | MF_GRAYED) : MF_ENABLED)); break; } } if ((_pstdio == pvNil) || (_pstdio->Pmvie() == pvNil)) { return APP_PAR::_FFrameWndProc(hwnd, wm, wParam, lw, plwRet); } switch (wm) { case WM_QUERY_EXISTS: *plwRet = _pstdio->Pmvie()->LwQueryExists(wParam, lw); return (fTrue); case WM_QUERY_LOCATION: *plwRet = _pstdio->Pmvie()->LwQueryLocation(wParam, lw); return (fTrue); case WM_SET_MOVIE_POS: *plwRet = _pstdio->Pmvie()->LwSetMoviePos(wParam, lw); return (fTrue); default: return APP_PAR::_FFrameWndProc(hwnd, wm, wParam, lw, plwRet); } } #endif // WIN /*************************************************************************** * * Returns whether or not screen savers should be allowed. * * Parameters: * None * * Returns: * fTrue - Screen savers should be allowed * fFalse - Screen savers should be blocked * **************************************************************************/ bool APP::FAllowScreenSaver(void) { AssertBaseThis(0); // Disable the screen saver if... // 1. We're going to autominimize if a screen saver starts. Otherwise // the user would be confused when they get back to the machine. // 2. We've switched resolutions, (ie we're full screen in a > 640x480 mode). // Otherwise the screen save only acts on a portion of the screen. return !_FDisplayIs640480() && !_fSwitchedResolution; } /*************************************************************************** Disable the application accelerators ***************************************************************************/ void APP::DisableAccel(void) { AssertBaseThis(0); // Gets called from destructors if (_cactDisable == 0) { #ifdef WIN _haccel = vwig.haccel; vwig.haccel = _haccelGlobal; #else RawRtn(); #endif } _cactDisable++; } /*************************************************************************** Enable the application accelerators ***************************************************************************/ void APP::EnableAccel(void) { AssertBaseThis(0); // Gets called from destructors Assert(_cactDisable > 0, "Enable called w/o a disable"); _cactDisable--; if (_cactDisable == 0) { #ifdef WIN vwig.haccel = _haccel; #else RawRtn(); #endif } } /*************************************************************************** * * Handle disable accelerator command * * Parameters: * pcmd - Pointer to the command to process. * * Returns: * fTrue if it handled the command, else fFalse. * **************************************************************************/ bool APP::FCmdDisableAccel(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); DisableAccel(); return fTrue; } /*************************************************************************** * * Handle enable accelerator command * * Parameters: * pcmd - Pointer to the command to process. * * Returns: * fTrue if it handled the command, else fFalse. * **************************************************************************/ bool APP::FCmdEnableAccel(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); EnableAccel(); return fTrue; } /****************************************************************************** FCmdInvokeSplot Invokes the splot machine. Arguments: PCMD pcmd rglw[0] -- contains the GOB id of the parent of the Splot machine rglw[1] -- contains the GOB id of the Splot machine itself Returns: fTrue always ************************************************************ PETED ***********/ bool APP::FCmdInvokeSplot(PCMD pcmd) { AssertThis(0); AssertVarMem(pcmd); PSPLOT psplot; psplot = SPLOT::PsplotNew(pcmd->rglw[0], pcmd->rglw[1], _pcrmAll); if (psplot == pvNil) PushErc(ercSocCantInitSplot); return fTrue; } /*************************************************************************** Handoff a movie to the app so it can pass it on to the studio ***************************************************************************/ void APP::HandoffMovie(PMVIE pmvie) { AssertThis(0); AssertPo(pmvie, 0); ReleasePpo(&_pmvieHandoff); _pmvieHandoff = pmvie; _pmvieHandoff->AddRef(); } /*************************************************************************** Grab the APP movie ***************************************************************************/ PMVIE APP::PmvieRetrieve(void) { AssertThis(0); PMVIE pmvie = _pmvieHandoff; _pmvieHandoff = pvNil; // Caller now owns this pointer return pmvie; } #ifdef BUG1085 /****************************************************************************** HideCurs ShowCurs PushCurs PopCurs Some simple cursor restoration functionality, for use when a modal topic comes up. Assumes that you won't try to mess with the cursor state while you've got the old cursor state pushed, and that you won't try to push the cursor state while you've already got the old cursor state pushed. ************************************************************ PETED ***********/ void APP::HideCurs(void) { AssertThis(0); Assert(_cactCursHide != ivNil, "Can't hide cursor in Push/PopCurs pair"); _cactCursHide++; APP_PAR::HideCurs(); } void APP::ShowCurs(void) { AssertThis(0); Assert(_cactCursHide > 0, "Unbalanced ShowCurs call"); _cactCursHide--; APP_PAR::ShowCurs(); } void APP::PushCurs(void) { AssertThis(0); Assert(_cactCursHide != ivNil, "Can't nest cursor restoration"); _cactCursSav = _cactCursHide; while (_cactCursHide) ShowCurs(); _cactCursHide = ivNil; } void APP::PopCurs(void) { AssertThis(0); Assert(_cactCursHide == ivNil, "Unbalanced cursor restoration"); _cactCursHide = 0; while (_cactCursHide < _cactCursSav) HideCurs(); } #endif // BUG1085 #ifdef DEBUG /*************************************************************************** Assert the validity of the APP ***************************************************************************/ void APP::AssertValid(ulong grf) { APP_PAR::AssertValid(0); AssertNilOrPo(_pstdio, 0); AssertNilOrPo(_ptatr, 0); AssertNilOrPo(_pmvieHandoff, 0); AssertPo(_pcfl, 0); AssertPo(_pgstStudioFiles, 0); AssertPo(_pgstBuildingFiles, 0); AssertPo(_pgstSharedFiles, 0); AssertPo(_pgstApp, 0); AssertPo(_pkwa, 0); AssertPo(_pgstApp, 0); AssertPo(_pcrmAll, 0); AssertPo(_pglicrfBuilding, 0); AssertPo(_pglicrfStudio, 0); AssertNilOrPo(_pcex, 0); } /*************************************************************************** Mark memory used by the APP ***************************************************************************/ void APP::MarkMem(void) { AssertThis(0); APP_PAR::MarkMem(); MarkMemObj(vptagm); MTRL::MarkShadeTable(); TDT::MarkActionNames(); MarkMemObj(_pstdio); MarkMemObj(_ptatr); MarkMemObj(_pmvieHandoff); MarkMemObj(_pcfl); MarkMemObj(_pgstStudioFiles); MarkMemObj(_pgstBuildingFiles); MarkMemObj(_pgstSharedFiles); MarkMemObj(_pgstApp); MarkMemObj(_pkwa); MarkMemObj(_pgstApp); MarkMemObj(_pcrmAll); MarkMemObj(_pglicrfBuilding); MarkMemObj(_pglicrfStudio); MarkMemObj(_pcex); } #endif // DEBUG // // // // KWA (KidWorld for App) stuff begins here // // // /*************************************************************************** KWA destructor ***************************************************************************/ KWA::~KWA(void) { ReleasePpo(&_pmbmp); } /*************************************************************************** Set the KWA's MBMP (for splash screen) ***************************************************************************/ void KWA::SetMbmp(PMBMP pmbmp) { AssertThis(0); AssertNilOrPo(pmbmp, 0); RC rc; if (pvNil != pmbmp) pmbmp->AddRef(); ReleasePpo(&_pmbmp); _pmbmp = pmbmp; GetRcVis(&rc, cooLocal); vpappb->MarkRc(&rc, this); } /*************************************************************************** Draw the KWA's MBMP, if any (for splash screen) ***************************************************************************/ void KWA::Draw(PGNV pgnv, RC *prcClip) { AssertThis(0); AssertPo(pgnv, 0); AssertVarMem(prcClip); if (pvNil != _pmbmp) pgnv->DrawMbmp(_pmbmp, 0, 0); } /*************************************************************************** Find a file given a string. ***************************************************************************/ bool KWA::FFindFile(PSTN pstnSrc, PFNI pfni) { AssertThis(0); AssertPo(pstnSrc, 0); AssertPo(pfni, 0); return vptagm->FFindFile(vapp.SidProduct(), pstnSrc, pfni, FAskForCD()); } /*************************************************************************** Do a modal help topic. ***************************************************************************/ bool KWA::FModalTopic(PRCA prca, CNO cnoTopic, long *plwRet) { AssertThis(0); AssertPo(prca, 0); AssertVarMem(plwRet); bool fRet; // Take any special action here if necessary, before the // modal help topic is displayed. (Eg, disable help keys). // Now take the default action. #ifdef BUG1085 vapp.PushCurs(); fRet = KWA_PAR::FModalTopic(prca, cnoTopic, plwRet); vapp.PopCurs(); #else fRet = KWA_PAR::FModalTopic(prca, cnoTopic, plwRet); #endif // !BUG1085 // Let script know that the modal topic has been dismissed. // This is required for the projects. vpcex->EnqueueCid(cidModalTopicClosed, 0, 0, *plwRet); return fRet; } #ifdef DEBUG /*************************************************************************** Assert the validity of the KWA ***************************************************************************/ void KWA::AssertValid(ulong grf) { KWA_PAR::AssertValid(0); AssertNilOrPo(_pmbmp, 0); } /*************************************************************************** Mark memory used by the KWA ***************************************************************************/ void KWA::MarkMem(void) { AssertThis(0); KWA_PAR::MarkMem(); MarkMemObj(_pmbmp); } #endif // DEBUG ================================================ FILE: src/studio/utest.rc ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ //Microsoft Visual C++ generated resource script. // #include "utestres.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #define APSTUDIO_HIDDEN_SYMBOLS #include "windows.h" #undef APSTUDIO_HIDDEN_SYMBOLS #include "framedef.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE DISCARDABLE BEGIN "utestres.h\0" END 2 TEXTINCLUDE DISCARDABLE BEGIN "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" "#include ""windows.h""\r\n" "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" "#include ""framedef.h""\r\n" "\0" END 3 TEXTINCLUDE DISCARDABLE BEGIN "#include ""frame.rc""\r\n" "#include ""utest.rc2""\r\n" "\0" END ///////////////////////////////////////////////////////////////////////////// #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Accelerator // acidMain ACCELERATORS DISCARDABLE BEGIN "C", cidCopy, VIRTKEY, CONTROL, NOINVERT "C", cidShiftCopy, VIRTKEY, SHIFT, CONTROL, NOINVERT "I", cidInfo, VIRTKEY, SHIFT, CONTROL, NOINVERT "M", cidMap, VIRTKEY, CONTROL, NOINVERT "N", cidNew, VIRTKEY, CONTROL, NOINVERT "O", cidOpen, VIRTKEY, CONTROL, NOINVERT "Q", cidQuit, VIRTKEY, CONTROL, NOINVERT "S", cidSave, VIRTKEY, CONTROL, NOINVERT "V", cidPaste, VIRTKEY, CONTROL, NOINVERT VK_F1, cidHelpBook, VIRTKEY, NOINVERT VK_F9, cidToggleXY, VIRTKEY, NOINVERT VK_F10, cidWriteBmps, VIRTKEY, CONTROL, NOINVERT "X", cidCut, VIRTKEY, CONTROL, NOINVERT "X", cidShiftCut, VIRTKEY, SHIFT, CONTROL, NOINVERT "Y", cidRedo, VIRTKEY, CONTROL, NOINVERT "Z", cidUndo, VIRTKEY, CONTROL, NOINVERT END acidGlobal ACCELERATORS DISCARDABLE BEGIN "I", cidInfo, VIRTKEY, SHIFT, CONTROL, NOINVERT "Q", cidQuit, VIRTKEY, CONTROL, NOINVERT END ///////////////////////////////////////////////////////////////////////////// // // Icon // IDI_APP ICON DISCARDABLE "studio\\bmp\\app.ico" IDI_DOC ICON DISCARDABLE "studio\\bmp\\doc.ico" IDI_CD ICON DISCARDABLE "studio\\bmp\\cd.ico" ///////////////////////////////////////////////////////////////////////////// // // Dialog // dlidBadOS DIALOG DISCARDABLE 0, 0, 185, 92 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Invalid Operating System Version" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDCANCEL,67,72,50,14 LTEXT "3D Movie Maker requires at least Windows95 or Windows NT version 3.51 to run.", IDC_STATIC,12,12,160,50 END dlidNotEnoughColors DIALOG DISCARDABLE 0, 0, 185, 92 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Invalid Display Settings" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDCANCEL,67,72,50,14 LTEXT "3D Movie Maker requires your display to be set to at least 256 colors. Please use your display control panel to set your display to 256 colors.", IDC_STATIC,7,10,171,46 END dlidTooManyColors DIALOG DISCARDABLE 0, 0, 185, 114 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Display Settings" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDCANCEL,67,94,50,14 CONTROL "Don't show me this message again.",IDC_CHECK1,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,9,78,165,10 LTEXT "Your display is set to more than 256 colors. 3D Movie Maker will run faster on displays configured for 256 colors. If you want maximum performance, use the Display control panel to set your display to 256 colors.", IDC_STATIC,11,10,162,65 END dlidDesktopResizing DIALOG DISCARDABLE 0, 0, 274, 133 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Desktop Size" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDOK,145,113,50,14 PUSHBUTTON "Cancel",IDCANCEL,79,113,50,14 LTEXT "3D Movie Maker will now attempt to resize your desktop. This could take a few seconds, during which your screen might flicker.", IDC_STATIC,10,8,255,23 LTEXT "If you do not want 3D Movie Maker to resize your desktop when it starts, press the Cancel button below.", IDC_STATIC,10,71,254,16 LTEXT "If your screen does not stop flickering, wait 15 seconds and your original settings will be restored.", IDC_STATIC,10,38,255,28 END dlidDesktopResized DIALOG DISCARDABLE 0, 0, 185, 119 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Display Size" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDOK,100,99,50,14 PUSHBUTTON "Cancel",IDCANCEL,34,99,50,14 LTEXT "3D Movie Maker will switch your desktop down to this size when it starts. This makes the program look better.", IDC_STATIC,10,11,166,26 LTEXT "If you do not want 3D Movie Maker to resize your desktop when it starts, press the Cancel button below.", IDC_STATIC,9,43,163,29 END dlidDesktopWontResize DIALOG DISCARDABLE 0, 0, 185, 92 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Desktop Size" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDCANCEL,67,72,50,14 LTEXT "3D Movie Maker has restored your original desktop size. It will not attempt to automatically switch resolutions again.", IDC_STATIC,9,10,165,37 END dlidInfo DIALOG DISCARDABLE 0, 0, 200, 238 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Product Info" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDCANCEL,68,222,50,14 LTEXT "Product Identification Number:",IDC_STATIC,10,40,141,8 EDITTEXT IDC_EDIT4,10,54,145,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER CONTROL "Fullscreen",IDC_RADIO4,"Button",BS_AUTORADIOBUTTON | WS_GROUP,15,87,156,10 CONTROL "Run in Window",IDC_RADIO5,"Button",BS_AUTORADIOBUTTON, 15,103,156,10 #ifdef DEBUG LTEXT "cactAV:",IDC_STATIC,123,223,27,10 EDITTEXT IDC_EDIT3,152,223,35,12,ES_AUTOHSCROLL #endif LTEXT "(c) and (p) 1995 Microsoft Corporation. All rights reserved.", IDC_STATIC,10,27,192,8 EDITTEXT IDC_EDIT2,11,6,149,13,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER GROUPBOX "Display Options",IDC_STATIC,10,74,170,49 CONTROL "Make these the default settings",IDC_CHECK1,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,10,193,170,18 GROUPBOX "Performance Options",IDC_STATIC,10,129,170,50 CONTROL "Better Quality",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON | WS_GROUP,15,145,156,10 CONTROL "Better Speed",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,15, 161,156,10 END dlidInitFailed DIALOG DISCARDABLE 0, 0, 187, 71 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Initialization Failed" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDCANCEL,68,51,50,14 LTEXT "3D Movie maker could not start. You may need to run Setup again.", IDC_STATIC,8,11,166,25 END dlidInitFailedOOM DIALOG DISCARDABLE 0, 0, 187, 95 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Out of Memory" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDCANCEL,68,75,50,14 LTEXT "3D Movie Maker could not start because there is not enough memory available.", IDC_STATIC,15,9,157,56 END dlidNoWaveOut DIALOG DISCARDABLE 0, 0, 185, 114 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Audio Settings" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDCANCEL,67,94,50,14 CONTROL "Don't show me this message again.",IDC_CHECK1,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,9,78,165,10 LTEXT "Your computer does not have the ability to play WAVE sounds. You will not hear a lot of the sounds in 3D Movie Maker including audible help and character voices.", IDC_STATIC,9,10,165,38 LTEXT "We strongly recommend using a sound card with the ability to play WAVE sounds.", IDC_STATIC,9,50,165,22 END dlidNoMidiOut DIALOG DISCARDABLE 0, 0, 185, 114 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Audio Settings" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDCANCEL,67,94,50,14 CONTROL "Don't show me this message again.",IDC_CHECK1,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,9,78,165,10 LTEXT "Your computer does not have the ability to play MIDI sounds. You will not hear a lot of the music in 3D Movie Maker.", IDC_STATIC,9,10,165,38 LTEXT "We strongly recommend using a sound card with the ability to play MIDI sounds.", IDC_STATIC,9,50,165,22 END dlidPortfolio DIALOG DISCARDABLE 0, 0, 426, 296 STYLE WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS FONT 8, "MS Sans Serif" BEGIN LTEXT "",1119,2,13,371,161,NOT WS_VISIBLE CONTROL "",IDC_PREVIEW,"Static",SS_SIMPLE,37,148,96,50 CONTROL "",IDC_BUTTON1,"Button",BS_OWNERDRAW,369,257,33,26 CONTROL "",IDC_BUTTON2,"Button",BS_OWNERDRAW,335,257,33,26 CONTROL "",IDC_BUTTON3,"Button",BS_OWNERDRAW,283,257,33,26 END dlidCantFindFile DIALOG DISCARDABLE 0, 0, 243, 95 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Can't Find File" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDCANCEL,96,75,50,14 EDITTEXT IDC_EDIT1,10,41,225,29,ES_MULTILINE | ES_READONLY | NOT WS_BORDER LTEXT "Oops. The following file or folder that we need was missing or unreadable. To fix this problem, please Exit, and then run Microsoft 3D Movie Maker Setup again. (See your jewelcase booklet for instructions.)", IDC_STATIC,10,6,225,34 END dlidGenericErrorBox DIALOG DISCARDABLE 0, 0, 243, 95 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "3D Movie Maker error" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDCANCEL,96,75,50,14 EDITTEXT IDC_EDIT1,10,41,225,29,ES_MULTILINE | ES_READONLY | NOT WS_BORDER LTEXT "3D Movie Maker ended unexpectedly:", IDC_STATIC,10,6,225,34 END dlidAbnormalExit DIALOG DISCARDABLE 0, 0, 243, 95 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Unexpected Exit" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDCANCEL,96,75,50,14 LTEXT "3D Movie Maker ended unexpectedly. Attempting to clean up.", IDC_STATIC,9,9,225,26 END ///////////////////////////////////////////////////////////////////////////// // // String Table // STRINGTABLE DISCARDABLE BEGIN stidAppName "Microsoft 3D Movie Maker" stid3DMovieNameLong "3D Movie Maker" stid3DMovieNameShort "3DMovie" stidInstallDriverWin95 "You do not have a multimedia driver needed by this application. We will now try to to install the driver for you. Once it is installed, you will need to restart the application." stidInstallDriverNT "You do not have a multimedia driver needed by this application. To install, select the drivers applet in the control panel. Press the ADD button and select the driver named above." stidInstallCmdLine "RunDll.exe setupx.dll,InstallHinfSection " //
stidSectionName "MCIWAVE" stidSectionName + 1 "MCIAVI" stidSectionName + 2 "media_acm" stidSectionName + 3 "media_acm" stidSectionName + 4 "media_icm" stidSectionName + 5 "media_icm" stidDriverName "[MCI] Sound" stidDriverName + 1 "[MCI] Microsoft Video for Windows" stidDriverName + 2 "Microsoft Audio Compression Manager" stidDriverName + 3 "Microsoft ADPCM Audio CODEC" stidDriverName + 4 "Microsoft Video 1" stidDriverName + 5 "Indeo codec by Intel" END #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // #include "frame.rc" #include "utest.rc2" ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED ================================================ FILE: src/studio/utest.rc2 ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ #include "socres.h" #include "version.h" #define stringer(x) #x // This macro converts the parameter x to a quoted literal string #define VERSIONSTR(rmj, rmm, rup) stringer(rmj) ".0." stringer(rmm) "." stringer(rup) "\0" ///////////////////////////////////////////////////////////////////////////// // // Version // VS_VERSION_INFO VERSIONINFO FILEVERSION rmj,0,rmm,rup PRODUCTVERSION rmj,0,rmm,rup FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x4L FILETYPE 0x1L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904b0" BEGIN VALUE "CompanyName", "Microsoft Corporation\0" VALUE "FileDescription", "Microsoft 3D Movie Maker\0" VALUE "FileVersion", VERSIONSTR(rmj, rmm, rup) VALUE "InternalName", "3DMovie\0" VALUE "LegalCopyright", "Copyright \251 Microsoft Corporation, 1995\0" VALUE "LegalTrademarks", "Microsoft\256 is a registered trademark of Microsoft Corporation. Windows(tm) is a trademark of Microsoft Corporation\0" VALUE "OriginalFilename", "3DMovie.exe\0" VALUE "ProductName", "3D Movie Maker\0" VALUE "ProductVersion", VERSIONSTR(rmj, rmm, rup) END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END ///////////////////////////////////////////////////////////////////////////// // // Data // RC_PID_NUMBER RCDATA LOADONCALL MOVEABLE DISCARDABLE BEGIN 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 END ================================================ FILE: src/studio/utestgst.cht ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // // TDT action names // // REVIEW: hardcoded numerical constants CHUNK (kctgGst kcnoGstAction "TDT Action Names") LONG GST(4) ITEM "At Rest" 0 ITEM "Flip Letters" 1 ITEM "Spin Letters" 2 ITEM "Cartwheel Letters" 3 ITEM "Side to Side" 4 ITEM "Rock" 5 ITEM "Back and Forth" 6 ITEM "Grow and Shrink" 7 ITEM "Flip" 8 ITEM "Spin" 9 ITEM "Cartwheel" 10 ITEM "The Wave" 11 ITEM "Hide and Appear" 12 ITEM "Walk Forward*" 13 ITEM "Hop" 14 ITEM "Stretch" 15 ENDCHUNK // // Misc app global strings // CHUNK (kctgGst kcnoGstApp "Misc. App global strings") LONG GST(4) ITEM "Microsoft 3D Movie Maker" idsWindowTitle ITEM "3D Movie Maker" idsProductLong ITEM "3DMovie" idsProductShort ITEM "My_Stuff" idsDefaultUser ITEM "Copy of" idsEngineCopyOf ITEM "A New Movie" idsEngineDefaultTitle ITEM "Comic Sans MS" idsDefaultFont ITEM "12" idsDefaultDypFont ITEM "Users" idsUsersDir ITEM "Error from net provider \"%z\": \n%x : %z" idsWNetError ITEM "Save a movie" idsPortfSaveMovieTitle ITEM "Open a movie" idsPortfOpenMovieTitle ITEM "Import a sound" idsPortfOpenSoundTitle ITEM "Import a texture" idsPortfOpenTextureTitle ITEM "Movie Files" idsPortfMovieFilterLabel ITEM "*.3mm" idsPortfMovieFilterExt ITEM "Sound Files" idsPortfSoundFilterLabel ITEM "*.mid;*.3mm" idsPortfSoundMidiFilterExt ITEM "*.wav;*.3mm" idsPortfSoundWaveFilterExt ITEM "Bitmap Files" idsPortfTextureFilterLabel ITEM "*.bmp" idsPortfTextureFilterExt ITEM "Melanie" idsMelanie ITEM "Out-of-Memory Error" idsOOM ITEM "Do you want to go to the building? Press 'No' to leave 3D Movie Maker completely" idsExitStudio ITEM "Save changes to %s?" idsSaveChangesBkp ITEM "Do you really want to leave 3D Movie Maker?" idsConfirmExitBkp ITEM "Delete sound: %s?" idsDeleteSound ITEM "Overwrite existing file: %s?" idsReplaceFile ITEM "Remove all unused user sounds from file?" idsPurgeSounds ENDCHUNK ================================================ FILE: src/studio/utestscb.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ // // movie.cpp // // Author: Sean Selitrennikoff // // Date: August, 1994 // // This file contains all functionality for movie manipulation. // #include "soc.h" ASSERTNAME // // // // BEGIN MSCB STUFF // // // RTCLASS(MSCB) BEGIN_CMD_MAP(MSCB, GOB) ON_CID_ME(cidDoScroll, MSCB::FCmdScroll, pvNil) ON_CID_ME(cidEndScroll, MSCB::FCmdScroll, pvNil) END_CMD_MAP_NIL() /**************************************************** * * Constructor for movie scroll bars. This function * is private, use PmscbNew() for public construction. * ****************************************************/ MSCB::MSCB(PMVIE pmvie, PGCB pgcb) : GOB(pgcb) { _pmvie = pmvie; } /**************************************************** * * Public constructor for movie scroll bars. * * Parameters: * pmvie - The owning movie * pgcb - The creation block for location and size * * Returns: * A pointer to the scroll bar objects, else pvNil. * ****************************************************/ PMSCB MSCB::PmscbNew(PMVIE pmvie, PGCB pgcb) { PMSCB pmscb; RC rc; GCB gcb; AssertNilOrPo(pmvie, 0); AssertVarMem(pgcb); if (pvNil == (pmscb = NewObj MSCB(pmvie, pgcb))) return pvNil; // // Frame slider // rc.Set(0, 32, 200, 48); gcb.Set(mscbhidFrame, pmscb, fgobNil, kginDefault, &rc); SCB::PscbNew(&gcb, fscbHorz, 0, 0, 0); // // Scene slider // rc.Set(250, 32, 450, 48); gcb.Set(mscbhidScene, pmscb, fgobNil, kginDefault, &rc); SCB::PscbNew(&gcb, fscbHorz, 0, 0, 0); AssertPo(pmscb, 0); return (pmscb); } /**************************************************** * * Processes scroll commands from the framework * * Parameters: * pcmd - The command to process * * Returns: * fTrue if is processed the command, else fFalse. * ****************************************************/ bool MSCB::FCmdScroll(PCMD pcmd) { long hid, val, dval; bool fUp, fPage; PSCB pscb; // // Verify that the command is for this object // hid = pcmd->rglw[0]; if ((hid != mscbhidFrame) && (hid != mscbhidScene)) { return (fFalse); } // // Get the scroll bar. // pscb = (PSCB)PgobFromHidScr(hid); if ((pscb == pvNil) || (_pmvie == pvNil)) return fTrue; // // Process the command // switch (pcmd->cid) { case cidDoScroll: if (pcmd->rglw[1] == scaToVal) { return (fTrue); } else { fUp = (pcmd->rglw[1] == scaLineUp) || (pcmd->rglw[1] == scaPageUp); fPage = (pcmd->rglw[1] == scaPageUp) || (pcmd->rglw[1] == scaPageDown); dval = fPage ? 10 : 1; if (fUp) dval = -dval; val = pscb->Val() + dval; } break; case cidEndScroll: val = pcmd->rglw[1]; break; } // // pin the new value to the max and min // val = LwMin(pscb->ValMax(), LwMax(pscb->ValMin(), val)); // // Any changes? // if (val != pscb->Val() && !_pmvie->FPlaying()) { // // Process new value // pscb->SetVal(val); if (hid == mscbhidFrame) { if (!_pmvie->Pscen()->FGotoFrm(val)) { // REVIEW seanse: what to do? } } else // scene change { if (!_pmvie->FSwitchScen(val)) { // REVIEW seanse: what to do? } } _pmvie->MarkViews(); InvalRc(pvNil); } return fTrue; } /*************************************************************************** * * Draw the scroll bars. * * Parameters: * pgnv - The environment to write to. * prcClip - The clipping rectangle. * * Returns: * None. * ***************************************************************************/ void MSCB::Draw(PGNV pgnv, RC *prcClip) { AssertThis(0); AssertPo(pgnv, 0); AssertVarMem(prcClip); STN stn; RC rc; PSCB pscb; pscb = (PSCB)PgobFromHidScr(mscbhidScene); if (pscb != pvNil) { if ((_pmvie != pvNil) && (_pmvie->Pscen() != pvNil)) { pscb->SetValMinMax(_pmvie->Iscen(), 0, _pmvie->Cscen() - 1); } else { pscb->SetValMinMax(0, 0, 0); } pscb->InvalRc(pvNil); } pscb = (PSCB)PgobFromHidScr(mscbhidFrame); if (pscb != pvNil) { if ((_pmvie != pvNil) && (_pmvie->Pscen() != pvNil)) { pscb->SetValMinMax(_pmvie->Pscen()->Nfrm(), _pmvie->Pscen()->NfrmFirst(), _pmvie->Pscen()->NfrmLast()); } else { pscb->SetValMinMax(0, 0, 0); } pscb->InvalRc(pvNil); } if (_pmvie != pvNil) { float fps; fps = ((float)_pmvie->Cnfrm() * kdtsSecond) / ((float)(TsCurrent() - _pmvie->TsStart())); if (_pmvie->Pscen() != pvNil) { stn.FFormatSz(PszLit("Frame #%d "), _pmvie->Pscen()->Nfrm()); } else { stn.FFormatSz(PszLit("Frame #%d "), 0); } pgnv->DrawStn(&stn, 20, 16, kacrBlack, kacrWhite); stn.FFormatSz(PszLit("Scene #%d "), _pmvie->Iscen() + 1); pgnv->DrawStn(&stn, 270, 16, kacrBlack, kacrWhite); stn.FFormatSz(PszLit("Fps: %2d.%02d"), (int)fps, (int)((fps - (int)fps) * 100)); pgnv->DrawStn(&stn, 450, 16, kacrRed, kacrWhite); if (_pmvie->Pscen() != pvNil) { _pmvie->Pscen()->GetName(&stn); pgnv->DrawStn(&stn, 160, 0, kacrBlack, kacrWhite); } } } /**************************************************** * * Update the scroll bars * * Parameters: * None. * * Returns: * None. * ****************************************************/ void MSCB::Update() { InvalRc(pvNil, kginMark); } /**************************************************** * * Change to movie for these scroll bars * * Parameters: * pmvie - New movie * * Returns: * None. * ****************************************************/ void MSCB::SetMvie(PMVIE pmvie) { _pmvie = pmvie; } #ifdef DEBUG /**************************************************** * Mark memory used by the MSCB * * Parameters: * None. * * Returns: * None. * ****************************************************/ void MSCB::MarkMem(void) { PSCB pscb; AssertThis(0); MSCB_PAR::MarkMem(); pscb = (PSCB)PgobFromHidScr(mscbhidFrame); if (pscb != pvNil) { MarkMemObj(pscb); } pscb = (PSCB)PgobFromHidScr(mscbhidScene); if (pscb != pvNil) { MarkMemObj(pscb); } } /*************************************************************************** * Assert the validity of the MSCB * * Parameters: * grf - bit array of options. * * Returns: * None. * **************************************************************************/ void MSCB::AssertValid(ulong grf) { MSCB_PAR::AssertValid(fobjAllocated); } #endif ================================================ FILE: tools/makefile ================================================ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. #---$(SOC_ROOT)\tools\makefile !IFNDEF MAKEFILE_SOC_TOOLS MAKEFILE_SOC_TOOLS = 1 !INCLUDE $(KAUAI_ROOT)\makefile.def #TOOLS SOURCE DIRECTORY TOOLS_SRC_DIR = $(SOC_ROOT)\tools #SOC OBJ DIRECTORY SOC_OBJ_ROOT_DIR = $(SOC_ROOT)\obj SOC_OBJ_DIR = $(SOC_OBJ_ROOT_DIR)\$(BLD_TYPE_DIR) !IF "$(LOCAL_BUILD)" == "1" TARGET_DIR = !ELSE # LOCAL_BUILD TARGET_DIR = $(SOC_OBJ_DIR)^\ !ENDIF # !LOCAL_BUILD BREN_LIB = $(SOC_ROOT)\elib\$(BLD_TYPE_DIR)\bren.lib\ $(SOC_ROOT)\elib\$(BLD_TYPE_DIR)\brfmmxr.lib\ $(SOC_ROOT)\elib\$(BLD_TYPE_DIR)\brfwmxr.lib\ $(SOC_ROOT)\elib\$(BLD_TYPE_DIR)\brzbmxr.lib DKIT_LIB = $(SOC_ROOT)\dkit\libdkit.lib\ $(SOC_ROOT)\dkit\byteswap.obj\ $(SOC_ROOT)\dkit\sysglob.obj KAUAI_OBJ_GROUPS_FOR_TDFMAKE =\ $(BASE_OBJS)\ $(SCREXE_OBJS)\ $(SCRCOM_OBJS)\ $(LEXER_OBJS)\ $(GROUP_OBJS)\ $(STREAM_OBJS)\ $(FILE_OBJS) KAUAI_OBJ_GROUPS_FOR_SITOBREN =\ $(BASE_OBJS)\ $(FILE_OBJS)\ $(GROUP_OBJS)\ $(CHSE_OBJS)\ $(SCRCOM_OBJS)\ $(LEXER_OBJS)\ $(STREAM_OBJS)\ $(SCREXE_OBJS)\ $(MBMPIO_OBJS)\ $(KAUAI_OBJ_DIR)\mssio.obj KAUAI_OBJ_GROUPS_FOR_MKTMAP =\ $(BASE_OBJS)\ $(FILE_OBJS)\ $(GROUP_OBJS)\ $(MBMPIO_OBJS)\ $(KAUAI_OBJ_DIR)\mssio.obj KAUAI_OBJ_GROUPS_FOR_PBMTOBMP =\ $(BASE_OBJS)\ $(FILE_OBJS)\ $(GROUP_OBJS)\ $(MBMPIO_OBJS)\ $(GUI_OBJS)\ $(SOUND_OBJS)\ $(VIDEO_OBJS)\ $(SCREXE_OBJS)\ $(DOC_OBJS)\ $(RICHTEXT_OBJS)\ $(CTL_OBJS)\ $(STREAM_OBJS)\ $(DLG_OBJS)\ $(TEXTEDIT_OBJS)\ $(KID_OBJS)\ $(SCRCOM_OBJS)\ $(LEXER_OBJS)\ $(KAUAI_OBJ_DIR)\mssio.obj TDFMAKE_TARGETS =\ $(TARGET_DIR)tdfmake.obj SITOBREN_TARGETS =\ $(TARGET_DIR)sitobren.obj SITOBREN_DEPS =\ $(BREN_LIB)\ $(DKIT_LIB) MKTMAP_TARGETS =\ $(TARGET_DIR)mktmap.obj MKTMAP_DEPS =\ $(TARGET_DIR)engine.lib\ $(BREN_LIB) PBMTOBMP_TARGETS =\ $(TARGET_DIR)pbmtobmp.obj PBMTOBMP_DEPS =\ $(TARGET_DIR)engine.lib\ $(BREN_LIB) #-Compile rules------------------------------------------------------------- PROGRAM_DATABASE = $(TARGET_DIR)soc.pdb PRECOMPILED_HEADER = $(TARGET_DIR)soc.pch CPPEXTRA = /Zi /Fd$(PROGRAM_DATABASE) /Fp$(PRECOMPILED_HEADER) SRC_DIR=$(TOOLS_SRC_DIR) OBJ_DIR=$(SOC_OBJ_DIR) TGT_NAME=Tools !INCLUDE $(SOC_ROOT)\makefile.rul #-Targets------------------------------------------------------------------- ALL_SOCTOOLS = $(TARGET_DIR)tdfmake.exe $(TARGET_DIR)mktmap.exe $(TARGET_DIR)pbmtobmp.exe ALL_TARGETS_ROOT = $(ALL_TARGETS_ROOT) $(ALL_SOCTOOLS) CLEAN_SOCTOOLS = CLEAN_TDFMAKE CLEAN_SITOBREN CLEAN_MKTMAP CLEAN_PBMTOBMP CLEAN_TARGETS_ROOT = $(CLEAN_TARGETS_ROOT) $(CLEAN_SOCTOOLS) !IF "$(LOCAL_BUILD)" != "1" !IF "$(LOCAL_BUILD)" != "0" ALL: $(SOC_OBJ_DIR) $(ALL_SOCTOOLS) CLEAN: $(CLEAN_SOCTOOLS) ALL !ENDIF # LOCAL_BUILD != 0 $(SOC_OBJ_DIR) : @echo Making Directories $(SOC_OBJ_DIR)... if not exist $(SOC_OBJ_ROOT_DIR)/nul mkdir $(SOC_OBJ_ROOT_DIR) if not exist $(SOC_OBJ_DIR)/nul mkdir $(SOC_OBJ_DIR) !ENDIF # !LOCAL_BUILD CLEAN_TDFMAKE: @echo <nul^ DEL /q dummy.nul ) 2>nul <nul^ DEL /q dummy.nul ) 2>nul <nul^ DEL /q dummy.nul ) 2>nul <nul^ DEL /q dummy.nul ) 2>nul < #include "frame.h" #include "bren.h" #include "mssio.h" ASSERTNAME /*************************************************************************** Main routine. Returns non-zero iff there's an error. ***************************************************************************/ int __cdecl main(int cpszs, char *prgpszs[]) { FNI fniSrc, fniDst; STN stn; char chs; PTMAP ptmap = pvNil; long cfni = 0; bool fCompress = fFalse; MSSIO mssioErr(stderr); #ifdef UNICODE fprintf(stderr, "\nMicrosoft (R) Make Tmap Utility (Unicode; " __DATE__ "; " __TIME__ ")\n"); #else //! UNICODE fprintf(stderr, "\nMicrosoft (R) Make Tmap Utility (Ansi; " __DATE__ "; " __TIME__ ")\n"); #endif //! UNICODE fprintf(stderr, "Copyright (C) Microsoft Corp 1995. All rights reserved.\n\n"); for (prgpszs++; --cpszs > 0; prgpszs++) { chs = (*prgpszs)[0]; if (chs == '/' || chs == '-') { switch ((*prgpszs)[1]) { case 'c': case 'C': fCompress = fTrue; break; default: goto LUsage; } } else if (cfni >= 2) { fprintf(stderr, "Too many file names\n\n"); goto LUsage; } else { stn.SetSzs(prgpszs[0]); if (!fniDst.FBuildFromPath(&stn)) { fprintf(stderr, "Bad file name\n\n"); goto LUsage; } if (cfni == 0) fniSrc = fniDst; cfni++; } } if (cfni != 2) { fprintf(stderr, "Wrong number of file names\n\n"); goto LUsage; } ptmap = TMAP::PtmapReadNative(&fniSrc); if (pvNil == ptmap) { fprintf(stderr, "reading texture map failed\n\n"); goto LFail; } if (!ptmap->FWriteTmapChkFile(&fniDst, fCompress, &mssioErr)) goto LFail; ReleasePpo(&ptmap); FIL::ShutDown(); return 0; LUsage: // print usage fprintf(stderr, "%s", "Usage: mktmap [-c] \n\n"); LFail: ReleasePpo(&ptmap); FIL::ShutDown(); return 1; } #ifdef DEBUG bool _fEnableWarnings = fTrue; /*************************************************************************** Warning proc called by Warn() macro ***************************************************************************/ void WarnProc(PSZS pszsFile, long lwLine, PSZS pszsMessage) { if (_fEnableWarnings) { fprintf(stderr, "%s(%ld) : warning", pszsFile, lwLine); if (pszsMessage != pvNil) { fprintf(stderr, ": %s", pszsMessage); } fprintf(stderr, "\n"); } } /*************************************************************************** Returning true breaks into the debugger. ***************************************************************************/ bool FAssertProc(PSZS pszsFile, long lwLine, PSZS pszsMessage, void *pv, long cb) { fprintf(stderr, "An assert occurred: \n"); if (pszsMessage != pvNil) fprintf(stderr, " Message: %s\n", pszsMessage); if (pv != pvNil) { fprintf(stderr, " Address %x\n", pv); if (cb != 0) { fprintf(stderr, " Value: "); switch (cb) { default: { byte *pb; byte *pbLim; for (pb = (byte *)pv, pbLim = pb + cb; pb < pbLim; pb++) fprintf(stderr, "%02x", (int)*pb); } break; case 2: fprintf(stderr, "%04x", (int)*(short *)pv); break; case 4: fprintf(stderr, "%08lx", *(long *)pv); break; } printf("\n"); } } fprintf(stderr, " File: %s\n", pszsFile); fprintf(stderr, " Line: %ld\n", lwLine); return fFalse; } #endif // DEBUG ================================================ FILE: tools/pbmtobmp.cpp ================================================ #include #include "frame.h" #include ASSERTNAME void FrameMain(void) { } /*************************************************************************** Main routine. Returns non-zero iff there's an error. ***************************************************************************/ int __cdecl main(int cpszs, char *prgpszs[]) { FNI fniSrc, fniDst; FNI fniPalette; STN stn; FLO floSrc; long lwSig; BLCK blck; bool fPacked; bool fCompress = fFalse; long cfni = 0; long cfmt = vpcodmUtil->CfmtDefault(); long lwSwapped; PMBMP mbmp; PGL pglclrSrc; #ifdef UNICODE fprintf(stderr, "\nPBM to MBMP Utility (Unicode; " Debug("Debug; ") __DATE__ "; " __TIME__ ")\n"); #else //! UNICODE fprintf(stderr, "\nPBM to MBMPUtility (Ansi; " Debug("Debug; ") __DATE__ "; " __TIME__ ")\n"); #endif //! UNICODE floSrc.pfil = pvNil; if (cpszs != 4) { fprintf(stderr, "Wrong number of file names\n\n"); goto LUsage; } stn.SetSzs(prgpszs[1]); if (!fniSrc.FBuildFromPath(&stn)) { fprintf(stderr, "Bad source file name\n\n"); goto LUsage; } stn.SetSzs(prgpszs[2]); if (!fniDst.FBuildFromPath(&stn)) { fprintf(stderr, "Bad dest file name\n\n"); goto LUsage; } stn.SetSzs(prgpszs[3]); if (!fniPalette.FBuildFromPath(&stn)) { fprintf(stderr, "Bad palette file name\n\n"); goto LUsage; } if (pvNil == (floSrc.pfil = FIL::PfilOpen(&fniSrc))) { fprintf(stderr, "Can't open source file\n\n"); goto LFail; } floSrc.fp = 0; floSrc.cb = floSrc.pfil->FpMac(); if (floSrc.cb < size(long)) { fprintf(stderr, "floSrc.cb too small!\n\n"); goto LBadSrc; } if (!floSrc.FReadRgb(&lwSig, size(long), 0)) { fprintf(stderr, "Reading source file failed\n\n"); goto LFail; } lwSwapped = lwSig; SwapBytesRglw(&lwSwapped, 1); if (lwSig == klwSigPackedFile || lwSwapped == klwSigPackedFile) fPacked = fTrue; else if (lwSig == klwSigUnpackedFile || lwSwapped == klwSigUnpackedFile) fPacked = fFalse; else { LBadSrc: fprintf(stderr, "Source file is not packed\n\n"); goto LFail; } blck.Set(floSrc.pfil, size(long), floSrc.cb - size(long), fPacked); { byte *prgb = pvNil; long dxp, dyp; bool fUpsideDown; if (!FReadBitmap(&fniPalette, &prgb, &pglclrSrc, &dxp, &dyp, &fUpsideDown)) { fprintf(stderr, "Reading palette BMP failed\n\n"); goto LFail; } FreePpv((void **)&prgb); } fprintf(stderr, "Reading MBMP...\n"); mbmp = MBMP::PmbmpRead(&blck); if (mbmp == pvNil) { fprintf(stderr, "Reading MBMP failed\n\n"); goto LFail; } fprintf(stderr, "Read MBMP.\n"); if (1) { RC size; int buffer_size; mbmp->GetRc(&size); int stride = size.xpRight + ((size.xpRight % 4 == 0) ? 0 : (4 - (size.xpRight & 3))); fprintf(stderr, "Size is left=%d top=%d right=%d bottom=%d stride is %d\n", size.xpLeft, size.ypTop, size.xpRight, size.ypBottom, stride); buffer_size = stride * size.ypBottom; byte *temp_buffer = new byte[buffer_size]; memset(temp_buffer, 253, buffer_size); mbmp->Draw(temp_buffer, stride, size.ypBottom, 0, 0); fprintf(stderr, "Drew %d bytes\n", stride * size.ypBottom); if (!FWriteBitmap(&fniDst, temp_buffer, pglclrSrc, size.xpRight, size.ypBottom)) { fprintf(stderr, "writing BMP failed\n\n"); goto LFail; } fprintf(stderr, "wrote BMP\n\n"); } ReleasePpo(&floSrc.pfil); FIL::ShutDown(); return 0; LUsage: // print usage fprintf(stderr, "%s", "Usage: pbmtobmp \n\n"); LFail: ReleasePpo(&floSrc.pfil); FIL::ShutDown(); return 1; } ================================================ FILE: tools/sitobren.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** sitobren.cpp Main module for sitobren, a utility for converting SoftImage .hrc files into chunky files with the appropriate TMPL chunk and all its associated children. Syntax of a sitobren script (.s2b file): ACTOR CNO NAMED "" [XREST ] [YREST ] [ZREST ] [FLAGS ] [BPSETS ] ACTION NAMED "" FILEBASE "" FIRST LAST FLAGS [SCALE ] [SKIP ] [SUBMODEL ""] BACKGROUND CNO NAMED "" [LIGHTS <#lights>] [CAMERAS <#cameras>] [FIRST ] [LENGTH <#entries>] COSTUME FILE "" USE_SETS [ [ [...]]] As many actions as are necessary may be defined. Actions are defined for the actor which they follow. Actors should only be defined once; this implies that all actions should be defined before specifying a new actor. Parameters in [] are optional. The parameters for a given command can appear in any order, but all desired parameters must appear before the next command, of course. Any number of spaces, tabs, line-feeds, commas, and semi-colons may appear between defined tokens; feel free to insert them as necessary to improve the readability of your script file. The tokens are case-insensitive. Feel free to write "ACTOR," "actor," "Actor," "aCtOr," etc. Valid values: -- any string conforming to actor/action naming conventions -- Chunk number for TMPL or BKGD chunk -- Any valid integer, units are degrees -- 1 if actor can only use custom materials, 0 otherwise -- A model's action cel filename follows the following convention: ":\\-.hrc" The and parts, with their delimiters, must be provided if the files aren't in the current directory. The converter will supply the remaining portions, reading in all cel files for the given action -- The # of the 1st cel file (usually either 0 or 1) -- The # of the last cel file -- the distance between cels for static actions; for non-static actions, specifies a scaling to apply to the distance specified in the cel data. Can be an integer or a decimal -- action flags; includes three path orientation flags and one flag to indicate a static action -- increment for cel file numbers; sitobren will skip -1 files between each cel. -- name of submodel to extract from action; if this actor has multiple actions, each action must extract the same submodel, so that the actor's heirarchy is identical from one action to the next. -- 1 if Body Part Sets are required, 0 otherwise <#lights> -- number of lights in scene <#cameras> -- number of cameras in scene -- first palette entry to use <#entries> -- how many palette entries to use -- a complete filename specifying the .hrc to extract costume information from -- a valid body part set number; refers to the body part set given in the .hrc file, not the mapped Brender body part set number. Default values for optional items: -- 0 -- 0 -- 1.0 -- 0 -- 1 -- "" (simply means extract everything) -- 1 <#lights> -- 2 <#cameras> -- 9 -- 151 <#entries> -- 95 Command line: sitobren [] [flags] The extensions may be ommited, in which case the defaults listed will be used. The user can override the default extension by supplying the full filename, including the extension. -n[ologo] don't display the banner -v[#] verbose; optional level 0-2 (quiet to verbose (1 is default)) -h swap the handedness (negate z positions and translations) -r don't do any rounding -r# round coordinates of models losing # bits -k Kontinue on errors -p include Preprocessing info -i specify Include filename for preprocessing info -t# round transformation values losing # bits (default is to use the "-r" setting) -w don't attempt to fix up seams in texture wrapping -b DEBUG-only; break (INT 3) on Assert -d DEBUG-only; simply dump out the tokens in the source Flags come come anywhere in the command line. They may be combined after a single '-' or they may appear separately. The input script file must be listed before the output Chomp script filename. ***************************************************************************/ #include "sitobren.h" ASSERTNAME #ifdef DEBUG bool _fEnableWarnings = fTrue; bool _fBreak = fFalse; #endif // DEBUG int __cdecl main(int cpsz, achar *prgpsz[]) { STN stnSrc, stnDst; achar **ppszParm = &prgpsz[1]; bool fBanner = fTrue, fSwapHand, fUsage = fTrue, fDumpLex = fFalse; bool fContinue = fFalse, fPreprocess = fFalse, fHaveInc = fFalse; bool fIncNext = fFalse, fHaveRoundXF = fFalse, fFixWrap = fTrue; uint mdVerbose, iRound = 3, iRet = 1, iRoundXF; FNI fniSrc, fniDst, fniInc; PFIL pfilSrc = pvNil; FILE *pfileDst = pvNil; MSSIO *pmssioErr = pvNil, *pmssioDst = pvNil; S2B *ps2b = pvNil; ulong grfs2b = fs2bNil; fSwapHand = fFalse; mdVerbose = kmdQuiet; if (cpsz == 1) goto LUsage; while (--cpsz) { PSZ pszParm = *ppszParm; if (fIncNext) { STN stnT; stnT = pszParm; fHaveInc = fniInc.FBuildFromPath(&stnT); fIncNext = fFalse; } else if (pszParm[0] == ChLit('-') || pszParm[0] == ChLit('/')) { int cch = CchSz(pszParm), ich; for (ich = 1; ich < cch; ich++) { achar *pch; uint *pi; switch (pszParm[ich]) { case ChLit('n'): fBanner = fFalse; if ((cch - ich >= 6) && FEqualRgb(PszLit("nologo"), &pszParm[ich], 6 * size(achar))) ich += 5; break; case ChLit('h'): fSwapHand = !fSwapHand; break; case ChLit('v'): { achar ch = pszParm[ich + 1]; if (ch >= ChLit('0') && ch <= ChLit('9')) { mdVerbose = min(kmdVerbose, ch - ChLit('0')); ich++; } else mdVerbose = kmdHelpful; break; } case ChLit('t'): pi = &iRoundXF; fHaveRoundXF = fTrue; goto LGetRound; case ChLit('r'): pi = &iRound; LGetRound: pch = &pszParm[ich + 1]; *pi = 0; while (*pch && (*pch >= ChLit('0') && *pch <= ChLit('9'))) { *pi = *pi * 10 + *pch - ChLit('0'); ich++, pch++; } *pi = min(*pi, 15); break; case ChLit('k'): fContinue = !fContinue; break; case ChLit('p'): fPreprocess = !fPreprocess; break; case ChLit('w'): fFixWrap = !fFixWrap; break; case ChLit('i'): fIncNext = fTrue; break; #ifdef DEBUG case ChLit('b'): _fBreak = !_fBreak; break; case ChLit('d'): fDumpLex = !fDumpLex; break; #endif // DEBUG case ChLit('?'): goto LUsage; default: printf("Error: unrecognized option '%c'\n", pszParm[ich]); goto LUsage; } } } else if (stnSrc.Cch() == 0) stnSrc = pszParm; else if (stnDst.Cch() == 0) stnDst = pszParm; else goto LUsage; ppszParm++; } fUsage = fFalse; if (fContinue) grfs2b |= kfs2bContinue; if (fPreprocess) grfs2b |= kfs2bPreprocess; if (fFixWrap) grfs2b |= kfs2bFixWrap; if (fBanner) { printf("\nMicrosoft (R) SoftImage (R) to Chunky File Converter\n"); printf("Copyright (C) Microsoft Corp 1995. All rights reserved.\n\n"); } if (!fHaveRoundXF) iRoundXF = iRound; if (mdVerbose) { if (iRound > 0) printf("Rounding off %d binary places\n", iRound); if (iRoundXF != iRound) printf("Rounding off transformations %d binary places\n", iRoundXF); #if HASH_FIXED printf("Fixed length hash table\n"); #else printf("Variable length hash table\n"); #endif } if (!fniSrc.FBuildFromPath(&stnSrc, kftgS2b)) { printf("Invalid script file name\n"); goto LUsage; } else if ((pfilSrc = FIL::PfilOpen(&fniSrc)) == pvNil) { fniSrc.GetStnPath(&stnSrc); printf("Could not open source file (%s)\n", stnSrc.Psz()); goto LUsage; } if (fDumpLex) { STN stn; S2BLX s2blx(pfilSrc); S2BTK s2btk; long cch = 0; while (s2blx.FGetS2btk(&s2btk)) { if (!s2blx.FTextFromS2btk(&s2btk, &stn)) stn.FFormatSz(PszLit(""), s2btk.tok.tt); if (cch + stn.Cch() + 1 >= 80) { printf("\n"); cch = 0; } printf("%s ", stn.Psz()); cch += stn.Cch() + 1; } fUsage = fFalse; goto LUsage; } if (stnDst.Cch() == 0) { fniDst = fniSrc; AssertDo(fniDst.FChangeFtg(kftgCht), 0); } else if (!fniDst.FBuildFromPath(&stnDst, kftgCht)) { printf("Invalid destination file name\n"); goto LUsage; } fniDst.GetStnPath(&stnDst); if ((pfileDst = fopen(stnDst.Psz(), "wt")) == pvNil) { printf("Could not create destination file (%s)\n", stnDst.Psz()); goto LUsage; } if (fPreprocess && !fHaveInc) { fniInc = fniDst; fHaveInc = fniInc.FChangeFtg(kftgInc); if (!fHaveInc) printf("Warning: couldn't build include file name\n"); } ps2b = S2B::Ps2bNew(pfilSrc, fSwapHand, mdVerbose, iRound, iRoundXF, prgpsz[0]); if (ps2b == pvNil) goto LOom; pmssioErr = NewObj MSSIO(stderr); if (pmssioErr == pvNil) goto LOom; pmssioDst = NewObj MSSIO(pfileDst); if (pmssioDst == pvNil) { LOom: printf("Error: not enough memory\n"); } else if (ps2b->FConvertSI(pmssioErr, pmssioDst, fHaveInc ? &fniInc : pvNil, grfs2b)) iRet = 0; ReleasePpo(&ps2b); ReleasePpo(&pmssioDst); ReleasePpo(&pmssioErr); LUsage: ReleasePpo(&pfilSrc); Assert(FIL::PfilFirst() == pvNil, "Files left in the file chain"); if (pfileDst != pvNil) fclose(pfileDst); #ifdef DEBUG UnmarkAllMem(); UnmarkAllObjs(); MarkUtilMem(); // marks all util memory AssertUnmarkedMem(); AssertUnmarkedObjs(); #endif // DEBUG if (fUsage) { Assert(iRet != 0, "won't return error status"); printf("Usage:\n sitobren [-] " "[]\n"); printf(" flags:\n" " -n[ologo] don't print banner\n" " -v[#] Verbose, optional # 0-2 (1 is default)\n"); printf(" -h swap z-axis (Handedness)\n" " -r don't Round positions\n" " -r# Round off # places\n"); printf(" -t# Round off transformations # places\n" " -w don't attempt to fix up seams in texture wrapping\n"); printf(" -k Kontinue after errors\n" " -p include Preprocessing info\n" " -i specify Include filename for preprocessing info\n"); printf(" -? This information\n"); printf("\n The default extension for the script file is .s2b\n" " and the default extension for the output file is .cht\n"); } return iRet; } RTCLASS(S2B) RTCLASS(S2BLX) #ifdef DEBUG void S2B::AssertValidBmhr(PBMHR pbmhr) { while (pbmhr != pvNil) { AssertVarMem(pbmhr); AssertValidBmhr(pbmhr->pbmhrChild); pbmhr = pbmhr->pbmhrSibling; } } void S2B::AssertValid(ulong grf) { S2B_PAR::AssertValid(grf); AssertPo(_ps2blx, grf); AssertPo(&_chse, grf); AssertNilOrPo(_pglibactPar, grf); AssertNilOrPo(_pglbs, grf); AssertNilOrPo(_pglcmtld, grf); AssertNilOrPo(_pggcl, grf); AssertNilOrPo(_pglxf, grf); AssertNilOrPo(_pglcrng, grf); AssertNilOrPo(_pglclr, grf); AssertNilOrPo(_pglibps, grf); AssertNilOrPo(_pggcm, grf); AssertNilOrPo(_pggtmapd, grf); #if HASH_FIXED AssertNilOrPvCb(_prgpbmdb, kcbrgpbmdb); #else /* HASH_FIXED */ AssertNilOrPo(_pglpbmdb, grf); AssertNilOrPo(_pglpbmatdb, grf); #endif /* HASH_FIXED */ AssertValidBmhr(_pbmhr); AssertNilOrPvCb(_prgcps, size(CPS) * _cMesh); } void S2BLX::AssertValid(ulong grf) { S2BLX_PAR::AssertValid(grf); } void S2B::MarkBmhr(PBMHR pbmhr) { while (pbmhr != pvNil) { MarkPv(pbmhr); MarkPv(pbmhr->pmodlf); MarkPv(pbmhr->pszName); MarkBmhr(pbmhr->pbmhrChild); pbmhr = pbmhr->pbmhrSibling; } } void S2B::MarkMem(void) { S2B_PAR::MarkMem(); MarkMemObj(_ps2blx); MarkMemObj(_pglibactPar); MarkMemObj(_pglbs); MarkMemObj(_pglcmtld); MarkMemObj(_pggcl); MarkMemObj(_pglxf); MarkMemObj(_pglcrng); MarkMemObj(_pglclr); MarkMemObj(_pglibps); MarkMemObj(_pggcm); MarkMemObj(_pggtmapd); #if HASH_FIXED MarkPv(_prgpbmdb); #else /* HASH_FIXED */ MarkMemObj(_pglpbmdb); MarkMemObj(_pglpbmatdb); #endif /* !HASH_FIXED */ MarkPv(_prgcps); MarkBmhr(_pbmhr); MarkMemObj(&_chse); } void S2BLX::MarkMem(void) { S2BLX_PAR::MarkMem(); } #endif // DEBUG /*----------------------------------------------------------------------------- | Ps2bNew | Static instantiator for the S2B class. Will attempt to allocate the | S2BLX member and will fail if it cannot. | | Arguments: | PFIL pfilSrc -- file to read script from | bool fSwapHand -- the rest are all passed to the S2B constructor | bool mdVerbose | int iRound | PSZ pszApp | | Returns: a pointer to the new S2B instance, pvNil if it fails | -------------------------------------------------------------PETED-----------*/ PS2B S2B::Ps2bNew(PFIL pfilSrc, bool fSwapHand, uint mdVerbose, int iRound, int iRoundXF, PSZ pszApp) { PS2B ps2b = NewObj S2B(fSwapHand, mdVerbose, iRound, iRoundXF, pszApp); if (ps2b == pvNil) return pvNil; ps2b->_ps2blx = NewObj S2BLX(pfilSrc); if (ps2b->_ps2blx == pvNil) ReleasePpo(&ps2b); return ps2b; } /*----------------------------------------------------------------------------- | S2B | Constructor for the S2B class. Initializes the S2BLX and sets | some pointers to pvNil. | | Arguments: | PFIL pfilSrc -- used to initialize the S2BLX | -------------------------------------------------------------PETED-----------*/ S2B::S2B(bool fSwapHand, uint mdVerbose, int iRound, int iRoundXF, PSZ pszApp) { short bo; FNI fni; CFL *pcfl; BLCK blck; STN stnPal; _ibpCur = 0; _chidActn = 0; _chidBmdl = 0; _chidCmtl = 0; _pglibactPar = pvNil; _pglbs = pvNil; _pglcmtld = pvNil; _pggcl = pvNil; #if HASH_FIXED _prgpbmdb = pvNil; #else /* HASH_FIXED */ _pglpbmdb = pvNil; _pglpbmatdb = pvNil; #endif /* !HASH_FIXED */ _InitCrcTable(); _pbmhr = pvNil; _pglxf = pvNil; _pglibps = pvNil; _pggcm = pvNil; _pggtmapd = pvNil; _iZsign = fSwapHand ? -1 : 1; _mdVerbose = mdVerbose; Assert(_mdVerbose == mdVerbose, "mdVerbose overflow"); _uRound = iRound; _uRoundXF = iRoundXF; _mdBPS = kmdbpsAllMesh; _fColorOnly = fFalse; _cnoCur = cnoNil; _pglclr = _pglcrng = pvNil; stnPal = pszApp; AssertDo(fni.FBuildFromPath(&stnPal), "Couldn't build .chk path?"); AssertDo(fni.FChangeFtg(kftgContent), "Couldn't change FTG?"); fni.GetLeaf(&stnPal); if (fni.FSearchInPath(&stnPal) && (pcfl = CFL::PcflOpen(&fni, fcflNil)) != pvNil) { if (pcfl->FFind(kctgColorTable, 0, &blck)) { _pglclr = GL::PglRead(&blck, &bo); if (_pglclr != pvNil && bo == kboCur) { KID kidGlcg; if (pcfl->FGetKidChidCtg(kctgColorTable, 0, 0, kctgGlcg, &kidGlcg) && pcfl->FFind(kidGlcg.cki.ctg, kidGlcg.cki.cno, &blck)) { _pglcrng = GL::PglRead(&blck, &bo); Assert(bo == kboCur, "GLCG byte-order not same as GLCR"); } else _pglcrng = PglcrngFromPal(_pglclr); } else printf("Unable to read GLCR chunk\n"); } else printf("Couldn't find GLCR chunk\n"); ReleasePpo(&pcfl); } else { if (fni.Ftg() != ftgNil) fni.GetStnPath(&stnPal); printf("Couldn't find my resource file (%s);" "no color information available\n", stnPal.Psz()); } } /*----------------------------------------------------------------------------- | ~S2B | Destructor for the S2B class. Simply asserts that things have | already been cleaned up properly. | -------------------------------------------------------------PETED-----------*/ S2B::~S2B(void) { #ifdef DEBUG UnmarkAllMem(); UnmarkAllObjs(); MarkMem(); // marks all S2B memory MarkUtilMem(); // marks all util memory AssertUnmarkedMem(); AssertUnmarkedObjs(); #endif // DEBUG // All allocated objects should already be free Assert(_pglibactPar == pvNil, 0); Assert(_pglbs == pvNil, 0); Assert(_pglcmtld == pvNil, 0); Assert(_pggcl == pvNil, 0); Assert(_pglxf == pvNil, 0); Assert(_pglibps == pvNil, 0); Assert(_pggcm == pvNil, 0); Assert(_pggtmapd == pvNil, 0); #if HASH_FIXED Assert(_prgpbmdb == pvNil, 0); #else /* HASH_FIXED */ Assert(_pglpbmdb == pvNil, 0); Assert(_pglpbmatdb == pvNil, 0); #endif /* !HASH_FIXED */ Assert(_prgcps == pvNil, 0); Assert(_pbmhr == pvNil, 0); // Except these ReleasePpo(&_pglcrng); ReleasePpo(&_pglclr); ReleasePpo(&_ps2blx); } /****************************************************************************** _DumpHeader Dumps a customized "#ifdef"'d header for a chunk. This allows sitobren-generate .cht files to only keep chunks named for those that need names in the final product. Arguments: CTG ctg -- the CTG of the chunk; used in the #ifdef CNO cno -- the remainder of the arguments are just passed PSTN pstnName directly to the CHSE DumpHeader() bool fPack ************************************************************ PETED ***********/ void S2B::_DumpHeader(CTG ctg, CNO cno, PSTN pstnName, bool fPack) { if (_fPreprocess) { long ich; STN stnCtg; STN stnT; stnCtg.FFormatSz(PszLit("%f"), ctg); ich = 0; while (ich < stnCtg.Cch()) { achar ch; ch = stnCtg.Psz()[ich]; if ((ch >= ChLit('A') && ch <= ChLit('Z')) || ch >= ChLit('a') && ch <= ChLit('z') || ch >= ChLit('0') && ch <= ChLit('9')) { ich++; continue; } stnCtg.Delete(ich, 1); } if (stnCtg.Cch() > 0) { stnT.FFormatSz(PszLit("#if !defined(DEBUG) && !defined(%s_NAMED)"), &stnCtg); _chse.DumpSz(stnT.Psz()); _chse.DumpHeader(ctg, cno, pvNil, fPack); _chse.DumpSz(PszLit("#else")); _chse.DumpHeader(ctg, cno, pstnName, fPack); _chse.DumpSz(PszLit("#endif")); return; } printf("Warning: CTG w/out any alphanumerics; preprocessor directives" " skipped for that chunk\n"); } _chse.DumpHeader(ctg, cno, pstnName, fPack); } /*----------------------------------------------------------------------------- | FConvertSI | Reads commands from the current _s2blx file, and generates an | appropriate Chunky source file. | | Arguments: | PMSNK pmsnkErr -- where to send error messages | PMSNK pmsnkDst -- where to actually send the source file | | Returns: | fTrue if it succeeds, fFalse otherwise | -------------------------------------------------------------PETED-----------*/ bool S2B::FConvertSI(PMSNK pmsnkErr, PMSNK pmsnkDst, PFNI pfniInc, ulong grfs2b) { bool fGotTok, fHaveActor = fFalse, fRet = fFalse; _fContinue = FPure(grfs2b & kfs2bContinue); _fPreprocess = FPure(grfs2b & kfs2bPreprocess); _fFixWrap = FPure(grfs2b & kfs2bFixWrap); if (_fFixWrap) BrBegin(); _chse.Init(pmsnkDst, pmsnkErr); if (_fPreprocess && pfniInc != pvNil) { STN stnT; pfniInc->GetStnPath(&stnT); _stnT.FFormatSz(PszLit("#include \"%s\""), &stnT); _chse.DumpSz(_stnT.Psz()); } _chse.DumpSz(PszLit("BYTE")); _chse.DumpSz(PszLit("")); #if HASH_FIXED if (!FAllocPv((void **)&_prgpbmdb, kcbrgpbmdb, fmemClear, mprNormal)) #else /* HASH_FIXED */ if ((_pglpbmatdb = GL::PglNew(size(PBMATDB))) == pvNil) goto LFail; if ((_pglpbmdb = GL::PglNew(size(PBMDB))) == pvNil) #endif /* !HASH_FIXED */ goto LFail; fGotTok = _ps2blx->FGetS2btk(&_s2btk); while (fGotTok) { switch (_s2btk.tok.tt) { case ttActor: fGotTok = _FDoTtActor(&fHaveActor); break; case ttActionS2B: if (fHaveActor) fGotTok = _FDoTtActionS2B(); else { printf("Error: found 'action' token before 'actor' definition\n"); goto LContinue; } break; case ttBackgroundS2B: fGotTok = _FDoTtBackgroundS2B(); break; case ttCostume: if (fHaveActor) fGotTok = _FDoTtCostume(); else { printf("Error: found 'costume' token before 'actor' definition\n"); goto LContinue; } break; default: { STN stnTok; printf("Unexpected token at line %d, character %d: \n", _ps2blx->LwLine(), _ps2blx->IchLine()); if (_ps2blx->FTextFromS2btk(&_s2btk, &stnTok)) printf(" %s\n", stnTok.Psz()); else printf(" %08x\n", _s2btk.tok.tt); } LContinue: fGotTok = _ps2blx->FGetS2btk(&_s2btk); break; } } _FlushTmplKids(); #if HASH_FIXED #ifdef DEBUG { PBMDB *ppbmdb; for (ppbmdb = _prgpbmdb; ppbmdb < (_prgpbmdb + kcpbmdb); ppbmdb++) Assert(*ppbmdb == pvNil, "Didn't empty BMDL database!"); } #endif // DEBUG FreePpv((void **)&_prgpbmdb); #else /* HASH_FIXED */ Assert(_pglpbmdb->IvMac() == 0, "Didn't empty BMDL database"); ReleasePpo(&_pglpbmdb); Assert(_pglpbmatdb->IvMac() == 0, "Didn't empty XF database"); ReleasePpo(&_pglpbmatdb); #endif /* !HASH_FIXED */ LFail: if (_fFixWrap) BrEnd(); return fRet; } /****************************************************************************** _FReadCmdline General purpose script command reader. With an array of parameter descriptions, and pointers to the appropriate variables to take the results, this will read the specific parameters, putting the appropriate data into the appropriate variable for the given token. Arguments: PSZ pszResult -- Error string for command bool *pfGotTok -- pointer to flag to set based on lex state const SCRP rgscrp[] -- description of command parameters ... -- Additional variable parameters Returns: fTrue if all required parameters were found, and all parameters were successfully read. If a token could be pre-fetched from the lexer, *pfGotTok is set to fTrue, otherwise it's set to fFalse. ************************************************************ PETED ***********/ bool S2B::_FReadCmdline(PSZ pszResult, bool *pfGotTok, const SCRP rgscrp[], ...) { AssertVarMem(pfGotTok); Assert(kcscrpMax <= size(long) * 8, "Too many parms"); va_list args; bool fRet = fFalse; long cscrpMac = 0, iscrp, grfFound = 0, grfMatch = 0; void *rgpv[kcscrpMax]; /* Grab the arguments */ va_start(args, rgscrp); while (rgscrp[cscrpMac].pt != ptNil) { Assert(rgscrp[cscrpMac].tt != ttNil, "Bad RGSCRP"); if (rgscrp[cscrpMac].szErr[0] != 0) grfMatch |= (0x01 << cscrpMac); rgpv[cscrpMac] = va_arg(args, void *); cscrpMac++; } va_end(args); /* Try to read the data, quit when we get an unknown token */ while (*pfGotTok = _ps2blx->FGetS2btk(&_s2btk)) { for (iscrp = 0; iscrp < cscrpMac; iscrp++) if (rgscrp[iscrp].tt == _s2btk.tok.tt) break; if (iscrp == cscrpMac) break; if (!(*pfGotTok = _ps2blx->FGetS2btk(&_s2btk))) goto LDone; switch (rgscrp[iscrp].pt) { case ptString: if (_s2btk.tok.tt != ttString) { printf("Error: expected string\n"); goto LDone; } *((PSTN)rgpv[iscrp]) = _s2btk.tok.stn; break; case ptLong: if (_s2btk.tok.tt != ttLong) { printf("Error: expected integer\n"); goto LDone; } *((long *)rgpv[iscrp]) = _s2btk.tok.lw; break; case ptBRS: if (!_FBrsFromS2btk(&_s2btk, (BRS *)rgpv[iscrp])) { printf("Error: expected integer or floating point\n"); goto LDone; } break; case ptBRA: if (_s2btk.tok.tt != ttLong) { printf("Error: expected degrees as an integer\n"); goto LDone; } if (_s2btk.tok.lw >= 360 || _s2btk.tok.lw < 0) _s2btk.tok.lw %= 360; *((BRA *)rgpv[iscrp]) = BrDegreeToAngle(BrIntToFixed(_s2btk.tok.lw)); break; } grfFound |= ((0x01 << iscrp) & grfMatch); } if (!(fRet = (grfFound == grfMatch))) { for (iscrp = 0, grfMatch ^= grfFound; iscrp < cscrpMac && !(grfMatch & 0x01); iscrp++, grfMatch >>= 0x01) ; Assert(iscrp < cscrpMac, "Inconsistent error info"); printf("Error: %s; %s\n", rgscrp[iscrp].szErr, pszResult); } LDone: return fRet; } const SCRP rgscrpActor[] = {{ptLong, ttCno, "missing CNO for actor"}, {ptString, ttCalled, "missing name for actor"}, {ptBRA, ttXRest, ""}, {ptBRA, ttYRest, ""}, {ptBRA, ttZRest, ""}, {ptLong, ttFlags, ""}, {ptLong, ttBPS, ""}, {ptLong, ttMaterials, ""}, {ptNil, ttNil, ""}}; /*----------------------------------------------------------------------------- | _FDoTtActor | Processes a token of type ttActor. That is, the ttActor | indicates the start of a new TMPL to create. This handles all of | the tokens for that command, and prefetches the next token following | all data for this command. | | Returns: | fTrue if another token is available, fFalse otherwise. | -------------------------------------------------------------PETED-----------*/ bool S2B::_FDoTtActor(bool *pfHaveActor) { bool fRet = fTrue; uint mdBPS = _mdBPS, mdMaterials = 2; CNO cno; TMPLF tmplf; _FlushTmplKids(); tmplf.bo = kboCur; tmplf.osk = koskCur; tmplf.xaRest = tmplf.yaRest = tmplf.zaRest = 0; tmplf.grftmpl = 0; if (!_FReadCmdline("actor ignored", &fRet, rgscrpActor, &cno, &_stnTmpl, &tmplf.xaRest, &tmplf.yaRest, &tmplf.zaRest, &tmplf.grftmpl, &mdBPS, &mdMaterials)) goto LFail1; if (mdBPS < kmdbpsNone || mdBPS >= kmdbpsLim) { printf("Error: body part sets state out of range [%d-%d]\n", kmdbpsNone, kmdbpsLim - 1); goto LFail; } _mdBPS = mdBPS; _fColorOnly = (mdMaterials < 2); if (_mdVerbose > kmdQuiet) { printf("New actor: %s\n", _stnTmpl.Psz()); switch (_mdBPS) { case kmdbpsNone: printf("Body part sets will not be generated\n"); break; case kmdbpsNumberedOnly: printf("Only nodes with body part sets will be included\n"); break; case kmdbpsAllMesh: printf("All mesh nodes, and null nodes with a body part set, will be included\n"); break; case kmdbpsAllMeshNull: printf("All mesh and null nodes will be included\n"); break; } } _ctgPar = kctgTmpl; _cnoPar = cno; if (_cnoCur == cnoNil) _cnoCur = cno; _DumpHeader(kctgTmpl, cno, &_stnTmpl, fTrue); _chse.DumpRgb(&tmplf, size(tmplf)); _chse.DumpSz(PszLit("ENDCHUNK")); _chse.DumpSz(PszLit("")); *pfHaveActor = fTrue; LFail: if (!*pfHaveActor) { printf("Error occured during processing for command line:\n"); printf(" ACTOR CNO %d, NAMED \"%s\",\n" " XREST %f, YREST %f, ZREST %f FLAGS %08x, BPSETS %d\n", cno, _stnTmpl.Psz(), BrScalarToFloat(BrAngleToDegree(tmplf.xaRest)), BrScalarToFloat(BrAngleToDegree(tmplf.yaRest)), BrScalarToFloat(BrAngleToDegree(tmplf.zaRest)), tmplf.grftmpl, mdBPS); } LFail1: return fRet; } const SCRP rgscrpAction[] = {{ptString, ttCalled, "missing name for action"}, {ptString, ttFilebase, "missing filename for action"}, {ptLong, ttFirst, "missing starting cel for action"}, {ptLong, ttLast, "missing ending cel for action"}, {ptLong, ttFlags, "missing flags for action"}, {ptBRS, ttScale, ""}, {ptLong, ttSkip, ""}, {ptString, ttSubmodel, ""}, {ptBRS, ttStep, ""}, {ptNil, ttNil, ""}}; /*----------------------------------------------------------------------------- | _FDoTtActionS2B | Processes a token of type ttNameS2B. That is, the ttNameS2B | indicates the start of a new ACTN to create. This handles all of | the tokens for that command, and prefetches the next token following | all data for this command. | | Returns: | fTrue if another token is available, fFalse otherwise. | -------------------------------------------------------------PETED-----------*/ bool S2B::_FDoTtActionS2B(void) { bool fRet = fTrue, fSuccess = fTrue; STN stnFileBase, stnFileAddon, stnSubmodel; int cCel, iCel, iCelBase, dCel = 1, iCelMac; long grfactn; ACTNF actnf; CNO cnoActn; BRS brsScale = BrFloatToScalar(1.0), brsStep = BR_SCALAR(-1); BRS rgbrsDwr[3] = {BR_SCALAR(0), BR_SCALAR(0), BR_SCALAR(0)}; /* Read in all of the command data */ if (!_FReadCmdline("action ignored", &fRet, rgscrpAction, &_stnActn, &stnFileBase, &iCelBase, &iCelMac, &grfactn, &brsScale, &dCel, &stnSubmodel, &brsStep)) goto LFail; if (dCel < 1) { printf("Error: non-positive increment for cel files (%d)\n", dCel); goto LFail; } cCel = iCelMac - iCelBase + 1; if (!(grfactn & factnStatic)) { if (cCel == 1) printf("Warning: single-cel non-static action\n"); if (brsStep != BR_SCALAR(-1)) printf("Warning: step size parameter ignored for non-static action\n"); } else if (brsStep == BR_SCALAR(-1)) brsStep = BR_SCALAR(5.0); /* Create the ACTN chunk itself */ actnf.bo = kboCur; actnf.osk = koskCur; actnf.grfactn = grfactn; cnoActn = CnoNext(); _stnT = _stnActn; _DumpHeader(kctgActn, cnoActn, &_stnT, fTrue); _chse.DumpParentCmd(_ctgPar, _cnoPar, _chidActn++); _chse.DumpRgb(&actnf, size(actnf)); _chse.DumpSz(PszLit("ENDCHUNK")); _chse.DumpSz(PszLit("")); /* Process the model data files for this action */ for (iCel = 0; iCel < cCel && (fSuccess || _fContinue); iCel += dCel) { Model *pmodel; BMAT34 bmat34; CEL cel; long cbrgcps; /* Get the SoftImage data */ AssertDo(stnFileAddon.FFormatSz(PszLit("-%d.hrc"), iCel + iCelBase), 0); _stnT = stnFileBase; if (!_stnT.FAppendStn(&stnFileAddon)) { printf("Error: Computed filename too long (%s%s)\n", _stnT.Psz(), stnFileAddon.Psz()); goto LFail; } if ((pmodel = DK_modelReadFile(_stnT.Psz())) == pvNil) { printf("Error: Can't read cel file (%s)\n", _stnT.Psz()); goto LFail; } /* Convert the SoftImage data to Brender data */ /* Determine step size for this cel */ cel.chidSnd = 0; if (grfactn & factnStatic) cel.dwr = brsStep; else cel.dwr = _BrsdwrFromModel(pmodel, rgbrsDwr); if (cel.dwr == BR_SCALAR(0)) cel.dwr = BrFloatToScalar(0.01); cel.dwr = BR_MUL(brsScale, cel.dwr); /* Actually process the model hierarchy */ BrMatrix34Identity(&bmat34); _cFace = _cMesh = 0; if (!_FInitGlpiCost(fFalse)) { Assert(_pbmhr == pvNil, "Bad error state"); Assert(_pglibactPar == pvNil, "Bad error state"); Assert(_pglbs == pvNil, "Bad error state"); Assert(_pglcmtld == pvNil, "Bad error state"); goto LFail; } if (_fMakeCostume) printf("Warning: costume info will be extracted from ACTION\n"); fSuccess = _FProcessModel(pmodel, bmat34, &_pbmhr, &stnSubmodel) && _FEnsureOneRoot(&_pbmhr); DK_modelDispose(&pmodel); if (!fSuccess) { printf("Error: processing cel heirarchy (%s)\n", _stnT.Psz()); if (!_fContinue) goto LFail; else continue; } /* Create GGCL and GLXF for action */ /* Also, generate GLPI if necessary, and accumulate BMDLs */ if (_mdVerbose > kmdQuiet) { printf("Distance from previous cel is %5.2f\n", BrScalarToFloat(cel.dwr)); if (_mdVerbose > kmdHelpful || (iCel + dCel >= cCel)) printf("Found %d mesh nodes, totalling %d polygons\n", _cMesh, _cFace); } cbrgcps = size(CPS) * _cMesh; fSuccess = fFalse; if (FAllocPv((void **)&_prgcps, cbrgcps, fmemNil, mprNormal)) { if ((_pglxf != pvNil) || (_pglxf = GL::PglNew(size(BMAT34))) != pvNil) { _ibpCur = 0; if (_FProcessBmhr(&_pbmhr)) { if (_pggcl != pvNil || (_pggcl = GG::PggNew(size(CEL))) != pvNil) fSuccess = _pggcl->FAdd(cbrgcps, pvNil, _prgcps, &cel); } } else printf("Couldn't create GLXF -- OOM\n"); FreePpv((void **)&_prgcps); } else printf("Couldn't create CPS array -- OOM\n"); if (!fSuccess) { _DisposeBmhr(&_pbmhr); if (_fMakeGlpi) { ReleasePpo(&_pglibactPar); ReleasePpo(&_pglbs); } } #ifdef DEBUG else Assert(_pbmhr == pvNil, "Didn't free model hierarchy"); #endif // DEBUG } ReleasePpo(&_pglcmtld); if (fSuccess) { /* Write out the GGCL and GLXF for the action*/ CnoNext(); _stnT.FFormatSz(PszLit("%s %s Cels"), &_stnTmpl, &_stnActn); _DumpHeader(kctgGgcl, _cnoCur, &_stnT, fTrue); _chse.DumpParentCmd(kctgActn, cnoActn, 0); _chse.DumpGroup(_pggcl); _chse.DumpSz(PszLit("ENDCHUNK")); _chse.DumpSz(PszLit("")); ReleasePpo(&_pggcl); CnoNext(); _stnT.FFormatSz(PszLit("%s %s Transforms"), &_stnTmpl, &_stnActn); _DumpHeader(kctgGlxf, _cnoCur, &_stnT, fTrue); _chse.DumpParentCmd(kctgActn, cnoActn, 0); _chse.DumpList(_pglxf); _chse.DumpSz(PszLit("ENDCHUNK")); _chse.DumpSz(PszLit("")); ReleasePpo(&_pglxf); } LFail: #if !HASH_FIXED /* Empty the XF database */ { PBMATDB pbmatdb, pbmatdbNext; long ipbmatdb = _pglpbmatdb->IvMac(); long cChain = 0, cEntriesTot = 0, cEntries; if (_mdVerbose > kmdQuiet) printf("Emptying XF database\n"); while (ipbmatdb > 0) { ipbmatdb--; _pglpbmatdb->Get(ipbmatdb, &pbmatdb); cEntries = 0; while (pbmatdb != pvNil) { cEntries++; pbmatdbNext = (PBMATDB)pbmatdb->hshdb.phshdbNext; FreePpv((void **)&pbmatdb); pbmatdb = pbmatdbNext; } _pglpbmatdb->Delete(ipbmatdb); cEntriesTot += cEntries; if (_mdVerbose > kmdHelpful) printf("XF collision chain had %d entries\n", cEntries); cChain++; } if (_mdVerbose > kmdQuiet && cChain > 0) { double flAvg = (double)cEntriesTot / (double)cChain; printf("Average XF collision chain had %1.2f entries (%d chains)\n", flAvg, cChain); } Assert(_pglpbmatdb->IvMac() == 0, 0); } #endif /* !HASH_FIXED */ if (!fSuccess) { printf("Error occured during processing for command line:\n"); printf(" ACTION NAMED \"%s\" FILEBASE \"%s\",\n" " FIRST %d, LAST %d, FLAGS %08x, SCALE %f, SKIP %d,\n" " SUBMODEL \"%s\", STEP %f\n", _stnActn.Psz(), stnFileBase.Psz(), iCelBase, iCelMac, grfactn, BrScalarToFloat(brsScale), dCel, stnSubmodel.Psz(), BrScalarToFloat(brsStep)); } return fRet; } /****************************************************************************** _FInitGlpiCost Routine to setup the GLPI and Costume creation states. By default, if either does not yet exist, we will create them. The caller can override the _fMakeCostume if it wants to create additional costumes, by setting the flag to fTrue if it's fFalse when we return from here. Arguments: fForceCost -- fTrue if we always want to generate a costume Returns: fTrue if no fatal errors occurred ************************************************************ PETED ***********/ bool S2B::_FInitGlpiCost(bool fForceCost) { _fMakeGlpi = (_pglibactPar == pvNil); _fMakeCostume = (_pggcm == pvNil || fForceCost); if (_fMakeGlpi) { Assert(_pglbs == pvNil, "Non-nil body part set"); if ((_pglibactPar = GL::PglNew(size(short))) == pvNil) { printf("Error: Couldn't create GLPI -- OOM\n"); goto LFail; } if ((_pglbs = GL::PglNew(size(short))) == pvNil) { printf("Warning: no body part set info -- OOM\n"); _fMakeCostume = fFalse; } } if (_fMakeCostume) { Assert(_pglcmtld == pvNil, "Non-nil GLCMTLD"); if ((_pglcmtld = GL::PglNew(size(CMTLD))) == pvNil) goto LFailCost; if (_pggcm == pvNil && (_pggcm = GG::PggNew(size(long))) == pvNil) { ReleasePpo(&_pglcmtld); LFailCost: printf("Warning: no custom material info -- OOM\n"); _fMakeCostume = fFalse; } } return fTrue; LFail: return fFalse; } const SCRP rgscrpBackground[] = {{ptLong, ttCno, "missing CNO for background"}, {ptString, ttCalled, "missing name for background"}, {ptLong, ttLights, ""}, {ptLong, ttCameras, ""}, {ptLong, ttFirst, ""}, {ptLong, ttLength, ""}, {ptNil, ttNil, ""}}; /****************************************************************************** _FDoTtBackgroundS2B Handles a ttBackground command from the script. Will generate the necessary .Zbmp files (Brender z-buffer), and output appropriate .cht data for the given background. Returns: fTrue if it returns with a token available ************************************************************ PETED ***********/ bool S2B::_FDoTtBackgroundS2B(void) { bool fGotTok, fSuccess = fFalse; long cLite = 2, cCam = 9, iPalBase = 151, cPal = 95; CTG ctgSav; CNO cnoBkgd, cnoSav; STN stnBkgd; BKGDF bkgdf; ctgSav = _ctgPar; cnoSav = _cnoPar; /* Get the command parameters */ if (!_FReadCmdline("background ignored", &fGotTok, rgscrpBackground, &cnoBkgd, &stnBkgd, &cLite, &cCam, &iPalBase, &cPal)) goto LFail; /* Generate the BKGD chunk */ bkgdf.bo = kboCur; bkgdf.osk = koskCur; Assert(iPalBase >= 0 && iPalBase <= kbMax, "Palette base out of range"); bkgdf.bIndexBase = (byte)iPalBase; _ctgPar = kctgBkgd; _cnoPar = cnoBkgd; if (_cnoCur == cnoNil) _cnoCur = cnoBkgd; _stnT.FFormatSz(PszLit("%s Background"), &stnBkgd); _DumpHeader(kctgBkgd, cnoBkgd, &_stnT, fTrue); _chse.DumpRgb(&bkgdf, size(bkgdf)); _chse.DumpSz(PszLit("ENDCHUNK")); _chse.DumpSz(PszLit("")); /* Create the lights */ if (!_FDumpLites(cLite, &stnBkgd)) goto LFail; /* Create the cameras */ if (!_FDumpCameras(cCam, &stnBkgd, iPalBase, cPal)) goto LFail; fSuccess = fTrue; LFail: if (!fSuccess) { printf("Error occured during processing for command line:\n"); printf(" BACKGROUND CNO %d, NAMED \"%s\"" " LIGHTS %d, CAMERAS %d, FIRST %d, LENGTH %d\n", cnoBkgd, stnBkgd.Psz(), cLite, cCam, iPalBase, cPal); } _ctgPar = ctgSav; _cnoPar = cnoSav; return fGotTok; } const SCRP rgscrpCostume[] = {{ptString, ttFilename, "missing filename for costume"}, {ptLong, ttUseSets, "no body part sets specified"}, {ptNil, ttNil, ""}}; /****************************************************************************** _FDoTtCostume Handles a COSTUME script command. Reads the specified .hrc file and extracts costume information from the file. Returns: fTrue if there's a new token available ************************************************************ PETED ***********/ bool S2B::_FDoTtCostume(void) { bool fRet, fSuccess = fFalse; long ibpsCur; Model *pmodel; STN stnCostume; BMAT34 bmat34; /* Read in all of the command data */ if (!_FReadCmdline("costume ignored", &fRet, rgscrpCostume, &stnCostume, &ibpsCur)) goto LFail; /* Get list of body part sets to pay attention to */ if ((_pglibps = GL::PglNew(size(long))) == pvNil) goto LOOM1; if (!_pglibps->FAdd(&ibpsCur)) goto LOOM1; while (fRet && (_s2btk.tok.tt == ttLong)) { if (!_pglibps->FAdd(&_s2btk.tok.lw)) { LOOM1: printf("Error: can't build list of body part sets -- OOM\n"); goto LFail; } fRet = _ps2blx->FGetS2btk(&_s2btk); } pmodel = DK_modelReadFile(stnCostume.Psz()); if (pmodel == pvNil) { printf("Error: Can't read costume file (%s)\n", stnCostume.Psz()); goto LFail; } /* Read and process the SoftImage .hrc file */ if (!_FInitGlpiCost(fTrue)) goto LFail; _fCostumeOnly = fTrue; BrMatrix34Identity(&bmat34); _cFace = _cMesh = 0; BrMatrix34Identity(&bmat34); _cFace = _cMesh = 0; Assert(_pglibactPar != pvNil, "haven't processed base hierarchy yet"); fSuccess = _FProcessModel(pmodel, bmat34, &_pbmhr) && _FEnsureOneRoot(&_pbmhr); DK_modelDispose(&pmodel); if (!fSuccess) { printf("Error: processing SoftImage data for costume (%s)\n", stnCostume.Psz()); goto LFail; } _ibpCur = 0; fSuccess = _FProcessBmhr(&_pbmhr); if (!fSuccess) { _DisposeBmhr(&_pbmhr); printf("Error: processing hierarchy for costume (%s)\n", stnCostume.Psz()); goto LFail; } else Assert(_pbmhr == pvNil, "Didn't free model hierarchy"); LFail: if (!fSuccess) { long iibpsMac = _pglibps != pvNil ? _pglibps->IvMac() : 0; long cchLine = 16; /* length of " USE_SETS" */ printf("Error occured during processing for command line:\n"); printf(" COSTUME FILE \"%s\",\n", stnCostume.Psz()); printf(" USE_SETS"); for (long iibps = 0; iibps < iibpsMac; iibps++) { long ibps; STN stnT; _pglibps->Get(iibps, &ibps); stnT.FFormatSz(PszLit(", %d"), ibps); if (cchLine + stnT.Cch() > 72) { printf("\n"); cchLine = 0; } printf("%s", stnT.Psz()); cchLine += stnT.Cch(); } printf("\n"); } _fCostumeOnly = fFalse; ReleasePpo(&_pglcmtld); ReleasePpo(&_pglibps); return fRet; } /****************************************************************************** _FDumpLites Outputs the appropriate .cht data for light definitions. Reads the necessary SoftImage ASCII light files, converts to Brender data, and generates the proper chunk data. Arguments: int cLite -- the number of lights PSTN pstnBkgd -- string containing the background name Returns: fTrue if it succeeds, fFalse otherwise ************************************************************ PETED ***********/ bool S2B::_FDumpLites(int cLite, PSTN pstnBkgd) { bool fRet = fFalse; int iLite; LITE lite; PGL pgllite; /* Create a GL of LITEs */ if ((pgllite = GL::PglNew(size(LITE))) == pvNil) { printf("Couldn't allocate GLLT\n"); goto LFail; } /* Read in the SoftImage lights, adding each to the GL */ for (iLite = 0; iLite < cLite; iLite++) { if (!_stnT.FFormatSz(kszLight, pstnBkgd, iLite + 1)) { printf("Computed light filename too long (" kszLight ")\n", pstnBkgd->Psz(), iLite + 1); goto LFail; } BrMatrix34Identity(&lite.bmat34); lite.rIntensity = BrIntToScalar(1.0); _ReadLite(&_stnT, &lite); lite.lt = BR_LIGHT_DIRECT; if (!pgllite->FAdd(&lite)) { printf("Couldn't add light to GLLT -- OOM\n"); goto LFail; } } /* Emit the LITE chunk */ CnoNext(); _stnT.FFormatSz(PszLit("%s Lights"), pstnBkgd); _DumpHeader(kctgGllt, _cnoCur, &_stnT, fTrue); Assert(_ctgPar == kctgBkgd, "Odd parent for GLLT"); _chse.DumpParentCmd(_ctgPar, _cnoPar, 0); _chse.DumpList(pgllite); _chse.DumpSz(PszLit("ENDCHUNK")); _chse.DumpSz(PszLit("")); fRet = fTrue; LFail: ReleasePpo(&pgllite); return fRet; } /****************************************************************************** _FDumpCameras Outputs the necessary camera chunk data. Reads in the appropriate SoftImage ASCII camera file, converts the data to Brender data, and generates the proper chunk data. Arguments: int cCam -- the number of cameras PSTN pstnBkgd -- the name of the background int iPalBase -- the first palette entry used by the background int cPal -- the number of palette entries used by the background Returns: fTrue if it succeeds, fFalse otherwise ************************************************************ PETED ***********/ bool S2B::_FDumpCameras(int cCam, PSTN pstnBkgd, int iPalBase, int cPal) { int iCam; long dxp, dyp; CAM cam; STN stnFile; /* Cameras are kept as individual chunks; read each file and create the chunk */ for (iCam = 1; iCam <= cCam; iCam++) { CNO cnoCam; FNI fni; PGL pglapos = pvNil; /* Get the file */ if (!stnFile.FFormatSz(kszCam, pstnBkgd, iCam)) { printf("Computed camera filename too long (" kszCam ")\n", pstnBkgd->Psz(), iCam); goto LFail; } cam.bo = kboCur; cam.osk = koskCur; _ReadCam(&stnFile, &cam, &pglapos); /* Process camera's background bitmap */ if (!stnFile.FFormatSz(kszBmp, pstnBkgd, iCam)) { printf("Computed bitmap filename too long (" kszBmp ")\n", pstnBkgd->Psz(), iCam); goto LFail; } _ps2blx->GetFni(&fni); if (!fni.FSetLeaf(&stnFile, kftgBmp)) { printf("Error: Couldn't create palette filename\n"); goto LFail; } fni.GetStnPath(&stnFile); /* Only extract the palette once */ if (iCam == 1) { PGL pglclr; /* Read the palette */ if (FReadBitmap(&fni, pvNil, &pglclr, &dxp, &dyp, pvNil)) { /* Chop off unneeded data from the palette */ Assert(iPalBase + cPal <= pglclr->IvMac(), "Not enough colors in bitmap"); if (iPalBase > 0) pglclr->Delete(0, iPalBase); if (cPal < pglclr->IvMac()) pglclr->Delete(cPal, pglclr->IvMac() - cPal); /* Generate the palette chunk */ _stnT.FFormatSz(PszLit("%s Palette"), pstnBkgd); _DumpHeader(kctgColorTable, _cnoCur, &_stnT, fTrue); Assert(_ctgPar == kctgBkgd, "Odd parent for GLCR"); _chse.DumpParentCmd(_ctgPar, _cnoPar, 0); _chse.DumpList(pglclr); _chse.DumpSz(PszLit("ENDCHUNK")); _chse.DumpSz(PszLit("")); ReleasePpo(&pglclr); } else { _stnT.FFormatSz(PszLit("Error: Couldn't read camera palette (%s)"), &stnFile); printf("%s\n", _stnT.Psz()); goto LFail; } } /* Generate the camera chunk */ cnoCam = CnoNext(); _stnT.FFormatSz(PszLit("%s Camera %d"), pstnBkgd, iCam); _DumpHeader(kctgCam, cnoCam, &_stnT, fTrue); Assert(_ctgPar == kctgBkgd, "Odd parent for CAM"); _chse.DumpParentCmd(_ctgPar, _cnoPar, iCam - 1); _chse.DumpRgb(&cam, size(cam)); if (pglapos != pvNil) { long capos = pglapos->IvMac(); APOS apos; for (long iapos = 0; iapos < capos; iapos++) { pglapos->Get(iapos, &apos); _chse.DumpRgb(&apos, size(APOS)); } ReleasePpo(&pglapos); } _chse.DumpSz(PszLit("ENDCHUNK")); _chse.DumpSz(PszLit("")); /* Generate the background chunk */ CnoNext(); _stnT.FFormatSz(PszLit("%s Bitmap %d"), pstnBkgd, iCam); _DumpHeader(kctgMbmp, _cnoCur, &_stnT, fTrue); _chse.DumpParentCmd(kctgCam, cnoCam, 0); _chse.DumpBitmapCmd(0, dxp, dyp, &stnFile); _chse.DumpSz(PszLit("ENDCHUNK")); _chse.DumpSz(PszLit("")); /* Generate the z-buffer chunk for the camera */ if (!_FZbmpFromZpic(pstnBkgd, cnoCam, iCam, dxp, dyp, &cam)) goto LFail; } return fTrue; LFail: return fFalse; } /****************************************************************************** _FZbmpFromZpic Converts a SoftImage z-buffer data file into Brender z-buffer data. If it can write the data to a new file, it will do so and generate a chunk that refers to that file; otherwise, it will include the chunk data explicitly. Arguments: PSTN pstnBkgd -- the name of the background CNO cnoPar -- the CNO of the parent camera chunk int iCam -- the number of the camera long dxp -- the width of the background long dyp -- the height of the background CAM *pcam -- pointer to the camera data Returns: fTrue if it could successfully read and process the z-buffer data, fFalse otherwise. ************************************************************ PETED ***********/ bool S2B::_FZbmpFromZpic(PSTN pstnBkgd, CNO cnoPar, int iCam, long dxp, long dyp, CAM *pcam) { Assert(dxp > 0, "Invalid z-buffer width"); Assert(dyp > 0, "Invalid z-buffer height"); bool fRet = fFalse; short *prgsw = pvNil; float *prgfl = pvNil; FNI fni; FIL *pfil = pvNil; /* Try to find and open the SoftImage data file */ if (!_stnT.FFormatSz(kszZpic, pstnBkgd, iCam)) { printf("Computed z-buffer filename too long (" kszZpic ")\n", pstnBkgd->Psz(), iCam); goto LFail; } _ps2blx->GetFni(&fni); if (fni.FSetLeaf(&_stnT, kftgZpic)) { if ((pfil = FIL::PfilOpen(&fni)) != pvNil) { bool fWroteZbmp = fFalse; short *psw, *prgsw; long cPix = dxp * dyp, cbSw, cbBuf, cbLeft; float fl, *prgfl; FNI fniZbmp; FP fpZbmp; FIL *pfilZbmp = pvNil; FP fpRead = 0; ZBMPF zbmpf; /* Allocate buffer for Zbmp and buffer for reading */ cbSw = cPix * size(short); if (!FAllocPv((void **)&prgsw, cbSw, fmemNil, mprNormal)) { printf("Error: Not enough memory for z-buffer\n"); goto LFail; } cbBuf = dxp * size(float); if (!FAllocPv((void **)&prgfl, cbBuf, fmemNil, mprNormal)) { prgfl = &fl; cbBuf = size(float); } /* Read the available floats */ cbLeft = pfil->FpMac(); psw = prgsw; while (cbLeft && cPix) { long cFl, cbRead; float *pfl = prgfl; /* Process a buffer's-worth of data */ cbRead = LwMin(cbBuf, cbLeft); cFl = cbRead / size(float); Assert(cFl * size(float) == cbRead, "Partial data at EOF"); AssertDo(pfil->FReadRgbSeq(prgfl, cbRead, &fpRead), "Failed z-buffer read"); SwapBytesRglw(prgfl, cFl); cPix -= cFl; while (cFl-- > 0) { BRS brsZCam = BrFloatToScalar(*pfl++); /* Convert the SoftImage data to Brender data */ Assert(*(pfl - 1) < 0, "Non-negative zbuffer values"); if (BR_ABS(brsZCam) > pcam->zrYon) *psw++ = -1; else { BRS brsZ, brsDepth = BR_SUB(pcam->zrYon, pcam->zrHither); brsZ = BR_ADD(BR_MULDIV(brsZCam, BR_ADD(pcam->zrYon, pcam->zrHither), brsDepth), BR_CONST_MUL(BR_MULDIV(pcam->zrYon, pcam->zrHither, brsDepth), 2)); *psw++ = (short)(BrScalarToFloat(brsZ) * -32768.0 / BrScalarToFloat(-brsZCam)); Assert(*(psw - 1) > 0, "Non-positive calculated value"); } } cbLeft -= cbRead; } /* Fill in the rest with the max value */ while (cPix-- > 0) *psw++ = -1; /* Write the chunk */ CnoNext(); _stnT.FFormatSz(PszLit("%s Z-Buffer %d"), pstnBkgd, iCam); _DumpHeader(kctgZbmp, _cnoCur, &_stnT, fTrue); _chse.DumpParentCmd(kctgCam, cnoPar, 0); zbmpf.bo = kboCur; zbmpf.osk = koskCur; zbmpf.xpLeft = zbmpf.ypTop = 0; Assert(dxp <= kswMax, "Zbmp too wide"); Assert(dyp <= kswMax, "Zbmp too tall"); zbmpf.dxp = (short)dxp; zbmpf.dyp = (short)dyp; if (_stnT.FFormatSz(kszZbmp, pstnBkgd, iCam)) { _ps2blx->GetFni(&fniZbmp); if (fniZbmp.FSetLeaf(&_stnT, kftgZbmp)) { pfilZbmp = FIL::PfilCreate(&fniZbmp); fpZbmp = 0; if (pfilZbmp != pvNil) { if (pfilZbmp->FWriteRgbSeq(&zbmpf, size(zbmpf), &fpZbmp) && pfilZbmp->FWriteRgbSeq(prgsw, cbSw, &fpZbmp)) { fWroteZbmp = fTrue; fniZbmp.GetStnPath(&_stnT); } else pfilZbmp->SetTemp(); ReleasePpo(&pfilZbmp); } } } if (!fWroteZbmp) { _chse.DumpRgb(&zbmpf, size(zbmpf)); _chse.DumpRgb(prgsw, cbSw); } else _chse.DumpFileCmd(&_stnT); _chse.DumpSz(PszLit("ENDCHUNK")); _chse.DumpSz(PszLit("")); /* Prevent us from freeing a local */ if (prgfl != &fl) FreePpv((void **)&prgfl); FreePpv((void **)&prgsw); ReleasePpo(&pfil); } else { printf("Error: Couldn't open z-buffer file\n"); goto LFail; } } else { printf("Error: Couldn't build z-buffer filename\n"); goto LFail; } fRet = fTrue; LFail: ReleasePpo(&pfil); return fRet; } /****************************************************************************** _FBvec3Read Reads a vector (triplet) from the given token stream Arguments: PS2BLX ps2blx -- the lexer to use (token stream) BVEC3 *pbvec3 -- the vector to fill in S2BTK *ps2btk -- the token to use Returns: fTrue if ptok contains a new unused token ************************************************************ PETED ***********/ bool S2B::_FBvec3Read(PS2BLX ps2blx, BVEC3 *pbvec3, S2BTK *ps2btk) { bool fRet; int iBrs; for (iBrs = 0; iBrs < 3; iBrs++) { fRet = ps2blx->FGetS2btk(ps2btk); if (!fRet || !_FBrsFromS2btk(ps2btk, &pbvec3->v[iBrs])) { printf("Error: Invalid triplet data\n"); goto LFail; } } LFail: return fRet; } /****************************************************************************** _Bmat34FromVec3 Given a vector, will calculate a transformation matrix that rotates the actor's coordinate system so that the positive Z axis points along the vector, and the X axis is horizontal. Arguments: BVEC3 *pbvec3 -- The vector to use BMAT34 *pbmat34 -- the matrix to fill in ************************************************************ PETED ***********/ void S2B::_Bmat34FromVec3(BVEC3 *pbvec3, BMAT34 *pbmat34) { BRS brs, brsAdj, brsHyp; BRXFM brxfm; /* Set up */ ClearPb(&brxfm, size(brxfm)); brxfm.type = BR_TRANSFORM_EULER; brxfm.t.euler.e.order = BR_EULER_YXZ_R; /* Calculate rotation about Y */ brsHyp = BR_LENGTH2(pbvec3->v[0], pbvec3->v[2]); brs = BrAngleToScalar(BR_ACOS(BR_DIV(pbvec3->v[2], brsHyp))); if (pbvec3->v[0] < 0) brs = BR_SUB(BR_SCALAR(1), brs); Assert(brs >= 0 && BrScalarToFloat(brs) <= 1.0, "Bad angle"); brxfm.t.euler.e.a = BrScalarToAngle(brs); ; /* Calculate rotation about X */ brsAdj = brsHyp; brsHyp = BR_LENGTH2(pbvec3->v[1], brsAdj); brs = BrAngleToScalar(BR_ACOS(BR_DIV(brsAdj, brsHyp))); if (pbvec3->v[1] > 0) brs = BR_SUB(BR_SCALAR(1), brs); Assert(brs >= 0 && BrScalarToFloat(brs) <= 1.0, "Bad angle"); brxfm.t.euler.e.b = BrScalarToAngle(brs); /* Actually perform the rotations */ brxfm.t.euler.e.c = BrScalarToAngle(BR_SCALAR(0)); BrMatrix34Transform(pbmat34, &brxfm); } /****************************************************************************** _ReadLite Reads a SoftImage ASCII light file and fills in the LITE structure as appropriate. Arguments: PSTN pstnLite -- the name of the light file LITE *plite -- pointer to LITE structure to fill in ************************************************************ PETED ***********/ void S2B::_ReadLite(PSTN pstnLite, LITE *plite) { FNI fni; FIL *pfil; /* Attempt to open the file */ _ps2blx->GetFni(&fni); if (fni.FSetLeaf(pstnLite, kftgALite)) { Assert(fni.Ftg() == kftgALite, "Light file has wrong extension"); if ((pfil = FIL::PfilOpen(&fni)) != pvNil) { bool fGotTok; BVEC3 bvec3Int = {BR_SCALAR(0), BR_SCALAR(0), BR_SCALAR(0)}; BVEC3 bvec3Pos; S2BLX s2blx(pfil, fFalse); S2BTK s2btk; /* Parse the data in the file */ fGotTok = s2blx.FGetS2btk(&s2btk); while (fGotTok) { switch (s2btk.tok.tt) { case ttPosition: if (!(fGotTok = s2blx.FGetS2btk(&s2btk)) || s2btk.tok.tt != ttStatic) { printf("Error: Expected " DK_A_POS_STATIC_TOKEN " after " DK_A_LIGHT_POS_TOKEN "\n"); goto LFail; } /* Read the vector */ if (!_FBvec3Read(&s2blx, &bvec3Pos, &s2btk)) goto LFail; break; case ttInterest: if (!(fGotTok = s2blx.FGetS2btk(&s2btk)) || s2btk.tok.tt != ttStatic) { printf("Error: Expected " DK_A_POS_STATIC_TOKEN " after " DK_A_LIGHT_INT_TOKEN "\n"); goto LFail; } /* Read the vector */ if (!_FBvec3Read(&s2blx, &bvec3Int, &s2btk)) goto LFail; /* Generate vector for light's +Z axis */ BrVector3Sub(&bvec3Int, &bvec3Pos, &bvec3Int); /* Create light's transformation matrix */ _Bmat34FromVec3(&bvec3Int, &plite->bmat34); BrMatrix34PostTranslate(&plite->bmat34, bvec3Pos.v[0], bvec3Pos.v[1], bvec3Pos.v[2]); break; default: break; } fGotTok = s2blx.FGetS2btk(&s2btk); } ReleasePpo(&pfil); } else printf("Error: Couldn't open light file\n"); } else printf("Error: Couldn't build light filename\n"); LFail: return; } /****************************************************************************** _ReadCam Reads a SoftImage ASCII camera file and fills in the given CAM structure as appropriate. Arguments: PSTN pstnCam -- the name of the camera file CAM *pcam -- pointer to the CAM to fill in ************************************************************ PETED ***********/ void S2B::_ReadCam(PSTN pstnCam, CAM *pcam, PGL *ppglapos) { bool fGotActorPos = fFalse; FNI fni; FIL *pfil; /* Attempt to open the camera file */ _ps2blx->GetFni(&fni); if (fni.FSetLeaf(pstnCam, kftgACam)) { Assert(fni.Ftg() == kftgACam, "Camera file has wrong extension"); if ((pfil = FIL::PfilOpen(&fni)) != pvNil) { bool fGotTok; BVEC3 bvec3Int; BVEC3 bvec3Pos; S2BLX s2blx(pfil, fFalse); S2BTK s2btk; /* Parse the data in the camera file */ fGotTok = s2blx.FGetS2btk(&s2btk); while (fGotTok) { switch (s2btk.tok.tt) { case ttPosition: if (!(fGotTok = s2blx.FGetS2btk(&s2btk)) || s2btk.tok.tt != ttStatic) { printf("Error: Expected " DK_A_POS_STATIC_TOKEN " after " DK_A_CAMERA_POS_TOKEN "\n"); goto LFail; } /* Read the position */ if (!_FBvec3Read(&s2blx, &bvec3Pos, &s2btk)) goto LFail; break; case ttInterest: if (!(fGotTok = s2blx.FGetS2btk(&s2btk)) || s2btk.tok.tt != ttStatic) { printf("Error: Expected " DK_A_POS_STATIC_TOKEN " after " DK_A_CAMERA_INT_TOKEN "\n"); goto LFail; } /* Read the interest (where the camera's looking) */ if (!_FBvec3Read(&s2blx, &bvec3Int, &s2btk)) goto LFail; /* Create vector for camera's positive X-axis (away from where it's looking */ BrVector3Sub(&bvec3Int, &bvec3Pos, &bvec3Int); /* Get transformation for camera */ _Bmat34FromVec3(&bvec3Int, &pcam->bmat34Cam); BrMatrix34PostTranslate(&pcam->bmat34Cam, bvec3Pos.v[0], bvec3Pos.v[1], bvec3Pos.v[2]); break; case ttNearCam: // Near plane if (!(fGotTok = s2blx.FGetS2btk(&s2btk)) || !_FBrsFromS2btk(&s2btk, &pcam->zrHither)) { printf("Error: Invalid " DK_A_CAMERA_NEAR_TOKEN " data\n"); goto LFail; } break; case ttFarCam: // Far plane if (!(fGotTok = s2blx.FGetS2btk(&s2btk)) || !_FBrsFromS2btk(&s2btk, &pcam->zrYon)) { printf("Error: Invalid " DK_A_CAMERA_FAR_TOKEN " data\n"); goto LFail; } break; case ttFovCam: // Field Of View { BRS brs; if (!(fGotTok = s2blx.FGetS2btk(&s2btk)) || !_FBrsFromS2btk(&s2btk, &brs)) { printf("Error: Invalid " DK_A_CAMERA_FOV_TOKEN " data\n"); goto LFail; } pcam->aFov = BrRadianToAngle(brs); break; } case ttNewActorPos: { BVEC3 bvec3Actor; if (!_FBvec3Read(&s2blx, &bvec3Actor, &s2btk)) goto LFail; if (!fGotActorPos) { pcam->apos.bvec3Actor = bvec3Actor; fGotActorPos = fTrue; } else { if (*ppglapos != pvNil || (*ppglapos = GL::PglNew(size(APOS))) != pvNil) { APOS apos; apos.bvec3Actor = bvec3Actor; (*ppglapos)->FAdd(&apos); // Ignore failure } } break; } default: break; } fGotTok = s2blx.FGetS2btk(&s2btk); } ReleasePpo(&pfil); if (!fGotActorPos) { BRS zrCam = kzrDefault; /* Ensure depth of location is within the bounds of the cam */ if (BR_ABS(zrCam) > pcam->zrYon) zrCam = BR_CONST_DIV(BR_ADD(pcam->zrYon, pcam->zrHither), -2); /* Translate (0,0,zrCam) in cam coords into world coords */ pcam->apos.bvec3Actor.v[0] = BR_ADD(BR_MUL(kzrDefault, pcam->bmat34Cam.m[2][0]), pcam->bmat34Cam.m[3][0]); pcam->apos.bvec3Actor.v[1] = rZero; pcam->apos.bvec3Actor.v[2] = BR_ADD(BR_MUL(kzrDefault, pcam->bmat34Cam.m[2][2]), pcam->bmat34Cam.m[3][2]); } } else printf("Error: Couldn't open camera file\n"); } else printf("Error: Couldn't build camera filename\n"); LFail: return; } /*----------------------------------------------------------------------------- | _FProcessModel | Converts a SoftImage model hierarchy into a tree of Brender models. | Only mesh nodes are saved, but transformation information in propogated | to children nodes as necessary. | | Arguments: | Model *pmodel -- points to the root of the model hierarchy to convert | BMAT34 bmat34Acc -- transformation matrix to be included in current | node's transformation. | PBMHR *ppbmhr -- points to the pointer to the root of the Brender | model hierarchy. | PBMHR pbmhrParent -- points to the actual parent node of this node | | Returns: | fTrue if succeeds, fFalse otherwise (usually due to OOM) | -------------------------------------------------------------PETED-----------*/ bool S2B::_FProcessModel(Model *pmodel, BMAT34 bmat34Acc, PBMHR *ppbmhr, PSTN pstnSubmodel, PBMHR pbmhrParent, int cLevel) { bool fRet = fTrue, fSubmodel, fKeepNode; BRA braX, braY, braZ; BRS brsX, brsY, brsZ; Model *pmodelChild = pmodel->child; if ((fSubmodel = (pstnSubmodel == pvNil || (pstnSubmodel->Cch() == 0) || pstnSubmodel->FEqualSz(pmodel->name))) != fFalse) { bool fHaveBPS = fFalse; pstnSubmodel = pvNil; /* Include translation */ brsX = BrFloatToFixed(pmodel->translation.x); brsY = BrFloatToFixed(pmodel->translation.y); brsZ = BrFloatToFixed(_iZsign * pmodel->translation.z); if (_uRoundXF > 0) { brsX = BR_ROUND(brsX, _uRoundXF); brsY = BR_ROUND(brsY, _uRoundXF); brsZ = BR_ROUND(brsZ, _uRoundXF); } BrMatrix34PreTranslate(&bmat34Acc, brsX, brsY, brsZ); /* Include rotation */ braX = BrRadianToAngle(BrFloatToFixed(pmodel->rotation.x)); braY = BrRadianToAngle(BrFloatToFixed(pmodel->rotation.y)); braZ = BrRadianToAngle(BrFloatToFixed(pmodel->rotation.z)); if (_uRoundXF > 0) { braX = BrScalarToAngle(BR_ROUND(BrAngleToScalar(braX), _uRoundXF)); braY = BrScalarToAngle(BR_ROUND(BrAngleToScalar(braY), _uRoundXF)); braZ = BrScalarToAngle(BR_ROUND(BrAngleToScalar(braZ), _uRoundXF)); } BrMatrix34PreRotateZ(&bmat34Acc, braZ); BrMatrix34PreRotateY(&bmat34Acc, braY); BrMatrix34PreRotateX(&bmat34Acc, braX); /* Include scaling (comes last for SoftImage) */ brsX = BrFloatToFixed(pmodel->scaling.x); brsY = BrFloatToFixed(pmodel->scaling.y); brsZ = BrFloatToFixed(pmodel->scaling.z); if (_uRoundXF > 0) { brsX = BR_ROUND(brsX, _uRoundXF); brsY = BR_ROUND(brsY, _uRoundXF); brsZ = BR_ROUND(brsZ, _uRoundXF); } BrMatrix34PreScale(&bmat34Acc, brsX, brsY, brsZ); fHaveBPS = CchSz(pmodel->name) > 1 && _ps2blx->FIsDigit(pmodel->name[0]) && _ps2blx->FIsDigit(pmodel->name[1]); fKeepNode = (pmodel->type == DK_MDL_MESH || pmodel->type == DK_MDL_NILL); switch (_mdBPS) { case kmdbpsNone: fHaveBPS = fFalse; break; case kmdbpsNumberedOnly: fKeepNode = fKeepNode && fHaveBPS; break; case kmdbpsAllMesh: fKeepNode = fKeepNode && (fHaveBPS || pmodel->type == DK_MDL_MESH); break; case kmdbpsAllMeshNull: break; } if (fKeepNode) { bool fAccessory; int ibps; if (fHaveBPS) { fAccessory = (CchSz(pmodel->name) > 4) && (pmodel->name[3] == ChLit('A')) && (pmodel->name[4] == ChLit('C')); ibps = (pmodel->name[0] - ChLit('0')) * 10 + pmodel->name[1] - ChLit('0'); } else { fAccessory = fFalse; ibps = 0; } /* Output info */ if (_fMakeGlpi && (_mdVerbose > kmdQuiet) || _mdVerbose > kmdHelpful) { if (cLevel > 0) printf("%*c", cLevel * 2, ' '); printf("node \"%s\" (body part set %d)\n", pmodel->name, ibps); } cLevel++; /* create model node */ if ((pbmhrParent = _PbmhrFromModel(pmodel, &bmat34Acc, ppbmhr, pbmhrParent, ibps, fAccessory)) == pvNil) { printf("Out of memory allocating model node\n"); goto LFail; } pbmhrParent->fAccessory = fAccessory; /* Anchor this node */ _cMesh++; _cFace += pbmhrParent->pmodlf->cfac; ppbmhr = &(pbmhrParent->pbmhrChild); BrMatrix34Identity(&bmat34Acc); } else if (pmodel->type == DK_MDL_MESH && _fMakeGlpi) printf("Warning: mesh node \"%s\" has no body part set\n", pmodel->name); } /* Descend and process any children */ while (pmodelChild != pvNil) { Assert(*ppbmhr == pvNil, "Non-nil parent pointer"); if (!_FProcessModel(pmodelChild, bmat34Acc, ppbmhr, pstnSubmodel, pbmhrParent, cLevel)) goto LFail; while (*ppbmhr != pvNil) ppbmhr = &((*ppbmhr)->pbmhrSibling); pmodelChild = pmodelChild->sibling; } return fTrue; /* Clean up if we fail */ LFail: _DisposeBmhr(&_pbmhr); return fFalse; } /*----------------------------------------------------------------------------- | _PbmhrFromModel | Converts a single SoftImage model node into a single Brender model | node. Adds the new node as a child to the parent node. | | Arguments: | Model *pmodel -- points to SoftImage model node to convert | BMAT34 *pbmat34 -- specifies the transformation for this node | PBMHR *ppbmhr -- points to pointer that points to this new child | PBMHR pbmhrParent -- points to the actual parent of this new child | int ibps -- body part set number | bool fAccessory -- fTrue if the body part is an accessory | | Returns: | A pointer to the new node, pvNil if there was some error | -------------------------------------------------------------PETED-----------*/ PBMHR S2B::_PbmhrFromModel(Model *pmodel, BMAT34 *pbmat34, PBMHR *ppbmhr, PBMHR pbmhrParent, int ibps, bool fAccessory) { bool fMesh; long cb; long cbrgver; long cbrgfac; PBMHR pbmhrCur = pvNil; MODLF *pmodlf; Mesh *pmesh = (Mesh *)pmodel->definition; Material *pmaterial; CRNG crng; BRCLR brclr; /* Ignore geometry if it doesn't exist, or if we're only interested in the material information. Theoretically, we should really just not bother with the modlf at all if we're only making the costume, but we gain back most of the overhead with this simple change. */ fMesh = pmesh != pvNil && (!_fCostumeOnly || fAccessory); /* Allocate necessary pieces: BMHR, appropriately sized MODLF, and name */ if (fMesh) { Assert(pmodel->type == DK_MDL_MESH, "Data present in non-mesh model"); cbrgver = LwMul(pmesh->nbVertices, size(br_vertex)); cbrgfac = LwMul(pmesh->nbPolygons, size(br_face)); cb = size(MODLF) + cbrgver + cbrgfac; } else { Assert(_fCostumeOnly || pmodel->type != DK_MDL_MESH, "Mesh model has no data"); cb = size(MODLF); } if (!FAllocPv((void **)&pmodlf, cb, fmemClear, mprNormal)) { printf("Couldn't allocate MODLF structure\n"); goto LFail; } if (!FAllocPv((void **)&pbmhrCur, size(BMHR), fmemClear, mprNormal)) { printf("Couldn't allocate Brender hierarchy node\n"); FreePpv((void **)&pmodlf); goto LFail; } if (FAllocPv((void **)&pbmhrCur->pszName, CchTotSz(pmodel->name) * size(achar), fmemNil, mprNormal)) { CopyPb(pmodel->name, pbmhrCur->pszName, CchTotSz(pmodel->name) * size(achar)); } #ifdef DEBUG else Assert(pbmhrCur->pszName == pvNil, "Bad pointer"); #endif // DEBUG pbmhrCur->pmodlf = pmodlf; _InitBmhr(pbmhrCur); #ifdef DEBUG /* Just to be nice, keep siblings in same order as in SoftImage data */ /* This housework is done in FProcessModel now so as to avoid iterating over the sibling chain over and over */ Assert(*ppbmhr == pvNil, "Improper call to _PbmhrFromModel"); while (*ppbmhr != pvNil) ppbmhr = &((*ppbmhr)->pbmhrSibling); #endif // DEBUG /* Fill in MODLF */ if (fMesh) { pmodlf->cver = (short)pmesh->nbVertices; pmodlf->cfac = (short)pmesh->nbPolygons; _CopyVertices(pmesh->vertices, PvAddBv(pmodlf, size(MODLF)), pmesh->nbVertices); _CopyFaces(pmesh->polygons, PvAddBv(pmodlf, size(MODLF) + cbrgver), pmesh->nbPolygons, (BRV *)PvAddBv(pmodlf, size(MODLF)), pmodlf->cver); /* I considered having the _Copy... routines do the hashing, since they're already stepping through the bytes. However, they do such little pieces at a time, I believe that the function-call overhead would obliterate any savings from doing so. */ } else pmodlf->cver = pmodlf->cfac = 0; /* Fill in BMHR */ pbmhrCur->pmodlf = pmodlf; pbmhrCur->cbModlf = cb; pbmhrCur->bmat34 = *pbmat34; pbmhrCur->ibps = ibps; pbmhrCur->fFixWrap = fFalse; /* Handle material information */ pmaterial = pmodel->materials; if (pmaterial != pvNil) _TextureFileFromModel(pmodel, pbmhrCur, !_fMakeCostume || _pglclr == pvNil); if (_fMakeCostume && _pglclr != pvNil) { Assert(pmodel->currentMaterial == 0, "Using the wrong material"); /* Get material from this model, if it exists */ if (pmaterial != pvNil) { brclr = BR_DK_TO_BR(pmaterial->ambient); pbmhrCur->fMtrlf = fTrue; _pglcrng->Get(LwcrngNearestBrclr(brclr, _pglclr, _pglcrng), &crng); if (_fColorOnly) goto LColorOnly; pbmhrCur->mtrlf.brufKa = BR_DKRGB_TO_FRGRAY(pmaterial->ambient); pbmhrCur->mtrlf.brufKd = BR_DKRGB_TO_FRGRAY(pmaterial->diffuse); if (pmaterial->type == DK_MAT_LAMBERT) pbmhrCur->mtrlf.brufKs = BR_SCALAR(0); else pbmhrCur->mtrlf.brufKs = BR_DKRGB_TO_FRGRAY(pmaterial->specular); goto LFinishMtrl; } /* If this model has no material of its own and it has a parent, get the parent's material */ else if (pbmhrParent != pvNil) { Assert(!fMesh || pbmhrParent->fMtrlf, "Warning: mesh node has no material parent"); pbmhrCur->mtrlf = pbmhrParent->mtrlf; /* REVIEW peted: bogus...if an STN were derived from the BASE class, I could just AddRef it and copy the pointer here rather than allocating a whole new STN */ if (pbmhrParent->pstnMtrlFile != pvNil && (pbmhrCur->pstnMtrlFile = new STN()) != pvNil) { *pbmhrCur->pstnMtrlFile = *pbmhrParent->pstnMtrlFile; } pbmhrCur->fMtrlf = pbmhrParent->fMtrlf; } /* If there's no parent, and no material, make something up */ else { if (fMesh) printf("Warning: missing material for mesh node!\n"); Assert(!pbmhrCur->fMtrlf, 0); _pglcrng->Get(0, &crng); LColorOnly: pbmhrCur->mtrlf.brufKa = BR_UFRACTION(0); pbmhrCur->mtrlf.brufKd = BR_UFRACTION(1.0); pbmhrCur->mtrlf.brufKs = BR_UFRACTION(0); /* Finish filling in the material information */ LFinishMtrl: pbmhrCur->mtrlf.brc = 0; // unused by Socrates Assert(crng.lwBase < kbMax, "Color index base too high"); Assert(crng.lwRange < kbMax, "Color index range too high"); pbmhrCur->mtrlf.bIndexBase = (byte)crng.lwBase; /* Brender color range is defined by max val rather than count */ pbmhrCur->mtrlf.cIndexRange = (byte)crng.lwRange - 1; pbmhrCur->mtrlf.rPower = BrIntToScalar(50); // REVIEW peted: need real val here } } Assert(pbmhrCur->pbmhrChild == pvNil, 0); /* Hook it in */ *ppbmhr = pbmhrCur; LFail: return pbmhrCur; } /****************************************************************************** _TextureFileFromModel Extracts the base texture name from the file name given in a model's material information. First looks in the model itself for a texture filename, and if no texture is found there, checks the first material listed for the model. Copies texture translation and cropping info if the texture is present. Arguments: Model *pmodel -- The model to process PBMHR pbmhr -- the actual hiearchy node bool fWrapOnly -- just fill in the wrap-fix stuff ************************************************************ PETED ***********/ void S2B::_TextureFileFromModel(Model *pmodel, PBMHR pbmhr, bool fWrapOnly) { AssertVarMem(pmodel); AssertVarMem(pmodel->materials); AssertVarMem(pbmhr); char *pch, *pszName; PSTN pstn = pvNil; Texture *ptexture; /* Look for a texture in the model; if the model doesn't have one, check its first material */ if (pmodel->nbTextures < 1) { if (pmodel->materials->nbTextures < 1) goto LNotexture; ptexture = pmodel->materials->textures; } else ptexture = pmodel->textures; if (fWrapOnly) goto LDoWrap; pstn = new STN(); if (pstn != pvNil) { pszName = ptexture->pic_name; pch = pszName + strlen(pszName); while (*(--pch) != ChLit('/') && pch > pszName) ; if (*pch == ChLit('/')) pch++; *pstn = pch; pbmhr->brufrUOffset = BrScalarToUFraction(BrFloatToScalar(ptexture->uOffset)); pbmhr->brufrVOffset = BrScalarToUFraction(BrFloatToScalar(ptexture->vOffset)); pbmhr->fCrop = FPure(ptexture->cropping) && (ptexture->uMinCrop || ptexture->uMaxCrop || ptexture->vMinCrop || ptexture->vMaxCrop); if (pbmhr->fCrop) { pbmhr->uMinCrop = ptexture->uMinCrop; pbmhr->uMaxCrop = ptexture->uMaxCrop; pbmhr->vMinCrop = ptexture->vMinCrop; pbmhr->vMaxCrop = ptexture->vMaxCrop; } LDoWrap: switch (ptexture->method) { case DK_TXT_SPHERICAL: pbmhr->fSpherical = fTrue; case DK_TXT_CYLINDRICAL: pbmhr->fFixWrap = fTrue; break; default: Assert(!pbmhr->fFixWrap, "Inconsistent fixwrap setting for node"); break; } } LNotexture: pbmhr->pstnMtrlFile = pstn; } /****************************************************************************** _FTmapFromBmp Given a texture name, adds the texture to the MTRL with the given CNO. If this texture has never been seen before, the .bmp file is converted to an appropriate TMAP chunk file. The reference to the parent MTRL's CNO is added to our list of generated TMAPs for use later in actually dumping out the TMAP chunk definition. Arguments: PSTN pstnBmpFile -- the name of the texture CNO cnoPar -- the CNO of the parent MTRL pstnMtrl -- the string used for the MTRL name Returns: fTrue if the texture was successfully added ************************************************************ PETED ***********/ bool S2B::_FTmapFromBmp(PBMHR pbmhr, CNO cnoPar, PSTN pstnMtrl) { Assert(pbmhr != pvNil, 0); AssertPo(pbmhr->pstnMtrlFile, 0); bool fRet = fFalse; long itmapd, itmapdMac; FNI fni; PTMAP ptmap = pvNil; TMAPD tmapd; PSTN pstnBmpFile = pbmhr->pstnMtrlFile; /* Look for the bitmap file in our list */ if (_pggtmapd == pvNil && (_pggtmapd = GG::PggNew(size(TMAPD))) == pvNil) goto LFail; itmapdMac = _pggtmapd->IvMac(); for (itmapd = 0; itmapd < itmapdMac; itmapd++) { _pggtmapd->GetFixed(itmapd, &tmapd); if (pstnBmpFile->FEqual(tmapd.pstn)) break; } if (itmapd == itmapdMac) { _stnT = *pstnBmpFile; _ps2blx->GetFni(&fni); if (!fni.FSetLeaf(&_stnT, kftgBmp)) goto LFail; ptmap = TMAP::PtmapReadNative(&fni); if (ptmap == pvNil) goto LFail; if (!fni.FChangeFtg(kftgTmapChkFile)) goto LFail; if ((tmapd.pstn = new STN()) == pvNil) goto LFail; *tmapd.pstn = *pstnBmpFile; tmapd.ccnoPar = 1; tmapd.xp = ptmap->Pbpmp()->width; tmapd.yp = ptmap->Pbpmp()->height; if (!_pggtmapd->FAdd(size(CNO), pvNil, &cnoPar, &tmapd)) goto LFailAdd; /* Write the file out last; it's easier to remove the reference to a failed file than to delete a file that's not referenced :) */ if (!ptmap->FWriteTmapChkFile(&fni, fTrue)) { _pggtmapd->Delete(itmapd); LFailAdd: delete tmapd.pstn; goto LFail; } } else { if (!_pggtmapd->FInsertRgb(itmapd, tmapd.ccnoPar * size(CNO), size(CNO), &cnoPar)) goto LFail; tmapd.ccnoPar++; _pggtmapd->PutFixed(itmapd, &tmapd); } if (pbmhr->brufrUOffset != BR_UFRACTION(0) || pbmhr->brufrVOffset != BR_UFRACTION(0) || pbmhr->fCrop) { BRS brsXScale, brsYScale; BRS brsdu, brsdv; TXXFF txxff; txxff.bo = kboCur; txxff.osk = koskCur; /* Scaling is the ratio of the width and height of the bitmap left after removing the cropped areas to the width and height of the original bitmap. The pixel u/vMax is included in the cropped and offset texture. */ brsXScale = BR_DIV(BrIntToScalar(pbmhr->uMaxCrop - pbmhr->uMinCrop + 1), BrIntToScalar(tmapd.xp)); brsYScale = BR_DIV(BrIntToScalar(pbmhr->vMaxCrop - pbmhr->vMinCrop + 1), BrIntToScalar(tmapd.yp)); BrMatrix23Scale(&txxff.bmat23, brsXScale, brsYScale); /* Total offset is the specified offset, plus the necessary offset for any cropping */ brsdu = BR_ADD(BrUFractionToScalar(pbmhr->brufrUOffset), BR_DIV(BrIntToScalar(pbmhr->uMinCrop), BrIntToScalar(tmapd.xp))); brsdv = BR_SUB(BR_DIV(BrIntToScalar(tmapd.yp - pbmhr->vMaxCrop), BrIntToScalar(tmapd.yp)), BrUFractionToScalar(pbmhr->brufrVOffset)); BrMatrix23PostTranslate(&txxff.bmat23, brsdu, brsdv); /* Dump out the TXXFF chunk for this material */ pstnMtrl->FAppendSz(PszLit(" Texture transform")); CnoNext(); _DumpHeader(kctgTxxf, _cnoCur, pstnMtrl, fTrue); _chse.DumpParentCmd(kctgMtrl, cnoPar, 0); _chse.DumpRgb(&txxff, size(txxff)); _chse.DumpSz(PszLit("ENDCHUNK")); _chse.DumpSz(PszLit("")); } fRet = fTrue; LFail: ReleasePpo(&ptmap); return fRet; } /****************************************************************************** _FFlushTmaps Actually writes out the TMAP definitions to the chunk source file. Each unique TMAP chunk is added once, with each MTRL that refers to it being included as a parent of the TMAP chunk. Returns: fTrue if all of the TMAP declarations could be generated; in theory, since we would have failed to even add a given TMAP to the list of TMAPs if we couldn't successfully generate the complete filename *and* failing to generate the complete filename is the only way for this routine to fail, this routine should never fail. ************************************************************ PETED ***********/ bool S2B::_FFlushTmaps(void) { AssertPo(_pggtmapd, 0); bool fRet = fTrue; long itmapd, itmapdMac = _pggtmapd->IvMac(); long icnoPar; CNO cnoPar; TMAPD tmapd; for (itmapd = 0; itmapd < itmapdMac; itmapd++) { FNI fni; _pggtmapd->GetFixed(itmapd, &tmapd); /* Generate the full filename for this texture */ _stnT = *tmapd.pstn; _ps2blx->GetFni(&fni); if (!fni.FSetLeaf(&_stnT, kftgTmapChkFile)) { fRet = fFalse; continue; } /* Emit the header */ CnoNext(); fni.GetLeaf(&_stnT); _DumpHeader(kctgTmap, _cnoCur, &_stnT, fFalse); /* Dump out all the necessary PARENT declarations */ for (icnoPar = 0; icnoPar < tmapd.ccnoPar; icnoPar++) { _pggtmapd->GetRgb(itmapd, icnoPar * size(CNO), size(CNO), &cnoPar); _chse.DumpParentCmd(kctgMtrl, cnoPar, 0); } /* Finish up the chunk */ fni.GetStnPath(&_stnT); _chse.DumpFileCmd(&_stnT, fTrue); _chse.DumpSz(PszLit("ENDCHUNK")); _chse.DumpSz(PszLit("")); } Assert(fRet, "_FFlushTmaps should never fail"); return fRet; } /****************************************************************************** _BrsdwrFromModel Computes a distance-between-cels for the given model, given the position of the last model. Arguments: Model *pmodel -- the new model BRS rgbrsDwr[] -- the position of the last model Returns: a Brender scalar that's the distance ************************************************************ PETED ***********/ BRS S2B::_BrsdwrFromModel(Model *pmodel, BRS rgbrsDwr[]) { BRS brsDwr, brsX, brsY, brsZ; /* Calculate difference */ brsX = BrFloatToScalar(pmodel->translation.x); brsY = BrFloatToScalar(pmodel->translation.y); brsZ = BrFloatToScalar(pmodel->translation.z); brsDwr = BR_LENGTH3(BR_SUB(rgbrsDwr[0], brsX), BR_SUB(rgbrsDwr[1], brsY), BR_SUB(rgbrsDwr[2], brsZ)); /* Remember current model position */ rgbrsDwr[0] = brsX; rgbrsDwr[1] = brsY; rgbrsDwr[2] = brsZ; /* Set model back to origin */ pmodel->translation.x = pmodel->translation.y = pmodel->translation.z = (float)0.0; return brsDwr; } /*----------------------------------------------------------------------------- | _CopyVertices | Copy floating point vertices from the SoftImage data structure to | Brender scalar vertices needed by the Brender data structure. | | Arguments: | DK_Vertex *vertices -- pointer to SoftImage vertices array | void *pvDst -- pointer to start of Brender vertices in MODLF | long cVertices -- count of vertices | -------------------------------------------------------------PETED-----------*/ void S2B::_CopyVertices(DK_Vertex *vertices, void *pvDst, long cVertices) { BRV *pbrv = (BRV *)pvDst; DK_Point vtxMin = {(float)klwMax, (float)klwMax, (float)klwMax}, vtxMax = {(float)klwMin, (float)klwMin, (float)klwMin}; for (; cVertices; cVertices--, vertices++, pbrv++) { BRS *pbrs = &pbrv->p.v[0], *pbrsMac = &pbrv->p.v[3]; float *pflPos = &vertices->position.x; vertices->position.z *= _iZsign; while (pbrs < pbrsMac) { *pbrs = BrFloatToScalar(*pflPos); if (_uRound > 0) *pbrs = BR_ROUND(*pbrs, _uRound); pbrs++; pflPos++; } if (_mdVerbose > kmdHelpful) { if (vertices->position.x < vtxMin.x) vtxMin.x = vertices->position.x; if (vertices->position.x > vtxMax.x) vtxMax.x = vertices->position.x; if (vertices->position.y < vtxMin.y) vtxMin.y = vertices->position.y; if (vertices->position.y > vtxMax.y) vtxMax.y = vertices->position.y; if (vertices->position.z < vtxMin.z) vtxMin.z = vertices->position.z; if (vertices->position.z > vtxMax.z) vtxMax.z = vertices->position.z; } } if (_mdVerbose > kmdHelpful) { if (_iZsign < 0) SwapVars(&vtxMin.z, &vtxMax.z); printf("Node bounds: (% 6.2f, % 6.2f, % 6.2f) - (% 6.2f, % 6.2f, % 6.2f)\n", vtxMin.x, vtxMin.y, _iZsign * vtxMin.z, vtxMax.x, vtxMax.y, _iZsign * vtxMax.z); } } /*----------------------------------------------------------------------------- | _CopyFaces | Copy all of the face data from the SoftImage list to the | Brender list. | | Arguments: | DK_Polygon *polygons -- list of SoftImage polygons (faces) | void *pvDst -- pointer to array of Brender faces | long cFaces -- count of faces to copy | -------------------------------------------------------------PETED-----------*/ void S2B::_CopyFaces(DK_Polygon *polygons, void *pvDst, long cFaces, BRV rgbrv[], long cVertices) { BRFC *pbrfc = (BRFC *)pvDst; for (; cFaces; cFaces--, polygons++, pbrfc++) { int cNodes = min(polygons->nbNodes, 3), i; DK_PolyNode *ppolynode = polygons->nodes; br_uint_16 *pvtx = &pbrfc->vertices[0]; /* If we get an invalid node count, warn about it and then fill in if necessary (REVIEW peted: seems highly unlikely that we'll ever have too few vertices, seeing as how any less than 3 gives a very uninteresting face indeed) */ if (polygons->nbNodes != 3) { printf("SoftImage data has %d vertices for face\n", polygons->nbNodes); Assert(cNodes == 3, "Better keep that 'fill-in' code"); for (i = cNodes; i < 3; i++) pvtx[i] = (br_uint_16)ppolynode->vertex; } /* copy the vertices for this face */ for (; cNodes; cNodes--, ppolynode++, pvtx++) { *pvtx = (br_uint_16)ppolynode->vertex; if (*pvtx < cVertices) { rgbrv[*pvtx].map.v[0] = BrFloatToScalar(ppolynode->uTxt); rgbrv[*pvtx].map.v[1] = BrFloatToScalar(ppolynode->vTxt); } else printf("Warning: vertex out of range for mesh\n"); } pbrfc->smoothing = 0x0001; } } /****************************************************************************** _FDoBodyPart Handles a single body part. Sets the Brender body part set for the given body part and stores that in the GL for the body part sets, and then handles actually generating whatever costume information for this body part is needed. Arguments: PBMHR pbmhr -- The BMHR that describes this body part long ibp -- the actual body part number for this body part Returns: fTrue if the body part could be added, and its basic costume information could be written out; failing to add the TMAP information simply generates a warning without causing this routine to return a failure. ************************************************************ PETED ***********/ bool S2B::_FDoBodyPart(PBMHR pbmhr, long ibp) { bool fRet = fFalse, fDoMtrl = (_pglclr != pvNil && _pglcmtld != pvNil); bool fUseMtrl; short ibps; long ibpGl; CMTLD cmtld; long icmtld, icmtldMac, iibps, iibpsMac; /* Find the appropriate CMTL */ if (fDoMtrl) { /* We may be only making costumes for a subset of the body part sets */ if (_pglibps != pvNil) { iibpsMac = _pglibps->IvMac(); for (iibps = 0; iibps < iibpsMac; iibps++) { long ibpsUse; _pglibps->Get(iibps, &ibpsUse); if (ibpsUse == pbmhr->ibps) break; } fUseMtrl = iibps < iibpsMac; } else fUseMtrl = fTrue; /* Go ahead and figure out the mapping from SI body part sets to Brender body part sets */ icmtldMac = _pglcmtld->IvMac(); for (icmtld = 0; icmtld < icmtldMac; icmtld++) { _pglcmtld->Get(icmtld, &cmtld); if (cmtld.ibps == pbmhr->ibps) break; } AssertIn(icmtld, kswMin, kswMax + 1); ibps = (short)icmtld; } else ibps = pbmhr->ibps; if (_fMakeGlpi && !_pglbs->FAdd(&ibps, &ibpGl)) goto LFail; if (_fMakeCostume) { Assert(!_fMakeGlpi || ibpGl == ibp, "Weird order for GLBS"); /* Handle material stuff, if we have color info */ if (fDoMtrl) { long ccmid; /* Create the CMTL chunk if necessary */ if (icmtld == icmtldMac) { long icmtldT; /* Add it to our list */ cmtld.cno = CnoNext(); cmtld.chidCur = 0; cmtld.ibps = pbmhr->ibps; cmtld.chid = _chidCmtl; if (!_pglcmtld->FAdd(&cmtld, &icmtldT)) goto LFail; Assert(icmtldT == icmtld, "Bogus icmtld"); /* Add it to the GGCM */ Assert(ibps <= _pggcm->IvMac(), "ibps out of range"); if (ibps == _pggcm->IvMac()) { long iv; ccmid = 0; if (!_pggcm->FAdd(0, &iv, pvNil, &ccmid)) goto LFail; Assert(iv == ibps, "bogus iv"); } if (fUseMtrl) { CMTLF cmtlf; _chidCmtl++; _pggcm->GetFixed(ibps, &ccmid); if (!_pggcm->FInsertRgb(ibps, size(long) * ccmid, size(long), &cmtld.chid)) goto LFail; ccmid++; _pggcm->PutFixed(ibps, &ccmid); /* Write a nice CMTL chunk */ cmtlf.bo = kboCur; cmtlf.osk = koskCur; cmtlf.ibset = ibps; if (ccmid == 1) { _stnT.FFormatSz(PszLit("%s Body Part Set %d Default"), &_stnTmpl, ibps); } else { _stnT.FFormatSz(PszLit("%s Body Part Set %d Costume %d"), &_stnTmpl, ibps, ccmid); } _DumpHeader(kctgCmtl, cmtld.cno, &_stnT, fTrue); _chse.DumpParentCmd(kctgTmpl, _cnoPar, cmtld.chid); _chse.DumpRgb(&cmtlf, size(cmtlf)); _chse.DumpSz(PszLit("ENDCHUNK")); _chse.DumpSz(PszLit("")); } } else if (fUseMtrl) _pggcm->GetFixed(ibps, &ccmid); /* Write a nice MTRL chunk for this body part */ if (fUseMtrl) { if (ccmid == 1) { _stnT.FFormatSz(PszLit("%s Part %d Default MTRL"), &_stnTmpl, ibp); } else { _stnT.FFormatSz(PszLit("%s Part %d Costume %d MTRL"), &_stnTmpl, ibp, ccmid); } CnoNext(); _DumpHeader(kctgMtrl, _cnoCur, &_stnT, fTrue); _chse.DumpParentCmd(kctgCmtl, cmtld.cno, cmtld.chidCur); _chse.DumpRgb(&pbmhr->mtrlf, size(MTRLF)); _chse.DumpSz(PszLit("ENDCHUNK")); _chse.DumpSz(PszLit("")); if (pbmhr->pstnMtrlFile != pvNil) { if (!_FTmapFromBmp(pbmhr, _cnoCur, &_stnT)) { printf("Warning: texture BMP file does not exist or is invalid (%s)\n", pbmhr->pstnMtrlFile->Psz()); } } if (pbmhr->fAccessory) { PBMDB pbmdb; KID kidBmdl; _ApplyBmdlXF(pbmhr); if (!_FChidFromModlf(pbmhr, pvNil, &pbmdb)) goto LFail; kidBmdl.cki.ctg = ctgNil; kidBmdl.cki.cno = cmtld.cno; kidBmdl.chid = cmtld.chidCur; if (!_FAddBmdlParent(pbmdb, &kidBmdl)) goto LFail; } cmtld.chidCur++; _pglcmtld->Put(icmtld, &cmtld); } } } fRet = fTrue; LFail: return fRet; } void S2B::_ApplyBmdlXF(PBMHR pbmhr) { long cver = pbmhr->pmodlf->cver; BRV *pbrv = (BRV *)PvAddBv(pbmhr->pmodlf, size(MODLF)); while (cver--) { BrMatrix34ApplyP(&pbrv->p, &pbrv->p, &pbmhr->bmat34); pbrv++; } } /*----------------------------------------------------------------------------- | _FProcessBmhr | Iterates through a Brender model hierarchy, creating the necessary | chunk data as it goes. The GLPI is made the first time, and then | verified each subsequent time for the template. The array of CPSs | is filled in for the given node of the given cel. If the MODLF is no | longer needed, it's freed; the model node is always freed. | | Arguments: | PBMHR *ppbmhr -- points to pointer that points to this node | short ibpPar -- index of this node's parent body part | | Returns: | fTrue if it succeeds, fFalse otherwise | -------------------------------------------------------------PETED-----------*/ bool S2B::_FProcessBmhr(PBMHR *ppbmhr, short ibpPar) { short ibpThis; PBMHR pbmhrCur = *ppbmhr, pbmhrNext; while (pbmhrCur != pvNil) { pbmhrNext = pbmhrCur->pbmhrSibling; /* Create Cel Part Spec for this node */ ibpThis = _ibpCur++; if (!_fCostumeOnly) { if (!_FSetCps(pbmhrCur, &_prgcps[ibpThis])) goto LFail; // _FSetCps already displayed the error } else Assert(_prgcps == pvNil, "Why is there an array of CPS allocated?"); /* Update or verify GLPI */ if (_fMakeGlpi) { long ibpGl; if (!_pglibactPar->FAdd(&ibpPar, &ibpGl)) { printf("Error: Couldn't add node to GLPI -- OOM\n"); goto LFail; } Assert(ibpGl == ibpThis, "Weird order for GLPI"); } else { short ibpParGlpi; _pglibactPar->Get(ibpThis, &ibpParGlpi); if (ibpPar != ibpParGlpi) { printf("Error: cel doesn't match previous GLPI hierarchy"); if (pbmhrCur->pszName != pvNil) printf(" (node %s)\n", pbmhrCur->pszName); else printf("\n"); goto LFail; } } if (_pglbs != pvNil && (_fMakeGlpi || _fMakeCostume) && !_FDoBodyPart(pbmhrCur, ibpThis)) { printf("Warning: no body part set information -- OOM\n"); ReleasePpo(&_pglbs); ReleasePpo(&_pglcmtld); } /* Process the children */ if (!_FProcessBmhr(&pbmhrCur->pbmhrChild, ibpThis)) { Assert(*ppbmhr == pbmhrCur, 0); goto LFail; } /* Clean up and go to next sibling */ FreePpv((void **)&pbmhrCur->pmodlf); FreePpv((void **)&pbmhrCur->pszName); if ((*ppbmhr)->pstnMtrlFile != pvNil) delete (*ppbmhr)->pstnMtrlFile; FreePpv((void **)&pbmhrCur); *ppbmhr = pbmhrCur = pbmhrNext; } return fTrue; LFail: return fFalse; } /*----------------------------------------------------------------------------- | _FEnsureOneRoot | Makes sure that the root of our Brender hierarchy has no siblings. | Will create a new null root if required. Will delete the entire tree | if it was unsuccessful. | | Arguments: | PBMHR *ppbmhr -- points to pointer to the root of the hierarchy | | Returns: | fTrue if it could make sure the tree had siblingless root | -------------------------------------------------------------PETED-----------*/ bool S2B::_FEnsureOneRoot(PBMHR *ppbmhr) { MODLF *pmodlf; PBMHR pbmhr; /* REVIEW peted: don't bother doing this, 'cause it messes up the material stuff. If we really care (which I'm not sure we do, since Socrates now handles multiple root-level nodes), we can fix this so that any automatically generated body part sets are also included in the list of body part sets to create material info for. Alternatively, Socrates could handle not having a material for a body part set more gracefully */ return fTrue; /* If the tree's empty, fail since there's no use making a null model */ if (*ppbmhr == pvNil) { printf("Error: no valid nodes found in model\n"); return fFalse; } /* If the tree's already good, great! */ if ((*ppbmhr)->pbmhrSibling == pvNil) return fTrue; /* Allocate necessary structures. The MODLF and the BMHR */ if (!FAllocPv((void **)&pmodlf, size(MODLF), fmemClear, mprNormal)) goto LFail; if (!FAllocPv((void **)&pbmhr, size(BMHR), fmemClear, mprNormal)) { FreePpv((void **)&pmodlf); goto LFail; } pbmhr->pmodlf = pmodlf; _InitBmhr(pbmhr); /* Fill in the MODLF; no faces or vertices */ Assert(pmodlf->cver == 0, "Didn't clear MODLF"); Assert(pmodlf->cfac == 0, "Didn't clear MODLF"); /* Fill in the BMHR */ pbmhr->cbModlf = size(MODLF); BrMatrix34Identity(&pbmhr->bmat34); pbmhr->pbmhrSibling = pvNil; /* Hook it in and count it */ pbmhr->pbmhrChild = *ppbmhr; *ppbmhr = pbmhr; _cMesh++; return fTrue; LFail: _DisposeBmhr(ppbmhr); return fFalse; } /****************************************************************************** _InitBmhr Initalize the chunk "F" structures for the BMHR Arguments: PBMHR pbmhr -- the BMHR to init ************************************************************ PETED ***********/ void S2B::_InitBmhr(PBMHR pbmhr) { pbmhr->pmodlf->bo = pbmhr->mtrlf.bo = kboCur; pbmhr->pmodlf->osk = pbmhr->mtrlf.osk = koskCur; } /* Wrap fixing code from Sam at Argonaut begins here */ /* * Flags to ModelFixWrapping() */ #define WRAP_U_0 0x40 #define WRAP_V_0 0x80 #define WRAP_U_1 0x10 #define WRAP_V_1 0x20 /* * Copyright (c) 1993-1995 by Argonaut Technologies Limited. All rights reserved. * * $Id: $ * $Locker: $ */ /* * Scratch structures used by ModelFixWrapping() */ struct wrap_face_info { br_uint_8 edge_dir[3]; br_uint_8 vflags[3]; }; struct wrap_edge_info { br_uint_16 old_vertices[2]; br_uint_16 vertices[2]; br_uint_8 count; br_uint_8 flags; br_uint_8 vflags[2]; }; /* * Temp. workspace used to build new vertices */ static br_vertex *WrapNewVertices; static int WrapTotalVertices; static int WrapNextVertex; /* * Adds a new vertex to model that has had it's * wrapping fixed */ static int WrapAddVertex(br_vertex *new_vp) { int i; struct br_vertex *vp; /* * Try and find vertex in current set */ vp = WrapNewVertices; for (i = 0; i < WrapNextVertex; i++, vp++) { if (new_vp->p.v[0] == vp->p.v[0] && new_vp->p.v[1] == vp->p.v[1] && new_vp->p.v[2] == vp->p.v[2] && new_vp->map.v[0] == vp->map.v[0] && new_vp->map.v[1] == vp->map.v[1]) return i; } /* * Add to end of list */ if (WrapNextVertex >= WrapTotalVertices) BR_ERROR0("WrapAddVertex: no space"); WrapNewVertices[WrapNextVertex] = *new_vp; return WrapNextVertex++; } /* * ModelFixWrapping() * * Processes a model and attempts to fix up seams where the texture * coordinates implicitly wrap. * * Takes a pointer to an integer mask of [WRAP_U , WRAP_V] * Each bit indicates that wrapping should be explored in that * texture axis. */ bool FModelFixWrapping(br_model *model, int *mask) { Assert(!(*mask & WRAP_V_0), "WRAP_V NYI"); bool fRet = fFalse; br_vertex *vp0, *vp1; br_face *fp; int f, e, e0, e1, v, num0_wraps, num1_wraps, v0, v1; struct wrap_edge_info *edge_info, *eip; struct wrap_face_info *face_info, *fip; br_vertex tempv; BRS brsMinDist0, brsMinDist1; /* Ensure edge info */ BrModelPrepare(model, BR_MPREP_EDGES); // edge_info = BrMemCalloc(model->nedges,sizeof(*edge_info),BR_MEMORY_APPLICATION); if (!FAllocPv((void **)&edge_info, model->nedges * size(wrap_edge_info), fmemClear, mprNormal)) { goto LFail; } // face_info = BrMemCalloc(model->nfaces,sizeof(*face_info),BR_MEMORY_APPLICATION); if (!FAllocPv((void **)&face_info, model->nfaces * size(wrap_face_info), fmemClear, mprNormal)) { goto LFail; } /* * Go through faces to build edge table */ fp = model->faces; fip = face_info; for (f = 0; f < model->nfaces; f++, fp++, fip++) { for (e0 = 0; e0 < 3; e0++) { e1 = (e0 == 2) ? 0 : (e0 + 1); eip = edge_info + fp->edges[e0]; eip->count++; if (eip->count == 1) { /* * First time edge has been used */ eip->vertices[0] = fp->vertices[e0]; eip->vertices[1] = fp->vertices[e1]; eip->old_vertices[0] = eip->vertices[0]; eip->old_vertices[1] = eip->vertices[1]; } /* * See which direction edge is used */ if (eip->vertices[0] == fp->vertices[e0] && eip->vertices[1] == fp->vertices[e1]) { fip->edge_dir[e0] = 0; } else if (eip->vertices[0] == fp->vertices[e1] && eip->vertices[1] == fp->vertices[e0]) { fip->edge_dir[e0] = 1; } else BR_ERROR1("Face %d has a bad edge\n", f); } } /* * For each edge - find if U or V wraps */ num0_wraps = 0; num1_wraps = 0; brsMinDist0 = brsMinDist1 = BR_SCALAR(1.0); eip = edge_info; for (e = 0; e < model->nedges; e++, eip++) { vp0 = model->vertices + eip->vertices[0]; vp1 = model->vertices + eip->vertices[1]; if ((*mask & WRAP_U_0) && (BR_ABS(vp0->map.v[0] - vp1->map.v[0]) > BR_SCALAR(0.5))) { br_uint_8 vf0, vf1; Assert(vp0->map.v[0] >= BR_SCALAR(0.0), "Vertex U less than 0"); Assert(vp0->map.v[0] <= BR_SCALAR(1.0), "Vertex U greater than 1"); Assert(vp1->map.v[0] >= BR_SCALAR(0.0), "Vertex U less than 0"); Assert(vp1->map.v[0] <= BR_SCALAR(1.0), "Vertex U greater than 1"); vf0 = vf1 = 0; if (vp0->map.v[0] > vp1->map.v[0]) { BRS brsDist; brsDist = BR_SUB(BR_SCALAR(1.0), vp0->map.v[0]); /* Put the new vertex colocated with whatever vertex is closest to the 0/1 boundary */ if (brsDist < vp1->map.v[0]) vf0 = WRAP_U_0; else vf1 = WRAP_U_1; } else { BRS brsDist; brsDist = BR_SUB(BR_SCALAR(1.0), vp1->map.v[0]); /* Ditto */ if (brsDist < vp0->map.v[0]) vf1 = WRAP_U_0; else vf0 = WRAP_U_1; } /* * Mark lower vertex as wrapping - keep a count * new wraps */ if (!(eip->vflags[0] & vf0)) { eip->vflags[0] |= vf0; if (vf0 & WRAP_U_0) num0_wraps++; else num1_wraps++; } if (!(eip->vflags[1] & vf1)) { eip->vflags[1] |= vf1; if (vf1 & WRAP_U_0) num0_wraps++; else num1_wraps++; } /* * mark face */ eip->flags |= WRAP_U_0; } #ifdef NOT if ((*mask & WRAP_V) && (BR_ABS(vp0->map.v[1] - vp1->map.v[1]) > BR_SCALAR(0.5))) { vw = (vp0->map.v[1] > vp1->map.v[1]) ? 1 : 0; if (!(eip->vflags[vw] & WRAP_V)) { eip->vflags[vw] |= WRAP_V; num_wraps++; } /* * mark face */ eip->flags |= WRAP_V; } #endif } /* * Go through faces and accumulate per face-vertex flags */ fp = model->faces; fip = face_info; for (f = 0; f < model->nfaces; f++, fp++, fip++) { for (e0 = 0; e0 < 3; e0++) { e1 = (e0 == 2) ? 0 : (e0 + 1); eip = edge_info + fp->edges[e0]; if (fip->edge_dir[e0]) v0 = 1, v1 = 0; else v0 = 0, v1 = 1; fip->vflags[e0] |= eip->vflags[v0]; fip->vflags[e1] |= eip->vflags[v1]; } } /* * Allocate a new vertex array (may be bigger than required) */ WrapTotalVertices = model->nvertices + num1_wraps + num0_wraps; WrapNewVertices = (BRV *)BrResAllocate(model, WrapTotalVertices * sizeof(*WrapNewVertices), BR_MEMORY_VERTICES); memcpy(WrapNewVertices, model->vertices, sizeof(*WrapNewVertices) * model->nvertices); WrapNextVertex = model->nvertices; /* * Go through faecs and generate new vertices */ fp = model->faces; fip = face_info; for (f = 0; f < model->nfaces; f++, fp++, fip++) { br_uint_8 vflags = 0, vbad = 0; int v0, v1; v0 = v1 = -1; for (v = 0; v < 3; v++) { br_vertex *pbrv; if (!(fip->vflags[v])) continue; Assert((fip->vflags[v] & (WRAP_U_0 | WRAP_U_1)) != (WRAP_U_0 | WRAP_U_1), "Both wrap flags set!"); Assert(v0 == -1 || v1 == -1, "Already seen two bad vertices"); /* * Make a copy of the vertex, and wrap * mapping coordinates */ pbrv = &WrapNewVertices[fp->vertices[v]]; tempv = *pbrv; vbad |= (0x01 << v); if (fip->vflags[v] & WRAP_U_0) { if (vflags & WRAP_U_0) v1 = v; else { vflags |= WRAP_U_0; v0 = v; } } else { Assert(fip->vflags[v] & WRAP_U_1, "Unknown wrap flag set"); if (vflags & WRAP_U_1) v0 = v; else { vflags |= WRAP_U_1; v1 = v; } } #ifdef NOT if (fip->vflags[v] & WRAP_U) tempv.map.v[0] = /* tempv.map.v[0] + */ BR_SCALAR(1.0); if (fip->vflags[v] & WRAP_V) tempv.map.v[1] = /* tempv.map.v[1] + */ BR_SCALAR(1.0); #endif } if (!vflags) continue; if ((vflags & (WRAP_U_0 | WRAP_U_1)) == (WRAP_U_0 | WRAP_U_1)) { int v_move, v_good; br_vertex *pbrv_good, *pbrv_move; br_scalar brs_new_u; /* Need to figure out which to actually move */ vbad ^= 0x07; Assert(!((vbad - 1) & vbad), "Should only have one bit set"); for (v_good = 0; vbad > 1; v_good++, vbad >>= 1) ; Assert(FIn(v_good, 0, 3), "vbad out of range"); pbrv_good = &WrapNewVertices[fp->vertices[v_good]]; /* The good vertex will be within 0.5 of the new u value */ if (pbrv_good->map.v[0] >= BR_SCALAR(0.5)) { brs_new_u = BR_SCALAR(1.0); v_move = v1; } else { brs_new_u = BR_SCALAR(0.0); v_move = v0; } pbrv_move = &WrapNewVertices[fp->vertices[v_move]]; Assert(BR_ABS(BR_SUB(pbrv_good->map.v[0], pbrv_move->map.v[0])) > BR_SCALAR(0.5), "Moved vertex is within 0.5 of good vertex"); tempv = *pbrv_move; tempv.map.v[0] = brs_new_u; fp->vertices[v_move] = WrapAddVertex(&tempv); } else { br_scalar brs_new_u; if (vflags & WRAP_U_0) brs_new_u = BR_SCALAR(0.0); else { Assert(vflags & WRAP_U_1, "Unknown wrap flag"); brs_new_u = BR_SCALAR(1.0); } /* Possibly need to move both vertices over to new u value */ if (v0 != -1) { tempv = WrapNewVertices[fp->vertices[v0]]; tempv.map.v[0] = brs_new_u; fp->vertices[v0] = WrapAddVertex(&tempv); } else Assert(vflags & WRAP_U_1, "Inconsistent wrap flag"); if (v1 != -1) { tempv = WrapNewVertices[fp->vertices[v1]]; tempv.map.v[0] = brs_new_u; fp->vertices[v1] = WrapAddVertex(&tempv); } else Assert(vflags & WRAP_U_0, "Inconsistent wrap flag"); } } // BrMemFree(face_info); FreePpv((void **)&face_info); // BrMemFree(edge_info); FreePpv((void **)&edge_info); /* * Connect new vertex array to faces */ BrResFree(model->vertices); model->vertices = WrapNewVertices; model->nvertices = WrapNextVertex; WrapNewVertices = NULL; fRet = fTrue; LFail: return fRet; } /* Wrap fix code from Sam at Argonaut ends here */ /*----------------------------------------------------------------------------- | _FlushTmplKids | Writes whatever the current template accumulators contain and | resets them. | -------------------------------------------------------------PETED-----------*/ void S2B::_FlushTmplKids(void) { int cBmdbTotal = 0, cBmdbChains = 0; #if HASH_FIXED PBMDB *ppbmdb; #endif /* HASH_FIXED */ PBMDB pbmdb, pbmdbNext; if (_pglibactPar != pvNil) { #if HASH_FIXED Assert(_prgpbmdb != pvNil, 0); PBMDB *ppbmdbMac = (_prgpbmdb + kcpbmdb); #else /* HASH_FIXED */ Assert(_pglpbmdb != pvNil, 0); long ipbmdb = _pglpbmdb->IvMac(); #endif /* !HASH_FIXED */ Assert(_ctgPar == kctgTmpl, "Odd parent for body part chunks"); CnoNext(); _stnT.FFormatSz(PszLit("%s Tree"), &_stnTmpl); _DumpHeader(kctgGlpi, _cnoCur, &_stnT, fTrue); _chse.DumpParentCmd(_ctgPar, _cnoPar, 0); _chse.DumpList(_pglibactPar); _chse.DumpSz(PszLit("ENDCHUNK")); _chse.DumpSz(PszLit("")); /* Create dummy GLBS if necessary */ if (_pglbs == pvNil) { short swZero = 0; Assert(_pglcmtld == pvNil, "Custom material info with no body part set info"); for (long lw = 0; lw < _pglibactPar->IvMac(); lw++) _pglibactPar->Put(lw, &swZero); _pglbs = _pglibactPar; _pglibactPar = pvNil; } else { /* Don't need this any more */ ReleasePpo(&_pglibactPar); /* Do material stuff if we have the CMTL GL and there's valid color info */ if (_pggcm != pvNil && _pglclr != pvNil) { /* Dump out GGCM */ Assert(_ctgPar == kctgTmpl, "Weird parent for GGCM"); CnoNext(); _stnT.FFormatSz(PszLit("%s Costumes"), &_stnTmpl); _DumpHeader(kctgGgcm, _cnoCur, &_stnT, fTrue); _chse.DumpParentCmd(_ctgPar, _cnoPar, 0); _chse.DumpGroup(_pggcm); _chse.DumpSz(PszLit("ENDCHUNK")); _chse.DumpSz(PszLit("")); } #ifdef DEBUG else if (_pggcm != pvNil) Assert(_pggcm->IvMac() == 0, "Non-empty GGCM without any color info"); #endif // DEBUG ReleasePpo(&_pggcm); if (_pggtmapd != pvNil) { if (!_FFlushTmaps()) printf("Warning: couldn't write all TMAPs; some textures may not be present\n"); ReleasePpo(&_pggtmapd); } } CnoNext(); _stnT.FFormatSz(PszLit("%s Body Part Sets"), &_stnTmpl); _DumpHeader(kctgGlbs, _cnoCur, &_stnT, fTrue); _chse.DumpParentCmd(_ctgPar, _cnoPar, 0); _chse.DumpList(_pglbs); _chse.DumpSz(PszLit("ENDCHUNK")); _chse.DumpSz(PszLit("")); ReleasePpo(&_pglbs); #if HASH_FIXED for (ppbmdb = _prgpbmdb; ppbmdb < ppbmdbMac; ppbmdb++) #else /* HASH_FIXED */ while (ipbmdb > 0) #endif /* !HASH_FIXED */ { int cBmdbList = 0; #if HASH_FIXED pbmdb = *ppbmdb; #else /* HASH_FIXED */ ipbmdb--; _pglpbmdb->Get(ipbmdb, &pbmdb); #endif /* !HASH_FIXED */ while (pbmdb != pvNil) { /* Don't bother fixing up a model with no vertices; it wastes time, and the Argonaut code doesn't handle that case gracefully anyway */ if (_fFixWrap && pbmdb->pmodlf->cver > 0 && pbmdb->fFixWrap) { bool fSuccess = fFalse; PBMDL pbmdl = pvNil; if (_FModlfToBmdl(pbmdb->pmodlf, &pbmdl)) { int mask; mask = pbmdb->fSpherical ? (WRAP_U_0 | WRAP_V_0) : WRAP_U_0; if (FModelFixWrapping(pbmdl, &mask)) { fSuccess = _FBmdlToModlf(pbmdl, &pbmdb->pmodlf, &pbmdb->cbModlf); } BrModelFree(pbmdl); } if (!fSuccess) { printf("Warning: couldn't fix up texture wrapping for"); if (pbmdb->pszName != pvNil) printf(" node %s\n", pbmdb->pszName); else printf(" unnamed node\n"); } } cBmdbList++; if (pbmdb->pszName == pvNil) _stnT.FFormatSz(PszLit("%s Model %d"), &_stnTmpl, pbmdb->chidBmdl); else _stnT.FFormatSz(PszLit("%s Model %z"), &_stnTmpl, pbmdb->pszName); _DumpHeader(kctgBmdl, pbmdb->cnoBmdl, &_stnT, fTrue); if (pbmdb->pglkidCmtl != pvNil) { long icno, icnoMac = pbmdb->pglkidCmtl->IvMac(); KID kidBmdl; for (icno = 0; icno < icnoMac; icno++) { pbmdb->pglkidCmtl->Get(icno, &kidBmdl); _chse.DumpParentCmd(kctgCmtl, kidBmdl.cki.cno, kidBmdl.chid); } ReleasePpo(&pbmdb->pglkidCmtl); } if (pbmdb->chidBmdl != ivNil) _chse.DumpParentCmd(_ctgPar, _cnoPar, pbmdb->chidBmdl); _chse.DumpRgb(pbmdb->pmodlf, pbmdb->cbModlf); _chse.DumpSz(PszLit("ENDCHUNK")); _chse.DumpSz(PszLit("")); pbmdbNext = (PBMDB)pbmdb->hshdb.phshdbNext; FreePpv((void **)&pbmdb->pmodlf); FreePpv((void **)&pbmdb->pszName); FreePpv((void **)&pbmdb); pbmdb = pbmdbNext; } cBmdbTotal += cBmdbList; if (_mdVerbose > kmdQuiet && cBmdbList > 0) { cBmdbChains++; printf("Model collision chain has %d entries\n", cBmdbList); } #if HASH_FIXED *ppbmdb = pvNil; #else /* HASH_FIXED */ _pglpbmdb->Delete(ipbmdb); #endif /* !HASH_FIXED */ } if (_mdVerbose > kmdQuiet) { float flAvg = (float)cBmdbTotal / (float)cBmdbChains; printf("Average collision chain has %1.2f entries (%d chains)\n", flAvg, cBmdbChains); } } Assert(_pglibactPar == pvNil, 0); Assert(_pglbs == pvNil, 0); Assert(_pglcmtld == pvNil, 0); #if HASH_FIXED Assert(*_prgpbmdb == pvNil, 0); #else /* HASH_FIXED */ Assert(_pglpbmdb->IvMac() == 0, 0); #endif /* !HASH_FIXED */ _chidActn = 0; _chidBmdl = 0; _chidCmtl = 0; } /****************************************************************************** _FModlfToBmdl Converts a MODLF structure to the corresponding Brender br_model structure (BMDL in Socrates nomenclature). Simply allocates a Brender model and copies the vertices. Arguments: PMODLF pmodlf -- the MODLF to convert PBMDL *ppbmdl -- takes the pointer to the new Brender model Returns: fTrue on success, fFalse otherwise ************************************************************ PETED ***********/ bool S2B::_FModlfToBmdl(PMODLF pmodlf, PBMDL *ppbmdl) { AssertVarMem(pmodlf); AssertVarMem(ppbmdl); Assert(*ppbmdl == pvNil, "Already have BMDL"); bool fRet = fFalse; long cbrgbrv, cbrgbrf; PBMDL pbmdl; pbmdl = BrModelAllocate(pvNil, pmodlf->cver, pmodlf->cfac); if (pbmdl == pvNil) goto LFail; cbrgbrv = LwMul(pmodlf->cver, size(BRV)); cbrgbrf = LwMul(pmodlf->cfac, size(BRF)); CopyPb(PvAddBv(pmodlf, size(MODLF)), pbmdl->vertices, cbrgbrv); CopyPb(PvAddBv(pmodlf, size(MODLF) + cbrgbrv), pbmdl->faces, cbrgbrf); *ppbmdl = pbmdl; fRet = fTrue; LFail: return fRet; } /****************************************************************************** _FBmdlToModlf Converts a Brender br_model to a MODLF structure. Ensures that the Brender model has been prepared and then copies all relevant information from the Brender model to the MODLF. Uses the passed in MODLF to initialize the newly created one so that untouched fields remain the same. Frees the old MODLF only on success. Arguments: PBMDL pbmdl -- the Brender model to convert PMODLF *ppmodlf -- provides the template for the MODLF, and takes the pointer to the new MODLF structure on success Returns: fTrue on success, fFalse otherwise ************************************************************ PETED ***********/ bool S2B::_FBmdlToModlf(PBMDL pbmdl, PMODLF *ppmodlf, long *pcb) { AssertVarMem(pbmdl); AssertVarMem(ppmodlf); AssertVarMem(*ppmodlf); bool fRet = fFalse; long cbrgbrv, cbrgbrf; PMODLF pmodlf; BrModelPrepare(pbmdl, BR_MPREP_ALL); /* REVIEW peted: is there an accepted way of determining if BrModelPrepare has failed? Can it fail? I think I can at least do the following... */ if (pbmdl->nvertices > 0 && pbmdl->nprepared_vertices == 0) goto LFail; if (pbmdl->nfaces > 0 && pbmdl->nprepared_faces == 0) goto LFail; cbrgbrv = LwMul(pbmdl->nprepared_vertices, size(BRV)); cbrgbrf = LwMul(pbmdl->nprepared_faces, size(BRF)); if (!FAllocPv((void **)&pmodlf, size(MODLF) + cbrgbrv + cbrgbrf, fmemClear, mprNormal)) goto LFail; CopyPb(*ppmodlf, pmodlf, size(MODLF)); pmodlf->cver = pbmdl->nprepared_vertices; pmodlf->cfac = pbmdl->nprepared_faces; pmodlf->rRadius = pbmdl->radius; pmodlf->brb = pbmdl->bounds; CopyPb(pbmdl->prepared_vertices, PvAddBv(pmodlf, size(MODLF)), cbrgbrv); CopyPb(pbmdl->prepared_faces, PvAddBv(pmodlf, size(MODLF) + cbrgbrv), cbrgbrf); FreePpv((void **)ppmodlf); *ppmodlf = pmodlf; *pcb = size(MODLF) + cbrgbrv + cbrgbrf; fRet = fTrue; LFail: return fRet; } /*----------------------------------------------------------------------------- | _FSetCps | Sets a Cel Part Spec. | | Arguments: | PBMHR pbmhr -- pointer to Brender mode hierarchy node to use | CPS *pcps -- pointer to CPS to fill in | | Returns: | fTrue if it was successful, fFalse otherwise | Keywords: | -------------------------------------------------------------PETED-----------*/ bool S2B::_FSetCps(PBMHR pbmhr, CPS *pcps) { long imat34; CHID chid; if (pbmhr->fAccessory) { if (pbmhr->pmodlf->cver != 0) printf("Warning: non-null accessory node during action definition;" " discarding mesh info\n"); pcps->chidModl = (short)ivNil; BrMatrix34Identity(&pbmhr->bmat34); } else { if (!_FChidFromModlf(pbmhr, &chid)) goto LFail; pcps->chidModl = (short)chid; } if (!_FImat34GetBmat34(&pbmhr->bmat34, &imat34)) { printf("Couldn't add entry to GLXF -- OOM\n"); goto LFail; } Assert(imat34 <= kswMax, 0); pcps->imat34 = (short)imat34; return fTrue; LFail: return fFalse; } /*----------------------------------------------------------------------------- | _FChidFromModlf | Looks up a given MODLF, and adds a new one to the MODLF database | if necessary. | | Arguments: | PBMHR pbmhr -- points to BMHR node that contains the pmodlf | CHID *pchid -- points to CHID var that takes the result | | Returns: | fTrue if it could find or allocate the new MODLF node, fFalse otherwise | *pchid takes the CHID for the MODL chunk | -------------------------------------------------------------PETED-----------*/ bool S2B::_FChidFromModlf(PBMHR pbmhr, CHID *pchid, PBMDB *ppbmdb) { AssertNilOrVarMem(pchid); AssertNilOrVarMem(ppbmdb); #if HASH_FIXED PBMDB *ppbmdb; #endif /* HASH_FIXED */ PBMDB pbmdb; uint luHashList; if ((pbmdb = _PbmdbFindModlf(pbmhr->pmodlf, pbmhr->cbModlf, &luHashList)) == pvNil) { if (FAllocPv((void **)&pbmdb, size(BMDB), fmemNil, mprNormal)) { /* Copy the pointers */ pbmdb->pmodlf = pbmhr->pmodlf; pbmhr->pmodlf = pvNil; pbmdb->pszName = pbmhr->pszName; pbmhr->pszName = pvNil; pbmdb->cbModlf = pbmhr->cbModlf; if (ppbmdb != pvNil) pbmdb->chidBmdl = _chidBmdl++; else pbmdb->chidBmdl = chidNil; pbmdb->cnoBmdl = CnoNext(); pbmdb->pglkidCmtl = pvNil; pbmdb->hshdb.luHash = luHashList; pbmdb->fSpherical = pbmhr->fSpherical; pbmdb->fFixWrap = pbmhr->fFixWrap; #if HASH_FIXED pbmdb->hshdb.phshdbNext = (PHSHDB) * (ppbmdb = (_prgpbmdb + luHashList)); *ppbmdb = pbmdb; #else /* HASH_FIXED */ Assert(pbmdb == (PBMDB)&pbmdb->hshdb, "Bad struct definition for BMDB"); if (!_FInsertPhshdb(&pbmdb->hshdb, _pglpbmdb)) { FreePpv((void **)&pbmdb); printf("Couldn't add node to model database\n"); return fFalse; } #endif /* !HASH_FIXED */ } else { printf("Couldn't allocate Model DB node\n"); return fFalse; } } else if (pbmdb->fSpherical != pbmhr->fSpherical || pbmdb->fFixWrap != pbmdb->fFixWrap) { printf("Warning: mesh found with identical vertices and u/v coordinates" "\n but different texture mapping modes\n"); } if (ppbmdb != pvNil) *ppbmdb = pbmdb; else if (pbmdb->chidBmdl == chidNil) pbmdb->chidBmdl = _chidBmdl++; if (pchid != pvNil) *pchid = pbmdb->chidBmdl; return fTrue; } bool S2B::_FAddBmdlParent(PBMDB pbmdb, KID *pkid) { AssertVarMem(pkid); if (pbmdb->pglkidCmtl == pvNil && (pbmdb->pglkidCmtl = GL::PglNew(size(KID))) == pvNil) { goto LFail; } if (!pbmdb->pglkidCmtl->FAdd(pkid)) goto LFail; return fTrue; LFail: return fFalse; } #if !HASH_FIXED /****************************************************************************** _FInsertPhshdb Inserts an hash database entry into a sparse, sorted hash table Arguments: PHSHDB phshdb -- pointer to the hash DB entry to insert PGL pglphshdb -- the GL used to maintain the sorted hash table Returns: fTrue if the entry could be inserted ************************************************************ PETED ***********/ bool S2B::_FInsertPhshdb(PHSHDB phshdb, PGL pglphshdb) { long iphshdb; if (!_FIphshdbFromLuHash(phshdb->luHash, &iphshdb, pglphshdb)) { phshdb->phshdbNext = pvNil; if (!pglphshdb->FInsert(iphshdb, &phshdb)) return fFalse; } else { pglphshdb->Get(iphshdb, &phshdb->phshdbNext); pglphshdb->Put(iphshdb, &phshdb); } return fTrue; } /****************************************************************************** _FIphshdbFromLuHash Determines the position that a given hash value does, or should be, located in the given sparse, sorted hash table. Arguments: uint luHash -- the hash value to look for long *piphshdb -- takes the position in the hash table PGL pglphshdb -- the hash table Returns: fTrue if the hash value is already in the hash table, fFalse if it needs to be added ************************************************************ PETED ***********/ bool S2B::_FIphshdbFromLuHash(uint luHash, long *piphshdb, PGL pglphshdb) { bool fRet = fFalse; long iphshdbMin = 0, iphshdbMac = pglphshdb->IvMac(); long iphshdbCur; PHSHDB phshdb; while (iphshdbMin != iphshdbMac) { iphshdbCur = (iphshdbMin + iphshdbMac) / 2; pglphshdb->Get(iphshdbCur, &phshdb); if (luHash > phshdb->luHash) iphshdbMin = iphshdbCur + 1; else iphshdbMac = iphshdbCur; } if (iphshdbMin < pglphshdb->IvMac()) { if (iphshdbCur != iphshdbMin) pglphshdb->Get(iphshdbMin, &phshdb); if (luHash == phshdb->luHash) fRet = fTrue; } *piphshdb = iphshdbMin; return fRet; } #endif /* !HASH_FIXED */ /****************************************************************************** _PbmdbFindModlf Given a MODLF, look for an identical one in our hash table. Arguments: MODLF *pmodlf -- the MODLF to look for int *pluHashList -- returns the hash value for the MODLF Returns: if the MODLF could be found, returns the pointer to the BMDB for that MODLF, otherwise returns pvNil. ************************************************************ PETED ***********/ PBMDB S2B::_PbmdbFindModlf(MODLF *pmodlf, long cbModlf, uint *pluHashList) { PBMDB pbmdb; #if !HASH_FIXED long ipbmdb; #endif /* !HASH_FIXED */ *pluHashList = _LuHashBytes(kluHashInit, pmodlf, cbModlf); #if HASH_FIXED pbmdb = *(_prgpbmdb + *pluHashList); #else /* HASH_FIXED */ if (!_FIphshdbFromLuHash(*pluHashList, &ipbmdb, _pglpbmdb)) return pvNil; _pglpbmdb->Get(ipbmdb, &pbmdb); #endif /* !HASH_FIXED */ while (pbmdb != pvNil) { if (pbmdb->cbModlf == cbModlf && (FcmpCompareRgb(pbmdb->pmodlf, pmodlf, cbModlf) == fcmpEq)) break; pbmdb = (PBMDB)pbmdb->hshdb.phshdbNext; } return pbmdb; } uint _rgluHashCrc[256]; Debug(bool _fTableValid = fFalse;) /****************************************************************************** _InitCrcTable Initialize the 8-bit hash value look-up table ************************************************************ PETED ***********/ void S2B::_InitCrcTable(void) { int icrc; /* Compute the hash value for each 8-bit byte value */ for (icrc = 0; icrc < 256; icrc++) { byte bcrc = (byte)icrc; _rgluHashCrc[bcrc] = _LuHashBytesNoTable(0, &bcrc, 1); } Debug(_fTableValid = fTrue;) } /****************************************************************************** _LuHashBytesNoTable Compute a hash value the hard way. Arguments: uint luHash -- initial hash value void *pv -- pointer to the data to hash long cb -- number bytes in the data to hash Returns: the hash value for the bytes ************************************************************ PETED ***********/ uint S2B::_LuHashBytesNoTable(uint luHash, void *pv, long cb) { byte *pb = (byte *)pv; int ibit; while (cb--) { luHash = (luHash ^ *pb++) & 0xFF; for (ibit = 0; ibit < 8; ibit++) if (luHash & 0x01) luHash = (luHash >> 1) ^ kluCrcPoly; else luHash = luHash >> 1; } return luHash; } /****************************************************************************** _LuHashBytes Compute a hash value using the lookup table Arguments: uint luHash -- initial hash value void *pv -- pointer to the data to hash long cb -- number of bytes in the data to hash Returns: the hash value for the bytes ************************************************************ PETED ***********/ uint S2B::_LuHashBytes(uint luHash, void *pv, long cb) { byte *pb = (byte *)pv; byte bCval; Assert(_fTableValid, "Can't use table hashing with uninited table"); while (cb--) { bCval = (luHash ^ *pb++) & 0xFF; luHash = (luHash >> 8) ^ _rgluHashCrc[bCval]; } return luHash; } /*----------------------------------------------------------------------------- | _FImat34GetBmat34 | Looks up a given BMAT34 in the transformation database, and returns | with the index for the found or created transformation. (NOTE: for now, | always adds a new transformation) | | Arguments: | BMAT34 *pbmat34 -- points to BMAT34 to look for | long *pimat34 -- points to long var that takes the result | | Returns: | fTrue if it succeeds, fFalse otherwise | *pimat34 takes the index for the BMAT34 in the GL | -------------------------------------------------------------PETED-----------*/ bool S2B::_FImat34GetBmat34(BMAT34 *pbmat34, long *pimat34) { BMAT34 *pbmat34T; #if HASH_FIXED long i, iMac = _pglxf->IvMac(); #else /* HASH_FIXED */ long ipbmatdb; uint luHash; PBMATDB pbmatdb; #endif /* !HASH_FIXED */ #if HASH_FIXED for (i = 0; i < iMac; i++) { pbmat34T = (BMAT34 *)_pglxf->QvGet(i); if (FcmpCompareRgb(pbmat34, pbmat34T, size(BMAT34)) == fcmpEq) { *pimat34 = i; return fTrue; } } return _pglxf->FAdd(pbmat34, pimat34); #else /* HASH_FIXED */ luHash = _LuHashBytes(kluHashInit, pbmat34, size(BMAT34)); if (!_FIphshdbFromLuHash(luHash, &ipbmatdb, _pglpbmatdb)) goto LAddXF; _pglpbmatdb->Get(ipbmatdb, &pbmatdb); while (pbmatdb != pvNil) { pbmat34T = (BMAT34 *)_pglxf->QvGet(pbmatdb->ixf); if (FcmpCompareRgb(pbmat34, pbmat34T, size(BMAT34)) == fcmpEq) break; pbmatdb = (PBMATDB)pbmatdb->hshdb.phshdbNext; } if (pbmatdb == pvNil) { LAddXF: /* Add the XF to the GL and to the database */ if (_pglxf->FAdd(pbmat34, pimat34)) { if (FAllocPv((void **)&pbmatdb, size(BMATDB), fmemNil, mprNormal)) { pbmatdb->ixf = *pimat34; pbmatdb->hshdb.luHash = luHash; Assert(pbmatdb == (PBMATDB)&pbmatdb->hshdb, "Bad struct definition for BMATDB"); if (!_FInsertPhshdb(&pbmatdb->hshdb, _pglpbmatdb)) { FreePpv((void **)&pbmatdb); printf("Error: Couldn't add node to transform database\n"); goto LFail; } } else { printf("Error: Couldn't allocate Transform DB node\n"); goto LFail; } } else goto LFail; } *pimat34 = pbmatdb->ixf; return fTrue; LFail: return fFalse; #endif /* !HASH_FIXED */ } /*----------------------------------------------------------------------------- | _DisposeBmhr | Deletes the entire tree of Brender model nodes. | | Arguments: | PBMHR *ppbmhr -- points to pointer that points to the tree | -------------------------------------------------------------PETED-----------*/ void S2B::_DisposeBmhr(PBMHR *ppbmhr) { PBMHR pbmhrNext; while (*ppbmhr != pvNil) { pbmhrNext = (*ppbmhr)->pbmhrSibling; _DisposeBmhr(&(*ppbmhr)->pbmhrChild); FreePpv((void **)&(*ppbmhr)->pmodlf); FreePpv((void **)&(*ppbmhr)->pszName); if ((*ppbmhr)->pstnMtrlFile != pvNil) delete (*ppbmhr)->pstnMtrlFile; FreePpv((void **)ppbmhr); *ppbmhr = pbmhrNext; } } /****************************************************************************** PglcrngFromPal Will attempt to extract color ranges from a palette. May be obsolete. Arguments: PGL pglclr -- the palette to use Returns: a GL of CRNGs, each entry is the description of one color range ************************************************************ PETED ***********/ PGL PglcrngFromPal(PGL pglclr) { long lwCur, lwStart, lwMac = pglclr->IvMac(); BRCLR brclr; BRS brsRLast, brsGLast, brsBLast; BRS brsNorm, brsR, brsG, brsB; CRNG crng; PGL pglcrng = GL::PglNew(size(CRNG)); if (pglcrng == pvNil) goto LFail; for (lwCur = 0, lwStart = 0; lwCur < lwMac; lwCur++) { /* Get a normalized color */ pglclr->Get(lwCur, &brclr); brsR = BrIntToScalar(BR_RED(brclr)); brsG = BrIntToScalar(BR_GRN(brclr)); brsB = BrIntToScalar(BR_BLU(brclr)); brsNorm = max(max(brsR, brsG), brsB); if (brsNorm > 0) { brsR = BR_ROUND(BR_DIV(brsR, brsNorm), 2); brsG = BR_ROUND(BR_DIV(brsG, brsNorm), 2); brsB = BR_ROUND(BR_DIV(brsB, brsNorm), 2); } /* Is it possible that we can include it in our range? */ if (lwCur > 0 && brsNorm > 0) { /* If the potential starting entry was 0,0,0 then set it to the current normalized color, and continue */ if (brsRLast == 0 && brsGLast == 0 && brsBLast == 0) { brsRLast = brsR; brsGLast = brsG; brsBLast = brsB; continue; } /* Well, at least this criteria catches exactly the ranges we currently define. I have no idea how well it will fare with the final ranges. */ if (brsRLast == brsGLast && brsR == brsG) continue; if (brsRLast == brsBLast && brsR == brsB) continue; if (brsGLast == brsBLast && brsG == brsB) continue; } /* Should we add this range to our list? */ if ((lwCur - lwStart) > 2) { crng.lwBase = lwStart; crng.lwRange = lwCur - lwStart; if (!pglcrng->FAdd(&crng)) { ReleasePpo(&pglcrng); goto LFail; } } brsRLast = brsR; brsGLast = brsG; brsBLast = brsB; lwStart = lwCur; } LFail: return pglcrng; } /****************************************************************************** LwcrngNearestBrclr Given a Brender color, find the color range that the color will most accurately fit into. Arguments: BRCLR brclr -- the Brender color PGL pglclr -- the palette PGL pglcrng -- description of the color ranges in the palette Returns: returns the entry in the color range GL that corresponds to the given color ************************************************************ PETED ***********/ long LwcrngNearestBrclr(BRCLR brclr, PGL pglclr, PGL pglcrng) { long lwclr, lwclrMac = pglclr->IvMac(), lwclrNear, lwcrng, lwcrngMac = pglcrng->IvMac(), lwcrngNear, dclrNear = klwMax, dclrT; CRNG crng; BRCLR brclrT, brclrNear; /* For each color range */ for (lwcrng = 0; lwcrng < lwcrngMac; lwcrng++) { pglcrng->Get(lwcrng, &crng); lwclrMac = crng.lwBase + crng.lwRange; Assert(crng.lwRange > 0 && lwclrMac <= pglclr->IvMac(), "Invalid range"); /* For each color in the given range */ for (lwclr = crng.lwBase; lwclr < lwclrMac; lwclr++) { /* Calculate a city-block distance for the color */ pglclr->Get(lwclr, &brclrT); dclrT = LwAbs(BR_RED(brclrT) - BR_RED(brclr)); dclrT += LwAbs(BR_GRN(brclrT) - BR_GRN(brclr)); dclrT += LwAbs(BR_BLU(brclrT) - BR_BLU(brclr)); /* If it's closer than what we've found so far, remember it */ if (dclrT < dclrNear) { lwclrNear = lwclr; lwcrngNear = lwcrng; dclrNear = dclrT; brclrNear = brclrT; if (dclrT == 0) break; } } /* If we found an exact match, look no further */ if (dclrT == 0) break; } /* Report and return */ if (dclrT != 0) printf("Didn't find exact match for color %06x; nearest was %06x\n", brclr, brclrNear); return lwcrngNear; } /* Array of keywords known by our simple script interpreter */ static KEYTT _rgkeyttS2B[] = {"ACTOR", ttActor, "ACTION", ttActionS2B, "BACKGROUND", ttBackgroundS2B, DK_A_CAMERA_POS_TOKEN, ttPosition, DK_A_CAMERA_INT_TOKEN, ttInterest, DK_A_CAMERA_NEAR_TOKEN, ttNearCam, DK_A_CAMERA_FAR_TOKEN, ttFarCam, DK_A_CAMERA_FOV_TOKEN, ttFovCam, DK_A_POS_STATIC_TOKEN, ttStatic, "CNO", ttCno, "NAMED", ttCalled, "XREST", ttXRest, "YREST", ttYRest, "ZREST", ttZRest, "FILEBASE", ttFilebase, "FIRST", ttFirst, "LAST", ttLast, "FLAGS", ttFlags, "SCALE", ttScale, "SKIP", ttSkip, "SUBMODEL", ttSubmodel, "BPSETS", ttBPS, "LIGHTS", ttLights, "CAMERAS", ttCameras, "LENGTH", ttLength, "STEP", ttStep, "COSTUME", ttCostume, "USE_SETS", ttUseSets, "NEW_ACTOR_POS", ttNewActorPos, "MATERIALS", ttMaterials, "FILE", ttFilename}; #define kckeyttS2B (size(_rgkeyttS2B) / size(_rgkeyttS2B[0])) /*************************************************************************** Read a number. The first character is passed in ch. lwBase is the base of the number (must be <= 10). ***************************************************************************/ void S2BLX::_ReadNumTok(PTOK ptok, achar ch, long lwBase, long cchMax) { AssertThis(0); AssertVarMem(ptok); AssertIn(ch, ChLit('0'), ChLit('0') + lwBase); AssertIn(lwBase, 2, 11); long lw; lw = ch - ChLit('0'); while (--cchMax > 0 && _FFetchRgch(&ch) && (_GrfctCh(ch) & fctDec) && (ch - ChLit('0') < lwBase)) { lw = lw * lwBase + (ch - ChLit('0')); _Advance(); } if (ch == ChLit('.')) { /* HACK: if we didn't read any non-zero digits yet, and we hit a decimal point, assume we're really reading lwBase 10 */ if (lw == 0) lwBase = 10; long lwFrac = lwBase; double fl = (double)0.0; _Advance(); while (--cchMax > 0 && _FFetchRgch(&ch) && (_GrfctCh(ch) & fctDec) && (ch - ChLit('0') < lwBase)) { fl += ((double)(ch - ChLit('0'))) / (double)lwFrac; lwFrac *= lwBase; _Advance(); } ptok->tt = ttFloat; _fl = lw + fl; } else ptok->lw = lw; } /*************************************************************************** Reads in the next token. Resolves certain names to keyword tokens. ***************************************************************************/ bool S2BLX::FGetS2btk(PS2BTK ps2btk) { AssertThis(0); AssertVarMem(ps2btk); bool fRet; long ikeytt; PTOK ptok = &ps2btk->tok; while ((fRet = S2BLX_PAR::FGetTok(ptok)) && (ptok->tt == ttComma || ptok->tt == ttSemi)) ; if (fRet) { /* Ignore minus signs, unless they precede a number */ if (ptok->tt == ttSub) { if (!(fRet = S2BLX_PAR::FGetTok(ptok))) goto LDone; switch (ptok->tt) { case ttLong: ptok->lw = -ptok->lw; goto LDone; case ttFloat: _fl = -_fl; goto LDone; default: break; } } if (ptok->tt != ttName) goto LDone; // check for a keyword for (ikeytt = 0; ikeytt < kckeyttS2B; ikeytt++) { if (ptok->stn.FEqualUserSz(_rgkeyttS2B[ikeytt].pszKeyword)) { ptok->tt = _rgkeyttS2B[ikeytt].tt; break; } } } LDone: _ttCur = ptok->tt; if (_ttCur == ttFloat) ps2btk->fl = _fl; return fRet; } /****************************************************************************** FGetTok Gets a base TOK. Will filter out ttFloat. Arguments: PTOK ptok -- pointer to TOK to fill in Returns: fTrue if it got a valid token ************************************************************ PETED ***********/ bool S2BLX::FGetTok(PTOK ptok) { bool fRet; S2BTK s2btk; fRet = FGetS2btk(&s2btk); if (fRet) { *ptok = s2btk.tok; /* Convert token if necessary */ if (ptok->tt == ttFloat) { ptok->lw = (long)_fl; ptok->tt = ttLong; } } return fRet; } /****************************************************************************** FTextFromTt Sets an STN to the text string that corresponds to the given token. Arguments: long tt -- the token PSTN pstn -- the STN to set Returns: fTrue if if knew about the token, fFalse otherwise ************************************************************ PETED ***********/ bool S2BLX::FTextFromTt(long tt, PSTN pstn) { AssertPo(pstn, 0); long ikeytt; for (ikeytt = 0; ikeytt < kckeyttS2B; ikeytt++) if (tt == _rgkeyttS2B[ikeytt].tt) break; if (ikeytt == kckeyttS2B) // return S2BLX_PAR::FTextFromTt(tt, pstn); return fFalse; pstn->SetSz(_rgkeyttS2B[ikeytt].pszKeyword); return fTrue; } /****************************************************************************** FTextFromS2btk Fills in the given STN with text that represents the given token. Arguments: PS2BTK ps2btk -- the token to use PSTN pstn -- the STN to fill in Returns: fTrue if the token was successfully recognized and converted to text, fFalse otherwise ************************************************************ PETED ***********/ bool S2BLX::FTextFromS2btk(PS2BTK ps2btk, PSTN pstn) { AssertPo(pstn, 0); pstn->SetNil(); if (ps2btk->tok.tt == ttFloat) { long lwInt, lwFrac; lwInt = (long)ps2btk->fl; lwFrac = (long)((ps2btk->fl - lwInt) * 100000.0); AssertIn(lwFrac, 0, 100000); AssertDo(pstn->FFormatSz(PszLit("%d.%05d"), lwInt, lwFrac), 0); return fTrue; } // return FTextFromTok(&ps2btk->tok, pstn); PTOK ptok = &ps2btk->tok; switch (ptok->tt) { case ttLong: AssertDo(pstn->FFormatSz(PszLit("%d"), ptok->lw), 0); return fTrue; case ttName: *pstn = ptok->stn; return fTrue; case ttString: /* Creating the string this way will guarantee the double-quotes will make it into the string; the source string *may* be truncated by a character or two. */ *pstn = PszLit("\""); pstn->FAppendStn(&ptok->stn); pstn->FInsertCh(pstn->Cch(), ChLit('"')); return fTrue; default: return FTextFromTt(ptok->tt, pstn); } } #ifdef DEBUG /*************************************************************************** Warning proc called by Warn() macro ***************************************************************************/ void WarnProc(PSZ pszFile, long lwLine, PSZ pszMessage) { if (_fEnableWarnings) { if (pszMessage != pvNil) fprintf(stderr, "Warning: %s\n", pszMessage); else fprintf(stderr, "%s(%ld) : warning\n", pszFile, lwLine); } } /*************************************************************************** Returning true breaks into the debugger. ***************************************************************************/ bool FAssertProc(PSZ pszFile, long lwLine, PSZ pszMessage, void *pv, long cb) { fprintf(stderr, "An assert occurred: \n"); if (pszMessage != pvNil) fprintf(stderr, " Message: %s\n", pszMessage); if (pv != pvNil) { fprintf(stderr, " Address %x\n", pv); if (cb != 0) { fprintf(stderr, " Value: "); switch (cb) { default: { byte *pb; byte *pbLim; for (pb = (byte *)pv, pbLim = pb + cb; pb < pbLim; pb++) fprintf(stderr, "%02x", (int)*pb); } break; case 2: fprintf(stderr, "%04x", (int)*(short *)pv); break; case 4: fprintf(stderr, "%08lx", *(long *)pv); break; } printf("\n"); } } fprintf(stderr, " File: %s\n", pszFile); fprintf(stderr, " Line: %ld\n", lwLine); return _fBreak; } #endif ================================================ FILE: tools/tdfmake.cpp ================================================ /* Copyright (c) Microsoft Corporation. Licensed under the MIT License. */ /*************************************************************************** tdfmake.cpp: Three-D Font authoring tool Primary Author: ****** Review Status: Not yet reviewed TDFmake is a command-line tool for building 3-D Font files from a set of models. Usage: tdfmake ... All the DAT files for a given font should be in a directory. The directory name becomes the name of the TDF chunk. The DAT file names should contain a number, which becomes the CHID of the model chunk under the TDF. ***************************************************************************/ #include "soc.h" #include "tdfmake.h" ASSERTNAME const CTG kctgTdfMake = 'TDFM'; bool FMakeTdf(PFNI pfniSrc, PCFL pcflDst); /*************************************************************************** Main routine. Returns non-zero if there's an error. ***************************************************************************/ int __cdecl main(int cpsz, achar *prgpsz[]) { STN stnDst; STN stnSrc; FNI fniSrcDir; FNI fniDst; PCFL pcflDst; long ifniSrc; fprintf(stderr, "\nMicrosoft (R) TDF Maker\n"); fprintf(stderr, "Copyright (C) Microsoft Corp 1995. All rights reserved.\n\n"); BrBegin(); if (cpsz < 2) { fprintf(stderr, "%s", "Usage:\n" " tdfmake ... \n\n"); goto LFail; } stnDst = prgpsz[cpsz - 1]; if (!fniDst.FBuildFromPath(&stnDst)) { fprintf(stderr, "Bad destination file name %s\n\n", stnDst.Psz()); goto LFail; } fniDst.GetStnPath(&stnDst); pcflDst = CFL::PcflCreate(&fniDst, fcflWriteEnable); if (pvNil == pcflDst) { fprintf(stderr, "Couldn't create destination chunky file %s\n\n", stnDst.Psz()); goto LFail; } for (ifniSrc = 0; ifniSrc < cpsz - 2; ifniSrc++) { stnSrc = prgpsz[ifniSrc + 1]; if (stnSrc.Psz()[stnSrc.Cch() - 1] != ChLit('\\')) { if (!stnSrc.FAppendCh(ChLit('\\'))) goto LFail; } if (!fniSrcDir.FBuildFromPath(&stnSrc)) { fprintf(stderr, "Bad source directory %s\n\n", stnSrc.Psz()); goto LFail; } fniSrcDir.GetStnPath(&stnSrc); fprintf(stderr, "%s ---> %s\n", stnSrc.Psz(), stnDst.Psz()); if (!FMakeTdf(&fniSrcDir, pcflDst)) goto LFail; } if (!pcflDst->FSave(kctgTdfMake)) { fprintf(stderr, "Couldn't save chunky file.\n\n"); goto LFail; } BrEnd(); return 0; // no error LFail: BrEnd(); fprintf(stderr, "TDF Maker failed.\n\n"); return 1; // error } /*************************************************************************** Writes a TDF chunk and child BMDL chunks based on all DAT files in pfniSrcDir to the destination file pcflDst. ***************************************************************************/ bool FMakeTdf(PFNI pfniSrcDir, PCFL pcflDst) { AssertPo(pfniSrcDir, ffniDir); AssertPo(pcflDst, 0); FTG ftgDat = MacWin('bdat', 'DAT'); FNE fne; FNI fni; STN stn; STN stn2; CHID chid; CHID chidMax = 0; PMODL pmodl; CNO cnoModl; PCRF pcrf; PSZ psz; long cch; long lw; PGL pglkid; KID kid; bool fFoundSpace = fFalse; // 0x20 bool fFoundSpace2 = fFalse; // 0xa0 long cmodl = 0; pglkid = GL::PglNew(size(KID)); if (pglkid == pvNil) goto LFail; pcrf = CRF::PcrfNew(pcflDst, 0); if (pvNil == pcrf) goto LFail; // get directory name (don't actually move up a dir) if (!pfniSrcDir->FUpDir(&stn, 0)) goto LFail; if (stn.Psz()[0] == ChLit('\\')) stn2.SetSz(stn.Psz() + 1); else stn2 = stn; if (!fne.FInit(pfniSrcDir, &ftgDat, 1)) goto LFail; while (fne.FNextFni(&fni)) { fni.GetLeaf(&stn); psz = stn.Psz(); while (*psz != ChLit('\0') && !FIn(*psz, ChLit('0'), ChLit('9') + 1)) psz++; for (cch = 0; FIn(*(psz + cch), ChLit('0'), ChLit('9') + 1); cch++) ; if (cch == 0) { fprintf(stderr, "Filename must include a number: %s\n\n", stn.Psz()); goto LFail; } stn2.SetRgch(psz, cch); if (!stn2.FGetLw(&lw, 10)) goto LFail; chid = lw; if (chid > chidMax) chidMax = chid; if (chid == (CHID)ChLit(' ')) fFoundSpace = fTrue; if (chid == 0xa0) // nonbreaking space fFoundSpace2 = fTrue; pmodl = MODL::PmodlReadFromDat(&fni); if (pvNil == pmodl) return fFalse; pmodl->AdjustTdfCharacter(); if (!pcflDst->FAdd(0, kctgBmdl, &cnoModl)) goto LFail; if (!pmodl->FWrite(pcflDst, kctgBmdl, cnoModl)) goto LFail; if (!pcflDst->FPackData(kctgBmdl, cnoModl)) goto LFail; kid.chid = chid; kid.cki.ctg = kctgBmdl; kid.cki.cno = cnoModl; if (!pglkid->FAdd(&kid)) goto LFail; cmodl++; } fprintf(stderr, "Converted %d characters\n", cmodl); // Hack to insert a space character if none specified if (!fFoundSpace) { pmodl = MODL::PmodlNew(0, pvNil, 0, pvNil); if (pvNil == pmodl) return fFalse; if (!pcflDst->FAdd(0, kctgBmdl, &cnoModl)) goto LFail; if (!pmodl->FWrite(pcflDst, kctgBmdl, cnoModl)) goto LFail; kid.chid = (CHID)ChLit(' '); kid.cki.ctg = kctgBmdl; kid.cki.cno = cnoModl; if (!pglkid->FAdd(&kid)) goto LFail; fprintf(stderr, "Added a space character\n"); } // Hack to insert a nonbreaking space character if none specified if (!fFoundSpace2) { pmodl = MODL::PmodlNew(0, pvNil, 0, pvNil); if (pvNil == pmodl) return fFalse; if (!pcflDst->FAdd(0, kctgBmdl, &cnoModl)) goto LFail; if (!pmodl->FWrite(pcflDst, kctgBmdl, cnoModl)) goto LFail; kid.chid = 0xa0; kid.cki.ctg = kctgBmdl; kid.cki.cno = cnoModl; if (!pglkid->FAdd(&kid)) goto LFail; fprintf(stderr, "Added a nonbreaking space character\n"); } if (!TDF::FCreate(pcrf, pglkid, &stn2)) goto LFail; ReleasePpo(&pcrf); ReleasePpo(&pglkid); return fTrue; LFail: ReleasePpo(&pcrf); ReleasePpo(&pglkid); return fFalse; } #ifdef DEBUG bool _fEnableWarnings = fTrue; /*************************************************************************** Warning proc called by Warn() macro ***************************************************************************/ void WarnProc(PSZ pszFile, long lwLine, PSZ pszMessage) { if (_fEnableWarnings) { fprintf(stderr, "%s(%ld) : warning", pszFile, lwLine); if (pszMessage != pvNil) { fprintf(stderr, ": %s", pszMessage); } fprintf(stderr, "\n"); } } /*************************************************************************** Returning true breaks into the debugger. ***************************************************************************/ bool FAssertProc(PSZ pszFile, long lwLine, PSZ pszMessage, void *pv, long cb) { fprintf(stderr, "An assert occurred: \n"); if (pszMessage != pvNil) fprintf(stderr, " Message: %s\n", pszMessage); if (pv != pvNil) { fprintf(stderr, " Address %x\n", pv); if (cb != 0) { fprintf(stderr, " Value: "); switch (cb) { default: { byte *pb; byte *pbLim; for (pb = (byte *)pv, pbLim = pb + cb; pb < pbLim; pb++) fprintf(stderr, "%02x", (int)*pb); } break; case 2: fprintf(stderr, "%04x", (int)*(short *)pv); break; case 4: fprintf(stderr, "%08lx", *(long *)pv); break; } printf("\n"); } } fprintf(stderr, " File: %s\n", pszFile); fprintf(stderr, " Line: %ld\n", lwLine); return fFalse; } #endif ================================================ FILE: version.def ================================================ RELEASE_VERSION = 0.2